Merge pull request #59 from shariquerik/default-view
feat: Make Default View
This commit is contained in:
commit
e5d8718071
@ -212,7 +212,7 @@ def get_list_data(
|
|||||||
"page_length": page_length,
|
"page_length": page_length,
|
||||||
"page_length_count": page_length_count,
|
"page_length_count": page_length_count,
|
||||||
"is_default": is_default,
|
"is_default": is_default,
|
||||||
"views": get_views(doctype),
|
"views": get_views(doctype, is_view=True),
|
||||||
"total_count": frappe.client.get_count(doctype, filters=filters),
|
"total_count": frappe.client.get_count(doctype, filters=filters),
|
||||||
"row_count": len(data),
|
"row_count": len(data),
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,7 +3,7 @@ from pypika import Criterion
|
|||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_views(doctype):
|
def get_views(doctype, is_view=False):
|
||||||
if frappe.session.user == "Guest":
|
if frappe.session.user == "Guest":
|
||||||
frappe.throw("Authentication failed", exc=frappe.AuthenticationError)
|
frappe.throw("Authentication failed", exc=frappe.AuthenticationError)
|
||||||
|
|
||||||
@ -13,6 +13,8 @@ def get_views(doctype):
|
|||||||
.select("*")
|
.select("*")
|
||||||
.where(Criterion.any([View.user == '', View.user == frappe.session.user]))
|
.where(Criterion.any([View.user == '', View.user == frappe.session.user]))
|
||||||
)
|
)
|
||||||
|
if is_view:
|
||||||
|
query = query.where(View.is_view == True)
|
||||||
if doctype:
|
if 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)
|
||||||
|
|||||||
@ -7,11 +7,14 @@
|
|||||||
"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",
|
||||||
"columns_tab",
|
"columns_tab",
|
||||||
"load_default_columns",
|
"load_default_columns",
|
||||||
"columns",
|
"columns",
|
||||||
@ -28,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",
|
||||||
@ -104,11 +108,29 @@
|
|||||||
"fieldname": "public",
|
"fieldname": "public",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"label": "Public"
|
"label": "Public"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "default",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"label": "Default"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"default": "0",
|
||||||
|
"fieldname": "is_view",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"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,
|
||||||
"links": [],
|
"links": [],
|
||||||
"modified": "2024-01-19 21:44:52.285420",
|
"modified": "2024-01-22 21:44:41.733977",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "FCRM",
|
"module": "FCRM",
|
||||||
"name": "CRM View Settings",
|
"name": "CRM View Settings",
|
||||||
|
|||||||
@ -24,6 +24,7 @@ def create(view):
|
|||||||
doc = frappe.new_doc("CRM View Settings")
|
doc = frappe.new_doc("CRM View Settings")
|
||||||
doc.name = view.label
|
doc.name = view.label
|
||||||
doc.label = view.label
|
doc.label = view.label
|
||||||
|
doc.is_view = True
|
||||||
doc.dt = view.doctype
|
doc.dt = view.doctype
|
||||||
doc.user = frappe.session.user
|
doc.user = frappe.session.user
|
||||||
doc.route_name = view.route_name or ""
|
doc.route_name = view.route_name or ""
|
||||||
@ -49,6 +50,7 @@ def update(view):
|
|||||||
|
|
||||||
doc = frappe.get_doc("CRM View Settings", view.name)
|
doc = frappe.get_doc("CRM View Settings", view.name)
|
||||||
doc.label = view.label
|
doc.label = view.label
|
||||||
|
doc.is_view = True
|
||||||
doc.route_name = view.route_name or ""
|
doc.route_name = view.route_name or ""
|
||||||
doc.load_default_columns = view.load_default_columns or False
|
doc.load_default_columns = view.load_default_columns or False
|
||||||
doc.filters = json.dumps(filters)
|
doc.filters = json.dumps(filters)
|
||||||
@ -79,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))
|
||||||
|
|
||||||
|
|||||||
@ -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'
|
||||||
|
|||||||
@ -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' })
|
||||||
|
|||||||
@ -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,
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user