From b47fc5b93bb4baa9aa61a3abe5858cab0f7926db Mon Sep 17 00:00:00 2001 From: Pratik Date: Wed, 21 May 2025 14:20:48 +0000 Subject: [PATCH 1/9] feat: handle linked docs while deleting --- crm/api/doc.py | 55 +++++++ crm/utils/__init__.py | 129 +++++++++++++++ frontend/components.d.ts | 1 + .../src/components/DeleteLinkedDocModal.vue | 155 ++++++++++++++++++ frontend/src/pages/Contact.vue | 37 ++--- frontend/src/pages/Deal.vue | 16 ++ frontend/src/pages/Lead.vue | 17 ++ frontend/src/pages/Organization.vue | 38 ++--- 8 files changed, 401 insertions(+), 47 deletions(-) create mode 100644 frontend/src/components/DeleteLinkedDocModal.vue diff --git a/crm/api/doc.py b/crm/api/doc.py index 4bcbe3cc..87d22e61 100644 --- a/crm/api/doc.py +++ b/crm/api/doc.py @@ -10,6 +10,7 @@ from pypika import Criterion from crm.api.views import get_views from crm.fcrm.doctype.crm_form_script.crm_form_script import get_form_script +from crm.utils import get_dynamic_linked_docs, get_linked_docs @frappe.whitelist() @@ -726,3 +727,57 @@ def getCounts(d, doctype): "FCRM Note", filters={"reference_doctype": doctype, "reference_docname": d.get("name")} ) return d + + +@frappe.whitelist() +def getLinkedDocs(doctype, docname): + doc = frappe.get_doc(doctype, docname) + linked_docs = get_linked_docs(doc) + dynamic_linked_docs = get_dynamic_linked_docs(doc) + linked_docs.extend(dynamic_linked_docs) + + return list({doc["reference_docname"]: doc for doc in linked_docs}.values()) + + +@frappe.whitelist() +def removeLinkedDocReference(doctype=None, docname=None,removeAll=False,removeContact=None): + + if (not doctype or not docname) and not removeAll: + return "Invalid doctype or docname" + + if removeAll: + if removeContact: + ref_doc = getLinkedDocs(doctype, docname) + for linked_doc in ref_doc: + removeContactLink(linked_doc["reference_doctype"], linked_doc["reference_docname"]) + + return "success" + + linked_docs = getLinkedDocs(doctype, docname) + for linked_doc in linked_docs: + removeDocLink(linked_doc["reference_doctype"], linked_doc["reference_docname"]) + return "success" + else: + if removeContact: + removeContactLink(doctype, docname) + return "success" + + removeDocLink(doctype, docname) + return "success" + +def removeDocLink(doctype, docname): + linked_doc_data = frappe.get_doc(doctype, docname) + linked_doc_data.update({ + "reference_doctype": None, + "reference_docname": None, + }) + linked_doc_data.save(ignore_permissions=True) + +def removeContactLink(doctype, docname): + linked_doc_data = frappe.get_doc(doctype, docname) + linked_doc_data.update({ + "contact": None, + "contacts": [], + }) + linked_doc_data.save(ignore_permissions=True) + \ No newline at end of file diff --git a/crm/utils/__init__.py b/crm/utils/__init__.py index cd4a4ff8..9b954859 100644 --- a/crm/utils/__init__.py +++ b/crm/utils/__init__.py @@ -1,7 +1,10 @@ +from frappe import frappe import phonenumbers from frappe.utils import floor from phonenumbers import NumberParseException from phonenumbers import PhoneNumberFormat as PNF +from frappe.model.docstatus import DocStatus +from frappe.model.dynamic_links import get_dynamic_link_map def parse_phone_number(phone_number, default_country="IN"): @@ -93,3 +96,129 @@ def seconds_to_duration(seconds): return f"{seconds}s" else: return "0s" + +# Extracted from frappe core frappe/model/delete_doc.py/check_if_doc_is_linked +def get_linked_docs(doc, method="Delete"): + from frappe.model.rename_doc import get_link_fields + + link_fields = get_link_fields(doc.doctype) + ignored_doctypes = set() + + if method == "Cancel" and (doc_ignore_flags := doc.get("ignore_linked_doctypes")): + ignored_doctypes.update(doc_ignore_flags) + if method == "Delete": + ignored_doctypes.update(frappe.get_hooks("ignore_links_on_delete")) + + docs = [] + + for lf in link_fields: + link_dt, link_field, issingle = lf["parent"], lf["fieldname"], lf["issingle"] + if link_dt in ignored_doctypes or (link_field == "amended_from" and method == "Cancel"): + continue + + try: + meta = frappe.get_meta(link_dt) + except frappe.DoesNotExistError: + frappe.clear_last_message() + # This mostly happens when app do not remove their customizations, we shouldn't + # prevent link checks from failing in those cases + continue + + if issingle: + if frappe.db.get_single_value(link_dt, link_field) == doc.name: + docs.append({"doc": doc.name, "link_dt": link_dt, "link_field": link_field}) + continue + + fields = ["name", "docstatus"] + + if meta.istable: + fields.extend(["parent", "parenttype"]) + + for item in frappe.db.get_values(link_dt, {link_field: doc.name}, fields, as_dict=True): + # available only in child table cases + item_parent = getattr(item, "parent", None) + linked_parent_doctype = item.parenttype if item_parent else link_dt + + if linked_parent_doctype in ignored_doctypes: + continue + + if method != "Delete" and (method != "Cancel" or not DocStatus(item.docstatus).is_submitted()): + # don't raise exception if not + # linked to a non-cancelled doc when deleting or to a submitted doc when cancelling + continue + elif link_dt == doc.doctype and (item_parent or item.name) == doc.name: + # don't raise exception if not + # linked to same item or doc having same name as the item + continue + else: + reference_docname = item_parent or item.name + docs.append( + { + "doc": doc.name, + "reference_doctype": linked_parent_doctype, + "reference_docname": reference_docname, + } + ) + return docs + +# Extracted from frappe core frappe/model/delete_doc.py/check_if_doc_is_dynamically_linked +def get_dynamic_linked_docs(doc, method="Delete"): + docs = [] + for df in get_dynamic_link_map().get(doc.doctype, []): + ignore_linked_doctypes = doc.get("ignore_linked_doctypes") or [] + + if df.parent in frappe.get_hooks("ignore_links_on_delete") or ( + df.parent in ignore_linked_doctypes and method == "Cancel" + ): + # don't check for communication and todo! + continue + + meta = frappe.get_meta(df.parent) + if meta.issingle: + # dynamic link in single doc + refdoc = frappe.db.get_singles_dict(df.parent) + if ( + refdoc.get(df.options) == doc.doctype + and refdoc.get(df.fieldname) == doc.name + and ( + # linked to an non-cancelled doc when deleting + (method == "Delete" and not DocStatus(refdoc.docstatus).is_cancelled()) + # linked to a submitted doc when cancelling + or (method == "Cancel" and DocStatus(refdoc.docstatus).is_submitted()) + ) + ): + docs.append({"doc": doc.name, "reference_doctype": df.parent, "reference_docname": df.parent}) + else: + # dynamic link in table + df["table"] = ", `parent`, `parenttype`, `idx`" if meta.istable else "" + for refdoc in frappe.db.sql( + """select `name`, `docstatus` {table} from `tab{parent}` where + `{options}`=%s and `{fieldname}`=%s""".format(**df), + (doc.doctype, doc.name), + as_dict=True, + ): + # linked to an non-cancelled doc when deleting + # or linked to a submitted doc when cancelling + if (method == "Delete" and not DocStatus(refdoc.docstatus).is_cancelled()) or ( + method == "Cancel" and DocStatus(refdoc.docstatus).is_submitted() + ): + reference_doctype = refdoc.parenttype if meta.istable else df.parent + reference_docname = refdoc.parent if meta.istable else refdoc.name + + if reference_doctype in frappe.get_hooks("ignore_links_on_delete") or ( + reference_doctype in ignore_linked_doctypes and method == "Cancel" + ): + # don't check for communication and todo! + continue + + at_position = f"at Row: {refdoc.idx}" if meta.istable else "" + + docs.append( + { + "doc": doc.name, + "reference_doctype": reference_doctype, + "reference_docname": reference_docname, + "at_position": at_position, + } + ) + return docs diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 29a6ae9c..57ae1ffb 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -63,6 +63,7 @@ declare module 'vue' { DealsIcon: typeof import('./src/components/Icons/DealsIcon.vue')['default'] DealsListView: typeof import('./src/components/ListViews/DealsListView.vue')['default'] DeclinedCallIcon: typeof import('./src/components/Icons/DeclinedCallIcon.vue')['default'] + DeleteLinkedDocModal: typeof import('./src/components/DeleteLinkedDocModal.vue')['default'] DesendingIcon: typeof import('./src/components/Icons/DesendingIcon.vue')['default'] DesktopLayout: typeof import('./src/components/Layouts/DesktopLayout.vue')['default'] DetailsIcon: typeof import('./src/components/Icons/DetailsIcon.vue')['default'] diff --git a/frontend/src/components/DeleteLinkedDocModal.vue b/frontend/src/components/DeleteLinkedDocModal.vue new file mode 100644 index 00000000..204b900b --- /dev/null +++ b/frontend/src/components/DeleteLinkedDocModal.vue @@ -0,0 +1,155 @@ + + + diff --git a/frontend/src/pages/Contact.vue b/frontend/src/pages/Contact.vue index 7e0f1d4d..501a3daf 100644 --- a/frontend/src/pages/Contact.vue +++ b/frontend/src/pages/Contact.vue @@ -105,7 +105,7 @@ :label="__('Delete')" theme="red" size="sm" - @click="deleteContact" + @click="deleteContact()" > diff --git a/frontend/src/components/DeleteLinkedDocModal.vue b/frontend/src/components/DeleteLinkedDocModal.vue index 204b900b..f6ccedaf 100644 --- a/frontend/src/components/DeleteLinkedDocModal.vue +++ b/frontend/src/components/DeleteLinkedDocModal.vue @@ -1,6 +1,6 @@ diff --git a/frontend/src/pages/CallLogs.vue b/frontend/src/pages/CallLogs.vue index c39c0019..5ca66240 100644 --- a/frontend/src/pages/CallLogs.vue +++ b/frontend/src/pages/CallLogs.vue @@ -79,7 +79,7 @@ import CallLogDetailModal from '@/components/Modals/CallLogDetailModal.vue' import CallLogModal from '@/components/Modals/CallLogModal.vue' import { getCallLogDetail } from '@/utils/callLog' import { createResource } from 'frappe-ui' -import { computed, ref } from 'vue' +import { computed, ref, onMounted } from 'vue' const callLogsListView = ref(null) const showCallLogModal = ref(false) @@ -123,4 +123,19 @@ function createCallLog() { callLog.value = {} showCallLogModal.value = true } + +const openCallLogFromURL = () => { + const searchParams = new URLSearchParams(window.location.search) + const callLogName = searchParams.get('open') + + if (callLogName) { + showCallLog(callLogName) + searchParams.delete('open') + window.history.replaceState(null, '', window.location.pathname) + } +} + +onMounted(() => { + openCallLogFromURL() +}) diff --git a/frontend/src/pages/Notes.vue b/frontend/src/pages/Notes.vue index 340a8c43..0c111edd 100644 --- a/frontend/src/pages/Notes.vue +++ b/frontend/src/pages/Notes.vue @@ -127,6 +127,7 @@ const viewControls = ref(null) watch( () => notes.value?.data?.page_length_count, (val, old_value) => { + openNoteFromURL() if (!val || val === old_value) return updatedPageCount.value = val }, @@ -152,4 +153,20 @@ async function deleteNote(name) { }) notes.value.reload() } + +const openNoteFromURL = () => { + const searchParams = new URLSearchParams(window.location.search) + const noteName = searchParams.get('open') + + if (noteName && notes.value?.data?.data) { + const foundNote = notes.value.data.data.find( + (note) => note.name === noteName, + ) + if (foundNote) { + editNote(foundNote) + } + searchParams.delete('open') + window.history.replaceState(null, '', window.location.pathname) + } +} diff --git a/frontend/src/pages/Tasks.vue b/frontend/src/pages/Tasks.vue index f73e1804..5a2c2f1c 100644 --- a/frontend/src/pages/Tasks.vue +++ b/frontend/src/pages/Tasks.vue @@ -211,7 +211,7 @@ import { getMeta } from '@/stores/meta' import { usersStore } from '@/stores/users' import { formatDate, timeAgo } from '@/utils' import { Tooltip, Avatar, TextEditor, Dropdown, call } from 'frappe-ui' -import { computed, ref } from 'vue' +import { computed, ref, watch } from 'vue' import { useRouter } from 'vue-router' const { getFormattedPercent, getFormattedFloat, getFormattedCurrency } = @@ -246,6 +246,7 @@ const rows = computed(() => { return getKanbanRows(tasks.value.data.data, tasks.value.data.fields) } + openTaskFromURL() return parseRows(tasks.value?.data.data, tasks.value?.data.columns) }) @@ -391,4 +392,15 @@ function redirect(doctype, docname) { } router.push({ name: name, params: params }) } + +const openTaskFromURL = () => { + const searchParams = new URLSearchParams(window.location.search) + const taskName = searchParams.get('open') + + if (taskName && rows.value?.length) { + showTask(parseInt(taskName)) + searchParams.delete('open') + window.history.replaceState(null, '', window.location.pathname) + } +} From 7f5f43f0c262cb0acafec1c711448202ea60f9db Mon Sep 17 00:00:00 2001 From: Pratik Date: Tue, 27 May 2025 05:22:30 +0000 Subject: [PATCH 4/9] style: fix dark mode styles --- frontend/src/components/BulkDeleteLinkedDocModal.vue | 4 ++-- frontend/src/components/DeleteLinkedDocModal.vue | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/BulkDeleteLinkedDocModal.vue b/frontend/src/components/BulkDeleteLinkedDocModal.vue index 609f4ef2..5365c298 100644 --- a/frontend/src/components/BulkDeleteLinkedDocModal.vue +++ b/frontend/src/components/BulkDeleteLinkedDocModal.vue @@ -15,7 +15,7 @@
-
+
{{ __('Are you sure you want to delete {0} items?', [ props.items?.length, @@ -61,7 +61,7 @@
-
+
{{ confirmDeleteInfo.delete ? __( diff --git a/frontend/src/components/DeleteLinkedDocModal.vue b/frontend/src/components/DeleteLinkedDocModal.vue index f6ccedaf..6341c983 100644 --- a/frontend/src/components/DeleteLinkedDocModal.vue +++ b/frontend/src/components/DeleteLinkedDocModal.vue @@ -16,7 +16,7 @@
- + {{ __( 'Delete or unlink these linked documents before deleting this document', @@ -44,7 +44,7 @@ :unlinkLinkedDoc="unlinkLinkedDoc" />
-
+
{{ __('Are you sure you want to delete {0} - {1}?', [ props.doctype, @@ -117,7 +117,7 @@
-
+
{{ confirmDeleteInfo.message }}
From 716dc056d6e4e0e323d668c598ba0b0a4d94865b Mon Sep 17 00:00:00 2001 From: Pratik Date: Thu, 29 May 2025 05:52:36 +0000 Subject: [PATCH 5/9] refactor: move delete button --- frontend/src/pages/Deal.vue | 17 ++++++++++++----- frontend/src/pages/Lead.vue | 17 ++++++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/frontend/src/pages/Deal.vue b/frontend/src/pages/Deal.vue index 37bc2c60..eb2c7b01 100644 --- a/frontend/src/pages/Deal.vue +++ b/frontend/src/pages/Deal.vue @@ -8,11 +8,6 @@ -
+ +
+ +
+
From c70dced268deb2a96dc493a95e798523088aa5ee Mon Sep 17 00:00:00 2001 From: Pratik Date: Thu, 29 May 2025 06:02:35 +0000 Subject: [PATCH 6/9] refactor: internationalization & code clean up --- frontend/src/components/BulkDeleteLinkedDocModal.vue | 2 -- frontend/src/components/DeleteLinkedDocModal.vue | 9 ++++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/BulkDeleteLinkedDocModal.vue b/frontend/src/components/BulkDeleteLinkedDocModal.vue index 5365c298..6f28cebc 100644 --- a/frontend/src/components/BulkDeleteLinkedDocModal.vue +++ b/frontend/src/components/BulkDeleteLinkedDocModal.vue @@ -22,7 +22,6 @@ ]) }}
-
@@ -72,7 +71,6 @@ ) }}
-
diff --git a/frontend/src/components/DeleteLinkedDocModal.vue b/frontend/src/components/DeleteLinkedDocModal.vue index 6341c983..81f6f2e3 100644 --- a/frontend/src/components/DeleteLinkedDocModal.vue +++ b/frontend/src/components/DeleteLinkedDocModal.vue @@ -52,7 +52,6 @@ ]) }}
-
@@ -66,10 +65,10 @@
- Delete and unlink + {{ __('Delete and unlink') }} {{ viewControls?.selections?.length == 0 - ? 'all' + ? __('all') : `${viewControls?.selections?.length} item(s)` }} @@ -83,10 +82,10 @@
- Unlink + {{ __('Unlink') }} {{ viewControls?.selections?.length == 0 - ? 'all' + ? __('all') : `${viewControls?.selections?.length} item(s)` }} From 34102ef6efa0ed5e942203dde6f4a925e04c9d94 Mon Sep 17 00:00:00 2001 From: Pratik Date: Mon, 23 Jun 2025 05:15:40 +0000 Subject: [PATCH 7/9] refactor: change labels & function names --- crm/api/doc.py | 89 ++++++++++--------- frontend/components.d.ts | 1 - .../components/BulkDeleteLinkedDocModal.vue | 4 +- .../src/components/DeleteLinkedDocModal.vue | 24 +++-- .../ListViews/LinkedDocsListView.vue | 37 +++++--- 5 files changed, 92 insertions(+), 63 deletions(-) diff --git a/crm/api/doc.py b/crm/api/doc.py index e61d484b..74227b68 100644 --- a/crm/api/doc.py +++ b/crm/api/doc.py @@ -678,6 +678,7 @@ def remove_assignments(doctype, name, assignees, ignore_permissions=False): ignore_permissions=ignore_permissions, ) + @frappe.whitelist() def get_assigned_users(doctype, name, default_assigned_to=None): assigned_users = frappe.get_all( @@ -749,85 +750,93 @@ def getCounts(d, doctype): @frappe.whitelist() -def getLinkedDocs(doctype, docname): +def get_linked_docs_of_document(doctype, docname): doc = frappe.get_doc(doctype, docname) linked_docs = get_linked_docs(doc) dynamic_linked_docs = get_dynamic_linked_docs(doc) - + linked_docs.extend(dynamic_linked_docs) linked_docs = list({doc["reference_docname"]: doc for doc in linked_docs}.values()) - + docs_data = [] for doc in linked_docs: data = frappe.get_doc(doc["reference_doctype"], doc["reference_docname"]) title = data.get("title") if data.doctype == "CRM Call Log": - title = f"CRM Call Log - from {data.get('from')} to {data.get('to')}" - + title = f"Call from {data.get('from')} to {data.get('to')}" + if data.doctype == "CRM Deal": title = data.get("organization") - - docs_data.append({ - "doc": data.doctype, - "title": title or data.get("name"), - "reference_docname": doc["reference_docname"], - "reference_doctype": doc["reference_doctype"], - }) + + docs_data.append( + { + "doc": data.doctype, + "title": title or data.get("name"), + "reference_docname": doc["reference_docname"], + "reference_doctype": doc["reference_doctype"], + } + ) return docs_data -def removeDocLink(doctype, docname): +def remove_doc_link(doctype, docname): linked_doc_data = frappe.get_doc(doctype, docname) - linked_doc_data.update({ - "reference_doctype": None, - "reference_docname": None, - }) + linked_doc_data.update( + { + "reference_doctype": None, + "reference_docname": None, + } + ) linked_doc_data.save(ignore_permissions=True) -def removeContactLink(doctype, docname): + +def remove_contact_link(doctype, docname): linked_doc_data = frappe.get_doc(doctype, docname) - linked_doc_data.update({ - "contact": None, - "contacts": [], - }) + linked_doc_data.update( + { + "contact": None, + "contacts": [], + } + ) linked_doc_data.save(ignore_permissions=True) + @frappe.whitelist() -def removeLinkedDocReference(items, removeContact=None, delete=False): - +def remove_linked_doc_reference(items, remove_contact=None, delete=False): if isinstance(items, str): items = frappe.parse_json(items) for item in items: - if removeContact: - removeContactLink(item["doctype"], item["docname"]) + if remove_contact: + remove_contact_link(item["doctype"], item["docname"]) else: - removeDocLink(item["doctype"], item["docname"]) - + remove_doc_link(item["doctype"], item["docname"]) + if delete: frappe.delete_doc(item["doctype"], item["docname"]) return "success" - + @frappe.whitelist() -def deleteBulkDocs(doctype, items, deleteLinked=False): +def delete_bulk_docs(doctype, items, delete_linked=False): from frappe.desk.reportview import delete_bulk items = frappe.parse_json(items) for doc in items: - linked_docs = getLinkedDocs(doctype, doc) + linked_docs = get_linked_docs_of_document(doctype, doc) for linked_doc in linked_docs: - removeLinkedDocReference([ - { - "doctype": linked_doc["reference_doctype"], - "docname": linked_doc["reference_docname"], - } - ] , - removeContact=doctype=="Contact", - delete=deleteLinked + remove_linked_doc_reference( + [ + { + "doctype": linked_doc["reference_doctype"], + "docname": linked_doc["reference_docname"], + } + ], + remove_contact=doctype == "Contact", + delete=delete_linked, ) - + if len(items) > 10: frappe.enqueue("frappe.desk.reportview.delete_bulk", doctype=doctype, items=items) else: diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 09597c6d..03c0c61c 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -54,7 +54,6 @@ declare module 'vue' { ContactsIcon: typeof import('./src/components/Icons/ContactsIcon.vue')['default'] ContactsListView: typeof import('./src/components/ListViews/ContactsListView.vue')['default'] ConvertIcon: typeof import('./src/components/Icons/ConvertIcon.vue')['default'] - copy: typeof import('./src/components/DeleteLinkedDocModal copy.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'] diff --git a/frontend/src/components/BulkDeleteLinkedDocModal.vue b/frontend/src/components/BulkDeleteLinkedDocModal.vue index 6f28cebc..40b6cbac 100644 --- a/frontend/src/components/BulkDeleteLinkedDocModal.vue +++ b/frontend/src/components/BulkDeleteLinkedDocModal.vue @@ -149,10 +149,10 @@ const confirmUnlink = () => { } const deleteDocs = () => { - call('crm.api.doc.deleteBulkDocs', { + call('crm.api.doc.delete_bulk_docs', { items: props.items, doctype: props.doctype, - deleteLinked: confirmDeleteInfo.value.delete, + delete_linked: confirmDeleteInfo.value.delete, }).then(() => { confirmDeleteInfo.value = { show: false, diff --git a/frontend/src/components/DeleteLinkedDocModal.vue b/frontend/src/components/DeleteLinkedDocModal.vue index 81f6f2e3..224ee9b9 100644 --- a/frontend/src/components/DeleteLinkedDocModal.vue +++ b/frontend/src/components/DeleteLinkedDocModal.vue @@ -5,7 +5,11 @@

- {{ __('Delete') }} + {{ + linkedDocs?.length == 0 + ? __('Delete') + : __('Delete or unlink linked documents') + }}

@@ -32,7 +36,7 @@ key: 'title', }, { - label: 'Doctype', + label: 'Master', key: 'reference_doctype', width: '30%', }, @@ -65,7 +69,7 @@
- {{ __('Delete and unlink') }} + {{ __('Delete') }} {{ viewControls?.selections?.length == 0 ? __('all') @@ -76,7 +80,8 @@
@@ -50,6 +41,12 @@ @click.stop="viewLinkedDoc(row)" />
+ + {{ getDoctypeName(row.reference_doctype) }} + @@ -58,7 +55,6 @@ From 480cc07cd9fc4682e7d75f8d89fe3262e998cac3 Mon Sep 17 00:00:00 2001 From: Pratik Date: Mon, 23 Jun 2025 07:35:15 +0000 Subject: [PATCH 8/9] refactor: remove unnecessary functions & components --- .../src/components/DeleteLinkedDocModal.vue | 15 ++++++++++----- .../components/ListViews/LinkedDocsListView.vue | 17 +---------------- frontend/src/pages/Contact.vue | 1 - frontend/src/pages/Organization.vue | 13 ------------- 4 files changed, 11 insertions(+), 35 deletions(-) diff --git a/frontend/src/components/DeleteLinkedDocModal.vue b/frontend/src/components/DeleteLinkedDocModal.vue index 224ee9b9..eb5e4694 100644 --- a/frontend/src/components/DeleteLinkedDocModal.vue +++ b/frontend/src/components/DeleteLinkedDocModal.vue @@ -2,7 +2,7 @@