diff --git a/src/auth/permissions.ts b/src/auth/permissions.ts index 289c9d8..810d557 100644 --- a/src/auth/permissions.ts +++ b/src/auth/permissions.ts @@ -10,8 +10,14 @@ export const PERMISSIONS = [ 'support:write', 'hamkar:read', 'hamkar:write', + 'hamkar.ui:read', + 'hamkar.ui:write', 'khanegi:read', 'khanegi:write', + 'khanegi.settings:read', + 'khanegi.settings:write', + 'khanegi.ui:read', + 'khanegi.ui:write', 'others:read', 'others:write', 'admins:read', @@ -27,6 +33,8 @@ export type PermissionModule = { label: string read?: PermissionCode write?: PermissionCode + /** Sub-section row of a product (shown indented under its parent). */ + sub?: boolean } export const PERMISSION_MODULES: PermissionModule[] = [ @@ -34,14 +42,30 @@ export const PERMISSION_MODULES: PermissionModule[] = [ { key: 'servers', label: 'سرور', read: 'servers:read', write: 'servers:write' }, { key: 'plugins', label: 'افزونه', read: 'plugins:read', write: 'plugins:write' }, { key: 'support', label: 'پشتیبانی', read: 'support:read', write: 'support:write' }, - { key: 'hamkar', label: 'همکار', read: 'hamkar:read', write: 'hamkar:write' }, - { key: 'khanegi', label: 'خانگی', read: 'khanegi:read', write: 'khanegi:write' }, + { key: 'hamkar', label: 'همکار — مدیریت', read: 'hamkar:read', write: 'hamkar:write' }, + { key: 'hamkar.ui', label: 'همکار — ظاهر', read: 'hamkar.ui:read', write: 'hamkar.ui:write', sub: true }, + { key: 'khanegi', label: 'خانگی — مدیریت', read: 'khanegi:read', write: 'khanegi:write' }, + { + key: 'khanegi.settings', + label: 'خانگی — تنظیمات', + read: 'khanegi.settings:read', + write: 'khanegi.settings:write', + sub: true, + }, + { key: 'khanegi.ui', label: 'خانگی — ظاهر', read: 'khanegi.ui:read', write: 'khanegi.ui:write', sub: true }, { key: 'others', label: 'سایت‌های دیگر', read: 'others:read', write: 'others:write' }, { key: 'admins', label: 'مدیران', read: 'admins:read', write: 'admins:write' }, { key: 'audit', label: 'لاگ', read: 'audit:read' }, { key: 'settings', label: 'تنظیمات حساس', write: 'settings:write' }, ] +/** Any read access to a product section (list / manage / ui / settings). */ +export function productAnyReadPermissions(product: string): PermissionCode[] { + if (product === 'hamkar') return ['hamkar:read', 'hamkar.ui:read'] + if (product === 'other') return ['others:read'] + return ['khanegi:read', 'khanegi.ui:read', 'khanegi.settings:read'] +} + export function normalizePermissionList(codes: string[]): PermissionCode[] { const set = new Set() for (const raw of codes) { diff --git a/src/components/AdminPermissionEditor.vue b/src/components/AdminPermissionEditor.vue new file mode 100644 index 0000000..875a2ac --- /dev/null +++ b/src/components/AdminPermissionEditor.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/src/components/VersionPageTabs.vue b/src/components/VersionPageTabs.vue index 613682e..cd69efc 100644 --- a/src/components/VersionPageTabs.vue +++ b/src/components/VersionPageTabs.vue @@ -1,5 +1,6 @@