Removed some legacy code
This commit is contained in:
parent
0edf9b3d4c
commit
216589fed5
|
@ -19,6 +19,10 @@
|
|||
<div class="zone xl">
|
||||
<ul class="phases clear" data-ui-phases data-selected="{{router.params.tab}}">
|
||||
<li data-state="/console/database/collection?id={{router.params.id}}&project={{router.params.project}}">
|
||||
<a data-ls-attrs="href=/console/database/document?collection={{router.params.id}}&project={{router.params.project}}" class="button fly round text-align-center">
|
||||
<i class="icon-plus"></i>
|
||||
</a>
|
||||
|
||||
<h2>Documents</h2>
|
||||
|
||||
<form class="box padding-small margin-bottom search"
|
||||
|
@ -50,7 +54,7 @@
|
|||
data-param-search="{{router.params.search}}"
|
||||
data-param-limit="<?php echo APP_PAGING_LIMIT; ?>"
|
||||
data-param-offset="{{router.params.offset}}"
|
||||
data-param-order-type="ASC"
|
||||
data-param-order-type="DESC"
|
||||
data-scope="sdk"
|
||||
data-name="project-documents">
|
||||
|
||||
|
@ -140,7 +144,7 @@
|
|||
<label for="collection-name">Name</label>
|
||||
<input name="name" id="collection-name" type="text" autocomplete="off" data-ls-bind="{{project-collection.name}}" data-forms-text-direction required placeholder="Collection Name" />
|
||||
|
||||
<h3 class="margin-bottom-small">Attributes & Rules</h3>
|
||||
<h3 class="margin-bottom-small">Rules</h3>
|
||||
|
||||
<div data-ls-if="(!{{project-collection.rules.length}})">
|
||||
<hr class="margin-bottom-no margin-top-no" />
|
||||
|
@ -224,6 +228,11 @@
|
|||
</optgroup>
|
||||
</select>
|
||||
|
||||
<div class="margin-bottom">
|
||||
<label data-ls-attrs="for=rule-default-{{rule.$id}}">Default</label>
|
||||
<input name="default" type="text" data-ls-bind="{{rule.default}}" />
|
||||
</div>
|
||||
|
||||
<div class="margin-bottom">
|
||||
<input name="required" type="hidden" data-forms-switch data-ls-bind="{{rule.required}}" data-cast-to="boolean" /> Required <span class="tooltip" data-tooltip="Mark whether this is a required attribute"><i class="icon-info-circled"></i></span>
|
||||
</div>
|
||||
|
@ -346,6 +355,12 @@
|
|||
</optgroup>
|
||||
</select>
|
||||
|
||||
<div class="margin-bottom">
|
||||
<label data-ls-attrs="for=rule-default-new">Default</label>
|
||||
<input name="default" type="text" />
|
||||
</div>
|
||||
|
||||
|
||||
<div class="margin-bottom">
|
||||
<input name="required" type="hidden" data-forms-switch data-cast-to="boolean" /> Required <span class="tooltip" data-tooltip="Mark whether this is a required attribute"><i class="icon-info-circled"></i></span>
|
||||
</div>
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
data-analytics-event="submit"
|
||||
data-analytics-category="console"
|
||||
data-analytics-label="Update Database Document"
|
||||
data-service="database.updateDocument"
|
||||
data-service="{{|documentAction}}"
|
||||
data-scope="sdk"
|
||||
data-event="submit"
|
||||
data-success="alert,trigger"
|
||||
|
@ -51,7 +51,7 @@
|
|||
<div class="box">
|
||||
|
||||
<input name="documentId" type="hidden" data-ls-bind="{{project-document.$id}}" />
|
||||
<input name="collectionId" type="hidden" data-ls-bind="{{project-document.$collection}}" />
|
||||
<input name="collectionId" type="hidden" data-ls-bind="{{project-collection.$id}}" />
|
||||
|
||||
<fieldset name="data" data-cast-to="object">
|
||||
<ul data-ls-loop="project-collection.rules" data-ls-as="rule">
|
||||
|
@ -82,8 +82,8 @@
|
|||
</li>
|
||||
</ul>
|
||||
</fieldset>
|
||||
|
||||
<div class="toggle margin-bottom margin-top" data-ls-ui-open>
|
||||
|
||||
<div class="toggle margin-bottom" data-ls-ui-open>
|
||||
<i class="icon-plus pull-end margin-top-tiny"></i>
|
||||
<i class="icon-minus pull-end margin-top-tiny"></i>
|
||||
|
||||
|
@ -115,24 +115,27 @@
|
|||
<input type="text" autocomplete="off" placeholder="" data-ls-bind="{{project-collection.$id}}" disabled data-forms-copy class="margin-bottom-no" />
|
||||
</div>
|
||||
|
||||
<form name="database.deleteDocument" class="margin-bottom"
|
||||
data-analytics-event="submit"
|
||||
data-analytics-category="console"
|
||||
data-analytics-label="Delete Collection Document"
|
||||
data-service="database.deleteDocument"
|
||||
data-event="submit"
|
||||
data-param-collection-id="{{router.params.id}}"
|
||||
data-confirm="Are you sure you want to delete this collection?"
|
||||
data-success="alert,trigger,redirect"
|
||||
data-success-param-alert-text="Document deleted successfully"
|
||||
data-success-param-trigger-events="database.deleteDocument"
|
||||
data-success-param-redirect-url="/console/database?project={{router.params.project}}"
|
||||
data-failure="alert"
|
||||
data-failure-param-alert-text="Failed to delete collection"
|
||||
data-failure-param-alert-classname="error">
|
||||
<div data-ls-if="({{router.params.id}})">
|
||||
<form name="database.deleteDocument" class="margin-bottom"
|
||||
data-analytics-event="submit"
|
||||
data-analytics-category="console"
|
||||
data-analytics-label="Delete Collection Document"
|
||||
data-service="database.deleteDocument"
|
||||
data-event="submit"
|
||||
data-param-collection-id="{{router.params.collection}}"
|
||||
data-param-document-id="{{router.params.id}}"
|
||||
data-confirm="Are you sure you want to delete this document?"
|
||||
data-success="alert,trigger,redirect"
|
||||
data-success-param-alert-text="Document deleted successfully"
|
||||
data-success-param-trigger-events="database.deleteDocument"
|
||||
data-success-param-redirect-url="/console/database/collection?id={{router.params.collection}}&project={{router.params.project}}"
|
||||
data-failure="alert"
|
||||
data-failure-param-alert-text="Failed to delete collection"
|
||||
data-failure-param-alert-classname="error">
|
||||
|
||||
<button type="submit" class="danger fill">Delete Document</button>
|
||||
</form>
|
||||
<button type="submit" class="danger fill">Delete Document</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
@ -158,44 +161,60 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
$list = [
|
||||
[
|
||||
'key' => '',
|
||||
'bind' => ' data-ls-bind="{{project-document|documentLabel}}"',
|
||||
],
|
||||
[
|
||||
'key' => '-array',
|
||||
'bind' => ' data-ls-bind="{{node}}"',
|
||||
],
|
||||
];
|
||||
?>
|
||||
|
||||
<script type="text/html" id="template-string-form">
|
||||
<input data-ls-attrs="name={{rule.key}},{{rule.required|documentRequired}}" type="text" autocomplete="off" data-ls-bind="{{project-document|documentLabel}}" data-forms-text-direction data-forms-text-count />
|
||||
</script>
|
||||
<?php foreach($list as $mode): ?>
|
||||
<script type="text/html" id="template-string-form<?php echo $mode['key']; ?>">
|
||||
<input data-ls-attrs="name={{rule.key}},{{rule.required|documentRequired}}" type="text" autocomplete="off"<?php echo $mode['bind']; ?> data-forms-text-direction data-forms-text-count />
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="template-text-form">
|
||||
<textarea data-ls-attrs="name={{rule.key}},{{rule.required|documentRequired}}" type="text" autocomplete="off" data-ls-bind="{{project-document|documentLabel}}" data-forms-text-direction data-forms-text-count></textarea>
|
||||
</script>
|
||||
<script type="text/html" id="template-text-form<?php echo $mode['key']; ?>">
|
||||
<textarea data-ls-attrs="name={{rule.key}},{{rule.required|documentRequired}}" type="text" autocomplete="off"<?php echo $mode['bind']; ?> data-forms-text-direction data-forms-text-count></textarea>
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="template-text-form-array">
|
||||
<textarea data-ls-attrs="name={{rule.key}},{{rule.required|documentRequired}}" type="text" autocomplete="off" data-ls-bind="{{node}}" data-forms-text-direction data-forms-text-count></textarea>
|
||||
</script>
|
||||
<script type="text/html" id="template-numeric-form<?php echo $mode['key']; ?>">
|
||||
<input data-ls-attrs="name={{rule.key}},{{rule.required|documentRequired}}" type="number" autocomplete="off"<?php echo $mode['bind']; ?> data-cast-to="integer" />
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="template-numeric-form">
|
||||
<input data-ls-attrs="name={{rule.key}},{{rule.required|documentRequired}}" type="number" autocomplete="off" data-ls-bind="{{project-document|documentLabel}}" data-cast-to="integer" />
|
||||
</script>
|
||||
|
||||
<script type="text/html" id="template-boolean-form">
|
||||
<input data-ls-attrs="name={{rule.key}},{{rule.required|documentRequired}}" type="hidden" data-forms-switch data-ls-bind="{{project-document|documentLabel}}" data-cast-to="boolean" />
|
||||
</script>
|
||||
<script type="text/html" id="template-boolean-form<?php echo $mode['key']; ?>">
|
||||
<input data-ls-attrs="name={{rule.key}},{{rule.required|documentRequired}}" type="hidden" data-forms-switch<?php echo $mode['bind']; ?> data-cast-to="boolean" />
|
||||
</script>
|
||||
<?php endforeach; ?>
|
||||
|
||||
<script type="text/html" id="template-array-form">
|
||||
<input type="hidden" data-ls-attrs="name={{rule.key}},{{rule.required|documentRequired}}" data-cast-to="array-empty">
|
||||
|
||||
<ul data-forms-add="New" data-ls-loop="project-document.{{rule.key}}" data-ls-as="node" class="sortable">
|
||||
<li data-forms-remove data-forms-move-up data-forms-move-down>
|
||||
<div class="row thin responsive margin-bottom-small">
|
||||
<div class="col span-3">
|
||||
<button type="button" class="margin-bottom strip round margin-end" data-remove><i class="icon-cancel"></i></button>
|
||||
<button type="button" class="margin-bottom strip round" data-move-down><i class="icon-down-dir"></i></button>
|
||||
<button type="button" class="margin-bottom strip round" data-move-up><i class="icon-up-dir"></i></button>
|
||||
<button type="button" disabled class="margin-bottom strip round" data-move-down><i class="icon-down-dir"></i></button>
|
||||
<button type="button" disabled class="margin-bottom strip round" data-move-up><i class="icon-up-dir"></i></button>
|
||||
</div>
|
||||
<div class="col span-9">
|
||||
<div data-ls-template="template-{{rule.type}}-form-array" data-type="script" class="margin-bottom"></div>
|
||||
</div>
|
||||
<div class="row thin responsive margin-bottom-small force-reverse">
|
||||
<div class="col span-1">
|
||||
<div class="drop-list bottom end" data-ls-ui-open="" data-button-text="" data-button-icon="icon-down-dir" data-button-selector="[data-toggler]" data-button-class="round small margin-bottom-small pull-end" data-blur="1" tabindex="1">
|
||||
<ul>
|
||||
<li data-move-up>
|
||||
<button type="button" class="link"><i class="icon-up-dir"></i> Move Up</button>
|
||||
</li>
|
||||
<li data-move-down>
|
||||
<button type="button" class="link"><i class="icon-down-dir"></i> Move Down</button>
|
||||
</li>
|
||||
<li data-remove>
|
||||
<button type="button" class="link"><i class="icon-cancel"></i> Remove</button>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col span-11">
|
||||
<div data-ls-template="template-{{rule.type}}-form-array" data-type="script" class="margin-bottom"></div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
|
|
|
@ -360,8 +360,8 @@ $customDomainsTarget = $this->getParam('customDomainsTarget', false);
|
|||
data-failure-param-alert-text="Failed to Remove Member"
|
||||
data-failure-param-alert-classname="error">
|
||||
|
||||
<input name="teamId" id="teamId" type="hidden" data-ls-bind="{{console-project.teamId}}">
|
||||
<input name="inviteId" id="inviteId" type="hidden" data-ls-bind="{{member.$id}}">
|
||||
<input name="teamId" data-ls-attrs="id=leave-teamId-{{member.$id}}" type="hidden" data-ls-bind="{{console-project.teamId}}">
|
||||
<input name="inviteId" data-ls-attrs="id=leave-inviteId-{{member.$id}}" type="hidden" data-ls-bind="{{member.$id}}">
|
||||
|
||||
<button class="danger">Leave</button>
|
||||
</form>
|
||||
|
@ -380,8 +380,8 @@ $customDomainsTarget = $this->getParam('customDomainsTarget', false);
|
|||
data-failure-param-alert-text="Failed to Resend Invitation"
|
||||
data-failure-param-alert-classname="error">
|
||||
|
||||
<input name="teamId" id="teamId" type="hidden" data-ls-bind="{{console-project.teamId}}">
|
||||
<input name="inviteId" id="inviteId" type="hidden" data-ls-bind="{{member.$id}}">
|
||||
<input name="teamId" data-ls-attrs="id=resend-teamId-{{member.$id}}" type="hidden" data-ls-bind="{{console-project.teamId}}">
|
||||
<input name="inviteId" data-ls-attrs="id=resend-inviteId-{{member.$id}}" type="hidden" data-ls-bind="{{member.$id}}">
|
||||
|
||||
<button class="reverse">Resend</button>
|
||||
</form>
|
||||
|
|
|
@ -136,15 +136,15 @@ $fileLimitHuman = $this->getParam('fileLimitHuman', 0);
|
|||
|
||||
<label for="files-fileId">File ID</label>
|
||||
<div class="input-copy">
|
||||
<input data-forms-copy type="text" name="fileId" id="files-fileId" disabled data-ls-bind="{{file.$id}}" />
|
||||
<input data-forms-copy type="text" data-ls-attrs="id=file-id-{{file.$id}}" name="fileId" disabled data-ls-bind="{{file.$id}}" />
|
||||
</div>
|
||||
<input type="hidden" name="folderId" id="files-folderId" data-cast-to="int" value="1">
|
||||
<input type="hidden" data-ls-attrs="id=file-folderId-{{file.$id}}" name="folderId" data-cast-to="int" value="1">
|
||||
|
||||
<label for="file-read">Read Permissions (<a data-ls-attrs="href={{env.HOME}}/docs/permissions" target="_blank">Learn more</a>)</label>
|
||||
<input type="hidden" id="file-read" name="read" required data-forms-tags data-cast-to="json" data-ls-bind="{{file.$permissions.read}}" />
|
||||
<input type="hidden" data-ls-attrs="id=file-read-{{file.$id}}" name="read" required data-forms-tags data-cast-to="json" data-ls-bind="{{file.$permissions.read}}" />
|
||||
|
||||
<label for="file-write">Write Permissions (<a data-ls-attrs="href={{env.HOME}}/docs/permissions" target="_blank">Learn more</a>)</label>
|
||||
<input type="hidden" id="file-write" name="write" required data-forms-tags data-cast-to="json" data-ls-bind="{{file.$permissions.write}}" />
|
||||
<input type="hidden" data-ls-attrs="id=file-write-{{file.$id}}" name="write" required data-forms-tags data-cast-to="json" data-ls-bind="{{file.$permissions.write}}" />
|
||||
</form>
|
||||
|
||||
<form class="strip"
|
||||
|
|
|
@ -272,11 +272,11 @@ $providers = $this->getParam('providers', []);
|
|||
|
||||
<label for="name">ID</label>
|
||||
<div class="input-copy">
|
||||
<input name="teamId" data-forms-copy type="text" disabled data-ls-bind="{{team.$id}}" />
|
||||
<input data-ls-attrs="id=team-id-{{team.$id}}" name="teamId" data-forms-copy type="text" disabled data-ls-bind="{{team.$id}}" />
|
||||
</div>
|
||||
|
||||
<label for="name">Name</label>
|
||||
<input name="name" data-ls-attrs="id=name-{{team.$id}}" type="text" autocomplete="off" data-ls-bind="{{team.name}}">
|
||||
<input data-ls-attrs="id=team-name-{{team.$id}}" name="name" type="text" autocomplete="off" data-ls-bind="{{team.name}}">
|
||||
|
||||
<hr />
|
||||
|
||||
|
|
|
@ -119,17 +119,17 @@ if(!empty($platforms)) {
|
|||
|
||||
<div class="loader"></div>
|
||||
|
||||
<div data-cookie-policy="We are using cookies to make this website easier to use."></div>
|
||||
<div data-cookies="We are using cookies to make this website easier to use."></div>
|
||||
|
||||
<section data-ls-ui-alerts="" class="alerts">
|
||||
<section class="alerts">
|
||||
<ul data-ls-loop="alerts.list" data-ls-as="alert">
|
||||
<li>
|
||||
<li data-forms-remove>
|
||||
<div data-ls-attrs="class={{alert.class}} message">
|
||||
<i class="icon-cancel" data-ls-ui-alerts-delete data-message="{{alert.id}}"></i>
|
||||
<i class="icon-cancel" data-remove></i>
|
||||
<span data-ls-bind="{{alert.text}}"></span>
|
||||
|
||||
<span data-ls-if="undefined !== {{alert.link}}">
|
||||
<a data-ls-attrs="href={{alert.link}}" data-ls-ui-alerts-delete data-message="{{alert.id}}">Learn more</a>
|
||||
<a data-ls-attrs="href={{alert.link}}" data-remove>Learn more</a>
|
||||
</span>
|
||||
</div>
|
||||
</li>
|
||||
|
|
|
@ -52,6 +52,7 @@ const configApp = {
|
|||
'public/scripts/views/forms/text-resize.js',
|
||||
'public/scripts/views/forms/upload.js',
|
||||
|
||||
'public/scripts/views/general/cookies.js',
|
||||
'public/scripts/views/general/page-title.js',
|
||||
'public/scripts/views/general/scroll-to.js',
|
||||
'public/scripts/views/general/scroll-direction.js',
|
||||
|
|
34
public/dist/scripts/app-all.js
vendored
34
public/dist/scripts/app-all.js
vendored
|
@ -2583,7 +2583,8 @@ let units=["kB","MB","GB","TB","PB","EB","ZB","YB"];let u=-1;do{$value/=thresh;+
|
|||
units[u]+"</span>");}).add("statsTotal",function($value){if(!$value){return 0;}
|
||||
$value=abbreviate($value,1,false,false);return $value==="0"?"N/A":$value;}).add("isEmptyObject",function($value){return((Object.keys($value).length===0&&$value.constructor===Object)||$value.length===0)}).add("activeDomainsCount",function($value){let result=[];if(Array.isArray($value)){result=$value.filter(function(node){return(node.verification&&node.certificateId);});}
|
||||
return result.length;}).add("documentLabel",function($value,rule,filter){let value=($value!==null&&$value[rule['key']]!==undefined)?$value[rule['key']]:null;switch(rule['type']){case'bool':case'boolean':return(value)?'true':'false';break;case'numeric':return(value&&value.toString)?value.toString():value;break;default:return value;break;}}).add("documentRequired",function($value,rule,filter){if(!$value||$value==='false'){return'';}
|
||||
return'required';});function abbreviate(number,maxPlaces,forcePlaces,forceLetter){number=Number(number);forceLetter=forceLetter||false;if(forceLetter!==false){return annotate(number,maxPlaces,forcePlaces,forceLetter);}
|
||||
return'required';}).add("documentAction",function(container){let collection=container.get('project-collection');let document=container.get('project-document');if(collection&&document&&!document.$id){return'database.createDocument';}
|
||||
return'database.updateDocument';});function abbreviate(number,maxPlaces,forcePlaces,forceLetter){number=Number(number);forceLetter=forceLetter||false;if(forceLetter!==false){return annotate(number,maxPlaces,forcePlaces,forceLetter);}
|
||||
let abbr;if(number>=1e12){abbr="T";}else if(number>=1e9){abbr="B";}else if(number>=1e6){abbr="M";}else if(number>=1e3){abbr="K";}else{abbr="";}
|
||||
return annotate(number,maxPlaces,forcePlaces,abbr);}
|
||||
function annotate(number,maxPlaces,forcePlaces,abbr){let rounded=0;switch(abbr){case"T":rounded=number/1e12;break;case"B":rounded=number/1e9;break;case"M":rounded=number/1e6;break;case"K":rounded=number/1e3;break;case"":rounded=number;break;}
|
||||
|
@ -2591,31 +2592,26 @@ if(maxPlaces!==false){let test=new RegExp("\\.\\d{"+(maxPlaces+1)+",}$");if(test
|
|||
if(forcePlaces!==false){rounded=Number(rounded).toFixed(forcePlaces);}
|
||||
return rounded+abbr;}
|
||||
window.ls.container.get("view").add({selector:"data-acl",controller:function(element,document,router,alerts){document.body.classList.remove("console");document.body.classList.remove("home");document.body.classList.add(router.getCurrent().view.scope);if(!router.getCurrent().view.project){document.body.classList.add("hide-nav");document.body.classList.remove("show-nav");}else{document.body.classList.add("show-nav");document.body.classList.remove("hide-nav");}
|
||||
if("/console"===router.getCurrent().path){document.body.classList.add("index");}else{document.body.classList.remove("index");}}}).add({selector:"data-cookie-policy",controller:function(element,alerts,cookie,env){if(!cookie.get("cookie-alert")){let text=element.dataset["cookiePolicy"]||"";alerts.add({text:text,class:"cookie-alert",link:env.HOME+"/policy/cookies",callback:function(){cookie.set("cookie-alert","true",365*10);}},0);}}}).add({selector:"data-ls-ui-alerts",controller:function(element,window,view){window.document.addEventListener("alerted",function(){view.render(element);},true);}}).add({selector:"data-ls-ui-alerts-delete",controller:function(document,element,alerts,expression){let message=expression.parse(element.dataset["message"]);let remove=function(){alerts.remove(message);};element.addEventListener("click",remove);}}).add({selector:"data-forms-headers",controller:function(element){let key=document.createElement("input");let value=document.createElement("input");let wrap=document.createElement("div");let cell1=document.createElement("div");let cell2=document.createElement("div");key.type="text";key.className="margin-bottom-no";key.placeholder="Key";value.type="text";value.className="margin-bottom-no";value.placeholder="Value";wrap.className="row thin margin-bottom-small";cell1.className="col span-6";cell2.className="col span-6";element.parentNode.insertBefore(wrap,element);cell1.appendChild(key);cell2.appendChild(value);wrap.appendChild(cell1);wrap.appendChild(cell2);key.addEventListener("input",function(){syncA();});value.addEventListener("input",function(){syncA();});element.addEventListener("change",function(){syncB();});let syncA=function(){element.value=key.value.toLowerCase()+":"+value.value.toLowerCase();};let syncB=function(){let split=element.value.toLowerCase().split(":");key.value=split[0]||"";value.value=split[1]||"";key.value=key.value.trim();value.value=value.value.trim();};syncB();}}).add({selector:"data-prism",controller:function(window,document,element,alerts){Prism.highlightElement(element);let copy=document.createElement("i");copy.className="icon-docs copy";copy.title="Copy to Clipboard";copy.textContent="Click Here to Copy";copy.addEventListener("click",function(){window.getSelection().removeAllRanges();let range=document.createRange();range.selectNode(element);window.getSelection().addRange(range);try{document.execCommand("copy");alerts.add({text:"Copied to clipboard",class:""},3000);}catch(err){alerts.add({text:"Failed to copy text ",class:"error"},3000);}
|
||||
if("/console"===router.getCurrent().path){document.body.classList.add("index");}else{document.body.classList.remove("index");}}}).add({selector:"data-forms-headers",controller:function(element){let key=document.createElement("input");let value=document.createElement("input");let wrap=document.createElement("div");let cell1=document.createElement("div");let cell2=document.createElement("div");key.type="text";key.className="margin-bottom-no";key.placeholder="Key";value.type="text";value.className="margin-bottom-no";value.placeholder="Value";wrap.className="row thin margin-bottom-small";cell1.className="col span-6";cell2.className="col span-6";element.parentNode.insertBefore(wrap,element);cell1.appendChild(key);cell2.appendChild(value);wrap.appendChild(cell1);wrap.appendChild(cell2);key.addEventListener("input",function(){syncA();});value.addEventListener("input",function(){syncA();});element.addEventListener("change",function(){syncB();});let syncA=function(){element.value=key.value.toLowerCase()+":"+value.value.toLowerCase();};let syncB=function(){let split=element.value.toLowerCase().split(":");key.value=split[0]||"";value.value=split[1]||"";key.value=key.value.trim();value.value=value.value.trim();};syncB();}}).add({selector:"data-prism",controller:function(window,document,element,alerts){Prism.highlightElement(element);let copy=document.createElement("i");copy.className="icon-docs copy";copy.title="Copy to Clipboard";copy.textContent="Click Here to Copy";copy.addEventListener("click",function(){window.getSelection().removeAllRanges();let range=document.createRange();range.selectNode(element);window.getSelection().addRange(range);try{document.execCommand("copy");alerts.add({text:"Copied to clipboard",class:""},3000);}catch(err){alerts.add({text:"Failed to copy text ",class:"error"},3000);}
|
||||
window.getSelection().removeAllRanges();});element.parentNode.parentNode.appendChild(copy);}}).add({selector:"data-ls-ui-chart",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<stats["requests"]["data"].length;i++){config.data.datasets[0].data[i]=stats["requests"]["data"][i].value;config.data.labels[i]=date.format("d F Y",stats["requests"]["data"][i].date);}
|
||||
let chart=container.get("chart");if(chart){}
|
||||
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.view.add({selector:"data-service",controller:function(element,view,container,form,alerts,expression,window){let action=element.dataset["service"];let service=element.dataset["name"]||action;let event=expression.parse(element.dataset["event"]);let confirm=element.dataset["confirm"]||"";let loading=element.dataset["loading"]||"";let loaderId=null;let fade=(element.dataset["fade"]||false);let scope=element.dataset["scope"]||"sdk";let debug=!!element.dataset["debug"];let success=element.dataset["success"]||"";let failure=element.dataset["failure"]||"";let running=false;success=success&&success!=""?success.split(",").map(element=>element.trim()):[];failure=failure&&failure!=""?failure.split(",").map(element=>element.trim()):[];if(debug)
|
||||
console.log("%c[service init]: "+action+" ("+service+")","color:red");let callbacks={hide:function(){return function(){return element.style.opacity='0';};},reset:function(){return function(){if("FORM"===element.tagName){return element.reset();}
|
||||
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.view.add({selector:"data-service",controller:function(element,view,container,form,alerts,expression,window){let action=element.dataset["service"];let service=element.dataset["name"]||action;let event=expression.parse(element.dataset["event"]);let confirm=element.dataset["confirm"]||"";let loading=element.dataset["loading"]||"";let loaderId=null;let scope=element.dataset["scope"]||"sdk";let success=element.dataset["success"]||"";let failure=element.dataset["failure"]||"";let running=false;success=success&&success!=""?success.split(",").map(element=>element.trim()):[];failure=failure&&failure!=""?failure.split(",").map(element=>element.trim()):[];let callbacks={hide:function(){return function(){return element.style.opacity='0';};},reset:function(){return function(){if("FORM"===element.tagName){return element.reset();}
|
||||
throw new Error("This callback is only valid for forms");};},alert:function(text,classname){return function(alerts){alerts.add({text:text,class:classname||"success"},3000);};},redirect:function(url){return function(router){window.location=url||"/";};},reload:function(){return function(router){router.reload();};},state:function(keys){let updateQueryString=function(key,value,url){var re=new RegExp("([?&])"+key+"=.*?(&|#|$)(.*)","gi"),hash;if(re.test(url)){if(typeof value!=="undefined"&&value!==null){return url.replace(re,"$1"+key+"="+value+"$2$3");}else{hash=url.split("#");url=hash[0].replace(re,"$1$3").replace(/(&|\?)$/,"");if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
||||
return url;}}else{if(typeof value!=="undefined"&&value!==null){var separator=url.indexOf("?")!==-1?"&":"?";hash=url.split("#");url=hash[0]+separator+key+"="+value;if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
||||
return url;}else{return url;}}};keys=keys.split(",").map(element=>element.trim());return function(serviceForm,router,window){let url=window.location.href;keys.map(node=>{node=node.split("=");let key=node[0]||"";let name=node[1]||key;let value=getValue(key,"param",serviceForm);url=updateQueryString(name,value?value:null,url);});if(url!==window.location.href){window.history.pushState({},"",url);router.reset();}};},trigger:function(events){return function(document){events=events.trim().split(",");for(let i=0;i<events.length;i++){if(""===events[i]){continue;}
|
||||
if(debug)
|
||||
console.log("%c[event triggered]: "+events[i],"color:green");document.dispatchEvent(new CustomEvent(events[i]));}};},default:function(){let collection=container.get('project-collection');let document=container.get('project-document');console.log(collection);console.log(document);if(collection&&document&&collection.$id===document.$id){for(const[key,value]of Object.entries(document)){delete document[key];}
|
||||
document.dispatchEvent(new CustomEvent(events[i]));}};},setId:function name(params){},default:function(){console.log('start-default');let collection=container.get('project-collection');let document=container.get('project-document');if(collection&&document&&collection.$id===document.$id){for(const[key,value]of Object.entries(document)){delete document[key];}
|
||||
if(collection.rules){for(let index=0;index<collection.rules.length;index++){const element=collection.rules[index];switch(element.type){case'text':case'email':case'url':case'ip':document[element.key]=element.default||'';break;case'numeric':document[element.key]=element.default||0;break;case'boolean':document[element.key]=element.default||false;break;default:document[element.key]=null;break;}
|
||||
if(element.array){document[element.key]=[];}}}
|
||||
console.log(document);}}};let getParams=function getParams(func){const REGEX_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;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;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);}
|
||||
if(element.array){document[element.key]=[];}}}}
|
||||
console.log('end-default',document);}};let getParams=function getParams(func){const REGEX_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;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;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 getValue=function(key,prefix,data){let result=null;if(!key){return null;}
|
||||
let attrKey=prefix+key.charAt(0).toUpperCase()+key.slice(1);if(element.dataset[attrKey]){result=expression.parse(element.dataset[attrKey]);if(element.dataset[attrKey+"CastTo"]==="array"){result=result.split(",");}}
|
||||
if(data[key]){result=data[key];}
|
||||
if(!result){result="";}
|
||||
return result;};let resolve=function(target,prefix="param",data={}){if(!target){return function(){};}
|
||||
let args=getParams(target);if(debug)console.log("%c[form data]: ","color:green",data);return target.apply(target,args.map(function(value){let result=getValue(value,prefix,data);if(debug)
|
||||
console.log("[param resolved]: ("+service+") "+value+"=",result);return result;}));};let exec=function(event){element.$lsSkip=true;element.classList.add("load-service-start");if(debug)
|
||||
console.log("%c[executed]: "+scope+"."+action,"color:yellow",event,element,document.body.contains(element));if(!document.body.contains(element)){element=undefined;return false;}
|
||||
let args=getParams(target);return target.apply(target,args.map(function(value){let result=getValue(value,prefix,data);return result;}));};let exec=function(event){action=expression.parse(action);element.$lsSkip=true;element.classList.add("load-service-start");if(!document.body.contains(element)){element=undefined;return false;}
|
||||
if(event){event.preventDefault();}
|
||||
if(running){console.log('blocked');return false;}
|
||||
if(running){return false;}
|
||||
running=true;element.style.backgroud='red';if(confirm){if(window.confirm(confirm)!==true){element.classList.add("load-service-end");return false;}}
|
||||
if(loading){loaderId=alerts.add({text:loading,class:""},0);}
|
||||
let method=container.path(scope+"."+action);if(!method){throw new Error('Method "'+scope+"."+action+'" not found');}
|
||||
|
@ -2623,9 +2619,7 @@ let formData="FORM"===element.tagName?form.toJson(element):{};let result=resolve
|
|||
if(Promise.resolve(result)!=result){result=new Promise((resolve,reject)=>{resolve(result);});}
|
||||
result.then(function(data){if(loaderId!==null){alerts.remove(loaderId);}
|
||||
if(!element){return;}
|
||||
running=false;element.style.backgroud='transparent';element.classList.add("load-service-end");container.set(service.replace(".","-"),data,true,true);container.set("serviceData",data,true,true);container.set("serviceForm",formData,true,true);if(debug)
|
||||
console.log('%cservice ready: "'+service.replace(".","-")+'"',"color:green");if(debug)
|
||||
console.log("%cservice:","color:blue",container.get(service.replace(".","-")));for(let i=0;i<success.length;i++){container.resolve(resolve(callbacks[success[i]],"successParam"+
|
||||
running=false;element.style.backgroud='transparent';element.classList.add("load-service-end");console.log('name-of-service',service.replace(".","-"),data);container.set(service.replace(".","-"),data,true,true);container.set("serviceData",data,true,true);container.set("serviceForm",formData,true,true);for(let i=0;i<success.length;i++){container.resolve(resolve(callbacks[success[i]],"successParam"+
|
||||
success[i].charAt(0).toUpperCase()+
|
||||
success[i].slice(1),{}));}
|
||||
container.set("serviceData",null,true,true);container.set("serviceForm",null,true,true);element.$lsSkip=false;view.render(element);},function(exception){if(loaderId!==null){alerts.remove(loaderId);}
|
||||
|
@ -2634,15 +2628,13 @@ running=false;element.style.backgroud='transparent';element.classList.add("load-
|
|||
failure[i].charAt(0).toUpperCase()+
|
||||
failure[i].slice(1),{}));}
|
||||
element.$lsSkip=false;view.render(element);});};let events=event.trim().split(",");for(let y=0;y<events.length;y++){if(""===events[y]){continue;}
|
||||
switch(events[y].trim()){case"load":exec();break;case"none":break;case"click":case"change":case"keypress":case"keydown":case"keyup":case"input":case"submit":element.addEventListener(events[y],exec);break;default:document.addEventListener(events[y],exec);}
|
||||
if(debug)
|
||||
console.log('%cregistered: "'+events[y].trim()+'" ('+service+")","color:blue");}}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-analytics-event",controller:function(element){var action=element.getAttribute("data-analytics-event")||"click";element.addEventListener(action,function(){var category=element.getAttribute("data-analytics-category")||"undefined";var label=element.getAttribute("data-analytics-label")||"undefined";if(!ga){console.error("Google Analytics ga object is not available");}
|
||||
switch(events[y].trim()){case"load":exec();break;case"none":break;case"click":case"change":case"keypress":case"keydown":case"keyup":case"input":case"submit":element.addEventListener(events[y],exec);break;default:document.addEventListener(events[y],exec);}}}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-analytics-event",controller:function(element){var action=element.getAttribute("data-analytics-event")||"click";element.addEventListener(action,function(){var category=element.getAttribute("data-analytics-category")||"undefined";var label=element.getAttribute("data-analytics-label")||"undefined";if(!ga){console.error("Google Analytics ga object is not available");}
|
||||
ga("send",{hitType:"event",eventCategory:category,eventAction:action,eventLabel:label});});}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-analytics-pageview",controller:function(window,router,env){if(!ga){console.error("Google Analytics ga object is not available");}
|
||||
var project=router.params["project"]||'None';ga("set","page",window.location.pathname);ga("set","dimension1",project);ga('set','dimension2',env.VERSION);ga('set','dimension3',env.SETUP);ga("send","pageview");}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-clone",controller:function(element,document,view){var template=element.innerHTML.toString();var label=element.dataset["label"]||"Add";var icon=element.dataset["icon"]||null;var target=element.dataset["target"]||null;var first=parseInt(element.dataset["first"]||1);var button=document.createElement("button");button.type="button";button.innerText=" "+label+" ";button.classList.add("margin-end");button.classList.add("margin-bottom-small");button.classList.add("reverse");if(icon){var iconElement=document.createElement("i");iconElement.className=icon;button.insertBefore(iconElement,button.firstChild);}
|
||||
if(target){target=document.getElementById(target);}
|
||||
button.addEventListener("click",function(){var clone=document.createElement(element.tagName);if(element.name){clone.name=element.name;}
|
||||
clone.innerHTML=template;clone.className=element.className;view.render(clone);if(target){target.appendChild(clone);}else{button.parentNode.insertBefore(clone,button);}
|
||||
clone.querySelector("input").focus();Array.prototype.slice.call(clone.querySelectorAll("[data-remove]")).map(function(obj){obj.addEventListener("click",function(){clone.parentNode.removeChild(clone);obj.scrollIntoView({behavior:"smooth"});});});Array.prototype.slice.call(clone.querySelectorAll("[data-up]")).map(function(obj){obj.addEventListener("click",function(){if(clone.previousElementSibling){clone.parentNode.insertBefore(clone,clone.previousElementSibling);obj.scrollIntoView({behavior:"smooth"});}});});Array.prototype.slice.call(clone.querySelectorAll("[data-down]")).map(function(obj){obj.addEventListener("click",function(){if(clone.nextElementSibling){clone.parentNode.insertBefore(clone.nextElementSibling,clone);obj.scrollIntoView({behavior:"smooth"});}});});});element.parentNode.insertBefore(button,element.nextSibling);element.parentNode.removeChild(element);if(first){button.click();}}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-add",repeat:false,controller:function(element,view,container){var button=document.createElement("button");let template=element.children[0].cloneNode(true);let as=element.getAttribute('data-ls-as');button.type="button";button.innerText="Add";button.classList.add("reverse");button.addEventListener('click',function(){container.set(as,null,true,true);let child=template.cloneNode(true);element.appendChild(child);view.render(child);element.style.visibility='visible';});element.after(button);}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-code",controller:function(element,alerts){let lang=element.dataset["formsCode"]||"json";let div=document.createElement("div");let pre=document.createElement("pre");let code=document.createElement("code");let copy=document.createElement("i");div.appendChild(pre);div.appendChild(copy);pre.appendChild(code);element.parentNode.appendChild(div);div.className="ide";pre.className="line-numbers";code.className="prism language-"+lang;copy.className="icon-docs copy";copy.title="Copy to Clipboard";copy.addEventListener("click",function(){element.disabled=false;element.focus();element.select();document.execCommand("Copy");if(document.selection){document.selection.empty();}else if(window.getSelection){window.getSelection().removeAllRanges();}
|
||||
clone.querySelector("input").focus();Array.prototype.slice.call(clone.querySelectorAll("[data-remove]")).map(function(obj){obj.addEventListener("click",function(){clone.parentNode.removeChild(clone);obj.scrollIntoView({behavior:"smooth"});});});Array.prototype.slice.call(clone.querySelectorAll("[data-up]")).map(function(obj){obj.addEventListener("click",function(){if(clone.previousElementSibling){clone.parentNode.insertBefore(clone,clone.previousElementSibling);obj.scrollIntoView({behavior:"smooth"});}});});Array.prototype.slice.call(clone.querySelectorAll("[data-down]")).map(function(obj){obj.addEventListener("click",function(){if(clone.nextElementSibling){clone.parentNode.insertBefore(clone.nextElementSibling,clone);obj.scrollIntoView({behavior:"smooth"});}});});});element.parentNode.insertBefore(button,element.nextSibling);element.parentNode.removeChild(element);if(first){button.click();}}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-add",repeat:false,controller:function(element,view,container,document){var button=document.createElement("button");let template=element.children[0].cloneNode(true);let as=element.getAttribute('data-ls-as');let counter=0;button.type="button";button.innerText="Add";button.classList.add("reverse");button.addEventListener('click',function(){container.addNamespace(as,'new-'+counter++);console.log(container.namespaces,container.get(as),as);container.set(as,null,true,true);let child=template.cloneNode(true);view.render(child);element.appendChild(child);element.style.visibility='visible';let inputs=child.querySelectorAll('input,textarea');for(let index=0;index<inputs.length;++index){if(inputs[index].type!=='hidden'){inputs[index].focus();break;}}});element.after(button);}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-code",controller:function(element,alerts){let lang=element.dataset["formsCode"]||"json";let div=document.createElement("div");let pre=document.createElement("pre");let code=document.createElement("code");let copy=document.createElement("i");div.appendChild(pre);div.appendChild(copy);pre.appendChild(code);element.parentNode.appendChild(div);div.className="ide";pre.className="line-numbers";code.className="prism language-"+lang;copy.className="icon-docs copy";copy.title="Copy to Clipboard";copy.addEventListener("click",function(){element.disabled=false;element.focus();element.select();document.execCommand("Copy");if(document.selection){document.selection.empty();}else if(window.getSelection){window.getSelection().removeAllRanges();}
|
||||
element.disabled=true;alerts.add({text:"Copied to clipboard",class:""},3000);});let check=function(){if(!element.value){return;}
|
||||
let value=null;try{value=JSON.stringify(JSON.parse(element.value),null,4);}catch(error){value=element.value;}
|
||||
code.innerHTML=value;Prism.highlightElement(code);div.scrollTop=0;};element.addEventListener("change",check);check();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-color",controller:function(element){var preview=document.createElement("div");var picker=document.createElement("input");picker.type="color";preview.className="color-preview";preview.appendChild(picker);picker.addEventListener("change",syncA);picker.addEventListener("input",syncA);element.addEventListener("input",update);element.addEventListener("change",update);function update(){if(element.validity.valid){preview.style.background=element.value;syncB();}}
|
||||
|
@ -2677,7 +2669,7 @@ var file=document.createElement("li");var image=document.createElement("img");im
|
|||
result+"/preview?width="+
|
||||
previewWidth+"&height="+
|
||||
previewHeight+"&project=console";file.className="file avatar";file.tabIndex=0;file.appendChild(image);preview.appendChild(file);var remove=(function(result){return function(event){render(result.$id);};})(result);file.addEventListener("click",remove);file.addEventListener("keypress",remove);element.value=result;};input.addEventListener("change",function(){var message=alerts.add({text:labelLoading,class:""},0);var files=input.files;var read=JSON.parse(expression.parse(element.dataset["read"]||"[]"));var write=JSON.parse(expression.parse(element.dataset["write"]||"[]"));sdk.storage.createFile(files[0],read,write,1).then(function(response){onComplete(message);render(response.$id);},function(error){alerts.add({text:"An error occurred!",class:""},3000);onComplete(message);});input.disabled=true;});element.addEventListener("change",function(){console.log('change',element);if(!element.value){return;}
|
||||
render(output);});upload.addEventListener("keypress",function(){input.click();});element.parentNode.insertBefore(wrapper,element);wrapper.appendChild(preview);wrapper.appendChild(progress);wrapper.appendChild(upload);upload.appendChild(input);render(output);}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-page-title",repeat:true,controller:function(element,document,expression){document.title=expression.parse(element.getAttribute("data-page-title"))||document.title;}});})(window);(function(window){"use strict";window.ls.view.add({selector:'data-general-scroll-to',repeat:false,controller:function(element,window){let button=window.document.createElement('button');button.className='scroll-to icon-up-dir';button.alt='Back To Top';button.title='Back To Top';button.addEventListener('click',function(){element.scrollIntoView(true,{behavior:'smooth'});button.blur();},false);element.appendChild(button);}});})(window);(function(window){"use strict";window.ls.view.add({selector:'data-general-scroll-direction',repeat:false,controller:function(element,window){let position=0;let check=function(){let direction=window.document.documentElement.scrollTop;if(direction>position){element.classList.remove('scroll-to-top')
|
||||
render(output);});upload.addEventListener("keypress",function(){input.click();});element.parentNode.insertBefore(wrapper,element);wrapper.appendChild(preview);wrapper.appendChild(progress);wrapper.appendChild(upload);upload.appendChild(input);render(output);}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-cookies",controller:function(element,alerts,cookie,env){if(!cookie.get("cookie-alert")){let text=element.dataset["cookiePolicy"]||"";alerts.add({text:text,class:"cookie-alert",link:env.HOME+"/policy/cookies",callback:function(){cookie.set("cookie-alert","true",365*10);}},0);}}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-page-title",repeat:true,controller:function(element,document,expression){document.title=expression.parse(element.getAttribute("data-page-title"))||document.title;}});})(window);(function(window){"use strict";window.ls.view.add({selector:'data-general-scroll-to',repeat:false,controller:function(element,window){let button=window.document.createElement('button');button.className='scroll-to icon-up-dir';button.alt='Back To Top';button.title='Back To Top';button.addEventListener('click',function(){element.scrollIntoView(true,{behavior:'smooth'});button.blur();},false);element.appendChild(button);}});})(window);(function(window){"use strict";window.ls.view.add({selector:'data-general-scroll-direction',repeat:false,controller:function(element,window){let position=0;let check=function(){let direction=window.document.documentElement.scrollTop;if(direction>position){element.classList.remove('scroll-to-top')
|
||||
element.classList.add('scroll-to-bottom')}
|
||||
else{element.classList.remove('scroll-to-bottom')
|
||||
element.classList.add('scroll-to-top')}
|
||||
|
|
34
public/dist/scripts/app.js
vendored
34
public/dist/scripts/app.js
vendored
|
@ -299,7 +299,8 @@ let units=["kB","MB","GB","TB","PB","EB","ZB","YB"];let u=-1;do{$value/=thresh;+
|
|||
units[u]+"</span>");}).add("statsTotal",function($value){if(!$value){return 0;}
|
||||
$value=abbreviate($value,1,false,false);return $value==="0"?"N/A":$value;}).add("isEmptyObject",function($value){return((Object.keys($value).length===0&&$value.constructor===Object)||$value.length===0)}).add("activeDomainsCount",function($value){let result=[];if(Array.isArray($value)){result=$value.filter(function(node){return(node.verification&&node.certificateId);});}
|
||||
return result.length;}).add("documentLabel",function($value,rule,filter){let value=($value!==null&&$value[rule['key']]!==undefined)?$value[rule['key']]:null;switch(rule['type']){case'bool':case'boolean':return(value)?'true':'false';break;case'numeric':return(value&&value.toString)?value.toString():value;break;default:return value;break;}}).add("documentRequired",function($value,rule,filter){if(!$value||$value==='false'){return'';}
|
||||
return'required';});function abbreviate(number,maxPlaces,forcePlaces,forceLetter){number=Number(number);forceLetter=forceLetter||false;if(forceLetter!==false){return annotate(number,maxPlaces,forcePlaces,forceLetter);}
|
||||
return'required';}).add("documentAction",function(container){let collection=container.get('project-collection');let document=container.get('project-document');if(collection&&document&&!document.$id){return'database.createDocument';}
|
||||
return'database.updateDocument';});function abbreviate(number,maxPlaces,forcePlaces,forceLetter){number=Number(number);forceLetter=forceLetter||false;if(forceLetter!==false){return annotate(number,maxPlaces,forcePlaces,forceLetter);}
|
||||
let abbr;if(number>=1e12){abbr="T";}else if(number>=1e9){abbr="B";}else if(number>=1e6){abbr="M";}else if(number>=1e3){abbr="K";}else{abbr="";}
|
||||
return annotate(number,maxPlaces,forcePlaces,abbr);}
|
||||
function annotate(number,maxPlaces,forcePlaces,abbr){let rounded=0;switch(abbr){case"T":rounded=number/1e12;break;case"B":rounded=number/1e9;break;case"M":rounded=number/1e6;break;case"K":rounded=number/1e3;break;case"":rounded=number;break;}
|
||||
|
@ -307,31 +308,26 @@ if(maxPlaces!==false){let test=new RegExp("\\.\\d{"+(maxPlaces+1)+",}$");if(test
|
|||
if(forcePlaces!==false){rounded=Number(rounded).toFixed(forcePlaces);}
|
||||
return rounded+abbr;}
|
||||
window.ls.container.get("view").add({selector:"data-acl",controller:function(element,document,router,alerts){document.body.classList.remove("console");document.body.classList.remove("home");document.body.classList.add(router.getCurrent().view.scope);if(!router.getCurrent().view.project){document.body.classList.add("hide-nav");document.body.classList.remove("show-nav");}else{document.body.classList.add("show-nav");document.body.classList.remove("hide-nav");}
|
||||
if("/console"===router.getCurrent().path){document.body.classList.add("index");}else{document.body.classList.remove("index");}}}).add({selector:"data-cookie-policy",controller:function(element,alerts,cookie,env){if(!cookie.get("cookie-alert")){let text=element.dataset["cookiePolicy"]||"";alerts.add({text:text,class:"cookie-alert",link:env.HOME+"/policy/cookies",callback:function(){cookie.set("cookie-alert","true",365*10);}},0);}}}).add({selector:"data-ls-ui-alerts",controller:function(element,window,view){window.document.addEventListener("alerted",function(){view.render(element);},true);}}).add({selector:"data-ls-ui-alerts-delete",controller:function(document,element,alerts,expression){let message=expression.parse(element.dataset["message"]);let remove=function(){alerts.remove(message);};element.addEventListener("click",remove);}}).add({selector:"data-forms-headers",controller:function(element){let key=document.createElement("input");let value=document.createElement("input");let wrap=document.createElement("div");let cell1=document.createElement("div");let cell2=document.createElement("div");key.type="text";key.className="margin-bottom-no";key.placeholder="Key";value.type="text";value.className="margin-bottom-no";value.placeholder="Value";wrap.className="row thin margin-bottom-small";cell1.className="col span-6";cell2.className="col span-6";element.parentNode.insertBefore(wrap,element);cell1.appendChild(key);cell2.appendChild(value);wrap.appendChild(cell1);wrap.appendChild(cell2);key.addEventListener("input",function(){syncA();});value.addEventListener("input",function(){syncA();});element.addEventListener("change",function(){syncB();});let syncA=function(){element.value=key.value.toLowerCase()+":"+value.value.toLowerCase();};let syncB=function(){let split=element.value.toLowerCase().split(":");key.value=split[0]||"";value.value=split[1]||"";key.value=key.value.trim();value.value=value.value.trim();};syncB();}}).add({selector:"data-prism",controller:function(window,document,element,alerts){Prism.highlightElement(element);let copy=document.createElement("i");copy.className="icon-docs copy";copy.title="Copy to Clipboard";copy.textContent="Click Here to Copy";copy.addEventListener("click",function(){window.getSelection().removeAllRanges();let range=document.createRange();range.selectNode(element);window.getSelection().addRange(range);try{document.execCommand("copy");alerts.add({text:"Copied to clipboard",class:""},3000);}catch(err){alerts.add({text:"Failed to copy text ",class:"error"},3000);}
|
||||
if("/console"===router.getCurrent().path){document.body.classList.add("index");}else{document.body.classList.remove("index");}}}).add({selector:"data-forms-headers",controller:function(element){let key=document.createElement("input");let value=document.createElement("input");let wrap=document.createElement("div");let cell1=document.createElement("div");let cell2=document.createElement("div");key.type="text";key.className="margin-bottom-no";key.placeholder="Key";value.type="text";value.className="margin-bottom-no";value.placeholder="Value";wrap.className="row thin margin-bottom-small";cell1.className="col span-6";cell2.className="col span-6";element.parentNode.insertBefore(wrap,element);cell1.appendChild(key);cell2.appendChild(value);wrap.appendChild(cell1);wrap.appendChild(cell2);key.addEventListener("input",function(){syncA();});value.addEventListener("input",function(){syncA();});element.addEventListener("change",function(){syncB();});let syncA=function(){element.value=key.value.toLowerCase()+":"+value.value.toLowerCase();};let syncB=function(){let split=element.value.toLowerCase().split(":");key.value=split[0]||"";value.value=split[1]||"";key.value=key.value.trim();value.value=value.value.trim();};syncB();}}).add({selector:"data-prism",controller:function(window,document,element,alerts){Prism.highlightElement(element);let copy=document.createElement("i");copy.className="icon-docs copy";copy.title="Copy to Clipboard";copy.textContent="Click Here to Copy";copy.addEventListener("click",function(){window.getSelection().removeAllRanges();let range=document.createRange();range.selectNode(element);window.getSelection().addRange(range);try{document.execCommand("copy");alerts.add({text:"Copied to clipboard",class:""},3000);}catch(err){alerts.add({text:"Failed to copy text ",class:"error"},3000);}
|
||||
window.getSelection().removeAllRanges();});element.parentNode.parentNode.appendChild(copy);}}).add({selector:"data-ls-ui-chart",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<stats["requests"]["data"].length;i++){config.data.datasets[0].data[i]=stats["requests"]["data"][i].value;config.data.labels[i]=date.format("d F Y",stats["requests"]["data"][i].date);}
|
||||
let chart=container.get("chart");if(chart){}
|
||||
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.view.add({selector:"data-service",controller:function(element,view,container,form,alerts,expression,window){let action=element.dataset["service"];let service=element.dataset["name"]||action;let event=expression.parse(element.dataset["event"]);let confirm=element.dataset["confirm"]||"";let loading=element.dataset["loading"]||"";let loaderId=null;let fade=(element.dataset["fade"]||false);let scope=element.dataset["scope"]||"sdk";let debug=!!element.dataset["debug"];let success=element.dataset["success"]||"";let failure=element.dataset["failure"]||"";let running=false;success=success&&success!=""?success.split(",").map(element=>element.trim()):[];failure=failure&&failure!=""?failure.split(",").map(element=>element.trim()):[];if(debug)
|
||||
console.log("%c[service init]: "+action+" ("+service+")","color:red");let callbacks={hide:function(){return function(){return element.style.opacity='0';};},reset:function(){return function(){if("FORM"===element.tagName){return element.reset();}
|
||||
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.view.add({selector:"data-service",controller:function(element,view,container,form,alerts,expression,window){let action=element.dataset["service"];let service=element.dataset["name"]||action;let event=expression.parse(element.dataset["event"]);let confirm=element.dataset["confirm"]||"";let loading=element.dataset["loading"]||"";let loaderId=null;let scope=element.dataset["scope"]||"sdk";let success=element.dataset["success"]||"";let failure=element.dataset["failure"]||"";let running=false;success=success&&success!=""?success.split(",").map(element=>element.trim()):[];failure=failure&&failure!=""?failure.split(",").map(element=>element.trim()):[];let callbacks={hide:function(){return function(){return element.style.opacity='0';};},reset:function(){return function(){if("FORM"===element.tagName){return element.reset();}
|
||||
throw new Error("This callback is only valid for forms");};},alert:function(text,classname){return function(alerts){alerts.add({text:text,class:classname||"success"},3000);};},redirect:function(url){return function(router){window.location=url||"/";};},reload:function(){return function(router){router.reload();};},state:function(keys){let updateQueryString=function(key,value,url){var re=new RegExp("([?&])"+key+"=.*?(&|#|$)(.*)","gi"),hash;if(re.test(url)){if(typeof value!=="undefined"&&value!==null){return url.replace(re,"$1"+key+"="+value+"$2$3");}else{hash=url.split("#");url=hash[0].replace(re,"$1$3").replace(/(&|\?)$/,"");if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
||||
return url;}}else{if(typeof value!=="undefined"&&value!==null){var separator=url.indexOf("?")!==-1?"&":"?";hash=url.split("#");url=hash[0]+separator+key+"="+value;if(typeof hash[1]!=="undefined"&&hash[1]!==null){url+="#"+hash[1];}
|
||||
return url;}else{return url;}}};keys=keys.split(",").map(element=>element.trim());return function(serviceForm,router,window){let url=window.location.href;keys.map(node=>{node=node.split("=");let key=node[0]||"";let name=node[1]||key;let value=getValue(key,"param",serviceForm);url=updateQueryString(name,value?value:null,url);});if(url!==window.location.href){window.history.pushState({},"",url);router.reset();}};},trigger:function(events){return function(document){events=events.trim().split(",");for(let i=0;i<events.length;i++){if(""===events[i]){continue;}
|
||||
if(debug)
|
||||
console.log("%c[event triggered]: "+events[i],"color:green");document.dispatchEvent(new CustomEvent(events[i]));}};},default:function(){let collection=container.get('project-collection');let document=container.get('project-document');console.log(collection);console.log(document);if(collection&&document&&collection.$id===document.$id){for(const[key,value]of Object.entries(document)){delete document[key];}
|
||||
document.dispatchEvent(new CustomEvent(events[i]));}};},setId:function name(params){},default:function(){console.log('start-default');let collection=container.get('project-collection');let document=container.get('project-document');if(collection&&document&&collection.$id===document.$id){for(const[key,value]of Object.entries(document)){delete document[key];}
|
||||
if(collection.rules){for(let index=0;index<collection.rules.length;index++){const element=collection.rules[index];switch(element.type){case'text':case'email':case'url':case'ip':document[element.key]=element.default||'';break;case'numeric':document[element.key]=element.default||0;break;case'boolean':document[element.key]=element.default||false;break;default:document[element.key]=null;break;}
|
||||
if(element.array){document[element.key]=[];}}}
|
||||
console.log(document);}}};let getParams=function getParams(func){const REGEX_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;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;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);}
|
||||
if(element.array){document[element.key]=[];}}}}
|
||||
console.log('end-default',document);}};let getParams=function getParams(func){const REGEX_COMMENTS=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;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;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 getValue=function(key,prefix,data){let result=null;if(!key){return null;}
|
||||
let attrKey=prefix+key.charAt(0).toUpperCase()+key.slice(1);if(element.dataset[attrKey]){result=expression.parse(element.dataset[attrKey]);if(element.dataset[attrKey+"CastTo"]==="array"){result=result.split(",");}}
|
||||
if(data[key]){result=data[key];}
|
||||
if(!result){result="";}
|
||||
return result;};let resolve=function(target,prefix="param",data={}){if(!target){return function(){};}
|
||||
let args=getParams(target);if(debug)console.log("%c[form data]: ","color:green",data);return target.apply(target,args.map(function(value){let result=getValue(value,prefix,data);if(debug)
|
||||
console.log("[param resolved]: ("+service+") "+value+"=",result);return result;}));};let exec=function(event){element.$lsSkip=true;element.classList.add("load-service-start");if(debug)
|
||||
console.log("%c[executed]: "+scope+"."+action,"color:yellow",event,element,document.body.contains(element));if(!document.body.contains(element)){element=undefined;return false;}
|
||||
let args=getParams(target);return target.apply(target,args.map(function(value){let result=getValue(value,prefix,data);return result;}));};let exec=function(event){action=expression.parse(action);element.$lsSkip=true;element.classList.add("load-service-start");if(!document.body.contains(element)){element=undefined;return false;}
|
||||
if(event){event.preventDefault();}
|
||||
if(running){console.log('blocked');return false;}
|
||||
if(running){return false;}
|
||||
running=true;element.style.backgroud='red';if(confirm){if(window.confirm(confirm)!==true){element.classList.add("load-service-end");return false;}}
|
||||
if(loading){loaderId=alerts.add({text:loading,class:""},0);}
|
||||
let method=container.path(scope+"."+action);if(!method){throw new Error('Method "'+scope+"."+action+'" not found');}
|
||||
|
@ -339,9 +335,7 @@ let formData="FORM"===element.tagName?form.toJson(element):{};let result=resolve
|
|||
if(Promise.resolve(result)!=result){result=new Promise((resolve,reject)=>{resolve(result);});}
|
||||
result.then(function(data){if(loaderId!==null){alerts.remove(loaderId);}
|
||||
if(!element){return;}
|
||||
running=false;element.style.backgroud='transparent';element.classList.add("load-service-end");container.set(service.replace(".","-"),data,true,true);container.set("serviceData",data,true,true);container.set("serviceForm",formData,true,true);if(debug)
|
||||
console.log('%cservice ready: "'+service.replace(".","-")+'"',"color:green");if(debug)
|
||||
console.log("%cservice:","color:blue",container.get(service.replace(".","-")));for(let i=0;i<success.length;i++){container.resolve(resolve(callbacks[success[i]],"successParam"+
|
||||
running=false;element.style.backgroud='transparent';element.classList.add("load-service-end");console.log('name-of-service',service.replace(".","-"),data);container.set(service.replace(".","-"),data,true,true);container.set("serviceData",data,true,true);container.set("serviceForm",formData,true,true);for(let i=0;i<success.length;i++){container.resolve(resolve(callbacks[success[i]],"successParam"+
|
||||
success[i].charAt(0).toUpperCase()+
|
||||
success[i].slice(1),{}));}
|
||||
container.set("serviceData",null,true,true);container.set("serviceForm",null,true,true);element.$lsSkip=false;view.render(element);},function(exception){if(loaderId!==null){alerts.remove(loaderId);}
|
||||
|
@ -350,15 +344,13 @@ running=false;element.style.backgroud='transparent';element.classList.add("load-
|
|||
failure[i].charAt(0).toUpperCase()+
|
||||
failure[i].slice(1),{}));}
|
||||
element.$lsSkip=false;view.render(element);});};let events=event.trim().split(",");for(let y=0;y<events.length;y++){if(""===events[y]){continue;}
|
||||
switch(events[y].trim()){case"load":exec();break;case"none":break;case"click":case"change":case"keypress":case"keydown":case"keyup":case"input":case"submit":element.addEventListener(events[y],exec);break;default:document.addEventListener(events[y],exec);}
|
||||
if(debug)
|
||||
console.log('%cregistered: "'+events[y].trim()+'" ('+service+")","color:blue");}}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-analytics-event",controller:function(element){var action=element.getAttribute("data-analytics-event")||"click";element.addEventListener(action,function(){var category=element.getAttribute("data-analytics-category")||"undefined";var label=element.getAttribute("data-analytics-label")||"undefined";if(!ga){console.error("Google Analytics ga object is not available");}
|
||||
switch(events[y].trim()){case"load":exec();break;case"none":break;case"click":case"change":case"keypress":case"keydown":case"keyup":case"input":case"submit":element.addEventListener(events[y],exec);break;default:document.addEventListener(events[y],exec);}}}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-analytics-event",controller:function(element){var action=element.getAttribute("data-analytics-event")||"click";element.addEventListener(action,function(){var category=element.getAttribute("data-analytics-category")||"undefined";var label=element.getAttribute("data-analytics-label")||"undefined";if(!ga){console.error("Google Analytics ga object is not available");}
|
||||
ga("send",{hitType:"event",eventCategory:category,eventAction:action,eventLabel:label});});}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-analytics-pageview",controller:function(window,router,env){if(!ga){console.error("Google Analytics ga object is not available");}
|
||||
var project=router.params["project"]||'None';ga("set","page",window.location.pathname);ga("set","dimension1",project);ga('set','dimension2',env.VERSION);ga('set','dimension3',env.SETUP);ga("send","pageview");}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-clone",controller:function(element,document,view){var template=element.innerHTML.toString();var label=element.dataset["label"]||"Add";var icon=element.dataset["icon"]||null;var target=element.dataset["target"]||null;var first=parseInt(element.dataset["first"]||1);var button=document.createElement("button");button.type="button";button.innerText=" "+label+" ";button.classList.add("margin-end");button.classList.add("margin-bottom-small");button.classList.add("reverse");if(icon){var iconElement=document.createElement("i");iconElement.className=icon;button.insertBefore(iconElement,button.firstChild);}
|
||||
if(target){target=document.getElementById(target);}
|
||||
button.addEventListener("click",function(){var clone=document.createElement(element.tagName);if(element.name){clone.name=element.name;}
|
||||
clone.innerHTML=template;clone.className=element.className;view.render(clone);if(target){target.appendChild(clone);}else{button.parentNode.insertBefore(clone,button);}
|
||||
clone.querySelector("input").focus();Array.prototype.slice.call(clone.querySelectorAll("[data-remove]")).map(function(obj){obj.addEventListener("click",function(){clone.parentNode.removeChild(clone);obj.scrollIntoView({behavior:"smooth"});});});Array.prototype.slice.call(clone.querySelectorAll("[data-up]")).map(function(obj){obj.addEventListener("click",function(){if(clone.previousElementSibling){clone.parentNode.insertBefore(clone,clone.previousElementSibling);obj.scrollIntoView({behavior:"smooth"});}});});Array.prototype.slice.call(clone.querySelectorAll("[data-down]")).map(function(obj){obj.addEventListener("click",function(){if(clone.nextElementSibling){clone.parentNode.insertBefore(clone.nextElementSibling,clone);obj.scrollIntoView({behavior:"smooth"});}});});});element.parentNode.insertBefore(button,element.nextSibling);element.parentNode.removeChild(element);if(first){button.click();}}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-add",repeat:false,controller:function(element,view,container){var button=document.createElement("button");let template=element.children[0].cloneNode(true);let as=element.getAttribute('data-ls-as');button.type="button";button.innerText="Add";button.classList.add("reverse");button.addEventListener('click',function(){container.set(as,null,true,true);let child=template.cloneNode(true);element.appendChild(child);view.render(child);element.style.visibility='visible';});element.after(button);}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-code",controller:function(element,alerts){let lang=element.dataset["formsCode"]||"json";let div=document.createElement("div");let pre=document.createElement("pre");let code=document.createElement("code");let copy=document.createElement("i");div.appendChild(pre);div.appendChild(copy);pre.appendChild(code);element.parentNode.appendChild(div);div.className="ide";pre.className="line-numbers";code.className="prism language-"+lang;copy.className="icon-docs copy";copy.title="Copy to Clipboard";copy.addEventListener("click",function(){element.disabled=false;element.focus();element.select();document.execCommand("Copy");if(document.selection){document.selection.empty();}else if(window.getSelection){window.getSelection().removeAllRanges();}
|
||||
clone.querySelector("input").focus();Array.prototype.slice.call(clone.querySelectorAll("[data-remove]")).map(function(obj){obj.addEventListener("click",function(){clone.parentNode.removeChild(clone);obj.scrollIntoView({behavior:"smooth"});});});Array.prototype.slice.call(clone.querySelectorAll("[data-up]")).map(function(obj){obj.addEventListener("click",function(){if(clone.previousElementSibling){clone.parentNode.insertBefore(clone,clone.previousElementSibling);obj.scrollIntoView({behavior:"smooth"});}});});Array.prototype.slice.call(clone.querySelectorAll("[data-down]")).map(function(obj){obj.addEventListener("click",function(){if(clone.nextElementSibling){clone.parentNode.insertBefore(clone.nextElementSibling,clone);obj.scrollIntoView({behavior:"smooth"});}});});});element.parentNode.insertBefore(button,element.nextSibling);element.parentNode.removeChild(element);if(first){button.click();}}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-add",repeat:false,controller:function(element,view,container,document){var button=document.createElement("button");let template=element.children[0].cloneNode(true);let as=element.getAttribute('data-ls-as');let counter=0;button.type="button";button.innerText="Add";button.classList.add("reverse");button.addEventListener('click',function(){container.addNamespace(as,'new-'+counter++);console.log(container.namespaces,container.get(as),as);container.set(as,null,true,true);let child=template.cloneNode(true);view.render(child);element.appendChild(child);element.style.visibility='visible';let inputs=child.querySelectorAll('input,textarea');for(let index=0;index<inputs.length;++index){if(inputs[index].type!=='hidden'){inputs[index].focus();break;}}});element.after(button);}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-code",controller:function(element,alerts){let lang=element.dataset["formsCode"]||"json";let div=document.createElement("div");let pre=document.createElement("pre");let code=document.createElement("code");let copy=document.createElement("i");div.appendChild(pre);div.appendChild(copy);pre.appendChild(code);element.parentNode.appendChild(div);div.className="ide";pre.className="line-numbers";code.className="prism language-"+lang;copy.className="icon-docs copy";copy.title="Copy to Clipboard";copy.addEventListener("click",function(){element.disabled=false;element.focus();element.select();document.execCommand("Copy");if(document.selection){document.selection.empty();}else if(window.getSelection){window.getSelection().removeAllRanges();}
|
||||
element.disabled=true;alerts.add({text:"Copied to clipboard",class:""},3000);});let check=function(){if(!element.value){return;}
|
||||
let value=null;try{value=JSON.stringify(JSON.parse(element.value),null,4);}catch(error){value=element.value;}
|
||||
code.innerHTML=value;Prism.highlightElement(code);div.scrollTop=0;};element.addEventListener("change",check);check();}});})(window);(function(window){"use strict";window.ls.container.get("view").add({selector:"data-forms-color",controller:function(element){var preview=document.createElement("div");var picker=document.createElement("input");picker.type="color";preview.className="color-preview";preview.appendChild(picker);picker.addEventListener("change",syncA);picker.addEventListener("input",syncA);element.addEventListener("input",update);element.addEventListener("change",update);function update(){if(element.validity.valid){preview.style.background=element.value;syncB();}}
|
||||
|
@ -393,7 +385,7 @@ var file=document.createElement("li");var image=document.createElement("img");im
|
|||
result+"/preview?width="+
|
||||
previewWidth+"&height="+
|
||||
previewHeight+"&project=console";file.className="file avatar";file.tabIndex=0;file.appendChild(image);preview.appendChild(file);var remove=(function(result){return function(event){render(result.$id);};})(result);file.addEventListener("click",remove);file.addEventListener("keypress",remove);element.value=result;};input.addEventListener("change",function(){var message=alerts.add({text:labelLoading,class:""},0);var files=input.files;var read=JSON.parse(expression.parse(element.dataset["read"]||"[]"));var write=JSON.parse(expression.parse(element.dataset["write"]||"[]"));sdk.storage.createFile(files[0],read,write,1).then(function(response){onComplete(message);render(response.$id);},function(error){alerts.add({text:"An error occurred!",class:""},3000);onComplete(message);});input.disabled=true;});element.addEventListener("change",function(){console.log('change',element);if(!element.value){return;}
|
||||
render(output);});upload.addEventListener("keypress",function(){input.click();});element.parentNode.insertBefore(wrapper,element);wrapper.appendChild(preview);wrapper.appendChild(progress);wrapper.appendChild(upload);upload.appendChild(input);render(output);}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-page-title",repeat:true,controller:function(element,document,expression){document.title=expression.parse(element.getAttribute("data-page-title"))||document.title;}});})(window);(function(window){"use strict";window.ls.view.add({selector:'data-general-scroll-to',repeat:false,controller:function(element,window){let button=window.document.createElement('button');button.className='scroll-to icon-up-dir';button.alt='Back To Top';button.title='Back To Top';button.addEventListener('click',function(){element.scrollIntoView(true,{behavior:'smooth'});button.blur();},false);element.appendChild(button);}});})(window);(function(window){"use strict";window.ls.view.add({selector:'data-general-scroll-direction',repeat:false,controller:function(element,window){let position=0;let check=function(){let direction=window.document.documentElement.scrollTop;if(direction>position){element.classList.remove('scroll-to-top')
|
||||
render(output);});upload.addEventListener("keypress",function(){input.click();});element.parentNode.insertBefore(wrapper,element);wrapper.appendChild(preview);wrapper.appendChild(progress);wrapper.appendChild(upload);upload.appendChild(input);render(output);}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-cookies",controller:function(element,alerts,cookie,env){if(!cookie.get("cookie-alert")){let text=element.dataset["cookiePolicy"]||"";alerts.add({text:text,class:"cookie-alert",link:env.HOME+"/policy/cookies",callback:function(){cookie.set("cookie-alert","true",365*10);}},0);}}});})(window);(function(window){window.ls.container.get("view").add({selector:"data-page-title",repeat:true,controller:function(element,document,expression){document.title=expression.parse(element.getAttribute("data-page-title"))||document.title;}});})(window);(function(window){"use strict";window.ls.view.add({selector:'data-general-scroll-to',repeat:false,controller:function(element,window){let button=window.document.createElement('button');button.className='scroll-to icon-up-dir';button.alt='Back To Top';button.title='Back To Top';button.addEventListener('click',function(){element.scrollIntoView(true,{behavior:'smooth'});button.blur();},false);element.appendChild(button);}});})(window);(function(window){"use strict";window.ls.view.add({selector:'data-general-scroll-direction',repeat:false,controller:function(element,window){let position=0;let check=function(){let direction=window.document.documentElement.scrollTop;if(direction>position){element.classList.remove('scroll-to-top')
|
||||
element.classList.add('scroll-to-bottom')}
|
||||
else{element.classList.remove('scroll-to-bottom')
|
||||
element.classList.add('scroll-to-top')}
|
||||
|
|
2
public/dist/styles/default-ltr.css
vendored
2
public/dist/styles/default-ltr.css
vendored
File diff suppressed because one or more lines are too long
2
public/dist/styles/default-rtl.css
vendored
2
public/dist/styles/default-rtl.css
vendored
File diff suppressed because one or more lines are too long
|
@ -27,50 +27,6 @@ window.ls.container
|
|||
}
|
||||
}
|
||||
})
|
||||
.add({
|
||||
selector: "data-cookie-policy",
|
||||
controller: function(element, alerts, cookie, env) {
|
||||
if (!cookie.get("cookie-alert")) {
|
||||
let text = element.dataset["cookiePolicy"] || "";
|
||||
|
||||
alerts.add(
|
||||
{
|
||||
text: text,
|
||||
class: "cookie-alert",
|
||||
link: env.HOME + "/policy/cookies",
|
||||
callback: function() {
|
||||
cookie.set("cookie-alert", "true", 365 * 10); // 10 years
|
||||
}
|
||||
},
|
||||
0
|
||||
);
|
||||
}
|
||||
}
|
||||
})
|
||||
.add({
|
||||
selector: "data-ls-ui-alerts",
|
||||
controller: function(element, window, view) {
|
||||
window.document.addEventListener(
|
||||
"alerted",
|
||||
function() {
|
||||
view.render(element);
|
||||
},
|
||||
true
|
||||
);
|
||||
}
|
||||
})
|
||||
.add({
|
||||
selector: "data-ls-ui-alerts-delete",
|
||||
controller: function(document, element, alerts, expression) {
|
||||
let message = expression.parse(element.dataset["message"]);
|
||||
|
||||
let remove = function() {
|
||||
alerts.remove(message);
|
||||
};
|
||||
|
||||
element.addEventListener("click", remove);
|
||||
}
|
||||
})
|
||||
.add({
|
||||
selector: "data-forms-headers",
|
||||
controller: function(element) {
|
||||
|
@ -229,15 +185,6 @@ window.ls.container
|
|||
);
|
||||
}
|
||||
|
||||
let chart = container.get("chart");
|
||||
|
||||
if (chart) {
|
||||
//if(JSON.stringify(chart.data.datasets[0].data) === JSON.stringify(config.data.datasets[0].data) && element.dataset['canvas']) {
|
||||
// return;
|
||||
//}
|
||||
//chart.destroy();
|
||||
}
|
||||
|
||||
element.innerHTML = "";
|
||||
|
||||
element.appendChild(child);
|
||||
|
|
|
@ -394,6 +394,16 @@ window.ls.filter
|
|||
|
||||
return 'required';
|
||||
})
|
||||
.add("documentAction", function(container) {
|
||||
let collection = container.get('project-collection');
|
||||
let document = container.get('project-document');
|
||||
|
||||
if(collection && document && !document.$id) {
|
||||
return 'database.createDocument';
|
||||
}
|
||||
|
||||
return 'database.updateDocument';
|
||||
})
|
||||
;
|
||||
|
||||
function abbreviate(number, maxPlaces, forcePlaces, forceLetter) {
|
||||
|
|
|
@ -4,25 +4,37 @@
|
|||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-add",
|
||||
repeat: false,
|
||||
controller: function(element, view, container) {
|
||||
controller: function(element, view, container, document) {
|
||||
var button = document.createElement("button");
|
||||
let template = element.children[0].cloneNode(true);
|
||||
let as = element.getAttribute('data-ls-as');
|
||||
let counter = 0;
|
||||
|
||||
button.type = "button";
|
||||
button.innerText = "Add";
|
||||
button.classList.add("reverse");
|
||||
|
||||
button.addEventListener('click', function() {
|
||||
container.addNamespace(as, 'new-' + counter++);
|
||||
console.log(container.namespaces, container.get(as), as);
|
||||
container.set(as, null, true, true);
|
||||
|
||||
let child = template.cloneNode(true);
|
||||
|
||||
view.render(child);
|
||||
|
||||
element.appendChild(child);
|
||||
|
||||
view.render(child);
|
||||
|
||||
element.style.visibility = 'visible';
|
||||
|
||||
let inputs = child.querySelectorAll('input,textarea');
|
||||
|
||||
for (let index = 0; index < inputs.length; ++index) {
|
||||
if(inputs[index].type !== 'hidden') {
|
||||
inputs[index].focus();
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
element.after(button);
|
||||
|
|
22
public/scripts/views/general/cookies.js
Normal file
22
public/scripts/views/general/cookies.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
(function(window) {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-cookies",
|
||||
controller: function(element, alerts, cookie, env) {
|
||||
if (!cookie.get("cookie-alert")) {
|
||||
let text = element.dataset["cookiePolicy"] || "";
|
||||
|
||||
alerts.add(
|
||||
{
|
||||
text: text,
|
||||
class: "cookie-alert",
|
||||
link: env.HOME + "/policy/cookies",
|
||||
callback: function() {
|
||||
cookie.set("cookie-alert", "true", 365 * 10); // 10 years
|
||||
}
|
||||
},
|
||||
0
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
})(window);
|
|
@ -3,24 +3,14 @@
|
|||
|
||||
window.ls.view.add({
|
||||
selector: "data-service",
|
||||
controller: function(
|
||||
element,
|
||||
view,
|
||||
container,
|
||||
form,
|
||||
alerts,
|
||||
expression,
|
||||
window
|
||||
) {
|
||||
controller: function(element, view, container, form, alerts, expression, window) {
|
||||
let action = element.dataset["service"];
|
||||
let service = element.dataset["name"] || action;
|
||||
let event = expression.parse(element.dataset["event"]); // load, click, change, submit
|
||||
let confirm = element.dataset["confirm"] || ""; // Free text
|
||||
let loading = element.dataset["loading"] || ""; // Free text
|
||||
let loaderId = null;
|
||||
let fade = (element.dataset["fade"] || false);
|
||||
let scope = element.dataset["scope"] || "sdk"; // Free text
|
||||
let debug = !!element.dataset["debug"]; // Free text
|
||||
let success = element.dataset["success"] || "";
|
||||
let failure = element.dataset["failure"] || "";
|
||||
let running = false;
|
||||
|
@ -34,12 +24,6 @@
|
|||
? failure.split(",").map(element => element.trim())
|
||||
: [];
|
||||
|
||||
if (debug)
|
||||
console.log(
|
||||
"%c[service init]: " + action + " (" + service + ")",
|
||||
"color:red"
|
||||
);
|
||||
|
||||
let callbacks = {
|
||||
hide: function() {
|
||||
return function() {
|
||||
|
@ -137,19 +121,20 @@
|
|||
if ("" === events[i]) {
|
||||
continue;
|
||||
}
|
||||
if (debug)
|
||||
console.log("%c[event triggered]: " + events[i], "color:green");
|
||||
|
||||
document.dispatchEvent(new CustomEvent(events[i]));
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
setId: function name(params) {
|
||||
|
||||
},
|
||||
|
||||
default: function() {
|
||||
console.log('start-default');
|
||||
let collection = container.get('project-collection');
|
||||
let document = container.get('project-document');
|
||||
console.log(collection);
|
||||
console.log(document);
|
||||
|
||||
if(collection && document && collection.$id === document.$id) {
|
||||
for (const [key, value] of Object.entries(document)) {
|
||||
|
@ -186,9 +171,9 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(document);
|
||||
}
|
||||
|
||||
console.log('end-default', document);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -273,17 +258,11 @@
|
|||
|
||||
let args = getParams(target);
|
||||
|
||||
if (debug) console.log("%c[form data]: ", "color:green", data);
|
||||
|
||||
return target.apply(
|
||||
target,
|
||||
args.map(function(value) {
|
||||
let result = getValue(value, prefix, data);
|
||||
if (debug)
|
||||
console.log(
|
||||
"[param resolved]: (" + service + ") " + value + "=",
|
||||
result
|
||||
);
|
||||
|
||||
return result;
|
||||
})
|
||||
);
|
||||
|
@ -291,19 +270,12 @@
|
|||
|
||||
let exec = function(event) {
|
||||
|
||||
action = expression.parse(action);
|
||||
|
||||
element.$lsSkip = true;
|
||||
|
||||
element.classList.add("load-service-start");
|
||||
|
||||
if (debug)
|
||||
console.log(
|
||||
"%c[executed]: " + scope + "." + action,
|
||||
"color:yellow",
|
||||
event,
|
||||
element,
|
||||
document.body.contains(element)
|
||||
);
|
||||
|
||||
if (!document.body.contains(element)) {
|
||||
element = undefined;
|
||||
return false;
|
||||
|
@ -314,7 +286,6 @@
|
|||
}
|
||||
|
||||
if(running) {
|
||||
console.log('blocked');
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -367,22 +338,11 @@
|
|||
element.style.backgroud = 'transparent';
|
||||
element.classList.add("load-service-end");
|
||||
|
||||
console.log('name-of-service', service.replace(".", "-"), data);
|
||||
container.set(service.replace(".", "-"), data, true, true);
|
||||
container.set("serviceData", data, true, true);
|
||||
container.set("serviceForm", formData, true, true);
|
||||
|
||||
if (debug)
|
||||
console.log(
|
||||
'%cservice ready: "' + service.replace(".", "-") + '"',
|
||||
"color:green"
|
||||
);
|
||||
if (debug)
|
||||
console.log(
|
||||
"%cservice:",
|
||||
"color:blue",
|
||||
container.get(service.replace(".", "-"))
|
||||
);
|
||||
|
||||
for (let i = 0; i < success.length; i++) {
|
||||
// Trigger success callbacks
|
||||
container.resolve(
|
||||
|
@ -462,12 +422,6 @@
|
|||
default:
|
||||
document.addEventListener(events[y], exec);
|
||||
}
|
||||
|
||||
if (debug)
|
||||
console.log(
|
||||
'%cregistered: "' + events[y].trim() + '" (' + service + ")",
|
||||
"color:blue"
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -104,7 +104,6 @@
|
|||
|
||||
&:disabled {
|
||||
display: inline-block;
|
||||
opacity: .8;
|
||||
background: var(--config-color-background);
|
||||
}
|
||||
}
|
||||
|
@ -115,7 +114,6 @@
|
|||
|
||||
&:disabled {
|
||||
display: inline-block;
|
||||
opacity: .8;
|
||||
background: var(--config-color-background);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1074,17 +1074,20 @@ ol {
|
|||
.clear;
|
||||
|
||||
a,
|
||||
.link {
|
||||
vertical-align: middle;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
.link, button.link {
|
||||
display: block;
|
||||
vertical-align: middle;
|
||||
height: auto;
|
||||
line-height: 30px;
|
||||
display: inline-block;
|
||||
padding: 10px 25px;
|
||||
color: inherit;
|
||||
font-size: 14px;
|
||||
border: none;
|
||||
max-width: 260px;
|
||||
cursor: pointer;
|
||||
width: 100%;
|
||||
text-align: @config-start;
|
||||
|
||||
&:hover {
|
||||
background: var(--config-color-fade-super);
|
||||
|
@ -1121,6 +1124,13 @@ ol {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.end {
|
||||
ul {
|
||||
.func-end(-10px);
|
||||
.func-start(auto);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.disabled {
|
||||
|
|
Loading…
Reference in a new issue