diff --git a/.paul/ROADMAP.md b/.paul/ROADMAP.md index e30daa1..fe82d56 100644 --- a/.paul/ROADMAP.md +++ b/.paul/ROADMAP.md @@ -40,6 +40,7 @@ Status: Planning | 17 | Cart summary transport cost fix | 1 | Done | 2026-04-20 | | 18 | Google feed permutation URL fix | 1 | Done | 2026-04-30 | | 19 | Frontend meta tags fix (category + product) | 1 | Done | 2026-05-13 | +| 20 | Category edit mojibake fix (UI labels) | 1 | Done | 2026-05-13 | ## Feature @@ -140,4 +141,13 @@ Status: Planning **Scope:** Diagnostyka (pp_routes + meta w DB + sesyjny $page), checkpoint:decision z 4 opcjami fixu (routes/engine/data/session), implementacja wybranej opcji w `LayoutEngine.php` lub `index.php`, test jednostkowy, human-verify na 3 URL-ach. --- -*Last updated: 2026-05-13 (Phase 19 complete)* +### Phase 20 — Category edit mojibake fix + +**Problem:** Etykiety formularza edycji kategorii (`/admin/shop_category/category_edit/id=X`) pokazują double-encoded UTF-8 mojibake: `Treść` zamiast "Treść", `JÄ™zyk domyĹ›lny` zamiast "Język domyślny", `Sortowanie produktĂłw` zamiast "Sortowanie produktów" itp. + +**Root cause:** Plik `admin/templates/shop-category/category-edit.php` został kiedyś zapisany z UTF-8 zinterpretowanym jako Windows-1252 i ponownie zakodowanym do UTF-8. 9 wystąpień. To JEDYNY taki plik w całym repo — grep `Ä[\x{84}-\x{99}]|Ĺ|Ăł` po całym `admin/templates/`, `templates/`, `autoload/` nie wskazuje innych dotknietych plików. + +**Scope:** Podmienić 9 hardcoded labelek na poprawne polskie znaki (Treść, Język domyślny, Tytuł, rozwinięcie, Sortowanie produktów, Wyświetlić podkategorie, Blokuj indeksację). Brak zmian w logice/HTML structure, plik zostaje UTF-8 bez BOM. Human-verify w panelu admina. + +--- +*Last updated: 2026-05-13 (Phase 20 complete)* diff --git a/.paul/STATE.md b/.paul/STATE.md index 0c801e8..c9bd2ed 100644 --- a/.paul/STATE.md +++ b/.paul/STATE.md @@ -5,19 +5,19 @@ See: .paul/PROJECT.md (updated 2026-04-30) **Core value:** Właściciel sklepu ma pełną kontrolę nad sprzedażą online w jednym systemie pisanym od podstaw, bez narzutów zewnętrznych platform. -**Current focus:** Phase 19 complete — loop closed +**Current focus:** Phase 20 complete — loop closed ## Current Position Milestone: Hotfix -Phase: 19 of 19 (Frontend meta tags fix) — Complete -Plan: 19-01 complete +Phase: 20 of 20 (Category edit mojibake fix) — Complete +Plan: 20-01 complete Status: UNIFY complete, ready for next PLAN loop (transition-phase git commit pending) -Last activity: 2026-05-13 — Closed loop for .paul/phases/19-frontend-meta-tags-fix/19-01-PLAN.md +Last activity: 2026-05-13 — Closed loop for .paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md Progress: - Milestone: [##########] 100% (Hotfix rolling) -- Phase 19: [##########] 100% +- Phase 20: [##########] 100% ## Loop Position @@ -45,10 +45,15 @@ Phase 16: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-04-19] Phase 17: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-04-20] Phase 18: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-04-30] Phase 19: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-05-13] +Phase 20: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-05-13] ``` ## Accumulated Context ### Decisions +- 2026-05-13: Phase 20 loop closed with SUMMARY at .paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md +- 2026-05-13: Transition-phase git commit for Phase 20 not executed in this UNIFY run (deferred — pattern z faz 15-19) +- 2026-05-13: Phase 20 APPLY complete — 9 wystąpień mojibake w admin/templates/shop-category/category-edit.php naprawionych (Treść, Język domyślny x2, rozwinięcie, Sortowanie produktów, Wyświetlić podkategorie, Tytuł kategorii, Blokuj indeksację); suita 846 zielona; human-verify approved +- 2026-05-13: Created Phase 20 plan at .paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md — fix mojibake w labelkach formularza edycji kategorii (double-encoded UTF-8 w admin/templates/shop-category/category-edit.php, 9 wystąpień, jedyny dotknięty plik w repo) - 2026-05-13: Phase 19 loop closed with SUMMARY at .paul/phases/19-frontend-meta-tags-fix/19-01-SUMMARY.md - 2026-05-13: Transition-phase git commit for Phase 19 not executed in this UNIFY run (deferred — pattern z faz 15/16/17/18) - 2026-05-13: Phase 19 APPLY complete — LayoutEngine.php zmodyfikowany (3 gałęzie + nowa metoda applyEntityMetaToPage), test LayoutEngineMetaTagsTest 5 testów/18 asercji, suita 846 zielona; weryfikacja na produkcji (curl) pokazuje poprawne tytuły dla /sen-i-otulenie, /kocyk-niemowlaka-... i / @@ -103,17 +108,17 @@ None. ### Blockers/Concerns None. -### Skill Audit (Phase 19) +### Skill Audit (Phase 20) | Expected | Invoked | Notes | |----------|---------|-------| -| /feature-dev | ○ | User-approved override (hotfix z konkretną instrukcją) | -| /koniec-pracy | ○ | Pending — uruchomić przy zakończeniu sesji jeśli release wchodzi do update package | +| /feature-dev | ○ | Trivialny fix labelek — override per pattern poprzednich faz | +| /koniec-pracy | ○ | Pending — uruchomić przy release update package | ## Session Continuity Last session: 2026-05-13 -Stopped at: Phase 19 complete, loop closed +Stopped at: Phase 20 complete, loop closed Next action: Start next phase plan (transition-phase git commit pending), lub uruchomić /koniec-pracy jeśli zamykamy sesję -Resume file: .paul/phases/19-frontend-meta-tags-fix/19-01-SUMMARY.md +Resume file: .paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md --- *STATE.md — Updated after every significant action* diff --git a/.paul/changelog/2026-05-13.md b/.paul/changelog/2026-05-13.md index 09089f2..aea17c8 100644 --- a/.paul/changelog/2026-05-13.md +++ b/.paul/changelog/2026-05-13.md @@ -9,9 +9,15 @@ - Task 4 (human-verify): Weryfikacja curl na produkcji — 3 strony pokazują 3 różne ``, homepage meta nie wycieka - .gitignore — dodano `temp/` (skrypty diagnostyczne z DB credentials) +- [Phase 20, Plan 01] Fix mojibake (double-encoded UTF-8) w labelkach formularza edycji kategorii +- Task 1: Podmiana 9 wystąpień mojibake na poprawne polskie znaki (Treść, Język domyślny, Tytuł kategorii, Sortowanie produktów, Wyświetlić podkategorie, Blokuj indeksację, Opis kategorii rozwinięcie) +- Task 2: Weryfikacja braku regresji (grep w całym repo — 0 innych plików dotkniętych), suita 846 zielona +- Task 3 (human-verify): Weryfikacja w panelu admina shoppro.project-dc.pl approved + ## Zmienione pliki - `autoload/front/LayoutEngine.php` +- `admin/templates/shop-category/category-edit.php` - `tests/Unit/front/LayoutEngineMetaTagsTest.php` (nowy) - `.paul/phases/19-frontend-meta-tags-fix/19-01-PLAN.md` (nowy) - `.paul/phases/19-frontend-meta-tags-fix/19-01-SUMMARY.md` (nowy) diff --git a/.paul/docs/TECH_CHANGELOG.md b/.paul/docs/TECH_CHANGELOG.md index bdb5dd3..acefae4 100644 --- a/.paul/docs/TECH_CHANGELOG.md +++ b/.paul/docs/TECH_CHANGELOG.md @@ -2,6 +2,12 @@ > Chronologiczny log zmian technicznych — co i dlaczego. +## v0.352 (2026-05-13) + +- Naprawiono mojibake w labelkach formularza edycji kategorii w panelu admina (`/admin/shop_category/category_edit/id=X`). Plik `admin/templates/shop-category/category-edit.php` byl kiedys zapisany z UTF-8 zinterpretowanym jako Windows-1252 i ponownie zakodowanym do UTF-8 (classic double-encoding). 9 wystapien naprawione: `Treść`→Treść, `JÄ™zyk domyĹ›lny`→Język domyślny (x2), `rozwiniÄ™cie`→rozwinięcie, `Sortowanie produktĂłw`→Sortowanie produktów, `WyĹ›wietlić podkategorie`→Wyświetlić podkategorie, `TytuĹ‚ kategorii (h1)`→Tytuł kategorii (h1), `Blokuj indeksacjÄ™`→Blokuj indeksację. +- Wykluczono regresje: grep `Ä[\\x{84}-\\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„` w `admin/templates/`, `templates/`, `autoload/` zwraca 0 plikow — to byl jedyny przypadek mojibake w repo. +- Suita PHPUnit bez zmian: 846 testow / 2348 assertions. + ## v0.351 (2026-05-13) - Naprawiono wyciek metatagow ze strony glownej na podstrony kategorii/artykulu/produktu: `<title>` wszystkich podstron pokazywal tytul homepage ("Sklep z akcesoriami..."), bo `LayoutEngine::show()` nadpisywal w galezi kategorii/artykulu/produktu tylko `$page['language']['title']`, a `meta_title` z domyslnej strony zylo dalej i wygrywalo w linii substytucji `[TITLE]`. diff --git a/.paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md b/.paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md new file mode 100644 index 0000000..bcda045 --- /dev/null +++ b/.paul/phases/20-category-edit-mojibake-fix/20-01-PLAN.md @@ -0,0 +1,197 @@ +--- +phase: 20-category-edit-mojibake-fix +plan: 01 +type: execute +wave: 1 +depends_on: [] +files_modified: + - admin/templates/shop-category/category-edit.php +autonomous: false +delegation: off +--- + +<objective> +## Goal +Etykiety formularza edycji kategorii (`/admin/shop_category/category_edit/id=X`) pokazują poprawne polskie znaki: "Treść", "Język domyślny", "Tytuł kategorii (h1)", "Wyświetlić podkategorie", "Sortowanie produktów", "Blokuj indeksację", "Opis kategorii (rozwinięcie)" — zamiast mojibake `Treść`, `JÄ™zyk domyĹ›lny`, itp. + +## Purpose +Mojibake w etykietach UI panelu admina utrudnia korzystanie z formularza. Administrator musi się domyślać znaczenia pól. Naprawia profesjonalny wygląd panelu i poprawia UX uzupełniania kategorii (m.in. SEO). + +## Output +- `admin/templates/shop-category/category-edit.php` z poprawnymi polskimi znakami (UTF-8) we wszystkich hardcoded stringach +- Weryfikacja wizualna w panelu admina + +## Root cause +Plik został kiedyś zapisany z UTF-8 zinterpretowanym jako Windows-1252 i ponownie zakodowanym do UTF-8 (classic double-encoding mojibake). `file` raportuje "UTF-8 text" bo bajty są poprawnym UTF-8 — tyle że ich znaczenie po dekodowaniu UTF-8 to bezsensowne kombinacje znaków łacińskich (Ä, Ĺ, Ă itp.). + +Grep `Ä[\x{84}-\x{99}]|Ĺ|Ăł` wskazał, że **tylko ten jeden plik** w całym repo (`admin/templates/`, `templates/`, `autoload/`) jest dotknięty — pozostałe templates mają poprawne UTF-8. +</objective> + +<context> +## Project Context +@.paul/PROJECT.md +@.paul/STATE.md + +## Source Files +@admin/templates/shop-category/category-edit.php + +## Clarifications +- **Objaw** — Mojibake (`Ä€„` zamiast `ą`) w labelkach formularza edycji kategorii + → Odpowiedź: potwierdzone — mojibake (double-encoded UTF-8) +- **Pola** — Nie wiem, sprawdź + → Odpowiedź (po inspekcji): WSZYSTKIE hardcoded labelki w pliku `category-edit.php` (9 wystąpień), żadne inne pliki templates nie dotknięte +- **Migracja danych** — chodzi o labelki, nie zapisywane dane + → Odpowiedź: plan dotyczy tylko hardcoded stringów w pliku PHP. Dane w bazie (mieszane HTML entities w additional_text) — oddzielny issue, NIE w tym planie + +## Wykryte miejsca mojibake (grep) + +``` +Line 10: Treść → Treść +Line 20: JÄ™zyk domyĹ›lny → Język domyślny +Line 48: Opis kategorii (rozwiniÄ™cie) → Opis kategorii (rozwinięcie) +Line 87: Sortowanie produktĂłw → Sortowanie produktów +Line 96: WyĹ›wietlić podkategorie → Wyświetlić podkategorie +Line 107: JÄ™zyk domyĹ›lny → Język domyślny (duplikat) +Line 127: TytuĹ‚ kategorii (h1) → Tytuł kategorii (h1) +Line 159: Blokuj indeksacjÄ™ → Blokuj indeksację +``` + +Mapowanie sekwencji (do podmiany): +- `ć` → `ć`, `Ä…` → `ą`, `Ä™` → `ę`, `Ĺ‚` → `ł`, `Ĺ›` → `ś`, `Ĺ„` → `ń`, `Ĺş` → `ź`, `Ĺľ` → `ż` +- `Ć` → `Ć`, `Ä„` → `Ą`, `Ę` → `Ę`, `Ĺ` → `Ł`, `Ĺš` → `Ś`, `Ĺƒ` → `Ń`, `Ĺ¹` → `Ź`, `Ĺ˝` → `Ż` +- `Ăł` → `ó`, `Ă“` → `Ó` +</context> + +<acceptance_criteria> + +## AC-1: Brak mojibake w pliku +```gherkin +Given plik admin/templates/shop-category/category-edit.php po fixie +When uruchomię grep regex `Ä[\x{84}-\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć` +Then nie ma żadnego dopasowania (0 linii) +And plik dalej jest UTF-8 (bez BOM) — sprawdzalne przez `file` +``` + +## AC-2: Labelki formularza renderują się z polskimi znakami +```gherkin +Given administrator otwiera /admin/shop_category/category_edit/id=10 po deployu +When sprawdza nazwy tabów i etykiet pól +Then widzi "Treść", "Ustawienia", "SEO" jako nazwy tabów +And widzi "Język domyślny", "Tytuł kategorii (h1)", "Sortowanie produktów", + "Wyświetlić podkategorie", "Blokuj indeksację", "Opis kategorii (rozwinięcie)" + jako etykiety pól +And NIE widzi `Ä`, `Ĺ`, `Ă` w żadnym widocznym miejscu na tej stronie +``` + +## AC-3: Brak regresji w innych szablonach +```gherkin +Given fix dotyczy tylko jednego pliku +When uruchomię grep mojibake w admin/templates/ + templates/ + autoload/ +Then żaden inny plik nie zawiera mojibake (tak jak przed fixem) +And cała suita PHPUnit (846 testów) pozostaje zielona +``` + +</acceptance_criteria> + +<tasks> + +<task type="auto"> + <name>Task 1: Podmień double-encoded UTF-8 na właściwe polskie znaki</name> + <files>admin/templates/shop-category/category-edit.php</files> + <action> + Wykonaj globalne podstawienia w pliku z mojibake → UTF-8 polskie znaki: + + Podstawienia całych słów (najbezpieczniejsze — unikamy fałszywych alarmów z `Ä` w innym kontekście): + "Treść" → "Treść" + "JÄ™zyk domyĹ›lny" → "Język domyślny" + "rozwiniÄ™cie" → "rozwinięcie" + "Sortowanie produktĂłw" → "Sortowanie produktów" + "WyĹ›wietlić podkategorie" → "Wyświetlić podkategorie" + "TytuĹ‚ kategorii (h1)" → "Tytuł kategorii (h1)" + "Blokuj indeksacjÄ™" → "Blokuj indeksację" + + Po wszystkich podstawieniach zweryfikuj greppem że żadne mojibake już nie zostało. + + Avoid: globalne sekwencyjne `str_replace` typu `ć` → `ć` bez kontekstu — mogłoby przypadkiem złamać poprawne fragmenty w przyszłości (na razie nie ma ryzyka, ale lepiej trzymać się konkretnych słów). + Avoid: zmiana encodingu pliku (musi zostać UTF-8 bez BOM, CRLF — jak teraz). + Avoid: jakichkolwiek zmian poza podmianami stringów (struktura HTML, logika, imports — bez zmian). + </action> + <verify> + grep -P "Ä[\x{84}-\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„" admin/templates/shop-category/category-edit.php + → 0 dopasowań + file admin/templates/shop-category/category-edit.php → UTF-8 text (bez BOM) + </verify> + <done>AC-1 satisfied: plik bez mojibake, dalej UTF-8</done> +</task> + +<task type="auto"> + <name>Task 2: Weryfikacja braku regresji + odpalenie suity testów</name> + <files>(brak modyfikacji — weryfikacja)</files> + <action> + 1. Powtórz globalny grep mojibake w admin/templates/, templates/, autoload/ — powinno być 0 plików (poza tym fixowanym, który po Task 1 też ma 0) + 2. Uruchom suitę PHPUnit: `php phpunit.phar` + 3. Sprawdź że nie ma żadnych nowych failów (oczekiwane: 846 OK) + </action> + <verify> + grep -rl -P "Ä[\x{84}-\x{99}]|Ĺ" admin/templates/ templates/ autoload/ — brak wyniku + php phpunit.phar — exit code 0, 846 tests OK + </verify> + <done>AC-3 satisfied: brak regresji, suita zielona</done> +</task> + +<task type="checkpoint:human-verify" gate="blocking"> + <what-built> + Plik admin/templates/shop-category/category-edit.php z polskimi znakami w UTF-8 + (auto-upload FTP wysyła zmianę na shoppro.project-dc.pl po zapisie pliku) + </what-built> + <how-to-verify> + 1. Otwórz https://shoppro.project-dc.pl/admin/shop_category/category_edit/id=10 (zaloguj się jeśli trzeba) + 2. Sprawdź nazwy 3 tabów: "Treść", "Ustawienia", "SEO" — powinny być po polsku, bez mojibake + 3. W tabie "Treść" sprawdź: + - tooltip ikony gwiazdki: "Język domyślny" + - etykiety pól: "Nazwa kategorii", "Opis kategorii", "Opis kategorii (rozwinięcie)", "Dodatkowy tekst (nad produktami)" + 4. W tabie "Ustawienia" sprawdź: "Aktywna", "Sortowanie produktów", "Wyświetlić podkategorie" + 5. W tabie "SEO" sprawdź: "Tytuł kategorii (h1)", "Blokuj indeksację" + 6. Otwórz inną kategorię (np. id=11) — to samo dla regresji + </how-to-verify> + <resume-signal>Wpisz "approved" by kontynuować, lub opisz issues</resume-signal> +</task> + +</tasks> + +<boundaries> + +## DO NOT CHANGE +- Struktura HTML pliku (tagi, klasy CSS, JS scripts) +- Logika PHP (if/foreach, wywołania Tpl) +- Inne pliki w admin/templates/shop-category/ — nie są dotknięte mojibake +- Encoding pliku (musi zostać UTF-8 bez BOM, jak obecnie) +- Dane w bazie (HTML entities w `additional_text` to oddzielny issue) + +## SCOPE LIMITS +- Plan dotyczy TYLKO pliku `admin/templates/shop-category/category-edit.php` +- NIE skanujemy wszystkich szablonów admina pod kątem mojibake (już sprawdzone — pozostałe OK) +- NIE migrujemy danych w DB (admin uzupełnia ręcznie jeśli ma encje) +- Bez build update package — to robi `/koniec-pracy` po UNIFY + +</boundaries> + +<verification> +Przed zamknięciem planu: +- [ ] grep mojibake → 0 wyników w category-edit.php +- [ ] file potwierdza UTF-8 bez BOM +- [ ] Suita PHPUnit 846 zielona +- [ ] Human-verify na 2 kategoriach (id=10 i jeszcze jednej) zatwierdzony +- [ ] AC-1, AC-2, AC-3 spełnione +</verification> + +<success_criteria> +- 9 wystąpień mojibake naprawionych w 1 pliku +- Brak regresji w innych szablonach +- Suita testów zielona +- Wizualna weryfikacja w panelu admina OK +</success_criteria> + +<output> +After completion: `.paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md` +</output> diff --git a/.paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md b/.paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md new file mode 100644 index 0000000..ab40af7 --- /dev/null +++ b/.paul/phases/20-category-edit-mojibake-fix/20-01-SUMMARY.md @@ -0,0 +1,121 @@ +--- +phase: 20-category-edit-mojibake-fix +plan: 01 +subsystem: admin-ui +tags: [encoding, utf8, mojibake, admin-templates, polish-chars] + +requires: + - phase: none + provides: n/a + +provides: + - poprawne polskie znaki w labelkach formularza edycji kategorii + - pewność że pozostałe pliki admin/templates/, templates/, autoload/ są wolne od double-encoded UTF-8 mojibake + +affects: [] + +tech-stack: + added: [] + patterns: + - "Detekcja double-encoded UTF-8: grep `Ä[\\x{84}-\\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„` znajduje pliki z mojibake" + +key-files: + modified: + - admin/templates/shop-category/category-edit.php + +key-decisions: + - "Fix tylko 1 plik (9 wystąpień) — żaden inny szablon w repo nie ma mojibake" + - "Podmiana całych słów zamiast generyczna `ć`→`ć` — unika fałszywych alarmów na przyszłość" + - "Brak migracji danych w DB (te są oddzielnym tematem — HTML entities w additional_text)" + +patterns-established: + - "Workflow detekcji mojibake: jeden grep regex pokrywa najczęstsze sekwencje Win-1252→UTF-8 double-encoding" + +duration: ~10min +started: 2026-05-13T16:30:00Z +completed: 2026-05-13T16:40:00Z +--- + +# Phase 20 Plan 01: Category edit mojibake fix — Summary + +**9 wystąpień double-encoded UTF-8 w `admin/templates/shop-category/category-edit.php` naprawione na poprawne polskie znaki; pozostałe szablony zweryfikowane jako wolne od mojibake.** + +## Performance + +| Metric | Value | +|--------|-------| +| Duration | ~10min | +| Tasks | 3 z 3 wykonane | +| Files modified | 1 | +| Mojibake fixed | 9 wystąpień (7 unikalnych fraz) | +| Total suite | 846 zielone (bez zmian) | + +## Acceptance Criteria Results + +| Criterion | Status | Notes | +|-----------|--------|-------| +| AC-1: Brak mojibake w pliku | Pass | grep mojibake → 0 wyników; file → UTF-8 bez BOM | +| AC-2: Labelki renderują się z polskimi znakami | Pass | Human-verify approved przez użytkownika | +| AC-3: Brak regresji w innych szablonach | Pass | grep w admin/templates/+templates/+autoload/ → 0 plików; suita 846 OK | + +## Accomplishments + +- Wykryto i naprawiono mojibake w jedynym dotkniętym pliku repo +- Etykiety formularza edycji kategorii w panelu admina są czytelne po polsku ("Treść", "Język domyślny", "Sortowanie produktów", "Tytuł kategorii (h1)", "Blokuj indeksację", "Wyświetlić podkategorie", "Opis kategorii (rozwinięcie)") +- Auto-upload FTP wysłał plik na produkcję; weryfikacja w przeglądarce potwierdzona + +## Files Created/Modified + +| File | Change | Purpose | +|------|--------|---------| +| `admin/templates/shop-category/category-edit.php` | Modified | Podmiana 9 wystąpień double-encoded UTF-8 na poprawne polskie znaki (7 unikalnych fraz: Treść, JÄ™zyk domyĹ›lny x2, rozwiniÄ™cie, Sortowanie produktĂłw, WyĹ›wietlić podkategorie, TytuĹ‚ kategorii, Blokuj indeksacjÄ™) | + +## Decisions Made + +| Decision | Rationale | Impact | +|----------|-----------|--------| +| Podmiana całych słów zamiast `ć`→`ć` itd. | Bezpieczniej — nie zostawia ryzyka uszkodzenia poprawnych fragmentów przy hipotetycznym przyszłym pojawieniu się tych bajtów w innym kontekście | Edits są precyzyjne, łatwe do code-review | +| Fix tylko ten jeden plik | grep pokazał że to jedyny plik z mojibake w całym repo | Scope minimalny, brak ryzyka regresji | + +## Deviations from Plan + +### Summary + +| Type | Count | Impact | +|------|-------|--------| +| Auto-fixed | 0 | — | +| Scope additions | 0 | — | +| Deferred | 1 | Git commit transition-phase (pattern z faz 15-19) | + +**Total impact:** Plan wykonany dokładnie według planu. + +### Deferred Items + +- Transition-phase git commit dla Phase 20 — pattern z faz 15-19 (commit zrobi `/koniec-pracy` lub user manualnie). Brak negatywnego impactu — auto-upload FTP już ma plik na produkcji. + +## Issues Encountered + +None. + +## Next Phase Readiness + +**Ready:** +- Pattern detekcji mojibake (regex) udokumentowany — przydatny przy przyszłych audytach encoding +- Plik category-edit.php czysty UTF-8 + +**Concerns:** +- Inne pola w bazie (`additional_text` kategorii) mają mieszane HTML entities z polskimi znakami — oddzielny issue, nie blokuje +- Brak automatycznego sprawdzania encoding w CI — przyszły fix mógłby wprowadzić nowy mojibake bez wykrycia + +**Blockers:** None. + +## Skill Audit (Phase 20) + +| Expected | Invoked | Notes | +|----------|---------|-------| +| /feature-dev | ○ | Triviany fix labelek — override per pattern poprzednich faz | +| /koniec-pracy | ○ | Pending — uruchomić przy release update package | + +--- +*Phase: 20-category-edit-mojibake-fix, Plan: 01* +*Completed: 2026-05-13* diff --git a/admin/templates/shop-category/category-edit.php b/admin/templates/shop-category/category-edit.php index 1c41f7d..0db5211 100644 --- a/admin/templates/shop-category/category-edit.php +++ b/admin/templates/shop-category/category-edit.php @@ -7,7 +7,7 @@ ob_start(); ?> <div id="settings-tabs"> <ul class="resp-tabs-list settings-tabs"> - <li><i class="fa fa-file"></i>Treść</li> + <li><i class="fa fa-file"></i>Treść</li> <li><i class="fa fa-wrench"></i>Ustawienia</li> <li><i class="fa fa-globe"></i>SEO</li> </ul> @@ -17,7 +17,7 @@ ob_start(); <ul class="resp-tabs-list languages-main htabs"> <? if ( is_array( $this -> languages ) ): foreach ( $this -> languages as $lg ):?> <? if ( $lg['status'] ):?> - <li><? if ( $lg['id'] == $this->dlang ) echo '<i class="fa fa-star fa-lg text-system" title="JÄ™zyk domyĹ›lny"></i> ';?><?= $lg['name'];?></a></li> + <li><? if ( $lg['id'] == $this->dlang ) echo '<i class="fa fa-star fa-lg text-system" title="Język domyślny"></i> ';?><?= $lg['name'];?></a></li> <? endif;?> <? endforeach; endif;?> </ul> @@ -45,7 +45,7 @@ ob_start(); );?> <?= \Shared\Html\Html::textarea( array( - 'label' => 'Opis kategorii (rozwiniÄ™cie)', + 'label' => 'Opis kategorii (rozwinięcie)', 'name' => 'text_hidden[' . $lg['id'] . ']', 'id' => 'text_hidden_' . $lg['id'], 'value' => $this -> category['languages'][ $lg['id'] ]['text_hidden'], @@ -84,7 +84,7 @@ ob_start(); );?> <?= \Shared\Html\Html::select( [ - 'label' => 'Sortowanie produktĂłw', + 'label' => 'Sortowanie produktów', 'name' => 'sort_type', 'id' => 'sort_type', 'values' => is_array( $this -> sort_types ) ? $this -> sort_types : [], @@ -93,7 +93,7 @@ ob_start(); );?> <?= \Shared\Html\Html::input_switch( array( - 'label' => 'WyĹ›wietlić podkategorie', + 'label' => 'Wyświetlić podkategorie', 'name' => 'view_subcategories', 'checked' => $this -> category['view_subcategories'] == 1 ? true : false ) @@ -104,7 +104,7 @@ ob_start(); <ul class="resp-tabs-list languages-seo htabs"> <? if ( is_array( $this -> languages ) ): foreach ( $this -> languages as $lg ):?> <? if ( $lg['status'] ):?> - <li><? if ( $lg['id'] == $this->dlang ) echo '<i class="fa fa-star fa-lg text-system" title="JÄ™zyk domyĹ›lny"></i> ';?><?= $lg['name'];?></a></li> + <li><? if ( $lg['id'] == $this->dlang ) echo '<i class="fa fa-star fa-lg text-system" title="Język domyślny"></i> ';?><?= $lg['name'];?></a></li> <? endif;?> <? endforeach; endif;?> </ul> @@ -124,7 +124,7 @@ ob_start(); );?> <?= \Shared\Html\Html::input( array( - 'label' => 'TytuĹ‚ kategorii (h1)', + 'label' => 'Tytuł kategorii (h1)', 'name' => 'category_title[' . $lg['id'] . ']', 'id' => 'category_title_' . $lg['id'], 'value' => $this -> category['languages' ][ $lg['id'] ]['category_title'] @@ -156,7 +156,7 @@ ob_start(); );?> <?= \Shared\Html\Html::select( array( - 'label' => 'Blokuj indeksacjÄ™', + 'label' => 'Blokuj indeksację', 'name' => 'noindex[' . $lg['id'] . ']', 'id' => 'noindex_' . $lg['id'], 'values' => array(