diff --git a/cmd/ntech/main.go b/cmd/ntech/main.go index 411ee76..98703d5 100644 --- a/cmd/ntech/main.go +++ b/cmd/ntech/main.go @@ -14,7 +14,6 @@ import ( ) func main() { - // učitaj .env fajl ako postoji godotenv.Load() if config.JelPrvoPokretanje() { @@ -22,32 +21,27 @@ func main() { return } - // normalno pokretanje port := os.Getenv("NTECH_PORT") if port == "" { port = "8080" } - // putanja do SQLite fajla putanjaBaze := os.Getenv("NTECH_SQLITE") if putanjaBaze == "" { putanjaBaze = "ntech.db" } - // otvaramo konekciju ka bazi db, err := sqlite.OtvoriDB(putanjaBaze) if err != nil { log.Fatalf("Greška pri otvaranju baze: %v", err) } defer db.Close() - // pokrećemo migracije if err := sqlite.PokreniMigracije(db, "migrations"); err != nil { log.Fatalf("Greška pri migracijama: %v", err) } log.Println("Migracije uspešno izvršene") - // kreiramo handler sa bazom h := handler.Novi(db) r := chi.NewRouter() @@ -60,6 +54,8 @@ func main() { http.Redirect(w, r, "/dashboard", http.StatusFound) }) r.Get("/dashboard", h.Dashboard) + r.Get("/podesavanja", h.Podesavanja) + r.Post("/podesavanja/sacuvaj", h.SacuvajPodesavanja) log.Printf("NTech pokrenut na portu %s", port) err = http.ListenAndServe(":"+port, r) diff --git a/internal/handler/podesavanja.go b/internal/handler/podesavanja.go new file mode 100644 index 0000000..193281d --- /dev/null +++ b/internal/handler/podesavanja.go @@ -0,0 +1,91 @@ +package handler + +import ( + "html/template" + "net/http" + + "ntech/internal/db/sqlite" + "ntech/internal/model" +) + +// PodaciPodesavanja su podaci za stranicu podešavanja +type PodaciPodesavanja struct { + model.PodaciStranice + NazivFirme string + Podnazlov string + LogoTip string + LogoPutanja string + Tema string + Sacuvano bool +} + +// Podesavanja renderuje stranicu podešavanja +func (h *Handler) Podesavanja(w http.ResponseWriter, r *http.Request) { + podesavanja, err := sqlite.DohvatiSvaPodesavanja(r.Context(), h.DB) + if err != nil { + http.Error(w, "Greška pri učitavanju podešavanja", http.StatusInternalServerError) + return + } + + podaci := PodaciPodesavanja{ + PodaciStranice: model.PodaciStranice{ + Stranica: "podesavanja", + NaslovStranice: "Podešavanja", + Tema: podesavanja["tema"], + NazivFirme: podesavanja["naziv_firme"], + Podnazlov: podesavanja["podnazlov"], + LogoTip: podesavanja["logo_tip"], + LogoPutanja: podesavanja["logo_putanja"], + Korisnik: "Admin", + }, + NazivFirme: podesavanja["naziv_firme"], + Podnazlov: podesavanja["podnazlov"], + LogoTip: podesavanja["logo_tip"], + LogoPutanja: podesavanja["logo_putanja"], + Tema: podesavanja["tema"], + Sacuvano: r.URL.Query().Get("sacuvano") == "1", + } + + tmpl, err := template.ParseFiles( + "web/templates/teme/podrazumevana/base.html", + "web/templates/komponente/sidebar.html", + "web/templates/komponente/topbar.html", + "web/templates/stranice/podesavanja.html", + ) + if err != nil { + http.Error(w, "Greška pri učitavanju stranice", http.StatusInternalServerError) + return + } + + if err := tmpl.ExecuteTemplate(w, "base", podaci); err != nil { + http.Error(w, "Greška pri prikazu stranice", http.StatusInternalServerError) + return + } +} + +// SacuvajPodesavanja prima POST i čuva podešavanja u bazu +func (h *Handler) SacuvajPodesavanja(w http.ResponseWriter, r *http.Request) { + if err := r.ParseForm(); err != nil { + http.Error(w, "Greška pri čitanju forme", http.StatusBadRequest) + return + } + + polja := map[string]string{ + "naziv_firme": r.FormValue("naziv_firme"), + "podnazlov": r.FormValue("podnazlov"), + "logo_tip": r.FormValue("logo_tip"), + "tema": r.FormValue("tema"), + } + + for kljuc, vrednost := range polja { + if vrednost == "" { + continue + } + if err := sqlite.SacuvajPodesavanje(r.Context(), h.DB, kljuc, vrednost); err != nil { + http.Error(w, "Greška pri čuvanju podešavanja", http.StatusInternalServerError) + return + } + } + + http.Redirect(w, r, "/podesavanja?sacuvano=1", http.StatusSeeOther) +} diff --git a/web/static/css/main.css b/web/static/css/main.css index f2d46b4..85a3b92 100644 --- a/web/static/css/main.css +++ b/web/static/css/main.css @@ -257,3 +257,40 @@ body { transform: translateY(-4px); box-shadow: 0 8px 24px rgba(0,0,0,0.08); } + +/* input polja — konzistentna za sve teme */ +input[type="text"], +input[type="email"], +input[type="password"], +input[type="number"], +textarea, +select { + background: var(--kartica) !important; + color: var(--tekst-glavni) !important; + border: 0.5px solid var(--ivica) !important; + border-radius: 8px; + padding: 8px 12px; + font-size: 14px; + outline: none; + transition: border-color 0.2s; +} + +input[type="text"]:focus, +input[type="email"]:focus, +input[type="password"]:focus, +input[type="number"]:focus, +textarea:focus, +select:focus { + border-color: var(--sb-akcent) !important; +} + +/* poruka o uspehu — konzistentna za sve teme */ +.poruka-uspeh { + background: var(--kartica); + border: 0.5px solid var(--sb-akcent); + border-radius: 10px; + padding: 12px 16px; + margin-bottom: 20px; + font-size: 14px; + color: var(--sb-akcent); +} diff --git a/web/static/css/teme/ljubicasta.css b/web/static/css/teme/ljubicasta.css index 595f112..523d9fb 100644 --- a/web/static/css/teme/ljubicasta.css +++ b/web/static/css/teme/ljubicasta.css @@ -1,8 +1,8 @@ :root { - --sb-pozadina: #1e1535; - --sb-hover: #2d2050; - --sb-aktivan: #3d2b6e; - --sb-tekst: #a78bca; + --sb-pozadina: #4a3580; + --sb-hover: #5a4295; + --sb-aktivan: #6d52b0; + --sb-tekst: #c4b5e8; --sb-tekst-aktivan: #ffffff; --sb-akcent: #a855f7; diff --git a/web/static/css/teme/tamna.css b/web/static/css/teme/tamna.css index e5d3270..a526c16 100644 --- a/web/static/css/teme/tamna.css +++ b/web/static/css/teme/tamna.css @@ -6,10 +6,10 @@ --sb-tekst-aktivan: #ffffff; --sb-akcent: #4f7ef8; - --pozadina: #f0f2f8; - --kartica: #ffffff; - --tekst-glavni: #1a1d2e; - --tekst-sporedni: #6b7280; - --ivica: #e5e7eb; - --topbar: #ffffff; + --pozadina: #0f1117; + --kartica: #1a1d2e; + --tekst-glavni: #e2e8f0; + --tekst-sporedni: #8892a4; + --ivica: #2a2d40; + --topbar: #13151f; } diff --git a/web/static/css/teme/zelena.css b/web/static/css/teme/zelena.css index adab908..62ace57 100644 --- a/web/static/css/teme/zelena.css +++ b/web/static/css/teme/zelena.css @@ -1,8 +1,8 @@ :root { - --sb-pozadina: #0f2818; - --sb-hover: #1a3d25; - --sb-aktivan: #1e5631; - --sb-tekst: #86b09a; + --sb-pozadina: #1a4d2e; + --sb-hover: #245c38; + --sb-aktivan: #2d7a47; + --sb-tekst: #a8d5b5; --sb-tekst-aktivan: #ffffff; --sb-akcent: #22c55e; diff --git a/web/templates/stranice/podesavanja.html b/web/templates/stranice/podesavanja.html new file mode 100644 index 0000000..1430725 --- /dev/null +++ b/web/templates/stranice/podesavanja.html @@ -0,0 +1,112 @@ +{{template "base" .}} + +{{define "naslov"}}Podešavanja — NTech{{end}} + +{{define "sadrzaj"}} +
+ + {{if .Sacuvano}} +
+ Podešavanja su uspešno sačuvana. +
+ {{end}} + +
+ + +
+
+ + Firma +
+ +
+
+ + +
+ +
+ + +
+ +
+ +
+ + + +
+
+
+
+ + +
+
+ + Izgled +
+ +
+ +
+ + + + +
+
+
+ + +
+
+ + Sistem +
+
Verzija programa: 1.0.0
+
+ + +
+ +
+ +
+
+{{end}}