import * as React from "bloatless-react"; import { Chat, MessageObject } from "../../Model/chatModel"; import { ObjectEntryView } from "./objectEntryView"; import { PlaceholderView } from "./placeholderView"; import { RenameView } from "../renameView"; interface KanbanBoard { category: string; items: React.ListState; } interface KanbanBoardItem { priority: number; messageObject: MessageObject; } export function KanbanView( chat: Chat, selectedObject: React.State, isShowingObjectModal: React.State ) { const boards = new React.MapState(); const sortedBoardNames = React.createProxyState([boards], () => [...boards.value.values()] .map((board) => board.category) .sort((a, b) => a.localeCompare(b)) ); chat.objects.handleAddition((messageObject) => { const latest = chat.getMostRecentContent(messageObject); if (!latest) return; if (!latest.categoryName) return; const categoryName = latest.categoryName!; if (!boards.value.has(categoryName)) { const listState = new React.ListState(); listState.subscribeSilent(() => { if (listState.value.size != 0) return; boards.remove(categoryName); }); boards.set(categoryName, { category: categoryName, items: listState, }); } const boardItem: KanbanBoardItem = { priority: latest.priority ?? 0, messageObject, }; boards.value.get(categoryName)?.items.add(boardItem); chat.objects.handleRemoval(messageObject, () => { boards.value.get(categoryName)?.items.remove(boardItem); }); }); const boardToBoardView: React.StateItemConverter = (board) => { const view = KanbanBoardView( chat, board, selectedObject, isShowingObjectModal ); sortedBoardNames.subscribe((sortedBoardNames) => { view.style.order = sortedBoardNames.indexOf(board.category); }); return view; }; return (
); } function KanbanBoardView( chat: Chat, kanbanBoard: KanbanBoard, selectedObject: React.State, isShowingObjectModal: React.State ) { const editingCategory = new React.State(kanbanBoard.category); function renameBoard() { kanbanBoard.items.value.forEach((kanbanBoardItem) => { const { messageObject } = kanbanBoardItem; const latest = chat.getMostRecentContent(messageObject); latest.categoryName = editingCategory.value; chat.addObjectAndSend(messageObject); }); } function dragOver(event: DragEvent) { event.preventDefault(); } function drop(event: DragEvent) { event.preventDefault(); var id = event.dataTransfer?.getData("text"); if (!id) return; const messageObject = chat.objects.value.get(id); if (!messageObject) return; const latest = chat.getMostRecentContent(messageObject); latest.categoryName = kanbanBoard.category; chat.addObjectAndSend(messageObject); } const itemToViewEntry: React.StateItemConverter = ( kanbanBoardItem ) => { const view = ObjectEntryView( chat, kanbanBoardItem.messageObject, selectedObject, isShowingObjectModal ); view.style.order = kanbanBoardItem.priority * -1; return view; }; return (
{RenameView(editingCategory, kanbanBoard.category, renameBoard)}
); }