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
@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]

View File

@ -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,