This commit is contained in:
2026-08-12 14:08:33 +08:00
parent 4fb8b85c13
commit 975e0057e3
20 changed files with 378 additions and 29 deletions
+33 -1
View File
@@ -21,6 +21,39 @@ describe('UI layout preferences', () => {
.toEqual({ version: 1, order: ['actions', 'name'], hidden: ['name'] })
})
it('hides newly introduced default-hidden fields without overriding existing visibility choices', () => {
writeLayoutPreference('table', 'user-1', 'roles', {
version: 1,
order: ['actions', 'role', 'status'],
hidden: ['status'],
})
expect(readLayoutPreference(
'table',
'user-1',
'roles',
['actions', 'role', 'roleCode', 'status'],
['roleCode', 'status'],
)).toEqual({
version: 1,
order: ['actions', 'role', 'status', 'roleCode'],
hidden: ['status', 'roleCode'],
})
writeLayoutPreference('table', 'user-1', 'roles', {
version: 1,
order: ['actions', 'role', 'roleCode', 'status'],
hidden: [],
})
expect(readLayoutPreference(
'table',
'user-1',
'roles',
['actions', 'role', 'roleCode', 'status'],
['roleCode'],
).hidden).toEqual([])
})
it('keeps preferences isolated by user and removes them on reset', () => {
writeLayoutPreference('query', 'user-1', 'orders', { version: 1, order: ['status', 'keyword'], hidden: [] })
expect(readLayoutPreference('query', 'user-1', 'orders', ['keyword', 'status']).order).toEqual(['status', 'keyword'])
@@ -30,4 +63,3 @@ describe('UI layout preferences', () => {
expect(readLayoutPreference('query', 'user-1', 'orders', ['keyword', 'status']).order).toEqual(['keyword', 'status'])
})
})
+3 -2
View File
@@ -47,10 +47,12 @@ export function readLayoutPreference(
try {
const parsed = JSON.parse(localStorage.getItem(preferenceStorageKey(kind, scope, preferenceKey)) || 'null') as Partial<LayoutPreferenceSnapshot> | null
if (!parsed || parsed.version !== 1 || !Array.isArray(parsed.order) || !Array.isArray(parsed.hidden)) return fallback
const storedKeys = new Set(uniqueKeys(parsed.order))
const newlyDefaultHidden = uniqueKeys(defaultHidden).filter((key) => availableKeys.includes(key) && !storedKeys.has(key))
return {
version: 1,
order: reconcileOrder(availableKeys, parsed.order),
hidden: uniqueKeys(parsed.hidden).filter((key) => availableKeys.includes(key)),
hidden: uniqueKeys([...parsed.hidden, ...newlyDefaultHidden]).filter((key) => availableKeys.includes(key)),
}
} catch {
return fallback
@@ -79,4 +81,3 @@ export function removeLayoutPreference(kind: LayoutPreferenceKind, scope: string
// Ignore unavailable browser storage and keep the in-memory default layout.
}
}