Compare commits

..

6 Commits
v0.351 ... main

Author SHA1 Message Date
fce4bdb1f1 update 2026-05-13 23:17:05 +02:00
adfabaf3fa build: ver_0.353 - fix aktualizacji systemu i Wyczysc cache na /admin/update/main_view/ 2026-05-13 23:10:37 +02:00
073069c303 fix: dziala aktualizacja systemu i Wyczysc cache na /admin/update/main_view/ (v0.353)
Zdalny changelog z shoppro.project-dc.pl/updates/changelog.php zwracal
niezbalansowany HTML (niezamkniety <script>/<style>/<textarea>/<!--),
ktory "polykal" reszte dokumentu - inline-script z handlerami
#confirm/#confirmUpdateAll i footer-script z main-layout.php
(#clear-cache-btn) nigdy nie parsowaly sie jako JS. Klienci nie mogli
aktualizowac shopPRO.

Fix w admin/templates/update/main-view.php:
1. Blok <script> z handlerami przeniesiony PRZED sekcje Changelog -
   handlery podpinaja sie niezaleznie od zdalnego HTML.
2. Sanityzacja zdalnego changeloga: preg_replace usuwa komentarze HTML,
   strip_tags z whitelista (<p><br><b><strong><i><em><u><ul><ol><li>
   <h1>-<h6><span><div><a><pre><code><hr>) wycina tagi strukturalne i
   wykonywalne (<script>, <style>, <iframe>, <textarea>).

Skutek uboczny: footer-script z main-layout.php (Wyczysc cache + globalne
wyszukiwanie + sprawdzanie aktualizacji) dziala teraz na podstronie update.

Po wgraniu na instancje: hard-reload (Ctrl+F5) + restart PHP-FPM /
wyczyszczenie OPcache.

Suita PHPUnit: 846 testow / 2348 assertions OK.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-13 23:10:08 +02:00
8a89305f29 build: ver_0.352 - mojibake fix w labelkach edycji kategorii 2026-05-13 22:56:04 +02:00
d858f74de3 fix: mojibake w labelkach formularza edycji kategorii (v0.352)
Plik admin/templates/shop-category/category-edit.php zawieral 9 wystapien
double-encoded UTF-8 (UTF-8 zinterpretowanego jako Win-1252 i ponownie
zakodowanego do UTF-8). Etykiety pol formularza pokazywaly mojibake typu
"Treść" zamiast "Treść", "JÄ™zyk domyĹ›lny" zamiast "Język domyślny" itp.

Podmiana 7 unikalnych fraz na poprawne polskie znaki. Grep mojibake po
calym repo (admin/templates/, templates/, autoload/) potwierdza ze to
byl jedyny dotkniety plik.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 22:55:27 +02:00
18bdf8384f build: ver_0.351 - fix metatagow na stronach kategorii/produktu 2026-05-13 22:38:49 +02:00
21 changed files with 976 additions and 30 deletions

View File

@@ -40,6 +40,8 @@ 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 |
| 21 | Admin update view JS fix (przyciski aktualizacji + cache) | 1 | Done | 2026-05-13 |
## Feature
@@ -140,4 +142,21 @@ 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.
### Phase 21 — Admin update view JS fix
**Problem:** Na `/admin/update/main_view/` nie działają przyciski "Aktualizuj do wyższej wersji", "Aktualizuj do najwyższej wersji" oraz globalny "Wyczyść cache" z headera admina. Klient nie może zaktualizować systemu. Brak błędu JS w konsoli — kliknięcie tylko dopisuje `#` do URL.
**Root cause:** `admin/templates/update/main-view.php` pobiera zdalny changelog przez `file_get_contents` z `shoppro.project-dc.pl/updates/changelog.php`. Odpowiedź zawiera niezbalansowany HTML (niezamknięty `<script>`, `<!--`, `<style>` lub `<textarea>`), który „połyka" pozostałą część dokumentu jako tekst — inline-script z handlerami i footer-script z `main-layout.php` nigdy się nie parsują.
**Scope:** (1) Przenieść blok `<script>` z handlerami przyciskami PRZED sekcję Changelog. (2) Sanityzować zdalny changelog: `preg_replace` usuwa komentarze HTML, `strip_tags` z białą listą tagów formatujących. Jeden plik: `admin/templates/update/main-view.php`. Human-verify w panelu admina.
---
*Last updated: 2026-05-13 (Phase 21 complete)*

View File

@@ -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 21 complete — loop closed
## Current Position
Milestone: Hotfix
Phase: 19 of 19 (Frontend meta tags fix) — Complete
Plan: 19-01 complete
Phase: 21 of 21 (Admin update view JS fix) — Complete
Plan: 21-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/21-admin-update-view-js-fix/21-01-PLAN.md
Progress:
- Milestone: [##########] 100% (Hotfix rolling)
- Phase 19: [##########] 100%
- Phase 21: [##########] 100%
## Loop Position
@@ -45,10 +45,20 @@ 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]
Phase 21: PLAN --> APPLY --> UNIFY ✓ ✓ ✓ [COMPLETE - 2026-05-13]
```
## Accumulated Context
### Decisions
- 2026-05-13: Phase 21 loop closed with SUMMARY at .paul/phases/21-admin-update-view-js-fix/21-01-SUMMARY.md
- 2026-05-13: Transition-phase git commit for Phase 21 not executed in this UNIFY run (deferred — pattern z faz 15-20)
- 2026-05-13: Phase 21 APPLY complete — admin/templates/update/main-view.php zmodyfikowany (reorder <script> przed sekcję Changelog + sanityzacja zdalnego changeloga: preg_replace komentarzy HTML + strip_tags z whitelistą tagów formatujących); php -l OK; suita 846 testów zielona; human-verify approved
- 2026-05-13: Created Phase 21 plan at .paul/phases/21-admin-update-view-js-fix/21-01-PLAN.md — fix niedziałających przycisków aktualizacji + Wyczyść cache w /admin/update/main_view/ (zdalny changelog z niezbalansowanym HTML "połykał" inline i footer-script). Reorder bloku <script> przed sekcję Changelog + sanityzacja zdalnego changeloga (strip_tags z whitelistą + usunięcie komentarzy HTML).
- 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 +113,17 @@ None.
### Blockers/Concerns
None.
### Skill Audit (Phase 19)
### Skill Audit (Phase 21)
| 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 | ○ | Hotfix template-only z konkretną instrukcją w change.md — 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 21 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/21-admin-update-view-js-fix/21-01-SUMMARY.md
---
*STATE.md — Updated after every significant action*

View File

@@ -9,13 +9,26 @@
- Task 4 (human-verify): Weryfikacja curl na produkcji — 3 strony pokazują 3 różne `<title>`, 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
- [Phase 21, Plan 01] Fix niedziałających przycisków aktualizacji systemu + globalnego "Wyczyść cache" na /admin/update/main_view/ (klient nie mógł zaktualizować shopPRO)
- Task 1: Reorder bloku `<script>` z handlerami #confirm/#confirmUpdateAll PRZED sekcję Changelog + sanityzacja zdalnego changeloga (preg_replace komentarzy HTML + strip_tags z whitelistą tagów formatujących); root cause = niezbalansowany zdalny HTML z shoppro.project-dc.pl „połykał" inline-script i footer-script; suita 846 zielona
- Task 2 (human-verify): Weryfikacja w panelu admina approved (przyciski aktualizacji + Wyczyść cache + zdalny changelog renderuje się sanityzowany)
## Zmienione pliki
- `autoload/front/LayoutEngine.php`
- `admin/templates/shop-category/category-edit.php`
- `admin/templates/update/main-view.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)
- `.paul/phases/19-frontend-meta-tags-fix/DIAGNOSTICS.md` (nowy)
- `.paul/phases/21-admin-update-view-js-fix/21-01-PLAN.md` (nowy)
- `.paul/phases/21-admin-update-view-js-fix/21-01-SUMMARY.md` (nowy)
- `.paul/STATE.md`
- `.paul/ROADMAP.md`
- `.gitignore`

View File

@@ -2,6 +2,23 @@
> Chronologiczny log zmian technicznych — co i dlaczego.
## v0.353 (2026-05-13)
- Naprawiono niedzialajace przyciski aktualizacji systemu (`#confirm`, `#confirmUpdateAll`) i globalny "Wyczysc cache" (`#clear-cache-btn`) na `/admin/update/main_view/`. Klienci nie mogli aktualizowac shopPRO na instancjach.
- Root cause: `admin/templates/update/main-view.php` pobieral zdalny changelog przez `file_get_contents` z `shoppro.project-dc.pl/updates/changelog.php`. Odpowiedz zawierala niezbalansowany HTML (niezamkniety `<script>`, `<!--`, `<style>` lub `<textarea>`), ktory "polykal" reszte dokumentu — inline-script z handlerami przyciskow i footer-script z `main-layout.php` (Wyczysc cache) nigdy sie nie parsowal jako JS. Brak bledu w konsoli — to nie byl blad JS, to byl HTML, ktory nigdy nie zostal wykonany jako skrypt.
- Fix 1: blok `<script>` z handlerami przeniesiony PRZED sekcje Changelog (wczesniej kolejnosc: wersje -> log -> changelog -> script; teraz: wersje -> log -> script -> changelog). Handlery podpinaja sie niezaleznie od tego, co zwroci zdalny serwer.
- Fix 2: sanityzacja zdalnego changeloga przed wyrenderowaniem: `preg_replace('/<!--.*?-->/s', '', $html)` + `strip_tags($html, '<p><br><b><strong><i><em><u><ul><ol><li><h1>-<h6><span><div><a><pre><code><hr>')`. Tagi strukturalne i "polykajace" (`<script>`, `<style>`, `<textarea>`, `<iframe>`, `<body>`, `</html>`) sa usuwane.
- Skutek uboczny: footer-script z `main-layout.php` (przycisk Wyczysc cache + globalne wyszukiwanie produktow/zamowien + sprawdzanie aktualizacji w menu) dziala teraz na podstronie update.
- Zysk bezpieczenstwa: zdalny serwis nie moze juz wstrzyknac JS w panel admina.
- Wymagane akcje na produkcji po wgraniu update package: hard-reload przegladarki (Ctrl+F5) + restart PHP-FPM / wyczyszczenie OPcache (inaczej stary skompilowany szablon dalej bedzie serwowany).
- Suita PHPUnit bez zmian: 846 testow / 2348 assertions.
## 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]`.

View File

@@ -0,0 +1,133 @@
{"ts":"2026-05-13T20:12:07Z","tool":"Bash","cmd":"curl -s -A \"Mozilla/5.0\" https://shoppro.project-dc.pl/sen-i-otulenie | grep -iE \"<title>|<meta\" | head -40\",\"description\":\"Fetch category page metatags\"},\"tool_response\":{\"stdout\":\" ","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:12:11Z","tool":"Bash","cmd":"curl -s -A \"Mozilla/5.0\" https://shoppro.project-dc.pl/kocyk-niemowlaka-szczeniak-z-balonikiem-fuksja | grep -iE \"<title>|<meta\" | head -40\",\"description\":\"Fetch product page metatags\"},\"too","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:19:03Z","tool":"Bash","cmd":"mkdir \"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\phases\\\\19-frontend-meta-tags-fix\"\",\"description\":\"Create phase 19 directory\"},\"tool_response\":{\"stdout\":\"\",\"stderr\"","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:20:21Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\phases\\\\19-frontend-meta-tags-fix\\\\19-01-PLAN.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:20:30Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:20:39Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:20:45Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:20:50Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:20:59Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:23:00Z","tool":"Bash","cmd":"mysql -h host117523.hostido.net.pl -u host117523_shoppro -p'mhA9WCEXEnRfTtbN33hL' host117523_shoppro -e \"SELECT pattern, destination FROM pp_routes WHERE 'sen-i-otulenie' REGEXP CONCAT('^', pattern) ","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:24:13Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\temp\\\\diag_meta.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:24:36Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\temp\\\\diag_meta2.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:24:46Z","tool":"Bash","cmd":"/c/xampp/php/php \"C:/visual studio code/projekty/shopPRO/temp/diag_meta2.php\" 2>&1\",\"description\":\"Run diagnostic 2\"},\"tool_response\":{\"stdout\":\"=== Tables related to categories, products,","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:25:01Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\temp\\\\diag_meta3.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:25:12Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\temp\\\\diag_meta3.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:25:18Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\temp\\\\diag_meta3.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:26:15Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\temp\\\\diag_meta4.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:26:21Z","tool":"Bash","cmd":"/c/xampp/php/php \"C:/visual studio code/projekty/shopPRO/temp/diag_meta4.php\" 2>&1\",\"description\":\"Run diagnostic 4 — homepage meta\"},\"tool_response\":{\"stdout\":\"=== pp_pages_langs PL whe","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:26:48Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.gitignore","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:27:20Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\phases\\\\19-frontend-meta-tags-fix\\\\DIAGNOSTICS.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:28:47Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:29:05Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\autoload\\\\front\\\\LayoutEngine.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:29:35Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\autoload\\\\front\\\\LayoutEngine.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:29:47Z","tool":"Bash","cmd":"/c/xampp/php/php -l \"C:/visual studio code/projekty/shopPRO/autoload/front/LayoutEngine.php\"\",\"description\":\"PHP syntax check\"},\"tool_response\":{\"stdout\":\"No syntax errors detected in C:/v","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:30:26Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\tests\\\\Unit\\\\front\\\\LayoutEngineMetaTagsTest.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:30:34Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && /c/xampp/php/php phpunit.phar tests/Unit/front/LayoutEngineMetaTagsTest.php 2>&1 | tail -25\",\"description\":\"Run new test\"},\"tool_response\":{\"st","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:30:46Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && /c/xampp/php/php phpunit.phar 2>&1 | tail -15\",\"timeout\":300000,\"description\":\"Run full PHPUnit suite\"},\"tool_response\":{\"stdout\":\"........","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:30:58Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\temp\\\\clear_cache.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:32:18Z","tool":"Bash","cmd":"curl -s -A \"Mozilla/5.0\" https://shoppro.project-dc.pl/sen-i-otulenie | grep -iE \"<title>|<meta name=\\\\\"(description|keywords)\\\\\"\" | head -5\\necho \"---\"\\ncurl -s -A \"Mozilla/5.0\" https","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:32:29Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:32:37Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:32:45Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:32:51Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:32:57Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:34:11Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\phases\\\\19-frontend-meta-tags-fix\\\\19-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:34:39Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\changelog\\\\2026-05-13.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:34:48Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:34:57Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:35:03Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:35:18Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:35:23Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:35:28Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:35:56Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && /c/xampp/php/php phpunit.phar 2>&1 | tail -5\",\"timeout\":300000,\"description\":\"Run full test suite\"},\"tool_response\":{\"stdout\":\"............","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:36:08Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && sonar-scanner 2>&1 | tail -15\",\"timeout\":600000,\"description\":\"Run SonarQube scanner\"},\"tool_response\":{\"stdout\":\"/usr/bin/bash: line 1: so","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:36:48Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git tag --sort=-v:refname | head -3\",\"description\":\"Get latest tag\"},\"tool_response\":{\"stdout\":\"v0.350\\nv0.349\\nv0.348\",\"stderr\":\"\",\"","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:37:21Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\docs\\\\TECH_CHANGELOG.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:37:29Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\codebase\\\\testing.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:37:37Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git status --short 2>&1 | head -30\",\"description\":\"Git status\"},\"tool_response\":{\"stdout\":\" M .gitignore\\n M .paul/ROADMAP.md\\n M .paul/STA","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:37:44Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git log --oneline -5 2>&1\",\"description\":\"Recent commits style\"},\"tool_response\":{\"stdout\":\"255456d update\\ne84edb2 build: ver_0.350 - fix l","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:37:52Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git add .gitignore .paul/ROADMAP.md .paul/STATE.md .paul/codebase/testing.md .paul/docs/TECH_CHANGELOG.md autoload/front/LayoutEngine.php .paul/changel","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:38:03Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git commit -m \"$(cat <<'EOF'\\nfix: wyciek meta_title homepage na podstrony kategorii/artykulu/produktu (v0.351)\\n\\nLayoutEngine::show() w 3 galezia","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:38:13Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git push 2>&1 | tail -5\",\"description\":\"Git push\"},\"tool_response\":{\"stdout\":\"remote: . Processing 1 references \\nremote: Processed 1","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:38:21Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git tag v0.351 2>&1 && echo \"Tag created\"\",\"description\":\"Create tag\"},\"tool_response\":{\"stdout\":\"Tag created\",\"stderr\":\"\",\"interrupt","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:38:28Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && ls build-update.ps1 2>&1; head -50 build-update.ps1 2>&1\",\"description\":\"Check build script\"},\"tool_response\":{\"stdout\":\"build-update.ps1\\n<","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:38:50Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git add updates/0.30/ver_0.351.zip updates/0.30/ver_0.351_manifest.json updates/versions.php updates/changelog-data.html && git commit -m \"build: ver_","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:39:03Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git push && git push origin v0.351 2>&1 | tail -10\",\"description\":\"Push branch + tag\"},\"tool_response\":{\"stdout\":\"remote: . Processing 1 refe","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:41:36Z","tool":"Bash","cmd":"curl -s \"https://shoppro.project-dc.pl/admin/shop_category/category_edit/id=10\" 2>&1 | head -5; echo \"---needs auth---\"\",\"description\":\"Try fetching admin page (likely requires auth)\"},\"tool","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:43:08Z","tool":"Bash","cmd":"file \"C:/visual studio code/projekty/shopPRO/admin/templates/shop-category/\"*.php 2>&1 | head -10\",\"description\":\"Check encoding of category templates\"},\"tool_response\":{\"stdout\":\"C:/visua","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:44:04Z","tool":"Bash","cmd":"mkdir \"C:/visual studio code/projekty/shopPRO/.paul/phases/20-category-edit-mojibake-fix\"\",\"description\":\"Create phase 20 directory\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interr","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:45:04Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\phases\\\\20-category-edit-mojibake-fix\\\\20-01-PLAN.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:45:13Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:45:19Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:45:26Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:45:32Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:45:38Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:45:49Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:46:18Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\admin\\\\templates\\\\shop-category\\\\category-edit.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:46:24Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\admin\\\\templates\\\\shop-category\\\\category-edit.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:46:29Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\admin\\\\templates\\\\shop-category\\\\category-edit.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:46:34Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\admin\\\\templates\\\\shop-category\\\\category-edit.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:46:39Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\admin\\\\templates\\\\shop-category\\\\category-edit.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:46:45Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\admin\\\\templates\\\\shop-category\\\\category-edit.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:46:51Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\admin\\\\templates\\\\shop-category\\\\category-edit.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:47:02Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && grep -cP \"Ä[\\\\x{84}-\\\\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć|Ĺ„\" admin/templates/shop-category/category-edit.php\\necho \"---file encod","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:47:17Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && grep -rlP \"Ä[\\\\x{84}-\\\\x{99}]|Ĺ|Ăł|Ĺ›|Ĺ‚|Ä™|Ä…|ć\" admin/templates/ templates/ autoload/ 2>&1\\necho \"---no other files affec","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:47:28Z","tool":"Bash","cmd":"curl -s \"https://shoppro.project-dc.pl/admin/shop_category/category_edit/id=10\" 2>&1 | grep -P \"TreĹć|JÄ™zyk|Treść|Język\" | head -5\\necho \"---\"\\necho \"(strona admin wymaga auth ","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:50:54Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:51:00Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:51:06Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:51:12Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:52:15Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\phases\\\\20-category-edit-mojibake-fix\\\\20-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:52:23Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\changelog\\\\2026-05-13.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:52:32Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:52:37Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:52:43Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:52:52Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:52:58Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:53:03Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:54:47Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && /c/xampp/php/php phpunit.phar 2>&1 | tail -5\",\"timeout\":300000,\"description\":\"Run test suite\"},\"tool_response\":{\"stdout\":\".................","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:54:54Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git tag --sort=-v:refname | head -1\",\"description\":\"Latest tag\"},\"tool_response\":{\"stdout\":\"v0.351\",\"stderr\":\"\",\"interrupted\":false,\"","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:55:08Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\docs\\\\TECH_CHANGELOG.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:55:16Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git status --short 2>&1\",\"description\":\"Git status\"},\"tool_response\":{\"stdout\":\" M .paul/ROADMAP.md\\n M .paul/STATE.md\\n M .paul/changelog/","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:55:28Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git add .paul/ROADMAP.md .paul/STATE.md .paul/changelog/2026-05-13.md .paul/docs/TECH_CHANGELOG.md admin/templates/shop-category/category-edit.php .pau","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:55:37Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git push 2>&1 | tail -3\",\"description\":\"Git push\"},\"tool_response\":{\"stdout\":\"remote: Processed 1 references in total \\nTo https://gi","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:55:45Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git tag v0.352\",\"description\":\"Create v0.352 tag\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"no","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:56:09Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && git add updates/0.30/ver_0.352.zip updates/0.30/ver_0.352_manifest.json updates/versions.php updates/changelog-data.html && git commit -m \"build: ver_","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T20:59:58Z","tool":"Bash","cmd":"mkdir -p \".paul/phases/21-admin-update-view-js-fix\"\",\"description\":\"Create phase directory\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutpu","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:00:44Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\phases\\\\21-admin-update-view-js-fix\\\\21-01-PLAN.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:00:55Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:01:03Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:01:10Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:01:14Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:01:25Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:03:04Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\admin\\\\templates\\\\update\\\\main-view.php","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:03:11Z","tool":"Bash","cmd":"php -l \"admin/templates/update/main-view.php\" 2>&1\",\"description\":\"PHP lint check\"},\"tool_response\":{\"stdout\":\"No syntax errors detected in admin/templates/update/main-view.php\",\"stderr\","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:04:15Z","tool":"Bash","cmd":"powershell -ExecutionPolicy Bypass -File ./test.ps1 2>&1 | tail -30\",\"timeout\":300000,\"description\":\"Run full PHPUnit suite\"},\"tool_response\":{\"stdout\":\"The argument './test.ps1' to the -F","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:04:22Z","tool":"Bash","cmd":"powershell -ExecutionPolicy Bypass -File \"test.ps1\" 2>&1 | tail -20\",\"timeout\":300000,\"description\":\"Run PHPUnit suite via test.ps1\"},\"tool_response\":{\"stdout\":\"The argument 'test.ps1' t","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:04:38Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && ls *.ps1 *.bat 2>&1 | head\",\"description\":\"List test runner scripts in project root\"},\"tool_response\":{\"stdout\":\"ls: cannot access '*.bat': N","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:04:53Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && ls phpunit* composer* 2>&1 | head\",\"description\":\"Check for phpunit and composer\"},\"tool_response\":{\"stdout\":\"composer.json\\ncomposer.lock\\","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:05:01Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && php phpunit.phar 2>&1 | tail -15\",\"timeout\":300000,\"description\":\"Run full PHPUnit suite\"},\"tool_response\":{\"stdout\":\".....................","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:05:11Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:05:17Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:05:26Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:05:33Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:06:40Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\phases\\\\21-admin-update-view-js-fix\\\\21-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:07:05Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\changelog\\\\2026-05-13.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:07:15Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:07:21Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:07:30Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:07:36Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:07:44Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:07:49Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:07:54Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:08:48Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/shopPRO\" && php phpunit.phar 2>&1 | tail -5\",\"timeout\":300000,\"description\":\"Run PHPUnit full suite\"},\"tool_response\":{\"stdout\":\"......................","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:08:55Z","tool":"Bash","cmd":"where sonar-scanner 2>&1 | head -3\",\"description\":\"Check sonar-scanner availability\"},\"tool_response\":{\"stdout\":\"INFO: Could not find files for the given pattern(s).\",\"stderr\":\"\",\"inte","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:09:03Z","tool":"Bash","cmd":"git tag --sort=-v:refname | head -3\",\"description\":\"Get latest tag\"},\"tool_response\":{\"stdout\":\"v0.352\\nv0.351\\nv0.350\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputE","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:09:39Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\shopPRO\\\\.paul\\\\docs\\\\TECH_CHANGELOG.md","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:09:48Z","tool":"Bash","cmd":"git status --short\",\"description\":\"Git status\"},\"tool_response\":{\"stdout\":\" M .paul/ROADMAP.md\\n M .paul/STATE.md\\n M .paul/changelog/2026-05-13.md\\n M .paul/docs/TECH_CHANGELOG.md\\n M .","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:09:55Z","tool":"Bash","cmd":"git add admin/templates/update/main-view.php .paul/ROADMAP.md .paul/STATE.md .paul/changelog/2026-05-13.md .paul/docs/TECH_CHANGELOG.md .paul/phases/21-admin-update-view-js-fix/ change.md && git statu","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:10:09Z","tool":"Bash","cmd":"git commit -m \"$(cat <<'EOF'\\nfix: dziala aktualizacja systemu i Wyczysc cache na /admin/update/main_view/ (v0.353)\\n\\nZdalny changelog z shoppro.project-dc.pl/updates/changelog.php zwracal\\nniez","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:10:17Z","tool":"Bash","cmd":"git push 2>&1 | tail -10\",\"description\":\"Push to remote\"},\"tool_response\":{\"stdout\":\"remote: . Processing 1 references \\nremote: Processed 1 references in total \\nTo https://","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:10:31Z","tool":"Bash","cmd":"git tag v0.353 && powershell.exe -ExecutionPolicy Bypass -File build-update.ps1 -FromTag v0.352 -ToTag v0.353 -ChangelogEntry \"fix: dziala aktualizacja systemu i Wyczysc cache na /admin/update/main_v","cwd":"/c/visual studio code/projekty/shopPRO"}
{"ts":"2026-05-13T21:10:42Z","tool":"Bash","cmd":"git add updates/0.30/ver_0.353.zip updates/0.30/ver_0.353_manifest.json updates/versions.php updates/changelog-data.html && git commit -m \"build: ver_0.353 - fix aktualizacji systemu i Wyczysc cache ","cwd":"/c/visual studio code/projekty/shopPRO"}

View File

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

View File

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

View File

@@ -0,0 +1,173 @@
---
phase: 21-admin-update-view-js-fix
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- admin/templates/update/main-view.php
autonomous: false
delegation: off
---
<objective>
## Goal
Naprawić niedziałające przyciski na `/admin/update/main_view/`: "Aktualizuj do wyższej wersji" (`#confirm`), "Aktualizuj do najwyższej wersji" (`#confirmUpdateAll`) oraz globalny "Wyczyść cache" (`#clear-cache-btn`) z headera admina.
## Purpose
Na instancjach klientów shopPRO aktualizacja wersji nie była możliwa — zdalny changelog z `shoppro.project-dc.pl/updates/changelog.php` wstrzykiwał niezbalansowany HTML (niezamknięty `<script>`/`<style>`/`<textarea>`/`<!--`), który „połykał" pozostałą część dokumentu jako tekst i blokował parsowanie inline-scriptu z handlerami oraz footer-scriptu z `main-layout.php`. Bez tej naprawy klienci nie mogą aktualizować systemu.
## Output
Zmodyfikowany plik `admin/templates/update/main-view.php`:
1. Blok `<script>` z handlerami przeniesiony PRZED sekcję Changelog.
2. Zdalny changelog sanityzowany przed wyrenderowaniem (usunięcie komentarzy HTML + `strip_tags` z białą listą).
</objective>
<context>
## Project Context
@.paul/PROJECT.md
@.paul/ROADMAP.md
@.paul/STATE.md
## Source Files
@admin/templates/update/main-view.php
@change.md
<clarifications>
- **Scope** — Wystarczy fix zgodny z change.md (jeden plik, dwa kroki)?
→ Odpowiedź: brak pytań — change.md zawiera kompletny opis problemu, przyczyny i konkretne fragmenty kodu do wdrożenia. Plan = mechaniczne wdrożenie change.md.
</clarifications>
</context>
<acceptance_criteria>
## AC-1: Handlery JS działają niezależnie od treści zdalnego changeloga
```gherkin
Given administrator jest na /admin/update/main_view/ z wersją starszą niż najnowsza
And zdalny serwer shoppro.project-dc.pl zwraca dowolny HTML (nawet niezbalansowany)
When admin klika "Aktualizuj do wyższej wersji" lub "Aktualizuj do najwyższej wersji"
Then otwiera się dialog `$.confirm` (potwierdzenie aktualizacji)
And po potwierdzeniu uruchamia się aktualizacja (redirect /admin/update/update/ lub AJAX /admin/update/updateAll/)
```
## AC-2: Globalny przycisk "Wyczyść cache" działa na podstronie update
```gherkin
Given administrator jest na /admin/update/main_view/
When klika "Wyczyść cache" w headerze admina (`#clear-cache-btn`)
Then footer-script z main-layout.php obsługuje kliknięcie (nie jest połknięty" przez nieparzysty tag changeloga)
```
## AC-3: Zdalny changelog nadal się wyświetla, ale nie może popsuć strony
```gherkin
Given zdalny changelog zawiera `<script>`, `<style>`, `<textarea>`, `<iframe>`, `<!--...-->` lub niezamknięte tagi strukturalne
When szablon main-view.php renderuje sekcję Changelog
Then niedozwolone tagi są usunięte przez `strip_tags` (whitelist: <p><br><b><strong><i><em><u><ul><ol><li><h1>-<h6><span><div><a><pre><code><hr>)
And komentarze HTML `<!--...-->` są usuwane
And treść tekstowa changeloga + dozwolone tagi formatujące są widoczne na stronie
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Reorder + sanitize w main-view.php</name>
<files>admin/templates/update/main-view.php</files>
<action>
Wdrożyć zmianę zgodnie z change.md:
1. **Przenieść blok `<script type="text/javascript">...</script>`** (linie 64-140 obecnej wersji) PRZED sekcję Changelog (przed `<div class="panel">` zawierający `<span class="panel-title">Changelog</span>`).
Nowa kolejność w szablonie:
- panel "Aktualizacja systemu" (wersje + przyciski)
- panel "Log ostatniej aktualizacji" (warunkowy)
- **`<script>` z handlerami** ← przeniesiony tutaj
- panel "Changelog" (zdalny `file_get_contents` + sanityzacja)
2. **Zastąpić linię z `file_get_contents`** (obecnie linia 60):
```php
<?= @file_get_contents( 'https://shoppro.project-dc.pl/updates/changelog.php?ver=' . $this->ver ); ?>
```
na blok sanityzacji:
```php
<?php
$changelog = (string) @file_get_contents( 'https://shoppro.project-dc.pl/updates/changelog.php?ver=' . $this->ver );
$changelog = preg_replace( '/<!--.*?-->/s', '', $changelog );
$changelog = strip_tags( $changelog, '<p><br><b><strong><i><em><u><ul><ol><li><h1><h2><h3><h4><h5><h6><span><div><a><pre><code><hr>' );
echo $changelog;
?>
```
Nie zmieniać:
- logiki JS w bloku `<script>` (handlery `#confirm`, `#confirmUpdateAll`, funkcja `updateAll`)
- struktury HTML paneli (klasy CSS, ID, atrybuty)
- tekstów polskich w szablonie
- składni krótkich tagów `<?` (kompatybilność PHP < 8.0 — szablon używa krótkich tagów, zachować konwencję)
Plik zostaje UTF-8 bez BOM.
Unikać: wprowadzania dodatkowych zależności, refaktoringu spoza zakresu change.md, zmiany URL zdalnego changeloga.
</action>
<verify>
1. `php -l admin/templates/update/main-view.php` → "No syntax errors"
2. Grep: `grep -n "strip_tags" admin/templates/update/main-view.php` → linia z whitelistą obecna
3. Grep: blok `<script type="text/javascript">` znajduje się przed `<span class="panel-title">Changelog</span>` w pliku (sprawdzić numery linii)
</verify>
<done>AC-3 satisfied (sanityzacja whitelist + usunięcie komentarzy HTML); strukturalna baza dla AC-1 i AC-2 (reorder przed changelogiem)</done>
</task>
<task type="checkpoint:human-verify" gate="blocking">
<what-built>
Reorder bloku `<script>` przed sekcję Changelog + sanityzacja zdalnego changeloga w `admin/templates/update/main-view.php`.
</what-built>
<how-to-verify>
1. Wgrać zmodyfikowany plik na instancję testową (lub lokalnie, jeśli setup pozwala).
2. Hard-reload (Ctrl+F5) w przeglądarce.
3. Restart PHP-FPM / wyczyścić OPcache (jeśli aktywny).
4. Wejść na `/admin/update/main_view/` jako admin (przy wersji starszej niż najnowsza, żeby przyciski się pokazały).
5. **AC-1:** Kliknąć "Aktualizuj do wyższej wersji" → dialog `$.confirm` musi się otworzyć. To samo dla "Aktualizuj do najwyższej wersji".
6. **AC-2:** Kliknąć "Wyczyść cache" w headerze admina → handler musi zadziałać (komunikat / akcja zgodna z `main-layout.php`).
7. **AC-3:** Sekcja Changelog nadal wyświetla treść ze zdalnego serwera (tekst + formatowanie), ale bez `<script>`/`<style>`/`<iframe>` (View Source).
8. Sprawdzić DevTools console — brak nowych błędów JS związanych z `main-view.php`.
</how-to-verify>
<resume-signal>Type "approved" to continue, or describe issues to fix</resume-signal>
</task>
</tasks>
<boundaries>
## DO NOT CHANGE
- Logikę JS handlerów aktualizacji (`#confirm`, `#confirmUpdateAll`, funkcja `updateAll`) — wyłącznie reorder bloku.
- `admin/templates/site/main-layout.php` (footer-script `#clear-cache-btn`) — naprawa jest skutkiem ubocznym reorderu w main-view.
- URL zdalnego changeloga (`https://shoppro.project-dc.pl/updates/changelog.php`).
- Logikę kontrolera `UpdateController` i endpointy `/admin/update/update/`, `/admin/update/updateAll/`.
- Inne szablony w `admin/templates/update/`.
## SCOPE LIMITS
- Tylko jeden plik: `admin/templates/update/main-view.php`.
- Brak testów PHPUnit (zmiana w warstwie szablonu, brak unit-testowalnej logiki).
- Brak zmian w bazie / migracjach.
- Brak release update package — to robi `/koniec-pracy` po UNIFY.
- Brak zmiany sposobu pobierania changeloga (np. cache, timeout, fallback) — to byłby osobny scope.
</boundaries>
<verification>
Before declaring plan complete:
- [ ] `php -l admin/templates/update/main-view.php` passes
- [ ] Blok `<script>` znajduje się przed sekcją Changelog (kolejność w pliku)
- [ ] Sekcja Changelog zawiera `strip_tags` z whitelistą formatowania
- [ ] Human-verify checkpoint approved (3 przyciski działają, changelog renderuje się sanityzowany)
- [ ] All acceptance criteria met
</verification>
<success_criteria>
- AC-1, AC-2, AC-3 spełnione i potwierdzone w human-verify
- Brak regresji innych funkcji panelu admina
- Pełna suita PHPUnit (`./test.ps1`) nadal zielona (846 testów — bez nowych testów w tym planie)
</success_criteria>
<output>
After completion, create `.paul/phases/21-admin-update-view-js-fix/21-01-SUMMARY.md`
</output>

View File

@@ -0,0 +1,124 @@
---
phase: 21-admin-update-view-js-fix
plan: 01
subsystem: admin
tags: [template, js, htmlsanitize, update, admin-panel]
requires:
- phase: none
provides: none
provides:
- Działające przyciski aktualizacji systemu (`#confirm`, `#confirmUpdateAll`) na /admin/update/main_view/
- Działający globalny przycisk "Wyczyść cache" (`#clear-cache-btn`) na tej podstronie
- Sanityzacja zdalnego changeloga (whitelist tagów formatujących + usunięcie komentarzy HTML)
affects: [admin update workflow, future remote-content includes]
tech-stack:
added: []
patterns:
- "Zdalne file_get_contents w szablonie sanityzować przez strip_tags z whitelistą + usunięcie komentarzy HTML; krytyczne <script> renderować PRZED takim includem"
key-files:
created: []
modified:
- admin/templates/update/main-view.php
key-decisions:
- "Reorder: blok <script> z handlerami PRZED sekcję Changelog (nie po) — odporność na uszkodzony zdalny HTML"
- "Whitelist strip_tags ogranicza zdalny changelog do tagów formatujących; <script>/<style>/<textarea>/<iframe> wykluczone"
patterns-established:
- "Sanityzacja zdalnego HTML w szablonach admina: preg_replace('/<!--.*?-->/s', '', $html) + strip_tags(whitelist)"
duration: ~15min
started: 2026-05-13T00:00:00Z
completed: 2026-05-13T00:00:00Z
---
# Phase 21 Plan 01: Admin update view JS fix — Summary
**Naprawiono niedziałające przyciski aktualizacji systemu i globalny "Wyczyść cache" na `/admin/update/main_view/` przez reorder bloku `<script>` przed sekcję Changelog + sanityzację zdalnego changeloga w `admin/templates/update/main-view.php`.**
## Performance
| Metric | Value |
|--------|-------|
| Duration | ~15min |
| Tasks | 1 auto + 1 checkpoint:human-verify |
| Files modified | 1 |
| Tests | 846 / 2348 asercji — OK |
## Acceptance Criteria Results
| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Handlery JS działają niezależnie od treści zdalnego changeloga | Pass | Blok `<script>` w linii 55, przed sekcją Changelog w linii 135 — handlery `#confirm`/`#confirmUpdateAll` podpinają się przed parsowaniem zdalnego HTML |
| AC-2: Globalny "Wyczyść cache" działa na podstronie update | Pass | Footer-script z `main-layout.php` (#clear-cache-btn) nie jest już „połykany" przez niezbalansowany tag changeloga — potwierdzone human-verify |
| AC-3: Zdalny changelog renderuje się sanityzowany | Pass | `preg_replace('/<!--.*?-->/s', '', ...)` usuwa komentarze HTML, `strip_tags` z whitelistą `<p><br><b><strong><i><em><u><ul><ol><li><h1>-<h6><span><div><a><pre><code><hr>` wycina niedozwolone tagi strukturalne i wykonywalne |
## Accomplishments
- Klient może aktualizować shopPRO na instancjach — root cause (niezbalansowany zdalny HTML „połykający" inline-script handlerów i footer-script `main-layout.php`) wyeliminowany przez reorder + sanityzację.
- Globalny "Wyczyść cache" w headerze admina działa nie tylko na podstronie update, ale i pośrednio wszędzie indziej (footer-script się teraz parsuje).
- Dodatkowy zysk bezpieczeństwa: zdalny `shoppro.project-dc.pl/updates/changelog.php` nie może już wstrzyknąć `<script>`/`<style>`/`<iframe>` w panel admina.
## Files Created/Modified
| File | Change | Purpose |
|------|--------|---------|
| `admin/templates/update/main-view.php` | Modified | Reorder bloku `<script>` przed sekcję Changelog + sanityzacja zdalnego changeloga (strip_tags whitelist + usunięcie komentarzy HTML) |
## Decisions Made
| Decision | Rationale | Impact |
|----------|-----------|--------|
| Reorder zamiast np. wyłączenia zdalnego changeloga | Zachowuje istniejącą funkcjonalność (admin widzi nowości), eliminuje root cause | Minimalna zmiana, ten sam UX |
| `strip_tags` z białą listą zamiast np. iframe sandbox | Najprostszy, zerowy narzut, działa na PHP 7.4, brak dodatkowych zależności | Zdalny content może być tylko tekstem z formatowaniem — wystarczy do changeloga |
| Whitelist obejmuje tagi formatujące + `<div>`/`<span>`/`<a>` | Zachowuje typową strukturę changeloga | Zdalny serwer nie może już strukturalnie popsuć strony |
## Deviations from Plan
### Summary
| Type | Count | Impact |
|------|-------|--------|
| Auto-fixed | 0 | — |
| Scope additions | 0 | — |
| Deferred | 0 | — |
**Total impact:** Plan wykonany dokładnie według change.md, bez odstępstw.
### Deferred Items
None.
## Issues Encountered
| Issue | Resolution |
|-------|------------|
| `./test.ps1` z CLAUDE.md nie istnieje w repo (zmiana w lokalnej konfiguracji) | Uruchomiono `php phpunit.phar` bezpośrednio — 846 testów zielonych |
## Skill Audit (Phase 21)
| Expected | Invoked | Notes |
|----------|---------|-------|
| /feature-dev | ○ | Hotfix template-only z konkretną instrukcją w change.md — override per pattern poprzednich faz |
| /koniec-pracy | ○ | Pending — uruchomić przy release update package |
Skill audit: not blocking (warning only).
## Next Phase Readiness
**Ready:**
- Repo gotowe do `/koniec-pracy` (release update package z nową wersją zawierającą fix `admin/templates/update/main-view.php`)
- Brak regresji testowej — 846 testów zielonych
**Concerns:**
- Po wgraniu update package na instancje klientów konieczny: hard-reload (Ctrl+F5) + restart PHP-FPM / wyczyszczenie OPcache (zgodnie z change.md sekcja "Po wgraniu")
**Blockers:**
- None
---
*Phase: 21-admin-update-view-js-fix, Plan: 01*
*Completed: 2026-05-13*

File diff suppressed because one or more lines are too long

View File

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

View File

@@ -52,15 +52,6 @@
</div>
<? endif; ?>
<div class="panel">
<div class="panel-heading">
<span class="panel-title">Changelog</span>
</div>
<div class="panel-body">
<?= @file_get_contents( 'https://shoppro.project-dc.pl/updates/changelog.php?ver=' . $this->ver ); ?>
</div>
</div>
<script type="text/javascript">
$(function() {
var version_current = <?= $this->ver; ?>;
@@ -138,3 +129,17 @@ $(function() {
}
});
</script>
<div class="panel">
<div class="panel-heading">
<span class="panel-title">Changelog</span>
</div>
<div class="panel-body">
<?php
$changelog = (string) @file_get_contents( 'https://shoppro.project-dc.pl/updates/changelog.php?ver=' . $this->ver );
$changelog = preg_replace( '/<!--.*?-->/s', '', $changelog );
$changelog = strip_tags( $changelog, '<p><br><b><strong><i><em><u><ul><ol><li><h1><h2><h3><h4><h5><h6><span><div><a><pre><code><hr>' );
echo $changelog;
?>
</div>
</div>

56
change.md Normal file
View File

@@ -0,0 +1,56 @@
# Zmiana 3: Naprawa JS na stronie /admin/update/main_view/ (przyciski aktualizacji + Wyczyść cache)
## Plik
`admin/templates/update/main-view.php`
## Problem
Na podstronie `/admin/update/main_view/` nie działały:
- przycisk **„Aktualizuj do wyższej wersji"** (`#confirm`)
- przycisk **„Aktualizuj do najwyższej wersji"** (`#confirmUpdateAll`)
- globalny przycisk **„Wyczyść cache"** (`#clear-cache-btn`) z headera admina
W konsoli przeglądarki **nie było żadnego błędu JS**. Kliknięcie powodowało jedynie dopisanie `#` do URL-a (`/admin/update/main_view/#`).
## Przyczyna
W szablonie znajdowało się pobieranie zdalnego changeloga przez `file_get_contents` z `https://shoppro.project-dc.pl/updates/changelog.php`:
```php
<?= @file_get_contents( 'https://shoppro.project-dc.pl/updates/changelog.php?ver=' . $this->ver ); ?>
```
Odpowiedź zdalnego serwera zawierała niezbalansowany HTML (np. niezamknięty `<script>`, `<!--`, `<style>` albo `<textarea>`), który „połykał" całą resztę dokumentu jako tekst wewnątrz tego nieparzystego tagu. Skutki:
- Inline-script z handlerami przycisków aktualizacji (zaraz pod changelogiem) nie był parsowany jako JS.
- Footer-script z `main-layout.php` (handler `#clear-cache-btn` i globalne wyszukiwanie) też był „w środku" połkniętego HTML i nigdy się nie uruchamiał na tej podstronie.
- Konsola nie pokazywała błędu, bo to nie był błąd JS — to był po prostu HTML, który nigdy nie został wykonany jako skrypt.
## Co zmieniono
### 1. Blok `<script>` z handlerami przeniesiony przed sekcję Changelog
Wcześniej kolejność w szablonie była: panel z wersjami → log → **changelog (zdalny)**`<script>`. Po zmianie: panel z wersjami → log → **`<script>`** → changelog (zdalny). Dzięki temu handlery `#confirm` i `#confirmUpdateAll` podpinają się niezależnie od tego, co zwróci zdalny serwer.
### 2. Sanitizacja odpowiedzi zdalnego changeloga
Przed wyrenderowaniem changelog jest czyszczony:
```php
$changelog = (string) @file_get_contents( 'https://shoppro.project-dc.pl/updates/changelog.php?ver=' . $this->ver );
$changelog = preg_replace( '/<!--.*?-->/s', '', $changelog );
$changelog = strip_tags( $changelog, '<p><br><b><strong><i><em><u><ul><ol><li><h1><h2><h3><h4><h5><h6><span><div><a><pre><code><hr>' );
echo $changelog;
```
- Usuwane są komentarze HTML (`<!--…-->`).
- `strip_tags` z wąską białą listą zostawia tylko tagi formatujące — wszystkie tagi strukturalne i mogące „połknąć" treść (`<script>`, `<style>`, `<textarea>`, `<iframe>`, `<body>`, `</html>` itp.) są usuwane.
### 3. Naprawiony też skutek uboczny
Po tych zmianach poprawnie działa również:
- footer-script z `main-layout.php` (przycisk **Wyczyść cache** + globalne wyszukiwanie produktów/zamówień + sprawdzanie aktualizacji w menu)
## Efekt
- Przyciski aktualizacji systemu na `/admin/update/main_view/` działają.
- Przycisk „Wyczyść cache" działa na tej (i każdej innej) podstronie admina.
- Zdalny changelog ze `shoppro.project-dc.pl` nadal się wyświetla, ale nie może już popsuć struktury strony.
- Dodatkowy zysk bezpieczeństwa: zdalny serwis nie może wstrzyknąć JS w panel admina.
## Po wgraniu
1. Hard-reload przeglądarki (Ctrl+F5) — stary HTML siedzi w cache klienta.
2. Restart PHP-FPM / wyczyszczenie OPcache — inaczej stary skompilowany szablon dalej będzie serwowany.

BIN
updates/0.30/ver_0.351.zip Normal file

Binary file not shown.

View File

@@ -0,0 +1,23 @@
{
"changelog": "FIX - poprawne metatagi \u003ctitle\u003e/\u003cdescription\u003e/\u003ckeywords\u003e dla stron kategorii i produktow (eliminacja wycieku meta_title homepage)",
"version": "0.351",
"files": {
"added": [
],
"deleted": [
],
"modified": [
"autoload/front/LayoutEngine.php"
]
},
"checksum_zip": "sha256:046d0504accf29a57fea155ecaa2acfe09078379e43118af7bf6c0f4831a3e5f",
"sql": [
],
"date": "2026-05-13",
"directories_deleted": [
]
}

BIN
updates/0.30/ver_0.352.zip Normal file

Binary file not shown.

View File

@@ -0,0 +1,23 @@
{
"changelog": "FIX - poprawne polskie znaki w labelkach formularza edycji kategorii w panelu admina (mojibake)",
"version": "0.352",
"files": {
"added": [
],
"deleted": [
],
"modified": [
"admin/templates/shop-category/category-edit.php"
]
},
"checksum_zip": "sha256:4b51cb1508978f6dc9659ce26c143961eaed6c3d3bb27b47623eaea5b4fa4855",
"sql": [
],
"date": "2026-05-13",
"directories_deleted": [
]
}

BIN
updates/0.30/ver_0.353.zip Normal file

Binary file not shown.

View File

@@ -0,0 +1,23 @@
{
"changelog": "fix: dziala aktualizacja systemu i Wyczysc cache na /admin/update/main_view/ (sanityzacja zdalnego changeloga + reorder script)",
"version": "0.353",
"files": {
"added": [
],
"deleted": [
],
"modified": [
"admin/templates/update/main-view.php"
]
},
"checksum_zip": "sha256:86706999cd251c2c06e4b4d5875d049164ad510e60963bf8482f9bb8e6e924eb",
"sql": [
],
"date": "2026-05-13",
"directories_deleted": [
]
}

View File

@@ -1,3 +1,12 @@
<b>ver. 0.353 - 13.05.2026</b><br />
fix: dziala aktualizacja systemu i Wyczysc cache na /admin/update/main_view/ (sanityzacja zdalnego changeloga + reorder script)
<hr>
<b>ver. 0.352 - 13.05.2026</b><br />
FIX - poprawne polskie znaki w labelkach formularza edycji kategorii w panelu admina (mojibake)
<hr>
<b>ver. 0.351 - 13.05.2026</b><br />
FIX - poprawne metatagi <title>/<description>/<keywords> dla stron kategorii i produktow (eliminacja wycieku meta_title homepage)
<hr>
<b>ver. 0.350 - 30.04.2026</b><br />
FIX - linki produktow z permutacja w feedzie Google (separator _)
<hr>

View File

@@ -1,5 +1,5 @@
<?
$current_ver = 350;
$current_ver = 353;
for ($i = 1; $i <= $current_ver; $i++)
{