Files
client-web/src/modules/first-leg/utils/orderColumnPreferences.ts
T

36 lines
1.5 KiB
TypeScript

interface OrderColumnPreferences {
visibleColumnKeys: string[]
orderedColumnKeys: string[]
}
function storageKey(ownerId: string) {
return `cc:client:first-leg:order-columns:${ownerId}`
}
export function readOrderColumnPreferences(ownerId: string, selectableKeys: string[], defaultVisibleKeys: string[]): OrderColumnPreferences {
const defaults = { visibleColumnKeys: [...defaultVisibleKeys], orderedColumnKeys: [...selectableKeys] }
if (!ownerId) return defaults
try {
const saved: unknown = JSON.parse(localStorage.getItem(storageKey(ownerId)) ?? 'null')
if (!saved || typeof saved !== 'object') return defaults
const preferences = saved as Partial<OrderColumnPreferences>
if (!Array.isArray(preferences.visibleColumnKeys) || !Array.isArray(preferences.orderedColumnKeys)) return defaults
const validKeys = (keys: unknown[]) => [...new Set(keys.filter((key): key is string => typeof key === 'string' && selectableKeys.includes(key)))]
return {
visibleColumnKeys: validKeys(preferences.visibleColumnKeys),
orderedColumnKeys: [...new Set([...validKeys(preferences.orderedColumnKeys), ...selectableKeys])],
}
} catch {
return defaults
}
}
export function saveOrderColumnPreferences(ownerId: string, preferences: OrderColumnPreferences) {
if (!ownerId) return
try {
localStorage.setItem(storageKey(ownerId), JSON.stringify(preferences))
} catch {
// Column selection remains usable when browser storage is unavailable.
}
}