diff --git a/crm/api/views.py b/crm/api/views.py index ece602a1..5313753e 100644 --- a/crm/api/views.py +++ b/crm/api/views.py @@ -14,8 +14,3 @@ def get_views(doctype): query = query.where(View.dt == doctype) views = query.run(as_dict=True) return views - - -@frappe.whitelist() -def get_default_view(): - return frappe.db.get_single_value("FCRM Settings", "default_view") or None 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 c62a0f52..694882ab 100644 --- a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py +++ b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py @@ -147,9 +147,19 @@ def sync_default_columns(view): @frappe.whitelist() def set_as_default(name=None, type=None, doctype=None): - if not name: - name = type + "_" + doctype - frappe.db.set_single_value("FCRM Settings", "default_view", name) + if name: + frappe.db.set_value("CRM View Settings", name, "is_default", 1) + else: + doc = create_or_update_standard_view({"type": type, "doctype": doctype, "is_default": 1}) + name = doc.name + + # remove default from other views of same user + frappe.db.set_value( + "CRM View Settings", + {"name": ("!=", name), "user": frappe.session.user, "is_default": 1}, + "is_default", + 0, + ) @frappe.whitelist() @@ -190,10 +200,17 @@ def create_or_update_standard_view(view): doc.kanban_fields = json.dumps(kanban_fields) doc.columns = json.dumps(columns) doc.rows = json.dumps(rows) + doc.is_default = view.is_default or False doc.save() else: doc = frappe.new_doc("CRM View Settings") - label = "Group By View" if view.type == "group_by" else "List View" + + label = "List" + if view.type == "group_by": + label = "Group By" + elif view.type == "kanban": + label = "Kanban" + doc.name = view.label or label doc.label = view.label or label doc.type = view.type or "list" @@ -211,4 +228,7 @@ def create_or_update_standard_view(view): doc.columns = json.dumps(columns) doc.rows = json.dumps(rows) doc.is_standard = True + doc.is_default = view.is_default or False doc.insert() + + return doc diff --git a/frontend/src/components/ViewControls.vue b/frontend/src/components/ViewControls.vue index 5d4f6715..ee38ccc0 100644 --- a/frontend/src/components/ViewControls.vue +++ b/frontend/src/components/ViewControls.vue @@ -897,6 +897,7 @@ const viewActions = (view) => { if (!_view) { _view = { + label: view.label, type: view.name, dt: props.doctype, } @@ -984,13 +985,9 @@ const viewActions = (view) => { function isDefaultView(v, isStandard) { let defaultView = getDefaultView() - if (!defaultView) return false + if (!defaultView || (isStandard && !v.name)) return false - if (isStandard && !v.name) { - return defaultView == v.type + '_' + v.dt - } - - return defaultView == v.name + return defaultView.name == v.name } const viewModalObj = ref({}) diff --git a/frontend/src/router.js b/frontend/src/router.js index e6af1562..43ff0e33 100644 --- a/frontend/src/router.js +++ b/frontend/src/router.js @@ -113,23 +113,22 @@ router.beforeEach(async (to, from, next) => { isLoggedIn && (await userResource.promise) if (to.name === 'Home' && isLoggedIn) { - const { getDefaultView, defaultView } = viewsStore() - await defaultView.promise + const { views, getDefaultView } = viewsStore() + await views.promise - let _defaultView = getDefaultView(true) - - if (!_defaultView) { + let defaultView = getDefaultView() + if (!defaultView) { next({ name: 'Leads' }) return } - let { name, type, view } = _defaultView - name = name || 'Leads' + let { route_name, type, name, is_standard } = defaultView + route_name = route_name || 'Leads' - if (view) { - next({ name, params: { viewType: type }, query: { view } }) + if (name && !is_standard) { + next({ name: route_name, params: { viewType: type }, query: { name } }) } else { - next({ name, params: { viewType: type } }) + next({ name: route_name, params: { viewType: type } }) } } else if (!isLoggedIn) { window.location.href = '/login?redirect-to=/crm' diff --git a/frontend/src/stores/views.js b/frontend/src/stores/views.js index 011a9e38..097d2706 100644 --- a/frontend/src/stores/views.js +++ b/frontend/src/stores/views.js @@ -7,13 +7,7 @@ export const viewsStore = defineStore('crm-views', (doctype) => { let pinnedViews = ref([]) let publicViews = ref([]) let standardViews = ref({}) - - // Default view - const defaultView = createResource({ - url: 'crm.api.views.get_default_view', - cache: 'crm-default-view', - auto: true, - }) + const defaultView = ref(null) // Views const views = createResource({ @@ -34,48 +28,19 @@ export const viewsStore = defineStore('crm-views', (doctype) => { if (view.public) { publicViews.value?.push(view) } - if (view.is_default && view.dt) { + if (view.is_standard && view.dt) { standardViews.value[view.dt + ' ' + view.type] = view } + if (view.is_default) { + defaultView.value = view + } } return views }, }) - function getDefaultView(routeName = false) { - let view = defaultView.data - if (!view) return null - - if (typeof view === 'string' && !isNaN(view)) { - view = parseInt(view) - } - - if (routeName) { - let viewObj = getView(view) || { - type: view.split('_')[0], - dt: view.split('_')[1], - } - - let routeName = viewObj.dt - - if (routeName.startsWith('CRM ')) { - routeName = routeName.slice(4) - } - - if (!routeName.endsWith('s')) { - routeName += 's' - } - - let viewName = viewObj.is_default ? null : viewObj.name - - return { - name: routeName, - type: viewObj.type, - view: viewName, - } - } - - return view + function getDefaultView() { + return defaultView.value } function getView(view, type, doctype = null) { diff --git a/frontend/src/utils/view.js b/frontend/src/utils/view.js index a6db2fb2..d810eb70 100644 --- a/frontend/src/utils/view.js +++ b/frontend/src/utils/view.js @@ -6,7 +6,7 @@ import { markRaw } from 'vue' const { getView: getViewDetails } = viewsStore() -function defaultView(type) { +function standardView(type) { let types = { list: { label: __('List'), @@ -29,7 +29,7 @@ export function getView(view, type, doctype) { let viewType = type || 'list' let viewDetails = getViewDetails(view, viewType, doctype) if (viewDetails && !viewDetails.icon) { - viewDetails.icon = defaultView(viewType).icon + viewDetails.icon = standardView(viewType).icon } - return viewDetails || defaultView(viewType) + return viewDetails || standardView(viewType) }