36 lines
1.5 KiB
TypeScript
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.
|
|
}
|
|
}
|