fix: use standard listview as default view

auto save changes in default view
This commit is contained in:
Shariq Ansari 2024-02-03 19:51:40 +05:30
parent 2f89e9bbfb
commit 9b12cbaffe
4 changed files with 103 additions and 10 deletions

View File

@ -7,6 +7,7 @@
"field_order": [ "field_order": [
"label", "label",
"user", "user",
"is_default",
"column_break_zacm", "column_break_zacm",
"dt", "dt",
"route_name", "route_name",
@ -104,11 +105,17 @@
"fieldname": "public", "fieldname": "public",
"fieldtype": "Check", "fieldtype": "Check",
"label": "Public" "label": "Public"
},
{
"default": "0",
"fieldname": "is_default",
"fieldtype": "Check",
"label": "Is Default"
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"links": [], "links": [],
"modified": "2024-02-03 18:22:48.406099", "modified": "2024-02-03 18:38:09.412745",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "FCRM", "module": "FCRM",
"name": "CRM View Settings", "name": "CRM View Settings",

View File

@ -21,6 +21,9 @@ def create(view):
view.rows = view.rows + default_rows if default_rows else view.rows view.rows = view.rows + default_rows if default_rows else view.rows
view.rows = remove_duplicates(view.rows) view.rows = remove_duplicates(view.rows)
if not view.columns:
view.columns = sync_default_list_columns(view.doctype)
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
@ -90,3 +93,57 @@ def sync_default_list_rows(doctype):
rows = list.default_list_data().get("rows") rows = list.default_list_data().get("rows")
return rows return rows
def sync_default_list_columns(doctype):
list = get_controller(doctype)
columns = []
if hasattr(list, "default_list_data"):
columns = list.default_list_data().get("columns")
return columns
@frappe.whitelist()
def create_or_update_default_view(view):
view = frappe._dict(view)
filters = parse_json(view.filters) or {}
columns = parse_json(view.columns or '[]')
rows = parse_json(view.rows or '[]')
default_rows = sync_default_list_rows(view.doctype)
rows = rows + default_rows if default_rows else rows
rows = remove_duplicates(rows)
if not columns:
columns = sync_default_list_columns(view.doctype)
doc = frappe.db.exists(
"CRM View Settings",
{"dt": view.doctype, "is_default": True, "user": frappe.session.user},
)
if doc:
doc = frappe.get_doc("CRM View Settings", doc)
doc.label = view.label
doc.route_name = view.route_name or ""
doc.load_default_columns = view.load_default_columns or False
doc.filters = json.dumps(filters)
doc.order_by = view.order_by
doc.columns = json.dumps(columns)
doc.rows = json.dumps(rows)
doc.save()
else:
doc = frappe.new_doc("CRM View Settings")
doc.name = view.label or 'List View'
doc.label = view.label or 'List View'
doc.dt = view.doctype
doc.user = frappe.session.user
doc.route_name = view.route_name or ""
doc.load_default_columns = view.load_default_columns or False
doc.filters = json.dumps(filters)
doc.order_by = view.order_by
doc.columns = json.dumps(columns)
doc.rows = json.dumps(rows)
doc.is_default = True
doc.insert()

View File

@ -26,14 +26,11 @@
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<div <div
v-if="viewUpdated && (!view.public || isManager())" v-if="viewUpdated && route.query.view && (!view.public || isManager())"
class="flex items-center gap-2 border-r pr-2" class="flex items-center gap-2 border-r pr-2"
> >
<Button label="Cancel" @click="cancelChanges" /> <Button label="Cancel" @click="cancelChanges" />
<Button <Button label="Save Changes" @click="saveView" />
:label="view?.name ? 'Save Changes' : 'Create View'"
@click="saveView"
/>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<Filter <Filter
@ -154,7 +151,7 @@ watch(
) )
function getParams() { function getParams() {
let _view = getView(route.query.view) let _view = getView(route.query.view, props.doctype)
const filters = (_view?.filters && JSON.parse(_view.filters)) || {} const filters = (_view?.filters && JSON.parse(_view.filters)) || {}
const order_by = _view?.order_by || 'modified desc' const order_by = _view?.order_by || 'modified desc'
const columns = _view?.columns || '' const columns = _view?.columns || ''
@ -266,7 +263,9 @@ const viewsDropdownOptions = computed(() => {
} }
}) })
let publicViews = list.value.data.views.filter((v) => v.public) let publicViews = list.value.data.views.filter((v) => v.public)
let savedViews = list.value.data.views.filter((v) => !v.pinned && !v.public) let savedViews = list.value.data.views.filter(
(v) => !v.pinned && !v.public && !v.is_default
)
let pinnedViews = list.value.data.views.filter((v) => v.pinned) let pinnedViews = list.value.data.views.filter((v) => v.pinned)
publicViews.length && publicViews.length &&
@ -299,6 +298,10 @@ function updateFilter(filters) {
list.value.params.filters = filters list.value.params.filters = filters
view.value.filters = filters view.value.filters = filters
list.value.reload() list.value.reload()
if (!route.query.view) {
create_or_update_default_view()
}
} }
function updateSort(order_by) { function updateSort(order_by) {
@ -310,6 +313,10 @@ function updateSort(order_by) {
list.value.params.order_by = order_by list.value.params.order_by = order_by
view.value.order_by = order_by view.value.order_by = order_by
list.value.reload() list.value.reload()
if (!route.query.view) {
create_or_update_default_view()
}
} }
function updateColumns(obj) { function updateColumns(obj) {
@ -329,6 +336,21 @@ function updateColumns(obj) {
list.value.reload() list.value.reload()
} }
viewUpdated.value = true viewUpdated.value = true
if (!route.query.view) {
create_or_update_default_view()
}
}
function create_or_update_default_view() {
if (route.query.view) return
view.value.doctype = props.doctype
call(
'crm.fcrm.doctype.crm_view_settings.crm_view_settings.create_or_update_default_view',
{
view: view.value,
}
).then(() => reloadView())
} }
function updatePageLength(value, loadMore = false) { function updatePageLength(value, loadMore = false) {

View File

@ -6,6 +6,7 @@ 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({})
// Views // Views
const views = createResource({ const views = createResource({
@ -25,13 +26,18 @@ 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) {
defaultView.value[view.dt] = view
}
} }
return views return views
}, },
}) })
function getView(view) { function getView(view, doctype = null) {
if (!view) return null if (!view && doctype) {
return defaultView.value?.[doctype] || null
}
return viewsByName[view] return viewsByName[view]
} }
@ -51,6 +57,7 @@ export const viewsStore = defineStore('crm-views', (doctype) => {
return { return {
views, views,
defaultView,
getPinnedViews, getPinnedViews,
getPublicViews, getPublicViews,
reload, reload,