Skip to content

Commit d88762c

Browse files
committed
feat: add pagination support to GenericQueryView for improved data navigation
1 parent cb14b57 commit d88762c

1 file changed

Lines changed: 62 additions & 7 deletions

File tree

packages/frontend/src/datasources/shared/components/GenericQueryView.vue

Lines changed: 62 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
<script setup lang="ts">
2-
import { computed, ref, useSlots } from 'vue'
2+
import { computed, ref, useSlots, watch } from 'vue'
33
import Button from 'primevue/button'
44
import Message from 'primevue/message'
55
import CollapsiblePanel from '@/components/common/CollapsiblePanel.vue'
66
import DataExportButton from '@/components/common/DataExportButton.vue'
7+
import DataPaginationBar from '@/components/common/DataPaginationBar.vue'
78
import TabStrip from '@/components/common/TabStrip.vue'
89
import ResizeKnob from '@/components/ResizeKnob.vue'
910
import CollapsibleActivityPanel from '@/components/sql/CollapsibleActivityPanel.vue'
@@ -79,6 +80,8 @@ const buildRows = (rows: Record<string, unknown>[], prefix: string | number): SQ
7980
}))
8081
8182
const selectedTableTab = ref(0)
83+
const selectedTablePage = ref(1)
84+
const selectedTablePageSize = ref(50)
8285
const selectedResultTable = computed(
8386
() => props.resultTables[selectedTableTab.value] ?? props.resultTables[0] ?? null,
8487
)
@@ -89,6 +92,48 @@ const resultTabItems = computed(() =>
8992
icon: null,
9093
})),
9194
)
95+
const selectedResultTableRows = computed(() => selectedResultTable.value?.rows ?? [])
96+
const selectedResultTotalPages = computed(() =>
97+
Math.max(1, Math.ceil(selectedResultTableRows.value.length / selectedTablePageSize.value)),
98+
)
99+
const selectedResultPageRows = computed(() => {
100+
const start = (selectedTablePage.value - 1) * selectedTablePageSize.value
101+
return selectedResultTableRows.value.slice(start, start + selectedTablePageSize.value)
102+
})
103+
const selectedResultPaginationSummary = computed(() => {
104+
const totalRows = selectedResultTableRows.value.length
105+
return `${totalRows} row${totalRows === 1 ? '' : 's'}`
106+
})
107+
const canPreviousResultPage = computed(() => selectedTablePage.value > 1)
108+
const canNextResultPage = computed(() => selectedTablePage.value < selectedResultTotalPages.value)
109+
110+
watch(
111+
() => props.resultTables.length,
112+
(nextLength) => {
113+
if (selectedTableTab.value >= nextLength) {
114+
selectedTableTab.value = Math.max(0, nextLength - 1)
115+
}
116+
},
117+
)
118+
119+
watch(selectedResultTable, () => {
120+
selectedTablePage.value = 1
121+
})
122+
123+
watch(selectedResultTotalPages, (nextTotalPages) => {
124+
if (selectedTablePage.value > nextTotalPages) {
125+
selectedTablePage.value = nextTotalPages
126+
}
127+
})
128+
129+
function changeSelectedResultPage(value: number) {
130+
selectedTablePage.value = Math.min(Math.max(1, value), selectedResultTotalPages.value)
131+
}
132+
133+
function changeSelectedResultPageSize(value: number) {
134+
selectedTablePageSize.value = value
135+
selectedTablePage.value = 1
136+
}
92137
</script>
93138

94139
<template>
@@ -214,18 +259,28 @@ const resultTabItems = computed(() =>
214259
</div>
215260
</div>
216261

217-
<div class="min-h-0 overflow-hidden">
262+
<div class="min-h-0 overflow-hidden relative">
218263
<ExtendedDataTable
219-
class="h-full"
264+
class="h-full pb-20"
220265
:columns="toColumns(selectedResultTable.columns)"
221266
:rows="
222-
buildRows(
223-
selectedResultTable.rows,
224-
selectedResultTable.id ?? selectedTableTab,
225-
)
267+
buildRows(selectedResultPageRows, selectedResultTable.id ?? selectedTableTab)
226268
"
227269
:can-edit="false"
228270
/>
271+
272+
<div class="absolute bottom-6 left-[50%] translate-x-[-50%]">
273+
<DataPaginationBar
274+
:page="selectedTablePage"
275+
:page-size="selectedTablePageSize"
276+
:total-pages="selectedResultTotalPages"
277+
:summary="selectedResultPaginationSummary"
278+
:can-previous="canPreviousResultPage"
279+
:can-next="canNextResultPage"
280+
@update:page="changeSelectedResultPage"
281+
@update:page-size="changeSelectedResultPageSize"
282+
/>
283+
</div>
229284
</div>
230285
</section>
231286
</template>

0 commit comments

Comments
 (0)