diff --git a/app/package-lock.json b/app/package-lock.json index a298716..767fea8 100644 --- a/app/package-lock.json +++ b/app/package-lock.json @@ -8,7 +8,9 @@ "name": "vereinshaus", "version": "0.1.0", "dependencies": { + "ical-generator": "^10.2.0", "pocketbase": "^0.26.9", + "rrule": "^2.8.1", "web-push": "^3.6.7" }, "devDependencies": { @@ -3966,6 +3968,54 @@ "node": ">= 14" } }, + "node_modules/ical-generator": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ical-generator/-/ical-generator-10.2.0.tgz", + "integrity": "sha512-XR5FsiDWCsz5MwBwMA/sQqR3A9H240xkXIeXOabV7uNAiieP+TA9rleVvlwPLRXMz+CXME8cGuDd7cdnE5At6w==", + "license": "MIT", + "engines": { + "node": "20 || 22 || >=24" + }, + "peerDependencies": { + "@touch4it/ical-timezones": ">=1.6.0", + "@types/luxon": ">= 1.26.0", + "@types/mocha": ">= 8.2.1", + "dayjs": ">= 1.10.0", + "luxon": ">= 1.26.0", + "moment": ">= 2.29.0", + "moment-timezone": ">= 0.5.33", + "rrule": ">= 2.6.8" + }, + "peerDependenciesMeta": { + "@touch4it/ical-timezones": { + "optional": true + }, + "@types/luxon": { + "optional": true + }, + "@types/mocha": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-timezone": { + "optional": true + }, + "rrule": { + "optional": true + } + } + }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", @@ -5406,6 +5456,15 @@ "dev": true, "license": "MIT" }, + "node_modules/rrule": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/rrule/-/rrule-2.8.1.tgz", + "integrity": "sha512-hM3dHSBMeaJ0Ktp7W38BJZ7O1zOgaFEsn41PDk+yHoEtfLV+PoJt9E9xAlZiWgf/iqEqionN0ebHFZIDAp+iGw==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", @@ -6048,9 +6107,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true + "license": "0BSD" }, "node_modules/type-fest": { "version": "0.16.0", diff --git a/app/package.json b/app/package.json index 95ba95e..fd9187a 100644 --- a/app/package.json +++ b/app/package.json @@ -25,7 +25,9 @@ "workbox-precaching": "^7.4.1" }, "dependencies": { + "ical-generator": "^10.2.0", "pocketbase": "^0.26.9", + "rrule": "^2.8.1", "web-push": "^3.6.7" } } diff --git a/app/src/lib/types.ts b/app/src/lib/types.ts index 219319b..7bc4aed 100644 --- a/app/src/lib/types.ts +++ b/app/src/lib/types.ts @@ -90,6 +90,8 @@ export interface Termin { gruppe_ids: string[]; durchfuehrender_id?: string; verfuegbarkeit?: Verfuegbarkeit; + rrule?: string; + serie_id?: string; } export interface Nachricht { diff --git a/app/src/routes/(app)/einstellungen/+page.svelte b/app/src/routes/(app)/einstellungen/+page.svelte index 8cba42a..9fb8f07 100644 --- a/app/src/routes/(app)/einstellungen/+page.svelte +++ b/app/src/routes/(app)/einstellungen/+page.svelte @@ -32,7 +32,7 @@ let einladungUrl = $state(''); let einladungKopiert = $state(false); - let vereinId = ''; + let vereinId = $state(''); const bundeslaender = [ ['', '—'], @@ -206,6 +206,18 @@ +
+

Kalender-Abo

+

+ Diese URL in Apple Calendar, Google Calendar oder Outlook eintragen – Termine erscheinen automatisch im Handy-Kalender. +

+
{typeof window !== 'undefined' ? window.location.origin : ''}/api/kalender/{vereinId}
+ +

Für iOS: webcal:// statt https:// verwenden – öffnet direkt den Abonnieren-Dialog.

+
+ {#if isAdmin()}

Durchführende

@@ -328,6 +340,12 @@ margin-bottom: 1.5rem; } + .ical-url { + font-family: monospace; font-size: 0.78rem; color: #1e293b; + background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 6px; + padding: 0.5rem 0.75rem; word-break: break-all; margin-bottom: 0.5rem; + } + .trainer-liste { list-style: none; padding: 0; margin: 0 0 0.75rem; border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden; diff --git a/app/src/routes/(app)/termine/+page.svelte b/app/src/routes/(app)/termine/+page.svelte index 47f2314..dc56e6b 100644 --- a/app/src/routes/(app)/termine/+page.svelte +++ b/app/src/routes/(app)/termine/+page.svelte @@ -1,6 +1,7 @@