diff --git a/crm/api/contact.py b/crm/api/contact.py index 8ef93e43..5484bb9b 100644 --- a/crm/api/contact.py +++ b/crm/api/contact.py @@ -132,3 +132,36 @@ def set_as_primary(contact, field, value): contact.save() return True + + +@frappe.whitelist() +def search_emails(txt: str): + doctype = "Contact" + meta = frappe.get_meta(doctype) + filters = [["Contact", "email_id", "is", "set"]] + + if meta.get("fields", {"fieldname": "enabled", "fieldtype": "Check"}): + filters.append([doctype, "enabled", "=", 1]) + if meta.get("fields", {"fieldname": "disabled", "fieldtype": "Check"}): + filters.append([doctype, "disabled", "!=", 1]) + + or_filters = [] + search_fields = ["full_name", "email_id", "name"] + if txt: + for f in search_fields: + or_filters.append([doctype, f.strip(), "like", f"%{txt}%"]) + + results = frappe.get_list( + doctype, + filters=filters, + fields=search_fields, + or_filters=or_filters, + limit_start=0, + limit_page_length=20, + order_by='email_id, full_name, name', + ignore_permissions=False, + as_list=True, + strict=False, + ) + + return results \ No newline at end of file diff --git a/frontend/src/components/CommunicationArea.vue b/frontend/src/components/CommunicationArea.vue index 646abd3e..eb2f8470 100644 --- a/frontend/src/components/CommunicationArea.vue +++ b/frontend/src/components/CommunicationArea.vue @@ -133,7 +133,7 @@ const signature = createResource({ }) function setSignature(editor) { - signature.data = signature.data.replace(/\n/g, '
') + signature.data = signature.data?.replace(/\n/g, '
') let emailContent = editor.getHTML() emailContent = emailContent.startsWith('

') ? emailContent.slice(7) diff --git a/frontend/src/components/Controls/MultiselectInput.vue b/frontend/src/components/Controls/MultiselectInput.vue index 76fbd3cf..a5cb6928 100644 --- a/frontend/src/components/Controls/MultiselectInput.vue +++ b/frontend/src/components/Controls/MultiselectInput.vue @@ -133,30 +133,26 @@ watchDebounced( query, (val) => { val = val || '' - if (text.value === val) return + if (text.value === val && options.value?.length) return text.value = val reload(val) }, - { debounce: 300, immediate: true } + { debounce: 300, immediate: true }, ) const filterOptions = createResource({ - url: 'frappe.desk.search.search_link', + url: 'crm.api.contact.search_emails', method: 'POST', cache: [text.value, 'Contact'], - params: { - txt: text.value, - doctype: 'Contact', - }, + params: { txt: text.value }, transform: (data) => { let allData = data - .filter((c) => { - return c.description.split(', ')[1] - }) .map((option) => { - let email = option.description.split(', ')[1] + let fullName = option[0] + let email = option[1] + let name = option[2] return { - label: option.label || email, + label: fullName || name || email, value: email, } }) @@ -177,10 +173,7 @@ const options = computed(() => { function reload(val) { filterOptions.update({ - params: { - txt: val, - doctype: 'Contact', - }, + params: { txt: val }, }) filterOptions.reload() }