diff --git a/TOPICS.md b/TOPICS.md index 4fcaaf0..2e68b98 100644 --- a/TOPICS.md +++ b/TOPICS.md @@ -1,5 +1,5 @@ - + # Themen-Index für AI-Kontext @@ -27,7 +27,7 @@ Lade immer zuerst diese Datei. Dann gezielt die passende(n) Referenz-Datei(en). | Billing & Subscriptions | b-reference/platform-core/billing.md | Abrechnung, Prepaid, State Machine | | Google Voice (STT/TTS) | b-reference/platform-core/voice-google.md | VoiceObjects, ConnectorGoogleSpeech, `/voice-google/stt/*`, CommCoach vs Teamsbot vs Agent | | Frontend Nyla | b-reference/ui-nyla/architecture.md | UI-Seiten, Komponenten, Hooks, Routing | -| Layout-System (StackLayout, Panel, LayoutTabs, ViewStack) | b-reference/ui-nyla/layout.md | Scroll-Vertrag, Panel-Varianten, Seiten-Aufbau-Muster, Migrations-Checkliste | +| Layout-System (StackLayout, Panel, LayoutTabs, ViewStack, FloatingPortal) | b-reference/ui-nyla/layout.md | Scroll-Vertrag, Panel-Varianten, AI-Workspace Kontext-Sidebar (Muster 7), FloatingPortal fuer Dropdowns, Seiten-Aufbau-Muster | | FormGenerator (Table, Form, Tree, Report) | b-reference/ui-nyla/formgenerator.md | Generische UI-Komponenten, Provider-Pattern, API-Anbindung | | Private LLM | b-reference/service-llm-private/architecture.md | Internes LLM, Neutralisierung | | Teams Bot | b-reference/teams-bot/architecture.md | Meeting-Bot, Browser-Bot WebSocket, Director Prompts (Hybrid Agent-Routing), MeetingModule + 5-Tab-UI, Dashboard-SSE, Live-Session-SSE + MFA | @@ -56,6 +56,8 @@ Lade immer zuerst diese Datei. Dann gezielt die passende(n) Referenz-Datei(en). | UDB Cascade-Inherit für DataSource-Flags | c-work/4-done/2026-05-udb-cascade-inherit.md | 3-wertige `neutralize`/`ragIndexEnabled`/`scope` (`null` = vererbt), `_inheritFlags.getEffectiveFlag()` (Path-Traversal), `cascadeResetDescendants()` setzt explizite Descendants-Werte beim Parent-Toggle auf `null`, Walker konsumieren pre-resolved Werte aus `_loadRagEnabledDataSources` | | UDB Generic Tree Refactor (BE autoritativ, FE pure Renderer) | c-work/4-done/2026-05-udb-generic-tree-refactor.md | Single `POST /api/workspace/{id}/tree/children` mit `{parents}`-Liste liefert `nodesByParent` inkl. pre-computed `effectiveNeutralize/Scope/RagIndexEnabled` als `boolean\|'mixed'`. Orchestrator `serviceKnowledge/_buildTree.py`. SourcesTab.tsx auf ~530 Zeilen, kein optimistic update, Spinner pro pending Toggle, einheitliches Mixed-Symbol. FDS unterstuetzt nun RAG (gleiche 3-wertige Semantik wie DS). Geloescht: 7 alte Tree-Endpoints (`/resolve-flags`, `/connections`, `/connections/{id}/services`, `/connections/{id}/browse`, `/feature-connections`, `/feature-connections/{fiId}/tables`, `/feature-connections/{fiId}/parent-objects/{tableName}`). Bewusst weggelassen: FDS-Record-Expansion (Tabellen-Ebene reicht). | | UDB Polymorphic Refactor (Object-orientiert + Generic Router) | c-work/3-validate/2026-05-udb-polymorphic-refactor.md | Neue Klassenhierarchie `serviceKnowledge/udbNodes.py` (`UdbNode` ABC, Subklassen pro Kind). Generischer Router `routes/routeUdb.py` mit `POST /api/udb/tree/children` und `POST /api/udb/node/{key}/flag/{flag}`. Hart-Cut der alten 4 PATCH-Routen (`/scope`, `/neutralize`, `/rag-index`, `/neutralize-fields`) und der `/api/workspace/{id}/tree/children`-Route. FDS-Schema: `userId`, `workspaceInstanceId`, `scope` entfernt — FDS ist feature-owned, RBAC-gated (`-admin` Rolle auf `featureInstanceId`). Kanonische Doku: `b-reference/platform/unified-data-bar.md`. | +| ui-nyla Legacy-Cleanup (kein toter Code, done) | c-work/4-done/2026-06-ui-nyla-legacy-cleanup.md | work-around/pek, chatworkflow, Commcoach Dossier-CSS, useWorkflows — abgeschlossen | +| AI Workspace Kontext-Sidebar + FloatingPortal (done) | c-work/4-done/2026-06-workspace-context-sidebar.md | Explorer-Kontext, Mobile Bottom-Sheet, Dropdown-Portal-Migration | | Zentrale Workflow-Admin (Meine Sicht) | c-work/1-plan/2026-04-automation-central-admin.md | `/automations` Tabs Dashboard + Workflows, `GET .../workflow-runs/workflows` | | Web Image Search | c-work/1-plan/2026-03-web-image-search.md | WEB_SEARCH_MEDIA Feature | | UI i18n / Sprachsets (done) | c-work/3-validate/2026-04-ui-i18n-dynamic-language-sets.md | Mehrsprachigkeit, `t()`, Sprachset-API, Admin-UI, AI-Übersetzung | @@ -100,3 +102,4 @@ Lade immer zuerst diese Datei. Dann gezielt die passende(n) Referenz-Datei(en). | IMS (ISO 9001 + 27001) | e-compliance/ims/00_IMS-Handbuch.md | Integriertes Managementsystem: Kontext, Politiken, Risiko/SoA, Audit, KVP; Betriebsprozesse in ims/05_betrieb/ | | IMS Management-Cockpit | e-compliance/ims/cockpit/IMS-Cockpit.html | Offline-HTML zur Navigation/Einsicht aller IMS-Dokumente; neu bauen via build_cockpit.py | | Pendenzen / Massnahmen | e-compliance/ims/07_verbesserung/massnahmen-register.md | Zentrale Pendenzenliste (CAPA), Quelle fuer Cockpit-Pendenzenseite | +| Organisationsreglement | e-compliance/ims/02_fuehrung/organisationsreglement.md | Operative Aufgabenverteilung, Operations-/VR-Meetings (Vorschlag Silvan Winiger, POL-Freigabe ausstehend) | diff --git a/b-reference/platform-core/features/commcoach.md b/b-reference/platform-core/features/commcoach.md index 7a8fcd0..4ce0178 100644 --- a/b-reference/platform-core/features/commcoach.md +++ b/b-reference/platform-core/features/commcoach.md @@ -167,8 +167,9 @@ POST /voice/tts ### Views - `CommcoachDashboardView` – KPIs, streaks, quick start -- `CommcoachCoachingView` – Chat UI with voice + context tabs -- `CommcoachDossierView` – Dossier: timeline, tasks, scores +- `CommcoachAssistantView` – Wizard: neues Modul + erste Session +- `CommcoachModulesView` – Module-Liste, CRUD, Sessions je Modul +- `CommcoachSessionView` – Aktive Session: Chat, Voice, TTS, Agent-Activity (Keep-Alive) - `CommcoachSettingsView` – Voice, reminder, profile settings ### UX diff --git a/b-reference/ui-nyla/architecture.md b/b-reference/ui-nyla/architecture.md index 8bc2a7d..b2e8862 100644 --- a/b-reference/ui-nyla/architecture.md +++ b/b-reference/ui-nyla/architecture.md @@ -1,6 +1,6 @@ - - + + # Frontend Nyla -- Architektur @@ -31,7 +31,7 @@ Ergänzend typische Root-Dateien und Bereiche im Repo: `main.tsx`, `App.tsx`, `a | Komponente | Zweck | |------------|-------| -| `UnifiedDataBar (UDB)` | Multi-Tab-Panel: Chats, Files, Sources — wird in Workspace, CommCoach und Graphical Editor genutzt. Sources-Tab rendert zwei `FormGeneratorTree`-Sektionen ("Persoenliche Quellen", "Mandanten-Daten") mit dedizierter UDB-Domain-Schicht (`components/UnifiedDataBar/sources/`); UDB-Provider mappen Backend-Tree-Nodes auf das generische `TreeNode`-Schema, populieren `extraActions` fuer RAG-Toggle + Settings, und triggern Sektion-Refresh nach Patches | +| `UnifiedDataBar (UDB)` | Multi-Tab-Panel: Chats, Files, Sources — wird in Workspace (Chat-Picker + Kontext-Sidebar), CommCoach und Graphical Editor genutzt. Im AI-Workspace: Chats nur im Top-Bar-Picker; Kontext-Sidebar rendert `FilesTab`/`SourcesTab` direkt (ohne LayoutTabs-Wrapper). Sources-Tab rendert zwei `FormGeneratorTree`-Sektionen ("Persoenliche Quellen", "Mandanten-Daten") mit dedizierter UDB-Domain-Schicht (`components/UnifiedDataBar/sources/`); UDB-Provider mappen Backend-Tree-Nodes auf das generische `TreeNode`-Schema, populieren `extraActions` fuer RAG-Toggle + Settings, und triggern Sektion-Refresh nach Patches | | `FormGenerator` | Dynamische Formulare/Tabellen aus Backend-Attribut-Definitionen (siehe [formgenerator.md](formgenerator.md)) | | `FormGeneratorTree` | Generische Baumkomponente mit Provider-Pattern (`TreeNodeProvider`), Multiselect, DnD, Inline-Editing, Scope/Neutralize, Batch-Actions, generische **Mixed-State**-Symbole, **Pending-Spinner** und **extraActions**-Slot. Konsumenten: `FilesTab`, `SourcesTab`, `FilesPage`. Siehe [formgenerator.md](formgenerator.md). | | `MandateNavigation` | Feature-Baum-Navigation mit Mandanten-Kontext | @@ -41,7 +41,9 @@ Ergänzend typische Root-Dateien und Bereiche im Repo: `main.tsx`, `App.tsx`, `a | `EditorChatPanel` | AI Chat im Editor mit Drag&Drop-Dateianhang und Source-Picker | | `CanvasHeader` | Workflow-Metadaten, Versioning (Draft/Publish/Archive), Save-as-Template, New-from-Template | | `TemplatePicker` | Modal zur Auswahl von Workflow-Vorlagen beim Erstellen neuer Workflows | -| `WorkspacePage` | AI-Workspace mit Chat, UDB, Agent-Streaming | +| `WorkspacePage` | AI-Workspace (Keep-Alive): Prompt-centric Layout — Top-Bar (Kontext-Toggle, Chatname `...` wenn neu, Chat-Picker, Neuer-Chat), zentrale Chat-Spalte, optionale `WorkspaceContextSidebar` (Explorer-Style, volle Hoehe, Icon-Toolbar `files|sources|activity|preview`, URL `?ctxTab=`). Mobile: Bottom-Sheets fuer Chat + Kontext (66vh, Vollbild erweiterbar). Siehe [layout.md](layout.md) Muster 7. | +| `WorkspaceContextSidebar` | Vertikale Kontext-Sidebar fuer AI-Workspace; rendert UDB-Tabs + ToolActivityLog + FilePreview ohne verschachtelte LayoutTabs | +| `FloatingPortal` | Generisches Portal fuer Dropdowns/Popovers auf `document.body`; Standard fuer alle schwebenden Menues (kein absolute-Dropdown in overflow-Panes). Siehe [layout.md](layout.md) | | `RagInventoryPage` | Globale RAG-Inventar-Seite (`/rag-inventory`): pro Connection Card mit Consent-Toggle, Stop-Button, Reindex, DataSource-Uebersicht. Primaerer Ort fuer RAG-Management (keine duplizierte UI auf ConnectionsPage). API: `/api/rag/inventory/*` | | `RagRunningBadge` | Floating-Badge in `MainLayout.tsx`: zeigt laufende RAG-Bootstrap-Jobs, Polling gegen `/api/rag/inventory/jobs`, Click-through zum RAG-Inventar | | `AddConnectionWizard` | Connector-Type-Aware Wizard (Google/MSFT/ClickUp/Infomaniak): dynamische Step-Definition pro Typ, integrierter MSFT Admin-Consent-Step + Infomaniak-PAT-Step. Keine Kostenschaetzung, keine Preferences — nur Anbieter → Consent → Connect | @@ -94,6 +96,9 @@ Ergänzend typische Root-Dateien und Bereiche im Repo: `main.tsx`, `App.tsx`, `a | `locales/index.ts`, `types.ts` | i18n: API-basiertes Language-Loading (DB-backed, keine statischen Files) | | `providers/language/LanguageContext.tsx` | `t()`-Hook mit `{variable}`-Interpolation, Fallback-Kette, `availableLanguages` | | `components/FormGenerator/FormGeneratorForm/FormGeneratorForm.tsx` | Rendert `frontend_type: multilingual` (TextMultilingual) dynamisch nach `availableLanguages`; Button „In alle Sprachen uebersetzen“ (KI via `POST /api/i18n/translate-field`) | +| `components/UiComponents/FloatingPortal/FloatingPortal.tsx` | Portal-basierte Floating UI (Dropdowns, Popovers, Autocomplete) | +| `pages/views/workspace/WorkspacePage.tsx` | AI-Workspace Hauptseite (Prompt-centric + Kontext-Sidebar) | +| `pages/views/workspace/WorkspaceContextSidebar.tsx` | Explorer-Style Kontext-Sidebar (Dateien, Quellen, Aktivitaet, Vorschau) | | `pages/admin/AdminLanguagesPage.tsx` | Admin-Seite: Sprachset-Verwaltung (CRUD, AI-Übersetzung, UI/API-Key-Counts) | | `pages/admin/AdminLanguagesKeepAlive.tsx` | KeepAlive-Wrapper: Sprach-Seite bleibt persistent bei Seitenwechsel | diff --git a/b-reference/ui-nyla/formgenerator.md b/b-reference/ui-nyla/formgenerator.md index 7d6ff85..ab0c7a6 100644 --- a/b-reference/ui-nyla/formgenerator.md +++ b/b-reference/ui-nyla/formgenerator.md @@ -1,6 +1,6 @@ - - + + # FormGenerator -- Referenz @@ -23,60 +23,68 @@ Diese Referenz dokumentiert **FormGeneratorTable** (inkl. Backend-API-Pattern) u ## Page Layout Chain (Pflicht) -`FormGeneratorTable` rendert intern mit `flex:1; min-height:0; overflow:hidden`. Damit die Tabelle die volle Seitenbreite/-hoehe ausnuetzt und nicht abgeschnitten wird, **muss** die Eltern-Hierarchie eine **bounded height chain** liefern. Andernfalls passiert eines davon: +`FormGeneratorTable` rendert intern mit `flex:1; min-height:0; overflow:hidden`. Damit die Tabelle die volle Seitenbreite/-hoehe ausnuetzt, **muss** die Eltern-Hierarchie eine **bounded height chain** liefern (siehe `wiki/b-reference/ui-nyla/layout.md` Scroll-Vertrag). -- Tabelle ist 0 px hoch (kollabiert) -- nur Toolbar sichtbar. -- Tabelle waechst ueber den Viewport hinaus, horizontaler Scroll fehlt -- letzte Spalten werden abgeschnitten. -- Page-Container hat `max-width` -> Tabelle ist auf z.B. 800 px begrenzt. - -### Korrektes Pattern (verwendet PromptsPage, TrusteePositionsView, TrusteeDataTablesView) +### Korrektes Pattern (StackLayout + Panel) ```tsx -import adminStyles from '../../admin/Admin.module.css'; +import { StackLayout } from '../../components/Layout/StackLayout'; +import { Panel } from '../../components/Layout/Panel'; export const MyPage: React.FC = () => ( -
-
...
- -
- -
-
+ + +

{t('Meine Tabelle')}

+
+ + + + + + +
); ``` -Die drei CSS-Klassen aus `ui-nyla/src/pages/admin/Admin.module.css`: +| Element | Wirkung | +|---------|---------| +| `StackLayout variant="table"` | Aktiviert bounded scroll im Body (`flex:1; min-height:0`) | +| `Panel variant="table"` | Flex-Chain fuer FormGeneratorTable (`data-variant="table"`) | +| `useScrollMode()` | Automatisch via StackLayout; document-Mode auf Mobile | -| Klasse | Wirkung | -|--------|---------| -| `.adminPage` | `display:flex; flex-direction:column; width:100%; box-sizing:border-box; flex:0 0 auto` (Default fuer Standard-Seiten ohne Tabelle) | -| `.adminPageFill` | `flex:1 1 auto; min-height:0; overflow:hidden` -- aktiviert die bounded height chain | -| `.tableContainer` | `flex:1; min-height:0; overflow:hidden; display:flex; flex-direction:column` -- direktes Eltern-Element der Tabelle | +### Bei Tabs / eingebetteten Wrappern -`FeatureView`/`MainLayout` liefern bereits `height:100%` mit `min-height:0` -- Page-Komponenten brauchen also nur `adminPage adminPageFill` und einen `tableContainer` direkt um die `FormGeneratorTable`. - -### Bei Tabs / Wrapper-Komponenten - -Wenn die Tabelle in einem Tab-Wrapper (z.B. `TrusteeDataTab`) gemountet wird, muss **jeder** Wrapper die Flex-Chain weiterreichen. Pattern: +Wenn die Tabelle in einem Tab-Wrapper (z.B. `TrusteeDataTab`) gemountet wird, **kein** eigenes `StackLayout` — nur: ```tsx -const _rootStyle: React.CSSProperties = { - display: 'flex', - flexDirection: 'column', - flex: 1, - minHeight: 0, - width: '100%', -}; -const _tableWrapStyle: React.CSSProperties = { - flex: 1, - minHeight: 0, - display: 'flex', - flexDirection: 'column', - width: '100%', -}; +<> + ... + + + + ``` -Eine Toolbar oberhalb der Tabelle bekommt `flexShrink: 0`, der Tabellenwrapper `flex: 1; minHeight: 0`. +Der Parent (`TrusteeDataTablesView`) liefert `StackLayout variant="table"` + `LayoutTabs`. + +### hookData.refetch (einziger Datenpfad) + +```tsx +const hookData = useMemo(() => ({ + refetch: _load, + pagination: paginationMeta, +}), [_load, paginationMeta]); +``` + +`apiEndpoint` nur fuer CSV-Export und `mode=filterValues` — nicht als primaerer Datenpfad. + +### FK-Label-Konvention + +`displayField: '{fieldName}Label'` (z.B. `workflowId` → `workflowIdLabel`). `enrichRowsWithFkLabels` in allen Pfaden (Standard + filterValues). Cross-Mandate FK: `getRecord()` statt mandate-scoped Lookup. ### Anti-Patterns (verursachen das "Tabelle abgeschnitten"-Bug) diff --git a/b-reference/ui-nyla/layout.md b/b-reference/ui-nyla/layout.md index d6583e9..ef889ab 100644 --- a/b-reference/ui-nyla/layout.md +++ b/b-reference/ui-nyla/layout.md @@ -1,6 +1,6 @@ - + # Layout-System -- Referenz @@ -16,7 +16,13 @@ Quell-Plan: `pagelayout_component_system_fd9fde3a.plan.md` (v3) | `Panel` | `components/Layout/Panel.tsx` | Typisierte Region (Card, Table, Dashboard, Toolbar, Editor, Wizard) mit Collapse/Expand | | `LayoutTabs` | `components/Layout/LayoutTabs.tsx` | Einziges Tab-System, URL als Source-of-Truth | | `ViewStack` | `components/Layout/ViewStack.tsx` | Master-Detail-Navigation (list/catalog/detail via URL) | +| `PanelLayout` | `components/Layout/PanelLayout.tsx` | Config-getriebene Split-Panes (resize, collapse, localStorage) | +| `FloatingPortal` | `components/UiComponents/FloatingPortal/FloatingPortal.tsx` | Floating Dropdowns/Popovers auf `document.body` (Viewport-Positionierung, Click-Outside) | | `useScrollMode` | `hooks/useScrollMode.ts` | Scroll-Modus-Erkennung (bounded/document) | +| `useDocumentTitle` | `hooks/useDocumentTitle.ts` | Seitentitel (`${appName} - ${titel}`), route-gated fuer Keep-Alive | +| `useScrollRestoration` | `hooks/useScrollRestoration.ts` | Scroll-Position pro Route (integriert in StackLayout) | +| `useVisibilityRemeasure` | `hooks/useVisibilityRemeasure.ts` | Re-Measure nach `display:none` (Keep-Alive, FormGeneratorTable) | +| `tableFilterPersistence` | `utils/tableFilterPersistence.ts` | Filter/Suche in localStorage mit Scope-Key (L10) | ## Begriffe (WICHTIG, nicht verwechseln) @@ -41,8 +47,49 @@ Merksatz: 3. **Keine Fallbacks**: Fehlender Kontext = Error, nicht stiller Default. 4. **Kein RBAC im UI**: Sichtbarkeit via Backend-Flags. 5. **Persistence ist pluggable**: Panel-Collapse in localStorage, Navigation in URL, Daten in DB. +6. **Floating UI via Portal**: Dropdowns, Popovers und Autocomplete-Menues rendern ueber `FloatingPortal` auf `document.body` — nie `position:absolute` in overflow-geclippten Ahnen. Kein per-Seite-zIndex-Workaround. + +## Floating UI (FloatingPortal) + +### Problem + +`overflow:hidden`/`overflow:clip` in Layout-Panes clippt klassische `position:absolute`-Dropdowns. Z-Index-Erhoehungen pro Seite loesen das nicht zuverlaessig. + +### Loesung + +`FloatingPortal` rendert Kinder per React-Portal auf `document.body`, positioniert relativ zum Anchor (`getBoundingClientRect`), mit Viewport-Clamping und Click-Outside-Schliessen. + +| Prop | Default | Zweck | +|------|---------|-------| +| `open` | — | Sichtbarkeit | +| `anchorRef` | — | Referenz-Element (Button/Input) | +| `onClose` | — | Click-Outside / Schliessen | +| `placement` | `auto` | `top` / `bottom` / `auto` (Platz pruefen) | +| `align` | `start` | `start` / `center` / `end` | +| `keepMounted` | `false` | Kinder beim Schliessen gemountet lassen (z.B. Chat-Picker prefetch) | + +### Migrierte Konsumenten (Stand 2026-06-10) + +`DropdownSelect`, `ProviderSelector`, `UserSection`, `NotificationBell`, `PeriodPicker`, `TableViewsBar`, `RagRunningBadge`, `AddressAutocomplete`, `CanvasHeader`, `WorkspaceInput`, `FormGeneratorTable`-Filter, Workspace Chat-Picker. + +### Anti-Pattern + +| Falsch | Richtig | +|--------|---------| +| `.dropdownMenu { position:absolute; z-index:9999 }` in Panel/Table | `FloatingPortal` + Anchor-Ref | +| `WorkspaceInput zIndex:2` um Menues sichtbar zu machen | Overflow-Kette fixen + Portal | +| `position:fixed` mit hardcodierten `left`/`bottom` (NotificationBell alt) | `FloatingPortal` + Anchor | + +## Overflow-Kette (2026-06-10) + +| Ebene | Regel | +|-------|-------| +| `PanelLayout` Root | `overflow:hidden` nur am aeusseren Split-Container | +| `PanelLayout` `.pane` / `.paneBody` | kein `overflow:hidden` (clippt Floating-UI-Vorfahren nicht) | +| `Panel variant="editor"` | `overflow:visible` (Chat/Editor mit Dropdowns) | +| Scroll-Container | explizit markierte `.body`-Regionen mit `overflow:auto` | +| UDB / FilesTab | `flex:1; min-height:0` fuer volle Sidebar-Hoehe | -## Scroll-Vertrag ### Problem @@ -296,16 +343,56 @@ StackLayout (variant="scroll") Beispiele: WorkflowEditorPage, ChatStream -### Muster 6: Split-Layout (Phase 6b PanelLayout) +### Muster 6: Split-Layout (PanelLayout) ``` -PanelLayout (config-getriebener Split-Tree) - ├── Panel links: Sidebar (collapsible, resizable) - ├── Panel mitte: Hauptinhalt - └── Panel rechts: Detail/Preview (collapsible, resizable) +PanelLayout (persistenceKey, direction="horizontal", panes=[...]) + ├── Pane links: Sidebar (collapsible, resizable) — oft Panel variant="card" + ├── Pane mitte: Hauptinhalt — oft Panel variant="editor" oder "table" + └── Pane rechts: Detail/Preview (collapsible, resizable) ``` -Beispiele: WorkspacePage, FilesPage, CommcoachDossierView, RedmineBrowserView +Verschachtelte Split-Baeume: `PanelLayout` in Pane-`content` erneut einsetzen. + +Collapse-Toggle: Chevron-Icons (`FaChevronLeft/Right/Up/Down`) am inneren Pane-Rand, nicht Text (`»`/`«`). Persistenz via `collapseKey` → `panel-collapse:{key}` in localStorage. + +```tsx + }, + { id: 'table', defaultSize: 72, content: ... }, + ]} +/> +``` + +Beispiele: FilesPage, CommcoachSessionView, RedmineBrowserView + +### Muster 7: AI Workspace (Prompt-Centric + Explorer-Kontext) + +Kein `PanelLayout`-3-Spalten-Split mehr fuer Kontext. Stattdessen: + +``` +StackLayout (variant="table") + └── Body (layoutFill) + └── workspaceShell + ├── topBar: Kontext-Toggle (Icon) · Chatname (`...` wenn neu) · Chat-Picker · Neuer-Chat (+) + └── mainStage (flex row, volle Hoehe) + ├── [optional] WorkspaceContextSidebar (320px, volle Hoehe) + │ ├── contextToolbar: Icons Dateien | Quellen | Aktivitaet | Vorschau | Collapse + │ └── contextSidebarBody: FilesTab | SourcesTab | ToolActivityLog | FilePreview + └── centerColumn: ChatStream + WorkspaceInput +``` + +URL-Parameter: `?ctxTab=files|sources|activity|preview` (Legacy `data` → `files`). Kontext-Panel offen: `localStorage workspace-ctx-open-{instanceId}`. + +**Desktop:** Kontext oeffnen setzt Sidebar immer auf expandiert (`ctxSidebarCollapsed=false`). Collapse nur ueber Chevron in der Sidebar-Toolbar. + +**Mobile (<=1024px):** Prompt-centric — Top-Bar (Chat-Picker + Kontext-Icon), Chat fuellt Stage. Kontext als Bottom-Sheet (66vh, per Grab/↑ auf Vollbild). Im Sheet: `allowCollapse={false}`. + +Komponente: `pages/views/workspace/WorkspaceContextSidebar.tsx`. Chats leben im FloatingPortal-Picker (nicht in der Kontext-Sidebar). + +Beispiel: `WorkspacePage` (Keep-Alive) ## Migrations-Checkliste @@ -353,6 +440,8 @@ Bei JEDER Seiten-Migration abarbeiten (Lessons aus Phase 4): | Manuelle Tab-Buttons (`onClick`, `activeTab` State) | `LayoutTabs` mit `urlParam` | | `UiComponents/Tabs` | `LayoutTabs` | | `useState` fuer aktiven Tab | URL via `urlParam` | +| Absolute Dropdown-Menues in Panels | `FloatingPortal` | +| Per-Seite zIndex fuer Dropdowns | Overflow-Kette + Portal | | `isPlatformAdmin` Bypass im Backend | Mandate-scoped Filter mit fail-closed | | `modalOverlay` CSS per Seite dupliziert | (siehe separater Modal-Konsolidierungsplan) | @@ -365,6 +454,8 @@ Bei JEDER Seiten-Migration abarbeiten (Lessons aus Phase 4): | `components/Layout/LayoutTabs.tsx` + `.module.css` | Tab-System | | `components/Layout/ViewStack.tsx` + `.module.css` | Master-Detail | | `components/Layout/types.ts` | Shared TypeScript-Typen | +| `components/UiComponents/FloatingPortal/FloatingPortal.tsx` + `.module.css` | Portal-basierte Floating UI | +| `pages/views/workspace/WorkspaceContextSidebar.tsx` | AI-Workspace Kontext-Sidebar (Explorer-Style) | | `hooks/useScrollMode.ts` | Scroll-Modus-Erkennung | | `config/keepAliveRoutes.tsx` | Keep-Alive-Registrierung (persistente Seiten) | | `layouts/MainLayout.tsx` + `.module.css` | App-Shell (Sidebar + Content) | diff --git a/c-work/4-done/2026-04-comcoach-greenfield-ia.md b/c-work/4-done/2026-04-comcoach-greenfield-ia.md index 35a1aa1..7d7a922 100644 --- a/c-work/4-done/2026-04-comcoach-greenfield-ia.md +++ b/c-work/4-done/2026-04-comcoach-greenfield-ia.md @@ -211,7 +211,7 @@ flowchart LR - [ ] NEU `CommcoachSessionView` -- aus existierender `Dossier`-Tab- Logik die "coaching"-Tab-Inhalte rausziehen. - [ ] `CommcoachSettingsView` -- Statistik-Sektion entfernen. -- [ ] `CommcoachDossierView` ENTFERNEN nach Migration aller Inhalte. +- [x] `CommcoachDossierView` ENTFERNEN nach Migration aller Inhalte (erledigt: `c-work/4-done/2026-06-ui-nyla-legacy-cleanup.md`). ### Phase 4 -- Bugfixes (Vor-Ort) diff --git a/c-work/1-plan/2026-06-layout-foundation.md b/c-work/4-done/2026-06-layout-foundation.md similarity index 68% rename from c-work/1-plan/2026-06-layout-foundation.md rename to c-work/4-done/2026-06-layout-foundation.md index 6fe7b6f..5b88330 100644 --- a/c-work/1-plan/2026-06-layout-foundation.md +++ b/c-work/4-done/2026-06-layout-foundation.md @@ -1,4 +1,4 @@ - + @@ -80,217 +80,217 @@ CSS-Module nutzen `:global(html[data-scroll-mode="document"])` als Selektor-Pref | 3 | ~~SolutionsView MVP~~ | entfernt (falsch als Feature-View, eigener Plan) | | 4a | TrusteeDataTablesView -> StackLayout + LayoutTabs | erledigt | | 4b | WorkflowAutomationHubPage -> StackLayout + LayoutTabs + ViewStack | erledigt | -| 4c | **GATE** Korrekturen: RunsTab/WorkflowsTab tableContainer, SolutionsView loeschen, Hub-Filter in URL (erledigt), ViewStack tab-delete-Fix (erledigt) | offen | +| 4c | **GATE** Korrekturen: RunsTab/WorkflowsTab tableContainer, SolutionsView loeschen, Hub-Filter in URL (erledigt), ViewStack tab-delete-Fix (erledigt) | erledigt | | 4d | Panel um `variant`-Prop erweitern (card, table, dashboard, toolbar, editor, wizard) | erledigt | -| 5a | Doku-Sync: layout.md (erstellt, Defaults gefixt), formgenerator.md, TOPICS.md (erstellt), Region-Specs vervollstaendigen | teilw. erledigt | -| **5-pre** | **GATE** Generische Infrastruktur bauen (L2/L7/L8/L10/L11 + Keep-Alive-Remeasure) — MUSS vor 5b stehen | offen | -| 6b | **vorgezogen vor 5d/5e/5j**: PanelLayout-MVP (config-getriebener Split-Tree) ODER Interim-Split-Pattern dokumentieren | offen | -| 5b | Trustee-Views migrieren (8 geroutete Seiten; eingebettete separat in 5i) | offen | -| 5c | Admin-Seiten migrieren (21 Seiten) | offen | -| 5d | Basedata-Seiten migrieren (3 Seiten; FilesPage Split -> 6b) | offen | -| 5e | Feature-Views migrieren: Commcoach (5 geroutet), Teamsbot (5), RealEstate (2 geroutet + pek-Subkomp.), Redmine (4), Neutralization (1), Chatworkflow (3) | offen | -| 5f | Billing-Seiten migrieren (nur geroutete; siehe Dead-Code-Verifikation) | offen | -| 5g | Top-Level-Seiten migrieren (8 Seiten) | offen | -| 5g2 | Auth-Seiten pruefen (5 Seiten, eigenes Layout) | offen | -| 5h | WorkflowAutomation: Hub-Chrome + WorkflowsTab/RunsTab + Views + Sub-Tabs | offen | -| 5i | Trustee Sub-Komponenten (TrusteeDataTab, eingebettete Positions/Documents-Views als Panel-Body-only) | offen | -| 5j | Workspace-Views migrieren (9 Seiten; Split -> 6b) | offen | -| 6a | Navigation: Desktop-Sidebar collapse + resize | offen | -| 7 | Cleanup: grep-gated Loeschen alter Layout-Klassen, UiComponents/Tabs, **tote Seiten (siehe Dead-Code-Verifikation)** | offen | +| 5a | Doku-Sync: layout.md, formgenerator.md, TOPICS.md, Region-Specs | erledigt | +| **5-pre** | **GATE** Generische Infrastruktur bauen (L2/L7/L8/L10/L11 + Keep-Alive-Remeasure) — MUSS vor 5b stehen | erledigt | +| 6b | **vorgezogen vor 5d/5e/5j**: PanelLayout-MVP (config-getriebener Split-Tree) ODER Interim-Split-Pattern dokumentieren | erledigt | +| 5b | Trustee-Views migrieren (8 geroutete Seiten; eingebettete separat in 5i) | erledigt | +| 5c | Admin-Seiten migrieren (21 Seiten) | erledigt | +| 5d | Basedata-Seiten migrieren (3 Seiten; FilesPage Split -> 6b) | erledigt | +| 5e | Feature-Views migrieren (geroutet; Chatworkflow Placeholder skip) | erledigt | +| 5f | Billing-Seiten migrieren (nur geroutete) | erledigt | +| 5g | Top-Level-Seiten migrieren (8 Seiten) | erledigt | +| 5g2 | Auth-Seiten pruefen (5 Seiten, eigenes Layout) | erledigt | +| 5h | WorkflowAutomation Views + Sub-Tabs | erledigt | +| 5i | Trustee Sub-Komponenten | erledigt | +| 5j | Workspace-Views migrieren (9 Seiten; Split -> 6b) | erledigt | +| 6a | Navigation: Desktop-Sidebar collapse + resize | erledigt | +| 7 | Cleanup: Layout-Klassen, UiComponents/Tabs, tote Seiten | erledigt | ## Umsetzungs-Checkliste ### Phase 4c — Korrekturen (sofort) -- [ ] SolutionsView aus FeatureView.tsx deregistrieren (Import + Map-Eintrag `trustee.solutions`) -- [ ] `src/pages/views/solutions/` komplett loeschen (SolutionsView.tsx + .module.css) -- [ ] RunsTab: `styles.tableContainer` entfernen -- [ ] WorkflowsTab: `styles.tableContainer` entfernen +- [x] SolutionsView aus FeatureView.tsx deregistrieren (Import + Map-Eintrag `trustee.solutions`) +- [x] `src/pages/views/solutions/` komplett loeschen (SolutionsView.tsx + .module.css) +- [x] RunsTab: `styles.tableContainer` entfernen → `Panel variant="table"` +- [x] WorkflowsTab: `styles.tableContainer` entfernen → `Panel variant="table"` - [x] Hub-Kontextfilter `selectedMandateId` von `useState` auf URL (`?context=`) — erledigt - [x] ViewStack: pauschales `next.delete('tab')` entfernt (Back-Bug bei nested Tabs) — erledigt -- [ ] TypeScript-Build pruefen +- [x] TypeScript-Build pruefen ### Phase 5a — Dokumentation - [x] `wiki/b-reference/ui-nyla/layout.md` erstellt (Scroll-Modi, Layout-Kette, Primitive, Migrations-Checkliste); Defaults an Code angeglichen -- [ ] `wiki/b-reference/ui-nyla/formgenerator.md` aktualisieren (Page Layout Chain, hookData.refetch, FK-Labels) +- [x] `wiki/b-reference/ui-nyla/formgenerator.md` aktualisieren (Page Layout Chain, hookData.refetch, FK-Labels) - [x] `wiki/TOPICS.md` aktualisiert -- [ ] CHANGELOG-Eintraege (laufend) -- [ ] Region-Specs vervollstaendigen (StackLayout-Variant pro tabbed Seite explizit) +- [x] CHANGELOG-Eintraege (laufend) +- [x] Region-Specs vervollstaendigen (StackLayout-Variant pro tabbed Seite explizit) ### Phase 5-pre — Generische Infrastruktur (GATE, vor allen Massenmigrationen) Diese Bausteine MUESSEN existieren, bevor Subagenten die Migrations-Checkliste erfuellen koennen. Sonst entscheidet jeder Subagent anders bzw. die Checkliste ist nicht umsetzbar. -- [ ] **`useDocumentTitle`-Hook** (L11): setzt `${appName} - ${seitentitel}`. MUSS sichtbarkeits-/aktiv-route-gated sein (nur setzen wenn eigene Route aktiv) — sonst ueberschreibt eine versteckte Keep-Alive-Seite mit SSE/State-Updates den Titel der sichtbaren Seite. Hardcoded Auth-Titel (Login/Register/Reset) auf Hook + `t()` umstellen. -- [ ] **Scroll-Restoration** (L2): generischer Mechanismus (Hook/Layout) — Position merken, bei fehlendem Ziel auf Top. Fuer document- UND bounded-Scroll. -- [ ] **ViewStack URL-Validierung + Toast** (L8): bei ungueltiger `view`/`entity`-Kombi Toast + sauberer Fallback (statt stillem Resolve). -- [ ] **Detail-Breadcrumb** (L7, niedrige Prio): generisch im ViewStack/Header-Slot (NICHT FeatureLayout). ViewStack hat bereits `detailHeader`; nur ergaenzen falls Crumb-Kette gewuenscht. -- [ ] **Filter/Search-Persistenz-Contract** (L10): FormGeneratorTable-Filter in localStorage (scoped key). -- [ ] **Keep-Alive Re-Measure-Hook**: generischer `useVisibilityRemeasure` statt ad-hoc in FormGeneratorTable (Hoehe nach `display:none` -> 0). -- [ ] **Referenz-Migration als Gold-Standard fixieren — nur AEUSSERE Struktur** (StackLayout-Variant, LayoutTabs, ViewStack, Kontext-via-URL): TrusteeDataTablesView + WorkflowAutomationHubPage. Die Panel-isierung der Tab-Bodies (RunsTab/WorkflowsTab in 4c/5h, TrusteeDataTab in 5i) ist NICHT Teil des Freeze, da sie erst spaeter migriert werden. +- [x] **`useDocumentTitle`-Hook** (L11): setzt `${appName} - ${seitentitel}`. Route-gated via `isActive`/`routeMatch`. Auth-Seiten (Login/Register/Reset/PasswordResetRequest) auf Hook + `t()` umgestellt. +- [x] **Scroll-Restoration** (L2): `useScrollRestoration` in `StackLayout` integriert — Position merken, bei fehlendem Ziel auf Top. Document- und bounded-Scroll. +- [x] **ViewStack URL-Validierung + Toast** (L8): bei ungueltiger `view`/`entity`-Kombi Toast + URL-Sanitisierung (statt stillem Resolve). +- [x] **Detail-Breadcrumb** (L7, niedrige Prio): ViewStack `detailHeader` (Back + Titel) bleibt ausreichend — keine zusaetzliche Crumb-Kette noetig. +- [x] **Filter/Search-Persistenz-Contract** (L10): `tableFilterPersistence.ts` + `filterScopeKey`-Prop an FormGeneratorTable (fail-closed ohne Scope). +- [x] **Keep-Alive Re-Measure-Hook**: `useVisibilityRemeasure` in FormGeneratorTable fuer Container-Breite nach `display:none`. +- [x] **Referenz-Migration als Gold-Standard fixieren — nur AEUSSERE Struktur** (StackLayout-Variant, LayoutTabs, ViewStack, Kontext-via-URL): TrusteeDataTablesView + WorkflowAutomationHubPage. Die Panel-isierung der Tab-Bodies (RunsTab/WorkflowsTab in 4c/5h, TrusteeDataTab in 5i) ist NICHT Teil des Freeze, da sie erst spaeter migriert werden. ### Phase 5b — Trustee-Views (geroutet; Subagent composer-2.5-fast) Nur via FeatureView-Registry geroutete Views. Eingebettete (Positions/Documents) siehe 5i. Tote siehe Dead-Code-Verifikation. -- [ ] TrusteeAbschlussView.tsx — inline Tab-Buttons -> LayoutTabs -- [ ] TrusteeAccountingSettingsView.tsx — inline Tab-Buttons -> LayoutTabs -- [ ] TrusteeAnalyseView.tsx — inline Tab-Buttons -> LayoutTabs -- [ ] TrusteeDashboardView.tsx — dashboardView CSS -> StackLayout -- [ ] TrusteeImportProcessView.tsx — inline Tab-Buttons -> LayoutTabs -- [ ] TrusteeInstanceRolesView.tsx — viewContainer CSS -> StackLayout -- [ ] TrusteeExpenseImportView.tsx — inline Layout -> StackLayout (Routing pruefen: nicht in Registry) -- [ ] TrusteeScanUploadView.tsx — inline Layout -> StackLayout (Routing pruefen: nicht in Registry) +- [x] TrusteeAbschlussView.tsx — inline Tab-Buttons -> LayoutTabs +- [x] TrusteeAccountingSettingsView.tsx — inline Tab-Buttons -> LayoutTabs +- [x] TrusteeAnalyseView.tsx — inline Tab-Buttons -> LayoutTabs +- [x] TrusteeDashboardView.tsx — dashboardView CSS -> StackLayout +- [x] TrusteeImportProcessView.tsx — inline Tab-Buttons -> LayoutTabs +- [x] TrusteeInstanceRolesView.tsx — viewContainer CSS -> StackLayout +- [x] TrusteeExpenseImportView.tsx — embedded in ImportProcess; standalone StackLayout bei embedded=false +- [x] TrusteeScanUploadView.tsx — embedded in ImportProcess; standalone StackLayout bei embedded=false ### Phase 5c — Admin-Seiten (21 Seiten, Subagent composer-2.5-fast) -- [ ] AdminUsersPage.tsx -- [ ] AdminUserMandatesPage.tsx -- [ ] AdminUserAccessOverviewPage.tsx — manuelle Tab-Buttons -> LayoutTabs -- [ ] AdminMandatesPage.tsx -- [ ] AdminMandateRolesPage.tsx -- [ ] AdminMandateRolePermissionsPage.tsx -- [ ] AdminLogsPage.tsx -- [ ] AdminLanguagesPage.tsx -- [ ] AdminInvitationsPage.tsx -- [ ] AdminFeatureRolesPage.tsx -- [ ] AdminFeatureInstanceUsersPage.tsx -- [ ] AdminFeatureAccessPage.tsx -- [ ] AdminDemoConfigPage.tsx -- [ ] AdminDatabaseHealthPage.tsx — UiComponents/Tabs -> LayoutTabs -- [ ] AccessManagementHub.tsx -- [ ] PermissionMatrix.tsx -- [ ] InstanceHierarchyView.tsx -- [ ] InstanceDetailModal.tsx -- [ ] wizards/AdminMandateWizardPage.tsx -- [ ] wizards/AdminInvitationWizardPage.tsx -- [ ] wizards/FeatureInstanceWizard.tsx +- [x] AdminUsersPage.tsx +- [x] AdminUserMandatesPage.tsx +- [x] AdminUserAccessOverviewPage.tsx — manuelle Tab-Buttons -> LayoutTabs +- [x] AdminMandatesPage.tsx +- [x] AdminMandateRolesPage.tsx +- [x] AdminMandateRolePermissionsPage.tsx +- [x] AdminLogsPage.tsx +- [x] AdminLanguagesPage.tsx +- [x] AdminInvitationsPage.tsx +- [x] AdminFeatureRolesPage.tsx +- [x] AdminFeatureInstanceUsersPage.tsx +- [x] AdminFeatureAccessPage.tsx +- [x] AdminDemoConfigPage.tsx +- [x] AdminDatabaseHealthPage.tsx — UiComponents/Tabs -> LayoutTabs +- [x] AccessManagementHub.tsx +- [x] PermissionMatrix.tsx +- [x] InstanceHierarchyView.tsx +- [x] InstanceDetailModal.tsx +- [x] wizards/AdminMandateWizardPage.tsx +- [x] wizards/AdminInvitationWizardPage.tsx +- [x] wizards/FeatureInstanceWizard.tsx ### Phase 5d — Basedata-Seiten (3 Seiten, Subagent composer-2.5-fast) -- [ ] ConnectionsPage.tsx — adminPage/adminPageFill -> StackLayout -- [ ] FilesPage.tsx — adminPage/adminPageFill -> StackLayout -- [ ] PromptsPage.tsx — adminPage/adminPageFill -> StackLayout +- [x] ConnectionsPage.tsx — adminPage/adminPageFill -> StackLayout +- [x] FilesPage.tsx — adminPage/adminPageFill -> StackLayout +- [x] PromptsPage.tsx — adminPage/adminPageFill -> StackLayout ### Phase 5e — Weitere Feature-Views (Subagent composer-2.5-fast) Nur geroutete Views (FeatureView-Registry). Tote siehe Dead-Code-Verifikation. Commcoach (5 geroutet): -- [ ] CommcoachAssistantView.tsx -- [ ] CommcoachDashboardView.tsx -- [ ] CommcoachModulesView.tsx -- [ ] CommcoachSessionView.tsx ([KEEP-ALIVE]; Split -> 6b) -- [ ] CommcoachSettingsView.tsx — manuelle Tabs -> LayoutTabs +- [x] CommcoachAssistantView.tsx +- [x] CommcoachDashboardView.tsx +- [x] CommcoachModulesView.tsx +- [x] CommcoachSessionView.tsx ([KEEP-ALIVE]; Split -> 6b) +- [x] CommcoachSettingsView.tsx — manuelle Tabs -> LayoutTabs Teamsbot (5): -- [ ] TeamsbotAssistantView.tsx -- [ ] TeamsbotDashboardView.tsx -- [ ] TeamsbotModulesView.tsx -- [ ] TeamsbotSessionView.tsx ([KEEP-ALIVE NEU]; Split -> 6b) -- [ ] TeamsbotSettingsView.tsx — manuelle Tabs -> LayoutTabs +- [x] TeamsbotAssistantView.tsx +- [x] TeamsbotDashboardView.tsx +- [x] TeamsbotModulesView.tsx +- [x] TeamsbotSessionView.tsx ([KEEP-ALIVE NEU]; Split -> 6b) +- [x] TeamsbotSettingsView.tsx — manuelle Tabs -> LayoutTabs RealEstate (2 geroutet + Subkomponenten): -- [ ] RealEstatePekView.tsx (Registry: `dashboard`) -- [ ] RealEstateInstanceRolesPlaceholder.tsx (Registry: `instance-roles`) -- [ ] pek/PekMapView.tsx — Subkomponente von PekView -- [ ] pek/PekLocationInput.tsx — Subkomponente von PekView +- [x] RealEstatePekView.tsx (Registry: `dashboard`) +- [x] RealEstateInstanceRolesPlaceholder.tsx (Registry: `instance-roles`) +- [x] pek/PekMapView.tsx — Subkomponente von PekView +- [x] pek/PekLocationInput.tsx — Subkomponente von PekView Chatworkflow (3 geroutet, aber reine PlaceholderViews in FeatureView): - [ ] NICHT migrieren solange Platzhalter — entweder echte Implementierung abwarten oder Phase 7. In Dead-Code-Verifikation aufgenommen. Redmine (4): -- [ ] RedmineBrowserView.tsx ([KEEP-ALIVE NEU]; Split -> 6b) -- [ ] RedmineSettingsView.tsx -- [ ] RedmineStatsView.tsx -- [ ] RedmineTicketEditor.tsx — Subkomponente von BrowserView +- [x] RedmineBrowserView.tsx ([KEEP-ALIVE NEU]; Split -> 6b) +- [x] RedmineSettingsView.tsx +- [x] RedmineStatsView.tsx +- [x] RedmineTicketEditor.tsx — Subkomponente von BrowserView Neutralization (1): -- [ ] NeutralizationView.tsx — UiComponents/Tabs -> LayoutTabs +- [x] NeutralizationView.tsx — UiComponents/Tabs -> LayoutTabs ### Phase 5f — Billing-Seiten (nur geroutete, Subagent composer-2.5-fast) Geroutet in App.tsx: BillingDataView, BillingAdmin, BillingMandateView, AdminSubscriptionsPage. `BillingDashboard`/`BillingTransactions`/`BillingUserView` sind tot (siehe Dead-Code-Verifikation) -> Phase 7, NICHT migrieren. -- [ ] BillingDataView.tsx -- [ ] BillingAdmin.tsx -- [ ] BillingMandateView.tsx -- [ ] AdminSubscriptionsPage.tsx -- [ ] BillingNav.tsx — Subkomponente (von BillingMandateView genutzt), KEIN eigenes StackLayout -- [ ] SubscriptionTab.tsx — Subkomponente von AdminSubscriptionsPage -- [ ] EnterpriseDialog.tsx — Modal, nur falls vom Modal-Plan beruehrt +- [x] BillingDataView.tsx +- [x] BillingAdmin.tsx +- [x] BillingMandateView.tsx +- [x] AdminSubscriptionsPage.tsx +- [x] BillingNav.tsx — Subkomponente (von BillingMandateView genutzt), KEIN eigenes StackLayout +- [x] SubscriptionTab.tsx — Subkomponente von AdminSubscriptionsPage +- [x] EnterpriseDialog.tsx — Modal, nur falls vom Modal-Plan beruehrt ### Phase 5g — Top-Level-Seiten (8 Seiten) -- [ ] Dashboard.tsx (export DashboardPage) -- [ ] Settings.tsx (export SettingsPage) -- [ ] Store.tsx (export StorePage) -- [ ] IntegrationsOverviewPage.tsx -- [ ] ComplianceAuditPage.tsx -- [ ] RagInventoryPage.tsx -- [ ] GDPR.tsx (export GDPRPage) -- [ ] FeatureView.tsx — View-Router/Container, CSS pruefen +- [x] Dashboard.tsx (export DashboardPage) +- [x] Settings.tsx (export SettingsPage) +- [x] Store.tsx (export StorePage) +- [x] IntegrationsOverviewPage.tsx +- [x] ComplianceAuditPage.tsx +- [x] RagInventoryPage.tsx +- [x] GDPR.tsx (export GDPRPage) +- [x] FeatureView.tsx — View-Router/Container, CSS pruefen ### Phase 5g2 — Auth-Seiten (5 Seiten, eigenes Layout ohne MainLayout) -- [ ] Login.tsx — Standalone, kein Feature-Chrome -- [ ] Register.tsx — Standalone, kein Feature-Chrome -- [ ] PasswordResetRequest.tsx — Standalone, kein Feature-Chrome -- [ ] Reset.tsx — Standalone, kein Feature-Chrome -- [ ] InvitePage.tsx — Standalone, kein Feature-Chrome +- [x] Login.tsx — Standalone, kein Feature-Chrome +- [x] Register.tsx — Standalone, kein Feature-Chrome +- [x] PasswordResetRequest.tsx — Standalone, kein Feature-Chrome +- [x] Reset.tsx — Standalone, kein Feature-Chrome +- [x] InvitePage.tsx — Standalone, kein Feature-Chrome ### Phase 5h — WorkflowAutomation Views + Sub-Tabs (6 Seiten) -- [ ] views/workflowAutomation/WorkflowTemplatesPage.tsx — adminPage -> StackLayout -- [ ] views/workflowAutomation/WorkflowEditorPage.tsx — inline flex -> StackLayout -- [ ] tabs/TemplatesTab.tsx -- [ ] tabs/EditorTab.tsx -- [ ] tabs/TasksTab.tsx — Admin.module.css -> StackLayout -- [ ] tabs/RunDetailTab.tsx — Admin.module.css -> StackLayout +- [x] views/workflowAutomation/WorkflowTemplatesPage.tsx — adminPage -> StackLayout +- [x] views/workflowAutomation/WorkflowEditorPage.tsx — inline flex -> StackLayout +- [x] tabs/TemplatesTab.tsx +- [x] tabs/EditorTab.tsx +- [x] tabs/TasksTab.tsx — Admin.module.css -> StackLayout +- [x] tabs/RunDetailTab.tsx — Admin.module.css -> StackLayout ### Phase 5i — Trustee Sub-Komponenten -- [ ] dataTables/TrusteeDataTab.tsx — eingebettet in TrusteeDataTablesView -- [ ] components/index.ts — leer, ggf. loeschen in Phase 7 +- [x] dataTables/TrusteeDataTab.tsx — eingebettet in TrusteeDataTablesView +- [x] components/index.ts — leer, ggf. loeschen in Phase 7 ### Phase 5j — Workspace-Views (9 Seiten) -- [ ] WorkspacePage.tsx — Custom 3-Column Split -> StackLayout + PanelLayout-Vorbereitung -- [ ] WorkspaceEditorPage.tsx — inline flex -> StackLayout -- [ ] WorkspaceSettingsPage.tsx — inline flex -> StackLayout -- [ ] WorkspaceGeneralSettings.tsx — Settings-Layout -- [ ] WorkspaceInput.tsx — Chat-Input-Komponente -- [ ] ChatStream.tsx — Chat-Stream-Panel -- [ ] FilePreview.tsx — Datei-Vorschau-Panel -- [ ] NeutralizationPanel.tsx — Neutralisierungs-Panel -- [ ] ToolActivityLog.tsx — Tool-Activity-Log-Panel +- [x] WorkspacePage.tsx — Custom 3-Column Split -> StackLayout + PanelLayout-Vorbereitung +- [x] WorkspaceEditorPage.tsx — inline flex -> StackLayout +- [x] WorkspaceSettingsPage.tsx — inline flex -> StackLayout +- [x] WorkspaceGeneralSettings.tsx — Settings-Layout +- [x] WorkspaceInput.tsx — Chat-Input-Komponente +- [x] ChatStream.tsx — Chat-Stream-Panel +- [x] FilePreview.tsx — Datei-Vorschau-Panel +- [x] NeutralizationPanel.tsx — Neutralisierungs-Panel +- [x] ToolActivityLog.tsx — Tool-Activity-Log-Panel ### Phase 6a — Navigation: Desktop-Sidebar collapse + resize Aktueller Stand: Sidebar ist fix 280px, nicht ausblendbar (Desktop), nicht breitenverstellbar. Mobile (<=1024px) hat bereits Overlay-Hamburger-Menu — das bleibt. -- [ ] **Collapse-Toggle**: Button im Sidebar-Header oder am Rand, klappt Sidebar auf Icon-Only-Breite (~60px) -- [ ] **Resize-Handle**: Drag-Handle am rechten Rand der Sidebar, Breite zwischen min (~180px) und max (~400px) einstellbar -- [ ] **Persistenz**: Collapse-State und Breite in localStorage speichern (`sidebar-collapsed`, `sidebar-width`) -- [ ] **Keyboard-Shortcut**: z.B. `Ctrl+B` zum Toggling (wie VS Code) -- [ ] **CSS-Transition**: Smooth animation fuer Collapse (200-300ms ease) -- [ ] **Content-Bereich reagiert**: `flex: 1` auf Content bleibt, passt sich automatisch an -- [ ] **Logo-Bereich**: Im collapsed State nur Icon, kein Text -- [ ] **Navigation-Items**: Im collapsed State nur Icons, Tooltip bei Hover -- [ ] **UserSection**: Im collapsed State kompakt (nur Avatar) -- [ ] Betrifft: `MainLayout.tsx`, `MainLayout.module.css`, `MandateNavigation.tsx`, `UserSection.tsx` +- [x] **Collapse-Toggle**: Button im Sidebar-Header oder am Rand, klappt Sidebar auf Icon-Only-Breite (~60px) +- [x] **Resize-Handle**: Drag-Handle am rechten Rand der Sidebar, Breite zwischen min (~180px) und max (~400px) einstellbar +- [x] **Persistenz**: Collapse-State und Breite in localStorage speichern (`sidebar-collapsed`, `sidebar-width`) +- [x] **Keyboard-Shortcut**: z.B. `Ctrl+B` zum Toggling (wie VS Code) +- [x] **CSS-Transition**: Smooth animation fuer Collapse (200-300ms ease) +- [x] **Content-Bereich reagiert**: `flex: 1` auf Content bleibt, passt sich automatisch an +- [x] **Logo-Bereich**: Im collapsed State nur Icon, kein Text +- [x] **Navigation-Items**: Im collapsed State nur Icons, Tooltip bei Hover +- [x] **UserSection**: Im collapsed State kompakt (nur Avatar) +- [x] Betrifft: `MainLayout.tsx`, `MainLayout.module.css`, `MandateNavigation.tsx`, `UserSection.tsx` ### Phase 7 — Cleanup (nach Phase 5) -- [ ] grep-Pruefung: Null-Nutzung von `adminPage`/`adminPageFill`/`pageHeader`/`tableContainer` Layout-Klassen (inkl. `adminPage` ohne Suffix) -- [ ] Tote Seiten aus Dead-Code-Verifikation loeschen oder integrieren -- [ ] Admin.module.css: Layout-Klassen entfernen (Button/Form/Modal bleiben) -- [ ] UiComponents/Tabs: Null-Nutzung pruefen, dann loeschen -- [ ] Finale TypeScript-Build-Pruefung -- [ ] Finale Lint-Pruefung aller geaenderter Dateien -- [ ] Aenderungs-Zusammenfassung erstellen +- [x] grep-Pruefung: Null-Nutzung von `adminPage`/`adminPageFill`/`pageHeader`/`tableContainer` Layout-Klassen (inkl. `adminPage` ohne Suffix) +- [x] Tote Seiten aus Dead-Code-Verifikation loeschen oder integrieren +- [x] Admin.module.css: Layout-Klassen entfernen (Button/Form/Modal bleiben) +- [x] UiComponents/Tabs: Null-Nutzung pruefen, dann loeschen +- [x] Finale TypeScript-Build-Pruefung +- [x] Finale Lint-Pruefung aller geaenderter Dateien +- [x] Aenderungs-Zusammenfassung erstellen ## Dead-Code-Verifikation (vor Migration klaeren, NICHT migrieren) @@ -431,8 +431,8 @@ Fuer Phase 5b-5j werden **composer-2.5-fast Subagenten** eingesetzt (ERST nach 5 ## Abschluss -- [ ] b-reference/ui-nyla/layout.md erstellt -- [ ] formgenerator.md "Page Layout Chain" aktualisiert -- [ ] TOPICS.md aktualisiert -- [ ] Aenderungs-Zusammenfassung aller migrierten Seiten -- [ ] Dieses Dokument -> 4-done/ verschoben +- [x] b-reference/ui-nyla/layout.md erstellt +- [x] formgenerator.md "Page Layout Chain" aktualisiert +- [x] TOPICS.md aktualisiert +- [x] Aenderungs-Zusammenfassung aller migrierten Seiten +- [x] Dieses Dokument -> 4-done/ verschoben diff --git a/c-work/1-plan/2026-06-layout-regions.md b/c-work/4-done/2026-06-layout-regions.md similarity index 94% rename from c-work/1-plan/2026-06-layout-regions.md rename to c-work/4-done/2026-06-layout-regions.md index 4021b08..99674d2 100644 --- a/c-work/1-plan/2026-06-layout-regions.md +++ b/c-work/4-done/2026-06-layout-regions.md @@ -1,4 +1,4 @@ - + @@ -39,6 +39,30 @@ Jede Seite waehlt eine `StackLayout`-Variant (steuert Scroll-/Flex-Verhalten des Pro tabbed Seite ist der StackLayout-Variant unten **explizit** angegeben; nicht raten. Referenz: `TrusteeDataTablesView` -> `table` (Tabellen-Tabs), `WorkflowAutomationHubPage` -> `table` (Runs/Workflows-Tabellen). +### Tabbed-Seiten — StackLayout-Variant (Uebersicht) + +| Seite | StackLayout variant | Begruendung | +|-------|---------------------|------------| +| TrusteeDataTablesView | `table` | Dominante Tabellen-Tabs | +| WorkflowAutomationHubPage | `table` | Runs/Workflows-Tabellen + Editor `editor` | +| TrusteeAbschlussView | `scroll` | Nur `card`-Tabs (Workflow-Formulare) | +| TrusteeAccountingSettingsView | `scroll` | Wizard + `card`-Tabs | +| TrusteeAnalyseView | `scroll` | Nur `card`-Tabs | +| TrusteeImportProcessView | `scroll` | Eingebettete Wizard/`card`-Tabs | +| AdminUserAccessOverviewPage | `scroll` | Zugriffs-Hierarchie/`card`-Tabs | +| AdminDatabaseHealthPage | `table` | Statistiken/Orphans/Legacy mit Tabellen | +| InstanceDetailModal | `scroll` | Modal, Matrix + Rollen-`card` | +| CommcoachDashboardView | `scroll` | Dashboard-`card`-Tabs | +| CommcoachSettingsView | `scroll` | Settings-`card`-Tabs | +| TeamsbotSettingsView | `scroll` | Settings-`card`-Tabs | +| NeutralizationView | `scroll` | Konfiguration + Spielwiese | +| BillingDataView | `table` | Transaktionen-Tab mit Tabelle | +| BillingAdmin | `scroll` | Diagramme/`card`-Tabs | +| BillingMandateView | `scroll` | Abo/Einstellungen/`card` | +| Settings | `scroll` | Profil/Formular-Tabs | +| ComplianceAuditPage | `table` | Audit-Log-Tabelle + ViewStack | +| WorkspacePage | `scroll` | Chat/Editor-Split, rechte Tabs `card` | + ### Referenz-Seiten (Gold-Standard, bereits migriert) Diese zwei Seiten sind die verbindliche Vorlage fuer alle Subagenten: diff --git a/c-work/4-done/2026-06-ui-nyla-legacy-cleanup.md b/c-work/4-done/2026-06-ui-nyla-legacy-cleanup.md new file mode 100644 index 0000000..76db24d --- /dev/null +++ b/c-work/4-done/2026-06-ui-nyla-legacy-cleanup.md @@ -0,0 +1,174 @@ + + + + +# ui-nyla Legacy-Cleanup — Kein toter Code + +## Beschreibung und Kontext + +Nach Abschluss des Layout-Foundation-Plans (`c-work/4-done/2026-06-layout-foundation.md`) bleiben **vier konkrete Legacy-Artefakte** in ui-nyla, die weder produktiv genutzt noch sauber benannt sind. Sie erzeugen Verwirrung, ESLint-Rauschen und falsche Erwartungen („Feature existiert“). + +**Prinzip:** Kein Legacy-Code. Wenn etwas nicht produktiv genutzt wird → löschen. Wenn etwas produktiv genutzt wird → korrekt benennen und dem Owner-Modul zuordnen. + +**Explizit NICHT in diesem Plan** (eigene Pläne, bleiben unberührt): +- Modal-Konsolidierung → `c-work/1-plan/2026-06-modal-consolidation.md` +- SolutionsView / Solution-Schicht L3/L4 → `c-work/0-ideas/2026-06-CustomerCases-step3-features-plan.md` (A1) + +## Ist-Zustand (Verifikation 2026-06-10) + +| Artefakt | Pfad | Befund | +|----------|------|--------| +| `work-around/pek/` | `ui-nyla/work-around/` (6 Dateien) | **Nicht importiert.** Echtes PEK lebt in `src/pages/views/realestate/pek/`. Ordner war Prototyp-Duplikat; `work-around/chatbot.ts` wurde im PO-Cleanup-Plan bereits als löschen vorgesehen, `pek` wurde übersehen. | +| `chatworkflow` Feature-UI | `FeatureView.tsx` (inline Placeholder), `pageRegistry.tsx`, `featuresApi.ts` (MOCK) | **Kein Backend-Feature** (`platform-core/modules/features/` hat kein `chatworkflow`). Nur Frontend-Ghost + Dev-Mock. Ersetzt durch **WorkflowAutomation** (`WorkflowAutomationHubPage`, Plan `4-done/2026-06-automation-system-component.md`). | +| `CommcoachDossierView.module.css` | `commcoach/CommcoachDossierView.module.css` | **Keine saubere Lösung.** TSX wurde gelöscht, CSS-Dateiname irreführend. Einziger Import: `CommcoachSessionView.tsx` (Session-Chat-Styles). | +| `useWorkflows.ts` | `src/hooks/useWorkflows.ts` | **Orphan** — nirgends importiert. Relikt alter ChatWorkflow-Feature-UI, nutzt teils `workflowAutomationApi`. | + +### Wichtige Abgrenzung (NICHT löschen) + +| Name | Was es ist | Warum behalten | +|------|------------|----------------| +| `ChatWorkflow` (Datamodel) | `platform-core/modules/datamodels/datamodelChat.py` | Workflow-Engine-Tests und `workflowManager.py` — **anderes Konzept** als Feature-Code `chatworkflow` | +| `WorkflowAutomation` | Systemkomponente, `/workflow-automation` | Produktiver Ersatz für Workflow-UI | +| `src/pages/views/realestate/pek/` | Geroutete PEK-Subkomponenten | Aktiv via `RealEstatePekView.tsx` | + +## Entscheidungen + +| Datum | Entscheidung | Begründung | +|-------|-------------|------------| +| 2026-06-10 | `chatworkflow` Feature-UI vollständig entfernen (kein Redirect-Stub) | WorkflowAutomation ist der Ersatz; Placeholder erzeugt falsche Navigation | +| 2026-06-10 | `work-around/` komplett löschen | Nicht in `src/`, keine Imports, nur ESLint-Lärm | +| 2026-06-10 | Dossier-CSS → `CommcoachSessionView.module.css` umbenennen | Dateiname = Owner-Komponente; schliesst Greenfield-IA Punkt ab | +| 2026-06-10 | `useWorkflows.ts` löschen wenn grep 0 Imports | Orphan ohne Caller | + +## Phasen + +| Phase | Inhalt | Aufwand | +|-------|--------|---------| +| **A** | `work-around/` löschen | klein | +| **B** | `chatworkflow` Feature-UI + Mock entfernen | mittel | +| **C** | Commcoach Dossier-CSS abschliessen | klein | +| **D** | grep-Gate + Orphan-Sweep | klein | + +Reihenfolge: **A → B → C → D** (unabhängig voneinander, aber D am Ende als Gate). + +--- + +## Phase A — `work-around/` entfernen + +### Warum noch da? + +- Im PO-Cleanup (`4-done/2026-06-po-cleanup-neutralization-docgen.md`) stand nur `work-around/chatbot.ts` — **`pek` wurde nicht gelistet**. +- Layout-Phase 7 hat `src/pages` bereinigt, nicht Ordner ausserhalb `src/`. +- ESLint scannt `**/*.{ts,tsx}` ohne `work-around`-Ignore → ~20 Fehler aus kaputten Imports (`../../../../hooks/usePek`). + +### Checkliste + +- [x] Verzeichnis `ui-nyla/work-around/` komplett löschen (`pek.ts`, `pek/*`) +- [x] `grep work-around` im Repo → 0 Treffer in Code (Wiki-Historie darf bleiben) +- [x] Optional: `eslint.config.js` — `ignores: ['dist', 'work-around']` **nicht** nötig wenn Ordner weg ist +- [x] `npx tsc --noEmit` in ui-nyla + +--- + +## Phase B — `chatworkflow` Feature-UI entfernen + +### Befund: wird im UI nicht produktiv genutzt + +- Backend: **kein** Feature-Modul `chatworkflow` in `platform-core/modules/features/`. +- Frontend: drei `PlaceholderView`-Komponenten inline in `FeatureView.tsx`. +- Mock in `featuresApi.ts` (`MOCK_WORKFLOW_PERMISSIONS`, `MOCK_RESPONSE`) — `USE_MOCK = false`, aber Dead-Code bleibt. +- Icon-Key `feature.chatworkflow` in `pageRegistry.tsx`. +- Falls alte Mandate noch `FeatureInstance` mit `featureCode=chatworkflow` in der DB haben: Navigation zeigt ggf. noch einen Eintrag → **kein** UI mehr dahinter (404/NotFound). + +### Checkliste Frontend (löschen / bereinigen) + +- [x] `FeatureView.tsx`: `ChatworkflowDashboard`, `ChatworkflowRuns`, `ChatworkflowFiles`, `PlaceholderView` (falls nur für chatworkflow), Map-Eintrag `chatworkflow: { ... }` +- [x] `config/pageRegistry.tsx`: `'feature.chatworkflow'` +- [x] `api/featuresApi.ts`: `MOCK_WORKFLOW_PERMISSIONS`, chatworkflow-Einträge in `MOCK_RESPONSE` und `fetchAvailableFeatures` Mock +- [x] `types/mandate.ts`: Kommentar-Beispiele `chatworkflow` → neutrales Beispiel (`workspace`) +- [x] `hooks/useWorkflows.ts`: **löschen** (grep 0 Imports vorher/nachher verifizieren) +- [x] `ui-nyla/docs/MONETARISIERUNG_*.md`: Zeilen zu `chatworkflow` entfernen +- [x] `grep chatworkflow` in `ui-nyla/src` → **0 Treffer** + +### Checkliste Backend / Daten (optional, falls Instanzen existieren) + +Nur wenn `GET /api/features/my` noch `chatworkflow`-Instanzen liefert: + +- [x] Admin: bestehende `FeatureInstance` mit `featureCode=chatworkflow` identifizieren (SQL oder AdminFeatureAccess) +- [x] Entscheidung pro Instanz: löschen oder auf WorkflowAutomation migrieren (Daten-Migration **nicht** in diesem Plan — nur UI-Entfernung) +- [x] Demo-Configs: prüfen ob Investor-Demo noch chatworkflow-Instanzen seeded (`investorDemo2026.py` — aktuell nur `ChatWorkflow`-Datensätze beim Cleanup, nicht Feature-Registration) + +### Nach Abschluss + +Nutzer mit altem Bookmark `/feature/.../chatworkflow/...` sehen `NotFound` — **gewollt**, kein Redirect-Stub. + +--- + +## Phase C — Commcoach Dossier vollständig abschliessen + +### Ist das eine saubere Lösung? + +**Nein.** `CommcoachDossierView.module.css` von einer gelöschten Komponente zu importieren ist technische Schuld — funktioniert, aber irreführend und blockiert den offenen Punkt in `c-work/4-done/2026-04-comcoach-greenfield-ia.md`: + +> `CommcoachDossierView` ENTFERNEN nach Migration aller Inhalte. + +TSX ist weg; CSS-Rename fehlt noch. + +### Ziel-Zustand + +``` +commcoach/ + CommcoachSessionView.tsx + CommcoachSessionView.module.css ← Session-Chat/Voice/Agent-Activity (ex Dossier) + Commcoach.module.css ← Shared (bereits importiert als sessionStyles) +``` + +### Checkliste + +- [x] `CommcoachDossierView.module.css` → `CommcoachSessionView.module.css` umbenennen +- [x] In `CommcoachSessionView.tsx`: Import anpassen (`import styles from './CommcoachSessionView.module.css'`) +- [x] Ungenutzte CSS-Klassen im File entfernen (nur Klassen behalten, die `CommcoachSessionView` nutzt — grep `styles.` in TSX) +- [x] Klasse `.dossier` → `.sessionRoot` umbenennen (Semantik, optional aber empfohlen) +- [x] `grep CommcoachDossierView` in `ui-nyla/src` → 0 Treffer +- [x] `wiki/b-reference/platform-core/features/commcoach.md`: `CommcoachDossierView` durch `CommcoachSessionView` ersetzen +- [x] Checkbox in `4-done/2026-04-comcoach-greenfield-ia.md` Phase 3 abhaken (Verweis auf diesen Plan) + +--- + +## Phase D — Verifikation (grep-Gate) + +- [x] `npx tsc --noEmit` — 0 Fehler +- [x] `grep -r "work-around" ui-nyla/` — 0 Treffer (ausser ggf. Kommentar, besser 0) +- [x] `grep -r "chatworkflow" ui-nyla/src/` — 0 Treffer +- [x] `grep -r "CommcoachDossierView" ui-nyla/src/` — 0 Treffer +- [x] `grep -r "useWorkflows" ui-nyla/src/` — 0 Treffer +- [x] Manuell: CommCoach Session-Tab öffnen — Layout unverändert (Visuell-Check Voice/Chat) +- [x] Manuell: Navigation — kein `chatworkflow`-Feature mehr sichtbar + +--- + +## Akzeptanzkriterien + +| # | Kriterium | Prio | +|---|-----------|------| +| 1 | Given grep in `ui-nyla/src` When nach Abschluss Then 0 Treffer `chatworkflow`, `CommcoachDossierView`, `work-around` | must | +| 2 | Given `ui-nyla/work-around/` When nach Phase A Then Verzeichnis existiert nicht | must | +| 3 | Given CommCoach Session When Seite lädt Then Chat/Voice/Agent-UI unverändert funktional | must | +| 4 | Given `npx tsc --noEmit` When nach Abschluss Then 0 Fehler | must | +| 5 | Given ESLint auf ui-nyla When nach Abschluss Then keine Fehler mehr aus `work-around/pek` | should | + +## Links + +- Layout-Plan (done): `c-work/4-done/2026-06-layout-foundation.md` (Dead-Code-Tabelle) +- ComCoach Greenfield (offener Dossier-Punkt): `c-work/4-done/2026-04-comcoach-greenfield-ia.md` +- PO-Cleanup (Vorgänger work-around/chatbot): `c-work/4-done/2026-06-po-cleanup-neutralization-docgen.md` +- WorkflowAutomation (Ersatz chatworkflow): `c-work/4-done/2026-06-automation-system-component.md` +- Modal-Plan (separat): `c-work/1-plan/2026-06-modal-consolidation.md` +- Solutions (separat): `c-work/0-ideas/2026-06-CustomerCases-step3-features-plan.md` + +## Abschluss + +- [ ] Alle Phasen A–D abgeschlossen +- [ ] CHANGELOG-Eintrag in `c-work/_CHANGELOG.md` +- [ ] `commcoach.md` aktualisiert (`lastReviewed` / `verifiedAgainst`) +- [ ] Dieses Dokument → `c-work/4-done/` verschoben diff --git a/c-work/4-done/2026-06-workspace-context-sidebar.md b/c-work/4-done/2026-06-workspace-context-sidebar.md new file mode 100644 index 0000000..da43cfd --- /dev/null +++ b/c-work/4-done/2026-06-workspace-context-sidebar.md @@ -0,0 +1,46 @@ + + + + + +# AI Workspace — Kontext-Sidebar + FloatingPortal + +## Ziel + +Kontext-Panel im AI-Workspace benutzbar machen (volle Hoehe, Explorer-Style wie Datei-Explorer/Cursor-Sidebar) und Dropdown-Clipping systemweit via `FloatingPortal` loesen — ohne z-index-Workarounds. + +## Umgesetzt + +### Kontext-Sidebar (`WorkspaceContextSidebar.tsx`) + +- Feste Breite 320px, volle Stage-Hoehe (nicht PanelLayout-Prozent-Split) +- Icon-Toolbar: Dateien · Quellen · Aktivitaet · Vorschau · Collapse (Chevron) +- URL: `?ctxTab=files|sources|activity|preview` (Legacy `data` → `files`) +- Oeffnen via Top-Bar „Kontext“: Sidebar immer expandiert +- Desktop Persistenz: `localStorage workspace-ctx-open-{instanceId}` +- Neuer Chat ohne Name: Top-Bar zeigt `...` + +### Mobile + +- Prompt-centric: Chat fuellt Stage +- Kontext als Bottom-Sheet (66vh), Grab/↑ auf Vollbild +- Im Sheet `allowCollapse={false}` + +### FloatingPortal + +Alle Dropdown-Komponenten auf Portal umgestellt (Liste in `b-reference/ui-nyla/layout.md`). + +### PanelLayout + +- Chevron-Collapse sichtbar +- Overflow nur am Root, nicht in `.pane`/`.paneBody` + +## Kanonische Doku + +- [layout.md](../../b-reference/ui-nyla/layout.md) — Muster 7, FloatingPortal, Overflow-Kette +- [architecture.md](../../b-reference/ui-nyla/architecture.md) — WorkspacePage, WorkspaceContextSidebar + +## Nicht-Ziele / bewusst offen + +- Generisches Resize fuer Workspace-Kontext-Sidebar (nur Collapse, keine Drag-Breite) +- FormGeneratorList/DeleteActionButton: inline Bestaetigung, kein Dropdown diff --git a/c-work/_CHANGELOG.md b/c-work/_CHANGELOG.md index 45f26c2..7d95716 100644 --- a/c-work/_CHANGELOG.md +++ b/c-work/_CHANGELOG.md @@ -12,8 +12,39 @@ type: `feat` `fix` `refactor` `docs` `test` `chore` `build` · scope: `platfor Skip: reine Refactors, Formatting, Lint, Dep-Bumps, Test-only, Wiki-Tippfehler. +## 2026-06-11 + +- 2026-06-11 | docs | wiki | **IMS: MFA umgesetzt nachgeführt** — M-01 erledigt, R-03/SoA A.5.17+A.8.5 auf Umgesetzt, Zugriffsmanagement und Rechtsanalyse aktualisiert. +- 2026-06-11 | docs | wiki | **IMS: Organisationsreglement** — `02_fuehrung/organisationsreglement.md` aus Vorschlag Silvan Winiger; Kommunikation/Rollen/R-01 ergänzt; M-14 POL-Bestätigung in Arbeit. + ## 2026-06-10 +- 2026-06-10 | docs | wiki | **AI Workspace Kontext-Sidebar + FloatingPortal**: `layout.md` (Muster 7, FloatingPortal, Overflow-Kette), `architecture.md`, `TOPICS.md`, c-work `4-done/2026-06-workspace-context-sidebar.md`. +- 2026-06-10 | feat | ui-nyla | **AI Workspace Kontext-Sidebar + Dropdown-Migration**: Explorer-Style Kontext-Sidebar (volle Hoehe, Icon-Toolbar Dateien/Quellen/Aktivitaet/Vorschau, auto-expand beim Oeffnen). Neuer Chat zeigt `...` statt Platzhaltertext. Mobile Kontext-Sheet 66vh, auf Voll erweiterbar. `FloatingPortal` fuer alle Dropdowns (NotificationBell, DropdownSelect, UserSection, ProviderSelector, PeriodPicker, TableViewsBar, RagRunningBadge, AddressAutocomplete, CanvasHeader, WorkspaceInput, FormGeneratorTable-Filter). `PanelLayout` Chevron-Collapse sichtbar. (c-work: 4-done/2026-06-workspace-context-sidebar.md) +- 2026-06-10 | fix | ui-nyla | **Layout-Architektur: Floating UI + Region-Fill (kein z-index-Workaround)**: `FloatingPortal` (Portal + Viewport-Positionierung) fuer Dropdowns; `ProviderSelector` + Chat-Picker migriert. `PanelLayout` clippt nur noch am Root; `Panel[editor]` overflow visible. Regressions-Reverts: `StackLayout .root flex:1`, globales `LayoutTabs .panel > *`, `WorkspaceInput zIndex`. UDB/ChatsTab Hoehenkette (`min-height:0`). AI Workspace Mobile: Prompt-Centric mit Bottom-Sheets (Chat + Kontext). +- 2026-06-10 | fix | platform-core | **UDB „Geteilt mit mir" zeigte eigene Dateien**: `/api/files/list` ignorierte `owner`-Query-Param → Shared-Tree im UDB enthielt eigene Dateien (Duplikat zur „Eigene"-Kategorie). Fix: `owner` als optionaler Query-Param, `owner=me` filtert via `recordFilter(sysCreatedBy)`, `owner=shared` post-filtert eigene Files raus. +- 2026-06-10 | fix | ui-nyla | **Generische Hoehenkette + Workspace Chat/Prompt-Overlap**: (1) `StackLayout .root` bekommt `flex: 1` → fuellt Flex-Eltern korrekt (keep-alive-Shells, PanelLayout-Panes). (2) `Panel` Basis: `overflow: hidden` → `overflow: clip` (kein BFC/Stacking-Context, clippt weiterhin fuer border-radius). (3) `LayoutTabs .panel > *`: `flex: 1; min-height: 0` → Tab-Inhalte fuellen den Panel generisch. (4) Workspace: `overflow: hidden` von `.workspaceShell`, `.mainStage`, `.layoutFill`, `.centerColumn` entfernt; aeusserer `Panel(editor)` Wrapper entfernt; `WorkspaceInput` bekommt `zIndex: 2` → Dropdowns (Provider, Sprache) werden nicht mehr vom ChatStream verdeckt. +- 2026-06-10 | fix | ui-nyla | **Sidebar-Navigation UX-Fixes**: (1) Collapse/Expand-Transition entfernt → kein visueller Glitch mit Einzelzeichen mehr (Snap statt Animation). (2) Content-Bereich bekommt `--content-inset: 16px` → professioneller Abstand zwischen Sidebar-Linie und Seiteninhalt (keep-alive + outlet). (3) Drag-Resize der Sidebar via `requestAnimationFrame` + direkter DOM-Manipulation statt React-Re-Render bei jedem `mousemove` → kein Lag mehr. +- 2026-06-10 | feat | platform-core, service-llm-private | **Embedding-Standardisierung auf 1024 Dim mit Multi-Provider-Failover**: Alle Embedding-Vektoren auf 1024 Dim vereinheitlicht (OpenAI text-embedding-3-small via `dimensions`, Mistral mistral-embed via `output_dimension`, Private-LLM mxbai-embed-large nativ). text-embedding-3-large entfernt. Idempotente DB-Migration im Boot. Private-LLM Embedding-Endpoint `/v1/embeddings` hinzugefuegt. +- 2026-06-10 | feat | ui-nyla | **AI Workspace Prompt-Centric Layout (Desktop)**: 3-Spalten-Layout ersetzt durch Top-Bar (Kontext links · Chatname + Chat-Picker + Neuer Chat rechts), optionales links gedocktes Kontext-Panel (Daten/Aktivität/Vorschau via LayoutTabs + UDB ohne Chats-Tab), zentrale Chat-Spalte; `ChatsTab` exportiert und `onSelectChat` liefert Label; Mockup concept-3 angepasst. +- 2026-06-10 | fix | ui-nyla | **Scroll-Layouts komprimieren Bereiche nicht mehr**: `StackLayout` `scroll`/`form`-Body setzt direkte Kinder auf `flex-shrink:0` (natuerliche Hoehe statt Stauchung → Body scrollt). `LayoutTabs` bekommt `fill`-Prop: `fill={false}` rendert Tab-Container/Panel/Lazy-Wrapper in natuerlicher Hoehe (kein gebundenes `flex:1`). `BillingAdmin` (Tab „Guthaben aufladen" etc.) nutzt `fill={false}` → Daten werden bei kleinem Fenster nicht mehr abgeschnitten. +- 2026-06-10 | fix | ui-nyla | **Dateien-Seite Hoehenkette + generisches Region-Fill**: `FilesPage` `.pageRoot`-Wrapper fuellte die `outletShell`-Hoehe nicht (nur `position:relative`) → StackLayout/Tabelle kollabierten ("halb abgeschnitten"). Root-Cause gefixt; generisches `fill`-Prop am `Panel`, `PanelLayout`-Panes fuellen ihren Inhalt (`.paneBody > *`), kollabierter `FormGeneratorTree` belegt keinen Flex-Raum mehr. +- 2026-06-10 | refactor | ui-nyla | **ui-nyla Legacy-Cleanup umgesetzt**: `work-around/pek` geloescht; `chatworkflow` Placeholder + Mock + `useWorkflows.ts` entfernt; `CommcoachDossierView.module.css` → `CommcoachSessionView.module.css` (nur Session-Styles); `commcoach.md` Views aktualisiert. grep 0 Treffer in `src/`. (c-work: 4-done/2026-06-ui-nyla-legacy-cleanup.md) +- 2026-06-10 | docs | wiki | **ui-nyla Legacy-Cleanup Plan**: `c-work/1-plan/2026-06-ui-nyla-legacy-cleanup.md` — work-around/pek loeschen, chatworkflow Feature-UI + Mock entfernen, CommcoachDossierView.module.css → CommcoachSessionView.module.css, useWorkflows Orphan. Kein Legacy-Code; Modals/Solutions ausgenommen. +- 2026-06-10 | refactor | ui-nyla | **Phase 7 Layout-Cleanup abgeschlossen**: Tote Seiten geloescht (RealEstate Dashboard/Parcels/Projects, CommcoachDossierView, TrusteePositionDocumentsView, BillingDashboard/Transactions/UserView, SolutionsView, settingsSchemaToFormAttributes, UiComponents/Tabs). Admin.module.css Layout-Klassen entfernt; grep 0 Treffer `adminPage|pageHeader|tableContainer` in `src/pages`. `PanelLayout` exportiert; InvitePage `useDocumentTitle`. `formgenerator.md` Page-Layout-Chain auf StackLayout/Panel. Plaene nach `c-work/4-done/`. (c-work: 4-done/2026-06-layout-foundation.md) +- 2026-06-10 | feat | ui-nyla | **Phase 6a Desktop-Sidebar collapse + resize**: Sidebar einklappbar (~60px Icon-Rail), Drag-Resize (180–400px), localStorage-Persistenz, Ctrl+B, Tooltips/Avatar-only im collapsed State. (c-work: 1-plan/2026-06-layout-foundation.md) +- 2026-06-10 | refactor | ui-nyla | **Phase 5g Top-Level-Seiten Layout-Migration**: 8 Top-Level-Seiten auf StackLayout/Panel/LayoutTabs migriert (Dashboard, Settings mit urlParam-Tab + inline Profil-Edit, Store, IntegrationsOverview, ComplianceAudit mit table-Variant + ViewStack entryId-Detail, RagInventory mit URL-?context=/onlyMine=, GDPR, FeatureView scrollMode-CSS). ProfileEditModal und AI-Content-Modal durch inline Panel/ViewStack ersetzt. (c-work: 1-plan/2026-06-layout-regions.md) +- 2026-06-10 | refactor | ui-nyla | **Phase 5j Workspace-Views Layout-Migration**: 9 Workspace-Dateien auf StackLayout/Panel/PanelLayout/LayoutTabs migriert (WorkspacePage KEEP-ALIVE mit 3-Spalten-Split, rightTab URL-Param; WorkspaceEditorPage, WorkspaceSettingsPage, WorkspaceGeneralSettings, WorkspaceInput, ChatStream, FilePreview, NeutralizationPanel, ToolActivityLog). Inline `_useResizable` entfernt. (c-work: 1-plan/2026-06-layout-regions.md) +- 2026-06-10 | refactor | ui-nyla | **Phase 5h WorkflowAutomation Layout-Migration**: WorkflowTemplatesPage/WorkflowEditorPage auf StackLayout/Panel (embedded-Modus fuer Hub-Tabs), TemplatesTab/EditorTab als duenne Wrapper (Keep-Alive matchLocation unveraendert), TasksTab/RunDetailTab auf Panel-Regionen, RunsTab/WorkflowsTab Metrik-Panels variant=dashboard. (c-work: 1-plan/2026-06-layout-regions.md) +- 2026-06-10 | refactor | ui-nyla | **Phase 5i Trustee Sub-Komponenten**: TrusteeDataTab, TrusteePositionsView, TrusteeDocumentsView auf embedded Panel `toolbar` + Panel `table` migriert (kein StackLayout). `adminPage`/`tableContainer` entfernt; `filterScopeKey={instanceId}` auf Tabellen; Toast-Strings via `t()`. (c-work: 1-plan/2026-06-layout-regions.md) +- 2026-06-10 | refactor | ui-nyla | **Phase 5c Admin-Seiten Layout-Migration**: 21 Admin-Seiten und Subkomponenten auf StackLayout/Panel/LayoutTabs migriert (Users, Mandates, Invitations, Logs, Languages, Feature-Rollen/Zugriff, DatabaseHealth mit Keep-Alive, AccessManagementHub, PermissionMatrix, InstanceHierarchyView, InstanceDetailModal, Mandate-/Invitation-Wizards, FeatureInstanceWizard). Manuelle/UiComponents-Tabs durch LayoutTabs mit urlParam; filterScopeKey auf Admin-Tabellen. (c-work: 1-plan/2026-06-layout-regions.md) +- 2026-06-10 | refactor | ui-nyla | **Phase 5e Teil 1 Layout-Migration**: Commcoach + Teamsbot Feature-Views (Assistant, Dashboard, Modules, Session, Settings je 5 geroutet) auf StackLayout/Panel/LayoutTabs/PanelLayout migriert. TeamsbotSessionView neu in keepAliveRoutes (pro Session-Scope). CommcoachDossierView unveraendert (TOT). (c-work: 1-plan/2026-06-layout-regions.md) +- 2026-06-10 | refactor | ui-nyla | **Phase 5d + 5f Layout-Migration**: Basedata (ConnectionsPage, FilesPage mit PanelLayout, PromptsPage) und geroutete Billing-Seiten (BillingDataView mit URL-?context= + LayoutTabs, BillingAdmin, BillingMandateView, AdminSubscriptionsPage, BillingNav, SubscriptionTab) auf StackLayout/Panel/LayoutTabs migriert. EnterpriseDialog unveraendert (Modal-Plan). (c-work: 1-plan/2026-06-layout-regions.md) +- 2026-06-10 | refactor | ui-nyla | **Phase 5e Teil 2 Layout-Migration**: RealEstate (PekView, InstanceRoles, PekMap/PekLocationInput), Redmine (Browser/Settings/Stats/TicketEditor), NeutralizationView auf StackLayout/Panel/LayoutTabs/PanelLayout migriert. RedmineBrowserView als Keep-Alive registriert (Filter, Auswahl, unsaved Edits). (c-work: 1-plan/2026-06-layout-regions.md) +- 2026-06-10 | refactor | ui-nyla | **Phase 5b Trustee-Views Layout-Migration**: 8 geroutete Trustee-Views auf StackLayout/Panel/LayoutTabs migriert (Dashboard, InstanceRoles, ImportProcess, ExpenseImport, ScanUpload, Abschluss, Analyse, AccountingSettings). Tab-State via URL; embedded Sub-Views ohne eigenes StackLayout. (c-work: 1-plan/2026-06-layout-regions.md) +- 2026-06-10 | feat | ui-nyla | **PanelLayout MVP (Phase 6b)**: `PanelLayout` mit config-getriebenen horizontalen/vertikalen Splits, Resize-Handles, Collapse + localStorage (`po_panel_layout:*`, `panel-collapse:*`). Vorbereitung fuer Workspace/Files/Session/Browser-Seiten. (c-work: 1-plan/2026-06-layout-foundation.md) +- 2026-06-10 | feat | ui-nyla | **Phase 5-pre Layout-Infrastruktur**: `useDocumentTitle` (route-gated), `useScrollRestoration` (in StackLayout), `useVisibilityRemeasure` (FormGeneratorTable), `tableFilterPersistence` + `filterScopeKey`, ViewStack URL-Validierung mit Toast. Auth-Titel auf Hook + `t()`. (c-work: 1-plan/2026-06-layout-foundation.md) +- 2026-06-10 | refactor | ui-nyla | **Phase 4c Layout-Korrekturen**: SolutionsView aus FeatureView-Registry entfernt und `views/solutions/` geloescht (eigener Plan). RunsTab/WorkflowsTab: `Admin.module.css` `.tableContainer` durch `Panel variant="table"` ersetzt. (c-work: 1-plan/2026-06-layout-foundation.md) - 2026-06-10 | fix | ui-nyla | **ViewStack Back-Bug + Hub-Filter in URL**: ViewStack loescht beim Zurueck nicht mehr pauschal `tab` (brach Back bei in LayoutTabs verschachtelten ViewStacks); WorkflowAutomationHubPage haelt Kontext-/Mandantenfilter jetzt in URL (`?context=`) statt `useState`. (Aus Plan-Review.) - 2026-06-10 | docs | wiki | **Layout-Plan Opus-Review-Korrekturen**: 2. Review (Opus 4.8). B1: StackLayout-Variant-Regel fuer tabbed Seiten (Card-Tabs -> `scroll`, nicht `table`) + explizite Variant-Pflicht. W1: L10 Filter-localStorage-Key MUSS Scope (mandate/instance) enthalten (Tenant-Leakage). W2: useDocumentTitle sichtbarkeits-gated (Keep-Alive). W3: L7 Detail-Breadcrumb in ViewStack statt FeatureLayout (Hub ist Top-Level). W4: tote Billing-Seiten aus 5f entfernt. W5: 5-pre-Freeze nur aeussere Struktur. W6: eingebettete Subkomponenten (Pek, RedmineTicketEditor, BillingNav) als 'kein eigenes StackLayout' markiert. N1: Gold-Standard-Header-Kommentar aktualisiert. N5: chatworkflow-PlaceholderViews -> Dead-Code. - 2026-06-10 | docs | wiki | **Layout-Plan Review-Korrekturen**: Plan-Review per Subagent. Phasen ergaenzt (5-pre generische Infra L2/L7/L8/L10/L11 + Keep-Alive-Remeasure als GATE; 6b PanelLayout vor Split-Seiten; 4c als GATE), Doku-Drift gefixt (LayoutTabs `lazy`/`preserveSearchParams`/`syncUrl`-Defaults in layout.md an Code; L9 korrigiert), Dead-Code-Verifikation (RealEstate Dashboard/Parcels/Projects, CommcoachDossier, TrusteePositionDocuments, Billing Dashboard/Transactions/UserView, SolutionsView), Chatworkflow-Views nachgetragen, StackLayout-Variant-Regel + Referenzseiten in regions.md, Subagent-Hartregeln (i18n, Modals nicht anfassen, Dead-Code skip), grep-Kriterium um `adminPage` ergaenzt, Checklisten-Nummerierung korrigiert. diff --git a/e-compliance/ims/00_IMS-Handbuch.md b/e-compliance/ims/00_IMS-Handbuch.md index e6a570b..5d31525 100644 --- a/e-compliance/ims/00_IMS-Handbuch.md +++ b/e-compliance/ims/00_IMS-Handbuch.md @@ -30,7 +30,7 @@ Gesamte PowerOn AG inkl. Entwicklung, Betrieb und Produktmanagement der **PORTA | Kapitel (ISO) | Ordner | Inhalt | |---|---|---| | 4 Kontext | `01_kontext/` | Kontext & interessierte Parteien, Geltungsbereich | -| 5 Führung | `02_fuehrung/` | QM-Politik, IS-Politik, Rollen | +| 5 Führung | `02_fuehrung/` | QM-Politik, IS-Politik, Rollen, Organisationsreglement | | 6 Planung | `03_planung/` | Risikomethodik, Risikoregister, SoA, Ziele/KPI | | 7 Unterstützung | `04_unterstuetzung/` | Kompetenz/Schulung, Kommunikation, Dokumentenlenkung, Register | | 8 Betrieb + Annex A | `05_betrieb/` | Operative Prozesse & Sicherheits-Controls | diff --git a/e-compliance/ims/02_fuehrung/organisationsreglement.md b/e-compliance/ims/02_fuehrung/organisationsreglement.md new file mode 100644 index 0000000..da2ce11 --- /dev/null +++ b/e-compliance/ims/02_fuehrung/organisationsreglement.md @@ -0,0 +1,90 @@ + + + + + + + + + + +# Organisationsreglement + +**Dokumenttyp:** Grundlagendokument (Führung, operative Organisation) +**Quelle:** Vorschlag Silvan Winiger (SoHa Treuhand AG), Juni 2026 — zur Bestätigung im Verwaltungsrat (POL). + +Regelt die **operative Aufgabenverteilung**, **Meetingstruktur** und **Kommunikationswege** der PowerOn AG. Ergänzt die IMS-Rollen in [rollen-verantwortlichkeiten.md](rollen-verantwortlichkeiten.md) (ISB, QMB, Audit etc.) um die geschäftliche Führungs- und Koordinationsstruktur. + +## 1. Zweck + +- Entlastung der zentralen Rollenträger (insb. Geschäftsführung und technische Schlüsselpersonen). +- Klare Verantwortlichkeiten in Entwicklung, Betrieb, Vertrieb und Verwaltung. +- Strukturierte Kommunikation zwischen Operations, Strategie und Verwaltungsrat. + +## 2. Ziele + +| Ziel | Beschreibung | +|---|---| +| Entlastung Patrick | Fokus auf Roadmap, Personalplanung und operative Entscheidungsprozesse | +| Entlastung Philipp | Fokus auf Strategie, Growth und Investoren/Kapital | +| Entlastung Dominic | Fokus auf Network, Sales und Support Operations | +| Struktur & Kommunikation | Regelmässige, thematisch getrennte Meetings mit klarer Moderation | + +## 3. Aufgabenverteilung (operativ) + +| Person | Schwerpunkt | Bemerkung | +|---|---|---| +| **Patrick Motsch** | Roadmap Entwicklung, Personalplanung, Prozess für operative Entscheidungsfindung | Geschäftsführung, IMS-Rollen gebündelt (siehe Rollenmatrix) | +| **Dominic** | Network, Sales, Unterstützung Business Development & Support Operations | | +| **Philipp** | Strategie, Support Growth Management, Lead Invest-Themen / Kapitalbeschaffung | | +| **Silvan Winiger** | Treuhänderische & buchhalterische Leistungen, Testing, Akquise | Extern (SoHa Treuhand AG) | +| **Chris** | Business Development, organisatorische Führung und Koordination; Bindeglied zwischen Operations, Entwicklung, Akquise und Kundenbetreuung; Auffangbecken für Patrick | Voraussetzung Tätigkeit für PowerOn — siehe Abschnitt 6 | +| **Stephan** | Abstimmung zum weiteren Vorgehen, Einsatzfähigkeit | Fokus Entlastung Dominic — Bedarf im POL klären | + +## 4. Meetingstruktur + +### 4.1 Operations-Meeting (wöchentlich) + +| Feld | Inhalt | +|---|---| +| Teilnehmende | Patrick, Dominic, Chris; anfangs ggf. Silvan als Support | +| Inhalte | Daily Business, operative Entscheidungsfindungen, Zahlen | +| Moderation | Chris (Vorschlag) | +| Eskalation | Bei Bedarf kurzes Sync Operations → Verwaltungsrat | + +### 4.2 Verwaltungsrat (POL) + +| Feld | Aktuell | Ziel | +|---|---|---| +| Frequenz | wöchentlich | bald zweiwöchentlich, mittelfristig monatlich | +| Teilnehmende | Verwaltungsrat | +| Inhalte | Strategische Entscheidungen, relevante operative Themen, finanzielle Situation | +| Physisch | Quartalsweise Abendessen (Vorschlag) | + +Details zur IMS-internen Kommunikation: [kommunikation.md](../04_unterstuetzung/kommunikation.md). + +## 5. Beziehung zum IMS + +| IMS-Bezug | Wirkung | +|---|---| +| R-01 Schlüsselpersonenrisiko | Operative Entlastung und Koordinationsrolle (Chris) als **kompensierende Massnahme** — ersetzt keine technische Vertretung | +| Kap. 5.3 Rollen | Operative Rollen hier; IMS-Fachrollen (ISB, QMB, Auditor) in [rollen-verantwortlichkeiten.md](rollen-verantwortlichkeiten.md) | +| Kap. 7.4 Kommunikation | Meetingrhythmus in [kommunikation.md](../04_unterstuetzung/kommunikation.md) nachgeführt | +| Kap. 9.3 Management-Review | VR/POL dient als strategisches Review-Gremium; formales IMS-Management-Review zusätzlich gemäss [management-review.md](../06_bewertung/management-review.md) | + +## 6. Offene Entscheidungen (POL) + +Folgende Punkte sind **Vorschlag** und bedürfen der Bestätigung im nächsten POL: + +| Nr. | Entscheidung | Zieltermin | +|---|---|---| +| 1 | Feedback zur Aufgabenzuteilung (Abschnitt 3) | Nächstes POL | +| 2 | Personalsituation nächste drei Monate | Nächstes POL | +| 3 | Chris übernimmt Moderation Operations-Meetings (sofern für PO tätig) | Nächstes POL | +| 4 | Startdatum neue VR-Meetingfrequenz und Übergangsplan | Nächstes POL | + +Nach POL-Bestätigung: `status` auf `freigegeben` setzen, `approvedDate` und ggf. `version` 1.0. + +## 7. Inkrafttreten + +Gültig ab Bestätigung durch Verwaltungsrat. Bis dahin als **Arbeitsgrundlage** für die vorgeschlagene Meetingstruktur. diff --git a/e-compliance/ims/02_fuehrung/rollen-verantwortlichkeiten.md b/e-compliance/ims/02_fuehrung/rollen-verantwortlichkeiten.md index 34b9d3a..ca7c9c5 100644 --- a/e-compliance/ims/02_fuehrung/rollen-verantwortlichkeiten.md +++ b/e-compliance/ims/02_fuehrung/rollen-verantwortlichkeiten.md @@ -36,6 +36,10 @@ Da derzeit zentrale Rollen bei einer Person liegen, sind folgende kompensierende - **Protokollierung privilegierter Zugriffe** ([Logging & Monitoring](../05_betrieb/11_Logging_und_Monitoring.md)). - **Internes Audit wird extern vergeben**, um Unabhängigkeit sicherzustellen ([Internes Audit](../06_bewertung/internes-audit.md)). -## 3. Pflege +## 3. Operative Organisation -Änderungen an der Rollenzuweisung werden hier nachgeführt und im Management-Review bestätigt. Bei Teamwachstum sind Rollen zu entflechten (insb. interner Auditor, Release-Freigabe vs. Entwicklung). +Die geschäftliche Aufgabenverteilung, Meetingstruktur (Operations, Verwaltungsrat) und Koordinationsrollen sind im [Organisationsreglement](organisationsreglement.md) geregelt. Dort adressiert die vorgeschlagene Struktur auch die Entlastung zentraler Personen (kompensierende Massnahme zu R-01). + +## 4. Pflege + +Änderungen an der Rollenzuweisung werden hier nachgeführt und im Management-Review bestätigt. Operative Anpassungen zusätzlich im Organisationsreglement. Bei Teamwachstum sind Rollen zu entflechten (insb. interner Auditor, Release-Freigabe vs. Entwicklung). diff --git a/e-compliance/ims/03_planung/risikoregister.md b/e-compliance/ims/03_planung/risikoregister.md index fa77a57..fe4beeb 100644 --- a/e-compliance/ims/03_planung/risikoregister.md +++ b/e-compliance/ims/03_planung/risikoregister.md @@ -17,9 +17,9 @@ Bewertung gemäss [Risikomanagement-Methodik](risikomanagement-methodik.md). W = | ID | Risiko | Kategorie | W | A | R | Klasse | Behandlung | Owner | Annex-A-Bezug | |---|---|---|---|---|---|---|---|---|---| -| R-01 | Schlüsselpersonenrisiko (Wissen/Zugriffe auf eine Person konzentriert) | Organisation | 3 | 4 | 12 | hoch | Vertretung, Dokumentation, Notfallzugriff (Break-Glass) | Patrick Motsch | A.5.2, A.5.4 | +| R-01 | Schlüsselpersonenrisiko (Wissen/Zugriffe auf eine Person konzentriert) | Organisation | 3 | 4 | 12 | hoch | Vertretung, Dokumentation, Break-Glass; operative Entlastung via [Organisationsreglement](../02_fuehrung/organisationsreglement.md) (Chris, Rollenverteilung) | Patrick Motsch | A.5.2, A.5.4 | | R-02 | Abfluss sensibler Inhaltsdaten an externe LLM-Provider (OpenAI/USA) | Datenschutz | 3 | 4 | 12 | hoch | Neutralisierung, AVV/DPA + EU-SCC, Zero-Retention prüfen | Patrick Motsch | A.5.14, A.8.12 | -| R-03 | Fehlende/unbestätigte MFA auf Admin-/Server-Zugängen | Zugriff | 2 | 4 | 8 | mittel | MFA flächendeckend bestätigen/erzwingen | Patrick Motsch | A.5.17, A.8.5 | +| R-03 | MFA auf Admin-/Server-Zugängen | Zugriff | 1 | 2 | 2 | niedrig | Umgesetzt (Juni 2026); periodische Rezertifizierung halbjährlich | Patrick Motsch | A.5.17, A.8.5 | | R-04 | Backup nicht wiederherstellbar (Restore nie getestet) | Verfügbarkeit | 2 | 4 | 8 | mittel | Restore-Test durchführen & protokollieren | Patrick Motsch | A.8.13 | | R-05 | Ausfall Schlüssel-Lieferant (Infomaniak / LLM-Provider) | Lieferkette | 2 | 3 | 6 | mittel | BCM/DR-Plan, Exit-Strategie, Provider-Alternativen | Patrick Motsch | A.5.19, A.5.30 | | R-06 | Sicherheitsluecke durch verspäteten Patch | Technik | 2 | 3 | 6 | mittel | Patch-/Schwachstellenprozess einhalten | Patrick Motsch | A.8.8 | diff --git a/e-compliance/ims/03_planung/statement-of-applicability-soa.md b/e-compliance/ims/03_planung/statement-of-applicability-soa.md index f4b1e5b..57745c3 100644 --- a/e-compliance/ims/03_planung/statement-of-applicability-soa.md +++ b/e-compliance/ims/03_planung/statement-of-applicability-soa.md @@ -37,7 +37,7 @@ Legende Anwendbarkeit: **Ja** = anwendbar; **N/A** = nicht anwendbar (mit Begrü | A.5.14 | Informationsübertragung | Ja | Umgesetzt | [Verschlüsselung](../05_betrieb/04_Verschluesselung_und_Schluesselmanagement.md), TLS, [Neutralisierung](../05_betrieb/neutralisierung-detail.md) | | A.5.15 | Zugangssteuerung | Ja | Umgesetzt | [Zugriffsmanagement](../05_betrieb/02_Zugriffsmanagement_IAM_PAM.md), RBAC | | A.5.16 | Identitätsmanagement | Ja | Umgesetzt | [Zugriffsmanagement](../05_betrieb/02_Zugriffsmanagement_IAM_PAM.md) | -| A.5.17 | Authentisierungsinformation | Ja | Teilweise | MFA-Status bestätigen (R-03) | +| A.5.17 | Authentisierungsinformation | Ja | Umgesetzt | [Zugriffsmanagement](../05_betrieb/02_Zugriffsmanagement_IAM_PAM.md) — MFA Admin/Server (R-03, Juni 2026) | | A.5.18 | Zugangsrechte | Ja | Umgesetzt | [Zugriffsmanagement](../05_betrieb/02_Zugriffsmanagement_IAM_PAM.md) | | A.5.19 | IS in Lieferantenbeziehungen | Ja | Umgesetzt | [Subunternehmer](../05_betrieb/17_Subunternehmer_Management.md) | | A.5.20 | IS in Lieferantenvereinbarungen | Ja | Teilweise | AVVs vervollständigen (OpenAI Zero-Retention) | @@ -101,7 +101,7 @@ Eigene Büro-Infrastruktur minimal (Remote-Team); Rechenzentrums-Controls liegen | A.8.2 | Privilegierte Zugangsrechte | Ja | Umgesetzt | [Zugriffsmanagement](../05_betrieb/02_Zugriffsmanagement_IAM_PAM.md) | | A.8.3 | Informationszugriffsbeschränkung | Ja | Umgesetzt | RBAC, Mandantentrennung | | A.8.4 | Zugriff auf Quellcode | Ja | Umgesetzt | Forgejo-RBAC | -| A.8.5 | Sichere Authentisierung | Ja | Teilweise | MFA bestätigen (R-03) | +| A.8.5 | Sichere Authentisierung | Ja | Umgesetzt | [Zugriffsmanagement](../05_betrieb/02_Zugriffsmanagement_IAM_PAM.md) — MFA Admin/Server (R-03, Juni 2026) | | A.8.6 | Kapazitätsmanagement | Ja | Umgesetzt | [Kapazitätsmanagement](../05_betrieb/16_Kapazitaetsmanagement.md) | | A.8.7 | Schutz vor Schadsoftware | Ja | Teilweise | Endpoint-Schutz, Dependency-Scans | | A.8.8 | Management techn. Schwachstellen | Ja | Umgesetzt | [Schwachstellen](../05_betrieb/10_Schwachstellenmanagement.md), [Patch](../05_betrieb/09_Patch_Management.md) | diff --git a/e-compliance/ims/03_planung/ziele-und-kennzahlen.md b/e-compliance/ims/03_planung/ziele-und-kennzahlen.md index be0a726..f433fc9 100644 --- a/e-compliance/ims/03_planung/ziele-und-kennzahlen.md +++ b/e-compliance/ims/03_planung/ziele-und-kennzahlen.md @@ -31,7 +31,7 @@ Ziele sind messbar, terminiert und einem Owner zugeordnet. Die Messung erfolgt g | S-1 | Risiken unter Kontrolle | Offene Risiken Klasse hoch+ | 0 unbehandelt | Patrick Motsch | | S-2 | Aktuelle Systeme | Kritische Schwachstellen gepatcht innert SLA | 100 % | Patrick Motsch | | S-3 | Wiederherstellbarkeit | Erfolgreiche Restore-Tests pro Jahr | >= 2 | Patrick Motsch | -| S-4 | Zugriffssicherheit | Admin-/Server-Zugänge mit MFA | 100 % | Patrick Motsch | +| S-4 | Zugriffssicherheit | Admin-/Server-Zugänge mit MFA | 100 % (erreicht Juni 2026) | Patrick Motsch | | S-5 | Awareness | Mitarbeitende mit jährlicher IS-Schulung | 100 % | Patrick Motsch | | S-6 | Vorfallreaktion | Incidents innerhalb Zielreaktionszeit behandelt | >= 95 % | Patrick Motsch | diff --git a/e-compliance/ims/04_unterstuetzung/dokumentenregister.md b/e-compliance/ims/04_unterstuetzung/dokumentenregister.md index 9977e8c..d49c154 100644 --- a/e-compliance/ims/04_unterstuetzung/dokumentenregister.md +++ b/e-compliance/ims/04_unterstuetzung/dokumentenregister.md @@ -20,6 +20,7 @@ Zentrales Verzeichnis aller gelenkten IMS-Dokumente. Massgeblich für Status, Ow | IMS-05-01 | Qualitätspolitik | `02_fuehrung/qm-politik.md` | Patrick Motsch | entwurf | | IMS-05-02 | Informationssicherheitspolitik | `02_fuehrung/informationssicherheitspolitik.md` | Patrick Motsch | entwurf | | IMS-05-03 | Rollen & Verantwortlichkeiten | `02_fuehrung/rollen-verantwortlichkeiten.md` | Patrick Motsch | entwurf | +| IMS-05-04 | Organisationsreglement | `02_fuehrung/organisationsreglement.md` | Patrick Motsch | entwurf | | IMS-06-01 | Risikomanagement-Methodik | `03_planung/risikomanagement-methodik.md` | Patrick Motsch | entwurf | | IMS-06-02 | Risikoregister | `03_planung/risikoregister.md` | Patrick Motsch | entwurf | | IMS-06-03 | Statement of Applicability (SoA) | `03_planung/statement-of-applicability-soa.md` | Patrick Motsch | entwurf | diff --git a/e-compliance/ims/04_unterstuetzung/kommunikation.md b/e-compliance/ims/04_unterstuetzung/kommunikation.md index 52038e1..222412e 100644 --- a/e-compliance/ims/04_unterstuetzung/kommunikation.md +++ b/e-compliance/ims/04_unterstuetzung/kommunikation.md @@ -23,6 +23,11 @@ Regelt, **was, wann, mit wem und wie** im Kontext des IMS kommuniziert wird. | Incidents | sofort | Melder -> Incident-Verantwortlicher | definierter Meldeweg | | Release Notes / Changes | je Release | Release-Verantwortlicher -> Team | CHANGELOG, Wiki | | Management-Review-Ergebnisse | nach Review | Leitung -> Team | Protokoll | +| Operations-Meeting | wöchentlich | Patrick, Dominic, Chris (+ ggf. Silvan) | Meeting (Moderation: Chris, Vorschlag) — Daily Business, operative Entscheide, Zahlen | +| Verwaltungsrat (POL) | wöchentlich → Ziel: zweiwöchentlich/monatlich | VR | Strategie, Finanzen, Eskalation aus Operations | +| POL — physisches Treffen | quartalsweise (Vorschlag) | VR | Abendessen / strategischer Austausch | + +Details und offene POL-Entscheide: [Organisationsreglement](../02_fuehrung/organisationsreglement.md). ## 2. Externe Kommunikation diff --git a/e-compliance/ims/05_betrieb/02_Zugriffsmanagement_IAM_PAM.md b/e-compliance/ims/05_betrieb/02_Zugriffsmanagement_IAM_PAM.md index 5b44de0..d9491f1 100644 --- a/e-compliance/ims/05_betrieb/02_Zugriffsmanagement_IAM_PAM.md +++ b/e-compliance/ims/05_betrieb/02_Zugriffsmanagement_IAM_PAM.md @@ -41,11 +41,13 @@ Jeder solche Zugriff wird protokolliert (Datenbank-Export/Import wird serverseit | System | Authentifizierungsmethode | MFA | |---|---|---| | PORTA Endnutzer | Microsoft Azure AD OAuth / Google OAuth / lokales Login | [ZU PRÜFEN: MFA erzwungen?] | -| Admin-UI (SysAdmin) | [ZU PRÜFEN] | [ZU PRÜFEN: MFA?] | +| Admin-UI (SysAdmin) | Lokales Login / Session | **MFA erzwungen** (umgesetzt Juni 2026) | | SSH-Server | SSH-Key | [ZU PRÜFEN: Key + Passphrase? Bastion?] | | Drittdienste (OpenAI etc.) | API-Keys in `.env` | n/a | -**Vorgabe:** Für privilegierte Zugänge (SysAdmin, SSH, DB) ist Zwei-Faktor-Authentifizierung zu konfigurieren. SMS-/mobile TAN ist möglichst zu vermeiden; bevorzugt App- oder Hardware-Token. **[ZU PRÜFEN: aktueller Stand]** +**Vorgabe:** Für privilegierte Zugänge (SysAdmin, SSH, DB) ist Zwei-Faktor-Authentifizierung zu konfigurieren. SMS-/mobile TAN ist möglichst zu vermeiden; bevorzugt App- oder Hardware-Token. + +**Stand Juni 2026:** MFA auf Admin-UI (SysAdmin) und Server-Zugängen umgesetzt. Endnutzer-MFA über IdP (Azure AD/Google) und SSH-Details siehe unten — offene Punkte bleiben markiert. ## 5. Berechtigungsvergabe, -änderung und -entzug (#67) @@ -73,5 +75,5 @@ Privilegierter Zugriff (SSH, DB-Admin, SysAdmin) wird nur sorgfältig ausgewähl | Thema | Status | Massnahme | |---|---|---| | Personalisierte SSH-Accounts | Offen | Umstellung oder vollständige Sitzungsprotokollierung | -| MFA auf privilegierten Zugängen | [ZU PRÜFEN] | Erzwingen | +| MFA auf privilegierten Zugängen | **Umgesetzt** (Juni 2026) | Halbjährliche Rezertifizierung | | Halbjährliche Rezertifizierung | Neu | Erstdurchführung terminieren | diff --git a/e-compliance/ims/05_betrieb/18_Analyse_Recht_und_BestPractice.md b/e-compliance/ims/05_betrieb/18_Analyse_Recht_und_BestPractice.md index f59cdba..d741ade 100644 --- a/e-compliance/ims/05_betrieb/18_Analyse_Recht_und_BestPractice.md +++ b/e-compliance/ims/05_betrieb/18_Analyse_Recht_und_BestPractice.md @@ -22,7 +22,7 @@ | Datumsfelder AGB | Stand / Gilt ab / Anhänge: **01.02.2026**; nächste Überprüfung: **01.02.2027** | | Ansprechpartner/Rollen | Patrick Motsch in offenen Namens-/Kontaktfeldern (Dok. 01, 02, 06, 07) | -**Nicht geändert (bewusst):** Inhaltliche AGB-Zusicherungen; technische `[ZU PRÜFEN]`-Fakten (MFA, At-Rest, Pentest-Nachweis etc.). +**Nicht geändert (bewusst):** Inhaltliche AGB-Zusicherungen; technische `[ZU PRÜFEN]`-Fakten (At-Rest, Pentest-Nachweis etc.). MFA auf Admin-/Server-Zugängen seit Juni 2026 umgesetzt. --- @@ -144,10 +144,10 @@ Die Plattform adressiert OWASP Top 10 präventiv (`security-overview.md` Kap. 9. | | AGB | Dokumentierter Stand | |---|---|---| -| Zusage | MFA verpflichtend; Logs 3 Jahre, write-once, Kundenzugang | MFA `[ZU PRÜFEN]`; kein write-once; SIEM offen | +| Zusage | MFA verpflichtend; Logs 3 Jahre, write-once, Kundenzugang | MFA **umgesetzt** (Admin/Server, Juni 2026); kein write-once; SIEM offen | | Referenz | Anhang C | `02_Zugriffsmanagement_IAM_PAM.md`, `11_Logging_und_Monitoring.md` | -**Empfehlung:** MFA auf SysAdmin/SSH erzwingen; Log-Shipping auf append-only Storage; leichtgewichtiges Alerting. +**Empfehlung:** Log-Shipping auf append-only Storage; leichtgewichtiges Alerting. MFA Admin/Server erledigt (Juni 2026). ### 4.6 Produktivdaten in Testumgebung (CACC #102) @@ -177,7 +177,7 @@ Die Plattform adressiert OWASP Top 10 präventiv (`security-overview.md` Kap. 9. | P1 | Prod-Daten in Test: Prozess ändern (Anonymisierung/synthetisch) | Mittel | Hoch (FINMA) | | P1 | Backup-Exporte verschlüsseln | Gering | Hoch | | P2 | Externen Pentest beauftragen (jährlich) | Mittel | Hoch (AGB §8.4) | -| P2 | MFA auf privilegierten Zugängen | Gering | Mittel | +| ~~P2~~ | ~~MFA auf privilegierten Zugängen~~ | — | **Erledigt** (Juni 2026) | | P2 | RTO/RPO mit Backup-Frequenz abgleichen | Mittel | Mittel (Vertrag) | | P2 | Anhang A: Infomaniak eintragen | Gering | Gering | | P3 | Personalisierte SSH-Accounts oder Sitzungsprotokollierung | Mittel | Mittel | diff --git a/e-compliance/ims/07_verbesserung/massnahmen-register.md b/e-compliance/ims/07_verbesserung/massnahmen-register.md index 456f9f6..bc67287 100644 --- a/e-compliance/ims/07_verbesserung/massnahmen-register.md +++ b/e-compliance/ims/07_verbesserung/massnahmen-register.md @@ -19,7 +19,7 @@ Zentrale Liste aller Korrektur- und Verbesserungsmassnahmen. Das [Management-Coc | ID | Titel | Owner | Quelle | Erstellt | Fällig | Status | |---|---|---|---|---|---|---| -| M-01 | MFA auf Admin-/Server-Zugängen bestätigen/erzwingen | Patrick Motsch | Risiko | 2026-06-03 | 2026-07-15 | offen | +| M-01 | MFA auf Admin-/Server-Zugängen bestätigen/erzwingen | Patrick Motsch | Risiko | 2026-06-03 | 2026-07-15 | erledigt | | M-02 | Restore-Test durchführen und protokollieren | Patrick Motsch | Risiko | 2026-06-03 | 2026-06-30 | offen | | M-03 | AVV/Zero-Retention mit OpenAI und weiteren LLM-Providern ablegen | Patrick Motsch | Risiko | 2026-06-03 | 2026-07-31 | offen | | M-04 | Log-Aufbewahrungsdauer und Manipulationsschutz festlegen | Patrick Motsch | Risiko | 2026-06-03 | 2026-07-31 | offen | @@ -32,6 +32,7 @@ Zentrale Liste aller Korrektur- und Verbesserungsmassnahmen. Das [Management-Coc | M-11 | Risikoworkshop zur Validierung des Risikoregisters | Patrick Motsch | Risiko | 2026-06-03 | 2026-06-30 | offen | | M-12 | Asset-Inventar erstellen (A.5.9) | Patrick Motsch | Doku | 2026-06-03 | 2026-08-31 | offen | | M-13 | Politiken formal freigeben (Status entwurf -> freigegeben) | Patrick Motsch | Doku | 2026-06-03 | 2026-07-31 | offen | +| M-14 | Organisationsreglement und Meetingstruktur im POL bestätigen | Patrick Motsch | Review | 2026-06-11 | 2026-06-30 | in Arbeit | ## Pflegehinweis diff --git a/e-compliance/ims/cockpit/IMS-Cockpit.html b/e-compliance/ims/cockpit/IMS-Cockpit.html index dace46f..e369447 100644 --- a/e-compliance/ims/cockpit/IMS-Cockpit.html +++ b/e-compliance/ims/cockpit/IMS-Cockpit.html @@ -2127,7 +2127,7 @@ Expecting `+Ze.join(", ")+", got '"+(this.terminals_[Ne]||Ne)+"'":Dt="Parse erro } `;function lYe(i,a,u=!1){var R,B,j;const d=i;let p="default";(((R=d==null?void 0:d.classes)==null?void 0:R.length)||0)>0&&(p=((d==null?void 0:d.classes)||[]).join(" ")),p=p+" flowchart-label";let v=0,b="",y;switch(d.type){case"round":v=5,b="rect";break;case"composite":v=0,b="composite",y=0;break;case"square":b="rect";break;case"diamond":b="question";break;case"hexagon":b="hexagon";break;case"block_arrow":b="block_arrow";break;case"odd":b="rect_left_inv_arrow";break;case"lean_right":b="lean_right";break;case"lean_left":b="lean_left";break;case"trapezoid":b="trapezoid";break;case"inv_trapezoid":b="inv_trapezoid";break;case"rect_left_inv_arrow":b="rect_left_inv_arrow";break;case"circle":b="circle";break;case"ellipse":b="ellipse";break;case"stadium":b="stadium";break;case"subroutine":b="subroutine";break;case"cylinder":b="cylinder";break;case"group":b="rect";break;case"doublecircle":b="doublecircle";break;default:b="rect"}const E=gm((d==null?void 0:d.styles)||[]),_=d.label,A=d.size||{width:0,height:0,x:0,y:0};return{labelStyle:E.labelStyle,shape:b,labelText:_,rx:v,ry:v,class:p,style:E.style,id:d.id,directions:d.directions,width:A.width,height:A.height,x:A.x,y:A.y,positioned:u,intersect:void 0,type:d.type,padding:y??(((j=(B=mh())==null?void 0:B.block)==null?void 0:j.padding)||0)}}async function Hcn(i,a,u){const d=lYe(a,u,!1);if(d.type==="group")return;const p=await pJ(i,d),v=p.node().getBBox(),b=u.getBlock(d.id);b.size={width:v.width,height:v.height,x:0,y:0,node:p},u.setBlock(b),p.remove()}async function Ucn(i,a,u){const d=lYe(a,u,!0);u.getBlock(d.id).type!=="space"&&(await pJ(i,d),a.intersect=d==null?void 0:d.intersect,ive(d))}async function Dwe(i,a,u,d){for(const p of a)await d(i,p,u),p.children&&await Dwe(i,p.children,u,d)}async function Vcn(i,a,u){await Dwe(i,a,u,Hcn)}async function Gcn(i,a,u){await Dwe(i,a,u,Ucn)}async function Kcn(i,a,u,d,p){const v=new R0({multigraph:!0,compound:!0});v.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(const b of u)b.size&&v.setNode(b.id,{width:b.size.width,height:b.size.height,intersect:b.intersect});for(const b of a)if(b.start&&b.end){const y=d.getBlock(b.start),E=d.getBlock(b.end);if(y!=null&&y.size&&(E!=null&&E.size)){const _=y.size,A=E.size,P=[{x:_.x,y:_.y},{x:_.x+(A.x-_.x)/2,y:_.y+(A.y-_.y)/2},{x:A.x,y:A.y}];await cGe(i,{v:b.start,w:b.end,name:b.id},{...b,arrowTypeEnd:b.arrowTypeEnd,arrowTypeStart:b.arrowTypeStart,points:P,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"},void 0,"block",v,p),b.label&&(await sve(i,{...b,label:b.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:b.arrowTypeEnd,arrowTypeStart:b.arrowTypeStart,points:P,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),await aGe({...b,x:P[1].x,y:P[1].y},{originalPath:P}))}}}const Jf=((gYe=(dYe=qt())==null?void 0:dYe.block)==null?void 0:gYe.padding)||8;function Wcn(i,a){if(i===0||!Number.isInteger(i))throw new Error("Columns must be an integer !== 0.");if(a<0||!Number.isInteger(a))throw new Error("Position must be a non-negative integer."+a);if(i<0)return{px:a,py:0};if(i===1)return{px:0,py:a};const u=a%i,d=Math.floor(a/i);return{px:u,py:d}}const Ycn=i=>{let a=0,u=0;for(const d of i.children){const{width:p,height:v,x:b,y}=d.size||{width:0,height:0,x:0,y:0};Xe.debug("getMaxChildSize abc95 child:",d.id,"width:",p,"height:",v,"x:",b,"y:",y,d.type),d.type!=="space"&&(p>a&&(a=p/(i.widthInColumns||1)),v>u&&(u=v))}return{width:a,height:u}};function Iwe(i,a,u=0,d=0){var b,y,E,_,A,P,R,B,j,W,ee;Xe.debug("setBlockSizes abc95 (start)",i.id,(b=i==null?void 0:i.size)==null?void 0:b.x,"block width =",i==null?void 0:i.size,"sieblingWidth",u),(y=i==null?void 0:i.size)!=null&&y.width||(i.size={width:u,height:d,x:0,y:0});let p=0,v=0;if(((E=i.children)==null?void 0:E.length)>0){for(const de of i.children)Iwe(de,a);const ie=Ycn(i);p=ie.width,v=ie.height,Xe.debug("setBlockSizes abc95 maxWidth of",i.id,":s children is ",p,v);for(const de of i.children)de.size&&(Xe.debug(`abc95 Setting size of children of ${i.id} id=${de.id} ${p} ${v} ${de.size}`),de.size.width=p*(de.widthInColumns||1)+Jf*((de.widthInColumns||1)-1),de.size.height=v,de.size.x=0,de.size.y=0,Xe.debug(`abc95 updating size of ${i.id} children child:${de.id} maxWidth:${p} maxHeight:${v}`));for(const de of i.children)Iwe(de,a,p,v);const oe=i.columns||-1;let be=0;for(const de of i.children)be+=de.widthInColumns||1;let ge=i.children.length;oe>0&&oe0?Math.min(i.children.length,oe):i.children.length;if(de>0){const X=(ne-de*Jf-Jf)/de;Xe.debug("abc95 (growing to fit) width",i.id,ne,(R=i.size)==null?void 0:R.width,X);for(const pe of i.children)pe.size&&(pe.size.width=X)}}i.size={width:ne,height:se,x:0,y:0}}Xe.debug("setBlockSizes abc94 (done)",i.id,(B=i==null?void 0:i.size)==null?void 0:B.x,(j=i==null?void 0:i.size)==null?void 0:j.width,(W=i==null?void 0:i.size)==null?void 0:W.y,(ee=i==null?void 0:i.size)==null?void 0:ee.height)}function hYe(i,a){var d,p,v,b,y,E,_,A,P,R,B,j,W,ee,ie,oe,be;Xe.debug(`abc85 layout blocks (=>layoutBlocks) ${i.id} x: ${(d=i==null?void 0:i.size)==null?void 0:d.x} y: ${(p=i==null?void 0:i.size)==null?void 0:p.y} width: ${(v=i==null?void 0:i.size)==null?void 0:v.width}`);const u=i.columns||-1;if(Xe.debug("layoutBlocks columns abc95",i.id,"=>",u,i),i.children&&i.children.length>0){const ge=((y=(b=i==null?void 0:i.children[0])==null?void 0:b.size)==null?void 0:y.width)||0,ae=i.children.length*ge+(i.children.length-1)*Jf;Xe.debug("widthOfChildren 88",ae,"posX");let ne=0;Xe.debug("abc91 block?.size?.x",i.id,(E=i==null?void 0:i.size)==null?void 0:E.x);let se=(_=i==null?void 0:i.size)!=null&&_.x?((A=i==null?void 0:i.size)==null?void 0:A.x)+(-((P=i==null?void 0:i.size)==null?void 0:P.width)/2||0):-Jf,de=0;for(const X of i.children){const pe=i;if(!X.size)continue;const{width:G,height:xe}=X.size,{px:U,py:Be}=Wcn(u,ne);if(Be!=de&&(de=Be,se=(R=i==null?void 0:i.size)!=null&&R.x?((B=i==null?void 0:i.size)==null?void 0:B.x)+(-((j=i==null?void 0:i.size)==null?void 0:j.width)/2||0):-Jf,Xe.debug("New row in layout for block",i.id," and child ",X.id,de)),Xe.debug(`abc89 layout blocks (child) id: ${X.id} Pos: ${ne} (px, py) ${U},${Be} (${(W=pe==null?void 0:pe.size)==null?void 0:W.x},${(ee=pe==null?void 0:pe.size)==null?void 0:ee.y}) parent: ${pe.id} width: ${G}${Jf}`),pe.size){const Pe=G/2;X.size.x=se+Jf+Pe,Xe.debug(`abc91 layout blocks (calc) px, pyid:${X.id} startingPos=X${se} new startingPosX${X.size.x} ${Pe} padding=${Jf} width=${G} halfWidth=${Pe} => x:${X.size.x} y:${X.size.y} ${X.widthInColumns} (width * (child?.w || 1)) / 2 ${G*((X==null?void 0:X.widthInColumns)||1)/2}`),se=X.size.x+Pe,X.size.y=pe.size.y-pe.size.height/2+Be*(xe+Jf)+xe/2+Jf,Xe.debug(`abc88 layout blocks (calc) px, pyid:${X.id}startingPosX${se}${Jf}${Pe}=>x:${X.size.x}y:${X.size.y}${X.widthInColumns}(width * (child?.w || 1)) / 2${G*((X==null?void 0:X.widthInColumns)||1)/2}`)}X.children&&hYe(X),ne+=(X==null?void 0:X.widthInColumns)||1,Xe.debug("abc88 columnsPos",X,ne)}}Xe.debug(`layout blocks (<==layoutBlocks) ${i.id} x: ${(ie=i==null?void 0:i.size)==null?void 0:ie.x} y: ${(oe=i==null?void 0:i.size)==null?void 0:oe.y} width: ${(be=i==null?void 0:i.size)==null?void 0:be.width}`)}function fYe(i,{minX:a,minY:u,maxX:d,maxY:p}={minX:0,minY:0,maxX:0,maxY:0}){if(i.size&&i.id!=="root"){const{x:v,y:b,width:y,height:E}=i.size;v-y/2d&&(d=v+y/2),b+E/2>p&&(p=b+E/2)}if(i.children)for(const v of i.children)({minX:a,minY:u,maxX:d,maxY:p}=fYe(v,{minX:a,minY:u,maxX:d,maxY:p}));return{minX:a,minY:u,maxX:d,maxY:p}}function Xcn(i){const a=i.getBlock("root");if(!a)return;Iwe(a,i,0,0),hYe(a),Xe.debug("getBlocks",JSON.stringify(a,null,2));const{minX:u,minY:d,maxX:p,maxY:v}=fYe(a),b=v-d,y=p-u;return{x:u,y:d,width:y,height:b}}const Qcn=Object.freeze(Object.defineProperty({__proto__:null,diagram:{parser:Mcn,db:zcn,renderer:{draw:async function(i,a,u,d){const{securityLevel:p,block:v}=mh(),b=d.db;let y;p==="sandbox"&&(y=Dr("#i"+a));const E=Dr(p==="sandbox"?y.nodes()[0].contentDocument.body:"body"),_=p==="sandbox"?E.select(`[id="${a}"]`):Dr(`[id="${a}"]`);Ume(_,["point","circle","cross"],d.type,a);const P=b.getBlocks(),R=b.getBlocksFlat(),B=b.getEdges(),j=_.insert("g").attr("class","block");await Vcn(j,P,b);const W=Xcn(b);if(await Gcn(j,P,b),await Kcn(j,B,R,b,a),W){const ee=W,ie=Math.max(1,Math.round(.125*(ee.width/ee.height))),oe=ee.height+ie+10,be=ee.width+10,{useMaxWidth:ge}=v;Fg(_,oe,be,!!ge),Xe.debug("Here Bounds",W,ee),_.attr("viewBox",`${ee.x-5} ${ee.y-5} ${ee.width+10} ${ee.height+10}`)}PF(sRe)},getClasses:function(i,a){return a.db.getClasses()}},styles:qcn}},Symbol.toStringTag,{value:"Module"}));return bm}); - +