feat: render, update and save group by field value on change of group by field

This commit is contained in:
Shariq Ansari 2024-06-02 00:23:48 +05:30
parent 5248fc51e4
commit 046d30a63f
3 changed files with 69 additions and 13 deletions

View File

@ -35,6 +35,7 @@ def create(view):
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) doc.filters = json.dumps(view.filters)
doc.order_by = view.order_by doc.order_by = view.order_by
doc.group_by_field = view.group_by_field
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()
@ -60,6 +61,7 @@ def update(view):
doc.load_default_columns = view.load_default_columns or False doc.load_default_columns = view.load_default_columns or False
doc.filters = json.dumps(filters) doc.filters = json.dumps(filters)
doc.order_by = view.order_by doc.order_by = view.order_by
doc.group_by_field = view.group_by_field
doc.columns = json.dumps(columns) doc.columns = json.dumps(columns)
doc.rows = json.dumps(rows) doc.rows = json.dumps(rows)
doc.save() doc.save()
@ -139,6 +141,7 @@ def create_or_update_default_view(view):
doc.load_default_columns = view.load_default_columns or False doc.load_default_columns = view.load_default_columns or False
doc.filters = json.dumps(filters) doc.filters = json.dumps(filters)
doc.order_by = view.order_by doc.order_by = view.order_by
doc.group_by_field = view.group_by_field
doc.columns = json.dumps(columns) doc.columns = json.dumps(columns)
doc.rows = json.dumps(rows) doc.rows = json.dumps(rows)
doc.save() doc.save()
@ -154,6 +157,7 @@ def create_or_update_default_view(view):
doc.load_default_columns = view.load_default_columns or False doc.load_default_columns = view.load_default_columns or False
doc.filters = json.dumps(filters) doc.filters = json.dumps(filters)
doc.order_by = view.order_by doc.order_by = view.order_by
doc.group_by_field = view.group_by_field
doc.columns = json.dumps(columns) doc.columns = json.dumps(columns)
doc.rows = json.dumps(rows) doc.rows = json.dumps(rows)
doc.is_default = True doc.is_default = True

View File

@ -1,7 +1,14 @@
<template> <template>
<Dropdown :options="options"> <Autocomplete :options="options" value="" @change="(e) => setGroupBy(e)">
<template #default="{ open }"> <template #target="{ togglePopover }">
<Button :label="hideLabel ? __('Status') : __('Group By: Status')"> <Button
:label="
hideLabel
? groupByValue?.label
: __('Group By: ') + groupByValue?.label
"
@click="togglePopover()"
>
<template #prefix> <template #prefix>
<DetailsIcon /> <DetailsIcon />
</template> </template>
@ -13,12 +20,13 @@
</template> </template>
</Button> </Button>
</template> </template>
</Dropdown> </Autocomplete>
</template> </template>
<script setup> <script setup>
import Autocomplete from '@/components/frappe-ui/Autocomplete.vue'
import DetailsIcon from '@/components/icons/DetailsIcon.vue' import DetailsIcon from '@/components/icons/DetailsIcon.vue'
import { Dropdown } from 'frappe-ui' import { createResource } from 'frappe-ui'
import { ref } from 'vue' import { ref, computed, onMounted, nextTick } from 'vue'
const props = defineProps({ const props = defineProps({
doctype: { doctype: {
@ -31,14 +39,39 @@ const props = defineProps({
}, },
}) })
const emit = defineEmits(['update'])
const list = defineModel() const list = defineModel()
const selected = ref('Status') const groupByValue = ref({
label: 'Owner',
value: 'owner',
})
const options = ref([ const groupByOptions = createResource({
{ label: 'Status', value: 'status' }, url: 'crm.api.doc.get_group_by_fields',
{ label: 'Source', value: 'source' }, cache: ['groupByOptions', props.doctype],
{ label: 'Owner', value: 'owner' }, params: {
{ label: 'Created At', value: 'created_at' }, doctype: props.doctype,
]) },
})
onMounted(() => {
if (groupByOptions.data?.length) return
groupByOptions.fetch()
})
function setGroupBy(data) {
groupByValue.value = data
nextTick(() => emit('update', data.value))
}
const options = computed(() => {
if (!groupByOptions.data) return []
if (!list.value?.data?.group_by_field) return groupByOptions.data
groupByValue.value = list.value.data.group_by_field
return groupByOptions.data.filter(
(option) => option !== groupByValue.value.value
)
})
</script> </script>

View File

@ -415,6 +415,7 @@ function getParams() {
icon: _view.icon, icon: _view.icon,
filters: _view.filters, filters: _view.filters,
order_by: _view.order_by, order_by: _view.order_by,
group_by_field: _view.group_by_field,
columns: _view.columns, columns: _view.columns,
rows: _view.rows, rows: _view.rows,
route_name: _view.route_name, route_name: _view.route_name,
@ -430,6 +431,7 @@ function getParams() {
icon: '', icon: '',
filters: {}, filters: {},
order_by: 'modified desc', order_by: 'modified desc',
group_by_field: 'owner',
columns: '', columns: '',
rows: '', rows: '',
route_name: route.name, route_name: route.name,
@ -676,6 +678,21 @@ function updateSort(order_by) {
} }
} }
function updateGroupBy(group_by_field) {
viewUpdated.value = true
if (!defaultParams.value) {
defaultParams.value = getParams()
}
list.value.params = defaultParams.value
list.value.params.view.group_by_field = group_by_field
view.value.group_by_field = group_by_field
list.value.reload()
if (!route.query.view) {
create_or_update_default_view()
}
}
function updateColumns(obj) { function updateColumns(obj) {
if (!obj) { if (!obj) {
obj = { obj = {
@ -727,6 +744,7 @@ function create_or_update_default_view() {
name: view.value.name, name: view.value.name,
filters: defaultParams.value.filters, filters: defaultParams.value.filters,
order_by: defaultParams.value.order_by, order_by: defaultParams.value.order_by,
group_by_field: defaultParams.value.view.group_by_field,
columns: defaultParams.value.columns, columns: defaultParams.value.columns,
rows: defaultParams.value.rows, rows: defaultParams.value.rows,
route_name: route.name, route_name: route.name,
@ -891,6 +909,7 @@ function saveView() {
name: view.value.name, name: view.value.name,
filters: defaultParams.value.filters, filters: defaultParams.value.filters,
order_by: defaultParams.value.order_by, order_by: defaultParams.value.order_by,
group_by_field: defaultParams.value.view.group_by_field,
columns: defaultParams.value.columns, columns: defaultParams.value.columns,
rows: defaultParams.value.rows, rows: defaultParams.value.rows,
route_name: route.name, route_name: route.name,