From b6d6dd079699e1328b4f088a55a948fcc63f1c0a Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Mon, 24 Mar 2025 17:16:07 +0100 Subject: [PATCH] unit data collections --- .../CreateEquipmentTypeModal.vue | 157 ++++++++++++++++++ .../equipmentType/EquipmentTypeListItem.vue | 33 ++++ src/router/index.ts | 70 ++++++++ src/stores/admin/navigation.ts | 18 +- src/stores/admin/unit/equipmentType.ts | 98 +++++++++++ src/types/permissionTypes.ts | 34 +++- .../admin/unit/equipmentType.models.ts | 39 +++++ .../admin/unit/damageReport/DamageReport.vue | 26 +++ .../unit/equipmentType/EquipmentType.vue | 73 ++++++++ .../unit/respiratoryGear/RespiratoryGear.vue | 71 ++++++++ .../respiratoryMission/RespiratoryMission.vue | 71 ++++++++ .../respiratoryWearer/RespiratoryWearer.vue | 71 ++++++++ 12 files changed, 754 insertions(+), 7 deletions(-) create mode 100644 src/components/admin/unit/equipmentType/CreateEquipmentTypeModal.vue create mode 100644 src/components/admin/unit/equipmentType/EquipmentTypeListItem.vue create mode 100644 src/stores/admin/unit/equipmentType.ts create mode 100644 src/viewmodels/admin/unit/equipmentType.models.ts create mode 100644 src/views/admin/unit/damageReport/DamageReport.vue create mode 100644 src/views/admin/unit/equipmentType/EquipmentType.vue create mode 100644 src/views/admin/unit/respiratoryGear/RespiratoryGear.vue create mode 100644 src/views/admin/unit/respiratoryMission/RespiratoryMission.vue create mode 100644 src/views/admin/unit/respiratoryWearer/RespiratoryWearer.vue diff --git a/src/components/admin/unit/equipmentType/CreateEquipmentTypeModal.vue b/src/components/admin/unit/equipmentType/CreateEquipmentTypeModal.vue new file mode 100644 index 0000000..4f934d7 --- /dev/null +++ b/src/components/admin/unit/equipmentType/CreateEquipmentTypeModal.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/src/components/admin/unit/equipmentType/EquipmentTypeListItem.vue b/src/components/admin/unit/equipmentType/EquipmentTypeListItem.vue new file mode 100644 index 0000000..8eed147 --- /dev/null +++ b/src/components/admin/unit/equipmentType/EquipmentTypeListItem.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/src/router/index.ts b/src/router/index.ts index 65d07b0..b0d0cfb 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -346,6 +346,76 @@ const router = createRouter({ }, ], }, + { + path: "respiratory-gear", + name: "admin-unit-respiratory_gear-route", + component: () => import("@/views/RouterView.vue"), + meta: { type: "read", section: "unit", module: "respiratory_gear" }, + beforeEnter: [abilityAndNavUpdate], + children: [ + { + path: "", + name: "admin-unit-respiratory_gear", + component: () => import("@/views/admin/unit/respiratoryGear/RespiratoryGear.vue"), + }, + ], + }, + { + path: "respiratory-wearer", + name: "admin-unit-respiratory_wearer-route", + component: () => import("@/views/RouterView.vue"), + meta: { type: "read", section: "unit", module: "respiratory_wearer" }, + beforeEnter: [abilityAndNavUpdate], + children: [ + { + path: "", + name: "admin-unit-respiratory_wearer", + component: () => import("@/views/admin/unit/respiratoryWearer/RespiratoryWearer.vue"), + }, + ], + }, + { + path: "respiratory-mission", + name: "admin-unit-respiratory_mission-route", + component: () => import("@/views/RouterView.vue"), + meta: { type: "read", section: "unit", module: "respiratory_gear" }, + beforeEnter: [abilityAndNavUpdate], + children: [ + { + path: "", + name: "admin-unit-respiratory_mission", + component: () => import("@/views/admin/unit/respiratoryMission/RespiratoryMission.vue"), + }, + ], + }, + { + path: "damage-report", + name: "admin-unit-damage_report-route", + component: () => import("@/views/RouterView.vue"), + meta: { type: "read", section: "unit", module: "damage_report" }, + beforeEnter: [abilityAndNavUpdate], + children: [ + { + path: "", + name: "admin-unit-damage_report", + component: () => import("@/views/admin/unit/damageReport/DamageReport.vue"), + }, + ], + }, + { + path: "equipment-type", + name: "admin-unit-equipment_type-route", + component: () => import("@/views/RouterView.vue"), + meta: { type: "read", section: "unit", module: "equipment_type" }, + beforeEnter: [abilityAndNavUpdate], + children: [ + { + path: "", + name: "admin-unit-equipment_type", + component: () => import("@/views/admin/unit/equipmentType/EquipmentType.vue"), + }, + ], + }, ], }, { diff --git a/src/stores/admin/navigation.ts b/src/stores/admin/navigation.ts index f11acbf..dc7176b 100644 --- a/src/stores/admin/navigation.ts +++ b/src/stores/admin/navigation.ts @@ -109,10 +109,26 @@ export const useNavigationStore = defineStore("navigation", { main: [ ...(abilityStore.can("read", "unit", "equipment") ? [{ key: "equipment", title: "Gerätschaften" }] : []), ...(abilityStore.can("read", "unit", "vehicle") ? [{ key: "vehicle", title: "Fahrzeuge" }] : []), + ...(abilityStore.can("read", "unit", "respiratory_gear") + ? [{ key: "respiratory_gear", title: "Atemschutz-Geräte" }] + : []), + ...(abilityStore.can("read", "unit", "respiratory_wearer") + ? [{ key: "respiratory_wearer", title: "Atemschutz-Träger" }] + : []), + ...(abilityStore.can("read", "unit", "respiratory_mission") + ? [{ key: "respiratory_mission", title: "Atemschutz-Einsätze" }] + : []), + ...(abilityStore.can("read", "unit", "damage_report") + ? [{ key: "damage_report", title: "Schadensmeldungen" }] + : []), + { key: "divider1", title: "Basisdaten" }, + ...(abilityStore.can("read", "unit", "equipment_type") + ? [{ key: "equipment_type", title: "Geräte-Typen" }] + : []), ], }, configuration: { - mainTitle: "Einstellungen", + mainTitle: "Konfiguration", main: [ { key: "divider1", title: "Mitgliederdaten" }, ...(abilityStore.can("read", "configuration", "salutation") diff --git a/src/stores/admin/unit/equipmentType.ts b/src/stores/admin/unit/equipmentType.ts new file mode 100644 index 0000000..974588c --- /dev/null +++ b/src/stores/admin/unit/equipmentType.ts @@ -0,0 +1,98 @@ +import { defineStore } from "pinia"; +import type { + EquipmentTypeViewModel, + CreateEquipmentTypeViewModel, + UpdateEquipmentTypeViewModel, +} from "@/viewmodels/admin/unit/equipmentType.models"; +import { http } from "@/serverCom"; +import type { AxiosResponse } from "axios"; + +export const useEquipmentTypeStore = defineStore("equipmentType", { + state: () => { + return { + equipmentTypes: [] as Array, + totalCount: 0 as number, + loading: "loading" as "loading" | "fetched" | "failed", + }; + }, + actions: { + fetchEquipmentTypes(offset = 0, count = 25, search = "", clear = false) { + if (clear) this.equipmentTypes = []; + this.loading = "loading"; + http + .get(`/admin/equipmentType?offset=${offset}&count=${count}${search != "" ? "&search=" + search : ""}`) + .then((result) => { + this.totalCount = result.data.total; + result.data.equipments + .filter((elem: EquipmentTypeViewModel) => this.equipmentTypes.findIndex((m) => m.id == elem.id) == -1) + .map((elem: EquipmentTypeViewModel, index: number): EquipmentTypeViewModel & { tab_pos: number } => { + return { + ...elem, + tab_pos: index + offset, + }; + }) + .forEach((elem: EquipmentTypeViewModel & { tab_pos: number }) => { + this.equipmentTypes.push(elem); + }); + this.loading = "fetched"; + }) + .catch((err) => { + this.loading = "failed"; + }); + }, + async getAllEquipmentTypes(): Promise> { + return await http.get(`/admin/equipment?noLimit=true`).then((res) => { + return { ...res, data: res.data.equipments }; + }); + }, + async getEquipmentTypesByIds(ids: Array): Promise> { + return await http + .post(`/admin/equipment/ids`, { + ids, + }) + .then((res) => { + return { ...res, data: res.data.equipments }; + }); + }, + async searchEquipmentTypes(search: string): Promise> { + return await http.get(`/admin/equipment?search=${search}&noLimit=true`).then((res) => { + return { ...res, data: res.data.equipments }; + }); + }, + fetchEquipmentTypeById(id: string) { + return http.get(`/admin/equipment/${id}`); + }, + fetchEquipmentTypeStatisticsById(id: string) { + return http.get(`/admin/equipment/${id}/statistics`); + }, + async createEquipmentType(equipment: CreateEquipmentTypeViewModel): Promise> { + const result = await http.post(`/admin/equipment`, { + salutationId: equipment.salutationId, + firstname: equipment.firstname, + lastname: equipment.lastname, + nameaffix: equipment.nameaffix, + birthdate: equipment.birthdate, + internalId: equipment.internalId, + }); + this.fetchEquipmentTypes(); + return result; + }, + async updateEquipmentType(equipment: UpdateEquipmentTypeViewModel): Promise> { + const result = await http.patch(`/admin/equipment/${equipment.id}`, { + salutationId: equipment.salutationId, + firstname: equipment.firstname, + lastname: equipment.lastname, + nameaffix: equipment.nameaffix, + birthdate: equipment.birthdate, + internalId: equipment.internalId, + }); + this.fetchEquipmentTypes(); + return result; + }, + async deleteEquipmentType(equipment: number): Promise> { + const result = await http.delete(`/admin/equipment/${equipment}`); + this.fetchEquipmentTypes(); + return result; + }, + }, +}); diff --git a/src/types/permissionTypes.ts b/src/types/permissionTypes.ts index 8a686a9..b184c78 100644 --- a/src/types/permissionTypes.ts +++ b/src/types/permissionTypes.ts @@ -10,7 +10,12 @@ export type PermissionModule = | "listprint" // unit | "equipment" + | "equipment_type" | "vehicle" + | "respiratory_gear" + | "respiratory_wearer" + | "respiratory_mission" + | "damage_report" // configuration | "qualification" | "award" @@ -52,34 +57,51 @@ export type SectionsAndModulesObject = { export const permissionSections: Array = ["club", "unit", "configuration", "management"]; export const permissionModules: Array = [ + // club "member", "calendar", "newsletter", - "newsletter_config", "protocol", + "query", "listprint", + // unit "equipment", + "equipment_type", "vehicle", + "respiratory_gear", + "respiratory_wearer", + "respiratory_mission", + "damage_report", + // configuration "qualification", "award", "executive_position", "communication_type", "membership_status", + "newsletter_config", "salutation", "calendar_type", - "user", - "role", - "webapi", - "query", "query_store", "template", "template_usage", "backup", + // management + "user", + "role", + "webapi", ]; export const permissionTypes: Array = ["read", "create", "update", "delete"]; export const sectionsAndModules: SectionsAndModulesObject = { club: ["member", "calendar", "newsletter", "protocol", "query", "listprint"], - unit: ["equipment", "vehicle"], + unit: [ + "equipment", + "equipment_type", + "vehicle", + "respiratory_gear", + "respiratory_wearer", + "respiratory_mission", + "damage_report", + ], configuration: [ "qualification", "award", diff --git a/src/viewmodels/admin/unit/equipmentType.models.ts b/src/viewmodels/admin/unit/equipmentType.models.ts new file mode 100644 index 0000000..ee5dc54 --- /dev/null +++ b/src/viewmodels/admin/unit/equipmentType.models.ts @@ -0,0 +1,39 @@ +export interface EquipmentTypeViewModel { + id: string; + firstname: string; + lastname: string; + nameaffix: string; + birthdate: Date; + internalId?: string; +} + +export interface EquipmentTypeStatisticsViewModel { + id: string; + salutation: string; + firstname: string; + lastname: string; + nameaffix: string; + birthdate: Date; + todayAge: number; + ageThisYear: number; + exactAge: string; +} + +export interface CreateEquipmentTypeViewModel { + salutationId: number; + firstname: string; + lastname: string; + nameaffix: string; + birthdate: Date; + internalId?: string; +} + +export interface UpdateEquipmentTypeViewModel { + id: string; + salutationId: number; + firstname: string; + lastname: string; + nameaffix: string; + birthdate: Date; + internalId?: string; +} diff --git a/src/views/admin/unit/damageReport/DamageReport.vue b/src/views/admin/unit/damageReport/DamageReport.vue new file mode 100644 index 0000000..8d99d16 --- /dev/null +++ b/src/views/admin/unit/damageReport/DamageReport.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/views/admin/unit/equipmentType/EquipmentType.vue b/src/views/admin/unit/equipmentType/EquipmentType.vue new file mode 100644 index 0000000..3c09340 --- /dev/null +++ b/src/views/admin/unit/equipmentType/EquipmentType.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/views/admin/unit/respiratoryGear/RespiratoryGear.vue b/src/views/admin/unit/respiratoryGear/RespiratoryGear.vue new file mode 100644 index 0000000..c1531cc --- /dev/null +++ b/src/views/admin/unit/respiratoryGear/RespiratoryGear.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/views/admin/unit/respiratoryMission/RespiratoryMission.vue b/src/views/admin/unit/respiratoryMission/RespiratoryMission.vue new file mode 100644 index 0000000..0d2d5db --- /dev/null +++ b/src/views/admin/unit/respiratoryMission/RespiratoryMission.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/views/admin/unit/respiratoryWearer/RespiratoryWearer.vue b/src/views/admin/unit/respiratoryWearer/RespiratoryWearer.vue new file mode 100644 index 0000000..c7d4112 --- /dev/null +++ b/src/views/admin/unit/respiratoryWearer/RespiratoryWearer.vue @@ -0,0 +1,71 @@ + + + + +