Files
RenewCMS/web/src/lib/entryColumns.ts
T

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))
}