From 5ae3d8f44e17f3b753c82f005f0a587095cc975e Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Tue, 25 Jun 2024 18:14:13 +0530 Subject: [PATCH] fix: added kanban_columns && kanban_fields instead of using columns & rows --- crm/api/doc.py | 43 +++++++++--------- .../crm_view_settings/crm_view_settings.json | 45 ++++++++++++------- .../crm_view_settings/crm_view_settings.py | 22 ++++++++- frontend/src/components/Kanban/KanbanView.vue | 10 ++--- frontend/src/components/ViewControls.vue | 29 ++++++++++-- 5 files changed, 102 insertions(+), 47 deletions(-) diff --git a/crm/api/doc.py b/crm/api/doc.py index 57dc3684..8ce19d51 100644 --- a/crm/api/doc.py +++ b/crm/api/doc.py @@ -209,6 +209,8 @@ def get_data( column_field=None, columns=[], rows=[], + kanban_columns=[], + kanban_fields=[], view=None, default_filters=None, ): @@ -216,6 +218,8 @@ def get_data( filters = frappe._dict(filters) rows = frappe.parse_json(rows 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 view_type = view.get('view_type') if view else None @@ -240,6 +244,8 @@ def get_data( is_default = True data = [] _list = get_controller(doctype) + if hasattr(_list, "default_list_data"): + rows = _list.default_list_data().get("rows") if view_type != "kanban": if columns or rows: @@ -272,9 +278,6 @@ def get_data( elif not custom_view or is_default and hasattr(_list, "default_list_data"): 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 for column in columns: if column.get("key") not in rows: @@ -297,30 +300,30 @@ def get_data( ) or [] 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) if field_meta.fieldtype == "Link": - columns = frappe.get_all( + kanban_columns = frappe.get_all( field_meta.options, fields=["name"], order_by="modified asc", ) 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: - rows = ["name"] + if "name" not in kanban_fields: + kanban_fields.append("name") - if hasattr(_list, "default_list_data"): - rows = _list.default_list_data().get("rows") + for field in kanban_fields: + if field not in rows: + rows.append(field) - if "name" not in rows: - rows.append("name") - - for column in columns: - column_filters = { column_field: column.get('name') } - if column_field in filters and filters.get(column_field) != column.name: + for kc in kanban_columns: + column_filters = { column_field: kc.get('name') } + if column_field in filters and filters.get(column_field) != kc.name: column_data = [] else: column_filters.update(filters.copy()) @@ -332,13 +335,13 @@ def get_data( page_length=20, ) - if column.get("order"): + if kc.get("order"): column_data = sorted( - column_data, key=lambda x: column.get("order").index(x.get("name")) - if x.get("name") in column.get("order") else 0 + column_data, key=lambda x: kc.get("order").index(x.get("name")) + 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 = [field for field in fields if field.fieldtype not in no_value_fields] diff --git a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json index b95886b3..a88d5d3d 100644 --- a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json +++ b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.json @@ -19,16 +19,18 @@ "filters", "order_by_tab", "order_by", - "list_kanban_tab", + "list_tab", "list_section", "load_default_columns", - "kanban_section", - "column_field", - "section_break_ndtv", "columns", "rows", "group_by_tab", - "group_by_field" + "group_by_field", + "kanban_tab", + "kanban_section", + "column_field", + "kanban_columns", + "kanban_fields" ], "fields": [ { @@ -137,20 +139,13 @@ "fieldtype": "Data", "label": "Group By Field" }, - { - "fieldname": "list_kanban_tab", - "fieldtype": "Tab Break", - "label": "List/Kanban" - }, { "fieldname": "list_section", - "fieldtype": "Section Break", - "label": "List" + "fieldtype": "Section Break" }, { "fieldname": "kanban_section", - "fieldtype": "Section Break", - "label": "Kanban" + "fieldtype": "Section Break" }, { "fieldname": "column_field", @@ -158,13 +153,29 @@ "label": "Column Field" }, { - "fieldname": "section_break_ndtv", - "fieldtype": "Section Break" + "fieldname": "list_tab", + "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, "links": [], - "modified": "2024-06-21 14:12:41.246707", + "modified": "2024-06-25 17:16:02.876349", "modified_by": "Administrator", "module": "FCRM", "name": "CRM View Settings", diff --git a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py index a82f6af8..72c8a7c0 100644 --- a/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py +++ b/crm/fcrm/doctype/crm_view_settings/crm_view_settings.py @@ -16,12 +16,16 @@ def create(view): view.filters = parse_json(view.filters) or {} view.columns = parse_json(view.columns 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) view.rows = view.rows + default_rows if default_rows else 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) doc = frappe.new_doc("CRM View Settings") @@ -37,6 +41,8 @@ def create(view): doc.order_by = view.order_by doc.group_by_field = view.group_by_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.rows = json.dumps(view.rows) doc.insert() @@ -49,6 +55,8 @@ def update(view): filters = parse_json(view.filters) or {} columns = parse_json(view.columns) 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) rows = rows + default_rows if default_rows else rows @@ -64,6 +72,8 @@ def update(view): doc.order_by = view.order_by doc.group_by_field = view.group_by_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.rows = json.dumps(rows) doc.save() @@ -129,12 +139,16 @@ def create_or_update_default_view(view): filters = parse_json(view.filters) or {} columns = parse_json(view.columns 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) rows = rows + default_rows if default_rows else 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) doc = frappe.db.exists( @@ -156,6 +170,8 @@ def create_or_update_default_view(view): doc.order_by = view.order_by doc.group_by_field = view.group_by_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.rows = json.dumps(rows) doc.save() @@ -173,6 +189,8 @@ def create_or_update_default_view(view): doc.order_by = view.order_by doc.group_by_field = view.group_by_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.rows = json.dumps(rows) doc.is_default = True diff --git a/frontend/src/components/Kanban/KanbanView.vue b/frontend/src/components/Kanban/KanbanView.vue index a6d24e39..69c41833 100644 --- a/frontend/src/components/Kanban/KanbanView.vue +++ b/frontend/src/components/Kanban/KanbanView.vue @@ -4,7 +4,7 @@ :list="columns" item-key="column" @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" > @@ -162,10 +162,10 @@ function updateColumn({ item, from, to }) { _columns.push(col.column) }) - let data = { columns: _columns } + let data = { kanban_columns: _columns } if (toColumn != fromColumn) { - data = { item: itemName, to: toColumn, columns: _columns } + data = { item: itemName, to: toColumn, kanban_columns: _columns } } emit('update', data) diff --git a/frontend/src/components/ViewControls.vue b/frontend/src/components/ViewControls.vue index bebc1502..7aedaadf 100644 --- a/frontend/src/components/ViewControls.vue +++ b/frontend/src/components/ViewControls.vue @@ -365,6 +365,8 @@ const view = ref({ filters: {}, order_by: 'modified desc', column_field: 'status', + kanban_columns: '', + kanban_fields: '', columns: '', rows: '', load_default_columns: false, @@ -400,6 +402,8 @@ function getParams() { const columns = _view?.columns || '' const rows = _view?.rows || '' const column_field = _view?.column_field || 'status' + const kanban_columns = _view?.kanban_columns || '' + const kanban_fields = _view?.kanban_fields || '' view.value = { name: view_name, @@ -410,6 +414,8 @@ function getParams() { order_by: order_by, group_by_field: group_by_field, column_field: column_field, + kanban_columns: kanban_columns, + kanban_fields: kanban_fields, columns: columns, rows: rows, route_name: _view?.route_name || route.name, @@ -429,6 +435,8 @@ function getParams() { group_by_field: group_by_field, }, column_field: column_field, + kanban_columns: kanban_columns, + kanban_fields: kanban_fields, columns: columns, rows: rows, page_length: pageLength.value, @@ -454,6 +462,8 @@ list.value = createResource({ group_by_field: params?.view?.group_by_field || 'owner', }, column_field: params.column_field, + kanban_columns: data.columns, + kanban_fields: data.kanban_fields, columns: data.columns, rows: data.rows, page_length: params.page_length, @@ -735,12 +745,19 @@ async function updateKanbanSettings(data) { defaultParams.value = getParams() } 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 view.value.column_field = data.column_field } - list.value.params.columns = data.columns ? data.columns : '' - view.value.columns = data.columns ? data.columns : '' + if (data.kanban_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() if (!route.query.view) { @@ -787,6 +804,8 @@ function create_or_update_default_view() { order_by: defaultParams.value.order_by, group_by_field: defaultParams.value.view?.group_by_field, column_field: defaultParams.value.column_field, + kanban_columns: defaultParams.value.kanban_columns, + kanban_fields: defaultParams.value.kanban_fields, columns: defaultParams.value.columns, rows: defaultParams.value.rows, route_name: route.name, @@ -808,6 +827,8 @@ function update_custom_view() { order_by: defaultParams.value.order_by, group_by_field: defaultParams.value.view.group_by_field, column_field: defaultParams.value.column_field, + kanban_columns: defaultParams.value.kanban_columns, + kanban_fields: defaultParams.value.kanban_fields, columns: defaultParams.value.columns, rows: defaultParams.value.rows, route_name: route.name, @@ -976,6 +997,8 @@ function saveView() { order_by: defaultParams.value.order_by, group_by_field: defaultParams.value.view.group_by_field, column_field: defaultParams.value.column_field, + kanban_columns: defaultParams.value.kanban_columns, + kanban_fields: defaultParams.value.kanban_fields, columns: defaultParams.value.columns, rows: defaultParams.value.rows, route_name: route.name,