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.

103 lines
3.2 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 { getItemListContext } from "$lib/components/contexts/ItemListContext.svelte";
  7. import { getItemMultiListContext } from "$lib/components/contexts/ItemMultiListContext.svelte";
  8. import { getModalContext } from "$lib/components/contexts/ModalContext.svelte";
  9. import { getProjectContext } from "$lib/components/contexts/ProjectContext.svelte";
  10. import { getSprintListContext } from "$lib/components/contexts/SprintListContext.svelte";
  11. import AcquiredTimeInput from "$lib/components/controls/AcquiredTimeInput.svelte";
  12. import StatInput from "$lib/components/controls/StatInput.svelte";
  13. import type Item from "$lib/models/item";
  14. import type { ItemInput } from "$lib/models/item";
  15. const {currentModal, closeModal} = getModalContext();
  16. const {reloadProject} = getProjectContext();
  17. const {reloadItemList} = getItemListContext();
  18. const {reloadSprintList} = getSprintListContext();
  19. const {reloadItemLists} = getItemMultiListContext();
  20. const {page} = getStores();
  21. let item: Partial<ItemInput>
  22. let itemId: number
  23. let scopeId: number
  24. let requirementId: number
  25. let openedDate: Date
  26. let error: string
  27. let loading: boolean
  28. let show: boolean
  29. $: switch ($currentModal.name) {
  30. case "item.acquire":
  31. init($currentModal.item)
  32. break;
  33. default:
  34. loading = false;
  35. error = null;
  36. show = false;
  37. }
  38. function init(unaquiredItem: Item) {
  39. openedDate = new Date();
  40. item = {
  41. acquiredTime: "",
  42. description: unaquiredItem.description,
  43. stats: unaquiredItem.stats.map(s => ({statId: s.id, acquired: s.required, required: s.required})),
  44. }
  45. show = true;
  46. scopeId = unaquiredItem.scopeId;
  47. itemId = unaquiredItem.id;
  48. requirementId = unaquiredItem.requirementId;
  49. }
  50. async function submit() {
  51. error = null;
  52. loading = true;
  53. try {
  54. await sl3(fetch, $page.stuff.idToken).updateItem(scopeId, itemId, {
  55. ...item,
  56. acquiredTime: new Date(item.acquiredTime).toISOString(),
  57. });
  58. // Wait for project reload if it's updating a project
  59. if (requirementId != null) {
  60. await reloadProject();
  61. }
  62. reloadItemLists();
  63. await reloadItemList();
  64. await reloadSprintList();
  65. closeModal();
  66. } catch(err) {
  67. if (err.statusCode != null) {
  68. error = err.statusMessage;
  69. } else {
  70. error = err
  71. }
  72. } finally {
  73. loading = false;
  74. }
  75. }
  76. </script>
  77. <form on:submit|preventDefault={submit}>
  78. <Modal closable show={show} verb="Acquire" noun="Item" disabled={loading} error={error}>
  79. <ModalBody>
  80. <label for="acquiredTime">Acquired</label>
  81. <AcquiredTimeInput forced openDate={openedDate} bind:value={item.acquiredTime} />
  82. <label for="description">Description</label>
  83. <textarea name="description" bind:value={item.description} />
  84. <label for="stats">Stats</label>
  85. <StatInput overrideScopeId={scopeId} showAcquired hideUnseen noToggle bind:value={item.stats} />
  86. </ModalBody>
  87. </Modal>
  88. </form>