diff --git a/crm/api/doc.py b/crm/api/doc.py index 9795246c..74405caa 100644 --- a/crm/api/doc.py +++ b/crm/api/doc.py @@ -56,9 +56,24 @@ def get_filterable_fields(doctype: str): @frappe.whitelist() -def get_list_data(doctype: str, filters: dict, order_by: str, columns=None , rows=None, custom_view_name=None): +def get_list_data( + doctype: str, + filters: dict, + order_by: str, + page_length=20, + page_length_count=20, + columns=None, + rows=None, + custom_view_name=None, + default_filters=None, +): custom_view = False filters = frappe._dict(filters) + + if default_filters: + default_filters = frappe.parse_json(default_filters) + filters.update(default_filters) + is_default = True if columns or rows: custom_view = True @@ -97,7 +112,7 @@ def get_list_data(doctype: str, filters: dict, order_by: str, columns=None , row fields=rows, filters=filters, order_by=order_by, - page_length=20, + page_length=page_length, ) or [] fields = frappe.get_meta(doctype).fields @@ -141,8 +156,12 @@ def get_list_data(doctype: str, filters: dict, order_by: str, columns=None , row "columns": columns, "rows": rows, "fields": fields, + "page_length": page_length, + "page_length_count": page_length_count, "is_default": is_default, "views": get_views(doctype), + "total_count": frappe.client.get_count(doctype, filters=filters), + "row_count": len(data), } def get_views(doctype): diff --git a/frappe-ui b/frappe-ui index 0f4b6650..f5f5665e 160000 --- a/frappe-ui +++ b/frappe-ui @@ -1 +1 @@ -Subproject commit 0f4b6650598831d4382549c4ee22c360e01e35f0 +Subproject commit f5f5665e944bef20a79ece6ad7223db09984c6a6 diff --git a/frontend/package.json b/frontend/package.json index ce000952..2abf1ef6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,7 +13,7 @@ "@vueuse/core": "^10.3.0", "@vueuse/integrations": "^10.3.0", "feather-icons": "^4.28.0", - "frappe-ui": "^0.1.17", + "frappe-ui": "^0.1.22", "mime": "^4.0.1", "pinia": "^2.0.33", "socket.io-client": "^4.7.2", diff --git a/frontend/src/components/ListViews/CallLogsListView.vue b/frontend/src/components/ListViews/CallLogsListView.vue index ee8f2753..5a8a0e24 100644 --- a/frontend/src/components/ListViews/CallLogsListView.vue +++ b/frontend/src/components/ListViews/CallLogsListView.vue @@ -62,6 +62,15 @@ + diff --git a/frontend/src/components/ListViews/ContactsListView.vue b/frontend/src/components/ListViews/ContactsListView.vue index e73701bd..a4a214c2 100644 --- a/frontend/src/components/ListViews/ContactsListView.vue +++ b/frontend/src/components/ListViews/ContactsListView.vue @@ -63,6 +63,15 @@ + diff --git a/frontend/src/components/ListViews/DealsListView.vue b/frontend/src/components/ListViews/DealsListView.vue index c6bc906b..9a025966 100644 --- a/frontend/src/components/ListViews/DealsListView.vue +++ b/frontend/src/components/ListViews/DealsListView.vue @@ -86,6 +86,15 @@ + diff --git a/frontend/src/components/ListViews/LeadsListView.vue b/frontend/src/components/ListViews/LeadsListView.vue index 6e2465b4..f788e512 100644 --- a/frontend/src/components/ListViews/LeadsListView.vue +++ b/frontend/src/components/ListViews/LeadsListView.vue @@ -95,6 +95,15 @@ + diff --git a/frontend/src/components/ListViews/OrganizationsListView.vue b/frontend/src/components/ListViews/OrganizationsListView.vue index 0d48ab42..50572dd0 100644 --- a/frontend/src/components/ListViews/OrganizationsListView.vue +++ b/frontend/src/components/ListViews/OrganizationsListView.vue @@ -51,6 +51,15 @@ + diff --git a/frontend/src/components/ViewControls.vue b/frontend/src/components/ViewControls.vue index 87b98901..2566f956 100644 --- a/frontend/src/components/ViewControls.vue +++ b/frontend/src/components/ViewControls.vue @@ -96,6 +96,7 @@ const { $dialog } = globalStore() const { reload: reloadView, getView } = viewsStore() const list = defineModel() +const loadMore = defineModel('loadMore') const route = useRoute() const router = useRouter() @@ -116,7 +117,7 @@ const currentView = computed(() => { const view = ref({ name: '', label: '', - filters: props.filters, + filters: {}, order_by: 'modified desc', columns: '', rows: '', @@ -124,9 +125,25 @@ const view = ref({ pinned: false, }) +const pageLength = computed(() => list.value?.data?.page_length) +const pageLengthCount = computed(() => list.value?.data?.page_length_count) + +watch(loadMore, (value) => { + if (!value) return + updatePageLength(value, true) +}) + +watch( + () => list.value?.data?.page_length_count, + (value) => { + if (!value) return + updatePageLength(value) + } +) + function getParams() { let _view = getView(route.query.view) - const filters = (_view?.filters && JSON.parse(_view.filters)) || props.filters + const filters = (_view?.filters && JSON.parse(_view.filters)) || {} const order_by = _view?.order_by || 'modified desc' const columns = _view?.columns || '' const rows = _view?.rows || '' @@ -147,7 +164,7 @@ function getParams() { view.value = { name: '', label: '', - filters: props.filters, + filters: {}, order_by: 'modified desc', columns: '', rows: '', @@ -163,7 +180,10 @@ function getParams() { order_by: order_by, columns: columns, rows: rows, + page_length: pageLength.value, + page_length_count: pageLengthCount.value, custom_view_name: _view?.name || '', + default_filters: props.filters, } } @@ -178,9 +198,12 @@ list.value = createResource({ doctype: props.doctype, filters: list.value.params.filters, order_by: list.value.params.order_by, + page_length: list.value.params.page_length, + page_length_count: list.value.params.page_length_count, columns: data.columns, rows: data.rows, custom_view_name: cv?.name || '', + default_filters: props.filters, } }, }) @@ -285,6 +308,20 @@ function updateColumns(obj) { viewUpdated.value = true } +function updatePageLength(value, loadMore = false) { + if (!defaultParams.value) { + defaultParams.value = getParams() + } + list.value.params = defaultParams.value + if (loadMore) { + list.value.params.page_length += list.value.params.page_length_count + } else { + list.value.params.page_length = value + list.value.params.page_length_count = value + } + list.value.reload() +} + // View Actions const viewActions = computed(() => { let actions = [ diff --git a/frontend/src/pages/CallLogs.vue b/frontend/src/pages/CallLogs.vue index a86ccda6..bc80dad6 100644 --- a/frontend/src/pages/CallLogs.vue +++ b/frontend/src/pages/CallLogs.vue @@ -4,11 +4,17 @@ - +
{ if (!callLogs.value?.data?.data) return [] diff --git a/frontend/src/pages/Contacts.vue b/frontend/src/pages/Contacts.vue index e8548ccf..b9a7be27 100644 --- a/frontend/src/pages/Contacts.vue +++ b/frontend/src/pages/Contacts.vue @@ -9,11 +9,21 @@ - +
{ return items }) +// contacts data is loaded in the ViewControls component const contacts = ref({}) +const loadMore = ref(1) const rows = computed(() => { if (!contacts.value?.data?.data) return [] diff --git a/frontend/src/pages/Deals.vue b/frontend/src/pages/Deals.vue index 77534cbf..0c4eab6f 100644 --- a/frontend/src/pages/Deals.vue +++ b/frontend/src/pages/Deals.vue @@ -9,11 +9,21 @@ - +
{ diff --git a/frontend/src/pages/Leads.vue b/frontend/src/pages/Leads.vue index 2dfbfe74..e9824880 100644 --- a/frontend/src/pages/Leads.vue +++ b/frontend/src/pages/Leads.vue @@ -11,13 +11,20 @@
{ diff --git a/frontend/src/pages/Organizations.vue b/frontend/src/pages/Organizations.vue index c5057d10..51c1c57f 100644 --- a/frontend/src/pages/Organizations.vue +++ b/frontend/src/pages/Organizations.vue @@ -13,11 +13,21 @@ - +
{ return items }) +// organizations data is loaded in the ViewControls component const organizations = ref({}) +const loadMore = ref(1) const rows = computed(() => { if (!organizations.value?.data?.data) return [] diff --git a/yarn.lock b/yarn.lock index 283bdc55..31bbe1a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3565,6 +3565,7 @@ string-argv@0.3.2: integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: + name string-width-cjs version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -3600,6 +3601,7 @@ stringify-entities@^4.0.0: character-entities-legacy "^3.0.0" "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: + name strip-ansi-cjs version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==