feat(opslag): één lijst bestandsverbindingen, met eigen volgorde #358

Merged
brenno merged 8 commits from feat/storage-connections into main 2026-07-19 13:34:51 +00:00
Owner

De opslagsectie leverde de informatie gefragmenteerd aan: bibliotheken waren een lijst, WebDAV was er precies één en git ook precies één. Dezelfde vraag — waar staat het werk van deze klant? — werd met twee UI-idiomen beantwoord, en voor twee opdrachtgevers naast elkaar werken kon simpelweg niet.

Wat er verandert

AppSettings.connections is nu de enige bron van waarheid: één lijst waarin lokale mappen, WebDAV-servers en git-repositories door elkaar staan, in de volgorde die de gebruiker zelf sleept. Die volgorde is geen cosmetica — de bovenste bruikbare verbinding van een soort is de standaard voor die soort, dus bovenaan zetten is hoe je zegt welke server de server is, zonder configuratie weg te gooien.

libraries, webdavServer en gitRepo blijven bestaan als afgeleide getters. Daardoor bleven alle open- en opslaanflows ongemoeid en beperkt de diff zich tot de opslaglaag.

Voor WebDAV is de keuze ook echt doorgevoerd: providers per verbinding gekeyd (ook de listing, want twee servers met dezelfde mapnaam serveerden elkaars inhoud uit de cache), en WebdavOrigin draagt een connectionId. De kiezer blijft uit de weg: bij één verbinding verschijnt er geen dialoog, en een deck dat van een verbinding kwam gaat daar zonder vragen naartoe terug.

Migratie

De drie oude prefs-sleutels worden bij het laden omgezet, bibliotheken eerst, zodat wat de standaard was de standaard blijft. Ze worden pas bij de eerste wijziging opgeruimd — terugvallen op een oudere build kost dus niets. Een leeggemaakte lijst blijft leeg, anders kwam de opruiming van de gebruiker elke start terug.

Nog niet hierin

De git-kant van de kiezer volgt apart, want daar zit eerst een bestaande bug in de weg: git_outbox:: en git_draft:: bevatten de repo niet, dus twee git-verbindingen zouden één wachtrij delen en een flush duwt alles naar de op dat moment actieve forge. Dat vraagt een migratie van niet-gepushte commits en hoort een eigen review te krijgen.

Controle

make check volledig groen: 3439 tests, dekking 79,2%. Nieuwe tests leggen de migratie vast, de regel dat de bovenste van een soort de standaard is, dat een leeggemaakte lijst leeg blijft, en dat één onleesbare regel de andere bronnen niet onbereikbaar maakt.

🤖 Generated with Claude Code

De opslagsectie leverde de informatie gefragmenteerd aan: bibliotheken waren een lijst, WebDAV was er precies één en git ook precies één. Dezelfde vraag — waar staat het werk van deze klant? — werd met twee UI-idiomen beantwoord, en voor twee opdrachtgevers naast elkaar werken kon simpelweg niet. ## Wat er verandert `AppSettings.connections` is nu de enige bron van waarheid: één lijst waarin lokale mappen, WebDAV-servers en git-repositories door elkaar staan, in de volgorde die de gebruiker zelf sleept. Die volgorde is geen cosmetica — de bovenste bruikbare verbinding van een soort is de standaard voor die soort, dus bovenaan zetten is hoe je zegt welke server *de* server is, zonder configuratie weg te gooien. `libraries`, `webdavServer` en `gitRepo` blijven bestaan als afgeleide getters. Daardoor bleven alle open- en opslaanflows ongemoeid en beperkt de diff zich tot de opslaglaag. Voor WebDAV is de keuze ook echt doorgevoerd: providers per verbinding gekeyd (ook de listing, want twee servers met dezelfde mapnaam serveerden elkaars inhoud uit de cache), en `WebdavOrigin` draagt een `connectionId`. De kiezer blijft uit de weg: bij één verbinding verschijnt er geen dialoog, en een deck dat van een verbinding kwam gaat daar zonder vragen naartoe terug. ## Migratie De drie oude prefs-sleutels worden bij het laden omgezet, bibliotheken eerst, zodat wat de standaard was de standaard blijft. Ze worden pas bij de eerste wijziging opgeruimd — terugvallen op een oudere build kost dus niets. Een leeggemaakte lijst blijft leeg, anders kwam de opruiming van de gebruiker elke start terug. ## Nog niet hierin De git-kant van de kiezer volgt apart, want daar zit eerst een bestaande bug in de weg: `git_outbox::` en `git_draft::` bevatten de repo niet, dus twee git-verbindingen zouden één wachtrij delen en een flush duwt alles naar de op dat moment actieve forge. Dat vraagt een migratie van niet-gepushte commits en hoort een eigen review te krijgen. ## Controle `make check` volledig groen: 3439 tests, dekking 79,2%. Nieuwe tests leggen de migratie vast, de regel dat de bovenste van een soort de standaard is, dat een leeggemaakte lijst leeg blijft, en dat één onleesbare regel de andere bronnen niet onbereikbaar maakt. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Lokale mappen, WebDAV-servers en git-repositories waren drie losse
begrippen: een lijst, een singleton en nog een singleton. Wie voor twee
opdrachtgevers werkt kon daardoor niet twee servers naast elkaar zetten,
en de instellingen vertelden hetzelfde verhaal op twee manieren.

StorageConnection maakt er één soort ding van, met een stabiele id zodat
hernoemen een geopend deck niet losweekt van zijn bron. Geheimen blijven
in de keychain, gekeyd op server + gebruiker — twee verbindingen naar
hetzelfde account delen dus één wachtwoord, wat klopt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
De opslagsectie toonde bibliotheken als lijst en WebDAV en git als twee
losse singletons. Dezelfde vraag — waar staat het werk van deze klant? —
werd daardoor met twee UI-idiomen beantwoord, en meerdere servers naast
elkaar konden simpelweg niet.

AppSettings.connections is nu de bron van waarheid; libraries,
webdavServer en gitRepo blijven als afgeleide getters bestaan zodat de
open- en opslaanflows ongemoeid doorlopen. Ze lezen de bovenste bruikbare
verbinding van hun soort, waardoor de sleepvolgorde meteen betekenis
krijgt: bovenaan zetten is hoe je zegt welke server de standaard is.

De migratie laat de oude prefs-sleutels staan tot de eerste mutatie, zodat
terugvallen op een oudere versie niets kost.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
De opslagtab-tests legden de oude tweedeling vast (bibliotheken plus drie
vaste opslagwijzen). Ze toetsen nu de lijst zelf, inclusief het punt dat
stil kan misgaan: de volgorde bepaalt naar welke server de app schrijft,
dus een lijst die verkeerd terugkomt levert geen foutmelding maar werk bij
de verkeerde klant.

Ook de knop "Verbinding toevoegen" is een echte menuknop geworden in
plaats van een AbsorbPointer om een uitgeschakelde knop — die constructie
liet tap() in tests naast het doel landen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
De migratie uit de drie oude prefs-sleutels en de regel "bovenste
bruikbare van een soort is de standaard" waren het nieuwe gedrag waar nog
niets op stond. Ook vastgelegd: een leeggemaakte lijst blijft leeg (anders
komt de opruiming van de gebruiker elke start terug) en één onleesbare
regel maakt de andere bronnen niet onbereikbaar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Met meerdere WebDAV-verbindingen moet elke actie weten naar welke server
hij gaat. De providers zijn daarom per verbinding gekeyd — ook de listing,
want twee servers met dezelfde mapnaam leverden elkaars inhoud uit de
cache.

De keuze zelf blijft uit de weg: bij één verbinding verschijnt er geen
dialoog, en een deck dat van een verbinding kwam gaat daar zonder vragen
naartoe terug. WebdavOrigin draagt daarvoor het verbindings-id, dat gelijk
blijft als de gebruiker de naam of een typefout in de URL herstelt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
settings.dart liep over de bestandsgrens van 1000 regels. AppAppearanceProfile
is de schoonste snede: het stuurt hoe het programma eruitziet, waar
ThemeProfile stuurt hoe een slide eruitziet en meereist in het deck.

Een part en geen los bestand, want als extensie zouden de afgeleide
getters een extra import eisen van elke aanroeper die AppSettings nu
zonder import gebruikt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
docs(opslag): de verbindingenlijst beschreven
Some checks failed
CI / Gate (Linux) · Format · Analyze · Coverage (push) Has been cancelled
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Web hardening (push) Has been cancelled
CI / Docs links (push) Has been cancelled
CI / Supply-chain (Trivy · advisory) (push) Has been cancelled
CI / Gate (Linux) · Format · Analyze · Coverage (pull_request) Has been cancelled
CI / Test (macos-latest) (pull_request) Has been cancelled
CI / Test (windows-latest) (pull_request) Has been cancelled
CI / Web hardening (pull_request) Has been cancelled
CI / Docs links (pull_request) Has been cancelled
CI / Supply-chain (Trivy · advisory) (pull_request) Has been cancelled
f8736a7dab
USER_GUIDE beschreef nog "Storage methods" met één regel per techniek en
verwees naar tabbladen die niet meer bestaan. SOURCE_MAP kende het nieuwe
model, de per-verbinding gekeyde providers en de kiezer nog niet.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brenno merged commit 7a30f7fcce into main 2026-07-19 13:34:51 +00:00
brenno deleted branch feat/storage-connections 2026-07-19 13:34:52 +00:00
Sign in to join this conversation.
No description provided.