fix: use get_data for list, group_by as well as kanban

This commit is contained in:
Shariq Ansari 2024-06-21 15:35:42 +05:30
parent 24339023ba
commit 505a4caad8
2 changed files with 135 additions and 118 deletions

View File

@ -200,19 +200,22 @@ def get_quick_filters(doctype: str):
return quick_filters return quick_filters
@frappe.whitelist() @frappe.whitelist()
def get_list_data( def get_data(
doctype: str, doctype: str,
filters: dict, filters: dict,
order_by: str, order_by: str,
page_length=20, page_length=20,
page_length_count=20, page_length_count=20,
columns=None, column_field=None,
rows=None, columns=[],
rows=[],
view=None, view=None,
default_filters=None, default_filters=None,
): ):
custom_view = False custom_view = False
filters = frappe._dict(filters) 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 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
@ -235,61 +238,97 @@ def get_list_data(
filters.update(default_filters) filters.update(default_filters)
is_default = True is_default = True
if columns or rows: data = []
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,
}
_list = get_controller(doctype) _list = get_controller(doctype)
if not custom_view and frappe.db.exists("CRM View Settings", default_view_filters): if view_type != "kanban":
list_view_settings = frappe.get_doc("CRM View Settings", default_view_filters) if columns or rows:
columns = frappe.parse_json(list_view_settings.columns) custom_view = True
rows = frappe.parse_json(list_view_settings.rows) is_default = False
is_default = False columns = frappe.parse_json(columns)
elif not custom_view or is_default and hasattr(_list, "default_list_data"): rows = frappe.parse_json(rows)
columns = _list.default_list_data().get("columns")
if hasattr(_list, "default_list_data"): if not columns:
rows = _list.default_list_data().get("rows") 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 if not rows:
for column in columns: rows = ["name"]
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": default_view_filters = {
column["width"] = "50px" "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 not custom_view and frappe.db.exists("CRM View Settings", default_view_filters):
if group_by_field and group_by_field not in rows: list_view_settings = frappe.get_doc("CRM View Settings", default_view_filters)
rows.append(group_by_field) 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( if hasattr(_list, "default_list_data"):
doctype, rows = _list.default_list_data().get("rows")
fields=rows,
filters=filters, # check if rows has all keys from columns if not add them
order_by=order_by, for column in columns:
page_length=page_length, if column.get("key") not in rows:
) or [] 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 = 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

@ -373,42 +373,46 @@ watch(updatedPageCount, (value) => {
function getParams() { function getParams() {
let _view = getView(route.query.view, route.params.viewType, props.doctype) 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 filters = (_view?.filters && JSON.parse(_view.filters)) || {}
const order_by = _view?.order_by || 'modified desc' const order_by = _view?.order_by || 'modified desc'
const group_by_field = _view?.group_by_field || 'owner'
const columns = _view?.columns || '' const columns = _view?.columns || ''
const rows = _view?.rows || '' const rows = _view?.rows || ''
const column_field = _view?.column_field || 'status'
if (_view) { view.value = {
view.value = { name: view_name,
name: _view.name, label: _view?.label || getViewType().label,
label: _view.label, type: view_type,
type: _view.type || 'list', icon: _view?.icon || '',
icon: _view.icon, filters: filters,
filters: _view.filters, order_by: order_by,
order_by: _view.order_by, group_by_field: group_by_field,
group_by_field: _view.group_by_field, column_field: column_field,
columns: _view.columns, columns: columns,
rows: _view.rows, rows: rows,
route_name: _view.route_name, route_name: _view?.route_name || route.name,
load_default_columns: _view.row, load_default_columns: _view?.row || true,
pinned: _view.pinned, pinned: _view?.pinned || false,
public: _view.public, public: _view?.public || false,
}
let params = {}
if (route.params.viewType === 'kanban') {
params = {
column_field: column_field,
columns: columns,
rows: rows,
} }
} else { } else {
view.value = { params = {
name: '', columns: columns,
label: getViewType().label, rows: rows,
type: route.params.viewType || 'list', page_length: pageLength.value,
icon: '', page_length_count: pageLengthCount.value,
filters: {},
order_by: 'modified desc',
group_by_field: 'owner',
columns: '',
rows: '',
route_name: route.name,
load_default_columns: true,
pinned: false,
public: false,
} }
} }
@ -416,42 +420,18 @@ function getParams() {
doctype: props.doctype, doctype: props.doctype,
filters: filters, filters: filters,
order_by: order_by, order_by: order_by,
columns: columns, default_filters: props.filters,
rows: rows,
page_length: pageLength.value,
page_length_count: pageLengthCount.value,
view: { view: {
custom_view_name: _view?.name || '', custom_view_name: view_name,
view_type: _view?.type || route.params.viewType || 'list', view_type: view_type,
group_by_field: _view?.group_by_field || 'owner', 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({ list.value = createResource({
url: 'crm.api.doc.get_list_data', url: 'crm.api.doc.get_data',
params: getParams(), params: getParams(),
cache: [props.doctype, route.query.view, route.params.viewType], cache: [props.doctype, route.query.view, route.params.viewType],
onSuccess(data) { onSuccess(data) {
@ -463,6 +443,7 @@ list.value = createResource({
order_by: params.order_by, order_by: params.order_by,
page_length: params.page_length, page_length: params.page_length,
page_length_count: params.page_length_count, page_length_count: params.page_length_count,
column_field: params.column_field,
columns: data.columns, columns: data.columns,
rows: data.rows, rows: data.rows,
view: { view: {
@ -480,13 +461,8 @@ onMounted(() => useDebounceFn(reload, 100)())
const isLoading = computed(() => list.value?.loading) const isLoading = computed(() => list.value?.loading)
function reload() { function reload() {
if (route.params.viewType == 'kanban') { list.value.params = getParams()
kanban.value.params = getKanbanParams() list.value.reload()
kanban.value.reload()
} else {
list.value.params = getParams()
list.value.reload()
}
} }
const showExportDialog = ref(false) const showExportDialog = ref(false)
@ -754,7 +730,8 @@ function create_or_update_default_view() {
name: view.value.name, name: view.value.name,
filters: defaultParams.value.filters, filters: defaultParams.value.filters,
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,
columns: defaultParams.value.columns, columns: defaultParams.value.columns,
rows: defaultParams.value.rows, rows: defaultParams.value.rows,
route_name: route.name, route_name: route.name,
@ -921,6 +898,7 @@ function saveView() {
filters: defaultParams.value.filters, filters: defaultParams.value.filters,
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,
columns: defaultParams.value.columns, columns: defaultParams.value.columns,
rows: defaultParams.value.rows, rows: defaultParams.value.rows,
route_name: route.name, route_name: route.name,