refactor: change labels & function names

This commit is contained in:
Pratik 2025-06-23 05:15:40 +00:00
parent 369292f523
commit 2ef3ccafc7
5 changed files with 92 additions and 63 deletions

View File

@ -677,6 +677,7 @@ def remove_assignments(doctype, name, assignees, ignore_permissions=False):
ignore_permissions=ignore_permissions, ignore_permissions=ignore_permissions,
) )
@frappe.whitelist() @frappe.whitelist()
def get_assigned_users(doctype, name, default_assigned_to=None): def get_assigned_users(doctype, name, default_assigned_to=None):
assigned_users = frappe.get_all( assigned_users = frappe.get_all(
@ -748,85 +749,93 @@ def getCounts(d, doctype):
@frappe.whitelist() @frappe.whitelist()
def getLinkedDocs(doctype, docname): def get_linked_docs_of_document(doctype, docname):
doc = frappe.get_doc(doctype, docname) doc = frappe.get_doc(doctype, docname)
linked_docs = get_linked_docs(doc) linked_docs = get_linked_docs(doc)
dynamic_linked_docs = get_dynamic_linked_docs(doc) dynamic_linked_docs = get_dynamic_linked_docs(doc)
linked_docs.extend(dynamic_linked_docs) linked_docs.extend(dynamic_linked_docs)
linked_docs = list({doc["reference_docname"]: doc for doc in linked_docs}.values()) linked_docs = list({doc["reference_docname"]: doc for doc in linked_docs}.values())
docs_data = [] docs_data = []
for doc in linked_docs: for doc in linked_docs:
data = frappe.get_doc(doc["reference_doctype"], doc["reference_docname"]) data = frappe.get_doc(doc["reference_doctype"], doc["reference_docname"])
title = data.get("title") title = data.get("title")
if data.doctype == "CRM Call Log": 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": if data.doctype == "CRM Deal":
title = data.get("organization") title = data.get("organization")
docs_data.append({ docs_data.append(
"doc": data.doctype, {
"title": title or data.get("name"), "doc": data.doctype,
"reference_docname": doc["reference_docname"], "title": title or data.get("name"),
"reference_doctype": doc["reference_doctype"], "reference_docname": doc["reference_docname"],
}) "reference_doctype": doc["reference_doctype"],
}
)
return docs_data return docs_data
def removeDocLink(doctype, docname): def remove_doc_link(doctype, docname):
linked_doc_data = frappe.get_doc(doctype, docname) linked_doc_data = frappe.get_doc(doctype, docname)
linked_doc_data.update({ linked_doc_data.update(
"reference_doctype": None, {
"reference_docname": None, "reference_doctype": None,
}) "reference_docname": None,
}
)
linked_doc_data.save(ignore_permissions=True) 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 = frappe.get_doc(doctype, docname)
linked_doc_data.update({ linked_doc_data.update(
"contact": None, {
"contacts": [], "contact": None,
}) "contacts": [],
}
)
linked_doc_data.save(ignore_permissions=True) linked_doc_data.save(ignore_permissions=True)
@frappe.whitelist() @frappe.whitelist()
def removeLinkedDocReference(items, removeContact=None, delete=False): def remove_linked_doc_reference(items, remove_contact=None, delete=False):
if isinstance(items, str): if isinstance(items, str):
items = frappe.parse_json(items) items = frappe.parse_json(items)
for item in items: for item in items:
if removeContact: if remove_contact:
removeContactLink(item["doctype"], item["docname"]) remove_contact_link(item["doctype"], item["docname"])
else: else:
removeDocLink(item["doctype"], item["docname"]) remove_doc_link(item["doctype"], item["docname"])
if delete: if delete:
frappe.delete_doc(item["doctype"], item["docname"]) frappe.delete_doc(item["doctype"], item["docname"])
return "success" return "success"
@frappe.whitelist() @frappe.whitelist()
def deleteBulkDocs(doctype, items, deleteLinked=False): def delete_bulk_docs(doctype, items, delete_linked=False):
from frappe.desk.reportview import delete_bulk from frappe.desk.reportview import delete_bulk
items = frappe.parse_json(items) items = frappe.parse_json(items)
for doc in 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: for linked_doc in linked_docs:
removeLinkedDocReference([ remove_linked_doc_reference(
{ [
"doctype": linked_doc["reference_doctype"], {
"docname": linked_doc["reference_docname"], "doctype": linked_doc["reference_doctype"],
} "docname": linked_doc["reference_docname"],
] , }
removeContact=doctype=="Contact", ],
delete=deleteLinked remove_contact=doctype == "Contact",
delete=delete_linked,
) )
if len(items) > 10: if len(items) > 10:
frappe.enqueue("frappe.desk.reportview.delete_bulk", doctype=doctype, items=items) frappe.enqueue("frappe.desk.reportview.delete_bulk", doctype=doctype, items=items)
else: else:

View File

@ -56,7 +56,6 @@ declare module 'vue' {
ContactsIcon: typeof import('./src/components/Icons/ContactsIcon.vue')['default'] ContactsIcon: typeof import('./src/components/Icons/ContactsIcon.vue')['default']
ContactsListView: typeof import('./src/components/ListViews/ContactsListView.vue')['default'] ContactsListView: typeof import('./src/components/ListViews/ContactsListView.vue')['default']
ConvertIcon: typeof import('./src/components/Icons/ConvertIcon.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'] CountUpTimer: typeof import('./src/components/CountUpTimer.vue')['default']
CreateDocumentModal: typeof import('./src/components/Modals/CreateDocumentModal.vue')['default'] CreateDocumentModal: typeof import('./src/components/Modals/CreateDocumentModal.vue')['default']
CRMLogo: typeof import('./src/components/Icons/CRMLogo.vue')['default'] CRMLogo: typeof import('./src/components/Icons/CRMLogo.vue')['default']

View File

@ -149,10 +149,10 @@ const confirmUnlink = () => {
} }
const deleteDocs = () => { const deleteDocs = () => {
call('crm.api.doc.deleteBulkDocs', { call('crm.api.doc.delete_bulk_docs', {
items: props.items, items: props.items,
doctype: props.doctype, doctype: props.doctype,
deleteLinked: confirmDeleteInfo.value.delete, delete_linked: confirmDeleteInfo.value.delete,
}).then(() => { }).then(() => {
confirmDeleteInfo.value = { confirmDeleteInfo.value = {
show: false, show: false,

View File

@ -5,7 +5,11 @@
<div class="mb-6 flex items-center justify-between"> <div class="mb-6 flex items-center justify-between">
<div> <div>
<h3 class="text-2xl leading-6 text-ink-gray-9 font-semibold"> <h3 class="text-2xl leading-6 text-ink-gray-9 font-semibold">
{{ __('Delete') }} {{
linkedDocs?.length == 0
? __('Delete')
: __('Delete or unlink linked documents')
}}
</h3> </h3>
</div> </div>
<div class="flex items-center gap-1"> <div class="flex items-center gap-1">
@ -32,7 +36,7 @@
key: 'title', key: 'title',
}, },
{ {
label: 'Doctype', label: 'Master',
key: 'reference_doctype', key: 'reference_doctype',
width: '30%', width: '30%',
}, },
@ -65,7 +69,7 @@
<div class="flex gap-1"> <div class="flex gap-1">
<FeatherIcon name="trash" class="h-4 w-4" /> <FeatherIcon name="trash" class="h-4 w-4" />
<span> <span>
{{ __('Delete and unlink') }} {{ __('Delete') }}
{{ {{
viewControls?.selections?.length == 0 viewControls?.selections?.length == 0
? __('all') ? __('all')
@ -76,7 +80,8 @@
</Button> </Button>
<Button <Button
v-if="linkedDocs?.length > 0" v-if="linkedDocs?.length > 0"
variant="solid" variant="subtle"
theme="gray"
@click="confirmUnlink()" @click="confirmUnlink()"
> >
<div class="flex gap-1"> <div class="flex gap-1">
@ -172,7 +177,7 @@ const confirmDeleteInfo = ref({
}) })
const linkedDocsResource = createResource({ const linkedDocsResource = createResource({
url: 'crm.api.doc.getLinkedDocs', url: 'crm.api.doc.get_linked_docs_of_document',
params: { params: {
doctype: props.doctype, doctype: props.doctype,
docname: props.docname, docname: props.docname,
@ -211,9 +216,9 @@ const unlinkLinkedDoc = (doc) => {
})) }))
} }
call('crm.api.doc.removeLinkedDocReference', { call('crm.api.doc.remove_linked_doc_reference', {
items: selectedDocs, items: selectedDocs,
removeContact: props.doctype == 'Contact', remove_contact: props.doctype == 'Contact',
delete: doc.delete, delete: doc.delete,
}).then(() => { }).then(() => {
linkedDocsResource.reload() linkedDocsResource.reload()
@ -231,7 +236,7 @@ const confirmDelete = () => {
: viewControls.value.selections.length : viewControls.value.selections.length
confirmDeleteInfo.value = { confirmDeleteInfo.value = {
show: true, show: true,
title: __('Delete'), title: __('Delete linked item'),
message: __('Are you sure you want to delete {0} linked item(s)?', [items]), message: __('Are you sure you want to delete {0} linked item(s)?', [items]),
delete: true, delete: true,
} }
@ -244,7 +249,7 @@ const confirmUnlink = () => {
: viewControls.value.selections.length : viewControls.value.selections.length
confirmDeleteInfo.value = { confirmDeleteInfo.value = {
show: true, show: true,
title: __('Unlink'), title: __('Unlink linked item'),
message: __('Are you sure you want to unlink {0} linked item(s)?', [items]), message: __('Are you sure you want to unlink {0} linked item(s)?', [items]),
delete: false, delete: false,
} }
@ -256,6 +261,7 @@ const removeDocLinks = () => {
reference_docname: props.docname, reference_docname: props.docname,
delete: confirmDeleteInfo.value.delete, delete: confirmDeleteInfo.value.delete,
}) })
viewControls.value.updateSelections([])
} }
const deleteDoc = async () => { const deleteDoc = async () => {

View File

@ -19,15 +19,6 @@
:item="column" :item="column"
@columnWidthUpdated="emit('columnWidthUpdated', column)" @columnWidthUpdated="emit('columnWidthUpdated', column)"
> >
<Button
v-if="column.key == 'reference_docname'"
variant="ghosted"
class="!h-4"
:class="isLikeFilterApplied ? 'fill-red-500' : 'fill-white'"
@click="() => emit('applyLikeFilter')"
>
<HeartIcon class="h-4 w-4" />
</Button>
</ListHeaderItem> </ListHeaderItem>
</ListHeader> </ListHeader>
<div class="*:mx-0 *:sm:mx-0"> <div class="*:mx-0 *:sm:mx-0">
@ -50,6 +41,12 @@
@click.stop="viewLinkedDoc(row)" @click.stop="viewLinkedDoc(row)"
/> />
</div> </div>
<span
v-if="column.key === 'reference_doctype'"
class="truncate text-base flex gap-2"
>
{{ getDoctypeName(row.reference_doctype) }}
</span>
</template> </template>
</ListRowItem> </ListRowItem>
</ListRows> </ListRows>
@ -58,7 +55,6 @@
</template> </template>
<script setup> <script setup>
import HeartIcon from '@/components/Icons/HeartIcon.vue'
import ListRows from '@/components/ListViews/ListRows.vue' import ListRows from '@/components/ListViews/ListRows.vue'
import { ListView, ListHeader, ListHeaderItem, ListRowItem } from 'frappe-ui' import { ListView, ListHeader, ListHeaderItem, ListRowItem } from 'frappe-ui'
import { ref } from 'vue' import { ref } from 'vue'
@ -123,7 +119,7 @@ const viewLinkedDoc = (doc) => {
page = 'contacts' page = 'contacts'
id = doc.reference_docname id = doc.reference_docname
break break
case 'Organization': case 'CRM Organization':
page = 'organizations' page = 'organizations'
id = doc.reference_docname id = doc.reference_docname
break break
@ -136,4 +132,23 @@ const viewLinkedDoc = (doc) => {
} }
window.open(`/crm/${page}/${id}`) window.open(`/crm/${page}/${id}`)
} }
const getDoctypeName = (doctype) => {
switch (doctype) {
case 'CRM Lead':
return 'Lead'
case 'CRM Call Log':
return 'Call Log'
case 'CRM Task':
return 'Task'
case 'Contact':
return 'Contact'
case 'CRM Organization':
return 'Organization'
case 'FCRM Note':
return 'Note'
default:
return doctype
}
}
</script> </script>