From d193c05c96b19c7588c7f539f8913628a994503c Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 19 Jan 2024 20:47:00 +0530 Subject: [PATCH 1/5] fix: load public views --- crm/api/doc.py | 10 ++---- crm/api/views.py | 19 +++++++++++ .../crm_view_settings/crm_view_settings.json | 9 +++++- frontend/src/stores/views.js | 32 +++++++++++-------- 4 files changed, 48 insertions(+), 22 deletions(-) create mode 100644 crm/api/views.py diff --git a/crm/api/doc.py b/crm/api/doc.py index 461cac1d..4ad990c1 100644 --- a/crm/api/doc.py +++ b/crm/api/doc.py @@ -3,6 +3,8 @@ from frappe.model.document import get_controller from frappe.model import no_value_fields from pypika import Criterion +from crm.api.views import get_views + @frappe.whitelist() def sort_options(doctype: str): @@ -164,14 +166,6 @@ def get_list_data( "row_count": len(data), } -def get_views(doctype): - views = frappe.get_all( - "CRM View Settings", - fields=["*"], - filters={"dt": doctype, "user": frappe.session.user} - ) - return views - def get_doctype_fields(doctype): not_allowed_fieldtypes = [ diff --git a/crm/api/views.py b/crm/api/views.py new file mode 100644 index 00000000..6a95adbf --- /dev/null +++ b/crm/api/views.py @@ -0,0 +1,19 @@ +import frappe +from pypika import Criterion + + +@frappe.whitelist() +def get_views(doctype): + if frappe.session.user == "Guest": + frappe.throw("Authentication failed", exc=frappe.AuthenticationError) + + View = frappe.qb.DocType("CRM View Settings") + query = ( + frappe.qb.from_(View) + .select("*") + .where(Criterion.any([View.user == '', View.user == frappe.session.user])) + ) + if doctype: + query = query.where(View.dt == doctype) + views = query.run(as_dict=True) + return views \ No newline at end of file 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 6cbc383e..8671e0ad 100644 --- a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json +++ b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json @@ -11,6 +11,7 @@ "dt", "route_name", "pinned", + "public", "columns_tab", "load_default_columns", "columns", @@ -97,11 +98,17 @@ "fieldname": "load_default_columns", "fieldtype": "Check", "label": "Load Default Columns" + }, + { + "default": "0", + "fieldname": "public", + "fieldtype": "Check", + "label": "Public" } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-01-03 16:54:52.195687", + "modified": "2024-01-19 19:55:14.876998", "modified_by": "Administrator", "module": "FCRM", "name": "CRM View Settings", diff --git a/frontend/src/stores/views.js b/frontend/src/stores/views.js index a88cc7c9..7db007f9 100644 --- a/frontend/src/stores/views.js +++ b/frontend/src/stores/views.js @@ -1,29 +1,30 @@ import { defineStore } from 'pinia' -import { usersStore } from '@/stores/users' -import { createListResource } from 'frappe-ui' +import { createResource } from 'frappe-ui' import { reactive, ref } from 'vue' -export const viewsStore = defineStore('crm-views', () => { - - const { getUser } = usersStore() - +export const viewsStore = defineStore('crm-views', (doctype) => { let viewsByName = reactive({}) let pinnedViews = ref([]) + let publicViews = ref([]) - const views = createListResource({ - doctype: 'CRM View Settings', - fields: ['*'], - filters: { user: getUser().email }, - cache: 'crm-views', + // Views + const views = createResource({ + url: 'crm.api.views.get_views', + params: { doctype: doctype || '' }, + cache: "crm-views", initialData: [], auto: true, transform(views) { pinnedViews.value = [] + publicViews.value = [] for (let view of views) { viewsByName[view.name] = view if (view.pinned) { pinnedViews.value?.push(view) } + if (view.public) { + publicViews.value?.push(view) + } } return views }, @@ -42,13 +43,18 @@ export const viewsStore = defineStore('crm-views', () => { return pinnedViews.value } - async function reload(wait = false) { + function getPublicViews() { + if (!publicViews.value?.length) return [] + return publicViews.value + } + + async function reload() { await views.reload() } return { - views, getPinnedViews, + getPublicViews, reload, getView, } From bea64d4ec02f17019cf608a164cd1d7b94e10c41 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Fri, 19 Jan 2024 20:48:20 +0530 Subject: [PATCH 2/5] fix: show public views in sidebar --- .../src/components/Layouts/AppSidebar.vue | 55 ++++++++++++++----- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/Layouts/AppSidebar.vue b/frontend/src/components/Layouts/AppSidebar.vue index 4b5d891d..5b1cd6e6 100644 --- a/frontend/src/components/Layouts/AppSidebar.vue +++ b/frontend/src/components/Layouts/AppSidebar.vue @@ -15,25 +15,54 @@ class="mx-2 my-0.5" /> +
+
+ Public Views +
+
+ +
-
- Pinned Views -
+ Pinned Views +
+
-
+