diff --git a/apps/client/src/entities/fnote.ts b/apps/client/src/entities/fnote.ts index 5fe9bc67d..0f6df098a 100644 --- a/apps/client/src/entities/fnote.ts +++ b/apps/client/src/entities/fnote.ts @@ -240,7 +240,7 @@ export default class FNote { const aNote = this.froca.getNoteFromCache(aNoteId); - if (aNote.isArchived || aNote.isHiddenCompletely()) { + if (!aNote || aNote.isArchived || aNote.isHiddenCompletely()) { return 1; } diff --git a/apps/client/src/services/content_renderer_text.ts b/apps/client/src/services/content_renderer_text.ts index d70a42501..fbe9dc218 100644 --- a/apps/client/src/services/content_renderer_text.ts +++ b/apps/client/src/services/content_renderer_text.ts @@ -56,9 +56,14 @@ async function renderIncludedNotes(contentEl: HTMLElement) { // Render and integrate the notes. for (const includeNoteEl of includeNoteEls) { const noteId = includeNoteEl.getAttribute("data-note-id"); - if (!noteId) return; + if (!noteId) continue; const note = froca.getNoteFromCache(noteId); + if (!note) { + console.warn(`Unable to include ${noteId} because it could not be found.`); + continue; + } + const renderedContent = (await content_renderer.getRenderedContent(note)).$renderedContent; includeNoteEl.replaceChildren(...renderedContent); } diff --git a/apps/client/src/services/froca-interface.ts b/apps/client/src/services/froca-interface.ts index 156bc684a..80015cc34 100644 --- a/apps/client/src/services/froca-interface.ts +++ b/apps/client/src/services/froca-interface.ts @@ -13,7 +13,7 @@ export interface Froca { getBlob(entityType: string, entityId: string): Promise; getNote(noteId: string, silentNotFoundError?: boolean): Promise; - getNoteFromCache(noteId: string): FNote; + getNoteFromCache(noteId: string): FNote | undefined; getNotesFromCache(noteIds: string[], silentNotFoundError?: boolean): FNote[]; getNotes(noteIds: string[], silentNotFoundError?: boolean): Promise; diff --git a/apps/client/src/services/froca.ts b/apps/client/src/services/froca.ts index a1529db72..646db69d5 100644 --- a/apps/client/src/services/froca.ts +++ b/apps/client/src/services/froca.ts @@ -288,7 +288,7 @@ class FrocaImpl implements Froca { return (await this.getNotes([noteId], silentNotFoundError))[0]; } - getNoteFromCache(noteId: string) { + getNoteFromCache(noteId: string): FNote | undefined { if (!noteId) { throw new Error("Empty noteId"); } diff --git a/apps/client/src/widgets/dialogs/branch_prefix.tsx b/apps/client/src/widgets/dialogs/branch_prefix.tsx index e715c894f..e46b3d36a 100644 --- a/apps/client/src/widgets/dialogs/branch_prefix.tsx +++ b/apps/client/src/widgets/dialogs/branch_prefix.tsx @@ -103,7 +103,7 @@ export default function BranchPrefixDialog() { setPrefix((e.target as HTMLInputElement).value)} /> {isSingleBranch && branches[0] && ( -
- {branches[0].getNoteFromCache().title}
+
- {branches[0].getNoteFromCache()?.title}
)} @@ -113,7 +113,7 @@ export default function BranchPrefixDialog() {
    {branches.map((branch) => { const note = branch.getNoteFromCache(); - return ( + return note && (
  • {branch.prefix && {branch.prefix} - } {note.title} diff --git a/apps/client/src/widgets/dialogs/recent_changes.tsx b/apps/client/src/widgets/dialogs/recent_changes.tsx index 295650e54..60de8b1b0 100644 --- a/apps/client/src/widgets/dialogs/recent_changes.tsx +++ b/apps/client/src/widgets/dialogs/recent_changes.tsx @@ -21,7 +21,7 @@ export default function RecentChangesDialog() { const [ refreshCounter, setRefreshCounter ] = useState(0); const [ shown, setShown ] = useState(false); - useTriliumEvent("showRecentChanges", ({ ancestorNoteId }) => { + useTriliumEvent("showRecentChanges", ({ ancestorNoteId }) => { setAncestorNoteId(ancestorNoteId ?? hoisted_note.getHoistedNoteId()); setShown(true); }); @@ -91,7 +91,7 @@ function RecentChangesTimeline({ groupedByDate, setShown }: { groupedByDate: Map return (
  • {formattedTime} - { !isDeleted + { notePath && !isDeleted ? : }
  • diff --git a/apps/client/src/widgets/note_tree.ts b/apps/client/src/widgets/note_tree.ts index 5d15fccd8..c5ee99d86 100644 --- a/apps/client/src/widgets/note_tree.ts +++ b/apps/client/src/widgets/note_tree.ts @@ -574,6 +574,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { .loadSearchNote(noteId) .then(() => { const note = froca.getNoteFromCache(noteId); + if (!note) return []; let childNoteIds = note.getChildNoteIds(); @@ -585,6 +586,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { }) .then(() => { const note = froca.getNoteFromCache(noteId); + if (!note) return []; return this.prepareChildren(note); }); @@ -740,7 +742,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { const node = $.ui.fancytree.getNode(e as unknown as Event); const note = froca.getNoteFromCache(node.data.noteId); - if (note.isLaunchBarConfig()) { + if (note?.isLaunchBarConfig()) { import("../menus/launcher_context_menu.js").then(({ default: LauncherContextMenu }) => { const launcherContextMenu = new LauncherContextMenu(this, node); launcherContextMenu.show(e); @@ -775,7 +777,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { if (hideArchivedNotes) { const note = branch.getNoteFromCache(); - if (note.hasLabel("archived")) { + if (!note || note.hasLabel("archived")) { continue; } } @@ -1754,7 +1756,7 @@ export default class NoteTreeWidget extends NoteContextAwareWidget { for (const nodeToDuplicate of nodesToDuplicate) { const note = froca.getNoteFromCache(nodeToDuplicate.data.noteId); - if (note.isProtected && !protectedSessionHolder.isProtectedSessionAvailable()) { + if (note?.isProtected && !protectedSessionHolder.isProtectedSessionAvailable()) { continue; }