diff --git a/docker-compose.screenshots.yml b/docker-compose.screenshots.yml index f226003..6f0f2f9 100644 --- a/docker-compose.screenshots.yml +++ b/docker-compose.screenshots.yml @@ -68,5 +68,10 @@ services: # moeglich, hinaus geht trotzdem nichts. SMTP_HOST: smtp.planer.invalid SMTP_ABSENDER: Planer + # Erfundene Werte, damit die Seite "Integrationen" den eingerichteten + # Fall zeigt. Nach draussen geht davon nichts: Die Jobs schweigen, + # solange DEMO_MODUS true ist. + TELEGRAM_TOKEN: 000000:demo-token-ohne-funktion + SPIEGEL_GEHEIMNIS: demo-geheimnis-ohne-funktion ports: - '${SCREENSHOT_APP_PORT:-3200}:3000' diff --git a/prisma/demo-seed.ts b/prisma/demo-seed.ts index 7e81a9c..4830f74 100644 --- a/prisma/demo-seed.ts +++ b/prisma/demo-seed.ts @@ -429,6 +429,7 @@ async function main(): Promise { anlaesse: 'tagesueberblick,faelligkeit,zeitblock', perPush: true, perMail: true, + perTelegram: true, ueberblickUm: 7 * 60, ruheVon: 20 * 60, ruheBis: 7 * 60, @@ -442,6 +443,52 @@ async function main(): Promise { // nicht lesen kann. Ein erfundener Eintrag verschwände beim ersten Lauf // wieder — die Bilder zeigen deshalb den Zustand vor der ersten Anmeldung. + // --- Integrationen -------------------------------------------------------- + await db.integrationszustand.deleteMany({}) + await db.integrationszustand.create({ + data: { + quelle: 'TELEGRAM', + merker: '4711', + letzterLauf: new Date(Date.UTC(2026, 2, 17, 8, 18)), + letzterErfolg: new Date(Date.UTC(2026, 2, 17, 8, 18)), + }, + }) + await db.integrationszustand.create({ + data: { + quelle: 'SPIEGEL', + letzterLauf: new Date(Date.UTC(2026, 2, 17, 8, 15)), + letzterErfolg: new Date(Date.UTC(2026, 2, 17, 8, 15)), + }, + }) + + await db.telegramChat.deleteMany({}) + await db.telegramChat.create({ + data: { + // Erfunden. Der Bot ist ohnehin abgeschaltet, solange DEMO_MODUS gilt. + chatId: BigInt(147258369), + benutzerId: benutzer.id, + bezeichnung: 'Martina', + erstelltAm: new Date(Date.UTC(2026, 1, 3, 8, 25)), + zuletztBenutzt: new Date(Date.UTC(2026, 2, 17, 6, 40)), + }, + }) + + // Dienstliche Belegung, wie sie aus der Firma hereinkaeme: ohne Titel. + await db.spiegelbelegung.deleteMany({}) + for (const [tag, stunde, dauer] of [ + [17, 9, 2], + [18, 13, 3], + [19, 8, 1], + ] as const) { + await db.spiegelbelegung.create({ + data: { + quelleRef: `demo-spiegel-${tag}-${stunde}`, + beginn: new Date(Date.UTC(2026, 2, tag, stunde - 1, 0)), + ende: new Date(Date.UTC(2026, 2, tag, stunde - 1 + dauer, 0)), + }, + }) + } + console.log(`Demo-Daten stehen bereit. Anmeldung: ${DEMO_EMAIL}`) } diff --git a/screenshots/bilder.spec.ts b/screenshots/bilder.spec.ts index 15f69a2..da824ef 100644 --- a/screenshots/bilder.spec.ts +++ b/screenshots/bilder.spec.ts @@ -43,6 +43,7 @@ const AUFNAHMEN: Aufnahme[] = [ { name: 'ideen', pfad: '/ideen' }, { name: 'bereiche', pfad: '/bereiche' }, { name: 'kalenderkonten', pfad: '/kalenderkonten' }, + { name: 'integrationen', pfad: '/integrationen' }, { name: 'einstellungen', pfad: '/einstellungen' }, { name: 'benachrichtigungen', diff --git a/src/app/(app)/integrationen/page.tsx b/src/app/(app)/integrationen/page.tsx index c768703..684f798 100644 --- a/src/app/(app)/integrationen/page.tsx +++ b/src/app/(app)/integrationen/page.tsx @@ -166,10 +166,9 @@ export default async function IntegrationenSeite() { Telegram-Chats Nur wer hier steht, darf mit dem Bot reden — und nur diese Chats bekommen - Meldungen. Alles andere wird verworfen, ohne zu antworten. Die Kennung - deines Chats verrät dir der Bot, wenn du ihm{' '} - /start schickst und danach hier nachsiehst; - steht sie noch nicht drin, findest du sie im Protokoll. + Meldungen. Alles andere wird verworfen, ohne zu antworten. Zum Verbinden + holst du dir hier einen Code und schickst ihn dem Bot; er gilt zehn Minuten + und genau einmal. diff --git a/src/components/kopfleiste.tsx b/src/components/kopfleiste.tsx index f314be0..e4f6ba0 100644 --- a/src/components/kopfleiste.tsx +++ b/src/components/kopfleiste.tsx @@ -50,7 +50,13 @@ export function Kopfleiste({ Navigation waagerecht, statt umzubrechen und den Namen der Anwendung in die zweite Zeile zu drängen. */} -
+ {/* + Breiter als die Inhaltsspalte (max-w-5xl): Mit dem elften Eintrag + passte die Leiste dort nicht mehr, und "Einstellungen" verschwand + stillschweigend am rechten Rand. Eine Leiste, die Punkte verschluckt, + ist schlimmer als eine, die nicht buendig mit dem Text steht. + */} +
Planer diff --git a/src/server/jobs.ts b/src/server/jobs.ts index 93196a5..7aaa372 100644 --- a/src/server/jobs.ts +++ b/src/server/jobs.ts @@ -111,7 +111,12 @@ export function jobsStarten(): void { const einst = umgebung() - if (einst.zammadAktiv) { + // Die Demo-Instanz redet mit niemandem. Sie ist mit erfundenen Daten + // gefuellt und steht nur fuer Bilder – ein Aufruf nach draussen waere + // bestenfalls sinnlos und schlimmstenfalls peinlich. + const nachDraussen = !einst.DEMO_MODUS + + if (einst.zammadAktiv && nachDraussen) { cron.schedule(ZAMMAD_PLAN, () => { void zammadAbgleichen(DIENST) .then((bericht) => { @@ -127,7 +132,7 @@ export function jobsStarten(): void { }) } - if (einst.telegramAktiv) { + if (einst.telegramAktiv && nachDraussen) { cron.schedule(TELEGRAM_PLAN, () => { void telegramAbholen(DIENST) .then((bericht) => { @@ -142,7 +147,7 @@ export function jobsStarten(): void { }) } - if (einst.spiegelSendenAktiv) { + if (einst.spiegelSendenAktiv && nachDraussen) { cron.schedule(SPIEGEL_PLAN, () => { void spiegelSenden().catch((fehler: unknown) => { console.error('Spiegel-Versand abgebrochen:', fehler)