fix: set as default view in view settings per user

This commit is contained in:
Shariq Ansari 2025-02-20 14:10:53 +05:30
parent c0bcd2a34f
commit 1e39385abe
6 changed files with 46 additions and 70 deletions

View File

@ -14,8 +14,3 @@ def get_views(doctype):
query = query.where(View.dt == doctype) query = query.where(View.dt == doctype)
views = query.run(as_dict=True) views = query.run(as_dict=True)
return views return views
@frappe.whitelist()
def get_default_view():
return frappe.db.get_single_value("FCRM Settings", "default_view") or None

View File

@ -147,9 +147,19 @@ def sync_default_columns(view):
@frappe.whitelist() @frappe.whitelist()
def set_as_default(name=None, type=None, doctype=None): def set_as_default(name=None, type=None, doctype=None):
if not name: if name:
name = type + "_" + doctype frappe.db.set_value("CRM View Settings", name, "is_default", 1)
frappe.db.set_single_value("FCRM Settings", "default_view", name) 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() @frappe.whitelist()
@ -190,10 +200,17 @@ def create_or_update_standard_view(view):
doc.kanban_fields = json.dumps(kanban_fields) doc.kanban_fields = json.dumps(kanban_fields)
doc.columns = json.dumps(columns) doc.columns = json.dumps(columns)
doc.rows = json.dumps(rows) doc.rows = json.dumps(rows)
doc.is_default = view.is_default or False
doc.save() doc.save()
else: else:
doc = frappe.new_doc("CRM View Settings") 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.name = view.label or label
doc.label = view.label or label doc.label = view.label or label
doc.type = view.type or "list" doc.type = view.type or "list"
@ -211,4 +228,7 @@ def create_or_update_standard_view(view):
doc.columns = json.dumps(columns) doc.columns = json.dumps(columns)
doc.rows = json.dumps(rows) doc.rows = json.dumps(rows)
doc.is_standard = True doc.is_standard = True
doc.is_default = view.is_default or False
doc.insert() doc.insert()
return doc

View File

@ -897,6 +897,7 @@ const viewActions = (view) => {
if (!_view) { if (!_view) {
_view = { _view = {
label: view.label,
type: view.name, type: view.name,
dt: props.doctype, dt: props.doctype,
} }
@ -984,13 +985,9 @@ const viewActions = (view) => {
function isDefaultView(v, isStandard) { function isDefaultView(v, isStandard) {
let defaultView = getDefaultView() let defaultView = getDefaultView()
if (!defaultView) return false if (!defaultView || (isStandard && !v.name)) return false
if (isStandard && !v.name) { return defaultView.name == v.name
return defaultView == v.type + '_' + v.dt
}
return defaultView == v.name
} }
const viewModalObj = ref({}) const viewModalObj = ref({})

View File

@ -113,23 +113,22 @@ router.beforeEach(async (to, from, next) => {
isLoggedIn && (await userResource.promise) isLoggedIn && (await userResource.promise)
if (to.name === 'Home' && isLoggedIn) { if (to.name === 'Home' && isLoggedIn) {
const { getDefaultView, defaultView } = viewsStore() const { views, getDefaultView } = viewsStore()
await defaultView.promise await views.promise
let _defaultView = getDefaultView(true) let defaultView = getDefaultView()
if (!defaultView) {
if (!_defaultView) {
next({ name: 'Leads' }) next({ name: 'Leads' })
return return
} }
let { name, type, view } = _defaultView let { route_name, type, name, is_standard } = defaultView
name = name || 'Leads' route_name = route_name || 'Leads'
if (view) { if (name && !is_standard) {
next({ name, params: { viewType: type }, query: { view } }) next({ name: route_name, params: { viewType: type }, query: { name } })
} else { } else {
next({ name, params: { viewType: type } }) next({ name: route_name, params: { viewType: type } })
} }
} else if (!isLoggedIn) { } else if (!isLoggedIn) {
window.location.href = '/login?redirect-to=/crm' window.location.href = '/login?redirect-to=/crm'

View File

@ -7,13 +7,7 @@ export const viewsStore = defineStore('crm-views', (doctype) => {
let pinnedViews = ref([]) let pinnedViews = ref([])
let publicViews = ref([]) let publicViews = ref([])
let standardViews = ref({}) let standardViews = ref({})
const defaultView = ref(null)
// Default view
const defaultView = createResource({
url: 'crm.api.views.get_default_view',
cache: 'crm-default-view',
auto: true,
})
// Views // Views
const views = createResource({ const views = createResource({
@ -34,48 +28,19 @@ export const viewsStore = defineStore('crm-views', (doctype) => {
if (view.public) { if (view.public) {
publicViews.value?.push(view) publicViews.value?.push(view)
} }
if (view.is_default && view.dt) { if (view.is_standard && view.dt) {
standardViews.value[view.dt + ' ' + view.type] = view standardViews.value[view.dt + ' ' + view.type] = view
} }
if (view.is_default) {
defaultView.value = view
}
} }
return views return views
}, },
}) })
function getDefaultView(routeName = false) { function getDefaultView() {
let view = defaultView.data return defaultView.value
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 getView(view, type, doctype = null) { function getView(view, type, doctype = null) {

View File

@ -6,7 +6,7 @@ import { markRaw } from 'vue'
const { getView: getViewDetails } = viewsStore() const { getView: getViewDetails } = viewsStore()
function defaultView(type) { function standardView(type) {
let types = { let types = {
list: { list: {
label: __('List'), label: __('List'),
@ -29,7 +29,7 @@ export function getView(view, type, doctype) {
let viewType = type || 'list' let viewType = type || 'list'
let viewDetails = getViewDetails(view, viewType, doctype) let viewDetails = getViewDetails(view, viewType, doctype)
if (viewDetails && !viewDetails.icon) { if (viewDetails && !viewDetails.icon) {
viewDetails.icon = defaultView(viewType).icon viewDetails.icon = standardView(viewType).icon
} }
return viewDetails || defaultView(viewType) return viewDetails || standardView(viewType)
} }