2024-07-24 03:36:21 +02:00
|
|
|
import * as React from "bloatless-react";
|
|
|
|
|
|
2024-07-28 17:09:27 +02:00
|
|
|
import {
|
2026-04-01 08:29:39 +00:00
|
|
|
Entry,
|
|
|
|
|
Option,
|
|
|
|
|
StringToOption,
|
|
|
|
|
VersionIdToOption,
|
2024-07-28 17:09:27 +02:00
|
|
|
} from "../Components/option";
|
2024-07-24 15:57:02 +02:00
|
|
|
|
2024-07-24 03:36:21 +02:00
|
|
|
import { DangerousActionButton } from "../Components/dangerousActionButton";
|
|
|
|
|
import TaskViewModel from "../../ViewModel/Pages/taskViewModel";
|
2024-07-27 15:39:04 +02:00
|
|
|
import { v4 } from "uuid";
|
2026-04-09 16:48:22 +00:00
|
|
|
import CoreViewModel from "../../ViewModel/Global/coreViewModel";
|
2024-07-24 03:36:21 +02:00
|
|
|
|
2026-04-09 16:48:22 +00:00
|
|
|
export function TaskSettingsModal(
|
|
|
|
|
coreViewModel: CoreViewModel,
|
|
|
|
|
taskViewModel: TaskViewModel,
|
|
|
|
|
) {
|
2026-04-01 08:29:39 +00:00
|
|
|
const categorySuggestionId = v4();
|
|
|
|
|
const statusSuggestionId = v4();
|
|
|
|
|
|
|
|
|
|
const BoardOptionConverter: React.StateItemConverter<Entry> = (
|
|
|
|
|
entry: Entry,
|
|
|
|
|
) => {
|
|
|
|
|
const isSelected = entry[0] == taskViewModel.task.boardId;
|
|
|
|
|
return Option(entry[1], entry[0], isSelected);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
2026-04-08 21:16:56 +00:00
|
|
|
<div class="modal" open keystroke:s={taskViewModel.closeAndSave}>
|
2024-07-24 15:57:02 +02:00
|
|
|
<div>
|
2026-04-01 08:29:39 +00:00
|
|
|
<main>
|
2026-04-09 16:48:22 +00:00
|
|
|
<h2>
|
|
|
|
|
{
|
|
|
|
|
coreViewModel.translations.chatPage.task
|
|
|
|
|
.taskSettingsHeadline
|
|
|
|
|
}
|
|
|
|
|
</h2>
|
2026-04-01 08:29:39 +00:00
|
|
|
|
|
|
|
|
<label class="tile flex-no">
|
|
|
|
|
<span class="icon">history</span>
|
|
|
|
|
<div>
|
2026-04-09 16:48:22 +00:00
|
|
|
<span>
|
|
|
|
|
{
|
|
|
|
|
coreViewModel.translations.general
|
|
|
|
|
.fileVersionLabel
|
|
|
|
|
}
|
|
|
|
|
</span>
|
2026-04-01 08:29:39 +00:00
|
|
|
<select
|
|
|
|
|
bind:value={taskViewModel.selectedVersionId}
|
|
|
|
|
children:append={[
|
|
|
|
|
taskViewModel.versionIds,
|
|
|
|
|
VersionIdToOption,
|
|
|
|
|
]}
|
|
|
|
|
></select>
|
|
|
|
|
<span class="icon">arrow_drop_down</span>
|
|
|
|
|
</div>
|
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
<hr></hr>
|
|
|
|
|
|
|
|
|
|
<label class="tile flex-no">
|
|
|
|
|
<span class="icon">label</span>
|
|
|
|
|
<div>
|
|
|
|
|
<span>
|
2026-04-09 16:48:22 +00:00
|
|
|
{
|
|
|
|
|
coreViewModel.translations.chatPage.task
|
|
|
|
|
.taskNameLabel
|
|
|
|
|
}
|
2026-04-01 08:29:39 +00:00
|
|
|
</span>
|
2026-04-01 09:33:30 +00:00
|
|
|
<input
|
|
|
|
|
bind:value={taskViewModel.name}
|
|
|
|
|
id="focused"
|
|
|
|
|
></input>
|
2026-04-01 08:29:39 +00:00
|
|
|
</div>
|
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
<label class="tile flex-no">
|
|
|
|
|
<span class="icon">category</span>
|
|
|
|
|
<div>
|
|
|
|
|
<span>
|
2026-04-09 16:48:22 +00:00
|
|
|
{
|
|
|
|
|
coreViewModel.translations.chatPage.task
|
|
|
|
|
.taskBoardLabel
|
|
|
|
|
}
|
2026-04-01 08:29:39 +00:00
|
|
|
</span>
|
|
|
|
|
<select
|
|
|
|
|
bind:value={taskViewModel.boardId}
|
|
|
|
|
children:append={[
|
|
|
|
|
taskViewModel.chatViewModel
|
|
|
|
|
.taskBoardSuggestions,
|
|
|
|
|
BoardOptionConverter,
|
|
|
|
|
]}
|
|
|
|
|
></select>
|
|
|
|
|
<span class="icon">arrow_drop_down</span>
|
|
|
|
|
</div>
|
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
<label class="tile flex-no">
|
|
|
|
|
<span class="icon">description</span>
|
|
|
|
|
<div>
|
|
|
|
|
<span>
|
|
|
|
|
{
|
2026-04-09 16:48:22 +00:00
|
|
|
coreViewModel.translations.chatPage.task
|
2026-04-01 08:29:39 +00:00
|
|
|
.taskDescriptionLabel
|
|
|
|
|
}
|
|
|
|
|
</span>
|
|
|
|
|
<textarea
|
|
|
|
|
rows="10"
|
|
|
|
|
bind:value={taskViewModel.description}
|
|
|
|
|
></textarea>
|
|
|
|
|
</div>
|
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
<hr></hr>
|
|
|
|
|
|
|
|
|
|
<label class="tile flex-no">
|
|
|
|
|
<span class="icon">category</span>
|
|
|
|
|
<div>
|
|
|
|
|
<span>
|
2026-04-09 16:48:22 +00:00
|
|
|
{
|
|
|
|
|
coreViewModel.translations.chatPage.task
|
|
|
|
|
.taskCategoryLabel
|
|
|
|
|
}
|
2026-04-01 08:29:39 +00:00
|
|
|
</span>
|
|
|
|
|
<input
|
|
|
|
|
bind:value={taskViewModel.category}
|
|
|
|
|
list={categorySuggestionId}
|
|
|
|
|
></input>
|
|
|
|
|
</div>
|
|
|
|
|
</label>
|
|
|
|
|
<datalist
|
|
|
|
|
hidden
|
|
|
|
|
id={categorySuggestionId}
|
|
|
|
|
children:append={[
|
|
|
|
|
taskViewModel.coreViewModel.taskCategorySuggestions,
|
|
|
|
|
StringToOption,
|
|
|
|
|
]}
|
|
|
|
|
></datalist>
|
|
|
|
|
|
|
|
|
|
<label class="tile flex-no">
|
|
|
|
|
<span class="icon">clock_loader_40</span>
|
|
|
|
|
<div>
|
|
|
|
|
<span>
|
2026-04-09 16:48:22 +00:00
|
|
|
{
|
|
|
|
|
coreViewModel.translations.chatPage.task
|
|
|
|
|
.taskStatusLabel
|
|
|
|
|
}
|
2026-04-01 08:29:39 +00:00
|
|
|
</span>
|
|
|
|
|
<input
|
|
|
|
|
bind:value={taskViewModel.status}
|
|
|
|
|
list={statusSuggestionId}
|
|
|
|
|
></input>
|
|
|
|
|
</div>
|
|
|
|
|
</label>
|
|
|
|
|
<datalist
|
|
|
|
|
hidden
|
|
|
|
|
id={statusSuggestionId}
|
|
|
|
|
children:append={[
|
|
|
|
|
taskViewModel.coreViewModel.taskStatusSuggestions,
|
|
|
|
|
StringToOption,
|
|
|
|
|
]}
|
|
|
|
|
></datalist>
|
|
|
|
|
|
|
|
|
|
<label class="tile flex-no">
|
|
|
|
|
<span class="icon">priority_high</span>
|
|
|
|
|
<div>
|
|
|
|
|
<span>
|
2026-04-09 16:48:22 +00:00
|
|
|
{
|
|
|
|
|
coreViewModel.translations.chatPage.task
|
|
|
|
|
.taskPriorityLabel
|
|
|
|
|
}
|
2026-04-01 08:29:39 +00:00
|
|
|
</span>
|
|
|
|
|
<input
|
|
|
|
|
type="number"
|
|
|
|
|
bind:value={taskViewModel.priority}
|
|
|
|
|
></input>
|
|
|
|
|
</div>
|
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
<hr></hr>
|
|
|
|
|
|
|
|
|
|
<label class="tile flex-no">
|
|
|
|
|
<span class="icon">calendar_month</span>
|
|
|
|
|
<div>
|
|
|
|
|
<span>
|
2026-04-09 16:48:22 +00:00
|
|
|
{
|
|
|
|
|
coreViewModel.translations.chatPage.task
|
|
|
|
|
.taskDateLabel
|
|
|
|
|
}
|
2026-04-01 08:29:39 +00:00
|
|
|
</span>
|
|
|
|
|
<input
|
|
|
|
|
type="date"
|
|
|
|
|
bind:value={taskViewModel.date}
|
|
|
|
|
></input>
|
|
|
|
|
</div>
|
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
<label class="tile flex-no">
|
|
|
|
|
<span class="icon">schedule</span>
|
|
|
|
|
<div>
|
|
|
|
|
<span>
|
2026-04-09 16:48:22 +00:00
|
|
|
{
|
|
|
|
|
coreViewModel.translations.chatPage.task
|
|
|
|
|
.taskTimeLabel
|
|
|
|
|
}
|
2026-04-01 08:29:39 +00:00
|
|
|
</span>
|
|
|
|
|
<input
|
|
|
|
|
type="time"
|
|
|
|
|
bind:value={taskViewModel.time}
|
|
|
|
|
></input>
|
|
|
|
|
</div>
|
|
|
|
|
</label>
|
|
|
|
|
|
|
|
|
|
<hr></hr>
|
|
|
|
|
|
|
|
|
|
<div class="width-input">
|
|
|
|
|
{DangerousActionButton(
|
2026-04-09 16:48:22 +00:00
|
|
|
coreViewModel,
|
|
|
|
|
coreViewModel.translations.chatPage.task
|
|
|
|
|
.deleteTaskButton,
|
2026-04-01 08:29:39 +00:00
|
|
|
"delete_forever",
|
|
|
|
|
taskViewModel.deleteTask,
|
|
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
</main>
|
|
|
|
|
<div class="flex-row width-100">
|
|
|
|
|
<button
|
|
|
|
|
class="flex"
|
|
|
|
|
on:click={taskViewModel.closeAndDiscard}
|
|
|
|
|
>
|
2026-04-09 16:48:22 +00:00
|
|
|
{coreViewModel.translations.general.closeButton}
|
2026-04-01 08:29:39 +00:00
|
|
|
</button>
|
|
|
|
|
<button
|
|
|
|
|
class="flex primary"
|
|
|
|
|
on:click={taskViewModel.closeAndSave}
|
|
|
|
|
>
|
2026-04-09 16:48:22 +00:00
|
|
|
{coreViewModel.translations.general.saveButton}
|
2026-04-01 08:29:39 +00:00
|
|
|
<span class="icon">save</span>
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
2024-07-24 15:57:02 +02:00
|
|
|
</div>
|
2024-07-24 03:36:21 +02:00
|
|
|
</div>
|
2026-04-01 08:29:39 +00:00
|
|
|
);
|
2024-07-24 03:36:21 +02:00
|
|
|
}
|