feat: set default view

This commit is contained in:
Shariq Ansari 2024-01-22 22:39:04 +05:30
parent 196eb89154
commit c73da41a78
5 changed files with 134 additions and 4 deletions

View File

@ -7,11 +7,13 @@
"field_order": [ "field_order": [
"label", "label",
"user", "user",
"user_list",
"column_break_zacm", "column_break_zacm",
"dt", "dt",
"route_name", "route_name",
"pinned", "pinned",
"public", "public",
"default",
"is_view", "is_view",
"columns_tab", "columns_tab",
"load_default_columns", "load_default_columns",
@ -29,6 +31,7 @@
"label": "Columns" "label": "Columns"
}, },
{ {
"depends_on": "eval: doc.public == false",
"fieldname": "user", "fieldname": "user",
"fieldtype": "Link", "fieldtype": "Link",
"label": "User", "label": "User",
@ -106,11 +109,23 @@
"fieldtype": "Check", "fieldtype": "Check",
"label": "Public" "label": "Public"
}, },
{
"default": "0",
"fieldname": "default",
"fieldtype": "Check",
"label": "Default"
},
{ {
"default": "0", "default": "0",
"fieldname": "is_view", "fieldname": "is_view",
"fieldtype": "Check", "fieldtype": "Check",
"label": "Is View" "label": "Is View"
},
{
"depends_on": "eval: doc.public == true",
"fieldname": "user_list",
"fieldtype": "Text",
"label": "User List"
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,

View File

@ -81,6 +81,60 @@ def pin(name, value):
doc.pinned = value doc.pinned = value
doc.save() doc.save()
@frappe.whitelist()
def make_default(name, doctype, route_name):
existing_default_view = frappe.db.exists("CRM View Settings", {
"default": True,
"user": frappe.session.user
})
if existing_default_view:
frappe.db.set_value("CRM View Settings", existing_default_view, "default", False)
else:
public_default = frappe.db.exists("CRM View Settings", {
"default": True,
"public": True
})
if public_default:
public_default_view = frappe.get_doc("CRM View Settings", public_default)
user_list = json.loads(public_default_view.user_list)
if frappe.session.user in user_list:
updated_user_list = [user for user in user_list if user != frappe.session.user]
if not updated_user_list:
public_default_view.default = False
public_default_view.user_list = None
else:
public_default_view.user_list = json.dumps(updated_user_list)
public_default_view.save()
if not name and doctype:
exists = frappe.db.exists("CRM View Settings", {
"dt": doctype,
"is_view": False,
"user": frappe.session.user
})
if not exists:
doc = frappe.new_doc("CRM View Settings")
doc.label = "List View"
doc.default = True
doc.dt = doctype
doc.route_name = route_name
doc.user = frappe.session.user
doc.is_view = False
doc.insert()
else:
frappe.db.set_value("CRM View Settings", exists, "default", True)
elif frappe.db.get_value("CRM View Settings", name, "public"):
doc = frappe.get_doc("CRM View Settings", name)
doc.default = True
doc.user_list = (
json.dumps([frappe.session.user])
if not doc.user_list
else json.dumps(json.loads(doc.user_list) + [frappe.session.user])
)
doc.save()
else:
frappe.db.set_value("CRM View Settings", name, "default", True)
def remove_duplicates(l): def remove_duplicates(l):
return list(dict.fromkeys(l)) return list(dict.fromkeys(l))

View File

@ -77,6 +77,7 @@ import ViewModal from '@/components/Modals/ViewModal.vue'
import SortBy from '@/components/SortBy.vue' import SortBy from '@/components/SortBy.vue'
import Filter from '@/components/Filter.vue' import Filter from '@/components/Filter.vue'
import ColumnSettings from '@/components/ColumnSettings.vue' import ColumnSettings from '@/components/ColumnSettings.vue'
import { createToast } from '@/utils'
import { globalStore } from '@/stores/global' import { globalStore } from '@/stores/global'
import { viewsStore } from '@/stores/views' import { viewsStore } from '@/stores/views'
import { usersStore } from '@/stores/users' import { usersStore } from '@/stores/users'
@ -97,7 +98,7 @@ const props = defineProps({
}) })
const { $dialog } = globalStore() const { $dialog } = globalStore()
const { reload: reloadView, getView } = viewsStore() const { reload: reloadView, getView, getDefaultView } = viewsStore()
const { isManager } = usersStore() const { isManager } = usersStore()
const list = defineModel() const list = defineModel()
@ -353,6 +354,20 @@ const viewActions = computed(() => {
}, },
] ]
let defaultView = getDefaultView()
if (
!defaultView ||
(route.query.view && route.query.view != defaultView.name) ||
(!route.query.view &&
(defaultView.route_name != route.name || defaultView.is_view))
) {
actions[0].items.push({
label: 'Make Default',
icon: () => h(FeatherIcon, { name: 'star', class: 'h-4 w-4' }),
onClick: () => makeDefault(),
})
}
if (route.query.view && (!view.value.public || isManager())) { if (route.query.view && (!view.value.public || isManager())) {
actions[0].items.push( actions[0].items.push(
{ {
@ -408,6 +423,21 @@ const viewActions = computed(() => {
return actions return actions
}) })
function makeDefault() {
call('crm.fcrm.doctype.crm_view_settings.crm_view_settings.make_default', {
name: route.query.view || '',
doctype: props.doctype,
route_name: route.name,
}).then(() => {
createToast({
title: 'Default View Set',
icon: 'check',
iconClasses: 'text-green-600',
})
reloadView()
})
}
function duplicateView() { function duplicateView() {
view.value.name = '' view.value.name = ''
view.value.label = getView(route.query.view).label + ' New' view.value.label = getView(route.query.view).label + ' New'

View File

@ -1,11 +1,12 @@
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHistory } from 'vue-router'
import { usersStore } from '@/stores/users' import { usersStore } from '@/stores/users'
import { sessionStore } from '@/stores/session' import { sessionStore } from '@/stores/session'
import { viewsStore } from '@/stores/views'
const routes = [ const routes = [
{ {
path: '/', path: '/',
redirect: '/leads', name: 'Home',
}, },
{ {
path: '/leads', path: '/leads',
@ -92,10 +93,22 @@ let router = createRouter({
router.beforeEach(async (to, from, next) => { router.beforeEach(async (to, from, next) => {
const { users } = usersStore() const { users } = usersStore()
const { isLoggedIn } = sessionStore() const { isLoggedIn } = sessionStore()
const { getDefaultView } = viewsStore()
await users.promise await users.promise
if (to.name === 'Login' && isLoggedIn) { if (to.path === '/') {
const defaultView = getDefaultView()
if (defaultView?.route_name) {
if (defaultView.is_view) {
next({ name: defaultView.route_name, query: { view: defaultView.name } })
} else {
next({ name: defaultView.route_name })
}
} else {
next({ name: 'Leads' })
}
} else if (to.name === 'Login' && isLoggedIn) {
next({ name: 'Leads' }) next({ name: 'Leads' })
} else if (to.name !== 'Login' && !isLoggedIn) { } else if (to.name !== 'Login' && !isLoggedIn) {
next({ name: 'Login' }) next({ name: 'Login' })

View File

@ -1,4 +1,5 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { sessionStore } from '@/stores/session'
import { createResource } from 'frappe-ui' import { createResource } from 'frappe-ui'
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
@ -6,12 +7,15 @@ export const viewsStore = defineStore('crm-views', (doctype) => {
let viewsByName = reactive({}) let viewsByName = reactive({})
let pinnedViews = ref([]) let pinnedViews = ref([])
let publicViews = ref([]) let publicViews = ref([])
let defaultView = ref(null)
const { user } = sessionStore()
// Views // Views
const views = createResource({ const views = createResource({
url: 'crm.api.views.get_views', url: 'crm.api.views.get_views',
params: { doctype: doctype || '' }, params: { doctype: doctype || '' },
cache: "crm-views", cache: 'crm-views',
initialData: [], initialData: [],
auto: true, auto: true,
transform(views) { transform(views) {
@ -25,6 +29,15 @@ export const viewsStore = defineStore('crm-views', (doctype) => {
if (view.public) { if (view.public) {
publicViews.value?.push(view) publicViews.value?.push(view)
} }
if (
(!view.public && view.default) ||
(view.public &&
view.default &&
JSON.parse(view.user_list).includes(user))
) {
defaultView.value = view
}
} }
return views return views
}, },
@ -48,6 +61,10 @@ export const viewsStore = defineStore('crm-views', (doctype) => {
return publicViews.value return publicViews.value
} }
function getDefaultView() {
return defaultView.value
}
async function reload() { async function reload() {
await views.reload() await views.reload()
} }
@ -55,6 +72,7 @@ export const viewsStore = defineStore('crm-views', (doctype) => {
return { return {
getPinnedViews, getPinnedViews,
getPublicViews, getPublicViews,
getDefaultView,
reload, reload,
getView, getView,
} }