diff --git a/.dockerignore b/.dockerignore index 9ccb89d..7e495ed 100644 --- a/.dockerignore +++ b/.dockerignore @@ -2,3 +2,4 @@ node_modules/ dist/ .git/ +.env diff --git a/Dockerfile b/Dockerfile index de017ba..c6de657 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,9 +8,9 @@ RUN npm install COPY . /app -RUN npm run build +RUN npm run build-only -FROM nginx:18-alpine as prod +FROM nginx:stable-alpine AS prod WORKDIR /app diff --git a/README.md b/README.md index 96de736..8d0d6eb 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,72 @@ # member-administration-ui -Memberadministration +Mitgliederverwaltung für Feuerwehren und Vereine. + +## Einleitung + +Dieses Repository dient zur Verwaltung der Mitgliederdaten. Es ist ein Frontend-Client, der auf die Daten des [member-administration-server Backends](https://forgejo.jk-effects.cloud/Ehrenamt/member-administration-server) zugreift. Die Webapp bietet eine Möglichkeit Mitgliederdaten zu verwalten, Protokolle zu schreiben und Kaledereinträge zu erstellen. Benutzer können eingeladen und Rollen zugewiesen werden. + +Eine Demo dieser Seite finden Sie unter [https://ff-admin-demo.jk-effects.cloud](https://ff-admin-demo.jk-effects.cloud). + +Für die Verwendung muss ein TOTP-Code eingegeben werden. + +Die Zugangsdaten (Lesebeschränkt) sind:\ +EMAIL: demo-besucher\ +TOTP: ![alt text](demo-totp-qrcode.png)\ +TOTP-Code: FBMDAJKFOYQXM2DNH47GWWBGJ5KWOUCW ## Installation -### Requirements +### Docker Compose Setup -1. Access to the internet +Um den Container hochzufahren, erstellen Sie eine `docker-compose.yml` Datei mit folgendem Inhalt: -### Configuration +```yaml +version: "3" -1. Copy the .env.example file to .env and fill in the required information -2. Install all packages via `npm install` -3. Start the backend application -4. Start the application -5. Run `npm run dev` to run inside dev-environment +services: + ff-member-administration-app: + image: docker.registry.jk-effects.cloud/ehrenamt/member-administration/app:latest + container_name: ff_member_administration_ui + restart: unless-stopped -### Usage + #volumes: + # - /favicon.png:/app/public/favicon.png + # - /favicon.png:/app/public/FFW-Logo.svg +``` -1. Open the browser and navigate to `http://localhost:5173` or the URL you specified in the server configuration -2. Go to route `/setup` to create the first user (this path is disabled after the first user is created) +Führen Sie dann den folgenden Befehl im Verzeichnis der compose-Datei aus, um den Container zu starten: + +```sh +docker-compose up -d +``` + +### Manuelle Installation + +Klonen Sie dieses Repository und installieren Sie die Abhängigkeiten: + +```sh +git clone https://forgejo.jk-effects.cloud/Ehrenamt/member-administration-ui.git +cd member-administration-ui +npm install +npm run build +npm run start +``` + +### Konfiguration + +Ein eigenes favicon und Logo kann über ein volume ausgetauscht werden. + +## Einrichtung + +1. **Admin Benutzer erstellen**: Erstellen Sie einen Admin Benutzer unter dem Pfad [/setup](https://ff-admin-demo.jk-effects.cloud/setup), um auf die Migliederverwaltung Zugriff zu erhalten. Nach der Erstellung des ersten Benutzers wird der Pfad automatisch geblockt. + +2. **Rollen und Berechtigungen**: Unter `Benutzer > Rollen` können die Rollen und Berechtigungen für die Benutzer erstellt und angepasst werden. + +3. **Nutzer einladen**: Unter `Benutzer > Benutzer` können weitere Nutzer eingeladen werden. Diese erhalten dann eine E-Mail mit einem Link, um ein TOTP zu erhalten. + +## Fragen und Wünsche + +Bei Fragen, Anregungen oder Wünschen können Sie sich gerne melden.\ +Wir freuen uns über Ihr Feedback und helfen Ihnen gerne weiter.\ +Schreiben Sie dafür eine Mail an julian.krauser@jk-effects.com. diff --git a/demo-totp-qrcode.png b/demo-totp-qrcode.png new file mode 100644 index 0000000..ae03670 Binary files /dev/null and b/demo-totp-qrcode.png differ diff --git a/src/components/Footer.vue b/src/components/Footer.vue index 643ddfb..86d1aff 100644 --- a/src/components/Footer.vue +++ b/src/components/Footer.vue @@ -1,22 +1,23 @@ diff --git a/src/components/admin/club/member/MemberAwardEditModal.vue b/src/components/admin/club/member/MemberAwardEditModal.vue index 204e116..8e6e9bf 100644 --- a/src/components/admin/club/member/MemberAwardEditModal.vue +++ b/src/components/admin/club/member/MemberAwardEditModal.vue @@ -105,7 +105,7 @@ import type { UpdateMemberAwardViewModel, } from "@/viewmodels/admin/memberAward.models"; import { useMemberAwardStore } from "@/stores/admin/memberAward"; -import isEqual from "lodash.isEqual"; +import isEqual from "lodash.isequal"; import cloneDeep from "lodash.clonedeep"; diff --git a/src/components/admin/club/member/MemberCommunicationEditModal.vue b/src/components/admin/club/member/MemberCommunicationEditModal.vue index 569c55e..33b34d4 100644 --- a/src/components/admin/club/member/MemberCommunicationEditModal.vue +++ b/src/components/admin/club/member/MemberCommunicationEditModal.vue @@ -77,7 +77,7 @@ import type { CommunicationViewModel, UpdateCommunicationViewModel, } from "@/viewmodels/admin/communication.models"; -import isEqual from "lodash.isEqual"; +import isEqual from "lodash.isequal"; import cloneDeep from "lodash.clonedeep"; diff --git a/src/components/admin/club/member/MemberExecutivePositionEditModal.vue b/src/components/admin/club/member/MemberExecutivePositionEditModal.vue index 17661a2..269472b 100644 --- a/src/components/admin/club/member/MemberExecutivePositionEditModal.vue +++ b/src/components/admin/club/member/MemberExecutivePositionEditModal.vue @@ -111,7 +111,7 @@ import type { UpdateMemberExecutivePositionViewModel, } from "@/viewmodels/admin/memberExecutivePosition.models"; import { useMemberExecutivePositionStore } from "@/stores/admin/memberExecutivePosition"; -import isEqual from "lodash.isEqual"; +import isEqual from "lodash.isequal"; import cloneDeep from "lodash.clonedeep"; diff --git a/src/components/admin/club/member/MemberQualificationEditModal.vue b/src/components/admin/club/member/MemberQualificationEditModal.vue index 5c46371..3eef402 100644 --- a/src/components/admin/club/member/MemberQualificationEditModal.vue +++ b/src/components/admin/club/member/MemberQualificationEditModal.vue @@ -112,7 +112,7 @@ import type { UpdateMemberQualificationViewModel, } from "@/viewmodels/admin/memberQualification.models"; import { useMemberQualificationStore } from "@/stores/admin/memberQualification"; -import isEqual from "lodash.isEqual"; +import isEqual from "lodash.isequal"; import cloneDeep from "lodash.clonedeep"; diff --git a/src/components/admin/club/member/MembershipEditModal.vue b/src/components/admin/club/member/MembershipEditModal.vue index 6c2dd2f..4d621ae 100644 --- a/src/components/admin/club/member/MembershipEditModal.vue +++ b/src/components/admin/club/member/MembershipEditModal.vue @@ -112,7 +112,7 @@ import type { UpdateMembershipViewModel, } from "@/viewmodels/admin/membership.models"; import { useMembershipStore } from "@/stores/admin/membership"; -import isEqual from "lodash.isEqual"; +import isEqual from "lodash.isequal"; import cloneDeep from "lodash.clonedeep"; diff --git a/src/components/admin/settings/calendarType/CreateCalendarTypeModal.vue b/src/components/admin/settings/calendarType/CreateCalendarTypeModal.vue index 2cce5b5..107aa3c 100644 --- a/src/components/admin/settings/calendarType/CreateCalendarTypeModal.vue +++ b/src/components/admin/settings/calendarType/CreateCalendarTypeModal.vue @@ -28,7 +28,11 @@
-
@@ -47,7 +51,6 @@ import { useCalendarTypeStore } from "@/stores/admin/calendarType"; import type { CreateCalendarTypeViewModel } from "@/viewmodels/admin/calendarType.models"; import { Listbox, ListboxButton, ListboxOptions, ListboxOption, ListboxLabel } from "@headlessui/vue"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid"; -import type { CalendarFieldType } from "@/types/fieldTypes"; diff --git a/src/views/admin/settings/AwardEdit.vue b/src/views/admin/settings/AwardEdit.vue index f9bb283..df7aa34 100644 --- a/src/views/admin/settings/AwardEdit.vue +++ b/src/views/admin/settings/AwardEdit.vue @@ -47,7 +47,7 @@ import FailureXMark from "@/components/FailureXMark.vue"; import { RouterLink } from "vue-router"; import type { AwardViewModel, UpdateAwardViewModel } from "@/viewmodels/admin/award.models"; import cloneDeep from "lodash.clonedeep"; -import isEqual from "lodash.isEqual"; +import isEqual from "lodash.isequal"; diff --git a/src/views/admin/user/UserEdit.vue b/src/views/admin/user/UserEdit.vue index b359a63..a4e7cfc 100644 --- a/src/views/admin/user/UserEdit.vue +++ b/src/views/admin/user/UserEdit.vue @@ -59,7 +59,7 @@ import { RouterLink } from "vue-router"; import { useUserStore } from "@/stores/admin/user"; import type { UpdateUserViewModel, UserViewModel } from "@/viewmodels/admin/user.models"; import cloneDeep from "lodash.clonedeep"; -import isEqual from "lodash.isEqual"; +import isEqual from "lodash.isequal";