diff --git a/continuousprint/static/js/continuousprint_viewmodel.js b/continuousprint/static/js/continuousprint_viewmodel.js index 11d279f..abca6fa 100644 --- a/continuousprint/static/js/continuousprint_viewmodel.js +++ b/continuousprint/static/js/continuousprint_viewmodel.js @@ -83,14 +83,16 @@ function CPViewModel(parameters) { let oldRemove = self.files.removeFile; let remove_cb = null; self.files.removeFile = function(data, evt) { - for (let j of self.defaultQueue.jobs()) { - for (let s of j.sets()) { - if (s.path() === data.path) { - remove_cb = () => oldRemove(data, evt); - return self.showRemoveConfirmModal() + try { + for (let j of self.defaultQueue.jobs()) { + for (let s of j.sets()) { + if (s.path() === data.path) { + remove_cb = () => oldRemove(data, evt); + return self.showRemoveConfirmModal() + } } } - } + } catch {} // Fail silently on error, and pass through return oldRemove(data, evt); }; self.rmDialog = $("#cpq_removeConfirmDialog"); diff --git a/continuousprint/static/js/continuousprint_viewmodel.test.js b/continuousprint/static/js/continuousprint_viewmodel.test.js index 5c75add..3a78671 100644 --- a/continuousprint/static/js/continuousprint_viewmodel.test.js +++ b/continuousprint/static/js/continuousprint_viewmodel.test.js @@ -208,6 +208,16 @@ test('removeFile shows dialog', () => { expect(rmfile).not.toHaveBeenCalled(); }); +test('removeFile with exception fails gracefully', () => { + let m = mocks(); + let rmfile = m[2].removeFile; + let v = init(1, m); + v.defaultQueue = null; // Can't call .jobs() on null queue + let data = {path: 'asdf'}; + v.files.removeFile(data, null); // Raises exception + expect(rmfile).toHaveBeenCalledWith(data, null); // But still gets forwarded through +}); + test('removeConfirm calls removeFile', () => { let m = mocks(); let rmfile = m[2].removeFile;