70 lines
1.7 KiB
TypeScript
70 lines
1.7 KiB
TypeScript
import type { BuiltinField } from '@/lib/contentTypes'
|
|
|
|
export const COLUMN_CAP = 6
|
|
export const DEFAULT_COLUMN_COUNT = 4
|
|
|
|
const STORAGE_PREFIX = 'renewcms-content-columns-'
|
|
|
|
export function columnsStorageKey(typeKey: string) {
|
|
return `${STORAGE_PREFIX}${typeKey}`
|
|
}
|
|
|
|
export function defaultColumnKeys(fields: BuiltinField[]) {
|
|
return fields.slice(0, DEFAULT_COLUMN_COUNT).map((field) => field.key)
|
|
}
|
|
|
|
export function resolveColumnKeys(fields: BuiltinField[], stored: unknown) {
|
|
if (!Array.isArray(stored)) {
|
|
return defaultColumnKeys(fields)
|
|
}
|
|
const wanted = new Set(stored.filter((key): key is string => typeof key === 'string'))
|
|
const kept = fields
|
|
.map((field) => field.key)
|
|
.filter((key) => wanted.has(key))
|
|
.slice(0, COLUMN_CAP)
|
|
return kept.length > 0 ? kept : defaultColumnKeys(fields)
|
|
}
|
|
|
|
export function readStoredColumns(typeKey: string): unknown {
|
|
try {
|
|
const raw = localStorage.getItem(columnsStorageKey(typeKey))
|
|
return raw === null ? null : JSON.parse(raw)
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
export function storeColumns(typeKey: string, keys: string[]) {
|
|
try {
|
|
localStorage.setItem(columnsStorageKey(typeKey), JSON.stringify(keys))
|
|
} catch {
|
|
return
|
|
}
|
|
}
|
|
|
|
export function clearStoredColumns(typeKey: string) {
|
|
try {
|
|
localStorage.removeItem(columnsStorageKey(typeKey))
|
|
} catch {
|
|
return
|
|
}
|
|
}
|
|
|
|
export function toggleColumnKeys(
|
|
fields: BuiltinField[],
|
|
current: string[],
|
|
key: string,
|
|
on: boolean,
|
|
) {
|
|
const wanted = new Set(current)
|
|
if (on) {
|
|
if (wanted.size >= COLUMN_CAP) {
|
|
return current
|
|
}
|
|
wanted.add(key)
|
|
} else if (wanted.size > 1) {
|
|
wanted.delete(key)
|
|
}
|
|
return fields.map((field) => field.key).filter((fieldKey) => wanted.has(fieldKey))
|
|
}
|