Dodata zahtevajDozvolu metoda koja zamenjuje dupliranu proveru dozvola u handlerima.

Uvedena `AssetV` promenljiva za cache-busting statičkih fajlova, koja se postavlja pri svakom pokretanju.
Kreiran pogled `klijent_prikaz` (migracija 038) za jedinstveno prikazivanje imena klijenta, čime se eliminiše ponavljanje COALESCE logike u upitima.
Izvučena `dodeliOpcijeKorisnika` funkcija u korisnici.go radi DRY.
Zamenjeni inline stilovi u HTML šablonima CSS klasama (`.polje-labela`, `.obavezno`, `.pomocni-tekst`, `.tabela`, `.kartica-tabela`, `.prazno-stanje`).
Dodat `width: 100%` na inpute i `resize: vertical` na textarea u main.css.
This commit is contained in:
2026-06-12 00:43:58 +02:00
parent 19b66adba9
commit 726a1dbbf7
22 changed files with 247 additions and 193 deletions
+23 -24
View File
@@ -20,7 +20,7 @@
{{end}}
{{define "sadrzaj"}}
<div style="width:100%;">
<div>
<a href="/klijenti" class="nazad-link">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 18 9 12 15 6"/></svg>
@@ -40,7 +40,7 @@
<form method="POST" action="{{if .Izmena}}/klijenti/izmeni/{{.Klijent.ID}}{{else}}/klijenti/novi{{end}}">
<input type="hidden" name="csrf_token" value="{{.CsrfToken}}">
<div style="display:flex;flex-direction:column;gap:18px;">
<div class="forma-kolona">
<!-- tip klijenta -->
<div>
@@ -64,42 +64,42 @@
<!-- sekcija fizičko lice -->
<div id="sec-fizicko" style="display:flex;flex-direction:column;gap:12px;">
<div class="sekcija-naslov">Ime i prezime</div>
<div class="forma-grid-2" style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
<div class="forma-grid-2">
<div>
<label style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:6px;">
Ime <span id="ime-oznaka" style="color:#dc2626;">*</span>
<label class="polje-labela">
Ime <span id="ime-oznaka" class="obavezno">*</span>
</label>
<input type="text" name="ime" value="{{.Klijent.Ime}}"
placeholder="npr. Marko" style="width:100%;">
placeholder="npr. Marko">
</div>
<div>
<label style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:6px;">Prezime</label>
<label class="polje-labela">Prezime</label>
<input type="text" name="prezime" value="{{.Klijent.Prezime}}"
placeholder="npr. Petrović" style="width:100%;">
placeholder="npr. Petrović">
</div>
</div>
<div style="max-width:260px;">
<label style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:6px;">JMBG</label>
<label class="polje-labela">JMBG</label>
<input type="text" name="jmbg" value="{{.Klijent.JMBG}}"
placeholder="13 cifara" maxlength="13" style="width:100%;">
placeholder="13 cifara" maxlength="13">
</div>
</div>
<!-- sekcija pravno lice -->
<div id="sec-pravno" style="display:none;flex-direction:column;gap:12px;">
<div class="sekcija-naslov">Firma</div>
<div class="forma-grid-2" style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
<div class="forma-grid-2">
<div>
<label style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:6px;">
Naziv firme <span style="color:#dc2626;">*</span>
<label class="polje-labela">
Naziv firme <span class="obavezno">*</span>
</label>
<input type="text" name="naziv_firme" value="{{.Klijent.NazivFirme}}"
placeholder="npr. TechSolutions d.o.o." style="width:100%;">
placeholder="npr. TechSolutions d.o.o.">
</div>
<div>
<label style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:6px;">PIB</label>
<label class="polje-labela">PIB</label>
<input type="text" name="pib" value="{{.Klijent.PIB}}"
placeholder="npr. 123456789" style="width:100%;">
placeholder="npr. 123456789">
</div>
</div>
</div>
@@ -107,26 +107,25 @@
<!-- kontakt -->
<div>
<div class="sekcija-naslov">Kontakt</div>
<div class="forma-grid-2" style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
<div class="forma-grid-2">
<div>
<label style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:6px;">Telefon</label>
<label class="polje-labela">Telefon</label>
<input type="text" name="telefon" value="{{.Klijent.Telefon}}"
placeholder="npr. 060 123 4567" style="width:100%;">
placeholder="npr. 060 123 4567">
</div>
<div>
<label style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:6px;">E-pošta</label>
<label class="polje-labela">E-pošta</label>
<input type="text" name="email" value="{{.Klijent.Email}}"
placeholder="npr. marko@example.com" style="width:100%;">
placeholder="npr. marko@example.com">
</div>
</div>
</div>
<!-- napomena -->
<div>
<label style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:6px;">Napomena</label>
<label class="polje-labela">Napomena</label>
<textarea name="napomena" rows="3"
placeholder="Interna napomena o klijentu..."
style="width:100%;resize:vertical;">{{.Klijent.Napomena}}</textarea>
placeholder="Interna napomena o klijentu...">{{.Klijent.Napomena}}</textarea>
</div>
<!-- dugmad -->
+16 -16
View File
@@ -47,22 +47,22 @@
</div>
<!-- desktop tabela -->
<div class="kartica klijenti-tabela animiraj" style="padding:0;overflow:hidden;">
<div style="overflow-x:auto;">
<table style="width:100%;border-collapse:collapse;">
<div class="kartica klijenti-tabela kartica-tabela animiraj">
<div class="tabela-skrol">
<table class="tabela">
<thead>
<tr style="border-bottom:0.5px solid var(--ivica);">
<th style="padding:12px 16px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-jak);">Ime / Naziv firme</th>
<th style="padding:12px 16px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-jak);">Telefon</th>
<th style="padding:12px 16px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-jak);">E-pošta</th>
<th style="padding:12px 16px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-jak);">Datum unosa</th>
<th style="padding:12px 16px;text-align:center;font-size:12px;font-weight:500;color:var(--tekst-jak);">Akcije</th>
<tr>
<th>Ime / Naziv firme</th>
<th>Telefon</th>
<th>E-pošta</th>
<th>Datum unosa</th>
<th class="centar">Akcije</th>
</tr>
</thead>
<tbody>
{{range .Klijenti}}
<tr class="animiraj red-tabele">
<td style="padding:12px 16px;">
<td>
{{if .NazivFirme}}
<div style="font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{.NazivFirme}}</div>
{{if or .Ime .Prezime}}
@@ -72,16 +72,16 @@
<div style="font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{.Ime}} {{.Prezime}}</div>
{{end}}
</td>
<td style="padding:12px 16px;font-size:13px;color:var(--tekst-sporedni);">
<td class="pomocni-tekst">
{{if .Telefon}}{{.Telefon}}{{else}}—{{end}}
</td>
<td style="padding:12px 16px;font-size:13px;color:var(--tekst-sporedni);">
<td class="pomocni-tekst">
{{if .Email}}{{.Email}}{{else}}—{{end}}
</td>
<td style="padding:12px 16px;font-size:13px;color:var(--tekst-sporedni);">
<td class="pomocni-tekst">
{{.DatumUnosa.Format "02.01.2006."}}
</td>
<td style="padding:12px 16px;text-align:center;">
<td class="centar">
<div style="display:flex;align-items:center;justify-content:center;gap:8px;">
<a href="/klijenti/izmeni/{{.ID}}" class="btn-primarno-malo">
Izmeni
@@ -99,7 +99,7 @@
</tr>
{{else}}
<tr>
<td colspan="5" style="padding:32px;text-align:center;font-size:14px;color:var(--tekst-sporedni);">
<td colspan="5" class="prazno-stanje">
Nema klijenata. <a href="/klijenti/novi" style="color:var(--sb-akcent);">Dodaj prvog klijenta.</a>
</td>
</tr>
@@ -155,7 +155,7 @@
</div>
</div>
{{else}}
<div style="padding:32px;text-align:center;font-size:14px;color:var(--tekst-sporedni);">
<div class="prazno-stanje">
Nema klijenata. <a href="/klijenti/novi" style="color:var(--sb-akcent);">Dodaj prvog klijenta.</a>
</div>
{{end}}