Fixed data binding for elements
This commit is contained in:
parent
583e9c6e24
commit
d34a23ab71
|
@ -22,7 +22,7 @@ use Utopia\Locale\Locale;
|
|||
</div>
|
||||
|
||||
<a href="/console/account" class="account pull-end clear">
|
||||
<img src="" data-ui-gravatar="{{account.email}}" data-name="{{account.name}}" alt="User Avatar" class="avatar margin-start pull-end" />
|
||||
<img src="" data-ls-attrs="src={{account|gravatar}}" alt="User Avatar" class="avatar margin-start pull-end" />
|
||||
<span class="name pull-end" data-ls-bind="{{account.name}}"></span>
|
||||
</a>
|
||||
</div>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<div class="cover" style="xbackground-image: url('/images/developer-opacity.png'); background-position: 90% top; background-size: 400px 400px; background-repeat: no-repeat;">
|
||||
<div class="cover" style="background-size: 400px 400px; background-repeat: no-repeat;">
|
||||
<div class="zone xl">
|
||||
<div class="margin-top margin-bottom"><a href="/"><img src="/images/appwrite.svg" height="30" alt="Logo" /></a></div>
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ $providers = $this->getParam('providers', []);
|
|||
<?php echo Locale::getText('console.users.title'); ?>
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<span data-ls-bind="{{project-users.sum}}">xxxxx</span>
|
||||
<div class="zone xl" data-ls-rerender="project.load">
|
||||
<ul class="phases clear" data-ui-phases data-selected="{{router.params.tab}}">
|
||||
<li data-state="/console/users?project={{router.params.project}}">
|
||||
|
@ -60,18 +60,14 @@ $providers = $this->getParam('providers', []);
|
|||
</div>
|
||||
|
||||
<div data-service="users.list"
|
||||
data-param-search="{{filter-users.keys.search}}"
|
||||
data-param-limit="{{filter-users.keys.limit}}"
|
||||
data-param-offset="{{filter-users.keys.offset}}"
|
||||
data-event="load"
|
||||
data-param-search=""
|
||||
data-param-limit="25"
|
||||
data-param-offset="0"
|
||||
data-scope="sdk"
|
||||
data-name="project-users"
|
||||
data-event="filter-users-changed"
|
||||
data-success="render,trigger"
|
||||
data-error="render"
|
||||
data-error-rerender=""
|
||||
data-success-triggers="users.load">
|
||||
data-name="project-users">
|
||||
|
||||
<div data-ls-if="0 == {{project-users.sum}}" class="box margin-bottom" style="display: none;">
|
||||
<div data-ls-if="0 == {{project-users.sum}}" class="box margin-bottom">
|
||||
<h3 class="margin-bottom">No Users Found</h3>
|
||||
|
||||
<p class="margin-bottom-no">Create your first user to get started</p>
|
||||
|
|
90
public/dist/scripts/app-all.js
vendored
90
public/dist/scripts/app-all.js
vendored
File diff suppressed because one or more lines are too long
90
public/dist/scripts/app.js
vendored
90
public/dist/scripts/app.js
vendored
File diff suppressed because one or more lines are too long
|
@ -1,11 +1,10 @@
|
|||
|
||||
window.ls=window.ls||{};window.ls.container=function(){let stock={};let cachePrefix='none';let memory={};let setCachePrefix=function(prefix){cachePrefix=prefix;return this;};let getCachePrefix=function(){return cachePrefix;};let set=function(name,object,singleton,cache=false,watch=true){if(typeof name!=='string'){throw new Error('var name must be of type string');}
|
||||
window.ls=window.ls||{};window.ls.container=function(){let stock={};let listeners={};let set=function(name,object,singleton,watch=true){if(typeof name!=='string'){throw new Error('var name must be of type string');}
|
||||
if(typeof singleton!=='boolean'){throw new Error('var singleton "'+singleton+'" of service "'+name+'" must be of type boolean');}
|
||||
if(cache){window.localStorage.setItem(getCachePrefix()+'.'+name,JSON.stringify(object));}
|
||||
stock[name]={name:name,object:object,singleton:singleton,instance:null,watch:watch,};return this;};let get=function(name){let service=(undefined!==stock[name])?stock[name]:null;if(null===service){if(memory[getCachePrefix()+'.'+name]){return memory[getCachePrefix()+'.'+name];}
|
||||
let cached=window.localStorage.getItem(getCachePrefix()+'.'+name);if(cached){cached=JSON.parse(cached);memory[getCachePrefix()+'.'+name]=cached;return cached;}
|
||||
return null;}
|
||||
if(service.instance===null){let instance=(typeof service.object==='function')?this.resolve(service.object):service.object;let skip=false;if(service.watch&&name!=='window'&&name!=='document'&&name!=='element'&&typeof instance==='object'&&instance!==null){let handler={name:service.name,watch:function(){},get:function(target,key){if(key==="__name"){return this.name;}
|
||||
stock[name]={name:name,object:object,singleton:singleton,instance:null,watch:watch,};let binds=listeners[name]||{};for(let key in binds){if(binds.hasOwnProperty(key)){document.dispatchEvent(new CustomEvent(key));}}
|
||||
return this;};let get=function(name){let service=(undefined!==stock[name])?stock[name]:null;if(null==service){return null;}
|
||||
if(service.instance){return service.instance;}
|
||||
let instance=(typeof service.object==='function')?this.resolve(service.object):service.object;let skip=false;if(service.watch&&name!=='window'&&name!=='document'&&name!=='element'&&typeof instance==='object'&&instance!==null){let handler={name:service.name,watch:function(){},get:function(target,key){if(key==="__name"){return this.name;}
|
||||
if(key==="__watch"){return this.watch;}
|
||||
if(key==="__proxy"){return true;}
|
||||
if(typeof target[key]==='object'&&target[key]!==null&&!target[key].__proxy){let handler=Object.assign({},this);handler.name=handler.name+'.'+key;return new Proxy(target[key],handler)}
|
||||
|
@ -13,17 +12,16 @@ window.ls=window.ls||{};window.ls.container=function(){let stock={};let cachePre
|
|||
if(key==="__watch"){return this.watch=value;}
|
||||
target[key]=value;let path=receiver.__name+'.'+key;document.dispatchEvent(new CustomEvent(path+'.changed'));if(skip){return true;}
|
||||
skip=true;container.set('$prop',key,true);container.set('$value',value,true);container.resolve(this.watch);container.set('$key',null,true);container.set('$value',null,true);skip=false;return true;},};instance=new Proxy(instance,handler);}
|
||||
if(service.singleton){service.instance=instance;}
|
||||
return instance;}
|
||||
return service.instance;};let resolve=function(target){if(!target){return function(){};}
|
||||
let self=this;let FN_ARGS=/^function\s*[^\(]*\(\s*([^\)]*)\)/m;let text=target.toString()||'';let args=text.match(FN_ARGS)[1].split(',');return target.apply(target,args.map(function(value){return self.get(value.trim());}));};let path=function(path,value,as,prefix){as=(as)?as:container.get('$as');prefix=(prefix)?prefix:container.get('$prefix');path=path.replace(as+'.',prefix+'.').split('.');let name=path.shift();let object=this.get(name);let result=null;while(path.length>1){if(undefined===object){return null;}
|
||||
if(service.singleton){service.instance=instance;}
|
||||
return instance;};let resolve=function(target){if(!target){return function(){};}
|
||||
let self=this;let FN_ARGS=/^function\s*[^\(]*\(\s*([^\)]*)\)/m;let text=target.toString()||'';let args=text.match(FN_ARGS)[1].split(',');return target.apply(target,args.map(function(value){return self.get(value.trim());}));};let path=function(path,value,as,prefix){as=(as)?as:container.get('$as');prefix=(prefix)?prefix:container.get('$prefix');path=path.replace(as+'.',prefix+'.').split('.');let name=path.shift();let object=this.get(name);let result=null;while(path.length>1){if(!object){return null;}
|
||||
object=object[path.shift()];}
|
||||
if(undefined!==value){object[path.shift()]=value;return true;}
|
||||
if(undefined===object){return null;}
|
||||
let shift=path.shift();if(undefined===shift){result=object;}
|
||||
if(value){object[path.shift()]=value;return true;}
|
||||
if(!object){return null;}
|
||||
let shift=path.shift();if(!shift){result=object;}
|
||||
else{return object[shift];}
|
||||
return result;};let bind=function(element,path,callback,as,prefix){as=(as)?as:container.get('$as');prefix=(prefix)?prefix:container.get('$prefix');let event=path.replace(as+'.',prefix+'.')+'.changed';let printer=function(){if(!document.body.contains(element)){element=null;document.removeEventListener(event,printer,false);return false;}
|
||||
callback();};document.addEventListener(event,printer);};let container={set:set,get:get,resolve:resolve,path:path,bind:bind,setCachePrefix:setCachePrefix,getCachePrefix:getCachePrefix};set('container',container,true,false,false);return container;}();window.ls.container.set('http',function(document){let globalParams=[],globalHeaders=[];let addParam=function(url,param,value){param=encodeURIComponent(param);let a=document.createElement('a');param+=(value?"="+encodeURIComponent(value):"");a.href=url;a.search+=(a.search?"&":"")+param;return a.href;};let request=function(method,url,headers,payload,progress){let i;if(-1===['GET','POST','PUT','DELETE','TRACE','HEAD','OPTIONS','CONNECT','PATCH'].indexOf(method)){throw new Error('var method must contain a valid HTTP method name');}
|
||||
return result;};let bind=function(element,path,callback,as,prefix){as=(as)?as:container.get('$as');prefix=(prefix)?prefix:container.get('$prefix');let event=path.replace(as+'.',prefix+'.')+'.changed';let service=event.split('.').slice(0,1).pop();listeners[service]=listeners[service]||{};listeners[service][event]=true;let printer=function(){if(!document.body.contains(element)){element=null;document.removeEventListener(event,printer,false);return false;}
|
||||
callback();};document.addEventListener(event,printer);};let container={set:set,get:get,resolve:resolve,path:path,bind:bind,stock:stock,listeners:listeners,};set('container',container,true,false,false);return container;}();window.ls.container.set('http',function(document){let globalParams=[],globalHeaders=[];let addParam=function(url,param,value){param=encodeURIComponent(param);let a=document.createElement('a');param+=(value?"="+encodeURIComponent(value):"");a.href=url;a.search+=(a.search?"&":"")+param;return a.href;};let request=function(method,url,headers,payload,progress){let i;if(-1===['GET','POST','PUT','DELETE','TRACE','HEAD','OPTIONS','CONNECT','PATCH'].indexOf(method)){throw new Error('var method must contain a valid HTTP method name');}
|
||||
if(typeof url!=='string'){throw new Error('var url must be of type string');}
|
||||
if(typeof headers!=='object'){throw new Error('var headers must be of type object');}
|
||||
if(typeof url!=='string'){throw new Error('var url must be of type string');}
|
||||
|
@ -32,10 +30,10 @@ window.ls=window.ls||{};window.ls.container=function(){let stock={};let cachePre
|
|||
for(let key in headers){if(headers.hasOwnProperty(key)){xmlhttp.setRequestHeader(key,headers[key]);}}
|
||||
xmlhttp.onload=function(){if(4===xmlhttp.readyState&&200===xmlhttp.status){resolve(xmlhttp.response);}
|
||||
else{document.dispatchEvent(new CustomEvent('http-'+method.toLowerCase()+'-'+xmlhttp.status));reject(new Error(xmlhttp.statusText));}};if(progress){xmlhttp.addEventListener('progress',progress);xmlhttp.upload.addEventListener('progress',progress,false);}
|
||||
xmlhttp.onerror=function(){reject(new Error("Network Error"));};xmlhttp.send(payload);})};return{'get':function(url){return request('GET',url,{},'')},'post':function(url,headers,payload){return request('POST',url,headers,payload)},'put':function(url,headers,payload){return request('PUT',url,headers,payload)},'patch':function(url,headers,payload){return request('PATCH',url,headers,payload)},'delete':function(url){return request('DELETE',url,{},'')},'addGlobalParam':function(key,value){globalParams.push({key:key,value:value});},'addGlobalHeader':function(key,value){globalHeaders.push({key:key,value:value});}}},true,false,false);window.ls.container.set('cookie',function(document){function get(name){let value="; "+document.cookie,parts=value.split("; "+name+"=");if(parts.length===2){return parts.pop().split(";").shift();}
|
||||
xmlhttp.onerror=function(){reject(new Error("Network Error"));};xmlhttp.send(payload);})};return{'get':function(url){return request('GET',url,{},'')},'post':function(url,headers,payload){return request('POST',url,headers,payload)},'put':function(url,headers,payload){return request('PUT',url,headers,payload)},'patch':function(url,headers,payload){return request('PATCH',url,headers,payload)},'delete':function(url){return request('DELETE',url,{},'')},'addGlobalParam':function(key,value){globalParams.push({key:key,value:value});},'addGlobalHeader':function(key,value){globalHeaders.push({key:key,value:value});}}},true,false);window.ls.container.set('cookie',function(document){function get(name){let value="; "+document.cookie,parts=value.split("; "+name+"=");if(parts.length===2){return parts.pop().split(";").shift();}
|
||||
return null;}
|
||||
function set(name,value,days){let date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));let expires=(0<days)?'expires='+date.toUTCString():'expires=0';document.cookie=name+"="+value+";"+expires+";path=/";return this;}
|
||||
return{'get':get,'set':set}},true,false,false);window.ls.container.set('view',function(http,container){let stock={};let execute=function(view,node,container){container.set('element',node,true,false,false);container.resolve(view.controller);if(true!==view.repeat){node.removeAttribute(view.selector);}};let parse=function(node,skip){if(node.attributes&&skip!==true){let attrs=[];let attrsLen=node.attributes.length;for(let x=0;x<attrsLen;x++){attrs.push(node.attributes[x].nodeName);}
|
||||
return{'get':get,'set':set}},true,false);window.ls.container.set('view',function(http,container){let stock={};let execute=function(view,node,container){container.set('element',node,true,false,false);container.resolve(view.controller);if(true!==view.repeat){node.removeAttribute(view.selector);}};let parse=function(node,skip){if(node.attributes&&skip!==true){let attrs=[];let attrsLen=node.attributes.length;for(let x=0;x<attrsLen;x++){attrs.push(node.attributes[x].nodeName);}
|
||||
if(1!==node.nodeType){return;}
|
||||
if(attrs&&attrsLen){for(let x=0;x<attrsLen;x++){if(node.$lsSkip===true){break;}
|
||||
let pointer=(!/Edge/.test(navigator.userAgent))?x:(attrsLen-1)-x;let length=attrsLen;let attr=attrs[pointer];if(!stock[attr]){continue;}
|
||||
|
@ -50,7 +48,7 @@ window.ls=window.ls||{};window.ls.container=function(){let stock={};let cachePre
|
|||
if(prop in object){continue;}
|
||||
object[prop]=defaults[prop];}
|
||||
if(!object.selector){throw new Error('View component is missing a selector attribute');}
|
||||
stock[object.selector]=object;return this;},render:function(element){parse(element);element.dispatchEvent(new window.Event('rendered',{bubbles:false}));}}},true,false,false);window.ls.container.set('router',function(window){let states=[];let current=null;let previous=null;let getPrevious=function(){return previous;};let setPrevious=function(value){previous=value;return this;};let getCurrent=function(){return current;};let setCurrent=function(value){current=value;return this;};let setParam=function(key,value){state.params[key]=value;return this;};let getParam=function(key,def){if(key in state.params){return state.params[key];}
|
||||
stock[object.selector]=object;return this;},render:function(element){parse(element);element.dispatchEvent(new window.Event('rendered',{bubbles:false}));}}},true,false);window.ls.container.set('router',function(window){let states=[];let current=null;let previous=null;let getPrevious=function(){return previous;};let setPrevious=function(value){previous=value;return this;};let getCurrent=function(){return current;};let setCurrent=function(value){current=value;return this;};let setParam=function(key,value){state.params[key]=value;return this;};let getParam=function(key,def){if(key in state.params){return state.params[key];}
|
||||
return def;};let getParams=function(){return state.params;};let getURL=function(){return window.location.href;};let reset=function(){state.params=getJsonFromUrl(window.location.search);state.hash=window.location.hash;};let add=function(path,view){if(typeof path!=='string'){throw new Error('path must be of type string');}
|
||||
if(typeof view!=='object'){throw new Error('view must be of type object');}
|
||||
states[states.length++]={path:path,view:view};return this;};let match=function(location){let url=location.pathname+((location.hash)?location.hash:'');states.sort(function(a,b){return b.path.length-a.path.length;});states.sort(function(a,b){let n=b.path.split('/').length-a.path.split('/').length;if(n!==0){return n;}
|
||||
|
@ -62,10 +60,10 @@ else{window.history.replaceState({},'',URL);}
|
|||
part=part.split('+').join(' ');let eq=part.indexOf('=');let key=eq>-1?part.substr(0,eq):part;let val=eq>-1?decodeURIComponent(part.substr(eq+1)):'';let from=key.indexOf('[');if(from===-1){result[decodeURIComponent(key)]=val;}
|
||||
else{let to=key.indexOf(']');let index=decodeURIComponent(key.substring(from+1,to));key=decodeURIComponent(key.substring(0,from));if(!result[key]){result[key]=[];}
|
||||
if(!index){result[key].push(val);}
|
||||
else{result[key][index]=val;}}});return result;};let state={setParam:setParam,getParam:getParam,getParams:getParams,getURL:getURL,add:add,change:change,reload:reload,reset:reset,match:match,getCurrent:getCurrent,setCurrent:setCurrent,getPrevious:getPrevious,setPrevious:setPrevious,params:getJsonFromUrl(window.location.search),hash:window.location.hash};return state;},true,false,false);window.ls.container.set('expression',function(container,filter,$as,$prefix){let reg=/(\{{.*?\}})/gi;let paths=[];return{parse:function(string,def,as,prefix,cast=false){def=def||'';paths=[];return string.replace(reg,function(match)
|
||||
else{result[key][index]=val;}}});return result;};let state={setParam:setParam,getParam:getParam,getParams:getParams,getURL:getURL,add:add,change:change,reload:reload,reset:reset,match:match,getCurrent:getCurrent,setCurrent:setCurrent,getPrevious:getPrevious,setPrevious:setPrevious,params:getJsonFromUrl(window.location.search),hash:window.location.hash};return state;},true,true);window.ls.container.set('expression',function(container,filter,$as,$prefix){let reg=/(\{{.*?\}})/gi;let paths=[];return{parse:function(string,def,as,prefix,cast=false){def=def||'';paths=[];return string.replace(reg,function(match)
|
||||
{let reference=match.substring(2,match.length-2).replace('[\'','.').replace('\']','').trim();reference=reference.split('|');let path=(reference[0]||'');let result=container.path(path,undefined,as,prefix);if(!paths.includes(path)){paths.push(path);}
|
||||
result=(null===result||undefined===result)?def:result;result=(typeof result==='object')?JSON.stringify(result):result;result=(((typeof result==='object')||(typeof result==='string'))&&cast)?'\''+result+'\'':result;if(reference.length>=2){for(let i=1;i<reference.length;i++){result=filter.apply(reference[i],result);}}
|
||||
return result;});},getPaths:function(){return paths;},}},true,false,false);window.ls.container.set('filter',function(container){let filters={};let add=function(name,callback){filters[name]=callback;return this;};let apply=function(name,value){container.set('$value',value,true,false,false);return container.resolve(filters[name]);};add('uppercase',function($value){return $value.toUpperCase();});add('lowercase',function($value){return $value.toLowerCase();});return{add:add,apply:apply}},true,false,false);window.ls.container.get('filter').add('escape',function(value){if(typeof value!=='string'){return value;}
|
||||
return result;});},getPaths:function(){return paths;},}},true,false);window.ls.container.set('filter',function(container){let filters={};let add=function(name,callback){filters[name]=callback;return this;};let apply=function(name,value){container.set('$value',value,true,false,false);return container.resolve(filters[name]);};add('uppercase',function($value){return $value.toUpperCase();});add('lowercase',function($value){return $value.toLowerCase();});return{add:add,apply:apply}},true,false);window.ls.container.get('filter').add('escape',function(value){if(typeof value!=='string'){return value;}
|
||||
return value.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/\"/g,'"').replace(/\'/g,''').replace(/\//g,'/');});window.ls=window.ls||{};window.ls.container.set('window',window,true,false,false).set('document',window.document,true,false,false).set('element',window.document,true,false,false);window.ls.run=function(window){try{this.view.render(window.document);}
|
||||
catch(error){let handler=window.ls.container.resolve(this.error);handler(error);}};window.ls.error=function(){return function(error){console.error('ls-error',error.message,error.stack,error.toString());}};window.ls.router=window.ls.container.get('router');window.ls.view=window.ls.container.get('view');window.ls.filter=window.ls.container.get('filter');window.ls.container.get('view').add({selector:'data-ls-router',repeat:false,controller:function(element,window,document,view,router){let firstFromServer=(element.getAttribute('data-first-from-server')==='true');let scope={selector:'data-ls-scope',template:false,repeat:true,controller:function(){},};let init=function(route){window.scrollTo(0,0);if(window.document.body.scrollTo){window.document.body.scrollTo(0,0);}
|
||||
router.reset();if(null===route){return;}
|
||||
|
@ -93,7 +91,7 @@ catch(error){let handler=window.ls.container.resolve(this.error);handler(error);
|
|||
if(bind){element.addEventListener('input',sync);}}
|
||||
else{if(element.innerText!==value){element.innerHTML=value;}}};let sync=(function(as,prefix){return function(){for(let i=0;i<paths.length;i++){container.path(paths[i],element.value,as,prefix);}}})($as,$prefix);let syntax=element.getAttribute('data-ls-bind');let result=expression.parse(syntax,null,$as,$prefix);let paths=expression.getPaths();echo(result,true);for(let i=0;i<paths.length;i++){container.bind(element,paths[i],function(){echo(expression.parse(syntax,null,$as,$prefix),false);});}}});window.ls.container.get('view').add({selector:'data-ls-if',controller:function(element,expression,container,$as,$prefix){let result='';let syntax=element.getAttribute('data-ls-if')||'';let debug=element.getAttribute('data-debug')||false;let paths=[];let check=function(){if(debug){console.info('debug-ls-if',expression.parse(syntax,'undefined',$as,$prefix));}
|
||||
try{result=!!(eval(expression.parse(syntax,'undefined',$as,$prefix,true).replace(/(\r\n|\n|\r)/gm,' ')));}
|
||||
catch(error){throw new Error('Failed to evaluate expression "'+syntax+' ('+result+')": '+error);}
|
||||
catch(error){throw new Error('Failed to evaluate expression "'+syntax+' (resulted with: "'+result+'")": '+error);}
|
||||
if(debug){console.info('debug-ls-if result:',result);}
|
||||
paths=expression.getPaths();element.$lsSkip=!result;if(!result){element.style.visibility='hidden';element.style.display='none';}
|
||||
else{element.style.removeProperty('display');element.style.removeProperty('visibility');}};check();for(let i=0;i<paths.length;i++){container.bind(element,paths[i],check);}}});window.ls.container.get('view').add({selector:'data-ls-loop',template:false,repeat:false,nested:false,controller:function(element,view,container,window){let expr=element.getAttribute('data-ls-loop');let as=element.getAttribute('data-ls-as');let echo=function(){let array=container.path(expr);array=(!array)?[]:array;while(element.hasChildNodes()){element.removeChild(element.lastChild);element.lastChild=null;}
|
||||
|
|
|
@ -1,5 +1,26 @@
|
|||
|
||||
window.ls.filter
|
||||
.add('gravatar', function ($value) {
|
||||
$value = JSON.parse($value || '{}');
|
||||
|
||||
// MD5 (Message-Digest Algorithm) by WebToolkit
|
||||
let MD5 = function(s){function L(k,d){return(k<<d)|(k>>>(32-d))}function K(G,k){let I,d,F,H,x;F=(G&2147483648);H=(k&2147483648);I=(G&1073741824);d=(k&1073741824);x=(G&1073741823)+(k&1073741823);if(I&d){return(x^2147483648^F^H)}if(I|d){if(x&1073741824){return(x^3221225472^F^H)}else{return(x^1073741824^F^H)}}else{return(x^F^H)}}function r(d,F,k){return(d&F)|((~d)&k)}function q(d,F,k){return(d&k)|(F&(~k))}function p(d,F,k){return(d^F^k)}function n(d,F,k){return(F^(d|(~k)))}function u(G,F,aa,Z,k,H,I){G=K(G,K(K(r(F,aa,Z),k),I));return K(L(G,H),F)}function f(G,F,aa,Z,k,H,I){G=K(G,K(K(q(F,aa,Z),k),I));return K(L(G,H),F)}function D(G,F,aa,Z,k,H,I){G=K(G,K(K(p(F,aa,Z),k),I));return K(L(G,H),F)}function t(G,F,aa,Z,k,H,I){G=K(G,K(K(n(F,aa,Z),k),I));return K(L(G,H),F)}function e(G){let Z;let F=G.length;let x=F+8;let k=(x-(x%64))/64;let I=(k+1)*16;let aa=Array(I-1);let d=0;let H=0;while(H<F){Z=(H-(H%4))/4;d=(H%4)*8;aa[Z]=(aa[Z]|(G.charCodeAt(H)<<d));H++}Z=(H-(H%4))/4;d=(H%4)*8;aa[Z]=aa[Z]|(128<<d);aa[I-2]=F<<3;aa[I-1]=F>>>29;return aa}function B(x){let k="",F="",G,d;for(d=0;d<=3;d++){G=(x>>>(d*8))&255;F="0"+G.toString(16);k=k+F.substr(F.length-2,2)}return k}function J(k){k=k.replace(/rn/g,"n");let d="";for(let F=0;F<k.length;F++){let x=k.charCodeAt(F);if(x<128){d+=String.fromCharCode(x)}else{if((x>127)&&(x<2048)){d+=String.fromCharCode((x>>6)|192);d+=String.fromCharCode((x&63)|128)}else{d+=String.fromCharCode((x>>12)|224);d+=String.fromCharCode(((x>>6)&63)|128);d+=String.fromCharCode((x&63)|128)}}}return d}let C=Array();let P,h,E,v,g,Y,X,W,V;let S=7,Q=12,N=17,M=22;let A=5,z=9,y=14,w=20;let o=4,m=11,l=16,j=23;let U=6,T=10,R=15,O=21;s=J(s);C=e(s);Y=1732584193;X=4023233417;W=2562383102;V=271733878;for(P=0;P<C.length;P+=16){h=Y;E=X;v=W;g=V;Y=u(Y,X,W,V,C[P+0],S,3614090360);V=u(V,Y,X,W,C[P+1],Q,3905402710);W=u(W,V,Y,X,C[P+2],N,606105819);X=u(X,W,V,Y,C[P+3],M,3250441966);Y=u(Y,X,W,V,C[P+4],S,4118548399);V=u(V,Y,X,W,C[P+5],Q,1200080426);W=u(W,V,Y,X,C[P+6],N,2821735955);X=u(X,W,V,Y,C[P+7],M,4249261313);Y=u(Y,X,W,V,C[P+8],S,1770035416);V=u(V,Y,X,W,C[P+9],Q,2336552879);W=u(W,V,Y,X,C[P+10],N,4294925233);X=u(X,W,V,Y,C[P+11],M,2304563134);Y=u(Y,X,W,V,C[P+12],S,1804603682);V=u(V,Y,X,W,C[P+13],Q,4254626195);W=u(W,V,Y,X,C[P+14],N,2792965006);X=u(X,W,V,Y,C[P+15],M,1236535329);Y=f(Y,X,W,V,C[P+1],A,4129170786);V=f(V,Y,X,W,C[P+6],z,3225465664);W=f(W,V,Y,X,C[P+11],y,643717713);X=f(X,W,V,Y,C[P+0],w,3921069994);Y=f(Y,X,W,V,C[P+5],A,3593408605);V=f(V,Y,X,W,C[P+10],z,38016083);W=f(W,V,Y,X,C[P+15],y,3634488961);X=f(X,W,V,Y,C[P+4],w,3889429448);Y=f(Y,X,W,V,C[P+9],A,568446438);V=f(V,Y,X,W,C[P+14],z,3275163606);W=f(W,V,Y,X,C[P+3],y,4107603335);X=f(X,W,V,Y,C[P+8],w,1163531501);Y=f(Y,X,W,V,C[P+13],A,2850285829);V=f(V,Y,X,W,C[P+2],z,4243563512);W=f(W,V,Y,X,C[P+7],y,1735328473);X=f(X,W,V,Y,C[P+12],w,2368359562);Y=D(Y,X,W,V,C[P+5],o,4294588738);V=D(V,Y,X,W,C[P+8],m,2272392833);W=D(W,V,Y,X,C[P+11],l,1839030562);X=D(X,W,V,Y,C[P+14],j,4259657740);Y=D(Y,X,W,V,C[P+1],o,2763975236);V=D(V,Y,X,W,C[P+4],m,1272893353);W=D(W,V,Y,X,C[P+7],l,4139469664);X=D(X,W,V,Y,C[P+10],j,3200236656);Y=D(Y,X,W,V,C[P+13],o,681279174);V=D(V,Y,X,W,C[P+0],m,3936430074);W=D(W,V,Y,X,C[P+3],l,3572445317);X=D(X,W,V,Y,C[P+6],j,76029189);Y=D(Y,X,W,V,C[P+9],o,3654602809);V=D(V,Y,X,W,C[P+12],m,3873151461);W=D(W,V,Y,X,C[P+15],l,530742520);X=D(X,W,V,Y,C[P+2],j,3299628645);Y=t(Y,X,W,V,C[P+0],U,4096336452);V=t(V,Y,X,W,C[P+7],T,1126891415);W=t(W,V,Y,X,C[P+14],R,2878612391);X=t(X,W,V,Y,C[P+5],O,4237533241);Y=t(Y,X,W,V,C[P+12],U,1700485571);V=t(V,Y,X,W,C[P+3],T,2399980690);W=t(W,V,Y,X,C[P+10],R,4293915773);X=t(X,W,V,Y,C[P+1],O,2240044497);Y=t(Y,X,W,V,C[P+8],U,1873313359);V=t(V,Y,X,W,C[P+15],T,4264355552);W=t(W,V,Y,X,C[P+6],R,2734768916);X=t(X,W,V,Y,C[P+13],O,1309151649);Y=t(Y,X,W,V,C[P+4],U,4149444226);V=t(V,Y,X,W,C[P+11],T,3174756917);W=t(W,V,Y,X,C[P+2],R,718787259);X=t(X,W,V,Y,C[P+9],O,3951481745);Y=K(Y,h);X=K(X,E);W=K(W,v);V=K(V,g)}let i=B(Y)+B(X)+B(W)+B(V);return i.toLowerCase()};
|
||||
let size = 80;
|
||||
let email = $value.email || '';
|
||||
let name = $value.name || '';
|
||||
|
||||
name = name.split(' ').map(function (n) {
|
||||
if(!isNaN(parseFloat(n)) && isFinite(n)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return n[0];
|
||||
}).join('') || '--';
|
||||
|
||||
let def = 'https://ui-avatars.com/api/' + encodeURIComponent(name) + '/' + size + '';
|
||||
|
||||
return '//www.gravatar.com/avatar/' + MD5(email) + '.jpg?s=' + size + '&d=' + encodeURIComponent(def);
|
||||
})
|
||||
.add('lowerCase', function ($value) {
|
||||
return $value.toLowerCase();
|
||||
})
|
||||
|
|
|
@ -4,15 +4,11 @@
|
|||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-service',
|
||||
repeat: true,
|
||||
repeat: false,
|
||||
controller: function(element, view, container, form, alerts, expression, window) {
|
||||
let action = element.dataset['service'];
|
||||
let singleton = element.dataset['singleton'];
|
||||
let loaded = element.dataset['loaded'];
|
||||
let service = element.dataset['name'] || action;
|
||||
let event = element.dataset['event']; // load, click, change, submit
|
||||
let success = element.dataset['success'] || ''; // render, alert, redirect
|
||||
let error = element.dataset['error'] || ''; // alert, redirect, page
|
||||
let confirm = element.dataset['confirm'] || ''; // Free text
|
||||
let loading = element.dataset['loading'] || ''; // Free text
|
||||
let loaderId = null;
|
||||
|
@ -21,13 +17,6 @@
|
|||
|
||||
if (debug) console.log('%c[service init]: ' + action + ' (' + service + ')', 'color:red');
|
||||
|
||||
if(loaded) {
|
||||
return true; // Instance already created
|
||||
}
|
||||
|
||||
success = success.trim().split(',');
|
||||
error = error.trim().split(',');
|
||||
|
||||
let resolve = function(target) {
|
||||
let FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
|
||||
let text = target.toString();
|
||||
|
@ -67,229 +56,6 @@
|
|||
}));
|
||||
};
|
||||
|
||||
let successes = {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
none: function () {
|
||||
|
||||
},
|
||||
|
||||
'save': function () {
|
||||
return function(data) {
|
||||
container.set(service.replace('.', '-'), JSON.parse(data), true, true);
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @param view
|
||||
* @returns {Function}
|
||||
*/
|
||||
'render': function (view) {
|
||||
return function(data) {
|
||||
try {
|
||||
container.set(service.replace('.', '-'), JSON.parse(data), true, true);
|
||||
} catch (e) {
|
||||
container.set(service.replace('.', '-'), {}, true, true);
|
||||
}
|
||||
|
||||
view.render(element);
|
||||
|
||||
let rerender = element.dataset['successRerender'] || '';
|
||||
|
||||
element.setAttribute('data-success-rerender', '');
|
||||
|
||||
rerender = rerender.trim().split(',');
|
||||
|
||||
for (let i = 0; i < rerender.length; i++) {
|
||||
if('' === rerender[i]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
document.addEventListener(rerender[i], function (event) {
|
||||
console.log(event.type + ' triggered rendering');
|
||||
|
||||
if(element && element.parentNode) {
|
||||
console.log(event.type + ' triggered rendering 2');
|
||||
view.render(element.parentNode);
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
'reset': function () {
|
||||
return function() {
|
||||
if('FORM' === element.tagName) {
|
||||
return element.reset();
|
||||
}
|
||||
|
||||
throw new Error('This callback is only valid for forms');
|
||||
}
|
||||
},
|
||||
|
||||
'empty': function () {
|
||||
return function() {
|
||||
container.set(service.replace('.', '-'), {}, true);
|
||||
view.render(element);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @param alerts
|
||||
* @returns {Function}
|
||||
*/
|
||||
'alert': function (alerts) {
|
||||
return function() {
|
||||
let alert = element.dataset['successAlert'] || 'Success';
|
||||
alerts.send({text: alert, class: 'success'}, 3000);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @returns {Function}
|
||||
*/
|
||||
'update': function () {
|
||||
return function(data) {
|
||||
let service = element.dataset['successUpdate'] || null;
|
||||
|
||||
if(service) {
|
||||
container.set(service, JSON.parse(data), true);
|
||||
}
|
||||
|
||||
//let idElement = element.elements.id;
|
||||
//if(idElement) {
|
||||
// idElement = (idElement.length > 1) ? idElement[0] : idElement;
|
||||
// idElement.value = JSON.parse(data).id;
|
||||
//}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @param state
|
||||
* @returns {Function}
|
||||
*/
|
||||
'redirect': function (state) {
|
||||
return function() {
|
||||
let url = expression.parse(element.dataset['successRedirectUrl']) || '/';
|
||||
|
||||
state.change(url);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @param document
|
||||
* @returns {Function}
|
||||
*/
|
||||
'trigger': function (document) {
|
||||
return function() {
|
||||
let triggers = element.dataset['successTriggers'] || '';
|
||||
|
||||
triggers = triggers.trim().split(',');
|
||||
|
||||
for (let i = 0; i < triggers.length; i++) {
|
||||
if('' === triggers[i]) {
|
||||
continue;
|
||||
}
|
||||
if (debug) console.log('%c[event triggered]: ' + triggers[i], 'color:green');
|
||||
|
||||
document.dispatchEvent(new CustomEvent(triggers[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let errors = {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
none: function () {
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @param alerts
|
||||
* @returns {Function}
|
||||
*/
|
||||
'alert': function (alerts) {
|
||||
return function() {
|
||||
let alert = element.dataset['errorAlert'] || 'Failure (' + action + ')';
|
||||
alerts.send({text: alert, class: 'error'}, 3000);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @param state
|
||||
* @returns {Function}
|
||||
*/
|
||||
'redirect': function (state) {
|
||||
return function() {
|
||||
let url = expression.parse(element.dataset['errorRedirectUrl']) || '/';
|
||||
|
||||
state.change(url);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @param view
|
||||
* @returns {Function}
|
||||
*/
|
||||
'render': function (view) {
|
||||
return function() {
|
||||
container.set(service.replace('.', '-'), {}, true, true);
|
||||
|
||||
view.render(element);
|
||||
|
||||
let rerender = element.getAttribute('data-error-rerender') || '';
|
||||
|
||||
element.setAttribute('data-error-rerender', '');
|
||||
|
||||
rerender = rerender.trim().split(',');
|
||||
|
||||
for (let i = 0; i < rerender.length; i++) {
|
||||
if('' === rerender[i]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
document.addEventListener(rerender[i], function () {
|
||||
if(element && element.parentNode) {
|
||||
view.render(element.parentNode);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
*
|
||||
* @param document
|
||||
* @returns {Function}
|
||||
*/
|
||||
'trigger': function (document) {
|
||||
return function() {
|
||||
let triggers = element.dataset['errorTriggers'] || '';
|
||||
|
||||
triggers = triggers.trim().split(',');
|
||||
|
||||
for (let i = 0; i < triggers.length; i++) {
|
||||
if('' === triggers[i]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
document.dispatchEvent(new CustomEvent(triggers[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let exec = function(event) {
|
||||
if (debug) console.log('%c[executed]: ' + scope + '.' + action, 'color:yellow', event, element, document.body.contains(element));
|
||||
|
||||
|
@ -312,13 +78,6 @@
|
|||
loaderId = alerts.send({text: loading, class: ''}, 0);
|
||||
}
|
||||
|
||||
if(element.$lsLock) {
|
||||
// console.warn('Execution of ' + scope + '.' + action + ' is locked, wait for previous execution to finish', element);
|
||||
return;
|
||||
}
|
||||
|
||||
element.$lsLock = true;
|
||||
|
||||
let method = container.path(scope + '.' + action);
|
||||
|
||||
if(!method) {
|
||||
|
@ -341,11 +100,13 @@
|
|||
return;
|
||||
}
|
||||
|
||||
for (let i = 0; i < success.length; i++) { // Trigger success callbacks
|
||||
container.resolve(successes[success[i]])(data);
|
||||
try {
|
||||
container.set(service.replace('.', '-'), JSON.parse(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);
|
||||
}
|
||||
|
||||
element.$lsLock = false; // Release lock
|
||||
}, function (exception) {
|
||||
if(loaderId !== null) { // Remove loader if needed
|
||||
alerts.remove(loaderId);
|
||||
|
@ -354,12 +115,6 @@
|
|||
if(!element) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (let i = 0; i < error.length; i++) { // Trigger failure callbacks
|
||||
container.resolve(errors[error[i]])(exception);
|
||||
}
|
||||
|
||||
element.$lsLock = false; // Release lock
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -371,11 +126,6 @@
|
|||
}
|
||||
|
||||
switch (events[y].trim()) {
|
||||
case 'empty':
|
||||
for (let i = 0; i < success.length; i++) {
|
||||
container.resolve(successes[success[i]])('{}');
|
||||
}
|
||||
break;
|
||||
case 'load':
|
||||
exec();
|
||||
break;
|
||||
|
@ -389,18 +139,12 @@
|
|||
case 'input':
|
||||
case 'submit':
|
||||
element.addEventListener(events[y], exec);
|
||||
element.setAttribute('data-event', 'none'); // Avoid re-attaching event
|
||||
break;
|
||||
default:
|
||||
element.setAttribute('data-event', 'none'); // Avoid re-attaching event
|
||||
}
|
||||
|
||||
if (debug) console.log('%cregistered: "' + events[y].trim() + '" (' + service + ')', 'color:blue');
|
||||
}
|
||||
|
||||
if(singleton) {
|
||||
element.dataset.loaded = 'true';
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
|
Loading…
Reference in a new issue