// Convert between the board's URL query and a NoteFacets object. The URL query IS the // filter state (so a lens is shareable/bookmarkable and a saved view is just a link). import type { LocationQuery, LocationQueryRaw } from "vue-router"; import type { NoteFacets } from "../stores/notes"; function one(v: LocationQuery[string]): string | undefined { return (Array.isArray(v) ? v[0] : v) ?? undefined; } export function facetsFromQuery(q: LocationQuery): NoteFacets { const rawLabel = q.label; const labels = (Array.isArray(rawLabel) ? rawLabel : [rawLabel]).filter( (x): x is string => typeof x === "string" && x.length > 0, ); const f: NoteFacets = {}; const text = one(q.q); if (text) f.q = text; const color = one(q.color); if (color) f.color = color; if (labels.length) f.label = labels; if (one(q.has_reminder) === "true") f.has_reminder = true; if (one(q.has_attachment) === "true") f.has_attachment = true; const after = one(q.created_after); if (after) f.created_after = after; const before = one(q.created_before); if (before) f.created_before = before; return f; } export function facetsToQuery(f: NoteFacets): LocationQueryRaw { const q: LocationQueryRaw = {}; if (f.q) q.q = f.q; if (f.color) q.color = f.color; if (f.label?.length) q.label = f.label; if (f.has_reminder) q.has_reminder = "true"; if (f.has_attachment) q.has_attachment = "true"; if (f.created_after) q.created_after = f.created_after; if (f.created_before) q.created_before = f.created_before; return q; } // How many facets are active (labels counted individually) — drives the "Filters (N)" badge. export function facetCount(f: NoteFacets): number { let n = 0; if (f.q) n++; if (f.color) n++; n += f.label?.length ?? 0; if (f.has_reminder) n++; if (f.has_attachment) n++; if (f.created_after || f.created_before) n++; return n; }