From 7330a3c2a5da32e1992b6059426a6ae78ed394b3 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 16 Sep 2025 16:55:56 +0530 Subject: [PATCH 01/21] refactor: clean up ImageUploader component and improve label handling (cherry picked from commit e19f75083147faaf988bcbef448e9d1ddbb9179a) --- .../src/components/Controls/ImageUploader.vue | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/Controls/ImageUploader.vue b/frontend/src/components/Controls/ImageUploader.vue index 692ef201..3eee2e8e 100644 --- a/frontend/src/components/Controls/ImageUploader.vue +++ b/frontend/src/components/Controls/ImageUploader.vue @@ -1,7 +1,6 @@ From af81750388f436cd8b9f7edc7976cb24a64dd757 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 16 Sep 2025 17:14:58 +0530 Subject: [PATCH 02/21] refactor: enhance Settings component structure (cherry picked from commit 03acea69b130cfdbdc00994c8d9930ad948cb64c) # Conflicts: # frontend/src/components/Settings/Settings.vue --- frontend/src/components/Settings/Settings.vue | 108 +++++++++++++----- 1 file changed, 81 insertions(+), 27 deletions(-) diff --git a/frontend/src/components/Settings/Settings.vue b/frontend/src/components/Settings/Settings.vue index fdbdc549..f8a53cc0 100644 --- a/frontend/src/components/Settings/Settings.vue +++ b/frontend/src/components/Settings/Settings.vue @@ -11,27 +11,29 @@

{{ __('Settings') }}

-
-
- {{ __(tab.label) }} -
- +
+
@@ -42,6 +44,9 @@ From e10ec543a7765fc0f53dfbaca136eb71bdf72b61 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 16 Sep 2025 17:28:37 +0530 Subject: [PATCH 06/21] refactor: CurrencySettings component (cherry picked from commit 186584c1ac79170afa4ef8860bff9d3d3d91cadc) --- frontend/components.d.ts | 2 +- .../{General => }/CurrencySettings.vue | 30 +++++++------------ 2 files changed, 12 insertions(+), 20 deletions(-) rename frontend/src/components/Settings/{General => }/CurrencySettings.vue (85%) diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 05e4592a..e0a89f4c 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -63,7 +63,7 @@ declare module 'vue' { CountUpTimer: typeof import('./src/components/CountUpTimer.vue')['default'] CreateDocumentModal: typeof import('./src/components/Modals/CreateDocumentModal.vue')['default'] CRMLogo: typeof import('./src/components/Icons/CRMLogo.vue')['default'] - CurrencySettings: typeof import('./src/components/Settings/General/CurrencySettings.vue')['default'] + CurrencySettings: typeof import('./src/components/Settings/CurrencySettings.vue')['default'] CustomActions: typeof import('./src/components/CustomActions.vue')['default'] DashboardGrid: typeof import('./src/components/Dashboard/DashboardGrid.vue')['default'] DashboardIcon: typeof import('./src/components/Icons/DashboardIcon.vue')['default'] diff --git a/frontend/src/components/Settings/General/CurrencySettings.vue b/frontend/src/components/Settings/CurrencySettings.vue similarity index 85% rename from frontend/src/components/Settings/General/CurrencySettings.vue rename to frontend/src/components/Settings/CurrencySettings.vue index 2b3f2559..969c491c 100644 --- a/frontend/src/components/Settings/General/CurrencySettings.vue +++ b/frontend/src/components/Settings/CurrencySettings.vue @@ -1,22 +1,16 @@ diff --git a/frontend/src/components/Settings/General/GeneralSettingsPage.vue b/frontend/src/components/Settings/General/GeneralSettingsPage.vue deleted file mode 100644 index 3b71f1f7..00000000 --- a/frontend/src/components/Settings/General/GeneralSettingsPage.vue +++ /dev/null @@ -1,34 +0,0 @@ - - - From a4d3852c0ed894b118e1f2d48e607dd3e9d28fc1 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 16 Sep 2025 17:46:17 +0530 Subject: [PATCH 09/21] feat: Auto update expected deal value based on products value (cherry picked from commit 7e21a5fee206723cf714f7a8732bb8929aaa57df) --- crm/fcrm/doctype/crm_deal/crm_deal.py | 16 ++++++++++++++-- .../components/Settings/ForecastingSettings.vue | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/crm/fcrm/doctype/crm_deal/crm_deal.py b/crm/fcrm/doctype/crm_deal/crm_deal.py index 6bc2e020..2bf3d8d4 100644 --- a/crm/fcrm/doctype/crm_deal/crm_deal.py +++ b/crm/fcrm/doctype/crm_deal/crm_deal.py @@ -25,7 +25,7 @@ class CRMDeal(Document): add_status_change_log(self) if frappe.db.get_value("CRM Deal Status", self.status, "type") == "Won": self.closed_date = frappe.utils.nowdate() - self.validate_forcasting_fields() + self.validate_forecasting_fields() self.validate_lost_reason() self.update_exchange_rate() @@ -151,9 +151,21 @@ class CRMDeal(Document): if not self.probability or self.probability == 0: self.probability = frappe.db.get_value("CRM Deal Status", self.status, "probability") or 0 - def validate_forcasting_fields(self): + def update_expected_deal_value(self): + """ + Update the expected deal value based on the net total or total. + """ + if ( + frappe.db.get_single_value("FCRM Settings", "auto_update_expected_deal_value") + and (self.net_total or self.total) + and self.expected_deal_value + ): + self.expected_deal_value = self.net_total or self.total + + def validate_forecasting_fields(self): self.update_closed_date() self.update_default_probability() + self.update_expected_deal_value() if frappe.db.get_single_value("FCRM Settings", "enable_forecasting"): if not self.expected_deal_value or self.expected_deal_value == 0: frappe.throw(_("Expected Deal Value is required."), frappe.MandatoryError) diff --git a/frontend/src/components/Settings/ForecastingSettings.vue b/frontend/src/components/Settings/ForecastingSettings.vue index 8b681926..6c765ab7 100644 --- a/frontend/src/components/Settings/ForecastingSettings.vue +++ b/frontend/src/components/Settings/ForecastingSettings.vue @@ -5,7 +5,7 @@ {{ __('Forecasting') }}

- {{ __('Configure forecasting settings for your CRM') }} + {{ __('Configure forecasting feature to help predict sales performance and growth') }}

From 100eec067743b4f824e0fe5d4d4213c234b82670 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 16 Sep 2025 18:00:27 +0530 Subject: [PATCH 10/21] refactor: remove icon-left from Update button in multiple settings components (cherry picked from commit 149901f6054f000d503ef8940037c13bd2e344f3) --- .../AssignmentRules/AssignmentRules.vue | 40 ++++++++++--------- .../src/components/Settings/BrandSettings.vue | 1 - .../components/Settings/CurrencySettings.vue | 1 - .../src/components/Settings/HomeActions.vue | 1 - 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/frontend/src/components/Settings/AssignmentRules/AssignmentRules.vue b/frontend/src/components/Settings/AssignmentRules/AssignmentRules.vue index c96ab3d2..e7a94328 100644 --- a/frontend/src/components/Settings/AssignmentRules/AssignmentRules.vue +++ b/frontend/src/components/Settings/AssignmentRules/AssignmentRules.vue @@ -1,35 +1,39 @@ diff --git a/frontend/src/components/Settings/Users.vue b/frontend/src/components/Settings/Users.vue index 420f8b0c..5a0fce6d 100644 --- a/frontend/src/components/Settings/Users.vue +++ b/frontend/src/components/Settings/Users.vue @@ -169,8 +169,21 @@ import AddExistingUserModal from '@/components/Modals/AddExistingUserModal.vue' import { activeSettingsPage } from '@/composables/settings' import { usersStore } from '@/stores/users' +<<<<<<< HEAD import { TemplateOption, DropdownOption } from '@/utils' import { Avatar, TextInput, toast, call, FeatherIcon, Tooltip } from 'frappe-ui' +======= +import { DropdownOption } from '@/utils' +import { + Dropdown, + Avatar, + TextInput, + toast, + call, + FeatherIcon, + Tooltip, +} from 'frappe-ui' +>>>>>>> ac34ac9b (refactor: remove TemplateOption component usage and simplify dropdown options in multiple components) import { ref, computed, onMounted } from 'vue' const { users, isAdmin, isManager } = usersStore() @@ -208,29 +221,19 @@ function getMoreOptions(user) { let options = [ { label: __('Remove'), - component: (props) => - TemplateOption({ - option: __('Remove'), - icon: 'trash-2', - active: props.active, - onClick: (e) => { - e.preventDefault() - e.stopPropagation() - confirmRemove.value = true - }, - }), + icon: 'trash-2', + onClick: (e) => { + e.preventDefault() + e.stopPropagation() + confirmRemove.value = true + }, condition: () => !confirmRemove.value, }, { label: __('Confirm Remove'), - component: (props) => - TemplateOption({ - option: __('Confirm Remove'), - icon: 'trash-2', - active: props.active, - theme: 'danger', - onClick: () => removeUser(user, true), - }), + icon: 'trash-2', + theme: 'red', + onClick: () => removeUser(user, true), condition: () => confirmRemove.value, }, ] @@ -242,38 +245,35 @@ function getDropdownOptions(user) { let options = [ { label: __('Admin'), - component: (props) => + component: () => DropdownOption({ option: __('Admin'), icon: 'shield', - active: props.active, selected: user.role === 'System Manager', - onClick: () => updateRole(user, 'System Manager'), }), + onClick: () => updateRole(user, 'System Manager'), condition: () => isAdmin(), }, { label: __('Manager'), - component: (props) => + component: () => DropdownOption({ option: __('Manager'), icon: 'briefcase', - active: props.active, selected: user.role === 'Sales Manager', - onClick: () => updateRole(user, 'Sales Manager'), }), + onClick: () => updateRole(user, 'Sales Manager'), condition: () => isManager(), }, { label: __('Sales User'), - component: (props) => + component: () => DropdownOption({ option: __('Sales User'), icon: 'user-check', - active: props.active, selected: user.role === 'Sales User', - onClick: () => updateRole(user, 'Sales User'), }), + onClick: () => updateRole(user, 'Sales User'), }, ] diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js index d96cdae5..14b5ade9 100644 --- a/frontend/src/utils/index.js +++ b/frontend/src/utils/index.js @@ -462,23 +462,12 @@ export function runSequentially(functions) { }, Promise.resolve()) } -export function DropdownOption({ - active, - option, - theme, - icon, - onClick, - selected, -}) { +export function DropdownOption({ option, icon, selected }) { return h( 'button', { - class: [ - active ? 'bg-surface-gray-2' : 'text-ink-gray-8', - 'group flex w-full justify-between items-center rounded-md px-2 py-2 text-sm', - theme == 'danger' ? 'text-ink-red-3 hover:bg-ink-red-1' : '', - ], - onClick: !selected ? onClick : null, + class: + 'group flex w-full text-ink-gray-8 justify-between items-center rounded-md px-2 py-2 text-sm hover:bg-surface-gray-2', }, [ h('div', { class: 'flex gap-2' }, [ @@ -501,30 +490,6 @@ export function DropdownOption({ ) } -export function TemplateOption({ active, option, theme, icon, onClick }) { - return h( - 'button', - { - class: [ - active ? 'bg-surface-gray-2 text-ink-gray-8' : 'text-ink-gray-7', - 'group flex w-full gap-2 items-center rounded-md px-2 py-2 text-sm', - theme == 'danger' ? 'text-ink-red-3 hover:bg-ink-red-1' : '', - ], - onClick: onClick, - }, - [ - icon - ? h(FeatherIcon, { - name: icon, - class: ['h-4 w-4 shrink-0'], - 'aria-hidden': true, - }) - : null, - h('span', { class: 'whitespace-nowrap' }, option), - ], - ) -} - export function copy(obj) { if (!obj) return obj return JSON.parse(JSON.stringify(obj)) From d18618b856946768f0a04b33a342d45e0a53954a Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 17 Sep 2025 13:14:27 +0530 Subject: [PATCH 15/21] refactor: replace EmailMultiSelect with FormControl for inviting users by email (cherry picked from commit 69f80903118965f500199f1b3368deb195882699) # Conflicts: # frontend/src/components/Settings/InviteUserPage.vue --- .../components/Settings/InviteUserPage.vue | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/frontend/src/components/Settings/InviteUserPage.vue b/frontend/src/components/Settings/InviteUserPage.vue index 3881cb60..1f511f9b 100644 --- a/frontend/src/components/Settings/InviteUserPage.vue +++ b/frontend/src/components/Settings/InviteUserPage.vue @@ -1,6 +1,6 @@ From 8749f7bfd00316e2eef0a528330e10a4d747dcfd Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Thu, 18 Sep 2025 13:29:44 +0530 Subject: [PATCH 16/21] refactor: update styling and improve layout for assignment rules components (cherry picked from commit 9f95a3a2b2132357708db03b9b4922f356150ff4) --- .../ConditionsFilter/CFConditions.vue | 2 +- .../AssignmentRules/AssigneeRules.vue | 11 +- .../AssignmentRuleListItem.vue | 12 +- .../AssignmentRules/AssignmentRuleView.vue | 524 +++++++++--------- .../AssignmentRules/AssignmentRules.vue | 2 +- .../AssignmentRules/AssignmentRulesList.vue | 26 +- .../AssignmentRulesSection.vue | 2 +- .../AssignmentRules/AssignmentSchedule.vue | 9 +- .../AssignmentScheduleItem.vue | 2 +- .../EmailTemplate/EditEmailTemplate.vue | 13 +- .../EmailTemplate/NewEmailTemplate.vue | 13 +- 11 files changed, 304 insertions(+), 312 deletions(-) diff --git a/frontend/src/components/ConditionsFilter/CFConditions.vue b/frontend/src/components/ConditionsFilter/CFConditions.vue index 03b50269..567e7466 100644 --- a/frontend/src/components/ConditionsFilter/CFConditions.vue +++ b/frontend/src/components/ConditionsFilter/CFConditions.vue @@ -1,5 +1,5 @@