diff --git a/src/components/Component.js b/src/components/Component.js index 5c9396f..6be4c9c 100644 --- a/src/components/Component.js +++ b/src/components/Component.js @@ -41,7 +41,7 @@ class Component { Router.setRoute(URLHelper.getPage() + href); if (href.includes('machine-learning') || href.includes('deep-learning')) { - const pipeline = href.substring(1).replace('-', '_'); + const pipeline = href.substring(1).replace(/-/g, '_'); sessionStorage.setItem('pipeline', pipeline); } }); diff --git a/src/components/admin/administration/app-keys/AppKeys.js b/src/components/admin/administration/app-keys/AppKeys.js index 0d696ea..774ba10 100644 --- a/src/components/admin/administration/app-keys/AppKeys.js +++ b/src/components/admin/administration/app-keys/AppKeys.js @@ -33,16 +33,20 @@ class AppKeys extends Component { if (this.reload || sotredAppKeys === undefined) { this.initView(true); - getKeys('/apps/keys', this.context).then(response => { - if (response) { - Store.add({ - id: 'app-keys', - data: response.data - }); - allAppKeys = response.data; - this.render(); - } - }); + getKeys('/apps/keys', this.context) + .then(response => { + if (response) { + Store.add({ + id: 'app-keys', + data: response.data + }); + allAppKeys = response.data; + this.render(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { this.render(); } @@ -136,20 +140,28 @@ class AppKeys extends Component { const askMessage = 'Every single key will be permanently revoked and applications using them may no longer work properly. Make sure all of their creators agreed with such a change.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - revokeKeys('/apps/keys/revoke', this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - response.data.total + ' keys successfully revoked.' - ); - // eslint-disable-next-line no-new - new AppKeys(true); - } - }); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + revokeKeys('/apps/keys/revoke', this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + response.data.total + ' keys successfully revoked.' + ); + // eslint-disable-next-line no-new + new AppKeys(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } addBtnListener(event) { @@ -159,57 +171,65 @@ class AppKeys extends Component { const content = formAppKeysTemplate({ update: false }); const elems = ['name', 'description']; - ModalHelper.edit('Generate a new app key', content, 'generate', elems).then( - result => { + ModalHelper.edit('Generate a new app key', content, 'generate', elems) + .then(result => { if (result.value) { const data = { name: result.value.name.toLowerCase(), description: result.value.description.toLowerCase() }; - generateKey('/apps/keys/generate', data, this.context).then(response => { - if (response) { - const content = formCopyKeyTemplate({ key: response.data.app.key }); - const elems = ['key']; - - ModalHelper.edit('Your new app key', content, 'OK', elems, false).then( - response => { - if (response) { - // eslint-disable-next-line no-new - new AppKeys(true); - } - } - ); - - const copyBtn = document.querySelector('button#copy-key'); - copyBtn.addEventListener( - 'click', - event => { - event.preventDefault(); - event.stopImmediatePropagation(); - const keyInput = document.querySelector('input#key'); - - keyInput.select(); - keyInput.setSelectionRange(0, 99999); - document.execCommand('copy'); - - if (window.getSelection) { - window.getSelection().removeAllRanges(); - } else { - document.selection.empty(); - } - - copyBtn.children[0].classList.remove('far', 'fa-clipboard'); - copyBtn.children[0].classList.add('fas', 'fa-check'); - copyBtn.disabled = true; - }, - false - ); - } - }); + generateKey('/apps/keys/generate', data, this.context) + .then(response => { + if (response) { + const content = formCopyKeyTemplate({ key: response.data.app.key }); + const elems = ['key']; + + ModalHelper.edit('Your new app key', content, 'OK', elems, false) + .then(response => { + if (response) { + // eslint-disable-next-line no-new + new AppKeys(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + + const copyBtn = document.querySelector('button#copy-key'); + copyBtn.addEventListener( + 'click', + event => { + event.preventDefault(); + event.stopImmediatePropagation(); + const keyInput = document.querySelector('input#key'); + + keyInput.select(); + keyInput.setSelectionRange(0, 99999); + document.execCommand('copy'); + + if (window.getSelection) { + window.getSelection().removeAllRanges(); + } else { + document.selection.empty(); + } + + copyBtn.children[0].classList.remove('far', 'fa-clipboard'); + copyBtn.children[0].classList.add('fas', 'fa-check'); + copyBtn.disabled = true; + }, + false + ); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } setActions(appKeys) { @@ -222,7 +242,7 @@ class AppKeys extends Component { buttons.forEach(button => { const appKeyId = button.closest('#app-key-infos').dataset.key; - const key = appKeys.find(elem => elem._id === appKeyId); + const key = Array.prototype.find.call(appKeys, elem => elem._id === appKeyId); button.addEventListener('click', event => { event.preventDefault(); @@ -231,17 +251,28 @@ class AppKeys extends Component { const askTitle = 'Revoke key ?'; const askMessage = `${key.name} will be permanently revoked and applications using it may no longer work properly. Make sure its creator agreed with such a change.`; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - revokeKeys('/apps/keys/revoke/' + appKeyId, this.context).then(response => { - if (response) { - ModalHelper.notification('success', key.name + ' successfully revoked.'); - // eslint-disable-next-line no-new - new AppKeys(true); - } - }); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + revokeKeys('/apps/keys/revoke/' + appKeyId, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + key.name + ' successfully revoked.' + ); + // eslint-disable-next-line no-new + new AppKeys(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } @@ -251,7 +282,7 @@ class AppKeys extends Component { buttons.forEach(button => { const appKeyId = button.closest('#app-key-infos').dataset.key; - const key = appKeys.find(elem => elem._id === appKeyId); + const key = Array.prototype.find.call(appKeys, elem => elem._id === appKeyId); button.addEventListener('click', event => { event.preventDefault(); @@ -264,21 +295,29 @@ class AppKeys extends Component { const elems = ['name', 'description']; - ModalHelper.edit('Edit app key', content, 'update', elems).then(result => { - if (result.value) { - const data = result.value; - updateKey('/apps/keys/' + appKeyId, data, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - response.data.appKey.name + ' successfully updated' - ); - // eslint-disable-next-line no-new - new AppKeys(true); - } - }); - } - }); + ModalHelper.edit('Edit app key', content, 'update', elems) + .then(result => { + if (result.value) { + const data = result.value; + updateKey('/apps/keys/' + appKeyId, data, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + response.data.appKey.name + ' successfully updated' + ); + // eslint-disable-next-line no-new + new AppKeys(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } diff --git a/src/components/admin/administration/jobs-log/JobsLog.js b/src/components/admin/administration/jobs-log/JobsLog.js index 6e72bd6..b5ca2bb 100644 --- a/src/components/admin/administration/jobs-log/JobsLog.js +++ b/src/components/admin/administration/jobs-log/JobsLog.js @@ -173,6 +173,9 @@ class JobsLog extends Component { if (response) { fileDownload(response.data, 'jobs.log'); } + }) + .catch(error => { + ModalHelper.notification('error', error); }); } diff --git a/src/components/admin/administration/ml-management/algo-management/AlgoManagement.js b/src/components/admin/administration/ml-management/algo-management/AlgoManagement.js index 614e36f..f7900c1 100644 --- a/src/components/admin/administration/ml-management/algo-management/AlgoManagement.js +++ b/src/components/admin/administration/ml-management/algo-management/AlgoManagement.js @@ -33,16 +33,20 @@ class AlgoManagement extends Component { if (this.reload || algoStore === undefined) { this.initView(true); - getAlgorithms('/algos', this.context).then(response => { - if (response) { - Store.add({ - id: 'algorithms', - data: response.data - }); - allAlgorithms = response.data; - this.render(); - } - }); + getAlgorithms('/algos', this.context) + .then(response => { + if (response) { + Store.add({ + id: 'algorithms', + data: response.data + }); + allAlgorithms = response.data; + this.render(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { this.render(); } @@ -140,28 +144,36 @@ class AlgoManagement extends Component { const content = formAlgoTemplate(); const elems = ['label', 'type', 'enabled', 'container']; - ModalHelper.edit('Add a new algorithm', content, 'add', elems).then(result => { - if (result.value) { - const data = { - label: result.value.label.toLowerCase(), - type: result.value.type, - container: result.value.container, - enabled: result.value.enabled === 'true' - }; - - addAlgo('/algos', data, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - response.data.label + ' successfully created.' - ); - this.removeTaskAlgoListStore(); - // eslint-disable-next-line no-new - new AlgoManagement(true); - } - }); - } - }); + ModalHelper.edit('Add a new algorithm', content, 'add', elems) + .then(result => { + if (result.value) { + const data = { + label: result.value.label.toLowerCase(), + type: result.value.type, + container: result.value.container, + enabled: result.value.enabled === 'true' + }; + + addAlgo('/algos', data, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + response.data.label + ' successfully created.' + ); + this.removeTaskAlgoListStore(); + // eslint-disable-next-line no-new + new AlgoManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const labelInput = document.querySelector('input#label'); const containerInput = document.querySelector('input#container'); @@ -297,22 +309,30 @@ class AlgoManagement extends Component { }); const elems = ['label', 'type', 'container', 'enabled']; - ModalHelper.edit('Edit algorithm', content, 'update', elems).then(result => { - if (result.value) { - const data = result.value; - updateAlgo('/algos/' + algoId, data, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - response.data.algo.label + ' successfully updated' - ); - this.removeTaskAlgoListStore(); - // eslint-disable-next-line no-new - new AlgoManagement(true); - } - }); - } - }); + ModalHelper.edit('Edit algorithm', content, 'update', elems) + .then(result => { + if (result.value) { + const data = result.value; + updateAlgo('/algos/' + algoId, data, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + response.data.algo.label + ' successfully updated' + ); + this.removeTaskAlgoListStore(); + // eslint-disable-next-line no-new + new AlgoManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const labelInput = document.querySelector('input#label'); const containerInput = document.querySelector('input#container'); @@ -335,21 +355,29 @@ class AlgoManagement extends Component { const askTitle = 'Delete ' + algo.label + ' ?'; const askMessage = algo.label + ' will be permanently deleted.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - deleteAlgo('/algos/' + algoId, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - algo.label + ' successfully deleted.' - ); - this.removeTaskAlgoListStore(); - // eslint-disable-next-line no-new - new AlgoManagement(true); - } - }); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + deleteAlgo('/algos/' + algoId, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + algo.label + ' successfully deleted.' + ); + this.removeTaskAlgoListStore(); + // eslint-disable-next-line no-new + new AlgoManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } diff --git a/src/components/admin/administration/ml-management/feature-management/FeatureManagement.js b/src/components/admin/administration/ml-management/feature-management/FeatureManagement.js index 13dccd3..a26b911 100644 --- a/src/components/admin/administration/ml-management/feature-management/FeatureManagement.js +++ b/src/components/admin/administration/ml-management/feature-management/FeatureManagement.js @@ -5,6 +5,7 @@ import Store from '@Store'; import axios from 'axios'; import APIHelper from '@APIHelper'; import FeatureContent from './feature-content/FeatureContent'; +import ModalHelper from '@ModalHelper'; let allSources; @@ -28,18 +29,22 @@ class FeatureManagement extends Component { if (storedSources === undefined) { this.render(true); - getSources('/sources', this.context).then(response => { - if (response) { - allSources = response.data.sources; - - Store.add({ - id: 'admin-data-sources', - data: allSources - }); - - this.make(); - } - }); + getSources('/sources', this.context) + .then(response => { + if (response) { + allSources = response.data.sources; + + Store.add({ + id: 'admin-data-sources', + data: allSources + }); + + this.make(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { allSources = storedSources.data; this.make(); diff --git a/src/components/admin/administration/ml-management/feature-management/feature-content/FeatureContent.js b/src/components/admin/administration/ml-management/feature-management/feature-content/FeatureContent.js index 4d38228..b893aa0 100644 --- a/src/components/admin/administration/ml-management/feature-management/feature-content/FeatureContent.js +++ b/src/components/admin/administration/ml-management/feature-management/feature-content/FeatureContent.js @@ -30,16 +30,20 @@ class FeatureContent extends Component { if (this.reload || featureStore === undefined) { this.initView(true); - getFeatures(`/features?source=${this.dataSource}`, this.context).then(response => { - if (response) { - Store.add({ - id: 'feature-content', - data: response.data - }); - allFeatures = response.data; - this.render(); - } - }); + getFeatures(`/features?source=${this.dataSource}`, this.context) + .then(response => { + if (response) { + Store.add({ + id: 'feature-content', + data: response.data + }); + allFeatures = response.data; + this.render(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { this.render(); } @@ -136,29 +140,37 @@ class FeatureContent extends Component { const content = formFeatureTemplate(); const elems = ['label', 'domain', 'container', 'enabled']; - ModalHelper.edit('Add a new feature', content, 'add', elems).then(result => { - if (result.value) { - const data = { - label: result.value.label.toLowerCase(), - domain: result.value.domain, - container: result.value.container, - enabled: result.value.enabled === 'true', - source: this.dataSource.toLowerCase() - }; - - addFeature('/features', data, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - response.data.label + ' successfully created.' - ); - this.removeTaskFeatureListStore(); - // eslint-disable-next-line no-new - new FeatureContent(this.dataSource, true, '#features'); - } - }); - } - }); + ModalHelper.edit('Add a new feature', content, 'add', elems) + .then(result => { + if (result.value) { + const data = { + label: result.value.label.toLowerCase(), + domain: result.value.domain, + container: result.value.container, + enabled: result.value.enabled === 'true', + source: this.dataSource.toLowerCase() + }; + + addFeature('/features', data, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + response.data.label + ' successfully created.' + ); + this.removeTaskFeatureListStore(); + // eslint-disable-next-line no-new + new FeatureContent(this.dataSource, true, '#features'); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const labelInput = document.querySelector('input#label'); const containerInput = document.querySelector('input#container'); @@ -212,22 +224,30 @@ class FeatureContent extends Component { }); const elems = ['label', 'domain', 'container', 'enabled']; - ModalHelper.edit('Edit feature', content, 'update', elems).then(result => { - if (result.value) { - const data = result.value; - updateFeature('/features/' + featureId, data, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - response.data.feature.label + ' successfully updated.' - ); - this.removeTaskFeatureListStore(); - // eslint-disable-next-line no-new - new FeatureContent(this.dataSource, true, '#features'); - } - }); - } - }); + ModalHelper.edit('Edit feature', content, 'update', elems) + .then(result => { + if (result.value) { + const data = result.value; + updateFeature('/features/' + featureId, data, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + response.data.feature.label + ' successfully updated.' + ); + this.removeTaskFeatureListStore(); + // eslint-disable-next-line no-new + new FeatureContent(this.dataSource, true, '#features'); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const labelInput = document.querySelector('input#label'); const containerInput = document.querySelector('input#container'); @@ -262,23 +282,29 @@ class FeatureContent extends Component { ? feature.label + ' will be disabled.' : feature.label + ' will be enabled.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - const confirmMessage = feature.enabled - ? feature.label + ' is now disabled.' - : feature.label + ' is now enabled.'; - updateState(`/features/${featureId}/state`, data, this.context).then( - response => { - if (response) { - ModalHelper.notification('success', confirmMessage); - this.removeTaskFeatureListStore(); - // eslint-disable-next-line no-new - new FeatureContent(this.dataSource, true, '#features'); - } - } - ); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + const confirmMessage = feature.enabled + ? feature.label + ' is now disabled.' + : feature.label + ' is now enabled.'; + updateState(`/features/${featureId}/state`, data, this.context) + .then(response => { + if (response) { + ModalHelper.notification('success', confirmMessage); + this.removeTaskFeatureListStore(); + // eslint-disable-next-line no-new + new FeatureContent(this.dataSource, true, '#features'); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } @@ -295,21 +321,29 @@ class FeatureContent extends Component { const askTitle = 'Delete ' + feature.label + ' ?'; const askMessage = feature.label + ' will be permanently deleted.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - deleteFeature('/features/' + featureId, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - feature.label + ' successfully deleted.' - ); - this.removeTaskFeatureListStore(); - // eslint-disable-next-line no-new - new FeatureContent(this.dataSource, true, '#features'); - } - }); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + deleteFeature('/features/' + featureId, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + feature.label + ' successfully deleted.' + ); + this.removeTaskFeatureListStore(); + // eslint-disable-next-line no-new + new FeatureContent(this.dataSource, true, '#features'); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } diff --git a/src/components/admin/administration/ml-management/windowing-management/WindowingManagement.js b/src/components/admin/administration/ml-management/windowing-management/WindowingManagement.js index ceb314c..5de88cd 100644 --- a/src/components/admin/administration/ml-management/windowing-management/WindowingManagement.js +++ b/src/components/admin/administration/ml-management/windowing-management/WindowingManagement.js @@ -32,16 +32,20 @@ class WindowingManagement extends Component { if (this.reload || funcStore === undefined) { this.initView(true); - getFunctions('/windows', this.context).then(response => { - if (response) { - Store.add({ - id: 'window-functions', - data: response.data - }); - allWindowFunctions = response.data; - this.render(); - } - }); + getFunctions('/windows', this.context) + .then(response => { + if (response) { + Store.add({ + id: 'window-functions', + data: response.data + }); + allWindowFunctions = response.data; + this.render(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { this.render(); } @@ -133,27 +137,35 @@ class WindowingManagement extends Component { const content = formFuncTemplate(); const elems = ['label', 'enabled', 'container']; - ModalHelper.edit('Add a new window function', content, 'add', elems).then(result => { - if (result.value) { - const data = { - label: result.value.label.toLowerCase(), - container: result.value.container, - enabled: result.value.enabled === 'true' - }; - - addFunction('/windows', data, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - response.data.label + ' successfully created.' - ); - this.removeTaskWindowTypeStore(); - // eslint-disable-next-line no-new - new WindowingManagement(true); - } - }); - } - }); + ModalHelper.edit('Add a new window function', content, 'add', elems) + .then(result => { + if (result.value) { + const data = { + label: result.value.label.toLowerCase(), + container: result.value.container, + enabled: result.value.enabled === 'true' + }; + + addFunction('/windows', data, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + response.data.label + ' successfully created.' + ); + this.removeTaskWindowTypeStore(); + // eslint-disable-next-line no-new + new WindowingManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const labelInput = document.querySelector('input#label'); const containerInput = document.querySelector('input#container'); @@ -206,24 +218,30 @@ class WindowingManagement extends Component { }); const elems = ['label', 'container', 'enabled']; - ModalHelper.edit('Edit window function', content, 'update', elems).then( - result => { + ModalHelper.edit('Edit window function', content, 'update', elems) + .then(result => { if (result.value) { const data = result.value; - update('/windows/' + funcId, data, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - response.data.function.label + ' successfully updated.' - ); - this.removeTaskWindowTypeStore(); - // eslint-disable-next-line no-new - new WindowingManagement(true); - } - }); + update('/windows/' + funcId, data, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + response.data.function.label + ' successfully updated.' + ); + this.removeTaskWindowTypeStore(); + // eslint-disable-next-line no-new + new WindowingManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const labelInput = document.querySelector('input#label'); const containerInput = document.querySelector('input#container'); @@ -259,21 +277,29 @@ class WindowingManagement extends Component { ? func.label + ' will be disabled.' : func.label + ' will be enabled.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - const confirmMessage = func.enabled - ? func.label + ' is now disabled.' - : func.label + ' is now enabled.'; - update(`/windows/${funcId}/state`, data, this.context).then(response => { - if (response) { - ModalHelper.notification('success', confirmMessage); - this.removeTaskWindowTypeStore(); - // eslint-disable-next-line no-new - new WindowingManagement(true); - } - }); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + const confirmMessage = func.enabled + ? func.label + ' is now disabled.' + : func.label + ' is now enabled.'; + update(`/windows/${funcId}/state`, data, this.context) + .then(response => { + if (response) { + ModalHelper.notification('success', confirmMessage); + this.removeTaskWindowTypeStore(); + // eslint-disable-next-line no-new + new WindowingManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } @@ -290,21 +316,29 @@ class WindowingManagement extends Component { const askTitle = 'Delete ' + func.label + ' ?'; const askMessage = func.label + ' will be permanently deleted.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - deleteFunction('/windows/' + funcId, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - func.label + ' successfully deleted.' - ); - this.removeTaskWindowTypeStore(); - // eslint-disable-next-line no-new - new WindowingManagement(true); - } - }); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + deleteFunction('/windows/' + funcId, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + func.label + ' successfully deleted.' + ); + this.removeTaskWindowTypeStore(); + // eslint-disable-next-line no-new + new WindowingManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } diff --git a/src/components/admin/administration/source-management/SourceManagement.js b/src/components/admin/administration/source-management/SourceManagement.js index 79f1ecb..c85df94 100644 --- a/src/components/admin/administration/source-management/SourceManagement.js +++ b/src/components/admin/administration/source-management/SourceManagement.js @@ -28,16 +28,20 @@ class SourceManagement extends Component { if (this.reload || storedSources === undefined) { this.initView(true); - getSources('/sources', this.context).then(response => { - if (response) { - Store.add({ - id: 'data-sources', - data: response.data - }); - allSources = response.data; - this.render(); - } - }); + getSources('/sources', this.context) + .then(response => { + if (response) { + Store.add({ + id: 'data-sources', + data: response.data + }); + allSources = response.data; + this.render(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { this.render(); } @@ -124,27 +128,35 @@ class SourceManagement extends Component { const content = formSourceTemplate(); const elems = ['label', 'enabled', 'editable-files']; - ModalHelper.edit('Add a new data source', content, 'add', elems).then(result => { - if (result.value) { - const data = { - label: result.value.label.toLowerCase(), - enabled: result.value.enabled === 'true', - editableFiles: result.value['editable-files'] - }; - - addSource('/sources', data, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - response.data.label + ' successfully created.' - ); - this.removeStoredDataSources(); - // eslint-disable-next-line no-new - new SourceManagement(true); - } - }); - } - }); + ModalHelper.edit('Add a new data source', content, 'add', elems) + .then(result => { + if (result.value) { + const data = { + label: result.value.label.toLowerCase(), + enabled: result.value.enabled === 'true', + editableFiles: result.value['editable-files'] + }; + + addSource('/sources', data, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + response.data.label + ' successfully created.' + ); + this.removeStoredDataSources(); + // eslint-disable-next-line no-new + new SourceManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const labelInput = document.querySelector('input#label'); this.inputListener(labelInput); @@ -191,24 +203,30 @@ class SourceManagement extends Component { ? source.label + ' will be disabled.' : source.label + ' will be enabled.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - const confirmMessage = source.enabled - ? source.label + ' is now disabled.' - : source.label + ' is now enabled.'; - - updateState(`/sources/${sourceId}/state`, data, this.context).then( - response => { - if (response) { - ModalHelper.notification('success', confirmMessage); - this.removeStoredDataSources(); - // eslint-disable-next-line no-new - new SourceManagement(true); - } - } - ); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + const confirmMessage = source.enabled + ? source.label + ' is now disabled.' + : source.label + ' is now enabled.'; + + updateState(`/sources/${sourceId}/state`, data, this.context) + .then(response => { + if (response) { + ModalHelper.notification('success', confirmMessage); + this.removeStoredDataSources(); + // eslint-disable-next-line no-new + new SourceManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } diff --git a/src/components/admin/administration/temp-password/TempPassword.js b/src/components/admin/administration/temp-password/TempPassword.js index 386b67a..79fb0f4 100644 --- a/src/components/admin/administration/temp-password/TempPassword.js +++ b/src/components/admin/administration/temp-password/TempPassword.js @@ -47,11 +47,13 @@ class TempPassword extends Component { tempPasswordConfirm: jsonData.tempPasswordConfirm.trim() }; - setTempPassword('/admin/users/password/' + data.email, data, this.context).then( - response => { + setTempPassword('/admin/users/password/' + data.email, data, this.context) + .then(response => { ModalHelper.notification('success', response.message); - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); } @@ -66,14 +68,18 @@ class TempPassword extends Component { if (!(value.trim() === '')) { if (EmailValidator.validate(value)) { - getUserByEmail('/admin/users/email/' + value, this.context).then(response => { - const data = response.data.user; - const userName = StringHelper.capitalizeFirst(data.firstname).concat( - ' ', - StringHelper.getFirstLetterCapitalized(data.lastname) - ); - ModalHelper.notification('success', 'Correct email for ' + userName); - }); + getUserByEmail('/admin/users/email/' + value, this.context) + .then(response => { + const data = response.data.user; + const userName = StringHelper.capitalizeFirst(data.firstname).concat( + ' ', + StringHelper.getFirstLetterCapitalized(data.lastname) + ); + ModalHelper.notification('success', 'Correct email for ' + userName); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } } } diff --git a/src/components/admin/administration/user-management/UserManagement.js b/src/components/admin/administration/user-management/UserManagement.js index 5bb36dd..305a2cd 100644 --- a/src/components/admin/administration/user-management/UserManagement.js +++ b/src/components/admin/administration/user-management/UserManagement.js @@ -104,29 +104,37 @@ class UserManagement extends Component { (usersAdminStore === undefined && usersNormalStore === undefined) ) { this.initView(true); - getUsers('/admin/users?role=admin', this.context).then(response => { - if (response) { - Store.add({ - id: 'users-admin', - data: response.data - }); + getUsers('/admin/users?role=admin', this.context) + .then(response => { + if (response) { + Store.add({ + id: 'users-admin', + data: response.data + }); - usersAdmin = response.data; + usersAdmin = response.data; - getUsers('/admin/users', this.context).then(response => { - if (response) { - Store.add({ - id: 'users-normal', - data: response.data + getUsers('/admin/users', this.context) + .then(response => { + if (response) { + Store.add({ + id: 'users-normal', + data: response.data + }); + + usersNormal = response.data; + usersNormalFull = response.data.users; + this.render(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); }); - - usersNormal = response.data; - usersNormalFull = response.data.users; - this.render(); - } - }); - } - }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { this.render(); } @@ -209,29 +217,36 @@ class UserManagement extends Component { const elems = ['email', 'lastname', 'firstname', 'role']; - ModalHelper.edit('Edit information', content, 'update', elems).then(result => { - if (result.value) { - const data = result.value; - - updateUser('/admin/users/' + userId, data, this.context).then(response => { - if (response) { - const user = response.data.user; - - const userFullName = StringHelper.capitalizeFirst(user.firstname).concat( - ' ', - StringHelper.capitalizeFirst(user.lastname) - ); - - ModalHelper.notification( - 'success', - userFullName + ' successfully updated.' - ); - // eslint-disable-next-line no-new - new UserManagement(true); - } - }); - } - }); + ModalHelper.edit('Edit information', content, 'update', elems) + .then(result => { + if (result.value) { + const data = result.value; + + updateUser('/admin/users/' + userId, data, this.context) + .then(response => { + if (response) { + const user = response.data.user; + + const userFullName = StringHelper.capitalizeFirst( + user.firstname + ).concat(' ', StringHelper.capitalizeFirst(user.lastname)); + + ModalHelper.notification( + 'success', + userFullName + ' successfully updated.' + ); + // eslint-disable-next-line no-new + new UserManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const lastnameInput = document.querySelector('input#lastname'); const firstnameInput = document.querySelector('input#firstname'); @@ -269,24 +284,30 @@ class UserManagement extends Component { ? userFullName + ' will loose all privileges.' : userFullName + ' will receive admin privileges.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - const confirmMessage = - role === 'admin' - ? 'Admin privileges revoked.' - : 'Admin privileges granted.'; - - updateRole(`/admin/users/${userId}/role`, data, this.context).then( - response => { - if (response) { - ModalHelper.notification('success', confirmMessage); - // eslint-disable-next-line no-new - new UserManagement(true); - } - } - ); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + const confirmMessage = + role === 'admin' + ? 'Admin privileges revoked.' + : 'Admin privileges granted.'; + + updateRole(`/admin/users/${userId}/role`, data, this.context) + .then(response => { + if (response) { + ModalHelper.notification('success', confirmMessage); + // eslint-disable-next-line no-new + new UserManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } @@ -310,20 +331,28 @@ class UserManagement extends Component { const askTitle = 'Delete ' + userFullName + ' ?'; const askMessage = userFullName + ' will be permanently deleted.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - deleteUser('/admin/users/' + userId, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - userFullName + ' successfully deleted.' - ); - // eslint-disable-next-line no-new - new UserManagement(true); - } - }); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + deleteUser('/admin/users/' + userId, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + userFullName + ' successfully deleted.' + ); + // eslint-disable-next-line no-new + new UserManagement(true); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } diff --git a/src/components/admin/data/data-import/DataImport.js b/src/components/admin/data/data-import/DataImport.js index 42b0bbb..a518595 100644 --- a/src/components/admin/data/data-import/DataImport.js +++ b/src/components/admin/data/data-import/DataImport.js @@ -41,18 +41,22 @@ class DataImport extends Component { if (storedSources === undefined) { this.render(true); - getSources('/sources', this.context).then(response => { - if (response) { - allSources = response.data.sources; - - Store.add({ - id: 'import-data-sources', - data: allSources - }); + getSources('/sources', this.context) + .then(response => { + if (response) { + allSources = response.data.sources; + + Store.add({ + id: 'import-data-sources', + data: allSources + }); - this.make(); - } - }); + this.make(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { allSources = storedSources.data; this.make(); @@ -332,13 +336,17 @@ class DataImport extends Component { const title = response.data.message; const message = 'Do you want to override it ?'; - ModalHelper.confirm(title, message).then(result => { - if (result.value) { - this.uploadFile(formData, true); - } else { - this.resetFileUpload(); - } - }); + ModalHelper.confirm(title, message) + .then(result => { + if (result.value) { + this.uploadFile(formData, true); + } else { + this.resetFileUpload(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { this.uploadFile(formData); } diff --git a/src/components/admin/data/data-management/file-content/FileContent.js b/src/components/admin/data/data-management/file-content/FileContent.js index 4559aaa..52ee3d9 100644 --- a/src/components/admin/data/data-management/file-content/FileContent.js +++ b/src/components/admin/data/data-management/file-content/FileContent.js @@ -43,18 +43,22 @@ class FileContent extends Component { if (storedSources === undefined) { this.render(true); - getSources('/sources', this.context).then(response => { - if (response) { - allSources = response.data.sources; + getSources('/sources', this.context) + .then(response => { + if (response) { + allSources = response.data.sources; - Store.add({ - id: 'file-atts-data-sources', - data: allSources - }); + Store.add({ + id: 'file-atts-data-sources', + data: allSources + }); - this.make(); - } - }); + this.make(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { allSources = storedSources.data; this.make(); @@ -124,27 +128,37 @@ class FileContent extends Component { initFileListData() { this.renderFileList(true); - getFiles(`/files?source=${this.dataSource}&type=raw`, this.context).then(response => { - if (response) { - rawFiles = SortHelper.sortArrayAlpha(response.data, 'filename', 'asc'); - Store.add({ - id: 'raw-files', - data: rawFiles - }); - getFiles(`/files?source=${this.dataSource}&type=features`, this.context).then( - response => { - if (response) { - featuresFiles = SortHelper.sortArrayAlpha(response.data, 'filename', 'asc'); - Store.add({ - id: 'features-files', - data: featuresFiles - }); - this.makeFileList(); - } - } - ); - } - }); + getFiles(`/files?source=${this.dataSource}&type=raw`, this.context) + .then(response => { + if (response) { + rawFiles = SortHelper.sortArrayAlpha(response.data, 'filename', 'asc'); + Store.add({ + id: 'raw-files', + data: rawFiles + }); + getFiles(`/files?source=${this.dataSource}&type=features`, this.context) + .then(response => { + if (response) { + featuresFiles = SortHelper.sortArrayAlpha( + response.data, + 'filename', + 'asc' + ); + Store.add({ + id: 'features-files', + data: featuresFiles + }); + this.makeFileList(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } renderFileList(loading = true) { diff --git a/src/components/admin/data/data-management/file-content/attribute-content/AttributeContent.js b/src/components/admin/data/data-management/file-content/attribute-content/AttributeContent.js index 946a1d6..fea2edc 100644 --- a/src/components/admin/data/data-management/file-content/attribute-content/AttributeContent.js +++ b/src/components/admin/data/data-management/file-content/attribute-content/AttributeContent.js @@ -48,12 +48,16 @@ class AttributeContent extends Component { getFileHeaders( `/files/${this.selectedFile}/headers?source=${this.dataSource}&type=${this.selectedFileType}`, this.context - ).then(response => { - if (response) { - this.attributes = response.data; - this.make(); - } - }); + ) + .then(response => { + if (response) { + this.attributes = response.data; + this.make(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } } @@ -105,25 +109,29 @@ class AttributeContent extends Component { getFileHeaders( `/files/${this.selectedFile}/headers?source=${this.dataSource}&type=${this.selectedFileType}`, this.context - ).then(response => { - if (response) { - this.attributes = response.data; - container.innerHTML = attributeListTemplate({ - attributes: this.attributes, - loading: false - }); - this.setActions(); - const saveBtn = this.context.querySelector('button#save'); - if (!saveBtn.classList.contains('disabled')) { - if (this.edited) { - saveBtn.classList.remove('primary'); - saveBtn.classList.add('disabled'); - saveBtn.setAttribute('disabled', true); - this.edited = false; + ) + .then(response => { + if (response) { + this.attributes = response.data; + container.innerHTML = attributeListTemplate({ + attributes: this.attributes, + loading: false + }); + this.setActions(); + const saveBtn = this.context.querySelector('button#save'); + if (!saveBtn.classList.contains('disabled')) { + if (this.edited) { + saveBtn.classList.remove('primary'); + saveBtn.classList.add('disabled'); + saveBtn.setAttribute('disabled', true); + this.edited = false; + } } } - } - }); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } } @@ -149,39 +157,43 @@ class AttributeContent extends Component { attribute: attribute }); const elems = ['attribute-name']; - ModalHelper.edit('Edit Attribute', content, 'Update', elems).then(result => { - if (result.value) { - const data = { - label: result.value['attribute-name'] - }; - for (let i = 0; i < this.attributes.length; ++i) { - const att = this.attributes[i]; - if (att.label === attribute) { - if (!(data.label === att.label)) { - if (!(storedEdit === undefined)) { - const invertedMap = new Map( - [...storedEdit.data.entries()].map(([key, value]) => [value, key]) - ); - const originalAtt = invertedMap.get(att.label); - if (!(originalAtt === undefined)) { - if (originalAtt === data.label) { - storedEdit.data.delete(originalAtt); + ModalHelper.edit('Edit Attribute', content, 'Update', elems) + .then(result => { + if (result.value) { + const data = { + label: result.value['attribute-name'] + }; + for (let i = 0; i < this.attributes.length; ++i) { + const att = this.attributes[i]; + if (att.label === attribute) { + if (!(data.label === att.label)) { + if (!(storedEdit === undefined)) { + const invertedMap = new Map( + [...storedEdit.data.entries()].map(([key, value]) => [value, key]) + ); + const originalAtt = invertedMap.get(att.label); + if (!(originalAtt === undefined)) { + if (originalAtt === data.label) { + storedEdit.data.delete(originalAtt); + } else { + storedEdit.data.set(originalAtt, data.label); + } } else { - storedEdit.data.set(originalAtt, data.label); + storedEdit.data.set(att.label, data.label); } - } else { - storedEdit.data.set(att.label, data.label); } + att.label = data.label; } - att.label = data.label; } } - } - this.edited = true; - this.buildAttributeList(false); - } - }); + this.edited = true; + this.buildAttributeList(false); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const attributeNameInput = document.querySelector('input#attribute-name'); this.inputListener(attributeNameInput); }); @@ -211,81 +223,97 @@ class AttributeContent extends Component { 'Save new file...', true, false - ).then(result => { - if (result.value) { - const loader = ModalHelper.loading( - 'Saving file...', - 'Please wait while the file is begin saved' - ); - saveFile( - `/files/${this.selectedFile}/edit?source=${this.dataSource}&type=${this.selectedFileType}&override=true`, - data, - this.context - ).then(response => { - if (response) { - loader.close(); - ModalHelper.notification('success', response.message); - // eslint-disable-next-line no-new - new AttributeContent( - '#att-content', - this.dataSource, - this.selectedFile, - this.selectedFileType, - this.attributes - ); - } - }); - } else { - const content = saveFileTemplate({ - filename: this.selectedFile.split('.').slice(0, -1) - }); - const elems = ['filename']; - ModalHelper.edit('Create File', content, 'Create', elems).then(result => { - if (result.value) { - const loader = ModalHelper.loading( - 'Saving file...', - 'Please wait while the file is begin saved' - ); - data.newFilename = - result.value.filename + '.' + this.selectedFile.split('.').pop(); - saveFile( - `/files/${this.selectedFile}/edit?source=${this.dataSource}&type=${this.selectedFileType}&override=false`, - data, - this.context - ).then(response => { + ) + .then(result => { + if (result.value) { + const loader = ModalHelper.loading( + 'Saving file...', + 'Please wait while the file is begin saved' + ); + saveFile( + `/files/${this.selectedFile}/edit?source=${this.dataSource}&type=${this.selectedFileType}&override=true`, + data, + this.context + ) + .then(response => { if (response) { loader.close(); ModalHelper.notification('success', response.message); - - if (this.selectedFileType === 'raw') { - Store.remove('raw-files'); - const fileRawStore = Store.get('admin-file-raw'); - if (!(fileRawStore === undefined)) { - Store.remove('admin-file-raw'); - } - } else if (this.selectedFileType === 'features') { - Store.remove('features-files'); - const fileFeatureStore = Store.get('admin-file-features'); - if (!(fileFeatureStore === undefined)) { - Store.remove('admin-file-features'); - } - } // eslint-disable-next-line no-new - new FileContent( - null, + new AttributeContent( + '#att-content', this.dataSource, this.selectedFile, this.selectedFileType, - true + this.attributes ); } + }) + .catch(error => { + ModalHelper.notification('error', error); }); - } - }); - const filenameInput = document.querySelector('input#filename'); - this.inputListener(filenameInput); - } - }); + } else { + const content = saveFileTemplate({ + filename: this.selectedFile.split('.').slice(0, -1) + }); + const elems = ['filename']; + ModalHelper.edit('Create File', content, 'Create', elems) + .then(result => { + if (result.value) { + const loader = ModalHelper.loading( + 'Saving file...', + 'Please wait while the file is begin saved' + ); + data.newFilename = + result.value.filename + '.' + this.selectedFile.split('.').pop(); + saveFile( + `/files/${this.selectedFile}/edit?source=${this.dataSource}&type=${this.selectedFileType}&override=false`, + data, + this.context + ) + .then(response => { + if (response) { + loader.close(); + ModalHelper.notification('success', response.message); + + if (this.selectedFileType === 'raw') { + Store.remove('raw-files'); + const fileRawStore = Store.get('admin-file-raw'); + if (!(fileRawStore === undefined)) { + Store.remove('admin-file-raw'); + } + } else if (this.selectedFileType === 'features') { + Store.remove('features-files'); + const fileFeatureStore = Store.get('admin-file-features'); + if (!(fileFeatureStore === undefined)) { + Store.remove('admin-file-features'); + } + } + // eslint-disable-next-line no-new + new FileContent( + null, + this.dataSource, + this.selectedFile, + this.selectedFileType, + true + ); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + const filenameInput = document.querySelector('input#filename'); + this.inputListener(filenameInput); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }, false ); @@ -303,31 +331,35 @@ class AttributeContent extends Component { event.stopImmediatePropagation(); const askTitle = 'Delete attribute ?'; const askMessage = attribute + ' will be permanently deleted.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - for (let i = 0; i < this.attributes.length; ++i) { - const att = this.attributes[i]; - if (att.pos > position) { - att.pos = att.pos - 1; + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + for (let i = 0; i < this.attributes.length; ++i) { + const att = this.attributes[i]; + if (att.pos > position) { + att.pos = att.pos - 1; + } } - } - const storedEdit = Store.get('edit-list'); - if (!(storedEdit === undefined)) { - const invertedMap = new Map( - [...storedEdit.data.entries()].map(([key, value]) => [value, key]) - ); - const originalAtt = invertedMap.get(attribute); - if (!(originalAtt === undefined)) { - storedEdit.data.set(originalAtt, 'none'); - } else { - storedEdit.data.set(attribute, 'none'); + const storedEdit = Store.get('edit-list'); + if (!(storedEdit === undefined)) { + const invertedMap = new Map( + [...storedEdit.data.entries()].map(([key, value]) => [value, key]) + ); + const originalAtt = invertedMap.get(attribute); + if (!(originalAtt === undefined)) { + storedEdit.data.set(originalAtt, 'none'); + } else { + storedEdit.data.set(attribute, 'none'); + } } + this.attributes = this.attributes.filter(att => att.label !== attribute); + this.edited = true; + this.buildAttributeList(false); } - this.attributes = this.attributes.filter(att => att.label !== attribute); - this.edited = true; - this.buildAttributeList(false); - } - }); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } @@ -338,13 +370,9 @@ class AttributeContent extends Component { event => { event.preventDefault(); event.stopImmediatePropagation(); - switch (input.id) { - case 'filename': - input.value = input.value.replace(/[^0-9a-zA-Z_]/gi, '_').toLowerCase(); - break; - case 'attribute-name': - input.value = input.value.replace(/[^0-9a-zA-Z_]/gi, '_').toLowerCase(); - break; + + if (input.id === 'filename' || input.id === 'attribute-name') { + input.value = input.value.replace(/[^0-9a-zA-Z_]/gi, '_').toLowerCase(); } }, false diff --git a/src/components/admin/data/data-visualisation/DataVisualisation.js b/src/components/admin/data/data-visualisation/DataVisualisation.js index 4ce810a..6b236bb 100644 --- a/src/components/admin/data/data-visualisation/DataVisualisation.js +++ b/src/components/admin/data/data-visualisation/DataVisualisation.js @@ -39,18 +39,22 @@ class DataVisualisation extends Component { if (storedSources === undefined) { this.render(true); - getSources('/sources', this.context).then(response => { - if (response) { - allSources = response.data.sources; + getSources('/sources', this.context) + .then(response => { + if (response) { + allSources = response.data.sources; - Store.add({ - id: 'data-viz-sources', - data: allSources - }); + Store.add({ + id: 'data-viz-sources', + data: allSources + }); - this.make(); - } - }); + this.make(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { allSources = storedSources.data; this.make(); @@ -98,8 +102,8 @@ class DataVisualisation extends Component { if (rawStore === undefined || featuredStore === undefined) { this.renderFileList(true); - getFiles(`/files?source=${this.dataSource}&type=raw`, this.context).then( - response => { + getFiles(`/files?source=${this.dataSource}&type=raw`, this.context) + .then(response => { if (response) { rawFiles = SortHelper.sortArrayAlpha(response.data, 'filename', 'asc'); @@ -108,8 +112,8 @@ class DataVisualisation extends Component { data: rawFiles }); - getFiles(`/files?source=${this.dataSource}&type=features`, this.context).then( - response => { + getFiles(`/files?source=${this.dataSource}&type=features`, this.context) + .then(response => { if (response) { featuresFiles = SortHelper.sortArrayAlpha( response.data, @@ -124,11 +128,15 @@ class DataVisualisation extends Component { this.makeContent(); } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { if (!refresh) { rawFiles = rawStore.data; @@ -196,12 +204,16 @@ class DataVisualisation extends Component { getFileHeaders( `/files/${this.selectedFile}/headers?source=${this.dataSource}&type=${this.selectedFileType}`, this.context - ).then(response => { - if (response) { - attributes = response.data; - this.renderAttributeList(false); - } - }); + ) + .then(response => { + if (response) { + attributes = response.data; + this.renderAttributeList(false); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } renderAttributeList(loading = true) { diff --git a/src/components/admin/data/file-management/FileManagement.js b/src/components/admin/data/file-management/FileManagement.js index 5c3759f..6b9e64d 100644 --- a/src/components/admin/data/file-management/FileManagement.js +++ b/src/components/admin/data/file-management/FileManagement.js @@ -5,6 +5,7 @@ import Store from '@Store'; import axios from 'axios'; import APIHelper from '@APIHelper'; import FileContent from './file-content/FileContent'; +import ModalHelper from '@ModalHelper'; let allSources; @@ -28,18 +29,22 @@ class FileManagement extends Component { if (storedSources === undefined) { this.render(true); - getSources('/sources', this.context).then(response => { - if (response) { - allSources = response.data.sources; - - Store.add({ - id: 'files-data-sources', - data: allSources - }); - - this.make(); - } - }); + getSources('/sources', this.context) + .then(response => { + if (response) { + allSources = response.data.sources; + + Store.add({ + id: 'files-data-sources', + data: allSources + }); + + this.make(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { allSources = storedSources.data; this.make(); diff --git a/src/components/admin/data/file-management/file-content/FileContent.js b/src/components/admin/data/file-management/file-content/FileContent.js index 99a33f6..59f6b3f 100644 --- a/src/components/admin/data/file-management/file-content/FileContent.js +++ b/src/components/admin/data/file-management/file-content/FileContent.js @@ -41,41 +41,46 @@ class FileContent extends Component { fileFeatureStore === undefined ) { this.initView(true); - getFiles(`/files?source=${this.dataSource}&type=models`, this.context).then( - response => { + getFiles(`/files?source=${this.dataSource}&type=models`, this.context) + .then(response => { if (response) { Store.add({ id: 'admin-file-models', data: response.data }); fileModels = response.data; - getFiles(`/files?source=${this.dataSource}&type=raw`, this.context).then( - response => { + getFiles(`/files?source=${this.dataSource}&type=raw`, this.context) + .then(response => { if (response) { Store.add({ id: 'admin-file-raw', data: response.data }); fileRaw = response.data; - getFiles( - `/files?source=${this.dataSource}&type=features`, - this.context - ).then(response => { - if (response) { - Store.add({ - id: 'admin-file-features', - data: response.data - }); - fileFeatures = response.data; - this.render(); - } - }); + getFiles(`/files?source=${this.dataSource}&type=features`, this.context) + .then(response => { + if (response) { + Store.add({ + id: 'admin-file-features', + data: response.data + }); + fileFeatures = response.data; + this.render(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { this.render(); } @@ -238,38 +243,46 @@ class FileContent extends Component { content, 'download', elems - ).then(result => { - if (result.value) { - const fileFormat = filename.split('.').pop().toLowerCase(); - const selectedFormat = result.value.format.toLowerCase(); - if (selectedFormat === 'none') { - ModalHelper.error('You must select a format to download the file.'); - } else { - const loader = ModalHelper.loading( - 'Preparing Download...', - 'Your download will begin automatically' - ); + ) + .then(result => { + if (result.value) { + const fileFormat = filename.split('.').pop().toLowerCase(); + const selectedFormat = result.value.format.toLowerCase(); + if (selectedFormat === 'none') { + ModalHelper.error('You must select a format to download the file.'); + } else { + const loader = ModalHelper.loading( + 'Preparing Download...', + 'Your download will begin automatically' + ); - downloadFile( - `/files/${filename}/download?source=${this.dataSource}&type=${this.fileType}&from=${fileFormat}&to=${selectedFormat}`, - this.context - ).then(response => { - if (response) { - loader.close(); + downloadFile( + `/files/${filename}/download?source=${this.dataSource}&type=${this.fileType}&from=${fileFormat}&to=${selectedFormat}`, + this.context + ) + .then(response => { + if (response) { + loader.close(); - let mimetype = 'text/csv'; + let mimetype = 'text/csv'; - if (typeof response === 'object') { - response = JSON.stringify(response, null, 2); - mimetype = 'application/json'; - } + if (typeof response === 'object') { + response = JSON.stringify(response, null, 2); + mimetype = 'application/json'; + } - fileDownload(response, `${filename}.${selectedFormat}`, mimetype); - } - }); + fileDownload(response, `${filename}.${selectedFormat}`, mimetype); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } } - } - }); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } @@ -286,37 +299,46 @@ class FileContent extends Component { filename: filename.split('.').slice(0, -1) }); const elems = ['filename']; - ModalHelper.edit('Rename File', content, 'rename', elems).then(result => { - if (result.value) { - const data = { - oldFilename: filename, - newFilename: result.value.filename + '.' + filename.split('.').pop(), - fileType: this.fileType - }; - renameFile( - `/files/rename?source=${this.dataSource}`, - data, - this.context - ).then(response => { - if (response) { - ModalHelper.notification('success', response.message); - if (this.fileType === 'raw') { - const rawStore = Store.get('raw-files'); - if (!(rawStore === undefined)) { - Store.remove('raw-files'); - } - } else if (this.fileType === 'features') { - const featuredStore = Store.get('features-files'); - if (!(featuredStore === undefined)) { - Store.remove('features-files'); + ModalHelper.edit('Rename File', content, 'rename', elems) + .then(result => { + if (result.value) { + const data = { + oldFilename: filename, + newFilename: result.value.filename + '.' + filename.split('.').pop(), + fileType: this.fileType + }; + renameFile(`/files/rename?source=${this.dataSource}`, data, this.context) + .then(response => { + if (response) { + ModalHelper.notification('success', response.message); + if (this.fileType === 'raw') { + const rawStore = Store.get('raw-files'); + if (!(rawStore === undefined)) { + Store.remove('raw-files'); + } + } else if (this.fileType === 'features') { + const featuredStore = Store.get('features-files'); + if (!(featuredStore === undefined)) { + Store.remove('features-files'); + } + } + // eslint-disable-next-line no-new + new FileContent( + this.dataSource, + true, + this.fileType, + '#file-content' + ); } - } - // eslint-disable-next-line no-new - new FileContent(this.dataSource, true, this.fileType, '#file-content'); - } - }); - } - }); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const filenameInput = document.querySelector('input#filename'); this.inputListener(filenameInput); }); @@ -349,34 +371,45 @@ class FileContent extends Component { event.stopImmediatePropagation(); const askTitle = 'Delete File ?'; const askMessage = filename + ' will be permanently deleted.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - const data = { - filename: filename, - fileType: this.fileType - }; - deleteFile(`/files?source=${this.dataSource}`, data, this.context).then( - response => { - if (response) { - ModalHelper.notification('success', response.message); - if (this.fileType === 'raw') { - const rawStore = Store.get('raw-files'); - if (!(rawStore === undefined)) { - Store.remove('raw-files'); - } - } else if (this.fileType === 'features') { - const featuredStore = Store.get('features-files'); - if (!(featuredStore === undefined)) { - Store.remove('features-files'); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + const data = { + filename: filename, + fileType: this.fileType + }; + deleteFile(`/files?source=${this.dataSource}`, data, this.context) + .then(response => { + if (response) { + ModalHelper.notification('success', response.message); + if (this.fileType === 'raw') { + const rawStore = Store.get('raw-files'); + if (!(rawStore === undefined)) { + Store.remove('raw-files'); + } + } else if (this.fileType === 'features') { + const featuredStore = Store.get('features-files'); + if (!(featuredStore === undefined)) { + Store.remove('features-files'); + } } + // eslint-disable-next-line no-new + new FileContent( + this.dataSource, + true, + this.fileType, + '#file-content' + ); } - // eslint-disable-next-line no-new - new FileContent(this.dataSource, true, this.fileType, '#file-content'); - } - } - ); - } - }); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } diff --git a/src/components/admin/home/pipelines/machine-learning/tasks/Task.js b/src/components/admin/home/pipelines/machine-learning/tasks/Task.js index 53e2aad..45e1b27 100644 --- a/src/components/admin/home/pipelines/machine-learning/tasks/Task.js +++ b/src/components/admin/home/pipelines/machine-learning/tasks/Task.js @@ -225,54 +225,62 @@ class Task { const pipelineStored = sessionStorage.getItem('pipeline'); if (pipelineStored === null) { - sessionStorage.setItem('pipeline', URLHelper.getHash().replace('-', '_')); + sessionStorage.setItem('pipeline', URLHelper.getHash().replace(/-/g, '_')); } - ModalHelper.edit('Job Configuration', content, 'Start Job', elems).then(result => { - if (result.value) { - const selectedVersion = result.value.version; - const labelInput = result.value.label; - - if (labelInput === '') { - ModalHelper.error('You must provide a label to start the job.'); - } else if (selectedVersion === 'none') { - ModalHelper.error('You must select a version to start the job.'); - } else { - let JSONConf; - let urlParams; - switch (selectedVersion) { - case '1': - urlParams = '?v=1'; - JSONConf = new Configuration().marshall(Versions.v1); - break; - } + ModalHelper.edit('Job Configuration', content, 'Start Job', elems) + .then(result => { + if (result.value) { + const selectedVersion = result.value.version; + const labelInput = result.value.label; - const data = { - label: result.value.label.toLowerCase(), - conf: JSONConf - }; - - axios - .put('/jobs' + urlParams, data, { - headers: APIHelper.setAuthHeader() - }) - .then(response => { - if (response) { - ModalHelper.notification('success', response.data.message); - } - }) - // eslint-disable-next-line handle-callback-err - .catch(() => { - ModalHelper.notification('error', 'Job created but failed to start', 3500); - }); + if (labelInput === '') { + ModalHelper.error('You must provide a label to start the job.'); + } else if (selectedVersion === 'none') { + ModalHelper.error('You must select a version to start the job.'); + } else { + let JSONConf; + let urlParams; + switch (selectedVersion) { + case '1': + urlParams = '?v=1'; + JSONConf = new Configuration().marshall(Versions.v1); + break; + } - sessionStorage.clear(); - // eslint-disable-next-line no-new - new SelectProcess(this.context); - this.setNavActive('select-process'); + const data = { + label: result.value.label.toLowerCase(), + conf: JSONConf + }; + + axios + .put('/jobs' + urlParams, data, { + headers: APIHelper.setAuthHeader() + }) + .then(response => { + if (response) { + ModalHelper.notification('success', response.data.message); + } + }) + // eslint-disable-next-line handle-callback-err + .catch(() => { + ModalHelper.notification( + 'error', + 'Job created but failed to start', + 3500 + ); + }); + + sessionStorage.clear(); + // eslint-disable-next-line no-new + new SelectProcess(this.context); + this.setNavActive('select-process'); + } } - } - }); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); const labelInput = document.querySelector('input#label'); @@ -370,8 +378,8 @@ class Task { } else { const content = formConfVersionTemplate(); const elems = ['version']; - ModalHelper.edit('Choose a Configuration Version', content, 'download', elems).then( - result => { + ModalHelper.edit('Choose a Configuration Version', content, 'download', elems) + .then(result => { if (result.value) { const selectedVersion = result.value.version; if (selectedVersion === 'none') { @@ -428,8 +436,10 @@ class Task { }); } } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } } diff --git a/src/components/admin/home/pipelines/machine-learning/tasks/data-source/DataSource.js b/src/components/admin/home/pipelines/machine-learning/tasks/data-source/DataSource.js index eafa76a..ce61632 100644 --- a/src/components/admin/home/pipelines/machine-learning/tasks/data-source/DataSource.js +++ b/src/components/admin/home/pipelines/machine-learning/tasks/data-source/DataSource.js @@ -10,6 +10,7 @@ import URLHelper from '@URLHelper'; import SelectProcess from '../select-process/SelectProcess'; import Windowing from '../windowing/Windowing'; import Learning from '../learning/Learning'; +import ModalHelper from '@ModalHelper'; let inputContent; @@ -48,8 +49,8 @@ class DataSource extends Task { const storedDataSource = sessionStorage.getItem('data-source'); - getFiles(`/files?source=${storedDataSource}&type=${inputType}`, this.context).then( - response => { + getFiles(`/files?source=${storedDataSource}&type=${inputType}`, this.context) + .then(response => { if (response) { const dataStore = Store.get(inputType + '-file-data'); @@ -65,8 +66,10 @@ class DataSource extends Task { fileList.setData(response.data); fileList.make(); } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); return fileList; } diff --git a/src/components/admin/home/pipelines/machine-learning/tasks/features/Features.js b/src/components/admin/home/pipelines/machine-learning/tasks/features/Features.js index 46cc1dd..6cbd7df 100644 --- a/src/components/admin/home/pipelines/machine-learning/tasks/features/Features.js +++ b/src/components/admin/home/pipelines/machine-learning/tasks/features/Features.js @@ -9,6 +9,7 @@ import Store from '@Store'; import Learning from '../learning/Learning'; import Windowing from '../windowing/Windowing'; import configDownloadTemplate from '../config-download.hbs'; +import ModalHelper from '@ModalHelper'; let allFeatures = []; let featureItems; @@ -199,17 +200,21 @@ class Features extends Task { const dataSource = sessionStorage.getItem('data-source'); if (featuresStore === undefined) { this.renderView(true); - getFeatures(`/features/source/${dataSource}`, this.context).then(response => { - if (response) { - Store.add({ - id: 'features-source', - data: response.data - }); - - allFeatures = response.data; - this.make(); - } - }); + getFeatures(`/features/source/${dataSource}`, this.context) + .then(response => { + if (response) { + Store.add({ + id: 'features-source', + data: response.data + }); + + allFeatures = response.data; + this.make(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { allFeatures = featuresStore.data; this.make(); diff --git a/src/components/admin/home/pipelines/machine-learning/tasks/learning/Learning.js b/src/components/admin/home/pipelines/machine-learning/tasks/learning/Learning.js index 0daec02..180daec 100644 --- a/src/components/admin/home/pipelines/machine-learning/tasks/learning/Learning.js +++ b/src/components/admin/home/pipelines/machine-learning/tasks/learning/Learning.js @@ -34,13 +34,17 @@ class Learning extends Task { if (storedAllAlgos === undefined) { this.renderView(true); - getAlgorithms('/algos', this.context).then(response => { - if (response) { - allAlgos = response.data.algorithms; - allContainers = Array.from(new Set(allAlgos.map(algo => algo.container))); - this.make(); - } - }); + getAlgorithms('/algos', this.context) + .then(response => { + if (response) { + allAlgos = response.data.algorithms; + allContainers = Array.from(new Set(allAlgos.map(algo => algo.container))); + this.make(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { allContainers = allContainers.data; this.make(); @@ -247,16 +251,20 @@ class Learning extends Task { getAlgoParamsConf( `/algos/params/conf/${config}?container=${selectedAlgo.container}`, this.context - ).then(response => { - if (response) { - Store.add({ - id: 'conf-params', - data: response.data - }); - const params = new AlgoParameters(response.data, container); - params.build(paramsTemplate); - } - }); + ) + .then(response => { + if (response) { + Store.add({ + id: 'conf-params', + data: response.data + }); + const params = new AlgoParameters(response.data, container); + params.build(paramsTemplate); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } super.toggleNavBtnEnable('finish', true); diff --git a/src/components/admin/home/pipelines/machine-learning/tasks/select-process/SelectProcess.js b/src/components/admin/home/pipelines/machine-learning/tasks/select-process/SelectProcess.js index 1072409..2cc7d47 100644 --- a/src/components/admin/home/pipelines/machine-learning/tasks/select-process/SelectProcess.js +++ b/src/components/admin/home/pipelines/machine-learning/tasks/select-process/SelectProcess.js @@ -36,18 +36,22 @@ class SelectProcess extends Task { if (storedSources === undefined) { this.render(true); - getSources('/sources', this.context).then(response => { - if (response) { - allSources = response.data.sources; + getSources('/sources', this.context) + .then(response => { + if (response) { + allSources = response.data.sources; - Store.add({ - id: 'home-data-sources', - data: allSources - }); + Store.add({ + id: 'home-data-sources', + data: allSources + }); - this.make(); - } - }); + this.make(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { allSources = storedSources.data; this.make(); @@ -305,9 +309,7 @@ class SelectProcess extends Task { } } else { if (radio.checked) { - sessionStorage.setItem('cross-validation', true); - } else { - sessionStorage.setItem('cross-validation', true); + sessionStorage.setItem('cross-validation', radio.value); } } @@ -397,8 +399,8 @@ class SelectProcess extends Task { filename || null ); - getFiles(`/files?source=${this.dataSource}&type=models`, this.context).then( - response => { + getFiles(`/files?source=${this.dataSource}&type=models`, this.context) + .then(response => { if (response) { Store.add({ id: 'model-data', @@ -408,8 +410,10 @@ class SelectProcess extends Task { fileList.setData(response.data); fileList.make(); } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { const context = this.context.querySelector('.process-options'); fileList = new FileList( diff --git a/src/components/admin/home/pipelines/machine-learning/tasks/windowing/Windowing.js b/src/components/admin/home/pipelines/machine-learning/tasks/windowing/Windowing.js index 439eb2e..fab7aa2 100644 --- a/src/components/admin/home/pipelines/machine-learning/tasks/windowing/Windowing.js +++ b/src/components/admin/home/pipelines/machine-learning/tasks/windowing/Windowing.js @@ -37,18 +37,22 @@ class Windowing extends Task { if (windowFuncStore === undefined) { this.renderView(true); - getFunctions('/windows', this.context).then(response => { - if (response) { - windowFunctions = response.data.functions; + getFunctions('/windows', this.context) + .then(response => { + if (response) { + windowFunctions = response.data.functions; - Store.add({ - id: 'window-type', - data: windowFunctions - }); + Store.add({ + id: 'window-type', + data: windowFunctions + }); - this.make(); - } - }); + this.make(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { windowFunctions = windowFuncStore.data; this.make(); diff --git a/src/components/admin/jobs/Jobs.js b/src/components/admin/jobs/Jobs.js index 1d432c0..d23a051 100644 --- a/src/components/admin/jobs/Jobs.js +++ b/src/components/admin/jobs/Jobs.js @@ -23,18 +23,26 @@ class Jobs extends Component { initData() { this.initView(true); - getJobs('/jobs/user?state=started', this.context).then(response => { - if (response) { - startedJobs = response.data.jobs; - - getJobs('/jobs/user?state=completed', this.context).then(response => { - if (response) { - completedJobs = response.data.jobs; - this.run(); - } - }); - } - }); + getJobs('/jobs/user?state=started', this.context) + .then(response => { + if (response) { + startedJobs = response.data.jobs; + + getJobs('/jobs/user?state=completed', this.context) + .then(response => { + if (response) { + completedJobs = response.data.jobs; + this.run(); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } initView(loading = false) { @@ -59,29 +67,33 @@ class Jobs extends Component { }); } else { if (opts.refresh) { - getJobs(`/jobs/user?state=${value}`, this.context).then(response => { - if (response) { - jobs = response.data.jobs; - - container.innerHTML = jobListTemplate({ - jobs: jobs, - jobType: value, - loading: opts.loading - }); + getJobs(`/jobs/user?state=${value}`, this.context) + .then(response => { + if (response) { + jobs = response.data.jobs; - if (value === 'completed') { - this.toggleActionEnable(jobs); - } + container.innerHTML = jobListTemplate({ + jobs: jobs, + jobType: value, + loading: opts.loading + }); - this.setActions(jobs); + if (value === 'completed') { + this.toggleActionEnable(jobs); + } - if (value === 'started') { - startedJobs = jobs; - } else { - completedJobs = jobs; + this.setActions(jobs); + + if (value === 'started') { + startedJobs = jobs; + } else { + completedJobs = jobs; + } } - } - }); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); } else { if (value === 'started') { jobs = startedJobs; @@ -143,19 +155,27 @@ class Jobs extends Component { const askTitle = 'Cancel job ?'; const askMessage = job.label + ' will be canceled.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - cancelJob(`/jobs/${jobId}/cancel/`, null, this.context).then(response => { - if (response) { - ModalHelper.notification( - 'success', - job.label + ' successfully canceled.' - ); - this.buildJobList(this.jobState, { refresh: true }); - } - }); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + cancelJob(`/jobs/${jobId}/cancel/`, null, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + job.label + ' successfully canceled.' + ); + this.buildJobList(this.jobState, { refresh: true }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } @@ -171,12 +191,16 @@ class Jobs extends Component { event.preventDefault(); event.stopImmediatePropagation(); - restartJob(`/jobs/${jobId}/restart/`, null, this.context).then(response => { - if (response) { - ModalHelper.notification('success', job.label + ' successfully started.'); - this.buildJobList(this.jobState, { refresh: true }); - } - }); + restartJob(`/jobs/${jobId}/restart/`, null, this.context) + .then(response => { + if (response) { + ModalHelper.notification('success', job.label + ' successfully started.'); + this.buildJobList(this.jobState, { refresh: true }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } @@ -195,16 +219,27 @@ class Jobs extends Component { const askTitle = 'Delete job ?'; const askMessage = job.label + ' will be permanently deleted.'; - ModalHelper.confirm(askTitle, askMessage).then(result => { - if (result.value) { - deleteJob('/jobs/' + jobId, this.context).then(response => { - if (response) { - ModalHelper.notification('success', job.label + ' successfully deleted.'); - this.buildJobList(this.jobState, { refresh: true }); - } - }); - } - }); + ModalHelper.confirm(askTitle, askMessage) + .then(result => { + if (result.value) { + deleteJob('/jobs/' + jobId, this.context) + .then(response => { + if (response) { + ModalHelper.notification( + 'success', + job.label + ' successfully deleted.' + ); + this.buildJobList(this.jobState, { refresh: true }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); }); } @@ -255,13 +290,15 @@ class Jobs extends Component { event.preventDefault(); event.stopImmediatePropagation(); - downloadFile(`/jobs/${jobId}/download?output=matrix`, this.context).then( - response => { + downloadFile(`/jobs/${jobId}/download?output=matrix`, this.context) + .then(response => { if (response) { fileDownload(response, 'matrix.csv'); } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); } } @@ -278,13 +315,15 @@ class Jobs extends Component { event.preventDefault(); event.stopImmediatePropagation(); - downloadFile(`/jobs/${jobId}/download?output=predictions`, this.context).then( - response => { + downloadFile(`/jobs/${jobId}/download?output=predictions`, this.context) + .then(response => { if (response) { fileDownload(response, 'predictions.csv'); } - } - ); + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); } } diff --git a/src/components/admin/search/Search.js b/src/components/admin/search/Search.js index a1beab7..81908f6 100644 --- a/src/components/admin/search/Search.js +++ b/src/components/admin/search/Search.js @@ -43,7 +43,7 @@ class Search { countNb.textContent = result.length; if (result.length > 1) { countMsg.textContent = 'results found'; - } else if (result.length >= 0 && result.length <= 1) { + } else { countMsg.textContent = 'result found'; } diff --git a/src/components/admin/settings/user-info/UserInfo.js b/src/components/admin/settings/user-info/UserInfo.js index cead8ff..be4a929 100644 --- a/src/components/admin/settings/user-info/UserInfo.js +++ b/src/components/admin/settings/user-info/UserInfo.js @@ -79,21 +79,25 @@ class UserInfos extends Component { passwordConfirm: jsonData.passwordConfirm.trim() }; - changeUserInfo('/users/' + user._id, data, this.context).then(response => { - if (response) { - const userData = response.data.user; - - Cookies.remove('uuid', { path: '/' }); - Cookies.set('uuid', userData.token, { - path: '/', - secure: true, - expires: 365, - sameSite: 'strict' - }); - Cookies.set('isChanged', true, { path: '/' }); - window.location.reload(false); - } - }); + changeUserInfo('/users/' + user._id, data, this.context) + .then(response => { + if (response) { + const userData = response.data.user; + + Cookies.remove('uuid', { path: '/' }); + Cookies.set('uuid', userData.token, { + path: '/', + secure: true, + expires: 365, + sameSite: 'strict' + }); + Cookies.set('isChanged', true, { path: '/' }); + window.location.reload(false); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); } diff --git a/src/components/admin/settings/user-password/UserPassword.js b/src/components/admin/settings/user-password/UserPassword.js index 6799c98..42b0143 100644 --- a/src/components/admin/settings/user-password/UserPassword.js +++ b/src/components/admin/settings/user-password/UserPassword.js @@ -62,33 +62,39 @@ class UserPassword extends Component { newPasswordConfirm: jsonData.newPasswordConfirm.trim() }; - changePassword(`/users/${user._id}/password`, data, this.context).then(response => { - if (response) { - const inputs = changePasswordForm.querySelectorAll('input:not([type=email])'); - inputs.forEach(input => { - input.value = ''; - }); - - const data = response.data; - - Cookies.remove('uuid', { path: '/' }); - Cookies.set('uuid', data.user.token, { - path: '/', - secure: true, - expires: 365, - sameSite: 'strict' - }); - - ModalHelper.notification('success', 'Password successfully modified.').then( - () => { - const isLogged = Cookies.get('isLogged'); - if (isLogged === 'true') { - Cookies.remove('isLogged', { path: '/' }); - } - } - ); - } - }); + changePassword(`/users/${user._id}/password`, data, this.context) + .then(response => { + if (response) { + const inputs = changePasswordForm.querySelectorAll('input:not([type=email])'); + inputs.forEach(input => { + input.value = ''; + }); + + const data = response.data; + + Cookies.remove('uuid', { path: '/' }); + Cookies.set('uuid', data.user.token, { + path: '/', + secure: true, + expires: 365, + sameSite: 'strict' + }); + + ModalHelper.notification('success', 'Password successfully modified.') + .then(() => { + const isLogged = Cookies.get('isLogged'); + if (isLogged === 'true') { + Cookies.remove('isLogged', { path: '/' }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); } diff --git a/src/components/authentication/Index.js b/src/components/authentication/Index.js index bc9f9e0..56798da 100644 --- a/src/components/authentication/Index.js +++ b/src/components/authentication/Index.js @@ -58,20 +58,24 @@ class Index extends Controller { const formData = new FormData(signInForm); const jsonData = Object.fromEntries(formData); - signIn('/login', jsonData, this.context).then(response => { - if (response) { - const userData = response.data.user; - - Cookies.set('uuid', userData.token, { - path: '/', - secure: true, - expires: 30, - sameSite: 'strict' - }); - Cookies.set('isLogged', true, { path: '/' }); - Router.setRoute('/admin.html'); - } - }); + signIn('/login', jsonData, this.context) + .then(response => { + if (response) { + const userData = response.data.user; + + Cookies.set('uuid', userData.token, { + path: '/', + secure: true, + expires: 30, + sameSite: 'strict' + }); + Cookies.set('isLogged', true, { path: '/' }); + Router.setRoute('/admin.html'); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); } diff --git a/src/components/authentication/Register.js b/src/components/authentication/Register.js index 07df49a..68e3bac 100644 --- a/src/components/authentication/Register.js +++ b/src/components/authentication/Register.js @@ -3,7 +3,7 @@ import Theme from '@Theme'; import Controller from '@Controller'; import APIHelper from '@APIHelper'; import StringHelper from '@StringHelper'; - +import ModalHelper from '@ModalHelper'; import axios from 'axios'; import Cookies from 'js-cookie'; @@ -51,12 +51,16 @@ class Register extends Controller { passwordConfirm: jsonData.passwordConfirm.trim() }; - register('/register', data, this.context).then(response => { - if (response) { - Cookies.set('isRegistered', true, { path: '/' }); - Router.setRoute('/index.html'); - } - }); + register('/register', data, this.context) + .then(response => { + if (response) { + Cookies.set('isRegistered', true, { path: '/' }); + Router.setRoute('/index.html'); + } + }) + .catch(error => { + ModalHelper.notification('error', error); + }); }); } diff --git a/src/components/file-list/FileList.js b/src/components/file-list/FileList.js index 6bbc8be..ce12d3d 100644 --- a/src/components/file-list/FileList.js +++ b/src/components/file-list/FileList.js @@ -129,16 +129,15 @@ class FileList extends Events { } sort(action, order, data) { - switch (action) { - case 'filename': - return SortHelper.sortArrayAlpha(data, action, order); - case 'type': - return SortHelper.sortArrayAlpha(data, action, order); - case 'size': - return SortHelper.sortArrayNumber(data, action, order); - case 'date': - return SortHelper.sortArrayByDate(data, 'dateCreated', order); + if (action === 'filename' || action === 'type') { + return SortHelper.sortArrayAlpha(data, action, order); + } else if (action === 'size') { + return SortHelper.sortArrayNumber(data, action, order); + } else if (action === 'date') { + return SortHelper.sortArrayByDate(data, 'dateCreated', order); } + + return data; } buildFileList() { diff --git a/src/core/Store.js b/src/core/Store.js index e0dd6ae..5b73c09 100644 --- a/src/core/Store.js +++ b/src/core/Store.js @@ -40,8 +40,7 @@ class StoreInstance extends Events { throw new Error('Expected type for argument data is Object.'); } - // eslint-disable-next-line array-callback-return - this.data.find(entry => { + this.data.forEach(entry => { if (entry.id === id) { entry.data = data; } diff --git a/src/core/router/Router.js b/src/core/router/Router.js index 74dec54..fee2353 100644 --- a/src/core/router/Router.js +++ b/src/core/router/Router.js @@ -92,7 +92,7 @@ class Router { } if (URLHelper.getHash() === null) { - this.setRoute(URLHelper.getPage()); + Router.setRoute(URLHelper.getPage()); } else { if (!(menu === null)) { Router.route({ hash: URLHelper.getHash(), menu: menu }); @@ -125,16 +125,16 @@ class Router { if (options.hash === null) { if (options.page === null) { - this.loadPage('index'); + Router.loadPage('index'); } else { - this.loadPage(options.page); + Router.loadPage(options.page); } } else { - this.loadPage(options.page); - this.loadComponent(options.page, options.hash, options.menu); + Router.loadPage(options.page); + Router.loadComponent(options.page, options.hash, options.menu); } - window.addEventListener('hashchange', this.onHashChangeHandler, true); + window.addEventListener('hashchange', Router.onHashChangeHandler, true); } static follow(link) { diff --git a/src/helpers/APIHelper.js b/src/helpers/APIHelper.js index fbf2f23..77fdcb3 100644 --- a/src/helpers/APIHelper.js +++ b/src/helpers/APIHelper.js @@ -47,7 +47,7 @@ class APIHelper { static getConnectedUser() { const uuid = Cookies.get('uuid'); - return this.parseJWT(uuid); + return APIHelper.parseJWT(uuid); } static errorsHandler(error, replaceContent = false, customPopupClass = null) { diff --git a/src/helpers/URLHelper.js b/src/helpers/URLHelper.js index 5aa5a98..49eee22 100644 --- a/src/helpers/URLHelper.js +++ b/src/helpers/URLHelper.js @@ -12,18 +12,18 @@ class URLHelper { throw new Error('Expected type for argument location is String.'); } - const url = location || this.getURL(); - const start = this.getProtocol().length + 2; + const url = location || URLHelper.getURL(); + const start = URLHelper.getProtocol().length + 2; return url.substr(start, url.lastIndexOf('html') + 4 - start); } static getPage() { - const path = this.getPath(); + const path = URLHelper.getPath(); return path.substr(path.indexOf('/')); } static getPageName() { - const page = this.getPage(); + const page = URLHelper.getPage(); return page.substr(1, page.indexOf('.') - 1); } @@ -31,8 +31,8 @@ class URLHelper { if (!(location === null) && !(typeof location === 'string')) { throw new Error('Expected type for argument location is String.'); } - const url = location || this.getURL(); - const page = this.getPage(); + const url = location || URLHelper.getURL(); + const page = URLHelper.getPage(); const args = url.substr(url.indexOf(page) + page.length); if (args.indexOf('#') > -1) { @@ -54,7 +54,7 @@ class URLHelper { throw new Error('Expected type for argument hash is String.'); } - return hash.substr(1, hash.length); + return hash.substring(1, hash.length); } static toSlug(value) { @@ -62,7 +62,7 @@ class URLHelper { throw new Error('Expected type for argument value is String.'); } - return value.toLocaleLowerCase().replace(' ', '-'); + return value.toLocaleLowerCase().replace(/ /g, '-'); } static toAnchor(value) {