Add more permissions

This commit is contained in:
Simon Pocrnjič
2025-10-31 10:16:38 +01:00
parent 7d4d18143d
commit ed4f67effb
18 changed files with 404 additions and 193 deletions
+26 -12
View File
@@ -162,6 +162,7 @@ const rawMenuGroups = [
},
{
label: "Uvoz",
requires: { permission: "manage-imports" },
items: [
{
key: "imports",
@@ -196,6 +197,9 @@ const rawMenuGroups = [
},
{
label: "Konfiguracija",
// Group-level authorization: show "Konfiguracija" only to admins or users with manage-settings
// You can set requires on any group to hide the whole section unless allowed
requires: { permission: "manage-settings" },
items: [
{
key: "settings",
@@ -211,7 +215,7 @@ const rawMenuGroups = [
title: "Administrator",
routeName: "admin.index",
active: ["admin.index", "admin.users.index", "admin.permissions.create"],
requires: { role: "admin", permission: "manage-settings" },
requires: { role: "admin" },
},
],
},
@@ -222,23 +226,33 @@ const menuGroups = computed(() => {
const roles = (user.roles || []).map((r) => r.slug);
const permissions = user.permissions || [];
// Helper to determine inclusion based on optional requires meta
function allowed(item) {
if (!item.requires) return true;
const needRole = item.requires.role;
const needPerm = item.requires.permission;
// Generic helper to determine inclusion based on optional `requires` meta
function allowedMeta(entity) {
const req = entity?.requires;
if (!req) {
return true;
}
const needRole = req.role ?? "admin";
const needPerm = req.permission;
return (
(needRole && roles.includes(needRole)) ||
(needPerm && permissions.includes(needPerm))
);
}
return rawMenuGroups.map((g) => {
const items = g.items
.filter(allowed)
.sort((a, b) => a.title.localeCompare(b.title, "sl", { sensitivity: "base" }));
return { label: g.label, items };
});
return (
rawMenuGroups
// Group-level permission check (hide whole group if not allowed)
.filter((g) => allowedMeta(g))
.map((g) => {
const items = (g.items || [])
.filter((item) => allowedMeta(item))
.sort((a, b) => a.title.localeCompare(b.title, "sl", { sensitivity: "base" }));
return { label: g.label, items };
})
// Drop groups that end up empty after item filtering
.filter((g) => g.items.length > 0)
);
});
// Icon map for menu keys -> FontAwesome icon definitions