1058 lines
68 KiB
HTML
1058 lines
68 KiB
HTML
{{template "base" .}}
|
||
|
||
{{define "naslov"}}Detalji naloga — NTech{{end}}
|
||
|
||
{{define "dodatni-css"}}
|
||
<style>
|
||
.detalji-kartica:nth-child(1) { animation-delay: 0.04s; }
|
||
.detalji-kartica:nth-child(2) { animation-delay: 0.12s; }
|
||
.detalji-kartica:nth-child(3) { animation-delay: 0.20s; }
|
||
.detalji-kartica:nth-child(4) { animation-delay: 0.28s; }
|
||
.detalji-kartica:nth-child(5) { animation-delay: 0.36s; }
|
||
/* bez animacija na detaljima — smetaju pri dodavanju/brisanju stavki */
|
||
#sadrzaj .kartica.animiraj { animation: none; }
|
||
/* custom dropdown za usluge i artikle */
|
||
.cust-sel { position: relative; }
|
||
.cust-sel-btn {
|
||
display: flex; align-items: center; justify-content: space-between; gap: 8px;
|
||
height: 38px; padding: 0 10px; box-sizing: border-box; cursor: pointer;
|
||
border: 0.5px solid var(--ivica) !important; border-radius: 8px; font-size: 14px;
|
||
background: var(--kartica) !important; color: var(--tekst-glavni) !important;
|
||
user-select: none;
|
||
}
|
||
.cust-sel-btn:focus { border-color: #3b82f6 !important; outline: none; }
|
||
.cust-sel-tekst { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||
.cust-sel-chevron { font-size: 10px; color: var(--tekst-sporedni); flex-shrink: 0; transition: transform 0.15s; }
|
||
.cust-sel.otvoren .cust-sel-chevron { transform: rotate(180deg); }
|
||
.cust-sel-lista {
|
||
display: none; position: absolute; top: calc(100% + 3px); left: 0; right: 0; z-index: 500;
|
||
background: var(--kartica); border: 0.5px solid var(--ivica); border-radius: 10px;
|
||
max-height: 260px; overflow-y: auto; box-shadow: 0 8px 30px rgba(0,0,0,0.4);
|
||
}
|
||
.cust-sel.otvoren .cust-sel-lista { display: block; }
|
||
.cso {
|
||
display: flex; align-items: center; justify-content: space-between; gap: 12px;
|
||
padding: 8px 12px; cursor: pointer; border-bottom: 0.5px solid var(--ivica); font-size: 13px;
|
||
}
|
||
.cso:last-child { border-bottom: none; }
|
||
.cso:hover, .cso.izabran { background: rgba(255,255,255,0.06); }
|
||
.cso-naziv { color: var(--tekst-glavni); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||
.cso-cena { color: #f59e0b; font-weight: 600; white-space: nowrap; flex-shrink: 0; }
|
||
.cso-prazno { color: var(--tekst-sporedni); }
|
||
.kartica.cust-aktivan { position: relative; z-index: 100; }
|
||
</style>
|
||
{{end}}
|
||
|
||
{{define "status-badge-detalji"}}
|
||
{{if eq . "Primljeno"}}<span class="status-badge status-primljeno">{{.}}</span>
|
||
{{else if eq . "U dijagnostici"}}<span class="status-badge status-dijagnostika">{{.}}</span>
|
||
{{else if eq . "Čeka delove"}}<span class="status-badge status-ceka">{{.}}</span>
|
||
{{else if eq . "U popravci"}}<span class="status-badge status-popravka">{{.}}</span>
|
||
{{else if eq . "Završeno"}}<span class="status-badge status-zavrseno">{{.}}</span>
|
||
{{else if eq . "Preuzeto"}}<span class="status-badge status-preuzeto">{{.}}</span>
|
||
{{else}}<span class="status-badge status-primljeno">{{.}}</span>
|
||
{{end}}
|
||
{{end}}
|
||
|
||
{{define "sadrzaj"}}
|
||
<div class="kolona" style="gap:16px;">
|
||
|
||
{{if .Sacuvano}}
|
||
<div class="poruka-uspeh poruka-animacija">Nalog je uspešno sačuvan.</div>
|
||
{{end}}
|
||
|
||
<!-- nazad dugme -->
|
||
<a href="/servis" class="nazad-link" hx-boost="true" hx-target="#glavni-sadrzaj" hx-select="#glavni-sadrzaj" hx-swap="outerHTML">
|
||
<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 servis
|
||
</a>
|
||
|
||
<!-- zaglavlje naloga -->
|
||
<div class="kartica detalji-kartica animiraj" id="nalog-zaglavlje">
|
||
<div style="display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:12px;margin-bottom:16px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);">
|
||
<div class="kolona" style="gap:8px;">
|
||
<span style="font-size:20px;font-weight:600;color:var(--tekst-glavni);font-family:monospace;">
|
||
{{.Nalog.BrojNaloga}}
|
||
</span>
|
||
<div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap;">
|
||
{{template "status-badge-detalji" .Nalog.Status}}
|
||
{{if eq .Nalog.Status "Primljeno"}}
|
||
<!-- serviser preuzima uređaj u rad → status prelazi u „U dijagnostici";
|
||
promena statusa menja kartice i dugmad, pa osvežavamo ceo sadržaj (#sadrzaj) -->
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/status" data-refresh="#sadrzaj" style="margin:0;">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<input type="hidden" name="status" value="U dijagnostici">
|
||
<button type="submit" class="btn-sekundarno" style="padding:3px 12px;font-size:12px;">
|
||
Počni dijagnostiku
|
||
</button>
|
||
</form>
|
||
{{end}}
|
||
{{if eq .Nalog.Status "U dijagnostici"}}
|
||
<!-- ishod dijagnostike: klijent odobri popravku (→ U popravci) ili ne prihvata (→ Završeno, naplata pregleda) -->
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/status" data-refresh="#sadrzaj" style="margin:0;">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<input type="hidden" name="status" value="U popravci">
|
||
<button type="submit" class="btn-sekundarno" style="padding:3px 12px;font-size:12px;">
|
||
Odobri popravku
|
||
</button>
|
||
</form>
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/odbij-popravku" style="margin:0;" data-full-reload>
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<button type="submit" class="btn-sekundarno" style="padding:3px 12px;font-size:12px;"
|
||
data-potvrda="Klijent ne prihvata popravku? Nalog prelazi u Zavrseno, naplacuje se samo dijagnostika.">
|
||
Klijent ne prihvata
|
||
</button>
|
||
</form>
|
||
{{end}}
|
||
{{if eq .Nalog.Status "U popravci"}}
|
||
<!-- popravka gotova → nalog prelazi u „Završeno" (na preuzimanje) -->
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/status" data-refresh="#sadrzaj" style="margin:0;">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<input type="hidden" name="status" value="Završeno">
|
||
<button type="submit" class="btn-sekundarno" style="padding:3px 12px;font-size:12px;">
|
||
Završi
|
||
</button>
|
||
</form>
|
||
{{end}}
|
||
{{if eq .Nalog.Status "Završeno"}}
|
||
<!-- klijent preuzima uređaj → modal sa naplatom, pa status prelazi u „Preuzeto" -->
|
||
<button type="button" class="btn-sekundarno" style="padding:3px 12px;font-size:12px;" onclick="ntechOtvoriModal(this)">
|
||
Preuzeto
|
||
</button>
|
||
<dialog class="premesti-modal" onclick="if(event.target===this)this.close()">
|
||
<form method="dialog" class="premesti-zaglavlje">
|
||
<h3>Preuzimanje uređaja</h3>
|
||
<button type="submit" class="premesti-zatvori" aria-label="Zatvori">×</button>
|
||
</form>
|
||
<div style="display:flex;flex-direction:column;gap:10px;padding:16px;">
|
||
<div style="display:flex;justify-content:space-between;align-items:center;">
|
||
<span style="color:var(--tekst-sporedni);">Ukupno</span>
|
||
<span style="color:var(--tekst-glavni);">{{dinari .UkupnoSve}} din</span>
|
||
</div>
|
||
{{if gt .Avans 0.0}}
|
||
<div style="display:flex;justify-content:space-between;align-items:center;">
|
||
<span style="color:var(--tekst-sporedni);">Avans (uplaćeno)</span>
|
||
<span style="color:#16a34a;">−{{dinari .Avans}} din</span>
|
||
</div>
|
||
{{else}}
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);">Klijent nije dao avans.</div>
|
||
{{end}}
|
||
<div style="display:flex;justify-content:space-between;align-items:center;margin-top:4px;padding-top:10px;border-top:0.5px solid var(--ivica);">
|
||
<span style="font-size:16px;font-weight:600;color:var(--tekst-glavni);">Za naplatu</span>
|
||
<span style="font-size:18px;font-weight:600;color:var(--tekst-glavni);">{{dinari .PreostaloSve}} din</span>
|
||
</div>
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/status" data-refresh="#sadrzaj" style="margin-top:8px;">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<input type="hidden" name="status" value="Preuzeto">
|
||
<button type="submit" class="btn-primarno" style="width:100%;">Naplati i preuzmi</button>
|
||
</form>
|
||
</div>
|
||
</dialog>
|
||
{{end}}
|
||
</div>
|
||
</div>
|
||
<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:center;">
|
||
{{/* Revers je potvrda o prijemu — primaran u „Primljeno"; reprint dok traje; ne u „Završeno" */}}
|
||
{{if eq .Nalog.Status "Primljeno"}}
|
||
<a href="/servis/{{.Nalog.ID}}/revers" target="_blank" class="btn-sekundarno">
|
||
Revers
|
||
</a>
|
||
{{else if and (ne .Nalog.Status "Završeno") (ne .Nalog.Status "Preuzeto")}}
|
||
<a href="/servis/{{.Nalog.ID}}/revers" target="_blank" style="font-size:12px;color:var(--tekst-sporedni);text-decoration:underline;align-self:center;">
|
||
Revers (reprint)
|
||
</a>
|
||
{{end}}
|
||
{{/* Predračun je ponuda klijentu pre odobrenja — ne u „U popravci", „Završeno" ni „Preuzeto" */}}
|
||
{{if and (ne .Nalog.Status "U popravci") (ne .Nalog.Status "Završeno") (ne .Nalog.Status "Preuzeto")}}
|
||
<a href="/servis/{{.Nalog.ID}}/predracun" target="_blank" class="btn-sekundarno">
|
||
Predračun
|
||
</a>
|
||
{{end}}
|
||
{{/* Radni nalog je interni papir serviseru — šta treba uraditi; „U dijagnostici" i „Čeka delove" */}}
|
||
{{if or (eq .Nalog.Status "U dijagnostici") (eq .Nalog.Status "Čeka delove")}}
|
||
<a href="/servis/{{.Nalog.ID}}/radni-nalog" target="_blank" class="btn-sekundarno">
|
||
Radni nalog
|
||
</a>
|
||
{{end}}
|
||
{{if eq .Nalog.Status "Završeno"}}
|
||
<a href="/servis/{{.Nalog.ID}}/otpremnica" target="_blank" class="btn-sekundarno">
|
||
Otpremnica
|
||
</a>
|
||
{{if not .BezGarancije}}
|
||
<a href="/servis/{{.Nalog.ID}}/garantni-list" target="_blank" class="btn-sekundarno">
|
||
Garantni list
|
||
</a>
|
||
{{end}}
|
||
{{end}}
|
||
{{/* Nalepnica je primarna pri prijemu (lepi se na uređaj); reprint dok traje; ne u „Završeno" */}}
|
||
{{if eq .Nalog.Status "Primljeno"}}
|
||
<a href="/servis/{{.Nalog.ID}}/nalepnica" target="_blank" class="btn-sekundarno">
|
||
Nalepnica
|
||
</a>
|
||
{{else if and (ne .Nalog.Status "Završeno") (ne .Nalog.Status "Preuzeto")}}
|
||
<a href="/servis/{{.Nalog.ID}}/nalepnica" target="_blank" style="font-size:12px;color:var(--tekst-sporedni);text-decoration:underline;align-self:center;">
|
||
Nalepnica (reprint)
|
||
</a>
|
||
{{end}}
|
||
{{/* nalog u popravci ili gotov/preuzet — nema više izmena */}}
|
||
{{if and (ne .Nalog.Status "U popravci") (ne .Nalog.Status "Završeno") (ne .Nalog.Status "Preuzeto")}}
|
||
<a href="/servis/izmeni/{{.Nalog.ID}}" class="btn-primarno" hx-boost="true" hx-target="#glavni-sadrzaj" hx-select="#glavni-sadrzaj" hx-swap="outerHTML">
|
||
Izmeni nalog
|
||
</a>
|
||
{{end}}
|
||
</div>
|
||
</div>
|
||
|
||
<!-- poruka klijenta uz odluku o predlogu -->
|
||
{{if .Nalog.KomentarKlijenta}}
|
||
<div style="margin-bottom:16px;padding:14px 16px;background:rgba(245,158,11,0.08);border:1px solid rgba(245,158,11,0.3);border-radius:10px;">
|
||
<div style="display:flex;align-items:center;gap:8px;margin-bottom:6px;">
|
||
{{if index .Dozvole "servis.izmeni"}}
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/obrisi-komentar-klijenta" style="margin:0;" data-refresh="#nalog-zaglavlje">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<button type="submit" data-potvrda="Obrisati poruku klijenta?" style="background:none;border:none;cursor:pointer;color:#94a3b8;font-size:16px;padding:0 2px;line-height:1;">×</button>
|
||
</form>
|
||
{{end}}
|
||
<span style="font-size:14px;">💬</span>
|
||
<span style="font-size:12px;font-weight:600;color:#f59e0b;text-transform:uppercase;letter-spacing:0.5px;flex:1;">Poruka klijenta</span>
|
||
</div>
|
||
<div style="font-size:14px;color:var(--tekst-glavni);line-height:1.5;white-space:pre-wrap;">{{.Nalog.KomentarKlijenta}}</div>
|
||
</div>
|
||
{{end}}
|
||
|
||
<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(140px, 1fr));gap:16px;">
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Datum prijema</div>
|
||
<div style="font-size:14px;color:var(--tekst-glavni);">{{.Nalog.DatumPrijema.Format "02.01.2006. u 15:04"}}</div>
|
||
</div>
|
||
<div>
|
||
{{/* dok traje: „Predviđen datum popravke" (editabilan); kad je gotovo: „Datum završetka" (automatski, readonly) */}}
|
||
{{if or (eq .Nalog.Status "Završeno") (eq .Nalog.Status "Preuzeto")}}
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Datum završetka</div>
|
||
<div style="font-size:14px;color:var(--tekst-glavni);">
|
||
{{if .Nalog.DatumZavrsetka}}{{.Nalog.DatumZavrsetka.Format "02.01.2006."}}{{else}}—{{end}}
|
||
</div>
|
||
{{else}}
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Predviđen datum popravke</div>
|
||
<div style="font-size:14px;color:var(--tekst-glavni);">
|
||
{{if .Nalog.PredvidjenDatum}}{{.Nalog.PredvidjenDatum.Format "02.01.2006."}}{{else}}—{{end}}
|
||
{{if index .Dozvole "servis.izmeni"}}
|
||
<button type="button" class="izmeni-polje" onclick="ntechOtvoriModal(this)">Promeni</button>
|
||
<dialog class="premesti-modal" onclick="if(event.target===this)this.close()">
|
||
<form method="dialog" class="premesti-zaglavlje">
|
||
<h3>Predviđen datum popravke</h3>
|
||
<button type="submit" class="premesti-zatvori" aria-label="Zatvori">×</button>
|
||
</form>
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/predvidjen-datum" data-refresh="#nalog-zaglavlje" style="display:flex;flex-direction:column;gap:12px;padding:16px;">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<div>
|
||
<label class="polje-labela">Datum</label>
|
||
<input type="date" name="predvidjen_datum"
|
||
value="{{if .Nalog.PredvidjenDatum}}{{.Nalog.PredvidjenDatum.Format "2006-01-02"}}{{end}}"
|
||
style="width:100%;padding:8px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||
<div class="pomocni-tekst" style="margin-top:6px;">Podrazumevano = automatski (datum prijema + rok iz podešavanja).</div>
|
||
</div>
|
||
<button type="button" class="btn-sekundarno" style="align-self:flex-start;"
|
||
onclick="var f=this.closest('form'); f.querySelector('[name=predvidjen_datum]').value=''; f.requestSubmit();">Podrazumevano</button>
|
||
</form>
|
||
</dialog>
|
||
{{end}}
|
||
</div>
|
||
{{end}}
|
||
</div>
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Garancija</div>
|
||
<div style="font-size:14px;{{if not .BezGarancije}}color:#16a34a;font-weight:500;{{else}}color:var(--tekst-sporedni);{{end}}">
|
||
{{garancijaTekst .Nalog.GarancijaDana}}
|
||
{{if index .Dozvole "servis.izmeni"}}
|
||
<button type="button" class="izmeni-polje" onclick="ntechOtvoriModal(this)">Promeni</button>
|
||
<dialog class="premesti-modal" onclick="if(event.target===this)this.close()">
|
||
<form method="dialog" class="premesti-zaglavlje">
|
||
<h3>Garancija</h3>
|
||
<button type="submit" class="premesti-zatvori" aria-label="Zatvori">×</button>
|
||
</form>
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/garancija-dana" data-refresh="#nalog-zaglavlje" style="display:flex;flex-direction:column;gap:12px;padding:16px;">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<div>
|
||
<label class="polje-labela">Trajanje garancije (dana)</label>
|
||
<div style="display:flex;align-items:center;gap:10px;">
|
||
<input type="number" name="garancija_dana" min="0" step="1"
|
||
value="{{if .BezGarancije}}{{.GarancijaDefault}}{{else}}{{.Nalog.GarancijaDana}}{{end}}"
|
||
{{if .BezGarancije}}disabled{{end}}
|
||
style="flex:1;min-width:0;padding:8px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;{{if .BezGarancije}}opacity:.5;{{end}}">
|
||
<label class="tip-opcija{{if .BezGarancije}} tip-opcija-akt{{end}}" style="white-space:nowrap;">
|
||
<input type="checkbox" name="bez_garancije" value="1"{{if .BezGarancije}} checked{{end}} style="margin:0;width:auto;"
|
||
onchange="var d=this.closest('div').querySelector('[name=garancija_dana]'); d.disabled=this.checked; d.style.opacity=this.checked?'.5':''; this.closest('label').classList.toggle('tip-opcija-akt',this.checked);">
|
||
Bez garancije
|
||
</label>
|
||
</div>
|
||
<div class="pomocni-tekst" style="margin-top:6px;">Računa se od datuma završetka radova.</div>
|
||
</div>
|
||
<button type="button" class="btn-sekundarno" style="align-self:flex-start;"
|
||
onclick="var f=this.closest('form'); var d=f.querySelector('[name=garancija_dana]'); d.disabled=false; d.style.opacity=''; d.value='{{.GarancijaDefault}}'; var c=f.querySelector('[name=bez_garancije]'); c.checked=false; c.closest('label').classList.remove('tip-opcija-akt'); f.requestSubmit();">Podrazumevano</button>
|
||
</form>
|
||
</dialog>
|
||
{{end}}
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Klijent</div>
|
||
<div style="font-size:14px;font-weight:500;color:var(--tekst-glavni);">
|
||
{{if .KlijentNaziv}}{{.KlijentNaziv}}{{else}}—{{end}}
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Serviser</div>
|
||
<div style="font-size:14px;font-weight:500;color:var(--tekst-glavni);">
|
||
{{if .TehnicarNaziv}}{{.TehnicarNaziv}}{{else}}<span style="color:var(--tekst-sporedni);font-weight:normal;">— nedodeljen —</span>{{end}}
|
||
{{if index .Dozvole "servis.izmeni"}}
|
||
<button type="button" class="izmeni-polje" onclick="ntechOtvoriModal(this)">Promeni</button>
|
||
<dialog class="premesti-modal" onclick="if(event.target===this)this.close()">
|
||
<form method="dialog" class="premesti-zaglavlje">
|
||
<h3>Serviser</h3>
|
||
<button type="submit" class="premesti-zatvori" aria-label="Zatvori">×</button>
|
||
</form>
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/tehnicar" data-refresh="#nalog-zaglavlje" style="display:flex;flex-direction:column;gap:12px;padding:16px;">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<div>
|
||
<label class="polje-labela">Serviser</label>
|
||
<select name="tehnicar_id"
|
||
style="width:100%;padding:8px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;background:var(--pozadina);color:var(--tekst-glavni);outline:none;">
|
||
<option value="">— nedodeljen —</option>
|
||
{{range .Tehnicari}}
|
||
<option value="{{.ID}}"{{if eq .ID $.Nalog.TehnicarIDVrednost}} selected{{end}}>{{.KorisnickoIme}}</option>
|
||
{{end}}
|
||
</select>
|
||
</div>
|
||
</form>
|
||
</dialog>
|
||
{{end}}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- podaci o uređaju -->
|
||
<div class="kartica detalji-kartica animiraj">
|
||
<div style="margin-bottom:16px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);">
|
||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Uređaj</span>
|
||
</div>
|
||
<div class="kolona" style="gap:14px;">
|
||
<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(160px, 1fr));gap:16px;">
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Naziv uređaja</div>
|
||
<div style="font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{.Nalog.Uredjaj}}</div>
|
||
</div>
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Serijski broj</div>
|
||
<div style="font-size:14px;color:var(--tekst-glavni);">
|
||
{{if .Nalog.SerijskiBroj}}{{.Nalog.SerijskiBroj}}{{else}}—{{end}}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:6px;">Opis kvara</div>
|
||
<div style="font-size:14px;color:var(--tekst-glavni);line-height:1.6;white-space:pre-wrap;">{{.Nalog.OpisKvara}}</div>
|
||
</div>
|
||
{{if .Nalog.TrazeneNadogradnje}}
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:6px;">Tražene nadogradnje</div>
|
||
<div style="font-size:14px;color:var(--tekst-glavni);line-height:1.6;white-space:pre-wrap;">{{.Nalog.TrazeneNadogradnje}}</div>
|
||
</div>
|
||
{{end}}
|
||
{{if or .Nalog.Ostecenja .Nalog.PinUredjaja .Nalog.Pribor}}
|
||
<div style="display:grid;grid-template-columns:repeat(auto-fit, minmax(160px, 1fr));gap:16px;">
|
||
{{if .Nalog.Ostecenja}}
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Oštećenja pri prijemu</div>
|
||
<div style="font-size:14px;color:var(--tekst-glavni);">{{.Nalog.Ostecenja}}</div>
|
||
</div>
|
||
{{end}}
|
||
{{if .Nalog.PinUredjaja}}
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">PIN / lozinka uređaja</div>
|
||
<div style="font-size:14px;color:var(--tekst-glavni);font-family:monospace;">{{.Nalog.PinUredjaja}}</div>
|
||
</div>
|
||
{{end}}
|
||
{{if .Nalog.Pribor}}
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:4px;">Pribor i oprema</div>
|
||
<div style="font-size:14px;color:var(--tekst-glavni);">{{.Nalog.Pribor}}</div>
|
||
</div>
|
||
{{end}}
|
||
</div>
|
||
{{end}}
|
||
{{if .Nalog.Napomena}}
|
||
<div>
|
||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-bottom:6px;">Napomena</div>
|
||
<div style="font-size:13px;color:var(--tekst-sporedni);line-height:1.6;white-space:pre-wrap;">{{.Nalog.Napomena}}</div>
|
||
</div>
|
||
{{end}}
|
||
</div>
|
||
</div>
|
||
|
||
<!-- utvrđeni kvar: šta je serviser utvrdio (dijagnoza + predlog) — od „U dijagnostici" do popravke, ne u „Završeno"/„Preuzeto" -->
|
||
{{if and (ne .Nalog.Status "Primljeno") (ne .Nalog.Status "Završeno") (ne .Nalog.Status "Preuzeto")}}
|
||
<div class="kartica detalji-kartica animiraj" id="nalaz-dijagnostike-kartica">
|
||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);flex-wrap:wrap;gap:10px;">
|
||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Utvrđeni kvar</span>
|
||
</div>
|
||
{{/* kvar i cena dijagnostike se unose samo dok je nalog „U dijagnostici"; kasnije su readonly */}}
|
||
{{if and (index .Dozvole "servis.izmeni") (eq .Nalog.Status "U dijagnostici")}}
|
||
<!-- snima se kad textarea izgubi fokus (bez dugmeta); data-refresh osvežava samo ovu karticu -->
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/nalaz-dijagnostike" data-refresh="#nalaz-dijagnostike-kartica">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<textarea name="nalaz_dijagnostike" rows="3"
|
||
placeholder="Šta je serviser utvrdio pregledom — dijagnoza kvara i predlog popravke..."
|
||
style="width:100%;resize:vertical;"
|
||
data-poc="{{.Nalog.NalazDijagnostike}}"
|
||
onblur="if(this.value!==this.dataset.poc){this.dataset.poc=this.value;(this.form.requestSubmit?this.form.requestSubmit():this.form.submit());}">{{.Nalog.NalazDijagnostike}}</textarea>
|
||
</form>
|
||
<!-- cena dijagnostike: naplaćuje se ako klijent ne prihvati popravku; snima se na promenu -->
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/cena-dijagnostike" data-refresh="#nalaz-dijagnostike-kartica, #nalog-ukupno" style="margin-top:12px;">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Cena dijagnostike (din)</label>
|
||
{{$cenaDij := .Nalog.CenaDijagnostikeStr}}{{if not $cenaDij}}{{$cenaDij = .CenaDijagnostikePredlog}}{{end}}
|
||
<input type="number" name="cena_dijagnostike" min="0" step="0.01" style="max-width:200px;"
|
||
placeholder="0"
|
||
value="{{$cenaDij}}"
|
||
data-poc="{{$cenaDij}}"
|
||
onchange="if(this.value!==this.dataset.poc){this.dataset.poc=this.value;(this.form.requestSubmit?this.form.requestSubmit():this.form.submit());}">
|
||
<div class="pomocni-tekst" style="margin-top:6px;">Predlog iz podešavanja; naplaćuje se samo ako klijent ne prihvati popravku.</div>
|
||
</form>
|
||
{{else}}
|
||
<div style="font-size:13px;color:var(--tekst-sporedni);line-height:1.6;white-space:pre-wrap;">
|
||
{{if .Nalog.NalazDijagnostike}}{{.Nalog.NalazDijagnostike}}{{else}}<span style="color:var(--tekst-sporedni);font-style:italic;">Nalaz još nije unet.</span>{{end}}
|
||
</div>
|
||
{{end}}
|
||
</div>
|
||
{{end}}
|
||
|
||
<!-- urađeno: šta je serviser stvarno uradio — od „U popravci" nadalje -->
|
||
{{if or (eq .Nalog.Status "U popravci") (eq .Nalog.Status "Čeka delove") (eq .Nalog.Status "Završeno") (eq .Nalog.Status "Preuzeto")}}
|
||
<div class="kartica detalji-kartica animiraj" id="uradjeno-kartica">
|
||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);flex-wrap:wrap;gap:10px;">
|
||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Urađeno</span>
|
||
</div>
|
||
{{/* upisuje se dok traje popravka („U popravci" / „Čeka delove"); kasnije readonly */}}
|
||
{{if and (index .Dozvole "servis.izmeni") (or (eq .Nalog.Status "U popravci") (eq .Nalog.Status "Čeka delove"))}}
|
||
<!-- snima se kad textarea izgubi fokus (bez dugmeta); data-refresh osvežava samo ovu karticu -->
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/uradjeno" data-refresh="#uradjeno-kartica">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<textarea name="uradjeno" rows="3"
|
||
placeholder="Šta je serviser uradio na uređaju tokom popravke..."
|
||
style="width:100%;resize:vertical;"
|
||
data-poc="{{.Nalog.Uradjeno}}"
|
||
onblur="if(this.value!==this.dataset.poc){this.dataset.poc=this.value;(this.form.requestSubmit?this.form.requestSubmit():this.form.submit());}">{{.Nalog.Uradjeno}}</textarea>
|
||
</form>
|
||
{{else}}
|
||
<div style="font-size:13px;color:var(--tekst-sporedni);line-height:1.6;white-space:pre-wrap;">
|
||
{{if .Nalog.Uradjeno}}{{.Nalog.Uradjeno}}{{else}}<span style="color:var(--tekst-sporedni);font-style:italic;">Još nije uneto šta je urađeno.</span>{{end}}
|
||
</div>
|
||
{{end}}
|
||
</div>
|
||
{{end}}
|
||
|
||
<!-- napomena klijentu — ne prikazuje se kad je nalog „Završeno"/„Preuzeto" (zatvoren) -->
|
||
{{if and (ne .Nalog.Status "Završeno") (ne .Nalog.Status "Preuzeto")}}
|
||
<div class="kartica detalji-kartica animiraj" id="napomena-klijentu-kartica">
|
||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);flex-wrap:wrap;gap:10px;">
|
||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Napomena klijentu</span>
|
||
</div>
|
||
{{if index .Dozvole "servis.izmeni"}}
|
||
<!-- forma se sama snima kad textarea izgubi fokus (bez dugmeta); data-refresh osvežava samo ovu karticu -->
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/napomena-klijentu" data-refresh="#napomena-klijentu-kartica">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
<textarea name="napomena_klijentu" rows="3"
|
||
placeholder="Poruka koju ostavljate klijentu uz nalog..."
|
||
style="width:100%;resize:vertical;"
|
||
data-poc="{{.Nalog.NapomenaKlijentu}}"
|
||
onblur="if(this.value!==this.dataset.poc){this.dataset.poc=this.value;(this.form.requestSubmit?this.form.requestSubmit():this.form.submit());}">{{.Nalog.NapomenaKlijentu}}</textarea>
|
||
</form>
|
||
{{else}}
|
||
<div style="font-size:13px;color:var(--tekst-sporedni);line-height:1.6;white-space:pre-wrap;">
|
||
{{if .Nalog.NapomenaKlijentu}}{{.Nalog.NapomenaKlijentu}}{{else}}<span style="color:var(--tekst-sporedni);font-style:italic;">Nema napomene.</span>{{end}}
|
||
</div>
|
||
{{end}}
|
||
</div>
|
||
{{end}}
|
||
|
||
<div id="stavke-blok" style="display:flex;flex-direction:column;gap:16px;">
|
||
{{/* kartice radova/delova se ne prikazuju kad je popravka odbijena (samo dijagnostika)
|
||
ni kad je nalog „Završeno"/„Preuzeto" (posao gotov — sume ostaju u kartici Ukupno) */}}
|
||
{{if and (not .Nalog.PopravkaOdbijena) (ne .Nalog.Status "Završeno") (ne .Nalog.Status "Preuzeto")}}
|
||
<div id="radovi-blok">
|
||
<!-- radovi (usluge) — traženi pri prijemu -->
|
||
<div class="kartica detalji-kartica animiraj" id="radovi-kartica">
|
||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);flex-wrap:wrap;gap:10px;">
|
||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Radovi (usluge)</span>
|
||
</div>
|
||
|
||
<!-- forma za dodavanje rada — u dijagnostici se automatski beleži kao predlog -->
|
||
{{if and (index .Dozvole "servis.izmeni") (ne .Nalog.Status "U popravci")}}
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/radovi" style="margin-bottom:16px;" data-refresh="#radovi-blok, #nalog-ukupno, #predlozeno-blok">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
{{if .ZakljucaniUgradjeni}}<input type="hidden" name="predlozeno" value="1">{{end}}
|
||
<div class="detalji-forma-rad">
|
||
<div>
|
||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Usluga</label>
|
||
<div class="cust-sel" data-sel="rad-usluga">
|
||
<div class="cust-sel-btn" tabindex="0">
|
||
<span class="cust-sel-tekst cso-prazno">— odaberi uslugu —</span>
|
||
<span class="cust-sel-chevron">▾</span>
|
||
</div>
|
||
<div class="cust-sel-lista">
|
||
<div class="cso" data-val="" data-cena="0"><span class="cso-prazno">— odaberi uslugu —</span></div>
|
||
{{range .Usluge}}{{if not (index $.KorisceneUsluge .ID)}}<div class="cso" data-val="{{.ID}}" data-cena="{{.Cena}}"><span class="cso-naziv">{{.Naziv}}</span><span class="cso-cena">{{dinari .Cena}} din</span></div>{{end}}{{end}}
|
||
</div>
|
||
</div>
|
||
<input type="hidden" name="usluga_id" id="rad-usluga">
|
||
</div>
|
||
<div>
|
||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Kol.</label>
|
||
<input type="number" name="kolicina" id="rad-kolicina" min="0.01" step="0.01" value="1" style="width:100%;" required>
|
||
</div>
|
||
<div>
|
||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Cena/kom (din)</label>
|
||
<input type="number" name="cena_komada" id="rad-cena" min="0" step="0.01" value="0" style="width:100%;" required>
|
||
</div>
|
||
<div>
|
||
<button type="submit" class="btn-primarno" style="font-size:13px;padding:8px 14px;white-space:nowrap;">+ Dodaj</button>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
{{end}}
|
||
|
||
<!-- lista radova -->
|
||
<div id="radovi-spisak">
|
||
{{if or .ServisniRadovi .PredlozeniRadovi}}
|
||
<div class="tabela-skrol">
|
||
<table class="tabela">
|
||
<thead>
|
||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||
<th style="padding:8px 10px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-sporedni);">Usluga</th>
|
||
<th style="padding:8px 10px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:90px;">Šifra</th>
|
||
<th style="padding:8px 10px;text-align:center;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:80px;">Kol.</th>
|
||
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Cena/kom</th>
|
||
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Ukupno</th>
|
||
<th style="width:50px;"></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{{range .ServisniRadovi}}
|
||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||
<td style="padding:9px 10px;font-size:14px;color:var(--tekst-glavni);">{{.Naziv}}</td>
|
||
<td style="padding:9px 10px;font-size:12px;color:var(--tekst-sporedni);font-family:monospace;">{{.Sifra}}</td>
|
||
<td style="padding:9px 10px;text-align:center;font-size:14px;color:var(--tekst-glavni);">{{.Kolicina}}</td>
|
||
<td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);">{{dinari .CenaKomada}} din</td>
|
||
<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{dinari .Ukupno}} din</td>
|
||
<td style="padding:9px 10px;text-align:center;">
|
||
{{if and (not $.ZakljucaniUgradjeni) (index $.Dozvole "servis.izmeni")}}
|
||
<form method="POST" action="/servis/{{$.Nalog.ID}}/radovi/{{.ID}}/obrisi" style="display:inline;" data-refresh="#radovi-blok, #nalog-ukupno, #predlozeno-blok">
|
||
<input type="hidden" name="_csrf" value="{{$.CsrfToken}}">
|
||
<button type="submit"
|
||
data-potvrda="Ukloniti rad '{{.Naziv}}'?"
|
||
style="background:none;border:none;cursor:pointer;color:#dc2626;font-size:16px;padding:2px 6px;border-radius:4px;">
|
||
×
|
||
</button>
|
||
</form>
|
||
{{end}}
|
||
</td>
|
||
</tr>
|
||
{{end}}
|
||
{{range .PredlozeniRadovi}}
|
||
<tr style="border-bottom:0.5px solid var(--ivica);background:rgba(245,158,11,0.08);">
|
||
<td style="padding:9px 10px;font-size:14px;color:var(--tekst-glavni);">{{.Naziv}} <span class="predlog-bedz" style="font-size:10px;padding:1px 7px;">Predlog</span></td>
|
||
<td style="padding:9px 10px;font-size:12px;color:var(--tekst-sporedni);font-family:monospace;">{{.Sifra}}</td>
|
||
<td style="padding:9px 10px;text-align:center;font-size:14px;color:var(--tekst-glavni);">{{.Kolicina}}</td>
|
||
<td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);">{{dinari .CenaKomada}} din</td>
|
||
<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">{{dinari .Ukupno}} din</td>
|
||
<td style="padding:9px 10px;text-align:center;">
|
||
{{if and (index $.Dozvole "servis.izmeni") (ne $.Nalog.Status "U popravci")}}
|
||
<form method="POST" action="/servis/{{$.Nalog.ID}}/radovi/{{.ID}}/obrisi" style="display:inline;" data-refresh="#radovi-blok, #nalog-ukupno, #predlozeno-blok">
|
||
<input type="hidden" name="_csrf" value="{{$.CsrfToken}}">
|
||
<button type="submit"
|
||
data-potvrda="Ukloniti predloženi rad '{{.Naziv}}'?"
|
||
style="background:none;border:none;cursor:pointer;color:#dc2626;font-size:16px;padding:2px 6px;border-radius:4px;">
|
||
×
|
||
</button>
|
||
</form>
|
||
{{end}}
|
||
</td>
|
||
</tr>
|
||
{{end}}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
{{else}}
|
||
<div style="font-size:13px;color:var(--tekst-sporedni);text-align:center;padding:16px 0;">
|
||
Nema unetih radova. Dodaj uslugu iz cenovnika.
|
||
</div>
|
||
{{end}}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ugrađeni delovi -->
|
||
<div id="delovi-blok">
|
||
{{/* osvežava window._ntechArtikli i dropdown svaki put kad data-refresh osvežava #delovi-blok */}}
|
||
<script>
|
||
window._ntechArtikli = {{json .Artikli}};
|
||
if (typeof window._ntechPopuniArtikle === 'function') window._ntechPopuniArtikle();
|
||
</script>
|
||
<div class="kartica detalji-kartica animiraj" id="delovi-kartica">
|
||
<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);flex-wrap:wrap;gap:10px;">
|
||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Delovi</span>
|
||
</div>
|
||
|
||
<!-- forma za dodavanje dela — u dijagnostici se automatski beleži kao predlog -->
|
||
{{if and (index .Dozvole "servis.izmeni") (ne .Nalog.Status "U popravci")}}
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/delovi" style="margin-bottom:16px;" data-refresh="#delovi-blok, #nalog-zaglavlje, #nalog-ukupno, #predlozeno-blok">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
{{if .ZakljucaniUgradjeni}}<input type="hidden" name="predlozeno" value="1">{{end}}
|
||
<div style="margin-bottom:10px;">
|
||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Kategorija</label>
|
||
<select id="deo-kategorija" style="width:100%;"></select>
|
||
</div>
|
||
<div class="detalji-forma-deo">
|
||
<div>
|
||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Artikal</label>
|
||
<div class="cust-sel" id="deo-artikal-cust" data-sel="deo-artikal">
|
||
<div class="cust-sel-btn" tabindex="0">
|
||
<span class="cust-sel-tekst cso-prazno">— odaberi artikal —</span>
|
||
<span class="cust-sel-chevron">▾</span>
|
||
</div>
|
||
<div class="cust-sel-lista"></div>
|
||
</div>
|
||
<input type="hidden" name="artikal_id" id="deo-artikal">
|
||
</div>
|
||
<div>
|
||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">U magacinu</label>
|
||
<div id="deo-umagacinu" style="width:100%;box-sizing:border-box;padding:8px 12px;border:0.5px solid var(--ivica);border-radius:8px;font-size:14px;font-weight:500;text-align:center;background:var(--pozadina);color:var(--tekst-glavni);">—</div>
|
||
</div>
|
||
<div>
|
||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Kol.</label>
|
||
<input type="number" name="kolicina" id="deo-kol" min="1" value="1" style="width:100%;box-sizing:border-box;" required>
|
||
</div>
|
||
<div>
|
||
<label style="font-size:12px;color:var(--tekst-sporedni);display:block;margin-bottom:4px;">Cena/kom (din)</label>
|
||
<input type="number" name="cena_komada" id="deo-cena" min="0" step="0.01" value="0" style="width:100%;" required>
|
||
</div>
|
||
<div>
|
||
<button type="submit" class="btn-primarno" style="font-size:13px;padding:8px 14px;white-space:nowrap;">+ Dodaj</button>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
{{end}}
|
||
|
||
<!-- lista delova -->
|
||
<div id="delovi-spisak">
|
||
{{if or .ServisniDelovi .PredlozeniDelovi}}
|
||
<div class="tabela-skrol">
|
||
<table class="tabela">
|
||
<thead>
|
||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||
<th style="padding:8px 10px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-sporedni);">Artikal</th>
|
||
<th style="padding:8px 10px;text-align:left;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:90px;">Šifra</th>
|
||
<th style="padding:8px 10px;text-align:center;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:80px;">Kol.</th>
|
||
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Cena/kom</th>
|
||
<th style="padding:8px 10px;text-align:right;font-size:12px;font-weight:500;color:var(--tekst-sporedni);width:130px;">Ukupno</th>
|
||
<th style="width:50px;"></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
{{range .ServisniDelovi}}
|
||
<tr data-artikal-id="{{.ArtikalID}}" data-kolicina="{{.Kolicina}}" data-potrazivano="{{.Potrazivano}}" style="border-bottom:0.5px solid var(--ivica);{{if .Potrazivano}}background:rgba(220,38,38,0.06);{{end}}">
|
||
<td style="padding:9px 10px;font-size:14px;color:var(--tekst-glavni);">{{.ArtikalNaziv}}</td>
|
||
<td style="padding:9px 10px;font-size:12px;color:var(--tekst-sporedni);font-family:monospace;">{{.ArtikalSifra}}</td>
|
||
<td style="padding:9px 10px;text-align:center;font-size:14px;{{if .Potrazivano}}color:#dc2626;font-weight:600;{{else}}color:var(--tekst-glavni);{{end}}">
|
||
{{.Kolicina}}{{if .Potrazivano}}<span style="font-weight:400;"> + {{.Potrazivano}} na čekanju</span>{{end}}
|
||
</td>
|
||
<td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);">
|
||
{{if .Kolicina}}{{dinari .CenaKomada}} din{{else}}—{{end}}
|
||
</td>
|
||
<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">
|
||
{{if .Kolicina}}{{dinari .Ukupno}} din{{else}}—{{end}}
|
||
</td>
|
||
<td style="padding:9px 10px;text-align:center;">
|
||
{{if and (not $.ZakljucaniUgradjeni) (index $.Dozvole "servis.izmeni")}}
|
||
<form method="POST" action="/servis/{{$.Nalog.ID}}/delovi/{{.ID}}/obrisi" style="display:inline;" data-refresh="#delovi-blok, #nalog-zaglavlje, #nalog-ukupno, #predlozeno-blok">
|
||
<input type="hidden" name="_csrf" value="{{$.CsrfToken}}">
|
||
<button type="submit"
|
||
data-potvrda="Ukloniti deo '{{.ArtikalNaziv}}'?"
|
||
style="background:none;border:none;cursor:pointer;color:#dc2626;font-size:16px;padding:2px 6px;border-radius:4px;">
|
||
×
|
||
</button>
|
||
</form>
|
||
{{end}}
|
||
</td>
|
||
</tr>
|
||
{{end}}
|
||
{{range .PredlozeniDelovi}}
|
||
<tr data-artikal-id="{{.ArtikalID}}" data-kolicina="{{.Kolicina}}" data-potrazivano="{{.Potrazivano}}" style="border-bottom:0.5px solid var(--ivica);background:rgba(245,158,11,0.08);">
|
||
<td style="padding:9px 10px;font-size:14px;color:var(--tekst-glavni);">{{.ArtikalNaziv}} <span class="predlog-bedz" style="font-size:10px;padding:1px 7px;">Predlog</span></td>
|
||
<td style="padding:9px 10px;font-size:12px;color:var(--tekst-sporedni);font-family:monospace;">{{.ArtikalSifra}}</td>
|
||
<td style="padding:9px 10px;text-align:center;font-size:14px;color:var(--tekst-glavni);">
|
||
{{if .Kolicina}}{{.Kolicina}}{{if .Potrazivano}} + {{.Potrazivano}}{{end}}{{else}}{{.Potrazivano}}{{end}}
|
||
</td>
|
||
<td style="padding:9px 10px;text-align:right;font-size:14px;color:var(--tekst-glavni);">
|
||
{{if .Kolicina}}{{dinari .CenaKomada}} din{{else}}—{{end}}
|
||
</td>
|
||
<td style="padding:9px 10px;text-align:right;font-size:14px;font-weight:500;color:var(--tekst-glavni);">
|
||
{{if .Kolicina}}{{dinari .Ukupno}} din{{else}}—{{end}}
|
||
</td>
|
||
<td style="padding:9px 10px;text-align:center;">
|
||
{{if and (index $.Dozvole "servis.izmeni") (ne $.Nalog.Status "U popravci")}}
|
||
{{if .ID}}
|
||
<form method="POST" action="/servis/{{$.Nalog.ID}}/delovi/{{.ID}}/obrisi" style="display:inline;" data-refresh="#delovi-blok, #nalog-zaglavlje, #nalog-ukupno, #predlozeno-blok">
|
||
<input type="hidden" name="_csrf" value="{{$.CsrfToken}}">
|
||
<button type="submit"
|
||
data-potvrda="Ukloniti predloženi deo '{{.ArtikalNaziv}}'?"
|
||
style="background:none;border:none;cursor:pointer;color:#dc2626;font-size:16px;padding:2px 6px;border-radius:4px;">×</button>
|
||
</form>
|
||
{{else if .ArtikalID}}
|
||
<form method="POST" action="/servis/{{$.Nalog.ID}}/predlozeni-delovi/{{.ArtikalID}}/obrisi" style="display:inline;" data-refresh="#delovi-blok, #nalog-zaglavlje, #nalog-ukupno, #predlozeno-blok">
|
||
<input type="hidden" name="_csrf" value="{{$.CsrfToken}}">
|
||
<button type="submit"
|
||
data-potvrda="Ukloniti predloženi deo '{{.ArtikalNaziv}}'?"
|
||
style="background:none;border:none;cursor:pointer;color:#dc2626;font-size:16px;padding:2px 6px;border-radius:4px;">×</button>
|
||
</form>
|
||
{{end}}
|
||
{{end}}
|
||
</td>
|
||
</tr>
|
||
{{end}}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
{{else}}
|
||
<div style="font-size:13px;color:var(--tekst-sporedni);text-align:center;padding:16px 0;">
|
||
Nema delova za ovaj nalog.
|
||
</div>
|
||
{{end}}
|
||
</div>
|
||
</div>
|
||
<script>(function(){
|
||
window._dinFmt=function(v){var s=Math.round((v||0)*100);var dec=String(s%100).padStart(2,'0');var cel=String(Math.floor(s/100));var r='';for(var i=0;i<cel.length;i++){if(i>0&&(cel.length-i)%3===0)r+='.';r+=cel[i];}return r+','+dec;}
|
||
var k=document.getElementById('deo-kategorija');
|
||
var a=document.getElementById('deo-artikal');
|
||
var u=document.getElementById('deo-umagacinu');
|
||
var l=document.getElementById('deo-kol');
|
||
var c=document.getElementById('deo-cena');
|
||
function osv(){if(!l||!a)return;var s=parseInt(a.getAttribute('data-stanje'),10);var st=isNaN(s)?0:s;if(u)u.textContent=a.value?st:'\u2014';if(l)l.classList.toggle('prekoraceno',!!a.value&&st===0)}
|
||
function pop(){
|
||
var cust=document.getElementById('deo-artikal-cust');
|
||
if(!cust)return;
|
||
var lista=cust.querySelector('.cust-sel-lista');
|
||
var ka=k?k.value:'';
|
||
var aa=window._ntechArtikli||[];
|
||
var html='<div class="cso" data-val="" data-cena="0" data-stanje="0"><span class="cso-prazno">\u2014 odaberi artikal \u2014</span></div>';
|
||
aa.forEach(function(x){if(!ka||(x.KategorijaNaziv||'')===ka)html+='<div class="cso" data-val="'+x.ID+'" data-cena="'+x.ProdajnaCena+'" data-stanje="'+(x.Kolicina||0)+'"><span class="cso-naziv">'+x.Naziv+'</span><span class="cso-cena">'+window._dinFmt(x.ProdajnaCena)+' din</span></div>';});
|
||
if(lista)lista.innerHTML=html;
|
||
}
|
||
if(k){var aa2=window._ntechArtikli||[];var kgs=[];aa2.forEach(function(x){var n=x.KategorijaNaziv||'';if(n&&kgs.indexOf(n)===-1)kgs.push(n)})
|
||
k.innerHTML='<option value="">\u2014 sve kategorije \u2014</option>'+kgs.map(function(x){return'<option value="'+x+'">'+x+'</option>'}).join('');k.onchange=pop}
|
||
pop();
|
||
if(a)a.addEventListener('change',function(){var v=parseFloat(a.getAttribute('data-cena'));if(c)c.value=(!isNaN(v)&&v>0)?v.toFixed(2):'0';osv()});
|
||
if(l)l.oninput=osv;
|
||
var fd=document.querySelector('form[action$=\"/delovi\"]');
|
||
if(fd)fd.addEventListener('reset',function(){if(u){u.textContent='\u2014';u.classList.remove('prekoraceno')}if(l)l.classList.remove('prekoraceno')})
|
||
})();</script>
|
||
</div>
|
||
{{end}}
|
||
</div>{{/* kraj stavke-blok */}}
|
||
|
||
<!-- prihvati/odbij odabrane predlozene stavke (interna forma) -->
|
||
{{if and (index .Dozvole "servis.izmeni") (or .PredlozeniRadovi .PredlozeniDelovi)}}
|
||
<div id="predlozeno-blok" class="kartica detalji-kartica animiraj" style="border-left:3px solid #f59e0b;">
|
||
<div style="margin-bottom:14px;padding-bottom:12px;border-bottom:0.5px solid var(--ivica);display:flex;justify-content:space-between;align-items:center;">
|
||
<span style="font-size:15px;font-weight:500;color:#f59e0b;">Predložene stavke</span>
|
||
<span style="font-size:12px;color:var(--tekst-sporedni);">Odštikliraj šta ne prihvataš</span>
|
||
</div>
|
||
<form method="POST" action="/servis/{{.Nalog.ID}}/prihvati-odabrano" data-refresh="#radovi-blok, #delovi-blok, #nalog-ukupno, #predlozeno-blok">
|
||
<input type="hidden" name="_csrf" value="{{.CsrfToken}}">
|
||
{{if .PredlozeniRadovi}}
|
||
<div style="font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.6px;color:var(--tekst-sporedni);margin-bottom:8px;">Radovi</div>
|
||
{{range .PredlozeniRadovi}}
|
||
<label style="display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:0.5px solid var(--ivica);cursor:pointer;">
|
||
<span style="display:flex;align-items:center;gap:10px;flex:1;">
|
||
<input type="checkbox" name="rad_id" value="{{.ID}}" checked style="width:16px;height:16px;accent-color:#f59e0b;flex-shrink:0;">
|
||
<span style="font-size:13px;color:var(--tekst-glavni);">{{.Naziv}}{{if gt .Kolicina 1.0}} × {{printf "%.0f" .Kolicina}}{{end}}</span>
|
||
</span>
|
||
<span style="font-size:13px;font-weight:500;color:var(--tekst-glavni);white-space:nowrap;">{{dinari .Ukupno}} din</span>
|
||
</label>
|
||
{{end}}
|
||
{{end}}
|
||
{{if .PredlozeniDelovi}}
|
||
<div style="font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.6px;color:var(--tekst-sporedni);margin:{{if .PredlozeniRadovi}}12px{{else}}0px{{end}} 0 8px;">Delovi</div>
|
||
{{range .PredlozeniDelovi}}
|
||
<label style="display:flex;align-items:center;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:0.5px solid var(--ivica);cursor:pointer;">
|
||
<span style="display:flex;align-items:center;gap:10px;flex:1;">
|
||
<input type="checkbox" name="artikal_id" value="{{.ArtikalID}}" checked style="width:16px;height:16px;accent-color:#f59e0b;flex-shrink:0;">
|
||
<span style="font-size:13px;color:var(--tekst-glavni);">{{.ArtikalNaziv}}{{if gt .Kolicina 1}} × {{.Kolicina}}{{end}}</span>
|
||
</span>
|
||
<span style="font-size:13px;font-weight:500;color:var(--tekst-glavni);white-space:nowrap;">{{if .Kolicina}}{{dinari .Ukupno}} din{{else}}—{{end}}</span>
|
||
</label>
|
||
{{end}}
|
||
{{end}}
|
||
<button type="submit" class="btn-primarno" style="width:100%;margin-top:14px;">Prihvati odabrano</button>
|
||
</form>
|
||
</div>
|
||
{{else}}
|
||
<div id="predlozeno-blok"></div>
|
||
{{end}}
|
||
|
||
<!-- ukupno: zbir usluga (radova) i ugrađenih delova -->
|
||
<div id="nalog-ukupno" class="kartica detalji-kartica animiraj">
|
||
<div style="margin-bottom:16px;padding-bottom:14px;border-bottom:0.5px solid var(--ivica);">
|
||
<span style="font-size:15px;font-weight:500;color:var(--tekst-glavni);">Ukupno</span>
|
||
</div>
|
||
<div class="kolona" style="gap:10px;">
|
||
{{if .Nalog.PopravkaOdbijena}}
|
||
{{/* klijent odbio popravku — naplaćuje se samo dijagnostika */}}
|
||
<div style="display:flex;justify-content:space-between;align-items:center;">
|
||
<span style="font-size:14px;color:var(--tekst-sporedni);">Dijagnostika</span>
|
||
<span style="font-size:14px;color:var(--tekst-glavni);">{{dinari .Nalog.CenaDijagnostike}} din</span>
|
||
</div>
|
||
{{else}}
|
||
<div style="display:flex;justify-content:space-between;align-items:center;">
|
||
<span style="font-size:14px;color:var(--tekst-sporedni);">Usluge (rad)</span>
|
||
<span style="font-size:14px;color:var(--tekst-glavni);">{{dinari .UkupnoRadovi}} din</span>
|
||
</div>
|
||
<div style="display:flex;justify-content:space-between;align-items:center;">
|
||
<span style="font-size:14px;color:var(--tekst-sporedni);">Ugrađeni delovi</span>
|
||
<span style="font-size:14px;color:var(--tekst-glavni);">{{dinari .UkupnoDelovi}} din</span>
|
||
</div>
|
||
{{end}}
|
||
<div style="display:flex;justify-content:space-between;align-items:center;margin-top:6px;padding-top:12px;border-top:0.5px solid var(--ivica);">
|
||
<span style="font-size:16px;font-weight:600;color:var(--tekst-glavni);">Ukupno</span>
|
||
<span style="font-size:18px;font-weight:600;color:var(--tekst-glavni);">{{dinari .UkupnoSve}} din</span>
|
||
</div>
|
||
|
||
{{if or (eq .Nalog.Status "Završeno") (eq .Nalog.Status "Preuzeto")}}
|
||
{{if .ServisniRadovi}}
|
||
<div style="margin-top:16px;padding-top:14px;border-top:0.5px solid var(--ivica);">
|
||
<div style="font-size:13px;font-weight:500;color:var(--tekst-glavni);margin-bottom:8px;">Obavljeni radovi</div>
|
||
<div class="kolona" style="gap:6px;">
|
||
{{range .ServisniRadovi}}
|
||
<div style="display:flex;justify-content:space-between;align-items:center;font-size:13px;">
|
||
<span style="color:var(--tekst-glavni);">{{.Naziv}}{{if gt .Kolicina 1.0}} ×{{.Kolicina}}{{end}}</span>
|
||
<span style="color:var(--tekst-sporedni);">{{dinari .Ukupno}} din</span>
|
||
</div>
|
||
{{end}}
|
||
</div>
|
||
</div>
|
||
{{end}}
|
||
{{if .ServisniDelovi}}
|
||
<div style="margin-top:16px;padding-top:14px;border-top:0.5px solid var(--ivica);">
|
||
<div style="font-size:13px;font-weight:500;color:var(--tekst-glavni);margin-bottom:8px;">Ugrađeni delovi</div>
|
||
<div class="kolona" style="gap:6px;">
|
||
{{range .ServisniDelovi}}
|
||
<div style="display:flex;justify-content:space-between;align-items:center;font-size:13px;">
|
||
<span style="color:var(--tekst-glavni);">{{.ArtikalNaziv}}{{if gt .Kolicina 1}} ×{{.Kolicina}}{{end}}</span>
|
||
<span style="color:var(--tekst-sporedni);">{{dinari .Ukupno}} din</span>
|
||
</div>
|
||
{{end}}
|
||
</div>
|
||
</div>
|
||
{{end}}
|
||
{{end}}
|
||
</div>
|
||
</div>
|
||
|
||
<!-- zona za brisanje -->
|
||
{{/* Brisanje je moguće samo dok je „Primljeno" (greška pri unosu); čim uđe u proceduru naplaćuje se dijagnostika */}}
|
||
{{if eq .Nalog.Status "Primljeno"}}
|
||
<div class="kartica detalji-kartica animiraj" style="border-color:#dc262633;">
|
||
<div style="display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap;">
|
||
<div style="flex:1;min-width:200px;">
|
||
<div style="font-size:14px;font-weight:500;color:#dc2626;margin-bottom:4px;">Brisanje naloga</div>
|
||
<div class="pomocni-tekst">
|
||
Brisanje je trajno. Nalog i svi vezani podaci biće trajno uklonjeni.
|
||
</div>
|
||
</div>
|
||
<form method="POST" action="/servis/obrisi/{{.Nalog.ID}}">
|
||
<button type="submit" class="btn-opasno"
|
||
data-potvrda="Da li ste sigurni da želite da obrišete nalog {{.Nalog.BrojNaloga}}?">
|
||
Obriši nalog
|
||
</button>
|
||
</form>
|
||
</div>
|
||
</div>
|
||
{{end}}
|
||
|
||
</div>
|
||
|
||
<script>
|
||
// Custom dropdown: toggle, izbor opcije, zatvaranje klikom van.
|
||
function _custZatvoriSve() {
|
||
document.querySelectorAll('.cust-sel.otvoren').forEach(function (el) {
|
||
el.classList.remove('otvoren');
|
||
var k = el.closest('.kartica');
|
||
if (k) k.classList.remove('cust-aktivan');
|
||
});
|
||
}
|
||
document.addEventListener('click', function (e) {
|
||
var btn = e.target.closest('.cust-sel-btn');
|
||
if (btn) {
|
||
var cust = btn.closest('.cust-sel');
|
||
var bio = cust.classList.contains('otvoren');
|
||
_custZatvoriSve();
|
||
if (!bio) {
|
||
cust.classList.add('otvoren');
|
||
var k = cust.closest('.kartica');
|
||
if (k) k.classList.add('cust-aktivan');
|
||
}
|
||
return;
|
||
}
|
||
var opt = e.target.closest('.cso');
|
||
if (opt) {
|
||
var cust = opt.closest('.cust-sel');
|
||
var selId = cust.getAttribute('data-sel');
|
||
var inp = selId ? document.getElementById(selId) : null;
|
||
var val = opt.getAttribute('data-val') || '';
|
||
var btnEl = cust.querySelector('.cust-sel-btn');
|
||
var btnTekst = btnEl ? btnEl.querySelector('.cust-sel-tekst') : null;
|
||
var naziv = opt.querySelector('.cso-naziv');
|
||
var prazan = opt.querySelector('.cso-prazno');
|
||
if (btnTekst) {
|
||
btnTekst.textContent = naziv ? naziv.textContent : (prazan ? prazan.textContent : '');
|
||
btnTekst.className = 'cust-sel-tekst' + (val ? '' : ' cso-prazno');
|
||
}
|
||
cust.querySelectorAll('.cso').forEach(function (o) { o.classList.remove('izabran'); });
|
||
if (val) opt.classList.add('izabran');
|
||
if (inp) {
|
||
inp.value = val;
|
||
inp.setAttribute('data-cena', opt.getAttribute('data-cena') || '0');
|
||
inp.setAttribute('data-stanje', opt.getAttribute('data-stanje') || '0');
|
||
inp.dispatchEvent(new Event('change', { bubbles: true }));
|
||
}
|
||
cust.classList.remove('otvoren');
|
||
var k2 = cust.closest('.kartica');
|
||
if (k2) k2.classList.remove('cust-aktivan');
|
||
return;
|
||
}
|
||
_custZatvoriSve();
|
||
});
|
||
|
||
// Radovi: pri izboru usluge (custom dropdown → hidden input) popuni predloženu cenu.
|
||
document.addEventListener('change', function (e) {
|
||
if (!e.target || e.target.id !== 'rad-usluga') return;
|
||
var cena = document.getElementById('rad-cena');
|
||
if (!cena) return;
|
||
var c = parseFloat(e.target.getAttribute('data-cena'));
|
||
cena.value = (!isNaN(c) && c > 0) ? c.toFixed(2) : '0';
|
||
});
|
||
|
||
// Delovi: kategorija filtrira <select> artikala; izborom artikla popunjavamo
|
||
// cenu i prikaz „U magacinu". Običan <select> ima native pretragu kucanjem
|
||
// i otvara se jednim klikom (za razliku od datalist-a).
|
||
(function () {
|
||
window._ntechArtikli = {{json .Artikli}} || [];
|
||
var ARTIKLI = window._ntechArtikli;
|
||
var kategSel = document.getElementById('deo-kategorija');
|
||
var artikalSel = document.getElementById('deo-artikal');
|
||
var cena = document.getElementById('deo-cena');
|
||
var umagacinu = document.getElementById('deo-umagacinu');
|
||
var kol = document.getElementById('deo-kol');
|
||
var stanjeIzabrano = 0;
|
||
if (!artikalSel) return;
|
||
|
||
// boji „U magacinu" i polje količine crveno kada nova količina prelazi
|
||
// trenutno stanje; stanjeIzabrano već odražava snižen lager (UgradiIliPotrazuj
|
||
// skida sa stanja odmah pri dodavanju), pa nema potrebe sabirati ono što je
|
||
// već u tabeli
|
||
function osveziPrekoracenje() {
|
||
var novaKol = parseInt(kol && kol.value, 10) || 0;
|
||
var preko = novaKol > stanjeIzabrano && artikalSel.value;
|
||
if (umagacinu) umagacinu.classList.toggle('prekoraceno', preko);
|
||
if (kol) kol.classList.toggle('prekoraceno', preko);
|
||
}
|
||
|
||
if (kategSel) {
|
||
var kategs = [];
|
||
ARTIKLI.forEach(function (a) {
|
||
var k = a.KategorijaNaziv || '';
|
||
if (k && kategs.indexOf(k) < 0) kategs.push(k);
|
||
});
|
||
kategs.sort();
|
||
kategSel.innerHTML = '<option value="">Sve kategorije</option>' +
|
||
kategs.map(function (k) { return '<option value="' + k + '">' + k + '</option>'; }).join('');
|
||
}
|
||
|
||
function popuniArtikle() {
|
||
ARTIKLI = window._ntechArtikli || [];
|
||
var izabrana = kategSel ? kategSel.value : '';
|
||
var cust = document.getElementById('deo-artikal-cust');
|
||
var lista = cust ? cust.querySelector('.cust-sel-lista') : null;
|
||
var html = '<div class="cso" data-val="" data-cena="0" data-stanje="0"><span class="cso-prazno">— odaberi artikal —</span></div>';
|
||
ARTIKLI.filter(function (a) { return !izabrana || (a.KategorijaNaziv || '') === izabrana; })
|
||
.forEach(function (a) {
|
||
html += '<div class="cso" data-val="' + a.ID + '" data-cena="' + a.ProdajnaCena +
|
||
'" data-stanje="' + (a.Kolicina || 0) + '"><span class="cso-naziv">' + a.Naziv +
|
||
'</span><span class="cso-cena">' + window._dinFmt(a.ProdajnaCena) + ' din</span></div>';
|
||
});
|
||
if (lista) lista.innerHTML = html;
|
||
if (umagacinu) umagacinu.textContent = '—';
|
||
}
|
||
window._ntechPopuniArtikle = popuniArtikle;
|
||
popuniArtikle();
|
||
if (kategSel) kategSel.addEventListener('change', popuniArtikle);
|
||
|
||
artikalSel.addEventListener('change', function () {
|
||
var c = parseFloat(artikalSel.getAttribute('data-cena'));
|
||
if (cena) cena.value = (!isNaN(c) && c > 0) ? c.toFixed(2) : '0';
|
||
var st = parseInt(artikalSel.getAttribute('data-stanje'), 10);
|
||
stanjeIzabrano = isNaN(st) ? 0 : st;
|
||
if (umagacinu) umagacinu.textContent = artikalSel.value ? stanjeIzabrano : '—';
|
||
osveziPrekoracenje();
|
||
});
|
||
if (kol) kol.addEventListener('input', osveziPrekoracenje);
|
||
|
||
// resetuj prikaz „U magacinu" nakon dodavanja dela — base.html poziva
|
||
// f.reset() posle AJAX osvežavanja tabele, ali .reset() ne dira <div>
|
||
function zakaciResetDelovi() {
|
||
var fd = document.querySelector('form[action$="/delovi"]');
|
||
if (fd) {
|
||
fd.addEventListener('reset', function () {
|
||
if (umagacinu) {
|
||
umagacinu.textContent = '—';
|
||
umagacinu.classList.remove('prekoraceno');
|
||
}
|
||
stanjeIzabrano = 0;
|
||
if (kol) kol.classList.remove('prekoraceno');
|
||
});
|
||
}
|
||
}
|
||
zakaciResetDelovi();
|
||
|
||
})();
|
||
|
||
// Popup polja (predviđen datum, garancija, serviser): nema dugmeta „Sačuvaj" —
|
||
// snima se na zatvaranje modala, i to samo ako je vrednost promenjena.
|
||
// Početno stanje forme pamtimo pri otvaranju; na „close" upoređujemo i, ako se
|
||
// razlikuje, šaljemo formu (ntech AJAX presretač osveži #nalog-zaglavlje).
|
||
window.ntechOtvoriModal = function (btn) {
|
||
var d = btn.nextElementSibling;
|
||
if (!d || d.tagName !== 'DIALOG') return;
|
||
var forma = d.querySelector('form[method="POST"], form[method="post"]');
|
||
if (forma) forma.dataset.poc = new URLSearchParams(new FormData(forma)).toString();
|
||
d.showModal();
|
||
};
|
||
if (!window._ntechModalSaveDodato) {
|
||
window._ntechModalSaveDodato = true;
|
||
// 'close' ne baburi — slušamo u capture fazi na dokumentu (hvata i modale ubačene swap-om)
|
||
document.addEventListener('close', function (e) {
|
||
var d = e.target;
|
||
if (!d || d.tagName !== 'DIALOG') return;
|
||
var forma = d.querySelector('form[method="POST"], form[method="post"]');
|
||
if (!forma || forma.dataset.poc === undefined) return;
|
||
var sad = new URLSearchParams(new FormData(forma)).toString();
|
||
if (sad !== forma.dataset.poc) {
|
||
if (forma.requestSubmit) forma.requestSubmit(); else forma.submit();
|
||
}
|
||
}, true);
|
||
}
|
||
</script>
|
||
{{end}}
|