Magacin premeštanje, backup podešavanja, čišćenje RBAC sistema
Magacin:
- Dodato premeštanje artikla u drugu kategoriju (dugme + nativni
<details> meni, bez JS-a; radi na desktopu i mobilnom)
- Endpoint POST /magacin/premesti/{id} uz proveru dozvole artikal.premesti
Backup:
- Nova podešavanja: interval automatskog backupa i broj kopija (rotacija)
- Periodični backup uz onaj pri pokretanju; interval se čita iz baze
- Migracija 037_backup_podesavanja.sql
Dozvole (RBAC):
- Dodate kartice koje su nedostajale (dashboard.prihod, prodaja.storno,
podesavanja.login_pozadina, tema.lokalno) — popravljen i bug gde su se
gasile pri svakom čuvanju matrice
- Aktivirana kontrola pregleda za prodaju, servis, klijente i dobavljače
(provera u handlerima + skrivanje iz sidebara)
- Uklonjene mrtve/obmanjujuće dozvole iz matrice i sveAkcije (korisnici,
podsetnici, artikal.pregled, kategorija.izmeni, tema.globalno,
podesavanja.app_pozadina); sveAkcije 47 -> 34
- Čišćenje zastarelih redova (siročića) u tabeli dozvola pri startu
Ostalo:
- Statički fajlovi: embed celog web/static i ispravan MIME za .js/.css
- Keš šablona: dodat admin_dozvole (stranica Dozvole se nije otvarala)
- Sidebar accordion: radi i skupljen i proširen, međusobno isključiv
This commit is contained in:
@@ -40,14 +40,17 @@
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<!-- Magacin -->
|
||||
<tr class="matrica-modul"><td {{if eq .KorisnikUloga "superadmin"}}colspan="3"{{else}}colspan="2"{{end}}>Magacin</td></tr>
|
||||
<!-- Dashboard -->
|
||||
<tr class="matrica-modul"><td {{if eq .KorisnikUloga "superadmin"}}colspan="3"{{else}}colspan="2"{{end}}>Dashboard</td></tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Pregled artikala</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__artikal.pregled" {{if index .DozvoleRadnik "artikal.pregled"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__artikal.pregled" {{if index .DozvoleAdmin "artikal.pregled"}}checked{{end}}></td>{{end}}
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Prikaz prihoda</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__dashboard.prihod" {{if index .DozvoleRadnik "dashboard.prihod"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__dashboard.prihod" {{if index .DozvoleAdmin "dashboard.prihod"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
|
||||
<!-- Magacin -->
|
||||
<tr class="matrica-modul"><td {{if eq .KorisnikUloga "superadmin"}}colspan="3"{{else}}colspan="2"{{end}}>Magacin</td></tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Dodavanje artikala</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__artikal.dodaj" {{if index .DozvoleRadnik "artikal.dodaj"}}checked{{end}}></td>
|
||||
@@ -86,12 +89,6 @@
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__kategorija.dodaj" {{if index .DozvoleRadnik "kategorija.dodaj"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__kategorija.dodaj" {{if index .DozvoleAdmin "kategorija.dodaj"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Izmena kategorija</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__kategorija.izmeni" {{if index .DozvoleRadnik "kategorija.izmeni"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__kategorija.izmeni" {{if index .DozvoleAdmin "kategorija.izmeni"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Brisanje kategorija</td>
|
||||
@@ -194,6 +191,12 @@
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__prodaja.obrisi" {{if index .DozvoleRadnik "prodaja.obrisi"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__prodaja.obrisi" {{if index .DozvoleAdmin "prodaja.obrisi"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Storniranje prodaje</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__prodaja.storno" {{if index .DozvoleRadnik "prodaja.storno"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__prodaja.storno" {{if index .DozvoleAdmin "prodaja.storno"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
|
||||
<!-- Klijenti -->
|
||||
@@ -223,33 +226,6 @@
|
||||
|
||||
</tr>
|
||||
|
||||
<!-- Podsetnici -->
|
||||
<tr class="matrica-modul"><td {{if eq .KorisnikUloga "superadmin"}}colspan="3"{{else}}colspan="2"{{end}}>Podsetnici</td></tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Pregled podsetnika</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__podsetnik.pregled" {{if index .DozvoleRadnik "podsetnik.pregled"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__podsetnik.pregled" {{if index .DozvoleAdmin "podsetnik.pregled"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Dodavanje podsetnika</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__podsetnik.dodaj" {{if index .DozvoleRadnik "podsetnik.dodaj"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__podsetnik.dodaj" {{if index .DozvoleAdmin "podsetnik.dodaj"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Izmena podsetnika</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__podsetnik.izmeni" {{if index .DozvoleRadnik "podsetnik.izmeni"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__podsetnik.izmeni" {{if index .DozvoleAdmin "podsetnik.izmeni"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Brisanje podsetnika</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__podsetnik.obrisi" {{if index .DozvoleRadnik "podsetnik.obrisi"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__podsetnik.obrisi" {{if index .DozvoleAdmin "podsetnik.obrisi"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
|
||||
<!-- Izveštaji -->
|
||||
<tr class="matrica-modul"><td {{if eq .KorisnikUloga "superadmin"}}colspan="3"{{else}}colspan="2"{{end}}>Izveštaji</td></tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
@@ -273,37 +249,19 @@
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__podesavanja.izmeni" {{if index .DozvoleAdmin "podesavanja.izmeni"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
|
||||
<!-- Korisnici -->
|
||||
<tr class="matrica-modul"><td {{if eq .KorisnikUloga "superadmin"}}colspan="3"{{else}}colspan="2"{{end}}>Korisnici</td></tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Pregled korisnika</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__korisnik.pregled" {{if index .DozvoleRadnik "korisnik.pregled"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__korisnik.pregled" {{if index .DozvoleAdmin "korisnik.pregled"}}checked{{end}}></td>{{end}}
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Izmena pozadine prijavne stranice</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__podesavanja.login_pozadina" {{if index .DozvoleRadnik "podesavanja.login_pozadina"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__podesavanja.login_pozadina" {{if index .DozvoleAdmin "podesavanja.login_pozadina"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Dodavanje korisnika</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__korisnik.dodaj" {{if index .DozvoleRadnik "korisnik.dodaj"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__korisnik.dodaj" {{if index .DozvoleAdmin "korisnik.dodaj"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
<!-- Tema -->
|
||||
<tr class="matrica-modul"><td {{if eq .KorisnikUloga "superadmin"}}colspan="3"{{else}}colspan="2"{{end}}>Tema</td></tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Izmena korisnika</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__korisnik.izmeni" {{if index .DozvoleRadnik "korisnik.izmeni"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__korisnik.izmeni" {{if index .DozvoleAdmin "korisnik.izmeni"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Brisanje korisnika</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__korisnik.obrisi" {{if index .DozvoleRadnik "korisnik.obrisi"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__korisnik.obrisi" {{if index .DozvoleAdmin "korisnik.obrisi"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
<tr style="border-bottom:0.5px solid var(--ivica);">
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Promena uloge korisnika</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__korisnik.uloga" {{if index .DozvoleRadnik "korisnik.uloga"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__korisnik.uloga" {{if index .DozvoleAdmin "korisnik.uloga"}}checked{{end}}></td>{{end}}
|
||||
<td style="padding:9px 16px;font-size:13px;color:var(--tekst-glavni);">Lična tema naloga</td>
|
||||
<td class="matrica-checkbox"><input type="checkbox" name="radnik__tema.lokalno" {{if index .DozvoleRadnik "tema.lokalno"}}checked{{end}}></td>
|
||||
{{if eq .KorisnikUloga "superadmin"}}<td class="matrica-checkbox"><input type="checkbox" name="admin__tema.lokalno" {{if index .DozvoleAdmin "tema.lokalno"}}checked{{end}}></td>{{end}}
|
||||
|
||||
</tr>
|
||||
|
||||
|
||||
@@ -19,6 +19,34 @@
|
||||
.magacin-kartica:nth-child(3) { animation-delay: 0.16s; }
|
||||
.magacin-kartica:nth-child(4) { animation-delay: 0.22s; }
|
||||
.magacin-kartica:nth-child(5) { animation-delay: 0.28s; }
|
||||
|
||||
/* padajući meni za premeštanje artikla u drugu kategoriju */
|
||||
.premesti-meni summary { list-style: none; }
|
||||
.premesti-meni summary::-webkit-details-marker { display: none; }
|
||||
.premesti-meni .premesti-panel {
|
||||
margin-top: 6px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
background: var(--pozadina);
|
||||
border: 0.5px solid var(--ivica);
|
||||
border-radius: 8px;
|
||||
padding: 4px;
|
||||
min-width: 150px;
|
||||
}
|
||||
.premesti-opcija {
|
||||
text-align: left;
|
||||
padding: 7px 10px;
|
||||
background: none;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
color: var(--tekst-glavni);
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.premesti-opcija:hover { background: var(--pozadina-hover); }
|
||||
.premesti-opcija-prazno { color: var(--tekst-sporedni); border-top: 0.5px solid var(--ivica); }
|
||||
</style>
|
||||
{{end}}
|
||||
|
||||
@@ -31,6 +59,9 @@
|
||||
{{if .Obrisan}}
|
||||
<div class="poruka-uspeh">Artikal je uspešno obrisan.</div>
|
||||
{{end}}
|
||||
{{if .Premesten}}
|
||||
<div class="poruka-uspeh">Artikal je premešten u drugu kategoriju.</div>
|
||||
{{end}}
|
||||
|
||||
<!-- dugmad -->
|
||||
<div style="display:flex;gap:10px;flex-wrap:wrap;">
|
||||
@@ -101,6 +132,17 @@
|
||||
Izmeni
|
||||
</a>
|
||||
{{end}}
|
||||
{{if index $.Dozvole "artikal.premesti"}}{{if $.Kategorije}}
|
||||
<details class="premesti-meni" style="align-self:center;">
|
||||
<summary class="btn-primarno-malo" style="cursor:pointer;">Premesti</summary>
|
||||
<form method="POST" action="/magacin/premesti/{{.ID}}" class="premesti-panel">
|
||||
{{range $.Kategorije}}
|
||||
<button type="submit" name="kategorija_id" value="{{.ID}}" class="premesti-opcija">{{.Naziv}}</button>
|
||||
{{end}}
|
||||
<button type="submit" name="kategorija_id" value="" class="premesti-opcija premesti-opcija-prazno">Bez kategorije</button>
|
||||
</form>
|
||||
</details>
|
||||
{{end}}{{end}}
|
||||
{{if index $.Dozvole "artikal.obrisi"}}
|
||||
<a href="/magacin/obrisi/{{.ID}}" class="btn-obrisi-malo"
|
||||
data-potvrda="Da li ste sigurni da želite da obrišete ovaj artikal?">
|
||||
@@ -133,10 +175,21 @@
|
||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-top:2px;">{{.KategorijaNaziv}}</div>
|
||||
{{end}}
|
||||
</div>
|
||||
<div style="display:flex;gap:8px;flex-shrink:0;">
|
||||
<div style="display:flex;gap:8px;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;">
|
||||
{{if index $.Dozvole "artikal.izmeni"}}
|
||||
<a href="/magacin/izmeni/{{.ID}}" class="btn-primarno-malo">Izmeni</a>
|
||||
{{end}}
|
||||
{{if index $.Dozvole "artikal.premesti"}}{{if $.Kategorije}}
|
||||
<details class="premesti-meni">
|
||||
<summary class="btn-primarno-malo" style="cursor:pointer;">Premesti</summary>
|
||||
<form method="POST" action="/magacin/premesti/{{.ID}}" class="premesti-panel">
|
||||
{{range $.Kategorije}}
|
||||
<button type="submit" name="kategorija_id" value="{{.ID}}" class="premesti-opcija">{{.Naziv}}</button>
|
||||
{{end}}
|
||||
<button type="submit" name="kategorija_id" value="" class="premesti-opcija premesti-opcija-prazno">Bez kategorije</button>
|
||||
</form>
|
||||
</details>
|
||||
{{end}}{{end}}
|
||||
{{if index $.Dozvole "artikal.obrisi"}}
|
||||
<a href="/magacin/obrisi/{{.ID}}" class="btn-obrisi-malo"
|
||||
data-potvrda="Da li ste sigurni da želite da obrišete ovaj artikal?">
|
||||
|
||||
@@ -35,6 +35,33 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- automatski backup — interval i broj kopija -->
|
||||
<div style="margin-top:16px;border-top:0.5px solid var(--ivica);padding-top:16px;">
|
||||
<div style="font-size:13px;font-weight:500;color:var(--tekst-glavni);margin-bottom:10px;">Automatski backup</div>
|
||||
<form method="POST" action="/podesavanja/sacuvaj">
|
||||
<input type="hidden" name="_next" value="/admin/podesavanja/sistem">
|
||||
<div style="display:flex;gap:16px;flex-wrap:wrap;align-items:flex-end;">
|
||||
<div>
|
||||
<label for="backup_interval_sati" style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:6px;">Razmak između backupa (sati)</label>
|
||||
<input type="number" id="backup_interval_sati" name="backup_interval_sati" min="1" max="720" value="{{.BackupIntervalSati}}"
|
||||
style="width:140px;padding:8px 12px;background:var(--pozadina);border:0.5px solid var(--ivica);border-radius:8px;color:var(--tekst-glavni);font-size:14px;">
|
||||
</div>
|
||||
<div>
|
||||
<label for="backup_broj_kopija" style="font-size:13px;color:var(--tekst-sporedni);display:block;margin-bottom:6px;">Broj kopija koje se čuvaju</label>
|
||||
<input type="number" id="backup_broj_kopija" name="backup_broj_kopija" min="1" max="100" value="{{.BackupBrojKopija}}"
|
||||
style="width:140px;padding:8px 12px;background:var(--pozadina);border:0.5px solid var(--ivica);border-radius:8px;color:var(--tekst-glavni);font-size:14px;">
|
||||
</div>
|
||||
<button type="submit"
|
||||
style="padding:9px 18px;background:var(--sb-akcent);border:none;border-radius:8px;color:#fff;font-size:13px;font-weight:500;cursor:pointer;">
|
||||
Sačuvaj
|
||||
</button>
|
||||
</div>
|
||||
<div style="font-size:12px;color:var(--tekst-sporedni);margin-top:8px;">
|
||||
Backup se pravi pri pokretanju programa i zatim na svakih {{.BackupIntervalSati}} h. Najstarije kopije se brišu kad ih ima više od zadatog broja.
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- panel sa listom backupa -->
|
||||
<div id="backup-panel" style="display:none;margin-top:16px;border-top:0.5px solid var(--ivica);padding-top:16px;">
|
||||
<div style="font-size:13px;font-weight:500;color:var(--tekst-glavni);margin-bottom:10px;">Dostupne rezervne kopije</div>
|
||||
|
||||
Reference in New Issue
Block a user