diff --git a/apps/client/src/widgets/view_widgets/table_view/index.ts b/apps/client/src/widgets/view_widgets/table_view/index.ts
index a7b0d1e5e..b77c64f9e 100644
--- a/apps/client/src/widgets/view_widgets/table_view/index.ts
+++ b/apps/client/src/widgets/view_widgets/table_view/index.ts
@@ -6,14 +6,15 @@ import SpacedUpdate from "../../../services/spaced_update.js";
import type { CommandListenerData, EventData } from "../../../components/app_context.js";
import type { Attribute } from "../../../services/attribute_parser.js";
import note_create, { CreateNoteOpts } from "../../../services/note_create.js";
-import {Tabulator, SortModule, FormatModule, InteractionModule, EditModule, ResizeColumnsModule, FrozenColumnsModule, PersistenceModule, MoveColumnsModule, MenuModule, MoveRowsModule, ColumnDefinition} from 'tabulator-tables';
+import {Tabulator, SortModule, FormatModule, InteractionModule, EditModule, ResizeColumnsModule, FrozenColumnsModule, PersistenceModule, MoveColumnsModule, MoveRowsModule, ColumnDefinition, DataTreeModule} from 'tabulator-tables';
import "tabulator-tables/dist/css/tabulator.css";
import "../../../../src/stylesheets/table.css";
import { canReorderRows, configureReorderingRows } from "./dragging.js";
import buildFooter from "./footer.js";
-import getAttributeDefinitionInformation, { buildRowDefinitions } from "./rows.js";
-import { buildColumnDefinitions } from "./columns.js";
+import getAttributeDefinitionInformation, { buildRowDefinitions, TableData } from "./rows.js";
+import { AttributeDefinitionInformation, buildColumnDefinitions } from "./columns.js";
import { setupContextMenu } from "./context_menu.js";
+import { Unwrapped } from "knockout";
const TPL = /*html*/`
@@ -111,32 +112,32 @@ export default class TableView extends ViewMode {
}
private async renderTable(el: HTMLElement) {
- const modules = [ SortModule, FormatModule, InteractionModule, EditModule, ResizeColumnsModule, FrozenColumnsModule, PersistenceModule, MoveColumnsModule, MoveRowsModule ];
+ const info = getAttributeDefinitionInformation(this.parentNote);
+ const modules = [ SortModule, FormatModule, InteractionModule, EditModule, ResizeColumnsModule, FrozenColumnsModule, PersistenceModule, MoveColumnsModule, MoveRowsModule, DataTreeModule ];
for (const module of modules) {
Tabulator.registerModule(module);
}
- this.initialize(el);
+ this.initialize(el, info);
}
- private async initialize(el: HTMLElement) {
- const notes = await froca.getNotes(this.args.noteIds);
- const info = getAttributeDefinitionInformation(this.parentNote);
-
+ private async initialize(el: HTMLElement, info: AttributeDefinitionInformation[]) {
const viewStorage = await this.viewStorage.restore();
this.persistentData = viewStorage?.tableData || {};
const columnDefs = buildColumnDefinitions(info);
- const movableRows = canReorderRows(this.parentNote);
+ const { definitions: rowData, hasChildren } = await buildRowDefinitions(this.parentNote, info);
+ const movableRows = canReorderRows(this.parentNote) && !hasChildren;
this.api = new Tabulator(el, {
layout: "fitDataFill",
index: "noteId",
columns: columnDefs,
- data: await buildRowDefinitions(this.parentNote, notes, info),
+ data: rowData,
persistence: true,
movableColumns: true,
movableRows,
+ dataTree: hasChildren,
footerElement: buildFooter(this.parentNote),
persistenceWriterFunc: (_id, type: string, data: object) => {
(this.persistentData as Record)[type] = data;
@@ -255,9 +256,9 @@ export default class TableView extends ViewMode {
return;
}
- const notes = await froca.getNotes(this.args.noteIds);
const info = getAttributeDefinitionInformation(this.parentNote);
- this.api.replaceData(await buildRowDefinitions(this.parentNote, notes, info));
+ const { definitions } = await buildRowDefinitions(this.parentNote, info);
+ this.api.replaceData(definitions);
if (this.noteIdToEdit) {
const row = this.api?.getRows().find(r => r.getData().noteId === this.noteIdToEdit);
diff --git a/apps/client/src/widgets/view_widgets/table_view/rows.ts b/apps/client/src/widgets/view_widgets/table_view/rows.ts
index 4aa356581..f2e355516 100644
--- a/apps/client/src/widgets/view_widgets/table_view/rows.ts
+++ b/apps/client/src/widgets/view_widgets/table_view/rows.ts
@@ -9,10 +9,12 @@ export type TableData = {
labels: Record;
relations: Record;
branchId: string;
+ _children?: TableData[];
};
-export async function buildRowDefinitions(parentNote: FNote, notes: FNote[], infos: AttributeDefinitionInformation[]) {
+export async function buildRowDefinitions(parentNote: FNote, infos: AttributeDefinitionInformation[]) {
const definitions: TableData[] = [];
+ let hasChildren = false;
for (const branch of parentNote.getChildBranches()) {
const note = await branch.getNote();
if (!note) {
@@ -28,17 +30,28 @@ export async function buildRowDefinitions(parentNote: FNote, notes: FNote[], inf
labels[name] = note.getLabelValue(name);
}
}
- definitions.push({
+
+ const def: TableData = {
iconClass: note.getIcon(),
noteId: note.noteId,
title: note.title,
labels,
relations,
- branchId: branch.branchId
- });
+ branchId: branch.branchId,
+ }
+
+ if (note.hasChildren()) {
+ def._children = (await buildRowDefinitions(note, infos)).definitions;
+ hasChildren = true;
+ }
+
+ definitions.push(def);
}
- return definitions;
+ return {
+ definitions,
+ hasChildren
+ };
}
export default function getAttributeDefinitionInformation(parentNote: FNote) {