55 lines
1.2 KiB
JavaScript
55 lines
1.2 KiB
JavaScript
import { ref } from 'vue'
|
|
|
|
export function useColumnPreferences(storageKey) {
|
|
const hidden = ref([])
|
|
|
|
const load = () => {
|
|
try {
|
|
const raw = localStorage.getItem(storageKey)
|
|
if (!raw) return
|
|
const parsed = JSON.parse(raw)
|
|
if (Array.isArray(parsed)) {
|
|
hidden.value = parsed.filter((x) => typeof x === 'string')
|
|
}
|
|
} catch {
|
|
hidden.value = []
|
|
}
|
|
}
|
|
|
|
const save = () => {
|
|
try {
|
|
localStorage.setItem(storageKey, JSON.stringify(hidden.value))
|
|
} catch {
|
|
/* quota / private mode — ignore */
|
|
}
|
|
}
|
|
|
|
const isVisible = (key) => !hidden.value.includes(key)
|
|
|
|
const toggle = (key) => {
|
|
const i = hidden.value.indexOf(key)
|
|
if (i >= 0) hidden.value.splice(i, 1)
|
|
else hidden.value.push(key)
|
|
save()
|
|
}
|
|
|
|
const setGroupVisible = (groupKeys, visible) => {
|
|
if (visible) {
|
|
hidden.value = hidden.value.filter((k) => !groupKeys.includes(k))
|
|
} else {
|
|
const set = new Set(hidden.value)
|
|
groupKeys.forEach((k) => set.add(k))
|
|
hidden.value = [...set]
|
|
}
|
|
save()
|
|
}
|
|
|
|
const reset = () => {
|
|
hidden.value = []
|
|
save()
|
|
}
|
|
|
|
load()
|
|
return { hidden, isVisible, toggle, setGroupVisible, reset }
|
|
}
|