From 975a96ff45b4010c1a232bf3a0ef2a7247567f17 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 19 May 2025 17:58:17 +0530 Subject: [PATCH 1/6] fix: allow read permission for form script (cherry picked from commit 2d421e60527c6d056b2f4a268862f986bf773600) --- .../doctype/crm_form_script/crm_form_script.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/crm/fcrm/doctype/crm_form_script/crm_form_script.json b/crm/fcrm/doctype/crm_form_script/crm_form_script.json index 9246913a..f261f564 100644 --- a/crm/fcrm/doctype/crm_form_script/crm_form_script.json +++ b/crm/fcrm/doctype/crm_form_script/crm_form_script.json @@ -65,7 +65,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-09-16 19:40:19.340948", + "modified": "2025-05-19 17:57:24.610295", "modified_by": "Administrator", "module": "FCRM", "name": "CRM Form Script", @@ -83,9 +83,19 @@ "role": "Sales Manager", "share": 1, "write": 1 + }, + { + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "All", + "share": 1 } ], + "row_format": "Dynamic", "sort_field": "modified", "sort_order": "DESC", "states": [] -} \ No newline at end of file +} From 8bb78a2caf410aa592441c3e1cc452533425b936 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 19 May 2025 18:02:30 +0530 Subject: [PATCH 2/6] fix: only set FCRM module if user is Sales User (cherry picked from commit 64b4f6b759bc5b308dc86ca59f7777a9cda507a4) --- crm/fcrm/doctype/crm_invitation/crm_invitation.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/crm/fcrm/doctype/crm_invitation/crm_invitation.py b/crm/fcrm/doctype/crm_invitation/crm_invitation.py index f4c9a8f9..625cd882 100644 --- a/crm/fcrm/doctype/crm_invitation/crm_invitation.py +++ b/crm/fcrm/doctype/crm_invitation/crm_invitation.py @@ -21,7 +21,7 @@ class CRMInvitation(Document): if frappe.local.dev_server: print(f"Invite link for {self.email}: {invite_link}") - title = f"Frappe CRM" + title = "Frappe CRM" template = "crm_invitation" frappe.sendmail( @@ -44,12 +44,24 @@ class CRMInvitation(Document): user = self.create_user_if_not_exists() user.append_roles(self.role) + if self.role == "Sales User": + self.update_module_in_user(user, "FCRM") user.save(ignore_permissions=True) self.status = "Accepted" self.accepted_at = frappe.utils.now() self.save(ignore_permissions=True) + def update_module_in_user(self, user, module): + block_modules = frappe.get_all( + "Module Def", + fields=["name as module"], + filters={"name": ["!=", module]}, + ) + + if block_modules: + user.set("block_modules", block_modules) + def create_user_if_not_exists(self): if not frappe.db.exists("User", self.email): first_name = self.email.split("@")[0].title() From 620839cb2f303c4a0367bd4cfa53db96874ebc37 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 19 May 2025 19:05:37 +0530 Subject: [PATCH 3/6] fix: do not show contacts in dropdown in invite member page (cherry picked from commit 4cfa0f512b0b28378cbb6dc0c4f4d5e6267812a0) --- crm/api/__init__.py | 6 +++++ .../Controls/MultiSelectEmailInput.vue | 25 +++++++++++++++++-- .../components/Settings/InviteMemberPage.vue | 14 ++++++++--- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/crm/api/__init__.py b/crm/api/__init__.py index 11cc039e..e7f86e1b 100644 --- a/crm/api/__init__.py +++ b/crm/api/__init__.py @@ -117,6 +117,12 @@ def invite_by_email(emails: str, role: str): for email in to_invite: frappe.get_doc(doctype="CRM Invitation", email=email, role=role).insert(ignore_permissions=True) + return { + "existing_members": existing_members, + "existing_invites": existing_invites, + "to_invite": to_invite, + } + @frappe.whitelist() def get_file_uploader_defaults(doctype: str): diff --git a/frontend/src/components/Controls/MultiSelectEmailInput.vue b/frontend/src/components/Controls/MultiSelectEmailInput.vue index bf1d734b..b5ba3f84 100644 --- a/frontend/src/components/Controls/MultiSelectEmailInput.vue +++ b/frontend/src/components/Controls/MultiSelectEmailInput.vue @@ -58,6 +58,21 @@ class="p-1.5 max-h-[12rem] overflow-y-auto" static > +
+ + {{ + fetchContacts + ? __('No results found') + : __('Type an email address to add') + }} +
`${value} is an Invalid value`, }, + fetchContacts: { + type: Boolean, + default: true, + }, }) const values = defineModel() @@ -191,17 +210,19 @@ const filterOptions = createResource({ }) const options = computed(() => { - let searchedContacts = filterOptions.data || [] + let searchedContacts = props.fetchContacts ? filterOptions.data : [] if (!searchedContacts.length && query.value) { searchedContacts.push({ label: query.value, value: query.value, }) } - return searchedContacts + return searchedContacts || [] }) function reload(val) { + if (!props.fetchContacts) return + filterOptions.update({ params: { txt: val }, }) diff --git a/frontend/src/components/Settings/InviteMemberPage.vue b/frontend/src/components/Settings/InviteMemberPage.vue index e81a1630..3f0cac8d 100644 --- a/frontend/src/components/Settings/InviteMemberPage.vue +++ b/frontend/src/components/Settings/InviteMemberPage.vue @@ -20,6 +20,7 @@ :error-message=" (value) => __('{0} is an invalid email address', [value]) " + :fetchContacts="false" /> Date: Mon, 19 May 2025 20:41:06 +0530 Subject: [PATCH 4/6] fix: set default value as 0 in int field (cherry picked from commit e7a20374c78851d74ba4a97072c3ee8250b18204) --- .../src/components/Controls/MultiSelectEmailInput.vue | 2 +- frontend/src/components/FieldLayout/Field.vue | 8 +++----- frontend/src/components/SidePanelLayout.vue | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/Controls/MultiSelectEmailInput.vue b/frontend/src/components/Controls/MultiSelectEmailInput.vue index b5ba3f84..182ed938 100644 --- a/frontend/src/components/Controls/MultiSelectEmailInput.vue +++ b/frontend/src/components/Controls/MultiSelectEmailInput.vue @@ -211,7 +211,7 @@ const filterOptions = createResource({ const options = computed(() => { let searchedContacts = props.fetchContacts ? filterOptions.data : [] - if (!searchedContacts.length && query.value) { + if (!searchedContacts?.length && query.value) { searchedContacts.push({ label: query.value, value: query.value, diff --git a/frontend/src/components/FieldLayout/Field.vue b/frontend/src/components/FieldLayout/Field.vue index 92ce15f8..64ba37e7 100644 --- a/frontend/src/components/FieldLayout/Field.vue +++ b/frontend/src/components/FieldLayout/Field.vue @@ -136,7 +136,6 @@ Date: Tue, 20 May 2025 13:23:26 +0530 Subject: [PATCH 5/6] feat: added password control (cherry picked from commit fe8e309399d7f8f61e6a1388cf1820f07efc571f) --- frontend/components.d.ts | 1 + frontend/src/components/Controls/Grid.vue | 8 +++++ frontend/src/components/Controls/Password.vue | 32 +++++++++++++++++++ frontend/src/components/FieldLayout/Field.vue | 8 +++++ .../components/Settings/ProfileSettings.vue | 3 +- frontend/src/components/SidePanelLayout.vue | 10 ++++++ 6 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/Controls/Password.vue diff --git a/frontend/components.d.ts b/frontend/components.d.ts index bfacdcf1..e6d532de 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -173,6 +173,7 @@ declare module 'vue' { OrganizationsIcon: typeof import('./src/components/Icons/OrganizationsIcon.vue')['default'] OrganizationsListView: typeof import('./src/components/ListViews/OrganizationsListView.vue')['default'] OutboundCallIcon: typeof import('./src/components/Icons/OutboundCallIcon.vue')['default'] + Password: typeof import('./src/components/Controls/Password.vue')['default'] PauseIcon: typeof import('./src/components/Icons/PauseIcon.vue')['default'] PhoneIcon: typeof import('./src/components/Icons/PhoneIcon.vue')['default'] PinIcon: typeof import('./src/components/Icons/PinIcon.vue')['default'] diff --git a/frontend/src/components/Controls/Grid.vue b/frontend/src/components/Controls/Grid.vue index e08cdd7d..54bc29dc 100644 --- a/frontend/src/components/Controls/Grid.vue +++ b/frontend/src/components/Controls/Grid.vue @@ -216,6 +216,13 @@ :options="field.options" @change="(e) => fieldChange(e.target.value, field, row)" /> + diff --git a/frontend/src/components/FieldLayout/Field.vue b/frontend/src/components/FieldLayout/Field.vue index 64ba37e7..a190817f 100644 --- a/frontend/src/components/FieldLayout/Field.vue +++ b/frontend/src/components/FieldLayout/Field.vue @@ -159,6 +159,13 @@ :description="field.description" @change="fieldChange($event.target.value, field)" /> +