1
0
Fork 0
mirror of synced 2024-05-25 23:19:51 +12:00

Updated ls-if version

This commit is contained in:
eldadfux 2019-05-11 18:26:03 +03:00
parent 9f96d93acc
commit a430d9a25e
12 changed files with 41 additions and 41 deletions

View file

@ -178,7 +178,7 @@ use Utopia\Locale\Locale;
<ul data-ls-loop="sessions" data-ls-as="session" class="list">
<li class="clear">
<span data-ls-if="true != '{{session.current}}'" style="display: none;"> <!-- From remote session (-logout event) -->
<span data-ls-if="true != {{session.current}}" style="display: none;"> <!-- From remote session (-logout event) -->
<form class="pull-end"
data-appwrite="auth.logoutById"
data-scope="console"
@ -193,7 +193,7 @@ use Utopia\Locale\Locale;
</form>
</span>
<span data-ls-if="true == '{{session.current}}'" style="display: none;"> <!-- From current session (+logout event) -->
<span data-ls-if="true == {{session.current}}" style="display: none;"> <!-- From current session (+logout event) -->
<form class="pull-end"
data-appwrite="auth.logoutById"
data-scope="console"

View file

@ -106,7 +106,7 @@ use Utopia\Locale\Locale;
data-singleton="true">
</div>
<div data-ls-if="({{router.params.project}} != undefined)" data-debug="1">
<div data-ls-if="({{router.params.project}} != undefined)">
<div data-appwrite="projects.get"
data-event="load"
data-service="console-project"

View file

@ -78,7 +78,7 @@
<div class="zone xl margin-top-xl clear">
<h2 class="margin-bottom">Platforms</h2>
<div class="box margin-bottom" data-ls-if="0 != {{console-project.platforms.length}} && 'undefined' != '{{console-project.platforms}}'" style="display: none;">
<div class="box margin-bottom" data-ls-if="0 != {{console-project.platforms.length}} && undefined !== {{console-project.platforms}}" style="display: none;">
<ul data-ls-loop="console-project.platforms" data-ls-as="platform" class="list">
<li class="clear">
@ -117,7 +117,7 @@
</ul>
</div>
<div data-ls-if="'0' === '{{console-project.platforms.length}}' || 'undefined' === '{{console-project.platforms}}'" class="box dashboard margin-bottom" style="display: none;">
<div data-ls-if="0 === {{console-project.platforms.length}} || undefined === {{console-project.platforms}}" class="box dashboard margin-bottom" style="display: none;">
<div class="margin-bottom margin-top-small margin-end margin-start">
<h3 class="margin-bottom">No Platforms Added to Your Project</h3>

View file

@ -8,7 +8,7 @@
<ul class="margin-bottom-xl clear">
<li class="pull-start margin-end"><a href="/features"><i class="icon-lamp"></i> &nbsp;Learn More</a></li>
<li class="pull-start margin-end"><a href="/docs"><i class="icon-book-open"></i> &nbsp;Docs</a></li>
<li class="pull-start margin-end"><a href="/docs"><i class="icon-book-open"></i> &nbsp;Documentation</a></li>
<li class="pull-start margin-end"><a href="/support"><i class="icon-lifebuoy"></i> &nbsp;Support</a></li>
</ul>
</div>

View file

@ -529,7 +529,7 @@ $scopes = [ // TODO sync with project list
data-error="render"
data-error-rerender="">
<div data-ls-if="0 === {{console-tasks.length}} || 'undefined' === '{{console-tasks.length}}'" class="box margin-top margin-bottom" style="display: none;">
<div data-ls-if="0 === {{console-tasks.length}} || undefined === {{console-tasks.length}}" class="box margin-top margin-bottom" style="display: none;">
<h3>No Tasks Found</h3>
<p class="margin-bottom-no">You haven't created any task to your project yet.</p>
@ -563,10 +563,10 @@ $scopes = [ // TODO sync with project list
<a data-ls-attrs="href={{task.httpUrl}}" data-ls-bind="{{task.httpUrl}}" target="_blank" class="text-one-liner"></a>
</td>
<td style="vertical-align: middle">
<span data-ls-if="'play' === '{{task.status}}'" style="display: none;">
<span data-ls-if="'play' === {{task.status}}" style="display: none;">
<span class="tag green"><i class="icon-play"></i> Running &nbsp;</span>
</span>
<span data-ls-if="'play' !== '{{task.status}}'" style="display: none;">
<span data-ls-if="'play' !== {{task.status}}" style="display: none;">
<span class="tag red"><i class="icon-pause"></i> Paused &nbsp;</span>
</span>
</td>
@ -574,14 +574,14 @@ $scopes = [ // TODO sync with project list
<span data-ls-bind="{{task.next|date-time}}" class="note"></span>
</td>
<td style="vertical-align: middle">
<div data-ls-if="'undefined' !== '{{task.previous}}'" class="note">
<div data-ls-if="'undefined' !== {{task.previous}}" class="note">
<span data-ls-bind="{{task.previous|date-time}}"></span>
<div data-ls-if="'undefined' !== '{{task.delay}}' && 59 < {{task.delay}}" class="note text-danger margin-top-tiny">
<div data-ls-if="'undefined' !== {{task.delay}} && 59 < {{task.delay}}" class="note text-danger margin-top-tiny">
<span data-ls-bind="({{task.delay|ms2hum}} Delay)"></span>
</div>
</div>
<div data-ls-if="'undefined' === '{{task.previous}}'" class="note">
<div data-ls-if="'undefined' === {{task.previous}}" class="note">
None.
</div>
</td>
@ -847,7 +847,7 @@ $scopes = [ // TODO sync with project list
<button class="danger"><?php echo Locale::getText('console.settings.section.members.labels.leave'); ?></button>
</form>
<div data-ls-if="'false' == '{{member.confirm}}'" class="pull-end margin-end" style="display: none;">
<div data-ls-if="false === {{member.confirm}}" class="pull-end margin-end" style="display: none;">
<form
data-appwrite="auth.inviteResend"
data-scope="console"
@ -866,7 +866,7 @@ $scopes = [ // TODO sync with project list
<img src="" data-ui-gravatar="{{member.email}}" data-name="{{member.name}}" data-size="100" alt="User Avatar" class="avatar pull-start margin-end" />
<div class="margin-bottom-small">
<span data-ls-bind="{{member.name}}"></span> &nbsp;&nbsp;<span class="tag" data-ls-bind="{{member.roles.0|id2role}}"></span> &nbsp;&nbsp;<span data-ls-if="'false' == '{{member.confirm}}'" class="tag red" style="display: none;"><?php echo Locale::getText('console.settings.section.members.labels.pending'); ?></span>
<span data-ls-bind="{{member.name}}"></span> &nbsp;&nbsp;<span class="tag" data-ls-bind="{{member.roles.0|id2role}}"></span> &nbsp;&nbsp;<span data-ls-if="false === {{member.confirm}}" class="tag red" style="display: none;"><?php echo Locale::getText('console.settings.section.members.labels.pending'); ?></span>
</div>
<span class="note" data-ls-bind="{{member.email}}"></span>
</li>

View file

@ -102,15 +102,15 @@ $providers = $this->getParam('providers', []);
<span data-ls-bind="{{user.email}}" class="note"></span>
</td>
<td data-title="Status: ">
<span data-ls-if="'{{user.confirm}}' === 'true'">
<span data-ls-if="{{user.confirm}} === true">
&nbsp;<span class="tag green">Verified</span>
</span>
<span data-ls-if="'{{user.confirm}}' !== 'true'">
<span data-ls-if="{{user.confirm}} !== true">
&nbsp;<span class="tag">Unverified</span>
</span>
<span data-ls-if="'{{user.status}}' === '<?php echo \Auth\Auth::USER_STATUS_BLOCKED; ?>'">
<span data-ls-if="{{user.status}} === <?php echo \Auth\Auth::USER_STATUS_BLOCKED; ?>">
&nbsp;<span class="tag red">Blocked</span>
</span>
</td>
@ -315,7 +315,7 @@ $providers = $this->getParam('providers', []);
<span>
<?php echo ucfirst($provider); ?>
<span data-ls-if="'{{console-project.usersOauth<?php echo ucfirst($provider); ?>Appid}}' == '' || '{{console-project.usersOauth<?php echo ucfirst($provider); ?>Secret}}' == '' || '{{console-project.usersOauth<?php echo ucfirst($provider); ?>Appid}}' == 'undefined' || '{{console-project.usersOauth<?php echo ucfirst($provider); ?>Secret}}' == 'undefined'">
<span data-ls-if="{{console-project.usersOauth<?php echo ucfirst($provider); ?>Appid}} === '' || {{console-project.usersOauth<?php echo ucfirst($provider); ?>Secret}} == '' || {{console-project.usersOauth<?php echo ucfirst($provider); ?>Appid}} === undefined || {{console-project.usersOauth<?php echo ucfirst($provider); ?>Secret}} === undefined">
&nbsp;<span class="tag red">Disabled</span>
</span>
</span>

View file

@ -26,7 +26,7 @@ use Utopia\Locale\Locale;
<li data-state="/console/users/view?id={{router.params.id}}&project={{router.params.project}}">
<h2>General</h2>
<div data-ls-if="'{{user.status}}' === '<?php echo \Auth\Auth::USER_STATUS_BLOCKED; ?>'" style="display: none" class="box padding-small danger margin-bottom-xxl">
<div data-ls-if="{{user.status}} === <?php echo \Auth\Auth::USER_STATUS_BLOCKED; ?>" style="display: none" class="box padding-small danger margin-bottom-xxl">
This user account is blocked.
</div>
@ -38,10 +38,10 @@ use Utopia\Locale\Locale;
<div class="margin-top-small note" data-ls-bind="Member since {{user.registration|date-text}}"></div>
<div class="margin-top-small">
<span data-ls-if="'{{user.confirm}}' === 'true'" style="display: none;">
<span data-ls-if="{{user.confirm}} === true" style="display: none;">
<span class="tag green">Verified</span>
</span>
<span data-ls-if="'{{user.confirm}}' !== 'true'" style="display: none;">
<span data-ls-if="{{user.confirm}} !== true" style="display: none;">
<span class="tag">Unverified</span>
</span>
</div>
@ -94,7 +94,7 @@ use Utopia\Locale\Locale;
<input id="uid" type="text" autocomplete="off" placeholder="" data-ls-bind="{{user.$uid}}" disabled data-forms-copy>
</div>
<div data-ls-if="'{{user.status}}' !== '<?php echo \Auth\Auth::USER_STATUS_BLOCKED; ?>'" style="display: none">
<div data-ls-if="{{user.status}} !== <?php echo \Auth\Auth::USER_STATUS_BLOCKED; ?>" style="display: none">
<form name="users.updateStatus" class="margin-bottom"
data-appwrite="users.updateStatus"
data-event="submit"
@ -108,7 +108,7 @@ use Utopia\Locale\Locale;
</form>
</div>
<div data-ls-if="'{{user.status}}' === '<?php echo \Auth\Auth::USER_STATUS_BLOCKED; ?>'" style="display: none">
<div data-ls-if="{{user.status}} === <?php echo \Auth\Auth::USER_STATUS_BLOCKED; ?>" style="display: none">
<form name="users.updateStatus" class="margin-bottom"
data-appwrite="users.updateStatus"
data-event="submit"
@ -136,11 +136,11 @@ use Utopia\Locale\Locale;
data-error="render"
data-success-rerender="user.update">
<div data-ls-if="'{{sessions.length}}' === '0'" style="display: none" class="margin-top-xl margin-bottom-xl">
<div data-ls-if="{{sessions.length}} === 0" style="display: none" class="margin-top-xl margin-bottom-xl">
No sessions available
</div>
<div data-ls-if="'{{sessions.length}}' !== '0'" style="display: none">
<div data-ls-if="{{sessions.length}} !== 0" style="display: none">
<div class="box margin-bottom">
<ul data-ls-loop="sessions" data-ls-as="session" class="list">
<li class="clear">
@ -194,11 +194,11 @@ use Utopia\Locale\Locale;
data-success-rerender="logs.load"
data-error="">
<div data-ls-if="'{{logs.length}}' === '0'" style="display: none" class="margin-top-xl margin-bottom-xl">
<div data-ls-if="{{logs.length}} === 0" style="display: none" class="margin-top-xl margin-bottom-xl">
No logs available
</div>
<div class="box" data-ls-if="'{{logs.length}}' !== '0'" style="display: none">
<div class="box" data-ls-if="{{logs.length}} !== 0" style="display: none">
<table class="vertical small">
<thead>
<tr>

View file

@ -35,7 +35,7 @@ use Utopia\Locale\Locale;
<p class="note"><?php echo sprintf($this->escape(Locale::getText('home.auth.join.subtitle')), '<span data-ls-echo="{{api-company.name}}"></span>'); ?></p>
<div data-ls-if="'{{api-company.logo}}' !== '' || '{{api-company.logo}}' !== 'undefined'">
<div data-ls-if="{{api-company.logo}} !== '' || {{api-company.logo}} !== undefined">
<div data-ls-style="background: {{api-company.theme-color}}; color: {{api-company.theme-color-contrast}}; width: 100px; height: 100px; line-height: 100px; border-radius: 50%; margin: 0 auto; text-align: center">
<img data-ls-attrs="src={{env.API}}/v1/storage/files/{{api-company.logo}}/preview?project={{env.PROJECT}}&height=120" alt="Logo" style="opacity: 0; line-height: 80px; vertical-align: middle; max-width: 80px; max-height: 80px" />
</div>

View file

@ -90,7 +90,7 @@ $env = $this->getParam('env', '');
<i class="icon-cancel" data-ls-ui-alerts-delete data-message="{{alert.id}}"></i>
<span data-ls-bind="{{alert.text}}"></span>
<span data-ls-if="'undefined' !== '{{alert.link}}'" style="display: none;">
<span data-ls-if="'undefined' !== {{alert.link}}" style="display: none;">
<a data-ls-attrs="href={{alert.link}}" data-ls-ui-alerts-delete data-message="{{alert.id}}"><?php echo Locale::getText('general.alerts.learn'); ?></a>
</span>
</div>

View file

@ -2076,9 +2076,9 @@ let result={};query.split('&').forEach(function(part){if(!part){return;}
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){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,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)
{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;if(reference.length>=2){for(let i=1;i<reference.length;i++){result=filter.apply(reference[i],result);}}
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 value.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;').replace(/\'/g,'&#39;').replace(/\//g,'&#x2F;');});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);}
@ -2106,8 +2106,8 @@ return;}
if(element.value!==value){element.value=value;}
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).replace(/(\r\n|\n|\r)/gm,' ')));}
catch(error){throw new Error('Failed to evaluate expression "'+syntax+'": '+error);}
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);}
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;}

View file

@ -62,9 +62,9 @@ let result={};query.split('&').forEach(function(part){if(!part){return;}
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){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,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)
{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;if(reference.length>=2){for(let i=1;i<reference.length;i++){result=filter.apply(reference[i],result);}}
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 value.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;').replace(/\'/g,'&#39;').replace(/\//g,'&#x2F;');});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);}
@ -92,8 +92,8 @@ return;}
if(element.value!==value){element.value=value;}
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).replace(/(\r\n|\n|\r)/gm,' ')));}
catch(error){throw new Error('Failed to evaluate expression "'+syntax+'": '+error);}
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);}
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;}

View file

@ -62,9 +62,9 @@ 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){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,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)
{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;if(reference.length>=2){for(let i=1;i<reference.length;i++){result=filter.apply(reference[i],result);}}
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 value.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;').replace(/\'/g,'&#39;').replace(/\//g,'&#x2F;');});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);}
@ -92,8 +92,8 @@ catch(error){let handler=window.ls.container.resolve(this.error);handler(error);
if(element.value!==value){element.value=value;}
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).replace(/(\r\n|\n|\r)/gm,' ')));}
catch(error){throw new Error('Failed to evaluate expression "'+syntax+'": '+error);}
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);}
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;}