feat(nextcloud-status): Dashboard-Kachel, Anleitung und Changelog

- Kachel mit Zählern und roten/gelben Clouds, nur mit Modulzugriff sichtbar (geteilte Widget-Typen, Modulzuordnung, Katalog)
- Anleitung für Anwender und Administratoren, Eintrag im Changelog

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-02 15:00:31 +02:00
parent 6698ef1a92
commit 87a7b7cbcd
18 changed files with 564 additions and 27 deletions
@@ -21,14 +21,26 @@ describe('widget-module-map (quick-260922-m1h)', () => {
}
});
// quick-260924-i8v: Proxmox ist die erste modulgebundene Kachel; alle
// uebrigen bleiben Plattform-Kacheln ohne Modulbezug.
it('nur proxmox traegt einen Modulbezug, alle uebrigen Kacheln sind Plattform-Kacheln', () => {
for (const type of WIDGET_TYPES.filter((t) => t !== 'proxmox')) {
// quick-260924-i8v: Proxmox ist die erste modulgebundene Kachel,
// quick-261002-k67 ergaenzt Nextcloud-Status; alle uebrigen bleiben
// Plattform-Kacheln ohne Modulbezug.
it('nur proxmox und nextcloud-status tragen einen Modulbezug, alle uebrigen Kacheln sind Plattform-Kacheln', () => {
expect(Object.keys(WIDGET_MODULE_MAP).sort()).toEqual(['nextcloud-status', 'proxmox']);
for (const type of WIDGET_TYPES.filter((t) => t !== 'proxmox' && t !== 'nextcloud-status')) {
expect(getModuleSlugForWidgetType(type)).toBeUndefined();
}
});
it("die Nextcloud-Status-Kachel gehoert zum Modul 'nextcloud-status' (T-k67-04)", () => {
expect(getModuleSlugForWidgetType('nextcloud-status')).toBe('nextcloud-status');
});
it('WIDGET_TYPES endet mit nextcloud-status (zwoelf Typen, Reihenfolge unveraendert)', () => {
expect(WIDGET_TYPES).toHaveLength(12);
expect(WIDGET_TYPES.at(-1)).toBe('nextcloud-status');
expect(WIDGET_TYPES.at(-2)).toBe('reminder');
});
it("die Proxmox-Kachel gehoert zum Modul 'proxmox' (T-I8V-01)", () => {
expect(getModuleSlugForWidgetType('proxmox')).toBe('proxmox');
});
+6 -5
View File
@@ -23,16 +23,17 @@ import { WIDGET_MODULE_SLUGS } from '@tessera/shared';
* für ein Feld, das derzeit für jede Zeile leer wäre, wiegt schwerer als
* diese Konstante mit identischer Aussagekraft (15-RESEARCH.md Pitfall 5).
*
* Seit quick-260924-i8v steht dort genau ein Eintrag: `proxmox` →
* `proxmox`. Die übrigen neun Widget-Typen (clock/search/calendar/note/
* calculator/favorites/stopwatch/picture-frame/xframe) sind
* Plattform-Widgets ohne Modulbezug.
* Seit quick-261002-k67 stehen dort zwei Einträge: `proxmox` → `proxmox`
* (quick-260924-i8v) und `nextcloud-status` → `nextcloud-status`. Die
* übrigen Widget-Typen (clock/search/calendar/note/calculator/favorites/
* stopwatch/picture-frame/xframe/reminder) sind Plattform-Widgets ohne
* Modulbezug.
*/
export const WIDGET_MODULE_MAP: Readonly<Record<string, string>> = WIDGET_MODULE_SLUGS;
/**
* Liefert den Modul-Slug für einen Widget-Typ, oder `undefined`, wenn
* der Typ kein Modul-Widget ist (alle Typen außer `proxmox`). Einziger Lesezugriff auf die Zuordnungstabelle,
* der Typ kein Modul-Widget ist (alle Typen außer `proxmox` und `nextcloud-status`). Einziger Lesezugriff auf die Zuordnungstabelle,
* damit Tests sie gezielt mocken können.
*/
export function getModuleSlugForWidgetType(widgetType: string): string | undefined {