cronapi-js
Version:
Public library for CronApp's users
1,666 lines (1,503 loc) • 361 kB
JavaScript
if (window.fixedTimeZone === undefined || window.fixedTimeZone === null) {
window.fixedTimeZone = true;
}
if (window.timeZone === undefined || window.timeZone === null) {
window.timeZone = "UTC";
}
if (window.timeZoneOffset === undefined || window.timeZoneOffset === null) {
window.timeZoneOffset = 0;
}
window.systemTimeZoneOffset = window.timeZoneOffset;
if (!window.fixedTimeZone) {
window.timeZoneOffset = moment().utcOffset();
}
if (!window.isUsingCookie) {
window.isUsingCookie = function() {
return (navigator.cookieEnabled && !window.disableServerCookies && (!window.cordova || window.cordova.platformId == "browser"));
};
}
function cronapi() {
'use strict';
this.$evt = function(str) {
var self = this;
if (!self.$eval) {
var target;
if (event) target = event.target;
else target = self.$element[0];
self = angular.element(target).scope();
}
if (!self) {
self = angular.element(document.getElementById('main-view')).scope();
}
self.$eval(str);
}.bind(this);
this.cronapi = {};
this.cronapi.getRequestData = data => {
let result = data || {};
if (data.data && typeof data.data === 'object') {
result = data.data;
}
return result;
};
this.cronapi.toDate = function(value) {
return new Date(value);
}
var getDatasource = function(ds) {
if (typeof ds == 'string') {
return window[ds];
} else {
return ds;
}
}
this.cronapi.doEval = function(arg) {
return arg;
}
var reorderArgs = function(argsValues, argsMetadata, argsNames) {
if (argsMetadata && argsMetadata.length && argsNames && argsNames.length) {
let args = [];
for (var i = 0;i <argsMetadata.length;i++) {
args.push(null);
}
for (let i = 0; i<argsMetadata.length; i++) {
for (let j = 0; j<argsNames.length; j++) {
if (typeof argsMetadata[i] === 'string') {
if (argsMetadata[i] == argsNames[j]) {
args[i] = argsValues[j];
break;
}
} else {
if (argsMetadata[i].description == argsNames[j] || argsMetadata[i].id == argsNames[j] ) {
args[i] = argsValues[j];
break;
}
}
}
}
return args;
}
return argsValues;
}
this.cronapi.evalInContext = async function(js) {
var result = eval('this.cronapi.doEval('+js+')');
if (result) {
result = result.data || result;
if (result.commands) {
for (var i = 0; i < result.commands.length; i++) {
var func = eval(result.commands[i].function);
let argsMetadata;
let argsNames = result.commands[i].names;
let args = result.commands[i].params;
try {
argsMetadata = eval(result.commands[i].function+'Args');
} catch(e) {
//
}
args = reorderArgs(args, argsMetadata, argsNames);
await func.apply(this, args);
}
}
return result.value;
}
}
let clientMap = {};
let clientMapTimeout = {};
this.cronapi.client = function(pack) {
let attr = false;
let argsNames;
let notificationOnError = true;
return {
attr: function() {
attr = true;
return this;
},
disableNotification: function () {
notificationOnError = false;
return this;
},
names: function(names) {
argsNames = [];
for (let i = 0; i < arguments.length; i++) {
argsNames.push(arguments[i]);
}
return this;
},
run: function() {
var key = pack;
var args = [];
for (var i = 0;i <arguments.length;i++) {
key += String(arguments[i]);
args.push(arguments[i]);
}
var bk;
var argsMetadata;
try {
bk = eval('blockly.'+pack);
} catch(e) {
//
}
try {
argsMetadata = eval('blockly.'+pack+'Args');
} catch(e) {
//
}
if (!argsMetadata) {
try {
argsMetadata = eval(pack+'Args');
} catch(e) {
//
}
}
if (!bk) {
bk = eval(pack);
}
args = reorderArgs(args, argsMetadata, argsNames);
let isAsyncResult = (result) => (result !== undefined && result !== null && result.then && typeof result.then === 'function');
let result = undefined;
if (attr) {
if (clientMapTimeout[key]) {
clearTimeout(clientMapTimeout[key]);
}
else {
result = bk.apply(this, args);
if (!isAsyncResult(result)) {
clientMap[key] = result;
}
}
clientMapTimeout[key] = setTimeout(() => {
result = result || bk.apply(this, args);
if (isAsyncResult(result)) {
result.then(value => {
if (clientMap[key] !== value) {
this.safeApply(() => {
clientMap[key] = value;
});
}
}).catch((error) => {
if (clientMap[key] !== error) {
this.safeApply(() => {
clientMap[key] = error;
});
}
});
} else {
clientMap[key] = result;
}
return clientMap[key];
}, 300);
if (clientMap[key]) {
return clientMap[key];
}
} else {
let isAsync = bk.constructor.name === "AsyncFunction";
if (isAsync) {
return bk.apply(this, args).catch((error) => {
if (notificationOnError) {
this.cronapi.$scope.Notification.error(error);
} else {
throw error;
}
});
} else {
return bk.apply(this, args);
}
}
}.bind(this)
}
};
var serverMap = {};
this.cronapi.server = function(pack) {
var attr = false;
var toPromise = false;
var async = true;
var notificationOnError = true;
let argsNames;
return {
attr: function() {
attr = true;
return this;
},
toPromise: function() {
toPromise = true;
return this;
},
notAsync: function() {
async = false;
return this;
},
names: function() {
argsNames = [];
for (let i = 0; i < arguments.length; i++) {
argsNames.push(arguments[i]);
}
return this;
},
disableNotification: function() {
notificationOnError = false;
return this;
},
run: function() {
var key = pack;
for (var i = 0;i <arguments.length;i++) {
key += String(arguments[i]);
}
if (attr) {
if (serverMap.hasOwnProperty(key)) {
if (serverMap[key] != "$$loading") {
return serverMap[key];
} else {
return "";
}
}
serverMap[key] = "$$loading";
}
var parts = pack.split(".");
var func = parts[parts.length-1];
parts.pop();
var namespace = parts.join(".");
var blocklyName = namespace + ":" + func;
var resolveForPromise;
var rejectForPromise;
var promise = new Promise((resolve, reject) => {
resolveForPromise = resolve;
rejectForPromise = reject;
});
var success = function(data) {
this.safeApply(function() {
if (attr) {
serverMap[key] = data;
}
resolveForPromise(data);
});
}.bind(this);
var error = function(error) {
this.safeApply(function() {
if (attr) {
serverMap[key] = error;
}
rejectForPromise(error);
});
if (error && notificationOnError)
this.cronapi.$scope.Notification.error(error);
}.bind(this);
var args = [blocklyName];
if (async) {
args.push(success);
args.push(error);
if (argsNames && argsNames.length) {
args.push({
argsNames: argsNames
});
}
for (var i = 0;i <arguments.length;i++) {
args.push(arguments[i]);
}
this.cronapi.util.makeCallServerBlocklyAsync.apply(this, args);
if (toPromise)
return promise;
}
else {
if (argsNames && argsNames.length) {
args.push({
argsNames: argsNames
});
}
for (var i = 0;i <arguments.length;i++) {
args.push(arguments[i]);
}
let resultData = this.cronapi.util.callServerBlockly.apply(this, args);
if (attr) {
serverMap[key] = resultData;
}
return resultData;
}
}.bind(this)
}
};
this.cronapi.callFunction = function(name) {
return {
call: function() {
var ref;
try {
ref = eval(name);
} catch(e) {
//
}
if (ref) {
return ref.apply(this, arguments)
}
return undefined;
}.bind(this)
}
};
/**
* @category CategoryType.CONVERSION
* @categoryTags Conversão|Convert
*/
this.cronapi.conversion = {};
/**
* @type function
* @name {{textToTextBinary}}
* @nameTags asciiToBinary
* @description {{functionToConvertTextInTextBinary}}
* @param {ObjectType.STRING} astring {{contentInAscii}}
* @returns {ObjectType.STRING}
*/
this.cronapi.conversion.asciiToBinary = function(astring) {
var binary = "";
if (astring.length > 0) {
for (var i = 0; i < astring.length; i++) {
var value = astring.charCodeAt(i);
for (var j = 7; j >= 0; j--) {
binary += ((value >> j) & 1);
}
}
}
return binary;
};
/**
* @type function
* @name {{toLogic}}
* @nameTags toBoolean
* @description {{functionConvertToLogic}}
* @param {ObjectType.STRING} value {{content}}
* @returns {ObjectType.BOOLEAN}
*/
this.cronapi.conversion.toBoolean = function(value) {
return this.cronapi.internal.parseBoolean(value);
};
/**
* @type function
* @name {{convertToBytes}}
* @nameTags toBytes
* @description {{functionToConvertTextBinaryToText}}
* @param {ObjectType.OBJECT} obj {{contentInTextBinary}}
* @returns {ObjectType.STRING}
*/
this.cronapi.conversion.toBytes = function(obj) {
return obj ? obj.toString() : "";
};
/**
* @type function
* @name {{convertToAscii}}
* @nameTags chrToAscii|convertToAscii
* @description {{functionToConvertToAscii}}
* @param {ObjectType.STRING} value {{content}}
* @returns {ObjectType.STRING}
*/
this.cronapi.conversion.chrToAscii = function(value) {
if (!value) {
return null;
} else {
return (value.charCodeAt(0));
}
};
/**
* @type function
* @name {{convertStringToJs}}
* @nameTags stringToJs
* @description {{functionToConvertStringToJs}}
* @param {ObjectType.STRING} value {{content}}
* @returns {ObjectType.STRING}
*/
this.cronapi.conversion.stringToJs = function(value) {
return this.cronapi.internal.stringToJs(value);
};
/**
* @type function
* @name {{convertStringToDate}}
* @nameTags stringToDate
* @description {{functionToConvertStringToDate}}
* @param {ObjectType.STRING} value {{content}}
* @returns {ObjectType.DATETIME}
*/
this.cronapi.conversion.stringToDate = function(value) {
var pattern = /^\s*(\d+)[\/\.-](\d+)[\/\.-](\d+)(\s(\d+):(\d+):(\d+))?\s*$/;
if (value) {
if (value instanceof Date)
return value;
else if (pattern.test(value)) {
var splited = pattern.exec(value);
var userLang = (navigator.language || navigator.userLanguage)
.split("-")[0];
if (userLang == "pt" || userLang == "en") {
var functionToCall = eval("cronapi.internal." + userLang + "Date");
return functionToCall(splited);
} else
return new Date(value);
} else
return new Date(value);
}
return null;
};
/**
* @type function
* @name {{convertStringToDate}}
* @nameTags stringToDate
* @description {{functionToConvertStringToDate}}
* @param {ObjectType.STRING} value {{content}}
* @param {ObjectType.STRING} format {{format}}
* @returns {ObjectType.DATETIME}
*/
this.cronapi.conversion.stringToDateWithFormat = function(value, format) {
let result = moment(value, format);
if (result.isValid())
return result.toDate();
return null;
};
/**
* @type function
* @name {{convertIntToHex}}
* @nameTags intToHex
* @description {{functionToConvertIntToHex}}
* @param {ObjectType.STRING} value {{content}}
* @returns {ObjectType.STRING}
*/
this.cronapi.conversion.intToHex = function(value) {
return Number(value).toString(16).toUpperCase();
};
/**
* @type function
* @name {{convertToLong}}
* @nameTags toLong
* @description {{functionToConvertToLong}}
* @param {ObjectType.OBJECT} value {{content}}
* @returns {ObjectType.LONG}
*/
this.cronapi.conversion.toLong = function(value) {
return parseInt(value);
};
/**
* @type function
* @name {{convertToString}}
* @nameTags toString
* @description {{functionToConvertToString}}
* @param {ObjectType.OBJECT} value {{content}}
* @returns {ObjectType.STRING}
*/
this.cronapi.conversion.toString = function(value) {
if (value){
var result = new String(value);
return result.toString();
}
return "";
};
/**
* @category CategoryType.UTIL
* @categoryTags Util
*/
this.cronapi.util = {};
/**
* @type function
* @name {{fillDatasource}}
* @nameTags fillDatasource|Preencher|datasource|fonte de dados|cache
* @description {{fillDatasourceDescription}}
* @param {ObjectType.STRING} id {{datasourceId}}
* @param {ObjectType.STRING} filterUrl {{filterUrl}}
* @param {ObjectType.LIST} params {{arrayParams}}
* @platform M
* @wizard procedure_fill_datasource
* @multilayer true
*/
this.cronapi.util.fillDatasource = async function(id, filterUrl, params, paramsNames) {
const odataUrl = `${window.hostApp}api/cronapi/odata/v2/`;
const db = this.cronapi.internal.getPouchDB(id);
let totalReceived = 0;
let defaultPagination = 100;
if (paramsNames && typeof paramsNames === 'object') {
let jsonParam = [];
for (let i = 0; i< paramsNames.length; i++) {
let json = {};
json[paramsNames[i]] = params[i];
jsonParam.push(json);
}
params = jsonParam;
}
let convertToODataDate = (date) => {
let year = date.getFullYear();
let month = String(date.getMonth() + 1).padStart(2, '0');
let day = String(date.getDate()).padStart(2, '0');
let hours = String(date.getHours()).padStart(2, '0');
let minutes = String(date.getMinutes()).padStart(2, '0');
let seconds = String(date.getSeconds()).padStart(2, '0');
let odataDate = `'${year}-${month}-${day}T${hours}:${minutes}:${seconds}'`;
return odataDate;
}
let evalForODATA = async (value) => {
let result = '';
try {
result = await eval(value.replace('await ', ''));
}
catch (e) {
result = value;
}
(typeof result === 'string') && (result = `'${result}'`);
(typeof result === 'object' && result.getFullYear) && (result = convertToODataDate(result));
return result;
};
let getFilter = (value) => {
let filter = '';
let result = value.match(/(\$filter=)(.*)/);
(result && result.length > 2) && (filter = result[2]);
return filter;
};
let getUrl = (value) => {
let url = '';
let result = value.match(/^(GET|POST|DELETE|PUT)\s(.*?)($|\?)/);
(result && result.length > 2) && (url = `${odataUrl}${result[2]}`);
return url;
};
if (params) {
for (let i = 0; i < params.length; i++) {
let e = params[i];
for (let key in e) {
e[key] = await evalForODATA(e[key]);
}
}
params.forEach(e => {
for (let key in e) {
filterUrl = filterUrl.replace(`:${key}`, e[key]);
}
});
}
let config = {
method: "GET",
params: {$inlinecount: 'allpages', $format: 'json', $top: `${defaultPagination}`, $skip: 0},
url: getUrl(filterUrl)
};
let filter = getFilter(filterUrl);
filter && (config.params.$filter = filter);
let makeRequest = async (config, success, error) => {
let http = this.$http(config);
http.then(r => success(r));
http.catch(r => error(r));
};
let success = (response) => {
let effectiveData = response.data.d;
let totalCurr = effectiveData.results.length;
totalReceived += totalCurr;
if (totalReceived < effectiveData.__count) {
config.params.$skip += defaultPagination;
makeRequest(config, success, error);
}
this.cronapi.internal.updatePouchDB(db, effectiveData.results);
console.log(`Caching Data (%c${id}%c): %c${totalReceived} of ${effectiveData.__count}`, 'color: red', 'color: black', 'color: red');
};
let error = (response) => {
console.error(`error caching datasource ${db.name}`, response);
};
makeRequest(config, success, error);
};
/**
* @type function
* @name {{changeViewLogout}}
* @nameTags route logout
* @description {{changeViewLogoutDescription}}
* @multilayer true
*/
this.cronapi.util.changeViewLogout = function() {
let route = (window.cordova) ? this.cronapi.util.getMobileLogoutRoute() : this.cronapi.util.getWebLogoutRoute();
this.cronapi.screen.changeView(route);
};
/**
* @type function
* @name {{getWebLogoutRoute}}
* @nameTags route logout
* @description {{getWebLogoutRouteDescription}}
* @returns {ObjectType.STRING}
* @platform W
*/
this.cronapi.util.getWebLogoutRoute = function() {
let logoutroute = 'views/login.view.html';
let res = $.get({ url : 'cronapp.json', async : false })
if (res && res.responseJSON) {
let cronapp = res.responseJSON;
let route = cronapp['cronapp.framework.web.logoutroute'];
if (route) logoutroute = route;
}
return this.cronapi.internal.viewToRoute(logoutroute);
};
/**
* @type function
* @name {{getMobileLogoutRoute}}
* @nameTags route logout
* @description {{getMobileLogoutRouteDescription}}
* @returns {ObjectType.STRING}
* @platform M
*/
this.cronapi.util.getMobileLogoutRoute = function() {
let logoutroute = 'views/login.view.html';
let res = $.get({ url : 'cronapp.json', async : false })
if (res && res.responseJSON) {
let cronapp = res.responseJSON;
let route = cronapp['cronapp.framework.mobile.logoutroute'];
if (route) logoutroute = route;
}
return this.cronapi.internal.viewToRoute(logoutroute);
};
/**
* @type function
* @name {{changeViewMain}}
* @nameTags route main
* @description {{changeViewMainDescription}}
* @multilayer true
*/
this.cronapi.util.changeViewMain = function() {
var route = undefined;
if (window.cordova) route = this.cronapi.util.getMobileMainRoute()
else route = this.cronapi.util.getWebMainRoute()
this.cronapi.screen.changeView(route)
}
/**
* @type function
* @name {{getWebMainRoute}}
* @nameTags route main
* @description {{webMainRouteDescription}}
* @returns {ObjectType.STRING}
* @platform W
*/
this.cronapi.util.getWebMainRoute = function() {
var mainroute = 'views/login.view.html';
var res = $.get({ url : 'cronapp.json', async : false })
if (res && res.responseJSON) {
var cronapp = res.responseJSON;
var route = cronapp['cronapp.framework.web.mainroute'];
if (route) mainroute = route;
}
return this.cronapi.internal.viewToRoute(mainroute);
};
/**
* @type function
* @name {{getMobileMainRoute}}
* @nameTags route main
* @description {{mobileMainRouteDescription}}
* @returns {ObjectType.STRING}
* @platform M
*/
this.cronapi.util.getMobileMainRoute = function() {
var mainroute = 'views/login.view.html';
var res = $.get({ url : 'cronapp.json', async : false })
if (res && res.responseJSON) {
var cronapp = res.responseJSON;
var route = cronapp['cronapp.framework.mobile.mainroute'];
if (route) mainroute = route;
}
return this.cronapi.internal.viewToRoute(mainroute, 'mobile');
};
/**
* @type function
* @name {{setRequestToken}}
* @nameTags token
* @description {{setRequestTokenDescription}}
* @param {ObjectType.STRING} token {{setRequestTokenParam}}
* @platform M
*/
this.cronapi.util.setToken = function(token) {
let currentSession = {};
if (localStorage.getItem("_u")) {
currentSession = JSON.parse(localStorage.getItem("_u"));
if (window.isUsingCookie()) {
delete currentSession.token;
} else {
currentSession.token = token;
}
}
localStorage.setItem("_u", JSON.stringify(currentSession));
};
/**
* @type function
* @name {{getApplicationName}}
* @nameTags getApplicationName
* @description {{functionToGetApplicationName}}
* @returns {ObjectType.STRING}
*/
this.cronapi.util.getApplicationName = function() {
return $('#projectName').length ? $('#projectName').val() : $('h1:first').length && $('h1:first').text().trim().length ? $('h1:first').text().trim() : '';
};
/**
* @type function
* @name {{createPromiseName}}
* @nameTags createPromiseName
* @description {{functioncreatePromise}}
* @returns {ObjectType.OBJECT}
*/
this.cronapi.util.createPromise = function () {
var functionToResolve;
var functionToReject;
var promise = new Promise((resolve, reject) => {
functionToResolve = resolve;
functionToReject = reject;
});
promise.__functionToResolve = functionToResolve;
promise.__functionToReject = functionToReject;
return promise;
}
/**
* @type function
* @name {{handleValueToPromise}}
* @nameTags handleValueToPromise
* @description {{functionToHandleValueToPromise}}
* @param {ObjectType.STRING} type {{type}}
* @param {ObjectType.OBJECT} promise {{promise}}
* @param {ObjectType.OBJECT} value {{value}}
*/
this.cronapi.util.handleValueToPromise = function (/** @type {ObjectType.STRING} @description {{type}} @blockType util_dropdown @keys resolve|reject @values resolve|reject */ type, promise, value) {
if(type === 'resolve') {
promise.__functionToResolve(value);
}else{
promise.__functionToReject(value);
}
}
/**
* @type function
* @name {{monitorPromise}}
* @nameTags monitorPromise
* @description {{functionToMonitorPromise}}
* @param {ObjectType.OBJECT} promise {{promise}}
* @param {ObjectType.STATEMENTSENDER} callbackSuccess {{success}}
* @param {ObjectType.STATEMENTSENDER} callbackError {{error}}
*/
this.cronapi.util.monitorPromise = function (promise, callbackSuccess, callbackError) {
if (promise) {
if (callbackSuccess) {
promise.then(callbackSuccess);
}
if (callbackError) {
promise.catch(callbackError);
}
}
}
/**
* @type function
* @name {{sleep}}
* @nameTags sleep, dormir, wait, interval
* @description {{sleepDescription}}
* @param {ObjectType.LONG} interval {{sleepInterval}}
*/
this.cronapi.util.sleep = async function (interval) {
var promise = new Promise((resolve) => {
setInterval(() => {
resolve(interval);
}, interval)
});
return promise;
}
/**
* @type internal
* @name {{callServerBlocklyAsync}}
* @nameTags callServerBlocklyAsync
* @description {{functionToCallServerBlocklyAsync}}
* @param {ObjectType.STRING} classNameWithMethod {{classNameWithMethod}}
* @param {ObjectType.OBJECT} callbackSuccess {{callbackSuccess}}
* @param {ObjectType.OBJECT} callbackError {{callbackError}}
* @param {ObjectType.OBJECT} params {{params}}
* @arbitraryParams true
*/
this.cronapi.util.callServerBlocklyAsync = function(classNameWithMethod, fields, callbackSuccess, callbackError) {
const getCircularReplacer = () => {
const seen = new WeakSet();
return (key, value) => {
if (typeof value === "object" && value !== null) {
if (seen.has(value)) {
return;
}
seen.add(value);
}
return value;
};
};
var serverUrl = 'api/cronapi/call/body/#classNameWithMethod#/'.replace('#classNameWithMethod#', classNameWithMethod);
var http = this.cronapi.$scope.http;
var params = [];
var names;
$(arguments).each(function() {
if (this && Array.isArray(this.argsNames)) {
names = this.argsNames;
} else {
params.push(this);
}
});
var dataCall = {
"fields": fields,
"inputs": params.slice(4)
};
if (names) {
dataCall.names = names;
}
var finalUrl = this.cronapi.internal.getAddressWithHostApp(serverUrl);
let contentData = undefined;
try {
contentData = JSON.stringify(dataCall);
}
catch (e) {
contentData = JSON.stringify(dataCall, getCircularReplacer());
}
let headerValues = window.isUsingCookie() ? {
'Content-Type' : 'application/json',
'toJS' : true,
'timezone': moment().utcOffset()
} : {
'Content-Type' : 'application/json',
'X-AUTH-TOKEN' : this.cronapi.util.getUserToken(),
'toJS' : true,
'timezone': moment().utcOffset()
};
// Make the POST request via $http
http({
method: 'POST',
url: finalUrl,
data: contentData,
responseType: 'text',
headers: headerValues,
transformResponse: (value) => value
}).then(
function successCallback(response) {
// response.data will contain the server response
callbackSuccess(response.data);
},
function errorCallback(response) {
// Handle error; response might contain status and data
callbackError(response.data, response.status);
}
);
};
/**
* @type internal
*/
this.cronapi.util.getScreenFields = function() {
var fields = {};
for (var key in this.cronapi.$scope) {
if (this.cronapi.$scope[key] && this.cronapi.$scope[key].constructor && this.cronapi.$scope[key].constructor.name=="DataSet") {
fields[key] = {};
fields[key].active = this.cronapi.$scope[key].active;
}
}
var scope = this.cronapi.$scope;
var recursiveLookup = function(scope) {
var fieldValue;
try {
fieldValue = eval(scope.vars);
}
catch (e) {
}
if(fieldValue && Object.keys(fieldValue).length !== 0) {
var keys = Object.keys(fieldValue);
keys.forEach(function(key){
if (fieldValue[key] !== undefined && fieldValue[key] !== null) {
if (!fields.vars) {
fields.vars = {};
}
fields.vars[key] = fieldValue[key];
}
});
}
else if(scope && scope.$parent ) {
return recursiveLookup(scope.$parent);
}
return;
};
recursiveLookup(scope);
for (var key in this.cronapi.$scope.params) {
if (this.cronapi.$scope.params[key]) {
if (!fields.params) {
fields.params = {};
}
fields.params[key] = this.cronapi.$scope.params[key];
}
}
return fields;
}
/**
* @type internal
* @name {{makeCallServerBlocklyAsync}}
* @nameTags makeCallServerBlocklyAsync
* @description {{functionToMakeCallServerBlocklyAsync}}
* @param {ObjectType.STRING} blocklyWithFunction {{blocklyWithFunction}}
* @param {ObjectType.STRING} callbackBlocklySuccess {{callbackBlocklySuccess}}
* @param {ObjectType.STRING} callbackBlocklyError {{callbackBlocklyError}}
* @param {ObjectType.OBJECT} params {{params}}
* @arbitraryParams if (window.event.target && window.event.target) {
window.cronapi.$scope = angular.element(window.event.target).scope();
}true
*/
this.cronapi.util.makeCallServerBlocklyAsync = function(blocklyWithFunction, callbackSuccess, callbackError) {
var fields = this.cronapi.util.getScreenFields();
var paramsApply = [];
paramsApply.push(blocklyWithFunction);
paramsApply.push(fields);
paramsApply.push(function(data) {
this.cronapi.evalInContext(data).then((result) => {
if (typeof callbackSuccess == "string") {
eval(callbackSuccess)(result);
} else if (callbackSuccess) {
callbackSuccess(result);
}
});
}.bind(this));
paramsApply.push(function(data, status, errorThrown) {
var message = this.cronapi.internal.getErrorMessage(data.responseText, errorThrown);
if (typeof callbackError == "string") {
eval(callbackError)(message);
}
else if (callbackError) {
callbackError(message);
}
else {
this.cronapi.$scope.Notification.error(message);
}
}.bind(this));
$(arguments).each(function(idx) {
if (idx >= 3)
paramsApply.push(this);
});
this.cronapi.util.callServerBlocklyAsync.apply(this, paramsApply);
};
/**
* @type function
* @name {{callServerBlockly}}
* @nameTags callServerBlockly
* @description {{functionToCallServerBlockly}}
* @param {ObjectType.STRING} classNameWithMethod {{classNameWithMethod}}
* @param {ObjectType.OBJECT} params {{params}}
* @arbitraryParams true
* @wizard procedures_callblockly_callnoreturn
*/
this.cronapi.util.callServerBlocklyNoReturn = async function() {
return this.cronapi.util.callServerBlockly.apply(this, arguments);
};
/**
* @type function
* @name {{throwExceptionName}}
* @nameTags throwException
* @description {{throwExceptionDescription}}
* @param {ObjectType.OBJECT} value {{throwExceptionParam0}}
*/
this.cronapi.util.throwException = function(value) {
throw value;
};
/**
* @type function
* @name {{createExceptionName}}
* @nameTags createException
* @description {{createExceptionDescription}}
* @param {ObjectType.STRING} value {{createExceptionParam0}}
* @returns {ObjectType.STRING}
*/
this.cronapi.util.createException = function(value) {
return value;
};
/**
* @type function
* @name {{language}}
* @nameTags language, i18n, idioma, linguagem, locale
* @description {{languageDescription}}
* @returns {ObjectType.STRING}
*/
this.cronapi.util.language = function() {
var locale = (window.navigator.userLanguage || window.navigator.language || 'pt_br').replace('-', '_');
return locale;
};
/**
* @type function
* @name {{share}}
* @nameTags share, compartilhar, enviar, abrir como
* @description {{shareDescription}}
* @param {ObjectType.STRING} title {{shareParam0}}
* @param {ObjectType.STRING} text {{shareParam1}}
* @param {ObjectType.STRING} url {{shareParam2}}
* @returns {ObjectType.STRING}
*/
this.cronapi.util.share = function(title, text, url) {
const promise = new Promise((resolve, reject) => {
navigator.share({
title: title,
text: text,
url: url
}).then(() => {
resolve('Successful share');
console.log('Successful share');
}).catch(error => {
reject(error);
console.log('Error sharing:', error);
});
});
return promise;
};
/**
* @type function
* @name {{callServerBlockly}}
* @nameTags callServerBlockly
* @description {{functionToCallServerBlockly}}
* @param {ObjectType.STRING} classNameWithMethod {{classNameWithMethod}}
* @param {ObjectType.OBJECT} params {{params}}
* @arbitraryParams true
* @wizard procedures_callblockly_callreturn
* @returns {ObjectType.OBJECT}
*/
this.cronapi.util.callServerBlockly = async function(classNameWithMethod) {
let params = []
params.push(classNameWithMethod);
params.push(null); // This argument will be used as the resolve method callback
params.push(null); // This argument will be used as the reject method callback
let idx = 1; // idx should be 1 to ignore the declared argument 'classNameWithMethod'
for(idx; idx < arguments.length ; idx ++){
params.push(arguments[idx]);
}
return new Promise(((resolve, reject) => {
params[1] = ((data) => {
resolve(data);
}).bind(this);
params[2] = ((error) => {
reject(error);
}).bind(this);
this.cronapi.util.makeCallServerBlocklyAsync.apply(this, params);
}).bind(this));
};
/**
* @type function
* @name {{callServerBlocklyAsync}}
* @nameTags callServerBlocklyAsync
* @description {{callServerBlocklyAsync}}
* @param {ObjectType.STRING} classNameWithMethod {{classNameWithMethod}}
* @param {ObjectType.OBJECT} callback {{callbackFinish}}
* @param {ObjectType.LIST} params {{params}}
* @wizard procedures_callblockly_callreturn_async
* @returns {ObjectType.OBJECT}
*/
this.cronapi.util.callServerBlocklyAsynchronous = function(classNameWithMethod , callback , params) {
if(classNameWithMethod != '' && typeof callback == 'function'){
var params = [];
params.push(classNameWithMethod);
params.push(callback);
params.push(callback);
var idx = 2;
for(idx; idx < arguments.length ; idx ++){
params.push(arguments[idx]);
};
this.cronapi.util.makeCallServerBlocklyAsync.apply(this,params);
}
};
/**
* @type function
* @name {{executeJavascriptNoReturnName}}
* @nameTags executeJavascriptNoReturn
* @description {{executeJavascriptNoReturnDescription}}
* @param {ObjectType.STRING} value {{executeJavascriptNoReturnParam0}}
* @multilayer true
*/
this.cronapi.util.executeJavascriptNoReturn = function(value) {
eval( value );
};
/**
* @type function
* @name {{downloadFileName}}
* @nameTags downloadFile
* @description {{downloadFileDescription}}
* @param {ObjectType.STRING} url {{downloadFileParam0}}
* @multilayer true
*/
this.cronapi.util.downloadFile = function(url) {
var finalUrl = this.cronapi.internal.getAddressWithHostApp(url);
this.cronapi.screen.openUrl(finalUrl, '_blank' ,0,0 );
};
/**
* @type function
* @name {{executeJavascriptNoReturnName}}
* @nameTags executeJavascriptNoReturn
* @description {{executeJavascriptNoReturnDescription}}
* @param {ObjectType.STRING} value {{executeJavascriptNoReturnParam0}}
* @returns {ObjectType.STRING}
*/
this.cronapi.util.executeJavascriptNoReturn = function(value) {
eval( value );
};
/**
* @type function
* @name {{executeJavascriptNoReturnName}}
* @nameTags executeJavascriptReturn
* @description {{executeJavascriptReturnDescription}}
* @param {ObjectType.STRING} value {{executeJavascriptNoReturnParam0}}
* @returns {ObjectType.STRING}
*/
this.cronapi.util.executeJavascriptReturn = function(value) {
return eval( value );
};
/**
* @type function
* @name {{openReport}}
* @nameTags openReport|abrirrelatorio
* @description {{openReportDescription}}
* @param {ObjectType.STRING} value {{report}}
* @multilayer true
* @returns {ObjectType.VOID}
* @wizard procedures_openreport_callnoreturn
*/
this.cronapi.util.openReport = function(/** @type {ObjectType.STRING} @blockType util_report_list */ name) {
this.cronapi.$scope.getReport(name);
};
/**
* @type function
* @name obter IP
* @nameTags getIP|Obter IP
* @description Obtém o IP público da conexão
* @returns {ObjectType.STRING}
*/
this.cronapi.util.getIP = function() {
return $.get({url: "https://api.ipify.org/", async: false}).responseText;
};
/**
* @type function
* @name {{openDashboard}}
* @nameTags openDashboard|abrirdashboard
* @description {{openDashboardDescription}}
* @param {ObjectType.STRING} value {{dashboard}}
* @multilayer true
* @returns {ObjectType.VOID}
* @wizard procedures_opendashboard_callnoreturn
*/
this.cronapi.util.openDashboard = function(/** @type {ObjectType.STRING} @blockType util_dashboard_list */ name) {
this.cronapi.$scope.getReport(name);
};
/**
* @type internal
*/
this.cronapi.util.handleCallback = function(ref) {
if (ref) {
let isAsync = ref.constructor.name === "AsyncFunction";
if (isAsync) {
return function() {
(async ()=> await ref.apply(this, arguments))()
}.bind(this);
} else {
return ref.bind(this);
}
}
}
/**
* @type function
* @name {{getURLFromOthersName}}
* @description {{getURLFromOthersDescription}}
* @nameTags URL|API|Content|Download|Address|Endereco|Conteudo
* @param {ObjectType.STRING} method {{HTTPMethod}}
* @param {ObjectType.STRING} contentType {{contentType}}
* @param {ObjectType.STRING} url {{URLAddress}}
* @param {ObjectType.STRING} params {{paramsHTTP}}
* @param {ObjectType.STRING} headers {{headers}}
* @param {ObjectType.STRING} success {{success}}
* @param {ObjectType.STRING} error {{error}}
*/
this.cronapi.util.getURLFromOthers = function(/** @type {ObjectType.STRING} @description {{HTTPMethod}} @blockType util_dropdown @keys GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS|TRACE @values GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS|TRACE */ method , /** @type {ObjectType.STRING} @description {{HTTPMethod}} @blockType util_dropdown @keys application/x-www-form-urlencoded|application/json @values application/x-www-form-urlencoded|application/json */ contentType , /** @type {ObjectType.STRING} @description {{URLAddress}} */ url, /** @type {ObjectType.OBJECT} @description {{paramsHTTP}} */ params, /** @type {ObjectType.OBJECT} @description {{headers}} */ headers, /** @type {ObjectType.STATEMENTSENDER} @description {{success}} */ success, /** @type {ObjectType.STATEMENTSENDER} @description {{error}} */ error ) {
if (params && contentType === "application/x-www-form-urlencoded") {
for (var key in params) {
if (params[key] instanceof Array) {
var arrayContent = params[key].toString();
params[key] = `[${arrayContent}]`;
}
}
}
else if (params && contentType === "application/json") {
params = JSON.stringify(params);
}
var header = Object.create(headers);
header["Content-Type"] = contentType;
this.cronapi.$scope.http({
method: method,
url: url,
data: params,
headers: header,
transformResponse: (value) => value
}).then(
function success(response) {
this.cronapi.util.handleCallback(success)
.bind(this)(response.data, response);
}.bind(this),
function error(response) {
this.cronapi.util.handleCallback(error)
.bind(this)(response.data, response);
}.bind(this)
);
};
/**
* @type function
* @name {{getUserToken}}
* @nameTags token | auth | autenticaçào | armazenamento
* @description {{getUserTokenDesc}}
* @returns {ObjectType.STRING}
* @platform M
*/
this.cronapi.util.getUserToken = function() {
if (localStorage.getItem("_u")) { // Não existe quando chama uma bloco servidor antes de logar.
let currentSession = JSON.parse(window.localStorage.getItem('_u'));
if (currentSession.token) { // Não existe quando usa cookie
return currentSession.token;
}
}
return ""; // Não afeta autenticação, quando o header é vazio procura no cookie.
};
/**
* @type function
* @name {{getUser}}
* @nameTags user | auth | autenticaçào | armazenamento | getuser
* @description {{getUserDesc}}
* @returns {ObjectType.STRING}
*/
this.cronapi.util.getUser = function() {
return JSON.parse(window.localStorage.getItem('_u')).user.username;
};
/**
* @type function
* @name {{getUserName}}
* @nameTags username | auth | autenticaçào | armazenamento | getusername
* @description {{getUserNameDesc}}
* @returns {ObjectType.STRING}
*/
this.cronapi.util.getUserName = function() {
return JSON.parse(window.localStorage.getItem('_u')).user.name;
};
/**
* @type function
* @name {{setSessionStorage}}
* @nameTags storage | session | sessão | armazenamento
* @description {{setSessionStorageDesc}}
* @param {ObjectType.STRING} key {{key}}
* @param {ObjectType.STRING} value {{value}}
*/
this.cronapi.util.setSessionStorage = function(key, value) {
window.sessionStorage.setItem(key, value);
};
/**
* @type function
* @name {{getSessionStorage}}
* @nameTags storage | session | sessão | armazenamento
* @description {{getSessionStorageDesc}}
* @param {ObjectType.STRING} key {{key}}
* @returns {ObjectType.OBJECT}
*/
this.cronapi.util.getSessionStorage = function(key) {
return window.sessionStorage.getItem(key);
};
/**
* @type function
* @name {{setLocalStorage}}
* @nameTags storage | session | sessão | armazenamento
* @description {{setLocalStorageDesc}}
* @param {ObjectType.STRING} key {{key}}
* @param {ObjectType.STRING} value {{value}}
*/
this.cronapi.util.setLocalStorage = function(key, value) {
window.localStorage.setItem(key, value);
};
/**
* @type function
* @name {{getLocalStorage}}
* @nameTags storage | session | sessão | armazenamento
* @description {{getLocalStorageDesc}}
* @param {ObjectType.STRING} key {{key}}
* @returns {ObjectType.STRING}
*/
this.cronapi.util.getLocalStorage = function(key) {
return window.localStorage.getItem(key);
};
/**
* @type function
* @name {{executeAsynchronousName}}
* @nameTags Executar|Assíncrono|Execute| Asynchronous
* @description {{executeAsynchronousDescription}}
* @param {ObjectType.STATEMENT} statement {{statement}}
*
*/
this.cronapi.util.executeAsynchronous = function( /** @type {ObjectType.STATEMENT} @description {{statement}} */ statement) {
setTimeout(statement , 0 );
};
/**
* @type function
* @name {{scheduleExecutionName}}
* @nameTags Executar|Agenda|Agendar|Agendamento|Execução|Execute|Execution|Schedule|Scheduled
* @description {{scheduleExecutionDescription}}
* @param {ObjectType.STATEMENT} statement {{statement}}
* @param {ObjectType.LONG} initial_time {{scheduleExecutionParam1}}
* @param {ObjectType.LONG} interval_time {{scheduleExecutionParam2}}
* @param {ObjectType.STRING} measurement_unit {{scheduleExecutionParam3}}
* @param {ObjectType.BOOLEAN} stopExecutionAfterScopeDestroy {{stopExecutionAfterScopeDestroyLabel}}
*/
this.cronapi.util.scheduleExecution = function( /** @type {ObjectType.STATEMENT} @description {{statement}} */ statements , /** @type {ObjectType.LONG} */ initial_time , /** @type {ObjectType.LONG} */ interval_time , /** @type {ObjectType.STRING} @description {{scheduleExecutionParam3}} @blockType util_dropdown @keys seconds|milliseconds|minutes|hours @values {{seconds}}|{{millisecondss}}|{{minutes}}|{{hours}} */ measurement_unit, /** @type {ObjectType.BOOLEAN} @description {{stopExecutionAfterScopeDestroyLabel}} @blockType util_dropdown @keys true|false @values {{true}}|{{false}} */ stopExecutionAfterScopeDestroy ) {
stopExecutionAfterScopeDestroy = stopExecutionAfterScopeDestroy || true;
stopExecutionAfterScopeDestroy = (stopExecutionAfterScopeDestroy === 'true' || stopExecutionAfterScopeDestroy === true);
var factor = 1;
if (measurement_unit === 'seconds') {
factor = 1000;
} else if(measurement_unit ==='minutes') {
factor = 60000;
} else if(measurement_unit ==='hours') {
factor = 3600000;
}
initial_time = initial_time * factor;
interval_time = interval_time * factor;
var intervalId = -1;
var timeoutId = setTimeout(function() {
statements();
intervalId = setInterval(statements , interval_time) ;
}.bind(this), initial_time);
if(stopExecutionAfterScopeDestroy){
this.$on('$destroy', function() {
try { clearTimeout(timeoutId); } catch(e) {}
try { clearInterval(intervalId); } catch(e) {}
});
}
};
/**
* @type internal
*/
this.cronapi.util.openReport = function(name, params, config) {
this.cronapi.$scope.getReport(name, params, config);
};
/**
* @type internal
*/
this.cronapi.util.openDashboard = function(name, params, config) {
this.cronapi.$scope.getReport(name, params, config);
};
/**
* @type function
* @name {{getCEPName}}
* @description {{getCEPDescription}}
* @param {ObjectType.STRING} cep {{CEP}}
* @param {ObjectType.STRING} success {{success}}
*/
this.cronapi.util.getCEP = function(/** @type {ObjectType.STRING} @description {{CEP}} */ cep, /** @type {ObjectType.STATEMENTSENDER} @description {{success}} */ success) {
if(this.cronapi.logic.isNullOrEmpty(cep)) throw new Error("Informe o CEP");
cep = cep.replace(/\.|\-/g, '').split(' ').join('');
if(cep.length < 8) throw new Error("CEP inválido");
let url = "https://viacep.com.br/ws/" + cep + "/json/?callback=?";
$.getJSON(url, this.cronapi.util.handleCallback( success.bind(this) ));
};
/**
* @category CategoryType.SCREEN
* @categoryTags Screen|Tela
*/
this.cronapi.screen = {};
/**
* @type function
* @name {{isInsertingMode}}
* @nameTags isInsertingMode
* @description {{functionToIsInsertingMode}}
* @param {ObjectType.OBJECT} datasource {{datasource}}
* @returns {ObjectType.OBJECT}
*/
this.cronapi.screen.isInsertingMode = function(datasource) {
return getDatasource(datasource).inserting;
};
/**
* @type function
* @name {{isEditingMode}}
* @nameTags isEditingMode
* @description {{functionToIsEditingMode}}
* @param {ObjectType.OBJECT} datasource {{datasource}}
* @returns {ObjectType.OBJECT}
*/
this.cronapi.screen.isEditingMode = function(datasource) {
return getDatasource(datasource).editing;
};
/**
* @type function
* @platform W
* @name {{changeTitleScreen}}
* @nameTags changeTitleScreen
* @description {{functionToChangeTitleScreen}}
* @param {ObjectType.STRING} title {{title}}
*/
this.cronapi.screen.changeTitleScreen = function(title) {
window.document.title = title;
};
/**
* @type function
* @name {{fieldNameFromScreen}}
* @nameTags fieldNameFromScreen
* @description {{functionToGetFieldNameFromScreen}}
* @param {ObjectType.STRING} field {{field}}
* @returns {ObjectType.OBJECT}
* @wizard field_from_screen
* @multilayer true
*/
this.cronapi.screen.fieldFromScreen = function(field) {
return field;
};
/**
* @type function
* @name {{changeValueOfField}}
* @nameTags changeValueOfField|changeFieldValue
* @description {{functionToChangeValueOfField}}
* @param {ObjectType.STRING} field {{field}}
* @param {ObjectType.STRING} value {{value}}
* @multilayer true
*/
this.cronapi.screen.changeValueOfField = function(/** @type {ObjectType.STRING} @blockType field_from_screen*/ field, /** @type {ObjectType.STRING} */value) {
try {
this.__tempValue = value;
var func = new Function('this.' + field + ' = this.__tempValue;');
this.safeApply(func.bind(this));
}
catch (e) {
// NO COMMAND
}
};
/**
* @type function
* @name {{getValueOfField}}
* @nameTags getValueOfField|getFieldValue
* @description {{functionToGetValueOfField}}
* @param {ObjectType.STRING} field {{field}}
* @returns {ObjectType.OBJECT}
* @displayInline true
*/
this.cronapi.screen.getValueOfField = function(/** @type {ObjectType.STRING} @blockType field_from_screen*/ field) {
try {
if (field && field.length > 0) {
if (field.indexOf('.active.') > -1)
return eval(field);
else{
var scope = eval('this');
var recursiveLookup = function(scope) {
var fieldValue;
try {
fieldValue = eval("scope." + field);
}
catch (e) {
}
if(fieldValue !== undefined || fieldValue !== null){
return fieldValue;
}
else if(scope && scope.$parent ) {
return recursiveLookup(scope.$parent);
}
return '';
};
return recursiveLookup(scope);
}
}
return '';
}
catch (e) {
alert(e);
}
};
/**
* @type function
* @name {{createScopeVariableName}}
* @nameTags createScopeVariable
* @description {{createScopeVariableDescription}}
* @param {ObjectType.STRING} name {{createScopeVariableParam0}}
* @param {ObjectType.STRING} value {{createScopeVariableParam1}}
*/
this.cronapi.screen.createScopeVariable = function(name,value) {
this.cronapi.$scope.safeApply(() => this.cronapi.$scope.vars[name] = value);
};
/**
* @type function
* @name {{getScopeVariableName}}
* @nameTags getScopeVariable
* @description {{getScopeVariableDescription}}
* @param {ObjectType.STRING} name {{getScopeVariableParam0}}
* @returns {ObjectType.STRING}
*/
this.cronapi.screen.getScopeVariable = function(name) {
return this.c