diff --git a/crm/api/assignment_rule.py b/crm/api/assignment_rule.py new file mode 100644 index 00000000..824474f6 --- /dev/null +++ b/crm/api/assignment_rule.py @@ -0,0 +1,32 @@ +import frappe + + +@frappe.whitelist() +def get_assignment_rules_list(): + assignment_rules = [] + for docname in frappe.get_all( + "Assignment Rule", filters={"document_type": ["in", ["CRM Lead", "CRM Deal"]]} + ): + doc = frappe.get_value( + "Assignment Rule", + docname, + fieldname=[ + "name", + "description", + "disabled", + "priority", + ], + as_dict=True, + ) + users_exists = bool(frappe.db.exists("Assignment Rule User", {"parent": docname.name})) + assignment_rules.append({**doc, "users_exists": users_exists}) + return assignment_rules + + +@frappe.whitelist() +def duplicate_assignment_rule(docname, new_name): + doc = frappe.get_doc("Assignment Rule", docname) + doc.name = new_name + doc.assignment_rule_name = new_name + doc.insert() + return doc diff --git a/crm/install.py b/crm/install.py index cced779d..8d72a464 100644 --- a/crm/install.py +++ b/crm/install.py @@ -25,6 +25,8 @@ def after_install(force=False): add_standard_dropdown_items() add_default_scripts() create_default_manager_dashboard(force) + create_assignment_rule_custom_fields() + add_assignment_rule_property_setters() frappe.db.commit() @@ -421,3 +423,80 @@ def add_default_scripts(): for doctype in ["CRM Lead", "CRM Deal"]: create_product_details_script(doctype) create_forecasting_script() + + +def add_assignment_rule_property_setters(): + """Add a property setter to the Assignment Rule DocType for assign_condition and unassign_condition.""" + + default_fields = { + "doctype": "Property Setter", + "doctype_or_field": "DocField", + "doc_type": "Assignment Rule", + "property_type": "Data", + "is_system_generated": 1, + } + + if not frappe.db.exists("Property Setter", {"name": "Assignment Rule-assign_condition-depends_on"}): + frappe.get_doc( + { + **default_fields, + "name": "Assignment Rule-assign_condition-depends_on", + "field_name": "assign_condition", + "property": "depends_on", + "value": "eval: !doc.assign_condition_json", + } + ).insert() + else: + frappe.db.set_value( + "Property Setter", + {"name": "Assignment Rule-assign_condition-depends_on"}, + "value", + "eval: !doc.assign_condition_json", + ) + if not frappe.db.exists("Property Setter", {"name": "Assignment Rule-unassign_condition-depends_on"}): + frappe.get_doc( + { + **default_fields, + "name": "Assignment Rule-unassign_condition-depends_on", + "field_name": "unassign_condition", + "property": "depends_on", + "value": "eval: !doc.unassign_condition_json", + } + ).insert() + else: + frappe.db.set_value( + "Property Setter", + {"name": "Assignment Rule-unassign_condition-depends_on"}, + "value", + "eval: !doc.unassign_condition_json", + ) + + +def create_assignment_rule_custom_fields(): + if not frappe.get_meta("Assignment Rule").has_field("assign_condition_json"): + click.secho("* Installing Custom Fields in Assignment Rule") + + create_custom_fields( + { + "Assignment Rule": [ + { + "description": "Autogenerated field by CRM App", + "fieldname": "assign_condition_json", + "fieldtype": "Code", + "label": "Assign Condition JSON", + "insert_after": "assign_condition", + "depends_on": "eval: doc.assign_condition_json", + }, + { + "description": "Autogenerated field by CRM App", + "fieldname": "unassign_condition_json", + "fieldtype": "Code", + "label": "Unassign Condition JSON", + "insert_after": "unassign_condition", + "depends_on": "eval: doc.unassign_condition_json", + }, + ], + } + ) + + frappe.clear_cache(doctype="Assignment Rule") diff --git a/crm/patches.txt b/crm/patches.txt index c038f250..78a09165 100644 --- a/crm/patches.txt +++ b/crm/patches.txt @@ -15,4 +15,5 @@ crm.patches.v1_0.move_twilio_agent_to_telephony_agent crm.patches.v1_0.create_default_scripts # 13-06-2025 crm.patches.v1_0.update_deal_status_probabilities crm.patches.v1_0.update_deal_status_type -crm.patches.v1_0.create_default_lost_reasons \ No newline at end of file +crm.patches.v1_0.create_default_lost_reasons +crm.patches.v1_0.add_fields_in_assignment_rule diff --git a/crm/patches/v1_0/add_fields_in_assignment_rule.py b/crm/patches/v1_0/add_fields_in_assignment_rule.py new file mode 100644 index 00000000..72e21a6b --- /dev/null +++ b/crm/patches/v1_0/add_fields_in_assignment_rule.py @@ -0,0 +1,9 @@ +from crm.install import ( + add_assignment_rule_property_setters, + create_assignment_rule_custom_fields, +) + + +def execute(): + create_assignment_rule_custom_fields() + add_assignment_rule_property_setters() diff --git a/frontend/.gitignore b/frontend/.gitignore index 53f7466a..ec3e7197 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -2,4 +2,5 @@ node_modules .DS_Store dist dist-ssr -*.local \ No newline at end of file +*.local +components.d.ts \ No newline at end of file diff --git a/frontend/components.d.ts b/frontend/components.d.ts deleted file mode 100644 index 0a2ee45d..00000000 --- a/frontend/components.d.ts +++ /dev/null @@ -1,264 +0,0 @@ -/* eslint-disable */ -// @ts-nocheck -// Generated by unplugin-vue-components -// Read more: https://github.com/vuejs/core/pull/3399 -// biome-ignore lint: disable -export {} - -/* prettier-ignore */ -declare module 'vue' { - export interface GlobalComponents { - AboutModal: typeof import('./src/components/Modals/AboutModal.vue')['default'] - Activities: typeof import('./src/components/Activities/Activities.vue')['default'] - ActivityHeader: typeof import('./src/components/Activities/ActivityHeader.vue')['default'] - ActivityIcon: typeof import('./src/components/Icons/ActivityIcon.vue')['default'] - AddChartModal: typeof import('./src/components/Dashboard/AddChartModal.vue')['default'] - AddExistingUserModal: typeof import('./src/components/Modals/AddExistingUserModal.vue')['default'] - AddressIcon: typeof import('./src/components/Icons/AddressIcon.vue')['default'] - AddressModal: typeof import('./src/components/Modals/AddressModal.vue')['default'] - AllModals: typeof import('./src/components/Activities/AllModals.vue')['default'] - AppHeader: typeof import('./src/components/Layouts/AppHeader.vue')['default'] - Apps: typeof import('./src/components/Apps.vue')['default'] - AppsIcon: typeof import('./src/components/Icons/AppsIcon.vue')['default'] - AppSidebar: typeof import('./src/components/Layouts/AppSidebar.vue')['default'] - ArrowUpRightIcon: typeof import('./src/components/Icons/ArrowUpRightIcon.vue')['default'] - AscendingIcon: typeof import('./src/components/Icons/AscendingIcon.vue')['default'] - AssignmentModal: typeof import('./src/components/Modals/AssignmentModal.vue')['default'] - AssignTo: typeof import('./src/components/AssignTo.vue')['default'] - AssignToBody: typeof import('./src/components/AssignToBody.vue')['default'] - AttachmentArea: typeof import('./src/components/Activities/AttachmentArea.vue')['default'] - AttachmentIcon: typeof import('./src/components/Icons/AttachmentIcon.vue')['default'] - AttachmentItem: typeof import('./src/components/AttachmentItem.vue')['default'] - AudioPlayer: typeof import('./src/components/Activities/AudioPlayer.vue')['default'] - Autocomplete: typeof import('./src/components/frappe-ui/Autocomplete.vue')['default'] - AvatarIcon: typeof import('./src/components/Icons/AvatarIcon.vue')['default'] - BrandLogo: typeof import('./src/components/BrandLogo.vue')['default'] - BrandSettings: typeof import('./src/components/Settings/General/BrandSettings.vue')['default'] - BulkDeleteLinkedDocModal: typeof import('./src/components/BulkDeleteLinkedDocModal.vue')['default'] - CalendarIcon: typeof import('./src/components/Icons/CalendarIcon.vue')['default'] - CallArea: typeof import('./src/components/Activities/CallArea.vue')['default'] - CallLogDetailModal: typeof import('./src/components/Modals/CallLogDetailModal.vue')['default'] - CallLogModal: typeof import('./src/components/Modals/CallLogModal.vue')['default'] - CallLogsListView: typeof import('./src/components/ListViews/CallLogsListView.vue')['default'] - CallUI: typeof import('./src/components/Telephony/CallUI.vue')['default'] - CameraIcon: typeof import('./src/components/Icons/CameraIcon.vue')['default'] - CertificateIcon: typeof import('./src/components/Icons/CertificateIcon.vue')['default'] - ChangePasswordModal: typeof import('./src/components/Modals/ChangePasswordModal.vue')['default'] - CheckCircleIcon: typeof import('./src/components/Icons/CheckCircleIcon.vue')['default'] - CheckIcon: typeof import('./src/components/Icons/CheckIcon.vue')['default'] - CollapseSidebar: typeof import('./src/components/Icons/CollapseSidebar.vue')['default'] - Column: typeof import('./src/components/FieldLayout/Column.vue')['default'] - ColumnSettings: typeof import('./src/components/ColumnSettings.vue')['default'] - ColumnsIcon: typeof import('./src/components/Icons/ColumnsIcon.vue')['default'] - CommentArea: typeof import('./src/components/Activities/CommentArea.vue')['default'] - CommentBox: typeof import('./src/components/CommentBox.vue')['default'] - CommentIcon: typeof import('./src/components/Icons/CommentIcon.vue')['default'] - CommunicationArea: typeof import('./src/components/CommunicationArea.vue')['default'] - ContactIcon: typeof import('./src/components/Icons/ContactIcon.vue')['default'] - ContactModal: typeof import('./src/components/Modals/ContactModal.vue')['default'] - ContactsIcon: typeof import('./src/components/Icons/ContactsIcon.vue')['default'] - ContactsListView: typeof import('./src/components/ListViews/ContactsListView.vue')['default'] - ConvertIcon: typeof import('./src/components/Icons/ConvertIcon.vue')['default'] - ConvertToDealModal: typeof import('./src/components/Modals/ConvertToDealModal.vue')['default'] - 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'] - 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'] - DashboardItem: typeof import('./src/components/Dashboard/DashboardItem.vue')['default'] - DataFields: typeof import('./src/components/Activities/DataFields.vue')['default'] - DataFieldsModal: typeof import('./src/components/Modals/DataFieldsModal.vue')['default'] - DealModal: typeof import('./src/components/Modals/DealModal.vue')['default'] - DealsIcon: typeof import('./src/components/Icons/DealsIcon.vue')['default'] - DealsListView: typeof import('./src/components/ListViews/DealsListView.vue')['default'] - DeclinedCallIcon: typeof import('./src/components/Icons/DeclinedCallIcon.vue')['default'] - DeleteLinkedDocModal: typeof import('./src/components/DeleteLinkedDocModal.vue')['default'] - DesendingIcon: typeof import('./src/components/Icons/DesendingIcon.vue')['default'] - DesktopLayout: typeof import('./src/components/Layouts/DesktopLayout.vue')['default'] - DetailsIcon: typeof import('./src/components/Icons/DetailsIcon.vue')['default'] - DialpadIcon: typeof import('./src/components/Icons/DialpadIcon.vue')['default'] - DocumentIcon: typeof import('./src/components/Icons/DocumentIcon.vue')['default'] - DotIcon: typeof import('./src/components/Icons/DotIcon.vue')['default'] - DoubleCheckIcon: typeof import('./src/components/Icons/DoubleCheckIcon.vue')['default'] - DragIcon: typeof import('./src/components/Icons/DragIcon.vue')['default'] - DragVerticalIcon: typeof import('./src/components/Icons/DragVerticalIcon.vue')['default'] - Dropdown: typeof import('./src/components/frappe-ui/Dropdown.vue')['default'] - DropdownItem: typeof import('./src/components/DropdownItem.vue')['default'] - DuplicateIcon: typeof import('./src/components/Icons/DuplicateIcon.vue')['default'] - DurationIcon: typeof import('./src/components/Icons/DurationIcon.vue')['default'] - EditEmailTemplate: typeof import('./src/components/Settings/EmailTemplate/EditEmailTemplate.vue')['default'] - EditIcon: typeof import('./src/components/Icons/EditIcon.vue')['default'] - EditValueModal: typeof import('./src/components/Modals/EditValueModal.vue')['default'] - Email2Icon: typeof import('./src/components/Icons/Email2Icon.vue')['default'] - EmailAccountCard: typeof import('./src/components/Settings/EmailAccountCard.vue')['default'] - EmailAccountList: typeof import('./src/components/Settings/EmailAccountList.vue')['default'] - EmailAdd: typeof import('./src/components/Settings/EmailAdd.vue')['default'] - EmailArea: typeof import('./src/components/Activities/EmailArea.vue')['default'] - EmailAtIcon: typeof import('./src/components/Icons/EmailAtIcon.vue')['default'] - EmailConfig: typeof import('./src/components/Settings/EmailConfig.vue')['default'] - EmailContent: typeof import('./src/components/Activities/EmailContent.vue')['default'] - EmailEdit: typeof import('./src/components/Settings/EmailEdit.vue')['default'] - EmailEditor: typeof import('./src/components/EmailEditor.vue')['default'] - EmailIcon: typeof import('./src/components/Icons/EmailIcon.vue')['default'] - EmailProviderIcon: typeof import('./src/components/Settings/EmailProviderIcon.vue')['default'] - EmailTemplateIcon: typeof import('./src/components/Icons/EmailTemplateIcon.vue')['default'] - EmailTemplatePage: typeof import('./src/components/Settings/EmailTemplate/EmailTemplatePage.vue')['default'] - EmailTemplates: typeof import('./src/components/Settings/EmailTemplate/EmailTemplates.vue')['default'] - EmailTemplateSelectorModal: typeof import('./src/components/Modals/EmailTemplateSelectorModal.vue')['default'] - ERPNextIcon: typeof import('./src/components/Icons/ERPNextIcon.vue')['default'] - ERPNextSettings: typeof import('./src/components/Settings/ERPNextSettings.vue')['default'] - ErrorPage: typeof import('./src/components/ErrorPage.vue')['default'] - ExotelCallUI: typeof import('./src/components/Telephony/ExotelCallUI.vue')['default'] - ExportIcon: typeof import('./src/components/Icons/ExportIcon.vue')['default'] - ExternalLinkIcon: typeof import('./src/components/Icons/ExternalLinkIcon.vue')['default'] - FadedScrollableDiv: typeof import('./src/components/FadedScrollableDiv.vue')['default'] - Field: typeof import('./src/components/FieldLayout/Field.vue')['default'] - FieldLayout: typeof import('./src/components/FieldLayout/FieldLayout.vue')['default'] - FieldLayoutEditor: typeof import('./src/components/FieldLayoutEditor.vue')['default'] - FileAudioIcon: typeof import('./src/components/Icons/FileAudioIcon.vue')['default'] - FileIcon: typeof import('./src/components/Icons/FileIcon.vue')['default'] - FileImageIcon: typeof import('./src/components/Icons/FileImageIcon.vue')['default'] - FileSpreadsheetIcon: typeof import('./src/components/Icons/FileSpreadsheetIcon.vue')['default'] - FilesUploader: typeof import('./src/components/FilesUploader/FilesUploader.vue')['default'] - FilesUploaderArea: typeof import('./src/components/FilesUploader/FilesUploaderArea.vue')['default'] - FileTextIcon: typeof import('./src/components/Icons/FileTextIcon.vue')['default'] - FileTypeIcon: typeof import('./src/components/Icons/FileTypeIcon.vue')['default'] - FileVideoIcon: typeof import('./src/components/Icons/FileVideoIcon.vue')['default'] - Filter: typeof import('./src/components/Filter.vue')['default'] - FilterIcon: typeof import('./src/components/Icons/FilterIcon.vue')['default'] - FormattedInput: typeof import('./src/components/Controls/FormattedInput.vue')['default'] - FrappeCloudIcon: typeof import('./src/components/Icons/FrappeCloudIcon.vue')['default'] - GenderIcon: typeof import('./src/components/Icons/GenderIcon.vue')['default'] - GeneralSettings: typeof import('./src/components/Settings/General/GeneralSettings.vue')['default'] - GeneralSettingsPage: typeof import('./src/components/Settings/General/GeneralSettingsPage.vue')['default'] - GlobalModals: typeof import('./src/components/Modals/GlobalModals.vue')['default'] - GoogleIcon: typeof import('./src/components/Icons/GoogleIcon.vue')['default'] - Grid: typeof import('./src/components/Controls/Grid.vue')['default'] - GridFieldsEditorModal: typeof import('./src/components/Controls/GridFieldsEditorModal.vue')['default'] - GridRowFieldsModal: typeof import('./src/components/Controls/GridRowFieldsModal.vue')['default'] - GridRowModal: typeof import('./src/components/Controls/GridRowModal.vue')['default'] - GroupBy: typeof import('./src/components/GroupBy.vue')['default'] - GroupByIcon: typeof import('./src/components/Icons/GroupByIcon.vue')['default'] - HeartIcon: typeof import('./src/components/Icons/HeartIcon.vue')['default'] - HelpdeskIcon: typeof import('./src/components/Icons/HelpdeskIcon.vue')['default'] - HelpdeskSettings: typeof import('./src/components/Settings/HelpdeskSettings.vue')['default'] - HelpIcon: typeof import('./src/components/Icons/HelpIcon.vue')['default'] - HomeActions: typeof import('./src/components/Settings/General/HomeActions.vue')['default'] - Icon: typeof import('./src/components/Icon.vue')['default'] - IconPicker: typeof import('./src/components/IconPicker.vue')['default'] - ImageUploader: typeof import('./src/components/Controls/ImageUploader.vue')['default'] - InboundCallIcon: typeof import('./src/components/Icons/InboundCallIcon.vue')['default'] - InboxIcon: typeof import('./src/components/Icons/InboxIcon.vue')['default'] - IndicatorIcon: typeof import('./src/components/Icons/IndicatorIcon.vue')['default'] - InviteIcon: typeof import('./src/components/Icons/InviteIcon.vue')['default'] - InviteUserPage: typeof import('./src/components/Settings/InviteUserPage.vue')['default'] - KanbanIcon: typeof import('./src/components/Icons/KanbanIcon.vue')['default'] - KanbanSettings: typeof import('./src/components/Kanban/KanbanSettings.vue')['default'] - KanbanView: typeof import('./src/components/Kanban/KanbanView.vue')['default'] - KeyboardShortcut: typeof import('./src/components/KeyboardShortcut.vue')['default'] - LayoutHeader: typeof import('./src/components/LayoutHeader.vue')['default'] - LeadModal: typeof import('./src/components/Modals/LeadModal.vue')['default'] - LeadsIcon: typeof import('./src/components/Icons/LeadsIcon.vue')['default'] - LeadsListView: typeof import('./src/components/ListViews/LeadsListView.vue')['default'] - LightningIcon: typeof import('./src/components/Icons/LightningIcon.vue')['default'] - Link: typeof import('./src/components/Controls/Link.vue')['default'] - LinkedDocsListView: typeof import('./src/components/ListViews/LinkedDocsListView.vue')['default'] - LinkIcon: typeof import('./src/components/Icons/LinkIcon.vue')['default'] - ListBulkActions: typeof import('./src/components/ListBulkActions.vue')['default'] - ListIcon: typeof import('./src/components/Icons/ListIcon.vue')['default'] - ListRows: typeof import('./src/components/ListViews/ListRows.vue')['default'] - LoadingIndicator: typeof import('./src/components/Icons/LoadingIndicator.vue')['default'] - LostReasonModal: typeof import('./src/components/Modals/LostReasonModal.vue')['default'] - LucideCalendar: typeof import('~icons/lucide/calendar')['default'] - MarkAsDoneIcon: typeof import('./src/components/Icons/MarkAsDoneIcon.vue')['default'] - MaximizeIcon: typeof import('./src/components/Icons/MaximizeIcon.vue')['default'] - MenuIcon: typeof import('./src/components/Icons/MenuIcon.vue')['default'] - MinimizeIcon: typeof import('./src/components/Icons/MinimizeIcon.vue')['default'] - MissedCallIcon: typeof import('./src/components/Icons/MissedCallIcon.vue')['default'] - MobileAppHeader: typeof import('./src/components/Mobile/MobileAppHeader.vue')['default'] - MobileLayout: typeof import('./src/components/Layouts/MobileLayout.vue')['default'] - MobileSidebar: typeof import('./src/components/Mobile/MobileSidebar.vue')['default'] - MoneyIcon: typeof import('./src/components/Icons/MoneyIcon.vue')['default'] - MultiActionButton: typeof import('./src/components/MultiActionButton.vue')['default'] - MultipleAvatar: typeof import('./src/components/MultipleAvatar.vue')['default'] - MultiSelectEmailInput: typeof import('./src/components/Controls/MultiSelectEmailInput.vue')['default'] - MultiSelectUserInput: typeof import('./src/components/Controls/MultiSelectUserInput.vue')['default'] - MuteIcon: typeof import('./src/components/Icons/MuteIcon.vue')['default'] - NewEmailTemplate: typeof import('./src/components/Settings/EmailTemplate/NewEmailTemplate.vue')['default'] - NoteArea: typeof import('./src/components/Activities/NoteArea.vue')['default'] - NoteIcon: typeof import('./src/components/Icons/NoteIcon.vue')['default'] - NoteModal: typeof import('./src/components/Modals/NoteModal.vue')['default'] - Notifications: typeof import('./src/components/Notifications.vue')['default'] - NotificationsIcon: typeof import('./src/components/Icons/NotificationsIcon.vue')['default'] - OrganizationModal: typeof import('./src/components/Modals/OrganizationModal.vue')['default'] - 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'] - PlaybackSpeedIcon: typeof import('./src/components/Icons/PlaybackSpeedIcon.vue')['default'] - PlaybackSpeedOption: typeof import('./src/components/Activities/PlaybackSpeedOption.vue')['default'] - PlayIcon: typeof import('./src/components/Icons/PlayIcon.vue')['default'] - Popover: typeof import('./src/components/frappe-ui/Popover.vue')['default'] - ProfileSettings: typeof import('./src/components/Settings/ProfileSettings.vue')['default'] - QuickEntryModal: typeof import('./src/components/Modals/QuickEntryModal.vue')['default'] - QuickFilterField: typeof import('./src/components/QuickFilterField.vue')['default'] - QuickFilterIcon: typeof import('./src/components/Icons/QuickFilterIcon.vue')['default'] - ReactIcon: typeof import('./src/components/Icons/ReactIcon.vue')['default'] - RefreshIcon: typeof import('./src/components/Icons/RefreshIcon.vue')['default'] - ReloadIcon: typeof import('./src/components/Icons/ReloadIcon.vue')['default'] - ReplyAllIcon: typeof import('./src/components/Icons/ReplyAllIcon.vue')['default'] - ReplyIcon: typeof import('./src/components/Icons/ReplyIcon.vue')['default'] - Resizer: typeof import('./src/components/Resizer.vue')['default'] - RightSideLayoutIcon: typeof import('./src/components/Icons/RightSideLayoutIcon.vue')['default'] - RouterLink: typeof import('vue-router')['RouterLink'] - RouterView: typeof import('vue-router')['RouterView'] - Section: typeof import('./src/components/FieldLayout/Section.vue')['default'] - SelectIcon: typeof import('./src/components/Icons/SelectIcon.vue')['default'] - Settings: typeof import('./src/components/Settings/Settings.vue')['default'] - SettingsIcon: typeof import('./src/components/Icons/SettingsIcon.vue')['default'] - SettingsPage: typeof import('./src/components/Settings/SettingsPage.vue')['default'] - SidebarLink: typeof import('./src/components/SidebarLink.vue')['default'] - SidePanelLayout: typeof import('./src/components/SidePanelLayout.vue')['default'] - SidePanelLayoutEditor: typeof import('./src/components/SidePanelLayoutEditor.vue')['default'] - SidePanelModal: typeof import('./src/components/Modals/SidePanelModal.vue')['default'] - SLASection: typeof import('./src/components/SLASection.vue')['default'] - SmileIcon: typeof import('./src/components/Icons/SmileIcon.vue')['default'] - SortBy: typeof import('./src/components/SortBy.vue')['default'] - SortIcon: typeof import('./src/components/Icons/SortIcon.vue')['default'] - SquareAsterisk: typeof import('./src/components/Icons/SquareAsterisk.vue')['default'] - StepsIcon: typeof import('./src/components/Icons/StepsIcon.vue')['default'] - SuccessIcon: typeof import('./src/components/Icons/SuccessIcon.vue')['default'] - TableMultiselectInput: typeof import('./src/components/Controls/TableMultiselectInput.vue')['default'] - TaskArea: typeof import('./src/components/Activities/TaskArea.vue')['default'] - TaskIcon: typeof import('./src/components/Icons/TaskIcon.vue')['default'] - TaskModal: typeof import('./src/components/Modals/TaskModal.vue')['default'] - TaskPanel: typeof import('./src/components/Telephony/TaskPanel.vue')['default'] - TaskPriorityIcon: typeof import('./src/components/Icons/TaskPriorityIcon.vue')['default'] - TasksListView: typeof import('./src/components/ListViews/TasksListView.vue')['default'] - TaskStatusIcon: typeof import('./src/components/Icons/TaskStatusIcon.vue')['default'] - TelegramIcon: typeof import('./src/components/Icons/TelegramIcon.vue')['default'] - TelephonySettings: typeof import('./src/components/Settings/TelephonySettings.vue')['default'] - TerritoryIcon: typeof import('./src/components/Icons/TerritoryIcon.vue')['default'] - TwilioCallUI: typeof import('./src/components/Telephony/TwilioCallUI.vue')['default'] - UnpinIcon: typeof import('./src/components/Icons/UnpinIcon.vue')['default'] - UserAvatar: typeof import('./src/components/UserAvatar.vue')['default'] - UserDropdown: typeof import('./src/components/UserDropdown.vue')['default'] - Users: typeof import('./src/components/Settings/Users.vue')['default'] - ViewBreadcrumbs: typeof import('./src/components/ViewBreadcrumbs.vue')['default'] - ViewControls: typeof import('./src/components/ViewControls.vue')['default'] - ViewModal: typeof import('./src/components/Modals/ViewModal.vue')['default'] - VolumnHighIcon: typeof import('./src/components/Icons/VolumnHighIcon.vue')['default'] - VolumnLowIcon: typeof import('./src/components/Icons/VolumnLowIcon.vue')['default'] - WebsiteIcon: typeof import('./src/components/Icons/WebsiteIcon.vue')['default'] - WhatsAppArea: typeof import('./src/components/Activities/WhatsAppArea.vue')['default'] - WhatsAppBox: typeof import('./src/components/Activities/WhatsAppBox.vue')['default'] - WhatsAppIcon: typeof import('./src/components/Icons/WhatsAppIcon.vue')['default'] - WhatsAppSettings: typeof import('./src/components/Settings/WhatsAppSettings.vue')['default'] - WhatsappTemplateSelectorModal: typeof import('./src/components/Modals/WhatsappTemplateSelectorModal.vue')['default'] - } -} diff --git a/frontend/src/components/ConditionsFilter/CFCondition.vue b/frontend/src/components/ConditionsFilter/CFCondition.vue new file mode 100644 index 00000000..943ad231 --- /dev/null +++ b/frontend/src/components/ConditionsFilter/CFCondition.vue @@ -0,0 +1,469 @@ + + + diff --git a/frontend/src/components/ConditionsFilter/CFConditions.vue b/frontend/src/components/ConditionsFilter/CFConditions.vue new file mode 100644 index 00000000..03b50269 --- /dev/null +++ b/frontend/src/components/ConditionsFilter/CFConditions.vue @@ -0,0 +1,142 @@ + + + diff --git a/frontend/src/components/ConditionsFilter/filterableFields.ts b/frontend/src/components/ConditionsFilter/filterableFields.ts new file mode 100644 index 00000000..16bead91 --- /dev/null +++ b/frontend/src/components/ConditionsFilter/filterableFields.ts @@ -0,0 +1,17 @@ +import { createResource } from 'frappe-ui' + +export const filterableFields = createResource({ + url: 'crm.api.doc.get_filterable_fields', + transform: (data) => { + data = data + .filter((field) => !field.fieldname.startsWith('_')) + .map((field) => { + return { + label: field.label, + value: field.fieldname, + ...field, + } + }) + return data + }, +}) diff --git a/frontend/src/components/Icons/SettingsIcon2.vue b/frontend/src/components/Icons/SettingsIcon2.vue new file mode 100644 index 00000000..cd7d77da --- /dev/null +++ b/frontend/src/components/Icons/SettingsIcon2.vue @@ -0,0 +1,19 @@ + diff --git a/frontend/src/components/Settings/AssignmentRules/AssigneeRules.vue b/frontend/src/components/Settings/AssignmentRules/AssigneeRules.vue new file mode 100644 index 00000000..03f3f849 --- /dev/null +++ b/frontend/src/components/Settings/AssignmentRules/AssigneeRules.vue @@ -0,0 +1,148 @@ + + + diff --git a/frontend/src/components/Settings/AssignmentRules/AssigneeSearch.vue b/frontend/src/components/Settings/AssignmentRules/AssigneeSearch.vue new file mode 100644 index 00000000..6d5a6bfc --- /dev/null +++ b/frontend/src/components/Settings/AssignmentRules/AssigneeSearch.vue @@ -0,0 +1,166 @@ + + + diff --git a/frontend/src/components/Settings/AssignmentRules/AssignmentRuleListItem.vue b/frontend/src/components/Settings/AssignmentRules/AssignmentRuleListItem.vue new file mode 100644 index 00000000..01336adc --- /dev/null +++ b/frontend/src/components/Settings/AssignmentRules/AssignmentRuleListItem.vue @@ -0,0 +1,204 @@ + + + diff --git a/frontend/src/components/Settings/AssignmentRules/AssignmentRulePage.vue b/frontend/src/components/Settings/AssignmentRules/AssignmentRulePage.vue new file mode 100644 index 00000000..4b77e921 --- /dev/null +++ b/frontend/src/components/Settings/AssignmentRules/AssignmentRulePage.vue @@ -0,0 +1,19 @@ + + + diff --git a/frontend/src/components/Settings/AssignmentRules/AssignmentRuleView.vue b/frontend/src/components/Settings/AssignmentRules/AssignmentRuleView.vue new file mode 100644 index 00000000..d8891116 --- /dev/null +++ b/frontend/src/components/Settings/AssignmentRules/AssignmentRuleView.vue @@ -0,0 +1,767 @@ + + + diff --git a/frontend/src/components/Settings/AssignmentRules/AssignmentRules.vue b/frontend/src/components/Settings/AssignmentRules/AssignmentRules.vue new file mode 100644 index 00000000..00be9101 --- /dev/null +++ b/frontend/src/components/Settings/AssignmentRules/AssignmentRules.vue @@ -0,0 +1,48 @@ + + + diff --git a/frontend/src/components/Settings/AssignmentRules/AssignmentRulesList.vue b/frontend/src/components/Settings/AssignmentRules/AssignmentRulesList.vue new file mode 100644 index 00000000..d911c335 --- /dev/null +++ b/frontend/src/components/Settings/AssignmentRules/AssignmentRulesList.vue @@ -0,0 +1,41 @@ + + + diff --git a/frontend/src/components/Settings/AssignmentRules/AssignmentRulesSection.vue b/frontend/src/components/Settings/AssignmentRules/AssignmentRulesSection.vue new file mode 100644 index 00000000..7d37c95a --- /dev/null +++ b/frontend/src/components/Settings/AssignmentRules/AssignmentRulesSection.vue @@ -0,0 +1,96 @@ + + + diff --git a/frontend/src/components/Settings/AssignmentRules/AssignmentSchedule.vue b/frontend/src/components/Settings/AssignmentRules/AssignmentSchedule.vue new file mode 100644 index 00000000..e54b7535 --- /dev/null +++ b/frontend/src/components/Settings/AssignmentRules/AssignmentSchedule.vue @@ -0,0 +1,85 @@ + + + diff --git a/frontend/src/components/Settings/AssignmentRules/AssignmentScheduleItem.vue b/frontend/src/components/Settings/AssignmentRules/AssignmentScheduleItem.vue new file mode 100644 index 00000000..6f443f06 --- /dev/null +++ b/frontend/src/components/Settings/AssignmentRules/AssignmentScheduleItem.vue @@ -0,0 +1,42 @@ + + + diff --git a/frontend/src/components/Settings/Settings.vue b/frontend/src/components/Settings/Settings.vue index 4b1f9b90..f896184a 100644 --- a/frontend/src/components/Settings/Settings.vue +++ b/frontend/src/components/Settings/Settings.vue @@ -3,6 +3,7 @@ v-model="showSettings" :options="{ size: '5xl' }" @close="activeSettingsPage = ''" + :disableOutsideClickToClose="disableSettingModalOutsideClick" >