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.

125 lines
3.5 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
  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 showAllOptions: boolean = false;
  19. let showLogs = false;
  20. let mdLogAdd: ModalData;
  21. let mdTaskEdit: ModalData;
  22. let mdTaskDelete: ModalData;
  23. let isMoving = false;
  24. function toggleShowLogs() {
  25. showLogs = !showLogs;
  26. }
  27. function updateTask(update: TaskUpdate) {
  28. isMoving = true;
  29. stuffLogClient.updateTask(task.id, update).finally(() => {
  30. markStale("task", "project");
  31. tick().then(() => {
  32. isMoving = false;
  33. });
  34. });
  35. }
  36. function moveToActive() {
  37. updateTask({clearStatusTag: true, active: true});
  38. }
  39. function moveToToDo() {
  40. updateTask({statusTag: "to do", active: false});
  41. }
  42. function moveToOnHold() {
  43. updateTask({statusTag: "on hold", active: false});
  44. }
  45. function moveToFailed() {
  46. updateTask({statusTag: "failed", active: false});
  47. }
  48. function moveToDeclined() {
  49. updateTask({statusTag: "declined", active: false});
  50. }
  51. $: mdLogAdd = {name: "log.add", task: {...task, project}};
  52. $: mdTaskEdit = {name: "task.edit", task: {...task, project}};
  53. $: mdTaskDelete = {name: "task.delete", task: {...task, project}};
  54. </script>
  55. <StatusColor affects="task" entry={task}>
  56. <ChildEntry entry={task}>
  57. <div slot="icon">
  58. <TaskIcon task={task} />
  59. </div>
  60. <ItemLink item={task.item} />
  61. <OptionRow>
  62. {#if task.logs.length > 0}
  63. <Option on:click={toggleShowLogs}>{showLogs ? "Hide Logs" : "Show Logs"}</Option>
  64. {/if}
  65. <Option open={mdLogAdd}>Add Log</Option>
  66. {#if showAllOptions}
  67. <Option open={mdTaskEdit}>Edit</Option>
  68. <Option open={mdTaskDelete}>Delete</Option>
  69. ·
  70. {#if !isMoving && (!task.active) }
  71. <Option on:click={moveToActive}>Active</Option>
  72. {/if}
  73. {#if !isMoving && (task.statusTag !== "to do") }
  74. <Option on:click={moveToToDo}>To Do</Option>
  75. {/if}
  76. {#if !isMoving && (task.statusTag !== "on hold") }
  77. <Option on:click={moveToOnHold}>On Hold</Option>
  78. {/if}
  79. {#if !isMoving && (task.statusTag !== "declined") }
  80. <Option on:click={moveToDeclined}>Won't Do</Option>
  81. {/if}
  82. {#if !isMoving && (task.statusTag !== "failed") }
  83. <Option on:click={moveToFailed}>Failed</Option>
  84. {/if}
  85. {/if}
  86. </OptionRow>
  87. {#if showLogs && task.logs.length > 0}
  88. <div class="log-list">
  89. {#each task.logs as log (log.id)}
  90. <div class="log">
  91. <div class="log-time"><DateSpan time={log.loggedTime} /></div>
  92. <div class="log-description">
  93. <Markdown source={log.description} />
  94. </div>
  95. </div>
  96. {/each}
  97. </div>
  98. {/if}
  99. </ChildEntry>
  100. </StatusColor>
  101. <style>
  102. div.log-list {
  103. padding: 0.5em 0;
  104. }
  105. div.log {
  106. padding: 0.25em 1ch;
  107. }
  108. div.log-time {
  109. font-size: 0.75em;
  110. font-weight: 800;
  111. }
  112. </style>