11<script setup lang="ts">
2- import { computed , ref , useSlots } from ' vue'
2+ import { computed , ref , useSlots , watch } from ' vue'
33import Button from ' primevue/button'
44import Message from ' primevue/message'
55import CollapsiblePanel from ' @/components/common/CollapsiblePanel.vue'
66import DataExportButton from ' @/components/common/DataExportButton.vue'
7+ import DataPaginationBar from ' @/components/common/DataPaginationBar.vue'
78import TabStrip from ' @/components/common/TabStrip.vue'
89import ResizeKnob from ' @/components/ResizeKnob.vue'
910import CollapsibleActivityPanel from ' @/components/sql/CollapsibleActivityPanel.vue'
@@ -79,6 +80,8 @@ const buildRows = (rows: Record<string, unknown>[], prefix: string | number): SQ
7980 }))
8081
8182const selectedTableTab = ref (0 )
83+ const selectedTablePage = ref (1 )
84+ const selectedTablePageSize = ref (50 )
8285const 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