Artikli: šifre, tip i jedinica mere; magacin UI; servis predračun

Šifre artikala:
- Kôd kategorije kao prefiks auto-šifre (PREFIKS-NNNN), otporno na brisanje (max+1)
- Tip artikla (proizvod/usluga/trošak) i jedinica mere
- Arhiviranje artikala umesto brisanja kad su već u prometu

Magacin:
- Paginacija 50 po stranici
- Klikabilna šifra (vodi na karticu), opisniji placeholder pretrage
- Ispravka: pretraga više ne okida animaciju redova (globalni htmx listener
  umesto hx-on atributa koji se ne okida u ovoj htmx verziji)
- Dugmad akcija ne prelamaju tekst; uklonjen content-visibility (secanje pri skrolu)

Servis: predračun (nova stranica i ruta)
This commit is contained in:
2026-06-20 18:40:01 +02:00
parent a8f368ca06
commit b0250b2917
24 changed files with 930 additions and 106 deletions
+21 -6
View File
@@ -515,6 +515,9 @@ body {
font-weight: 500;
cursor: pointer;
text-decoration: none;
/* sitna akciona dugmad ne prelamaju tekst — inače „Promeni cenu" padne u 2 reda
pa to dugme postane više od ostalih u istom redu */
white-space: nowrap;
transition: opacity 0.2s;
}
.btn-primarno-malo:hover { opacity: 0.85; }
@@ -536,6 +539,10 @@ body {
.btn-sekundarno:hover { background: var(--pozadina); color: var(--tekst-glavni); }
/* crveno dugme za brisanje u tabelama */
/* naziv artikla u listi koji vodi na karticu */
.link-naziv { text-decoration: none; }
.link-naziv:hover { color: var(--sb-akcent); text-decoration: underline; }
.btn-obrisi-malo {
display: inline-flex;
align-items: center;
@@ -548,6 +555,7 @@ body {
font-weight: 500;
cursor: pointer;
text-decoration: none;
white-space: nowrap;
transition: opacity 0.2s;
}
.btn-obrisi-malo:hover { opacity: 0.8; }
@@ -1070,6 +1078,16 @@ select {
animation: none;
}
/* gasi animaciju redova pri HTMX pretrazi: hx-on:htmx:before-request dodaje ovu klasu
na #magacin-rezultati. Pošto pretraga menja samo innerHTML kontejnera, klasa ostaje
na njemu i kroz naredne zamene, pa novoubačeni redovi ne animiraju. Pun reload
stranice i klik na paginaciju (bez pretrage) ne dodaju klasu, pa animacija ostaje.
ID u selektoru je OBAVEZAN: bez njega specifičnost je jednaka pravilima
[data-animacija="..."] niže u fajlu, koja bi onda nadjačala ovo i animacija bi
se i dalje primenjivala kad korisnik ima izabran stil animacije. */
#magacin-rezultati.bez-anim .tabela tbody tr,
#magacin-rezultati.bez-anim .animiraj { animation: none; }
/* korisnikova preferencija animacije: body[data-animacija] nadjačava podrazumevano.
Kad korisnik odabere stil, animiraju se i redovi tabela i mobilne kartice. */
[data-animacija="bez"] .animiraj,
@@ -1121,12 +1139,9 @@ select {
.tabela tbody tr:nth-child(20) { animation-delay: 0.80s; }
/* content-visibility: auto browser preskače render elemenata van viewport-a.
Ovo rešava problem sa 1000+ redova gde skrolovanje postaje prazno
dok browser ne stigne da iscrta sve. */
.tabela tbody tr {
content-visibility: auto;
contain-intrinsic-size: 48px;
}
Stranica je ograničena na 50 redova, pa redovi tabele ne koriste ovu optimizaciju:
procenjena visina (contain-intrinsic-size) se nije poklapala sa stvarnom, pa su
redovi „secali" pri skrolu kad ih browser tek tada izmeri. */
[class*="-kartice"] > .animiraj,
.klijenti-kartice > .animiraj {
content-visibility: auto;