Skip to content

Commit ad42ff1

Browse files
authored
Merge pull request #122 from devforth/improved-table-skeleton-loader
fix: change table skeleton loader to reduce jumps
2 parents 9c5d0c1 + 7b3b4aa commit ad42ff1

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

adminforth/spa/src/components/ResourceListTable.vue

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@
6363
<SkeleteLoader
6464
v-if="!rows"
6565
:columns="resource?.columns.filter(c => c.showIn.list).length + 2"
66-
:rows="3"
66+
:rows="rowHeights.length || 3"
67+
:row-heights="rowHeights"
6768
/>
6869
<tr v-else-if="rows.length === 0" class="bg-lightListTable dark:bg-darkListTable dark:border-darkListTableBorder">
6970
<td :colspan="resource?.columns.length + 2">
@@ -80,6 +81,7 @@
8081

8182
<tr @click="onClick($event,row)"
8283
v-else v-for="(row, rowI) in rows" :key="`row_${row._primaryKeyValue}`"
84+
ref="rowRefs"
8385
class="bg-lightListTable dark:bg-darkListTable border-lightListBorder dark:border-gray-700 hover:bg-lightListTableRowHover dark:hover:bg-darkListTableRowHover"
8486

8587
:class="{'border-b': rowI !== rows.length - 1, 'cursor-pointer': row._clickUrl !== null}"
@@ -269,7 +271,7 @@
269271
<script setup lang="ts">
270272
271273
272-
import { computed, onMounted, ref, watch, type Ref } from 'vue';
274+
import { computed, onMounted, ref, watch, useTemplateRef, type Ref } from 'vue';
273275
import { callAdminForthApi } from '@/utils';
274276
import { useI18n } from 'vue-i18n';
275277
import ValueRenderer from '@/components/ValueRenderer.vue';
@@ -347,6 +349,13 @@ watch(() => props.page, (newPage) => {
347349
page.value = newPage;
348350
});
349351
352+
const rowRefs = useTemplateRef('rowRefs');
353+
const rowHeights = ref([]);
354+
watch(() => props.rows, (newRows) => {
355+
// rows are set to null when new records are loading
356+
rowHeights.value = newRows ? [] : rowRefs.value.map((el) => el.offsetHeight);
357+
});
358+
350359
function addToCheckedValues(id) {
351360
if (checkboxesInternal.value.includes(id)) {
352361
checkboxesInternal.value = checkboxesInternal.value.filter((item) => item !== id);
Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
<template>
2-
<tr v-for="c in new Array(props.rows)" class="bg-lightListTable border-b dark:bg-darkListTable dark:border-darkListBorder">
3-
<td v-for="r in new Array(props.columns)" class="items-center px-6 py-8 cursor-default" >
2+
<tr
3+
v-for="(r, ri) in new Array(props.rows)"
4+
class="bg-lightListTable border-b dark:bg-darkListTable dark:border-darkListBorder"
5+
:style="[props.rowHeights[ri] !== undefined ? `height: ${props.rowHeights[ri]}px` : '' ]"
6+
>
7+
<td v-for="c in new Array(props.columns)" class="items-center px-6 py-8 cursor-default" >
48
<div role="status" class="max-w-sm animate-pulse">
59
<div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[360px]"></div>
610
</div>
@@ -10,9 +14,12 @@
1014

1115
<script setup lang="ts">
1216
13-
const props = defineProps<{
17+
const props = withDefaults(defineProps<{
1418
columns: number;
1519
rows: number;
16-
}>();
20+
rowHeights?: number[];
21+
}>(), {
22+
rowHeights: [],
23+
});
1724
1825
</script>

0 commit comments

Comments
 (0)