Istorija izmena
Kompletna istorija razvoja sajta
12. maj 2026.
18Marketplace Phase 5: admin moderacija (sakrivanje/vraćanje/istorija promena), filteri kataloga (samo sa slikama, otvoreno za ponude, dostava), draft oglasi sa preview-om za prodavca, životni ciklus dogovora (prihvaćena ponuda → rezervisano → prodato), trust signali na profilu prodavca, podešavanja obaveštenja po vrsti, health dashboard za admine, proširene help sekcije (bezbednost kupovine i prodaje, zabranjeni predmeti, privatnost kontakta, disclaimer).
Marketplace: dugme „Zanima me“ spojeno sa „Sačuvaj“ u jedan signal. Detalj oglasa sada ima samo jedno dugme, prodavac vidi javni broj i listu kupaca koji su sačuvali oglas (sa datumom) na istoj kartici. Stranica /shop/my/interested uklonjena, brojač na /shop/my/listings sada vodi direktno na listu sačuvanih kupaca. Help sekcija ažurirana.
Bug: na izmeni oglasa fotografije nisu mogle da se dodaju. Razlog: PhotoUploader je slao sirov fajl iz telefona (3-5 MB) na presign, koji je odbijao sve preko 500 KB → generička greška „upload error“. Dodato klijent-side smanjenje + konverzija u WebP (max 1600 px, ≈400 KB) pre upload-a, /shop/sell/<id>/edit sada prikazuje sve postojeće fotografije sa „X“ za brisanje, nova DELETE ruta /api/listings/<id>/photos/<photoId> briše DB red i čisti R2. Limit na serveru podignut na 1.5 MB kao bezbedna granica.
Zatvorena dyra u privatnosti: anon Supabase ključ je do sada dao bilo kome pristup contact_phone/contact_telegram/contact_whatsapp/contact_other svih odobrenih profila preko PostgREST direktnog upita (profiles_select USING true + table-level SELECT grant). Migracija revoke-uje table-level SELECT od anon-a i ponovo grant-uje samo bezbedne kolone — contact_* anon više ne vidi (vraća 42501). Adminski/marketplace tokovi prolaze kao authenticated i rade kao i pre. Bonus: usput sređena kupovina koja je padala kad se trogue filtersa kombinovala sa paginacijom.
Nova sekcija /shop/services — usluge (oštrenje, popravka, treninzi, iznajmljivanje leda) odvojene od kataloga oglasa. Provider podiže ponudu (naslov, opis, cena, jedinica, grad); kontakti se uzimaju iz profila. Veza u headeru shopa, sajt u sitemap-u sa Schema.org Service JSON-LD-om za rich rezultate. Anonimni vide opis i cenu, kontakti otkriveni samo prijavljenim korisnicima.
Marketplace, srpski jezik: zamenjeni ijekavski oblici na ekavske (sajt je na srpskom, ne hrvatskom/bosanskom). „Lijeva (LH)“ → „Leva (LH)“ (filter strane hvataljke kod štapova i vratarske opreme), „Krivulja“ → „Krivina“ (oznaka krivine štapa).
Detaljne stranice (/roster/<slug>, /games/<slug>, /events/<slug>, /tournaments/<slug>) više se ne pretplaćuju na kolekcijske tagove (TAG.roster/games/events/tournaments/stats/teams) — samo na svoj per-ID tag. Pre toga jedan admin save na bilo kog igrača flush-ovao je svih 45 stranica igrača × 3 lokala = 135 ISR Writes po izmeni. Sad — 3. ~50× redukcija na detail-page izlivima. Slug→entity lookup uklonjen iz unstable_cache: čitamo jedan red iz baze na svaki render (jeftino), ali stranica više nije gerojzakažena za invalidaciju kolekcijskim tagom.
Smanjeno potrošnje ISR Writes na Vercelu: tagsForEntity više ne flush-uje home tag iz profile/team/event/tournament/training/game_stats — daily revalidate je dovoljan za te widget-e. Lista pretplata home stranice istanjena (skinuti roster/teams/tournaments). Aggregate stranice (/stats, /gallery, /events) prebačene na 7-dnevni revalidate umesto dnevnog — on-demand flush preko revalidateTag i dalje radi. Očekivano: <1/3 dosadašnjih ISR Writes/dan.
Marketplace SEO pass: shop.propeleri.rs sada ima svoj sitemap.xml (kategorije + svi aktivni oglasi + javni prodavci, ~350 URL-ova) i robots.txt koji isključuje /shop/admin, /shop/my, /shop/login itd. JSON-LD na detalji oglasa: Product (cena, valuta, dostupnost, prodavac, stanje) + BreadcrumbList; LocalBusiness na /shop home. Sve javne stranice imaju canonical na shop.propeleri.rs, generateMetadata sa opisom i OG/Twitter card-ovima; sold oglasi → noindex; privatne stranice (admin/my/sell/settings/login/register/disabled/notifications) zatvorene metadata robots: noindex.
Marketplace: dodato sortiranje kataloga — Preporučeno (default), Prvo novi, Prvo stari, Prvo jeftiniji, Prvo skuplji. Sort radi i preko valuta: u bazi je generisana kolona `price_rsd` (RSD-ekvivalent koristeći 117 RSD/EUR), pa cene u evrima i dinarima sortiraju zajedno bez čudnih skokova. Promena sortiranja resetuje page=1.
Marketplace filter fix: hokejaške pantalone sada koriste prostu odeću S/M/L/XL/XXL skalu umesto strukova u inčima, a polje „Kroj“ (Regular/Tapered/Loose) je uklonjeno — kupci nisu filtrirali po njemu, a prodavci su pogađali. Postojeći oglasi se migriraju (28-30"→S, 32-34"→M, 36"→L, 38-40"→XL). Vratarska oprema: filter „Strana hvataljke“ (LH/RH) sada se vidi i pre nego što kupac odabere `kind` — ranije je bio sakriven sve dok se ne klikne pads/catcher/blocker.
Marketplace: toggle EUR/RSD u filtrima — svaki oglas se prikazuje u odabranoj valuti sa ≈ prevodom i originalnom cenom ispod. Tekst marketplace-a ažuriran: platforma je otvorena za hokejiste svih timova, ne samo HC Propeleri.
Marketplace: katalog se sada otvara osetno brže — lista kategorija je u unstable_cache (1h, deljen između /shop i /shop/[slug]), generateMetadata i page handler dele isti React `cache()` poziv, a auth/blocked/listing upiti idu paralelno umesto sekvencijalno. Dodata paginacija (?page=N) sa numerisanim UI-em u dnu kataloga (30 oglasa po strani). Filteri i pretraga resetuju page=1 da bi izbegli praznu stranicu, dugme „← Nazad“ na oglasu sada poziva router.back() pa se vraćaš na tačno isti broj strane i filter kombinaciju (uz scroll restore iz browser history-ja).
Marketplace (faza 5): obaveštenja end-to-end — emitNotification helper piše u notifications iz interest / contact / offer / report flow-ova; nova zvona u ShopHeader sa brojem nepročitanih, lista na /shop/notifications sa „označi pročitano“. Blokiranje sada zaista isključuje korisnika — interest/contact/offer/report vraćaju 403 ako jedna strana je blokirala drugu, a stranica oglasa skriva kontrole. Banned-words matcher na POST /api/listings (hard hit odbija, soft šalje na pending_review) + admin tabovi /shop/admin/moderation-queue i /shop/admin/banned-words. PriceDropDialog na mojim oglasima sa 7-dnevnim debounce-om i fan-out obaveštenjima. /shop/admin/listings sa featured toggle-om. /shop/help dokumentacija. Bug fix: login se sada deli između propeleri.rs ↔ shop.propeleri.rs (cookie domain `.propeleri.rs`), button „Login“ više ne vodi na glavni sajt, /shop/login poštuje ?next=. 24 nova testa (chromium), email-gate ponovljen na sve nove endpoint-e.
Marketplace (faza 4 — buyer flow II): kupci sada mogu predložiti svoju cenu (offers) na oglase sa „pregovaračka“ oznakom — prodavac vidi dolazne ponude u /shop/my/offers i prihvata ili odbija; prihvatanje automatski otvara prodavčev kontakt kupcu. Dodate i sačuvane pretrage: dugme „Sačuvaj pretragu“ na katalogu hvata aktivne filtere, /shop/my/saved-searches lista snimke sa povratkom na jedan klik. 15 novih Playwright testova (chromium).
Marketplace (faza 3 — buyer interactions): kupci sada mogu otkriti prodavčev kontakt (telefon, Telegram, WhatsApp) — klikom se piše u contact_views; pritisnuti „Zanima me“ (javni signal prodavcu sa brojačem) i „Sačuvaj“ (privatno omiljeno, niko ne vidi). Dodate i odvojene liste /shop/my/interested i /shop/my/favorites. Korisnik može da blokira prodavca (/shop/my/blocks) i da prijavi oglas — administrator obrađuje prijave na /shop/admin/reports. 35 novih Playwright testova (chromium).
Trening / RSVP: igraci koje je trener rucno oznacio kao prisutne (training_stats) sada se broje u badz „yes“ i „goalkeepers“, i vise ne sede u koloni „cekaju odgovor“. Service worker za detail stranice (training/games/roster/...) prebacen na NetworkFirst — kada trener azurira prisustvo, promene se vide na prvom ucitavanju umesto pri sledecem osvezavanju.
Admin / trening: legionari (is_match_only) sada su prikazani u editoru prisustva kao posebna grupa „Legionari“ (i na desktopu i na mobilnom), sa malim narandzastim badzom „Лег“ na kartici. Autosave debounce smanjen sa 900ms na 300ms — unos prisustva sad reaguje brze.
11. maj 2026.
2Marketplace (faza 2 — prodaja): prodavci mogu kreirati, uredivati i brisati oglase, ucitavati fotografije, postavljati kompleti opreme (bundle sa stavkama), editovati profil kontaktnih podataka (telefon, Telegram, WhatsApp). API blokira nepotvrdjene mejl adrese. 60+ novih Playwright testova (chromium/webkit/Mobile Chrome/Mobile Safari) zelena.
Marketplace (faza 1 — temelj): pokrenuli smo shop.propeleri.rs sa katalogom, filterima (sekcija/kategorija/brend/grad/komplet), stranama oglasa i profilima prodavaca. U bazi: 16 tabela sa RLS politikama, FTS pretraga, automatsko aggregiranje bundle stavki i okidači za R2 ciscenje. Glavni sajt i marketplace dele Supabase sesiju preko poddomena, a public_profiles view sakriva externalne/odbijene/match-only naloge od javnih lista. 33 testna oglasa pokrivaju sve hokej-kategorije (od stikova i klizaljki do golmanske opreme i kompleta). Cuvanje fotografija ide preko Cloudflare R2, sa direktnim URL-ovima za testne stock slike. Plejer/external/admin razgranicenje na nivou enuma i RLS-a. 33 Playwright testa (chromium) zelena.
30. april 2026.
1Sastav tima: igracke kartice sada nose oznaku trening tima (A — Beli, B — Tamni) u donjem levom uglu avatara, pored postojeceg broja dresa i kapitenske/trener oznake. Dodat treci nacin pregleda — „Po timovima“ — gde su zaglavlja oba tima jedno pored drugog, a ispod su zajednicki redovi po pozicijama (napadaci/odbrana/golmani) sa dve mrezice — leva za tim A, desna za tim B. Tako se grupe poravnavaju vertikalno i mogu da se uporede direktno. Igraci bez dodeljenog trening tima i treneri prikazuju se ispod kao zasebne sekcije.
25. april 2026.
5Admin/igraci: dialog „Dodaj novog igraca“ sada ima kvacicu „Legionar (samo za jedan mec)“ umesto „Gost“ — to je flag koji se najcesce postavlja na licu mesta kad se zove privremeni igrac za turnir/utakmicu. „Gost“ ostaje u edit-dialogu kao informativni tag, ali vise ne iskljucuje igraca iz tournament rostera, RSVP liste ili broja push-pretplatnika — jer „gost klubа“ moze potpuno da igra za nas. Edit-dialog dobija prekidac „Legionar“, tako da admin moze ručno da skine zastavu kad legionar predje u stalni roster.
/install: vizuelni vodic kroz instalaciju. Inline SVG mokapi koji prikazuju iOS Safari Share dugme, „Add to Home Screen“ akcioni list i ekran potvrde, kao i Android Chrome trotackasti meni i „Install app“ stavku — sistemska iOS/Android UI ne moze da se snimi Playwright-om (to je OS-level), pa su mokapi normalni industrijski standard. Iznad svega su pravi device-emulirani snimci same propeleri.rs/install stranice u iPhone 14 Pro Safari-ju i Pixel 7 Chrome-u, generisani novim skriptom npm run screenshots:install.
Auth refactor: requireAdmin() helper centralizovan na 5 admin API ruta, src/lib/auth/login.ts → email.ts (sa mrtvim username helperima izbacenim u prethodnom prolasku), middleware koristi locale-aware startsWith umesto includes (vise nije matchovao podstringove tipa /x/profile-info), magic-link mode iz PasswordlessBlock-a uklonjen — ostao samo OTP tab. profiles.username kolona i profiles_account_status view dropnuti — vise nista ne cita njih. Dodat tests/auth.spec.ts e2e set: prikaz formi, validacija, redirect-ovi za zasticene rute, ceo password sign-in flow + admin badge sanity.
Auth UI: prijava sada radi samo preko stvarne emaila (Google, magic link, OTP, email + lozinka). Polja za username/lozinku u admin formama za kreiranje i izmenu igraca su uklonjena — admin upisuje samo ime, sistem dodeljuje tehnicki @no-login.local marker; kasnije se igrac sam registruje preko mejla i biva povezan kroz „Poveži“. Pomocnici loginToEmail / extractLoginFromEmail / isSyntheticLoginEmail i njihove i18n stringe (sr/ru/en) su uklonjeni iz koda.
Auth: ukinuli smo prijavu preko username-a. Igraci koji su imali synthetic @player-login.local nalog moraju ponovo da se registruju preko stvarne emaila na /register; admin ih onda povezuje sa postojecim profilom kroz „Poveži“ — sve statistike, istorija treninga i utakmica se cuvaju. Filler @propeleri.rs adrese koje su bile placeholderi takodje su sklonjene; profili bez emaila sada imaju jasan tehnicki marker @no-login.local i ne salju im se obavestenja.
24. april 2026.
5Onboarding mejl: kad admin odobri novog igraca, pg trigger na profiles.is_approved aktivira edge funkciju send-approval-email koja preko Resend-a salje dobrodoslicu sa linkovima ka /profile i /install (uputstvo za PWA + push). Tri jezicke varijante (sr/ru/en) biraju se prema preferred_locale. Idempotentnost: approval_email_sent_at kolona + atomicni claim. Svaki pokusaj se loguje u approval_email_log. Tehnicki i @player-login.local emailovi se tiho preskacu. Odluka kanalа u docs/adr/approval-email-delivery.md, DNS i tajne u docs/email-setup.md.
RSVP → prisustvo: kad igrac oznaci „Dolazim“, prisustvo i tim se podesavaju automatski iz njegovog default tima u profilu; golmani zauzimaju slot vrata svoje ekipe, univerzalni igraci biraju izmedju polja i gola. Admin sada vidi badge RSVP kod svakog igraca u listi prisustva (realtime). Dodato: stranica /admin/broadcast za push objave svim pretplatnicima (bez dugmadi Dolazim/Ne dolazim), /admin/notifications sa istorijom slanja, i realtime badge u admin hederu za profile koji cekaju potvrdu.
Auth: dodata Google prijava pored lozinke / magic linka / OTP koda. Novi korisnici sada idu kroz /onboarding (ime, prezime, telefon) i čekaju da ih trener potvrdi. U admin panelu pored „Odobri“ postoji dugme „Poveži“ — omogućava spajanje novog naloga sa postojećom profile-only karticom igrača; sva istorija (lineup, stats, training, tournaments) se prenosi na novi nalog, dupla kartica se briše.
Push: osnova za web push notifikacije. Igraci ukljucuju push u /profile (VAPID), prijave se cuvaju u push_subscriptions sa per-user podesavanjima (24h / 3h / otkazivanje / rucno). Service worker vec obradjuje push i notificationclick akcije (Dolazim / Ne dolazim). Trener u admin panelu treninga vidi broj pretplatnika, istoriju slanja, dugmad „Posalji odmah“ i „Otkazi trening“. Edge funkcija send-training-notification i pg_cron raspored su u repo-u i cekaju rucni deploy.
RSVP: prijavljeni igraci jednim tapom oznacavaju dolazak na trening sa stranice treninga — Dolazim / Mozda / Ne dolazim. Trener vidi sumu u realnom vremenu (Dolaze / Mozda / Ne / Bez odgovora) i deep-link /training/<slug>?rsvp=yes automatski pamti izbor iz push notifikacija.
23. april 2026.
2PWA: sajt se sada moze instalirati kao aplikacija na Android (Chrome), iPhone (iOS 16.4+) i desktop. Dugme „Instaliraj“ u navbaru, posebna instrukcija za iOS. Service worker precache-uje shell stranice za offline rad. Toast „Dostupno azuriranje“ poziva korisnike da osveze stranicu posle svakog deploy-a.
Auth: prijavljivanje preko magic linka i OTP koda na /login (nove dve kartice pored postojece lozinke). Novi admin API /api/admin/invite-player i dugme "Pozovi mejlom" na listi igraca — player-only profili mogu da dobiju nalog bez gubitka istorije u roster/stats. Badge "Bez naloga / Pozvan / Aktivan" preko view-a profiles_account_status.
20. april 2026.
13On-page SEO: dodat screen-reader H1 na detaljnoj stranici utakmice, meta-opisi prosireni na 140-160 znakova radi boljeg CTR u SERP, ItemList JSON-LD na 7 list-stranica (games, roster, training, schedule, gallery, events) za sitelinks u Google, width/height na sve logoi-slike protivnika (CLS fix), robots.txt blokira /api/. TRIM naziva turnira u bazi
SEO: dodat JSON-LD na svim detail stranicama. Person na /roster/<slug>, SportsEvent na /tournaments/<slug> i /training/<slug>, Event na /events/<slug>. Svuda dodat BreadcrumbList za Google rich results; sitemap skriva persistent test-korisnika (is_match_only)
Major dependency bump-ovi: TypeScript 6, @types/node 25, @vercel/analytics 2, lucide-react 1.x, shadcn CLI 4. ESLint 10 odložen dok eslint-config-next ne objavi kompatibilnu verziju
Dodat kredit studija u footer sa stilizovanom indeksabilnom linkom na Render Room (pill sa narandžastim pulsnim indikatorom, vidljiv na svim stranicama)
Poboljšan kontrast na tamnoj temi: podignut --muted-foreground sa #9ca3af na #c3c9d3, 'Запланирована' badge promenjen sa text-blue-500 na text-blue-300 — WCAG AA kontrast 4.5:1 na stranici Raspored
Uklonjena legacy `opponents` tabela (10 redova, nigde se ne koristi u kodu) i `games.opponent_id` + `teams.opponent_id` kolone koje su samo duplikat `opponent_team_id` preko `teams` tabele
Očišćeni svi ESLint warning-i (24 -> 0): uklonjeni neiskorišćeni importi i lokalne varijable u admin stranicama, GameForm-u, PlayerStatsTable-u
Next.js nadograđen na 16.2.4 — zatvoreno 6 HIGH ranjivosti (CSRF bypass u Server Actions, HTTP request smuggling, DoS u Server Components, neograničeni image cache), plus transitivni ReDoS fix-evi u picomatch/minimatch/path-to-regexp
Dodat og:image na sve stranice — raniji deljeni linkovi su bili bez slike jer je Metadata API u Next-u potpuno zamenjivao parent openGraph
DB cleanup: indeksirani svi strani ključevi (20+ kolona), RLS policies na profiles/gallery_photos su obavijene `(select auth.uid())` da se ne preračunavaju za svaki red, seasons_write i tournaments_write razdvojene na INSERT/UPDATE/DELETE da ne dupliraju seasons_select i tournaments_select, uklonjeni neiskorišćeni indeksi
Uklonjene široke SELECT policies sa javnih storage bucket-ova (avatars, events, gallery) — listanje fajlova anonimnim korisnicima više nije dozvoljeno, pristup po URL-u kroz /storage/v1/object/public/… i dalje radi
Obrisani mrtvi fajlovi: GameStatsEditor (zamenjen UnifiedGameEditor-om), BracketView/PlacementView/SimpleTournamentMatch (stare verzije), image-loader.ts
Ispravljen prijavljivanje na iOS Safari i drugim striktnim browserima — prilagođeno ime auth-kolačića, tako da @supabase/ssr samo deli session na delove (.0, .1...) ispod limita kolačića; ranije je ceo token išao u jedan kolačić od ~4KB i sistem ga je tiho odbacivao, pa je admin panel video korisnika samo na serveru dok klijentski Supabase mislio da je anoniman
18. april 2026.
2Javne stranice prešle na statičko generisanje (SSG + ISR): svi matchevi, igrači, trening sesije, turniri, eventi unapred pre-render uju se u build-u; dodato on-demand revalidiranje tagova pri svakoj admin izmeni preko /api/revalidate
Novi public Supabase klijent bez cookies() i posvećena data-cache tags mapa (src/lib/cache/tags.ts); AuthProvider sada sam učitava session na klijentu, pa javni layout više nije dinamičan
4. mart 2026.
1Statistički SQL view-ovi prebačeni na SECURITY INVOKER da bi se RLS uvek primenjivao za API pozive i uklonili Security Advisor rizici
22. februar 2026.
7Trening admin: nova kartica Timovi sa drag-and-drop raspodelom u 2 kolone, slotom golmana i slotovima po ulogama (napadač/odbrana/bez pozicije); ista grupacija prikazana i na javnoj stranici treninga
Ispravljeno poravnanje kartica igrača kada je prisutan bedž Gosta (ujednačena visina reda)
Opcija "Može u gol" za igrače koji igraju i u polju i u golu — pojavljuju se i u GK slotu i u linijama
Ispravljen bug sa NULL slug-om pri ažuriranju rezultata turnirskih mečeva (trigger u bazi podataka)
Sortiranje igrača po imenu umesto broja dresa u svim listama (admin panel, roster, editor utakmica)
Veći modal za video golova na desktopu (min 1000px); uklonjene bedževi pozicija sa kartica igrača u grid prikazu
Gost igrači (is_guest) sada se pojavljuju u editoru utakmica za golove i asistencije
16. februar 2026.
1URL-ovi bez prefiksa jezika: jezik se automatski određuje po podešavanjima pregledača (Accept-Language) i čuva u kolačiću. Stari linkovi sa /ru/ i /en/ prefiksima automatski preusmeravaju
15. februar 2026.
9SEO-friendly URL-ovi: sve javne stranice koriste čitljive slug-ove umesto UUID-ova (npr. /games/2025-02-15-vs-zvezda-home, /roster/stefan-milosevic)
Slug polje u svim admin formama sa automatskom generacijom, ručnim uređivanjem i proverom jedinstvenosti
Editor treninga pretvoren u tabove (Info, Dolasci, Meč) sa split prikazom dolazaka na desktopu
Kartica Sastav u editoru utakmice: izabrani igrači prikazani u listi sa strane na desktopu
Statistika sada prikazuje sve igrače iz postava, ne samo one sa poenima (opšta i turnirska)
Unos kazni (PIM) u događaje utakmice, kraći naziv kartice
Podrska za penale (shootout) u turnirskim mečevima + SO oznaka na svim karticama rezultata
Redizajn editora utakmice: spojeni tabovi, vizuelni skor, ogranicena sirina
Statistika igraca na stranici turnira + univerzalna tabela statistike sa avatarima
14. februar 2026.
3Redizajn unosa golova: jednostavniji formular (strelac + opcioni asistenti), progresivni prikaz na mobilnom
Tab za golove u editoru utakmice + prikaz strelaca na posteru rezultata
Ispravljen prikaz logotipa protivnika za turnirske utakmice
13. februar 2026.
14Ujednačen popup za uređivanje igrača: isti dizajn na javnim stranicama i u admin panelu
Kompletna SEO optimizacija: metadata za sve stranice, Open Graph tagovi, robots.txt, sitemap.xml, manifest, JSON-LD strukturirani podaci, višejezični hreflang linkovi
Ispravljen atribut lang na HTML elementu — sada se menja prema izabranom jeziku
Lepljivi zaglavlja na svim admin stranicama, uklonjen nepotreban skrol
Stranica treninga: sledeći trening istaknut, ostali u sklopivim sekcijama
Brzo uređivanje utakmica, treninga i igrača direktno sa javnih stranica za admine
Dodata uloga trenera za članove tima
Poboljšan izbor zemlje sa automatskim dopunjavanjem i zastavicama
Redizajnirane kartice turnirskih mečeva, razdvojena lista mečeva
Turnirski mečevi preusmereni na jedinstveni editor igara
Spinneri zamenjeni skeleton komponentama za učitavanje
Dinamički importi, Map lookups, error boundary za bolje performanse
Poboljšana bezbednost baze podataka i RLS politike
LoadingErrorEmpty primenjen na sve admin stranice, SelectWithNone za timove
12. februar 2026.
13Vercel Web Analytics integrisan u aplikaciju
Testovi pristupačnosti, popravke mobilnog prikaza, WCAG poboljšanja
Brisanje timova i redizajn grid prikaza timova sa velikim avatarima
Admin link dodat u header sa uslovnom vidljivošću
Poboljšan lineup editor sa prikazom svih linija i mobilnim stilom
Dijalog za isecanje avatara sa zumiranjem i pomeranjem
Puna imena sa nadimcima u turnirskom rosteru
Standardizovani zaglavlja admin stranica sa AdminPageHeader
Zamenjeni hardkodirani stringovi i18n prevodima u admin panelu
Ispravljen bug beskonačnog učitavanja u lineup editoru
HockeyRink spojen sa GameLineupEditor u readOnly režimu
Poliranje lineup komponente: veličine krugova, avatari, mobilni layout
Finalizacija dizajna meč kartica i redizajn editora mečeva
11. februar 2026.
17Jedinstvena struktura stranica mečeva sa 5 tabova za sve tipove mečeva
Dodato uređivanje osnovnih polja za obične mečeve
Svi hardkodirani stringovi zamenjeni i18n prevodima
Admin edit link dodat na GameMatchCard sa poboljšanim responsive dizajnom
Mobilna horizontalna navigacija i Playwright e2e testovi
Poboljšano upravljanje igračima i vizuelni dizajn tima
Uprošćeno kreiranje naloga igrača i poboljšan tok treninga
Deklarisani roster za turnire sa izborom lineup-a
Prošireno upravljanje treninzima: zakazivanje, statusi i detalji meča
Redizajn hokejskog terena: vertikalno polupolje sa ledenom površinom
Poboljšana tabela igrača u admin panelu
Redizajn landing stranice sa novim vizualima i logotipom tima
Poboljšan prikaz rasporeda na terenu sa automatskim čuvanjem
Zamena tabele Opponents sa Teams i migracija baze podataka
Kritične ispravke autorizacije i admin panela
Ispravke sesije, brisanja igrača, ESLint grešaka i DOM nesting errora
Ispravljen cookie maxAge umesto nevažećeg lifetime svojstva
10. februar 2026.
5Redizajn lineup editora sa vizuelnim pozicijama i dodati turniri
Logotip tima dodat na sve brendirane elemente
Uređivanje igrača, trening timovi i vizualizacija hokejskog terena
Poboljšan UI svih stranica, priprema za Vercel deployment
Početno postavljanje projekta — sajt hokejskog tima HC Propeleri