Skip to content

Mail: breite Mails passen, Bilder sofort, Ordner auf- und zuklappen, Unterhaltung, Absender - #161

Merged
CallMeTechie merged 4 commits into
mainfrom
feature/mail-reader-ux
Oct 30, 2026
Merged

CallMeTechie merged 4 commits into
mainfrom
feature/mail-reader-ux

Conversation

@CallMeTechie

Copy link
Copy Markdown
Owner

Rückmeldungen des Nutzers zur Mail-Leseansicht. Baut auf #160 auf, main ist per Merge-Commit eingeführt.

Änderungen

  1. Breite HTML-Mails passen in die Breite (z. B. ein IONOS-Newsletter mit fester Tabellenbreite):
    • Die Seite (MailLogic.page) hält Bilder, Tabellen, lange Links und pre im Bildschirm.
    • Was danach noch breiter ist, misst die WebView von außen über ihre Inhaltsbreite (computeHorizontalScrollRange), ohne Skript. Die Mail in #gc-fit wird dann per CSS zoom kleiner gesetzt (MailLogic.fitZoom, höchstens 3 Runden, nie unter 25 %).
    • Aufziehen zum Vergrößern bleibt möglich. JavaScript bleibt aus, die CSP behält script-src 'none'.
    • Eine Dunkeldarstellung für Mails gibt es in der App nicht, deshalb bleibt die Mail auf Weiß.
  2. Bilder sofort nach „Bilder laden“:
    • Ursache: Das HTML ist vor und nach der Freigabe gleich, weil die Bilder schon als img/<token> drinstehen. Der Schlüssel der WebView (page to round) änderte sich deshalb nicht, und die Seite lud nicht neu.
    • Jetzt übernimmt der State die zurückgegebene Message und zählt pictureRound hoch.
    • Die Antworten an die Seite gehen mit Cache-Control: no-store. Verweigerte Bilder werden nie zwischengespeichert.
  3. Seitenmenü:
    • Ein Tipp auf die Kontozeile mit Pfeil klappt den Ordnerbaum auf und zu, das Menü bleibt dabei offen.
    • „Posteingang“ steht immer im Baum. Erst die Wahl eines Eintrags schließt das Menü.
    • Der Klappzustand bleibt pro Konto für die Sitzung erhalten (MailRepository.folds).
  4. Unterhaltung:
    • Die Zeile „Unterhaltung · n Mails“ zeigt die Absender. Ein Tipp zeigt alle Mails (GET threads/<id>), die älteste zuerst.
    • Die geöffnete Mail ist aufgeklappt, die neueste steht unten.
    • Jede andere Mail zeigt Absender, Datum und Vorschau, lässt sich aufklappen und hat „Mail öffnen“.
  5. Absender antippen:
    • Neue Absender-Seite (mail/sender) mit Initialen, Name, Adresse, „Mail schreiben“ und „Adresse kopieren“.
    • Darunter stehen seine Mails im Konto (GET search?from=, Seiten über den Cursor).
    • Den Namen liefert contacts?q= bei einem Treffer mit source:'person'. Für die Daten des geplanten Kontakte-Plugins ist eine Stelle vorgesehen (SenderContact).

Alle neuen Texte gibt es auf Deutsch und Englisch.

Tests

  • MailReaderUxTest: Seitenaufbau, Skalierung, Klappzustand, Unterhaltung, Absender
  • MailReaderViewModelsTest: State nach „Bilder laden“, Laden der Unterhaltung, Absender-Mails mit Paging und Kontaktname
  • Route der Absender-Seite (MainTabsTest)
  • Lokal: :app:testDebugUnitTest, :app:lintRelease und :app:assembleDebug grün (vor dem Merge von main). Nach dem Merge liefen die Mail-, Navigations- und Chat-Tests erneut grün.

Generated by Claude Code

Claude added 4 commits October 30, 2026 22:01
…d Anhänge (Mail 1.1.2)

- Account.avatar { mediaId, mime } (nur Microsoft): MailAvatars lädt das
  Bild über media/<mediaId>, hält es im Speicher und in der Offline-Kopie
  an der mediaId
- MailAccountAvatar: Profilbild oder eigenes einfaches Anbieterzeichen
  („O“, vier Quadrate, „G“, „GMX“, „W“, „T“, sonst „@“ in Kontofarbe),
  kleiner Punkt in Kontofarbe; im Seitenmenü mit Name und Adresse, in den
  Mail-Einstellungen, auf der Kontoseite und bei der Absender-Auswahl
- Live-Ereignis mail mit messageId, threadId, attachmentId
- bodyMissing: „Der Inhalt wird noch vom Anbieter geladen …“ mit „Erneut
  versuchen“ und der Vorschau; das Ereignis mit derselben messageId oder
  threadId lädt die Mail neu; die Vorschau ersetzt keine volle Kopie
- 409 busy (loading) bei Anhängen: „Wird gerade geladen …“, Neuversuch nach
  retryAfter (höchstens 3-mal) oder beim Ereignis mit attachmentId;
  eingebettete Bilder laden danach neu
- Tests: MailJson (Avatar, Ereignis, busy), MailLogic (Zeichen, Ereignis,
  Wartezeit, cid)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
MailHtmlView (data:-Dokument) und MailHomeScreen (Menü-Abstände) aus #158
zusammen mit den Avataren und dem Neuladen der Bilder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
…ppen, Unterhaltung, Absender

- Breite Mails (Newsletter mit fester Tabellenbreite) passen in die Breite:
  Bilder, Tabellen, lange Links und pre bleiben im Bildschirm; was danach
  noch breiter ist, misst die WebView von außen (Inhaltsbreite, kein Skript)
  und die Mail wird per CSS zoom kleiner gesetzt (MailLogic.fitZoom, höchstens
  3 Runden, nie unter 25 %). Aufziehen zum Vergrößern bleibt möglich, die
  Mail selbst bleibt ohne Skript (JavaScript aus, CSP script-src 'none')
- „Bilder laden“: das HTML bleibt dasselbe (img/<token>), daher lud die
  WebView nicht neu. Jetzt übernimmt der State die zurückgegebene Mail und
  zählt pictureRound hoch; Antworten der Seite gehen mit Cache-Control:
  no-store, verweigerte Bilder werden nie gehalten
- Seitenmenü: ein Tipp auf die Kontozeile (mit Pfeil) klappt den Ordnerbaum
  auf und zu, das Menü bleibt offen; „Posteingang“ steht immer im Baum, erst
  die Wahl eines Ordners schließt das Menü. Der Klappzustand pro Konto bleibt
  für die Sitzung (MailRepository.folds)
- Unterhaltung: „Unterhaltung · n Mails“ mit den Absendern; ein Tipp zeigt
  alle Mails (GET threads/<id>), älteste zuerst, die geöffnete aufgeklappt,
  die neueste unten; jede andere Mail mit Absender, Datum und Vorschau
  aufklappbar, mit „Mail öffnen“
- Absender antippen: Absender-Seite mit Initialen, Name, Adresse, „Mail
  schreiben“ und „Adresse kopieren“, darunter seine Mails im Konto
  (GET search?from=, Seiten über den Cursor); Name aus contacts?q= bei
  source 'person'; Platz für die Kontaktdaten des geplanten Kontakte-Plugins
- Tests: Seitenaufbau und Skalierung, Klappzustand, Unterhaltung, Absender
  (MailLogic), State nach „Bilder laden“, Laden der Unterhaltung und der
  Absender-Mails (ViewModels), Route der Absender-Seite

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016xX1efcZF1f6G9rhmaJNLD
@CallMeTechie
CallMeTechie merged commit e015e09 into main Oct 30, 2026
9 checks passed
CallMeTechie pushed a commit that referenced this pull request Oct 31, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants