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);