From a760a2fa6a667fe1adece813c69470e62b99a66f Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 1 Jan 2024 17:53:47 +0530 Subject: [PATCH 1/6] feat: added ability to pin unpin a view --- .../crm_view_settings/crm_view_settings.json | 9 ++++++- .../crm_view_settings/crm_view_settings.py | 6 +++++ .../src/components/Icons/DuplicateIcon.vue | 16 ++++++++++++ frontend/src/components/Icons/PinIcon.vue | 16 ++++++++++++ frontend/src/components/Icons/UnpinIcon.vue | 25 ++++++++++++++++++ frontend/src/components/ViewControls.vue | 26 ++++++++++++++++--- 6 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 frontend/src/components/Icons/DuplicateIcon.vue create mode 100644 frontend/src/components/Icons/PinIcon.vue create mode 100644 frontend/src/components/Icons/UnpinIcon.vue diff --git a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json index 8b7ae5f0..4e20bf65 100644 --- a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json +++ b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json @@ -9,6 +9,7 @@ "user", "column_break_zacm", "dt", + "pinned", "columns_tab", "default_columns", "columns", @@ -84,11 +85,17 @@ "fieldname": "default_columns", "fieldtype": "Check", "label": "Default Columns" + }, + { + "default": "0", + "fieldname": "pinned", + "fieldtype": "Check", + "label": "Pinned" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2023-12-30 19:28:02.541487", + "modified": "2024-01-01 17:42:37.789865", "modified_by": "Administrator", "module": "FCRM", "name": "CRM View Settings", diff --git a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py index dbb218f6..3fa417b7 100644 --- a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py +++ b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py @@ -72,6 +72,12 @@ def delete(name): if frappe.db.exists("CRM View Settings", name): frappe.delete_doc("CRM View Settings", name) +@frappe.whitelist() +def pin(name, value): + doc = frappe.get_doc("CRM View Settings", name) + doc.pinned = value + doc.save() + def remove_duplicates(l): return list(dict.fromkeys(l)) diff --git a/frontend/src/components/Icons/DuplicateIcon.vue b/frontend/src/components/Icons/DuplicateIcon.vue new file mode 100644 index 00000000..54ba0875 --- /dev/null +++ b/frontend/src/components/Icons/DuplicateIcon.vue @@ -0,0 +1,16 @@ + diff --git a/frontend/src/components/Icons/PinIcon.vue b/frontend/src/components/Icons/PinIcon.vue new file mode 100644 index 00000000..c1ade0a3 --- /dev/null +++ b/frontend/src/components/Icons/PinIcon.vue @@ -0,0 +1,16 @@ + diff --git a/frontend/src/components/Icons/UnpinIcon.vue b/frontend/src/components/Icons/UnpinIcon.vue new file mode 100644 index 00000000..31ac4721 --- /dev/null +++ b/frontend/src/components/Icons/UnpinIcon.vue @@ -0,0 +1,25 @@ + diff --git a/frontend/src/components/ViewControls.vue b/frontend/src/components/ViewControls.vue index 6f25d2b7..b7ed3585 100644 --- a/frontend/src/components/ViewControls.vue +++ b/frontend/src/components/ViewControls.vue @@ -63,6 +63,9 @@ /> diff --git a/frontend/src/components/ViewControls.vue b/frontend/src/components/ViewControls.vue index b7ed3585..365dadc4 100644 --- a/frontend/src/components/ViewControls.vue +++ b/frontend/src/components/ViewControls.vue @@ -89,7 +89,7 @@ const props = defineProps({ }) const { $dialog } = globalStore() -const { getView } = viewsStore() +const { reload: reloadView, getView } = viewsStore() const list = defineModel() @@ -132,6 +132,7 @@ function getParams() { order_by: _view.order_by, columns: _view.columns, rows: _view.rows, + route_name: _view.route_name, default_columns: _view.row, pinned: _view.pinned, } @@ -143,6 +144,7 @@ function getParams() { order_by: 'modified desc', columns: '', rows: '', + route_name: '', default_columns: true, pinned: false, } @@ -302,6 +304,7 @@ const viewActions = computed(() => { value: !view.value.pinned, }).then(() => { view.value.pinned = !view.value.pinned + reloadView() }) }, }) @@ -332,6 +335,7 @@ const viewActions = computed(() => { } ).then(() => { router.push({ name: route.name }) + reloadView() }) }, }, @@ -357,6 +361,7 @@ function saveView() { order_by: defaultParams.value.order_by, columns: defaultParams.value.columns, rows: defaultParams.value.rows, + route_name: route.name, default_columns: view.value.default_columns, } showViewModal.value = true diff --git a/frontend/src/stores/views.js b/frontend/src/stores/views.js index 64039643..87a209a6 100644 --- a/frontend/src/stores/views.js +++ b/frontend/src/stores/views.js @@ -1,9 +1,10 @@ import { defineStore } from 'pinia' import { createListResource } from 'frappe-ui' -import { reactive } from 'vue' +import { reactive, ref } from 'vue' export const viewsStore = defineStore('crm-views', () => { let viewsByName = reactive({}) + let pinnedViews = ref([]) const views = createListResource({ doctype: 'CRM View Settings', @@ -12,8 +13,12 @@ export const viewsStore = defineStore('crm-views', () => { initialData: [], auto: true, transform(views) { + pinnedViews.value = [] for (let view of views) { viewsByName[view.name] = view + if (view.pinned) { + pinnedViews.value?.push(view) + } } return views }, @@ -27,8 +32,19 @@ export const viewsStore = defineStore('crm-views', () => { return viewsByName[view] } + function getPinnedViews() { + if (!pinnedViews.value?.length) return [] + return pinnedViews.value + } + + function reload() { + views.reload() + } + return { views, + getPinnedViews, + reload, getView, } }) From a7f9859b892374becbaf044387b0c8a1ceab6cff Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 1 Jan 2024 19:01:43 +0530 Subject: [PATCH 5/6] fix: show pinned views and saved views as different group in view dropdown --- frontend/src/components/ViewControls.vue | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/ViewControls.vue b/frontend/src/components/ViewControls.vue index 365dadc4..9492320c 100644 --- a/frontend/src/components/ViewControls.vue +++ b/frontend/src/components/ViewControls.vue @@ -209,10 +209,19 @@ function setupViews(views) { } }) - if (views.length) { + let pinnedViews = views?.filter((v) => v.pinned) || [] + let savedViews = views?.filter((v) => !v.pinned) || [] + + if (savedViews.length) { viewsDropdownOptions.value.push({ group: 'Saved Views', - items: views, + items: savedViews, + }) + } + if (pinnedViews.length) { + viewsDropdownOptions.value.push({ + group: 'Pinned Views', + items: pinnedViews, }) } } From 100fbeb109f8943ceb7189e6fbdf6f7330598a27 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 1 Jan 2024 19:27:30 +0530 Subject: [PATCH 6/6] fix: handle style for collapsed sidebar --- frontend/src/components/AppSidebar.vue | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/AppSidebar.vue b/frontend/src/components/AppSidebar.vue index d4c061ed..4b5d891d 100644 --- a/frontend/src/components/AppSidebar.vue +++ b/frontend/src/components/AppSidebar.vue @@ -3,7 +3,7 @@ class="flex h-full flex-col justify-between transition-all duration-300 ease-in-out" :class="isSidebarCollapsed ? 'w-12' : 'w-56'" > -
+
+
-
Pinned Views
+
+ Pinned Views +