From 9b12cbaffeb47a1443dbc7f7887b90e9cd88395d Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Sat, 3 Feb 2024 19:51:40 +0530 Subject: [PATCH] fix: use standard listview as default view auto save changes in default view --- .../crm_view_settings/crm_view_settings.json | 9 ++- .../crm_view_settings/crm_view_settings.py | 57 +++++++++++++++++++ frontend/src/components/ViewControls.vue | 36 +++++++++--- frontend/src/stores/views.js | 11 +++- 4 files changed, 103 insertions(+), 10 deletions(-) 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 f539da02..e0ac969d 100644 --- a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json +++ b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json @@ -7,6 +7,7 @@ "field_order": [ "label", "user", + "is_default", "column_break_zacm", "dt", "route_name", @@ -104,11 +105,17 @@ "fieldname": "public", "fieldtype": "Check", "label": "Public" + }, + { + "default": "0", + "fieldname": "is_default", + "fieldtype": "Check", + "label": "Is Default" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-02-03 18:22:48.406099", + "modified": "2024-02-03 18:38:09.412745", "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 a7eb8595..f7792250 100644 --- a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py +++ b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py @@ -21,6 +21,9 @@ def create(view): view.rows = view.rows + default_rows if default_rows else view.rows view.rows = remove_duplicates(view.rows) + if not view.columns: + view.columns = sync_default_list_columns(view.doctype) + doc = frappe.new_doc("CRM View Settings") doc.name = view.label doc.label = view.label @@ -90,3 +93,57 @@ def sync_default_list_rows(doctype): rows = list.default_list_data().get("rows") return rows + +def sync_default_list_columns(doctype): + list = get_controller(doctype) + columns = [] + + if hasattr(list, "default_list_data"): + columns = list.default_list_data().get("columns") + + return columns + + +@frappe.whitelist() +def create_or_update_default_view(view): + view = frappe._dict(view) + + filters = parse_json(view.filters) or {} + columns = parse_json(view.columns or '[]') + rows = parse_json(view.rows or '[]') + + default_rows = sync_default_list_rows(view.doctype) + rows = rows + default_rows if default_rows else rows + rows = remove_duplicates(rows) + + if not columns: + columns = sync_default_list_columns(view.doctype) + + doc = frappe.db.exists( + "CRM View Settings", + {"dt": view.doctype, "is_default": True, "user": frappe.session.user}, + ) + if doc: + doc = frappe.get_doc("CRM View Settings", doc) + doc.label = view.label + doc.route_name = view.route_name or "" + doc.load_default_columns = view.load_default_columns or False + doc.filters = json.dumps(filters) + doc.order_by = view.order_by + doc.columns = json.dumps(columns) + doc.rows = json.dumps(rows) + doc.save() + else: + doc = frappe.new_doc("CRM View Settings") + doc.name = view.label or 'List View' + doc.label = view.label or 'List View' + doc.dt = view.doctype + doc.user = frappe.session.user + doc.route_name = view.route_name or "" + doc.load_default_columns = view.load_default_columns or False + doc.filters = json.dumps(filters) + doc.order_by = view.order_by + doc.columns = json.dumps(columns) + doc.rows = json.dumps(rows) + doc.is_default = True + doc.insert() \ No newline at end of file diff --git a/frontend/src/components/ViewControls.vue b/frontend/src/components/ViewControls.vue index 11547722..70630ca2 100644 --- a/frontend/src/components/ViewControls.vue +++ b/frontend/src/components/ViewControls.vue @@ -26,14 +26,11 @@
{ } }) let publicViews = list.value.data.views.filter((v) => v.public) - let savedViews = list.value.data.views.filter((v) => !v.pinned && !v.public) + let savedViews = list.value.data.views.filter( + (v) => !v.pinned && !v.public && !v.is_default + ) let pinnedViews = list.value.data.views.filter((v) => v.pinned) publicViews.length && @@ -299,6 +298,10 @@ function updateFilter(filters) { list.value.params.filters = filters view.value.filters = filters list.value.reload() + + if (!route.query.view) { + create_or_update_default_view() + } } function updateSort(order_by) { @@ -310,6 +313,10 @@ function updateSort(order_by) { list.value.params.order_by = order_by view.value.order_by = order_by list.value.reload() + + if (!route.query.view) { + create_or_update_default_view() + } } function updateColumns(obj) { @@ -329,6 +336,21 @@ function updateColumns(obj) { list.value.reload() } viewUpdated.value = true + + if (!route.query.view) { + create_or_update_default_view() + } +} + +function create_or_update_default_view() { + if (route.query.view) return + view.value.doctype = props.doctype + call( + 'crm.fcrm.doctype.crm_view_settings.crm_view_settings.create_or_update_default_view', + { + view: view.value, + } + ).then(() => reloadView()) } function updatePageLength(value, loadMore = false) { diff --git a/frontend/src/stores/views.js b/frontend/src/stores/views.js index 468e73ac..b08d290f 100644 --- a/frontend/src/stores/views.js +++ b/frontend/src/stores/views.js @@ -6,6 +6,7 @@ export const viewsStore = defineStore('crm-views', (doctype) => { let viewsByName = reactive({}) let pinnedViews = ref([]) let publicViews = ref([]) + let defaultView = ref({}) // Views const views = createResource({ @@ -25,13 +26,18 @@ export const viewsStore = defineStore('crm-views', (doctype) => { if (view.public) { publicViews.value?.push(view) } + if (view.is_default && view.dt) { + defaultView.value[view.dt] = view + } } return views }, }) - function getView(view) { - if (!view) return null + function getView(view, doctype = null) { + if (!view && doctype) { + return defaultView.value?.[doctype] || null + } return viewsByName[view] } @@ -51,6 +57,7 @@ export const viewsStore = defineStore('crm-views', (doctype) => { return { views, + defaultView, getPinnedViews, getPublicViews, reload,