Fixes static container admin edit flow by preserving id in hiddenFields and adding route-id fallback during save. Adds regression tests for edit/create id behavior, updates release docs (changelog/testing/CLAUDE), and appends SonarQube open issues to docs/TODO. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
158 lines
5.2 KiB
Markdown
158 lines
5.2 KiB
Markdown
---
|
|
phase: 15-scontainers-edit-save-fix
|
|
plan: 01
|
|
type: execute
|
|
wave: 1
|
|
depends_on: []
|
|
files_modified:
|
|
- autoload/admin/Controllers/ScontainersController.php
|
|
- tests/Unit/admin/Controllers/ScontainersControllerTest.php
|
|
autonomous: true
|
|
delegation: off
|
|
---
|
|
|
|
<objective>
|
|
## Goal
|
|
Naprawic regresje w edycji kontenerow statycznych: zapis edytowanego rekordu nie moze tworzyc nowego wpisu.
|
|
|
|
## Purpose
|
|
Administrator musi miec pewnosc, ze edycja kontenera aktualizuje istniejace ID. Obecny blad powoduje duplikaty i ryzyko niespojnych tresci.
|
|
|
|
## Output
|
|
- Poprawiony flow zapisu w `ScontainersController`, ktory zawsze przekazuje poprawne `id` przy edycji
|
|
- Testy jednostkowe zabezpieczajace przed powrotem regresji
|
|
</objective>
|
|
|
|
<context>
|
|
## Project Context
|
|
@.paul/PROJECT.md
|
|
@.paul/ROADMAP.md
|
|
@.paul/STATE.md
|
|
|
|
## Source Files
|
|
@autoload/admin/Controllers/ScontainersController.php
|
|
@admin/templates/components/form-edit.php
|
|
@autoload/admin/ViewModels/Forms/FormEditViewModel.php
|
|
@autoload/admin/Support/Forms/FormRequestHandler.php
|
|
@tests/Unit/admin/Controllers/ScontainersControllerTest.php
|
|
</context>
|
|
|
|
<skills>
|
|
## Required Skills (from SPECIAL-FLOWS.md)
|
|
|
|
| Skill | Priority | When to Invoke | Loaded? |
|
|
|-------|----------|----------------|---------|
|
|
| /feature-dev | required | Before implementation in APPLY | ○ |
|
|
| /koniec-pracy | required | After implementation/release wrap-up | ○ |
|
|
|
|
**BLOCKING:** Required skills MUST be loaded before APPLY proceeds.
|
|
Run each skill command or confirm already loaded.
|
|
|
|
## Skill Invocation Checklist
|
|
- [ ] /feature-dev loaded (run command or confirm)
|
|
- [ ] /koniec-pracy loaded (run command or confirm)
|
|
|
|
</skills>
|
|
|
|
<acceptance_criteria>
|
|
|
|
## AC-1: Edycja nie tworzy nowego kontenera
|
|
```gherkin
|
|
Given istnieje kontener statyczny o ID 9
|
|
When admin wejdzie w /admin/scontainers/edit/id=9 i kliknie "Zatwierdz"
|
|
Then rekord o ID 9 zostanie zaktualizowany
|
|
And nie powstanie nowy rekord w pp_scontainers
|
|
```
|
|
|
|
## AC-2: Tworzenie nowego kontenera nadal dziala
|
|
```gherkin
|
|
Given admin otwiera /admin/scontainers/edit/ bez ID
|
|
When wypelni dane i kliknie "Zatwierdz"
|
|
Then zapis utworzy nowy rekord w pp_scontainers
|
|
```
|
|
|
|
## AC-3: API legacy JSON pozostaje bez zmian
|
|
```gherkin
|
|
Given zapis kontenera odbywa sie przez legacy payload values (JSON)
|
|
When wywolywana jest sciezka legacy w ScontainersController::save()
|
|
Then zachowanie insert/update pozostaje zgodne z dotychczasowa logika
|
|
```
|
|
|
|
</acceptance_criteria>
|
|
|
|
<tasks>
|
|
|
|
<task type="auto">
|
|
<name>Task 1: Utrwalic przekazywanie ID w nowym formularzu scontainers</name>
|
|
<files>autoload/admin/Controllers/ScontainersController.php</files>
|
|
<action>
|
|
W `buildFormViewModel()` przeniesc `id` do `hiddenFields` (FormEditViewModel),
|
|
tak aby pole `id` bylo renderowane niezaleznie od zakladek.
|
|
|
|
W `save()` dodac defensywny fallback: jesli `data['id']` z requestu jest puste,
|
|
pobrac `id` z parametru trasy (`Helpers::get('id')`) i uzyc go przy zapisie.
|
|
|
|
Nie zmieniac flow legacy (`values` JSON) ani logiki repozytorium.
|
|
</action>
|
|
<verify>Manual check: edycja /admin/scontainers/edit/id=9 aktualizuje rekord 9 zamiast tworzyc nowy</verify>
|
|
<done>AC-1 i AC-3 satisfied</done>
|
|
</task>
|
|
|
|
<task type="auto">
|
|
<name>Task 2: Dodac test regresyjny dla formularza i mapowania ID</name>
|
|
<files>tests/Unit/admin/Controllers/ScontainersControllerTest.php</files>
|
|
<action>
|
|
Rozszerzyc testy kontrolera o przypadki potwierdzajace, ze formularz edycji
|
|
niesie `id` jako hidden field oraz ze flow zapisu potrafi odczytac ID rekordu
|
|
dla przypadku edycji.
|
|
|
|
Uzyc Reflection tam, gdzie potrzeba dostepu do prywatnych metod (zgodnie z obecnym stylem testow).
|
|
</action>
|
|
<verify>./test.ps1 tests/Unit/admin/Controllers/ScontainersControllerTest.php</verify>
|
|
<done>AC-1 covered by automated tests</done>
|
|
</task>
|
|
|
|
<task type="auto">
|
|
<name>Task 3: Zweryfikowac brak regresji create flow</name>
|
|
<files>autoload/admin/Controllers/ScontainersController.php, tests/Unit/admin/Controllers/ScontainersControllerTest.php</files>
|
|
<action>
|
|
Potwierdzic, ze nowy kontener (brak `id` w URL i formularzu) nadal tworzy nowy rekord.
|
|
Dostosowac warunki fallbacku tak, by nie wymuszaly update przy create.
|
|
</action>
|
|
<verify>Manual check: /admin/scontainers/edit/ -> Zatwierdz tworzy nowe ID</verify>
|
|
<done>AC-2 satisfied</done>
|
|
</task>
|
|
|
|
</tasks>
|
|
|
|
<boundaries>
|
|
|
|
## DO NOT CHANGE
|
|
- autoload/Domain/Scontainers/ScontainersRepository.php (brak zmian logiki insert/update na poziomie repo)
|
|
- admin/templates/components/form-edit.php (bez globalnych zmian w uniwersalnym komponencie)
|
|
- Inne kontrolery admin poza ScontainersController
|
|
|
|
## SCOPE LIMITS
|
|
- Zakres tylko dla problemu edycji kontenerow statycznych (scontainers)
|
|
- Bez refaktoryzacji calego systemu FormEdit
|
|
|
|
</boundaries>
|
|
|
|
<verification>
|
|
Before declaring plan complete:
|
|
- [ ] ./test.ps1 tests/Unit/admin/Controllers/ScontainersControllerTest.php
|
|
- [ ] Manual: edycja istniejacego kontenera nie tworzy nowego rekordu
|
|
- [ ] Manual: tworzenie nowego kontenera nadal dziala
|
|
- [ ] All acceptance criteria met
|
|
</verification>
|
|
|
|
<success_criteria>
|
|
- Blad edycji kontenerow statycznych nie wystepuje
|
|
- Test regresyjny przechodzi
|
|
- Brak regresji w create flow dla scontainers
|
|
</success_criteria>
|
|
|
|
<output>
|
|
After completion, create `.paul/phases/15-scontainers-edit-save-fix/15-01-SUMMARY.md`
|
|
</output>
|