You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
5.0 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. <script lang="ts">
  2. import { tick } from "svelte";
  3. import stuffLogClient from "../clients/stufflog";
  4. import type Project from "../models/project";
  5. import type { TaskResult, TaskUpdate } from "../models/task";
  6. import markStale from "../stores/markStale";
  7. import type { ModalData } from "../stores/modal";
  8. import ChildEntry from "./ChildEntry.svelte";
  9. import DateSpan from "./DateSpan.svelte";
  10. import ItemLink from "./ItemLink.svelte";
  11. import Markdown from "./Markdown.svelte";
  12. import Option from "./Option.svelte";
  13. import OptionRow from "./OptionRow.svelte";
  14. import StatusColor from "./StatusColor.svelte";
  15. import TaskIcon from "./TaskIcon.svelte";
  16. export let task: TaskResult = null;
  17. export let project: Project = null;
  18. export let actualProject: Project | null = null;
  19. export let showAllOptions: boolean = false;
  20. export let actualParent: Project | null = null;
  21. let showLogs = false;
  22. let mdLogAdd: ModalData;
  23. let mdTaskEdit: ModalData;
  24. let mdTaskDelete: ModalData;
  25. let mdTaskUnlink: ModalData;
  26. let mdTaskLink: ModalData;
  27. let isMoving = false;
  28. let isLinked = false;
  29. function toggleShowLogs() {
  30. showLogs = !showLogs;
  31. }
  32. function updateTask(update: TaskUpdate) {
  33. isMoving = true;
  34. stuffLogClient.updateTask(task.id, update).finally(() => {
  35. markStale("task", "project");
  36. tick().then(() => {
  37. isMoving = false;
  38. });
  39. });
  40. }
  41. function moveToActive() {
  42. updateTask({clearStatusTag: true, active: true});
  43. }
  44. function moveToToDo() {
  45. updateTask({statusTag: "to do", active: false});
  46. }
  47. function moveToOnHold() {
  48. updateTask({statusTag: "on hold", active: false});
  49. }
  50. function moveToCompleted() {
  51. updateTask({statusTag: "completed", active: false});
  52. }
  53. function moveToFailed() {
  54. updateTask({statusTag: "failed", active: false});
  55. }
  56. function moveToDeclined() {
  57. updateTask({statusTag: "declined", active: false});
  58. }
  59. $: mdLogAdd = {name: "log.add", task: {...task, project}};
  60. $: mdTaskEdit = {name: "task.edit", task: {...task, project}};
  61. $: mdTaskDelete = {name: "task.delete", task: {...task, project}};
  62. $: mdTaskLink = {name: "tasklink.add", task};
  63. $: mdTaskUnlink = {name: "tasklink.delete", task, project};
  64. $: isLinked = task.projectId !== project.id;
  65. $: actualParent = (actualProject != null && actualProject.id !== project.id) ? actualProject : null;
  66. </script>
  67. <StatusColor affects="task" entry={task}>
  68. <ChildEntry entry={task} actualParent={actualParent} hideParentName={!showAllOptions}>
  69. <div slot="icon">
  70. <TaskIcon task={task} />
  71. </div>
  72. <ItemLink item={task.item} />
  73. <OptionRow>
  74. {#if task.logs.length > 0}
  75. <Option on:click={toggleShowLogs}>{showLogs ? "Hide Logs" : "Show Logs"}</Option>
  76. {/if}
  77. <Option open={mdLogAdd}>Add Log</Option>
  78. {#if showAllOptions}
  79. <Option open={mdTaskEdit}>Edit</Option>
  80. {#if isLinked}
  81. <Option open={mdTaskUnlink}>Unlink</Option>
  82. {:else}
  83. <Option open={mdTaskLink}>Link</Option>
  84. <Option open={mdTaskDelete}>Delete</Option>
  85. {/if}
  86. ·
  87. {#if !isMoving && (!task.active) }
  88. <Option on:click={moveToActive}>Active</Option>
  89. {/if}
  90. {#if !isMoving && (task.statusTag !== "to do") }
  91. <Option color="yellow" on:click={moveToToDo}>To Do</Option>
  92. {/if}
  93. {#if !isMoving && (task.statusTag !== "on hold") }
  94. <Option color="blue" on:click={moveToOnHold}>On Hold</Option>
  95. {/if}
  96. {#if !isMoving && (task.statusTag !== "declined") }
  97. <Option color="purple" on:click={moveToDeclined}>Won't Do</Option>
  98. {/if}
  99. {#if !isMoving && task.active }
  100. <Option color="green" on:click={moveToCompleted}>Completed</Option>
  101. {/if}
  102. {#if !isMoving && (task.statusTag !== "failed") }
  103. <Option color="red" on:click={moveToFailed}>Failed</Option>
  104. {/if}
  105. {:else}
  106. ·
  107. {#if !isMoving && (!task.active) }
  108. <Option on:click={moveToActive}>Active</Option>
  109. {/if}
  110. {#if !isMoving && (task.statusTag !== "to do") }
  111. <Option color="yellow" on:click={moveToToDo}>To Do</Option>
  112. {/if}
  113. {#if !isMoving && (task.statusTag !== "on hold") }
  114. <Option color="blue" on:click={moveToOnHold}>On Hold</Option>
  115. {/if}
  116. {#if !isMoving && task.active }
  117. <Option color="green" on:click={moveToCompleted}>Completed</Option>
  118. {/if}
  119. {/if}
  120. </OptionRow>
  121. {#if showLogs && task.logs.length > 0}
  122. <div class="log-list">
  123. {#each task.logs as log (log.id)}
  124. <div class="log">
  125. <div class="log-time"><DateSpan time={log.loggedTime} /></div>
  126. <div class="log-description">
  127. <Markdown source={log.description} />
  128. </div>
  129. </div>
  130. {/each}
  131. </div>
  132. {/if}
  133. </ChildEntry>
  134. </StatusColor>
  135. <style>
  136. div.log-list {
  137. padding: 0.5em 0;
  138. }
  139. div.log {
  140. padding: 0.25em 1ch;
  141. }
  142. div.log-time {
  143. font-size: 0.75em;
  144. font-weight: 800;
  145. }
  146. </style>