/** * Filters a 2D series of `{name, ...}` records by case-insensitive substring on * the `name` field. Keeps the dataset shape (one inner array per series). * Used by the Searcher action's data transform. */ export function filterBySearchText(input: unknown, search: string): unknown { if (!search) return input const needle = search.toLowerCase() if (!Array.isArray(input)) return input return input.map((series: unknown): unknown => { if (!Array.isArray(series)) return series return series.filter((item: unknown) => { if (item == null) return false if (typeof item === 'object' && 'name' in item) { const rawName = (item as { name: unknown }).name const name = rawName == null ? '' : stringifyPrimitive(rawName) return name.toLowerCase().includes(needle) } return stringifyPrimitive(item).toLowerCase().includes(needle) }) }) } function stringifyPrimitive(v: unknown): string { if (typeof v === 'string') return v if (typeof v === 'number' || typeof v === 'boolean') return String(v) return '' }