From 24a768f6adfab1057a04182b7dc0e98f2c22f6da Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Tue, 10 Dec 2019 14:55:11 +0530 Subject: [PATCH] fix: Commonify error handling for document actions --- src/components/TwoColumnForm.vue | 13 ++----------- src/pages/InvoiceForm.vue | 12 ++++++++---- src/pages/QuickEditForm.vue | 9 +-------- src/utils.js | 16 ++++++++++++++-- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/components/TwoColumnForm.vue b/src/components/TwoColumnForm.vue index 8ad873cb..6a5dfc65 100644 --- a/src/components/TwoColumnForm.vue +++ b/src/components/TwoColumnForm.vue @@ -74,6 +74,7 @@ import { _ } from 'frappejs/utils'; import FormControl from '@/components/Controls/FormControl'; import Button from '@/components/Button'; +import { handleErrorWithDialog } from '@/utils'; let TwoColumnForm = { name: 'TwoColumnForm', @@ -149,17 +150,7 @@ let TwoColumnForm = { return this.doc.submit().catch(this.handleError); }, handleError(e) { - let errorMessage = _('An error occurred.'); - if (e instanceof frappe.errors.DuplicateEntryError) { - errorMessage = _('{0} {1} already exists.', [ - this.doc.doctype, - this.doc.name - ]); - } else { - errorMessage = e.message; - } - this.$emit('error', errorMessage); - throw e; + handleErrorWithDialog(e, this.doc); }, async activateInlineEditing(df) { if (df.inline) { diff --git a/src/pages/InvoiceForm.vue b/src/pages/InvoiceForm.vue index 2b28d108..ce7e2d5a 100644 --- a/src/pages/InvoiceForm.vue +++ b/src/pages/InvoiceForm.vue @@ -182,7 +182,7 @@ import Row from '@/components/Row'; import Dropdown from '@/components/Dropdown'; import BackLink from '@/components/BackLink'; import { openSettings } from '@/pages/Settings/utils'; -import { deleteDocWithPrompt, openQuickEdit } from '@/utils'; +import { deleteDocWithPrompt, handleErrorWithDialog } from '@/utils'; export default { name: 'InvoiceForm', @@ -274,6 +274,7 @@ export default { this.routeToList(); return; } + throw error; } this.doc.on('change', ({ changed }) => { if (changed === this.partyField.fieldname) { @@ -300,10 +301,13 @@ export default { 'items', this.doc.items.filter(row => row.item) ); - await this.doc.insertOrUpdate(); + return this.doc.insertOrUpdate().catch(this.handleError); }, - async onSubmitClick() { - await this.doc.submit(); + onSubmitClick() { + return this.doc.submit().catch(this.handleError); + }, + handleError(e) { + handleErrorWithDialog(e, this.doc); }, async fetchPartyDoc() { if (this.doc[this.partyField.fieldname]) { diff --git a/src/pages/QuickEditForm.vue b/src/pages/QuickEditForm.vue index a4c52f1f..0166d534 100644 --- a/src/pages/QuickEditForm.vue +++ b/src/pages/QuickEditForm.vue @@ -84,7 +84,6 @@ :fields="fields" :autosave="true" :column-ratio="[1.1, 2]" - @error="showErrorDialog" /> @@ -96,7 +95,7 @@ import Button from '@/components/Button'; import FormControl from '@/components/Controls/FormControl'; import TwoColumnForm from '@/components/TwoColumnForm'; import Dropdown from '@/components/Dropdown'; -import { deleteDocWithPrompt, openQuickEdit, showMessageDialog } from '@/utils'; +import { deleteDocWithPrompt, openQuickEdit } from '@/utils'; export default { name: 'QuickEditForm', @@ -239,12 +238,6 @@ export default { } input.size = valueLength; } - }, - - showErrorDialog(errorMessage) { - showMessageDialog({ - message: errorMessage - }); } } }; diff --git a/src/utils.js b/src/utils.js index e03b536d..aaa47c40 100644 --- a/src/utils.js +++ b/src/utils.js @@ -6,7 +6,6 @@ import { remote, shell } from 'electron'; import router from '@/router'; import Avatar from '@/components/Avatar'; - export function createNewDatabase() { return new Promise(resolve => { remote.dialog.showSaveDialog( @@ -80,7 +79,7 @@ export function deleteDocWithPrompt(doc) { .then(() => resolve(true)) .catch(e => { let errorMessage; - if (e instanceof frappe.errors.LinkValidationError) { + if (e.type === frappe.errors.LinkValidationError) { errorMessage = _('{0} {1} is linked with existing records.', [ doc.doctype, doc.name @@ -151,6 +150,19 @@ export function openQuickEdit({ doctype, name, hideFields, defaults = {} }) { }); } +export function handleErrorWithDialog(e, doc) { + let errorMessage = _('An error occurred.'); + if (e.type === frappe.errors.DuplicateEntryError) { + errorMessage = _('{0} {1} already exists.', [doc.doctype, doc.name]); + } else { + errorMessage = e.message; + } + showMessageDialog({ + message: errorMessage + }); + throw e; +} + export function makePDF(html, destination) { const { BrowserWindow } = remote;