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.

131 lines
4.2 KiB

  1. <script lang="ts">
  2. import stuffLogClient from "../clients/stufflog";
  3. import DeadlineSelect from "../components/DeadlineSelect.svelte";
  4. import ItemSelect from "../components/ItemSelect.svelte";
  5. import Modal from "../components/Modal.svelte";
  6. import ProjectSelect from "../components/ProjectSelect.svelte";
  7. import StatusTagSelect from "../components/StatusTagSelect.svelte";
  8. import { iconNames } from "../external/icons";
  9. import type { TaskResult } from "../models/task";
  10. import markStale from "../stores/markStale";
  11. import modalStore from "../stores/modal";
  12. import { formatFormTime } from "../utils/time";
  13. export let deletion = false;
  14. export let creation = false;
  15. const md = $modalStore;
  16. let task: TaskResult = {
  17. id: "",
  18. itemId: "",
  19. projectId: "",
  20. itemAmount: 1,
  21. name: "",
  22. description: "",
  23. icon: iconNames[0],
  24. active: false,
  25. createdTime: "",
  26. item: null,
  27. logs: [],
  28. completedAmount: 0,
  29. statusTag: "to do",
  30. }
  31. let verb = "Add";
  32. if (md.name === "task.edit" || md.name === "task.delete") {
  33. task = md.task;
  34. verb = (md.name === "task.edit") ? "Edit" : "Delete";
  35. } else if (md.name === "task.add") {
  36. task.projectId = md.project.id;
  37. task.project = md.project;
  38. if (md.project.tasks.length > 0) {
  39. task.itemId = md.project.tasks[0].itemId;
  40. }
  41. } else {
  42. throw new Error("Wrong form")
  43. }
  44. let endTime = formatFormTime(task.endTime);
  45. let itemId = task.itemId;
  46. let name = task.name;
  47. let description = task.description;
  48. let itemAmount = task.itemAmount;
  49. let statusTag = task.statusTag || "";
  50. let projectId = task.projectId;
  51. let error = null;
  52. let loading = false;
  53. function onSubmit() {
  54. loading = true;
  55. error = null;
  56. if (creation) {
  57. stuffLogClient.createTask({
  58. projectId: task.projectId,
  59. itemId: itemId,
  60. active: statusTag === "",
  61. statusTag: statusTag || null,
  62. endTime: (endTime == "") ? null : new Date(endTime),
  63. name, description, itemAmount,
  64. }).then(() => {
  65. markStale("project", "task");
  66. modalStore.close();
  67. }).catch(err => {
  68. error = err.message ? err.message : err.toString();
  69. }).finally(() => {
  70. loading = false;
  71. })
  72. } else if (deletion) {
  73. stuffLogClient.deleteTask(task.id).then(() => {
  74. markStale("goal", "project", "task");
  75. modalStore.close();
  76. }).catch(err => {
  77. error = err.message ? err.message : err.toString();
  78. }).finally(() => {
  79. loading = false;
  80. })
  81. } else {
  82. stuffLogClient.updateTask(task.id, {
  83. endTime: (endTime == "") ? null : new Date(endTime),
  84. clearEndTime: endTime == "",
  85. active: statusTag === "",
  86. statusTag: statusTag || null,
  87. clearStatusTag: statusTag === "",
  88. projectId: (projectId !== task.projectId) ? projectId : null,
  89. itemId, name, description, itemAmount,
  90. }).then(() => {
  91. markStale("goal", "project", "task", "log");
  92. modalStore.close();
  93. }).catch(err => {
  94. error = err.message ? err.message : err.toString();
  95. }).finally(() => {
  96. loading = false;
  97. })
  98. }
  99. }
  100. </script>
  101. <Modal show title="{verb} Task" error={error} closable on:close={modalStore.close}>
  102. <form on:submit|preventDefault={onSubmit}>
  103. <label for="projectName">Project</label>
  104. <ProjectSelect disabled={deletion || creation} name="projectName" bind:value={projectId} groupId={task.project.groupId} />
  105. <label for="name">Name</label>
  106. <input disabled={deletion} name="name" type="text" bind:value={name} />
  107. <label for="description">Description</label>
  108. <textarea disabled={deletion} name="description" bind:value={description} />
  109. <label for="itemId">Item</label>
  110. <ItemSelect disabled={deletion} name="itemId" bind:value={itemId} />
  111. <label for="itemAmount">Amount</label>
  112. <input disabled={deletion} name="itemAmount" type="number" bind:value={itemAmount} />
  113. <label for="endTime">Deadline (Optional)</label>
  114. <DeadlineSelect disabled={deletion} bind:value={endTime} />
  115. <label for="statusTag">Status</label>
  116. <StatusTagSelect disabled={deletion} bind:value={statusTag} />
  117. <hr />
  118. <button disabled={loading} type="submit">{verb} Task</button>
  119. </form>
  120. </Modal>