diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index e0d27ac..1c63d54 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -60,10 +60,20 @@ Use this as your shared context when proposing changes. Keep edits minimal and m - Vite React app; proxies `/api` and `/screenshots` to API in dev (`vite.config.ts`). - Uses Syncfusion components; Vite config pre-bundles specific packages to avoid alias issues. - Environment: `VITE_API_URL` provided at build/run; in dev compose, proxy handles `/api` so local fetches can use relative `/api/...` paths. + - Theming: Syncfusion Material 3 theme is used. All component CSS is imported centrally in `dashboard/src/main.tsx` (base, navigations, buttons, inputs, dropdowns, popups, kanban, grids, schedule, filemanager, notifications, layouts, lists, calendars, splitbuttons, icons). Tailwind CSS has been removed. - Scheduler (appointments page): top bar includes Group and Academic Period selectors (Syncfusion DropDownList). Selecting a period calls `POST /api/academic_periods/active`, moves the calendar to today’s month/day within the period year, and refreshes a right-aligned indicator row showing: - Holidays present in the current view (count) - Period label (display_name or name) with a badge indicating whether any holidays exist in that period (overlap check) +- Program info page (`dashboard/src/programminfo.tsx`): + - Loads data from `dashboard/public/program-info.json` (app name, version, build info, tech stack, changelog). + - Uses Syncfusion card classes (`e-card`, `e-card-header`, `e-card-title`, `e-card-content`) for consistent styling. + - Changelog is paginated with `PagerComponent` (from `@syncfusion/ej2-react-grids`), default page size 5; adjust `pageSize` or add a selector as needed. + +- Groups page (`dashboard/src/infoscreen_groups.tsx`): + - Migrated to Syncfusion inputs and popups: Buttons, TextBox, DropDownList, Dialog; Kanban remains for drag/drop. + - Unified toast/dialog wording; replaced legacy alerts with toasts; spacing handled via inline styles to avoid Tailwind dependency. + Note: Syncfusion usage in the dashboard is already documented above; if a UI for conversion status/downloads is added later, link its routes and components here. ## Local development @@ -116,3 +126,13 @@ Questions or unclear areas? Tell us if you need: exact devcontainer debugging st - **Usage**: New events/media can optionally reference `academic_period_id` for better organization and filtering. - **Constraints**: Only one period can be active at a time; use `init_academic_periods.py` for Austrian school year setup. - **UI Integration**: The dashboard highlights the currently selected period and whether a holiday plan exists within that date range. Holiday linkage currently uses date overlap with `school_holidays`; an explicit `academic_period_id` on `school_holidays` can be added later if tighter association is required. + +## Changelog Style Guide (Program info) + +- Source: `dashboard/public/program-info.json`; newest entry first +- Fields per release: `version`, `date` (YYYY-MM-DD), `changes` (array of short bullets) +- Tone: concise, user-facing; German wording; area prefixes allowed (e.g., “UI: …”, “API: …”) +- Categories via emoji or words: Added (🆕/✨), Changed (🛠️), Fixed (✅/🐛), Removed (🗑️), Security (🔒), Deprecated (⚠️) +- Breaking changes must be prefixed with `BREAKING:` +- Keep ≤ 8–10 bullets; summarize or group micro-changes +- JSON hygiene: valid JSON, no trailing commas, don’t edit historical entries except typos diff --git a/README.md b/README.md index 0e823d9..8ceb710 100644 --- a/README.md +++ b/README.md @@ -132,7 +132,8 @@ For detailed deployment instructions, see: ### 🖥️ **Dashboard** (`dashboard/`) - **Technology**: React 19 + TypeScript + Vite -- **UI Framework**: Syncfusion components + Tailwind CSS +- **UI Framework**: Syncfusion components (Material 3 theme) +- **Styling**: Centralized Syncfusion Material 3 CSS imports in `dashboard/src/main.tsx` - **Features**: Responsive design, real-time updates, file management - **Port**: 5173 (dev), served via Nginx (prod) @@ -270,13 +271,15 @@ mosquitto_sub -h localhost -t "infoscreen/+/heartbeat" -v ## 🎨 Frontend Features -### Syncfusion Components Used +### Syncfusion Components Used (Material 3) - **Schedule**: Event calendar with drag-drop support - **Grid**: Data tables with filtering and sorting - **DropDownList**: Group and period selectors - **FileManager**: Media upload and organization - **Kanban**: Task management views - **Notifications**: Toast messages and alerts + - **Pager**: Used on Programinfo changelog for pagination + - **Cards (layouts)**: Programinfo sections styled with Syncfusion card classes ### Pages Overview - **Dashboard**: System overview and statistics @@ -286,6 +289,7 @@ mosquitto_sub -h localhost -t "infoscreen/+/heartbeat" -v - **Media**: File upload and conversion - **Settings**: System configuration - **Holidays**: Academic calendar management + - **Program info**: Version, build info, tech stack and paginated changelog (reads `dashboard/public/program-info.json`) ## 🔒 Security & Authentication @@ -415,3 +419,35 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file --- For detailed technical documentation, deployment guides, and API specifications, please refer to the additional documentation files in this repository. + +Notes: +- Tailwind CSS was removed. Styling is managed via Syncfusion Material 3 theme imports in `dashboard/src/main.tsx`. + +## 🧭 Changelog Style Guide + +When adding entries to `dashboard/public/program-info.json` (displayed on the Program info page): + +- Structure per release + - `version` (e.g., `2025.1.0-alpha.8`) + - `date` in `YYYY-MM-DD` (ISO format) + - `changes`: array of short bullet strings + +- Categories (Keep a Changelog inspired) + - Prefer starting bullets with an implicit category or an emoji, e.g.: + - Added (🆕/✨), Changed (🔧/🛠️), Fixed (🐛/✅), Removed (🗑️), Security (🔒), Deprecated (⚠️) + +- Writing rules + - Keep bullets concise (ideally one line) and user-facing; avoid internal IDs or jargon + - Put the affected area first when helpful (e.g., “UI: …”, “API: …”, “Scheduler: …”) + - Highlight breaking changes with “BREAKING:” + - Prefer German wording consistently; dates are localized at runtime for display + +- Ordering and size + - Newest release first in the array + - Aim for ≤ 8–10 bullets per release; group or summarize if longer + +- JSON hygiene + - Valid JSON only (no trailing commas); escape quotes as needed + - One release object per version; do not modify historical entries unless to correct typos + +The Program info page paginates older entries (default page size 5). Keep highlights at the top of each release for scanability. diff --git a/dashboard/.stylelintrc.json b/dashboard/.stylelintrc.json index 32d162c..7be2570 100644 --- a/dashboard/.stylelintrc.json +++ b/dashboard/.stylelintrc.json @@ -1,7 +1,6 @@ { "extends": [ - "stylelint-config-standard", - "stylelint-config-tailwindcss" + "stylelint-config-standard" ], "rules": { "at-rule-no-unknown": null diff --git a/dashboard/package.json b/dashboard/package.json index a27d02b..970b58a 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -45,9 +45,6 @@ }, "devDependencies": { "@eslint/js": "^9.25.0", - "@tailwindcss/aspect-ratio": "^0.4.2", - "@tailwindcss/forms": "^0.5.10", - "@tailwindcss/typography": "^0.5.16", "@types/react": "^19.1.8", "@types/react-dom": "^19.1.6", "@types/react-router-dom": "^5.3.3", @@ -66,8 +63,6 @@ "prettier": "^3.5.3", "stylelint": "^16.21.0", "stylelint-config-standard": "^38.0.0", - "stylelint-config-tailwindcss": "^1.0.0", - "tailwindcss": "^3.4.17", "typescript": "~5.8.3", "typescript-eslint": "^8.30.1", "vite": "^6.3.5" diff --git a/dashboard/postcss.config.cjs b/dashboard/postcss.config.cjs index 33ad091..90d9fff 100644 --- a/dashboard/postcss.config.cjs +++ b/dashboard/postcss.config.cjs @@ -1,6 +1,5 @@ module.exports = { plugins: { - tailwindcss: {}, autoprefixer: {}, }, } diff --git a/dashboard/public/program-info.json b/dashboard/public/program-info.json index 1f1a7e2..39dc5cb 100644 --- a/dashboard/public/program-info.json +++ b/dashboard/public/program-info.json @@ -1,6 +1,6 @@ { "appName": "Infoscreen-Management", - "version": "2025.1.0-alpha.7", + "version": "2025.1.0-alpha.8", "copyright": "© 2025 Third-Age-Applications", "supportContact": "support@third-age-applications.com", "description": "Eine zentrale Verwaltungsoberfläche für digitale Informationsbildschirme.", @@ -30,6 +30,17 @@ "commitId": "8d1df7199cb7" }, "changelog": [ + { + "version": "2025.1.0-alpha.8", + "date": "2025-10-11", + "changes": [ + "🎨 Theme: Umstellung auf Syncfusion Material 3; zentrale CSS-Imports in main.tsx", + "🧹 Cleanup: Tailwind CSS komplett entfernt (Pakete, PostCSS, Stylelint, Konfigurationsdateien)", + "🧩 Gruppenverwaltung: \"infoscreen_groups\" auf Syncfusion-Komponenten (Buttons, Dialoge, DropDownList, TextBox) umgestellt; Abstände verbessert", + "🔔 Benachrichtigungen: Vereinheitlichte Toast-/Dialog-Texte; letzte Alert-Verwendung ersetzt", + "📖 Doku: README und Copilot-Anweisungen angepasst (Material 3, zentrale Styles, kein Tailwind)" + ] + }, { "version": "2025.1.0-alpha.7", "date": "2025-09-21", diff --git a/dashboard/src/App.css b/dashboard/src/App.css index 0857a83..cf4a791 100644 --- a/dashboard/src/App.css +++ b/dashboard/src/App.css @@ -1,19 +1,4 @@ -@import "../node_modules/@syncfusion/ej2-base/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-buttons/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-calendars/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-dropdowns/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-inputs/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-lists/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-navigations/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-popups/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-splitbuttons/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-react-schedule/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-kanban/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-notifications/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-react-filemanager/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-layouts/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-grids/styles/material.css"; -@import "../node_modules/@syncfusion/ej2-icons/styles/material.css"; +/* Removed legacy Syncfusion material theme imports; using material3 imports in main.tsx */ body { font-family: Inter, 'Segoe UI', Roboto, Arial, sans-serif; diff --git a/dashboard/src/index.css b/dashboard/src/index.css index b1235f3..20ff245 100644 --- a/dashboard/src/index.css +++ b/dashboard/src/index.css @@ -1,7 +1,4 @@ -/* @tailwind base; -@tailwind components; */ - -/* @tailwind utilities; */ +/* Tailwind removed: base/components/utilities directives no longer used. */ /* :root { font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; diff --git a/dashboard/src/infoscreen_groups.tsx b/dashboard/src/infoscreen_groups.tsx index eceeaf2..fadf0c3 100644 --- a/dashboard/src/infoscreen_groups.tsx +++ b/dashboard/src/infoscreen_groups.tsx @@ -5,6 +5,11 @@ import { fetchGroups, createGroup, deleteGroup, renameGroup } from './apiGroups' import type { Client } from './apiClients'; import type { KanbanComponent as KanbanComponentType } from '@syncfusion/ej2-react-kanban'; import { DialogComponent } from '@syncfusion/ej2-react-popups'; +import { ButtonComponent } from '@syncfusion/ej2-react-buttons'; +import { TextBoxComponent } from '@syncfusion/ej2-react-inputs'; +import { DropDownListComponent } from '@syncfusion/ej2-react-dropdowns'; +import type { ChangedEventArgs as TextBoxChangedArgs } from '@syncfusion/ej2-react-inputs'; +import type { ChangeEventArgs as DropDownChangeArgs } from '@syncfusion/ej2-react-dropdowns'; import { useToast } from './components/ToastProvider'; import { L10n } from '@syncfusion/ej2-base'; @@ -41,10 +46,10 @@ const de = { rename: 'Umbenennen', confirmDelete: 'Löschbestätigung', reallyDelete: (name: string) => `Möchten Sie die Gruppe ${name} wirklich löschen?`, - clientsMoved: 'Alle Clients werden in "Nicht zugeordnet" verschoben.', + clientsMoved: 'Alle Clients werden nach "Nicht zugeordnet" verschoben.', groupCreated: 'Gruppe angelegt', - groupDeleted: 'Gruppe gelöscht. Clients in "Nicht zugeordnet" verschoben', - groupRenamed: 'Gruppenname geändert', + groupDeleted: 'Gruppe gelöscht. Alle Clients wurden nach "Nicht zugeordnet" verschoben.', + groupRenamed: 'Gruppe umbenannt', selectGroup: 'Gruppe wählen', newName: 'Neuer Name', warning: 'Achtung:', @@ -312,7 +317,12 @@ const Infoscreen_groups: React.FC = () => { }); }); } catch { - alert('Fehler beim Aktualisieren der Clients'); + toast.show({ + content: 'Fehler beim Aktualisieren der Clients', + cssClass: 'e-toast-danger', + timeOut: 0, + showCloseButton: true, + }); } setDraggedCard(null); }; @@ -326,25 +336,23 @@ const Infoscreen_groups: React.FC = () => { return (