+
{{ member.lastname }}, {{ member.firstname }} {{ member.nameaffix ? `- ${member.nameaffix}` : "" }}
Interne ID: {{ member.internalId }}
+
Notiz: {{ member.note }}
beigetreten: {{ member.firstMembershipEntry?.start }}
-
ausgetreten: {{ member.lastMembershipEntry?.end }}, da {{member.lastMembershipEntry?.terminationReason ?? '- kein Grund angegeben'}}
+
+ ausgetreten: {{ member.lastMembershipEntry?.end }}, da
+ {{ member.lastMembershipEntry?.terminationReason ?? "- kein Grund angegeben" }}
+
diff --git a/src/components/admin/configuration/education/CreateEducationModal.vue b/src/components/admin/configuration/education/CreateEducationModal.vue
new file mode 100644
index 0000000..149d9c5
--- /dev/null
+++ b/src/components/admin/configuration/education/CreateEducationModal.vue
@@ -0,0 +1,81 @@
+
+
+
+
Aus-/Fortbildung erstellen
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/admin/configuration/education/DeleteEducationModal.vue b/src/components/admin/configuration/education/DeleteEducationModal.vue
new file mode 100644
index 0000000..604d347
--- /dev/null
+++ b/src/components/admin/configuration/education/DeleteEducationModal.vue
@@ -0,0 +1,75 @@
+
+
+
+
Aus-/Fortbildung {{ education?.education }} löschen?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/admin/configuration/education/EducationListItem.vue b/src/components/admin/configuration/education/EducationListItem.vue
new file mode 100644
index 0000000..3b2541b
--- /dev/null
+++ b/src/components/admin/configuration/education/EducationListItem.vue
@@ -0,0 +1,55 @@
+
+
+
+
{{ education.education }}
+
+
+
+
+
Beschreibung:
+
{{ education.description }}
+
+
+
+
+
+
+
+
diff --git a/src/router/index.ts b/src/router/index.ts
index 02cbdc3..35b677a 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -142,6 +142,12 @@ const router = createRouter({
component: () => import("@/views/admin/club/members/MemberAwards.vue"),
props: true,
},
+ {
+ path: "educations",
+ name: "admin-club-member-educations",
+ component: () => import("@/views/admin/club/members/MemberEducations.vue"),
+ props: true,
+ },
{
path: "qualifications",
name: "admin-club-member-qualifications",
@@ -361,6 +367,30 @@ const router = createRouter({
},
],
},
+ {
+ path: "education",
+ name: "admin-configuration-education-route",
+ component: () => import("@/views/RouterView.vue"),
+ meta: { type: "read", section: "configuration", module: "education" },
+ beforeEnter: [abilityAndNavUpdate],
+ children: [
+ {
+ path: "",
+ name: "admin-configuration-education",
+ component: () => import("@/views/admin/configuration/education/Education.vue"),
+ meta: { type: "read", section: "configuration", module: "education" },
+ beforeEnter: [abilityAndNavUpdate],
+ },
+ {
+ path: ":id/edit",
+ name: "admin-configuration-education-edit",
+ component: () => import("@/views/admin/configuration/education/EducationEdit.vue"),
+ meta: { type: "update", section: "configuration", module: "education" },
+ beforeEnter: [abilityAndNavUpdate],
+ props: true,
+ },
+ ],
+ },
{
path: "executive-position",
name: "admin-configuration-executive_position-route",
diff --git a/src/router/memberGuard.ts b/src/router/memberGuard.ts
index 498959a..de09386 100644
--- a/src/router/memberGuard.ts
+++ b/src/router/memberGuard.ts
@@ -4,6 +4,7 @@ import { useMemberAwardStore } from "@/stores/admin/club/member/memberAward";
import { useMemberExecutivePositionStore } from "@/stores/admin/club/member/memberExecutivePosition";
import { useMemberQualificationStore } from "@/stores/admin/club/member/memberQualification";
import { useMembershipStore } from "@/stores/admin/club/member/membership";
+import { useMemberEducationStore } from "../stores/admin/club/member/memberEducation";
export async function setMemberId(to: any, from: any, next: any) {
const member = useMemberStore();
@@ -14,6 +15,7 @@ export async function setMemberId(to: any, from: any, next: any) {
useMemberAwardStore().$reset();
useMemberExecutivePositionStore().$reset();
useMemberQualificationStore().$reset();
+ useMemberEducationStore().$reset();
next();
}
@@ -28,6 +30,7 @@ export async function resetMemberStores(to: any, from: any, next: any) {
useMemberAwardStore().$reset();
useMemberExecutivePositionStore().$reset();
useMemberQualificationStore().$reset();
+ useMemberEducationStore().$reset();
next();
}
diff --git a/src/stores/admin/club/member/member.ts b/src/stores/admin/club/member/member.ts
index 26c8bd4..084343e 100644
--- a/src/stores/admin/club/member/member.ts
+++ b/src/stores/admin/club/member/member.ts
@@ -106,6 +106,7 @@ export const useMemberStore = defineStore("member", {
nameaffix: member.nameaffix,
birthdate: member.birthdate,
internalId: member.internalId,
+ note: member.note,
});
this.fetchMembers();
return result;
@@ -118,6 +119,7 @@ export const useMemberStore = defineStore("member", {
nameaffix: member.nameaffix,
birthdate: member.birthdate,
internalId: member.internalId,
+ note: member.note,
});
this.fetchMembers();
return result;
diff --git a/src/stores/admin/club/member/memberEducation.ts b/src/stores/admin/club/member/memberEducation.ts
new file mode 100644
index 0000000..5b35787
--- /dev/null
+++ b/src/stores/admin/club/member/memberEducation.ts
@@ -0,0 +1,67 @@
+import { defineStore } from "pinia";
+import { http } from "@/serverCom";
+import type { AxiosResponse } from "axios";
+import { useMemberStore } from "./member";
+import type {
+ CreateMemberEducationViewModel,
+ MemberEducationViewModel,
+ UpdateMemberEducationViewModel,
+} from "@/viewmodels/admin/club/member/memberEducation.models";
+
+export const useMemberEducationStore = defineStore("memberEducation", {
+ state: () => {
+ return {
+ memberEducations: [] as Array
,
+ loading: "loading" as "loading" | "fetched" | "failed",
+ };
+ },
+ actions: {
+ fetchMemberEducationsForMember() {
+ const memberId = useMemberStore().activeMember;
+ this.loading = "loading";
+ http
+ .get(`/admin/member/${memberId}/educations`)
+ .then((result) => {
+ this.memberEducations = result.data;
+ this.loading = "fetched";
+ })
+ .catch((err) => {
+ this.loading = "failed";
+ });
+ },
+ fetchMemberEducationById(id: number) {
+ const memberId = useMemberStore().activeMember;
+ return http.get(`/admin/member/${memberId}/education/${id}`);
+ },
+ async createMemberEducation(memberEducation: CreateMemberEducationViewModel): Promise> {
+ const memberId = useMemberStore().activeMember;
+ const result = await http.post(`/admin/member/${memberId}/education`, {
+ start: memberEducation.start,
+ end: memberEducation.end,
+ place: memberEducation.place,
+ note: memberEducation.note,
+ educationId: memberEducation.educationId,
+ });
+ this.fetchMemberEducationsForMember();
+ return result;
+ },
+ async updateMemberEducation(memberEducation: UpdateMemberEducationViewModel): Promise> {
+ const memberId = useMemberStore().activeMember;
+ const result = await http.patch(`/admin/member/${memberId}/education/${memberEducation.id}`, {
+ start: memberEducation.start,
+ end: memberEducation.end,
+ place: memberEducation.place,
+ note: memberEducation.note,
+ educationId: memberEducation.educationId,
+ });
+ this.fetchMemberEducationsForMember();
+ return result;
+ },
+ async deleteMemberEducation(memberEducation: number): Promise> {
+ const memberId = useMemberStore().activeMember;
+ const result = await http.delete(`/admin/member/${memberId}/education/${memberEducation}`);
+ this.fetchMemberEducationsForMember();
+ return result;
+ },
+ },
+});
diff --git a/src/stores/admin/configuration/education.ts b/src/stores/admin/configuration/education.ts
new file mode 100644
index 0000000..3214aac
--- /dev/null
+++ b/src/stores/admin/configuration/education.ts
@@ -0,0 +1,55 @@
+import { defineStore } from "pinia";
+import type {
+ CreateEducationViewModel,
+ UpdateEducationViewModel,
+ EducationViewModel,
+} from "@/viewmodels/admin/configuration/education.models";
+import { http } from "@/serverCom";
+import type { AxiosResponse } from "axios";
+
+export const useEducationStore = defineStore("education", {
+ state: () => {
+ return {
+ educations: [] as Array,
+ loading: "loading" as "loading" | "fetched" | "failed",
+ };
+ },
+ actions: {
+ fetchEducations() {
+ this.loading = "loading";
+ http
+ .get("/admin/education")
+ .then((result) => {
+ this.educations = result.data;
+ this.loading = "fetched";
+ })
+ .catch((err) => {
+ this.loading = "failed";
+ });
+ },
+ fetchEducationById(id: number): Promise> {
+ return http.get(`/admin/education/${id}`);
+ },
+ async createEducation(education: CreateEducationViewModel): Promise> {
+ const result = await http.post(`/admin/education`, {
+ education: education.education,
+ description: education.description,
+ });
+ this.fetchEducations();
+ return result;
+ },
+ async updateActiveEducation(education: UpdateEducationViewModel): Promise> {
+ const result = await http.patch(`/admin/education/${education.id}`, {
+ education: education.education,
+ description: education.description,
+ });
+ this.fetchEducations();
+ return result;
+ },
+ async deleteEducation(education: number): Promise> {
+ const result = await http.delete(`/admin/education/${education}`);
+ this.fetchEducations();
+ return result;
+ },
+ },
+});
diff --git a/src/stores/admin/navigation.ts b/src/stores/admin/navigation.ts
index dfd93f4..3b14619 100644
--- a/src/stores/admin/navigation.ts
+++ b/src/stores/admin/navigation.ts
@@ -112,6 +112,9 @@ export const useNavigationStore = defineStore("navigation", {
...(abilityStore.can("read", "configuration", "qualification")
? [{ key: "qualification", title: "Qualifikationen" }]
: []),
+ ...(abilityStore.can("read", "configuration", "education")
+ ? [{ key: "education", title: "Aus-/Fortbildungen" }]
+ : []),
...(abilityStore.can("read", "configuration", "executive_position")
? [{ key: "executive_position", title: "Vereinsämter" }]
: []),
diff --git a/src/types/permissionTypes.ts b/src/types/permissionTypes.ts
index eff7fd1..013615c 100644
--- a/src/types/permissionTypes.ts
+++ b/src/types/permissionTypes.ts
@@ -13,6 +13,7 @@ export type PermissionModule =
| "communication_type"
| "membership_status"
| "salutation"
+ | "education"
| "calendar_type"
| "user"
| "role"
@@ -70,6 +71,7 @@ export const permissionModules: Array = [
"communication_type",
"membership_status",
"salutation",
+ "education",
"calendar_type",
"user",
"role",
@@ -91,6 +93,7 @@ export const sectionsAndModules: SectionsAndModulesObject = {
"communication_type",
"membership_status",
"salutation",
+ "education",
"calendar_type",
"query_store",
"template",
diff --git a/src/viewmodels/admin/club/member/member.models.ts b/src/viewmodels/admin/club/member/member.models.ts
index 7701876..53b1d50 100644
--- a/src/viewmodels/admin/club/member/member.models.ts
+++ b/src/viewmodels/admin/club/member/member.models.ts
@@ -15,6 +15,7 @@ export interface MemberViewModel {
sendNewsletter?: CommunicationViewModel;
smsAlarming?: Array;
preferredCommunication?: Array;
+ note?: string;
}
export interface MemberStatisticsViewModel {
@@ -36,6 +37,7 @@ export interface CreateMemberViewModel {
nameaffix: string;
birthdate: Date;
internalId?: string;
+ note?: string;
}
export interface UpdateMemberViewModel {
@@ -46,4 +48,5 @@ export interface UpdateMemberViewModel {
nameaffix: string;
birthdate: Date;
internalId?: string;
+ note?: string;
}
diff --git a/src/viewmodels/admin/club/member/memberEducation.models.ts b/src/viewmodels/admin/club/member/memberEducation.models.ts
new file mode 100644
index 0000000..4013bce
--- /dev/null
+++ b/src/viewmodels/admin/club/member/memberEducation.models.ts
@@ -0,0 +1,26 @@
+export interface MemberEducationViewModel {
+ id: number;
+ start: Date;
+ end?: Date;
+ place?: string;
+ note?: string;
+ education: string;
+ educationId: number;
+}
+
+export interface CreateMemberEducationViewModel {
+ start: Date;
+ end?: Date;
+ place?: string;
+ note?: string;
+ educationId: number;
+}
+
+export interface UpdateMemberEducationViewModel {
+ id: number;
+ start: Date;
+ end?: Date;
+ place?: string;
+ note?: string;
+ educationId: number;
+}
diff --git a/src/viewmodels/admin/configuration/education.models.ts b/src/viewmodels/admin/configuration/education.models.ts
new file mode 100644
index 0000000..9ccab1f
--- /dev/null
+++ b/src/viewmodels/admin/configuration/education.models.ts
@@ -0,0 +1,16 @@
+export interface EducationViewModel {
+ id: number;
+ education: string;
+ description: string | null;
+}
+
+export interface CreateEducationViewModel {
+ education: string;
+ description: string | null;
+}
+
+export interface UpdateEducationViewModel {
+ id: number;
+ education: string;
+ description: string | null;
+}
diff --git a/src/views/admin/club/members/MemberEdit.vue b/src/views/admin/club/members/MemberEdit.vue
index f7ce25f..e233718 100644
--- a/src/views/admin/club/members/MemberEdit.vue
+++ b/src/views/admin/club/members/MemberEdit.vue
@@ -75,6 +75,10 @@
+