diff --git a/src/components/admin/club/member/MemberEducationCreateModal.vue b/src/components/admin/club/member/MemberEducationCreateModal.vue new file mode 100644 index 0000000..10add1d --- /dev/null +++ b/src/components/admin/club/member/MemberEducationCreateModal.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/src/components/admin/club/member/MemberEducationDeleteModal.vue b/src/components/admin/club/member/MemberEducationDeleteModal.vue new file mode 100644 index 0000000..fc4ffa0 --- /dev/null +++ b/src/components/admin/club/member/MemberEducationDeleteModal.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/components/admin/club/member/MemberEducationEditModal.vue b/src/components/admin/club/member/MemberEducationEditModal.vue new file mode 100644 index 0000000..26d8b2a --- /dev/null +++ b/src/components/admin/club/member/MemberEducationEditModal.vue @@ -0,0 +1,198 @@ + + + + + diff --git a/src/components/admin/club/member/MemberEducationListItem.vue b/src/components/admin/club/member/MemberEducationListItem.vue new file mode 100644 index 0000000..2ae27d9 --- /dev/null +++ b/src/components/admin/club/member/MemberEducationListItem.vue @@ -0,0 +1,54 @@ + + + + + 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 @@ + + + + + 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 @@ + + + + + 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 @@ + + + + + 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..0e89f1b 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/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/MemberEducations.vue b/src/views/admin/club/members/MemberEducations.vue new file mode 100644 index 0000000..0fa7951 --- /dev/null +++ b/src/views/admin/club/members/MemberEducations.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/views/admin/club/members/MemberRouting.vue b/src/views/admin/club/members/MemberRouting.vue index 866d063..445b689 100644 --- a/src/views/admin/club/members/MemberRouting.vue +++ b/src/views/admin/club/members/MemberRouting.vue @@ -21,7 +21,7 @@