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 3e385548f..9c2119f3f 100644
--- a/apps/client/src/widgets/view_widgets/board_view/index.ts
+++ b/apps/client/src/widgets/view_widgets/board_view/index.ts
@@ -3,6 +3,7 @@ import ViewMode, { ViewModeArgs } from "../view_mode";
import { getBoardData } from "./data";
import attributeService from "../../../services/attributes";
import branchService from "../../../services/branches";
+import noteCreateService from "../../../services/note_create";
import appContext, { EventData } from "../../../components/app_context";
const TPL = /*html*/`
@@ -86,6 +87,28 @@ const TPL = /*html*/`
.board-drop-indicator.show {
opacity: 1;
}
+
+ .board-new-item {
+ margin-top: 0.5em;
+ padding: 0.5em;
+ border: 2px dashed var(--main-border-color);
+ border-radius: 5px;
+ text-align: center;
+ color: var(--muted-text-color);
+ cursor: pointer;
+ transition: all 0.2s ease;
+ background-color: transparent;
+ }
+
+ .board-new-item:hover {
+ border-color: var(--main-text-color);
+ color: var(--main-text-color);
+ background-color: var(--hover-item-background-color);
+ }
+
+ .board-new-item .icon {
+ margin-right: 0.25em;
+ }
@@ -174,6 +197,18 @@ export default class BoardView extends ViewMode {
$columnEl.append($noteEl);
}
+ // Add "New item" link at the bottom of the column
+ const $newItemEl = $("")
+ .addClass("board-new-item")
+ .attr("data-column", column)
+ .html('New item');
+
+ $newItemEl.on("click", () => {
+ this.createNewItem(column);
+ });
+
+ $columnEl.append($newItemEl);
+
$(el).append($columnEl);
}
}
@@ -342,6 +377,31 @@ export default class BoardView extends ViewMode {
$dropIndicator.addClass("show");
}
+ private async createNewItem(column: string) {
+ try {
+ // Get the parent note path
+ const parentNotePath = this.parentNote.noteId;
+
+ // Create a new note as a child of the parent note
+ const { note: newNote } = await noteCreateService.createNote(parentNotePath, {
+ activate: false
+ });
+
+ if (newNote) {
+ // Set the status label to place it in the correct column
+ await attributeService.setLabel(newNote.noteId, "status", column);
+
+ // Refresh the board to show the new item
+ await this.renderList();
+
+ // Optionally, open the new note for editing
+ appContext.triggerCommand("openInPopup", { noteIdOrPath: newNote.noteId });
+ }
+ } catch (error) {
+ console.error("Failed to create new item:", error);
+ }
+ }
+
async onEntitiesReloaded({ loadResults }: EventData<"entitiesReloaded">) {
// React to changes in "status" attribute for notes in this board
if (loadResults.getAttributeRows().some(attr => attr.name === "status" && this.noteIds.includes(attr.noteId!))) {