feat: Aufgaben einzeln zum Spiegeln freigeben

Der Schalter erscheint nur, wo auch gespiegelt wird.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-11 23:58:46 +02:00
co-authored by Claude Opus 5
parent 4da2f3d9c6
commit 3befcc19a3
4 changed files with 10 additions and 0 deletions
+4
View File
@@ -14,6 +14,7 @@ import {
type AufgabenFilter, type AufgabenFilter,
} from '@/server/abfragen/aufgaben' } from '@/server/abfragen/aufgaben'
import { verlangeAnmeldung } from '@/server/berechtigung' import { verlangeAnmeldung } from '@/server/berechtigung'
import { umgebung } from '@/server/umgebung'
export const metadata: Metadata = { title: 'Aufgaben' } export const metadata: Metadata = { title: 'Aufgaben' }
@@ -67,6 +68,7 @@ export default async function AufgabenSeite({
searchParams: Promise<Record<string, string | string[] | undefined>> searchParams: Promise<Record<string, string | string[] | undefined>>
}) { }) {
await verlangeAnmeldung('/aufgaben') await verlangeAnmeldung('/aufgaben')
const spiegelt = umgebung().spiegelSendenAktiv
const parameter = await searchParams const parameter = await searchParams
const [aufgaben, bereiche, projekte] = await Promise.all([ const [aufgaben, bereiche, projekte] = await Promise.all([
@@ -101,11 +103,13 @@ export default async function AufgabenSeite({
</CardInhalt> </CardInhalt>
</Card> </Card>
{/* Nur wo auch gespiegelt wird, hat der Schalter einen Sinn. */}
<AufgabenListe <AufgabenListe
aufgaben={aufgaben} aufgaben={aufgaben}
bereiche={bereiche} bereiche={bereiche}
projekte={projekte} projekte={projekte}
leerText="Keine Aufgabe passt zu diesen Filtern." leerText="Keine Aufgabe passt zu diesen Filtern."
mitSpiegeln={spiegelt}
/> />
</div> </div>
) )
+1
View File
@@ -16,6 +16,7 @@ function roh(teil: Partial<AufgabeRoh> = {}): AufgabeRoh {
faelligAm: null, faelligAm: null,
quelle: 'MANUELL', quelle: 'MANUELL',
quelleUrl: null, quelleUrl: null,
spiegeln: false,
bereich: null, bereich: null,
projekt: null, projekt: null,
...teil, ...teil,
+4
View File
@@ -26,6 +26,7 @@ export type AufgabeRoh = {
faelligAm: Date | null faelligAm: Date | null
quelle: Quelle quelle: Quelle
quelleUrl: string | null quelleUrl: string | null
spiegeln: boolean
bereich: { id: string; name: string; farbe: string } | null bereich: { id: string; name: string; farbe: string } | null
projekt: { id: string; name: string } | null projekt: { id: string; name: string } | null
} }
@@ -48,6 +49,8 @@ export type AufgabeAnzeige = {
ueberfaellig: boolean ueberfaellig: boolean
quelle: Quelle quelle: Quelle
quelleUrl: string | null quelleUrl: string | null
/** Ausdruecklich zum Spiegeln freigegeben. */
spiegeln: boolean
bereich: { id: string; name: string; farbe: string } | null bereich: { id: string; name: string; farbe: string } | null
projekt: { id: string; name: string } | null projekt: { id: string; name: string } | null
} }
@@ -79,6 +82,7 @@ export function fuerAnzeige(aufgabe: AufgabeRoh, jetzt: Date): AufgabeAnzeige {
ueberfaellig: istUeberfaellig(aufgabe.faelligAm, aufgabe.status, jetzt), ueberfaellig: istUeberfaellig(aufgabe.faelligAm, aufgabe.status, jetzt),
quelle: aufgabe.quelle, quelle: aufgabe.quelle,
quelleUrl: aufgabe.quelleUrl, quelleUrl: aufgabe.quelleUrl,
spiegeln: aufgabe.spiegeln,
bereich: aufgabe.bereich, bereich: aufgabe.bereich,
projekt: aufgabe.projekt, projekt: aufgabe.projekt,
} }
+1
View File
@@ -25,6 +25,7 @@ const AUSWAHL = {
faelligAm: true, faelligAm: true,
quelle: true, quelle: true,
quelleUrl: true, quelleUrl: true,
spiegeln: true,
bereich: { select: { id: true, name: true, farbe: true } }, bereich: { select: { id: true, name: true, farbe: true } },
projekt: { select: { id: true, name: true } }, projekt: { select: { id: true, name: true } },
} satisfies Prisma.AufgabeSelect } satisfies Prisma.AufgabeSelect