diff --git a/crm/api/doc.py b/crm/api/doc.py
index a1a7bb40..18fd7290 100644
--- a/crm/api/doc.py
+++ b/crm/api/doc.py
@@ -376,6 +376,24 @@ def get_list_data(
"list_script": get_form_script(doctype, "List"),
}
+@frappe.whitelist()
+def get_kanban_data(doctype: str, filters: dict, order_by: str, column_field: str, columns=None, rows=None):
+ filters = frappe._dict(filters)
+ columns = frappe.parse_json(columns)
+ data = []
+ for column in columns:
+ column_filters = filters.copy()
+ column_filters.update({column_field: column})
+ 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)})
+ return data
+
@frappe.whitelist()
def get_fields_meta(doctype, restricted_fieldtypes=None, as_array=False):
not_allowed_fieldtypes = [
diff --git a/frontend/src/components/Kanban/KanbanView.vue b/frontend/src/components/Kanban/KanbanView.vue
new file mode 100644
index 00000000..921ba009
--- /dev/null
+++ b/frontend/src/components/Kanban/KanbanView.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
{{ column.column }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/pages/Leads.vue b/frontend/src/pages/Leads.vue
index 2733eb51..fe7cf445 100644
--- a/frontend/src/pages/Leads.vue
+++ b/frontend/src/pages/Leads.vue
@@ -29,9 +29,24 @@
allowedViews: ['list', 'group_by', 'kanban'],
}"
/>
+
{
if (!leads.value?.data.group_by_field?.name) return []
return getGroupedByRows(
leads.value?.data.data,
- leads.value?.data.group_by_field
+ leads.value?.data.group_by_field,
)
} else {
return parseRows(leads.value?.data.data)
@@ -177,8 +193,8 @@ function parseRows(rows) {
lead.sla_status == 'Failed'
? 'red'
: lead.sla_status == 'Fulfilled'
- ? 'green'
- : 'orange'
+ ? 'green'
+ : 'orange'
if (value == 'First Response Due') {
value = __(timeAgo(lead.response_by))
tooltipText = dateFormat(lead.response_by, dateTooltipFormat)
@@ -213,7 +229,7 @@ function parseRows(rows) {
}
} else if (
['first_response_time', 'first_responded_on', 'response_by'].includes(
- row
+ row,
)
) {
let field = row == 'response_by' ? 'response_by' : 'first_responded_on'