Sluiten en herstellen kennen alleen presentaties: een documenttabblad breekt op 'Opslaan' #1614

Closed
opened 2026-08-20 16:02:38 +00:00 by brenno · 0 comments
Owner

De tabbladlaag kent sinds de documentmodus twee soorten, maar de sluit- en herstelmeldingen zijn nooit meegegroeid. Ze noemen alles een presentatie — en op één plek is het meer dan de bewoording: daar loopt het pad voor een document stuk.

1. Een vuil documenttabblad sluiten met "Opslaan" gooit een StateError

requestCloseTab (lib/widgets/shell/shell_actions.dart) hangt aan het kruisje in de tabbalk en aan het 'alleen afspelen'-scherm. Voor élk vuil tabblad — ook een document — toont het de bevestiging, en op de keuze Opslaan doet het:

final saved = await saveDeckWithDestination(context, ref, tab.deckNotifier);

TabInfo.deckNotifier (lib/state/tabs_provider_tab_info.dart) gooit voor een documenttabblad met opzet:

DocumentTabContent() => throw StateError('deckNotifier opgevraagd op een documenttabblad'),

Er staat geen soort-poort vóór die aanroep, en het kruisje wordt voor een documenttabblad niet verborgen. Wie dus een gewijzigd document sluit en kiest voor opslaan, krijgt geen opslag en geen gesloten tabblad — het pad breekt af.

De juiste ingang bestaat al: saveTabWithDestination (lib/widgets/shell/shell_actions_connections.dart) routeert op soort en wordt gebruikt door de app-brede Cmd/Ctrl+S en de opslaan-bij-afsluiten-lus. Alleen deze plek gaat er nog omheen.

Gelezen in de code op main, niet nagespeeld in de draaiende app; de regressietest hoort bij de reparatie.

2. Drie meldingen noemen een document een presentatie

  • Het herstel-dialoog bij opstart (lib/widgets/app_shell.dart, _maybeRestore): "Er zijn 2 presentaties met niet-opgeslagen wijzigingen gevonden van een vorige sessie" — terwijl beide momentopnames kind: document droegen. Met eigen ogen gezien; de twee .json-bestanden in recovery/ zeggen allebei "kind": "document".
  • De lijst in datzelfde dialoog toont per regel alleen label · tijdstip. RecoverySnapshot.kind is er, en de tabbalk en de recente-lijst tónen die soort al met een pictogram. Hier niet, terwijl je juist daar kiest wat je terughaalt.
  • Het afsluitscherm (onWindowClose): "Er zijn presentaties met niet-opgeslagen wijzigingen. Sla ze op voordat de app sluit." Die lus loopt over anyDirty, dus over beide soorten.
  • De sluitbevestiging per tabblad: "Deze presentatie heeft niet-opgeslagen wijzigingen. Sla de presentatie op voordat het tabblad sluit."

Wie in de documentmodus werkt, krijgt bij het afsluiten dus een waarschuwing over presentaties die hij niet open heeft staan — en moet zelf bedenken dat het over zijn notitie gaat.

3. Meegenomen: die tekst is niet vertaalbaar zoals hij nu staat

De meervoudsregel wordt uit drie stukken geplakt met het getal ertussen:

'${l10n.d('Er zijn')} ${snapshots.length} ${l10n.d('presentaties met niet-opgeslagen wijzigingen gevonden van een vorige sessie:')}'

Dat legt de Nederlandse woordvolgorde op aan 31 talen en laat geen ruimte voor talen met een andere meervoudsvorm of een ander telwoordgedrag. Wie deze meldingen tóch aanraakt, kan er beter één string met een plaatshouder van maken.

Wat een oplossing moet doen

  • requestCloseTab langs saveTabWithDestination laten lopen in plaats van langs tab.deckNotifier — één regel, mét een regressietest die een vuil documenttabblad sluit en op Opslaan klikt.
  • De vier meldingen de soort laten noemen: enkelvoud per soort waar het er één is, en een neutrale formulering ("bestanden", of geteld per soort) waar het er meer zijn van beide soorten. De momentopname draagt de soort al; er hoeft niets bij op schijf.
  • De lijst in het herstel-dialoog het pictogram van zijn soort geven, gelijk aan de tabbalk.

Nieuwe zichtbare tekst betekent 31 vertalingen (make add-l10n), dus de kosten zitten daar en niet in de logica.

Gevonden tijdens het onderzoek naar de niet-opgeslagen-stip (#1611).

De tabbladlaag kent sinds de documentmodus twee soorten, maar de sluit- en herstelmeldingen zijn nooit meegegroeid. Ze noemen alles een presentatie — en op één plek is het meer dan de bewoording: daar loopt het pad voor een document stuk. ## 1. Een vuil documenttabblad sluiten met "Opslaan" gooit een StateError `requestCloseTab` (`lib/widgets/shell/shell_actions.dart`) hangt aan het kruisje in de tabbalk en aan het 'alleen afspelen'-scherm. Voor élk vuil tabblad — ook een document — toont het de bevestiging, en op de keuze *Opslaan* doet het: ```dart final saved = await saveDeckWithDestination(context, ref, tab.deckNotifier); ``` `TabInfo.deckNotifier` (`lib/state/tabs_provider_tab_info.dart`) gooit voor een documenttabblad met opzet: ```dart DocumentTabContent() => throw StateError('deckNotifier opgevraagd op een documenttabblad'), ``` Er staat geen soort-poort vóór die aanroep, en het kruisje wordt voor een documenttabblad niet verborgen. Wie dus een gewijzigd document sluit en kiest voor opslaan, krijgt geen opslag en geen gesloten tabblad — het pad breekt af. De juiste ingang bestaat al: `saveTabWithDestination` (`lib/widgets/shell/shell_actions_connections.dart`) routeert op soort en wordt gebruikt door de app-brede Cmd/Ctrl+S en de opslaan-bij-afsluiten-lus. Alleen deze plek gaat er nog omheen. *Gelezen in de code op `main`, niet nagespeeld in de draaiende app; de regressietest hoort bij de reparatie.* ## 2. Drie meldingen noemen een document een presentatie - **Het herstel-dialoog bij opstart** (`lib/widgets/app_shell.dart`, `_maybeRestore`): *"Er zijn 2 presentaties met niet-opgeslagen wijzigingen gevonden van een vorige sessie"* — terwijl beide momentopnames `kind: document` droegen. Met eigen ogen gezien; de twee `.json`-bestanden in `recovery/` zeggen allebei `"kind": "document"`. - **De lijst in datzelfde dialoog** toont per regel alleen `label · tijdstip`. `RecoverySnapshot.kind` is er, en de tabbalk en de recente-lijst tónen die soort al met een pictogram. Hier niet, terwijl je juist daar kiest wat je terughaalt. - **Het afsluitscherm** (`onWindowClose`): *"Er zijn presentaties met niet-opgeslagen wijzigingen. Sla ze op voordat de app sluit."* Die lus loopt over `anyDirty`, dus over beide soorten. - **De sluitbevestiging per tabblad**: *"Deze presentatie heeft niet-opgeslagen wijzigingen. Sla de presentatie op voordat het tabblad sluit."* Wie in de documentmodus werkt, krijgt bij het afsluiten dus een waarschuwing over presentaties die hij niet open heeft staan — en moet zelf bedenken dat het over zijn notitie gaat. ## 3. Meegenomen: die tekst is niet vertaalbaar zoals hij nu staat De meervoudsregel wordt uit drie stukken geplakt met het getal ertussen: ```dart '${l10n.d('Er zijn')} ${snapshots.length} ${l10n.d('presentaties met niet-opgeslagen wijzigingen gevonden van een vorige sessie:')}' ``` Dat legt de Nederlandse woordvolgorde op aan 31 talen en laat geen ruimte voor talen met een andere meervoudsvorm of een ander telwoordgedrag. Wie deze meldingen tóch aanraakt, kan er beter één string met een plaatshouder van maken. ## Wat een oplossing moet doen - `requestCloseTab` langs `saveTabWithDestination` laten lopen in plaats van langs `tab.deckNotifier` — één regel, mét een regressietest die een vuil documenttabblad sluit en op *Opslaan* klikt. - De vier meldingen de soort laten noemen: enkelvoud per soort waar het er één is, en een neutrale formulering ("bestanden", of geteld per soort) waar het er meer zijn van beide soorten. De momentopname draagt de soort al; er hoeft niets bij op schijf. - De lijst in het herstel-dialoog het pictogram van zijn soort geven, gelijk aan de tabbalk. Nieuwe zichtbare tekst betekent 31 vertalingen (`make add-l10n`), dus de kosten zitten daar en niet in de logica. Gevonden tijdens het onderzoek naar de niet-opgeslagen-stip (#1611).
brenno 2026-08-20 17:57:38 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#1614
No description provided.