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.

165 lines
6.0 KiB

  1. <script lang="ts">
  2. import { navigate } from "svelte-routing";
  3. import stuffLogClient from "../clients/stufflog";
  4. import Checkbox from "../components/Checkbox.svelte";
  5. import DeadlineSelect from "../components/DeadlineSelect.svelte";
  6. import IconSelect from "../components/IconSelect.svelte";
  7. import Modal from "../components/Modal.svelte";
  8. import ProjectGroupSelect from "../components/ProjectGroupSelect.svelte";
  9. import StartTimeSelect from "../components/StartTimeSelect.svelte";
  10. import StatusTagSelect from "../components/StatusTagSelect.svelte";
  11. import { DEFAULT_ICON } from "../external/icons";
  12. import type { ProjectResult } from "../models/project";
  13. import markStale from "../stores/markStale";
  14. import modalStore from "../stores/modal";
  15. import { formatFormTime } from "../utils/time";
  16. export let deletion = false;
  17. export let creation = false;
  18. const md = $modalStore;
  19. let project: ProjectResult = {
  20. id: "",
  21. groupId: null,
  22. name: "",
  23. description: "",
  24. icon: DEFAULT_ICON,
  25. active: false,
  26. statusTag: "to do",
  27. createdTime: "",
  28. tasks: [],
  29. favorite: false,
  30. subtractAmount: 0,
  31. tags: [],
  32. taskSortFields: ["status"],
  33. subtractions: [],
  34. }
  35. let verb = "Add";
  36. if (md.name === "project.edit" || md.name === "project.delete") {
  37. project = md.project;
  38. verb = (md.name === "project.edit") ? "Edit" : "Delete";
  39. } else if (md.name === "project.add") {
  40. project.groupId = md.groupId;
  41. } else {
  42. throw new Error("Wrong form")
  43. }
  44. let startTime = formatFormTime(project.startTime);
  45. let endTime = formatFormTime(project.endTime);
  46. let name = project.name;
  47. let description = project.description;
  48. let statusTag = project.statusTag || "";
  49. let icon = project.icon;
  50. let favorite = project.favorite;
  51. let subtractAmount = project.subtractAmount;
  52. let groupId = project.groupId || "";
  53. let error = null;
  54. let loading = false;
  55. let tags = project.tags.join(", ");
  56. let taskSortFields = project.taskSortFields.join(", ");
  57. function onSubmit() {
  58. loading = true;
  59. error = null;
  60. const iconChanged = icon !== project.icon;
  61. if (creation) {
  62. stuffLogClient.createProject({
  63. active: statusTag === "",
  64. groupId: groupId || void(0),
  65. startTime: ( startTime == "" ) ? null : new Date(startTime),
  66. endTime: ( endTime == "" ) ? null : new Date(endTime),
  67. statusTag: statusTag !== "" ? statusTag : null,
  68. subtractAmount: Math.min(subtractAmount, 0),
  69. tags: tags.length > 0 ? tags.split(",").map(t => t.trim()) : [],
  70. taskSortFields: taskSortFields.length > 0 ? taskSortFields.split(",").map(t => t.trim()) : [],
  71. name, description, icon, favorite,
  72. }).then(newProject => {
  73. markStale("project", "task");
  74. modalStore.close();
  75. navigate(`/questlog/${newProject.groupId || "META_UNGROUPED"}/${newProject.id}`);
  76. }).catch(err => {
  77. error = err.message ? err.message : err.toString();
  78. }).finally(() => {
  79. loading = false;
  80. })
  81. } else if (deletion) {
  82. stuffLogClient.deleteProject(project.id).then(() => {
  83. markStale("project", "task");
  84. modalStore.close();
  85. }).catch(err => {
  86. error = err.message ? err.message : err.toString();
  87. }).finally(() => {
  88. loading = false;
  89. })
  90. } else {
  91. stuffLogClient.updateProject(project.id, {
  92. groupId: groupId || "",
  93. endTime: ( endTime == "" ) ? null : new Date(endTime),
  94. clearEndTime: ( endTime == "" ),
  95. startTime: ( startTime == "" ) ? null : new Date(startTime),
  96. clearStartTime: ( startTime == "" ),
  97. active: statusTag === "",
  98. statusTag: statusTag || null,
  99. clearStatusTag: statusTag === "",
  100. subtractAmount: subtractAmount,
  101. setTags: tags.length > 0 ? tags.split(",").map(t => t.trim()) : [],
  102. taskSortFields: taskSortFields.length > 0 ? taskSortFields.split(",").map(t => t.trim()) : [],
  103. name, description, icon, favorite,
  104. }).then(() => {
  105. markStale("project", "task");
  106. if (iconChanged) {
  107. markStale("log");
  108. }
  109. modalStore.close();
  110. navigate(`/questlog/${groupId || "META_UNGROUPED"}/${project.id}`);
  111. }).catch(err => {
  112. error = err.message ? err.message : err.toString();
  113. }).finally(() => {
  114. loading = false;
  115. })
  116. }
  117. }
  118. function onClose() {
  119. modalStore.close();
  120. }
  121. </script>
  122. <Modal show title="{verb} Project" error={error} closable on:close={onClose}>
  123. <form on:submit|preventDefault={onSubmit}>
  124. <label for="group">Project Group</label>
  125. <ProjectGroupSelect optional name="group" disabled={deletion} bind:value={groupId} />
  126. <label for="name">Name</label>
  127. <input disabled={deletion} name="name" type="text" bind:value={name} />
  128. <label for="description">Description</label>
  129. <textarea disabled={deletion} name="description" bind:value={description} />
  130. <label for="itemId">Icon</label>
  131. <IconSelect disabled={deletion} bind:value={icon} />
  132. <label for="endTime">Deadline</label>
  133. <DeadlineSelect disabled={deletion} bind:value={endTime} />
  134. {#if endTime != ""}
  135. <label for="endTime">Start time</label>
  136. <StartTimeSelect disabled={deletion} bind:value={startTime} />
  137. <label for="subtractAmount">Subtract progress</label>
  138. <input disabled={deletion} name="subtractAmount" type="number" bind:value={subtractAmount} />
  139. {/if}
  140. <label for="statusTag">Status</label>
  141. <StatusTagSelect disabled={deletion} isProject bind:value={statusTag} />
  142. <label for="tags">Tags (Comma Separated)</label>
  143. <input disabled={deletion} name="tags" type="text" bind:value={tags} />
  144. <label for="tags">Task sorting fields (Comma Separated; time, name, status)</label>
  145. <input disabled={deletion} name="tags" type="text" bind:value={taskSortFields} />
  146. <Checkbox disabled={deletion} bind:checked={favorite} label="Mark as favorite." />
  147. <hr />
  148. <button disabled={loading} type="submit">{verb} Project</button>
  149. </form>
  150. </Modal>