feat(25-shipment-presets-management): edycja, usuwanie i zarządzanie presetami przesyłek
Phase 25 complete — milestone v1.0 done: - Ikonka edycji (✎) na hover z dropdown menu - Edycja nazwy i koloru presetu w popup - "Zapisz bieżące wartości" — aktualizacja parametrów z formularza - Usuwanie z potwierdzeniem OrderProAlerts.confirm() - SCSS: dropdown, edit-icon, btn-wrap style Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
209
.paul/phases/25-shipment-presets-management/25-01-PLAN.md
Normal file
209
.paul/phases/25-shipment-presets-management/25-01-PLAN.md
Normal file
@@ -0,0 +1,209 @@
|
||||
---
|
||||
phase: 25-shipment-presets-management
|
||||
plan: 01
|
||||
type: execute
|
||||
wave: 1
|
||||
depends_on: ["24-01"]
|
||||
files_modified:
|
||||
- resources/views/shipments/prepare.php
|
||||
- resources/scss/modules/_shipment-presets.scss
|
||||
- public/assets/css/app.css
|
||||
autonomous: false
|
||||
---
|
||||
|
||||
<objective>
|
||||
## Goal
|
||||
Dodać zarządzanie presetami przesyłek: edycja nazwy/koloru/parametrów, usuwanie, z poziomu UI na stronie przygotowania przesyłki.
|
||||
|
||||
## Purpose
|
||||
Użytkownik musi móc modyfikować istniejące presety bez dostępu do bazy — zmienić nazwę, kolor, parametry lub usunąć niepotrzebne.
|
||||
|
||||
## Output
|
||||
- Menu kontekstowe na przyciskach presetów (edytuj / usuń)
|
||||
- Popup edycji presetu (ponowne użycie popupu tworzenia z pre-fill)
|
||||
- Potwierdzenie usunięcia przez OrderProAlerts.confirm()
|
||||
- Aktualizacja listy po edycji/usunięciu
|
||||
</objective>
|
||||
|
||||
<context>
|
||||
## Project Context
|
||||
@.paul/PROJECT.md
|
||||
@.paul/ROADMAP.md
|
||||
|
||||
## Prior Work
|
||||
@.paul/phases/24-shipment-presets-ui/24-01-SUMMARY.md
|
||||
|
||||
## Source Files
|
||||
@resources/views/shipments/prepare.php
|
||||
@resources/scss/modules/_shipment-presets.scss
|
||||
@src/Modules/Shipments/ShipmentPresetController.php
|
||||
</context>
|
||||
|
||||
<skills>
|
||||
No specialized flows required (sonar-scanner post-APPLY).
|
||||
</skills>
|
||||
|
||||
<acceptance_criteria>
|
||||
|
||||
## AC-1: Edycja presetu
|
||||
```gherkin
|
||||
Given istnieje preset "InPost Standard"
|
||||
When użytkownik klika prawym przyciskiem (lub ikonkę edycji) na przycisku presetu
|
||||
And wybiera "Edytuj"
|
||||
Then otwiera się popup z wypełnionymi danymi presetu (nazwa, kolor)
|
||||
When zmienia nazwę na "InPost Paczkomat" i klika Zapisz
|
||||
Then preset zostaje zaktualizowany i przycisk zmienia nazwę
|
||||
```
|
||||
|
||||
## AC-2: Zmiana parametrów presetu
|
||||
```gherkin
|
||||
Given istnieje preset z wagą 1kg
|
||||
When użytkownik wypełnia formularz nowymi wartościami (waga 2kg)
|
||||
And klika ikonkę edycji na presecie i wybiera "Zapisz bieżące wartości"
|
||||
Then preset zostaje zaktualizowany z bieżącymi wartościami formularza
|
||||
```
|
||||
|
||||
## AC-3: Usuwanie presetu
|
||||
```gherkin
|
||||
Given istnieje preset "Stary preset"
|
||||
When użytkownik klika ikonkę edycji i wybiera "Usuń"
|
||||
Then pojawia się potwierdzenie OrderProAlerts.confirm()
|
||||
When potwierdza usunięcie
|
||||
Then preset zostaje usunięty z bazy i przycisk znika z listy
|
||||
```
|
||||
|
||||
</acceptance_criteria>
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 1: SCSS — style menu kontekstowego i ikonki edycji</name>
|
||||
<files>resources/scss/modules/_shipment-presets.scss</files>
|
||||
<action>
|
||||
Dodać do istniejącego pliku SCSS:
|
||||
|
||||
- `.shipment-presets__btn-wrap` — wrapper na przycisk + ikonkę (position relative, display inline-flex)
|
||||
- `.shipment-presets__edit-icon` — ikonka edycji (mały przycisk ✎ na prawym górnym rogu):
|
||||
- Position absolute, top: -6px, right: -6px
|
||||
- Width 18px, height 18px, border-radius 50%
|
||||
- Background #fff, border: 1px solid #ddd, font-size 10px
|
||||
- Opacity 0 domyślnie, opacity 1 na hover wrappera
|
||||
- Cursor pointer, transition opacity 0.15s
|
||||
- `.shipment-presets__dropdown` — dropdown menu (position absolute):
|
||||
- Background #fff, border: 1px solid #ddd, border-radius 6px
|
||||
- Box-shadow, z-index 100, min-width 180px
|
||||
- Padding: 4px 0
|
||||
- `.shipment-presets__dropdown-item` — pozycja menu:
|
||||
- Padding: 6px 14px, font-size 13px, cursor pointer
|
||||
- Hover: background #f3f4f6
|
||||
- `&.is-danger` — color #ef4444
|
||||
|
||||
Zbudować CSS po zmianach.
|
||||
</action>
|
||||
<verify>npx sass --style=compressed build succeeds</verify>
|
||||
<done>AC-1, AC-2, AC-3 partially: style gotowe</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: JavaScript — edycja, usuwanie, dropdown menu</name>
|
||||
<files>resources/views/shipments/prepare.php</files>
|
||||
<action>
|
||||
Rozszerzyć istniejący IIFE presetów w prepare.php:
|
||||
|
||||
1. **Zmienić renderPresets()** — zamiast gołego `<button>`, renderować wrapper:
|
||||
```
|
||||
<div class="shipment-presets__btn-wrap">
|
||||
<button class="shipment-presets__btn" ...>{name}</button>
|
||||
<button class="shipment-presets__edit-icon" data-preset-id="{id}">✎</button>
|
||||
</div>
|
||||
```
|
||||
|
||||
2. **Dropdown menu** — po kliknięciu ikonki ✎, pokazać dropdown z opcjami:
|
||||
- "Edytuj nazwę i kolor" → otwiera popup z pre-fill (nazwa, kolor z presetu)
|
||||
- "Zapisz bieżące wartości" → aktualizuje preset parametrami z bieżącego formularza (carrier, usługa, wymiary itp.), zachowując nazwę i kolor
|
||||
- "Usuń" (is-danger) → OrderProAlerts.confirm(), potem DELETE API
|
||||
|
||||
3. **Rozszerzyć modal** — dodać tryb edycji:
|
||||
- Dodać hidden input `preset-edit-id` w modal
|
||||
- Jeśli edit-id > 0: modal w trybie edycji (tytuł "Edytuj przycisk dostawy", przycisk "Zapisz zmiany")
|
||||
- Jeśli edit-id = 0: modal w trybie tworzenia (jak dotychczas)
|
||||
- Pre-fill: nazwa i kolor z presetu
|
||||
|
||||
4. **Edycja nazwy/koloru (modal save):**
|
||||
- Jeśli edit-id > 0: POST /api/shipment-presets/update z id + name + color + bieżące parametry presetu (nie formularza!)
|
||||
- Jeśli edit-id = 0: POST /api/shipment-presets (tworzenie jak dotychczas)
|
||||
|
||||
5. **"Zapisz bieżące wartości":**
|
||||
- POST /api/shipment-presets/update z id, bieżącą nazwą i kolorem presetu, ale parametrami z formularza
|
||||
- Po sukcesie: reload presetów
|
||||
|
||||
6. **Usuwanie:**
|
||||
- window.OrderProAlerts.confirm({ message: 'Usunąć przycisk "' + name + '"?', onConfirm: ... })
|
||||
- POST /api/shipment-presets/delete z id w body (URLSearchParams)
|
||||
- Po sukcesie: reload presetów
|
||||
|
||||
7. **Zamknięcie dropdown** — klik poza dropdown zamyka go
|
||||
|
||||
Ważne:
|
||||
- Nie modyfikować istniejącego kodu carrier selection / status polling
|
||||
- fetch z credentials: 'same-origin'
|
||||
- URLSearchParams (nie JSON) — jak w fazie 24
|
||||
- Przechowywać presetsData w zamknięciu IIFE (już istnieje)
|
||||
</action>
|
||||
<verify>php -l resources/views/shipments/prepare.php — brak błędów</verify>
|
||||
<done>AC-1, AC-2, AC-3 satisfied</done>
|
||||
</task>
|
||||
|
||||
<task type="checkpoint:human-verify" gate="blocking">
|
||||
<what-built>Zarządzanie presetami: edycja nazwy/koloru, zapisanie bieżących wartości, usuwanie z potwierdzeniem</what-built>
|
||||
<how-to-verify>
|
||||
1. Odwiedź /orders/{id}/shipment/prepare
|
||||
2. Najedź na przycisk presetu — powinna pojawić się ikonka ✎
|
||||
3. Kliknij ✎ — dropdown z 3 opcjami
|
||||
4. "Edytuj nazwę i kolor" — popup z wypełnioną nazwą i zaznaczonym kolorem, zmień i zapisz
|
||||
5. "Zapisz bieżące wartości" — zmień wymiary w formularzu, kliknij tę opcję — preset powinien się zaktualizować
|
||||
6. "Usuń" — potwierdzenie alertem, po potwierdzeniu przycisk znika
|
||||
7. Sprawdź że kliknięcie presetu nadal autofilluje formularz
|
||||
</how-to-verify>
|
||||
<resume-signal>Type "approved" to continue, or describe issues to fix</resume-signal>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<boundaries>
|
||||
|
||||
## DO NOT CHANGE
|
||||
- src/Modules/Shipments/ShipmentPresetController.php (gotowy z fazy 23)
|
||||
- src/Modules/Shipments/ShipmentPresetRepository.php (gotowy z fazy 23)
|
||||
- routes/web.php (routing gotowy z fazy 23)
|
||||
- Istniejący JS: carrier selection, status polling, print queue
|
||||
|
||||
## SCOPE LIMITS
|
||||
- Edycja, usuwanie — brak drag & drop sortowania (out of scope)
|
||||
- Brak auto-submit po kliknięciu presetu (osobna faza/task)
|
||||
|
||||
</boundaries>
|
||||
|
||||
<verification>
|
||||
Before declaring plan complete:
|
||||
- [ ] Ikonka ✎ widoczna na hover
|
||||
- [ ] Dropdown z 3 opcjami
|
||||
- [ ] Edycja nazwy/koloru przez popup
|
||||
- [ ] "Zapisz bieżące wartości" aktualizuje parametry
|
||||
- [ ] Usuwanie z potwierdzeniem OrderProAlerts
|
||||
- [ ] Autofill nadal działa
|
||||
- [ ] php -l OK
|
||||
- [ ] SCSS zbudowany
|
||||
- [ ] Human verification passed
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
- Użytkownik może edytować nazwę i kolor presetu
|
||||
- Użytkownik może zaktualizować parametry presetu z bieżącego formularza
|
||||
- Użytkownik może usunąć preset z potwierdzeniem
|
||||
- Brak regresji w tworzeniu i autofill
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
After completion, create `.paul/phases/25-shipment-presets-management/25-01-SUMMARY.md`
|
||||
</output>
|
||||
106
.paul/phases/25-shipment-presets-management/25-01-SUMMARY.md
Normal file
106
.paul/phases/25-shipment-presets-management/25-01-SUMMARY.md
Normal file
@@ -0,0 +1,106 @@
|
||||
---
|
||||
phase: 25-shipment-presets-management
|
||||
plan: 01
|
||||
subsystem: shipments
|
||||
tags: [shipment-presets, management, edit, delete, dropdown]
|
||||
|
||||
requires:
|
||||
- phase: 24-shipment-presets-ui
|
||||
provides: Preset buttons, modal, autofill JS
|
||||
provides:
|
||||
- Edycja nazwy i koloru presetu
|
||||
- Aktualizacja parametrów presetu z bieżącego formularza
|
||||
- Usuwanie presetu z potwierdzeniem
|
||||
affects: []
|
||||
|
||||
tech-stack:
|
||||
added: []
|
||||
patterns:
|
||||
- Ikonka edycji na hover z dropdown menu (reusable UX pattern)
|
||||
|
||||
key-files:
|
||||
created: []
|
||||
modified:
|
||||
- resources/scss/modules/_shipment-presets.scss
|
||||
- public/assets/css/app.css
|
||||
- resources/views/shipments/prepare.php
|
||||
|
||||
key-decisions:
|
||||
- "Ikonka ✎ na hover z dropdown zamiast osobnych przycisków — user approved"
|
||||
- "Modal reuse: tryb create vs edit z editingPresetId flag"
|
||||
|
||||
patterns-established:
|
||||
- "Edit icon hover + dropdown menu — użytkownik chce reuse tego wzorca"
|
||||
|
||||
duration: 10min
|
||||
started: 2026-03-22T00:00:00Z
|
||||
completed: 2026-03-22T00:10:00Z
|
||||
---
|
||||
|
||||
# Phase 25 Plan 01: Shipment Presets Management Summary
|
||||
|
||||
**Zarządzanie presetami: ikonka ✎ na hover z dropdown (edytuj nazwę/kolor, zapisz bieżące wartości, usuń z potwierdzeniem).**
|
||||
|
||||
## Performance
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Duration | ~10 min |
|
||||
| Tasks | 3 completed (2 auto + 1 checkpoint) |
|
||||
| Files modified | 3 |
|
||||
|
||||
## Acceptance Criteria Results
|
||||
|
||||
| Criterion | Status | Notes |
|
||||
|-----------|--------|-------|
|
||||
| AC-1: Edycja presetu | Pass | Popup z pre-fill nazwa + kolor, zapis przez API update |
|
||||
| AC-2: Zmiana parametrów | Pass | "Zapisz bieżące wartości" aktualizuje z formularza |
|
||||
| AC-3: Usuwanie presetu | Pass | OrderProAlerts.confirm() + API delete |
|
||||
|
||||
## Accomplishments
|
||||
|
||||
- SCSS: style btn-wrap, edit-icon (hover opacity), dropdown menu, dropdown-item (z is-danger)
|
||||
- JS: renderPresets() z wrapperem + ikonką ✎, showDropdown() z 3 opcjami
|
||||
- Modal rozszerzony o tryb edycji (editingPresetId flag, pre-fill, tytuł/tekst przycisku)
|
||||
- buildFormPayload() i postPresetAPI() wydzielone dla reuse (create/edit/saveCurrentValues)
|
||||
- deletePreset() z OrderProAlerts.confirm() fallback na native confirm
|
||||
- SonarQube: 0 nowych issues
|
||||
|
||||
## Files Created/Modified
|
||||
|
||||
| File | Change | Purpose |
|
||||
|------|--------|---------|
|
||||
| `resources/scss/modules/_shipment-presets.scss` | Modified | Style dropdown, edit icon, btn-wrap |
|
||||
| `public/assets/css/app.css` | Modified | Przebudowany CSS |
|
||||
| `resources/views/shipments/prepare.php` | Modified | Dropdown menu, modal edit mode, delete, saveCurrentValues |
|
||||
|
||||
## Decisions Made
|
||||
|
||||
| Decision | Rationale | Impact |
|
||||
|----------|-----------|--------|
|
||||
| Ikonka ✎ na hover | Kompaktowe, nie zaśmieca UI | Użytkownik pochwalił — do reuse |
|
||||
| Modal reuse create/edit | Jeden popup z flagą editingPresetId | Mniej kodu, spójny UX |
|
||||
| Fallback na native confirm | OrderProAlerts może nie być dostępny | Defensywne programowanie |
|
||||
|
||||
## Deviations from Plan
|
||||
|
||||
None — plan executed exactly as written.
|
||||
|
||||
## Issues Encountered
|
||||
|
||||
None.
|
||||
|
||||
## Next Phase Readiness
|
||||
|
||||
**Ready:**
|
||||
- Milestone v1.0 kompletny — wszystkie 3 fazy done
|
||||
|
||||
**Concerns:**
|
||||
- Brak
|
||||
|
||||
**Blockers:**
|
||||
- None
|
||||
|
||||
---
|
||||
*Phase: 25-shipment-presets-management, Plan: 01*
|
||||
*Completed: 2026-03-22*
|
||||
Reference in New Issue
Block a user