2024-07-22 13:17:21 +02:00
|
|
|
import * as React from "bloatless-react";
|
|
|
|
|
|
2024-07-23 00:05:48 +02:00
|
|
|
import { BoardInfoToEntry } from "../Components/boardEntry";
|
2024-07-23 12:43:30 +02:00
|
|
|
import { BoardPage } from "./boardPage";
|
2024-07-22 21:07:44 +02:00
|
|
|
import TaskPageViewModel from "../../ViewModel/Pages/taskPageViewModel";
|
2024-07-22 13:17:21 +02:00
|
|
|
import { translations } from "../translations";
|
|
|
|
|
|
2024-07-22 21:07:44 +02:00
|
|
|
export function TaskPage(taskPageViewModel: TaskPageViewModel) {
|
2024-07-23 00:05:48 +02:00
|
|
|
taskPageViewModel.loadData();
|
|
|
|
|
|
2024-07-23 02:57:20 +02:00
|
|
|
const paneContent = React.createProxyState(
|
|
|
|
|
[taskPageViewModel.selectedBoard],
|
|
|
|
|
() => {
|
|
|
|
|
const selectedBoard = taskPageViewModel.selectedBoard.value;
|
|
|
|
|
if (selectedBoard == undefined) {
|
|
|
|
|
return [
|
2024-07-23 12:43:30 +02:00
|
|
|
<div class="pane align-center justify-center">
|
2024-07-23 02:57:20 +02:00
|
|
|
<span class="secondary">
|
|
|
|
|
{translations.chatPage.task.noBoardSelected}
|
|
|
|
|
</span>
|
|
|
|
|
</div>,
|
|
|
|
|
];
|
|
|
|
|
} else {
|
2024-07-23 12:43:30 +02:00
|
|
|
return BoardPage(selectedBoard);
|
2024-07-23 02:57:20 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
2024-07-23 13:09:46 +02:00
|
|
|
const listPaneWrapper = (
|
|
|
|
|
<div class="pane-wrapper side">
|
|
|
|
|
<div class="pane">
|
|
|
|
|
<div class="toolbar">
|
|
|
|
|
<div class="flex-row width-input">
|
|
|
|
|
<input
|
|
|
|
|
bind:value={taskPageViewModel.newBoardNameInput}
|
|
|
|
|
on:enter={taskPageViewModel.createBoard}
|
|
|
|
|
placeholder={translations.chatPage.task.newBoardNamePlaceholder}
|
|
|
|
|
></input>
|
|
|
|
|
<button
|
|
|
|
|
class="primary"
|
|
|
|
|
aria-label={
|
|
|
|
|
translations.chatPage.task.createBoardButtonAudioLabel
|
|
|
|
|
}
|
|
|
|
|
on:click={taskPageViewModel.createBoard}
|
|
|
|
|
toggle:disabled={taskPageViewModel.cannotCreateBoard}
|
|
|
|
|
>
|
|
|
|
|
<span class="icon">add</span>
|
|
|
|
|
</button>
|
2024-07-22 19:50:57 +02:00
|
|
|
</div>
|
2024-07-22 19:43:23 +02:00
|
|
|
</div>
|
2024-07-23 13:09:46 +02:00
|
|
|
<div class="content">
|
|
|
|
|
<div
|
|
|
|
|
class="grid gap"
|
|
|
|
|
style="grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr))"
|
|
|
|
|
children:append={[
|
|
|
|
|
taskPageViewModel.boardViewModels,
|
|
|
|
|
BoardInfoToEntry,
|
|
|
|
|
]}
|
|
|
|
|
></div>
|
|
|
|
|
</div>
|
2024-07-22 13:17:21 +02:00
|
|
|
</div>
|
2024-07-23 13:09:46 +02:00
|
|
|
</div>
|
|
|
|
|
);
|
2024-07-23 02:57:20 +02:00
|
|
|
|
2024-07-23 13:09:46 +02:00
|
|
|
const mainPageWrapper = (
|
|
|
|
|
<div class="pane-wrapper" children:set={paneContent}></div>
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
React.bulkSubscribe([taskPageViewModel.selectedBoard], () => {
|
|
|
|
|
const selectedBoard = taskPageViewModel.selectedBoard.value;
|
|
|
|
|
if (selectedBoard == undefined) {
|
|
|
|
|
listPaneWrapper.scrollIntoView();
|
|
|
|
|
} else {
|
|
|
|
|
mainPageWrapper.scrollIntoView();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div id="task-page">
|
|
|
|
|
{listPaneWrapper}
|
|
|
|
|
{mainPageWrapper}
|
2024-07-22 13:17:21 +02:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|