refactor: change labels & function names
This commit is contained in:
parent
369292f523
commit
2ef3ccafc7
@ -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:
|
||||||
|
|||||||
1
frontend/components.d.ts
vendored
1
frontend/components.d.ts
vendored
@ -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']
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
@ -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 () => {
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user