Skip to content
Snippets Groups Projects
Commit ecea33ff authored by Patrick Jentsch's avatar Patrick Jentsch
Browse files

Make Utils functions more stable

parent 7836774f
No related branches found
No related tags found
No related merge requests found
...@@ -5,10 +5,10 @@ class Utils { ...@@ -5,10 +5,10 @@ class Utils {
return tmpElement.firstChild; return tmpElement.firstChild;
} }
static generateElementId(prefix='') { static generateElementId(prefix='', suffix='') {
for (let i = 0; true; i++) { for (let i = 0; true; i++) {
if (document.querySelector(`#${prefix}${i}`) !== null) {continue;} if (document.querySelector(`#${prefix}${i}${suffix}`) !== null) {continue;}
return `${prefix}${i}`; return `${prefix}${i}${suffix}`;
} }
} }
...@@ -21,15 +21,11 @@ class Utils { ...@@ -21,15 +21,11 @@ class Utils {
if (objects.length === 0) { if (objects.length === 0) {
return mergedObject; return mergedObject;
} }
if (!Utils.isObject(objects[0])) {throw 'Cannot merge non-object';}
if (objects.length === 1) { if (objects.length === 1) {
if (!Utils.isObject(objects[0])) {
throw 'Cannot merge non-object';
}
return Utils.mergeObjectsDeep(mergedObject, objects[0]); return Utils.mergeObjectsDeep(mergedObject, objects[0]);
} }
if (!Utils.isObject(objects[0]) || !Utils.isObject(objects[1])) { if (!Utils.isObject(objects[1])) {throw 'Cannot merge non-object';}
throw 'Cannot merge non-object';
}
for (let key in objects[0]) { for (let key in objects[0]) {
if (objects[0].hasOwnProperty(key)) { if (objects[0].hasOwnProperty(key)) {
if (objects[1].hasOwnProperty(key)) { if (objects[1].hasOwnProperty(key)) {
...@@ -58,15 +54,20 @@ class Utils { ...@@ -58,15 +54,20 @@ class Utils {
static buildCorpusRequest(userId, corpusId) { static buildCorpusRequest(userId, corpusId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let corpus = app.data.users[userId].corpora[corpusId]; let corpus;
try {
corpus = app.data.users[userId].corpora[corpusId];
} catch (error) {
corpus = {};
}
fetch(`/corpora/${corpus.id}/build`, {method: 'POST', headers: {Accept: 'application/json'}}) fetch(`/corpora/${corpusId}/build`, {method: 'POST', headers: {Accept: 'application/json'}})
.then( .then(
(response) => { (response) => {
if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);} if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);}
if (response.status === 404) {app.flash('Not Found', 'error'); reject(response);} if (response.status === 404) {app.flash('Not Found', 'error'); reject(response);}
if (response.status === 409) {app.flash('Conflict', 'error'); reject(response);} if (response.status === 409) {app.flash('Conflict', 'error'); reject(response);}
app.flash(`Corpus "${corpus.title}" marked for building`, 'corpus'); app.flash(`Corpus "${corpus?.title}" marked for building`, 'corpus');
resolve(response); resolve(response);
}, },
(response) => { (response) => {
...@@ -79,14 +80,19 @@ class Utils { ...@@ -79,14 +80,19 @@ class Utils {
static deleteCorpusRequest(userId, corpusId) { static deleteCorpusRequest(userId, corpusId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let corpus = app.data.users[userId].corpora[corpusId]; let corpus;
try {
corpus = app.data.users[userId].corpora[corpusId];
} catch (error) {
corpus = {};
}
let modalElement = Utils.elementFromString( let modalElement = Utils.elementFromString(
` `
<div class="modal"> <div class="modal">
<div class="modal-content"> <div class="modal-content">
<h4>Confirm Corpus deletion</h4> <h4>Confirm Corpus deletion</h4>
<p>Do you really want to delete the Corpus <b>${corpus.title}</b>? All files will be permanently deleted!</p> <p>Do you really want to delete the Corpus <b>${corpus?.title}</b>? All files will be permanently deleted!</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a>
...@@ -109,13 +115,13 @@ class Utils { ...@@ -109,13 +115,13 @@ class Utils {
let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]'); let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
confirmElement.addEventListener('click', (event) => { confirmElement.addEventListener('click', (event) => {
let corpusTitle = corpus.title; let corpusTitle = corpus?.title;
fetch(`/corpora/${corpus.id}`, {method: 'DELETE', headers: {Accept: 'application/json'}}) fetch(`/corpora/${corpusId}`, {method: 'DELETE', headers: {Accept: 'application/json'}})
.then( .then(
(response) => { (response) => {
if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);} if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);}
if (response.status === 404) {app.flash('Not Found', 'error'); reject(response);} if (response.status === 404) {app.flash('Not Found', 'error'); reject(response);}
app.flash(`Corpus "${corpus.title}" marked for deletion`, 'corpus'); app.flash(`Corpus "${corpusTitle}" marked for deletion`, 'corpus');
resolve(response); resolve(response);
}, },
(response) => { (response) => {
...@@ -130,15 +136,19 @@ class Utils { ...@@ -130,15 +136,19 @@ class Utils {
static deleteCorpusFileRequest(userId, corpusId, corpusFileId) { static deleteCorpusFileRequest(userId, corpusId, corpusFileId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let corpus = app.data.users[userId].corpora[corpusId]; let corpusFile;
let corpusFile = corpus.files[corpusFileId]; try {
corpusFile = app.data.users[userId].corpora[corpusId].files[corpusFileId];
} catch (error) {
corpusFile = {};
}
let modalElement = Utils.elementFromString( let modalElement = Utils.elementFromString(
` `
<div class="modal"> <div class="modal">
<div class="modal-content"> <div class="modal-content">
<h4>Confirm Corpus File deletion</h4> <h4>Confirm Corpus File deletion</h4>
<p>Do you really want to delete the Corpus File <b>${corpusFile.title}</b>? All files will be permanently deleted!</p> <p>Do you really want to delete the Corpus File <b>${corpusFile?.title}</b>? All files will be permanently deleted!</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a>
...@@ -161,7 +171,7 @@ class Utils { ...@@ -161,7 +171,7 @@ class Utils {
let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]'); let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
confirmElement.addEventListener('click', (event) => { confirmElement.addEventListener('click', (event) => {
let corpusFileTitle = corpusFile.title; let corpusFileTitle = corpusFile?.title;
fetch(`/corpora/${corpusId}/files/${corpusFileId}`, {method: 'DELETE', headers: {Accept: 'application/json'}}) fetch(`/corpora/${corpusId}/files/${corpusFileId}`, {method: 'DELETE', headers: {Accept: 'application/json'}})
.then( .then(
(response) => { (response) => {
...@@ -182,13 +192,19 @@ class Utils { ...@@ -182,13 +192,19 @@ class Utils {
static deleteSpaCyNLPPipelineModelRequest(userId, spaCyNLPPipelineModelId) { static deleteSpaCyNLPPipelineModelRequest(userId, spaCyNLPPipelineModelId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let spaCyNLPPipelineModel = app.data.users[userId].spacy_nlp_pipeline_models[spaCyNLPPipelineModelId]; let spaCyNLPPipelineModel;
try {
spaCyNLPPipelineModel = app.data.users[userId].spacy_nlp_pipeline_models[spaCyNLPPipelineModelId];
} catch (error) {
spaCyNLPPipelineModel = {};
}
let modalElement = Utils.elementFromString( let modalElement = Utils.elementFromString(
` `
<div class="modal"> <div class="modal">
<div class="modal-content"> <div class="modal-content">
<h4>Confirm SpaCy NLP Pipeline Model deletion</h4> <h4>Confirm SpaCy NLP Pipeline Model deletion</h4>
<p>Do you really want to delete the SpaCy NLP Pipeline Model <b>${spaCyNLPPipelineModel.title}</b>? All files will be permanently deleted!</p> <p>Do you really want to delete the SpaCy NLP Pipeline Model <b>${spaCyNLPPipelineModel?.title}</b>? All files will be permanently deleted!</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a>
...@@ -210,7 +226,7 @@ class Utils { ...@@ -210,7 +226,7 @@ class Utils {
); );
let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]'); let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
confirmElement.addEventListener('click', (event) => { confirmElement.addEventListener('click', (event) => {
let spaCyNLPPipelineModelTitle = spaCyNLPPipelineModel.title; let spaCyNLPPipelineModelTitle = spaCyNLPPipelineModel?.title;
fetch(`/contributions/spacy-nlp-pipeline-models/${spaCyNLPPipelineModelId}`, {method: 'DELETE'}) fetch(`/contributions/spacy-nlp-pipeline-models/${spaCyNLPPipelineModelId}`, {method: 'DELETE'})
.then( .then(
(response) => { (response) => {
...@@ -231,13 +247,19 @@ class Utils { ...@@ -231,13 +247,19 @@ class Utils {
static deleteTesseractOCRPipelineModelRequest(userId, tesseractOCRPipelineModelId) { static deleteTesseractOCRPipelineModelRequest(userId, tesseractOCRPipelineModelId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let tesseractOCRPipelineModel = app.data.users[userId].tesseract_ocr_pipeline_models[tesseractOCRPipelineModelId]; let tesseractOCRPipelineModel;
try {
tesseractOCRPipelineModel = app.data.users[userId].tesseract_ocr_pipeline_models[tesseractOCRPipelineModelId];
} catch (error) {
tesseractOCRPipelineModel = {};
}
let modalElement = Utils.elementFromString( let modalElement = Utils.elementFromString(
` `
<div class="modal"> <div class="modal">
<div class="modal-content"> <div class="modal-content">
<h4>Confirm Tesseract OCR Pipeline Model deletion</h4> <h4>Confirm Tesseract OCR Pipeline Model deletion</h4>
<p>Do you really want to delete the Tesseract OCR Pipeline Model <b>${tesseractOCRPipelineModel.title}</b>? All files will be permanently deleted!</p> <p>Do you really want to delete the Tesseract OCR Pipeline Model <b>${tesseractOCRPipelineModel?.title}</b>? All files will be permanently deleted!</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a>
...@@ -259,7 +281,7 @@ class Utils { ...@@ -259,7 +281,7 @@ class Utils {
); );
let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]'); let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
confirmElement.addEventListener('click', (event) => { confirmElement.addEventListener('click', (event) => {
let tesseractOCRPipelineModelTitle = tesseractOCRPipelineModel.title; let tesseractOCRPipelineModelTitle = tesseractOCRPipelineModel?.title;
fetch(`/contributions/tesseract-ocr-pipeline-models/${tesseractOCRPipelineModelId}`, {method: 'DELETE'}) fetch(`/contributions/tesseract-ocr-pipeline-models/${tesseractOCRPipelineModelId}`, {method: 'DELETE'})
.then( .then(
(response) => { (response) => {
...@@ -328,14 +350,19 @@ class Utils { ...@@ -328,14 +350,19 @@ class Utils {
static deleteJobRequest(userId, jobId) { static deleteJobRequest(userId, jobId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let job = app.data.users[userId].jobs[jobId]; let job;
try {
job = app.data.users[userId].jobs[jobId];
} catch (error) {
job = {};
}
let modalElement = Utils.elementFromString( let modalElement = Utils.elementFromString(
` `
<div class="modal"> <div class="modal">
<div class="modal-content"> <div class="modal-content">
<h4>Confirm Job deletion</h4> <h4>Confirm Job deletion</h4>
<p>Do you really want to delete the Job <b>${job.title}</b>? All files will be permanently deleted!</p> <p>Do you really want to delete the Job <b>${job?.title}</b>? All files will be permanently deleted!</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a>
...@@ -358,8 +385,8 @@ class Utils { ...@@ -358,8 +385,8 @@ class Utils {
let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]'); let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
confirmElement.addEventListener('click', (event) => { confirmElement.addEventListener('click', (event) => {
let jobTitle = job.title; let jobTitle = job?.title;
fetch(`/jobs/${job.id}`, {method: 'DELETE', headers: {Accept: 'application/json'}}) fetch(`/jobs/${jobId}`, {method: 'DELETE', headers: {Accept: 'application/json'}})
.then( .then(
(response) => { (response) => {
if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);} if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);}
...@@ -379,9 +406,7 @@ class Utils { ...@@ -379,9 +406,7 @@ class Utils {
static getJobLogRequest(userId, jobId) { static getJobLogRequest(userId, jobId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let job = app.data.users[userId].jobs[jobId]; fetch(`/jobs/${jobId}/log`, {method: 'GET', headers: {Accept: 'application/json, text/plain'}})
fetch(`/jobs/${job.id}/log`, {method: 'GET', headers: {Accept: 'application/json, text/plain'}})
.then( .then(
(response) => { (response) => {
if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);} if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);}
...@@ -427,14 +452,19 @@ class Utils { ...@@ -427,14 +452,19 @@ class Utils {
static restartJobRequest(userId, jobId) { static restartJobRequest(userId, jobId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let job = app.data.users[userId].jobs[jobId]; let job;
try {
job = app.data.users[userId].jobs[jobId];
} catch (error) {
job = {};
}
let modalElement = Utils.elementFromString( let modalElement = Utils.elementFromString(
` `
<div class="modal"> <div class="modal">
<div class="modal-content"> <div class="modal-content">
<h4>Confirm Job restart</h4> <h4>Confirm Job restart</h4>
<p>Do you really want to restart the Job <b>${job.title}</b>? All Job Results will be permanently deleted.</p> <p>Do you really want to restart the Job <b>${job?.title}</b>? All Job Results will be permanently deleted.</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a>
...@@ -457,8 +487,8 @@ class Utils { ...@@ -457,8 +487,8 @@ class Utils {
let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]'); let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
confirmElement.addEventListener('click', (event) => { confirmElement.addEventListener('click', (event) => {
let jobTitle = job.title; let jobTitle = job?.title;
fetch(`/jobs/${job.id}/restart`, {method: 'POST', headers: {Accept: 'application/json'}}) fetch(`/jobs/${jobId}/restart`, {method: 'POST', headers: {Accept: 'application/json'}})
.then( .then(
(response) => { (response) => {
if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);} if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);}
...@@ -479,14 +509,19 @@ class Utils { ...@@ -479,14 +509,19 @@ class Utils {
static deleteUserRequest(userId) { static deleteUserRequest(userId) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let user = app.data.users[userId]; let user;
try {
user = app.data.users[userId];
} catch (error) {
user = {};
}
let modalElement = Utils.elementFromString( let modalElement = Utils.elementFromString(
` `
<div class="modal"> <div class="modal">
<div class="modal-content"> <div class="modal-content">
<h4>Confirm User deletion</h4> <h4>Confirm User deletion</h4>
<p>Do you really want to delete the User <b>${user.username}</b>? All files will be permanently deleted!</p> <p>Do you really want to delete the User <b>${user?.username}</b>? All files will be permanently deleted!</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a> <a class="action-button btn modal-close waves-effect waves-light" data-action="cancel">Cancel</a>
...@@ -509,8 +544,8 @@ class Utils { ...@@ -509,8 +544,8 @@ class Utils {
let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]'); let confirmElement = modalElement.querySelector('.action-button[data-action="confirm"]');
confirmElement.addEventListener('click', (event) => { confirmElement.addEventListener('click', (event) => {
let userName = user.username; let userName = user?.username;
fetch(`/users/${user.id}`, {method: 'DELETE', headers: {Accept: 'application/json'}}) fetch(`/users/${userId}`, {method: 'DELETE', headers: {Accept: 'application/json'}})
.then( .then(
(response) => { (response) => {
if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);} if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);}
...@@ -530,14 +565,20 @@ class Utils { ...@@ -530,14 +565,20 @@ class Utils {
static shareTesseractOCRPipelineModelRequest(userId, tesseractOCRPipelineModelId, is_public) { static shareTesseractOCRPipelineModelRequest(userId, tesseractOCRPipelineModelId, is_public) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let tesseractOCRPipelineModel = app.data.users[userId].tesseract_ocr_pipeline_models[tesseractOCRPipelineModelId]; let tesseractOCRPipelineModel;
try {
tesseractOCRPipelineModel = app.data.users[userId].tesseract_ocr_pipeline_models[tesseractOCRPipelineModelId];
} catch (error) {
tesseractOCRPipelineModel = {};
}
let msg = ''; let msg = '';
if (is_public) { if (is_public) {
msg = `Model "${tesseractOCRPipelineModel.title}" is now public`; msg = `Model "${tesseractOCRPipelineModel?.title}" is now public`;
} else { } else {
msg = `Model "${tesseractOCRPipelineModel.title}" is now private`; msg = `Model "${tesseractOCRPipelineModel?.title}" is now private`;
} }
fetch(`/contributions/tesseract-ocr-pipeline-models/${tesseractOCRPipelineModel.id}/toggle-public-status`, {method: 'POST', headers: {Accept: 'application/json'}}) fetch(`/contributions/tesseract-ocr-pipeline-models/${tesseractOCRPipelineModelId}/toggle-public-status`, {method: 'POST', headers: {Accept: 'application/json'}})
.then( .then(
(response) => { (response) => {
if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);} if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);}
...@@ -554,14 +595,20 @@ class Utils { ...@@ -554,14 +595,20 @@ class Utils {
static shareSpaCyNLPPipelineModelRequest(userId, spaCyNLPPipelineModelId, is_public) { static shareSpaCyNLPPipelineModelRequest(userId, spaCyNLPPipelineModelId, is_public) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let spaCyNLPPipelineModel = app.data.users[userId].spacy_nlp_pipeline_models[spaCyNLPPipelineModelId]; let spaCyNLPPipelineModel;
try {
spaCyNLPPipelineModel = app.data.users[userId].spacy_nlp_pipeline_models[spaCyNLPPipelineModelId];
} catch (error) {
spaCyNLPPipelineModel = {};
}
let msg = ''; let msg = '';
if (is_public) { if (is_public) {
msg = `Model "${spaCyNLPPipelineModel.title}" is now public`; msg = `Model "${spaCyNLPPipelineModel?.title}" is now public`;
} else { } else {
msg = `Model "${spaCyNLPPipelineModel.title}" is now private`; msg = `Model "${spaCyNLPPipelineModel?.title}" is now private`;
} }
fetch(`/contributions/spacy-nlp-pipeline-models/${spaCyNLPPipelineModel.id}/toggle-public-status`, {method: 'POST', headers: {Accept: 'application/json'}}) fetch(`/contributions/spacy-nlp-pipeline-models/${spaCyNLPPipelineModelId}/toggle-public-status`, {method: 'POST', headers: {Accept: 'application/json'}})
.then( .then(
(response) => { (response) => {
if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);} if (response.status === 403) {app.flash('Forbidden', 'error'); reject(response);}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment