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.

123 lines
2.9 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. <script lang="ts">
  2. import type Project from "../models/project";
  3. import type { TaskResult } from "../models/task";
  4. import type { ModalData } from "../stores/modal";
  5. import ChildEntry from "./ChildEntry.svelte";
  6. import DateSpan from "./DateSpan.svelte";
  7. import Icon from "./Icon.svelte";
  8. import ItemLink from "./ItemLink.svelte";
  9. import Option from "./Option.svelte";
  10. import OptionRow from "./OptionRow.svelte";
  11. export let task: TaskResult = null;
  12. export let project: Project = null;
  13. export let showAllOptions: boolean = false;
  14. let showLogs = false;
  15. let mdLogAdd: ModalData;
  16. let mdTaskEdit: ModalData;
  17. let mdTaskDelete: ModalData;
  18. function toggleShowLogs() {
  19. showLogs = !showLogs;
  20. }
  21. $: mdLogAdd = {name: "log.add", task: {...task, project}};
  22. $: mdTaskEdit = {name: "task.edit", task: {...task, project}};
  23. $: mdTaskDelete = {name: "task.delete", task: {...task, project}};
  24. </script>
  25. <ChildEntry entry={task}>
  26. <div slot="icon" class="icon" class:done={!task.active}>
  27. {#if !task.active}
  28. <span class="on"><Icon block name="check" /></span>
  29. <span class="off">
  30. {task.completedAmount}&nbsp;/&nbsp;{task.itemAmount}
  31. </span>
  32. {:else}
  33. {task.completedAmount}&nbsp;/&nbsp;{task.itemAmount}
  34. {/if}
  35. </div>
  36. <ItemLink item={task.item} />
  37. <OptionRow>
  38. {#if task.logs.length > 0}
  39. <Option on:click={toggleShowLogs}>{showLogs ? "Hide Logs" : "Show Logs"}</Option>
  40. {/if}
  41. <Option open={mdLogAdd}>Add Log</Option>
  42. {#if showAllOptions}
  43. <Option open={mdTaskEdit}>Edit</Option>
  44. <Option open={mdTaskDelete}>Delete</Option>
  45. {/if}
  46. </OptionRow>
  47. {#if showLogs && task.logs.length > 0}
  48. <div class="log-list">
  49. {#each task.logs as log (log.id)}
  50. <div class="log">
  51. <div class="log-time"><DateSpan time={log.loggedTime} /></div>
  52. <div class="log-description">{log.description}</div>
  53. </div>
  54. {/each}
  55. </div>
  56. {/if}
  57. </ChildEntry>
  58. <style>
  59. div.icon {
  60. display: flex;
  61. flex-direction: column;
  62. font-size: 1em;
  63. padding: 0.2em .5ch;
  64. margin-right: 0.5em;
  65. background: #444;
  66. color: #CCC;
  67. }
  68. div.icon.done {
  69. padding-top: 0.285em;
  70. padding-bottom: 0.115em;
  71. background: #484;
  72. color: #78ff78;
  73. }
  74. div.icon.done span.off {
  75. display: none;
  76. }
  77. div.icon.done:hover {
  78. padding-top: 0.2em;
  79. padding-bottom: 0.2em;
  80. }
  81. div.icon.done:hover span.on {
  82. display: none;
  83. }
  84. div.icon.done:hover span.off {
  85. display: inline;
  86. }
  87. div.log-list {
  88. padding: 0.5em 0;
  89. }
  90. div.log {
  91. padding: 0.25em 1ch;
  92. }
  93. div.log-time {
  94. font-size: 0.75em;
  95. font-weight: 800;
  96. }
  97. div.item {
  98. display: flex;
  99. flex-direction: row;
  100. margin-top: 0.25em;
  101. margin-bottom: 0em;
  102. font-size: 0.75em;
  103. }
  104. div.item div.item-icon {
  105. padding: 0.25em 0.5ch 0.25em 0;
  106. }
  107. div.item div.item-name {
  108. padding: 0.125em;
  109. }
  110. div.item a {
  111. color: inherit;
  112. }
  113. </style>