|
|
@@ -586,7 +586,36 @@ De labels eten de ruimte op die de responsive `Max Lines` veronderstelt. Bij é
|
|
|
label klopt het wel. Overweeg de labels op één regel te begrenzen, of de
|
|
|
omschrijving één regel korter.
|
|
|
|
|
|
-### 132-G · Lege lijst toont een logo i.p.v. een melding · Eigenaar: **Claude — bezig** (2026-09-23: besluit genomen, fase 1 klaar om te bouwen)
|
|
|
+### 132-G · Lege lijst toont een logo i.p.v. een melding · Eigenaar: **Claude — bezig** (2026-09-23: FASE 1 GEBOUWD, EN-test loopt)
|
|
|
+
|
|
|
+#### ✅ Fase 1 af en geverifieerd in de export (2026-09-23)
|
|
|
+
|
|
|
+- **Custom function `tweetalig(nlText, enText)`** staat er — beide argumenten
|
|
|
+ non-nullable String, return String met *Nullable* uit. Export regel 562 van
|
|
|
+ `custom_functions.dart`.
|
|
|
+- **Component `LegeLijstMelding`** (`lib/shared/lege_lijst_melding/`) —
|
|
|
+ gedupliceerd van `LegeLijstComponent`, parameters `nlTekst` + `enTekst` (beide
|
|
|
+ required String). De Text-binding werd `functions.tweetalig(widget!.nlTekst!,
|
|
|
+ widget!.enTekst!)` — **zonder `valueOrDefault`-wrapper**, precies zoals
|
|
|
+ bedoeld bij een non-nullable return.
|
|
|
+ - 💡 *Een component-parameter HERNOEMEN behoudt de binding:* `tekst` →
|
|
|
+ `nlTekst` liet de bestaande Text-binding intact, dus die hoefde niet opnieuw.
|
|
|
+- **Proefplek `MijnAanmeldingen`** — `StaggeredView` → Empty List Widget →
|
|
|
+ Widget Type *Component* → `LegeLijstMelding`, Center Component aan.
|
|
|
+ Export regel 211-217; de apostrof in "haven't" is netjes geëscaped.
|
|
|
+- `dart analyze` op de verse export: **0 errors**.
|
|
|
+
|
|
|
+**Nog te doen in fase 1:** de Engelse tak bewijzen op een toestel
|
|
|
+(`cmd locale set-app-locales com.uitgaanskrant.app --locales en-US`, daarna terug
|
|
|
+naar `nl-NL`). Truc: **uitgelogd** naar `MijnAanmeldingen` navigeren geeft een
|
|
|
+401 en dus precies de lege staat.
|
|
|
+
|
|
|
+⚠️ **Niet van ons:** de Issues-teller stond op 5 errors bij aanvang en ging naar 7
|
|
|
+tijdens deze sessie — dubbele *Upload Data action*-namen op `ButtonLogo`/
|
|
|
+`ButtonFotos` (het bekende `Duplicate Page`-patroon, van de fotoboek-sessie).
|
|
|
+`export-code` slaagt er gewoon mee, maar ze horen opgeruimd.
|
|
|
+
|
|
|
+#### Het oorspronkelijke besluit
|
|
|
|
|
|
#### ✅ BESLUIT 2026-09-23 (Bob): route A, maar met een custom FUNCTION — geen custom widget
|
|
|
|
|
|
@@ -996,6 +1025,104 @@ Een guard ("sla de fetch over als `alleXxx` al gevuld is") lost dat op, maar kos
|
|
|
een conditie in vijf actieketens — en juist die dialoog is op deze pagina fragiel.
|
|
|
Alleen doen als het in de praktijk hindert.
|
|
|
|
|
|
+### 2.0-C · Foto-editor: gebruikers tekst op hun foto laten zetten
|
|
|
+
|
|
|
+**Bob 2026-09-23:** mensen moeten hun geüploade foto kunnen bewerken — tekst erop,
|
|
|
+croppen, filters. Onderzocht op 2026-09-23; **besluit: `pro_image_editor`**, geen
|
|
|
+betaalde dienst.
|
|
|
+
|
|
|
+#### Waarom dit pakket en geen SDK-abonnement
|
|
|
+
|
|
|
+`pro_image_editor` (pub.dev, **BSD-3-Clause**, gratis ook commercieel) doet in
|
|
|
+pure Dart precies wat gevraagd is: tekstlagen (font, kleur, achtergrond,
|
|
|
+uitlijning), croppen/roteren/spiegelen, tekenen, stickers/emoji, filters, blur,
|
|
|
+lagen slepen/schalen/draaien, undo/redo. Android + iOS + web. In: `Uint8List`,
|
|
|
+uit: `Uint8List`. Gezond onderhouden: 592 likes, 160/160 pub points, ±56k
|
|
|
+downloads/maand, laatste release 6 dagen vóór de meting.
|
|
|
+
|
|
|
+De betaalde alternatieven zijn afgevallen op **architectuur, niet op prijs**:
|
|
|
+
|
|
|
+| Dienst | Prijs | Waarom niet |
|
|
|
+|---|---|---|
|
|
|
+| img.ly PhotoEditor SDK | ±$1.000-3.000/jaar | Mooiste UI, maar overkill voor tekst-op-foto |
|
|
|
+| Uploadcare | gratis tier, daarna ~$100+/mnd | Wil zélf het bestand hosten |
|
|
|
+| Filestack | vanaf ~$70/mnd | Idem |
|
|
|
+| Cloudinary | gratis tier | Transformaties via URL, géén gebruikerseditor |
|
|
|
+
|
|
|
+Die laatste drie zetten hun eigen storage naast Drupal. Wij hebben een werkende
|
|
|
+keten `bestandUpload` → `file_managed` → fotoboek, inclusief het
|
|
|
+eigenaarschapsmodel (403 op andermans fids, zie de fotoboek-notitie in
|
|
|
+`CLAUDE.md`). Een externe uploaddienst ertussen breekt dat of dupliceert het.
|
|
|
+**Webview-route (Pintura, `tui.image-editor`) ook afgevallen:** bytes heen en weer
|
|
|
+via een JS-bridge, en dat patroon heeft in dit project al eerder pijn opgeleverd.
|
|
|
+
|
|
|
+#### ⚠️ Pin op versie 12.0.0 — de laatste versie draait NIET op dit project
|
|
|
+
|
|
|
+Gemeten 2026-09-23 tegen de pub.dev-API:
|
|
|
+
|
|
|
+- **laatste is 14.3.0** en eist `sdk >=3.12.0` + `flutter >=3.44.0`;
|
|
|
+- dit project zit op **Flutter 3.35.7 / Dart 3.9.2**;
|
|
|
+- **hoogst bruikbare versie: `12.0.0`** (2026-02-13, `sdk >=3.2.2`,
|
|
|
+ `flutter >=3.35.0`) — de eerstvolgende, 13.1.0, springt al naar Dart 3.12.
|
|
|
+
|
|
|
+Exact hetzelfde patroon als bij `add_2_calendar` (zie `CLAUDE.md`): `pub get`
|
|
|
+weigert dan met een misleidende "Try using the Flutter SDK version 3.4x". Zet dus
|
|
|
+`pro_image_editor: 12.0.0` — **zonder caret**, anders trekt pub bij de eerste
|
|
|
+`pub get` alsnog 13+ binnen.
|
|
|
+
|
|
|
+Wat je mist door te pinnen: de changelog van 13.x/14.x gaat vrijwel volledig over
|
|
|
+de *tune*-editor (sliders, stacking-bug) en stijl-opties. **Niets aan de
|
|
|
+tekstfunctie**, dus voor dit doel kost het pinnen niets.
|
|
|
+
|
|
|
+#### Dependency-bumps — gemeten, alle drie veilig
|
|
|
+
|
|
|
+12.0.0 vraagt drie packages iets hoger dan `pubspec.lock` nu vastheeft. Alle drie
|
|
|
+bestaan in een versie die op Dart 3.9.2 draait, dus dit blokkeert niet:
|
|
|
+
|
|
|
+| package | project nu | 12.0.0 wil | laagste die voldoet | Dart-eis daarvan |
|
|
|
+|---|---|---|---|---|
|
|
|
+| `http` | 1.4.0 | `^1.6.0` | 1.6.0 | `^3.4.0` ✅ |
|
|
|
+| `shared_preferences` | 2.5.3 | `^2.5.4` | 2.5.4 | ✅ (t/m 2.5.5) |
|
|
|
+| `web` | 1.1.0 | `^1.1.1` | 1.1.1 | `^3.4.0` ✅ |
|
|
|
+
|
|
|
+`vector_math` (2.2.0) en `plugin_platform_interface` (2.1.8) staan al goed.
|
|
|
+**Nog niet gemeten:** of een ánder package in dit project `http` onder 1.6.0
|
|
|
+vastzet. Dat blijkt bij de eerste `pub get` in een losse exportmap.
|
|
|
+
|
|
|
+#### Hoe het in de app past
|
|
|
+
|
|
|
+Dart-pakket, dus **Custom Widget of Custom Action** in `lib/custom_code/`, met
|
|
|
+`pro_image_editor: 12.0.0` toegevoegd via de Pubspec-dependencies in de builder.
|
|
|
+De keten wordt: foto kiezen (bestaande knop) → editor openen → bewerkte bytes
|
|
|
+terug → `bestandUpload`. Dat laatste stuk draait al.
|
|
|
+
|
|
|
+Aandachtspunten die nu al bekend zijn:
|
|
|
+- **FlutterFlow's eigen mediakiezer is niet uit te breiden**
|
|
|
+ (`selectMediaWithSourceBottomSheet` is gegenereerde helper-code, zie
|
|
|
+ `CLAUDE.md`). De editor komt dus als losse stap ná het kiezen — sluit aan bij
|
|
|
+ hoe de Fotoboek/Mobiel-keuze nu al werkt (commit `e5f46e7`).
|
|
|
+- De editor levert **bytes**, geen bestand op schijf. `bestandUpload` stuurt
|
|
|
+ base64 in een JSON-body, dus dat past — maar let op `post_max_size`: een
|
|
|
+ bewerkte foto kan groter uitvallen dan het origineel. Overweeg *Max
|
|
|
+ Width/Height* op de mediakiezer.
|
|
|
+- **Alleen voor NIEUWE uploads, niet voor het fotoboek.** Een bestaande foto
|
|
|
+ bewerken betekent een tweede `file_managed`-rij (of het origineel
|
|
|
+ overschrijven, wat `file_usage` van andere nodes raakt). Buiten scope tenzij
|
|
|
+ Bob het expliciet wil.
|
|
|
+
|
|
|
+#### Nog te meten vóór dit gebouwd wordt
|
|
|
+
|
|
|
+1. **`pub get` in een losse exportmap** — resolvet 12.0.0 met de drie bumps, en
|
|
|
+ geeft `dart analyze` 0 errors? Browserloos, ±10 minuten, wijzigt niets aan het
|
|
|
+ project. (Recept: exportmap + `pubspec.lock` + `fvm use 3.35.7 -f`, zie
|
|
|
+ `CLAUDE.md`.)
|
|
|
+2. **APK-groei.** Release-APK is nu ~39 MB (arm64). Onbekend hoeveel een editor
|
|
|
+ met fonts en filters daar bovenop doet — meten met `ff-apk.sh` vóór en ná.
|
|
|
+3. **Vertaling.** De editor heeft eigen UI-teksten; 12.0.0 vraagt een
|
|
|
+ `localizationsDelegates`-regel als de app nog de SDK-`MaterialApp` gebruikt.
|
|
|
+ Nakijken of de Nederlandse labels via zijn eigen i18n-configuratie gaan (dus
|
|
|
+ níét via de globe uit `internationalization.dart`).
|
|
|
+
|
|
|
## 🔁 133 · Kopie-knop verkleinen (3 plekken) · Eigenaar: **Claude — bezig** (plan af 2026-09-22, wacht op groen licht voor de browser)
|
|
|
|
|
|
Besluit Bob 2026-09-22: de `Kopie`-knop onder de kaarten is te groot. **Variant A**
|