fix: use get_data for list, group_by as well as kanban
This commit is contained in:
parent
24339023ba
commit
505a4caad8
141
crm/api/doc.py
141
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]
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user