From aba4bafb6541b69acac36b1184af46e07039d4d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Z=C3=BCrcher?= Date: Thu, 6 Nov 2025 17:43:20 +0100 Subject: [PATCH] add new table feature for responsible person and assignment close #2 --- backend/go.mod | 4 +- backend/go.sum | 8 +- backend/main.go | 4 + src/assets/lang/de-CH.yaml | 6 + src/assets/lang/de-DE.yaml | 6 + src/assets/lang/en-US.yaml | 6 + src/components/AddToEvent.vue | 1 - src/components/MemberEditAllDialog.vue | 46 ++- src/components/ResponsibleEditAllDialog.vue | 63 +++++ src/layouts/MainLayout.vue | 10 + src/pages/MembersTable.vue | 19 -- src/pages/ResponsibleTable.vue | 28 ++ src/router/routes.ts | 5 + src/vueLib/checkboxes/permissions.ts | 5 + src/vueLib/models/attendee.ts | 7 - src/vueLib/models/event.ts | 4 +- src/vueLib/models/member.ts | 22 +- src/vueLib/tables/attendees/AttendeesTable.ts | 4 +- .../tables/attendees/AttendeesTable.vue | 14 +- src/vueLib/tables/events/EventsTable.vue | 4 +- src/vueLib/tables/members/MembersTable.ts | 12 +- src/vueLib/tables/members/MembersTable.vue | 97 +++++-- .../tables/responsible/ResponsibleTable.ts | 68 +++++ .../tables/responsible/ResponsibleTable.vue | 266 ++++++++++++++++++ 24 files changed, 594 insertions(+), 115 deletions(-) create mode 100644 src/components/ResponsibleEditAllDialog.vue create mode 100644 src/pages/ResponsibleTable.vue delete mode 100644 src/vueLib/models/attendee.ts create mode 100644 src/vueLib/tables/responsible/ResponsibleTable.ts create mode 100644 src/vueLib/tables/responsible/ResponsibleTable.vue diff --git a/backend/go.mod b/backend/go.mod index 2605bf5..3cf2a93 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -3,8 +3,8 @@ module backend go 1.24.5 require ( - gitea.tecamino.com/paadi/access-handler v1.0.12 - gitea.tecamino.com/paadi/memberDB v1.0.14 + gitea.tecamino.com/paadi/access-handler v1.0.13 + gitea.tecamino.com/paadi/memberDB v1.0.18 gitea.tecamino.com/paadi/tecamino-dbm v0.1.1 gitea.tecamino.com/paadi/tecamino-logger v0.2.1 github.com/gin-contrib/cors v1.7.6 diff --git a/backend/go.sum b/backend/go.sum index b25665f..d167215 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -1,9 +1,9 @@ -gitea.tecamino.com/paadi/access-handler v1.0.12 h1:lSmW0YrBJJvCqCg0ukTJHlFUNwd7q6hFYtNd2rfztrE= -gitea.tecamino.com/paadi/access-handler v1.0.12/go.mod h1:w71lpnuu5MgAWG3oiI9vsY2dWi4njF/iPrM/xV/dbBQ= +gitea.tecamino.com/paadi/access-handler v1.0.13 h1:2BqLo+cmF7ijk8XMnTdNuUKGbWPRsW6jMbk44FMCpyY= +gitea.tecamino.com/paadi/access-handler v1.0.13/go.mod h1:w71lpnuu5MgAWG3oiI9vsY2dWi4njF/iPrM/xV/dbBQ= gitea.tecamino.com/paadi/dbHandler v1.0.4 h1:ctnaec0GDdtw3gRQdUISVDYLJ9x+vt50VW41OemfhD4= gitea.tecamino.com/paadi/dbHandler v1.0.4/go.mod h1:y/xn/POJg1DO++67uKvnO23lJQgh+XFQq7HZCS9Getw= -gitea.tecamino.com/paadi/memberDB v1.0.14 h1:HO8YmVv9BmOguLMiubFABlQEnR3J+Qy46RwQQTXuWRs= -gitea.tecamino.com/paadi/memberDB v1.0.14/go.mod h1:iLm7nunVRzqJK8CV4PJVuWIhgPlQjNIaeOkmtfK5fMg= +gitea.tecamino.com/paadi/memberDB v1.0.18 h1:S774DtR5t6jpkRfa6uHlrnvTjabHG2KSjfbMmjGkdTM= +gitea.tecamino.com/paadi/memberDB v1.0.18/go.mod h1:iLm7nunVRzqJK8CV4PJVuWIhgPlQjNIaeOkmtfK5fMg= gitea.tecamino.com/paadi/tecamino-dbm v0.1.1 h1:vAq7mwUxlxJuLzCQSDMrZCwo8ky5usWi9Qz+UP+WnkI= gitea.tecamino.com/paadi/tecamino-dbm v0.1.1/go.mod h1:+tmf1rjPaKEoNeUcr1vdtoFIFweNG3aUGevDAl3NMBk= gitea.tecamino.com/paadi/tecamino-logger v0.2.1 h1:sQTBKYPdzn9mmWX2JXZBtGBvNQH7cuXIwsl4TD0aMgE= diff --git a/backend/main.go b/backend/main.go index 70b3ab8..90aea6a 100644 --- a/backend/main.go +++ b/backend/main.go @@ -138,6 +138,10 @@ func main() { auth.POST("/events/delete/attendees", dbHandler.DeleteAttendee) auth.POST("/events/delete", dbHandler.DeleteEvent) + auth.GET("/responsible", dbHandler.GetResponsible) + auth.POST("/responsible/add", dbHandler.AddNewResponsible) + auth.POST("/responsible/delete", dbHandler.DeleteResponsible) + auth.POST("/roles/add", accessHandler.AddRole) auth.POST("/roles/update", accessHandler.UpdateRole) auth.POST("/roles/delete", accessHandler.DeleteRole) diff --git a/src/assets/lang/de-CH.yaml b/src/assets/lang/de-CH.yaml index 4b35e87..caefe9b 100644 --- a/src/assets/lang/de-CH.yaml +++ b/src/assets/lang/de-CH.yaml @@ -105,3 +105,9 @@ attendeeAdded: Teilnämer hinzuegfüegt attendeesAdded: Teilnämer hinzuegfüegt eventAdded: Verastautig hinzuegfüegt userUpdated: Benutzer aktualisiert +selectResponsibleOptions: Wähle Verantwortliche Optionen +addNewResponsible: Füeg neue Verantwortliche hinzue +responsibleAdded: Veratwortläche hinzuegfüegt +responsiblesAdded: Veratwortläche hinzuegfüegt +deleteResponsible: Veratwortläche entfernt +deleteResponsibles: Veratwortläche entfernt diff --git a/src/assets/lang/de-DE.yaml b/src/assets/lang/de-DE.yaml index 21709c0..ae40d49 100644 --- a/src/assets/lang/de-DE.yaml +++ b/src/assets/lang/de-DE.yaml @@ -105,3 +105,9 @@ attendeeAdded: Teilnehmer hinzugefügt attendeesAdded: Teilnehmer hinzugefügt eventAdded: Veranstaltung hinzugefügt userUpdated: Benutzer aktualisiert +selectResponsibleOptions: Wähle Verantwortliche Optionen +addNewResponsible: Füge neuen Verantwortlichen hinzu +responsibleAdded: Veratwortläche hinzuegfüegt +responsiblesAdded: Verantwortliche hinzuegfüegt +deleteResponsible: Verantwortliche entfernt +deleteResponsibles: Verantwortliche entfernt diff --git a/src/assets/lang/en-US.yaml b/src/assets/lang/en-US.yaml index bb70dcb..b653107 100644 --- a/src/assets/lang/en-US.yaml +++ b/src/assets/lang/en-US.yaml @@ -105,3 +105,9 @@ attendeeAdded: Attendee added attendeesAdded: Attendees added eventAdded: Event added userUpdated: User updated +selectResponsibleOptions: Select Responsible Options +addNewResponsible: Add Responsible +responsibleAdded: Responsible hinzuegfüegt +responsiblesAdded: Responsibles hinzuegfüegt +deleteResponsible: Responsible deleted +deleteResponsibles: Responsibles deleted diff --git a/src/components/AddToEvent.vue b/src/components/AddToEvent.vue index bb47e22..24c316b 100644 --- a/src/components/AddToEvent.vue +++ b/src/components/AddToEvent.vue @@ -82,7 +82,6 @@ async function addAttendees() { payload.id = event.id; } - console.log(56, payload); await appApi .post(props.endpoint, payload) .then(() => { diff --git a/src/components/MemberEditAllDialog.vue b/src/components/MemberEditAllDialog.vue index dac5564..f336b82 100644 --- a/src/components/MemberEditAllDialog.vue +++ b/src/components/MemberEditAllDialog.vue @@ -67,12 +67,14 @@ filled v-model="localMember.group" > - + > import DialogFrame from 'src/vueLib/dialog/DialogFrame.vue'; -import { ref } from 'vue'; +import { type PropType, ref } from 'vue'; import { appApi } from 'src/boot/axios'; -import type { Member } from 'src/vueLib/models/member'; +import type { Member, Members } from 'src/vueLib/models/member'; import { useNotify } from 'src/vueLib/general/useNotify'; import { i18n } from 'src/boot/lang'; @@ -111,20 +113,15 @@ const localMember = ref({ id: 0, firstName: '', lastName: '', - birthday: '', - age: '', - address: '', - town: '', - zip: '', - phone: '', - email: '', - group: '', - responsiblePerson: '', - firstVisit: '', - lastVisit: '', }); -const emit = defineEmits(['update-member']); +const props = defineProps({ + responsibles: { + type: Object as PropType, + }, +}); + +const emit = defineEmits(['update']); function open(member: Member | null) { if (member === undefined) { @@ -139,17 +136,6 @@ function open(member: Member | null) { id: 0, firstName: '', lastName: '', - birthday: '', - age: '', - address: '', - town: '', - zip: '', - phone: '', - email: '', - group: '', - responsiblePerson: '', - firstVisit: '', - lastVisit: '', }; newMember.value = true; } @@ -165,14 +151,16 @@ async function save() { } let query = 'members/edit'; + let payload = JSON.stringify([localMember.value]); if (newMember.value) { query = 'members/add'; + payload = JSON.stringify(localMember.value); } await appApi - .post(query, JSON.stringify([localMember.value])) + .post(query, payload) .then(() => { - emit('update-member'); + emit('update'); NotifyResponse(i18n.global.t('memberUpdated')); dialog.value.close(); }) diff --git a/src/components/ResponsibleEditAllDialog.vue b/src/components/ResponsibleEditAllDialog.vue new file mode 100644 index 0000000..25fc035 --- /dev/null +++ b/src/components/ResponsibleEditAllDialog.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue index 9b1407c..5d6c111 100644 --- a/src/layouts/MainLayout.vue +++ b/src/layouts/MainLayout.vue @@ -43,6 +43,16 @@ > {{ $t('events') }} + + {{ $t('responsible') }} + diff --git a/src/pages/MembersTable.vue b/src/pages/MembersTable.vue index dfa800d..04bd6e2 100644 --- a/src/pages/MembersTable.vue +++ b/src/pages/MembersTable.vue @@ -1,28 +1,9 @@ diff --git a/src/pages/ResponsibleTable.vue b/src/pages/ResponsibleTable.vue new file mode 100644 index 0000000..c490b0b --- /dev/null +++ b/src/pages/ResponsibleTable.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/router/routes.ts b/src/router/routes.ts index 628444d..0710150 100644 --- a/src/router/routes.ts +++ b/src/router/routes.ts @@ -23,6 +23,11 @@ const routes: RouteRecordRaw[] = [ component: () => import('pages/EventsTable.vue'), meta: { requiresAuth: true, requiresAdmin: true }, }, + { + path: 'responsible', + component: () => import('pages/ResponsibleTable.vue'), + meta: { requiresAuth: true, requiresAdmin: true }, + }, { path: 'settings', component: () => import('pages/SettingsPage.vue'), diff --git a/src/vueLib/checkboxes/permissions.ts b/src/vueLib/checkboxes/permissions.ts index 2a3cfff..d2857e6 100644 --- a/src/vueLib/checkboxes/permissions.ts +++ b/src/vueLib/checkboxes/permissions.ts @@ -30,6 +30,11 @@ export const defaultPermissions = [ label: i18n.global.t('events'), permission: 0, }, + { + name: 'responsible', + label: i18n.global.t('responsible'), + permission: 0, + }, { name: 'excursionTable', label: i18n.global.t('excursionTable'), diff --git a/src/vueLib/models/attendee.ts b/src/vueLib/models/attendee.ts deleted file mode 100644 index d316aa9..0000000 --- a/src/vueLib/models/attendee.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface Attendee { - id: number; - firstName: string; - lastName: string; -} - -export type Attendees = Attendee[]; diff --git a/src/vueLib/models/event.ts b/src/vueLib/models/event.ts index 1ee72e4..229aa28 100644 --- a/src/vueLib/models/event.ts +++ b/src/vueLib/models/event.ts @@ -1,9 +1,9 @@ -import type { Attendees } from './attendee'; +import type { Members } from './member'; export interface Event { id: number; name: string; - attendees: Attendees; + attendees: Members; } export type Events = Event[]; diff --git a/src/vueLib/models/member.ts b/src/vueLib/models/member.ts index a13a7dc..ed64714 100644 --- a/src/vueLib/models/member.ts +++ b/src/vueLib/models/member.ts @@ -2,17 +2,17 @@ export interface Member { id: number; firstName: string; lastName: string; - birthday: string; - age: string; - address: string; - town: string; - zip: string; - phone: string; - email: string; - group: string; - responsiblePerson: string; - firstVisit: string; - lastVisit: string; + birthday?: string; + age?: string; + address?: string; + town?: string; + zip?: string; + phone?: string; + email?: string; + group?: string; + responsiblePerson?: Member; + firstVisit?: string; + lastVisit?: string; } export type Members = Member[]; diff --git a/src/vueLib/tables/attendees/AttendeesTable.ts b/src/vueLib/tables/attendees/AttendeesTable.ts index 91a0cac..82323d0 100644 --- a/src/vueLib/tables/attendees/AttendeesTable.ts +++ b/src/vueLib/tables/attendees/AttendeesTable.ts @@ -1,12 +1,12 @@ import { appApi } from 'src/boot/axios'; import { ref, computed } from 'vue'; -import type { Attendees } from 'src/vueLib/models/attendee'; +import type { Members } from 'src/vueLib/models/member'; import { useNotify } from 'src/vueLib/general/useNotify'; import { i18n } from 'boot/lang'; import type { Events } from 'src/vueLib/models/event'; export function useAttendeesTable() { - const attendees = ref([]); + const attendees = ref([]); const pagination = ref({ sortBy: 'firstName', diff --git a/src/vueLib/tables/attendees/AttendeesTable.vue b/src/vueLib/tables/attendees/AttendeesTable.vue index 4d62ac8..8be7fbb 100644 --- a/src/vueLib/tables/attendees/AttendeesTable.vue +++ b/src/vueLib/tables/attendees/AttendeesTable.vue @@ -114,7 +114,7 @@ diff --git a/src/vueLib/tables/responsible/ResponsibleTable.ts b/src/vueLib/tables/responsible/ResponsibleTable.ts new file mode 100644 index 0000000..f314651 --- /dev/null +++ b/src/vueLib/tables/responsible/ResponsibleTable.ts @@ -0,0 +1,68 @@ +import { appApi } from 'src/boot/axios'; +import { ref, computed } from 'vue'; +import type { Members } from 'src/vueLib/models/member'; +import { useNotify } from 'src/vueLib/general/useNotify'; +import { i18n } from 'boot/lang'; + +export function useResponsibleTable() { + const responsibles = ref([]); + + const pagination = ref({ + sortBy: 'firstName', + descending: false, + page: 1, + rowsPerPage: 20, + }); + + const columns = computed(() => [ + { + name: 'firstName', + align: 'left' as const, + label: i18n.global.t('prename'), + field: 'firstName', + sortable: true, + }, + { + name: 'lastName', + align: 'left' as const, + label: i18n.global.t('lastName'), + field: 'lastName', + sortable: true, + }, + { name: 'option', align: 'center' as const, label: '', field: 'option', icon: 'option' }, + ]); + + const { NotifyResponse } = useNotify(); + + const loading = ref(false); + + //updates responsible list from database + async function updateResponsibles() { + loading.value = true; + + await appApi + .get('responsible') + .then((resp) => { + if (resp.data === null) { + responsibles.value = []; + return; + } + responsibles.value = resp.data as Members; + }) + + .catch((err) => { + NotifyResponse(err, 'error'); + }) + .finally(() => { + loading.value = false; + }); + } + + return { + responsibles, + pagination, + columns, + loading, + updateResponsibles, + }; +} diff --git a/src/vueLib/tables/responsible/ResponsibleTable.vue b/src/vueLib/tables/responsible/ResponsibleTable.vue new file mode 100644 index 0000000..03c4ac3 --- /dev/null +++ b/src/vueLib/tables/responsible/ResponsibleTable.vue @@ -0,0 +1,266 @@ + + + + +