diff --git a/src/components/admin/unit/inspection/OkNotOk.vue b/src/components/admin/unit/inspection/OkNotOk.vue new file mode 100644 index 0000000..8140e7f --- /dev/null +++ b/src/components/admin/unit/inspection/OkNotOk.vue @@ -0,0 +1,63 @@ +<template> + <div class="flex flex-col h-fit w-full border border-primary rounded-md"> + <div class="bg-primary p-2 text-white flex flex-row justify-between items-center"> + <p>{{ inspectionPoint.title }}</p> + </div> + <div class="p-2"> + <p v-if="inspectionPoint.description" class="pb-2">Beschreibung: {{ inspectionPoint.description }}</p> + <hr v-if="inspectionPoint.description" /> + <RadioGroup v-model="value" :name="inspectionPoint.id" class="flex flex-row gap-2"> + <RadioGroupOption + v-for="option in options" + :key="option.key" + button + :primary="value == option.key" + :primary-outline="value != option.key" + :value="option.key" + > + {{ option.title }} + </RadioGroupOption> + </RadioGroup> + </div> + </div> +</template> + +<script setup lang="ts"> +import { defineComponent, type PropType } from "vue"; +import { RadioGroup, RadioGroupLabel, RadioGroupOption } from "@headlessui/vue"; +import type { InspectionPointViewModel } from "@/viewmodels/admin/unit/inspection/inspection.models"; +</script> + +<script lang="ts"> +export default defineComponent({ + props: { + inspectionPoint: { + type: Object as PropType<InspectionPointViewModel>, + required: true, + }, + modelValue: { + type: String as PropType<"true" | "false">, + default: "false", + }, + }, + emits: ["update:model-value"], + data() { + return { + options: [ + { key: "true", title: "OK" }, + { key: "false", title: "nicht OK" }, + ], + }; + }, + computed: { + value: { + get() { + return this.modelValue; + }, + set(val: string) { + this.$emit("update:model-value", val); + }, + }, + }, +}); +</script> diff --git a/src/components/admin/unit/inspection/ResultInput.vue b/src/components/admin/unit/inspection/ResultInput.vue new file mode 100644 index 0000000..7a8d110 --- /dev/null +++ b/src/components/admin/unit/inspection/ResultInput.vue @@ -0,0 +1,52 @@ +<template> + <div class="flex flex-col h-fit w-full border border-primary rounded-md"> + <div class="bg-primary p-2 text-white flex flex-row justify-between items-center"> + <p>{{ inspectionPoint.title }}</p> + </div> + <div class="p-2"> + <p v-if="inspectionPoint.description" class="pb-2">Beschreibung: {{ inspectionPoint.description }}</p> + <hr v-if="inspectionPoint.description" /> + <label :for="inspectionPoint.id">{{ inspectionPoint.type == "number" ? "Zahl" : "Freitext" }}</label> + <input + v-if="inspectionPoint.type == 'number'" + :id="inspectionPoint.id" + :name="inspectionPoint.id" + type="number" + required + v-model="value" + /> + <textarea v-else :id="inspectionPoint.id" :name="inspectionPoint.id" required class="h-18" v-model="value" /> + </div> + </div> +</template> + +<script setup lang="ts"> +import { defineComponent, type PropType } from "vue"; +import type { InspectionPointViewModel } from "@/viewmodels/admin/unit/inspection/inspection.models"; +</script> + +<script lang="ts"> +export default defineComponent({ + props: { + inspectionPoint: { + type: Object as PropType<InspectionPointViewModel>, + required: true, + }, + modelValue: { + type: String, + default: "", + }, + }, + emits: ["update:model-value"], + computed: { + value: { + get() { + return this.modelValue; + }, + set(val: string | number) { + this.$emit("update:model-value", val.toString()); + }, + }, + }, +}); +</script> diff --git a/src/demodata/inspectionPlan.ts b/src/demodata/inspectionPlan.ts index b80f96e..275e692 100644 --- a/src/demodata/inspectionPlan.ts +++ b/src/demodata/inspectionPlan.ts @@ -1,10 +1,9 @@ +import type { InspectionPlanViewModel } from "@/viewmodels/admin/unit/inspectionPlan/inspectionPlan.models"; import type { - InspectionPlanViewModel, - InspectionPointResultViewModel, InspectionPointViewModel, + InspectionPointResultViewModel, InspectionViewModel, -} from "@/viewmodels/admin/unit/inspectionPlan/inspectionPlan.models"; -import { equipmentTypeDemoData } from "./equipmentType"; +} from "@/viewmodels/admin/unit/inspection/inspection.models"; export const inspectionPointDemoData: Array<InspectionPointViewModel> = [ { @@ -72,25 +71,19 @@ export const inspectionPointResultDemoData: Array<InspectionPointResultViewModel { inspectionId: "jkvshdfg", inspectionVersionedPlanId: inspectionPlanDemoData[0].id, - inspectionVersionedPlan: inspectionPlanDemoData[0], inspectionPointId: inspectionPointDemoData[0].id, - inspectionPoint: inspectionPointDemoData[0], + value: "5", + }, + { + inspectionId: "jkvshdfg", + inspectionVersionedPlanId: inspectionPlanDemoData[0].id, + inspectionPointId: inspectionPointDemoData[1].id, value: "", }, { inspectionId: "jkvshdfg", inspectionVersionedPlanId: inspectionPlanDemoData[0].id, - inspectionVersionedPlan: inspectionPlanDemoData[0], inspectionPointId: inspectionPointDemoData[1].id, - inspectionPoint: inspectionPointDemoData[1], - value: "", - }, - { - inspectionId: "jkvshdfg", - inspectionVersionedPlanId: inspectionPlanDemoData[0].id, - inspectionVersionedPlan: inspectionPlanDemoData[0], - inspectionPointId: inspectionPointDemoData[1].id, - inspectionPoint: inspectionPointDemoData[1], value: "", }, ]; diff --git a/src/main.css b/src/main.css index 1e1868c..b9501d6 100644 --- a/src/main.css +++ b/src/main.css @@ -68,23 +68,23 @@ body { /*:not([headlessui]):not([id*="headlessui"]):not([class*="headlessui"])*/ button:not([class*="ql"] *):not([class*="fc"]):not([id*="headlessui-combobox"]), -a[button] { +[button] { @apply cursor-pointer relative box-border h-10 w-full flex justify-center py-2 px-4 text-sm font-medium rounded-md focus:outline-hidden focus:ring-0; } button[primary]:not([primary="false"]), -a[button][primary]:not([primary="false"]) { +[button][primary]:not([primary="false"]) { @apply border-2 border-transparent text-white bg-primary hover:bg-primary; } button[primary-outline]:not([primary-outline="false"]), -a[button][primary-outline]:not([primary-outline="false"]) { +[button][primary-outline]:not([primary-outline="false"]) { @apply border-2 border-primary text-black hover:bg-primary; } button:disabled, -a[button]:disabled, -a[button].disabled { +[button]:disabled, +[button].disabled { @apply opacity-75 pointer-events-none; } diff --git a/src/router/index.ts b/src/router/index.ts index 114af1c..636f0ff 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -18,6 +18,7 @@ import { resetRespiratoryMissionStores, setRespiratoryMissionId } from "./unit/r import { resetWearableStores, setWearableId } from "./unit/wearable"; import { resetInspectionPlanStores, setInspectionPlanId } from "./unit/inspectionPlan"; import { setVehicleTypeId } from "./unit/vehicleType"; +import { resetInspectionStores, setInspectionId } from "./unit/inspection"; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -860,7 +861,7 @@ const router = createRouter({ name: "admin-unit-inspection-route", component: () => import("@/views/RouterView.vue"), meta: { type: "create", section: "unit", module: "inspection" }, - beforeEnter: [abilityAndNavUpdate], + beforeEnter: [abilityAndNavUpdate, resetInspectionStores], children: [ { path: "", @@ -875,10 +876,10 @@ const router = createRouter({ props: true, }, { - path: "execute/:inspection", + path: "execute/:inspectionId", name: "admin-unit-inspection-execute", component: () => import("@/views/admin/unit/inspection/InspectionExecute.vue"), - beforeEnter: [], + beforeEnter: [setInspectionId], props: true, }, ], diff --git a/src/router/unit/inspection.ts b/src/router/unit/inspection.ts new file mode 100644 index 0000000..1232a42 --- /dev/null +++ b/src/router/unit/inspection.ts @@ -0,0 +1,20 @@ +import { useInspectionStore } from "@/stores/admin/unit/inspection/inspection"; + +export async function setInspectionId(to: any, from: any, next: any) { + const InspectionStore = useInspectionStore(); + InspectionStore.activeInspection = to.params?.inspectionId ?? null; + + //useXYStore().$reset(); + + next(); +} + +export async function resetInspectionStores(to: any, from: any, next: any) { + const InspectionStore = useInspectionStore(); + InspectionStore.activeInspection = null; + InspectionStore.activeInspectionObj = null; + + //useXYStore().$reset(); + + next(); +} diff --git a/src/stores/admin/unit/equipment/inspection.ts b/src/stores/admin/unit/equipment/inspection.ts index 90b0b7f..3a3e715 100644 --- a/src/stores/admin/unit/equipment/inspection.ts +++ b/src/stores/admin/unit/equipment/inspection.ts @@ -1,6 +1,6 @@ import { defineStore } from "pinia"; import { http } from "@/serverCom"; -import type { InspectionViewModel } from "@/viewmodels/admin/unit/inspectionPlan/inspectionPlan.models"; +import type { InspectionViewModel } from "@/viewmodels/admin/unit/inspection/inspection.models"; import { inspectionDemoData } from "@/demodata/inspectionPlan"; import { useEquipmentStore } from "./equipment"; diff --git a/src/stores/admin/unit/inspection/inspection.ts b/src/stores/admin/unit/inspection/inspection.ts new file mode 100644 index 0000000..30b7b8b --- /dev/null +++ b/src/stores/admin/unit/inspection/inspection.ts @@ -0,0 +1,55 @@ +import { defineStore } from "pinia"; +import { http } from "@/serverCom"; +import type { AxiosResponse } from "axios"; +import { inspectionDemoData } from "@/demodata/inspectionPlan"; +import type { InspectionViewModel } from "@/viewmodels/admin/unit/inspection/inspection.models"; + +export const useInspectionStore = defineStore("inspection", { + state: () => { + return { + activeInspection: null as string | null, + activeInspectionObj: null as InspectionViewModel | null, + loadingActive: "loading" as "loading" | "fetched" | "failed", + }; + }, + actions: { + fetchInspectionByActiveId() { + this.loadingActive = "loading"; + this.activeInspectionObj = inspectionDemoData.find((e) => e.id == this.activeInspection) as InspectionViewModel; + this.loadingActive = "fetched"; + return; + this.loadingActive = "loading"; + http + .get(`/admin/inspection/${this.activeInspection}`) + .then((res) => { + this.activeInspectionObj = res.data; + this.loadingActive = "fetched"; + }) + .catch((err) => { + this.loadingActive = "failed"; + }); + }, + fetchInspectionById(id: string) { + return http.get(`/admin/inspection/${id}`); + }, + async createInspection(inspection: any): Promise<AxiosResponse<any, any>> { + const result = await http.post(`/admin/inspection`, { + // TODO: data + }); + this.fetchInspectionByActiveId(); + return result; + }, + async updateActiveInspection(inspection: any): Promise<AxiosResponse<any, any>> { + const result = await http.patch(`/admin/inspection/${inspection.id}`, { + // TODO: data + }); + this.fetchInspectionByActiveId(); + return result; + }, + async deleteInspection(inspection: number): Promise<AxiosResponse<any, any>> { + const result = await http.delete(`/admin/inspection/${inspection}`); + this.fetchInspectionByActiveId(); + return result; + }, + }, +}); diff --git a/src/stores/admin/unit/vehicle/inspection.ts b/src/stores/admin/unit/vehicle/inspection.ts index 6077241..00314f2 100644 --- a/src/stores/admin/unit/vehicle/inspection.ts +++ b/src/stores/admin/unit/vehicle/inspection.ts @@ -1,6 +1,6 @@ import { defineStore } from "pinia"; import { http } from "@/serverCom"; -import type { InspectionViewModel } from "@/viewmodels/admin/unit/inspectionPlan/inspectionPlan.models"; +import type { InspectionViewModel } from "@/viewmodels/admin/unit/inspection/inspection.models"; import { inspectionDemoData } from "@/demodata/inspectionPlan"; import { useVehicleStore } from "./vehicle"; diff --git a/src/viewmodels/admin/unit/equipment/equipment.models.ts b/src/viewmodels/admin/unit/equipment/equipment.models.ts index cf39677..09cb681 100644 --- a/src/viewmodels/admin/unit/equipment/equipment.models.ts +++ b/src/viewmodels/admin/unit/equipment/equipment.models.ts @@ -1,5 +1,5 @@ import type { EquipmentTypeViewModel } from "../equipmentType/equipmentType.models"; -import type { InspectionViewModel } from "../inspectionPlan/inspectionPlan.models"; +import type { InspectionViewModel } from "../inspection/inspection.models"; export interface EquipmentViewModel { id: string; diff --git a/src/viewmodels/admin/unit/inspection/inspection.models.ts b/src/viewmodels/admin/unit/inspection/inspection.models.ts new file mode 100644 index 0000000..4843dc2 --- /dev/null +++ b/src/viewmodels/admin/unit/inspection/inspection.models.ts @@ -0,0 +1,36 @@ +import type { EquipmentViewModel } from "../equipment/equipment.models"; +import type { + InspectionPlanViewModel, + InspectionVersionedPlanViewModel, +} from "../inspectionPlan/inspectionPlan.models"; +import type { VehicleViewModel } from "../vehicle/vehicle.models"; + +export interface InspectionViewModel { + id: string; + inspectionPlanId: string; + inspectionPlan: InspectionPlanViewModel; + inspectionVersionedPlanId: string; + inspectionVersionedPlan: InspectionVersionedPlanViewModel; + context: string; + created: Date; + finished?: Date; + isOpen: boolean; + nextInspection?: Date; + checks: Array<InspectionPointResultViewModel>; + relatedId: string; + related: EquipmentViewModel | VehicleViewModel; +} + +export interface InspectionPointViewModel { + id: string; + title: string; + description: string; + type: "iO-niO" | "text" | "number"; +} + +export interface InspectionPointResultViewModel { + inspectionId: string; + inspectionVersionedPlanId: string; + inspectionPointId: string; + value: string; +} diff --git a/src/viewmodels/admin/unit/inspectionPlan/inspectionPlan.models.ts b/src/viewmodels/admin/unit/inspectionPlan/inspectionPlan.models.ts index 22c4e0d..cdfb8b2 100644 --- a/src/viewmodels/admin/unit/inspectionPlan/inspectionPlan.models.ts +++ b/src/viewmodels/admin/unit/inspectionPlan/inspectionPlan.models.ts @@ -1,5 +1,6 @@ import type { EquipmentViewModel } from "../equipment/equipment.models"; import type { EquipmentTypeViewModel } from "../equipmentType/equipmentType.models"; +import type { InspectionPointViewModel } from "../inspection/inspection.models"; import type { VehicleViewModel } from "../vehicle/vehicle.models"; import type { VehicleTypeViewModel } from "../vehicleType/vehicleType.models"; @@ -38,35 +39,3 @@ export interface UpdateInspectionPlanViewModel { inspectionInterval: PlanTimeDefinition; remindTime?: PlanTimeDefinition; } - -export interface InspectionPointViewModel { - id: string; - title: string; - description: string; - type: "iO-niO" | "text" | "number"; -} - -export interface InspectionViewModel { - id: string; - inspectionPlanId: string; - inspectionPlan: InspectionPlanViewModel; - inspectionVersionedPlanId: string; - inspectionVersionedPlan: InspectionVersionedPlanViewModel; - context: string; - created: Date; - finished?: Date; - isOpen: boolean; - nextInspection?: Date; - checks: Array<InspectionPointResultViewModel>; - relatedId: string; - related: EquipmentViewModel | VehicleViewModel; -} - -export interface InspectionPointResultViewModel { - inspectionId: string; - inspectionVersionedPlanId: string; - inspectionVersionedPlan: InspectionVersionedPlanViewModel; - inspectionPointId: string; - inspectionPoint: InspectionPointViewModel; - value: string; -} diff --git a/src/viewmodels/admin/unit/vehicle/vehicle.models.ts b/src/viewmodels/admin/unit/vehicle/vehicle.models.ts index 2108303..d459d06 100644 --- a/src/viewmodels/admin/unit/vehicle/vehicle.models.ts +++ b/src/viewmodels/admin/unit/vehicle/vehicle.models.ts @@ -1,4 +1,4 @@ -import type { InspectionViewModel } from "../inspectionPlan/inspectionPlan.models"; +import type { InspectionViewModel } from "../inspection/inspection.models"; import type { VehicleTypeViewModel } from "../vehicleType/vehicleType.models"; export interface VehicleViewModel { diff --git a/src/views/admin/unit/equipment/Inspection.vue b/src/views/admin/unit/equipment/Inspection.vue index 40dfe29..d1a3791 100644 --- a/src/views/admin/unit/equipment/Inspection.vue +++ b/src/views/admin/unit/equipment/Inspection.vue @@ -9,7 +9,7 @@ > <template #pageRow="{ row }: { row: InspectionViewModel }"> <RouterLink - :to="{ name: 'admin-unit-inspection-execute', params: { inspection: row.id } }" + :to="{ name: 'admin-unit-inspection-execute', params: { inspectionId: row.id } }" class="flex flex-col h-fit w-full border border-primary rounded-md" > <div class="bg-primary p-2 text-white flex flex-row gap-2 items-center"> @@ -44,7 +44,7 @@ import { useAbilityStore } from "@/stores/ability"; import { useEquipmentInspectionStore } from "@/stores/admin/unit/equipment/inspection"; import { PencilSquareIcon } from "@heroicons/vue/24/outline"; import Pagination from "@/components/Pagination.vue"; -import type { InspectionViewModel } from "@/viewmodels/admin/unit/inspectionPlan/inspectionPlan.models"; +import type { InspectionViewModel } from "@/viewmodels/admin/unit/inspection/inspection.models"; </script> <script lang="ts"> diff --git a/src/views/admin/unit/inspection/InspectionExecute.vue b/src/views/admin/unit/inspection/InspectionExecute.vue index 2ab32d5..624792b 100644 --- a/src/views/admin/unit/inspection/InspectionExecute.vue +++ b/src/views/admin/unit/inspection/InspectionExecute.vue @@ -2,29 +2,45 @@ <MainTemplate> <template #topBar> <div class="flex flex-row items-center justify-between pt-5 pb-3 px-7"> - <h1 class="font-bold text-xl h-8">Prüfung durchführen</h1> + <h1 class="font-bold text-xl min-h-8"> + Prüfung durchführen: {{ activeInspectionObj?.related.name }} - {{ activeInspectionObj?.inspectionPlan.title }} + </h1> </div> </template> - <template #diffMain> - <div class="flex flex-col gap-2 h-full w-full overflow-y-auto"> - <form class="flex flex-col gap-4 py-2 w-full max-w-xl mx-auto" @submit.prevent=""> - <div class="flex flex-row justify-end gap-2"> - <RouterLink - :to="{ name: 'admin-unit-inspection_plan' }" - primary-outline - button - class="w-fit!" - :disabled="status == 'loading' || status?.status == 'success'" - > - abbrechen - </RouterLink> - <button primary type="submit" class="w-fit!" :disabled="status == 'loading'">speichern</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> + <template #main> + <Spinner v-if="loading == 'loading'" class="mx-auto" /> + <p v-else-if="loading == 'failed'">laden fehlgeschlagen</p> + <form + v-else-if="activeInspectionObj != null" + class="flex flex-col gap-4 py-2 w-full max-w-xl mx-auto" + @submit.prevent="triggerUpdate" + > + <div v-for="point in points" :key="point.title"> + <OkNotOk + v-if="point.type == 'iO-niO'" + :inspectionPoint="point" + :modelValue="boolPointResult(point.id)" + @update:model-value="(val) => updateCheckResult(point.id, val)" + /> + <ResultInput + v-else + :inspectionPoint="point" + :modelValue="pointResult(point.id)" + @update:model-value="(val) => updateCheckResult(point.id, val)" + /> + </div> + <div class="flex flex-row justify-end gap-2"> + <button primary-outline type="reset" class="w-fit!" :disabled="canSaveOrReset" @click="resetForm"> + verwerfen + </button> + <button primary type="submit" class="w-fit!" :disabled="status == 'loading' || canSaveOrReset"> + speichern + </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> </template> </MainTemplate> </template> @@ -36,22 +52,109 @@ import MainTemplate from "@/templates/Main.vue"; import Spinner from "@/components/Spinner.vue"; import SuccessCheckmark from "@/components/SuccessCheckmark.vue"; import FailureXMark from "@/components/FailureXMark.vue"; -import ScanInput from "@/components/ScanInput.vue"; -import InspectionPlanSearchSelect from "@/components/search/InspectionPlanSearchSelect.vue"; -import EquipmentSearchSelect from "@/components/search/EquipmentSearchSelect.vue"; -import VehicleSearchSelect from "@/components/search/VehicleSearchSelect.vue"; +import { useInspectionStore } from "@/stores/admin/unit/inspection/inspection"; +import OkNotOk from "@/components/admin/unit/inspection/OkNotOk.vue"; +import ResultInput from "@/components/admin/unit/inspection/ResultInput.vue"; +import type { InspectionPointResultViewModel } from "@/viewmodels/admin/unit/inspection/inspection.models"; +import cloneDeep from "lodash.clonedeep"; +import isEqual from "lodash.isequal"; </script> <script lang="ts"> export default defineComponent({ props: { - inspection: String, + inspectionId: String, + }, + watch: { + loadingActive() { + if (this.loading == "loading") { + this.loading = this.loadingActive; + } + if (this.loadingActive == "fetched") { + this.checks = cloneDeep(this.activeInspectionObj?.checks ?? []); + } + }, }, data() { return { + loading: "loading" as "loading" | "fetched" | "failed", status: null as null | "loading" | { status: "success" | "failed"; reason?: string }, timeout: null as any, + checks: [] as Array<InspectionPointResultViewModel>, }; }, + computed: { + canSaveOrReset(): boolean { + return isEqual( + (this.activeInspectionObj?.checks || []).sort((a, b) => a.inspectionPointId.localeCompare(b.inspectionPointId)), + this.checks.sort((a, b) => a.inspectionPointId.localeCompare(b.inspectionPointId)) + ); + }, + ...mapState(useInspectionStore, ["activeInspectionObj", "loadingActive"]), + points() { + return this.activeInspectionObj?.inspectionVersionedPlan.inspectionPoints ?? []; + }, + pointResult() { + return (pointId: string) => { + return this.checks.find((c) => c.inspectionPointId == pointId)?.value ?? ""; + }; + }, + boolPointResult() { + return (pointId: string): "true" | "false" => { + return this.pointResult(pointId) == "true" ? "true" : "false"; + }; + }, + }, + mounted() { + this.fetchItem(); + }, + beforeUnmount() { + try { + clearTimeout(this.timeout); + } catch (error) {} + }, + methods: { + ...mapActions(useInspectionStore, ["fetchInspectionByActiveId"]), + resetForm() { + this.checks = cloneDeep(this.activeInspectionObj?.checks ?? []); + }, + fetchItem() { + this.fetchInspectionByActiveId(); + }, + updateCheckResult(id: string, value: string) { + if (this.activeInspectionObj == null) return; + + let index = this.checks.findIndex((c) => c.inspectionPointId == id); + if (index == -1) { + this.checks.push({ + inspectionId: this.activeInspectionObj.id, + inspectionVersionedPlanId: this.activeInspectionObj.inspectionVersionedPlanId, + inspectionPointId: id, + value: value, + }); + } else { + this.checks[index].value = value; + } + }, + triggerUpdate(e: any) { + if (this.activeInspectionObj == null) return; + this.status = "loading"; + new Promise<void>((resolve, reject) => { + resolve(); + }) + .then(() => { + this.fetchItem(); + this.status = { status: "success" }; + }) + .catch((err) => { + this.status = { status: "failed" }; + }) + .finally(() => { + this.timeout = setTimeout(() => { + this.status = null; + }, 2000); + }); + }, + }, }); </script> diff --git a/src/views/admin/unit/inspection/InspectionPlan.vue b/src/views/admin/unit/inspection/InspectionPlan.vue index 3451c90..42deeed 100644 --- a/src/views/admin/unit/inspection/InspectionPlan.vue +++ b/src/views/admin/unit/inspection/InspectionPlan.vue @@ -5,55 +5,58 @@ <h1 class="font-bold text-xl h-8">Prüfung erstellen</h1> </div> </template> - <template #diffMain> - <div class="flex flex-col gap-2 h-full w-full overflow-y-auto"> - <form class="flex flex-col gap-4 py-2 w-full max-w-xl mx-auto" @submit.prevent=""> - <div class="flex flex-row"> - <div - v-for="tab in tabs" - :key="tab.key" - class="w-1/2 p-0.5 first:pl-0 last:pr-0 cursor-pointer" - @click=" - active = tab.key; - related = ''; - inspectionPlan = ''; - " + <template #main> + <form class="flex flex-col gap-4 py-2 w-full max-w-xl mx-auto" @submit.prevent=""> + <div class="flex flex-row"> + <div + v-for="tab in tabs" + :key="tab.key" + class="w-1/2 p-0.5 first:pl-0 last:pr-0 cursor-pointer" + @click=" + active = tab.key; + related = ''; + inspectionPlan = ''; + " + > + <p + :class="[ + 'w-full rounded-lg py-2.5 text-sm text-center font-medium leading-5 focus:ring-0 outline-hidden', + tab.key == active + ? 'bg-red-200 shadow-sm border-b-2 border-primary rounded-b-none' + : ' hover:bg-red-200', + ]" > - <p - :class="[ - 'w-full rounded-lg py-2.5 text-sm text-center font-medium leading-5 focus:ring-0 outline-hidden', - tab.key == active - ? 'bg-red-200 shadow-sm border-b-2 border-primary rounded-b-none' - : ' hover:bg-red-200', - ]" - > - {{ tab.title }} - </p> - </div> + {{ tab.title }} + </p> </div> + </div> - <EquipmentSearchSelect v-if="active == 'equipment'" title="Gerät" useScanner v-model="related" /> - <VehicleSearchSelect v-else title="Fahrzeug" useScanner v-model="related" /> + <EquipmentSearchSelect v-if="active == 'equipment'" title="Gerät" useScanner v-model="related" /> + <VehicleSearchSelect v-else title="Fahrzeug" useScanner v-model="related" /> - <InspectionPlanSearchSelect title="Prüfplan" :type="active" v-model="inspectionPlan" /> + <InspectionPlanSearchSelect title="Prüfplan" :type="active" v-model="inspectionPlan" /> - <div class="flex flex-row justify-end gap-2"> - <RouterLink - :to="{ name: 'admin-unit-inspection_plan' }" - primary-outline - button - class="w-fit!" - :disabled="status == 'loading' || status?.status == 'success'" - > - abbrechen - </RouterLink> - <button primary type="submit" class="w-fit!" :disabled="status == 'loading'">speichern</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> + <div> + <label for="nextInspection">Nächste Prüfung (optional) {{ " - Intervall: xx-x" }}</label> + <input id="nextInspection" type="date" /> + </div> + + <div class="flex flex-row justify-end gap-2"> + <RouterLink + :to="{ name: 'admin-unit-inspection_plan' }" + primary-outline + button + class="w-fit!" + :disabled="status == 'loading' || status?.status == 'success'" + > + abbrechen + </RouterLink> + <button primary type="submit" class="w-fit!" :disabled="status == 'loading'">speichern</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> </template> </MainTemplate> </template> diff --git a/src/views/admin/unit/vehicle/Inspection.vue b/src/views/admin/unit/vehicle/Inspection.vue index 6ecb2c7..6df1894 100644 --- a/src/views/admin/unit/vehicle/Inspection.vue +++ b/src/views/admin/unit/vehicle/Inspection.vue @@ -9,7 +9,7 @@ > <template #pageRow="{ row }: { row: InspectionViewModel }"> <RouterLink - :to="{ name: 'admin-unit-inspection-execute', params: { inspection: row.id } }" + :to="{ name: 'admin-unit-inspection-execute', params: { inspectionId: row.id } }" class="flex flex-col h-fit w-full border border-primary rounded-md" > <div class="bg-primary p-2 text-white flex flex-row gap-2 items-center"> @@ -44,7 +44,7 @@ import { useAbilityStore } from "@/stores/ability"; import { useVehicleInspectionStore } from "@/stores/admin/unit/vehicle/inspection"; import { PencilSquareIcon } from "@heroicons/vue/24/outline"; import Pagination from "@/components/Pagination.vue"; -import type { InspectionViewModel } from "@/viewmodels/admin/unit/inspectionPlan/inspectionPlan.models"; +import type { InspectionViewModel } from "@/viewmodels/admin/unit/inspection/inspection.models"; </script> <script lang="ts">