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.

94 lines
2.6 KiB

  1. <script lang="ts">
  2. import stuffLogClient from "../clients/stufflog";
  3. import Modal from "../components/Modal.svelte";
  4. import modalStore from "../stores/modal";
  5. import type { ItemResult } from "../models/item";
  6. import markStale from "../stores/markStale";
  7. export let deletion = false;
  8. export let creation = false;
  9. const md = $modalStore;
  10. let item: ItemResult = {
  11. id: "",
  12. groupId: "",
  13. groupWeight: 1,
  14. name: "",
  15. description: "",
  16. icon: "question",
  17. group: null,
  18. }
  19. let verb = "Add";
  20. if (md.name === "item.edit" || md.name === "item.delete") {
  21. item = md.item;
  22. verb = (md.name === "item.edit") ? "Edit" : "Delete";
  23. } else if (md.name === "item.add") {
  24. item.group = md.group;
  25. } else {
  26. throw new Error("Wrong form")
  27. }
  28. let name = item.name;
  29. let description = item.description;
  30. let groupWeight = item.groupWeight;
  31. let error = null;
  32. let loading = false;
  33. function onSubmit() {
  34. loading = true;
  35. if (creation) {
  36. stuffLogClient.createItem({
  37. groupId: item.group.id,
  38. name, description, groupWeight,
  39. }).then(() => {
  40. markStale("goal", "group");
  41. modalStore.close();
  42. }).catch(err => {
  43. error = err.message ? err.message : err.toString();
  44. }).finally(() => {
  45. loading = false;
  46. })
  47. } else if (deletion) {
  48. stuffLogClient.deleteItem(item.id).then(() => {
  49. markStale("group");
  50. modalStore.close();
  51. }).catch(err => {
  52. error = err.message ? err.message : err.toString();
  53. }).finally(() => {
  54. loading = false;
  55. })
  56. } else {
  57. stuffLogClient.updateItem(item.id, {
  58. name, description, groupWeight,
  59. }).then(() => {
  60. markStale("goal", "group", "project", "task");
  61. modalStore.close();
  62. }).finally(() => {
  63. loading = false;
  64. })
  65. }
  66. error = null;
  67. }
  68. function onClose() {
  69. modalStore.close();
  70. }
  71. </script>
  72. <Modal show title="{verb} Item" error={error} closable on:close={onClose}>
  73. <form on:submit|preventDefault={onSubmit}>
  74. <label for="groupName">Group</label>
  75. <input disabled name="groupName" type="text" value={item.group.name} />
  76. <label for="name">Name</label>
  77. <input disabled={deletion} name="name" type="text" bind:value={name} />
  78. <label for="description">Description</label>
  79. <textarea disabled={deletion} name="description" bind:value={description} />
  80. <label for="groupWeight">Group Weight</label>
  81. <input disabled={deletion} name="groupWeight" type="number" bind:value={groupWeight} />
  82. <hr />
  83. <button disabled={loading} type="submit">{verb} Item</button>
  84. </form>
  85. </Modal>