Forráskód Böngészése

2.0-C: foto-editor onderzocht — pro_image_editor, gepind op 12.0.0

Onderzoek naar een foto-editor waarmee gebruikers tekst op hun foto
kunnen zetten. Keuze: pro_image_editor (BSD-3-Clause, gratis), geen
betaalde SDK — die willen alle drie zelf het bestand hosten en dat
breekt de bestaande bestandUpload -> file_managed -> fotoboek-keten.

Gemeten tegen de pub.dev-API: de laatste versie (14.3.0) eist Dart 3.12
/ Flutter 3.44 en draait dus niet op dit project (3.9.2 / 3.35.7).
Hoogst bruikbare is 12.0.0 — zelfde val als add_2_calendar. De drie
dependency-bumps die 12.0.0 vraagt (http, shared_preferences, web)
bestaan alle drie in een versie die op Dart 3.9.2 draait.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 1 napja
szülő
commit
397757562e
1 módosított fájl, 128 hozzáadás és 1 törlés
  1. 128 1
      TASKS.md

+ 128 - 1
TASKS.md

@@ -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**