<template> <div class="w-full md:max-w-md"> <div class="flex flex-col items-center"> <p class="text-xl font-medium">Mitglied erstellen</p> </div> <br /> <form class="flex flex-col gap-4 py-2" @submit.prevent="triggerCreate"> <div> <label for="firstname">Vorname</label> <input type="text" id="firstname" required /> </div> <div> <label for="lastname">Nachname</label> <input type="text" id="lastname" required /> </div> <div> <label for="nameaffix">Nameaffix (optional)</label> <input type="text" id="nameaffix" /> </div> <div> <label for="birthdate">Geburtsdatum</label> <input type="date" id="birthdate" required /> </div> <div> <label for="internalId">Interne ID (optional)</label> <input type="text" id="internalId" /> </div> <div class="flex flex-row gap-2"> <button primary type="submit" :disabled="status == 'loading' || status?.status == 'success'">erstellen</button> <Spinner v-if="status == 'loading'" class="my-auto" /> <SuccessCheckmark v-else-if="status?.status == 'success'" /> <FailureXMark v-else-if="status?.status == 'failed'" /> </div> </form> <div class="flex flex-row justify-end"> <div class="flex flex-row gap-4 py-2"> <button primary-outline @click="closeModal" :disabled="status == 'loading' || status?.status == 'success'"> abbrechen </button> </div> </div> </div> </template> <script setup lang="ts"> import { defineComponent } from "vue"; import { mapState, mapActions } from "pinia"; import { useModalStore } from "@/stores/modal"; import Spinner from "@/components/Spinner.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import FailureXMark from "@/components/FailureXMark.vue"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; import { useVehicleStore } from "@/stores/admin/unit/vehicle/vehicle"; import type { CreateVehicleViewModel } from "@/viewmodels/admin/unit/vehicle/vehicle.models"; import { useSalutationStore } from "../../../../stores/admin/configuration/salutation"; import type { SalutationViewModel } from "../../../../viewmodels/admin/configuration/salutation.models"; </script> <script lang="ts"> export default defineComponent({ data() { return { status: null as null | "loading" | { status: "success" | "failed"; reason?: string }, timeout: undefined as any, }; }, computed: { ...mapState(useSalutationStore, ["salutations"]), }, mounted() { this.fetchSalutations(); }, beforeUnmount() { try { clearTimeout(this.timeout); } catch (error) {} }, methods: { ...mapActions(useModalStore, ["closeModal"]), ...mapActions(useVehicleStore, ["createVehicle"]), ...mapActions(useSalutationStore, ["fetchSalutations"]), triggerCreate(e: any) { let formData = e.target.elements; let createVehicle: CreateVehicleViewModel = { name: "", }; this.status = "loading"; this.createVehicle(createVehicle) .then(() => { this.status = { status: "success" }; this.timeout = setTimeout(() => { this.closeModal(); }, 1500); }) .catch(() => { this.status = { status: "failed" }; }); }, }, }); </script>