Servis novi nalog: kartice, izbor/kreiranje klijenta, novi broj naloga

- Forma naloga razdvojena u zasebne kartice (Uređaj, Klijent, Status i datumi, Cene/Napomena)
- Nova kartica Klijent: radio fizičko/pravno, živa pretraga postojećih (Alpine, CSP-safe) po punom imenu/imenu/prezimenu odnosno nazivu firme; izbor postojećeg ili unos novog
- Enter u pretrazi bez izbora popunjava polja novog klijenta (ime/prezime ili naziv firme)
- SacuvajNalog/SacuvajIzmenaNaloga: helper mozdaKreirajKlijenta kreira novog klijenta iz forme kada nije izabran postojeći
- Broj naloga: format SN-MMGG-NNN sa mesečnim resetom brojača (001-999)
- Dodat CSRF token u formu naloga (POST je ranije vraćao 403)
- Šablonski helper json za ugradnju liste klijenata u Alpine
This commit is contained in:
2026-06-21 12:15:59 +02:00
parent 337267acd4
commit 045ea766f1
5 changed files with 513 additions and 198 deletions
+10
View File
@@ -1,6 +1,7 @@
package handler
import (
"encoding/json"
"fmt"
"html/template"
"io/fs"
@@ -65,6 +66,15 @@ var sablonskeFunkcije = template.FuncMap{
},
// telefon formatira srpski broj telefona radi lakšeg čitanja: "0641234567" → "064 123 4567"
"telefon": formatirajTelefon,
// json serijalizuje vrednost u JSON za ugradnju u <script> (npr. Alpine x-data);
// template.JS sprečava da html/template dodatno escapuje rezultat
"json": func(v any) (template.JS, error) {
b, err := json.Marshal(v)
if err != nil {
return "", fmt.Errorf("ntech: json helper: %w", err)
}
return template.JS(b), nil
},
// statusPre vraća true ako je `a` pre `b` u redosledu statusa
"statusPre": func(a, b string, statusi []string) bool {
ia, ib := -1, -1