feat: add faceted table toolbars and multi-value filters

Consolidating document and template filtering into shared faceted
toolbars makes filtering easier to discover and use.
Supporting comma-separated query params enables multi-select filters
across UI, server queries, and E2E coverage.
This commit is contained in:
ephraimduncan
2026-02-16 18:40:23 +00:00
parent ff9e6acb7a
commit 335fee09a9
23 changed files with 992 additions and 420 deletions
+24 -5
View File
@@ -1,8 +1,3 @@
/**
* From an unknown string, parse it into an integer array.
*
* Filter out unknown values.
*/
export const parseToIntegerArray = (value: unknown): number[] => {
if (typeof value !== 'string') {
return [];
@@ -14,6 +9,30 @@ export const parseToIntegerArray = (value: unknown): number[] => {
.filter((value) => !isNaN(value));
};
export const parseToStringArray = (value: unknown): string[] => {
if (Array.isArray(value)) {
return value.filter((item): item is string => typeof item === 'string');
}
if (typeof value !== 'string') {
return [];
}
return value
.split(',')
.map((item) => item.trim())
.filter(Boolean);
};
export const parseCommaSeparatedValues = (value: unknown): string[] | undefined => {
const parsed = parseToStringArray(value);
return parsed.length > 0 ? parsed : undefined;
};
export const toCommaSeparatedSearchParam = (values: string[]): string | undefined => {
return values.length > 0 ? values.join(',') : undefined;
};
type GetRootHrefOptions = {
returnEmptyRootString?: boolean;
};