Servis detalji: radovi (usluge) na nalogu + UX popravke

Nova sekcija Radovi: biraš uslugu iz cenovnika (pretraživ datalist combobox),
cena se predloži ali je možeš izmeniti, količina; zbir radova = cena rada,
ukupno = radovi + delovi. Tabela servis_radovi + repo + handleri.
Combobox pretraga i za artikle (delovi). Skinuta kartica Cene sa detalja.
Dodavanje/brisanje rada i dela osvežava samo svoju tabelu (data-refresh) bez
skoka na vrh i treptaja; data-potvrda sada koristi requestSubmit da prolazi kroz
AJAX logiku. Popravljen CSRF (_csrf) i tip kolone datum kod radova.
This commit is contained in:
2026-06-22 00:17:12 +02:00
parent 9a8e9a00cf
commit 1637f65f95
9 changed files with 361 additions and 88 deletions
+25 -1
View File
@@ -349,7 +349,13 @@
window._ntechPotvrdi(el.getAttribute('data-potvrda')).then(function(ok) {
if (!ok) return;
var forma = el.closest('form');
if (forma) { forma.submit(); return; }
// requestSubmit() okida 'submit' event (za razliku od submit()),
// pa prolazi kroz AJAX/ data-refresh logiku umesto pune navigacije
if (forma) {
if (forma.requestSubmit) forma.requestSubmit();
else forma.submit();
return;
}
if (el.href) { window.location.href = el.href; }
});
});
@@ -376,6 +382,24 @@
var finUrl = new URL(res.url);
var isStiPath = finUrl.pathname === location.pathname;
var imaSacuvano = finUrl.search.indexOf('sacuvano') !== -1;
// forme sa data-refresh osvežavaju samo navedeni deo stranice (npr.
// tabelu radova/delova) — bez skoka na vrh i bez treptaja. Važi i za
// dodavanje i za brisanje stavki (dovoljno je da ostanemo na istoj stranici).
var ciljSel = f.getAttribute('data-refresh');
if (ciljSel && isStiPath) {
fetch(res.url, { credentials: 'same-origin' })
.then(function (rr) { return rr.text(); })
.then(function (html) {
var doc = new DOMParser().parseFromString(html, 'text/html');
var novi = doc.querySelector(ciljSel);
var stari = document.querySelector(ciljSel);
if (novi && stari) stari.replaceWith(novi);
f.reset();
if (btn) btn.disabled = false;
})
.catch(function () { location.href = res.url; });
return;
}
if (isStiPath && imaSacuvano) {
// uspeh na istoj stranici — prikaži toast, ostani
window.ntechToast('Sačuvano', 'uspeh');