From 3628f356b3dc05ecc0536b5d23abb6493289e87c Mon Sep 17 00:00:00 2001 From: eldadfux Date: Wed, 7 Aug 2019 13:46:51 +0300 Subject: [PATCH] New service callbacks --- composer.json | 3 - composer.lock | 68 +-------------- public/dist/scripts/app-all.js | 13 ++- public/dist/scripts/app.js | 13 ++- public/scripts/views/service.js | 141 +++++++++++++++++++++++--------- 5 files changed, 121 insertions(+), 117 deletions(-) diff --git a/composer.json b/composer.json index 5b514ee57..e6c55a259 100644 --- a/composer.json +++ b/composer.json @@ -24,13 +24,11 @@ }, "require": { "php": ">=7.3.0", - "ext-mysqlnd": "*", "ext-curl": "*", "ext-imagick": "*", "ext-mbstring": "*", "ext-json": "*", "ext-dom": "*", - "ext-newrelic": "*", "ext-redis": "*", "ext-pdo": "*", "ext-openssl": "*", @@ -53,7 +51,6 @@ "piwik/device-detector": "3.5.1", "eldadfux/mailgun-lite": "master", "dragonmantank/cron-expression": "2.2.0", - "sentry/sentry": "1.9.*", "domnikl/statsd": "2.0.*", "influxdb/influxdb-php": "1.15.*", "bacon/bacon-qr-code": "2.0.0", diff --git a/composer.lock b/composer.lock index 2c34df62c..3bf487f7f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "83fe01a42c79683e1d521172aec04743", + "content-hash": "2dfb6641e152a77d5562925e735890e0", "packages": [ { "name": "appwrite/php-clamav", @@ -1316,70 +1316,6 @@ "description": "A polyfill for getallheaders.", "time": "2019-03-08T08:55:37+00:00" }, - { - "name": "sentry/sentry", - "version": "1.9.2", - "source": { - "type": "git", - "url": "https://github.com/getsentry/sentry-php.git", - "reference": "6b4c80ee1f5d9d5ab5bae949f4eb5d758a0bf64b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/6b4c80ee1f5d9d5ab5bae949f4eb5d758a0bf64b", - "reference": "6b4c80ee1f5d9d5ab5bae949f4eb5d758a0bf64b", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "php": "^5.3|^7.0" - }, - "conflict": { - "raven/raven": "*" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^1.8.0", - "monolog/monolog": "*", - "phpunit/phpunit": "^4.8.35 || ^5.7" - }, - "suggest": { - "ext-hash": "*", - "ext-json": "*", - "ext-mbstring": "*", - "monolog/monolog": "Automatically capture Monolog events as breadcrumbs" - }, - "bin": [ - "bin/sentry" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10.x-dev" - } - }, - "autoload": { - "psr-0": { - "Raven_": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "David Cramer", - "email": "dcramer@gmail.com" - } - ], - "description": "A PHP client for Sentry (http://getsentry.com)", - "homepage": "http://getsentry.com", - "keywords": [ - "log", - "logging" - ], - "time": "2018-08-18T19:41:03+00:00" - }, { "name": "symfony/polyfill-ctype", "version": "dev-master", @@ -3271,13 +3207,11 @@ "prefer-lowest": false, "platform": { "php": ">=7.3.0", - "ext-mysqlnd": "*", "ext-curl": "*", "ext-imagick": "*", "ext-mbstring": "*", "ext-json": "*", "ext-dom": "*", - "ext-newrelic": "*", "ext-redis": "*", "ext-pdo": "*", "ext-openssl": "*", diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js index d282fedd9..532bcee39 100644 --- a/public/dist/scripts/app-all.js +++ b/public/dist/scripts/app-all.js @@ -2371,10 +2371,12 @@ window.getSelection().removeAllRanges();});element.parentNode.parentNode.appendC document.body.classList.add(prefix+'-'+value);cookie.set('language-'+prefix,value,365);document.dispatchEvent(new CustomEvent('updated-language-'+prefix));};document.addEventListener('updated-language-'+prefix,function(){element.value=cookie.get('language-'+prefix);});let def=cookie.get('language-'+prefix)||element.options[0].value;select(def);element.value=def;}}).add({selector:'data-ls-ui-chart',repeat:false,controller:function(element,container,date,document){let child=document.createElement('canvas');child.width=500;child.height=175;let stats=container.get('usage');if(!stats||!stats['requests']||!stats['requests']['data']){return;} let config={type:'line',data:{labels:[],datasets:[{label:'Requests',backgroundColor:'rgba(230, 248, 253, 0.3)',borderColor:'#29b5d9',borderWidth:2,data:[0,0,0,0,0,0,0],fill:true}]},options:{responsive:true,title:{display:false,text:'Stats'},legend:{display:false},tooltips:{mode:'index',intersect:false,caretPadding:0},hover:{mode:'nearest',intersect:true},scales:{xAxes:[{display:false}],yAxes:[{display:false,}]}}};for(let i=0;i)|{)/m;const REGEX_PARAMETERS_VALUES=/\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;function getParams(func){let functionAsString=func.toString();let params=[];let match;functionAsString=functionAsString.replace(REGEX_COMMENTS,'');functionAsString=functionAsString.match(REGEX_FUNCTION_PARAMS)[1];if(functionAsString.charAt(0)==='('){functionAsString=functionAsString.slice(1,-1);} +element.innerHTML='';element.appendChild(child);container.set('chart',new Chart(child.getContext('2d'),config),true);element.dataset['canvas']=true;}});(function(window){"use strict";window.ls.container.get('view').add({selector:'data-service',repeat:false,controller:function(element,view,container,form,alerts,expression,window,router){let action=element.dataset['service'];let service=element.dataset['name']||action;let event=element.dataset['event'];let confirm=element.dataset['confirm']||'';let loading=element.dataset['loading']||'';let loaderId=null;let scope=element.dataset['scope']||'sdk';let debug=!!(element.dataset['debug']);let callback=(element.dataset['callbacks']||'');callback=(callback&&callback!='')?callback.trim().split(','):[];if(debug)console.log('%c[service init]: '+action+' ('+service+')','color:red');let callbacks={'reset':function(){return function(){if('FORM'===element.tagName){return element.reset();} +throw new Error('This callback is only valid for forms');}},'alert':function(){return function(alerts){let alert=element.dataset['successAlert']||'Success';alerts.send({text:alert,class:'success'},3000);}},'redirect':function(){return function(router){let url=expression.parse(element.dataset['successRedirectUrl'])||'/';router.change(url);}},'reload':function(){return function(router){router.reload();}},'trigger':function(){return function(document){let triggers=element.dataset['successTriggers']||'';triggers=triggers.trim().split(',');for(let i=0;i)|{)/m;const REGEX_PARAMETERS_VALUES=/\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;let functionAsString=func.toString();let params=[];let match;functionAsString=functionAsString.replace(REGEX_COMMENTS,'');functionAsString=functionAsString.match(REGEX_FUNCTION_PARAMS)[1];if(functionAsString.charAt(0)==='('){functionAsString=functionAsString.slice(1,-1);} while(match=REGEX_PARAMETERS_VALUES.exec(functionAsString)){params.push(match[1]);} return params;} -let args=getParams(target);if(debug)console.log('%c[form data]: ','color:green',data);return target.apply(target,args.map(function(value){let result=null;if(!value){return null;} +let resolve=function(target,prefix='param',data={}){let args=getParams(target);if(debug)console.log('%c[form data]: ','color:green',data);return target.apply(target,args.map(function(value){let result=null;if(!value){return null;} if(element.dataset['param'+value.charAt(0).toUpperCase()+value.slice(1)]){result=expression.parse(element.dataset['param'+value.charAt(0).toUpperCase()+value.slice(1)]);} if(data[value]){result=data[value];} if(!result){result='';} @@ -2383,12 +2385,15 @@ if(event){event.preventDefault();} if(confirm){if(window.confirm(confirm)!==true){return false;}} if(loading){loaderId=alerts.send({text:loading,class:''},0);} let method=container.path(scope+'.'+action);if(!method){throw new Error('Method "'+scope+'.'+action+'" not found');} -let result=resolve(method);if(!result){return;} +let result=resolve(method,'param',('FORM'===element.tagName)?form.toJson(element):{});if(!result){return;} result.then(function(data){if(loaderId!==null){alerts.remove(loaderId);} if(!element){return;} try{container.set(service.replace('.','-'),data,true,true);if(debug)console.log('%cservice ready: "'+service.replace('.','-')+'"','color:green');if(debug)console.log('%cservice:','color:blue',container.get(service.replace('.','-')));}catch(e){container.set(service.replace('.','-'),{},true);} +for(let i=0;i)|{)/m;const REGEX_PARAMETERS_VALUES=/\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;function getParams(func){let functionAsString=func.toString();let params=[];let match;functionAsString=functionAsString.replace(REGEX_COMMENTS,'');functionAsString=functionAsString.match(REGEX_FUNCTION_PARAMS)[1];if(functionAsString.charAt(0)==='('){functionAsString=functionAsString.slice(1,-1);} +element.innerHTML='';element.appendChild(child);container.set('chart',new Chart(child.getContext('2d'),config),true);element.dataset['canvas']=true;}});(function(window){"use strict";window.ls.container.get('view').add({selector:'data-service',repeat:false,controller:function(element,view,container,form,alerts,expression,window,router){let action=element.dataset['service'];let service=element.dataset['name']||action;let event=element.dataset['event'];let confirm=element.dataset['confirm']||'';let loading=element.dataset['loading']||'';let loaderId=null;let scope=element.dataset['scope']||'sdk';let debug=!!(element.dataset['debug']);let callback=(element.dataset['callbacks']||'');callback=(callback&&callback!='')?callback.trim().split(','):[];if(debug)console.log('%c[service init]: '+action+' ('+service+')','color:red');let callbacks={'reset':function(){return function(){if('FORM'===element.tagName){return element.reset();} +throw new Error('This callback is only valid for forms');}},'alert':function(){return function(alerts){let alert=element.dataset['successAlert']||'Success';alerts.send({text:alert,class:'success'},3000);}},'redirect':function(){return function(router){let url=expression.parse(element.dataset['successRedirectUrl'])||'/';router.change(url);}},'reload':function(){return function(router){router.reload();}},'trigger':function(){return function(document){let triggers=element.dataset['successTriggers']||'';triggers=triggers.trim().split(',');for(let i=0;i)|{)/m;const REGEX_PARAMETERS_VALUES=/\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;let functionAsString=func.toString();let params=[];let match;functionAsString=functionAsString.replace(REGEX_COMMENTS,'');functionAsString=functionAsString.match(REGEX_FUNCTION_PARAMS)[1];if(functionAsString.charAt(0)==='('){functionAsString=functionAsString.slice(1,-1);} while(match=REGEX_PARAMETERS_VALUES.exec(functionAsString)){params.push(match[1]);} return params;} -let args=getParams(target);if(debug)console.log('%c[form data]: ','color:green',data);return target.apply(target,args.map(function(value){let result=null;if(!value){return null;} +let resolve=function(target,prefix='param',data={}){let args=getParams(target);if(debug)console.log('%c[form data]: ','color:green',data);return target.apply(target,args.map(function(value){let result=null;if(!value){return null;} if(element.dataset['param'+value.charAt(0).toUpperCase()+value.slice(1)]){result=expression.parse(element.dataset['param'+value.charAt(0).toUpperCase()+value.slice(1)]);} if(data[value]){result=data[value];} if(!result){result='';} @@ -290,12 +292,15 @@ if(event){event.preventDefault();} if(confirm){if(window.confirm(confirm)!==true){return false;}} if(loading){loaderId=alerts.send({text:loading,class:''},0);} let method=container.path(scope+'.'+action);if(!method){throw new Error('Method "'+scope+'.'+action+'" not found');} -let result=resolve(method);if(!result){return;} +let result=resolve(method,'param',('FORM'===element.tagName)?form.toJson(element):{});if(!result){return;} result.then(function(data){if(loaderId!==null){alerts.remove(loaderId);} if(!element){return;} try{container.set(service.replace('.','-'),data,true,true);if(debug)console.log('%cservice ready: "'+service.replace('.','-')+'"','color:green');if(debug)console.log('%cservice:','color:blue',container.get(service.replace('.','-')));}catch(e){container.set(service.replace('.','-'),{},true);} +for(let i=0;i a + 1 ) - is NOT ok + * - does NOT support default string value that are appended with a non-standard ( word characters or $ ) variable name + * to clarify: ( name = "string" + b ) - is ok + * ( name = "string" + $b ) - is ok + * ( name = "string" + b + "!" ) - is ok + * ( name = "string" + λ ) - is NOT ok + * @param {function} func + * @returns {Array} - An array of the given function's parameter [key, default value] pairs. + */ + let getParams = function getParams(func) { const REGEX_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; const REGEX_FUNCTION_PARAMS = /(?:\s*(?:function\s*[^(]*)?\s*)((?:[^'"]|(?:(?:(['"])(?:(?:.*?[^\\]\2)|\2))))*?)\s*(?=(?:=>)|{)/m; const REGEX_PARAMETERS_VALUES = /\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm; - /** - * Original Solution From: - * @see https://stackoverflow.com/a/41322698/2299554 - * Notice: this version add support for $ sign in arg name. - * - * Retrieve a function's parameter names and default values - * Notes: - * - parameters with default values will not show up in transpiler code (Babel) because the parameter is removed from the function. - * - does NOT support inline arrow functions as default values - * to clarify: ( name = "string", add = defaultAddFunction ) - is ok - * ( name = "string", add = ( a )=> a + 1 ) - is NOT ok - * - does NOT support default string value that are appended with a non-standard ( word characters or $ ) variable name - * to clarify: ( name = "string" + b ) - is ok - * ( name = "string" + $b ) - is ok - * ( name = "string" + b + "!" ) - is ok - * ( name = "string" + λ ) - is NOT ok - * @param {function} func - * @returns {Array} - An array of the given function's parameter [key, default value] pairs. - */ - function getParams(func) { - let functionAsString = func.toString(); - let params = []; - let match; + let functionAsString = func.toString(); + let params = []; + let match; - functionAsString = functionAsString.replace(REGEX_COMMENTS, ''); - functionAsString = functionAsString.match(REGEX_FUNCTION_PARAMS)[1]; + functionAsString = functionAsString.replace(REGEX_COMMENTS, ''); + functionAsString = functionAsString.match(REGEX_FUNCTION_PARAMS)[1]; - if (functionAsString.charAt(0) === '(') { - functionAsString = functionAsString.slice(1, -1); - } - - while (match = REGEX_PARAMETERS_VALUES.exec(functionAsString)) { - //params.push([match[1], match[2]]); // with default values - params.push(match[1]); // only with arg name - } - - return params; + if (functionAsString.charAt(0) === '(') { + functionAsString = functionAsString.slice(1, -1); } + while (match = REGEX_PARAMETERS_VALUES.exec(functionAsString)) { + //params.push([match[1], match[2]]); // with default values + params.push(match[1]); // only with arg name + } + + return params; + } + + let resolve = function(target, prefix = 'param', data = {}) { let args = getParams(target); if (debug) console.log('%c[form data]: ', 'color:green', data); @@ -128,7 +179,7 @@ throw new Error('Method "' + scope + '.' + action + '" not found'); } - let result = resolve(method); + let result = resolve(method, 'param', ('FORM' === element.tagName) ? form.toJson(element) : {}); if(!result) { return; @@ -152,6 +203,10 @@ container.set(service.replace('.', '-'), {}, true); } + for (let i = 0; i < callback.length; i++) { // Trigger success callbacks + container.resolve(resolve(callbacks[callback[i]], 'successParam', {})); + } + element.$lsSkip = false; view.render(element); @@ -163,6 +218,14 @@ if(!element) { return; } + + for (let i = 0; i < callback.length; i++) { // Trigger success callbacks + container.resolve(resolve(callbacks[callback[i]], 'failureParam', {})); + } + + element.$lsSkip = false; + + view.render(element); }); };