WIP - Added pagination for list view
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, computed, onMounted, onBeforeUnmount, watch, nextTick } from 'vue'
|
||||
import { ref, computed, onMounted, onBeforeUnmount, watch } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { useApi } from '@/composables/useApi'
|
||||
import { useFields, useViewState } from '@/composables/useFieldViews'
|
||||
@@ -38,6 +38,7 @@ const error = ref<string | null>(null)
|
||||
// Use view state composable
|
||||
const {
|
||||
records,
|
||||
totalCount,
|
||||
currentRecord,
|
||||
loading: dataLoading,
|
||||
saving,
|
||||
@@ -57,7 +58,7 @@ const handleAiRecordCreated = (event: Event) => {
|
||||
return
|
||||
}
|
||||
if (view.value === 'list') {
|
||||
fetchRecords()
|
||||
initializeListRecords()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -142,6 +143,9 @@ const editConfig = computed(() => {
|
||||
return buildEditViewConfig(objectDefinition.value)
|
||||
})
|
||||
|
||||
const listPageSize = computed(() => listConfig.value?.pageSize ?? 25)
|
||||
const maxFrontendRecords = computed(() => listConfig.value?.maxFrontendRecords ?? 500)
|
||||
|
||||
// Fetch object definition
|
||||
const fetchObjectDefinition = async () => {
|
||||
try {
|
||||
@@ -220,6 +224,39 @@ const handleCancel = () => {
|
||||
}
|
||||
}
|
||||
|
||||
const loadListRecords = async (
|
||||
page = 1,
|
||||
options?: { append?: boolean; pageSize?: number }
|
||||
) => {
|
||||
const pageSize = options?.pageSize ?? listPageSize.value
|
||||
const result = await fetchRecords({ page, pageSize }, { append: options?.append })
|
||||
const resolvedTotal = result?.totalCount ?? totalCount.value ?? records.value.length
|
||||
totalCount.value = resolvedTotal
|
||||
return result
|
||||
}
|
||||
|
||||
const initializeListRecords = async () => {
|
||||
const firstResult = await loadListRecords(1)
|
||||
const resolvedTotal = firstResult?.totalCount ?? totalCount.value ?? records.value.length
|
||||
const shouldPrefetchAll =
|
||||
resolvedTotal <= maxFrontendRecords.value && records.value.length < resolvedTotal
|
||||
|
||||
if (shouldPrefetchAll) {
|
||||
await loadListRecords(1, { append: false, pageSize: maxFrontendRecords.value })
|
||||
}
|
||||
}
|
||||
|
||||
const handlePageChange = async (page: number, pageSize: number) => {
|
||||
const loadedPages = Math.ceil(records.value.length / pageSize)
|
||||
if (page > loadedPages && totalCount.value > records.value.length) {
|
||||
await loadListRecords(page, { append: true, pageSize })
|
||||
}
|
||||
}
|
||||
|
||||
const handleLoadMore = async (page: number, pageSize: number) => {
|
||||
await loadListRecords(page, { append: true, pageSize })
|
||||
}
|
||||
|
||||
// Watch for route changes
|
||||
watch(() => route.params, async (newParams, oldParams) => {
|
||||
// Reset current record when navigating to 'new'
|
||||
@@ -234,7 +271,7 @@ watch(() => route.params, async (newParams, oldParams) => {
|
||||
|
||||
// Fetch records if navigating back to list
|
||||
if (!newParams.recordId && !newParams.view) {
|
||||
await fetchRecords()
|
||||
await initializeListRecords()
|
||||
}
|
||||
}, { deep: true })
|
||||
|
||||
@@ -243,7 +280,7 @@ onMounted(async () => {
|
||||
await fetchObjectDefinition()
|
||||
|
||||
if (view.value === 'list') {
|
||||
await fetchRecords()
|
||||
await initializeListRecords()
|
||||
} else if (recordId.value && recordId.value !== 'new') {
|
||||
await fetchRecord(recordId.value)
|
||||
}
|
||||
@@ -289,12 +326,15 @@ onMounted(async () => {
|
||||
:config="listConfig"
|
||||
:data="records"
|
||||
:loading="dataLoading"
|
||||
:total-count="totalCount"
|
||||
:base-url="`/runtime/objects`"
|
||||
selectable
|
||||
@row-click="handleRowClick"
|
||||
@create="handleCreate"
|
||||
@edit="handleEdit"
|
||||
@delete="handleDelete"
|
||||
@page-change="handlePageChange"
|
||||
@load-more="handleLoadMore"
|
||||
/>
|
||||
|
||||
<!-- Detail View -->
|
||||
|
||||
Reference in New Issue
Block a user