From 8aa05dd9c24cae0375e1e15991dd46643b0c762f Mon Sep 17 00:00:00 2001 From: salmonumbrella <182032677+salmonumbrella@users.noreply.github.com> Date: Sun, 15 Feb 2026 00:11:28 -0800 Subject: [PATCH] Fix namespace-aware filter value matching (#180) --- src/components/ResultsView.tsx | 25 +++++++++++++++++++++++- src/utils/postProcessResults.ts | 34 ++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/components/ResultsView.tsx b/src/components/ResultsView.tsx index 098f6d01..9e13e0d1 100644 --- a/src/components/ResultsView.tsx +++ b/src/components/ResultsView.tsx @@ -39,6 +39,7 @@ import { Condition } from "../utils/types"; import ResultsTable from "./ResultsTable"; import { render as renderSimpleAlert } from "roamjs-components/components/SimpleAlert"; import setInputSettings from "roamjs-components/util/setInputSettings"; +import toCellValue from "../utils/toCellValue"; const VIEWS: Record = { link: { value: false }, @@ -239,6 +240,23 @@ type ResultsViewComponent = (props: { }) => JSX.Element; const head = (s: string | string[]) => (Array.isArray(s) ? s[0] || "" : s); +const toColumnFilterValue = ({ + value, + uid, +}: { + value: Result[string]; + uid: string; +}) => { + if (typeof value === "undefined" || value === null) return ""; + if ( + typeof value === "string" && + !!uid && + getPageTitleByPageUid(uid)?.includes("/") + ) { + return toCellValue({ value, uid }); + } + return value.toString(); +}; type MenuHeadingProps = { onClear: () => void; @@ -757,7 +775,12 @@ const ResultsView: ResultsViewComponent = ({ items={Array.from( new Set( results - .map((r) => r[key].toString()) + .map((r) => + toColumnFilterValue({ + value: r[key], + uid: (r[`${key}-uid`] as string) || "", + }) + ) .filter((v) => !value.includes(v)) ) )} diff --git a/src/utils/postProcessResults.ts b/src/utils/postProcessResults.ts index 46818a58..77106346 100644 --- a/src/utils/postProcessResults.ts +++ b/src/utils/postProcessResults.ts @@ -2,6 +2,7 @@ import { DAILY_NOTE_PAGE_TITLE_REGEX } from "roamjs-components/date/constants"; import { Result } from "roamjs-components/types/query-builder"; import extractTag from "roamjs-components/util/extractTag"; import parseResultSettings from "./parseResultSettings"; +import toCellValue from "./toCellValue"; const transform = (_val: Result[string]) => typeof _val === "string" @@ -11,6 +12,31 @@ const transform = (_val: Result[string]) => ? Number(_val) : _val : _val; +const getFilterCandidateValues = ({ + value, + uid, +}: { + value: Result[string]; + uid: string; +}) => { + const candidates = new Set(); + if (typeof value === "undefined" || value === null) return candidates; + if (value instanceof Date) { + candidates.add(window.roamAlphaAPI.util.dateToPageTitle(value)); + candidates.add(value.toString()); + return candidates; + } + const asString = value.toString(); + candidates.add(asString); + candidates.add(extractTag(asString)); + candidates.add( + toCellValue({ + value: value as string | number, + uid, + }) + ); + return candidates; +}; const sortFunction = (key: string, descending?: boolean) => (a: Result, b: Result) => { const _aVal = a[key]; @@ -81,7 +107,13 @@ const postProcessResults = ( ) { return true; } - return columnFilter.value.some((v) => r[columnFilter.key] === v); + const resultValueCandidates = getFilterCandidateValues({ + value: r[columnFilter.key], + uid: (r[`${columnFilter.key}-uid`] as string) || "", + }); + return columnFilter.value.some((v) => + resultValueCandidates.has(v.toString()) + ); case "greater than": const gtFilter = transform(columnFilter.value[0]); const gtResult = transform(r[columnFilter.key]);