Skip to content

Commit 985508c

Browse files
committed
feat: update skelete loader for the backend pagination mode for the afcl table
1 parent eabb02f commit 985508c

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

adminforth/spa/src/afcl/Table.vue

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,15 @@
1616
</tr>
1717
</thead>
1818
<tbody>
19+
<SkeleteLoader
20+
v-if="isLoading"
21+
:rows="pageSize"
22+
:columns="columns.length"
23+
:row-heights="rowHeights"
24+
:column-widths="columnWidths"
25+
/>
1926
<tr
27+
v-else="!isLoading"
2028
v-for="(item, index) in dataPage"
2129
:class="{
2230
'afcl-table-body odd:bg-lightTableOddBackground odd:dark:bg-darkTableOddBackground even:bg-lightTableEvenBackground even:dark:bg-darkTableEvenBackground': evenHighlights,
@@ -111,9 +119,9 @@
111119
</template>
112120

113121
<script setup lang="ts">
114-
import { ref, type Ref, computed } from 'vue';
122+
import { ref, type Ref, computed, useTemplateRef, watch } from 'vue';
115123
import { asyncComputed } from '@vueuse/core';
116-
import { Skeleton } from '@/afcl';
124+
import SkeleteLoader from '@/components/SkeleteLoader.vue';
117125
118126
const props = withDefaults(
119127
defineProps<{
@@ -135,6 +143,15 @@
135143
const currentPage = ref(1);
136144
const isLoading = ref(false);
137145
const pageInput = ref('1');
146+
const rowRefs = useTemplateRef<HTMLElement[]>('rowRefs');
147+
const headerRefs = useTemplateRef<HTMLElement[]>('headerRefs');
148+
const rowHeights = ref<number[]>([]);
149+
const columnWidths = ref<number[]>([]);
150+
watch(() => props.pageSize, (newRows) => {
151+
// rows are set to null when new records are loading
152+
rowHeights.value = newRows || !rowRefs.value ? [] : rowRefs.value.map((el: HTMLElement) => el.offsetHeight);
153+
columnWidths.value = newRows || !headerRefs.value ? [] : [48, ...headerRefs.value.map((el: HTMLElement) => el.offsetWidth)];
154+
});
138155
139156
const dataResult = asyncComputed( async() => {
140157
if (typeof props.data === 'function') {
@@ -179,7 +196,7 @@
179196
// page input should accept only numbers, arrow keys and backspace
180197
if (['Enter', 'Space'].includes(event.code) ||
181198
(!['Backspace', 'ArrowRight', 'ArrowLeft'].includes(event.code)
182-
&& isNaN(String.fromCharCode(event.keyCode)))) {
199+
&& isNaN(Number(String.fromCharCode(event.keyCode || 0))))) {
183200
event.preventDefault();
184201
if (event.code === 'Enter') {
185202
validatePageInput();

0 commit comments

Comments
 (0)