From a15af06176868b26abe3019f5598feb711ca8e0f Mon Sep 17 00:00:00 2001 From: Pratik Date: Wed, 23 Apr 2025 15:54:54 +0530 Subject: [PATCH 01/72] fix: international call log issue (cherry picked from commit 4907db44eb1b9cc51b700647fae6b1cdd5b38ce0) --- crm/integrations/api.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crm/integrations/api.py b/crm/integrations/api.py index d8300678..6c4e35e0 100644 --- a/crm/integrations/api.py +++ b/crm/integrations/api.py @@ -110,12 +110,12 @@ def get_contact_by_phone_number(phone_number): number = parse_phone_number(phone_number) if number.get("is_valid"): - return get_contact(number.get("national_number")) + return get_contact(number.get("national_number"), number.get("country")) else: - return get_contact(phone_number, exact_match=True) + return get_contact(phone_number, number.get("country"), exact_match=True) -def get_contact(phone_number, exact_match=False): +def get_contact(phone_number, country="IN", exact_match=False): if not phone_number: return {"mobile_no": phone_number} @@ -149,11 +149,11 @@ def get_contact(phone_number, exact_match=False): deal = frappe.db.get_value( "CRM Contacts", {"contact": contact.name, "is_primary": 1}, "parent" ) - if are_same_phone_number(contact.mobile_no, phone_number, validate=not exact_match): + if are_same_phone_number(contact.mobile_no, phone_number, country, validate=not exact_match): contact["deal"] = deal return contact # Else, return the first contact - if are_same_phone_number(contacts[0].mobile_no, phone_number, validate=not exact_match): + if are_same_phone_number(contacts[0].mobile_no, phone_number, country, validate=not exact_match): return contacts[0] # Else, Check if the number is associated with a lead @@ -173,7 +173,7 @@ def get_contact(phone_number, exact_match=False): if len(leads): for lead in leads: - if are_same_phone_number(lead.mobile_no, phone_number, validate=not exact_match): + if are_same_phone_number(lead.mobile_no, phone_number, country, validate=not exact_match): lead["lead"] = lead.name lead["full_name"] = lead.lead_name return lead From ed2821725fd0550bbb4d67d3d2f669069bb7911f Mon Sep 17 00:00:00 2001 From: frappe-pr-bot Date: Sun, 27 Apr 2025 09:35:22 +0000 Subject: [PATCH 02/72] chore: update POT file (cherry picked from commit 699d6cb08c1970fca91c49d28742e2ceeec04e2a) --- crm/locale/main.pot | 318 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 246 insertions(+), 72 deletions(-) diff --git a/crm/locale/main.pot b/crm/locale/main.pot index 499aeadb..894e6ef3 100644 --- a/crm/locale/main.pot +++ b/crm/locale/main.pot @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: Frappe CRM VERSION\n" "Report-Msgid-Bugs-To: shariq@frappe.io\n" -"POT-Creation-Date: 2025-04-20 09:35+0000\n" -"PO-Revision-Date: 2025-04-20 09:35+0000\n" +"POT-Creation-Date: 2025-04-27 09:35+0000\n" +"PO-Revision-Date: 2025-04-27 09:35+0000\n" "Last-Translator: shariq@frappe.io\n" "Language-Team: shariq@frappe.io\n" "MIME-Version: 1.0\n" @@ -121,6 +121,10 @@ msgstr "" msgid "API Key" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:179 +msgid "API Key is required" +msgstr "" + #. Label of the api_secret (Password) field in DocType 'CRM Twilio Settings' #. Label of the api_secret (Password) field in DocType 'ERPNext CRM Settings' #: crm/fcrm/doctype/crm_twilio_settings/crm_twilio_settings.json @@ -151,6 +155,10 @@ msgstr "" msgid "Accepted At" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:13 +msgid "Account Name" +msgstr "" + #. Label of the account_sid (Data) field in DocType 'CRM Exotel Settings' #. Label of the account_sid (Data) field in DocType 'CRM Twilio Settings' #: crm/fcrm/doctype/crm_exotel_settings/crm_exotel_settings.json @@ -158,17 +166,25 @@ msgstr "" msgid "Account SID" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:165 +msgid "Account name is required" +msgstr "" + #: frontend/src/components/CustomActions.vue:73 #: frontend/src/components/ViewControls.vue:682 #: frontend/src/components/ViewControls.vue:1111 msgid "Actions" msgstr "" -#: frontend/src/pages/Deal.vue:542 frontend/src/pages/Lead.vue:528 +#: frontend/src/pages/Deal.vue:546 frontend/src/pages/Lead.vue:532 #: frontend/src/pages/MobileDeal.vue:441 frontend/src/pages/MobileLead.vue:344 msgid "Activity" msgstr "" +#: frontend/src/components/Settings/EmailAccountList.vue:9 +msgid "Add Account" +msgstr "" + #: frontend/src/components/ColumnSettings.vue:65 #: frontend/src/components/Kanban/KanbanView.vue:157 msgid "Add Column" @@ -266,9 +282,9 @@ msgstr "" msgid "All" msgstr "" -#: frontend/src/pages/Contact.vue:629 frontend/src/pages/MobileContact.vue:607 +#: frontend/src/pages/Contact.vue:633 frontend/src/pages/MobileContact.vue:607 #: frontend/src/pages/MobileOrganization.vue:493 -#: frontend/src/pages/Organization.vue:528 +#: frontend/src/pages/Organization.vue:532 msgid "Amount" msgstr "" @@ -331,12 +347,12 @@ msgstr "" msgid "Are you sure you want to delete this attachment?" msgstr "" -#: frontend/src/pages/Contact.vue:317 frontend/src/pages/MobileContact.vue:292 +#: frontend/src/pages/Contact.vue:321 frontend/src/pages/MobileContact.vue:292 msgid "Are you sure you want to delete this contact?" msgstr "" #: frontend/src/pages/MobileOrganization.vue:286 -#: frontend/src/pages/Organization.vue:324 +#: frontend/src/pages/Organization.vue:328 msgid "Are you sure you want to delete this organization?" msgstr "" @@ -397,7 +413,7 @@ msgstr "" msgid "Attach a file" msgstr "" -#: frontend/src/pages/Deal.vue:577 frontend/src/pages/Lead.vue:563 +#: frontend/src/pages/Deal.vue:581 frontend/src/pages/Lead.vue:567 #: frontend/src/pages/MobileDeal.vue:477 frontend/src/pages/MobileLead.vue:380 msgid "Attachments" msgstr "" @@ -414,6 +430,7 @@ msgid "BCC" msgstr "" #: frontend/src/components/FilesUploader/FilesUploader.vue:31 +#: frontend/src/components/Settings/EmailEdit.vue:67 msgid "Back" msgstr "" @@ -650,7 +667,7 @@ msgstr "" msgid "Calling..." msgstr "" -#: frontend/src/pages/Deal.vue:562 frontend/src/pages/Lead.vue:548 +#: frontend/src/pages/Deal.vue:566 frontend/src/pages/Lead.vue:552 #: frontend/src/pages/MobileDeal.vue:461 frontend/src/pages/MobileLead.vue:364 msgid "Calls" msgstr "" @@ -706,7 +723,7 @@ msgstr "" msgid "Change image" msgstr "" -#: frontend/src/pages/Lead.vue:241 frontend/src/pages/Lead.vue:267 +#: frontend/src/pages/Lead.vue:245 frontend/src/pages/Lead.vue:271 #: frontend/src/pages/MobileLead.vue:110 frontend/src/pages/MobileLead.vue:137 msgid "Choose Existing" msgstr "" @@ -719,6 +736,10 @@ msgstr "" msgid "Choose Existing Organization" msgstr "" +#: frontend/src/components/Settings/EmailAdd.vue:9 +msgid "Choose the email service provider you want to configure." +msgstr "" + #: frontend/src/components/Controls/Link.vue:60 msgid "Clear" msgstr "" @@ -790,7 +811,7 @@ msgstr "" msgid "Comment" msgstr "" -#: frontend/src/pages/Deal.vue:552 frontend/src/pages/Lead.vue:538 +#: frontend/src/pages/Deal.vue:556 frontend/src/pages/Lead.vue:542 #: frontend/src/pages/MobileDeal.vue:451 frontend/src/pages/MobileLead.vue:354 msgid "Comments" msgstr "" @@ -840,7 +861,7 @@ msgstr "" #: crm/fcrm/doctype/crm_contacts/crm_contacts.json #: crm/fcrm/doctype/crm_deal/crm_deal.json #: frontend/src/components/Layouts/AppSidebar.vue:509 -#: frontend/src/pages/Lead.vue:263 frontend/src/pages/MobileLead.vue:133 +#: frontend/src/pages/Lead.vue:267 frontend/src/pages/MobileLead.vue:133 msgid "Contact" msgstr "" @@ -852,11 +873,11 @@ msgstr "" msgid "Contact Us" msgstr "" -#: frontend/src/pages/Deal.vue:661 frontend/src/pages/MobileDeal.vue:560 +#: frontend/src/pages/Deal.vue:665 frontend/src/pages/MobileDeal.vue:560 msgid "Contact added" msgstr "" -#: frontend/src/pages/Deal.vue:647 frontend/src/pages/MobileDeal.vue:546 +#: frontend/src/pages/Deal.vue:651 frontend/src/pages/MobileDeal.vue:546 msgid "Contact already added" msgstr "" @@ -868,7 +889,7 @@ msgstr "" msgid "Contact not found" msgstr "" -#: frontend/src/pages/Deal.vue:676 frontend/src/pages/MobileDeal.vue:575 +#: frontend/src/pages/Deal.vue:680 frontend/src/pages/MobileDeal.vue:575 msgid "Contact removed" msgstr "" @@ -877,7 +898,7 @@ msgstr "" #. Label of a shortcut in the Frappe CRM Workspace #: crm/fcrm/doctype/crm_deal/crm_deal.json #: crm/fcrm/workspace/frappe_crm/frappe_crm.json -#: frontend/src/pages/Contact.vue:261 frontend/src/pages/MobileContact.vue:236 +#: frontend/src/pages/Contact.vue:265 frontend/src/pages/MobileContact.vue:236 #: frontend/src/pages/MobileOrganization.vue:373 msgid "Contacts" msgstr "" @@ -896,7 +917,7 @@ msgstr "" #: frontend/src/components/Layouts/AppSidebar.vue:351 #: frontend/src/components/ListBulkActions.vue:70 -#: frontend/src/pages/Lead.vue:201 frontend/src/pages/MobileLead.vue:49 +#: frontend/src/pages/Lead.vue:205 frontend/src/pages/MobileLead.vue:49 #: frontend/src/pages/MobileLead.vue:96 msgid "Convert" msgstr "" @@ -908,7 +929,7 @@ msgstr "" #: frontend/src/components/ListBulkActions.vue:62 #: frontend/src/components/ListBulkActions.vue:204 -#: frontend/src/pages/Lead.vue:38 frontend/src/pages/Lead.vue:212 +#: frontend/src/pages/Lead.vue:38 frontend/src/pages/Lead.vue:216 #: frontend/src/pages/MobileLead.vue:92 msgid "Convert to Deal" msgstr "" @@ -1032,7 +1053,7 @@ msgstr "" msgid "Custom statuses" msgstr "" -#: frontend/src/pages/Deal.vue:430 +#: frontend/src/pages/Deal.vue:434 msgid "Customer created successfully" msgstr "" @@ -1046,7 +1067,7 @@ msgstr "" #: frontend/src/components/Activities/DataFields.vue:6 #: frontend/src/components/Layouts/AppSidebar.vue:539 -#: frontend/src/pages/Deal.vue:557 frontend/src/pages/Lead.vue:543 +#: frontend/src/pages/Deal.vue:561 frontend/src/pages/Lead.vue:547 #: frontend/src/pages/MobileDeal.vue:456 frontend/src/pages/MobileLead.vue:359 msgid "Data" msgstr "" @@ -1082,19 +1103,19 @@ msgstr "" msgid "Deal Statuses" msgstr "" -#: frontend/src/pages/Contact.vue:650 frontend/src/pages/MobileContact.vue:628 +#: frontend/src/pages/Contact.vue:654 frontend/src/pages/MobileContact.vue:628 #: frontend/src/pages/MobileOrganization.vue:514 -#: frontend/src/pages/Organization.vue:549 +#: frontend/src/pages/Organization.vue:553 msgid "Deal owner" msgstr "" -#: frontend/src/pages/Deal.vue:470 frontend/src/pages/MobileDeal.vue:363 +#: frontend/src/pages/Deal.vue:474 frontend/src/pages/MobileDeal.vue:363 msgid "Deal updated" msgstr "" #. Label of a shortcut in the Frappe CRM Workspace #: crm/fcrm/workspace/frappe_crm/frappe_crm.json -#: frontend/src/pages/Deal.vue:502 frontend/src/pages/MobileContact.vue:320 +#: frontend/src/pages/Deal.vue:506 frontend/src/pages/MobileContact.vue:320 #: frontend/src/pages/MobileDeal.vue:395 #: frontend/src/pages/MobileOrganization.vue:367 msgid "Deals" @@ -1109,17 +1130,37 @@ msgstr "" msgid "Default" msgstr "" +#: frontend/src/components/Settings/EmailAccountCard.vue:41 +msgid "Default Inbox" +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:44 +msgid "Default Incoming" +msgstr "" + #. Label of the default_medium (Select) field in DocType 'CRM Telephony Agent' #: crm/fcrm/doctype/crm_telephony_agent/crm_telephony_agent.json msgid "Default Medium" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:52 +msgid "Default Outgoing" +msgstr "" + #. Label of the default_priority (Check) field in DocType 'CRM Service Level #. Priority' #: crm/fcrm/doctype/crm_service_level_priority/crm_service_level_priority.json msgid "Default Priority" msgstr "" +#: frontend/src/components/Settings/EmailAccountCard.vue:43 +msgid "Default Sending" +msgstr "" + +#: frontend/src/components/Settings/EmailAccountCard.vue:39 +msgid "Default Sending and Inbox" +msgstr "" + #: crm/fcrm/doctype/crm_service_level_agreement/crm_service_level_agreement.py:33 msgid "Default Service Level Agreement already exists for {0}" msgstr "" @@ -1157,14 +1198,14 @@ msgstr "" #: frontend/src/components/ListBulkActions.vue:186 #: frontend/src/components/ViewControls.vue:1163 #: frontend/src/components/ViewControls.vue:1174 -#: frontend/src/pages/Contact.vue:105 frontend/src/pages/Contact.vue:320 +#: frontend/src/pages/Contact.vue:105 frontend/src/pages/Contact.vue:324 #: frontend/src/pages/MobileContact.vue:81 #: frontend/src/pages/MobileContact.vue:295 #: frontend/src/pages/MobileDeal.vue:526 #: frontend/src/pages/MobileOrganization.vue:72 #: frontend/src/pages/MobileOrganization.vue:289 #: frontend/src/pages/Notes.vue:40 frontend/src/pages/Organization.vue:83 -#: frontend/src/pages/Organization.vue:327 frontend/src/pages/Tasks.vue:368 +#: frontend/src/pages/Organization.vue:331 frontend/src/pages/Tasks.vue:368 msgid "Delete" msgstr "" @@ -1186,12 +1227,12 @@ msgstr "" msgid "Delete attachment" msgstr "" -#: frontend/src/pages/Contact.vue:316 frontend/src/pages/MobileContact.vue:291 +#: frontend/src/pages/Contact.vue:320 frontend/src/pages/MobileContact.vue:291 msgid "Delete contact" msgstr "" #: frontend/src/pages/MobileOrganization.vue:285 -#: frontend/src/pages/Organization.vue:323 +#: frontend/src/pages/Organization.vue:327 msgid "Delete organization" msgstr "" @@ -1357,6 +1398,10 @@ msgstr "" msgid "Edit Data Fields Layout" msgstr "" +#: frontend/src/components/Settings/EmailEdit.vue:6 +msgid "Edit Email" +msgstr "" + #: frontend/src/components/Modals/SidePanelModal.vue:7 msgid "Edit Field Layout" msgstr "" @@ -1409,19 +1454,24 @@ msgstr "" #: crm/fcrm/doctype/crm_contacts/crm_contacts.json #: crm/fcrm/doctype/crm_deal/crm_deal.json #: crm/fcrm/doctype/crm_invitation/crm_invitation.json -#: crm/fcrm/doctype/crm_lead/crm_lead.json frontend/src/pages/Contact.vue:640 +#: crm/fcrm/doctype/crm_lead/crm_lead.json frontend/src/pages/Contact.vue:644 #: frontend/src/pages/MobileContact.vue:618 #: frontend/src/pages/MobileOrganization.vue:504 #: frontend/src/pages/MobileOrganization.vue:532 -#: frontend/src/pages/Organization.vue:539 -#: frontend/src/pages/Organization.vue:567 +#: frontend/src/pages/Organization.vue:543 +#: frontend/src/pages/Organization.vue:571 msgid "Email" msgstr "" +#: frontend/src/components/Settings/EmailAccountList.vue:6 #: frontend/src/components/Settings/Settings.vue:107 msgid "Email Accounts" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:168 +msgid "Email ID is required" +msgstr "" + #. Label of the email_sent_at (Datetime) field in DocType 'CRM Invitation' #: crm/fcrm/doctype/crm_invitation/crm_invitation.json msgid "Email Sent At" @@ -1431,6 +1481,14 @@ msgstr "" msgid "Email Templates" msgstr "" +#: frontend/src/components/Settings/EmailAdd.vue:143 +msgid "Email account created successfully" +msgstr "" + +#: frontend/src/components/Settings/EmailEdit.vue:214 +msgid "Email account updated successfully" +msgstr "" + #: frontend/src/components/Layouts/AppSidebar.vue:537 msgid "Email communication" msgstr "" @@ -1443,7 +1501,7 @@ msgstr "" msgid "Email template" msgstr "" -#: frontend/src/pages/Deal.vue:547 frontend/src/pages/Lead.vue:533 +#: frontend/src/pages/Deal.vue:551 frontend/src/pages/Lead.vue:537 #: frontend/src/pages/MobileDeal.vue:446 frontend/src/pages/MobileLead.vue:349 msgid "Emails" msgstr "" @@ -1464,6 +1522,14 @@ msgstr "" msgid "Enable" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:28 +msgid "Enable Incoming" +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:36 +msgid "Enable Outgoing" +msgstr "" + #. Label of the enabled (Check) field in DocType 'CRM Exotel Settings' #. Label of the enabled (Check) field in DocType 'CRM Form Script' #. Label of the enabled (Check) field in DocType 'CRM Service Level Agreement' @@ -1508,28 +1574,28 @@ msgstr "" #: frontend/src/components/Settings/SettingsPage.vue:91 #: frontend/src/components/Settings/TelephonySettings.vue:131 #: frontend/src/components/Settings/TelephonySettings.vue:156 -#: frontend/src/pages/Lead.vue:629 frontend/src/pages/Lead.vue:639 +#: frontend/src/pages/Lead.vue:633 frontend/src/pages/Lead.vue:643 #: frontend/src/pages/MobileLead.vue:438 frontend/src/pages/MobileLead.vue:448 msgid "Error" msgstr "" -#: frontend/src/pages/Deal.vue:491 frontend/src/pages/MobileDeal.vue:384 +#: frontend/src/pages/Deal.vue:495 frontend/src/pages/MobileDeal.vue:384 msgid "Error Updating Deal" msgstr "" -#: frontend/src/pages/Lead.vue:477 frontend/src/pages/MobileLead.vue:287 +#: frontend/src/pages/Lead.vue:481 frontend/src/pages/MobileLead.vue:287 msgid "Error Updating Lead" msgstr "" -#: frontend/src/pages/Lead.vue:662 +#: frontend/src/pages/Lead.vue:666 msgid "Error converting to deal" msgstr "" -#: frontend/src/pages/Deal.vue:478 frontend/src/pages/MobileDeal.vue:371 +#: frontend/src/pages/Deal.vue:482 frontend/src/pages/MobileDeal.vue:371 msgid "Error updating deal" msgstr "" -#: frontend/src/pages/Lead.vue:464 frontend/src/pages/MobileLead.vue:274 +#: frontend/src/pages/Lead.vue:468 frontend/src/pages/MobileLead.vue:274 msgid "Error updating lead" msgstr "" @@ -1632,10 +1698,18 @@ msgstr "" msgid "Failed to capture Twilio recording" msgstr "" +#: frontend/src/components/Settings/EmailAdd.vue:150 +msgid "Failed to create email account, Invalid credentials" +msgstr "" + #: crm/integrations/twilio/api.py:152 msgid "Failed to update Twilio call status" msgstr "" +#: frontend/src/components/Settings/EmailEdit.vue:222 +msgid "Failed to update email account, Invalid credentials" +msgstr "" + #. Label of the favicon (Attach) field in DocType 'FCRM Settings' #: crm/fcrm/doctype/fcrm_settings/fcrm_settings.json #: frontend/src/components/Settings/GeneralSettings.vue:62 @@ -1888,6 +1962,22 @@ msgstr "" msgid "Icon" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:55 +msgid "If enabled, all outgoing emails will be sent from this account. Note: Only one account can be default outgoing." +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:47 +msgid "If enabled, all replies to your company (eg: replies@yourcomany.com) will come to this account. Note: Only one account can be default incoming." +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:39 +msgid "If enabled, outgoing emails can be sent from this account." +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:31 +msgid "If enabled, records can be created from the incoming emails on this account." +msgstr "" + #. Label of the image (Attach Image) field in DocType 'CRM Lead' #: crm/fcrm/doctype/crm_lead/crm_lead.json msgid "Image" @@ -1916,6 +2006,10 @@ msgstr "" msgid "Inbound Call" msgstr "" +#: frontend/src/components/Settings/EmailAccountCard.vue:45 +msgid "Inbox" +msgstr "" + #. Option for the 'Type' (Select) field in DocType 'CRM Call Log' #: crm/fcrm/doctype/crm_call_log/crm_call_log.json msgid "Incoming" @@ -1984,6 +2078,10 @@ msgstr "" msgid "Invalid credentials" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:172 +msgid "Invalid email ID" +msgstr "" + #: frontend/src/components/Settings/Settings.vue:101 msgid "Invite Members" msgstr "" @@ -2138,11 +2236,11 @@ msgstr "" msgid "Last Year" msgstr "" -#: frontend/src/pages/Contact.vue:655 frontend/src/pages/MobileContact.vue:633 +#: frontend/src/pages/Contact.vue:659 frontend/src/pages/MobileContact.vue:633 #: frontend/src/pages/MobileOrganization.vue:519 #: frontend/src/pages/MobileOrganization.vue:547 -#: frontend/src/pages/Organization.vue:554 -#: frontend/src/pages/Organization.vue:582 +#: frontend/src/pages/Organization.vue:558 +#: frontend/src/pages/Organization.vue:586 msgid "Last modified" msgstr "" @@ -2188,13 +2286,13 @@ msgstr "" msgid "Lead Statuses" msgstr "" -#: frontend/src/pages/Lead.vue:456 frontend/src/pages/MobileLead.vue:266 +#: frontend/src/pages/Lead.vue:460 frontend/src/pages/MobileLead.vue:266 msgid "Lead updated" msgstr "" #. Label of a shortcut in the Frappe CRM Workspace #: crm/fcrm/workspace/frappe_crm/frappe_crm.json -#: frontend/src/pages/Lead.vue:488 frontend/src/pages/MobileLead.vue:298 +#: frontend/src/pages/Lead.vue:492 frontend/src/pages/MobileLead.vue:298 msgid "Leads" msgstr "" @@ -2395,9 +2493,9 @@ msgstr "" msgid "Mobile app installation" msgstr "" -#: frontend/src/pages/Contact.vue:645 frontend/src/pages/MobileContact.vue:623 +#: frontend/src/pages/Contact.vue:649 frontend/src/pages/MobileContact.vue:623 #: frontend/src/pages/MobileOrganization.vue:509 -#: frontend/src/pages/Organization.vue:544 +#: frontend/src/pages/Organization.vue:548 msgid "Mobile no" msgstr "" @@ -2435,7 +2533,7 @@ msgstr "" #: frontend/src/components/Modals/EmailTemplateModal.vue:24 #: frontend/src/components/ViewControls.vue:781 #: frontend/src/pages/MobileOrganization.vue:527 -#: frontend/src/pages/Organization.vue:562 +#: frontend/src/pages/Organization.vue:566 msgid "Name" msgstr "" @@ -2506,11 +2604,11 @@ msgstr "" msgid "New WhatsApp Message" msgstr "" -#: frontend/src/pages/Lead.vue:279 frontend/src/pages/MobileLead.vue:150 +#: frontend/src/pages/Lead.vue:283 frontend/src/pages/MobileLead.vue:150 msgid "New contact will be created based on the person's details" msgstr "" -#: frontend/src/pages/Lead.vue:254 frontend/src/pages/MobileLead.vue:124 +#: frontend/src/pages/Lead.vue:258 frontend/src/pages/MobileLead.vue:124 msgid "New organization will be created based on the data in details section" msgstr "" @@ -2558,6 +2656,10 @@ msgstr "" msgid "No Title" msgstr "" +#: frontend/src/components/Settings/EmailEdit.vue:152 +msgid "No changes made" +msgstr "" + #: frontend/src/components/Modals/SidePanelModal.vue:51 #: frontend/src/pages/Deal.vue:262 frontend/src/pages/MobileDeal.vue:199 msgid "No contacts added" @@ -2571,7 +2673,7 @@ msgstr "" msgid "No label" msgstr "" -#: frontend/src/pages/Deal.vue:722 +#: frontend/src/pages/Deal.vue:726 msgid "No mobile number set" msgstr "" @@ -2584,7 +2686,7 @@ msgstr "" msgid "No phone number set" msgstr "" -#: frontend/src/pages/Deal.vue:717 +#: frontend/src/pages/Deal.vue:721 msgid "No primary contact set" msgstr "" @@ -2675,8 +2777,8 @@ msgstr "" msgid "Not allowed to set primary contact for Deal" msgstr "" -#: frontend/src/pages/Contact.vue:252 frontend/src/pages/Deal.vue:414 -#: frontend/src/pages/Lead.vue:422 frontend/src/pages/Organization.vue:241 +#: frontend/src/pages/Contact.vue:256 frontend/src/pages/Deal.vue:418 +#: frontend/src/pages/Lead.vue:426 frontend/src/pages/Organization.vue:245 msgid "Not permitted" msgstr "" @@ -2686,7 +2788,7 @@ msgstr "" msgid "Note" msgstr "" -#: frontend/src/pages/Deal.vue:572 frontend/src/pages/Lead.vue:558 +#: frontend/src/pages/Deal.vue:576 frontend/src/pages/Lead.vue:562 #: frontend/src/pages/MobileDeal.vue:472 frontend/src/pages/MobileLead.vue:375 msgid "Notes" msgstr "" @@ -2734,10 +2836,10 @@ msgstr "" msgid "Old Parent" msgstr "" -#: frontend/src/pages/Contact.vue:300 frontend/src/pages/Lead.vue:592 +#: frontend/src/pages/Contact.vue:304 frontend/src/pages/Lead.vue:596 #: frontend/src/pages/MobileContact.vue:275 #: frontend/src/pages/MobileOrganization.vue:269 -#: frontend/src/pages/Organization.vue:307 +#: frontend/src/pages/Organization.vue:311 msgid "Only PNG and JPG images are allowed" msgstr "" @@ -2792,13 +2894,13 @@ msgstr "" #: crm/fcrm/doctype/crm_deal/crm_deal.json #: crm/fcrm/doctype/crm_lead/crm_lead.json #: frontend/src/components/Layouts/AppSidebar.vue:510 -#: frontend/src/pages/Contact.vue:624 frontend/src/pages/Lead.vue:237 +#: frontend/src/pages/Contact.vue:628 frontend/src/pages/Lead.vue:241 #: frontend/src/pages/MobileContact.vue:602 #: frontend/src/pages/MobileLead.vue:106 #: frontend/src/pages/MobileOrganization.vue:488 #: frontend/src/pages/MobileOrganization.vue:542 -#: frontend/src/pages/Organization.vue:523 -#: frontend/src/pages/Organization.vue:577 +#: frontend/src/pages/Organization.vue:527 +#: frontend/src/pages/Organization.vue:581 msgid "Organization" msgstr "" @@ -2826,14 +2928,14 @@ msgid "Organization logo" msgstr "" #: frontend/src/pages/MobileOrganization.vue:216 -#: frontend/src/pages/Organization.vue:254 +#: frontend/src/pages/Organization.vue:258 msgid "Organization updated" msgstr "" #. Label of a shortcut in the Frappe CRM Workspace #: crm/fcrm/workspace/frappe_crm/frappe_crm.json #: frontend/src/pages/MobileOrganization.vue:223 -#: frontend/src/pages/Organization.vue:261 +#: frontend/src/pages/Organization.vue:265 msgid "Organizations" msgstr "" @@ -2865,10 +2967,18 @@ msgstr "" msgid "Parent CRM Territory" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:64 +msgid "Password" +msgstr "" + #: crm/api/demo.py:21 crm/api/demo.py:29 msgid "Password cannot be reset by Demo User {}" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:175 +msgid "Password is required" +msgstr "" + #: frontend/src/components/Modals/EmailTemplateModal.vue:23 #: frontend/src/components/Modals/EmailTemplateSelectorModal.vue:11 msgid "Payment Reminder" @@ -2903,7 +3013,7 @@ msgstr "" #: crm/fcrm/doctype/crm_lead/crm_lead.json #: crm/fcrm/doctype/crm_telephony_agent/crm_telephony_agent.json #: frontend/src/pages/MobileOrganization.vue:537 -#: frontend/src/pages/Organization.vue:572 +#: frontend/src/pages/Organization.vue:576 msgid "Phone" msgstr "" @@ -2933,6 +3043,10 @@ msgstr "" msgid "Playback speed" msgstr "" +#: frontend/src/components/Settings/EmailAccountList.vue:34 +msgid "Please add an email account to continue." +msgstr "" + #: crm/integrations/twilio/twilio_handler.py:119 msgid "Please enable twilio settings before making a call." msgstr "" @@ -2941,11 +3055,11 @@ msgstr "" msgid "Please enter a valid URL" msgstr "" -#: frontend/src/pages/Lead.vue:630 frontend/src/pages/MobileLead.vue:439 +#: frontend/src/pages/Lead.vue:634 frontend/src/pages/MobileLead.vue:439 msgid "Please select an existing contact" msgstr "" -#: frontend/src/pages/Lead.vue:640 frontend/src/pages/MobileLead.vue:449 +#: frontend/src/pages/Lead.vue:644 frontend/src/pages/MobileLead.vue:449 msgid "Please select an existing organization" msgstr "" @@ -2964,7 +3078,7 @@ msgstr "" msgid "Primary" msgstr "" -#: frontend/src/pages/Deal.vue:691 frontend/src/pages/MobileDeal.vue:590 +#: frontend/src/pages/Deal.vue:695 frontend/src/pages/MobileDeal.vue:590 msgid "Primary contact set" msgstr "" @@ -3099,7 +3213,7 @@ msgstr "" msgid "Reject" msgstr "" -#: frontend/src/pages/Deal.vue:627 +#: frontend/src/pages/Deal.vue:631 msgid "Remove" msgstr "" @@ -3433,7 +3547,7 @@ msgstr "" msgid "Set an organization" msgstr "" -#: frontend/src/pages/Deal.vue:635 frontend/src/pages/MobileDeal.vue:534 +#: frontend/src/pages/Deal.vue:639 frontend/src/pages/MobileDeal.vue:534 msgid "Set as Primary Contact" msgstr "" @@ -3449,12 +3563,56 @@ msgstr "" msgid "Setting up" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:145 +msgid "Setting up Frappe Mail requires you to have an API key and API Secret of your email account. Read more " +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:97 +msgid "" +"Setting up GMail requires you to enable two factor authentication\n" +"\t\t and app specific passwords. Read more" +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:105 +msgid "" +"Setting up Outlook requires you to enable two factor authentication\n" +"\t\t and app specific passwords. Read more" +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:113 +msgid "" +"Setting up Sendgrid requires you to enable two factor authentication\n" +"\t\t and app specific passwords. Read more " +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:121 +msgid "" +"Setting up SparkPost requires you to enable two factor authentication\n" +"\t\t and app specific passwords. Read more " +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:129 +msgid "" +"Setting up Yahoo requires you to enable two factor authentication\n" +"\t\t and app specific passwords. Read more " +msgstr "" + +#: frontend/src/components/Settings/emailConfig.js:137 +msgid "" +"Setting up Yandex requires you to enable two factor authentication\n" +"\t\t and app specific passwords. Read more " +msgstr "" + #: frontend/src/components/Layouts/AppSidebar.vue:494 #: frontend/src/components/Settings/Settings.vue:11 #: frontend/src/components/Settings/Settings.vue:81 msgid "Settings" msgstr "" +#: frontend/src/components/Settings/EmailAdd.vue:6 +msgid "Setup Email" +msgstr "" + #: frontend/src/components/Activities/Activities.vue:230 msgid "Show" msgstr "" @@ -3550,10 +3708,10 @@ msgstr "" #: crm/fcrm/doctype/crm_invitation/crm_invitation.json #: crm/fcrm/doctype/crm_lead/crm_lead.json #: crm/fcrm/doctype/crm_lead_status/crm_lead_status.json -#: crm/fcrm/doctype/crm_task/crm_task.json frontend/src/pages/Contact.vue:635 +#: crm/fcrm/doctype/crm_task/crm_task.json frontend/src/pages/Contact.vue:639 #: frontend/src/pages/MobileContact.vue:613 #: frontend/src/pages/MobileOrganization.vue:499 -#: frontend/src/pages/Organization.vue:534 +#: frontend/src/pages/Organization.vue:538 msgid "Status" msgstr "" @@ -3596,6 +3754,10 @@ msgstr "" msgid "Sunday" msgstr "" +#: frontend/src/components/Settings/emailConfig.js:16 +msgid "Support / Sales" +msgstr "" + #: frontend/src/components/FilesUploader/FilesUploader.vue:49 msgid "Switch camera" msgstr "" @@ -3631,7 +3793,7 @@ msgstr "" msgid "Task" msgstr "" -#: frontend/src/pages/Deal.vue:567 frontend/src/pages/Lead.vue:553 +#: frontend/src/pages/Deal.vue:571 frontend/src/pages/Lead.vue:557 #: frontend/src/pages/MobileDeal.vue:467 frontend/src/pages/MobileLead.vue:370 msgid "Tasks" msgstr "" @@ -3751,6 +3913,10 @@ msgstr "" msgid "To User" msgstr "" +#: frontend/src/components/Settings/EmailEdit.vue:119 +msgid "To know more about setting up email accounts, click" +msgstr "" + #: frontend/src/components/Filter.vue:619 msgid "Today" msgstr "" @@ -3882,6 +4048,10 @@ msgstr "" msgid "Update" msgstr "" +#: frontend/src/components/Settings/EmailEdit.vue:74 +msgid "Update Account" +msgstr "" + #: frontend/src/components/Modals/EditValueModal.vue:30 msgid "Update {0} Records" msgstr "" @@ -3965,7 +4135,7 @@ msgid "Website" msgstr "" #: frontend/src/pages/MobileOrganization.vue:308 -#: frontend/src/pages/Organization.vue:350 +#: frontend/src/pages/Organization.vue:354 msgid "Website not found" msgstr "" @@ -3995,7 +4165,7 @@ msgstr "" #: crm/fcrm/doctype/crm_notification/crm_notification.json #: frontend/src/components/Layouts/AppSidebar.vue:562 #: frontend/src/components/Settings/Settings.vue:124 -#: frontend/src/pages/Deal.vue:582 frontend/src/pages/Lead.vue:568 +#: frontend/src/pages/Deal.vue:586 frontend/src/pages/Lead.vue:572 #: frontend/src/pages/MobileDeal.vue:482 frontend/src/pages/MobileLead.vue:385 msgid "WhatsApp" msgstr "" @@ -4146,6 +4316,10 @@ msgstr "" msgid "has reached out" msgstr "" +#: frontend/src/components/Settings/EmailEdit.vue:25 +msgid "here" +msgstr "" + #: frontend/src/components/Settings/InviteMemberPage.vue:17 msgid "john@doe.com" msgstr "" @@ -4247,7 +4421,7 @@ msgstr "" msgid "{0} assigned a {1} {2} to you" msgstr "" -#: frontend/src/pages/Deal.vue:492 frontend/src/pages/Lead.vue:478 +#: frontend/src/pages/Deal.vue:496 frontend/src/pages/Lead.vue:482 #: frontend/src/pages/MobileDeal.vue:385 frontend/src/pages/MobileLead.vue:288 msgid "{0} is a required field" msgstr "" From d1a15e97f103de62f011ee3906f67696f270c59d Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 1 May 2025 17:22:26 +0530 Subject: [PATCH 03/72] fix: get scripts api (cherry picked from commit b03abdd2eb523e17b62c34a5e2610387480c3847) --- crm/api/script.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 crm/api/script.py diff --git a/crm/api/script.py b/crm/api/script.py new file mode 100644 index 00000000..bfbfa405 --- /dev/null +++ b/crm/api/script.py @@ -0,0 +1,17 @@ +import frappe +from pypika import Criterion + + +@frappe.whitelist() +def get_scripts(doctype, view="Form"): + Script = frappe.qb.DocType("CRM Form Script") + query = ( + frappe.qb.from_(Script) + .select("*") + .where(Script.dt == doctype) + .where(Script.view == view) + .where(Script.enabled == 1) + ) + + scripts = query.run(as_dict=True) + return scripts From 1a1f0478f0109c878a0043928b77e94248c5b27b Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 1 May 2025 17:27:00 +0530 Subject: [PATCH 04/72] fix: check if setupForm exist (cherry picked from commit 6da3761e76a5a8bbd2f3059b04790c5c73645c76) --- frontend/src/utils/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js index 289e9120..47c3e590 100644 --- a/frontend/src/utils/index.js +++ b/frontend/src/utils/index.js @@ -152,6 +152,7 @@ export function setupAssignees(doc) { } async function getFormScript(script, obj) { + if (!script.includes('setupForm(')) return {} let scriptFn = new Function(script + '\nreturn setupForm')() let formScript = await scriptFn(obj) return formScript || {} From ddc142b0bc74650a4e8df9f7ab8b27cf9de3a4eb Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 1 May 2025 17:52:11 +0530 Subject: [PATCH 05/72] fix: load script and setup class instances (cherry picked from commit 7b34c5eb66509851e993df19335a5ebedd0f3055) --- crm/api/script.py | 17 ------ frontend/src/data/script.js | 110 ++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 17 deletions(-) delete mode 100644 crm/api/script.py create mode 100644 frontend/src/data/script.js diff --git a/crm/api/script.py b/crm/api/script.py deleted file mode 100644 index bfbfa405..00000000 --- a/crm/api/script.py +++ /dev/null @@ -1,17 +0,0 @@ -import frappe -from pypika import Criterion - - -@frappe.whitelist() -def get_scripts(doctype, view="Form"): - Script = frappe.qb.DocType("CRM Form Script") - query = ( - frappe.qb.from_(Script) - .select("*") - .where(Script.dt == doctype) - .where(Script.view == view) - .where(Script.enabled == 1) - ) - - scripts = query.run(as_dict=True) - return scripts diff --git a/frontend/src/data/script.js b/frontend/src/data/script.js new file mode 100644 index 00000000..3464ecfe --- /dev/null +++ b/frontend/src/data/script.js @@ -0,0 +1,110 @@ +import { globalStore } from '@/stores/global' +import { createToast } from '@/utils' +import { call, createListResource } from 'frappe-ui' +import { reactive } from 'vue' +import router from '@/router' + +const doctypeScripts = reactive({}) + +export function getScript(doctype, view = 'Form') { + const scripts = createListResource({ + doctype: 'CRM Form Script', + cache: ['Form Scripts', doctype, view], + fields: ['name', 'dt', 'view', 'script'], + filters: { view, dt: doctype, enabled: 1 }, + onSuccess: (_scripts) => { + for (let script of _scripts) { + if (!doctypeScripts[doctype]) { + doctypeScripts[doctype] = {} + } + doctypeScripts[doctype][script.name] = script || {} + } + }, + }) + + if (!doctypeScripts[doctype] && !scripts.loading) { + scripts.fetch() + } + + function setupScript(document, helpers = {}) { + let scripts = doctypeScripts[doctype] + if (!scripts) return null + + const { $dialog, $socket, makeCall } = globalStore() + + helpers.createDialog = $dialog + helpers.createToast = createToast + helpers.socket = $socket + helpers.router = router + helpers.call = call + + helpers.crm = { + makePhoneCall: makeCall, + } + + return setupMultipleFormControllers(scripts, document, helpers) + } + + function setupMultipleFormControllers(scriptStrings, document, helpers) { + const controllers = {} + + for (let scriptName in scriptStrings) { + let script = scriptStrings[scriptName]?.script + if (!script) continue + try { + const className = getClassName(script) + if (!className) throw new Error('No class found') + + const FormClass = evaluateFormClass(script, className, helpers) + controllers[className] = setupFormController(FormClass, document) + } catch (err) { + console.error('Failed to load form controller:', err) + } + } + + return controllers + } + + function setupFormController(FormClass, document) { + const controller = new FormClass() + + for (const key in document) { + if (document.hasOwnProperty(key)) { + controller[key] = document[key] + } + } + + controller.actions = (controller.actions || []).filter( + (action) => typeof action.condition !== 'function' || action.condition(), + ) + + return controller + } + + // utility function to setup a form controller + function getClassName(script) { + const match = script.match(/class\s+([A-Za-z0-9_]+)/) + return match ? match[1] : null + } + + function evaluateFormClass(script, className, helpers = {}) { + const helperKeys = Object.keys(helpers) + const helperValues = Object.values(helpers) + + const wrappedScript = ` + ${script} + return ${className}; + ` + + const FormClass = new Function(...helperKeys, wrappedScript)( + ...helperValues, + ) + return FormClass + } + + return { + scripts, + setupScript, + setupFormController, + } +} From fab665ad3f1af455e26573c7d534fd058bf2334d Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 1 May 2025 17:54:13 +0530 Subject: [PATCH 06/72] fix: created document composable to get any doctype record (cherry picked from commit ccd240f4e8a5c717ed3d3929c1b710714ad54527) --- frontend/src/data/document.js | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 frontend/src/data/document.js diff --git a/frontend/src/data/document.js b/frontend/src/data/document.js new file mode 100644 index 00000000..052023b5 --- /dev/null +++ b/frontend/src/data/document.js @@ -0,0 +1,36 @@ +import { createToast } from '@/utils' +import { createDocumentResource } from 'frappe-ui' + +const documentsCache = {} + +export function useDocument(doctype, docname) { + documentsCache[doctype] = documentsCache[doctype] || {} + + if (!documentsCache[doctype][docname]) { + documentsCache[doctype][docname] = createDocumentResource({ + doctype: doctype, + name: docname, + setValue: { + onSuccess: () => { + createToast({ + title: 'Data Updated', + icon: 'check', + iconClasses: 'text-ink-green-3', + }) + }, + onError: (err) => { + createToast({ + title: 'Error', + text: err.messages[0], + icon: 'x', + iconClasses: 'text-red-600', + }) + }, + }, + }) + } + + return { + document: documentsCache[doctype][docname], + } +} From 15d18bee433b5b9e71e8df3f69f3c046fcde0937 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 1 May 2025 17:55:54 +0530 Subject: [PATCH 07/72] fix: setup form script in document.js (cherry picked from commit 1e2f325c55e05bc711f8b97a1d96fd5c7316b0f4) --- frontend/src/data/document.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/frontend/src/data/document.js b/frontend/src/data/document.js index 052023b5..884d0876 100644 --- a/frontend/src/data/document.js +++ b/frontend/src/data/document.js @@ -1,15 +1,19 @@ +import { getScript } from '@/data/script' import { createToast } from '@/utils' import { createDocumentResource } from 'frappe-ui' const documentsCache = {} export function useDocument(doctype, docname) { + const { setupScript } = getScript(doctype) + documentsCache[doctype] = documentsCache[doctype] || {} if (!documentsCache[doctype][docname]) { documentsCache[doctype][docname] = createDocumentResource({ doctype: doctype, name: docname, + onSuccess: () => setupFormScript(), setValue: { onSuccess: () => { createToast({ @@ -30,7 +34,20 @@ export function useDocument(doctype, docname) { }) } + function setupFormScript() { + const controllers = setupScript(documentsCache[doctype][docname]) + const doctypeName = doctype.replace(/\s+/g, '') + const doctypeController = controllers[doctypeName] + + if (!doctypeController) return + + documentsCache[doctype][docname]['controller'] = doctypeController + } + return { document: documentsCache[doctype][docname], + getActions: () => + documentsCache[doctype][docname]?.controller?.actions || [], + setupFormScript, } } From c8d21ef8f00c6b6818f2a482120dc159bcd239cb Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 1 May 2025 17:56:18 +0530 Subject: [PATCH 08/72] fix: created triggerOnChange method (cherry picked from commit 16a3f3d66c3eec4c2e9ded6ae1468002409107ad) --- frontend/src/data/document.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/frontend/src/data/document.js b/frontend/src/data/document.js index 884d0876..0c2f96a3 100644 --- a/frontend/src/data/document.js +++ b/frontend/src/data/document.js @@ -44,10 +44,30 @@ export function useDocument(doctype, docname) { documentsCache[doctype][docname]['controller'] = doctypeController } + async function triggerOnChange(fieldname) { + if (!documentsCache[doctype][docname]?.controller) return + + const c = documentsCache[doctype][docname].controller + c.oldValue = getOldValue(fieldname) + c.value = documentsCache[doctype][docname].doc[fieldname] + + return await c[fieldname]?.() + } + + function getOldValue(fieldname) { + if (!documentsCache[doctype][docname]) return '' + + const document = documentsCache[doctype][docname] + const oldDoc = document.originalDoc + return oldDoc?.[fieldname] || document.doc[fieldname] + } + return { document: documentsCache[doctype][docname], getActions: () => documentsCache[doctype][docname]?.controller?.actions || [], + getOldValue, + triggerOnChange, setupFormScript, } } From 1c0e17109e7629c60d59dd98d2803225e3565c98 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 1 May 2025 17:57:17 +0530 Subject: [PATCH 09/72] fix: use document to load doc data in DataFields (cherry picked from commit e65899e38406452cef0c7ec879038037facda2ed) --- .../src/components/Activities/DataFields.vue | 50 ++++++------------- 1 file changed, 14 insertions(+), 36 deletions(-) diff --git a/frontend/src/components/Activities/DataFields.vue b/frontend/src/components/Activities/DataFields.vue index e73fb891..f572bbc0 100644 --- a/frontend/src/components/Activities/DataFields.vue +++ b/frontend/src/components/Activities/DataFields.vue @@ -5,7 +5,7 @@
{{ __('Data') }}
@@ -38,7 +38,7 @@
@@ -49,7 +49,7 @@ @reload=" () => { tabs.reload() - data.reload() + document.reload() } " /> @@ -59,10 +59,10 @@ import EditIcon from '@/components/Icons/EditIcon.vue' import DataFieldsModal from '@/components/Modals/DataFieldsModal.vue' import FieldLayout from '@/components/FieldLayout/FieldLayout.vue' -import { Badge, createResource, createDocumentResource } from 'frappe-ui' +import { Badge, createResource } from 'frappe-ui' import LoadingIndicator from '@/components/Icons/LoadingIndicator.vue' -import { createToast } from '@/utils' import { usersStore } from '@/stores/users' +import { useDocument } from '@/data/document' import { isMobileView } from '@/composables/settings' import { ref, watch } from 'vue' @@ -76,33 +76,11 @@ const props = defineProps({ required: true, }, }) - const { isManager } = usersStore() const showDataFieldsModal = ref(false) -const data = createDocumentResource({ - doctype: props.doctype, - name: props.docname, - setValue: { - onSuccess: () => { - data.reload() - createToast({ - title: 'Data Updated', - icon: 'check', - iconClasses: 'text-ink-green-3', - }) - }, - onError: (err) => { - createToast({ - title: 'Error', - text: err.messages[0], - icon: 'x', - iconClasses: 'text-red-600', - }) - }, - }, -}) +const { document } = useDocument(props.doctype, props.docname) const tabs = createResource({ url: 'crm.fcrm.doctype.crm_fields_layout.crm_fields_layout.get_fields_layout', @@ -112,19 +90,19 @@ const tabs = createResource({ }) function saveChanges() { - data.save.submit() + document.save.submit() } watch( - () => data.doc, + () => document.doc, (newValue, oldValue) => { if (!oldValue) return if (newValue && oldValue) { const isDirty = - JSON.stringify(newValue) !== JSON.stringify(data.originalDoc) - data.isDirty = isDirty + JSON.stringify(newValue) !== JSON.stringify(document.originalDoc) + document.isDirty = isDirty if (isDirty) { - data.save.loading = false + document.save.loading = false } } }, From d76ca6c5889fff547c10d747621eb0b75d44631d Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 1 May 2025 18:01:18 +0530 Subject: [PATCH 10/72] fix: use document to load doc data in sidepanel layout (cherry picked from commit a30503ca5fbebb87c05cdf5b794eca0c9ce3491e) --- frontend/src/components/SidePanelLayout.vue | 98 ++++++++++++--------- frontend/src/pages/Deal.vue | 2 +- frontend/src/pages/Lead.vue | 2 +- 3 files changed, 59 insertions(+), 43 deletions(-) diff --git a/frontend/src/components/SidePanelLayout.vue b/frontend/src/components/SidePanelLayout.vue index 71bcf973..e84aeb15 100644 --- a/frontend/src/components/SidePanelLayout.vue +++ b/frontend/src/components/SidePanelLayout.vue @@ -55,7 +55,10 @@ > -
+
@@ -67,21 +70,21 @@ class="flex h-7 cursor-pointer items-center px-2 py-1 text-ink-gray-5" > -
{{ data[field.fieldname] }}
+
{{ document.doc[field.fieldname] }}