fix: parse filters,columns & rows first
This commit is contained in:
parent
946c30b387
commit
c53a1472c1
@ -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)
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user