feat(views/table): support recursive children update

This commit is contained in:
Elian Doran
2025-07-14 13:12:54 +03:00
parent 8c56315313
commit 402540f483
4 changed files with 35 additions and 26 deletions

View File

@@ -259,6 +259,7 @@ class FNote {
async getSubtreeNoteIds() {
let noteIds: (string | string[])[] = [];
for (const child of await this.getChildNotes()) {
noteIds.push(child.noteId);
noteIds.push(await child.getSubtreeNoteIds());
}
return noteIds.flat();

View File

@@ -6,33 +6,18 @@ import TableView from "../widgets/view_widgets/table_view/index.js";
import type { ViewModeArgs } from "../widgets/view_widgets/view_mode.js";
import type ViewMode from "../widgets/view_widgets/view_mode.js";
export type ArgsWithoutNoteId = Omit<ViewModeArgs, "noteIds">;
export type ViewTypeOptions = "list" | "grid" | "calendar" | "table" | "geoMap";
export default class NoteListRenderer {
private viewType: ViewTypeOptions;
public viewMode: ViewMode<any> | null;
private args: ArgsWithoutNoteId;
public viewMode?: ViewMode<any>;
constructor(args: ViewModeArgs) {
constructor(args: ArgsWithoutNoteId) {
this.args = args;
this.viewType = this.#getViewType(args.parentNote);
switch (this.viewType) {
case "list":
case "grid":
this.viewMode = new ListOrGridView(this.viewType, args);
break;
case "calendar":
this.viewMode = new CalendarView(args);
break;
case "table":
this.viewMode = new TableView(args);
break;
case "geoMap":
this.viewMode = new GeoView(args);
break;
default:
this.viewMode = null;
}
}
#getViewType(parentNote: FNote): ViewTypeOptions {
@@ -57,11 +42,36 @@ export default class NoteListRenderer {
}
async renderList() {
if (!this.viewMode) {
return null;
const args = this.args;
let noteIds: string[];
if (this.viewType === "list" || this.viewType === "grid") {
noteIds = args.parentNote.getChildNoteIds();
} else {
noteIds = await args.parentNote.getSubtreeNoteIds();
}
return await this.viewMode.renderList();
const viewMode = this.#buildViewMode({
...args,
noteIds
});
this.viewMode = viewMode;
return await viewMode.renderList();
}
#buildViewMode(args: ViewModeArgs) {
switch (this.viewType) {
case "calendar":
return new CalendarView(args);
case "table":
return new TableView(args);
case "geoMap":
return new GeoView(args);
case "list":
case "grid":
default:
return new ListOrGridView(this.viewType, args);
}
}
}

View File

@@ -123,8 +123,7 @@ export default class NoteListWidget extends NoteContextAwareWidget {
const noteListRenderer = new NoteListRenderer({
$parent: this.$content,
parentNote: note,
parentNotePath: this.notePath,
noteIds: note.getChildNoteIds()
parentNotePath: this.notePath
});
this.$widget.toggleClass("full-height", noteListRenderer.isFullHeight);
await noteListRenderer.renderList();

View File

@@ -68,7 +68,6 @@ export default class SearchResultWidget extends NoteContextAwareWidget {
const noteListRenderer = new NoteListRenderer({
$parent: this.$content,
parentNote: note,
noteIds: note.getChildNoteIds(),
showNotePath: true
});
await noteListRenderer.renderList();