mirror of
https://github.com/appwrite/appwrite.git
synced 2026-05-26 13:51:13 +00:00
Updated JS coding standards using prettier
This commit is contained in:
@@ -38,7 +38,7 @@ use Utopia\Locale\Locale;
|
||||
<div class="pull-start margin-end-small margin-bottom">
|
||||
<input type="checkbox" required />
|
||||
</div>
|
||||
<?php echo $this->escape(Locale::getText('home.auth.signup.labels.agree')); ?><a href="/policy/terms" target="_blank"><?php echo $this->escape(Locale::getText('home.auth.signup.labels.terms')); ?></a><?php echo $this->escape(Locale::getText('home.auth.signup.labels.and')); ?><a href="/policy/privacy" target="_blank"><?php echo $this->escape(Locale::getText('home.auth.signup.labels.privacy')); ?></a>
|
||||
<?php echo $this->escape(Locale::getText('home.auth.signup.labels.agree')); ?><a href="/policy/terms" tabindex="-1" target="_blank"><?php echo $this->escape(Locale::getText('home.auth.signup.labels.terms')); ?></a><?php echo $this->escape(Locale::getText('home.auth.signup.labels.and')); ?><a href="/policy/privacy" target="_blank" tabindex="-1"><?php echo $this->escape(Locale::getText('home.auth.signup.labels.privacy')); ?></a>
|
||||
</div>
|
||||
|
||||
<input name="redirect" type="hidden" data-ls-bind="{{env.PROTOCOL}}://{{env.DOMAIN}}/auth/confirm" />
|
||||
|
||||
+268
-256
@@ -1,270 +1,282 @@
|
||||
|
||||
// Views
|
||||
|
||||
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');
|
||||
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);
|
||||
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');
|
||||
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");
|
||||
}
|
||||
|
||||
// Special case for console index page
|
||||
|
||||
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); // 10 years
|
||||
}
|
||||
else {
|
||||
document.body.classList.add('show-nav');
|
||||
document.body.classList.remove('hide-nav');
|
||||
}
|
||||
|
||||
// Special case for console index page
|
||||
|
||||
if('/console' === router.getCurrent().path) {
|
||||
document.body.classList.add('index');
|
||||
}
|
||||
else {
|
||||
document.body.classList.remove('index');
|
||||
},
|
||||
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.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-code-example",
|
||||
controller: function(window, document, element, cookie) {
|
||||
let prefix = element.dataset["codeExample"] || "unknown";
|
||||
|
||||
element.addEventListener("change", function() {
|
||||
select(element.value);
|
||||
});
|
||||
|
||||
let select = function(value) {
|
||||
for (let i = 0; i < element.length; i++) {
|
||||
document.body.classList.remove(
|
||||
prefix + "-" + element.options[i].value
|
||||
);
|
||||
}
|
||||
|
||||
document.body.classList.add(prefix + "-" + value);
|
||||
|
||||
cookie.set("language-" + prefix, value, 365);
|
||||
|
||||
document.dispatchEvent(new CustomEvent("updated-language-" + prefix));
|
||||
};
|
||||
|
||||
document.addEventListener("updated-language-" + prefix, function() {
|
||||
element.value = cookie.get("language-" + prefix);
|
||||
});
|
||||
|
||||
let def = cookie.get("language-" + prefix) || element.options[0].value;
|
||||
|
||||
select(def);
|
||||
|
||||
element.value = def;
|
||||
}
|
||||
})
|
||||
.add({
|
||||
selector: "data-ls-ui-chart",
|
||||
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
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
})
|
||||
.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']);
|
||||
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 remove = function () {
|
||||
alerts.remove(message);
|
||||
};
|
||||
let chart = container.get("chart");
|
||||
|
||||
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');
|
||||
if (chart) {
|
||||
//if(JSON.stringify(chart.data.datasets[0].data) === JSON.stringify(config.data.datasets[0].data) && element.dataset['canvas']) {
|
||||
// return;
|
||||
//}
|
||||
//chart.destroy();
|
||||
}
|
||||
|
||||
key.type = 'text';
|
||||
key.className = 'margin-bottom-no';
|
||||
key.placeholder = 'Key';
|
||||
value.type = 'text';
|
||||
value.className = 'margin-bottom-no';
|
||||
value.placeholder = 'Value';
|
||||
element.innerHTML = "";
|
||||
|
||||
wrap.className = 'row thin margin-bottom-small';
|
||||
cell1.className = 'col span-6';
|
||||
cell2.className = 'col span-6';
|
||||
element.appendChild(child);
|
||||
|
||||
element.parentNode.insertBefore(wrap, element);
|
||||
cell1.appendChild(key);
|
||||
cell2.appendChild(value);
|
||||
wrap.appendChild(cell1);
|
||||
wrap.appendChild(cell2);
|
||||
container.set("chart", new Chart(child.getContext("2d"), config), true);
|
||||
|
||||
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.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-code-example',
|
||||
controller: function(window, document, element, cookie) {
|
||||
let prefix = element.dataset['codeExample'] || 'unknown';
|
||||
|
||||
element.addEventListener('change', function () {
|
||||
select(element.value);
|
||||
});
|
||||
|
||||
let select = function (value) {
|
||||
for (let i=0; i< element.length; i++){
|
||||
document.body.classList.remove(prefix + '-' + element.options[i].value);
|
||||
}
|
||||
|
||||
document.body.classList.add(prefix + '-' + value);
|
||||
|
||||
cookie.set('language-' + prefix, value, 365);
|
||||
|
||||
document.dispatchEvent(new CustomEvent('updated-language-' + prefix));
|
||||
};
|
||||
|
||||
document.addEventListener('updated-language-' + prefix, function () {
|
||||
element.value = cookie.get('language-' + prefix);
|
||||
});
|
||||
|
||||
let def = cookie.get('language-' + prefix) || element.options[0].value;
|
||||
|
||||
select(def);
|
||||
|
||||
element.value = def;
|
||||
}
|
||||
})
|
||||
.add({
|
||||
selector: 'data-ls-ui-chart',
|
||||
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) {
|
||||
//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);
|
||||
|
||||
container.set('chart', new Chart(child.getContext('2d'), config), true);
|
||||
|
||||
element.dataset['canvas'] = true;
|
||||
}
|
||||
})
|
||||
;
|
||||
element.dataset["canvas"] = true;
|
||||
}
|
||||
});
|
||||
|
||||
+389
-157
@@ -1,175 +1,407 @@
|
||||
|
||||
window.ls.filter
|
||||
.add('gravatar', function ($value, element) {
|
||||
if(!$value) {
|
||||
return '';
|
||||
.add("gravatar", function($value, element) {
|
||||
if (!$value) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// MD5 (Message-Digest Algorithm) by WebToolkit
|
||||
let MD5 = function(s) {
|
||||
function L(k, d) {
|
||||
return (k << d) | (k >>> (32 - d));
|
||||
}
|
||||
function K(G, k) {
|
||||
let I, d, F, H, x;
|
||||
F = G & 2147483648;
|
||||
H = k & 2147483648;
|
||||
I = G & 1073741824;
|
||||
d = k & 1073741824;
|
||||
x = (G & 1073741823) + (k & 1073741823);
|
||||
if (I & d) {
|
||||
return x ^ 2147483648 ^ F ^ H;
|
||||
}
|
||||
|
||||
// MD5 (Message-Digest Algorithm) by WebToolkit
|
||||
let MD5 = function(s){function L(k,d){return(k<<d)|(k>>>(32-d))}function K(G,k){let I,d,F,H,x;F=(G&2147483648);H=(k&2147483648);I=(G&1073741824);d=(k&1073741824);x=(G&1073741823)+(k&1073741823);if(I&d){return(x^2147483648^F^H)}if(I|d){if(x&1073741824){return(x^3221225472^F^H)}else{return(x^1073741824^F^H)}}else{return(x^F^H)}}function r(d,F,k){return(d&F)|((~d)&k)}function q(d,F,k){return(d&k)|(F&(~k))}function p(d,F,k){return(d^F^k)}function n(d,F,k){return(F^(d|(~k)))}function u(G,F,aa,Z,k,H,I){G=K(G,K(K(r(F,aa,Z),k),I));return K(L(G,H),F)}function f(G,F,aa,Z,k,H,I){G=K(G,K(K(q(F,aa,Z),k),I));return K(L(G,H),F)}function D(G,F,aa,Z,k,H,I){G=K(G,K(K(p(F,aa,Z),k),I));return K(L(G,H),F)}function t(G,F,aa,Z,k,H,I){G=K(G,K(K(n(F,aa,Z),k),I));return K(L(G,H),F)}function e(G){let Z;let F=G.length;let x=F+8;let k=(x-(x%64))/64;let I=(k+1)*16;let aa=Array(I-1);let d=0;let H=0;while(H<F){Z=(H-(H%4))/4;d=(H%4)*8;aa[Z]=(aa[Z]|(G.charCodeAt(H)<<d));H++}Z=(H-(H%4))/4;d=(H%4)*8;aa[Z]=aa[Z]|(128<<d);aa[I-2]=F<<3;aa[I-1]=F>>>29;return aa}function B(x){let k="",F="",G,d;for(d=0;d<=3;d++){G=(x>>>(d*8))&255;F="0"+G.toString(16);k=k+F.substr(F.length-2,2)}return k}function J(k){k=k.replace(/rn/g,"n");let d="";for(let F=0;F<k.length;F++){let x=k.charCodeAt(F);if(x<128){d+=String.fromCharCode(x)}else{if((x>127)&&(x<2048)){d+=String.fromCharCode((x>>6)|192);d+=String.fromCharCode((x&63)|128)}else{d+=String.fromCharCode((x>>12)|224);d+=String.fromCharCode(((x>>6)&63)|128);d+=String.fromCharCode((x&63)|128)}}}return d}let C=Array();let P,h,E,v,g,Y,X,W,V;let S=7,Q=12,N=17,M=22;let A=5,z=9,y=14,w=20;let o=4,m=11,l=16,j=23;let U=6,T=10,R=15,O=21;s=J(s);C=e(s);Y=1732584193;X=4023233417;W=2562383102;V=271733878;for(P=0;P<C.length;P+=16){h=Y;E=X;v=W;g=V;Y=u(Y,X,W,V,C[P+0],S,3614090360);V=u(V,Y,X,W,C[P+1],Q,3905402710);W=u(W,V,Y,X,C[P+2],N,606105819);X=u(X,W,V,Y,C[P+3],M,3250441966);Y=u(Y,X,W,V,C[P+4],S,4118548399);V=u(V,Y,X,W,C[P+5],Q,1200080426);W=u(W,V,Y,X,C[P+6],N,2821735955);X=u(X,W,V,Y,C[P+7],M,4249261313);Y=u(Y,X,W,V,C[P+8],S,1770035416);V=u(V,Y,X,W,C[P+9],Q,2336552879);W=u(W,V,Y,X,C[P+10],N,4294925233);X=u(X,W,V,Y,C[P+11],M,2304563134);Y=u(Y,X,W,V,C[P+12],S,1804603682);V=u(V,Y,X,W,C[P+13],Q,4254626195);W=u(W,V,Y,X,C[P+14],N,2792965006);X=u(X,W,V,Y,C[P+15],M,1236535329);Y=f(Y,X,W,V,C[P+1],A,4129170786);V=f(V,Y,X,W,C[P+6],z,3225465664);W=f(W,V,Y,X,C[P+11],y,643717713);X=f(X,W,V,Y,C[P+0],w,3921069994);Y=f(Y,X,W,V,C[P+5],A,3593408605);V=f(V,Y,X,W,C[P+10],z,38016083);W=f(W,V,Y,X,C[P+15],y,3634488961);X=f(X,W,V,Y,C[P+4],w,3889429448);Y=f(Y,X,W,V,C[P+9],A,568446438);V=f(V,Y,X,W,C[P+14],z,3275163606);W=f(W,V,Y,X,C[P+3],y,4107603335);X=f(X,W,V,Y,C[P+8],w,1163531501);Y=f(Y,X,W,V,C[P+13],A,2850285829);V=f(V,Y,X,W,C[P+2],z,4243563512);W=f(W,V,Y,X,C[P+7],y,1735328473);X=f(X,W,V,Y,C[P+12],w,2368359562);Y=D(Y,X,W,V,C[P+5],o,4294588738);V=D(V,Y,X,W,C[P+8],m,2272392833);W=D(W,V,Y,X,C[P+11],l,1839030562);X=D(X,W,V,Y,C[P+14],j,4259657740);Y=D(Y,X,W,V,C[P+1],o,2763975236);V=D(V,Y,X,W,C[P+4],m,1272893353);W=D(W,V,Y,X,C[P+7],l,4139469664);X=D(X,W,V,Y,C[P+10],j,3200236656);Y=D(Y,X,W,V,C[P+13],o,681279174);V=D(V,Y,X,W,C[P+0],m,3936430074);W=D(W,V,Y,X,C[P+3],l,3572445317);X=D(X,W,V,Y,C[P+6],j,76029189);Y=D(Y,X,W,V,C[P+9],o,3654602809);V=D(V,Y,X,W,C[P+12],m,3873151461);W=D(W,V,Y,X,C[P+15],l,530742520);X=D(X,W,V,Y,C[P+2],j,3299628645);Y=t(Y,X,W,V,C[P+0],U,4096336452);V=t(V,Y,X,W,C[P+7],T,1126891415);W=t(W,V,Y,X,C[P+14],R,2878612391);X=t(X,W,V,Y,C[P+5],O,4237533241);Y=t(Y,X,W,V,C[P+12],U,1700485571);V=t(V,Y,X,W,C[P+3],T,2399980690);W=t(W,V,Y,X,C[P+10],R,4293915773);X=t(X,W,V,Y,C[P+1],O,2240044497);Y=t(Y,X,W,V,C[P+8],U,1873313359);V=t(V,Y,X,W,C[P+15],T,4264355552);W=t(W,V,Y,X,C[P+6],R,2734768916);X=t(X,W,V,Y,C[P+13],O,1309151649);Y=t(Y,X,W,V,C[P+4],U,4149444226);V=t(V,Y,X,W,C[P+11],T,3174756917);W=t(W,V,Y,X,C[P+2],R,718787259);X=t(X,W,V,Y,C[P+9],O,3951481745);Y=K(Y,h);X=K(X,E);W=K(W,v);V=K(V,g)}let i=B(Y)+B(X)+B(W)+B(V);return i.toLowerCase()};
|
||||
let size = element.dataset['size'] || 80;
|
||||
let email = $value.email || $value || '';
|
||||
let name = $value.name || $value || '';
|
||||
let theme = name.split('').map(char => char.charCodeAt(0)).reduce((a, b) => a + b, 0).toString();
|
||||
let themes = [
|
||||
{ color: '27005e', background: 'e1d2f6' }, // VIOLET
|
||||
{ color: '5e2700', background: 'f3d9c6' }, // ORANGE
|
||||
{ color: '006128', background: 'c9f3c6' }, // GREEN
|
||||
{ color: '580061', background: 'f2d1f5' }, // FUSCHIA
|
||||
{ color: '00365d', background: 'c6e1f3' }, // BLUE
|
||||
{ color: '00075c', background: 'd2d5f6' }, // INDIGO
|
||||
{ color: '610038', background: 'f5d1e6' }, // PINK
|
||||
{ color: '386100', background: 'dcf1bd' }, // LIME
|
||||
{ color: '615800', background: 'f1ecba' }, // YELLOW
|
||||
{ color: '610008', background: 'f6d2d5' }, // RED
|
||||
];
|
||||
|
||||
name = name.split(' ').map(function (n) {
|
||||
if(!isNaN(parseFloat(n)) && isFinite(n)) {
|
||||
return '';
|
||||
if (I | d) {
|
||||
if (x & 1073741824) {
|
||||
return x ^ 3221225472 ^ F ^ H;
|
||||
} else {
|
||||
return x ^ 1073741824 ^ F ^ H;
|
||||
}
|
||||
} else {
|
||||
return x ^ F ^ H;
|
||||
}
|
||||
}
|
||||
function r(d, F, k) {
|
||||
return (d & F) | (~d & k);
|
||||
}
|
||||
function q(d, F, k) {
|
||||
return (d & k) | (F & ~k);
|
||||
}
|
||||
function p(d, F, k) {
|
||||
return d ^ F ^ k;
|
||||
}
|
||||
function n(d, F, k) {
|
||||
return F ^ (d | ~k);
|
||||
}
|
||||
function u(G, F, aa, Z, k, H, I) {
|
||||
G = K(G, K(K(r(F, aa, Z), k), I));
|
||||
return K(L(G, H), F);
|
||||
}
|
||||
function f(G, F, aa, Z, k, H, I) {
|
||||
G = K(G, K(K(q(F, aa, Z), k), I));
|
||||
return K(L(G, H), F);
|
||||
}
|
||||
function D(G, F, aa, Z, k, H, I) {
|
||||
G = K(G, K(K(p(F, aa, Z), k), I));
|
||||
return K(L(G, H), F);
|
||||
}
|
||||
function t(G, F, aa, Z, k, H, I) {
|
||||
G = K(G, K(K(n(F, aa, Z), k), I));
|
||||
return K(L(G, H), F);
|
||||
}
|
||||
function e(G) {
|
||||
let Z;
|
||||
let F = G.length;
|
||||
let x = F + 8;
|
||||
let k = (x - (x % 64)) / 64;
|
||||
let I = (k + 1) * 16;
|
||||
let aa = Array(I - 1);
|
||||
let d = 0;
|
||||
let H = 0;
|
||||
while (H < F) {
|
||||
Z = (H - (H % 4)) / 4;
|
||||
d = (H % 4) * 8;
|
||||
aa[Z] = aa[Z] | (G.charCodeAt(H) << d);
|
||||
H++;
|
||||
}
|
||||
Z = (H - (H % 4)) / 4;
|
||||
d = (H % 4) * 8;
|
||||
aa[Z] = aa[Z] | (128 << d);
|
||||
aa[I - 2] = F << 3;
|
||||
aa[I - 1] = F >>> 29;
|
||||
return aa;
|
||||
}
|
||||
function B(x) {
|
||||
let k = "",
|
||||
F = "",
|
||||
G,
|
||||
d;
|
||||
for (d = 0; d <= 3; d++) {
|
||||
G = (x >>> (d * 8)) & 255;
|
||||
F = "0" + G.toString(16);
|
||||
k = k + F.substr(F.length - 2, 2);
|
||||
}
|
||||
return k;
|
||||
}
|
||||
function J(k) {
|
||||
k = k.replace(/rn/g, "n");
|
||||
let d = "";
|
||||
for (let F = 0; F < k.length; F++) {
|
||||
let x = k.charCodeAt(F);
|
||||
if (x < 128) {
|
||||
d += String.fromCharCode(x);
|
||||
} else {
|
||||
if (x > 127 && x < 2048) {
|
||||
d += String.fromCharCode((x >> 6) | 192);
|
||||
d += String.fromCharCode((x & 63) | 128);
|
||||
} else {
|
||||
d += String.fromCharCode((x >> 12) | 224);
|
||||
d += String.fromCharCode(((x >> 6) & 63) | 128);
|
||||
d += String.fromCharCode((x & 63) | 128);
|
||||
}
|
||||
|
||||
return n[0];
|
||||
}).join('') || '--';
|
||||
|
||||
let background = themes[theme[theme.length -1]]['background'];
|
||||
let color = themes[theme[theme.length -1]]['color'];
|
||||
|
||||
let def = 'https://ui-avatars.com/api/' + encodeURIComponent(name) + '/' + size + '/' + encodeURIComponent(background) + '/' + encodeURIComponent(color);
|
||||
|
||||
return '//www.gravatar.com/avatar/' + MD5(email) + '.jpg?s=' + size + '&d=' + encodeURIComponent(def);
|
||||
})
|
||||
.add('selectedCollection', function ($value, router) {
|
||||
return ($value === router.params.collectionId) ? 'selected' : '';
|
||||
})
|
||||
.add('selectedDocument', function ($value, router) {
|
||||
return ($value === router.params.documentId) ? 'selected' : '';
|
||||
})
|
||||
.add('localeString', function ($value) {
|
||||
$value = parseInt($value);
|
||||
return (!Number.isNaN($value)) ? $value.toLocaleString() : '';
|
||||
})
|
||||
.add('date', function ($value, date) {
|
||||
return date.format('Y-m-d', $value);
|
||||
})
|
||||
.add('date-time', function ($value, date) {
|
||||
return date.format('Y-m-d H:i', $value);
|
||||
})
|
||||
.add('date-text', function ($value, date) {
|
||||
return date.format('d M Y', $value);
|
||||
})
|
||||
.add('ms2hum', function ($value) {
|
||||
let temp = $value;
|
||||
const years = Math.floor( temp / 31536000 ),
|
||||
days = Math.floor( ( temp %= 31536000 ) / 86400 ),
|
||||
hours = Math.floor( ( temp %= 86400 ) / 3600 ),
|
||||
minutes = Math.floor( ( temp %= 3600 ) / 60 ),
|
||||
seconds = temp % 60;
|
||||
|
||||
if ( days || hours || seconds || minutes ) {
|
||||
return ( years ? years + "y " : "" ) +
|
||||
( days ? days + "d " : "" ) +
|
||||
( hours ? hours + "h " : "" ) +
|
||||
( minutes ? minutes + "m " : "" ) +
|
||||
Number.parseFloat( seconds ).toFixed(0) + "s";
|
||||
}
|
||||
}
|
||||
return d;
|
||||
}
|
||||
let C = Array();
|
||||
let P, h, E, v, g, Y, X, W, V;
|
||||
let S = 7,
|
||||
Q = 12,
|
||||
N = 17,
|
||||
M = 22;
|
||||
let A = 5,
|
||||
z = 9,
|
||||
y = 14,
|
||||
w = 20;
|
||||
let o = 4,
|
||||
m = 11,
|
||||
l = 16,
|
||||
j = 23;
|
||||
let U = 6,
|
||||
T = 10,
|
||||
R = 15,
|
||||
O = 21;
|
||||
s = J(s);
|
||||
C = e(s);
|
||||
Y = 1732584193;
|
||||
X = 4023233417;
|
||||
W = 2562383102;
|
||||
V = 271733878;
|
||||
for (P = 0; P < C.length; P += 16) {
|
||||
h = Y;
|
||||
E = X;
|
||||
v = W;
|
||||
g = V;
|
||||
Y = u(Y, X, W, V, C[P + 0], S, 3614090360);
|
||||
V = u(V, Y, X, W, C[P + 1], Q, 3905402710);
|
||||
W = u(W, V, Y, X, C[P + 2], N, 606105819);
|
||||
X = u(X, W, V, Y, C[P + 3], M, 3250441966);
|
||||
Y = u(Y, X, W, V, C[P + 4], S, 4118548399);
|
||||
V = u(V, Y, X, W, C[P + 5], Q, 1200080426);
|
||||
W = u(W, V, Y, X, C[P + 6], N, 2821735955);
|
||||
X = u(X, W, V, Y, C[P + 7], M, 4249261313);
|
||||
Y = u(Y, X, W, V, C[P + 8], S, 1770035416);
|
||||
V = u(V, Y, X, W, C[P + 9], Q, 2336552879);
|
||||
W = u(W, V, Y, X, C[P + 10], N, 4294925233);
|
||||
X = u(X, W, V, Y, C[P + 11], M, 2304563134);
|
||||
Y = u(Y, X, W, V, C[P + 12], S, 1804603682);
|
||||
V = u(V, Y, X, W, C[P + 13], Q, 4254626195);
|
||||
W = u(W, V, Y, X, C[P + 14], N, 2792965006);
|
||||
X = u(X, W, V, Y, C[P + 15], M, 1236535329);
|
||||
Y = f(Y, X, W, V, C[P + 1], A, 4129170786);
|
||||
V = f(V, Y, X, W, C[P + 6], z, 3225465664);
|
||||
W = f(W, V, Y, X, C[P + 11], y, 643717713);
|
||||
X = f(X, W, V, Y, C[P + 0], w, 3921069994);
|
||||
Y = f(Y, X, W, V, C[P + 5], A, 3593408605);
|
||||
V = f(V, Y, X, W, C[P + 10], z, 38016083);
|
||||
W = f(W, V, Y, X, C[P + 15], y, 3634488961);
|
||||
X = f(X, W, V, Y, C[P + 4], w, 3889429448);
|
||||
Y = f(Y, X, W, V, C[P + 9], A, 568446438);
|
||||
V = f(V, Y, X, W, C[P + 14], z, 3275163606);
|
||||
W = f(W, V, Y, X, C[P + 3], y, 4107603335);
|
||||
X = f(X, W, V, Y, C[P + 8], w, 1163531501);
|
||||
Y = f(Y, X, W, V, C[P + 13], A, 2850285829);
|
||||
V = f(V, Y, X, W, C[P + 2], z, 4243563512);
|
||||
W = f(W, V, Y, X, C[P + 7], y, 1735328473);
|
||||
X = f(X, W, V, Y, C[P + 12], w, 2368359562);
|
||||
Y = D(Y, X, W, V, C[P + 5], o, 4294588738);
|
||||
V = D(V, Y, X, W, C[P + 8], m, 2272392833);
|
||||
W = D(W, V, Y, X, C[P + 11], l, 1839030562);
|
||||
X = D(X, W, V, Y, C[P + 14], j, 4259657740);
|
||||
Y = D(Y, X, W, V, C[P + 1], o, 2763975236);
|
||||
V = D(V, Y, X, W, C[P + 4], m, 1272893353);
|
||||
W = D(W, V, Y, X, C[P + 7], l, 4139469664);
|
||||
X = D(X, W, V, Y, C[P + 10], j, 3200236656);
|
||||
Y = D(Y, X, W, V, C[P + 13], o, 681279174);
|
||||
V = D(V, Y, X, W, C[P + 0], m, 3936430074);
|
||||
W = D(W, V, Y, X, C[P + 3], l, 3572445317);
|
||||
X = D(X, W, V, Y, C[P + 6], j, 76029189);
|
||||
Y = D(Y, X, W, V, C[P + 9], o, 3654602809);
|
||||
V = D(V, Y, X, W, C[P + 12], m, 3873151461);
|
||||
W = D(W, V, Y, X, C[P + 15], l, 530742520);
|
||||
X = D(X, W, V, Y, C[P + 2], j, 3299628645);
|
||||
Y = t(Y, X, W, V, C[P + 0], U, 4096336452);
|
||||
V = t(V, Y, X, W, C[P + 7], T, 1126891415);
|
||||
W = t(W, V, Y, X, C[P + 14], R, 2878612391);
|
||||
X = t(X, W, V, Y, C[P + 5], O, 4237533241);
|
||||
Y = t(Y, X, W, V, C[P + 12], U, 1700485571);
|
||||
V = t(V, Y, X, W, C[P + 3], T, 2399980690);
|
||||
W = t(W, V, Y, X, C[P + 10], R, 4293915773);
|
||||
X = t(X, W, V, Y, C[P + 1], O, 2240044497);
|
||||
Y = t(Y, X, W, V, C[P + 8], U, 1873313359);
|
||||
V = t(V, Y, X, W, C[P + 15], T, 4264355552);
|
||||
W = t(W, V, Y, X, C[P + 6], R, 2734768916);
|
||||
X = t(X, W, V, Y, C[P + 13], O, 1309151649);
|
||||
Y = t(Y, X, W, V, C[P + 4], U, 4149444226);
|
||||
V = t(V, Y, X, W, C[P + 11], T, 3174756917);
|
||||
W = t(W, V, Y, X, C[P + 2], R, 718787259);
|
||||
X = t(X, W, V, Y, C[P + 9], O, 3951481745);
|
||||
Y = K(Y, h);
|
||||
X = K(X, E);
|
||||
W = K(W, v);
|
||||
V = K(V, g);
|
||||
}
|
||||
let i = B(Y) + B(X) + B(W) + B(V);
|
||||
return i.toLowerCase();
|
||||
};
|
||||
let size = element.dataset["size"] || 80;
|
||||
let email = $value.email || $value || "";
|
||||
let name = $value.name || $value || "";
|
||||
let theme = name
|
||||
.split("")
|
||||
.map(char => char.charCodeAt(0))
|
||||
.reduce((a, b) => a + b, 0)
|
||||
.toString();
|
||||
let themes = [
|
||||
{ color: "27005e", background: "e1d2f6" }, // VIOLET
|
||||
{ color: "5e2700", background: "f3d9c6" }, // ORANGE
|
||||
{ color: "006128", background: "c9f3c6" }, // GREEN
|
||||
{ color: "580061", background: "f2d1f5" }, // FUSCHIA
|
||||
{ color: "00365d", background: "c6e1f3" }, // BLUE
|
||||
{ color: "00075c", background: "d2d5f6" }, // INDIGO
|
||||
{ color: "610038", background: "f5d1e6" }, // PINK
|
||||
{ color: "386100", background: "dcf1bd" }, // LIME
|
||||
{ color: "615800", background: "f1ecba" }, // YELLOW
|
||||
{ color: "610008", background: "f6d2d5" } // RED
|
||||
];
|
||||
|
||||
return "< 1s";
|
||||
})
|
||||
.add('markdown', function ($value, markdown) {
|
||||
return markdown.render($value);
|
||||
})
|
||||
.add('pageCurrent', function ($value, env) {
|
||||
return Math.ceil(parseInt($value || 0) / env.PAGING_LIMIT) + 1;
|
||||
})
|
||||
.add('pageTotal', function ($value, env) {
|
||||
let total = Math.ceil(parseInt($value || 0) / env.PAGING_LIMIT);
|
||||
return (total) ? total : 1;
|
||||
})
|
||||
.add('humanFileSize', function ($value) {
|
||||
if (!$value) {
|
||||
return 0;
|
||||
}
|
||||
name =
|
||||
name
|
||||
.split(" ")
|
||||
.map(function(n) {
|
||||
if (!isNaN(parseFloat(n)) && isFinite(n)) {
|
||||
return "";
|
||||
}
|
||||
|
||||
let thresh = 1000;
|
||||
return n[0];
|
||||
})
|
||||
.join("") || "--";
|
||||
|
||||
if (Math.abs($value) < thresh) {
|
||||
return $value + ' B';
|
||||
}
|
||||
let background = themes[theme[theme.length - 1]]["background"];
|
||||
let color = themes[theme[theme.length - 1]]["color"];
|
||||
|
||||
let units = ['kB','MB','GB','TB','PB','EB','ZB','YB'];
|
||||
let u = -1;
|
||||
let def =
|
||||
"https://ui-avatars.com/api/" +
|
||||
encodeURIComponent(name) +
|
||||
"/" +
|
||||
size +
|
||||
"/" +
|
||||
encodeURIComponent(background) +
|
||||
"/" +
|
||||
encodeURIComponent(color);
|
||||
|
||||
do {
|
||||
$value /= thresh;
|
||||
++u;
|
||||
} while (Math.abs($value) >= thresh && u < units.length - 1);
|
||||
return (
|
||||
"//www.gravatar.com/avatar/" +
|
||||
MD5(email) +
|
||||
".jpg?s=" +
|
||||
size +
|
||||
"&d=" +
|
||||
encodeURIComponent(def)
|
||||
);
|
||||
})
|
||||
.add("selectedCollection", function($value, router) {
|
||||
return $value === router.params.collectionId ? "selected" : "";
|
||||
})
|
||||
.add("selectedDocument", function($value, router) {
|
||||
return $value === router.params.documentId ? "selected" : "";
|
||||
})
|
||||
.add("localeString", function($value) {
|
||||
$value = parseInt($value);
|
||||
return !Number.isNaN($value) ? $value.toLocaleString() : "";
|
||||
})
|
||||
.add("date", function($value, date) {
|
||||
return date.format("Y-m-d", $value);
|
||||
})
|
||||
.add("date-time", function($value, date) {
|
||||
return date.format("Y-m-d H:i", $value);
|
||||
})
|
||||
.add("date-text", function($value, date) {
|
||||
return date.format("d M Y", $value);
|
||||
})
|
||||
.add("ms2hum", function($value) {
|
||||
let temp = $value;
|
||||
const years = Math.floor(temp / 31536000),
|
||||
days = Math.floor((temp %= 31536000) / 86400),
|
||||
hours = Math.floor((temp %= 86400) / 3600),
|
||||
minutes = Math.floor((temp %= 3600) / 60),
|
||||
seconds = temp % 60;
|
||||
|
||||
return $value.toFixed(1) + '<span class="text-size-small unit">' + units[u] + '</span>';
|
||||
})
|
||||
.add('statsTotal', function ($value) {
|
||||
if(!$value) {
|
||||
return 0;
|
||||
}
|
||||
if (days || hours || seconds || minutes) {
|
||||
return (
|
||||
(years ? years + "y " : "") +
|
||||
(days ? days + "d " : "") +
|
||||
(hours ? hours + "h " : "") +
|
||||
(minutes ? minutes + "m " : "") +
|
||||
Number.parseFloat(seconds).toFixed(0) +
|
||||
"s"
|
||||
);
|
||||
}
|
||||
|
||||
$value = abbreviate($value, 1, false, false);
|
||||
return "< 1s";
|
||||
})
|
||||
.add("markdown", function($value, markdown) {
|
||||
return markdown.render($value);
|
||||
})
|
||||
.add("pageCurrent", function($value, env) {
|
||||
return Math.ceil(parseInt($value || 0) / env.PAGING_LIMIT) + 1;
|
||||
})
|
||||
.add("pageTotal", function($value, env) {
|
||||
let total = Math.ceil(parseInt($value || 0) / env.PAGING_LIMIT);
|
||||
return total ? total : 1;
|
||||
})
|
||||
.add("humanFileSize", function($value) {
|
||||
if (!$value) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ($value === '0') ? 'N/A' : $value;
|
||||
});
|
||||
let thresh = 1000;
|
||||
|
||||
if (Math.abs($value) < thresh) {
|
||||
return $value + " B";
|
||||
}
|
||||
|
||||
let units = ["kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
||||
let u = -1;
|
||||
|
||||
do {
|
||||
$value /= thresh;
|
||||
++u;
|
||||
} while (Math.abs($value) >= thresh && u < units.length - 1);
|
||||
|
||||
return (
|
||||
$value.toFixed(1) +
|
||||
'<span class="text-size-small unit">' +
|
||||
units[u] +
|
||||
"</span>"
|
||||
);
|
||||
})
|
||||
.add("statsTotal", function($value) {
|
||||
if (!$value) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$value = abbreviate($value, 1, false, false);
|
||||
|
||||
return $value === "0" ? "N/A" : $value;
|
||||
});
|
||||
|
||||
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);
|
||||
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) {
|
||||
// set places to false to not round
|
||||
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
|
||||
// set places to false to not round
|
||||
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;
|
||||
}
|
||||
if (maxPlaces !== false) {
|
||||
let test = new RegExp("\\.\\d{" + (maxPlaces + 1) + ",}$");
|
||||
if (test.test("" + rounded)) {
|
||||
rounded = rounded.toFixed(maxPlaces);
|
||||
}
|
||||
if(maxPlaces !== false) {
|
||||
let test = new RegExp('\\.\\d{' + (maxPlaces + 1) + ',}$')
|
||||
if(test.test(('' + rounded))) {
|
||||
rounded = rounded.toFixed(maxPlaces)
|
||||
}
|
||||
}
|
||||
if(forcePlaces !== false) {
|
||||
rounded = Number(rounded).toFixed(forcePlaces)
|
||||
}
|
||||
return rounded + abbr
|
||||
}
|
||||
}
|
||||
if (forcePlaces !== false) {
|
||||
rounded = Number(rounded).toFixed(forcePlaces);
|
||||
}
|
||||
return rounded + abbr;
|
||||
}
|
||||
|
||||
+16
-11
@@ -1,19 +1,24 @@
|
||||
// Init
|
||||
|
||||
window.ls.error = function () {
|
||||
return function (error) {
|
||||
console.error('ERROR-APP', error);
|
||||
}
|
||||
window.ls.error = function() {
|
||||
return function(error) {
|
||||
console.error("ERROR-APP", error);
|
||||
};
|
||||
};
|
||||
|
||||
window.addEventListener('error', function (event) {
|
||||
console.error('ERROR-EVENT:', event.error.message, event.error.stack);
|
||||
window.addEventListener("error", function(event) {
|
||||
console.error("ERROR-EVENT:", event.error.message, event.error.stack);
|
||||
});
|
||||
|
||||
document.addEventListener('logout', function () {
|
||||
window.location = '/auth/signin';
|
||||
document.addEventListener("logout", function() {
|
||||
window.location = "/auth/signin";
|
||||
});
|
||||
|
||||
document.addEventListener('http-get-401', function() { /* on error */
|
||||
document.dispatchEvent(new CustomEvent('logout'));
|
||||
}, true);
|
||||
document.addEventListener(
|
||||
"http-get-401",
|
||||
function() {
|
||||
/* on error */
|
||||
document.dispatchEvent(new CustomEvent("logout"));
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
+137
-138
@@ -1,139 +1,138 @@
|
||||
window.ls.router
|
||||
.add('/auth/signin', {
|
||||
template: '/auth/signin?version=' + APP_ENV.VERSION,
|
||||
scope: 'home'
|
||||
})
|
||||
.add('/auth/signup', {
|
||||
template: '/auth/signup?version=' + APP_ENV.VERSION,
|
||||
scope: 'home'
|
||||
})
|
||||
.add('/auth/recovery', {
|
||||
template: '/auth/recovery?version=' + APP_ENV.VERSION,
|
||||
scope: 'home'
|
||||
})
|
||||
.add('/auth/recovery/reset', {
|
||||
template: '/auth/recovery/reset?version=' + APP_ENV.VERSION,
|
||||
scope: 'home'
|
||||
})
|
||||
.add('/auth/confirm', {
|
||||
template: '/auth/confirm?version=' + APP_ENV.VERSION,
|
||||
scope: 'home'
|
||||
})
|
||||
.add('/auth/join', {
|
||||
template: '/auth/join?version=' + APP_ENV.VERSION,
|
||||
scope: 'home'
|
||||
})
|
||||
.add('/console', {
|
||||
template: '/console?version=' + APP_ENV.VERSION,
|
||||
scope: 'console'
|
||||
})
|
||||
.add('/console/account', {
|
||||
template: '/console/account?version=' + APP_ENV.VERSION,
|
||||
scope: 'console'
|
||||
})
|
||||
.add('/console/account/:tab', {
|
||||
template: '/console/account?version=' + APP_ENV.VERSION,
|
||||
scope: 'console'
|
||||
})
|
||||
.add('/console/home', {
|
||||
template: '/console/home?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/home/:tab', {
|
||||
template: '/console/home?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/platforms/:platform', {
|
||||
template: function (window) {
|
||||
return window.location.pathname + '?version=' + APP_ENV.VERSION;
|
||||
},
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/notifications', {
|
||||
template: '/console/notifications?version=' + APP_ENV.VERSION,
|
||||
scope: 'console'
|
||||
})
|
||||
.add('/console/settings', {
|
||||
template: '/console/settings?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/settings/:tab', {
|
||||
template: '/console/settings?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/webhooks', {
|
||||
template: '/console/webhooks?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/webhooks/:tab', {
|
||||
template: '/console/webhooks?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/keys', {
|
||||
template: '/console/keys?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/keys/:tab', {
|
||||
template: '/console/keys?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/tasks', {
|
||||
template: '/console/tasks?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/tasks/:tab', {
|
||||
template: '/console/tasks?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/database', {
|
||||
template: '/console/database?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/database/collection', {
|
||||
template: '/console/database/collection?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/storage', {
|
||||
template: '/console/storage?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/storage/:tab', {
|
||||
template: '/console/storage?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/users', {
|
||||
template: '/console/users?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/users/view', {
|
||||
template: '/console/users/view?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/users/view/:tab', {
|
||||
template: '/console/users/view?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
.add('/console/users/:tab', {
|
||||
template: '/console/users?version=' + APP_ENV.VERSION,
|
||||
scope: 'console',
|
||||
project: true
|
||||
})
|
||||
;
|
||||
.add("/auth/signin", {
|
||||
template: "/auth/signin?version=" + APP_ENV.VERSION,
|
||||
scope: "home"
|
||||
})
|
||||
.add("/auth/signup", {
|
||||
template: "/auth/signup?version=" + APP_ENV.VERSION,
|
||||
scope: "home"
|
||||
})
|
||||
.add("/auth/recovery", {
|
||||
template: "/auth/recovery?version=" + APP_ENV.VERSION,
|
||||
scope: "home"
|
||||
})
|
||||
.add("/auth/recovery/reset", {
|
||||
template: "/auth/recovery/reset?version=" + APP_ENV.VERSION,
|
||||
scope: "home"
|
||||
})
|
||||
.add("/auth/confirm", {
|
||||
template: "/auth/confirm?version=" + APP_ENV.VERSION,
|
||||
scope: "home"
|
||||
})
|
||||
.add("/auth/join", {
|
||||
template: "/auth/join?version=" + APP_ENV.VERSION,
|
||||
scope: "home"
|
||||
})
|
||||
.add("/console", {
|
||||
template: "/console?version=" + APP_ENV.VERSION,
|
||||
scope: "console"
|
||||
})
|
||||
.add("/console/account", {
|
||||
template: "/console/account?version=" + APP_ENV.VERSION,
|
||||
scope: "console"
|
||||
})
|
||||
.add("/console/account/:tab", {
|
||||
template: "/console/account?version=" + APP_ENV.VERSION,
|
||||
scope: "console"
|
||||
})
|
||||
.add("/console/home", {
|
||||
template: "/console/home?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/home/:tab", {
|
||||
template: "/console/home?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/platforms/:platform", {
|
||||
template: function(window) {
|
||||
return window.location.pathname + "?version=" + APP_ENV.VERSION;
|
||||
},
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/notifications", {
|
||||
template: "/console/notifications?version=" + APP_ENV.VERSION,
|
||||
scope: "console"
|
||||
})
|
||||
.add("/console/settings", {
|
||||
template: "/console/settings?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/settings/:tab", {
|
||||
template: "/console/settings?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/webhooks", {
|
||||
template: "/console/webhooks?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/webhooks/:tab", {
|
||||
template: "/console/webhooks?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/keys", {
|
||||
template: "/console/keys?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/keys/:tab", {
|
||||
template: "/console/keys?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/tasks", {
|
||||
template: "/console/tasks?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/tasks/:tab", {
|
||||
template: "/console/tasks?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/database", {
|
||||
template: "/console/database?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/database/collection", {
|
||||
template: "/console/database/collection?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/storage", {
|
||||
template: "/console/storage?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/storage/:tab", {
|
||||
template: "/console/storage?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/users", {
|
||||
template: "/console/users?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/users/view", {
|
||||
template: "/console/users/view?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/users/view/:tab", {
|
||||
template: "/console/users/view?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
})
|
||||
.add("/console/users/:tab", {
|
||||
template: "/console/users?version=" + APP_ENV.VERSION,
|
||||
scope: "console",
|
||||
project: true
|
||||
});
|
||||
|
||||
@@ -1,29 +1,27 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
'selector': 'data-analytics-event',
|
||||
'controller': function (element) {
|
||||
var action = element.getAttribute('data-event-action') || 'click';
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-analytics-event",
|
||||
controller: function(element) {
|
||||
var action = element.getAttribute("data-event-action") || "click";
|
||||
|
||||
element.addEventListener(action, function () {
|
||||
var category = element.getAttribute('data-event-category') || 'undefined';
|
||||
var label = element.getAttribute('data-event-label') || 'undefined';
|
||||
element.addEventListener(action, function() {
|
||||
var category =
|
||||
element.getAttribute("data-event-category") || "undefined";
|
||||
var label = element.getAttribute("data-event-label") || "undefined";
|
||||
|
||||
if(!ga) {
|
||||
console.error('Google Analytics ga object is not available');
|
||||
}
|
||||
|
||||
ga('send', {
|
||||
hitType: 'event',
|
||||
eventCategory: category,
|
||||
eventAction: action,
|
||||
eventLabel: label
|
||||
});
|
||||
});
|
||||
}
|
||||
if (!ga) {
|
||||
console.error("Google Analytics ga object is not available");
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
ga("send", {
|
||||
hitType: "event",
|
||||
eventCategory: category,
|
||||
eventAction: action,
|
||||
eventLabel: label
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,28 +1,25 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
'selector': 'data-analytics-pageview',
|
||||
'controller': function (window, router) {
|
||||
if(!ga) {
|
||||
console.error('Google Analytics ga object is not available');
|
||||
}
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-analytics-pageview",
|
||||
controller: function(window, router) {
|
||||
if (!ga) {
|
||||
console.error("Google Analytics ga object is not available");
|
||||
}
|
||||
|
||||
var company = router.params['company'] || null;
|
||||
var company = router.params["company"] || null;
|
||||
|
||||
if(!company) {
|
||||
//return;
|
||||
}
|
||||
if (!company) {
|
||||
//return;
|
||||
}
|
||||
|
||||
ga('set', 'page', window.location.pathname);
|
||||
ga("set", "page", window.location.pathname);
|
||||
|
||||
ga('set', 'dimension1', company);
|
||||
//ga('set', 'dimension2', '');
|
||||
ga("set", "dimension1", company);
|
||||
//ga('set', 'dimension2', '');
|
||||
|
||||
ga('send', 'pageview');
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
ga("send", "pageview");
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,90 +1,95 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(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');
|
||||
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');
|
||||
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;
|
||||
if (icon) {
|
||||
var iconElement = document.createElement("i");
|
||||
iconElement.className = icon;
|
||||
|
||||
button.insertBefore(iconElement, button.firstChild);
|
||||
}
|
||||
button.insertBefore(iconElement, button.firstChild);
|
||||
}
|
||||
|
||||
if(target) {
|
||||
target = document.getElementById(target);
|
||||
}
|
||||
if (target) {
|
||||
target = document.getElementById(target);
|
||||
}
|
||||
|
||||
button.addEventListener('click', function () {
|
||||
var clone = document.createElement(element.tagName);
|
||||
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();
|
||||
}
|
||||
}
|
||||
if (element.name) {
|
||||
clone.name = element.name;
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
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);
|
||||
|
||||
@@ -1,74 +1,70 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(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);
|
||||
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");
|
||||
|
||||
element.parentNode.appendChild(div);
|
||||
div.appendChild(pre);
|
||||
div.appendChild(copy);
|
||||
pre.appendChild(code);
|
||||
|
||||
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');
|
||||
element.parentNode.appendChild(div);
|
||||
|
||||
if (document.selection) {
|
||||
document.selection.empty();
|
||||
}
|
||||
else if (window.getSelection) {
|
||||
window.getSelection().removeAllRanges();
|
||||
}
|
||||
div.className = "ide";
|
||||
pre.className = "line-numbers";
|
||||
code.className = "prism language-" + lang;
|
||||
copy.className = "icon-docs copy";
|
||||
|
||||
element.disabled = true;
|
||||
|
||||
alerts.add({text: 'Copied to clipboard', class: ''}, 3000);
|
||||
});
|
||||
copy.title = "Copy to Clipboard";
|
||||
|
||||
let check = function() {
|
||||
if(!element.value) {
|
||||
return;
|
||||
}
|
||||
copy.addEventListener("click", function() {
|
||||
element.disabled = false;
|
||||
|
||||
let value = null;
|
||||
element.focus();
|
||||
element.select();
|
||||
|
||||
try {
|
||||
value = JSON.stringify(JSON.parse(element.value), null, 4);
|
||||
}
|
||||
catch(error) {
|
||||
value = element.value;
|
||||
}
|
||||
document.execCommand("Copy");
|
||||
|
||||
code.innerHTML = value;
|
||||
|
||||
Prism.highlightElement(code);
|
||||
|
||||
div.scrollTop = 0;
|
||||
}
|
||||
|
||||
element.addEventListener('change', check);
|
||||
|
||||
check();
|
||||
}
|
||||
if (document.selection) {
|
||||
document.selection.empty();
|
||||
} else if (window.getSelection) {
|
||||
window.getSelection().removeAllRanges();
|
||||
}
|
||||
);
|
||||
})(window);
|
||||
|
||||
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);
|
||||
|
||||
@@ -1,45 +1,42 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(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');
|
||||
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';
|
||||
picker.type = "color";
|
||||
preview.className = "color-preview";
|
||||
|
||||
preview.appendChild(picker);
|
||||
preview.appendChild(picker);
|
||||
|
||||
picker.addEventListener('change', syncA);
|
||||
picker.addEventListener('input', syncA);
|
||||
element.addEventListener('input', update);
|
||||
element.addEventListener('change', update);
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
function syncA() {
|
||||
element.value = picker.value;
|
||||
update();
|
||||
}
|
||||
|
||||
function syncB() {
|
||||
picker.value = element.value;
|
||||
}
|
||||
|
||||
element.parentNode.insertBefore(preview, element);
|
||||
|
||||
update();
|
||||
syncB();
|
||||
}
|
||||
function update() {
|
||||
if (element.validity.valid) {
|
||||
preview.style.background = element.value;
|
||||
syncB();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
})(window);
|
||||
function syncA() {
|
||||
element.value = picker.value;
|
||||
update();
|
||||
}
|
||||
|
||||
function syncB() {
|
||||
picker.value = element.value;
|
||||
}
|
||||
|
||||
element.parentNode.insertBefore(preview, element);
|
||||
|
||||
update();
|
||||
syncB();
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,41 +1,37 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-copy',
|
||||
controller: function(element, alerts, document, window) {
|
||||
var button = window.document.createElement('i');
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-copy",
|
||||
controller: function(element, alerts, document, window) {
|
||||
var button = window.document.createElement("i");
|
||||
|
||||
button.type = 'button';
|
||||
button.className = 'icon-docs note copy';
|
||||
button.style.cursor = 'pointer';
|
||||
button.type = "button";
|
||||
button.className = "icon-docs note copy";
|
||||
button.style.cursor = "pointer";
|
||||
|
||||
element.parentNode.insertBefore(button, element.nextSibling);
|
||||
element.parentNode.insertBefore(button, element.nextSibling);
|
||||
|
||||
var copy = function(event) {
|
||||
element.disabled = false;
|
||||
|
||||
element.focus();
|
||||
element.select();
|
||||
|
||||
document.execCommand('Copy');
|
||||
var copy = function(event) {
|
||||
element.disabled = false;
|
||||
|
||||
if (document.selection) {
|
||||
document.selection.empty();
|
||||
}
|
||||
else if (window.getSelection) {
|
||||
window.getSelection().removeAllRanges();
|
||||
}
|
||||
element.focus();
|
||||
element.select();
|
||||
|
||||
element.disabled = true;
|
||||
|
||||
alerts.add({text: 'Copied to clipboard', class: ''}, 3000);
|
||||
};
|
||||
document.execCommand("Copy");
|
||||
|
||||
button.addEventListener('click', copy);
|
||||
}
|
||||
if (document.selection) {
|
||||
document.selection.empty();
|
||||
} else if (window.getSelection) {
|
||||
window.getSelection().removeAllRanges();
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
element.disabled = true;
|
||||
|
||||
alerts.add({ text: "Copied to clipboard", class: "" }, 3000);
|
||||
};
|
||||
|
||||
button.addEventListener("click", copy);
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,161 +1,169 @@
|
||||
(function (window) {
|
||||
//"use strict";
|
||||
(function(window) {
|
||||
//"use strict";
|
||||
|
||||
window.ls.container.get('view').add({
|
||||
selector: 'data-forms-filter',
|
||||
controller: function(document, container, expression, element, form, di) {
|
||||
let name = element.dataset['formsFilter'] || '';
|
||||
let events = element.dataset['event'] || '';
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-filter",
|
||||
controller: function(document, container, expression, element, form, di) {
|
||||
let name = element.dataset["formsFilter"] || "";
|
||||
let events = element.dataset["event"] || "";
|
||||
|
||||
let serialize = function(obj, prefix) {
|
||||
let str = [],
|
||||
p;
|
||||
for (p in obj) {
|
||||
if (obj.hasOwnProperty(p)) {
|
||||
let k = prefix ? prefix + "[" + p + "]" : p,
|
||||
v = obj[p];
|
||||
let serialize = function(obj, prefix) {
|
||||
let str = [],
|
||||
p;
|
||||
for (p in obj) {
|
||||
if (obj.hasOwnProperty(p)) {
|
||||
let k = prefix ? prefix + "[" + p + "]" : p,
|
||||
v = obj[p];
|
||||
|
||||
if(v === '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
str.push((v !== null && typeof v === "object") ?
|
||||
serialize(v, k) :
|
||||
encodeURIComponent(k) + "=" + encodeURIComponent(v));
|
||||
}
|
||||
}
|
||||
return str.join("&");
|
||||
};
|
||||
|
||||
let parse = function (filter) {
|
||||
if(filter === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
let operatorsMap = ["!=", ">=", "<=", "=", ">", "<"];
|
||||
|
||||
let operator = null;
|
||||
|
||||
for (let key = 0; key < operatorsMap.length; key++) {
|
||||
if(filter.indexOf(operatorsMap[key]) > -1) {
|
||||
operator = operatorsMap[key];
|
||||
}
|
||||
}
|
||||
|
||||
if (operator === null) {
|
||||
throw new Error("Invalid operator");
|
||||
}
|
||||
|
||||
filter = filter.split(operator);
|
||||
|
||||
if (filter.length !== 2) {
|
||||
throw new Error("Invalid filter expression");
|
||||
}
|
||||
|
||||
return {
|
||||
"key": filter[0],
|
||||
"value": filter[1],
|
||||
"operator": operator
|
||||
};
|
||||
};
|
||||
|
||||
let flatten = function (params) {
|
||||
let list = {};
|
||||
|
||||
for (let key in params) {
|
||||
if (params.hasOwnProperty(key)) {
|
||||
if(key !== 'filters') {
|
||||
list[key] = params[key];
|
||||
}
|
||||
else {
|
||||
for (let i = 0; i < params[key].length; i++) {
|
||||
let filter = parse(params[key][i]);
|
||||
|
||||
if (null === filter) {
|
||||
continue;
|
||||
}
|
||||
|
||||
list['filters-' + filter.key] = params[key][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
};
|
||||
|
||||
let apply = function (params) {
|
||||
|
||||
let cached = container.get(name);
|
||||
cached = (cached) ? cached.params : [];
|
||||
|
||||
params = Object.assign(cached, params);
|
||||
|
||||
container.set(name, {
|
||||
name: name,
|
||||
params: params,
|
||||
query: serialize(params),
|
||||
forward: parseInt(params.offset) + parseInt(params.limit),
|
||||
backward: parseInt(params.offset) - parseInt(params.limit),
|
||||
keys: flatten(params)
|
||||
}, true, name);
|
||||
|
||||
document.dispatchEvent(new CustomEvent(name + '-changed', {
|
||||
bubbles: false,
|
||||
cancelable: true
|
||||
}));
|
||||
};
|
||||
|
||||
switch (element.tagName) {
|
||||
case 'INPUT':
|
||||
break;
|
||||
case 'TEXTAREA':
|
||||
break;
|
||||
case 'BUTTON':
|
||||
element.addEventListener('click', function () {
|
||||
apply(JSON.parse(expression.parse(element.dataset['params'] || '{}')));
|
||||
});
|
||||
break;
|
||||
case 'FORM':
|
||||
element.addEventListener('input', function () {
|
||||
apply(form.toJson(element));
|
||||
});
|
||||
|
||||
element.addEventListener('change', function () {
|
||||
apply(form.toJson(element));
|
||||
});
|
||||
|
||||
element.addEventListener('reset', function () {
|
||||
setTimeout(function () {
|
||||
apply(form.toJson(element));
|
||||
|
||||
}, 0);
|
||||
|
||||
});
|
||||
|
||||
events = events.trim().split(',');
|
||||
|
||||
for (let y = 0; y < events.length; y++) {
|
||||
|
||||
if(events[y] === 'init') {
|
||||
element.addEventListener('rendered', function () {
|
||||
apply(form.toJson(element));
|
||||
}, {once: true});
|
||||
}
|
||||
else {
|
||||
//document.addEventListener(events[y], function (e) {
|
||||
// e.target.removeEventListener(e.type, arguments.callee);
|
||||
// apply(form.toJson(element));
|
||||
//});
|
||||
}
|
||||
|
||||
element.setAttribute('data-event', 'none'); // Avoid re-attaching event
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (v === "") {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
})(window);
|
||||
str.push(
|
||||
v !== null && typeof v === "object"
|
||||
? serialize(v, k)
|
||||
: encodeURIComponent(k) + "=" + encodeURIComponent(v)
|
||||
);
|
||||
}
|
||||
}
|
||||
return str.join("&");
|
||||
};
|
||||
|
||||
let parse = function(filter) {
|
||||
if (filter === "") {
|
||||
return null;
|
||||
}
|
||||
|
||||
let operatorsMap = ["!=", ">=", "<=", "=", ">", "<"];
|
||||
|
||||
let operator = null;
|
||||
|
||||
for (let key = 0; key < operatorsMap.length; key++) {
|
||||
if (filter.indexOf(operatorsMap[key]) > -1) {
|
||||
operator = operatorsMap[key];
|
||||
}
|
||||
}
|
||||
|
||||
if (operator === null) {
|
||||
throw new Error("Invalid operator");
|
||||
}
|
||||
|
||||
filter = filter.split(operator);
|
||||
|
||||
if (filter.length !== 2) {
|
||||
throw new Error("Invalid filter expression");
|
||||
}
|
||||
|
||||
return {
|
||||
key: filter[0],
|
||||
value: filter[1],
|
||||
operator: operator
|
||||
};
|
||||
};
|
||||
|
||||
let flatten = function(params) {
|
||||
let list = {};
|
||||
|
||||
for (let key in params) {
|
||||
if (params.hasOwnProperty(key)) {
|
||||
if (key !== "filters") {
|
||||
list[key] = params[key];
|
||||
} else {
|
||||
for (let i = 0; i < params[key].length; i++) {
|
||||
let filter = parse(params[key][i]);
|
||||
|
||||
if (null === filter) {
|
||||
continue;
|
||||
}
|
||||
|
||||
list["filters-" + filter.key] = params[key][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return list;
|
||||
};
|
||||
|
||||
let apply = function(params) {
|
||||
let cached = container.get(name);
|
||||
cached = cached ? cached.params : [];
|
||||
|
||||
params = Object.assign(cached, params);
|
||||
|
||||
container.set(
|
||||
name,
|
||||
{
|
||||
name: name,
|
||||
params: params,
|
||||
query: serialize(params),
|
||||
forward: parseInt(params.offset) + parseInt(params.limit),
|
||||
backward: parseInt(params.offset) - parseInt(params.limit),
|
||||
keys: flatten(params)
|
||||
},
|
||||
true,
|
||||
name
|
||||
);
|
||||
|
||||
document.dispatchEvent(
|
||||
new CustomEvent(name + "-changed", {
|
||||
bubbles: false,
|
||||
cancelable: true
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
switch (element.tagName) {
|
||||
case "INPUT":
|
||||
break;
|
||||
case "TEXTAREA":
|
||||
break;
|
||||
case "BUTTON":
|
||||
element.addEventListener("click", function() {
|
||||
apply(
|
||||
JSON.parse(expression.parse(element.dataset["params"] || "{}"))
|
||||
);
|
||||
});
|
||||
break;
|
||||
case "FORM":
|
||||
element.addEventListener("input", function() {
|
||||
apply(form.toJson(element));
|
||||
});
|
||||
|
||||
element.addEventListener("change", function() {
|
||||
apply(form.toJson(element));
|
||||
});
|
||||
|
||||
element.addEventListener("reset", function() {
|
||||
setTimeout(function() {
|
||||
apply(form.toJson(element));
|
||||
}, 0);
|
||||
});
|
||||
|
||||
events = events.trim().split(",");
|
||||
|
||||
for (let y = 0; y < events.length; y++) {
|
||||
if (events[y] === "init") {
|
||||
element.addEventListener(
|
||||
"rendered",
|
||||
function() {
|
||||
apply(form.toJson(element));
|
||||
},
|
||||
{ once: true }
|
||||
);
|
||||
} else {
|
||||
//document.addEventListener(events[y], function (e) {
|
||||
// e.target.removeEventListener(e.type, arguments.callee);
|
||||
// apply(form.toJson(element));
|
||||
//});
|
||||
}
|
||||
|
||||
element.setAttribute("data-event", "none"); // Avoid re-attaching event
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,22 +1,19 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-parent-down',
|
||||
controller: function(element) {
|
||||
var target = element.dataset['target'] || null;
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-parent-down",
|
||||
controller: function(element) {
|
||||
var target = element.dataset["target"] || null;
|
||||
|
||||
target = (target) ? element.closest(target) : element.parentNode;
|
||||
target = target ? element.closest(target) : element.parentNode;
|
||||
|
||||
element.addEventListener('click', function () {
|
||||
if(target.nextElementSibling) {
|
||||
target.parentNode.insertBefore(target.nextElementSibling, target);
|
||||
element.scrollIntoView({behavior: 'smooth'});
|
||||
}
|
||||
});
|
||||
}
|
||||
element.addEventListener("click", function() {
|
||||
if (target.nextElementSibling) {
|
||||
target.parentNode.insertBefore(target.nextElementSibling, target);
|
||||
element.scrollIntoView({ behavior: "smooth" });
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
});
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,20 +1,17 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-parent-remove',
|
||||
controller: function(element) {
|
||||
var target = element.dataset['target'] || null;
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-parent-remove",
|
||||
controller: function(element) {
|
||||
var target = element.dataset["target"] || null;
|
||||
|
||||
target = (target) ? element.closest(target) : element.parentNode;
|
||||
target = target ? element.closest(target) : element.parentNode;
|
||||
|
||||
element.addEventListener('click', function () {
|
||||
target.parentNode.removeChild(target);
|
||||
element.scrollIntoView({behavior: 'smooth'});
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
element.addEventListener("click", function() {
|
||||
target.parentNode.removeChild(target);
|
||||
element.scrollIntoView({ behavior: "smooth" });
|
||||
});
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,22 +1,19 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-parent-up',
|
||||
controller: function(element) {
|
||||
var target = element.dataset['target'] || null;
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-parent-up",
|
||||
controller: function(element) {
|
||||
var target = element.dataset["target"] || null;
|
||||
|
||||
target = (target) ? element.closest(target) : element.parentNode;
|
||||
target = target ? element.closest(target) : element.parentNode;
|
||||
|
||||
element.addEventListener('click', function () {
|
||||
if(target.previousElementSibling) {
|
||||
target.parentNode.insertBefore(target, target.previousElementSibling);
|
||||
element.scrollIntoView({behavior: 'smooth'});
|
||||
}
|
||||
});
|
||||
}
|
||||
element.addEventListener("click", function() {
|
||||
if (target.previousElementSibling) {
|
||||
target.parentNode.insertBefore(target, target.previousElementSibling);
|
||||
element.scrollIntoView({ behavior: "smooth" });
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
});
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,68 +1,60 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-password-meter',
|
||||
controller: function(element, window) {
|
||||
var calc = function(password) {
|
||||
var score = 0;
|
||||
if (!password)
|
||||
return score;
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-password-meter",
|
||||
controller: function(element, window) {
|
||||
var calc = function(password) {
|
||||
var score = 0;
|
||||
if (!password) return score;
|
||||
|
||||
// award every unique letter until 5 repetitions
|
||||
var letters = new window.Object();
|
||||
for (var i=0; i<password.length; i++) {
|
||||
letters[password[i]] = (letters[password[i]] || 0) + 1;
|
||||
score += 5.0 / letters[password[i]];
|
||||
}
|
||||
|
||||
// bonus points for mixing it up
|
||||
var variations = {
|
||||
digits: /\d/.test(password),
|
||||
lower: /[a-z]/.test(password),
|
||||
upper: /[A-Z]/.test(password),
|
||||
nonWords: /\W/.test(password)
|
||||
};
|
||||
|
||||
var variationCount = 0;
|
||||
|
||||
for (var check in variations) {
|
||||
if (variations.hasOwnProperty(check)) {
|
||||
variationCount += (variations[check] === true) ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
score += (variationCount - 1) * 10;
|
||||
|
||||
return parseInt(score);
|
||||
};
|
||||
|
||||
var callback = function() {
|
||||
var score = calc(this.value);
|
||||
|
||||
if('' === this.value)
|
||||
return meter.className = 'password-meter';
|
||||
if (score > 60)
|
||||
return meter.className = 'password-meter strong';
|
||||
if (score > 30)
|
||||
return meter.className = 'password-meter medium';
|
||||
if (score >= 0)
|
||||
return meter.className = 'password-meter weak';
|
||||
};
|
||||
|
||||
var meter = window.document.createElement('div');
|
||||
|
||||
meter.className = 'password-meter';
|
||||
|
||||
element.parentNode.insertBefore(meter, element.nextSibling);
|
||||
|
||||
element.addEventListener('change', callback);
|
||||
element.addEventListener('keypress', callback);
|
||||
element.addEventListener('keyup', callback);
|
||||
element.addEventListener('keydown', callback);
|
||||
}
|
||||
// award every unique letter until 5 repetitions
|
||||
var letters = new window.Object();
|
||||
for (var i = 0; i < password.length; i++) {
|
||||
letters[password[i]] = (letters[password[i]] || 0) + 1;
|
||||
score += 5.0 / letters[password[i]];
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
// bonus points for mixing it up
|
||||
var variations = {
|
||||
digits: /\d/.test(password),
|
||||
lower: /[a-z]/.test(password),
|
||||
upper: /[A-Z]/.test(password),
|
||||
nonWords: /\W/.test(password)
|
||||
};
|
||||
|
||||
var variationCount = 0;
|
||||
|
||||
for (var check in variations) {
|
||||
if (variations.hasOwnProperty(check)) {
|
||||
variationCount += variations[check] === true ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
score += (variationCount - 1) * 10;
|
||||
|
||||
return parseInt(score);
|
||||
};
|
||||
|
||||
var callback = function() {
|
||||
var score = calc(this.value);
|
||||
|
||||
if ("" === this.value) return (meter.className = "password-meter");
|
||||
if (score > 60) return (meter.className = "password-meter strong");
|
||||
if (score > 30) return (meter.className = "password-meter medium");
|
||||
if (score >= 0) return (meter.className = "password-meter weak");
|
||||
};
|
||||
|
||||
var meter = window.document.createElement("div");
|
||||
|
||||
meter.className = "password-meter";
|
||||
|
||||
element.parentNode.insertBefore(meter, element.nextSibling);
|
||||
|
||||
element.addEventListener("change", callback);
|
||||
element.addEventListener("keypress", callback);
|
||||
element.addEventListener("keyup", callback);
|
||||
element.addEventListener("keydown", callback);
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
+111
-102
@@ -1,108 +1,117 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add({
|
||||
selector: 'data-forms-pell',
|
||||
controller: function(element, window, document, markdown) {
|
||||
var div = document.createElement('div');
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-pell",
|
||||
controller: function(element, window, document, markdown) {
|
||||
var div = document.createElement("div");
|
||||
|
||||
element.className = 'pell hide';
|
||||
div.className = 'input pell';
|
||||
element.parentNode.insertBefore(div, element);
|
||||
element.tabIndex = -1;
|
||||
element.className = "pell hide";
|
||||
div.className = "input pell";
|
||||
element.parentNode.insertBefore(div, element);
|
||||
element.tabIndex = -1;
|
||||
|
||||
var turndownService = new TurndownService();
|
||||
var turndownService = new TurndownService();
|
||||
|
||||
turndownService.addRule('underline', {
|
||||
filter: ['u'],
|
||||
replacement: function (content) {
|
||||
return '__' + content + '__'
|
||||
}
|
||||
});
|
||||
|
||||
var editor = window.pell.init({
|
||||
element: div,
|
||||
onChange: function onChange(html) {
|
||||
element.value = turndownService.turndown(html); // Change HTML to Markdown
|
||||
},
|
||||
defaultParagraphSeparator: 'p',
|
||||
actions: [
|
||||
{
|
||||
name: 'bold',
|
||||
icon: '<i class="icon-bold"></i>'
|
||||
},
|
||||
{
|
||||
name: 'underline',
|
||||
icon: '<i class="icon-underline"></i>'
|
||||
},
|
||||
{
|
||||
name: 'italic',
|
||||
icon: '<i class="icon-italic"></i>'
|
||||
},
|
||||
{
|
||||
name: 'olist',
|
||||
icon: '<i class="icon-list-numbered"></i>'
|
||||
},
|
||||
{
|
||||
name: 'ulist',
|
||||
icon: '<i class="icon-list-bullet"></i>'
|
||||
},
|
||||
{
|
||||
name: 'link',
|
||||
icon: '<i class="icon-link"></i>'
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
element.addEventListener('change', function () {
|
||||
editor.content.innerHTML = markdown.render(element.value); // Change Markdown to HTML (mainly for editing purpose)
|
||||
});
|
||||
|
||||
editor.content.setAttribute('placeholder', element.placeholder);
|
||||
editor.content.innerHTML = markdown.render(element.value);
|
||||
editor.content.tabIndex = 0;
|
||||
|
||||
editor.content.onkeydown = function preventTab(event) {
|
||||
if (event.which === 9) {
|
||||
event.preventDefault();
|
||||
|
||||
// Inspired by: https://stackoverflow.com/a/35173443/2299554
|
||||
//add all elements we want to include in our selection
|
||||
if (document.activeElement) {
|
||||
var focussable = Array.prototype.filter.call(document.querySelectorAll('a:not([disabled]), button:not([disabled]), select:not([disabled]), input[type=text]:not([disabled]), input[type=checkbox]:not([disabled]), [tabindex]:not([disabled]):not([tabindex="-1"])'),
|
||||
function (element) {
|
||||
//check for visibility while always include the current activeElement
|
||||
return element.offsetWidth > 0 || element.offsetHeight > 0 || element === document.activeElement
|
||||
});
|
||||
|
||||
var index = focussable.indexOf(document.activeElement);
|
||||
|
||||
if(index > -1) {
|
||||
if(event.shiftKey) { // Move up
|
||||
var prevElement = focussable[index - 1] || focussable[focussable.length - 1];
|
||||
prevElement.focus();
|
||||
}
|
||||
else { // Move down
|
||||
var nextElement = focussable[index + 1] || focussable[0];
|
||||
nextElement.focus();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var clean = function (e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
|
||||
var clipboardData = e.clipboardData || window.clipboardData;
|
||||
window.pell.exec('insertText', clipboardData.getData('Text'));
|
||||
return true;
|
||||
};
|
||||
|
||||
div.addEventListener('paste', clean);
|
||||
div.addEventListener('drop', clean);
|
||||
turndownService.addRule("underline", {
|
||||
filter: ["u"],
|
||||
replacement: function(content) {
|
||||
return "__" + content + "__";
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
})(window);
|
||||
var editor = window.pell.init({
|
||||
element: div,
|
||||
onChange: function onChange(html) {
|
||||
element.value = turndownService.turndown(html); // Change HTML to Markdown
|
||||
},
|
||||
defaultParagraphSeparator: "p",
|
||||
actions: [
|
||||
{
|
||||
name: "bold",
|
||||
icon: '<i class="icon-bold"></i>'
|
||||
},
|
||||
{
|
||||
name: "underline",
|
||||
icon: '<i class="icon-underline"></i>'
|
||||
},
|
||||
{
|
||||
name: "italic",
|
||||
icon: '<i class="icon-italic"></i>'
|
||||
},
|
||||
{
|
||||
name: "olist",
|
||||
icon: '<i class="icon-list-numbered"></i>'
|
||||
},
|
||||
{
|
||||
name: "ulist",
|
||||
icon: '<i class="icon-list-bullet"></i>'
|
||||
},
|
||||
{
|
||||
name: "link",
|
||||
icon: '<i class="icon-link"></i>'
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
element.addEventListener("change", function() {
|
||||
editor.content.innerHTML = markdown.render(element.value); // Change Markdown to HTML (mainly for editing purpose)
|
||||
});
|
||||
|
||||
editor.content.setAttribute("placeholder", element.placeholder);
|
||||
editor.content.innerHTML = markdown.render(element.value);
|
||||
editor.content.tabIndex = 0;
|
||||
|
||||
editor.content.onkeydown = function preventTab(event) {
|
||||
if (event.which === 9) {
|
||||
event.preventDefault();
|
||||
|
||||
// Inspired by: https://stackoverflow.com/a/35173443/2299554
|
||||
//add all elements we want to include in our selection
|
||||
if (document.activeElement) {
|
||||
var focussable = Array.prototype.filter.call(
|
||||
document.querySelectorAll(
|
||||
'a:not([disabled]), button:not([disabled]), select:not([disabled]), input[type=text]:not([disabled]), input[type=checkbox]:not([disabled]), [tabindex]:not([disabled]):not([tabindex="-1"])'
|
||||
),
|
||||
function(element) {
|
||||
//check for visibility while always include the current activeElement
|
||||
return (
|
||||
element.offsetWidth > 0 ||
|
||||
element.offsetHeight > 0 ||
|
||||
element === document.activeElement
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
var index = focussable.indexOf(document.activeElement);
|
||||
|
||||
if (index > -1) {
|
||||
if (event.shiftKey) {
|
||||
// Move up
|
||||
var prevElement =
|
||||
focussable[index - 1] || focussable[focussable.length - 1];
|
||||
prevElement.focus();
|
||||
} else {
|
||||
// Move down
|
||||
var nextElement = focussable[index + 1] || focussable[0];
|
||||
nextElement.focus();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var clean = function(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
|
||||
var clipboardData = e.clipboardData || window.clipboardData;
|
||||
window.pell.exec("insertText", clipboardData.getData("Text"));
|
||||
return true;
|
||||
};
|
||||
|
||||
div.addEventListener("paste", clean);
|
||||
div.addEventListener("drop", clean);
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-remove',
|
||||
controller: function(element) {
|
||||
Array.prototype.slice.call(element.querySelectorAll('[data-remove]')).map(function(obj) { // Add remove button
|
||||
obj.addEventListener('click', function () {
|
||||
element.parentNode.removeChild(element);
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-remove",
|
||||
controller: function(element) {
|
||||
Array.prototype.slice
|
||||
.call(element.querySelectorAll("[data-remove]"))
|
||||
.map(function(obj) {
|
||||
// Add remove button
|
||||
obj.addEventListener("click", function() {
|
||||
element.parentNode.removeChild(element);
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,33 +1,30 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-switch',
|
||||
controller: function(element) {
|
||||
let input = window.document.createElement('input');
|
||||
input.type = 'checkbox';
|
||||
input.className = 'switch';
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-switch",
|
||||
controller: function(element) {
|
||||
let input = window.document.createElement("input");
|
||||
input.type = "checkbox";
|
||||
input.className = "switch";
|
||||
|
||||
let syncA = function () {
|
||||
element.value = (input.checked) ? 'on' : 'off';
|
||||
};
|
||||
let syncA = function() {
|
||||
element.value = input.checked ? "on" : "off";
|
||||
};
|
||||
|
||||
let syncB = function () {
|
||||
input.checked = (element.value === 'on');
|
||||
};
|
||||
let syncB = function() {
|
||||
input.checked = element.value === "on";
|
||||
};
|
||||
|
||||
input.addEventListener('input', syncA);
|
||||
input.addEventListener('change', syncA);
|
||||
input.addEventListener("input", syncA);
|
||||
input.addEventListener("change", syncA);
|
||||
|
||||
element.addEventListener('input', syncB);
|
||||
element.addEventListener('change', syncB);
|
||||
element.addEventListener("input", syncB);
|
||||
element.addEventListener("change", syncB);
|
||||
|
||||
syncA();
|
||||
syncA();
|
||||
|
||||
element.parentNode.insertBefore(input, element);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
element.parentNode.insertBefore(input, element);
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,101 +1,102 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-tags',
|
||||
controller: function(element) {
|
||||
let array = [];
|
||||
let tags = window.document.createElement('div');
|
||||
let preview = window.document.createElement('ul');
|
||||
let add = window.document.createElement('input');
|
||||
|
||||
tags.className = 'tags';
|
||||
|
||||
preview.className = 'tags-list';
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-tags",
|
||||
controller: function(element) {
|
||||
let array = [];
|
||||
let tags = window.document.createElement("div");
|
||||
let preview = window.document.createElement("ul");
|
||||
let add = window.document.createElement("input");
|
||||
|
||||
add.type = 'text';
|
||||
add.className = 'add';
|
||||
|
||||
//add.required = element.required;
|
||||
tags.className = "tags";
|
||||
|
||||
tags.addEventListener('click', function() {
|
||||
add.focus();
|
||||
});
|
||||
preview.className = "tags-list";
|
||||
|
||||
add.addEventListener('keydown', function(event) {
|
||||
if (((event.key === "Enter" || event.key === " ")) && (add.value.length > 0)) {
|
||||
array.push(add.value);
|
||||
|
||||
add.value = '';
|
||||
|
||||
element.value = JSON.stringify(array);
|
||||
|
||||
check();
|
||||
add.type = "text";
|
||||
add.className = "add";
|
||||
|
||||
event.preventDefault();
|
||||
}
|
||||
if (((event.key === "Backspace" || event.key === "Delete")) && (add.value === '')) {
|
||||
array.splice(-1, 1)
|
||||
|
||||
element.value = JSON.stringify(array);
|
||||
|
||||
check();
|
||||
}
|
||||
//add.required = element.required;
|
||||
|
||||
return false;
|
||||
});
|
||||
tags.addEventListener("click", function() {
|
||||
add.focus();
|
||||
});
|
||||
|
||||
let check = function() {
|
||||
try {
|
||||
array = JSON.parse(element.value) || [];
|
||||
}
|
||||
catch(error) {
|
||||
array = [];
|
||||
}
|
||||
add.addEventListener("keydown", function(event) {
|
||||
if (
|
||||
(event.key === "Enter" || event.key === " ") &&
|
||||
add.value.length > 0
|
||||
) {
|
||||
array.push(add.value);
|
||||
|
||||
if(!Array.isArray(array)) {
|
||||
array = [];
|
||||
}
|
||||
add.value = "";
|
||||
|
||||
preview.innerHTML = '';
|
||||
element.value = JSON.stringify(array);
|
||||
|
||||
for (let index = 0; index < array.length; index++) {
|
||||
let value = array[index];
|
||||
let tag = window.document.createElement('li');
|
||||
check();
|
||||
|
||||
tag.className = 'tag';
|
||||
tag.textContent = value;
|
||||
|
||||
tag.addEventListener('click', function () {
|
||||
array.splice(index, 1);
|
||||
|
||||
element.value = JSON.stringify(array);
|
||||
|
||||
check();
|
||||
});
|
||||
|
||||
preview.appendChild(tag);
|
||||
}
|
||||
|
||||
if(element.required && array.length === 0) {
|
||||
add.setCustomValidity('Please add permissions');
|
||||
}
|
||||
else {
|
||||
add.setCustomValidity('');
|
||||
}
|
||||
};
|
||||
|
||||
tags.appendChild(preview);
|
||||
tags.appendChild(add);
|
||||
|
||||
element.parentNode.insertBefore(tags, element);
|
||||
|
||||
element.addEventListener('change', check);
|
||||
|
||||
check();
|
||||
}
|
||||
event.preventDefault();
|
||||
}
|
||||
);
|
||||
if (
|
||||
(event.key === "Backspace" || event.key === "Delete") &&
|
||||
add.value === ""
|
||||
) {
|
||||
array.splice(-1, 1);
|
||||
|
||||
})(window);
|
||||
element.value = JSON.stringify(array);
|
||||
|
||||
check();
|
||||
}
|
||||
|
||||
return false;
|
||||
});
|
||||
|
||||
let check = function() {
|
||||
try {
|
||||
array = JSON.parse(element.value) || [];
|
||||
} catch (error) {
|
||||
array = [];
|
||||
}
|
||||
|
||||
if (!Array.isArray(array)) {
|
||||
array = [];
|
||||
}
|
||||
|
||||
preview.innerHTML = "";
|
||||
|
||||
for (let index = 0; index < array.length; index++) {
|
||||
let value = array[index];
|
||||
let tag = window.document.createElement("li");
|
||||
|
||||
tag.className = "tag";
|
||||
tag.textContent = value;
|
||||
|
||||
tag.addEventListener("click", function() {
|
||||
array.splice(index, 1);
|
||||
|
||||
element.value = JSON.stringify(array);
|
||||
|
||||
check();
|
||||
});
|
||||
|
||||
preview.appendChild(tag);
|
||||
}
|
||||
|
||||
if (element.required && array.length === 0) {
|
||||
add.setCustomValidity("Please add permissions");
|
||||
} else {
|
||||
add.setCustomValidity("");
|
||||
}
|
||||
};
|
||||
|
||||
tags.appendChild(preview);
|
||||
tags.appendChild(add);
|
||||
|
||||
element.parentNode.insertBefore(tags, element);
|
||||
|
||||
element.addEventListener("change", check);
|
||||
|
||||
check();
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,35 +1,36 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-text-count',
|
||||
controller: function(element) {
|
||||
var counter = document.createElement('span');
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-text-count",
|
||||
controller: function(element) {
|
||||
var counter = document.createElement("span");
|
||||
|
||||
counter.className = 'counter';
|
||||
counter.className = "counter";
|
||||
|
||||
element.parentNode.insertBefore(counter, element.nextSibling);
|
||||
element.parentNode.insertBefore(counter, element.nextSibling);
|
||||
|
||||
var count = function () {
|
||||
if(0 <= element.maxLength) {
|
||||
counter.innerText = (element.maxLength - element.value.length).toString() + ' / ' + element.maxLength;
|
||||
}
|
||||
else {
|
||||
var words = (element.value !== '') ? element.value.trim().split(' ').length : 0;
|
||||
counter.innerText = words + ' words and ' + element.value.length.toString() + ' chars';
|
||||
}
|
||||
};
|
||||
|
||||
element.addEventListener('keyup', count);
|
||||
element.addEventListener('change', count);
|
||||
element.addEventListener('cut', count);
|
||||
element.addEventListener('paste', count);
|
||||
element.addEventListener('drop', count);
|
||||
|
||||
count();
|
||||
}
|
||||
var count = function() {
|
||||
if (0 <= element.maxLength) {
|
||||
counter.innerText =
|
||||
(element.maxLength - element.value.length).toString() +
|
||||
" / " +
|
||||
element.maxLength;
|
||||
} else {
|
||||
var words =
|
||||
element.value !== "" ? element.value.trim().split(" ").length : 0;
|
||||
counter.innerText =
|
||||
words + " words and " + element.value.length.toString() + " chars";
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
})(window);
|
||||
element.addEventListener("keyup", count);
|
||||
element.addEventListener("change", count);
|
||||
element.addEventListener("cut", count);
|
||||
element.addEventListener("paste", count);
|
||||
element.addEventListener("drop", count);
|
||||
|
||||
count();
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,44 +1,84 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-text-direction',
|
||||
controller: function(element) {
|
||||
var rtlStock = '^ا^ب^ت^ث^ج^ح^خ^د^ذ^ر^ز^س^ش^ص^ض^ط^ظ^ع^غ^ف^ق^ك^ل^م^ن^ه^و^ي^א^ב^ג^ד^ה^ו^ז^ח^ט^י^כ^ך^ל^מ^ם^נ^ן^ס^ע^פ^ף^צ^ץ^ק^ר^ש^ת^';
|
||||
var special = ['\n',' ', '״', '"', '_', '\'', '!', '@', '#', '$', '^', '&', '%', '*', '(', ')', '+', '=', '-', '[', ']', '\\', '/', '{', '}', '|', ':', '<', '>', '?', ',', '.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-text-direction",
|
||||
controller: function(element) {
|
||||
var rtlStock =
|
||||
"^ا^ب^ت^ث^ج^ح^خ^د^ذ^ر^ز^س^ش^ص^ض^ط^ظ^ع^غ^ف^ق^ك^ل^م^ن^ه^و^ي^א^ב^ג^ד^ה^ו^ז^ח^ט^י^כ^ך^ל^מ^ם^נ^ן^ס^ע^פ^ף^צ^ץ^ק^ר^ש^ת^";
|
||||
var special = [
|
||||
"\n",
|
||||
" ",
|
||||
"״",
|
||||
'"',
|
||||
"_",
|
||||
"'",
|
||||
"!",
|
||||
"@",
|
||||
"#",
|
||||
"$",
|
||||
"^",
|
||||
"&",
|
||||
"%",
|
||||
"*",
|
||||
"(",
|
||||
")",
|
||||
"+",
|
||||
"=",
|
||||
"-",
|
||||
"[",
|
||||
"]",
|
||||
"\\",
|
||||
"/",
|
||||
"{",
|
||||
"}",
|
||||
"|",
|
||||
":",
|
||||
"<",
|
||||
">",
|
||||
"?",
|
||||
",",
|
||||
".",
|
||||
"0",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
"7",
|
||||
"8",
|
||||
"9"
|
||||
];
|
||||
|
||||
var setDirection = function() {
|
||||
var setDirection = function() {
|
||||
var value = element.value[0] ? element.value : "";
|
||||
var direction = "ltr";
|
||||
var align = "left";
|
||||
|
||||
var value = (element.value[0]) ? element.value : '';
|
||||
var direction = 'ltr';
|
||||
var align = 'left';
|
||||
|
||||
for (var i = 0; i < value.length; i++) {
|
||||
if (-1 === special.indexOf(value[i])) {
|
||||
var firstChar = value[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (-1 < rtlStock.indexOf('^' + firstChar + '^')) {
|
||||
direction = 'rtl';
|
||||
align = 'right';
|
||||
}
|
||||
|
||||
element.style.direction = direction;
|
||||
element.style.textAlign = align;
|
||||
};
|
||||
|
||||
element.addEventListener('keyup', setDirection);
|
||||
element.addEventListener('change', setDirection);
|
||||
element.addEventListener('cut', setDirection);
|
||||
element.addEventListener('paste', setDirection);
|
||||
element.addEventListener('drop', setDirection);
|
||||
|
||||
setDirection();
|
||||
}
|
||||
for (var i = 0; i < value.length; i++) {
|
||||
if (-1 === special.indexOf(value[i])) {
|
||||
var firstChar = value[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
if (-1 < rtlStock.indexOf("^" + firstChar + "^")) {
|
||||
direction = "rtl";
|
||||
align = "right";
|
||||
}
|
||||
|
||||
element.style.direction = direction;
|
||||
element.style.textAlign = align;
|
||||
};
|
||||
|
||||
element.addEventListener("keyup", setDirection);
|
||||
element.addEventListener("change", setDirection);
|
||||
element.addEventListener("cut", setDirection);
|
||||
element.addEventListener("paste", setDirection);
|
||||
element.addEventListener("drop", setDirection);
|
||||
|
||||
setDirection();
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,34 +1,42 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-text-resize',
|
||||
controller: function(element, window) {
|
||||
function resize () {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-text-resize",
|
||||
controller: function(element, window) {
|
||||
function resize() {
|
||||
var scrollLeft =
|
||||
window.pageXOffset ||
|
||||
(
|
||||
window.document.documentElement ||
|
||||
window.document.body.parentNode ||
|
||||
window.document.body
|
||||
).scrollLeft;
|
||||
var scrollTop =
|
||||
window.pageYOffset ||
|
||||
(
|
||||
window.document.documentElement ||
|
||||
window.document.body.parentNode ||
|
||||
window.document.body
|
||||
).scrollTop;
|
||||
|
||||
var scrollLeft = window.pageXOffset || (window.document.documentElement || window.document.body.parentNode || window.document.body).scrollLeft;
|
||||
var scrollTop = window.pageYOffset || (window.document.documentElement || window.document.body.parentNode || window.document.body).scrollTop;
|
||||
var offset = element.offsetHeight - element.clientHeight;
|
||||
|
||||
var offset = element.offsetHeight - element.clientHeight;
|
||||
element.style.height = "auto";
|
||||
element.style.height = element.scrollHeight + offset + "px";
|
||||
|
||||
element.style.height = 'auto';
|
||||
element.style.height = element.scrollHeight + offset + 'px';
|
||||
window.scrollTo(scrollLeft, scrollTop);
|
||||
}
|
||||
|
||||
window.scrollTo(scrollLeft, scrollTop);
|
||||
}
|
||||
element.addEventListener("keyup", resize);
|
||||
element.addEventListener("change", resize);
|
||||
element.addEventListener("cut", resize);
|
||||
element.addEventListener("paste", resize);
|
||||
element.addEventListener("drop", resize);
|
||||
|
||||
element.addEventListener('keyup', resize);
|
||||
element.addEventListener('change', resize);
|
||||
element.addEventListener('cut', resize);
|
||||
element.addEventListener('paste', resize);
|
||||
element.addEventListener('drop', resize);
|
||||
window.addEventListener("resize", resize);
|
||||
|
||||
window.addEventListener('resize', resize);
|
||||
|
||||
resize();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
resize();
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,187 +1,207 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(function(window) {
|
||||
"use strict";
|
||||
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-forms-upload',
|
||||
controller: function(element, container, alerts, expression, env) {
|
||||
var scope = element.dataset['scope'];
|
||||
var labelButton = element.dataset['labelButton'] || 'Upload';
|
||||
var labelLoading = element.dataset['labelLoading'] || 'Uploading...';
|
||||
var previewWidth = element.dataset['previewWidth'] || 200;
|
||||
var previewHeight = element.dataset['previewHeight'] || 200;
|
||||
var accept = element.dataset['accept'] || '';
|
||||
var required = (element.dataset['required'] || false);
|
||||
var multiple = (element.dataset['multiple'] || false);
|
||||
var className = (element.dataset['class'] || 'upload');
|
||||
var max = parseInt((element.dataset['max'] || 4));
|
||||
var sdk = (scope === 'sdk') ? container.get('sdk') : container.get('console');
|
||||
var output = (element.value) ? ((multiple) ? JSON.parse(element.value) : [element.value]) : [];
|
||||
var total = 0;
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-forms-upload",
|
||||
controller: function(element, container, alerts, expression, env) {
|
||||
var scope = element.dataset["scope"];
|
||||
var labelButton = element.dataset["labelButton"] || "Upload";
|
||||
var labelLoading = element.dataset["labelLoading"] || "Uploading...";
|
||||
var previewWidth = element.dataset["previewWidth"] || 200;
|
||||
var previewHeight = element.dataset["previewHeight"] || 200;
|
||||
var accept = element.dataset["accept"] || "";
|
||||
var required = element.dataset["required"] || false;
|
||||
var multiple = element.dataset["multiple"] || false;
|
||||
var className = element.dataset["class"] || "upload";
|
||||
var max = parseInt(element.dataset["max"] || 4);
|
||||
var sdk =
|
||||
scope === "sdk" ? container.get("sdk") : container.get("console");
|
||||
var output = element.value
|
||||
? multiple
|
||||
? JSON.parse(element.value)
|
||||
: [element.value]
|
||||
: [];
|
||||
var total = 0;
|
||||
|
||||
var wrapper = document.createElement('div');
|
||||
var input = document.createElement('input');
|
||||
var upload = document.createElement('div'); // Fake button
|
||||
var preview = document.createElement('ul');
|
||||
var progress = document.createElement('div');
|
||||
var count = document.createElement('div');
|
||||
var wrapper = document.createElement("div");
|
||||
var input = document.createElement("input");
|
||||
var upload = document.createElement("div"); // Fake button
|
||||
var preview = document.createElement("ul");
|
||||
var progress = document.createElement("div");
|
||||
var count = document.createElement("div");
|
||||
|
||||
wrapper.className = className;
|
||||
wrapper.className = className;
|
||||
|
||||
input.type = 'file';
|
||||
input.accept = accept;
|
||||
input.required = required;
|
||||
input.multiple = multiple;
|
||||
input.tabIndex = -1;
|
||||
input.type = "file";
|
||||
input.accept = accept;
|
||||
input.required = required;
|
||||
input.multiple = multiple;
|
||||
input.tabIndex = -1;
|
||||
|
||||
count.className = 'count';
|
||||
count.className = "count";
|
||||
|
||||
upload.className = 'button reverse margin-bottom';
|
||||
upload.innerHTML = '<i class="icon icon-upload"></i> ' + labelButton;
|
||||
upload.tabIndex = 0;
|
||||
upload.className = "button reverse margin-bottom";
|
||||
upload.innerHTML = '<i class="icon icon-upload"></i> ' + labelButton;
|
||||
upload.tabIndex = 0;
|
||||
|
||||
preview.className = 'preview';
|
||||
preview.className = "preview";
|
||||
|
||||
progress.className = 'progress';
|
||||
progress.style.width = '0%';
|
||||
progress.style.display = 'none';
|
||||
progress.className = "progress";
|
||||
progress.style.width = "0%";
|
||||
progress.style.display = "none";
|
||||
|
||||
var humanFileSize = function (bytes, si) {
|
||||
var thresh = si ? 1000 : 1024;
|
||||
var humanFileSize = function(bytes, si) {
|
||||
var thresh = si ? 1000 : 1024;
|
||||
|
||||
if(Math.abs(bytes) < thresh) {
|
||||
return bytes + ' B';
|
||||
}
|
||||
|
||||
var units = si
|
||||
? ['KB','MB','GB','TB','PB','EB','ZB','YB']
|
||||
: ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];
|
||||
|
||||
var u = -1;
|
||||
|
||||
do {
|
||||
bytes /= thresh;
|
||||
++u;
|
||||
} while(Math.abs(bytes) >= thresh && u < units.length - 1);
|
||||
|
||||
return bytes.toFixed(1)+' '+units[u];
|
||||
};
|
||||
|
||||
var onComplete = function (message) {
|
||||
alerts.remove(message);
|
||||
|
||||
input.disabled = false;
|
||||
upload.classList.remove('disabled');
|
||||
progress.style.width = '0%';
|
||||
progress.style.display = 'none';
|
||||
};
|
||||
|
||||
var render = function (files) { // Generate image previews + remove buttons + input array (array only when multiple is on)
|
||||
if(!Array.isArray(files)) { // Support single file
|
||||
files = [files];
|
||||
}
|
||||
|
||||
preview.innerHTML = '';
|
||||
|
||||
count.innerHTML = '0 / ' + max;
|
||||
|
||||
files.map(function(obj) {
|
||||
var file = document.createElement('li');
|
||||
var image = document.createElement('img');
|
||||
|
||||
image.src = image.src = env.API + '/storage/files/' + obj + '/preview?width=' + previewWidth + '&height=' + previewHeight;
|
||||
|
||||
file.className = 'file avatar';
|
||||
file.tabIndex = 0;
|
||||
file.appendChild(image);
|
||||
|
||||
count.innerHTML = files.length + ' / ' + max;
|
||||
|
||||
preview.appendChild(file);
|
||||
|
||||
if((files.length >= max)) {
|
||||
input.disabled = true;
|
||||
upload.classList.add('disabled');
|
||||
}
|
||||
else {
|
||||
input.disabled = false;
|
||||
upload.classList.remove('disabled');
|
||||
}
|
||||
|
||||
var remove = (function (obj) {
|
||||
return function (event) {
|
||||
output = (Array.isArray(output)) ? output.filter(function(e) {return e !== obj}) : [];
|
||||
|
||||
render(output);
|
||||
}
|
||||
})(obj);
|
||||
|
||||
file.addEventListener('click', remove);
|
||||
file.addEventListener('keypress', remove);
|
||||
|
||||
element.value = (multiple) ? JSON.stringify(output) : output[0];
|
||||
});
|
||||
};
|
||||
|
||||
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'] || '[]'));
|
||||
|
||||
if(!multiple) {
|
||||
output = [];
|
||||
}
|
||||
|
||||
sdk.storage.createFile(files[0], read, write, 1)
|
||||
.then(function (response) {
|
||||
response.map(function(obj) {
|
||||
if(!Array.isArray(output)) { // Support single file
|
||||
throw new Error('Can\'t append new file to non array value');
|
||||
}
|
||||
|
||||
output[output.length] = obj['$uid'];
|
||||
|
||||
});
|
||||
|
||||
onComplete(message);
|
||||
|
||||
render(output);
|
||||
}, function (error) {
|
||||
alerts.add({text: 'An error occurred!', class: ''}, 3000); // File(s) uploaded.
|
||||
onComplete(message);
|
||||
});
|
||||
|
||||
input.disabled = true;
|
||||
});
|
||||
|
||||
element.addEventListener('change', function () {
|
||||
if(!element.value) {
|
||||
return;
|
||||
}
|
||||
output = (multiple) ? JSON.parse(element.value) : [element.value];
|
||||
render(output);
|
||||
});
|
||||
|
||||
upload.addEventListener('keypress', function () {
|
||||
input.click();
|
||||
});
|
||||
|
||||
element.parentNode.insertBefore(wrapper, element);
|
||||
|
||||
wrapper.appendChild(preview);
|
||||
wrapper.appendChild(progress);
|
||||
wrapper.appendChild(upload);
|
||||
|
||||
if(multiple) {
|
||||
wrapper.appendChild(count);
|
||||
}
|
||||
|
||||
upload.appendChild(input);
|
||||
|
||||
render(output);
|
||||
}
|
||||
if (Math.abs(bytes) < thresh) {
|
||||
return bytes + " B";
|
||||
}
|
||||
);
|
||||
|
||||
})(window);
|
||||
var units = si
|
||||
? ["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]
|
||||
: ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
|
||||
|
||||
var u = -1;
|
||||
|
||||
do {
|
||||
bytes /= thresh;
|
||||
++u;
|
||||
} while (Math.abs(bytes) >= thresh && u < units.length - 1);
|
||||
|
||||
return bytes.toFixed(1) + " " + units[u];
|
||||
};
|
||||
|
||||
var onComplete = function(message) {
|
||||
alerts.remove(message);
|
||||
|
||||
input.disabled = false;
|
||||
upload.classList.remove("disabled");
|
||||
progress.style.width = "0%";
|
||||
progress.style.display = "none";
|
||||
};
|
||||
|
||||
var render = function(files) {
|
||||
// Generate image previews + remove buttons + input array (array only when multiple is on)
|
||||
if (!Array.isArray(files)) {
|
||||
// Support single file
|
||||
files = [files];
|
||||
}
|
||||
|
||||
preview.innerHTML = "";
|
||||
|
||||
count.innerHTML = "0 / " + max;
|
||||
|
||||
files.map(function(obj) {
|
||||
var file = document.createElement("li");
|
||||
var image = document.createElement("img");
|
||||
|
||||
image.src = image.src =
|
||||
env.API +
|
||||
"/storage/files/" +
|
||||
obj +
|
||||
"/preview?width=" +
|
||||
previewWidth +
|
||||
"&height=" +
|
||||
previewHeight;
|
||||
|
||||
file.className = "file avatar";
|
||||
file.tabIndex = 0;
|
||||
file.appendChild(image);
|
||||
|
||||
count.innerHTML = files.length + " / " + max;
|
||||
|
||||
preview.appendChild(file);
|
||||
|
||||
if (files.length >= max) {
|
||||
input.disabled = true;
|
||||
upload.classList.add("disabled");
|
||||
} else {
|
||||
input.disabled = false;
|
||||
upload.classList.remove("disabled");
|
||||
}
|
||||
|
||||
var remove = (function(obj) {
|
||||
return function(event) {
|
||||
output = Array.isArray(output)
|
||||
? output.filter(function(e) {
|
||||
return e !== obj;
|
||||
})
|
||||
: [];
|
||||
|
||||
render(output);
|
||||
};
|
||||
})(obj);
|
||||
|
||||
file.addEventListener("click", remove);
|
||||
file.addEventListener("keypress", remove);
|
||||
|
||||
element.value = multiple ? JSON.stringify(output) : output[0];
|
||||
});
|
||||
};
|
||||
|
||||
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"] || "[]")
|
||||
);
|
||||
|
||||
if (!multiple) {
|
||||
output = [];
|
||||
}
|
||||
|
||||
sdk.storage.createFile(files[0], read, write, 1).then(
|
||||
function(response) {
|
||||
response.map(function(obj) {
|
||||
if (!Array.isArray(output)) {
|
||||
// Support single file
|
||||
throw new Error("Can't append new file to non array value");
|
||||
}
|
||||
|
||||
output[output.length] = obj["$uid"];
|
||||
});
|
||||
|
||||
onComplete(message);
|
||||
|
||||
render(output);
|
||||
},
|
||||
function(error) {
|
||||
alerts.add({ text: "An error occurred!", class: "" }, 3000); // File(s) uploaded.
|
||||
onComplete(message);
|
||||
}
|
||||
);
|
||||
|
||||
input.disabled = true;
|
||||
});
|
||||
|
||||
element.addEventListener("change", function() {
|
||||
if (!element.value) {
|
||||
return;
|
||||
}
|
||||
output = multiple ? JSON.parse(element.value) : [element.value];
|
||||
render(output);
|
||||
});
|
||||
|
||||
upload.addEventListener("keypress", function() {
|
||||
input.click();
|
||||
});
|
||||
|
||||
element.parentNode.insertBefore(wrapper, element);
|
||||
|
||||
wrapper.appendChild(preview);
|
||||
wrapper.appendChild(progress);
|
||||
wrapper.appendChild(upload);
|
||||
|
||||
if (multiple) {
|
||||
wrapper.appendChild(count);
|
||||
}
|
||||
|
||||
upload.appendChild(input);
|
||||
|
||||
render(output);
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
(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) {
|
||||
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);
|
||||
|
||||
@@ -1,33 +1,41 @@
|
||||
(function (window) {
|
||||
window.ls.container.get('view').add({
|
||||
selector: 'data-setup',
|
||||
controller: function(element, console, form) {
|
||||
element.addEventListener('submit', function (event) {
|
||||
event.preventDefault();
|
||||
(function(window) {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-setup",
|
||||
controller: function(element, console, form) {
|
||||
element.addEventListener("submit", function(event) {
|
||||
event.preventDefault();
|
||||
|
||||
let formData = form.toJson(element);
|
||||
let formData = form.toJson(element);
|
||||
|
||||
formData['name'] = formData['name'] || (element.dataset['defaultName'] || '');
|
||||
formData["name"] =
|
||||
formData["name"] || (element.dataset["defaultName"] || "");
|
||||
|
||||
console.teams.createTeam(formData['name'] || '')
|
||||
.then(function (data) {
|
||||
let team = data['$uid'];
|
||||
console.teams.createTeam(formData["name"] || "").then(
|
||||
function(data) {
|
||||
let team = data["$uid"];
|
||||
|
||||
formData = JSON.parse(JSON.stringify(formData).replace(new RegExp('{{teamId}}', 'g'), team)); //convert to JSON string
|
||||
formData = JSON.parse(
|
||||
JSON.stringify(formData).replace(
|
||||
new RegExp("{{teamId}}", "g"),
|
||||
team
|
||||
)
|
||||
); //convert to JSON string
|
||||
|
||||
console.projects.createProject(formData['name'], team)
|
||||
.then(function (project) {
|
||||
|
||||
//router.change();
|
||||
window.location.href = '/console?project=' + project['$uid'];
|
||||
}, function () {
|
||||
throw new Error('Failed to setup project');
|
||||
});
|
||||
|
||||
}, function () {
|
||||
throw new Error('Setup failed creating project team');
|
||||
});
|
||||
})
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
console.projects.createProject(formData["name"], team).then(
|
||||
function(project) {
|
||||
//router.change();
|
||||
window.location.href = "/console?project=" + project["$uid"];
|
||||
},
|
||||
function() {
|
||||
throw new Error("Failed to setup project");
|
||||
}
|
||||
);
|
||||
},
|
||||
function() {
|
||||
throw new Error("Setup failed creating project team");
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
(function (window) {
|
||||
window.ls.container.get('view').add({
|
||||
selector: 'data-switch',
|
||||
controller: function(element, router, document) {
|
||||
let check = function (c) {
|
||||
if(!element.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
if(element.value === router.params.project) {
|
||||
return;
|
||||
}
|
||||
|
||||
return router.change('/console/home?project=' + element.value);
|
||||
};
|
||||
|
||||
element.addEventListener('change', function() {
|
||||
check();
|
||||
});
|
||||
(function(window) {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-switch",
|
||||
controller: function(element, router, document) {
|
||||
let check = function(c) {
|
||||
if (!element.value) {
|
||||
return;
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
if (element.value === router.params.project) {
|
||||
return;
|
||||
}
|
||||
|
||||
return router.change("/console/home?project=" + element.value);
|
||||
};
|
||||
|
||||
element.addEventListener("change", function() {
|
||||
check();
|
||||
});
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,34 +1,35 @@
|
||||
(function (window) {
|
||||
window.ls.container.get('view').add({
|
||||
selector: 'data-paging-back',
|
||||
controller: function(element, container, expression, env) {
|
||||
let paths = [];
|
||||
let limit = env.PAGING_LIMIT;
|
||||
|
||||
let check = function () {
|
||||
let offset = parseInt(expression.parse(element.dataset['offset']) || '0');
|
||||
|
||||
paths = paths.concat(expression.getPaths());
|
||||
|
||||
if((offset - limit) < 0) {
|
||||
element.disabled = true;
|
||||
}
|
||||
else {
|
||||
element.disabled = false;
|
||||
element.value = offset - limit;
|
||||
}
|
||||
};
|
||||
|
||||
check();
|
||||
(function(window) {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-paging-back",
|
||||
controller: function(element, container, expression, env) {
|
||||
let paths = [];
|
||||
let limit = env.PAGING_LIMIT;
|
||||
|
||||
for(let i = 0; i < paths.length; i++) {
|
||||
let path = paths[i].split('.');
|
||||
|
||||
while(path.length) {
|
||||
container.bind(element, path.join('.'), check);
|
||||
path.pop();
|
||||
}
|
||||
}
|
||||
let check = function() {
|
||||
let offset = parseInt(
|
||||
expression.parse(element.dataset["offset"]) || "0"
|
||||
);
|
||||
|
||||
paths = paths.concat(expression.getPaths());
|
||||
|
||||
if (offset - limit < 0) {
|
||||
element.disabled = true;
|
||||
} else {
|
||||
element.disabled = false;
|
||||
element.value = offset - limit;
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
};
|
||||
|
||||
check();
|
||||
|
||||
for (let i = 0; i < paths.length; i++) {
|
||||
let path = paths[i].split(".");
|
||||
|
||||
while (path.length) {
|
||||
container.bind(element, path.join("."), check);
|
||||
path.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,38 +1,39 @@
|
||||
(function (window) {
|
||||
window.ls.container.get('view').add({
|
||||
selector: 'data-paging-next',
|
||||
controller: function(element, container, expression, env) {
|
||||
let paths = [];
|
||||
let limit = env.PAGING_LIMIT;
|
||||
|
||||
let check = function () {
|
||||
let offset = parseInt(expression.parse(element.dataset['offset']) || '0');
|
||||
|
||||
paths = paths.concat(expression.getPaths());
|
||||
|
||||
let sum = parseInt(expression.parse(element.dataset['sum']) || '0');
|
||||
|
||||
paths = paths.concat(expression.getPaths());
|
||||
(function(window) {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-paging-next",
|
||||
controller: function(element, container, expression, env) {
|
||||
let paths = [];
|
||||
let limit = env.PAGING_LIMIT;
|
||||
|
||||
if((offset + limit) >= sum) {
|
||||
element.disabled = true;
|
||||
}
|
||||
else {
|
||||
element.disabled = false;
|
||||
element.value = offset + limit;
|
||||
}
|
||||
};
|
||||
|
||||
check();
|
||||
let check = function() {
|
||||
let offset = parseInt(
|
||||
expression.parse(element.dataset["offset"]) || "0"
|
||||
);
|
||||
|
||||
for(let i = 0; i < paths.length; i++) {
|
||||
let path = paths[i].split('.');
|
||||
|
||||
while(path.length) {
|
||||
container.bind(element, path.join('.'), check);
|
||||
path.pop();
|
||||
}
|
||||
}
|
||||
paths = paths.concat(expression.getPaths());
|
||||
|
||||
let sum = parseInt(expression.parse(element.dataset["sum"]) || "0");
|
||||
|
||||
paths = paths.concat(expression.getPaths());
|
||||
|
||||
if (offset + limit >= sum) {
|
||||
element.disabled = true;
|
||||
} else {
|
||||
element.disabled = false;
|
||||
element.value = offset + limit;
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
};
|
||||
|
||||
check();
|
||||
|
||||
for (let i = 0; i < paths.length; i++) {
|
||||
let path = paths[i].split(".");
|
||||
|
||||
while (path.length) {
|
||||
container.bind(element, path.join("."), check);
|
||||
path.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
+390
-329
@@ -1,335 +1,396 @@
|
||||
(function (window) {
|
||||
"use strict";
|
||||
(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 = 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 scope = element.dataset['scope'] || 'sdk'; // Free text
|
||||
let debug = !!(element.dataset['debug']); // Free text
|
||||
let success = (element.dataset['success'] || '');
|
||||
let failure = (element.dataset['failure'] || '');
|
||||
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 = 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 scope = element.dataset["scope"] || "sdk"; // Free text
|
||||
let debug = !!element.dataset["debug"]; // Free text
|
||||
let success = element.dataset["success"] || "";
|
||||
let failure = element.dataset["failure"] || "";
|
||||
|
||||
success = (success && success != '') ? success.split(',').map(element => element.trim()) : [];
|
||||
failure = (failure && failure != '') ? failure.split(',').map(element => element.trim()) : [];
|
||||
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');
|
||||
if (debug)
|
||||
console.log(
|
||||
"%c[service init]: " + action + " (" + service + ")",
|
||||
"color:red"
|
||||
);
|
||||
|
||||
let callbacks = {
|
||||
'reset': function () {
|
||||
return function () {
|
||||
if ('FORM' === element.tagName) {
|
||||
return element.reset();
|
||||
}
|
||||
|
||||
throw new Error('This callback is only valid for forms');
|
||||
}
|
||||
},
|
||||
|
||||
'alert': function (text, classname) {
|
||||
return function (alerts) {
|
||||
alerts.add({ text: text, class: (classname || 'success') }, 3000);
|
||||
}
|
||||
},
|
||||
|
||||
'redirect': function (url) {
|
||||
return function (router) {
|
||||
router.change(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]));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Original Solution From:
|
||||
* @see https://stackoverflow.com/a/41322698/2299554
|
||||
* Notice: this version add support for $ sign in arg name.
|
||||
*
|
||||
* Retrieve a function's parameter names and default values
|
||||
* Notes:
|
||||
* - parameters with default values will not show up in transpiler code (Babel) because the parameter is removed from the function.
|
||||
* - does NOT support inline arrow functions as default values
|
||||
* to clarify: ( name = "string", add = defaultAddFunction ) - is ok
|
||||
* ( name = "string", add = ( a )=> a + 1 ) - is NOT ok
|
||||
* - does NOT support default string value that are appended with a non-standard ( word characters or $ ) variable name
|
||||
* to clarify: ( name = "string" + b ) - is ok
|
||||
* ( name = "string" + $b ) - is ok
|
||||
* ( name = "string" + b + "!" ) - is ok
|
||||
* ( name = "string" + λ ) - is NOT ok
|
||||
* @param {function} func
|
||||
* @returns {Array} - An array of the given function's parameter [key, default value] pairs.
|
||||
*/
|
||||
let getParams = function getParams(func) {
|
||||
const REGEX_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
|
||||
const REGEX_FUNCTION_PARAMS = /(?:\s*(?:function\s*[^(]*)?\s*)((?:[^'"]|(?:(?:(['"])(?:(?:.*?[^\\]\2)|\2))))*?)\s*(?=(?:=>)|{)/m;
|
||||
const REGEX_PARAMETERS_VALUES = /\s*([\w\\$]+)\s*(?:=\s*((?:(?:(['"])(?:\3|(?:.*?[^\\]\3)))((\s*\+\s*)(?:(?:(['"])(?:\6|(?:.*?[^\\]\6)))|(?:[\w$]*)))*)|.*?))?\s*(?:,|$)/gm;
|
||||
|
||||
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], match[2]]); // with default values
|
||||
params.push(match[1]); // only with arg name
|
||||
}
|
||||
|
||||
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);
|
||||
/**
|
||||
* 1. Get from element data-param-* (expression supported)
|
||||
* 2. Get from element form object-*
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
if(event) {
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
if(confirm) {
|
||||
if (window.confirm(confirm) !== true) {
|
||||
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');
|
||||
}
|
||||
|
||||
let formData = ('FORM' === element.tagName) ? form.toJson(element) : {};
|
||||
let result = resolve(method, 'param', formData);
|
||||
|
||||
if(!result) {
|
||||
return;
|
||||
}
|
||||
|
||||
result
|
||||
.then(function (data) {
|
||||
if(loaderId !== null) { // Remove loader if needed
|
||||
alerts.remove(loaderId);
|
||||
}
|
||||
|
||||
if(!element) {
|
||||
return;
|
||||
}
|
||||
|
||||
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++) { // Trigger success callbacks
|
||||
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) { // Remove loader if needed
|
||||
alerts.remove(loaderId);
|
||||
}
|
||||
|
||||
if(!element) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (let i = 0; i < failure.length; i++) { // Trigger success callbacks
|
||||
container.resolve(resolve(callbacks[failure[i]], 'failureParam' + 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');
|
||||
}
|
||||
let callbacks = {
|
||||
reset: function() {
|
||||
return function() {
|
||||
if ("FORM" === element.tagName) {
|
||||
return element.reset();
|
||||
}
|
||||
|
||||
throw new Error("This callback is only valid for forms");
|
||||
};
|
||||
},
|
||||
|
||||
alert: function(text, classname) {
|
||||
return function(alerts) {
|
||||
alerts.add({ text: text, class: classname || "success" }, 3000);
|
||||
};
|
||||
},
|
||||
|
||||
redirect: function(url) {
|
||||
return function(router) {
|
||||
router.change(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]));
|
||||
}
|
||||
};
|
||||
}
|
||||
);
|
||||
})(window);
|
||||
};
|
||||
|
||||
/**
|
||||
* Original Solution From:
|
||||
* @see https://stackoverflow.com/a/41322698/2299554
|
||||
* Notice: this version add support for $ sign in arg name.
|
||||
*
|
||||
* Retrieve a function's parameter names and default values
|
||||
* Notes:
|
||||
* - parameters with default values will not show up in transpiler code (Babel) because the parameter is removed from the function.
|
||||
* - does NOT support inline arrow functions as default values
|
||||
* to clarify: ( name = "string", add = defaultAddFunction ) - is ok
|
||||
* ( name = "string", add = ( a )=> a + 1 ) - is NOT ok
|
||||
* - does NOT support default string value that are appended with a non-standard ( word characters or $ ) variable name
|
||||
* to clarify: ( name = "string" + b ) - is ok
|
||||
* ( name = "string" + $b ) - is ok
|
||||
* ( name = "string" + b + "!" ) - is ok
|
||||
* ( name = "string" + λ ) - is NOT ok
|
||||
* @param {function} func
|
||||
* @returns {Array} - An array of the given function's parameter [key, default value] pairs.
|
||||
*/
|
||||
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], match[2]]); // with default values
|
||||
params.push(match[1]); // only with arg name
|
||||
}
|
||||
|
||||
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);
|
||||
/**
|
||||
* 1. Get from element data-param-* (expression supported)
|
||||
* 2. Get from element form object-*
|
||||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
}
|
||||
|
||||
if (confirm) {
|
||||
if (window.confirm(confirm) !== true) {
|
||||
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');
|
||||
}
|
||||
|
||||
let formData = "FORM" === element.tagName ? form.toJson(element) : {};
|
||||
let result = resolve(method, "param", formData);
|
||||
|
||||
if (!result) {
|
||||
return;
|
||||
}
|
||||
|
||||
result.then(
|
||||
function(data) {
|
||||
if (loaderId !== null) {
|
||||
// Remove loader if needed
|
||||
alerts.remove(loaderId);
|
||||
}
|
||||
|
||||
if (!element) {
|
||||
return;
|
||||
}
|
||||
|
||||
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++) {
|
||||
// Trigger success callbacks
|
||||
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) {
|
||||
// Remove loader if needed
|
||||
alerts.remove(loaderId);
|
||||
}
|
||||
|
||||
if (!element) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (let i = 0; i < failure.length; i++) {
|
||||
// Trigger success callbacks
|
||||
container.resolve(
|
||||
resolve(
|
||||
callbacks[failure[i]],
|
||||
"failureParam" +
|
||||
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);
|
||||
|
||||
@@ -1,40 +1,42 @@
|
||||
(function (window) {
|
||||
window.ls.container.get('view').add({
|
||||
selector: 'data-ui-highlight',
|
||||
controller: function(element, expression, document) {
|
||||
(function(window) {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-ui-highlight",
|
||||
controller: function(element, expression, document) {
|
||||
let check = function() {
|
||||
let links = element.getElementsByTagName("a");
|
||||
let selected = null;
|
||||
let list = [];
|
||||
|
||||
let check = function () {
|
||||
let links = element.getElementsByTagName('a');
|
||||
let selected = null;
|
||||
let list = [];
|
||||
|
||||
for (let i = 0; i < links.length; i++) {
|
||||
links[i].href = links[i].href || expression.parse(links[i].dataset['lsHref'] || '');
|
||||
list.push(links[i]);
|
||||
}
|
||||
|
||||
list.sort(function(a, b){
|
||||
return a.pathname.length - b.pathname.length;
|
||||
});
|
||||
|
||||
for (let i = 0; i < list.length; i++) {
|
||||
if (list[i].pathname === window.location.pathname.substring(0, list[i].pathname.length)) {
|
||||
list[i].classList.add('selected');
|
||||
|
||||
if(selected !== null) {
|
||||
list[selected].classList.remove('selected');
|
||||
}
|
||||
selected = i;
|
||||
}
|
||||
else {
|
||||
list[i].classList.remove('selected');
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener('state-changed', check);
|
||||
|
||||
check();
|
||||
for (let i = 0; i < links.length; i++) {
|
||||
links[i].href =
|
||||
links[i].href || expression.parse(links[i].dataset["lsHref"] || "");
|
||||
list.push(links[i]);
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
list.sort(function(a, b) {
|
||||
return a.pathname.length - b.pathname.length;
|
||||
});
|
||||
|
||||
for (let i = 0; i < list.length; i++) {
|
||||
if (
|
||||
list[i].pathname ===
|
||||
window.location.pathname.substring(0, list[i].pathname.length)
|
||||
) {
|
||||
list[i].classList.add("selected");
|
||||
|
||||
if (selected !== null) {
|
||||
list[selected].classList.remove("selected");
|
||||
}
|
||||
selected = i;
|
||||
} else {
|
||||
list[i].classList.remove("selected");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener("state-changed", check);
|
||||
|
||||
check();
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,119 +1,126 @@
|
||||
(function (window) {
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-ui-modal',
|
||||
controller: function(document, element, expression) {
|
||||
let name = element.dataset['name'] || null;
|
||||
let buttonText = expression.parse(element.dataset['buttonText'] || '');
|
||||
let buttonClass = element.dataset['buttonClass'] || 'button-class';
|
||||
let buttonIcon = element.dataset['buttonIcon'] || null;
|
||||
let buttonEvent = element.dataset['buttonEvent'] || '';
|
||||
let buttonAlias = element.dataset['buttonAlias'] || '';
|
||||
let buttonElements = (!buttonAlias) ? [document.createElement('button')] : document.querySelectorAll(buttonAlias);
|
||||
let openEvent = element.dataset['openEvent'] || null; // When event triggers modal will open
|
||||
let background = document.getElementById('modal-bg');
|
||||
(function(window) {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-ui-modal",
|
||||
controller: function(document, element, expression) {
|
||||
let name = element.dataset["name"] || null;
|
||||
let buttonText = expression.parse(element.dataset["buttonText"] || "");
|
||||
let buttonClass = element.dataset["buttonClass"] || "button-class";
|
||||
let buttonIcon = element.dataset["buttonIcon"] || null;
|
||||
let buttonEvent = element.dataset["buttonEvent"] || "";
|
||||
let buttonAlias = element.dataset["buttonAlias"] || "";
|
||||
let buttonElements = !buttonAlias
|
||||
? [document.createElement("button")]
|
||||
: document.querySelectorAll(buttonAlias);
|
||||
let openEvent = element.dataset["openEvent"] || null; // When event triggers modal will open
|
||||
let background = document.getElementById("modal-bg");
|
||||
|
||||
if(!background) {
|
||||
background = document.createElement('div');
|
||||
background.id = 'modal-bg';
|
||||
background.className = 'modal-bg';
|
||||
if (!background) {
|
||||
background = document.createElement("div");
|
||||
background.id = "modal-bg";
|
||||
background.className = "modal-bg";
|
||||
|
||||
document.body.appendChild(background);
|
||||
document.body.appendChild(background);
|
||||
|
||||
background.addEventListener('click', function() {
|
||||
document.dispatchEvent(new CustomEvent('modal-close', {
|
||||
bubbles: false,
|
||||
cancelable: true
|
||||
}));
|
||||
});
|
||||
}
|
||||
background.addEventListener("click", function() {
|
||||
document.dispatchEvent(
|
||||
new CustomEvent("modal-close", {
|
||||
bubbles: false,
|
||||
cancelable: true
|
||||
})
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
if(!buttonAlias) {
|
||||
buttonElements.forEach((button) => {
|
||||
if (!buttonAlias) {
|
||||
buttonElements.forEach(button => {
|
||||
button.innerText = buttonText;
|
||||
button.className = buttonClass;
|
||||
button.type = "button";
|
||||
|
||||
button.innerText = buttonText;
|
||||
button.className = buttonClass;
|
||||
button.type = 'button';
|
||||
if (buttonIcon) {
|
||||
let iconElement = document.createElement("i");
|
||||
iconElement.className = buttonIcon;
|
||||
|
||||
if(buttonIcon) {
|
||||
let iconElement = document.createElement('i');
|
||||
iconElement.className = buttonIcon;
|
||||
button.insertBefore(iconElement, button.firstChild);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
button.insertBefore(iconElement, button.firstChild);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (buttonEvent) {
|
||||
buttonElements.forEach(button => {
|
||||
button.addEventListener("click", function() {
|
||||
document.dispatchEvent(
|
||||
new CustomEvent(buttonEvent, {
|
||||
bubbles: false,
|
||||
cancelable: true
|
||||
})
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if(buttonEvent) {
|
||||
buttonElements.forEach((button) => {
|
||||
button.addEventListener('click', function () {
|
||||
document.dispatchEvent(new CustomEvent(buttonEvent, {
|
||||
bubbles: false,
|
||||
cancelable: true
|
||||
}));
|
||||
});
|
||||
});
|
||||
}
|
||||
element.classList.add("modal");
|
||||
|
||||
element.classList.add('modal');
|
||||
if (!buttonAlias) {
|
||||
// Add to DOM when not alias
|
||||
buttonElements.forEach(button => {
|
||||
element.parentNode.insertBefore(button, element);
|
||||
});
|
||||
}
|
||||
|
||||
if(!buttonAlias) { // Add to DOM when not alias
|
||||
buttonElements.forEach((button) => {
|
||||
element.parentNode.insertBefore(button, element);
|
||||
});
|
||||
}
|
||||
let open = function() {
|
||||
document.documentElement.classList.add("modal-open");
|
||||
|
||||
let open = function () {
|
||||
document.documentElement.classList.add('modal-open');
|
||||
document.dispatchEvent(
|
||||
new CustomEvent("modal-open", {
|
||||
bubbles: false,
|
||||
cancelable: true
|
||||
})
|
||||
);
|
||||
|
||||
document.dispatchEvent(new CustomEvent('modal-open', {
|
||||
bubbles: false,
|
||||
cancelable: true
|
||||
}));
|
||||
element.classList.add("open");
|
||||
element.classList.remove("close");
|
||||
};
|
||||
|
||||
element.classList.add('open');
|
||||
element.classList.remove('close');
|
||||
};
|
||||
let close = function() {
|
||||
document.documentElement.classList.remove("modal-open");
|
||||
|
||||
let close = function () {
|
||||
document.documentElement.classList.remove('modal-open');
|
||||
element.classList.add("close");
|
||||
element.classList.remove("open");
|
||||
};
|
||||
|
||||
element.classList.add('close');
|
||||
element.classList.remove('open');
|
||||
};
|
||||
if (name) {
|
||||
document
|
||||
.querySelectorAll("[data-ui-modal-ref='" + name + "']")
|
||||
.forEach(function(elem) {
|
||||
elem.addEventListener("click", open);
|
||||
});
|
||||
}
|
||||
|
||||
if(name) {
|
||||
document.querySelectorAll("[data-ui-modal-ref='" + name + "']").forEach(function(elem) {
|
||||
elem.addEventListener('click', open);
|
||||
});
|
||||
}
|
||||
if (openEvent) {
|
||||
document.addEventListener(openEvent, open);
|
||||
}
|
||||
|
||||
if(openEvent) {
|
||||
document.addEventListener(openEvent, open);
|
||||
}
|
||||
buttonElements.forEach(button => {
|
||||
button.addEventListener("click", open);
|
||||
});
|
||||
|
||||
buttonElements.forEach((button) => {
|
||||
button.addEventListener('click', open);
|
||||
});
|
||||
|
||||
document.addEventListener('keydown', function(event) {
|
||||
if (event.which === 27) {
|
||||
close();
|
||||
}
|
||||
});
|
||||
|
||||
element.addEventListener('blur', close);
|
||||
|
||||
let closeButtons = element.querySelectorAll('[data-ui-modal-close]');
|
||||
|
||||
for(let i =0; i < closeButtons.length; i++){
|
||||
closeButtons[i].addEventListener('click', close);
|
||||
}
|
||||
|
||||
document.addEventListener('modal-close', close);
|
||||
element.addEventListener('submit', close);
|
||||
}
|
||||
document.addEventListener("keydown", function(event) {
|
||||
if (event.which === 27) {
|
||||
close();
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
})(window);
|
||||
element.addEventListener("blur", close);
|
||||
|
||||
let closeButtons = element.querySelectorAll("[data-ui-modal-close]");
|
||||
|
||||
for (let i = 0; i < closeButtons.length; i++) {
|
||||
closeButtons[i].addEventListener("click", close);
|
||||
}
|
||||
|
||||
document.addEventListener("modal-close", close);
|
||||
element.addEventListener("submit", close);
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
+109
-104
@@ -1,117 +1,122 @@
|
||||
(function (window) {
|
||||
window.ls.container.get('view').add({
|
||||
selector: 'data-ls-ui-open',
|
||||
controller: function(element, window) {
|
||||
let def = (element.classList.contains('open')) ? 'open' : 'close';
|
||||
let buttonClass = element.dataset['buttonClass'] || 'ls-ui-open';
|
||||
let buttonText = element.dataset['buttonText'] || '';
|
||||
let buttonIcon = element.dataset['buttonIcon'] || '';
|
||||
let buttonSelector = element.dataset['buttonSelector'] || '';
|
||||
let hover = element.hasAttribute('data-hover');
|
||||
let blur = element.hasAttribute('data-blur');
|
||||
let button = window.document.createElement('button');
|
||||
(function(window) {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-ls-ui-open",
|
||||
controller: function(element, window) {
|
||||
let def = element.classList.contains("open") ? "open" : "close";
|
||||
let buttonClass = element.dataset["buttonClass"] || "ls-ui-open";
|
||||
let buttonText = element.dataset["buttonText"] || "";
|
||||
let buttonIcon = element.dataset["buttonIcon"] || "";
|
||||
let buttonSelector = element.dataset["buttonSelector"] || "";
|
||||
let hover = element.hasAttribute("data-hover");
|
||||
let blur = element.hasAttribute("data-blur");
|
||||
let button = window.document.createElement("button");
|
||||
|
||||
let isTouch = function() {
|
||||
return 'ontouchstart' in window // works on most browsers
|
||||
|| navigator.maxTouchPoints; // works on IE10/11 and Surface
|
||||
};
|
||||
let isTouch = function() {
|
||||
return (
|
||||
"ontouchstart" in window || navigator.maxTouchPoints // works on most browsers
|
||||
); // works on IE10/11 and Surface
|
||||
};
|
||||
|
||||
button.innerText = buttonText;
|
||||
button.className = buttonClass;
|
||||
button.tabIndex = 1;
|
||||
button.type = 'button';
|
||||
button.innerText = buttonText;
|
||||
button.className = buttonClass;
|
||||
button.tabIndex = 1;
|
||||
button.type = "button";
|
||||
|
||||
if(buttonIcon) {
|
||||
let icon = window.document.createElement('i');
|
||||
if (buttonIcon) {
|
||||
let icon = window.document.createElement("i");
|
||||
|
||||
icon.className = buttonIcon;
|
||||
icon.className = buttonIcon;
|
||||
|
||||
button.insertBefore(icon, button.firstChild);
|
||||
}
|
||||
button.insertBefore(icon, button.firstChild);
|
||||
}
|
||||
|
||||
if(def === 'close') {
|
||||
element.classList.add('close');
|
||||
element.classList.remove('open');
|
||||
}
|
||||
else {
|
||||
element.classList.add('open');
|
||||
element.classList.remove('close');
|
||||
}
|
||||
if (def === "close") {
|
||||
element.classList.add("close");
|
||||
element.classList.remove("open");
|
||||
} else {
|
||||
element.classList.add("open");
|
||||
element.classList.remove("close");
|
||||
}
|
||||
|
||||
button.addEventListener('click', function() {
|
||||
element.classList.toggle('open');
|
||||
element.classList.toggle('close');
|
||||
});
|
||||
button.addEventListener("click", function() {
|
||||
element.classList.toggle("open");
|
||||
element.classList.toggle("close");
|
||||
});
|
||||
|
||||
if(hover && !isTouch()) {
|
||||
element.addEventListener('mouseover', function() {
|
||||
element.classList.add('open');
|
||||
element.classList.remove('close');
|
||||
});
|
||||
if (hover && !isTouch()) {
|
||||
element.addEventListener("mouseover", function() {
|
||||
element.classList.add("open");
|
||||
element.classList.remove("close");
|
||||
});
|
||||
|
||||
element.addEventListener('mouseout', function() {
|
||||
element.classList.add('close');
|
||||
element.classList.remove('open');
|
||||
});
|
||||
}
|
||||
element.addEventListener("mouseout", function() {
|
||||
element.classList.add("close");
|
||||
element.classList.remove("open");
|
||||
});
|
||||
}
|
||||
|
||||
let close = function() {
|
||||
element.classList.add('close');
|
||||
element.classList.remove('open');
|
||||
};
|
||||
let close = function() {
|
||||
element.classList.add("close");
|
||||
element.classList.remove("open");
|
||||
};
|
||||
|
||||
let closeDelay = function() {
|
||||
window.setTimeout(function() {
|
||||
close();
|
||||
}, 150);
|
||||
};
|
||||
let closeDelay = function() {
|
||||
window.setTimeout(function() {
|
||||
close();
|
||||
}, 150);
|
||||
};
|
||||
|
||||
let findParent = function(tagName, el) {
|
||||
if ((el.nodeName || el.tagName).toLowerCase() === tagName.toLowerCase()){
|
||||
return el;
|
||||
}
|
||||
while (el = el.parentNode){
|
||||
if ((el.nodeName || el.tagName).toLowerCase() === tagName.toLowerCase()){
|
||||
return el;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
if(blur) {
|
||||
button.addEventListener('blur', closeDelay);
|
||||
}
|
||||
|
||||
if(buttonSelector) {
|
||||
let buttonElements = element.querySelectorAll(buttonSelector);
|
||||
|
||||
buttonElements.forEach((node) => {
|
||||
node.addEventListener('click', function() {
|
||||
element.classList.toggle('open');
|
||||
element.classList.toggle('close');
|
||||
});
|
||||
|
||||
if(blur) {
|
||||
node.addEventListener('blur', closeDelay);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
element.addEventListener('click', function (event) {
|
||||
let target = findParent('a', event.target);
|
||||
|
||||
if(!target) {
|
||||
return false; // no target
|
||||
}
|
||||
|
||||
if(!target.href) { // Just a normal click not an href
|
||||
return false;
|
||||
}
|
||||
|
||||
closeDelay();
|
||||
});
|
||||
|
||||
element.insertBefore(button, element.firstChild);
|
||||
let findParent = function(tagName, el) {
|
||||
if (
|
||||
(el.nodeName || el.tagName).toLowerCase() === tagName.toLowerCase()
|
||||
) {
|
||||
return el;
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
while ((el = el.parentNode)) {
|
||||
if (
|
||||
(el.nodeName || el.tagName).toLowerCase() === tagName.toLowerCase()
|
||||
) {
|
||||
return el;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
if (blur) {
|
||||
button.addEventListener("blur", closeDelay);
|
||||
}
|
||||
|
||||
if (buttonSelector) {
|
||||
let buttonElements = element.querySelectorAll(buttonSelector);
|
||||
|
||||
buttonElements.forEach(node => {
|
||||
node.addEventListener("click", function() {
|
||||
element.classList.toggle("open");
|
||||
element.classList.toggle("close");
|
||||
});
|
||||
|
||||
if (blur) {
|
||||
node.addEventListener("blur", closeDelay);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
element.addEventListener("click", function(event) {
|
||||
let target = findParent("a", event.target);
|
||||
|
||||
if (!target) {
|
||||
return false; // no target
|
||||
}
|
||||
|
||||
if (!target.href) {
|
||||
// Just a normal click not an href
|
||||
return false;
|
||||
}
|
||||
|
||||
closeDelay();
|
||||
});
|
||||
|
||||
element.insertBefore(button, element.firstChild);
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,94 +1,111 @@
|
||||
(function (window) {
|
||||
window.ls.container.get('view').add(
|
||||
{
|
||||
selector: 'data-ui-phases',
|
||||
controller: function(element, window, document, expression, router) {
|
||||
var tabs = document.createElement('ul');
|
||||
var container = document.createElement('div');
|
||||
var titles = Array.prototype.slice.call(element.getElementsByTagName('h2'));
|
||||
var next = Array.prototype.slice.call(element.querySelectorAll('[data-next]'));
|
||||
var previous = Array.prototype.slice.call(element.querySelectorAll('[data-previous]'));
|
||||
var position = 0;
|
||||
var init = false;
|
||||
(function(window) {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-ui-phases",
|
||||
controller: function(element, window, document, expression, router) {
|
||||
var tabs = document.createElement("ul");
|
||||
var container = document.createElement("div");
|
||||
var titles = Array.prototype.slice.call(
|
||||
element.getElementsByTagName("h2")
|
||||
);
|
||||
var next = Array.prototype.slice.call(
|
||||
element.querySelectorAll("[data-next]")
|
||||
);
|
||||
var previous = Array.prototype.slice.call(
|
||||
element.querySelectorAll("[data-previous]")
|
||||
);
|
||||
var position = 0;
|
||||
var init = false;
|
||||
|
||||
for (var i = 0; i < element.children.length; i++) {
|
||||
var tabState = expression.parse(element.children[i].dataset['state'] || '');
|
||||
for (var i = 0; i < element.children.length; i++) {
|
||||
var tabState = expression.parse(
|
||||
element.children[i].dataset["state"] || ""
|
||||
);
|
||||
|
||||
if(tabState === (window.location.pathname + window.location.search).substring(0, tabState.length)) {
|
||||
position = i;
|
||||
}
|
||||
}
|
||||
|
||||
var setTab = function (index) {
|
||||
var tabState = expression.parse(element.children[index].dataset['state'] || '');
|
||||
var url = '';
|
||||
|
||||
if((tabState !== '') && (tabState !== window.location.pathname + window.location.search)) {
|
||||
var parser = document.createElement('a');
|
||||
parser.href = tabState;
|
||||
url = (!init) ? parser.pathname + window.location.search : tabState;
|
||||
|
||||
if(position != index) { // When tab has changed add state to history
|
||||
window.history.pushState({}, '', url);
|
||||
router.reset();
|
||||
}
|
||||
}
|
||||
|
||||
element.children[position].classList.remove('selected');
|
||||
element.children[index].classList.add('selected');
|
||||
tabs.children[position].classList.remove('selected');
|
||||
tabs.children[index].classList.add('selected');
|
||||
position = index;
|
||||
|
||||
document.dispatchEvent(new CustomEvent('tab-changed'));
|
||||
|
||||
init = true;
|
||||
};
|
||||
|
||||
tabs.classList.add('tabs');
|
||||
container.classList.add('container');
|
||||
container.classList.add('close');
|
||||
|
||||
container.dataset['lsUiOpen'] = '';
|
||||
container.dataset['buttonClass'] = 'icon icon-down-dir';
|
||||
|
||||
titles.map(function(obj, i) {
|
||||
var title = document.createElement('li');
|
||||
title.innerHTML = obj.innerHTML;
|
||||
title.className = obj.className;
|
||||
title.tabIndex = 0;
|
||||
tabs.appendChild(title);
|
||||
|
||||
title.addEventListener('click', function () {
|
||||
setTab(i);
|
||||
});
|
||||
|
||||
title.addEventListener('keyup', function () {
|
||||
if(event.which === 13) {
|
||||
setTab(i);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
next.map(function(obj) {
|
||||
obj.addEventListener('click', function () {
|
||||
setTab(position + 1)
|
||||
});
|
||||
});
|
||||
|
||||
previous.map(function(obj) {
|
||||
obj.addEventListener('click', function () {
|
||||
setTab(position - 1)
|
||||
});
|
||||
});
|
||||
|
||||
setTab(position);
|
||||
|
||||
container.appendChild(tabs);
|
||||
|
||||
element.parentNode.insertBefore(container, element);
|
||||
}
|
||||
if (
|
||||
tabState ===
|
||||
(window.location.pathname + window.location.search).substring(
|
||||
0,
|
||||
tabState.length
|
||||
)
|
||||
) {
|
||||
position = i;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
})(window);
|
||||
var setTab = function(index) {
|
||||
var tabState = expression.parse(
|
||||
element.children[index].dataset["state"] || ""
|
||||
);
|
||||
var url = "";
|
||||
|
||||
if (
|
||||
tabState !== "" &&
|
||||
tabState !== window.location.pathname + window.location.search
|
||||
) {
|
||||
var parser = document.createElement("a");
|
||||
parser.href = tabState;
|
||||
url = !init ? parser.pathname + window.location.search : tabState;
|
||||
|
||||
if (position != index) {
|
||||
// When tab has changed add state to history
|
||||
window.history.pushState({}, "", url);
|
||||
router.reset();
|
||||
}
|
||||
}
|
||||
|
||||
element.children[position].classList.remove("selected");
|
||||
element.children[index].classList.add("selected");
|
||||
tabs.children[position].classList.remove("selected");
|
||||
tabs.children[index].classList.add("selected");
|
||||
position = index;
|
||||
|
||||
document.dispatchEvent(new CustomEvent("tab-changed"));
|
||||
|
||||
init = true;
|
||||
};
|
||||
|
||||
tabs.classList.add("tabs");
|
||||
container.classList.add("container");
|
||||
container.classList.add("close");
|
||||
|
||||
container.dataset["lsUiOpen"] = "";
|
||||
container.dataset["buttonClass"] = "icon icon-down-dir";
|
||||
|
||||
titles.map(function(obj, i) {
|
||||
var title = document.createElement("li");
|
||||
title.innerHTML = obj.innerHTML;
|
||||
title.className = obj.className;
|
||||
title.tabIndex = 0;
|
||||
tabs.appendChild(title);
|
||||
|
||||
title.addEventListener("click", function() {
|
||||
setTab(i);
|
||||
});
|
||||
|
||||
title.addEventListener("keyup", function() {
|
||||
if (event.which === 13) {
|
||||
setTab(i);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
next.map(function(obj) {
|
||||
obj.addEventListener("click", function() {
|
||||
setTab(position + 1);
|
||||
});
|
||||
});
|
||||
|
||||
previous.map(function(obj) {
|
||||
obj.addEventListener("click", function() {
|
||||
setTab(position - 1);
|
||||
});
|
||||
});
|
||||
|
||||
setTab(position);
|
||||
|
||||
container.appendChild(tabs);
|
||||
|
||||
element.parentNode.insertBefore(container, element);
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
(function (window) {
|
||||
window.ls.container.get('view').add({
|
||||
selector: 'data-ls-ui-trigger',
|
||||
controller: function(element, document) {
|
||||
let trigger = element.dataset['lsUiTrigger'];
|
||||
let event = element.dataset['event'] || 'click';
|
||||
|
||||
element.addEventListener(event, function() {
|
||||
document.dispatchEvent(new CustomEvent(trigger));
|
||||
});
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
(function(window) {
|
||||
window.ls.container.get("view").add({
|
||||
selector: "data-ls-ui-trigger",
|
||||
controller: function(element, document) {
|
||||
let trigger = element.dataset["lsUiTrigger"];
|
||||
let event = element.dataset["event"] || "click";
|
||||
|
||||
element.addEventListener(event, function() {
|
||||
document.dispatchEvent(new CustomEvent(trigger));
|
||||
});
|
||||
}
|
||||
});
|
||||
})(window);
|
||||
|
||||
Reference in New Issue
Block a user