- {resultCode(index)}
+ {resultCode(match, index)}
@@ -157,7 +167,7 @@ function ResultsTable({ matches }: { matches: FormSearchMatch[] }) {
})}
- {compactMatchReason(match)}
+ {compactMatchReason(match, query)}
- {resultCode(index)}
+ {resultCode(match, index)}
@@ -456,7 +466,7 @@ function MobileCards({ matches }: { matches: FormSearchMatch[] }) {
})}
- {compactMatchReason(match)}
+ {compactMatchReason(match, query)}
@@ -580,6 +590,7 @@ export function FormsSearchResultsPage(props: FormsSearchResultsPageProps) {
}
function FormsSearchResultsPageContent({ query }: FormsSearchResultsPageProps) {
+ const router = useRouter();
const command = useSearchCommand();
const registry = useRegistryRecords("form");
const registryReady = registry.status === "ready";
@@ -604,17 +615,24 @@ function FormsSearchResultsPageContent({ query }: FormsSearchResultsPageProps) {
{query.trim() && scopedMatches.length === 0 ? (
-
+
+ router.push(appModeHomeHref("forms", { query: example, focus: true, run: true }))
+ }
+ />
) : (
<>
-
+
-
+
>
)}
diff --git a/src/components/master-document-flow-mockups.tsx b/src/components/master-document-flow-mockups.tsx
index c0d03eb42..ec52855cf 100644
--- a/src/components/master-document-flow-mockups.tsx
+++ b/src/components/master-document-flow-mockups.tsx
@@ -250,12 +250,12 @@ const monitoringTableRows = [
["> 1 year", "4 weekly", "Full Blood Count (ANC)", "ANC < 1.0 x10^9/L"],
] as const;
-function documentHref(document: DocumentFixture, query = defaultQuery) {
+function documentHref(document: DocumentFixture, query = defaultQuery, evidence?: EvidenceFixture) {
return documentReaderHref({
document: document.slug,
query,
- page: String(document.page),
- chunk: document.chunk,
+ page: String(evidence?.page ?? document.page),
+ chunk: evidence?.id ?? document.chunk,
});
}
@@ -285,12 +285,26 @@ function primaryEvidence(document: DocumentFixture) {
return document.evidence[0] ?? defaultDocument.evidence[0];
}
-function primaryEvidenceLabel(document: DocumentFixture) {
- const evidence = primaryEvidence(document);
- if (evidence.type === "table") return evidence.label;
+function evidenceForType(document: DocumentFixture, type: "all" | EvidenceType) {
+ if (type !== "all") return document.evidence.find((evidence) => evidence.type === type);
+ return document.evidence[0];
+}
+
+function evidenceLabel(evidence: EvidenceFixture) {
if (evidence.type === "quote") return "Quote";
- if (evidence.type === "image") return evidence.label;
- return "Related";
+ if (evidence.type === "related") return "Related";
+ return evidence.label;
+}
+
+function evidenceCountLabel(document: DocumentFixture, type: EvidenceType, label: string) {
+ return `${label} ${document.evidence.filter((evidence) => evidence.type === type).length}`;
+}
+
+function evidenceTypeIconFor(type: EvidenceType): LucideIcon {
+ if (type === "table") return Table2;
+ if (type === "quote") return Quote;
+ if (type === "image") return FileImage;
+ return Layers3;
}
function evidenceTypeLabel(type: EvidenceType) {
@@ -439,12 +453,14 @@ function SearchResultMobileCard({
document,
query,
selected,
+ activeType = "all",
}: {
document: DocumentFixture;
query: string;
selected: boolean;
+ activeType?: "all" | EvidenceType;
}) {
- const evidence = primaryEvidence(document);
+ const evidence = evidenceForType(document, activeType);
return (
-
- {evidenceTypeLabel(evidence.type)}
- ·
- p.{evidence.page}
- ·
- {evidence.relevance}%
+ {evidence ? (
+ <>
+
+ {evidenceTypeLabel(evidence.type)}
+ ·
+ p.{evidence.page}
+ ·
+ {evidence.relevance}%
+ >
+ ) : (
+ <>
+
+ Document match
+ ·
+ p.{document.page}
+ ·
+ {document.relevance}%
+ >
+ )}
{selected ? Best match : }
@@ -484,38 +513,45 @@ function SearchResultMobileCard({
{document.kind} · {document.version}
-
- {evidence.title}
-
+ {evidence ? (
+
+ {evidence.title}
+
+ ) : null}
- {evidence.body}
+
+ {evidence ? evidence.body : document.snippet}
+
{document.status}
-
{primaryEvidenceLabel(document)}
+
{evidence ? evidenceLabel(evidence) : "No extracted evidence"}
Open document
-
- Open evidence
-
+ {evidence ? (
+
+ Open evidence
+
+ ) : null}
);
@@ -606,7 +642,7 @@ export function MasterDocumentSearch() {
document.snippet.toLowerCase().includes(lowered) ||
document.terms.some((term) => lowered.includes(term.toLowerCase()) || term.toLowerCase().includes(lowered));
const matchesType = type === "all" || document.evidence.some((item) => item.type === type);
- return matchesQuery || matchesType || document.slug === defaultDocument.slug;
+ return matchesQuery && matchesType;
});
}, [query, type]);
@@ -730,87 +766,144 @@ export function MasterDocumentSearch() {
Actions
- {filtered.map((document, index) => (
-
-
-
+ {filtered.length === 0 ? (
+
+
+ No documents match “{query}”
+
+
+ Try a broader search term{type !== "all" ? " or reset the evidence filter" : ""}.
+
+ {type !== "all" ? (
+
+ ) : null}
+
+ ) : null}
+ {filtered.map((document, index) => {
+ const rowEvidence = evidenceForType(document, type);
+ return (
+
+
+
+
+
+ {index === 0 ?
Best match :
Relevant}
+
+
+ {document.title}
+
+
+ {document.kind} · {document.version} · {document.source}
+
+
+
- {index === 0 ?
Best match :
Relevant}
+ {rowEvidence ? (
+
{evidenceLabel(rowEvidence)}
+ ) : (
+
No extracted evidence
+ )}
+
p.{rowEvidence?.page ?? document.page}
+
{document.chunk}
+
+
+ {rowEvidence ? rowEvidence.body : document.snippet}
+
+
+
+
{document.status}
+
{document.review}
+
{document.updated}
+
+
+
+ {document.relevance}%
+
+
+
+
- {document.title}
+
-
- {document.kind} · {document.version} · {document.source}
-
-
-
-
-
-
{primaryEvidenceLabel(document)}
-
p.{document.page}
-
{document.chunk}
-
-
- {document.snippet}
-
-
-
-
{document.status}
-
{document.review}
-
{document.updated}
-
-
-
- {document.relevance}%
-
-
-
-
-
-
-
-
-
-
- ))}
+
+ );
+ })}
{[
["all", `All ${document.evidence.length}`],
- ["table", "Tables 1"],
- ["quote", "Quotes 1"],
- ["image", "Images 1"],
- ["related", "Related 1"],
+ ["table", evidenceCountLabel(document, "table", "Tables")],
+ ["quote", evidenceCountLabel(document, "quote", "Quotes")],
+ ["image", evidenceCountLabel(document, "image", "Images")],
+ ["related", evidenceCountLabel(document, "related", "Related")],
].map(([key, label]) => (