Updated JS coding standards using prettier

This commit is contained in:
eldadfux
2019-09-13 13:47:07 +03:00
parent be7fddc303
commit 91ee8160bf
35 changed files with 2805 additions and 2400 deletions
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
});
+22 -24
View File
@@ -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);
+19 -22
View File
@@ -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);
+86 -81
View File
@@ -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);
+60 -64
View File
@@ -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);
+35 -38
View File
@@ -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);
+28 -32
View File
@@ -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);
+164 -156
View File
@@ -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);
+15 -18
View File
@@ -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);
+14 -17
View File
@@ -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);
+15 -18
View File
@@ -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);
+56 -64
View File
@@ -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
View File
@@ -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);
+16 -16
View File
@@ -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);
+23 -26
View File
@@ -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);
+89 -88
View File
@@ -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);
+30 -29
View File
@@ -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);
+79 -39
View File
@@ -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);
+35 -27
View File
@@ -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);
+195 -175
View File
@@ -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);
+11 -12
View File
@@ -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);
+36 -28
View File
@@ -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);
+21 -21
View File
@@ -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);
+33 -32
View File
@@ -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);
+36 -35
View File
@@ -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
View File
@@ -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);
+40 -38
View File
@@ -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);
+106 -99
View File
@@ -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
View File
@@ -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);
+107 -90
View File
@@ -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);
+13 -13
View File
@@ -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);