UNPKG

cronapi-js

Version:
1,670 lines (1,507 loc) 362 kB
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); }; } 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, 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 (response) { this.cronapi.util.handleCallback(success) .bind(this)(response.data, response); }.bind(this), function (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.cronapi.$scope.vars[name]; }; /** * @deprecated true * @type