From c53a1472c14c9965998fe92e69fbbc8e0f56fb47 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Wed, 3 Jan 2024 17:34:13 +0530 Subject: [PATCH] fix: parse filters,columns & rows first --- .../crm_view_settings/crm_view_settings.py | 45 +++++------ frontend/src/components/Modals/ViewModal.vue | 55 +++++++------- frontend/src/components/ViewControls.vue | 74 ++++++++++--------- 3 files changed, 83 insertions(+), 91 deletions(-) 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 297a6d44..5eba8b6e 100644 --- a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py +++ b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py @@ -3,42 +3,33 @@ import json import frappe from frappe.model.document import Document, get_controller +from frappe.utils import parse_json class CRMViewSettings(Document): pass @frappe.whitelist() -def create(view, duplicate=False): +def create(view): view = frappe._dict(view) - if duplicate: - view.filters = json.loads(view.filters) - view.columns = json.loads(view.columns) - view.rows = json.loads(view.rows) + view.filters = parse_json(view.filters) or {} + view.columns = parse_json(view.columns) or [] + view.rows = parse_json(view.rows) or [] + + default_rows = sync_default_list_rows(view.doctype) + view.rows = view.rows + default_rows if default_rows else view.rows + view.rows = remove_duplicates(view.rows) doc = frappe.new_doc("CRM View Settings") doc.name = view.label doc.label = view.label doc.dt = view.doctype doc.user = frappe.session.user - doc.filters = json.dumps(view.filters) - doc.order_by = view.order_by doc.route_name = view.route_name or "" doc.load_default_columns = view.load_default_columns or False - - if not view.columns: - view.columns = [] - if not view.rows: - view.rows = [] - - default_rows = sync_default_list_rows(view.doctype) - - if default_rows: - view.rows = view.rows + default_rows - - view.rows = remove_duplicates(view.rows) - + doc.filters = json.dumps(view.filters) + doc.order_by = view.order_by doc.columns = json.dumps(view.columns) doc.rows = json.dumps(view.rows) doc.insert() @@ -47,15 +38,13 @@ def create(view, duplicate=False): @frappe.whitelist() def update(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) - columns = view.columns or [] - filters = view.filters - rows = view.rows or [] - default_columns = view.default_columns or False - - if default_rows: - rows = rows + default_rows - + rows = rows + default_rows if default_rows else rows rows = remove_duplicates(rows) doc = frappe.get_doc("CRM View Settings", view.name) diff --git a/frontend/src/components/Modals/ViewModal.vue b/frontend/src/components/Modals/ViewModal.vue index c7ec2046..a6e1a82d 100644 --- a/frontend/src/components/Modals/ViewModal.vue +++ b/frontend/src/components/Modals/ViewModal.vue @@ -9,7 +9,11 @@ : 'Create View', actions: [ { - label: editMode ? 'Save Changes' : duplicateMode ? 'Duplicate' : 'Create', + label: editMode + ? 'Save Changes' + : duplicateMode + ? 'Duplicate' + : 'Create', variant: 'solid', onClick: () => (editMode ? update() : create()), }, @@ -33,27 +37,11 @@ import { Dialog, FormControl, call } from 'frappe-ui' import { ref, watch, defineModel, nextTick } from 'vue' -const show = defineModel() -const editMode = ref(false) -const duplicateMode = ref(false) -const _view = ref({ - name: '', - label: '', - filters: {}, - order_by: 'modified desc', - columns: '', - rows: '', -}) - const props = defineProps({ doctype: { type: String, required: true, }, - view: { - type: Object, - default: () => {}, - }, options: { type: Object, default: { @@ -63,26 +51,39 @@ const props = defineProps({ }, }) + +const show = defineModel() +const view = defineModel('view') + +const editMode = ref(false) +const duplicateMode = ref(false) + +const _view = ref({ + name: '', + label: '', + filters: {}, + order_by: 'modified desc', + columns: '', + rows: '', +}) + async function create() { - props.view.doctype = props.doctype + view.value.doctype = props.doctype let v = await call( 'crm.fcrm.doctype.crm_view_settings.crm_view_settings.create', - { - view: props.view, - duplicate: duplicateMode.value, - } + { view: view.value } ) show.value = false - props.options.afterCreate?.(v, props.view) + props.options.afterCreate?.(v, view.value) } async function update() { - props.view.doctype = props.doctype + view.value.doctype = props.doctype await call('crm.fcrm.doctype.crm_view_settings.crm_view_settings.update', { - view: props.view, + view: view.value, }) show.value = false - props.options.afterUpdate?.(props.view) + props.options.afterUpdate?.(view.value) } watch(show, (value) => { @@ -90,7 +91,7 @@ watch(show, (value) => { editMode.value = false duplicateMode.value = false nextTick(() => { - _view.value = { ...props.view } + _view.value = { ...view.value } if (_view.value.name) { editMode.value = true } else if (_view.value.label) { diff --git a/frontend/src/components/ViewControls.vue b/frontend/src/components/ViewControls.vue index 495be54e..e52aadc1 100644 --- a/frontend/src/components/ViewControls.vue +++ b/frontend/src/components/ViewControls.vue @@ -50,20 +50,17 @@ @@ -256,6 +253,7 @@ function updateFilter(filters) { } list.value.params = defaultParams.value list.value.params.filters = filters + view.value.filters = filters list.value.reload() } @@ -266,6 +264,7 @@ function updateSort(order_by) { } list.value.params = defaultParams.value list.value.params.order_by = order_by + view.value.order_by = order_by list.value.reload() } @@ -288,7 +287,7 @@ function updateColumns(obj) { // View Actions const viewActions = computed(() => { - let o = [ + let actions = [ { group: 'Default Views', hideLabel: true, @@ -296,33 +295,21 @@ const viewActions = computed(() => { { label: 'Duplicate', icon: () => h(DuplicateIcon, { class: 'h-4 w-4' }), - onClick: () => { - view.value.name = '' - view.value.label = view.value.label + ' New' - showViewModal.value = true - }, + onClick: () => setupDuplicate(), }, ], }, ] if (route.query.view) { - o[0].items.push({ + actions[0].items.push({ label: view.value.pinned ? 'Unpin View' : 'Pin View', icon: () => h(view.value.pinned ? UnpinIcon : PinIcon, { class: 'h-4 w-4' }), - onClick: () => { - call('crm.fcrm.doctype.crm_view_settings.crm_view_settings.pin', { - name: route.query.view, - value: !view.value.pinned, - }).then(() => { - view.value.pinned = !view.value.pinned - reloadView() - }) - }, + onClick: () => pinView(), }) - o.push({ + actions.push({ group: 'Delete View', hideLabel: true, items: [ @@ -339,18 +326,7 @@ const viewActions = computed(() => { label: 'Delete', variant: 'solid', theme: 'red', - onClick: (close) => { - close() - call( - 'crm.fcrm.doctype.crm_view_settings.crm_view_settings.delete', - { - name: route.query.view, - } - ).then(() => { - router.push({ name: route.name }) - reloadView() - }) - }, + onClick: (close) => deleteView(close), }, ], }), @@ -358,9 +334,35 @@ const viewActions = computed(() => { ], }) } - return o + return actions }) +function setupDuplicate() { + view.value.name = '' + view.value.label = view.value.label + ' New' + showViewModal.value = true +} + +function pinView() { + call('crm.fcrm.doctype.crm_view_settings.crm_view_settings.pin', { + name: route.query.view, + value: !view.value.pinned, + }).then(() => { + view.value.pinned = !view.value.pinned + reloadView() + }) +} + +function deleteView(close) { + call('crm.fcrm.doctype.crm_view_settings.crm_view_settings.delete', { + name: route.query.view, + }).then(() => { + router.push({ name: route.name }) + reloadView() + }) + close() +} + function cancelChanges() { reload() viewUpdated.value = false