diff --git a/crm/api/doc.py b/crm/api/doc.py index fedc4dfd..9b84bc7a 100644 --- a/crm/api/doc.py +++ b/crm/api/doc.py @@ -200,19 +200,22 @@ def get_quick_filters(doctype: str): return quick_filters @frappe.whitelist() -def get_list_data( +def get_data( doctype: str, filters: dict, order_by: str, page_length=20, page_length_count=20, - columns=None, - rows=None, + column_field=None, + columns=[], + rows=[], view=None, default_filters=None, ): custom_view = False filters = frappe._dict(filters) + rows = frappe.parse_json(rows or "[]") + columns = frappe.parse_json(columns or "[]") custom_view_name = view.get('custom_view_name') if view else None view_type = view.get('view_type') if view else None @@ -235,61 +238,97 @@ def get_list_data( filters.update(default_filters) is_default = True - if columns or rows: - custom_view = True - is_default = False - columns = frappe.parse_json(columns) - rows = frappe.parse_json(rows) - - if not columns: - columns = [ - {"label": "Name", "type": "Data", "key": "name", "width": "16rem"}, - {"label": "Last Modified", "type": "Datetime", "key": "modified", "width": "8rem"}, - ] - - if not rows: - rows = ["name"] - - default_view_filters = { - "dt": doctype, - "type": view_type or 'list', - "is_default": 1, - "user": frappe.session.user, - } - + data = [] _list = get_controller(doctype) - if not custom_view and frappe.db.exists("CRM View Settings", default_view_filters): - list_view_settings = frappe.get_doc("CRM View Settings", default_view_filters) - columns = frappe.parse_json(list_view_settings.columns) - rows = frappe.parse_json(list_view_settings.rows) - is_default = False - elif not custom_view or is_default and hasattr(_list, "default_list_data"): - columns = _list.default_list_data().get("columns") + if view_type != "kanban": + if columns or rows: + custom_view = True + is_default = False + columns = frappe.parse_json(columns) + rows = frappe.parse_json(rows) - if hasattr(_list, "default_list_data"): - rows = _list.default_list_data().get("rows") + if not columns: + columns = [ + {"label": "Name", "type": "Data", "key": "name", "width": "16rem"}, + {"label": "Last Modified", "type": "Datetime", "key": "modified", "width": "8rem"}, + ] - # check if rows has all keys from columns if not add them - for column in columns: - if column.get("key") not in rows: - rows.append(column.get("key")) - column["label"] = _(column.get("label")) + if not rows: + rows = ["name"] - if column.get("key") == "_liked_by" and column.get("width") == "10rem": - column["width"] = "50px" + default_view_filters = { + "dt": doctype, + "type": view_type or 'list', + "is_default": 1, + "user": frappe.session.user, + } - # check if rows has group_by_field if not add it - if group_by_field and group_by_field not in rows: - rows.append(group_by_field) + if not custom_view and frappe.db.exists("CRM View Settings", default_view_filters): + list_view_settings = frappe.get_doc("CRM View Settings", default_view_filters) + columns = frappe.parse_json(list_view_settings.columns) + rows = frappe.parse_json(list_view_settings.rows) + is_default = False + elif not custom_view or is_default and hasattr(_list, "default_list_data"): + columns = _list.default_list_data().get("columns") - data = frappe.get_list( - doctype, - fields=rows, - filters=filters, - order_by=order_by, - page_length=page_length, - ) or [] + 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: + rows.append(column.get("key")) + column["label"] = _(column.get("label")) + + if column.get("key") == "_liked_by" and column.get("width") == "10rem": + column["width"] = "50px" + + # check if rows has group_by_field if not add it + if group_by_field and group_by_field not in rows: + rows.append(group_by_field) + + data = frappe.get_list( + doctype, + fields=rows, + filters=filters, + order_by=order_by, + page_length=page_length, + ) or [] + + if view_type == "kanban": + if not columns and column_field: + field_meta = frappe.get_meta(doctype).get_field(column_field) + if field_meta.fieldtype == "Link": + columns = frappe.get_all( + field_meta.options, + pluck="name", + order_by="modified asc", + ) + elif field_meta.fieldtype == "Select": + columns = [option for option in field_meta.options.split("\n")] + + + if not rows: + rows = ["name"] + + if hasattr(_list, "default_kanban_data"): + rows = _list.default_kanban_data().get("rows") + + for column in columns: + column_filters = { column_field: column } + if column_field in filters and filters.get(column_field) != column: + column_data = [] + else: + column_filters.update(filters.copy()) + column_data = frappe.get_list( + doctype, + fields=rows, + filters=column_filters, + order_by=order_by, + page_length=20, + ) + data.append({"column": column, "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/frontend/src/components/ViewControls.vue b/frontend/src/components/ViewControls.vue index 0761ec4f..18741d8f 100644 --- a/frontend/src/components/ViewControls.vue +++ b/frontend/src/components/ViewControls.vue @@ -373,42 +373,46 @@ watch(updatedPageCount, (value) => { function getParams() { let _view = getView(route.query.view, route.params.viewType, props.doctype) + const view_name = _view?.name || '' + const view_type = _view?.type || route.params.viewType || 'list' const filters = (_view?.filters && JSON.parse(_view.filters)) || {} const order_by = _view?.order_by || 'modified desc' + const group_by_field = _view?.group_by_field || 'owner' const columns = _view?.columns || '' const rows = _view?.rows || '' + const column_field = _view?.column_field || 'status' - if (_view) { - view.value = { - name: _view.name, - label: _view.label, - type: _view.type || 'list', - icon: _view.icon, - filters: _view.filters, - order_by: _view.order_by, - group_by_field: _view.group_by_field, - columns: _view.columns, - rows: _view.rows, - route_name: _view.route_name, - load_default_columns: _view.row, - pinned: _view.pinned, - public: _view.public, + view.value = { + name: view_name, + label: _view?.label || getViewType().label, + type: view_type, + icon: _view?.icon || '', + filters: filters, + order_by: order_by, + group_by_field: group_by_field, + column_field: column_field, + columns: columns, + rows: rows, + route_name: _view?.route_name || route.name, + load_default_columns: _view?.row || true, + pinned: _view?.pinned || false, + public: _view?.public || false, + } + + let params = {} + + if (route.params.viewType === 'kanban') { + params = { + column_field: column_field, + columns: columns, + rows: rows, } } else { - view.value = { - name: '', - label: getViewType().label, - type: route.params.viewType || 'list', - icon: '', - filters: {}, - order_by: 'modified desc', - group_by_field: 'owner', - columns: '', - rows: '', - route_name: route.name, - load_default_columns: true, - pinned: false, - public: false, + params = { + columns: columns, + rows: rows, + page_length: pageLength.value, + page_length_count: pageLengthCount.value, } } @@ -416,42 +420,18 @@ function getParams() { doctype: props.doctype, filters: filters, order_by: order_by, - columns: columns, - rows: rows, - page_length: pageLength.value, - page_length_count: pageLengthCount.value, + default_filters: props.filters, view: { - custom_view_name: _view?.name || '', - view_type: _view?.type || route.params.viewType || 'list', - group_by_field: _view?.group_by_field || 'owner', + custom_view_name: view_name, + view_type: view_type, + group_by_field: group_by_field, }, - default_filters: props.filters, + ...params, } } -function getKanbanParams() { - return { - doctype: props.doctype, - filters: {}, - order_by: 'modified desc', - column_field: 'status', - columns: ['New', 'Contacted', 'Nurture', 'Qualified', 'Unqualified', 'Junk'], - rows: ['name', 'lead_name', 'status', 'organization', 'lead_owner'], - default_filters: props.filters, - } -} - -kanban.value = createResource({ - url: 'crm.api.doc.get_kanban_data', - params: getKanbanParams(), - cache: ['Kanban', props.doctype], - onSuccess(data) { - kanban.value.data = data - }, -}) - list.value = createResource({ - url: 'crm.api.doc.get_list_data', + url: 'crm.api.doc.get_data', params: getParams(), cache: [props.doctype, route.query.view, route.params.viewType], onSuccess(data) { @@ -463,6 +443,7 @@ list.value = createResource({ order_by: params.order_by, page_length: params.page_length, page_length_count: params.page_length_count, + column_field: params.column_field, columns: data.columns, rows: data.rows, view: { @@ -480,13 +461,8 @@ onMounted(() => useDebounceFn(reload, 100)()) const isLoading = computed(() => list.value?.loading) function reload() { - if (route.params.viewType == 'kanban') { - kanban.value.params = getKanbanParams() - kanban.value.reload() - } else { - list.value.params = getParams() - list.value.reload() - } + list.value.params = getParams() + list.value.reload() } const showExportDialog = ref(false) @@ -754,7 +730,8 @@ function create_or_update_default_view() { name: view.value.name, filters: defaultParams.value.filters, 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, columns: defaultParams.value.columns, rows: defaultParams.value.rows, route_name: route.name, @@ -921,6 +898,7 @@ function saveView() { filters: defaultParams.value.filters, order_by: defaultParams.value.order_by, group_by_field: defaultParams.value.view.group_by_field, + column_field: defaultParams.value.column_field, columns: defaultParams.value.columns, rows: defaultParams.value.rows, route_name: route.name,