Skip to content

Commit 5cd4f0d

Browse files
authored
Merge pull request #135 from devforth/fix-table-row-jump
fix: prevent row height jump on page change
2 parents e5b327c + 695cd7b commit 5cd4f0d

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

adminforth/spa/src/components/ResourceListTable.vue

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,16 @@
1818
<!-- table header -->
1919
<tr class="t-header sticky z-10 top-0 text-xs bg-lightListTableHeading dark:bg-darkListTableHeading dark:text-gray-400">
2020
<td scope="col" class="p-4">
21-
<div v-if="rows && rows.length" class="flex items-center">
21+
<div class="flex items-center">
2222
<input id="checkbox-all-search" type="checkbox" :checked="allFromThisPageChecked" @change="selectAll()"
23+
:disabled="!rows || !rows.length"
2324
class="w-4 h-4 cursor-pointer text-blue-600 bg-gray-100 border-gray-300 rounded
2425
focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 dark:focus:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600">
2526
<label for="checkbox-all-search" class="sr-only">{{ $t('checkbox') }}</label>
2627
</div>
2728
</td>
2829

29-
<td v-for="c in columnsListed" scope="col" class="px-2 md:px-3 lg:px-6 py-3">
30+
<td v-for="c in columnsListed" ref="headerRefs" scope="col" class="px-2 md:px-3 lg:px-6 py-3">
3031

3132
<div @click="(evt) => c.sortable && onSortButtonClick(evt, c.name)"
3233
class="flex items-center " :class="{'cursor-pointer':c.sortable}">
@@ -65,6 +66,7 @@
6566
:columns="resource?.columns.filter(c => c.showIn.list).length + 2"
6667
:rows="rowHeights.length || 3"
6768
:row-heights="rowHeights"
69+
:column-widths="columnWidths"
6870
/>
6971
<tr v-else-if="rows.length === 0" class="bg-lightListTable dark:bg-darkListTable dark:border-darkListTableBorder">
7072
<td :colspan="resource?.columns.length + 2">
@@ -376,10 +378,13 @@ watch(() => props.page, (newPage) => {
376378
});
377379
378380
const rowRefs = useTemplateRef('rowRefs');
381+
const headerRefs = useTemplateRef('headerRefs');
379382
const rowHeights = ref([]);
383+
const columnWidths = ref([]);
380384
watch(() => props.rows, (newRows) => {
381385
// rows are set to null when new records are loading
382386
rowHeights.value = newRows || !rowRefs.value ? [] : rowRefs.value.map((el) => el.offsetHeight);
387+
columnWidths.value = newRows || !headerRefs.value ? [] : [48, ...headerRefs.value.map((el) => el.offsetWidth)];
383388
});
384389
385390
function addToCheckedValues(id) {

adminforth/spa/src/components/SkeleteLoader.vue

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
<template>
22
<tr
33
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` : '' ]"
4+
class="bg-lightListTable dark:bg-darkListTable dark:border-darkListBorder"
5+
:class="{'border-b': ri !== props.rows - 1}"
6+
:style="[`height: ${props.rowHeights[ri] !== undefined ? props.rowHeights[ri] : 52.5}px`]"
67
>
7-
<td v-for="c in new Array(props.columns)" class="items-center px-6 py-8 cursor-default" >
8+
<td
9+
v-for="(c, ci) in new Array(props.columns)" class="items-center px-6 py-4 cursor-default"
10+
:style="[props.columnWidths[ci] !== undefined
11+
? `min-width: ${props.columnWidths[ci]}px; width: ${props.columnWidths[ci]}px;`
12+
: '']"
13+
>
814
<div role="status" class="max-w-sm animate-pulse">
915
<div class="h-2 bg-gray-200 rounded-full dark:bg-gray-700 max-w-[360px]"></div>
1016
</div>
@@ -18,8 +24,10 @@ const props = withDefaults(defineProps<{
1824
columns: number;
1925
rows: number;
2026
rowHeights?: number[];
27+
columnWidths?: number[];
2128
}>(), {
2229
rowHeights: [],
30+
columnWidths: [],
2331
});
2432
2533
</script>

0 commit comments

Comments
 (0)