Podešavanja: accordion podmeni, podsekcije Opšte/Izgled/Sistem, glassmorphism prijava, kontrast teksta
This commit is contained in:
@@ -100,6 +100,10 @@ func (h *Handler) popuniPodaciStranice(r *http.Request, podesavanja map[string]s
|
||||
if ps.AppPozadinaBlur == "" {
|
||||
ps.AppPozadinaBlur = "12"
|
||||
}
|
||||
ps.AppPozadinaBlurPozadine = podesavanja["app_pozadina_blur_pozadine"]
|
||||
if ps.AppPozadinaBlurPozadine == "" {
|
||||
ps.AppPozadinaBlurPozadine = "0"
|
||||
}
|
||||
|
||||
return ps
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ var saSidebar = []string{
|
||||
"klijenti", "klijent_forma",
|
||||
"magacin", "magacin_forma",
|
||||
"nabavke", "nabavka_forma", "nabavka_detalji",
|
||||
"podesavanja",
|
||||
"podesavanja", "podesavanja_opste", "podesavanja_izgled", "podesavanja_sistem",
|
||||
"podsetnici", "podsetnik_forma",
|
||||
"prodaja", "prodaja_detalji", "prodaja_forma",
|
||||
"servis", "servis_forma", "servis_detalji",
|
||||
|
||||
+218
-19
@@ -38,10 +38,14 @@ type PodaciPodesavanja struct {
|
||||
LogoGreska string
|
||||
BackupVracen bool
|
||||
Backupi []BackupInfo
|
||||
LoginPozadina string
|
||||
AppPozadina string
|
||||
AppPozadinaOpacity string
|
||||
AppPozadinaBlur string
|
||||
LoginPozadina string
|
||||
LoginPozadinaOpacity string
|
||||
LoginPozadinaBlurPozadine string
|
||||
LoginPozadinaBlurKartice string
|
||||
AppPozadina string
|
||||
AppPozadinaOpacity string
|
||||
AppPozadinaBlur string
|
||||
AppPozadinaBlurPozadine string
|
||||
}
|
||||
|
||||
// BackupInfo opisuje jedan backup fajl
|
||||
@@ -85,8 +89,23 @@ func (h *Handler) Podesavanja(w http.ResponseWriter, r *http.Request) {
|
||||
Verzija: h.Verzija,
|
||||
LogoGreska: r.URL.Query().Get("logo_greska"),
|
||||
Backupi: ucitajListuBackupa(),
|
||||
LoginPozadina: podesavanja["login_pozadina"],
|
||||
AppPozadina: podesavanja["app_pozadina"],
|
||||
LoginPozadina: podesavanja["login_pozadina"],
|
||||
LoginPozadinaOpacity: func() string {
|
||||
v := podesavanja["login_pozadina_opacity"]
|
||||
if v == "" { return "50" }
|
||||
return v
|
||||
}(),
|
||||
LoginPozadinaBlurPozadine: func() string {
|
||||
v := podesavanja["login_pozadina_blur_pozadine"]
|
||||
if v == "" { return "0" }
|
||||
return v
|
||||
}(),
|
||||
LoginPozadinaBlurKartice: func() string {
|
||||
v := podesavanja["login_pozadina_blur_kartice"]
|
||||
if v == "" { return "12" }
|
||||
return v
|
||||
}(),
|
||||
AppPozadina: podesavanja["app_pozadina"],
|
||||
AppPozadinaOpacity: func() string {
|
||||
v := podesavanja["app_pozadina_opacity"]
|
||||
if v == "" { return "50" }
|
||||
@@ -97,6 +116,11 @@ func (h *Handler) Podesavanja(w http.ResponseWriter, r *http.Request) {
|
||||
if v == "" { return "12" }
|
||||
return v
|
||||
}(),
|
||||
AppPozadinaBlurPozadine: func() string {
|
||||
v := podesavanja["app_pozadina_blur_pozadine"]
|
||||
if v == "" { return "0" }
|
||||
return v
|
||||
}(),
|
||||
}
|
||||
|
||||
h.renderujTemplate(w, "podesavanja", podaci)
|
||||
@@ -247,7 +271,12 @@ func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
http.Redirect(w, r, "/podesavanja?sacuvano=1", http.StatusSeeOther)
|
||||
sledeci := r.FormValue("_next")
|
||||
if sledeci == "" {
|
||||
http.Redirect(w, r, "/podesavanja?sacuvano=1", http.StatusSeeOther)
|
||||
} else {
|
||||
http.Redirect(w, r, sledeci+"?sacuvano=1", http.StatusSeeOther)
|
||||
}
|
||||
}
|
||||
|
||||
// BackupBaze kreira konzistentnu kopiju baze i šalje je kao attachment
|
||||
@@ -645,11 +674,18 @@ func (h *Handler) SacuvajAppPozadinaStilove(w http.ResponseWriter, r *http.Reque
|
||||
}
|
||||
|
||||
blurStr := r.FormValue("blur")
|
||||
blurPozadineStr := r.FormValue("blur_pozadine")
|
||||
opacityStr := r.FormValue("opacity")
|
||||
|
||||
blurVal, err := strconv.Atoi(blurStr)
|
||||
if err != nil || blurVal < 0 || blurVal > 20 {
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Neispravna vrednost zamućenja.")
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Neispravna vrednost zamućenja stakla.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
blurPozadineVal, err := strconv.Atoi(blurPozadineStr)
|
||||
if err != nil || blurPozadineVal < 0 || blurPozadineVal > 20 {
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Neispravna vrednost zamućenja pozadine.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
@@ -660,23 +696,186 @@ func (h *Handler) SacuvajAppPozadinaStilove(w http.ResponseWriter, r *http.Reque
|
||||
return
|
||||
}
|
||||
|
||||
if err := ntechsqlite.SacuvajPodesavanje(r.Context(), h.DB, "app_pozadina_blur", blurStr); err != nil {
|
||||
log.Printf("stilovi app pozadine: greška pri čuvanju blur: %v", err)
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Greška pri čuvanju podešavanja.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
if err := ntechsqlite.SacuvajPodesavanje(r.Context(), h.DB, "app_pozadina_opacity", opacityStr); err != nil {
|
||||
log.Printf("stilovi app pozadine: greška pri čuvanju opacity: %v", err)
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Greška pri čuvanju podešavanja.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
return
|
||||
for kljuc, vrednost := range map[string]string{
|
||||
"app_pozadina_blur": blurStr,
|
||||
"app_pozadina_blur_pozadine": blurPozadineStr,
|
||||
"app_pozadina_opacity": opacityStr,
|
||||
} {
|
||||
if err := ntechsqlite.SacuvajPodesavanje(r.Context(), h.DB, kljuc, vrednost); err != nil {
|
||||
log.Printf("stilovi app pozadine: greška pri čuvanju %s: %v", kljuc, err)
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Greška pri čuvanju podešavanja.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
middleware.SetFlash(w, r, h.DB, "uspeh", "Izgled pozadine aplikacije je sačuvan.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
}
|
||||
|
||||
// SacuvajLoginPozadinaStilove čuva vrednosti zamućenja i prozirnosti pozadine login stranice
|
||||
func (h *Handler) SacuvajLoginPozadinaStilove(w http.ResponseWriter, r *http.Request) {
|
||||
k := middleware.KorisnikIzKonteksta(r.Context())
|
||||
if k == nil || !h.DozvoleRepo.ImaDozvolu(r.Context(), k.Uloga, "podesavanja.login_pozadina") {
|
||||
http.Error(w, "Nemate dozvolu za ovu akciju.", http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
if err := r.ParseForm(); err != nil {
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Greška pri čitanju forme.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
|
||||
blurPozadineStr := r.FormValue("blur_pozadine")
|
||||
blurKarticeStr := r.FormValue("blur_kartice")
|
||||
opacityStr := r.FormValue("opacity")
|
||||
|
||||
blurPozadineVal, err := strconv.Atoi(blurPozadineStr)
|
||||
if err != nil || blurPozadineVal < 0 || blurPozadineVal > 20 {
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Neispravna vrednost zamućenja pozadine.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
blurKarticeVal, err := strconv.Atoi(blurKarticeStr)
|
||||
if err != nil || blurKarticeVal < 0 || blurKarticeVal > 20 {
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Neispravna vrednost zamućenja kartice.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
opacityVal, err := strconv.Atoi(opacityStr)
|
||||
if err != nil || opacityVal < 0 || opacityVal > 80 {
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Neispravna vrednost prozirnosti.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
|
||||
for kljuc, vrednost := range map[string]string{
|
||||
"login_pozadina_blur_pozadine": blurPozadineStr,
|
||||
"login_pozadina_blur_kartice": blurKarticeStr,
|
||||
"login_pozadina_opacity": opacityStr,
|
||||
} {
|
||||
if err := ntechsqlite.SacuvajPodesavanje(r.Context(), h.DB, kljuc, vrednost); err != nil {
|
||||
log.Printf("stilovi login pozadine: greška pri čuvanju %s: %v", kljuc, err)
|
||||
middleware.SetFlash(w, r, h.DB, "greska", "Greška pri čuvanju podešavanja.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
middleware.SetFlash(w, r, h.DB, "uspeh", "Izgled pozadine prijave je sačuvan.")
|
||||
http.Redirect(w, r, "/podesavanja", http.StatusSeeOther)
|
||||
}
|
||||
|
||||
// napuniPodaciPodesavanja učitava sva podešavanja i kreira strukturu za template
|
||||
func (h *Handler) napuniPodaciPodesavanja(r *http.Request, naslov string) (PodaciPodesavanja, error) {
|
||||
podesavanja, err := ntechsqlite.DohvatiSvaPodesavanja(r.Context(), h.DB)
|
||||
if err != nil {
|
||||
return PodaciPodesavanja{}, err
|
||||
}
|
||||
ps := h.popuniPodaciStranice(r, podesavanja)
|
||||
ps.Stranica = "podesavanja"
|
||||
ps.NaslovStranice = naslov
|
||||
return PodaciPodesavanja{
|
||||
PodaciStranice: ps,
|
||||
NazivFirme: podesavanja["naziv_firme"],
|
||||
Podnazlov: podesavanja["podnazlov"],
|
||||
Adresa: podesavanja["adresa"],
|
||||
Telefon: podesavanja["telefon"],
|
||||
PIB: podesavanja["pib"],
|
||||
LogoTip: podesavanja["logo_tip"],
|
||||
LogoPutanja: podesavanja["logo_putanja"],
|
||||
Tema: podesavanja["tema"],
|
||||
Sacuvano: r.URL.Query().Get("sacuvano") == "1",
|
||||
BackupVracen: r.URL.Query().Get("sacuvano") == "vraceno",
|
||||
Verzija: h.Verzija,
|
||||
LogoGreska: r.URL.Query().Get("logo_greska"),
|
||||
Backupi: ucitajListuBackupa(),
|
||||
LoginPozadina: podesavanja["login_pozadina"],
|
||||
LoginPozadinaOpacity: func() string {
|
||||
if v := podesavanja["login_pozadina_opacity"]; v != "" {
|
||||
return v
|
||||
}
|
||||
return "50"
|
||||
}(),
|
||||
LoginPozadinaBlurPozadine: func() string {
|
||||
if v := podesavanja["login_pozadina_blur_pozadine"]; v != "" {
|
||||
return v
|
||||
}
|
||||
return "0"
|
||||
}(),
|
||||
LoginPozadinaBlurKartice: func() string {
|
||||
if v := podesavanja["login_pozadina_blur_kartice"]; v != "" {
|
||||
return v
|
||||
}
|
||||
return "12"
|
||||
}(),
|
||||
AppPozadina: podesavanja["app_pozadina"],
|
||||
AppPozadinaOpacity: func() string {
|
||||
if v := podesavanja["app_pozadina_opacity"]; v != "" {
|
||||
return v
|
||||
}
|
||||
return "50"
|
||||
}(),
|
||||
AppPozadinaBlur: func() string {
|
||||
if v := podesavanja["app_pozadina_blur"]; v != "" {
|
||||
return v
|
||||
}
|
||||
return "12"
|
||||
}(),
|
||||
AppPozadinaBlurPozadine: func() string {
|
||||
if v := podesavanja["app_pozadina_blur_pozadine"]; v != "" {
|
||||
return v
|
||||
}
|
||||
return "0"
|
||||
}(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// PodesavanjaOpste renderuje stranicu sa opštim podešavanjima (firma i logo)
|
||||
func (h *Handler) PodesavanjaOpste(w http.ResponseWriter, r *http.Request) {
|
||||
k := middleware.KorisnikIzKonteksta(r.Context())
|
||||
if k == nil || !h.DozvoleRepo.ImaDozvolu(r.Context(), k.Uloga, "podesavanja.pregled") {
|
||||
http.Error(w, "Nemate dozvolu za ovu akciju.", http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
podaci, err := h.napuniPodaciPodesavanja(r, "Podešavanja — Opšte")
|
||||
if err != nil {
|
||||
http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
h.renderujTemplate(w, "podesavanja_opste", podaci)
|
||||
}
|
||||
|
||||
// PodesavanjaIzgled renderuje stranicu sa podešavanjima izgleda (pozadine i tema)
|
||||
func (h *Handler) PodesavanjaIzgled(w http.ResponseWriter, r *http.Request) {
|
||||
k := middleware.KorisnikIzKonteksta(r.Context())
|
||||
if k == nil || !h.DozvoleRepo.ImaDozvolu(r.Context(), k.Uloga, "podesavanja.pregled") {
|
||||
http.Error(w, "Nemate dozvolu za ovu akciju.", http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
podaci, err := h.napuniPodaciPodesavanja(r, "Podešavanja — Izgled")
|
||||
if err != nil {
|
||||
http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
h.renderujTemplate(w, "podesavanja_izgled", podaci)
|
||||
}
|
||||
|
||||
// PodesavanjaSistem renderuje stranicu sa sistemskim podešavanjima (backup)
|
||||
func (h *Handler) PodesavanjaSistem(w http.ResponseWriter, r *http.Request) {
|
||||
k := middleware.KorisnikIzKonteksta(r.Context())
|
||||
if k == nil || !h.DozvoleRepo.ImaDozvolu(r.Context(), k.Uloga, "podesavanja.pregled") {
|
||||
http.Error(w, "Nemate dozvolu za ovu akciju.", http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
podaci, err := h.napuniPodaciPodesavanja(r, "Podešavanja — Sistem")
|
||||
if err != nil {
|
||||
http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
h.renderujTemplate(w, "podesavanja_sistem", podaci)
|
||||
}
|
||||
|
||||
// PromeniTemu menja aktivnu temu i vraća na prethodnu stranicu
|
||||
func (h *Handler) PromeniTemu(w http.ResponseWriter, r *http.Request) {
|
||||
tema := chi.URLParam(r, "tema")
|
||||
|
||||
@@ -31,16 +31,31 @@ func (h *Handler) PrikazPrijave(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
greska := r.URL.Query().Get("greska")
|
||||
|
||||
// login_pozadina se čita bez prijavljenog korisnika — koristimo background kontekst
|
||||
// login_pozadina i stilovi se čitaju bez prijavljenog korisnika — koristimo background kontekst
|
||||
loginPozadina := ""
|
||||
loginOpacity := "50"
|
||||
loginBlurPozadine := "0"
|
||||
loginBlurKartice := "12"
|
||||
if podesavanja, err := ntechsqlite.DohvatiSvaPodesavanja(context.Background(), h.DB); err == nil {
|
||||
loginPozadina = podesavanja["login_pozadina"]
|
||||
if v := podesavanja["login_pozadina_opacity"]; v != "" {
|
||||
loginOpacity = v
|
||||
}
|
||||
if v := podesavanja["login_pozadina_blur_pozadine"]; v != "" {
|
||||
loginBlurPozadine = v
|
||||
}
|
||||
if v := podesavanja["login_pozadina_blur_kartice"]; v != "" {
|
||||
loginBlurKartice = v
|
||||
}
|
||||
}
|
||||
|
||||
h.renderujStandalone(w, "prijava", map[string]any{
|
||||
"Greska": greska,
|
||||
"CsrfToken": middleware.CsrfToken(r.Context()),
|
||||
"LoginPozadina": loginPozadina,
|
||||
"Greska": greska,
|
||||
"CsrfToken": middleware.CsrfToken(r.Context()),
|
||||
"LoginPozadina": loginPozadina,
|
||||
"LoginPozadinaOpacity": loginOpacity,
|
||||
"LoginPozadinaBlurPozadine": loginBlurPozadine,
|
||||
"LoginPozadinaBlurKartice": loginBlurKartice,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user