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
|
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]
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user