import { FilterValues, UseFilterOptions, UseFilterReturn } from './useFilter'; /** Et filtervalg med verdi og visningstekst */ export interface FilterOption { value: V; label: string; } type OptionValue = V extends (infer U)[] ? U : V; /** Konfigurasjon for en filterkategori. */ export interface FilterCategoryConfig { options?: ({ value: OptionValue; } & { [key: string]: any; })[]; defaultValue?: V; /** Hent visningstekst fra et option-objekt. Hvis ikke satt, brukes String(value). */ getLabel?: (option: any) => string; } export interface FilterConfigResult { /** Options for useFilter (defaultValues) */ filterOptions: UseFilterOptions; /** Look up the display label for a filter value */ getLabel: (key: keyof T, value: unknown) => string; } /** * Lager UseFilterOptions fra et oppsett av filterkategorier. * Samler defaultValues og label-oppslag automatisk fra config. * * Eksempel: * const { filterOptions, getLabel } = createFilterConfig({ * sykehus: { options: sykehusOptions, defaultValue: ['haukeland'], getLabel: o => o.label }, * status: { options: statusOptions, getLabel: o => o.displayText }, * }); * const filter = useFilter(filterOptions); * getLabel('sykehus', 'haukeland') // → 'Haukeland universitetssjukehus' */ export declare const createFilterConfig: (categories: { [K in keyof T]?: FilterCategoryConfig; }) => FilterConfigResult; /** * Ferdige matcher-funksjoner for typiske filter mønster. * Brukes som deler i matcher objektet til filterItems. * * Eksempel: * const filterMatchers = { * categories: matchFilter.arrayIncludes(m => m.sykehus), * status: matchFilter.exactMatch(m => m.status), * eResept: matchFilter.booleanToggle(m => m.eResept), * }; */ export declare const matchFilter: { /** Array-filter: matcher hvis det er overlapp mellom filterverdier og item-verdier (OR-logikk). */ arrayIncludes: (accessor: (item: TItem) => unknown) => (item: TItem, value: unknown) => boolean; /** Eksakt match: matcher hvis item-verdien er lik én av filterverdiene */ exactMatch: (accessor: (item: TItem) => unknown) => (item: TItem, value: unknown) => boolean; /** Boolean toggle: når filterverdien er true, inkluder kun items der accessor returnerer true */ booleanToggle: (accessor: (item: TItem) => boolean) => (item: TItem, value: unknown) => boolean; /** Fritekstsøk: matcher hvis søketeksten finnes i ett eller flere felt (case-insensitive) */ textSearch: (...accessors: ((item: TItem) => string | undefined)[]) => (item: TItem, value: unknown) => boolean; }; /** * Filtrerer en liste med items basert på aktive filterverdier. * Hvert filter som er satt må matche for at et item skal inkluderes (AND-logikk). * * Eksempel: * const filtered = filterItems(medisiner, filter.filters, { * sykehus: matchFilter.arrayIncludes(m => m.sykehus), * reseptstatus: matchFilter.exactMatch(m => m.reseptstatus), * eResept: matchFilter.booleanToggle(m => m.eResept), * }); */ /** Type for matcher-objektet som sendes til filterItems. Sikrer at keys matcher filtertypen. */ export type FilterMatchers = { [K in keyof T]?: (item: TItem, value: NonNullable) => boolean; }; export declare const filterItems: (items: TItem[], filters: Partial, matchers: FilterMatchers) => TItem[]; /** * Toggler en verdi i et array-basert filter. * Legger til verdien hvis den ikke finnes, fjerner den hvis den finnes. * Setter filteret til undefined hvis arrayet blir tomt. */ export declare const toggleArrayFilter: (filter: UseFilterReturn, filterKey: K, value: T[K] extends (infer U)[] | undefined ? U : never) => void; export {};