From 5bb107e53ac825ad6aae08e6e5c7471f913e548d Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Wed, 27 Nov 2024 17:06:39 +0100 Subject: [PATCH] docker build test --- .dockerignore | 1 + Dockerfile | 4 +- README.md | 74 +++++++++++++++--- demo-totp-qrcode.png | Bin 0 -> 1946 bytes src/components/Footer.vue | 8 +- src/components/Header.vue | 6 +- src/components/TextCopy.vue | 4 +- src/components/admin/Permission.vue | 2 +- src/components/admin/RoutingLink.vue | 2 +- src/components/admin/TopLevelLink.vue | 4 +- .../club/calendar/CreateCalendarModal.vue | 2 +- .../club/calendar/UpdateCalendarModal.vue | 8 +- .../club/member/MemberAwardEditModal.vue | 2 +- .../member/MemberCommunicationEditModal.vue | 2 +- .../MemberExecutivePositionEditModal.vue | 2 +- .../member/MemberQualificationEditModal.vue | 2 +- .../admin/club/member/MembershipEditModal.vue | 2 +- .../calendarType/CreateCalendarTypeModal.vue | 8 +- .../admin/user/user/InviteListItem.vue | 4 +- src/main.css | 2 +- src/serverCom.ts | 2 +- src/stores/admin/protocol.ts | 2 +- src/stores/admin/protocolAgenda.ts | 2 +- src/stores/admin/protocolDecision.ts | 2 +- src/stores/admin/protocolPresence.ts | 2 +- src/stores/admin/protocolVoting.ts | 2 +- src/views/account/Administration.vue | 11 +-- src/views/account/Me.vue | 3 +- src/views/admin/club/members/MemberEdit.vue | 2 +- src/views/admin/settings/AwardEdit.vue | 2 +- src/views/admin/settings/CalendarTypeEdit.vue | 2 +- .../admin/settings/CommunicationType.vue | 7 +- .../admin/settings/CommunicationTypeEdit.vue | 2 +- .../admin/settings/ExecutivePositionEdit.vue | 2 +- .../admin/settings/MembershipStatusEdit.vue | 2 +- .../admin/settings/QualificationEdit.vue | 2 +- src/views/admin/user/RoleEdit.vue | 2 +- src/views/admin/user/UserEdit.vue | 2 +- src/views/admin/user/UserEditRoles.vue | 2 +- 39 files changed, 117 insertions(+), 75 deletions(-) create mode 100644 demo-totp-qrcode.png 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 0000000000000000000000000000000000000000..ae03670cbfe00b52ba89f1524e6fa8d9e55781af GIT binary patch literal 1946 zcmb7FZ)g)|7|$l?6uL4?5Y(~hT!Z()(tNp1yJp&0dm}X_y^0%*&O$!z!%fkdLP^;s zb%`jG60BqxnjT%w{Xt~|m69qN7!^S#7RJEn;eld>CZ7^^Hv2u#UCiA+Z69*)UG90_ z_j!JQo=fiAyQgK%`ZXSpr$y=uMzQ`%zt>jc`oW!*ek`v_!JTsamBsamKRljQ1N8L# z#?I4Q_N=}Bq5p2Z?mu=q@zL9n`|oUBxU<;0aP8K?pHFUFxc2-1TFj+Q={ZeL&QGL# z!a#9@5Ek0gVL60*)j!x3sbz%jLkFI1KJnYO!&m~N9~VV!Hc}p+m&-xpR7x_WVq02@ zU6_>5=R@AGP>_tw>z{x6_~OEDT22hjRC=-PKv6-+Oo}7h)0!?7eM0vX-YMIEI(p{j zC+ptF^47K=DyrU+)`p|!g!6J&1lPP7*x`(rrn1hVO4>uk25ktx5YPFwkhdPQ>%>yI z+3{nw!;0kX^3;@7NmZoN8iy7_Mpo`bI`z&++nf6bZ5%>^k~cGNz6AH%7dOTx83A!{ zcFHOl7|P|LFP&KR5iA8%Hz_~J$8(6ws+A;wF3Dv#Nc-t{g#jcO>23m)NU`Whv{M^p zGVEGL?==ZFm!=5O>hXC3fnyuVV2=`rRs}%Tj-$Gy-7%I+f$HY8&l?6MO0*WV$R3%d zCU9O(7g104JqJkLYQ^H5Kv#!32fau}3$}S#uOYfX>Hv-Hcwgdb2;LF{O}){7W`C2f z;jyKY^72edL`ft?bfjnG?ntNBr9oUQ2DcRZSbMa4B^V? zZ3)zd65~Ba8)*Vrkm5K%6otZ5Te(;g)$afYa0G%HK<0bi0(mSJo%4k`N77mm;N*m3A&1wBqDlE?efe&;R*$^X9ryXjK&O-1cOExEz-l@$_k)S5{795yoo5L0U zUxocdh>c}|-1?SuMmA@f4y!%t@n-2Y5C+!t1Bu{>=9`{9;u;hNrXvC*qXcWAv~io4 zFyvBo40dxV#&SpJs^2mO4-KR?FlqDF-)*`IQ*Zzh$#AuV01p|Gd(g;0moAHZah0Hr z_h2ik7&+FL!4hl9iSU*08C-HE6@XCs5)f*UGMO<-S9j&Ng#^9=kTp$XD}DpuB~s`9 zbk4MxFvi1=Et2HX2FJ1p*&HFEt~PPL6gco~ZL?weO8vK|N+5Tz@YR#>;lJ>)^+>z- L27lT0+1LL718%Zi literal 0 HcmV?d00001 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";