fix: added title field in kanban settings

This commit is contained in:
Shariq Ansari 2024-06-26 12:39:58 +05:30
parent 8a6bf057d0
commit 68af1175c4
6 changed files with 95 additions and 13 deletions

View File

@ -207,6 +207,7 @@ def get_data(
page_length=20, page_length=20,
page_length_count=20, page_length_count=20,
column_field=None, column_field=None,
title_field=None,
columns=[], columns=[],
rows=[], rows=[],
kanban_columns=[], kanban_columns=[],
@ -311,6 +312,12 @@ def get_data(
elif field_meta.fieldtype == "Select": elif field_meta.fieldtype == "Select":
kanban_columns = [{"name": option} for option in field_meta.options.split("\n")] kanban_columns = [{"name": option} for option in field_meta.options.split("\n")]
if not title_field:
title_field = "name"
if title_field not in rows:
rows.append(title_field)
if not kanban_fields: if not kanban_fields:
kanban_fields = ["name"] kanban_fields = ["name"]
@ -472,7 +479,7 @@ def get_fields_meta(doctype, restricted_fieldtypes=None, as_array=False):
fields_meta = {} fields_meta = {}
for field in fields: for field in fields:
fields_meta[field.fieldname] = field fields_meta[field.get('fieldname')] = field
return fields_meta return fields_meta

View File

@ -29,6 +29,7 @@
"kanban_tab", "kanban_tab",
"kanban_section", "kanban_section",
"column_field", "column_field",
"title_field",
"kanban_columns", "kanban_columns",
"kanban_fields" "kanban_fields"
], ],
@ -171,11 +172,17 @@
"fieldname": "kanban_fields", "fieldname": "kanban_fields",
"fieldtype": "Code", "fieldtype": "Code",
"label": "Kanban Fields" "label": "Kanban Fields"
},
{
"default": "name",
"fieldname": "title_field",
"fieldtype": "Data",
"label": "Title Field"
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"links": [], "links": [],
"modified": "2024-06-25 17:16:02.876349", "modified": "2024-06-25 19:40:12.067788",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "FCRM", "module": "FCRM",
"name": "CRM View Settings", "name": "CRM View Settings",

View File

@ -41,6 +41,7 @@ def create(view):
doc.order_by = view.order_by doc.order_by = view.order_by
doc.group_by_field = view.group_by_field doc.group_by_field = view.group_by_field
doc.column_field = view.column_field doc.column_field = view.column_field
doc.title_field = view.title_field
doc.kanban_columns = json.dumps(view.kanban_columns) doc.kanban_columns = json.dumps(view.kanban_columns)
doc.kanban_fields = json.dumps(view.kanban_fields) doc.kanban_fields = json.dumps(view.kanban_fields)
doc.columns = json.dumps(view.columns) doc.columns = json.dumps(view.columns)
@ -72,6 +73,7 @@ def update(view):
doc.order_by = view.order_by doc.order_by = view.order_by
doc.group_by_field = view.group_by_field doc.group_by_field = view.group_by_field
doc.column_field = view.column_field doc.column_field = view.column_field
doc.title_field = view.title_field
doc.kanban_columns = json.dumps(kanban_columns) doc.kanban_columns = json.dumps(kanban_columns)
doc.kanban_fields = json.dumps(kanban_fields) doc.kanban_fields = json.dumps(kanban_fields)
doc.columns = json.dumps(columns) doc.columns = json.dumps(columns)
@ -170,6 +172,7 @@ def create_or_update_default_view(view):
doc.order_by = view.order_by doc.order_by = view.order_by
doc.group_by_field = view.group_by_field doc.group_by_field = view.group_by_field
doc.column_field = view.column_field doc.column_field = view.column_field
doc.title_field = view.title_field
doc.kanban_columns = json.dumps(kanban_columns) doc.kanban_columns = json.dumps(kanban_columns)
doc.kanban_fields = json.dumps(kanban_fields) doc.kanban_fields = json.dumps(kanban_fields)
doc.columns = json.dumps(columns) doc.columns = json.dumps(columns)
@ -189,6 +192,7 @@ def create_or_update_default_view(view):
doc.order_by = view.order_by doc.order_by = view.order_by
doc.group_by_field = view.group_by_field doc.group_by_field = view.group_by_field
doc.column_field = view.column_field doc.column_field = view.column_field
doc.title_field = view.title_field
doc.kanban_columns = json.dumps(kanban_columns) doc.kanban_columns = json.dumps(kanban_columns)
doc.kanban_fields = json.dumps(kanban_fields) doc.kanban_fields = json.dumps(kanban_fields)
doc.columns = json.dumps(columns) doc.columns = json.dumps(columns)

View File

@ -16,14 +16,32 @@
v-if="columnFields" v-if="columnFields"
value="" value=""
:options="columnFields" :options="columnFields"
@change="(f) => (column_field = f)" @change="(f) => (columnField = f)"
> >
<template #target="{ togglePopover }"> <template #target="{ togglePopover }">
<Button <Button
class="w-full !justify-start" class="w-full !justify-start"
variant="subtle" variant="subtle"
@click="togglePopover()" @click="togglePopover()"
:label="column_field.label" :label="columnField.label"
/>
</template>
</Autocomplete>
<div class="text-base text-gray-800 mb-2 mt-4">
{{ __('Title Field') }}
</div>
<Autocomplete
v-if="fields.data"
value=""
:options="fields.data"
@change="(f) => (titleField = f)"
>
<template #target="{ togglePopover }">
<Button
class="w-full !justify-start"
variant="subtle"
@click="togglePopover()"
:label="titleField.label"
/> />
</template> </template>
</Autocomplete> </Autocomplete>
@ -110,7 +128,7 @@ const emit = defineEmits(['update'])
const list = defineModel() const list = defineModel()
const showDialog = ref(false) const showDialog = ref(false)
const column_field = computed({ const columnField = computed({
get: () => { get: () => {
let fieldname = list.value?.params?.column_field let fieldname = list.value?.params?.column_field
if (!fieldname) return '' if (!fieldname) return ''
@ -122,16 +140,29 @@ const column_field = computed({
}, },
}) })
const titleField = computed({
get: () => {
let fieldname = list.value?.params?.title_field
if (!fieldname) return ''
return fields.data?.find((field) => field.fieldname === fieldname)
},
set: (val) => {
list.value.params.title_field = val.fieldname
},
})
const columnFields = computed(() => { const columnFields = computed(() => {
return ( return (
fields.data?.filter((field) => ['Link', 'Select'].includes(field.fieldtype)) || fields.data?.filter((field) =>
[] ['Link', 'Select'].includes(field.fieldtype),
) || []
) )
}) })
const fields = createResource({ const fields = createResource({
url: 'crm.api.doc.get_fields_meta', url: 'crm.api.doc.get_fields_meta',
params: { doctype: props.doctype, as_array: true}, params: { doctype: props.doctype, as_array: true },
cache: ['kanban_fields', props.doctype], cache: ['kanban_fields', props.doctype],
auto: true, auto: true,
onSuccess: (data) => { onSuccess: (data) => {
@ -161,7 +192,7 @@ const allFields = computed({
}) })
function reorder() { function reorder() {
allFields.value = allFields.value.map(row => row.fieldname) allFields.value = allFields.value.map((row) => row.fieldname)
} }
function addField(field) { function addField(field) {
@ -181,7 +212,8 @@ function apply() {
nextTick(() => { nextTick(() => {
showDialog.value = false showDialog.value = false
emit('update', { emit('update', {
column_field: column_field.value.fieldname, column_field: columnField.value.fieldname,
title_field: titleField.value.fieldname,
kanban_fields: allFields.value.map((row) => row.fieldname), kanban_fields: allFields.value.map((row) => row.fieldname),
}) })
}) })

View File

@ -76,7 +76,7 @@
<template #item="{ element: fields }"> <template #item="{ element: fields }">
<component <component
:is="options.getRoute ? 'router-link' : 'div'" :is="options.getRoute ? 'router-link' : 'div'"
class="pt-3 px-3.5 pb-2.5 rounded-lg border bg-white text-base flex flex-col gap-2" class="pt-3 px-3.5 pb-2.5 rounded-lg border bg-white text-base flex flex-col"
:data-name="fields.name" :data-name="fields.name"
v-bind="{ v-bind="{
to: options.getRoute ? options.getRoute(fields) : undefined, to: options.getRoute ? options.getRoute(fields) : undefined,
@ -85,8 +85,24 @@
: undefined, : undefined,
}" }"
> >
<div class="h-5 flex items-center">
<div v-if="fields[titleField]">{{ fields[titleField] }}</div>
<div class="text-gray-500" v-else>{{ __('No Title') }}</div>
</div>
<div class="border-b h-px my-2.5" />
<div class="flex flex-col gap-2">
<div v-for="value in column.fields" :key="value"> <div v-for="value in column.fields" :key="value">
<div class="truncate">{{ fields[value] }}</div> <div class="truncate">{{ fields[value] || '-' }}</div>
</div>
</div>
<div class="border-b h-px mt-2.5 mb-2" />
<div class="flex gap-2 items-center justify-between">
<div></div>
<Button
icon="plus"
variant="ghost"
@click.stop.prevent
/>
</div> </div>
</component> </component>
</template> </template>
@ -117,6 +133,10 @@ const emit = defineEmits(['update'])
const kanban = defineModel() const kanban = defineModel()
const titleField = computed(() => {
return kanban.value?.params?.title_field
})
const columns = computed(() => { const columns = computed(() => {
if (!kanban.value?.data?.data || kanban.value.data.view_type != 'kanban') if (!kanban.value?.data?.data || kanban.value.data.view_type != 'kanban')
return [] return []

View File

@ -365,6 +365,7 @@ const view = ref({
filters: {}, filters: {},
order_by: 'modified desc', order_by: 'modified desc',
column_field: 'status', column_field: 'status',
title_field: 'name',
kanban_columns: '', kanban_columns: '',
kanban_fields: '', kanban_fields: '',
columns: '', columns: '',
@ -402,6 +403,7 @@ function getParams() {
const columns = _view?.columns || '' const columns = _view?.columns || ''
const rows = _view?.rows || '' const rows = _view?.rows || ''
const column_field = _view?.column_field || 'status' const column_field = _view?.column_field || 'status'
const title_field = _view?.title_field || 'name'
const kanban_columns = _view?.kanban_columns || '' const kanban_columns = _view?.kanban_columns || ''
const kanban_fields = _view?.kanban_fields || '' const kanban_fields = _view?.kanban_fields || ''
@ -414,6 +416,7 @@ function getParams() {
order_by: order_by, order_by: order_by,
group_by_field: group_by_field, group_by_field: group_by_field,
column_field: column_field, column_field: column_field,
title_field: title_field,
kanban_columns: kanban_columns, kanban_columns: kanban_columns,
kanban_fields: kanban_fields, kanban_fields: kanban_fields,
columns: columns, columns: columns,
@ -435,6 +438,7 @@ function getParams() {
group_by_field: group_by_field, group_by_field: group_by_field,
}, },
column_field: column_field, column_field: column_field,
title_field: title_field,
kanban_columns: kanban_columns, kanban_columns: kanban_columns,
kanban_fields: kanban_fields, kanban_fields: kanban_fields,
columns: columns, columns: columns,
@ -462,6 +466,7 @@ list.value = createResource({
group_by_field: params?.view?.group_by_field || 'owner', group_by_field: params?.view?.group_by_field || 'owner',
}, },
column_field: params.column_field, column_field: params.column_field,
title_field: params.title_field,
kanban_columns: params.kanban_columns, kanban_columns: params.kanban_columns,
kanban_fields: params.kanban_fields, kanban_fields: params.kanban_fields,
columns: data.columns, columns: data.columns,
@ -749,6 +754,10 @@ async function updateKanbanSettings(data) {
list.value.params.column_field = data.column_field list.value.params.column_field = data.column_field
view.value.column_field = data.column_field view.value.column_field = data.column_field
} }
if (data.title_field && data.title_field != view.value.title_field) {
list.value.params.title_field = data.title_field
view.value.title_field = data.title_field
}
if (data.kanban_columns) { if (data.kanban_columns) {
list.value.params.kanban_columns = data.kanban_columns list.value.params.kanban_columns = data.kanban_columns
view.value.kanban_columns = data.kanban_columns view.value.kanban_columns = data.kanban_columns
@ -804,6 +813,7 @@ function create_or_update_default_view() {
order_by: defaultParams.value.order_by, order_by: defaultParams.value.order_by,
group_by_field: defaultParams.value.view?.group_by_field, group_by_field: defaultParams.value.view?.group_by_field,
column_field: defaultParams.value.column_field, column_field: defaultParams.value.column_field,
title_field: defaultParams.value.title_field,
kanban_columns: defaultParams.value.kanban_columns, kanban_columns: defaultParams.value.kanban_columns,
kanban_fields: defaultParams.value.kanban_fields, kanban_fields: defaultParams.value.kanban_fields,
columns: defaultParams.value.columns, columns: defaultParams.value.columns,
@ -827,6 +837,7 @@ function update_custom_view() {
order_by: defaultParams.value.order_by, order_by: defaultParams.value.order_by,
group_by_field: defaultParams.value.view.group_by_field, group_by_field: defaultParams.value.view.group_by_field,
column_field: defaultParams.value.column_field, column_field: defaultParams.value.column_field,
title_field: defaultParams.value.title_field,
kanban_columns: defaultParams.value.kanban_columns, kanban_columns: defaultParams.value.kanban_columns,
kanban_fields: defaultParams.value.kanban_fields, kanban_fields: defaultParams.value.kanban_fields,
columns: defaultParams.value.columns, columns: defaultParams.value.columns,
@ -997,6 +1008,7 @@ function saveView() {
order_by: defaultParams.value.order_by, order_by: defaultParams.value.order_by,
group_by_field: defaultParams.value.view.group_by_field, group_by_field: defaultParams.value.view.group_by_field,
column_field: defaultParams.value.column_field, column_field: defaultParams.value.column_field,
title_field: defaultParams.value.title_field,
kanban_columns: defaultParams.value.kanban_columns, kanban_columns: defaultParams.value.kanban_columns,
kanban_fields: defaultParams.value.kanban_fields, kanban_fields: defaultParams.value.kanban_fields,
columns: defaultParams.value.columns, columns: defaultParams.value.columns,