diff --git a/BRAIN.md b/BRAIN.md index facbfd1..a899806 100644 --- a/BRAIN.md +++ b/BRAIN.md @@ -31,13 +31,14 @@ - [x] **Ersteinrichtung (First-Boot Setup Wizard), Echter Login & Einladungscodes (`SetupAndAuthView.tsx`, `server.go`, `sqlite.go`):** - Kein hartcodierter Auto-Seed-Benutzer (`admin@mindsift.local` / `"Sandro"`) und kein automatischer `quickStart`-Login mehr beim Seitenaufruf. - Beim ersten Start (`0` Benutzer in der Datenbank) erkennt `GET /api/v1/auth/status` automatisch `needsSetup: true` und zeigt den **Ersteinrichtungs-Assistenten** (`POST /api/v1/auth/setup`) zum Anlegen des ersten Server-Admin-Kontos und der Instanz-Grundeinstellungen. - - Öffentliche Selbstregistrierung ist standardmäßig deaktiviert (`allowRegistration: false`). Neue Benutzer können nur über einen **Einladungscode** (`MS-XXXXXXXX`, Tabelle `user_invites`) oder direkt durch einen Admin (`admin` / `team_admin`) angelegt werden. -- [x] **Profile-Dropdown & Vollbild-Einstellungsseiten statt kleinem Modal (`App.tsx`, `UserSettingsView.tsx`, `AdminSettingsView.tsx`):** + - Öffentliche Selbstregistrierung ist standardmäßig deaktiviert (`allowRegistration: false`). Neue Benutzer können nur über einen **Einladungscode** (`MS-XXXXXXXX`, Tabelle `user_invites`) oder direkt durch einen Admin (`admin`) angelegt werden. +- [x] **Profile-Dropdown & Vollbild-Einstellungsseiten (`App.tsx`, `UserSettingsView.tsx`, `GroupsView.tsx`, `AdminSettingsView.tsx`):** - Klick auf den Benutzer oben rechts öffnet ein eckiges, monochromes Dropdown-Menü: - **Kontoeinstellungen** (`UserSettingsView.tsx` — Vollbild-Ansicht für Profil & Passwort, Darstellung & Themes, Multi-Channel-Alarme, Private Webhooks & Daten-Export). - - **Administration** (`AdminSettingsView.tsx` — nur sichtbar für `admin` und `team_admin`; Vollbild-Ansicht für Benutzer, Rollen, Einladungscodes, Organisationen & Teams, Server-Isolation und SMTP-Mailserver). + - **Gruppen** (`GroupsView.tsx` — für alle Benutzer; Self-Service Erstellung und Verwaltung von Gruppen, Mitgliedern und Rollen). + - **Administration** (`AdminSettingsView.tsx` — nur sichtbar für `admin`; Vollbild-Ansicht für Benutzer, Einladungscodes, Server-Isolation und SMTP-Mailserver). - **Abmelden** (bereinigt JWT-Token und führt zurück zum Login-Bildschirm). - - 3-stufiges Rollensystem: `admin` (Server-Admin), `team_admin` (Team-Admin mit Berechtigung zum Einladen und Verwalten von Teams) und `member` (Mitglied). + - Klares Rollensystem: Global `admin` (Server-Admin) und `member` (Standard-Benutzer). Innerhalb von Gruppen: `admin` (Gruppen-Admin) und `member` (Gruppen-Mitglied). - Layout-Fix im Benutzer-Erstellungsformular (`grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3` mit `min-w-0`), sodass das Rollen-Dropdown niemals über den Container hinausragt. - [x] **Multi-Channel-Alarme: E-Mail (SMTP), Discord & Eigener Webhook (`UserSettingsView.tsx`, `AdminSettingsView.tsx`, `server.go`):** - Tab heißt klar **Alarme** mit frei kombinierbaren Zielen (`alarmChannels`: `'email'`, `'discord'`, `'webhook'`). @@ -178,7 +179,7 @@ MindSift speichert alle Daten lokal und hochperformant in SQLite (`/data/mindsif 1. **`users`** - `id TEXT PRIMARY KEY`, `email TEXT UNIQUE`, `password_hash TEXT`, `display_name TEXT` - - `role TEXT DEFAULT 'member'` (`admin`, `team_admin`, `member`) + - `role TEXT DEFAULT 'member'` (`admin`, `member`) - `is_active INTEGER DEFAULT 1`, `created_at DATETIME`, `updated_at DATETIME` 2. **`system_settings`** (Instanzweite globale Konfiguration, 1 Row mit `id = 'singleton'`) - `sharing_mode TEXT DEFAULT 'teams_only'` (`strict_private`, `teams_only`, `open`) @@ -187,7 +188,7 @@ MindSift speichert alle Daten lokal und hochperformant in SQLite (`/data/mindsif - `smtp_host TEXT`, `smtp_port INTEGER`, `smtp_user TEXT`, `smtp_pass TEXT`, `smtp_from TEXT`, `smtp_tls INTEGER` 3. **`user_invites`** (Einladungscodes für neue Registrierungen) - `id TEXT PRIMARY KEY`, `code TEXT UNIQUE` (`MS-XXXXXXXX`), `email TEXT` (optional gebunden) - - `role TEXT DEFAULT 'member'`, `team_id TEXT` (optional direkte Team-Zuweisung) + - `role TEXT DEFAULT 'member'` (`admin`, `member`) - `created_by TEXT`, `used_by TEXT`, `expires_at DATETIME`, `created_at DATETIME` 4. **`organizations` & `organization_teams` & `team_members`** - Strukturierung von Benutzern in Abteilungen, Familien oder Projekt-Teams. diff --git a/frontend/index.html b/frontend/index.html index b020e97..d0175fd 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,12 +4,23 @@ + + - -
- Alles Wichtige zur Tastaturbedienung, Outliner-Notizen, Triage und Zusammenarbeit -
-+ Alles Wichtige zur Tastaturbedienung, Outliner-Notizen, Triage und Zusammenarbeit +
- Benutzerverwaltung, Einladungscodes, Organisationen, Teams, Isolationsmodus & Mail-Server + Benutzerverwaltung, Einladungscodes, Isolationsmodus & Mail-Server
Organisationen & Teams
-Teams & Mitglieder zuweisen
-- Personen mit Zugriff ({members.length}): -
-{m.displayName || m.email}
-{m.email}
-Keine Mitglieder in diesem Bereich.
- ); - } else { - return ( -Diese Aufgabenliste ist privat.
-- Wähle oben einen Familien- oder Team-Space aus, um die Liste und alle enthaltenen Aufgaben automatisch mit den Mitgliedern zu teilen. -
-- {task.content} -
-- {task.content} -
-- {task.content} -
- - {/* Subtasks Progress Bar & Checklist */} - {renderTaskProgressBar(task)} - {renderSubtaskList(task)} - -- {task.content} -
- - {/* Subtasks Progress Bar on Title */} - {renderTaskProgressBar(task)} - - {/* Inline Notes or Editor */} - {activeNotesTaskId === task.id ? ( -Keine Aufgaben gefunden
++ {selectedTag + ? `Keine Aufgaben mit Hashtag #${selectedTag}.` + : filter === 'done' + ? 'Noch keine Aufgaben erledigt.' + : 'Erstelle oben eine neue Aufgabe.'} +
+- Alle Quick Dump Notizen sind einsortiert oder verworfen. Tippe oben in die Leiste (Taste{' '} + Alle Quick Dump Notizen sind einsortiert oder verworfen. Tippe auf das{' '} + + unten in der Mitte (oder Taste{' '} C ), um neue Gedanken reinzurotzen.
@@ -246,7 +448,7 @@ export const TriageDeck: React.FCQuick Dump direkt einer Liste zuordnen:
@@ -470,7 +697,7 @@ export const TriageDeck: React.FC+ {actionSheetCard.content} +
++ Auf welche Liste soll dieser Punkt gesetzt werden? +
+
+
+
+
+
+ - {isLoadingTag - ? 'Wird geladen…' - : `${tagDetails?.totalMatches || 0} ${ - tagDetails?.totalMatches === 1 ? 'Abschnitt' : 'Abschnitte' - } in ${tagDetails?.documents.length || 0} ${ - tagDetails?.documents.length === 1 ? 'Notiz' : 'Notizen' - }`} -
-+ {isLoadingTag + ? 'Wird geladen…' + : `${tagDetails?.totalMatches || 0} ${ + tagDetails?.totalMatches === 1 ? 'Abschnitt' : 'Abschnitte' + } in ${tagDetails?.documents.length || 0} ${ + tagDetails?.documents.length === 1 ? 'Notiz' : 'Notizen' + }`} +
++ {workspaceTags.length} {workspaceTags.length === 1 ? 'Thema' : 'Themen'} im gesamten Workspace +
++ {tagSearchQuery + ? `Keine Hashtags gefunden für "${tagSearchQuery}"` + : 'Noch keine Themen oder Hashtags vorhanden'} +
+
+ Füge einfach in irgendeiner Notiz ein Tag wie #projekt oder #idee ein.
+
+ Abschnitte ansehen
+
Keine Bullet Points mit #{selectedTag} gefunden
-
- Füge einfach in irgendeiner Notiz #{selectedTag} in einen Bullet Point ein.
-
Keine verknüpften Bullet Points mit #{selectedTag} in anderen Notizen
+
+ Füge einfach in irgendeiner Notiz #{selectedTag} in einen Bullet Point ein, damit er hier automatisch verknüpft wird.
+