-
Mitglied löschen
+
Kraft löschen
- Mitglied {{ force?.lastname }}, {{ force?.firstname }}
- {{ force?.nameaffix ? `- ${force.nameaffix}` : "" }} löschen?
+ Kraft {{ force?.lastname }}, {{ force?.firstname }} {{ force?.nameaffix ? `- ${force.nameaffix}` : "" }} löschen?
@@ -74,7 +73,7 @@ export default defineComponent({
.then(() => {
this.status = { status: "success" };
this.timeout = setTimeout(() => {
- this.$router.push({ name: "admin-club-force" });
+ this.$router.push({ name: "admin-configuration-force" });
this.closeModal();
}, 1500);
})
diff --git a/src/components/admin/configuration/force/ForceListItem.vue b/src/components/admin/configuration/force/ForceListItem.vue
index fcd2837..7d4a736 100644
--- a/src/components/admin/configuration/force/ForceListItem.vue
+++ b/src/components/admin/configuration/force/ForceListItem.vue
@@ -1,22 +1,30 @@
-
+
{{ force.lastname }}, {{ force.firstname }} {{ force.nameaffix ? `- ${force.nameaffix}` : "" }}
+
-
Daten
+
verfügbar ab: {{ force.commissioned }}
+
verfügbar bis: {{ force?.decommissioned ?? "---" }}
-
+
diff --git a/src/components/admin/configuration/force/UpdateForceModal.vue b/src/components/admin/configuration/force/UpdateForceModal.vue
new file mode 100644
index 0000000..8afdd1b
--- /dev/null
+++ b/src/components/admin/configuration/force/UpdateForceModal.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
↺ laden fehlgeschlagen
+
+
+
+
+
+
+
+
+
diff --git a/src/router/index.ts b/src/router/index.ts
index 83d86bb..716b911 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -119,10 +119,24 @@ const router = createRouter({
{
path: "force",
name: "admin-configuration-force",
- component: () => import("@/views/admin/ViewSelect.vue"),
+ component: () => import("@/views/admin/configuration/force/Force.vue"),
meta: { type: "read", section: "configuration", module: "force" },
beforeEnter: [abilityAndNavUpdate],
},
+ {
+ path: "equipment",
+ name: "admin-configuration-equipment",
+ component: () => import("@/views/admin/configuration/force/Force.vue"),
+ meta: { type: "read", section: "configuration", module: "equipment" },
+ beforeEnter: [abilityAndNavUpdate],
+ },
+ {
+ path: "vehicle",
+ name: "admin-configuration-vehicle",
+ component: () => import("@/views/admin/configuration/force/Force.vue"),
+ meta: { type: "read", section: "configuration", module: "vehicle" },
+ beforeEnter: [abilityAndNavUpdate],
+ },
],
},
{
diff --git a/src/stores/admin/configuration/equipment.ts b/src/stores/admin/configuration/equipment.ts
new file mode 100644
index 0000000..22e6578
--- /dev/null
+++ b/src/stores/admin/configuration/equipment.ts
@@ -0,0 +1,81 @@
+import { defineStore } from "pinia";
+import { http } from "@/serverCom";
+import type { AxiosResponse } from "axios";
+import type {
+ EquipmentViewModel,
+ CreateEquipmentViewModel,
+ UpdateEquipmentViewModel,
+} from "../../../viewmodels/admin/configuration/equipment.models";
+
+export const useEquipmentStore = defineStore("equipment", {
+ state: () => {
+ return {
+ equipments: [] as Array
,
+ totalCount: 0 as number,
+ loading: "loading" as "loading" | "fetched" | "failed",
+ };
+ },
+ actions: {
+ fetchEquipments(offset = 0, count = 25, search = "", clear = false) {
+ if (clear) this.equipments = [];
+ this.loading = "loading";
+ http
+ .get(`/admin/equipment?offset=${offset}&count=${count}${search != "" ? "&search=" + search : ""}`)
+ .then((result) => {
+ this.totalCount = result.data.total;
+ result.data.equipments
+ .filter((elem: EquipmentViewModel) => this.equipments.findIndex((m) => m.id == elem.id) == -1)
+ .map((elem: EquipmentViewModel, index: number): EquipmentViewModel & { tab_pos: number } => {
+ return {
+ ...elem,
+ tab_pos: index + offset,
+ };
+ })
+ .forEach((elem: EquipmentViewModel & { tab_pos: number }) => {
+ this.equipments.push(elem);
+ });
+ this.loading = "fetched";
+ })
+ .catch((err) => {
+ this.loading = "failed";
+ });
+ },
+ async getAllEquipments(): Promise> {
+ return await http.get(`/admin/equipment?noLimit=true`).then((res) => {
+ return { ...res, data: res.data.equipments };
+ });
+ },
+ async getEquipmentsByIds(ids: Array): Promise> {
+ return await http
+ .post(`/admin/equipment/ids`, {
+ ids,
+ })
+ .then((res) => {
+ return { ...res, data: res.data.equipments };
+ });
+ },
+ async searchEquipments(search: string): Promise> {
+ return await http.get(`/admin/equipment?search=${search}&noLimit=true`).then((res) => {
+ return { ...res, data: res.data.equipments };
+ });
+ },
+ fetchEquipmentById(id: string) {
+ return http.get(`/admin/equipment/${id}`);
+ },
+ async createEquipment(equipment: CreateEquipmentViewModel): Promise> {
+ const result = await http.post(`/admin/equipment`, equipment);
+ this.fetchEquipments();
+ return result;
+ },
+ async updateActiveEquipment(equipment: UpdateEquipmentViewModel): Promise> {
+ const result = await http.patch(`/admin/equipment/${equipment.id}`, equipment);
+ this.fetchEquipments();
+ return result;
+ },
+ async deleteEquipment(equipment: number): Promise> {
+ const result = await http.delete(`/admin/equipment/${equipment}`);
+ this.fetchEquipments();
+ return result;
+ },
+ },
+});
diff --git a/src/stores/admin/configuration/forces.ts b/src/stores/admin/configuration/forces.ts
index 3e1c62e..9786985 100644
--- a/src/stores/admin/configuration/forces.ts
+++ b/src/stores/admin/configuration/forces.ts
@@ -63,20 +63,12 @@ export const useForceStore = defineStore("force", {
return http.get(`/admin/force/${id}`);
},
async createForce(force: CreateForceViewModel): Promise> {
- const result = await http.post(`/admin/force`, {
- firstname: force.firstname,
- lastname: force.lastname,
- nameaffix: force.nameaffix,
- });
+ const result = await http.post(`/admin/force`, force);
this.fetchForces();
return result;
},
- async updateActiveForce(force: UpdateForceViewModel): Promise> {
- const result = await http.patch(`/admin/force/${force.id}`, {
- firstname: force.firstname,
- lastname: force.lastname,
- nameaffix: force.nameaffix,
- });
+ async updateForce(force: UpdateForceViewModel): Promise> {
+ const result = await http.patch(`/admin/force/${force.id}`, force);
this.fetchForces();
return result;
},
diff --git a/src/stores/admin/configuration/vehicle.ts b/src/stores/admin/configuration/vehicle.ts
new file mode 100644
index 0000000..54beba9
--- /dev/null
+++ b/src/stores/admin/configuration/vehicle.ts
@@ -0,0 +1,81 @@
+import { defineStore } from "pinia";
+import { http } from "@/serverCom";
+import type { AxiosResponse } from "axios";
+import type {
+ VehicleViewModel,
+ CreateVehicleViewModel,
+ UpdateVehicleViewModel,
+} from "../../../viewmodels/admin/configuration/vehicle.models";
+
+export const useVehicleStore = defineStore("vehicle", {
+ state: () => {
+ return {
+ vehicles: [] as Array,
+ totalCount: 0 as number,
+ loading: "loading" as "loading" | "fetched" | "failed",
+ };
+ },
+ actions: {
+ fetchVehicles(offset = 0, count = 25, search = "", clear = false) {
+ if (clear) this.vehicles = [];
+ this.loading = "loading";
+ http
+ .get(`/admin/vehicle?offset=${offset}&count=${count}${search != "" ? "&search=" + search : ""}`)
+ .then((result) => {
+ this.totalCount = result.data.total;
+ result.data.vehicles
+ .filter((elem: VehicleViewModel) => this.vehicles.findIndex((m) => m.id == elem.id) == -1)
+ .map((elem: VehicleViewModel, index: number): VehicleViewModel & { tab_pos: number } => {
+ return {
+ ...elem,
+ tab_pos: index + offset,
+ };
+ })
+ .forEach((elem: VehicleViewModel & { tab_pos: number }) => {
+ this.vehicles.push(elem);
+ });
+ this.loading = "fetched";
+ })
+ .catch((err) => {
+ this.loading = "failed";
+ });
+ },
+ async getAllVehicles(): Promise> {
+ return await http.get(`/admin/vehicle?noLimit=true`).then((res) => {
+ return { ...res, data: res.data.vehicles };
+ });
+ },
+ async getVehiclesByIds(ids: Array): Promise> {
+ return await http
+ .post(`/admin/vehicle/ids`, {
+ ids,
+ })
+ .then((res) => {
+ return { ...res, data: res.data.vehicles };
+ });
+ },
+ async searchVehicles(search: string): Promise> {
+ return await http.get(`/admin/vehicle?search=${search}&noLimit=true`).then((res) => {
+ return { ...res, data: res.data.vehicles };
+ });
+ },
+ fetchVehicleById(id: string) {
+ return http.get(`/admin/vehicle/${id}`);
+ },
+ async createVehicle(vehicle: CreateVehicleViewModel): Promise> {
+ const result = await http.post(`/admin/vehicle`, vehicle);
+ this.fetchVehicles();
+ return result;
+ },
+ async updateActiveVehicle(vehicle: UpdateVehicleViewModel): Promise> {
+ const result = await http.patch(`/admin/vehicle/${vehicle.id}`, vehicle);
+ this.fetchVehicles();
+ return result;
+ },
+ async deleteVehicle(vehicle: number): Promise> {
+ const result = await http.delete(`/admin/vehicle/${vehicle}`);
+ this.fetchVehicles();
+ return result;
+ },
+ },
+});
diff --git a/src/stores/admin/navigation.ts b/src/stores/admin/navigation.ts
index 8eebb2e..db31e1b 100644
--- a/src/stores/admin/navigation.ts
+++ b/src/stores/admin/navigation.ts
@@ -94,7 +94,11 @@ export const useNavigationStore = defineStore("navigation", {
},
configuration: {
mainTitle: "Konfiguration",
- main: [...(abilityStore.can("read", "configuration", "force") ? [{ key: "force", title: "Kräfte" }] : [])],
+ main: [
+ ...(abilityStore.can("read", "configuration", "force") ? [{ key: "force", title: "Kräfte" }] : []),
+ ...(abilityStore.can("read", "configuration", "equipment") ? [{ key: "equipment", title: "Geräte" }] : []),
+ ...(abilityStore.can("read", "configuration", "vehicle") ? [{ key: "vehicle", title: "Fahrzeuge" }] : []),
+ ],
},
management: {
mainTitle: "Verwaltung",
diff --git a/src/types/permissionTypes.ts b/src/types/permissionTypes.ts
index 5581de5..75a8595 100644
--- a/src/types/permissionTypes.ts
+++ b/src/types/permissionTypes.ts
@@ -1,6 +1,6 @@
export type PermissionSection = "operation" | "configuration" | "management";
-export type PermissionModule = "mission" | "force" | "user" | "role" | "backup";
+export type PermissionModule = "mission" | "force" | "vehicle" | "equipment" | "user" | "role" | "backup";
export type PermissionType = "read" | "create" | "update" | "delete";
@@ -24,10 +24,18 @@ export type SectionsAndModulesObject = {
};
export const permissionSections: Array = ["operation", "configuration", "management"];
-export const permissionModules: Array = ["mission", "force", "user", "role", "backup"];
+export const permissionModules: Array = [
+ "mission",
+ "force",
+ "vehicle",
+ "equipment",
+ "user",
+ "role",
+ "backup",
+];
export const permissionTypes: Array = ["read", "create", "update", "delete"];
export const sectionsAndModules: SectionsAndModulesObject = {
operation: ["mission"],
- configuration: ["force"],
+ configuration: ["force", "vehicle", "equipment"],
management: ["user", "role", "backup"],
};
diff --git a/src/viewmodels/admin/configuration/equipment.models.ts b/src/viewmodels/admin/configuration/equipment.models.ts
new file mode 100644
index 0000000..3751b77
--- /dev/null
+++ b/src/viewmodels/admin/configuration/equipment.models.ts
@@ -0,0 +1,25 @@
+export interface EquipmentViewModel {
+ id: string;
+ code?: string;
+ type?: string;
+ name: string;
+ commissioned: Date;
+ decommissioned?: Date;
+}
+
+export interface CreateEquipmentViewModel {
+ code?: string;
+ type?: string;
+ name: string;
+ commissioned: Date;
+ decommissioned?: Date;
+}
+
+export interface UpdateEquipmentViewModel {
+ id: string;
+ code?: string;
+ type?: string;
+ name: string;
+ commissioned: Date;
+ decommissioned?: Date;
+}
diff --git a/src/viewmodels/admin/configuration/force.models.ts b/src/viewmodels/admin/configuration/force.models.ts
index b30ced1..7f9a8bd 100644
--- a/src/viewmodels/admin/configuration/force.models.ts
+++ b/src/viewmodels/admin/configuration/force.models.ts
@@ -1,19 +1,28 @@
export interface ForceViewModel {
id: string;
+ internalId?: string;
firstname: string;
lastname: string;
nameaffix: string;
+ commissioned: Date;
+ decommissioned?: Date;
}
export interface CreateForceViewModel {
+ internalId?: string;
firstname: string;
lastname: string;
nameaffix: string;
+ commissioned: Date;
+ decommissioned?: Date;
}
export interface UpdateForceViewModel {
id: string;
+ internalId?: string;
firstname: string;
lastname: string;
nameaffix: string;
+ commissioned: Date;
+ decommissioned?: Date;
}
diff --git a/src/viewmodels/admin/configuration/vehicle.models.ts b/src/viewmodels/admin/configuration/vehicle.models.ts
new file mode 100644
index 0000000..fc8a013
--- /dev/null
+++ b/src/viewmodels/admin/configuration/vehicle.models.ts
@@ -0,0 +1,25 @@
+export interface VehicleViewModel {
+ id: string;
+ code?: string;
+ type?: string;
+ name: string;
+ commissioned: Date;
+ decommissioned?: Date;
+}
+
+export interface CreateVehicleViewModel {
+ code?: string;
+ type?: string;
+ name: string;
+ commissioned: Date;
+ decommissioned?: Date;
+}
+
+export interface UpdateVehicleViewModel {
+ id: string;
+ code?: string;
+ type?: string;
+ name: string;
+ commissioned: Date;
+ decommissioned?: Date;
+}
diff --git a/src/views/admin/configuration/force/Force.vue b/src/views/admin/configuration/force/Force.vue
index fcb0263..e8c5e4b 100644
--- a/src/views/admin/configuration/force/Force.vue
+++ b/src/views/admin/configuration/force/Force.vue
@@ -22,7 +22,7 @@
@@ -35,7 +35,7 @@ import { defineAsyncComponent, defineComponent, markRaw } from "vue";
import { mapActions, mapState } from "pinia";
import MainTemplate from "@/templates/Main.vue";
import { useForceStore } from "@/stores/admin/configuration/forces";
-import ForceListItem from "@/components/admin/club/force/ForceListItem.vue";
+import ForceListItem from "@/components/admin/configuration/force/ForceListItem.vue";
import { useModalStore } from "@/stores/modal";
import Pagination from "@/components/Pagination.vue";
import type { ForceViewModel } from "@/viewmodels/admin/configuration/force.models";
@@ -62,7 +62,9 @@ export default defineComponent({
...mapActions(useForceStore, ["fetchForces"]),
...mapActions(useModalStore, ["openModal"]),
openCreateModal() {
- this.openModal(markRaw(defineAsyncComponent(() => import("@/components/admin/club/force/CreateForceModal.vue"))));
+ this.openModal(
+ markRaw(defineAsyncComponent(() => import("@/components/admin/configuration/force/CreateForceModal.vue")))
+ );
},
},
});