From b1b756b179b0c71b4f7bf361361d1dd21baa1151 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 19 Jul 2025 22:21:24 +0300 Subject: [PATCH] feat(views/board): store new columns into config --- .../widgets/view_widgets/board_view/config.ts | 7 +++++ .../widgets/view_widgets/board_view/data.ts | 28 +++++++++++++++++-- .../widgets/view_widgets/board_view/index.ts | 25 +++++++++++++---- 3 files changed, 52 insertions(+), 8 deletions(-) create mode 100644 apps/client/src/widgets/view_widgets/board_view/config.ts diff --git a/apps/client/src/widgets/view_widgets/board_view/config.ts b/apps/client/src/widgets/view_widgets/board_view/config.ts new file mode 100644 index 000000000..def136da7 --- /dev/null +++ b/apps/client/src/widgets/view_widgets/board_view/config.ts @@ -0,0 +1,7 @@ +interface BoardColumnData { + value: string; +} + +export interface BoardData { + columns?: BoardColumnData[]; +} diff --git a/apps/client/src/widgets/view_widgets/board_view/data.ts b/apps/client/src/widgets/view_widgets/board_view/data.ts index bd624e1f7..7ace172d1 100644 --- a/apps/client/src/widgets/view_widgets/board_view/data.ts +++ b/apps/client/src/widgets/view_widgets/board_view/data.ts @@ -1,18 +1,42 @@ import FBranch from "../../../entities/fbranch"; import FNote from "../../../entities/fnote"; +import { BoardData } from "./config"; type ColumnMap = Map; -export async function getBoardData(parentNote: FNote, groupByColumn: string) { +export async function getBoardData(parentNote: FNote, groupByColumn: string, persistedData: BoardData) { const byColumn: ColumnMap = new Map(); await recursiveGroupBy(parentNote.getChildBranches(), byColumn, groupByColumn); + let newPersistedData: BoardData | undefined; + if (persistedData) { + // Check if we have new columns. + const existingColumns = persistedData.columns?.map(c => c.value) || []; + for (const column of existingColumns) { + if (!byColumn.has(column)) { + byColumn.set(column, []); + } + } + + const newColumns = [...byColumn.keys()] + .filter(column => !existingColumns.includes(column)) + .map(column => ({ value: column })); + + if (newColumns.length > 0) { + newPersistedData = { + ...persistedData, + columns: [...(persistedData.columns || []), ...newColumns] + }; + } + } + return { - byColumn + byColumn, + newPersistedData }; } diff --git a/apps/client/src/widgets/view_widgets/board_view/index.ts b/apps/client/src/widgets/view_widgets/board_view/index.ts index c5ae51c46..b85368c0b 100644 --- a/apps/client/src/widgets/view_widgets/board_view/index.ts +++ b/apps/client/src/widgets/view_widgets/board_view/index.ts @@ -5,6 +5,8 @@ import attributeService from "../../../services/attributes"; import branchService from "../../../services/branches"; import noteCreateService from "../../../services/note_create"; import appContext, { EventData } from "../../../components/app_context"; +import { BoardData } from "./config"; +import SpacedUpdate from "../../../services/spaced_update"; const TPL = /*html*/`
@@ -115,17 +117,15 @@ const TPL = /*html*/`
`; -export interface StateInfo { - -}; - -export default class BoardView extends ViewMode { +export default class BoardView extends ViewMode { private $root: JQuery; private $container: JQuery; + private spacedUpdate: SpacedUpdate; private draggedNote: any = null; private draggedBranch: any = null; private draggedNoteElement: JQuery | null = null; + private persistentData: BoardData; constructor(args: ViewModeArgs) { super(args, "board"); @@ -133,6 +133,10 @@ export default class BoardView extends ViewMode { this.$root = $(TPL); setupHorizontalScrollViaWheel(this.$root); this.$container = this.$root.find(".board-view-container"); + this.spacedUpdate = new SpacedUpdate(() => this.onSave(), 5_000); + this.persistentData = { + columns: [] + }; args.$parent.append(this.$root); } @@ -145,7 +149,12 @@ export default class BoardView extends ViewMode { } private async renderBoard(el: HTMLElement) { - const data = await getBoardData(this.parentNote, "status"); + const data = await getBoardData(this.parentNote, "status", this.persistentData); + + if (data.newPersistedData) { + this.persistentData = data.newPersistedData; + this.viewStorage.store(this.persistentData); + } for (const column of data.byColumn.keys()) { const columnItems = data.byColumn.get(column); @@ -421,4 +430,8 @@ export default class BoardView extends ViewMode { return false; } + private onSave() { + this.viewStorage.store(this.persistentData); + } + }