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 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)

View File

@ -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) {

View File

@ -50,20 +50,17 @@
</div>
<ViewModal
:doctype="doctype"
:view="view"
:options="{
afterCreate: (v) => {
viewUpdated = false
router.push({ name: route.name, query: { view: v.name } })
},
afterUpdate: (v) => {
afterUpdate: () => {
viewUpdated = false
currentView = {
label: v.label,
icon: v.icon || 'list',
}
reloadView()
},
}"
v-model:view="view"
v-model="showViewModal"
/>
</template>
@ -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