From c79d5bb1cd0f917e4f437b768f2d79943d1ef636 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Mon, 21 Jul 2025 12:58:32 +0200 Subject: [PATCH] repair create and view --- .../admin/unit/repair/RepairListItem.vue | 4 +- ...eReportSearchSelectMultipleWithRelated.vue | 230 ++++++++++++++++++ ...ageReportSearchSelectSingleWithRelated.vue | 216 ++++++++++++++++ src/router/index.ts | 15 +- src/stores/admin/unit/damageReport.ts | 17 ++ src/stores/admin/unit/equipment/repair.ts | 43 ++++ src/stores/admin/unit/repair.ts | 17 +- src/stores/admin/unit/vehicle/repair.ts | 43 ++++ src/stores/admin/unit/wearable/repair.ts | 43 ++++ src/viewmodels/admin/unit/repair.models.ts | 9 +- .../unit/damageReport/DamageReportRouting.vue | 34 ++- .../DamageReportStatusRouting.vue | 36 ++- src/views/admin/unit/equipment/Repair.vue | 62 +++++ src/views/admin/unit/repair/RepairCreate.vue | 171 +++++++++++++ src/views/admin/unit/repair/RepairRouting.vue | 2 +- .../admin/unit/repair/RepairStatusRouting.vue | 39 +-- src/views/admin/unit/vehicle/Repair.vue | 62 +++++ src/views/admin/unit/wearable/Repair.vue | 62 +++++ 18 files changed, 1046 insertions(+), 59 deletions(-) create mode 100644 src/components/search/DamageReportSearchSelectMultipleWithRelated.vue create mode 100644 src/components/search/DamageReportSearchSelectSingleWithRelated.vue create mode 100644 src/stores/admin/unit/equipment/repair.ts create mode 100644 src/stores/admin/unit/vehicle/repair.ts create mode 100644 src/stores/admin/unit/wearable/repair.ts create mode 100644 src/views/admin/unit/equipment/Repair.vue create mode 100644 src/views/admin/unit/repair/RepairCreate.vue create mode 100644 src/views/admin/unit/vehicle/Repair.vue create mode 100644 src/views/admin/unit/wearable/Repair.vue diff --git a/src/components/admin/unit/repair/RepairListItem.vue b/src/components/admin/unit/repair/RepairListItem.vue index 5b36a28..69986ee 100644 --- a/src/components/admin/unit/repair/RepairListItem.vue +++ b/src/components/admin/unit/repair/RepairListItem.vue @@ -5,13 +5,15 @@ >

+ {{ repair.title }} - {{ repair?.related?.name ?? "Ohne Zuordnung" }} ({{ repair.related.code }})

-

vera: {{ new Date(repair.createdAt).toLocaleString("de") }}

+

begonnen: {{ new Date(repair.createdAt).toLocaleString("de") }}

Status: {{ repair.status }}

+

Verantwortlich: {{ repair.responsible }}

Beschreibung: {{ repair.description }}

diff --git a/src/components/search/DamageReportSearchSelectMultipleWithRelated.vue b/src/components/search/DamageReportSearchSelectMultipleWithRelated.vue new file mode 100644 index 0000000..bfb45b7 --- /dev/null +++ b/src/components/search/DamageReportSearchSelectMultipleWithRelated.vue @@ -0,0 +1,230 @@ + + + + + diff --git a/src/components/search/DamageReportSearchSelectSingleWithRelated.vue b/src/components/search/DamageReportSearchSelectSingleWithRelated.vue new file mode 100644 index 0000000..101fe78 --- /dev/null +++ b/src/components/search/DamageReportSearchSelectSingleWithRelated.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/src/router/index.ts b/src/router/index.ts index 68908e5..30b6402 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -378,7 +378,7 @@ const router = createRouter({ { path: "repair", name: "admin-unit-equipment-repair", - component: () => import("@/views/admin/ViewSelect.vue"), + component: () => import("@/views/admin/unit/equipment/Repair.vue"), props: true, }, { @@ -447,7 +447,7 @@ const router = createRouter({ { path: "repair", name: "admin-unit-vehicle-repair", - component: () => import("@/views/admin/ViewSelect.vue"), + component: () => import("@/views/admin/unit/vehicle/Repair.vue"), props: true, }, { @@ -516,7 +516,7 @@ const router = createRouter({ { path: "repair", name: "admin-unit-wearable-repair", - component: () => import("@/views/admin/ViewSelect.vue"), + component: () => import("@/views/admin/unit/wearable/Repair.vue"), props: true, }, { @@ -802,7 +802,14 @@ const router = createRouter({ ], }, { - path: "hi/:repairId", + path: "create/:type?/:relatedId?", + name: "admin-unit-repair-create", + component: () => import("@/views/admin/unit/repair/RepairCreate.vue"), + beforeEnter: [], + props: true, + }, + { + path: "execute/:repairId", name: "admin-unit-repair-routing", component: () => import("@/views/admin/unit/repair/RepairRouting.vue"), beforeEnter: [setRepairId], diff --git a/src/stores/admin/unit/damageReport.ts b/src/stores/admin/unit/damageReport.ts index 827086a..d7a458a 100644 --- a/src/stores/admin/unit/damageReport.ts +++ b/src/stores/admin/unit/damageReport.ts @@ -74,6 +74,23 @@ export const useDamageReportStore = defineStore("damageReport", { return { ...res, data: res.data.damageReports }; }); }, + async getAllDamageReportsWithRelated( + related: "vehicle" | "equipment" | "wearable", + relatedId: string + ): Promise> { + return await http.get(`/admin/damageReport/${related}/${relatedId}?noLimit=true`).then((res) => { + return { ...res, data: res.data.damageReports }; + }); + }, + async searchDamageReportsWithRelated( + related: "vehicle" | "equipment" | "wearable", + relatedId: string, + search: string + ): Promise> { + return await http.get(`/admin/damageReport/${related}/${relatedId}?search=${search}&noLimit=true`).then((res) => { + return { ...res, data: res.data.damageReports }; + }); + }, fetchDamageReportByActiveId() { this.loadingActive = "loading"; http diff --git a/src/stores/admin/unit/equipment/repair.ts b/src/stores/admin/unit/equipment/repair.ts new file mode 100644 index 0000000..a3db4ba --- /dev/null +++ b/src/stores/admin/unit/equipment/repair.ts @@ -0,0 +1,43 @@ +import { defineStore } from "pinia"; +import { http } from "@/serverCom"; +import { useEquipmentStore } from "./equipment"; +import type { RepairViewModel } from "@/viewmodels/admin/unit/repair.models"; + +export const useEquipmentRepairStore = defineStore("equipmentRepair", { + state: () => { + return { + repairs: [] as Array, + totalCount: 0 as number, + loading: "loading" as "loading" | "fetched" | "failed", + }; + }, + actions: { + fetchRepairForEquipment(offset = 0, count = 25, search = "", clear = false) { + const equipmentId = useEquipmentStore().activeEquipment; + if (clear) this.repairs = []; + this.loading = "loading"; + http + .get( + `/admin/repair/equipment/${equipmentId}?offset=${offset}&count=${count}${search != "" ? "&search=" + search : ""}` + ) + .then((result) => { + this.totalCount = result.data.total; + result.data.repairs + .filter((elem: RepairViewModel) => this.repairs.findIndex((m) => m.id == elem.id) == -1) + .map((elem: RepairViewModel, index: number): RepairViewModel & { tab_pos: number } => { + return { + ...elem, + tab_pos: index + offset, + }; + }) + .forEach((elem: RepairViewModel & { tab_pos: number }) => { + this.repairs.push(elem); + }); + this.loading = "fetched"; + }) + .catch((err) => { + this.loading = "failed"; + }); + }, + }, +}); diff --git a/src/stores/admin/unit/repair.ts b/src/stores/admin/unit/repair.ts index 3104db8..91e444e 100644 --- a/src/stores/admin/unit/repair.ts +++ b/src/stores/admin/unit/repair.ts @@ -1,5 +1,9 @@ import { defineStore } from "pinia"; -import type { RepairViewModel, UpdateRepairViewModel } from "@/viewmodels/admin/unit/repair.models"; +import type { + CreateRepairViewModel, + RepairViewModel, + UpdateRepairViewModel, +} from "@/viewmodels/admin/unit/repair.models"; import { http } from "@/serverCom"; import type { AxiosResponse } from "axios"; @@ -94,6 +98,17 @@ export const useRepairStore = defineStore("repair", { responseType: "blob", }); }, + async createRepair(repair: CreateRepairViewModel): Promise> { + const result = await http.post(`/admin/repair`, { + affected: repair.affected, + affectedId: repair.affectedId, + title: repair.title, + description: repair.description, + responsible: repair.responsible, + reports: repair.reports, + }); + return result; + }, async updateRepair(repair: UpdateRepairViewModel): Promise> { const result = await http.patch(`/admin/repair/${repair.id}`, { status: repair.status, diff --git a/src/stores/admin/unit/vehicle/repair.ts b/src/stores/admin/unit/vehicle/repair.ts new file mode 100644 index 0000000..beb30a1 --- /dev/null +++ b/src/stores/admin/unit/vehicle/repair.ts @@ -0,0 +1,43 @@ +import { defineStore } from "pinia"; +import { http } from "@/serverCom"; +import { useVehicleStore } from "./vehicle"; +import type { RepairViewModel } from "@/viewmodels/admin/unit/repair.models"; + +export const useVehicleRepairStore = defineStore("vehicleRepair", { + state: () => { + return { + repairs: [] as Array, + totalCount: 0 as number, + loading: "loading" as "loading" | "fetched" | "failed", + }; + }, + actions: { + fetchRepairForVehicle(offset = 0, count = 25, search = "", clear = false) { + const vehicleId = useVehicleStore().activeVehicle; + if (clear) this.repairs = []; + this.loading = "loading"; + http + .get( + `/admin/repair/vehicle/${vehicleId}?offset=${offset}&count=${count}${search != "" ? "&search=" + search : ""}` + ) + .then((result) => { + this.totalCount = result.data.total; + result.data.repairs + .filter((elem: RepairViewModel) => this.repairs.findIndex((m) => m.id == elem.id) == -1) + .map((elem: RepairViewModel, index: number): RepairViewModel & { tab_pos: number } => { + return { + ...elem, + tab_pos: index + offset, + }; + }) + .forEach((elem: RepairViewModel & { tab_pos: number }) => { + this.repairs.push(elem); + }); + this.loading = "fetched"; + }) + .catch((err) => { + this.loading = "failed"; + }); + }, + }, +}); diff --git a/src/stores/admin/unit/wearable/repair.ts b/src/stores/admin/unit/wearable/repair.ts new file mode 100644 index 0000000..95f74e2 --- /dev/null +++ b/src/stores/admin/unit/wearable/repair.ts @@ -0,0 +1,43 @@ +import { defineStore } from "pinia"; +import { http } from "@/serverCom"; +import { useWearableStore } from "./wearable"; +import type { RepairViewModel } from "@/viewmodels/admin/unit/repair.models"; + +export const useWearableRepairStore = defineStore("wearableRepair", { + state: () => { + return { + repairs: [] as Array, + totalCount: 0 as number, + loading: "loading" as "loading" | "fetched" | "failed", + }; + }, + actions: { + fetchRepairForWearable(offset = 0, count = 25, search = "", clear = false) { + const wearableId = useWearableStore().activeWearable; + if (clear) this.repairs = []; + this.loading = "loading"; + http + .get( + `/admin/repair/wearable/${wearableId}?offset=${offset}&count=${count}${search != "" ? "&search=" + search : ""}` + ) + .then((result) => { + this.totalCount = result.data.total; + result.data.repairs + .filter((elem: RepairViewModel) => this.repairs.findIndex((m) => m.id == elem.id) == -1) + .map((elem: RepairViewModel, index: number): RepairViewModel & { tab_pos: number } => { + return { + ...elem, + tab_pos: index + offset, + }; + }) + .forEach((elem: RepairViewModel & { tab_pos: number }) => { + this.repairs.push(elem); + }); + this.loading = "fetched"; + }) + .catch((err) => { + this.loading = "failed"; + }); + }, + }, +}); diff --git a/src/viewmodels/admin/unit/repair.models.ts b/src/viewmodels/admin/unit/repair.models.ts index b40f157..cef3a72 100644 --- a/src/viewmodels/admin/unit/repair.models.ts +++ b/src/viewmodels/admin/unit/repair.models.ts @@ -27,6 +27,7 @@ export type RepairViewModel = { finishedAt?: Date; status: string; responsible: string; + title: string; description: string; images: string[]; reportDocument: string; @@ -34,10 +35,12 @@ export type RepairViewModel = { } & RepairAssigned; export interface CreateRepairViewModel { - description: string; - reportedBy: string; - affectedId: string; affected: "equipment" | "vehicle" | "wearable"; + affectedId: string; + title: string; + description: string; + responsible: string; + reports: string[]; } export interface UpdateRepairViewModel { diff --git a/src/views/admin/unit/damageReport/DamageReportRouting.vue b/src/views/admin/unit/damageReport/DamageReportRouting.vue index a25335c..c876d31 100644 --- a/src/views/admin/unit/damageReport/DamageReportRouting.vue +++ b/src/views/admin/unit/damageReport/DamageReportRouting.vue @@ -5,20 +5,32 @@