docs: echte Umlaute in der Dokumentation
893 Stellen in Fliesstext, Tabellen und Mermaid-Beschriftungen. Dazu die sichtbaren ss-Fälle (ausschließlich, groß, außen, schließt, heißt, draußen, weiße, anstoßen, Straße). Nicht angetastet, damit die Doku weiter beschreibt, was wirklich in der Datenbank steht: - Codeblöcke und Code-Spans - dort stehen Bezeichner, SQL, Enum-Werte und Dateinamen: `mail_pool`, `'uebernommen'`, `extract.js` - in Mermaid nur der Text in Anführungszeichen; Knotennamen, Pfeile und Werte wie source = 'Mail' bleiben, wie sie sind - `empfaenger` im ER-Diagramm von crm_mail_contact_candidates: die Aufzählung dort nennt die Datenbankwerte, nicht die Anzeige Die Menü-Skizze in der Benutzeranleitung zeigt jetzt die aufgeklappten Kontakte mit "Aus Mails" samt Zähler. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
8b7ce448a6
commit
7973dc07b1
+24
-24
@@ -1,10 +1,10 @@
|
||||
# 05 Frontend
|
||||
|
||||
Eine einzige React-Anwendung ohne Router: `App.tsx` haelt die aktuelle Ansicht in
|
||||
einem Zustand und rendert sie. Das genuegt, weil die App hinter einer Anmeldung
|
||||
Eine einzige React-Anwendung ohne Router: `App.tsx` hält die aktuelle Ansicht in
|
||||
einem Zustand und rendert sie. Das genügt, weil die App hinter einer Anmeldung
|
||||
sitzt und keine tiefen Links braucht.
|
||||
|
||||
## Menue und Ansichten
|
||||
## Menü und Ansichten
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
@@ -13,15 +13,15 @@ flowchart TD
|
||||
K --> C["Kalender"]
|
||||
K --> L["Kontakte"]
|
||||
L --> L1["Alle Kontakte"]
|
||||
L --> L2["Aus Mails<br/>Vorbereich, Zaehler im Menue"]
|
||||
L --> L2["Aus Mails<br/>Vorbereich, Zähler im Menü"]
|
||||
K --> M["Mails"]
|
||||
M --> M1["Postfach"]
|
||||
M --> M2["Kontakt-Vorschlaege"]
|
||||
M --> M2["Kontakt-Vorschläge"]
|
||||
K --> SC["Scanner"]
|
||||
SC --> SC1["Dashboard"]
|
||||
SC --> SC2["Unpassend"]
|
||||
SC --> SC3["Suchagenten"]
|
||||
SC --> SC4["Boersen-Konten"]
|
||||
SC --> SC4["Börsen-Konten"]
|
||||
SB --> E["Einstellungen"]
|
||||
E --> E1["Nutzerverwaltung (admin)"]
|
||||
E --> E2["Mein Konto"]
|
||||
@@ -30,16 +30,16 @@ flowchart TD
|
||||
E --> E5["Whisper"]
|
||||
```
|
||||
|
||||
*Postfach* und *Kontakt-Vorschlaege* sind Reiter **innerhalb** der Ansicht
|
||||
*Mails*, keine Menuepunkte - sie gehoeren zusammen und wechseln oft hin und her.
|
||||
*Postfach* und *Kontakt-Vorschläge* sind Reiter **innerhalb** der Ansicht
|
||||
*Mails*, keine Menüpunkte - sie gehören zusammen und wechseln oft hin und her.
|
||||
|
||||
Die Menuepunkte *Kontakte* und *Scanner* klappen ihre Unterpunkte auf; der
|
||||
Die Menüpunkte *Kontakte* und *Scanner* klappen ihre Unterpunkte auf; der
|
||||
Kopfeintrag ist dabei selbst eine Ansicht (Kontaktliste bzw. Scanner-Dashboard).
|
||||
Bei eingeklappter Leiste (Symbolbreite) erscheinen nur die Symbole, die
|
||||
Unterpunkte kommen mit den Beschriftungen zurueck. Beide Gruppen entstehen aus
|
||||
Unterpunkte kommen mit den Beschriftungen zurück. Beide Gruppen entstehen aus
|
||||
derselben Struktur `MenuGroup` in `Sidebar.tsx`.
|
||||
|
||||
*Aus Mails* traegt einen Zaehler mit der Anzahl der offenen Funde - er kommt aus
|
||||
*Aus Mails* trägt einen Zähler mit der Anzahl der offenen Funde - er kommt aus
|
||||
`App.tsx`, das die Kontakte ohnehin geladen hat.
|
||||
|
||||
## Zustand und Datenfluss
|
||||
@@ -64,34 +64,34 @@ flowchart TB
|
||||
DATA --> V2["Kalender"]
|
||||
DATA --> V3["Kontakte<br/>mail_pool = false"]
|
||||
DATA --> V5["Aus Mails<br/>mail_pool = true + Kontakte zum Abgleich"]
|
||||
DATA --> V4["Mails<br/>leads + opportunities fuer den Zuordnungsdialog"]
|
||||
DATA --> V4["Mails<br/>leads + opportunities für den Zuordnungsdialog"]
|
||||
NAV --> DF["DictationField<br/>springt nach Whisper"]
|
||||
NAV --> ML["Mails<br/>springt zum Kontakt einer Zuordnung"]
|
||||
|
||||
SCV["Scanner-Ansichten"] -->|"laden selbst"| API["/api/scanner"]
|
||||
MV["Mailansicht"] -->|"laedt selbst"| MAPI["/api/mail"]
|
||||
MV["Mailansicht"] -->|"lädt selbst"| MAPI["/api/mail"]
|
||||
```
|
||||
|
||||
Die CRM-Daten werden **einmal zentral** geladen und als Props durchgereicht; die
|
||||
Scanner- und Mailansichten laden ihre eigenen Daten selbst - der Scanner, weil er
|
||||
eine andere Datenbank und eine Auffrischung im 30-Sekunden-Takt hat; die Mails,
|
||||
weil sie blaettern, suchen und filtern und dabei nicht die ganze Liste im Speicher
|
||||
weil sie blättern, suchen und filtern und dabei nicht die ganze Liste im Speicher
|
||||
halten sollen. Kontakte und Opportunities bekommt die Mailansicht dagegen als
|
||||
Props: der Zuordnungsdialog braucht sie beide zum Vorschlagen.
|
||||
|
||||
`/api/leads` liefert beide Bestaende in einem Aufruf; `App.tsx` teilt sie in
|
||||
`/api/leads` liefert beide Bestände in einem Aufruf; `App.tsx` teilt sie in
|
||||
`leads` (Kontakte) und `mailPoolLeads` (Vorbereich „Aus Mails") auf. Alle
|
||||
anderen Ansichten bekommen ausschliesslich `leads` - ein Fund aus einer Mail soll
|
||||
anderen Ansichten bekommen ausschließlich `leads` - ein Fund aus einer Mail soll
|
||||
in keiner Auswahlliste auftauchen. Die Ansicht *Aus Mails* braucht beides: sie
|
||||
vergleicht jeden Fund gegen den Kontaktbestand und markiert Dubletten.
|
||||
|
||||
`goTo('Kontakte', { leadId })` ist der Sprung aus einer Mailzuordnung zum
|
||||
Kontakt. `App.tsx` haelt die Id in `focusLeadId`, die Kontaktansicht oeffnet den
|
||||
Kontakt und meldet mit `onFocusHandled()` zurueck - der Effekt haengt an `leads`
|
||||
Kontakt. `App.tsx` hält die Id in `focusLeadId`, die Kontaktansicht öffnet den
|
||||
Kontakt und meldet mit `onFocusHandled()` zurück - der Effekt hängt an `leads`
|
||||
und wartet damit auf einen gerade erst angelegten Kontakt.
|
||||
|
||||
`reload={() => loadData(true)}` laedt still nach - ohne Ladeanzeige, damit ein
|
||||
Speichern im Dialog nicht die ganze Liste flackern laesst.
|
||||
`reload={() => loadData(true)}` lädt still nach - ohne Ladeanzeige, damit ein
|
||||
Speichern im Dialog nicht die ganze Liste flackern lässt.
|
||||
|
||||
## Komponentenkarte
|
||||
|
||||
@@ -127,8 +127,8 @@ src/
|
||||
## Dark Mode ohne `dark:`-Varianten
|
||||
|
||||
Die Klasse `dark` auf `<html>` tauscht in `src/index.css` nur die Werte der
|
||||
Variablen `canvas`, `surface`, `ink-*`, `brand-*` und der getoenten Statusfarben.
|
||||
Die Komponenten benutzen durchgaengig diese Skalen und folgen damit automatisch -
|
||||
Variablen `canvas`, `surface`, `ink-*`, `brand-*` und der getönten Statusfarben.
|
||||
Die Komponenten benutzen durchgängig diese Skalen und folgen damit automatisch -
|
||||
kein `dark:` im Markup.
|
||||
|
||||
```mermaid
|
||||
@@ -143,9 +143,9 @@ flowchart LR
|
||||
Ein Inline-Skript in `index.html` setzt die Klasse vor dem ersten Frame, sonst
|
||||
blitzt beim Laden die helle Variante auf. Drei Werte bleiben in beiden Modi
|
||||
gleich: `ink-950` (liegt nur unter Dialog-Overlays), `text-white` (steht immer auf
|
||||
farbigen Flaechen) und `brand-500` (das CI-Gruen der Buttons).
|
||||
farbigen Flächen) und `brand-500` (das CI-Grün der Buttons).
|
||||
|
||||
Eine bewusste Ausnahme: der **Mailinhalt** bleibt auch im Dunkelmodus auf weissem
|
||||
Grund. Fremdes Mail-HTML bringt seine eigenen Farben mit; ein dunkler Hintergrund
|
||||
darunter macht schwarze Schrift auf schwarzer Flaeche. Der Rahmen liest sich damit
|
||||
darunter macht schwarze Schrift auf schwarzer Fläche. Der Rahmen liest sich damit
|
||||
wie ein Blatt Papier im dunklen Fenster - gewollt.
|
||||
|
||||
Reference in New Issue
Block a user