Skip to content

Commit 575105c

Browse files
committed
fix(dreaming): open report cards from memory palace
1 parent 4faeb37 commit 575105c

2 files changed

Lines changed: 102 additions & 2 deletions

File tree

ui/src/ui/views/dreaming.test.ts

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,98 @@ describe("dreaming view", () => {
414414
setDreamSubTab("scene");
415415
});
416416

417+
it("keeps non-report memory palace card clicks on details", () => {
418+
setDreamSubTab("diary");
419+
setDreamDiarySubTab("palace");
420+
const container = document.createElement("div");
421+
let props: DreamingProps;
422+
const rerender = () => render(renderDreaming(props), container);
423+
props = buildProps({ onRequestUpdate: rerender });
424+
rerender();
425+
426+
const card = expectElement(container, "[data-palace-page='syntheses/travel-system.md']");
427+
card.dispatchEvent(new MouseEvent("click", { bubbles: true }));
428+
429+
expect(textItems(container, ".dreams-diary__insight-list strong")).toContain("Page details");
430+
setDreamDiarySubTab("dreams");
431+
setDreamSubTab("scene");
432+
});
433+
434+
it("opens report memory palace cards on primary click", async () => {
435+
setDreamSubTab("diary");
436+
setDreamDiarySubTab("palace");
437+
const onOpenWikiPage = vi.fn().mockResolvedValue({
438+
title: "Weekly stock report",
439+
path: "reports/weekly-stock.md",
440+
content: "# Weekly stock report\n\nSummary content.",
441+
totalLines: 2,
442+
truncated: false,
443+
});
444+
const container = document.createElement("div");
445+
let props: DreamingProps;
446+
const rerender = () => render(renderDreaming(props), container);
447+
props = buildProps({
448+
onOpenWikiPage,
449+
onRequestUpdate: rerender,
450+
wikiMemoryPalace: {
451+
totalItems: 1,
452+
totalClaims: 0,
453+
totalQuestions: 0,
454+
totalContradictions: 0,
455+
clusters: [
456+
{
457+
key: "report",
458+
label: "Reports",
459+
itemCount: 1,
460+
claimCount: 0,
461+
questionCount: 0,
462+
contradictionCount: 0,
463+
items: [
464+
{
465+
pagePath: "reports/weekly-stock.md",
466+
title: "Weekly stock report",
467+
kind: "report",
468+
claimCount: 0,
469+
questionCount: 0,
470+
contradictionCount: 0,
471+
claims: [],
472+
questions: [],
473+
contradictions: [],
474+
snippet: "Weekly stock summary.",
475+
updatedAt: "2026-04-12T10:00:00.000Z",
476+
},
477+
],
478+
},
479+
],
480+
},
481+
});
482+
rerender();
483+
484+
const card = expectElement(container, "[data-palace-page='reports/weekly-stock.md']");
485+
card.dispatchEvent(new MouseEvent("click", { bubbles: true }));
486+
await Promise.resolve();
487+
await Promise.resolve();
488+
489+
expect(onOpenWikiPage).toHaveBeenCalledWith("reports/weekly-stock.md");
490+
expect(textItems(container, ".dreams-diary__insight-list strong")).not.toContain(
491+
"Page details",
492+
);
493+
expect(compactText(container.querySelector(".dreams-diary__preview-title"))).toBe(
494+
"Weekly stock report",
495+
);
496+
expect(compactText(container.querySelector(".dreams-diary__preview-body"))).toBe(
497+
"# Weekly stock report Summary content.",
498+
);
499+
500+
const closePreviewButton = container.querySelector<HTMLButtonElement>(
501+
".dreams-diary__preview-header .btn",
502+
);
503+
expect(closePreviewButton).toBeInstanceOf(HTMLButtonElement);
504+
closePreviewButton!.dispatchEvent(new MouseEvent("click", { bubbles: true }));
505+
setDreamDiarySubTab("dreams");
506+
setDreamSubTab("scene");
507+
});
508+
417509
it("shows a memory-wiki enablement CTA when wiki subtabs are selected but the plugin is disabled", () => {
418510
setDreamSubTab("diary");
419511
setDreamDiarySubTab("palace");

ui/src/ui/views/dreaming.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
DreamingEntry,
66
WikiImportInsights,
77
WikiMemoryPalace,
8+
WikiMemoryPalaceItem,
89
} from "../controllers/dreaming.ts";
910
import { toSanitizedMarkdownHtml } from "../markdown.ts";
1011

@@ -523,6 +524,14 @@ function toggleExpandedCard(bucket: Set<string>, key: string, requestUpdate?: ()
523524
requestUpdate?.();
524525
}
525526

527+
function handleMemoryPalaceCardClick(item: WikiMemoryPalaceItem, props: DreamingProps): void {
528+
if (item.kind === "report") {
529+
void openWikiPreview(item.pagePath, props);
530+
return;
531+
}
532+
toggleExpandedCard(expandedPalaceCards, item.pagePath, props.onRequestUpdate);
533+
}
534+
526535
async function openWikiPreview(lookup: string, props: DreamingProps): Promise<void> {
527536
wikiPreviewOpen = true;
528537
wikiPreviewLoading = true;
@@ -1180,8 +1189,7 @@ function renderMemoryPalaceSection(props: DreamingProps) {
11801189
<article
11811190
class="dreams-diary__insight-card dreams-diary__insight-card--clickable"
11821191
data-palace-page=${item.pagePath}
1183-
@click=${() =>
1184-
toggleExpandedCard(expandedPalaceCards, item.pagePath, props.onRequestUpdate)}
1192+
@click=${() => handleMemoryPalaceCardClick(item, props)}
11851193
>
11861194
<div class="dreams-diary__insight-topline">
11871195
<div class="dreams-diary__insight-title">${item.title}</div>

0 commit comments

Comments
 (0)