726a1dbbf7
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.
163 lines
6.9 KiB
HTML
163 lines
6.9 KiB
HTML
{{template "base" .}}
|
|
|
|
{{define "naslov"}}{{if .Izmena}}Izmeni klijenta{{else}}Novi klijent{{end}} — NTech{{end}}
|
|
|
|
{{define "dodatni-css"}}
|
|
<style>
|
|
.greska-animacija { animation: shake 0.4s ease; }
|
|
.tip-radio { display:flex; gap:12px; }
|
|
.tip-radio label {
|
|
display:flex; align-items:center; gap:6px;
|
|
cursor:pointer; font-size:14px; color:var(--tekst-glavni);
|
|
padding:8px 14px; border-radius:6px; border:1px solid var(--ivica);
|
|
transition:background 0.15s, border-color 0.15s;
|
|
}
|
|
.tip-radio input[type=radio] { accent-color: var(--akcentna); }
|
|
.tip-radio label:has(input:checked) {
|
|
background:var(--akcentna-bleda); border-color:var(--akcentna);
|
|
}
|
|
</style>
|
|
{{end}}
|
|
|
|
{{define "sadrzaj"}}
|
|
<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>
|
|
Nazad na klijente
|
|
</a>
|
|
|
|
<div class="kartica forma-kartica animiraj">
|
|
<div style="margin-bottom:20px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);">
|
|
<span style="font-size:16px;font-weight:500;color:var(--tekst-glavni);">
|
|
{{if .Izmena}}Izmeni klijenta{{else}}Novi klijent{{end}}
|
|
</span>
|
|
</div>
|
|
|
|
{{if .Greska}}
|
|
<div class="poruka-greska greska-animacija">{{.Greska}}</div>
|
|
{{end}}
|
|
|
|
<form method="POST" action="{{if .Izmena}}/klijenti/izmeni/{{.Klijent.ID}}{{else}}/klijenti/novi{{end}}">
|
|
<input type="hidden" name="csrf_token" value="{{.CsrfToken}}">
|
|
<div class="forma-kolona">
|
|
|
|
<!-- tip klijenta -->
|
|
<div>
|
|
<div class="sekcija-naslov">Tip klijenta</div>
|
|
<div class="tip-radio">
|
|
<label>
|
|
<input type="radio" name="tip" value="fizicko"
|
|
{{if or (eq .Klijent.Tip "fizicko") (eq .Klijent.Tip "")}}checked{{end}}
|
|
onchange="promenaTipa(this.value)">
|
|
Fizičko lice
|
|
</label>
|
|
<label>
|
|
<input type="radio" name="tip" value="pravno"
|
|
{{if eq .Klijent.Tip "pravno"}}checked{{end}}
|
|
onchange="promenaTipa(this.value)">
|
|
Pravno lice
|
|
</label>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- 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">
|
|
<div>
|
|
<label class="polje-labela">
|
|
Ime <span id="ime-oznaka" class="obavezno">*</span>
|
|
</label>
|
|
<input type="text" name="ime" value="{{.Klijent.Ime}}"
|
|
placeholder="npr. Marko">
|
|
</div>
|
|
<div>
|
|
<label class="polje-labela">Prezime</label>
|
|
<input type="text" name="prezime" value="{{.Klijent.Prezime}}"
|
|
placeholder="npr. Petrović">
|
|
</div>
|
|
</div>
|
|
<div style="max-width:260px;">
|
|
<label class="polje-labela">JMBG</label>
|
|
<input type="text" name="jmbg" value="{{.Klijent.JMBG}}"
|
|
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">
|
|
<div>
|
|
<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.">
|
|
</div>
|
|
<div>
|
|
<label class="polje-labela">PIB</label>
|
|
<input type="text" name="pib" value="{{.Klijent.PIB}}"
|
|
placeholder="npr. 123456789">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- kontakt -->
|
|
<div>
|
|
<div class="sekcija-naslov">Kontakt</div>
|
|
<div class="forma-grid-2">
|
|
<div>
|
|
<label class="polje-labela">Telefon</label>
|
|
<input type="text" name="telefon" value="{{.Klijent.Telefon}}"
|
|
placeholder="npr. 060 123 4567">
|
|
</div>
|
|
<div>
|
|
<label class="polje-labela">E-pošta</label>
|
|
<input type="text" name="email" value="{{.Klijent.Email}}"
|
|
placeholder="npr. marko@example.com">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- napomena -->
|
|
<div>
|
|
<label class="polje-labela">Napomena</label>
|
|
<textarea name="napomena" rows="3"
|
|
placeholder="Interna napomena o klijentu...">{{.Klijent.Napomena}}</textarea>
|
|
</div>
|
|
|
|
<!-- dugmad -->
|
|
<div style="display:flex;justify-content:flex-end;gap:10px;margin-top:6px;">
|
|
<a href="/klijenti" class="btn-sekundarno">Odustani</a>
|
|
<button type="submit" class="btn-primarno">
|
|
{{if .Izmena}}Sačuvaj izmene{{else}}Dodaj klijenta{{end}}
|
|
</button>
|
|
</div>
|
|
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function promenaTipa(tip) {
|
|
var secFiz = document.getElementById('sec-fizicko');
|
|
var secPrav = document.getElementById('sec-pravno');
|
|
if (tip === 'pravno') {
|
|
secFiz.style.display = 'none';
|
|
secPrav.style.display = 'flex';
|
|
} else {
|
|
secFiz.style.display = 'flex';
|
|
secPrav.style.display = 'none';
|
|
}
|
|
}
|
|
// pri učitavanju prikazujemo ispravnu sekciju
|
|
(function() {
|
|
var checked = document.querySelector('input[name="tip"]:checked');
|
|
if (checked) promenaTipa(checked.value);
|
|
})();
|
|
</script>
|
|
{{end}}
|