fix: parse filters,columns & rows first

This commit is contained in:
Shariq Ansari 2024-01-03 17:34:13 +05:30
parent 946c30b387
commit c53a1472c1
3 changed files with 83 additions and 91 deletions

View File

@ -3,42 +3,33 @@
import json import json
import frappe import frappe
from frappe.model.document import Document, get_controller from frappe.model.document import Document, get_controller
from frappe.utils import parse_json
class CRMViewSettings(Document): class CRMViewSettings(Document):
pass pass
@frappe.whitelist() @frappe.whitelist()
def create(view, duplicate=False): def create(view):
view = frappe._dict(view) view = frappe._dict(view)
if duplicate: view.filters = parse_json(view.filters) or {}
view.filters = json.loads(view.filters) view.columns = parse_json(view.columns) or []
view.columns = json.loads(view.columns) view.rows = parse_json(view.rows) or []
view.rows = json.loads(view.rows)
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 = frappe.new_doc("CRM View Settings")
doc.name = view.label doc.name = view.label
doc.label = view.label doc.label = view.label
doc.dt = view.doctype doc.dt = view.doctype
doc.user = frappe.session.user 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.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(view.filters)
if not view.columns: doc.order_by = view.order_by
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.columns = json.dumps(view.columns) doc.columns = json.dumps(view.columns)
doc.rows = json.dumps(view.rows) doc.rows = json.dumps(view.rows)
doc.insert() doc.insert()
@ -47,15 +38,13 @@ def create(view, duplicate=False):
@frappe.whitelist() @frappe.whitelist()
def update(view): def update(view):
view = frappe._dict(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) default_rows = sync_default_list_rows(view.doctype)
columns = view.columns or [] rows = rows + default_rows if default_rows else rows
filters = view.filters
rows = view.rows or []
default_columns = view.default_columns or False
if default_rows:
rows = rows + default_rows
rows = remove_duplicates(rows) rows = remove_duplicates(rows)
doc = frappe.get_doc("CRM View Settings", view.name) doc = frappe.get_doc("CRM View Settings", view.name)

View File

@ -9,7 +9,11 @@
: 'Create View', : 'Create View',
actions: [ actions: [
{ {
label: editMode ? 'Save Changes' : duplicateMode ? 'Duplicate' : 'Create', label: editMode
? 'Save Changes'
: duplicateMode
? 'Duplicate'
: 'Create',
variant: 'solid', variant: 'solid',
onClick: () => (editMode ? update() : create()), onClick: () => (editMode ? update() : create()),
}, },
@ -33,27 +37,11 @@
import { Dialog, FormControl, call } from 'frappe-ui' import { Dialog, FormControl, call } from 'frappe-ui'
import { ref, watch, defineModel, nextTick } from 'vue' 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({ const props = defineProps({
doctype: { doctype: {
type: String, type: String,
required: true, required: true,
}, },
view: {
type: Object,
default: () => {},
},
options: { options: {
type: Object, type: Object,
default: { 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() { async function create() {
props.view.doctype = props.doctype view.value.doctype = props.doctype
let v = await call( let v = await call(
'crm.fcrm.doctype.crm_view_settings.crm_view_settings.create', 'crm.fcrm.doctype.crm_view_settings.crm_view_settings.create',
{ { view: view.value }
view: props.view,
duplicate: duplicateMode.value,
}
) )
show.value = false show.value = false
props.options.afterCreate?.(v, props.view) props.options.afterCreate?.(v, view.value)
} }
async function update() { 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', { await call('crm.fcrm.doctype.crm_view_settings.crm_view_settings.update', {
view: props.view, view: view.value,
}) })
show.value = false show.value = false
props.options.afterUpdate?.(props.view) props.options.afterUpdate?.(view.value)
} }
watch(show, (value) => { watch(show, (value) => {
@ -90,7 +91,7 @@ watch(show, (value) => {
editMode.value = false editMode.value = false
duplicateMode.value = false duplicateMode.value = false
nextTick(() => { nextTick(() => {
_view.value = { ...props.view } _view.value = { ...view.value }
if (_view.value.name) { if (_view.value.name) {
editMode.value = true editMode.value = true
} else if (_view.value.label) { } else if (_view.value.label) {

View File

@ -50,20 +50,17 @@
</div> </div>
<ViewModal <ViewModal
:doctype="doctype" :doctype="doctype"
:view="view"
:options="{ :options="{
afterCreate: (v) => { afterCreate: (v) => {
viewUpdated = false viewUpdated = false
router.push({ name: route.name, query: { view: v.name } }) router.push({ name: route.name, query: { view: v.name } })
}, },
afterUpdate: (v) => { afterUpdate: () => {
viewUpdated = false viewUpdated = false
currentView = { reloadView()
label: v.label,
icon: v.icon || 'list',
}
}, },
}" }"
v-model:view="view"
v-model="showViewModal" v-model="showViewModal"
/> />
</template> </template>
@ -256,6 +253,7 @@ function updateFilter(filters) {
} }
list.value.params = defaultParams.value list.value.params = defaultParams.value
list.value.params.filters = filters list.value.params.filters = filters
view.value.filters = filters
list.value.reload() list.value.reload()
} }
@ -266,6 +264,7 @@ function updateSort(order_by) {
} }
list.value.params = defaultParams.value list.value.params = defaultParams.value
list.value.params.order_by = order_by list.value.params.order_by = order_by
view.value.order_by = order_by
list.value.reload() list.value.reload()
} }
@ -288,7 +287,7 @@ function updateColumns(obj) {
// View Actions // View Actions
const viewActions = computed(() => { const viewActions = computed(() => {
let o = [ let actions = [
{ {
group: 'Default Views', group: 'Default Views',
hideLabel: true, hideLabel: true,
@ -296,33 +295,21 @@ const viewActions = computed(() => {
{ {
label: 'Duplicate', label: 'Duplicate',
icon: () => h(DuplicateIcon, { class: 'h-4 w-4' }), icon: () => h(DuplicateIcon, { class: 'h-4 w-4' }),
onClick: () => { onClick: () => setupDuplicate(),
view.value.name = ''
view.value.label = view.value.label + ' New'
showViewModal.value = true
},
}, },
], ],
}, },
] ]
if (route.query.view) { if (route.query.view) {
o[0].items.push({ actions[0].items.push({
label: view.value.pinned ? 'Unpin View' : 'Pin View', label: view.value.pinned ? 'Unpin View' : 'Pin View',
icon: () => icon: () =>
h(view.value.pinned ? UnpinIcon : PinIcon, { class: 'h-4 w-4' }), h(view.value.pinned ? UnpinIcon : PinIcon, { class: 'h-4 w-4' }),
onClick: () => { onClick: () => 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()
})
},
}) })
o.push({ actions.push({
group: 'Delete View', group: 'Delete View',
hideLabel: true, hideLabel: true,
items: [ items: [
@ -339,18 +326,7 @@ const viewActions = computed(() => {
label: 'Delete', label: 'Delete',
variant: 'solid', variant: 'solid',
theme: 'red', theme: 'red',
onClick: (close) => { onClick: (close) => deleteView(close),
close()
call(
'crm.fcrm.doctype.crm_view_settings.crm_view_settings.delete',
{
name: route.query.view,
}
).then(() => {
router.push({ name: route.name })
reloadView()
})
},
}, },
], ],
}), }),
@ -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() { function cancelChanges() {
reload() reload()
viewUpdated.value = false viewUpdated.value = false