admin_users_personels

This commit is contained in:
Roo
2026-06-29 14:11:15 +00:00
parent 383e5511b6
commit df4a0f07ff
237 changed files with 17849 additions and 2934 deletions

View File

@@ -0,0 +1,212 @@
import { defineComponent, ref, computed, unref, useSSRContext } from "vue";
import { ssrRenderAttrs, ssrInterpolate, ssrRenderClass, ssrRenderList, ssrIncludeBooleanAttr, ssrRenderAttr } from "vue/server-renderer";
import "/app/node_modules/hookable/dist/index.mjs";
import "/app/node_modules/klona/dist/index.mjs";
import { a as useI18n } from "../server.mjs";
import "/app/node_modules/ofetch/dist/node.mjs";
import "#internal/nuxt/paths";
import "/app/node_modules/unctx/dist/index.mjs";
import "/app/node_modules/h3/dist/index.mjs";
import "pinia";
import "/app/node_modules/defu/dist/defu.mjs";
import "vue-router";
import "/app/node_modules/ufo/dist/index.mjs";
import "/app/node_modules/cookie-es/dist/index.mjs";
import "/app/node_modules/destr/dist/index.mjs";
import "/app/node_modules/ohash/dist/index.mjs";
import "/app/node_modules/@unhead/vue/dist/index.mjs";
import "@vue/devtools-api";
const _sfc_main = /* @__PURE__ */ defineComponent({
__name: "index",
__ssrInlineRender: true,
setup(__props) {
const { t: $t } = useI18n();
const loading = ref(true);
const error = ref(null);
const roles = ref([]);
const permissions = ref([]);
const activeDomain = ref("__all__");
const filteredRoleIds = ref(/* @__PURE__ */ new Set());
const modifiedRoles = ref(/* @__PURE__ */ new Map());
ref(/* @__PURE__ */ new Map());
const saveNotification = ref(null);
const domainOptions = computed(() => {
const domains = new Set(permissions.value.map((p) => p.domain));
const options = [
{ value: "__all__", label: $t("permissions.all_domains") }
];
for (const domain of Array.from(domains).sort()) {
options.push({ value: domain, label: domain.charAt(0).toUpperCase() + domain.slice(1) });
}
return options;
});
const filteredDomains = computed(() => {
const domains = new Set(permissions.value.map((p) => p.domain));
const sorted = Array.from(domains).sort();
if (activeDomain.value === "__all__") return sorted;
return sorted.filter((d) => d === activeDomain.value);
});
const filteredPermissions = computed(() => {
if (activeDomain.value === "__all__") return permissions.value;
return permissions.value.filter((p) => p.domain === activeDomain.value);
});
const filteredRoles = computed(() => {
if (filteredRoleIds.value.size === 0) return roles.value;
return roles.value.filter((r) => filteredRoleIds.value.has(r.id));
});
const hasModifications = computed(() => {
return modifiedRoles.value.size > 0;
});
function roleHeaderClass(role) {
if (role.rank >= 100) return "bg-purple-500/20 text-purple-300";
if (role.rank >= 80) return "bg-indigo-500/20 text-indigo-300";
if (role.rank >= 50) return "bg-cyan-500/20 text-cyan-300";
return "bg-slate-500/20 text-slate-300";
}
function domainColorClass(domain) {
const colorMap = {
fleet: "text-emerald-400",
user: "text-sky-400",
finance: "text-amber-400",
permissions: "text-purple-400",
system: "text-rose-400",
service: "text-teal-400",
organization: "text-orange-400",
vehicle: "text-cyan-400",
subscription: "text-pink-400",
moderation: "text-violet-400"
};
return colorMap[domain] || "text-slate-400";
}
function getCellClass(role, perm) {
if (isRoleLocked(role)) {
return isPermEnabled(role.id, perm.id) ? "bg-purple-900/10" : "bg-purple-900/5";
}
if (isPermEnabled(role.id, perm.id)) return "bg-emerald-900/10";
return "";
}
function formatPermissionLabel(perm) {
return perm.code.replace(/:/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
}
function getToggleClass(role, perm) {
const enabled = isPermEnabled(role.id, perm.id);
const locked = isRoleLocked(role);
const baseClasses = "peer-focus:outline-none peer-focus:ring-2";
if (locked) {
if (enabled) {
return `${baseClasses} bg-emerald-600 peer-focus:ring-emerald-500/50 after:translate-x-full after:border-white`;
}
return `${baseClasses} bg-slate-600`;
}
if (enabled) {
return `${baseClasses} bg-emerald-600 peer-focus:ring-emerald-500/50 peer-checked:after:translate-x-full peer-checked:after:border-white`;
}
return `${baseClasses} bg-slate-600 peer-focus:ring-indigo-500/50 peer-checked:after:translate-x-full peer-checked:after:border-white peer-checked:bg-indigo-600`;
}
function getDomainPermissions(domain) {
return filteredPermissions.value.filter((p) => p.domain === domain);
}
function isPermEnabled(roleId, permissionId) {
if (modifiedRoles.value.has(roleId)) {
const rolePerms = modifiedRoles.value.get(roleId);
return rolePerms.has(permissionId);
}
const role = roles.value.find((r) => r.id === roleId);
return role ? role.permission_ids.includes(permissionId) : false;
}
function isRoleLocked(role) {
return role.is_system && role.rank >= 100;
}
return (_ctx, _push, _parent, _attrs) => {
_push(`<div${ssrRenderAttrs(_attrs)}><div class="mb-8"><h1 class="text-2xl font-bold text-white">${ssrInterpolate(unref($t)("permissions.title"))}</h1><p class="text-slate-400 mt-1">${ssrInterpolate(unref($t)("permissions.subtitle"))}</p></div>`);
if (loading.value) {
_push(`<div class="flex items-center justify-center py-20"><svg class="animate-spin h-8 w-8 text-indigo-400" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg><span class="ml-3 text-slate-400">${ssrInterpolate(unref($t)("permissions.loading"))}</span></div>`);
} else if (error.value) {
_push(`<div class="bg-red-500/10 border border-red-500/20 rounded-xl p-6 mb-8"><div class="flex items-center gap-3"><svg class="w-6 h-6 text-red-400 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><h3 class="text-red-300 font-medium">${ssrInterpolate(unref($t)("permissions.error_title"))}</h3><p class="text-red-400/80 text-sm mt-1">${ssrInterpolate(error.value)}</p></div></div><button class="mt-4 px-4 py-2 text-sm bg-red-600 hover:bg-red-500 text-white rounded-lg transition">${ssrInterpolate(unref($t)("permissions.retry"))}</button></div>`);
} else {
_push(`<!--[-->`);
if (saveNotification.value) {
_push(`<div class="${ssrRenderClass([saveNotification.value.type === "success" ? "bg-emerald-500/10 border border-emerald-500/20 text-emerald-300" : "bg-red-500/10 border border-red-500/20 text-red-300", "mb-6 px-4 py-3 rounded-lg text-sm font-medium"])}">${ssrInterpolate(saveNotification.value.message)}</div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="bg-slate-800/60 border border-slate-700 rounded-xl p-4 mb-6"><div class="flex flex-col sm:flex-row sm:items-center gap-4"><div class="flex-1"><label class="block text-xs font-semibold uppercase tracking-wider text-slate-400 mb-2">${ssrInterpolate(unref($t)("permissions.domain_filter"))}</label><div class="flex flex-wrap gap-1.5"><!--[-->`);
ssrRenderList(domainOptions.value, (domain) => {
_push(`<button class="${ssrRenderClass([activeDomain.value === domain.value ? "bg-indigo-600 text-white shadow-sm" : "bg-slate-700/60 text-slate-400 hover:bg-slate-700 hover:text-white", "px-3 py-1.5 text-xs font-medium rounded-lg transition"])}">${ssrInterpolate(domain.label)}</button>`);
});
_push(`<!--]--></div></div><div class="flex-1"><label class="block text-xs font-semibold uppercase tracking-wider text-slate-400 mb-2">${ssrInterpolate(unref($t)("permissions.role_filter"))}</label><div class="flex flex-wrap gap-1.5"><!--[-->`);
ssrRenderList(roles.value, (role) => {
_push(`<button class="${ssrRenderClass([filteredRoleIds.value.has(role.id) ? role.rank >= 100 ? "bg-purple-600/30 text-purple-300 border border-purple-500/30" : "bg-indigo-600/30 text-indigo-300 border border-indigo-500/30" : "bg-slate-700/60 text-slate-500 hover:bg-slate-700 hover:text-slate-300 border border-transparent", "px-3 py-1.5 text-xs font-medium rounded-lg transition flex items-center gap-1.5"])}">`);
if (filteredRoleIds.value.has(role.id)) {
_push(`<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg>`);
} else {
_push(`<!---->`);
}
_push(`<span>${ssrInterpolate(role.name)}</span></button>`);
});
_push(`<!--]--></div><div class="mt-2 flex gap-2"><button class="text-xs text-indigo-400 hover:text-indigo-300 transition">${ssrInterpolate(unref($t)("permissions.select_all"))}</button><button class="text-xs text-slate-500 hover:text-slate-400 transition">${ssrInterpolate(unref($t)("permissions.deselect_all"))}</button></div></div></div></div>`);
if (hasModifications.value) {
_push(`<div class="sticky top-0 z-20 -mx-4 px-4 py-3 bg-slate-800/95 backdrop-blur-sm border-b border-slate-700 mb-4 flex items-center gap-3 rounded-t-xl"><button class="px-6 py-2.5 bg-emerald-600 hover:bg-emerald-500 text-white font-semibold rounded-lg shadow-lg shadow-emerald-600/20 transition-all hover:scale-[1.02] active:scale-[0.98] flex items-center gap-2"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"></path></svg> ${ssrInterpolate(unref($t)("permissions.save_changes"))}</button><button class="px-4 py-2.5 bg-slate-700 hover:bg-slate-600 text-slate-300 font-medium rounded-lg transition">${ssrInterpolate(unref($t)("permissions.discard"))}</button><span class="text-sm text-slate-400 ml-auto">${ssrInterpolate(unref($t)("permissions.modified_count", { count: modifiedRoles.value.size }))}</span></div>`);
} else {
_push(`<!---->`);
}
_push(`<div class="overflow-x-auto rounded-xl border border-slate-700 bg-slate-800/40"><table class="w-full text-sm"><thead><tr class="border-b border-slate-700"><th class="sticky left-0 z-10 bg-slate-800/95 min-w-[200px] p-3 text-left"><div class="flex items-center gap-2"><svg class="w-4 h-4 text-slate-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg><span class="text-xs font-semibold uppercase tracking-wider text-slate-400">${ssrInterpolate(unref($t)("permissions.permission"))}</span></div></th><!--[-->`);
ssrRenderList(filteredRoles.value, (role) => {
_push(`<th class="${ssrRenderClass([role.rank >= 100 ? "bg-purple-900/10" : "", "min-w-[120px] p-3 text-center border-l border-slate-700"])}"><div class="flex flex-col items-center gap-1"><span class="${ssrRenderClass([roleHeaderClass(role), "text-xs font-semibold px-2 py-0.5 rounded-full"])}">${ssrInterpolate(role.name)}</span><span class="text-[10px] text-slate-500">Rank ${ssrInterpolate(role.rank)}</span>`);
if (role.is_system) {
_push(`<span class="text-[10px] text-indigo-400">system</span>`);
} else {
_push(`<!---->`);
}
_push(`</div></th>`);
});
_push(`<!--]--></tr></thead><tbody><!--[-->`);
ssrRenderList(filteredDomains.value, (domain) => {
_push(`<!--[--><tr class="border-b border-slate-700/50"><td colspan="1" class="${ssrRenderClass([domainColorClass(domain), "sticky left-0 z-10 bg-slate-800/95 px-3 py-2 text-xs font-bold uppercase tracking-wider"])}"><div class="flex items-center gap-2"><span>${ssrInterpolate(domain)}</span><span class="text-[10px] text-slate-500 font-normal normal-case"> (${ssrInterpolate(getDomainPermissions(domain).length)}) </span></div></td><!--[-->`);
ssrRenderList(filteredRoles.value, (role) => {
_push(`<td class="border-l border-slate-700/50 bg-slate-800/60 px-3 py-2"></td>`);
});
_push(`<!--]--></tr><!--[-->`);
ssrRenderList(getDomainPermissions(domain), (perm) => {
_push(`<tr class="border-b border-slate-700/30 hover:bg-slate-700/20 transition"><td class="sticky left-0 z-10 bg-slate-800/95 p-3 border-r border-slate-700/50"><div class="flex flex-col min-w-0 max-w-[200px]"><span class="text-sm text-slate-200 truncate font-medium">${ssrInterpolate(formatPermissionLabel(perm))}</span><span class="text-xs text-slate-500 truncate font-mono">${ssrInterpolate(perm.code)}</span>`);
if (perm.description) {
_push(`<span class="text-[11px] text-slate-500 truncate mt-0.5">${ssrInterpolate(perm.description)}</span>`);
} else {
_push(`<!---->`);
}
_push(`</div></td><!--[-->`);
ssrRenderList(filteredRoles.value, (role) => {
_push(`<td class="${ssrRenderClass([getCellClass(role, perm), "p-3 text-center border-l border-slate-700/30"])}"><label class="${ssrRenderClass([isRoleLocked(role) ? "cursor-not-allowed" : "cursor-pointer", "relative inline-flex items-center justify-center"])}"><input type="checkbox"${ssrIncludeBooleanAttr(isPermEnabled(role.id, perm.id)) ? " checked" : ""} class="sr-only peer"${ssrIncludeBooleanAttr(isRoleLocked(role)) ? " disabled" : ""}><div class="${ssrRenderClass([getToggleClass(role, perm), "w-9 h-5 rounded-full transition-all duration-200 after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-slate-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all after:duration-200"])}"></div></label></td>`);
});
_push(`<!--]--></tr>`);
});
_push(`<!--]--><!--]-->`);
});
_push(`<!--]-->`);
if (filteredPermissions.value.length === 0) {
_push(`<tr><td${ssrRenderAttr("colspan", filteredRoles.value.length + 1)} class="p-8 text-center text-slate-500 text-sm">${ssrInterpolate(unref($t)("permissions.no_permissions"))}</td></tr>`);
} else {
_push(`<!---->`);
}
_push(`</tbody></table></div>`);
if (hasModifications.value) {
_push(`<div class="mt-6 flex items-center gap-3 pb-8"><button class="px-6 py-2.5 bg-emerald-600 hover:bg-emerald-500 text-white font-semibold rounded-lg shadow-lg shadow-emerald-600/20 transition-all hover:scale-[1.02] active:scale-[0.98] flex items-center gap-2"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"></path></svg> ${ssrInterpolate(unref($t)("permissions.save_changes"))}</button><button class="px-4 py-2.5 bg-slate-700 hover:bg-slate-600 text-slate-300 font-medium rounded-lg transition">${ssrInterpolate(unref($t)("permissions.discard"))}</button><span class="text-sm text-slate-400">${ssrInterpolate(unref($t)("permissions.modified_count", { count: modifiedRoles.value.size }))}</span></div>`);
} else {
_push(`<!---->`);
}
_push(`<!--]-->`);
}
_push(`</div>`);
};
}
});
const _sfc_setup = _sfc_main.setup;
_sfc_main.setup = (props, ctx) => {
const ssrContext = useSSRContext();
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/permissions/index.vue");
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
};
export {
_sfc_main as default
};
//# sourceMappingURL=index-BD2eKDSC.js.map