From bd880dfa06b0cfcaa7e91e3104ca468276e0e553 Mon Sep 17 00:00:00 2001 From: marlon-erler Date: Wed, 24 Jul 2024 01:19:44 +0200 Subject: [PATCH] integrate taskViewModel --- dist/index.js | 154 ++++++++++++++++++----- src/Model/Files/boardModel.ts | 12 +- src/ViewModel/Chat/chatListViewModel.ts | 9 +- src/ViewModel/Chat/chatViewModel.ts | 6 +- src/ViewModel/Pages/boardViewModel.ts | 43 ++++++- src/ViewModel/Pages/taskPageViewModel.ts | 6 +- src/ViewModel/Pages/taskViewModel.ts | 34 ++--- src/index.tsx | 2 +- 8 files changed, 195 insertions(+), 71 deletions(-) diff --git a/dist/index.js b/dist/index.js index 5793701d..891b8ef8 100644 --- a/dist/index.js +++ b/dist/index.js @@ -565,8 +565,8 @@ return Color2; })(Color || {}); - // src/Model/Files/taskModel.ts - var TaskModel = class _TaskModel { + // src/Model/Files/boardModel.ts + var BoardModel = class _BoardModel { storageModel; chatModel; fileModel; @@ -616,7 +616,7 @@ }; // boards createBoard = (name) => { - const boardInfoFileContent = _TaskModel.createBoardInfoFileContent(v4_default(), name, "standard" /* Standard */); + const boardInfoFileContent = _BoardModel.createBoardInfoFileContent(v4_default(), name, "standard" /* Standard */); this.updateBoard(boardInfoFileContent); return boardInfoFileContent; }; @@ -651,13 +651,13 @@ return boardInfoFileContentOrNull; }; //tasks - createTask = (boardId, name) => { - const taskFileContent = _TaskModel.createTaskFileContent( + createTask = (boardId) => { + const taskFileContent = _BoardModel.createTaskFileContent( v4_default(), - name, + "", boardId ); - this.updateTask(taskFileContent); + return taskFileContent; }; updateTask = (taskFileContent) => { this.storeTask(taskFileContent); @@ -678,6 +678,10 @@ const fileIds = this.storageModel.list(taskContainerPath); return fileIds; }; + getTaskFileContent = (taskId) => { + const taskFileContentOrNull = this.fileModel.getLatestFileContent(taskId, TaskFileContentReference); + return taskFileContentOrNull; + }; deleteTask = (boardId, taskId) => { const taskFilePath = this.getTaskFilePath(taskId); const taskReferencePath = this.getTaskReferencePath( @@ -828,7 +832,7 @@ constructor(chatModel, storageModel2) { this.chatModel = chatModel; this.storageModel = storageModel2; - this.taskModel = new TaskModel(this.storageModel, chatModel, this); + this.taskModel = new BoardModel(this.storageModel, chatModel, this); } // utility static generateFileContentId = (creationDate) => { @@ -1409,12 +1413,67 @@ } }; + // src/ViewModel/Pages/taskViewModel.ts + var TaskViewModel = class { + boardModel; + boardViewModel; + // data + task; + // paths + getFilePath = () => { + return this.boardModel.getTaskFilePath(this.task.fileId); + }; + // state + name = new State(""); + category = new State(""); + status = new State(""); + description = new State(""); + priority = new State(""); + date = new State(""); + time = new State(""); + // storage + save = () => { + const newTaskFileContent = BoardModel.createTaskFileContent( + this.task.fileId, + this.name.value, + this.boardViewModel.boardInfo.fileId + ); + newTaskFileContent.status = this.status.value; + newTaskFileContent.category = this.category.value; + newTaskFileContent.description = this.description.value; + newTaskFileContent.priority = this.priority.value; + newTaskFileContent.date = this.date.value; + newTaskFileContent.time = this.time.value; + this.boardModel.updateTask(newTaskFileContent); + this.boardViewModel.trackTask(this); + }; + // load + loadAllData = () => { + this.name.value = this.task.name; + this.category.value = this.task.category ?? ""; + this.status.value = this.task.status ?? ""; + this.description.value = this.task.description ?? ""; + this.priority.value = this.task.priority ?? ""; + this.date.value = this.task.date ?? ""; + this.time.value = this.task.time ?? ""; + }; + // init + constructor(boardModel, boardViewModel, taskFileContent) { + this.boardModel = boardModel; + this.boardViewModel = boardViewModel; + this.task = taskFileContent; + this.loadAllData(); + } + }; + // src/ViewModel/Pages/boardViewModel.ts var BoardViewModel = class { storageModel; + boardModel; taskPageViewModel; - // state + // data boardInfo; + // state name = new State(""); color = new State("standard" /* Standard */); isSelected; @@ -1425,6 +1484,7 @@ "list" /* List */ ); index = new State(0); + taskViewModels = new MapState(); // paths getBasePath = () => { return [...this.taskPageViewModel.getBoardViewPath(this.boardInfo.fileId)]; @@ -1462,9 +1522,9 @@ const index = this.taskPageViewModel.boardIndexManager.getIndex(this); this.index.value = index; }; - // methods + // settings saveSettings = () => { - const newBoardInfoFileContent = TaskModel.createBoardInfoFileContent( + const newBoardInfoFileContent = BoardModel.createBoardInfoFileContent( this.boardInfo.fileId, this.name.value, this.color.value @@ -1478,7 +1538,16 @@ this.taskPageViewModel.deleteBoard(this.boardInfo); this.close(); }; - // store + // tasks + createTask = () => { + const taskFileContent = this.boardModel.createTask(this.boardInfo.fileId); + const taskViewModel = new TaskViewModel(this.boardModel, this, taskFileContent); + return taskViewModel; + }; + trackTask = (taskViewModel) => { + this.taskViewModels.set(taskViewModel.task.fileId, taskViewModel); + }; + // storage storeLastUsedView = () => { const path = this.getLastUsedBoardPath(); const lastUsedView = this.selectedPage.value; @@ -1495,12 +1564,30 @@ this.name.value = this.boardInfo.name; this.color.value = this.boardInfo.color; }; + loadTasks = () => { + this.taskViewModels.clear(); + const taskIds = this.boardModel.listTaskIds( + this.boardInfo.fileId + ); + for (const taskId of taskIds) { + const taskFileContent = this.boardModel.getTaskFileContent(taskId); + if (taskFileContent == null) continue; + const taskViewModel = new TaskViewModel( + this.boardModel, + this, + taskFileContent + ); + this.taskViewModels.set(taskFileContent.fileId, taskViewModel); + } + }; loadData = () => { this.restoreLastUsedView(); + this.loadTasks(); }; // init - constructor(taskPageViewModel, boardInfo, storageModel2) { + constructor(storageModel2, boardModel, taskPageViewModel, boardInfo) { this.storageModel = storageModel2; + this.boardModel = boardModel; this.taskPageViewModel = taskPageViewModel; this.boardInfo = boardInfo; this.loadListRelevantData(); @@ -1521,7 +1608,7 @@ // src/ViewModel/Pages/taskPageViewModel.ts var TaskPageViewModel = class { storageModel; - taskModel; + boardModel; chatViewModel; // data boardIndexManager = new IndexManager( @@ -1529,7 +1616,7 @@ ); // paths getBasePath = () => { - return [...this.taskModel.getViewPath()]; + return [...this.boardModel.getViewPath()]; }; getBoardViewPath = (boardId) => { return [...this.getBasePath(), boardId]; @@ -1555,26 +1642,27 @@ // methods createBoard = () => { if (this.cannotCreateBoard.value == true) return; - const boardInfoFileContent = this.taskModel.createBoard(this.newBoardNameInput.value); + const boardInfoFileContent = this.boardModel.createBoard(this.newBoardNameInput.value); this.newBoardNameInput.value = ""; this.showBoardInList(boardInfoFileContent); this.updateIndices(); }; updateBoard = (boardInfoFileContent) => { - this.taskModel.updateBoard(boardInfoFileContent); + this.boardModel.updateBoard(boardInfoFileContent); this.updateIndices(); }; deleteBoard = (boardInfoFileContent) => { - this.taskModel.deleteBoard(boardInfoFileContent.fileId); + this.boardModel.deleteBoard(boardInfoFileContent.fileId); this.boardViewModels.remove(boardInfoFileContent.fileId); this.updateIndices(); }; // view showBoardInList = (boardInfo) => { const boardViewModel = new BoardViewModel( + this.storageModel, + this.boardModel, this, - boardInfo, - this.storageModel + boardInfo ); this.boardViewModels.set(boardInfo.fileId, boardViewModel); }; @@ -1611,9 +1699,9 @@ // load loadData = () => { this.boardViewModels.clear(); - const boardIds = this.taskModel.listBoardIds(); + const boardIds = this.boardModel.listBoardIds(); for (const boardId of boardIds) { - const boardInfo = this.taskModel.getBoardInfo(boardId); + const boardInfo = this.boardModel.getBoardInfo(boardId); if (boardInfo == null) continue; this.showBoardInList(boardInfo); } @@ -1621,11 +1709,11 @@ this.openLastUsedBoard(); }; // init - constructor(taskModel, storageModel2, chatViewModel) { - this.taskModel = taskModel; + constructor(storageModel2, boardModel, chatViewModel) { this.storageModel = storageModel2; + this.boardModel = boardModel; this.chatViewModel = chatViewModel; - taskModel.boardHandlerManager.addHandler( + boardModel.boardHandlerManager.addHandler( (boardInfoFileContent) => { this.showBoardInList(boardInfoFileContent); this.updateIndices(); @@ -1688,14 +1776,14 @@ }); }; // init - constructor(chatModel, storageModel2, settingsViewModel2, chatListViewModel2) { - this.chatModel = chatModel; + constructor(storageModel2, chatModel, settingsViewModel2, chatListViewModel2) { this.storageModel = storageModel2; + this.chatModel = chatModel; this.settingsViewModel = settingsViewModel2; this.chatListViewModel = chatListViewModel2; this.taskPageViewModel = new TaskPageViewModel( - this.chatModel.fileModel.taskModel, this.storageModel, + this.chatModel.fileModel.taskModel, this ); this.messagePageViewModel = new MessagePageViewModel(this); @@ -1712,8 +1800,8 @@ // src/ViewModel/Chat/chatListViewModel.ts var ChatListViewModel = class { - chatListModel; storageModel; + chatListModel; settingsViewModel; // data chatIndexManager = new IndexManager( @@ -1747,8 +1835,8 @@ }; createChatViewModel = (chatModel) => { return new ChatViewModel( - chatModel, this.storageModel, + chatModel, this.settingsViewModel, this ); @@ -1776,9 +1864,9 @@ this.updateIndices(); }; // init - constructor(chatListModel2, storageModel2, settingsViewModel2) { - this.chatListModel = chatListModel2; + constructor(storageModel2, chatListModel2, settingsViewModel2) { this.storageModel = storageModel2; + this.chatListModel = chatListModel2; this.settingsViewModel = settingsViewModel2; this.loadChats(); } @@ -3236,8 +3324,8 @@ var settingsViewModel = new SettingsViewModel(settingsModel); var connectionViewModel = new ConnectionViewModel(connectionModel); var chatListViewModel = new ChatListViewModel( - chatListModel, storageModel, + chatListModel, settingsViewModel ); chatListViewModel.selectedChat.subscribe(() => { diff --git a/src/Model/Files/boardModel.ts b/src/Model/Files/boardModel.ts index acb626ba..0e85bbdb 100644 --- a/src/Model/Files/boardModel.ts +++ b/src/Model/Files/boardModel.ts @@ -128,13 +128,13 @@ export default class BoardModel { }; //tasks - createTask = (boardId: string, name: string): void => { + createTask = (boardId: string): TaskFileContent => { const taskFileContent: TaskFileContent = BoardModel.createTaskFileContent( v4(), - name, + "", boardId ); - this.updateTask(taskFileContent); + return taskFileContent; }; updateTask = (taskFileContent: TaskFileContent): void => { @@ -162,6 +162,12 @@ export default class BoardModel { return fileIds; }; + getTaskFileContent = (taskId: string): TaskFileContent | null => { + const taskFileContentOrNull: TaskFileContent | null = + this.fileModel.getLatestFileContent(taskId, TaskFileContentReference); + return taskFileContentOrNull; + }; + deleteTask = (boardId: string, taskId: string): void => { const taskFilePath: string[] = this.getTaskFilePath(taskId); const taskReferencePath: string[] = this.getTaskReferencePath( diff --git a/src/ViewModel/Chat/chatListViewModel.ts b/src/ViewModel/Chat/chatListViewModel.ts index 999ae8c2..6f3f1c51 100644 --- a/src/ViewModel/Chat/chatListViewModel.ts +++ b/src/ViewModel/Chat/chatListViewModel.ts @@ -3,13 +3,14 @@ import * as React from "bloatless-react"; import ChatListModel from "../../Model/Chat/chatListModel"; import ChatModel from "../../Model/Chat/chatModel"; import ChatViewModel from "./chatViewModel"; +import FileModel from "../../Model/Files/fileModel"; import { IndexManager } from "../../Model/Utility/utility"; import SettingsViewModel from "../Global/settingsViewModel"; import StorageModel from "../../Model/Global/storageModel"; export default class ChatListViewModel { - chatListModel: ChatListModel; storageModel: StorageModel; + chatListModel: ChatListModel; settingsViewModel: SettingsViewModel; // data @@ -55,8 +56,8 @@ export default class ChatListViewModel { createChatViewModel = (chatModel: ChatModel): ChatViewModel => { return new ChatViewModel( - chatModel, this.storageModel, + chatModel, this.settingsViewModel, this ); @@ -90,12 +91,12 @@ export default class ChatListViewModel { // init constructor( - chatListModel: ChatListModel, storageModel: StorageModel, + chatListModel: ChatListModel, settingsViewModel: SettingsViewModel ) { - this.chatListModel = chatListModel; this.storageModel = storageModel; + this.chatListModel = chatListModel; this.settingsViewModel = settingsViewModel; this.loadChats(); diff --git a/src/ViewModel/Chat/chatViewModel.ts b/src/ViewModel/Chat/chatViewModel.ts index 0723afa6..fb018dbe 100644 --- a/src/ViewModel/Chat/chatViewModel.ts +++ b/src/ViewModel/Chat/chatViewModel.ts @@ -77,21 +77,21 @@ export default class ChatViewModel { // init constructor( - chatModel: ChatModel, storageModel: StorageModel, + chatModel: ChatModel, settingsViewModel: SettingsViewModel, chatListViewModel: ChatListViewModel ) { // models - this.chatModel = chatModel; this.storageModel = storageModel; + this.chatModel = chatModel; this.settingsViewModel = settingsViewModel; this.chatListViewModel = chatListViewModel; // page viewModels this.taskPageViewModel = new TaskPageViewModel( - this.chatModel.fileModel.taskModel, this.storageModel, + this.chatModel.fileModel.taskModel, this ); this.messagePageViewModel = new MessagePageViewModel(this); diff --git a/src/ViewModel/Pages/boardViewModel.ts b/src/ViewModel/Pages/boardViewModel.ts index d97f4149..e06f69f3 100644 --- a/src/ViewModel/Pages/boardViewModel.ts +++ b/src/ViewModel/Pages/boardViewModel.ts @@ -2,12 +2,15 @@ import * as React from "bloatless-react"; import BoardModel, { BoardInfoFileContent, - BoardInfoFileContentReference, + TaskFileContent, + TaskFileContentReference, } from "../../Model/Files/boardModel"; import { Color } from "../../colors"; +import FileModel from "../../Model/Files/fileModel"; import StorageModel from "../../Model/Global/storageModel"; import TaskPageViewModel from "./taskPageViewModel"; +import TaskViewModel from "./taskViewModel"; export default class BoardViewModel { storageModel: StorageModel; @@ -33,6 +36,8 @@ export default class BoardViewModel { index: React.State = new React.State(0); + taskViewModels: React.MapState = new React.MapState(); + // paths getBasePath = (): string[] => { return [...this.taskPageViewModel.getBoardViewPath(this.boardInfo.fileId)]; @@ -82,7 +87,7 @@ export default class BoardViewModel { this.index.value = index; }; - // methods + // settings saveSettings = (): void => { const newBoardInfoFileContent: BoardInfoFileContent = BoardModel.createBoardInfoFileContent( @@ -102,7 +107,18 @@ export default class BoardViewModel { this.close(); }; - // store + // tasks + createTask = (): TaskViewModel => { + const taskFileContent: TaskFileContent = this.boardModel.createTask(this.boardInfo.fileId); + const taskViewModel: TaskViewModel = new TaskViewModel(this.boardModel, this, taskFileContent); + return taskViewModel; + } + + trackTask = (taskViewModel: TaskViewModel): void => { + this.taskViewModels.set(taskViewModel.task.fileId, taskViewModel); + } + + // storage storeLastUsedView = (): void => { const path: string[] = this.getLastUsedBoardPath(); const lastUsedView: string = this.selectedPage.value; @@ -123,8 +139,29 @@ export default class BoardViewModel { this.color.value = this.boardInfo.color; }; + loadTasks = (): void => { + this.taskViewModels.clear(); + + const taskIds: string[] = this.boardModel.listTaskIds( + this.boardInfo.fileId + ); + for (const taskId of taskIds) { + const taskFileContent: TaskFileContent | null = + this.boardModel.getTaskFileContent(taskId); + if (taskFileContent == null) continue; + + const taskViewModel: TaskViewModel = new TaskViewModel( + this.boardModel, + this, + taskFileContent + ); + this.taskViewModels.set(taskFileContent.fileId, taskViewModel); + } + }; + loadData = (): void => { this.restoreLastUsedView(); + this.loadTasks(); }; // init diff --git a/src/ViewModel/Pages/taskPageViewModel.ts b/src/ViewModel/Pages/taskPageViewModel.ts index a14be5cc..12a46d9e 100644 --- a/src/ViewModel/Pages/taskPageViewModel.ts +++ b/src/ViewModel/Pages/taskPageViewModel.ts @@ -4,10 +4,10 @@ import BoardModel, { BoardInfoFileContent, BoardInfoFileContentReference, } from "../../Model/Files/boardModel"; +import FileModel, { FileContent } from "../../Model/Files/fileModel"; import BoardViewModel from "./boardViewModel"; import ChatViewModel from "../Chat/chatViewModel"; -import { FileContent } from "../../Model/Files/fileModel"; import { IndexManager } from "../../Model/Utility/utility"; import StorageModel from "../../Model/Global/storageModel"; import { checkMatchesObjectStructure } from "../../Model/Utility/typeSafety"; @@ -154,12 +154,12 @@ export default class TaskPageViewModel { // init constructor( - boardModel: BoardModel, storageModel: StorageModel, + boardModel: BoardModel, chatViewModel: ChatViewModel ) { - this.boardModel = boardModel; this.storageModel = storageModel; + this.boardModel = boardModel; this.chatViewModel = chatViewModel; diff --git a/src/ViewModel/Pages/taskViewModel.ts b/src/ViewModel/Pages/taskViewModel.ts index 5734c3f7..9daae9b4 100644 --- a/src/ViewModel/Pages/taskViewModel.ts +++ b/src/ViewModel/Pages/taskViewModel.ts @@ -6,20 +6,18 @@ import BoardModel, { } from "../../Model/Files/boardModel"; import BoardViewModel from "./boardViewModel"; -import StorageModel from "../../Model/Global/storageModel"; export default class TaskViewModel { boardModel: BoardModel; - storageModel: StorageModel; boardViewModel: BoardViewModel; // data - fileId: string; + task: TaskFileContent; // paths getFilePath = (): string[] => { - return this.boardModel.getTaskFilePath(this.fileId); + return this.boardModel.getTaskFilePath(this.task.fileId); }; // state @@ -38,7 +36,7 @@ export default class TaskViewModel { save = (): void => { const newTaskFileContent: TaskFileContent = BoardModel.createTaskFileContent( - this.fileId, + this.task.fileId, this.name.value, this.boardViewModel.boardInfo.fileId ); @@ -51,39 +49,33 @@ export default class TaskViewModel { newTaskFileContent.time = this.time.value; this.boardModel.updateTask(newTaskFileContent); + this.boardViewModel.trackTask(this); }; // load loadAllData = (): void => { - const path: string[] = this.getFilePath(); - const taskFileContent: TaskFileContent | null = - this.storageModel.readStringifiable(path, TaskFileContentReference); - if (taskFileContent == null) return; + this.name.value = this.task.name; - this.name.value = taskFileContent.name; + this.category.value = this.task.category ?? ""; + this.status.value = this.task.status ?? ""; - this.category.value = taskFileContent.category ?? ""; - this.status.value = taskFileContent.status ?? ""; + this.description.value = this.task.description ?? ""; - this.description.value = taskFileContent.description ?? ""; - - this.priority.value = taskFileContent.priority ?? ""; - this.date.value = taskFileContent.date ?? ""; - this.time.value = taskFileContent.time ?? ""; + this.priority.value = this.task.priority ?? ""; + this.date.value = this.task.date ?? ""; + this.time.value = this.task.time ?? ""; }; // init constructor( boardModel: BoardModel, - storageModel: StorageModel, boardViewModel: BoardViewModel, - fileId: string + taskFileContent: TaskFileContent ) { this.boardModel = boardModel; - this.storageModel = storageModel; this.boardViewModel = boardViewModel; - this.fileId = fileId; + this.task = taskFileContent; this.loadAllData(); } diff --git a/src/index.tsx b/src/index.tsx index b9001d10..4b4e2b42 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -32,8 +32,8 @@ const storageViewModel = new StorageViewModel(storageModel); const settingsViewModel = new SettingsViewModel(settingsModel); const connectionViewModel = new ConnectionViewModel(connectionModel); const chatListViewModel = new ChatListViewModel( - chatListModel, storageModel, + chatListModel, settingsViewModel );