Files
CT/src/View/ChatPages/boardPage.tsx
T

169 lines
6.5 KiB
TypeScript
Raw Normal View History

import * as React from "bloatless-react";
2024-07-23 15:41:03 +02:00
import BoardViewModel, {
2026-04-08 14:02:12 +00:00
BoardPageTypes,
2024-07-23 15:41:03 +02:00
} from "../../ViewModel/Pages/boardViewModel";
2024-07-25 01:38:11 +02:00
import { BoardKanbanPage } from "./boardKanbanPage";
2024-07-23 13:09:46 +02:00
import { BoardSettingsModal } from "../Modals/boardSettingsModal";
2024-07-25 04:12:30 +02:00
import { BoardStatusGridPage } from "./boardStatusGridPage";
2024-07-23 15:41:03 +02:00
import { BoardViewToggleButton } from "../Components/boardViewToggleButton";
2024-07-25 15:31:27 +02:00
import { SearchModal } from "../Modals/searchModal";
2024-07-24 13:31:28 +02:00
import { TaskSettingsModal } from "../Modals/taskSettingsModal";
import { TaskViewModelToEntry } from "../Components/taskEntry";
2026-04-01 08:53:50 +00:00
import { setFocusWithDelay } from "../utility";
import CoreViewModel from "../../ViewModel/Global/coreViewModel";
import { ViewPersistence } from "../viewPersistence";
export function BoardPage(
coreViewModel: CoreViewModel,
boardViewModel: BoardViewModel,
) {
2026-04-01 08:29:39 +00:00
boardViewModel.loadData();
2026-04-01 08:29:39 +00:00
// main content
const persistenceId = boardViewModel.boardInfo.fileId;
const pages = ViewPersistence.boardPages.setPages(persistenceId, ()=>React.createProxyState(
2026-04-01 08:29:39 +00:00
[boardViewModel.selectedPage],
() => {
switch (boardViewModel.selectedPage.value) {
2026-04-08 14:02:12 +00:00
case BoardPageTypes.Kanban: {
return BoardKanbanPage(coreViewModel, boardViewModel);
2026-04-01 08:29:39 +00:00
}
2026-04-08 14:02:12 +00:00
case BoardPageTypes.StatusGrid: {
return BoardStatusGridPage(coreViewModel, boardViewModel);
2026-04-01 08:29:39 +00:00
}
default: {
return (
<div
class="task-grid"
children:append={[
boardViewModel.filteredTaskViewModels,
TaskViewModelToEntry,
]}
></div>
);
}
}
},
));
2024-07-23 22:46:23 +02:00
2026-04-01 08:29:39 +00:00
// task modal
const taskSettingsModal = React.createProxyState(
[boardViewModel.selectedTaskViewModel],
() => {
if (boardViewModel.selectedTaskViewModel.value == undefined) {
return <div></div>;
} else {
2026-04-01 08:53:50 +00:00
setFocusWithDelay();
2026-04-01 08:29:39 +00:00
return TaskSettingsModal(
coreViewModel,
2026-04-01 08:29:39 +00:00
boardViewModel.selectedTaskViewModel.value,
);
}
},
);
2024-07-24 13:31:28 +02:00
2026-04-01 08:29:39 +00:00
return (
<div class="pane">
<div class="toolbar">
<span>
<button
class="ghost board-close-button"
aria-label={
coreViewModel.translations.chatPage.task
2026-04-01 08:29:39 +00:00
.closeBoardButtonAudioLabel
}
on:click={boardViewModel.close}
>
<span class="icon">arrow_back</span>
</button>
<button
class="ghost board-toggle-button inset-outline"
aria-label={
coreViewModel.translations.chatPage.task
2026-04-01 08:29:39 +00:00
.toggleBoardButtonAudioLabel
}
on:click={
boardViewModel.taskPageViewModel.toggleBoardList
}
toggle:selected={
boardViewModel.taskPageViewModel.isShowingBoadList
}
>
<span class="icon">dock_to_right</span>
</button>
<button
class="ghost"
aria-label={
coreViewModel.translations.chatPage.task
.boardSettingsHeadline
2026-04-01 08:29:39 +00:00
}
on:click={boardViewModel.showSettings}
>
<span class="icon">settings</span>
</button>
</span>
<span class="scroll-h ribbon">
{BoardViewToggleButton(
coreViewModel.translations.chatPage.task
.listViewButtonAudioLabel,
2026-04-01 08:29:39 +00:00
"view_list",
2026-04-08 14:02:12 +00:00
BoardPageTypes.List,
2026-04-01 08:29:39 +00:00
boardViewModel,
)}
{BoardViewToggleButton(
coreViewModel.translations.chatPage.task
.kanbanViewButtonAudioLabel,
2026-04-01 08:29:39 +00:00
"view_kanban",
2026-04-08 14:02:12 +00:00
BoardPageTypes.Kanban,
2026-04-01 08:29:39 +00:00
boardViewModel,
)}
{BoardViewToggleButton(
coreViewModel.translations.chatPage.task
.statusViewButtonAudioLabel,
2026-04-01 08:29:39 +00:00
"grid_view",
2026-04-08 14:02:12 +00:00
BoardPageTypes.StatusGrid,
2026-04-01 08:29:39 +00:00
boardViewModel,
)}
</span>
<span>
<button
2026-04-12 19:30:17 +00:00
class="ghost inset-outline"
2026-04-01 08:29:39 +00:00
aria-label={
coreViewModel.translations.chatPage.task
2026-04-01 08:29:39 +00:00
.filterTasksButtonAudioLabel
}
on:click={boardViewModel.showFilterModal}
toggle:selected={boardViewModel.isFilterActive}
2026-04-01 08:29:39 +00:00
>
<span class="icon">filter_alt</span>
2026-04-01 08:29:39 +00:00
</button>
<button
class="ghost"
aria-label={
coreViewModel.translations.chatPage.task
2026-04-01 08:29:39 +00:00
.createTaskButtonAudioLabel
}
on:click={boardViewModel.createTask}
>
<span class="icon">add</span>
</button>
</span>
</div>
<div class="content main-content" children:set={pages}></div>
2024-07-23 13:09:46 +02:00
{BoardSettingsModal(coreViewModel, boardViewModel)}
2026-04-01 08:29:39 +00:00
{SearchModal(
coreViewModel,
2026-04-01 08:29:39 +00:00
boardViewModel.searchViewModel,
coreViewModel.translations.chatPage.task.filterTasksHeadline,
2026-04-01 08:29:39 +00:00
TaskViewModelToEntry,
boardViewModel.isPresentingFilterModal,
)}
<div children:set={taskSettingsModal}></div>
</div>
);
}