Loggest thine Stuff
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.

141 lines
4.3 KiB

  1. <script lang="ts">
  2. import { getStores } from "$app/stores";
  3. import { sl3 } from "$lib/clients/sl3";
  4. import Modal from "$lib/components/common/Modal.svelte";
  5. import ModalBody from "$lib/components/common/ModalBody.svelte";
  6. import { getModalContext } from "$lib/components/contexts/ModalContext.svelte";
  7. import { getProjectContext } from "$lib/components/contexts/ProjectContext.svelte";
  8. import { getScopeContext } from "$lib/components/contexts/ScopeContext.svelte";
  9. import StatInput from "$lib/components/controls/StatInput.svelte";
  10. import StatusSelect from "$lib/components/controls/StatusSelect.svelte";
  11. import Checkbox from "$lib/components/layout/Checkbox.svelte";
  12. import type { ProjectEntry, Requirement, RequirementInput } from "$lib/models/project";
  13. import Status from "$lib/models/status";
  14. import { statDiff } from "$lib/utils/stat";
  15. const {currentModal, closeModal} = getModalContext();
  16. const {scope} = getScopeContext();
  17. const {project, reloadProject} = getProjectContext();
  18. const {page} = getStores();
  19. let requirement: RequirementInput
  20. let projectId: number
  21. let requirementId: number
  22. let oldStats: RequirementInput["stats"]
  23. let showAggregateRequired: boolean
  24. let error: string
  25. let loading: boolean
  26. let show: boolean
  27. let op: "Create" | "Edit" | "Delete"
  28. $: switch ($currentModal.name) {
  29. case "requirement.create":
  30. initCreate($currentModal.project);
  31. op = "Create";
  32. break;
  33. case "requirement.edit":
  34. initEdit($currentModal.requirement, $project);
  35. op = "Edit";
  36. break;
  37. default:
  38. loading = false;
  39. error = null;
  40. show = false;
  41. }
  42. $: showAggregateRequired = requirement?.stats?.find(s => s.required > 0) == null;
  43. function initCreate(project: ProjectEntry) {
  44. requirement = {
  45. name: "",
  46. description: "",
  47. stats: [],
  48. status: Status.Available,
  49. isCoarse: false,
  50. aggregateRequired: 0,
  51. }
  52. projectId = project.id;
  53. show = true;
  54. }
  55. function initEdit(current: Requirement, project: ProjectEntry) {
  56. requirement = {
  57. name: current.name,
  58. description: current.description,
  59. status: current.status,
  60. stats: current.stats.map(s => ({acquired: s.acquired, required: s.required, statId: s.id})),
  61. isCoarse: current.isCoarse,
  62. aggregateRequired: current.aggregateRequired,
  63. }
  64. oldStats = [...requirement.stats];
  65. projectId = project.id;
  66. requirementId = current.id;
  67. show = true;
  68. }
  69. async function submit() {
  70. error = null;
  71. loading = true;
  72. if (requirement.stats.find(s => s.required > 0)) {
  73. requirement.aggregateRequired = 0;
  74. }
  75. try {
  76. switch (op) {
  77. case "Create":
  78. await sl3(fetch, $page.stuff.idToken).createRequirement($scope.id, projectId, requirement);
  79. break;
  80. case "Edit":
  81. const submission: Partial<RequirementInput> = {
  82. ...requirement,
  83. stats: statDiff(oldStats, requirement.stats, -1)
  84. };
  85. await sl3(fetch, $page.stuff.idToken).updateRequirement($scope.id, projectId, requirementId, submission);
  86. break;
  87. }
  88. // Wait for project to reload
  89. await reloadProject();
  90. closeModal();
  91. } catch(err) {
  92. if (err.statusCode != null) {
  93. error = err.statusMessage;
  94. } else {
  95. error = err
  96. }
  97. } finally {
  98. loading = false;
  99. }
  100. }
  101. </script>
  102. <form on:submit|preventDefault={submit}>
  103. <Modal show={show} wide closable verb={op} noun="Requirement" disabled={loading} error={error}>
  104. <ModalBody>
  105. <label for="name">Name</label>
  106. <input name="name" type="text" bind:value={requirement.name} />
  107. <label for="description">Description</label>
  108. <textarea name="description" bind:value={requirement.description} />
  109. {#if showAggregateRequired}
  110. <label for="aggregateRequired">Aggregate Required (Zero for old behavior)</label>
  111. <input name="aggregateRequired" type="number" bind:value={requirement.aggregateRequired} />
  112. {/if}
  113. </ModalBody>
  114. <ModalBody>
  115. <label for="stats">Status</label>
  116. <StatusSelect bind:status={requirement.status} />
  117. <label for="stats">Stats</label>
  118. <StatInput showRequired bind:value={requirement.stats} />
  119. <Checkbox bind:checked={requirement.isCoarse} label="Hide 0-requirement stats." />
  120. </ModalBody>
  121. </Modal>
  122. </form>