Refaktor #23: zajedničko zaglavlje servisnih štampanih dokumenata
Izdvojen partial web/templates/komponente/servis_zaglavlje.html sa dva
{{define}} bloka (zaglavljeFirma, zaglavljeKlijent) — koriste ih revers,
predračun, otpremnica (oba bloka) i eskalacioni list (samo firma; klijent
blok tamo ima drugačiji markup/stil pa nije spojen).
kes.go: dodata standaloneExtraFajlovi mapa da standalone šabloni mogu da
uključe dodatne partial fajlove uz svoj glavni (i u produkcionom kešu i u
dev lazy-parse putanji).
Vizuelno provereno u browseru (sva 4 dokumenta, servis nalog SN-2606-007) —
identičan izgled kao pre refaktora, ispravan redosled kolona po dokumentu.
This commit is contained in:
+14
-2
@@ -48,6 +48,16 @@ var standaloneIme = []string{
|
||||
"prijava", "setup", "totp_provera", "prodaja_stampa", "servis_radni_nalog", "servis_otpremnica", "servis_revers", "servis_predracun", "servis_nalepnica", "servis_status_javni", "servis_garantni_list", "servis_eskalacioni_list", "fiskal_verifikacija", "popis_stampa",
|
||||
}
|
||||
|
||||
// standaloneExtraFajlovi su dodatni fajlovi (partial-i sa {{define}}) koje treba
|
||||
// parsirati uz standalone šablon — npr. zajedničko zaglavlje servisnih dokumenata,
|
||||
// koje se deli između revers/predračun/otpremnica/eskalacioni list.
|
||||
var standaloneExtraFajlovi = map[string][]string{
|
||||
"servis_revers": {"web/templates/komponente/servis_zaglavlje.html"},
|
||||
"servis_predracun": {"web/templates/komponente/servis_zaglavlje.html"},
|
||||
"servis_otpremnica": {"web/templates/komponente/servis_zaglavlje.html"},
|
||||
"servis_eskalacioni_list": {"web/templates/komponente/servis_zaglavlje.html"},
|
||||
}
|
||||
|
||||
// sablonskeFunkcije su pomoćne funkcije dostupne u svim šablonima.
|
||||
// dict gradi mapu iz parova ključ/vrednost — koristi se da se jednom partialu
|
||||
// prosledi više vrednosti (npr. {{template "x" (dict "ID" .ID "Lista" $.Lista)}}).
|
||||
@@ -157,7 +167,8 @@ func KreirajKes(fsys fs.FS) (map[string]*template.Template, error) {
|
||||
|
||||
for _, ime := range standaloneIme {
|
||||
// ime+".html" mora biti ime roota da bi Execute() pronašlo sadržaj fajla
|
||||
t, err := template.New(ime+".html").Funcs(sablonskeFunkcije).ParseFS(fsys, "web/templates/stranice/"+ime+".html")
|
||||
fajlovi := append([]string{"web/templates/stranice/" + ime + ".html"}, standaloneExtraFajlovi[ime]...)
|
||||
t, err := template.New(ime+".html").Funcs(sablonskeFunkcije).ParseFS(fsys, fajlovi...)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("kes: %s: %w", ime, err)
|
||||
}
|
||||
@@ -219,7 +230,8 @@ func (h *Handler) renderujStandalone(w http.ResponseWriter, ime string, podaci a
|
||||
} else {
|
||||
var err error
|
||||
// kao u kreirajKes: root mora biti ime+".html" i moraju biti registrovane šablonske funkcije
|
||||
if tmpl, err = template.New(ime+".html").Funcs(sablonskeFunkcije).ParseFS(h.TemplatesFS, "web/templates/stranice/"+ime+".html"); err != nil {
|
||||
fajlovi := append([]string{"web/templates/stranice/" + ime + ".html"}, standaloneExtraFajlovi[ime]...)
|
||||
if tmpl, err = template.New(ime+".html").Funcs(sablonskeFunkcije).ParseFS(h.TemplatesFS, fajlovi...); err != nil {
|
||||
slog.Error("greška pri parsiranju šablona", "ime", ime, "error", err)
|
||||
http.Error(w, "Greška pri učitavanju stranice", http.StatusInternalServerError)
|
||||
return
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
{{define "zaglavljeFirma"}}
|
||||
<!-- LEVO: firma — logo na vrhu, tekst ispod -->
|
||||
<div class="zg-okvir">
|
||||
{{if .LogoPutanja}}
|
||||
<img src="{{.LogoPutanja}}" alt="Logo" style="max-height:54px;max-width:100%;object-fit:contain;display:block;margin-bottom:8px;">
|
||||
{{else}}
|
||||
<div class="firma-naziv">{{if .NazivFirme}}{{.NazivFirme}}{{else}}— naziv firme —{{end}}</div>
|
||||
{{end}}
|
||||
<div class="firma-info">
|
||||
{{if .Podnazlov}}{{.Podnazlov}}<br>{{end}}
|
||||
{{if .Adresa}}{{.Adresa}}<br>{{end}}
|
||||
{{if .Telefon}}Tel: {{telefon .Telefon}}<br>{{end}}
|
||||
{{if .PIB}}PIB: {{.PIB}}{{end}}{{if .MaticniBroj}}{{if .PIB}} · {{end}}MB: {{.MaticniBroj}}{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
{{define "zaglavljeKlijent"}}
|
||||
<!-- klijent -->
|
||||
<div class="zg-okvir">
|
||||
<div class="strana-tip">Klijent</div>
|
||||
{{if .KlijentNaziv}}
|
||||
<div class="strana-naziv">{{.KlijentNaziv}}</div>
|
||||
<div class="strana-info">
|
||||
{{if .Klijent}}
|
||||
{{if .Klijent.Telefon}}Tel: {{telefon .Klijent.Telefon}}<br>{{end}}
|
||||
{{if .Klijent.Email}}{{.Klijent.Email}}<br>{{end}}
|
||||
{{if .Klijent.Mesto}}{{.Klijent.Mesto}}<br>{{end}}
|
||||
{{if .Klijent.PIB}}PIB: {{.Klijent.PIB}}{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="strana-naziv prazno">— klijent nije naveden —</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -53,19 +53,7 @@
|
||||
|
||||
<!-- zaglavlje -->
|
||||
<div class="zaglavlje">
|
||||
<div class="zg-okvir">
|
||||
{{if .LogoPutanja}}
|
||||
<img src="{{.LogoPutanja}}" alt="Logo" style="max-height:54px;max-width:100%;object-fit:contain;display:block;margin-bottom:8px;">
|
||||
{{else}}
|
||||
<div class="firma-naziv">{{if .NazivFirme}}{{.NazivFirme}}{{else}}— naziv firme —{{end}}</div>
|
||||
{{end}}
|
||||
<div class="firma-info">
|
||||
{{if .Podnazlov}}{{.Podnazlov}}<br>{{end}}
|
||||
{{if .Adresa}}{{.Adresa}}<br>{{end}}
|
||||
{{if .Telefon}}Tel: {{telefon .Telefon}}<br>{{end}}
|
||||
{{if .PIB}}PIB: {{.PIB}}{{end}}{{if .MaticniBroj}}{{if .PIB}} · {{end}}MB: {{.MaticniBroj}}{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{template "zaglavljeFirma" .}}
|
||||
<div class="zg-okvir" style="flex:1.3;">
|
||||
{{if .Barkod}}<img src="data:image/png;base64,{{.Barkod}}" alt="Barkod {{.Nalog.BrojNaloga}}" style="display:block;width:100%;max-height:46px;object-fit:contain;margin-bottom:10px;">{{end}}
|
||||
<div class="dok-tip">Eskalacioni list — praćenje rokova</div>
|
||||
|
||||
@@ -83,37 +83,8 @@
|
||||
|
||||
<!-- zaglavlje -->
|
||||
<div class="zaglavlje">
|
||||
<!-- LEVO: firma — logo na vrhu, tekst ispod -->
|
||||
<div class="zg-okvir">
|
||||
{{if .LogoPutanja}}
|
||||
<img src="{{.LogoPutanja}}" alt="Logo" style="max-height:54px;max-width:100%;object-fit:contain;display:block;margin-bottom:8px;">
|
||||
{{else}}
|
||||
<div class="firma-naziv">{{if .NazivFirme}}{{.NazivFirme}}{{else}}— naziv firme —{{end}}</div>
|
||||
{{end}}
|
||||
<div class="firma-info">
|
||||
{{if .Podnazlov}}{{.Podnazlov}}<br>{{end}}
|
||||
{{if .Adresa}}{{.Adresa}}<br>{{end}}
|
||||
{{if .Telefon}}Tel: {{telefon .Telefon}}<br>{{end}}
|
||||
{{if .PIB}}PIB: {{.PIB}}{{end}}{{if .MaticniBroj}}{{if .PIB}} · {{end}}MB: {{.MaticniBroj}}{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<!-- SREDINA: klijent -->
|
||||
<div class="zg-okvir">
|
||||
<div class="strana-tip">Klijent</div>
|
||||
{{if .KlijentNaziv}}
|
||||
<div class="strana-naziv">{{.KlijentNaziv}}</div>
|
||||
<div class="strana-info">
|
||||
{{if .Klijent}}
|
||||
{{if .Klijent.Telefon}}Tel: {{telefon .Klijent.Telefon}}<br>{{end}}
|
||||
{{if .Klijent.Email}}{{.Klijent.Email}}<br>{{end}}
|
||||
{{if .Klijent.Mesto}}{{.Klijent.Mesto}}<br>{{end}}
|
||||
{{if .Klijent.PIB}}PIB: {{.Klijent.PIB}}{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="strana-naziv prazno">— klijent nije naveden —</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{template "zaglavljeFirma" .}}
|
||||
{{template "zaglavljeKlijent" .}}
|
||||
<!-- DESNO: barkod na vrhu, ispod datumi (levo) + QR (skroz desno) -->
|
||||
<div class="zg-okvir" style="flex:1.3;">
|
||||
{{if .Barkod}}<img src="data:image/png;base64,{{.Barkod}}" alt="Barkod {{.Nalog.BrojNaloga}}" style="display:block;width:100%;max-height:46px;object-fit:contain;margin-bottom:10px;">{{end}}
|
||||
|
||||
@@ -77,20 +77,7 @@
|
||||
|
||||
<!-- zaglavlje -->
|
||||
<div class="zaglavlje">
|
||||
<!-- LEVO: firma — logo na vrhu, tekst ispod -->
|
||||
<div class="zg-okvir">
|
||||
{{if .LogoPutanja}}
|
||||
<img src="{{.LogoPutanja}}" alt="Logo" style="max-height:54px;max-width:100%;object-fit:contain;display:block;margin-bottom:8px;">
|
||||
{{else}}
|
||||
<div class="firma-naziv">{{if .NazivFirme}}{{.NazivFirme}}{{else}}— naziv firme —{{end}}</div>
|
||||
{{end}}
|
||||
<div class="firma-info">
|
||||
{{if .Podnazlov}}{{.Podnazlov}}<br>{{end}}
|
||||
{{if .Adresa}}{{.Adresa}}<br>{{end}}
|
||||
{{if .Telefon}}Tel: {{telefon .Telefon}}<br>{{end}}
|
||||
{{if .PIB}}PIB: {{.PIB}}{{end}}{{if .MaticniBroj}}{{if .PIB}} · {{end}}MB: {{.MaticniBroj}}{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{template "zaglavljeFirma" .}}
|
||||
<!-- SREDINA: datumi (levo) + QR (skroz desno) -->
|
||||
<div class="zg-okvir" style="flex:1.3;">
|
||||
<div style="display:flex;justify-content:space-between;align-items:flex-start;gap:10px;">
|
||||
@@ -103,23 +90,7 @@
|
||||
{{if .QRKod}}<img src="data:image/png;base64,{{.QRKod}}" width="92" height="92" alt="QR {{.Nalog.BrojNaloga}}" style="image-rendering:pixelated;border:1px solid #ddd;border-radius:4px;flex-shrink:0;">{{end}}
|
||||
</div>
|
||||
</div>
|
||||
<!-- DESNO: klijent -->
|
||||
<div class="zg-okvir">
|
||||
<div class="strana-tip">Klijent</div>
|
||||
{{if .KlijentNaziv}}
|
||||
<div class="strana-naziv">{{.KlijentNaziv}}</div>
|
||||
<div class="strana-info">
|
||||
{{if .Klijent}}
|
||||
{{if .Klijent.Telefon}}Tel: {{telefon .Klijent.Telefon}}<br>{{end}}
|
||||
{{if .Klijent.Email}}{{.Klijent.Email}}<br>{{end}}
|
||||
{{if .Klijent.Mesto}}{{.Klijent.Mesto}}<br>{{end}}
|
||||
{{if .Klijent.PIB}}PIB: {{.Klijent.PIB}}{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="strana-naziv prazno">— klijent nije naveden —</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{template "zaglavljeKlijent" .}}
|
||||
</div>
|
||||
|
||||
<!-- uređaj i traženo -->
|
||||
|
||||
@@ -75,20 +75,7 @@
|
||||
|
||||
<!-- zaglavlje -->
|
||||
<div class="zaglavlje">
|
||||
<!-- LEVO: firma — logo na vrhu, tekst ispod -->
|
||||
<div class="zg-okvir">
|
||||
{{if .LogoPutanja}}
|
||||
<img src="{{.LogoPutanja}}" alt="Logo" style="max-height:54px;max-width:100%;object-fit:contain;display:block;margin-bottom:8px;">
|
||||
{{else}}
|
||||
<div class="firma-naziv">{{if .NazivFirme}}{{.NazivFirme}}{{else}}— naziv firme —{{end}}</div>
|
||||
{{end}}
|
||||
<div class="firma-info">
|
||||
{{if .Podnazlov}}{{.Podnazlov}}<br>{{end}}
|
||||
{{if .Adresa}}{{.Adresa}}<br>{{end}}
|
||||
{{if .Telefon}}Tel: {{telefon .Telefon}}<br>{{end}}
|
||||
{{if .PIB}}PIB: {{.PIB}}{{end}}{{if .MaticniBroj}}{{if .PIB}} · {{end}}MB: {{.MaticniBroj}}{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{template "zaglavljeFirma" .}}
|
||||
<!-- SREDINA: barkod na vrhu, ispod dokument i datumi (QR je u sekciji „Uređaj na servisu") -->
|
||||
<div class="zg-okvir" style="flex:1.3;">
|
||||
{{if .Barkod}}<img src="data:image/png;base64,{{.Barkod}}" alt="Barkod {{.Nalog.BrojNaloga}}" style="display:block;width:100%;max-height:46px;object-fit:contain;margin-bottom:10px;">{{end}}
|
||||
@@ -99,23 +86,7 @@
|
||||
<div class="dok-datum">Predviđen rok: {{.Nalog.PredvidjenDatum.Format "02.01.2006."}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
<!-- DESNO: klijent -->
|
||||
<div class="zg-okvir">
|
||||
<div class="strana-tip">Klijent</div>
|
||||
{{if .KlijentNaziv}}
|
||||
<div class="strana-naziv">{{.KlijentNaziv}}</div>
|
||||
<div class="strana-info">
|
||||
{{if .Klijent}}
|
||||
{{if .Klijent.Telefon}}Tel: {{telefon .Klijent.Telefon}}<br>{{end}}
|
||||
{{if .Klijent.Email}}{{.Klijent.Email}}<br>{{end}}
|
||||
{{if .Klijent.Mesto}}{{.Klijent.Mesto}}<br>{{end}}
|
||||
{{if .Klijent.PIB}}PIB: {{.Klijent.PIB}}{{end}}
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<div class="strana-naziv prazno">— klijent nije naveden —</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{template "zaglavljeKlijent" .}}
|
||||
</div>
|
||||
|
||||
<!-- uređaj (QR skroz desno — klijent ga skenira da prati status) -->
|
||||
|
||||
Reference in New Issue
Block a user