fix: added kanban_columns && kanban_fields instead of using columns & rows

This commit is contained in:
Shariq Ansari 2024-06-25 18:14:13 +05:30
parent 59d5a9d31a
commit 5ae3d8f44e
5 changed files with 102 additions and 47 deletions

View File

@ -209,6 +209,8 @@ def get_data(
column_field=None, column_field=None,
columns=[], columns=[],
rows=[], rows=[],
kanban_columns=[],
kanban_fields=[],
view=None, view=None,
default_filters=None, default_filters=None,
): ):
@ -216,6 +218,8 @@ def get_data(
filters = frappe._dict(filters) filters = frappe._dict(filters)
rows = frappe.parse_json(rows or "[]") rows = frappe.parse_json(rows or "[]")
columns = frappe.parse_json(columns or "[]") columns = frappe.parse_json(columns or "[]")
kanban_fields = frappe.parse_json(kanban_fields or "[]")
kanban_columns = frappe.parse_json(kanban_columns or "[]")
custom_view_name = view.get('custom_view_name') if view else None custom_view_name = view.get('custom_view_name') if view else None
view_type = view.get('view_type') if view else None view_type = view.get('view_type') if view else None
@ -240,6 +244,8 @@ def get_data(
is_default = True is_default = True
data = [] data = []
_list = get_controller(doctype) _list = get_controller(doctype)
if hasattr(_list, "default_list_data"):
rows = _list.default_list_data().get("rows")
if view_type != "kanban": if view_type != "kanban":
if columns or rows: if columns or rows:
@ -272,9 +278,6 @@ def get_data(
elif not custom_view or is_default and hasattr(_list, "default_list_data"): elif not custom_view or is_default and hasattr(_list, "default_list_data"):
columns = _list.default_list_data().get("columns") columns = _list.default_list_data().get("columns")
if hasattr(_list, "default_list_data"):
rows = _list.default_list_data().get("rows")
# check if rows has all keys from columns if not add them # check if rows has all keys from columns if not add them
for column in columns: for column in columns:
if column.get("key") not in rows: if column.get("key") not in rows:
@ -297,30 +300,30 @@ def get_data(
) or [] ) or []
if view_type == "kanban": if view_type == "kanban":
if not columns and column_field: if not kanban_columns and column_field:
field_meta = frappe.get_meta(doctype).get_field(column_field) field_meta = frappe.get_meta(doctype).get_field(column_field)
if field_meta.fieldtype == "Link": if field_meta.fieldtype == "Link":
columns = frappe.get_all( kanban_columns = frappe.get_all(
field_meta.options, field_meta.options,
fields=["name"], fields=["name"],
order_by="modified asc", order_by="modified asc",
) )
elif field_meta.fieldtype == "Select": elif field_meta.fieldtype == "Select":
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 kanban_fields:
kanban_fields = ["name"]
if not rows: if "name" not in kanban_fields:
rows = ["name"] kanban_fields.append("name")
if hasattr(_list, "default_list_data"): for field in kanban_fields:
rows = _list.default_list_data().get("rows") if field not in rows:
rows.append(field)
if "name" not in rows: for kc in kanban_columns:
rows.append("name") column_filters = { column_field: kc.get('name') }
if column_field in filters and filters.get(column_field) != kc.name:
for column in columns:
column_filters = { column_field: column.get('name') }
if column_field in filters and filters.get(column_field) != column.name:
column_data = [] column_data = []
else: else:
column_filters.update(filters.copy()) column_filters.update(filters.copy())
@ -332,13 +335,13 @@ def get_data(
page_length=20, page_length=20,
) )
if column.get("order"): if kc.get("order"):
column_data = sorted( column_data = sorted(
column_data, key=lambda x: column.get("order").index(x.get("name")) column_data, key=lambda x: kc.get("order").index(x.get("name"))
if x.get("name") in column.get("order") else 0 if x.get("name") in kc.get("order") else 0
) )
data.append({"column": column, "data": column_data, "count": len(column_data)}) data.append({"column": kc, "fields": kanban_fields, "data": column_data, "count": len(column_data)})
fields = frappe.get_meta(doctype).fields fields = frappe.get_meta(doctype).fields
fields = [field for field in fields if field.fieldtype not in no_value_fields] fields = [field for field in fields if field.fieldtype not in no_value_fields]

View File

@ -19,16 +19,18 @@
"filters", "filters",
"order_by_tab", "order_by_tab",
"order_by", "order_by",
"list_kanban_tab", "list_tab",
"list_section", "list_section",
"load_default_columns", "load_default_columns",
"kanban_section",
"column_field",
"section_break_ndtv",
"columns", "columns",
"rows", "rows",
"group_by_tab", "group_by_tab",
"group_by_field" "group_by_field",
"kanban_tab",
"kanban_section",
"column_field",
"kanban_columns",
"kanban_fields"
], ],
"fields": [ "fields": [
{ {
@ -137,20 +139,13 @@
"fieldtype": "Data", "fieldtype": "Data",
"label": "Group By Field" "label": "Group By Field"
}, },
{
"fieldname": "list_kanban_tab",
"fieldtype": "Tab Break",
"label": "List/Kanban"
},
{ {
"fieldname": "list_section", "fieldname": "list_section",
"fieldtype": "Section Break", "fieldtype": "Section Break"
"label": "List"
}, },
{ {
"fieldname": "kanban_section", "fieldname": "kanban_section",
"fieldtype": "Section Break", "fieldtype": "Section Break"
"label": "Kanban"
}, },
{ {
"fieldname": "column_field", "fieldname": "column_field",
@ -158,13 +153,29 @@
"label": "Column Field" "label": "Column Field"
}, },
{ {
"fieldname": "section_break_ndtv", "fieldname": "list_tab",
"fieldtype": "Section Break" "fieldtype": "Tab Break",
"label": "List"
},
{
"fieldname": "kanban_tab",
"fieldtype": "Tab Break",
"label": "Kanban"
},
{
"fieldname": "kanban_columns",
"fieldtype": "Code",
"label": "Kanban Columns"
},
{
"fieldname": "kanban_fields",
"fieldtype": "Code",
"label": "Kanban Fields"
} }
], ],
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"links": [], "links": [],
"modified": "2024-06-21 14:12:41.246707", "modified": "2024-06-25 17:16:02.876349",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "FCRM", "module": "FCRM",
"name": "CRM View Settings", "name": "CRM View Settings",

View File

@ -16,12 +16,16 @@ def create(view):
view.filters = parse_json(view.filters) or {} view.filters = parse_json(view.filters) or {}
view.columns = parse_json(view.columns or '[]') view.columns = parse_json(view.columns or '[]')
view.rows = parse_json(view.rows or '[]') view.rows = parse_json(view.rows or '[]')
view.kanban_columns = parse_json(view.kanban_columns or '[]')
view.kanban_fields = parse_json(view.kanban_fields or '[]')
default_rows = sync_default_rows(view.doctype) default_rows = sync_default_rows(view.doctype)
view.rows = view.rows + default_rows if default_rows else view.rows view.rows = view.rows + default_rows if default_rows else view.rows
view.rows = remove_duplicates(view.rows) view.rows = remove_duplicates(view.rows)
if not view.columns: if not view.kanban_columns and view.type == "kanban":
view.kanban_columns = sync_default_columns(view)
elif not view.columns:
view.columns = sync_default_columns(view) view.columns = sync_default_columns(view)
doc = frappe.new_doc("CRM View Settings") doc = frappe.new_doc("CRM View Settings")
@ -37,6 +41,8 @@ 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.kanban_columns = json.dumps(view.kanban_columns)
doc.kanban_fields = json.dumps(view.kanban_fields)
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()
@ -49,6 +55,8 @@ def update(view):
filters = parse_json(view.filters) or {} filters = parse_json(view.filters) or {}
columns = parse_json(view.columns) or [] columns = parse_json(view.columns) or []
rows = parse_json(view.rows) or [] rows = parse_json(view.rows) or []
kanban_columns = parse_json(view.kanban_columns) or []
kanban_fields = parse_json(view.kanban_fields) or []
default_rows = sync_default_rows(view.doctype) default_rows = sync_default_rows(view.doctype)
rows = rows + default_rows if default_rows else rows rows = rows + default_rows if default_rows else rows
@ -64,6 +72,8 @@ 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.kanban_columns = json.dumps(kanban_columns)
doc.kanban_fields = json.dumps(kanban_fields)
doc.columns = json.dumps(columns) doc.columns = json.dumps(columns)
doc.rows = json.dumps(rows) doc.rows = json.dumps(rows)
doc.save() doc.save()
@ -129,12 +139,16 @@ def create_or_update_default_view(view):
filters = parse_json(view.filters) or {} filters = parse_json(view.filters) or {}
columns = parse_json(view.columns or '[]') columns = parse_json(view.columns or '[]')
rows = parse_json(view.rows or '[]') rows = parse_json(view.rows or '[]')
kanban_columns = parse_json(view.kanban_columns or '[]')
kanban_fields = parse_json(view.kanban_fields or '[]')
default_rows = sync_default_rows(view.doctype, view.type) default_rows = sync_default_rows(view.doctype, view.type)
rows = rows + default_rows if default_rows else rows rows = rows + default_rows if default_rows else rows
rows = remove_duplicates(rows) rows = remove_duplicates(rows)
if not columns: if not kanban_columns and view.type == "kanban":
kanban_columns = sync_default_columns(view)
elif not columns:
columns = sync_default_columns(view) columns = sync_default_columns(view)
doc = frappe.db.exists( doc = frappe.db.exists(
@ -156,6 +170,8 @@ 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.kanban_columns = json.dumps(kanban_columns)
doc.kanban_fields = json.dumps(kanban_fields)
doc.columns = json.dumps(columns) doc.columns = json.dumps(columns)
doc.rows = json.dumps(rows) doc.rows = json.dumps(rows)
doc.save() doc.save()
@ -173,6 +189,8 @@ 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.kanban_columns = json.dumps(kanban_columns)
doc.kanban_fields = json.dumps(kanban_fields)
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

@ -4,7 +4,7 @@
:list="columns" :list="columns"
item-key="column" item-key="column"
@end="updateColumn" @end="updateColumn"
class="flex sm:mx-2.5 mx-2 pb-3.5 overflow-x-auto" class="flex sm:mx-2.5 mx-2 pb-3.5 overflow-x-auto h-full"
> >
<template #item="{ element: column }"> <template #item="{ element: column }">
<div <div
@ -85,8 +85,8 @@
: undefined, : undefined,
}" }"
> >
<div v-for="value in fields" :key="value"> <div v-for="value in column.fields" :key="value">
<div class="truncate">{{ value }}</div> <div class="truncate">{{ fields[value] }}</div>
</div> </div>
</component> </component>
</template> </template>
@ -162,10 +162,10 @@ function updateColumn({ item, from, to }) {
_columns.push(col.column) _columns.push(col.column)
}) })
let data = { columns: _columns } let data = { kanban_columns: _columns }
if (toColumn != fromColumn) { if (toColumn != fromColumn) {
data = { item: itemName, to: toColumn, columns: _columns } data = { item: itemName, to: toColumn, kanban_columns: _columns }
} }
emit('update', data) emit('update', data)

View File

@ -365,6 +365,8 @@ const view = ref({
filters: {}, filters: {},
order_by: 'modified desc', order_by: 'modified desc',
column_field: 'status', column_field: 'status',
kanban_columns: '',
kanban_fields: '',
columns: '', columns: '',
rows: '', rows: '',
load_default_columns: false, load_default_columns: false,
@ -400,6 +402,8 @@ 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 kanban_columns = _view?.kanban_columns || ''
const kanban_fields = _view?.kanban_fields || ''
view.value = { view.value = {
name: view_name, name: view_name,
@ -410,6 +414,8 @@ 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,
kanban_columns: kanban_columns,
kanban_fields: kanban_fields,
columns: columns, columns: columns,
rows: rows, rows: rows,
route_name: _view?.route_name || route.name, route_name: _view?.route_name || route.name,
@ -429,6 +435,8 @@ function getParams() {
group_by_field: group_by_field, group_by_field: group_by_field,
}, },
column_field: column_field, column_field: column_field,
kanban_columns: kanban_columns,
kanban_fields: kanban_fields,
columns: columns, columns: columns,
rows: rows, rows: rows,
page_length: pageLength.value, page_length: pageLength.value,
@ -454,6 +462,8 @@ 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,
kanban_columns: data.columns,
kanban_fields: data.kanban_fields,
columns: data.columns, columns: data.columns,
rows: data.rows, rows: data.rows,
page_length: params.page_length, page_length: params.page_length,
@ -735,12 +745,19 @@ async function updateKanbanSettings(data) {
defaultParams.value = getParams() defaultParams.value = getParams()
} }
list.value.params = defaultParams.value list.value.params = defaultParams.value
if (data.column_field) { if (data.column_field && data.column_field != view.value.column_field) {
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
} }
list.value.params.columns = data.columns ? data.columns : '' if (data.kanban_columns) {
view.value.columns = data.columns ? data.columns : '' list.value.params.kanban_columns = data.kanban_columns
view.value.kanban_columns = data.kanban_columns
}
if (data.kanban_fields) {
list.value.params.kanban_fields = data.kanban_fields
view.value.kanban_fields = data.kanban_fields
}
list.value.reload() list.value.reload()
if (!route.query.view) { if (!route.query.view) {
@ -787,6 +804,8 @@ 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,
kanban_columns: defaultParams.value.kanban_columns,
kanban_fields: defaultParams.value.kanban_fields,
columns: defaultParams.value.columns, columns: defaultParams.value.columns,
rows: defaultParams.value.rows, rows: defaultParams.value.rows,
route_name: route.name, route_name: route.name,
@ -808,6 +827,8 @@ 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,
kanban_columns: defaultParams.value.kanban_columns,
kanban_fields: defaultParams.value.kanban_fields,
columns: defaultParams.value.columns, columns: defaultParams.value.columns,
rows: defaultParams.value.rows, rows: defaultParams.value.rows,
route_name: route.name, route_name: route.name,
@ -976,6 +997,8 @@ 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,
kanban_columns: defaultParams.value.kanban_columns,
kanban_fields: defaultParams.value.kanban_fields,
columns: defaultParams.value.columns, columns: defaultParams.value.columns,
rows: defaultParams.value.rows, rows: defaultParams.value.rows,
route_name: route.name, route_name: route.name,