--- 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 --- ## 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 ## 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 No specialized flows required (sonar-scanner post-APPLY). ## 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 ``` Task 1: SCSS — style menu kontekstowego i ikonki edycji resources/scss/modules/_shipment-presets.scss 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. npx sass --style=compressed build succeeds AC-1, AC-2, AC-3 partially: style gotowe Task 2: JavaScript — edycja, usuwanie, dropdown menu resources/views/shipments/prepare.php Rozszerzyć istniejący IIFE presetów w prepare.php: 1. **Zmienić renderPresets()** — zamiast gołego ` ``` 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) php -l resources/views/shipments/prepare.php — brak błędów AC-1, AC-2, AC-3 satisfied Zarządzanie presetami: edycja nazwy/koloru, zapisanie bieżących wartości, usuwanie z potwierdzeniem 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 Type "approved" to continue, or describe issues to fix ## 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) 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 - 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 After completion, create `.paul/phases/25-shipment-presets-management/25-01-SUMMARY.md`