Installierbar: Manifest, Symbole aus dem eigenen Zeichen erzeugt (scripts/symbole.ts, kein Bilddienst), Verknuepfungen zu Lernmodus, Berichtsheft und Handouts. Offline gilt eine Regel, und die steht im Dienstarbeiter: Nur das Lernmaterial liegt im Browserspeicher - Handouts, Merkkarten, Glossar, die eigene Woche. Lernzielkontrollen, Berichtsheft, Bewertungen, Feedbackgespraeche, Anhaenge und jedes PDF niemals. Das ist keine Sparsamkeit: Was im Browsercache liegt, ist an der serverseitigen Rechtepruefung vorbei. Bewertungen ohne Netz gehen in eine Warteschlange und werden nachgereicht. Die Schlange haengt an der Benutzerkennung, nicht am Geraet - auf einem geteilten Werkstattgeraet bekaeme sonst der Zweite die offenen Bewertungen des Ersten aufs Konto. Der Tag der Bewertung kommt vom Geraet und wird auf heute gedeckelt (tagDerBewertung, 4 Tests): Eine vorgestellte Uhr darf das Wiederholen nicht wegstellen. Druck: Wer die dunkle Fassung eingestellt hatte, druckte bisher schwarze Flaechen. Im Druck wird jetzt die komplette helle Palette gesetzt, dazu A4-Raender, keine Umbrueche mitten in Karten und Zeilen, aufgeklappte details. Druckknoepfe bei Handout, Glossar und Auswertung. Durchstich in scripts/pruefungen/baustein-10.mjs mit echtem Abschalten des Netzes: 33 Pruefungen, darunter der Nachweis, dass nichts Bewertungsrelevantes im Speicher landet. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
60 lines
2.1 KiB
TypeScript
60 lines
2.1 KiB
TypeScript
import { erfordereBenutzer } from '@/lib/auth/rechte';
|
||
import { Kopfzeile, type Navigationseintrag } from '@/komponenten/Kopfzeile';
|
||
import { Netzzustand } from '@/komponenten/Netzzustand';
|
||
import { abmelden } from '../anmelden/aktionen';
|
||
|
||
export const dynamic = 'force-dynamic';
|
||
|
||
// Die Navigation wächst mit den Bausteinen mit – hier stehen nur Ziele,
|
||
// die es auch wirklich gibt.
|
||
const fuerAzubi: Navigationseintrag[] = [
|
||
{ pfad: '/', titel: 'Woche' },
|
||
{ pfad: '/handouts', titel: 'Handouts' },
|
||
{ pfad: '/karten', titel: 'Merkkarten' },
|
||
{ pfad: '/aufgaben', titel: 'Aufgaben' },
|
||
{ pfad: '/checklisten', titel: 'Checklisten' },
|
||
{ pfad: '/berichtsheft', titel: 'Berichtsheft' },
|
||
{ pfad: '/kontrollen', titel: 'Kontrollen' },
|
||
{ pfad: '/auswertung', titel: 'Mein Stand' },
|
||
{ pfad: '/feedback', titel: 'Feedback' },
|
||
{ pfad: '/glossar', titel: 'Glossar' },
|
||
];
|
||
|
||
const fuerAusbilder: Navigationseintrag[] = [
|
||
{ pfad: '/', titel: 'Überblick' },
|
||
{ pfad: '/wochenplan', titel: 'Wochenplan' },
|
||
{ pfad: '/handouts', titel: 'Handouts' },
|
||
{ pfad: '/karten', titel: 'Merkkarten' },
|
||
{ pfad: '/aufgaben', titel: 'Aufgaben' },
|
||
{ pfad: '/checklisten', titel: 'Checklisten' },
|
||
{ pfad: '/berichtsheft', titel: 'Berichtshefte' },
|
||
{ pfad: '/kontrollen', titel: 'Kontrollen' },
|
||
{ pfad: '/auswertung', titel: 'Auswertung' },
|
||
{ pfad: '/feedback', titel: 'Feedback' },
|
||
{ pfad: '/glossar', titel: 'Glossar' },
|
||
{ pfad: '/verwaltung', titel: 'Verwaltung' },
|
||
];
|
||
|
||
export default async function AngemeldetLayout({ children }: { children: React.ReactNode }) {
|
||
const benutzer = await erfordereBenutzer();
|
||
const eintraege = benutzer.rolle === 'ausbilder' ? fuerAusbilder : fuerAzubi;
|
||
|
||
return (
|
||
<>
|
||
<a href="#inhalt" className="sprung">
|
||
Zum Inhalt springen
|
||
</a>
|
||
<Kopfzeile
|
||
eintraege={eintraege}
|
||
name={benutzer.name}
|
||
rolle={benutzer.rolle === 'ausbilder' ? 'Ausbilder' : 'Azubi'}
|
||
abmeldeAktion={abmelden}
|
||
/>
|
||
<Netzzustand benutzerId={benutzer.id} />
|
||
<main id="inhalt" className="huelle">
|
||
{children}
|
||
</main>
|
||
</>
|
||
);
|
||
}
|