feat: datatable sorting persist

This commit is contained in:
pa
2026-03-04 00:27:41 +09:00
parent cb1763160a
commit 2946b58f47
2 changed files with 155 additions and 1 deletions

View File

@@ -44,6 +44,14 @@ function filterSizingByColumns(sizing, columns) {
return out;
}
function filterSortingByColumns(sorting, columns) {
if (!Array.isArray(sorting)) {
return [];
}
const ids = new Set((columns ?? []).map((c) => c?.id).filter(Boolean));
return sorting.filter((s) => s && ids.has(s.id));
}
function getColumnId(col) {
return col?.id ?? col?.accessorKey ?? null;
}
@@ -134,6 +142,7 @@ export function useVrcxVueTable(options) {
persistKey,
persistColumnSizing = true,
persistSorting = true,
persistDebounceMs = 200,
tableOptions = {}
@@ -144,7 +153,6 @@ export function useVrcxVueTable(options) {
if (!hasData) console.warn('useVrcxVueTable: `data` is required');
if (!hasColumns) console.warn('useVrcxVueTable: `columns` is required');
const sorting = ref(initialSorting ?? []);
const expanded = ref(initialExpanded ?? {});
const pagination = ref(initialPagination ?? { pageIndex: 0, pageSize: 50 });
const columnPinning = ref(initialColumnPinning ?? { left: [], right: [] });
@@ -169,6 +177,13 @@ export function useVrcxVueTable(options) {
}
const persisted = readPersisted();
let resolvedSorting = initialSorting ?? [];
if (persisted && persistSorting && Array.isArray(persisted.sorting)) {
resolvedSorting = persisted.sorting;
}
const sorting = ref(resolvedSorting);
if (persisted && persistColumnSizing && persisted.columnSizing) {
columnSizing.value = persisted.columnSizing;
}
@@ -296,6 +311,19 @@ export function useVrcxVueTable(options) {
);
}
if (storageKey && persistSorting) {
watch(
sorting,
(val) => {
const cols = table.getAllLeafColumns?.() ?? [];
persistWrite({
sorting: filterSortingByColumns(val, cols)
});
},
{ deep: true }
);
}
return {
table,
sorting,