PersonalEventEdit.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import BaseModal from './BaseModal.vue';
  2. <template>
  3. <BaseModal
  4. :show="stateStore.inspectingPersonalEvent != null"
  5. @close="stateStore.inspectingPersonalEvent = null"
  6. >
  7. <h1 class="text-3xl mb-5">
  8. Persönlicher Event
  9. </h1>
  10. <form
  11. @submit.prevent="updateEntry"
  12. @keydown.enter="$event.preventDefault()"
  13. >
  14. <div class="mb-5">
  15. <label>Bezeichnung</label>
  16. <input
  17. v-model="name"
  18. type="text"
  19. placeholder="Verein, Musik, ..."
  20. required
  21. >
  22. </div>
  23. <div class="mb-5">
  24. <label>ECTS</label>
  25. <input
  26. v-model="ects"
  27. type="number"
  28. required
  29. >
  30. </div>
  31. <div class="flex items-end w-full gap-4">
  32. <div class="w-2/3">
  33. <label>Wochentag</label>
  34. <select
  35. v-model="weekday"
  36. class="h-10 w-full"
  37. >
  38. <option
  39. v-for="(day, idx) in dayMap"
  40. :key="day"
  41. :value="idx"
  42. >
  43. {{ day }}
  44. </option>
  45. </select>
  46. </div>
  47. <div class="w-2/3">
  48. <label>Von</label>
  49. <input
  50. v-model="from"
  51. type="time"
  52. class="h-10"
  53. required
  54. >
  55. </div>
  56. <div class="w-2/3">
  57. <label>Bis</label>
  58. <input
  59. v-model="to"
  60. type="time"
  61. class="h-10"
  62. required
  63. :class="[toTimeValid ? '' : 'border-red-500']"
  64. >
  65. </div>
  66. </div>
  67. <div class="flex justify-end mt-10 gap-4">
  68. <button
  69. v-if="!isNew"
  70. class="bg-red-500 text-white py-2 px-5 rounded"
  71. @click.prevent="deleteEntry"
  72. >
  73. Entfernen
  74. </button>
  75. <input
  76. type="submit"
  77. class="bg-green-500 text-white py-2 px-5 rounded active:bg-green-600"
  78. :value="isNew ? 'Einfügen' : 'Speichern'"
  79. >
  80. </div>
  81. </form>
  82. </BaseModal>
  83. </template>
  84. <script lang="ts">
  85. import BaseModal from "./BaseModal.vue";
  86. import { useStateStore } from "../../stores/state";
  87. import { usePlanningStore } from "../../stores/planning";
  88. import { dayMap, fromTime, toTime } from "../../helpers";
  89. import { PersonalEvent } from "../../types";
  90. export default {
  91. name: "PersonalEventEdit",
  92. components: { BaseModal },
  93. setup() {
  94. const stateStore = useStateStore();
  95. const planningStore = usePlanningStore();
  96. return {
  97. stateStore,
  98. planningStore,
  99. dayMap,
  100. };
  101. },
  102. data() {
  103. return {
  104. name: "",
  105. ects: 0,
  106. weekday: 0,
  107. from: "",
  108. to: "",
  109. };
  110. },
  111. computed: {
  112. personalEvent(): PersonalEvent | null | boolean {
  113. return this.stateStore.inspectingPersonalEvent;
  114. },
  115. isNew(): boolean {
  116. return this.stateStore.inspectingPersonalEvent == true;
  117. },
  118. toTimeValid(): boolean {
  119. if (this.from.length == 0 || this.to.length == 0) return true;
  120. return fromTime(this.from) < fromTime(this.to);
  121. },
  122. },
  123. watch: {
  124. personalEvent() {
  125. this.updateFields();
  126. },
  127. },
  128. mounted() {
  129. this.updateFields();
  130. },
  131. methods: {
  132. deleteEntry() {
  133. const pe = this.stateStore.inspectingPersonalEvent;
  134. if (pe === false || pe === true) return;
  135. this.planningStore.removePersonalEvent(pe);
  136. this.stateStore.inspectingPersonalEvent = null;
  137. this.resetFields();
  138. },
  139. updateEntry() {
  140. if (!this.toTimeValid) {
  141. return;
  142. }
  143. const from = fromTime(this.from);
  144. const to = fromTime(this.to);
  145. const event = {
  146. name: this.name,
  147. ects: this.ects,
  148. weekday: this.weekday,
  149. from: from,
  150. to: to,
  151. id: `personal-${this.name}-${this.weekday}-${from}-${to}`,
  152. } as PersonalEvent;
  153. const pe = this.personalEvent;
  154. if (pe === false || pe === true || pe === null)
  155. this.planningStore.addPersonalEvent(event);
  156. else this.planningStore.updatePersonalEvent(pe, event);
  157. this.stateStore.inspectingPersonalEvent = null;
  158. this.resetFields();
  159. },
  160. resetFields() {
  161. this.name = "";
  162. this.ects = 0;
  163. this.weekday = 0;
  164. this.from = "";
  165. this.to = "";
  166. },
  167. updateFields() {
  168. const pe = this.personalEvent;
  169. if (pe === null || pe === false || pe === true) {
  170. this.resetFields();
  171. return;
  172. }
  173. this.name = pe.name;
  174. this.ects = pe.ects ?? 0;
  175. this.weekday = pe.weekday;
  176. this.from = toTime(pe.from);
  177. this.to = toTime(pe.to);
  178. },
  179. },
  180. };
  181. </script>
  182. <style scoped></style>