# Stav projektu – kontrolní seznam
Aktualizováno: 2025-11-10
Legenda:
- [x] hotovo / funguje
- [ ] k opravě / k doplnění
---
## Přehled priorit (P1 = kritické)
- [x] P1: Komentáře
- [x] Backend panic (regex v spam filtru) – odstraněny backreference v Go regex, nahrazeno kontrolou opakování
- [x] Komentáře se nezobrazují (admin i frontend)
- [x] P1: Scoreboard Remote
- [x] 415 (Unsupported Media Type) – sjednocen Content-Type pro timer endpointy
- [x] CORS pro `/api/v1/admin/scoreboard/*`
- [x] Časovač – ověřit start/stop a další akce
- [x] P1: Články
- [x] Auto-save vrací 400 (validace payloadu)
- [x] Vazba na soutěž (alias) – výběr aliasu nevrací zápasy
- [x] P1: Ankety – tvorba/napojení OK (Aktivity i Články)
- [x] P1: Frontend chyby „toLowerCase of undefined“
- [x] Admin Hráči
- [x] Admin Články
---
## Admin
- **Nástěnka**
- [x] plně funkční
- **Analytika**
- [x] plně funkční
- **Týmy**
- [x] Opravit overrides loga + zkrácené názvy s tečkami
- [x] Normalizace názvů (ignorovat tečky/mezery, např. „Frýdlant n. O.“, „Frenštát p. R.“)
- [x] Deduplikace výsledků vyhledávání FAČR (opakované položky)
- [x] Přidat/ověřit overrides v `team_logo_overrides.json`
- [x] 1. BFK Frýdlant n. O. – URL: http://logoapi.sportcreative.eu/logos/35e4f595-f2a7-4c0c-abd7-73926f33d687?format=png
- [x] SK Beskyd Frenštát p. R. – URL: http://logoapi.sportcreative.eu/logos/831702b0-cf90-4d94-9878-b1389b6a72b4?format=png
- [x] Zajistit propagaci do veřejné části (zápasy, tabule, soupisky)
- **Zápasy**
- [x] plně funkční
- **Hráči**
- [x] Odstranit národnost a věk z homepage i z /hraci
- [x] Opravit chybu „toLowerCase of undefined“ (bezpečné zacházení s prázdnými poli ve filtrech/tabulce)
- **Aliasy soutěží**
- [x] Odebrat UI „Přidat nový alias“ (pouze číst z FAČR)
- **Tabule (Scoreboard)**
- [x] Odstranit `:before` pilulku z bloku týmu (viz `
...`)
- [x] Sjednotit vzhled overlay pro sponzory a skóre se scoreboardem
- **Scoreboard Remote**
- [x] Opravit CORS pro `/api/v1/admin/scoreboard/*`
- [x] 415 – sjednotit Content-Type (u timer endpointů povolen POST bez JSON)
- [x] Ověřit start/stop timeru a ostatní akce
- **Články**
- [x] Kategorie (soutěž) – po výběru aliasu nevrací zápasy
- [x] Rich text editor – „addRange()“/výběr; stabilizovat editaci
- [x] Auto-save 400 (validace payloadu, povolená pole, příznaky publikace)
- [x] Detail článku (veřejná část):
- [x] Pravý sloupec – nadcházející zápasy dle kategorie
- [x] Video – skrýt název (ponechat pouze video)
- [x] Galerie – zobrazit
- [x] Ankety – zobrazit
- [x] Komentáře – zobrazit
- **Aktivity**
- [x] plně funkční
- **Ankety**
- [x] Vytváření/napojení ankety (v Aktivitách i v Článcích)
- [x] Zajistit plně funkční styly/varianty a zobrazení (admin i public)
- **Kategorie**
- [x] plně funkční
- **Komentáře**
- [x] Backend panic v regex (spam filtr) – odstraněny backreference v Go regex, nahrazeno kontrolou opakování
- [x] Komentáře se nezobrazují v adminu ani na frontendu
- **Videa**
- [x] Povolit přepis názvu videa (override) – zobrazit v adminu i na frontendu
- [x] Na frontendu potlačit titulek tam, kde je požadováno (např. v detailu článku)
- **Galerie**
- [x] Přidat tlačítko pro přidání dalšího alba (napojit na fetch endpointy)
- **Soubory**
- [x] Změnit defaultní kvótu úložiště na 5 GB (z 1 GB)
- **Zprávy (Kontakty)**
- [x] /kontakt – po odeslání končí na „loading“, přitom zpráva přijde
- [x] /sponzori – duplicity zpráv; chybné označení zdroje (kontakt vs sponzoři)
- [x] Automatické přeposílání – neprobíhá; opravit trigger/retry
- **Newsletter**
- [x] Auto-aktivace všech typů newsletteru, pokud existuje alespoň 1 aktivní odběratel
- [x] Opravit 500 na `POST /api/v1/admin/newsletter/send-digest`
- **Kontakty (admin – Kontakty tab)**
- [x] „Přidat kontakt“ – dropdown Kategorie je prázdný; doplnit soutěže a aliasy (stejně jako v Článcích)
- **Sponzoři**
- [x] plně funkční
- **Bannery**
- [x] plně funkční
- **Oblečení**
- [x] plně funkční
- **Soutěže (Sweepstakes)**
- [x] „Počet výherců“ – zlepšit zadávání (volné psaní, validace), přidat rate limit na max. výherce
- [x] „Souhrn výher“ → nahradit „Přidat výhry“ s presety pro rychlé přidání položek
- [x] Odebrat „Vstupné (Kč)“ (používáme body)
- [x] Nahrání titulního obrázku – 400 při create; opravit upload a validaci
- **Odměny & Úspěchy**
- [x] Zlepšit UI/UX; na frontendu skrýt pro roli admin (ponechat pro běžné uživatele)
- [ ] Ověřit kompletní tok (uplatnění, upload avataru, dostupnost odměn)
- **Zkrácené odkazy**
- [x] plně funkční
- **Prefetch & Cache**
- [x] plně funkční
- **Nastavení**
- [x] Odebrat kartu „Monitoring“ (je automatická, ne-admin)
- **Uživatelé**
- [x] Přeložit celé UI do češtiny (lista, popup vytvoření uživatele atd.)
- [x] Role „editor“ = omezený admin bez 403 (tvorba/úprava obsahu, bez plných práv)
- **Navigace (Admin)**
- [x] Skrytá položka má zůstat viditelná v adminu pro opětovné zobrazení
- [x] Přesun mezi kategoriemi (drag & drop) – musí fungovat i napříč kategoriemi
- [x] „Upravit“ – správný cíl (neplést podkategorii/page s hlavní kategorií)
- **Dokumentace**
- [x] plně funkční
- **Odhlásit se**
- [x] plně funkční
---
## Veřejná část (frontend)
- **Homepage / Hráči**
- [x] Odebrat národnost a věk z dlaždic hráčů
- **Detail článku**
- [x] Pravý sloupec: nadcházející zápasy dle kategorie
- [x] Video bez titulku (ponechat pouze video prvek)
- [x] Galerie, Ankety, Komentáře – zobrazit, když jsou k dispozici
- **/hraci (seznam)**
- [x] Odebrat národnost ze seznamu
---
## Backend & API
- **Komentáře – chyba (fatal)**
- [x] Oprava regexu ve spam filtru: `invalid escape sequence: \1` – nahrazeno kontrolou opakování bez backreferencí (Go nepodporuje backreference)
- [x] Stabilizovat vytváření komentářů + návrat do adminu/frontendu
- **Scoreboard Remote – CORS/415**
- [x] Přidat CORS hlavičky pro admin remote endpoints
- [x] Ujednotit Content-Type (server akceptuje POST bez JSON pro timer akce)
- **Články – 400 Bad Request (auto-save)**
- [x] Zkontrolovat požadovaný payload na backendu (políčka `published`, `slug`, `youtube_*`, `attachments` atp.)
- [x] Sladit validaci se skutečným JSONem z frontendu
- **Newsletter – 500 na send-digest**
- [x] Logy, validace šablon a vstupů; graceful error + retry
- [x] Auto-aktivace typů při existenci odběratelů
- **Kontakty**
- [x] Odlišit zdroj (kontakt vs sponzoři) v uložených zprávách
- [x] Opravit duplicity a loading stav po submitu
- [x] Zajistit automatické přeposílání (resend) dle nastavení
- **Soutěže (upload)**
- [x] Opravit create 400 (multipart/form-data nebo JSON + upload pipeline)
---
## Zachycené chyby (výňatek)
- Backend fatal (POST /api/v1/comments):
- `regexp: Compile(([a-zA-Z!?.])\1{4,}): invalid escape sequence: \1` → upravit regex a ošetření
- Frontend (Admin Hráči, Admin Články):
- `Cannot read properties of undefined (reading 'toLowerCase')` → bezpečné mapování/filtrace
- Scoreboard Remote:
- CORS blokace + `415 Unsupported Media Type` při `POST /api/v1/admin/scoreboard/timer/start`
- Články – editor/autosave:
- `addRange(): The given range isn't in document.` (výběr v editoru)
- `PUT /api/v1/articles/:id` → 400 (Bad Request)
- Newsletter:
- `POST /api/v1/admin/newsletter/send-digest` → 500
---
## Poznámky k implementaci
- Úpravy názvů týmů s tečkami: vytvořit normalizační vrstvu (strip teček, diakritika, mezery) pro porovnávání i při zápisu overrides.
- UI skrytí prvků (aliasy soutěží, monitoring v Nastavení) řešit podmíněným renderem i na úrovni backend schématu/feature flagu.
- Před nasazením spustit integrační testy: komentáře, ankety, články (autosave), scoreboard remote, newsletter digest.