This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
<script lang="ts">
|
||||
import type Project from "../models/project";
|
||||
import authStore from "../stores/auth";
|
||||
import projectStore from "../stores/project";
|
||||
|
||||
interface OptGroup {
|
||||
status: string
|
||||
projects: Project[]
|
||||
}
|
||||
|
||||
export let value = "";
|
||||
export let name = "";
|
||||
export let disabled = false;
|
||||
export let optional = false;
|
||||
|
||||
let optGroups: OptGroup[]
|
||||
|
||||
$: {
|
||||
if ($projectStore.stale && !$projectStore.loading) {
|
||||
projectStore.load({});
|
||||
}
|
||||
}
|
||||
|
||||
$: {
|
||||
optGroups = [
|
||||
{
|
||||
status: "Deadlines",
|
||||
projects: $projectStore.projects.filter(p => p.active && p.endTime)
|
||||
},
|
||||
{
|
||||
status: "Active",
|
||||
projects: $projectStore.projects.filter(p => p.active && !p.endTime)
|
||||
},
|
||||
{
|
||||
status: "To Do",
|
||||
projects: $projectStore.projects.filter(p => !p.active && p.statusTag === "to do")
|
||||
},
|
||||
{
|
||||
status: "On Hold",
|
||||
projects: $projectStore.projects.filter(p => !p.active && p.statusTag === "on hold")
|
||||
},
|
||||
{
|
||||
status: "Completed",
|
||||
projects: $projectStore.projects.filter(p => !p.active && p.statusTag === "completed")
|
||||
},
|
||||
{
|
||||
status: "Failed",
|
||||
projects: $projectStore.projects.filter(p => !p.active && p.statusTag === "failed")
|
||||
},
|
||||
]
|
||||
|
||||
for (const group of optGroups) {
|
||||
group.projects.sort((a,b) => a.name.localeCompare(b.name));
|
||||
}
|
||||
}
|
||||
|
||||
$: {
|
||||
if (optGroups.length > 0 && value === "" && !optional) {
|
||||
const nonEmpty = optGroups.find(g => g.projects.length > 0);
|
||||
if (nonEmpty != null) {
|
||||
value = nonEmpty.projects[0].id;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<select name={name} bind:value={value} disabled={disabled || $projectStore.loading}>
|
||||
{#if optional}
|
||||
<option value={""} selected={"" === value}>None</option>
|
||||
{/if}
|
||||
{#each optGroups as group (group.status)}
|
||||
<optgroup label={group.status}>
|
||||
{#each group.projects as project (project.id)}
|
||||
<option value={project.id} selected={project.id === value}>{project.name}</option>
|
||||
{/each}
|
||||
</optgroup>
|
||||
{/each}
|
||||
</select>
|
||||
@@ -3,6 +3,7 @@
|
||||
import DeadlineSelect from "../components/DeadlineSelect.svelte";
|
||||
import ItemSelect from "../components/ItemSelect.svelte";
|
||||
import Modal from "../components/Modal.svelte";
|
||||
import ProjectSelect from "../components/ProjectSelect.svelte";
|
||||
import StatusTagSelect from "../components/StatusTagSelect.svelte";
|
||||
import { iconNames } from "../external/icons";
|
||||
import type { TaskResult } from "../models/task";
|
||||
@@ -50,6 +51,7 @@ import DeadlineSelect from "../components/DeadlineSelect.svelte";
|
||||
let description = task.description;
|
||||
let itemAmount = task.itemAmount;
|
||||
let statusTag = task.statusTag || "";
|
||||
let projectId = task.projectId;
|
||||
|
||||
let error = null;
|
||||
let loading = false;
|
||||
@@ -91,10 +93,11 @@ import DeadlineSelect from "../components/DeadlineSelect.svelte";
|
||||
active: statusTag === "",
|
||||
statusTag: statusTag || null,
|
||||
clearStatusTag: statusTag === "",
|
||||
projectId: (projectId !== task.projectId) ? projectId : null,
|
||||
|
||||
itemId, name, description, itemAmount,
|
||||
}).then(() => {
|
||||
markStale("goal", "project", "task");
|
||||
markStale("goal", "project", "task", "log");
|
||||
modalStore.close();
|
||||
}).catch(err => {
|
||||
error = err.message ? err.message : err.toString();
|
||||
@@ -108,7 +111,7 @@ import DeadlineSelect from "../components/DeadlineSelect.svelte";
|
||||
<Modal show title="{verb} Task" error={error} closable on:close={modalStore.close}>
|
||||
<form on:submit|preventDefault={onSubmit}>
|
||||
<label for="projectName">Project</label>
|
||||
<input disabled name="projectName" type="text" value={task.project.name} />
|
||||
<ProjectSelect disabled={deletion || creation} name="projectName" bind:value={projectId} />
|
||||
<label for="name">Name</label>
|
||||
<input disabled={deletion} name="name" type="text" bind:value={name} />
|
||||
<label for="description">Description</label>
|
||||
|
||||
@@ -49,4 +49,5 @@ export interface TaskUpdate {
|
||||
clearEndTime?: boolean
|
||||
statusTag?: string
|
||||
clearStatusTag?: boolean
|
||||
projectId?: string
|
||||
}
|
||||
Reference in New Issue
Block a user