diff --git a/app/views/home/auth/signup.phtml b/app/views/home/auth/signup.phtml index 864dcd416e..4f4d31dfa2 100644 --- a/app/views/home/auth/signup.phtml +++ b/app/views/home/auth/signup.phtml @@ -38,7 +38,7 @@ use Utopia\Locale\Locale;
- escape(Locale::getText('home.auth.signup.labels.agree')); ?>escape(Locale::getText('home.auth.signup.labels.terms')); ?>escape(Locale::getText('home.auth.signup.labels.and')); ?>escape(Locale::getText('home.auth.signup.labels.privacy')); ?> + escape(Locale::getText('home.auth.signup.labels.agree')); ?>escape(Locale::getText('home.auth.signup.labels.terms')); ?>escape(Locale::getText('home.auth.signup.labels.and')); ?>escape(Locale::getText('home.auth.signup.labels.privacy')); ?> diff --git a/public/scripts/app.js b/public/scripts/app.js index 84456807c3..f8016e58a2 100644 --- a/public/scripts/app.js +++ b/public/scripts/app.js @@ -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; - } - }) -; \ No newline at end of file + element.dataset["canvas"] = true; + } + }); diff --git a/public/scripts/filters.js b/public/scripts/filters.js index 03eafd675a..a22424176e 100644 --- a/public/scripts/filters.js +++ b/public/scripts/filters.js @@ -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<>>(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>>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;F127)&&(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 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) + '' + units[u] + ''; - }) - .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) + + '' + + units[u] + + "" + ); + }) + .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 -} \ No newline at end of file + } + if (forcePlaces !== false) { + rounded = Number(rounded).toFixed(forcePlaces); + } + return rounded + abbr; +} diff --git a/public/scripts/init.js b/public/scripts/init.js index d77e960215..d89122038a 100644 --- a/public/scripts/init.js +++ b/public/scripts/init.js @@ -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); \ No newline at end of file +document.addEventListener( + "http-get-401", + function() { + /* on error */ + document.dispatchEvent(new CustomEvent("logout")); + }, + true +); diff --git a/public/scripts/routes.js b/public/scripts/routes.js index a9d349a484..80c5f88714 100644 --- a/public/scripts/routes.js +++ b/public/scripts/routes.js @@ -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 + }); diff --git a/public/scripts/views/analytics/event.js b/public/scripts/views/analytics/event.js index f8ed53ca0b..5305b23df2 100644 --- a/public/scripts/views/analytics/event.js +++ b/public/scripts/views/analytics/event.js @@ -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); \ No newline at end of file + ga("send", { + hitType: "event", + eventCategory: category, + eventAction: action, + eventLabel: label + }); + }); + } + }); +})(window); diff --git a/public/scripts/views/analytics/pageview.js b/public/scripts/views/analytics/pageview.js index 7ce63970f1..9e573c7785 100644 --- a/public/scripts/views/analytics/pageview.js +++ b/public/scripts/views/analytics/pageview.js @@ -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); \ No newline at end of file + ga("send", "pageview"); + } + }); +})(window); diff --git a/public/scripts/views/forms/clone.js b/public/scripts/views/forms/clone.js index e4839b14e3..9ed5cd3ff6 100644 --- a/public/scripts/views/forms/clone.js +++ b/public/scripts/views/forms/clone.js @@ -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); \ No newline at end of file + 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); diff --git a/public/scripts/views/forms/code.js b/public/scripts/views/forms/code.js index 03f164ac12..65a9900e94 100644 --- a/public/scripts/views/forms/code.js +++ b/public/scripts/views/forms/code.js @@ -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); \ No newline at end of file + + 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); diff --git a/public/scripts/views/forms/color.js b/public/scripts/views/forms/color.js index a9f4b727b8..7f498cc79c 100644 --- a/public/scripts/views/forms/color.js +++ b/public/scripts/views/forms/color.js @@ -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); \ No newline at end of file + function syncA() { + element.value = picker.value; + update(); + } + + function syncB() { + picker.value = element.value; + } + + element.parentNode.insertBefore(preview, element); + + update(); + syncB(); + } + }); +})(window); diff --git a/public/scripts/views/forms/copy.js b/public/scripts/views/forms/copy.js index d1c6d0d3fb..6312904f4d 100644 --- a/public/scripts/views/forms/copy.js +++ b/public/scripts/views/forms/copy.js @@ -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); \ No newline at end of file + element.disabled = true; + + alerts.add({ text: "Copied to clipboard", class: "" }, 3000); + }; + + button.addEventListener("click", copy); + } + }); +})(window); diff --git a/public/scripts/views/forms/filter.js b/public/scripts/views/forms/filter.js index 1a842838bf..8768c24de8 100644 --- a/public/scripts/views/forms/filter.js +++ b/public/scripts/views/forms/filter.js @@ -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); \ No newline at end of file + 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); diff --git a/public/scripts/views/forms/parent-down.js b/public/scripts/views/forms/parent-down.js index bad94a257d..98c78d7ac9 100644 --- a/public/scripts/views/forms/parent-down.js +++ b/public/scripts/views/forms/parent-down.js @@ -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); \ No newline at end of file + }); + } + }); +})(window); diff --git a/public/scripts/views/forms/parent-remove.js b/public/scripts/views/forms/parent-remove.js index 8f1e69bdc1..9d588a00bf 100644 --- a/public/scripts/views/forms/parent-remove.js +++ b/public/scripts/views/forms/parent-remove.js @@ -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); \ No newline at end of file + element.addEventListener("click", function() { + target.parentNode.removeChild(target); + element.scrollIntoView({ behavior: "smooth" }); + }); + } + }); +})(window); diff --git a/public/scripts/views/forms/parent-up.js b/public/scripts/views/forms/parent-up.js index 45337c2fd4..96c939999f 100644 --- a/public/scripts/views/forms/parent-up.js +++ b/public/scripts/views/forms/parent-up.js @@ -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); \ No newline at end of file + }); + } + }); +})(window); diff --git a/public/scripts/views/forms/password-meter.js b/public/scripts/views/forms/password-meter.js index 4dfde07562..070e8740b7 100644 --- a/public/scripts/views/forms/password-meter.js +++ b/public/scripts/views/forms/password-meter.js @@ -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 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); \ No newline at end of file + // 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); diff --git a/public/scripts/views/forms/pell.js b/public/scripts/views/forms/pell.js index fcbf7542ee..9e705e30c6 100644 --- a/public/scripts/views/forms/pell.js +++ b/public/scripts/views/forms/pell.js @@ -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: '' - }, - { - name: 'underline', - icon: '' - }, - { - name: 'italic', - icon: '' - }, - { - name: 'olist', - icon: '' - }, - { - name: 'ulist', - icon: '' - }, - { - name: 'link', - icon: '' - } - ] - }); - - 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); \ No newline at end of file + 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: '' + }, + { + name: "underline", + icon: '' + }, + { + name: "italic", + icon: '' + }, + { + name: "olist", + icon: '' + }, + { + name: "ulist", + icon: '' + }, + { + name: "link", + icon: '' + } + ] + }); + + 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); diff --git a/public/scripts/views/forms/remove.js b/public/scripts/views/forms/remove.js index 99b9da8527..3fcd8b1af7 100644 --- a/public/scripts/views/forms/remove.js +++ b/public/scripts/views/forms/remove.js @@ -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); \ No newline at end of file + 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); diff --git a/public/scripts/views/forms/switch.js b/public/scripts/views/forms/switch.js index 528888e357..3d6267d632 100644 --- a/public/scripts/views/forms/switch.js +++ b/public/scripts/views/forms/switch.js @@ -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); \ No newline at end of file + element.parentNode.insertBefore(input, element); + } + }); +})(window); diff --git a/public/scripts/views/forms/tags.js b/public/scripts/views/forms/tags.js index 4f49cd30ba..9fbed40434 100644 --- a/public/scripts/views/forms/tags.js +++ b/public/scripts/views/forms/tags.js @@ -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); \ No newline at end of file + 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); diff --git a/public/scripts/views/forms/text-count.js b/public/scripts/views/forms/text-count.js index c6447b138c..4250b22b3a 100644 --- a/public/scripts/views/forms/text-count.js +++ b/public/scripts/views/forms/text-count.js @@ -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); \ No newline at end of file + element.addEventListener("keyup", count); + element.addEventListener("change", count); + element.addEventListener("cut", count); + element.addEventListener("paste", count); + element.addEventListener("drop", count); + + count(); + } + }); +})(window); diff --git a/public/scripts/views/forms/text-direction.js b/public/scripts/views/forms/text-direction.js index 370281b480..08c33043df 100644 --- a/public/scripts/views/forms/text-direction.js +++ b/public/scripts/views/forms/text-direction.js @@ -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); \ No newline at end of file + 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); diff --git a/public/scripts/views/forms/text-resize.js b/public/scripts/views/forms/text-resize.js index fa2feaa1b6..0326f35abc 100644 --- a/public/scripts/views/forms/text-resize.js +++ b/public/scripts/views/forms/text-resize.js @@ -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); \ No newline at end of file + resize(); + } + }); +})(window); diff --git a/public/scripts/views/forms/upload.js b/public/scripts/views/forms/upload.js index c27da5e16a..e91551afa3 100644 --- a/public/scripts/views/forms/upload.js +++ b/public/scripts/views/forms/upload.js @@ -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 = ' ' + labelButton; - upload.tabIndex = 0; + upload.className = "button reverse margin-bottom"; + upload.innerHTML = ' ' + 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); \ No newline at end of file + 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); diff --git a/public/scripts/views/general/page-title.js b/public/scripts/views/general/page-title.js index 4746e8f591..3c9d307c81 100644 --- a/public/scripts/views/general/page-title.js +++ b/public/scripts/views/general/page-title.js @@ -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); \ No newline at end of file +(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); diff --git a/public/scripts/views/general/setup.js b/public/scripts/views/general/setup.js index 3705de1a2c..0f19e93166 100644 --- a/public/scripts/views/general/setup.js +++ b/public/scripts/views/general/setup.js @@ -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); \ No newline at end of file + 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); diff --git a/public/scripts/views/general/switch.js b/public/scripts/views/general/switch.js index 056c147fcd..33eff72c0f 100644 --- a/public/scripts/views/general/switch.js +++ b/public/scripts/views/general/switch.js @@ -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); \ No newline at end of file + + if (element.value === router.params.project) { + return; + } + + return router.change("/console/home?project=" + element.value); + }; + + element.addEventListener("change", function() { + check(); + }); + } + }); +})(window); diff --git a/public/scripts/views/paging/back.js b/public/scripts/views/paging/back.js index 3941c65c37..e69b380b09 100644 --- a/public/scripts/views/paging/back.js +++ b/public/scripts/views/paging/back.js @@ -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); \ No newline at end of file + }; + + 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); diff --git a/public/scripts/views/paging/next.js b/public/scripts/views/paging/next.js index 940d1ea3e4..b7e3fc932e 100644 --- a/public/scripts/views/paging/next.js +++ b/public/scripts/views/paging/next.js @@ -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); \ No newline at end of file + }; + + 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); diff --git a/public/scripts/views/service.js b/public/scripts/views/service.js index 3a9072ee59..cc77b5e6f6 100644 --- a/public/scripts/views/service.js +++ b/public/scripts/views/service.js @@ -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); \ No newline at end of file + }; + + /** + * 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); diff --git a/public/scripts/views/ui/highlight.js b/public/scripts/views/ui/highlight.js index 62d8ab4bd8..9abe271fcb 100644 --- a/public/scripts/views/ui/highlight.js +++ b/public/scripts/views/ui/highlight.js @@ -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); \ No newline at end of file + + 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); diff --git a/public/scripts/views/ui/modal.js b/public/scripts/views/ui/modal.js index 1c6f039eb5..421e5c1ba4 100644 --- a/public/scripts/views/ui/modal.js +++ b/public/scripts/views/ui/modal.js @@ -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); \ No newline at end of file + 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); diff --git a/public/scripts/views/ui/open.js b/public/scripts/views/ui/open.js index 5cdb1bdb2c..af56ff0342 100644 --- a/public/scripts/views/ui/open.js +++ b/public/scripts/views/ui/open.js @@ -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); \ No newline at end of file + 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); diff --git a/public/scripts/views/ui/phases.js b/public/scripts/views/ui/phases.js index 0dbe47c16d..6e7e5fa757 100644 --- a/public/scripts/views/ui/phases.js +++ b/public/scripts/views/ui/phases.js @@ -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); \ No newline at end of file + 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); diff --git a/public/scripts/views/ui/trigger.js b/public/scripts/views/ui/trigger.js index f79bb17654..77f1e7ad34 100644 --- a/public/scripts/views/ui/trigger.js +++ b/public/scripts/views/ui/trigger.js @@ -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); \ No newline at end of file +(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);