--- phase: 02-admin-panel-upgrade plan: 01 type: execute wave: 1 depends_on: ["01-01"] files_modified: - src/Core/Database/Migrator.php - src/Controllers/SettingsController.php - src/Controllers/StatLinkController.php - templates/layout/sidebar.php - templates/layout/main.php - templates/settings/index.php - templates/settings/database.php - templates/statlink/index.php - config/routes.php - assets/css/app.css autonomous: true delegation: off --- ## Goal Rozbudowa panelu administracyjnego backPRO o trzy funkcje: 1. Panel migracji bazy danych (wzorowany na orderPRO Migrator) 2. Nowoczesne lewe menu sidebar (wzorowane na orderPRO) 3. Lista publikacji StatLink — przegląd linkowanych artykułów ## Purpose Usprawnienie zarządzania projektem — migracje bez ręcznego SSH, lepszy UX nawigacji, widoczność statusu linkowania StatLink. ## Output - `Migrator.php` — engine migracji (port z orderPRO, dostosowany do backPRO) - Nowy sidebar z grupowaniem, ikonami SVG, collapse/expand - Widok `/statlink` z listą aktywnych/wygasłych linków StatLink - Endpoint migracji `/settings/database/migrate` ## Project Context @.paul/PROJECT.md @.paul/ROADMAP.md @.paul/STATE.md ## Source Files — backPRO @templates/layout/sidebar.php @templates/layout/main.php @assets/css/app.css @src/Controllers/SettingsController.php @config/routes.php ## Reference — orderPRO (wzorce do adaptacji) - Migrator: C:\visual studio code\projekty\orderPRO\src\Core\Database\Migrator.php - Sidebar: C:\visual studio code\projekty\orderPRO\resources\views\layouts\app.php (lines 18-116) - Database view: C:\visual studio code\projekty\orderPRO\resources\views\settings\database.php - CSS sidebar: C:\visual studio code\projekty\orderPRO\public\assets\css\app.css (sidebar section) ## AC-1: Panel migracji bazy danych ```gherkin Given użytkownik zalogowany w panelu backPRO When przechodzi do /settings/database Then widzi statystyki migracji (total, applied, pending) And widzi listę oczekujących plików migracji And może kliknąć "Uruchom migracje" aby wykonać pending migracje And po wykonaniu widzi logi z wynikami (ok/error per plik) ``` ## AC-2: Nowy sidebar ```gherkin Given użytkownik zalogowany w panelu When widzi lewe menu Then menu ma nowoczesny wygląd (ciemne tło, ikony SVG, grupy rozwijane) And sekcje: Główne (Dashboard, Strony, SEO Stats), Treści (Tematy, Artykuły, StatLink), Administracja (Instalator, Ustawienia z sub-menu, Logi) And aktywna strona jest podświetlona And menu można zwinąć/rozwinąć ``` ## AC-3: Lista publikacji StatLink ```gherkin Given użytkownik przechodzi do /statlink Then widzi tabelę z linkami StatLink (artykuł, URL, anchor, data dodania, wygasa, status) And linki aktywne są zielone, wygasłe szare, failed czerwone And widzi podsumowanie: X aktywnych, Y wygasłych, Z błędów ``` Task 1: Migrator engine + controller + widok migracji src/Core/Database/Migrator.php, src/Controllers/SettingsController.php, templates/settings/database.php, config/routes.php 1. Skopiować i dostosować Migrator.php z orderPRO: - Namespace: App\Core\Database - Zmienić lock name na 'backpro_migrations_lock' - Używa istniejącego Database::getInstance() do PDO - Ścieżka migracji: basePath/migrations/ - Bez zmian w logice (ensureMigrationsTable, runPending, status) 2. Dodać metody do SettingsController: - database(): GET /settings/database — wyświetla status migracji - Tworzy Migrator z Database::getInstance() i ścieżką migrations - Przekazuje $status = $migrator->status() do widoku - migrate(): POST /settings/database/migrate — uruchamia migracje - Wywołuje $migrator->runPending() - Flash success/error + redirect do /settings/database 3. Dodać routes: - $router->get('/settings/database', 'SettingsController', 'database'); - $router->post('/settings/database/migrate', 'SettingsController', 'migrate'); 4. Utworzyć templates/settings/database.php: - Statystyki: total, applied, pending (3 karty) - Alert warning jeśli pending > 0 + przycisk "Uruchom migracje" - Tabela z pending files - Logi po wykonaniu (jeśli dostępne) - Styl: użyj istniejących klas Bootstrap z backPRO Avoid: nie zmieniaj istniejącego install.php — Migrator to nowy, równoległy mechanizm. Avoid: nie usuwaj istniejącej metody index() ani update() z SettingsController. PHP lint na wszystkich zmienionych plikach AC-1 satisfied: panel migracji z Migratorem dostępny pod /settings/database Task 2: Nowy sidebar wzorowany na orderPRO templates/layout/sidebar.php, templates/layout/main.php, assets/css/app.css 1. Przepisać sidebar.php na nowy format z orderPRO: - Struktura: aside.sidebar > div.sidebar__brand + nav.sidebar__nav - Grupy rozwijane: details.sidebar__group > summary.sidebar__group-toggle + div.sidebar__group-links - Ikony SVG inline (nie Bootstrap Icons CDN) - Collapse button w brand area Sekcje menu: a) Grupa "Główne": - Dashboard (/) — ikona: dashboard/home - Strony WP (/sites) — ikona: globe - Statystyki SEO (/seo/stats) — ikona: chart b) Grupa "Treści": - Biblioteka Tematów (/global-topics) — ikona: book - Artykuły (/articles) — ikona: document - StatLink (/statlink) — ikona: link/chain c) Grupa "Administracja": - Instalator WP (/installer) — ikona: download - Ustawienia (/settings) — sub-links: - Ustawienia API (/settings) - Baza danych (/settings/database) - Dziennik zdarzeń (/logs) — ikona: list d) Footer: użytkownik + wyloguj (jak obecny) 2. Active state: użyj zmiennej $activeMenu przekazywanej z kontrolera - Grupy auto-open gdy aktywna strona jest w grupie 3. Dodać CSS sidebar do app.css (skopiować sekcję sidebar z orderPRO app.css): - .sidebar: dark bg (#0f172a), 260px width, fixed left - .sidebar.is-collapsed: 52px width, hide labels - .sidebar__brand, __nav, __link, __group, __sublink - Hover, active states, transitions - Responsive: mobile overlay z backdrop 4. Zaktualizować main.php: - Dodać .app-shell wrapper - Dodać sidebar-backdrop div - Dodać JS do collapse/expand Avoid: nie usuwaj istniejących stylów z app.css — dodaj nowe sekcje sidebar na końcu. Avoid: zachowaj aktualną zmienną $activeMenu i Router::isCurrent(). PHP lint + wizualna weryfikacja (sidebar renderuje się poprawnie) AC-2 satisfied: nowy sidebar z grupami, ikonami SVG, collapse Task 3: Widok listy StatLink + route src/Controllers/StatLinkController.php, templates/statlink/index.php, config/routes.php 1. Dodać metodę index() do StatLinkController: - Auth::requireLogin() - Pobrać z bazy statlink_links z JOIN na articles i sites - Podsumowanie: count active, expired, removed, failed - Paginacja (20 per page) - Przekazać do widoku 2. Dodać route: $router->get('/statlink', 'StatLinkController', 'index'); 3. Utworzyć templates/statlink/index.php: - Nagłówek z 4 kartami statystyk (active, expired, removed, failed) — kolorowe - Tabela: - Artykuł (tytuł + link do /articles/{id}) - Strona (nazwa site) - URL linkowany - Anchor - Data dodania - Wygasa - Status (badge: zielony=active, szary=expired/removed, czerwony=failed) - StatLink ID - Sortowanie domyślne: added_at DESC - Paginacja na dole Avoid: nie modyfikuj istniejącej metody runByToken() w StatLinkController. PHP lint + endpoint /statlink zwraca stronę z tabelą AC-3 satisfied: lista StatLink z tabelą i statystykami ## DO NOT CHANGE - src/Services/StatLinkService.php (dopiero co utworzony) - src/Services/PublisherService.php - src/Models/Article.php - migrations/* (istniejące migracje) - install.php (istniejący mechanizm) ## SCOPE LIMITS - Nie dodajemy CRUD dla statlink_links (tylko podgląd) - Nie przenosimy istniejących ustawień do nowego formatu - Sidebar: adaptacja orderPRO designu, nie kopia 1:1 Before declaring plan complete: - [ ] php -l na wszystkich zmienionych/nowych plikach PHP - [ ] /settings/database pokazuje status migracji - [ ] POST /settings/database/migrate wykonuje pending migracje - [ ] Sidebar renderuje się z nowymi grupami i ikonami - [ ] /statlink pokazuje listę linków z tabeli statlink_links - [ ] Aktywne linki w menu są podświetlone - 3 taski wykonane - Panel migracji działa end-to-end - Sidebar wygląda jak w orderPRO (adaptacja do backPRO) - Lista StatLink pokazuje dane z tabeli - Brak regresji w istniejącej funkcjonalności After completion, create `.paul/phases/02-admin-panel-upgrade/02-01-SUMMARY.md`