From 20e970d90fb0b800d5f0c029e546684c6d0b6cdc Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 12 May 2025 19:27:41 +0530 Subject: [PATCH] feat: added global create document modal for link field (cherry picked from commit 76aaf7f37d38e293dbb247badd92782a59309d67) --- frontend/components.d.ts | 2 + frontend/src/components/Controls/Grid.vue | 8 + frontend/src/components/FieldLayout/Field.vue | 7 + .../src/components/Layouts/DesktopLayout.vue | 2 + .../components/Modals/CreateDocumentModal.vue | 146 ++++++++++++++++++ .../src/components/Modals/GlobalModals.vue | 32 ++++ frontend/src/composables/document.js | 14 ++ 7 files changed, 211 insertions(+) create mode 100644 frontend/src/components/Modals/CreateDocumentModal.vue create mode 100644 frontend/src/components/Modals/GlobalModals.vue create mode 100644 frontend/src/composables/document.js diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 82afdb19..30f16244 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -53,6 +53,7 @@ declare module 'vue' { ContactsListView: typeof import('./src/components/ListViews/ContactsListView.vue')['default'] ConvertIcon: typeof import('./src/components/Icons/ConvertIcon.vue')['default'] CountUpTimer: typeof import('./src/components/CountUpTimer.vue')['default'] + CreateDocumentModal: typeof import('./src/components/Modals/CreateDocumentModal.vue')['default'] CRMLogo: typeof import('./src/components/Icons/CRMLogo.vue')['default'] CustomActions: typeof import('./src/components/CustomActions.vue')['default'] DashboardIcon: typeof import('./src/components/Icons/DashboardIcon.vue')['default'] @@ -116,6 +117,7 @@ declare module 'vue' { FrappeCloudIcon: typeof import('./src/components/Icons/FrappeCloudIcon.vue')['default'] GenderIcon: typeof import('./src/components/Icons/GenderIcon.vue')['default'] GeneralSettings: typeof import('./src/components/Settings/GeneralSettings.vue')['default'] + GlobalModals: typeof import('./src/components/Modals/GlobalModals.vue')['default'] GoogleIcon: typeof import('./src/components/Icons/GoogleIcon.vue')['default'] Grid: typeof import('./src/components/Controls/Grid.vue')['default'] GridFieldsEditorModal: typeof import('./src/components/Controls/GridFieldsEditorModal.vue')['default'] diff --git a/frontend/src/components/Controls/Grid.vue b/frontend/src/components/Controls/Grid.vue index 51f14b43..668072fd 100644 --- a/frontend/src/components/Controls/Grid.vue +++ b/frontend/src/components/Controls/Grid.vue @@ -126,6 +126,7 @@ " :filters="field.filters" @change="(v) => fieldChange(v, field, row)" + :onCreate="field.create" /> { }) function getFieldObj(field) { + if (field.fieldtype === 'Link' && field.options !== 'User') { + if (!field.create) { + field.create = (obj, close) => createDocument(field.options, obj, close) + } + } + return { ...field, filters: field.link_filters && JSON.parse(field.link_filters), diff --git a/frontend/src/components/FieldLayout/Field.vue b/frontend/src/components/FieldLayout/Field.vue index b8a7c11d..534a151e 100644 --- a/frontend/src/components/FieldLayout/Field.vue +++ b/frontend/src/components/FieldLayout/Field.vue @@ -215,6 +215,7 @@ import UserAvatar from '@/components/UserAvatar.vue' import TableMultiselectInput from '@/components/Controls/TableMultiselectInput.vue' import Link from '@/components/Controls/Link.vue' import Grid from '@/components/Controls/Grid.vue' +import { createDocument } from '@/composables/document' import { getFormat, evaluateDependsOnValue } from '@/utils' import { flt } from '@/utils/numberFormat.js' import { getMeta } from '@/stores/meta' @@ -272,6 +273,12 @@ const field = computed(() => { field.fieldtype = 'User' } + if (field.fieldtype === 'Link' && field.options !== 'User') { + if (!field.create) { + field.create = (obj, close) => createDocument(field.options, obj, close) + } + } + let _field = { ...field, filters: field.link_filters && JSON.parse(field.link_filters), diff --git a/frontend/src/components/Layouts/DesktopLayout.vue b/frontend/src/components/Layouts/DesktopLayout.vue index f244b6ff..9d4416b2 100644 --- a/frontend/src/components/Layouts/DesktopLayout.vue +++ b/frontend/src/components/Layouts/DesktopLayout.vue @@ -7,9 +7,11 @@ + diff --git a/frontend/src/components/Modals/CreateDocumentModal.vue b/frontend/src/components/Modals/CreateDocumentModal.vue new file mode 100644 index 00000000..6c1ccaf8 --- /dev/null +++ b/frontend/src/components/Modals/CreateDocumentModal.vue @@ -0,0 +1,146 @@ + + + diff --git a/frontend/src/components/Modals/GlobalModals.vue b/frontend/src/components/Modals/GlobalModals.vue new file mode 100644 index 00000000..c01dfd23 --- /dev/null +++ b/frontend/src/components/Modals/GlobalModals.vue @@ -0,0 +1,32 @@ + + diff --git a/frontend/src/composables/document.js b/frontend/src/composables/document.js new file mode 100644 index 00000000..cd9b1a5c --- /dev/null +++ b/frontend/src/composables/document.js @@ -0,0 +1,14 @@ +import { ref } from 'vue' + +export const showCreateDocumentModal = ref(false) +export const createDocumentDoctype = ref('') +export const createDocumentData = ref({}) + +export function createDocument(doctype, obj, close) { + if (doctype) { + close() + createDocumentDoctype.value = doctype + createDocumentData.value = obj || {} + showCreateDocumentModal.value = true + } +}