diff --git a/src/components/admin/Permission.vue b/src/components/admin/Permission.vue index 9be7f19..7da9b9d 100644 --- a/src/components/admin/Permission.vue +++ b/src/components/admin/Permission.vue @@ -18,22 +18,22 @@
@@ -132,7 +132,7 @@ export default defineComponent({ }; }, computed: { - ...mapState(useAbilityStore, ["_can"]), + ...mapState(useAbilityStore, ["_can", "_canSection"]), canSaveOrReset(): boolean { return isEqual(this.permissions, this.permissionUpdate); }, diff --git a/src/stores/ability.ts b/src/stores/ability.ts index d5190af..f65f6fe 100644 --- a/src/stores/ability.ts +++ b/src/stores/ability.ts @@ -11,21 +11,18 @@ export const useAbilityStore = defineStore("ability", { getters: { can: (state) => - (type: PermissionType | "admin", section: PermissionSection, module?: PermissionModule): boolean => { + (type: PermissionType | "admin", section: PermissionSection, module: PermissionModule): boolean => { const permissions = state.permissions; if (state.isOwner) return true; - if (type == "admin") return permissions?.admin ?? false; - if (permissions?.admin) return true; + if (type == "admin") return permissions?.admin ?? permissions?.adminByOwner ?? false; + if (permissions?.admin || permissions?.adminByOwner) return true; if ( - (!module && - permissions[section] != undefined && - (permissions[section]?.all == "*" || permissions[section]?.all?.includes(type))) || permissions[section]?.all == "*" || - permissions[section]?.all?.includes(type) + permissions[section]?.all?.includes(type) || + permissions[section]?.[module] == "*" || + permissions[section]?.[module]?.includes(type) ) return true; - if (module && (permissions[section]?.[module] == "*" || permissions[section]?.[module]?.includes(type))) - return true; return false; }, canSection: @@ -33,8 +30,8 @@ export const useAbilityStore = defineStore("ability", { (type: PermissionType | "admin", section: PermissionSection): boolean => { const permissions = state.permissions; if (state.isOwner) return true; - if (type == "admin") return permissions?.admin ?? false; - if (permissions?.admin) return true; + if (type == "admin") return permissions?.admin ?? permissions?.adminByOwner ?? false; + if (permissions?.admin || permissions?.adminByOwner) return true; if ( permissions[section]?.all == "*" || permissions[section]?.all?.includes(type) || @@ -54,20 +51,31 @@ export const useAbilityStore = defineStore("ability", { permissions: PermissionObject, type: PermissionType | "admin", section: PermissionSection, - module?: PermissionModule + module: PermissionModule ): boolean => { // ignores ownership - if (type == "admin") return permissions?.admin ?? false; - if (permissions?.admin) return true; + if (type == "admin") return permissions?.admin ?? permissions?.adminByOwner ?? false; + if (permissions?.admin || permissions?.adminByOwner) return true; if ( - (!module && - permissions[section] != undefined && - (permissions[section]?.all == "*" || permissions[section]?.all?.includes(type))) || permissions[section]?.all == "*" || - permissions[section]?.all?.includes(type) + permissions[section]?.all?.includes(type) || + permissions[section]?.[module] == "*" || + permissions[section]?.[module]?.includes(type) ) return true; - if (module && (permissions[section]?.[module] == "*" || permissions[section]?.[module]?.includes(type))) + return false; + }, + _canSection: + () => + (permissions: PermissionObject, type: PermissionType | "admin", section: PermissionSection): boolean => { + // ignores ownership + if (type == "admin") return permissions?.admin ?? permissions?.adminByOwner ?? false; + if (permissions?.admin || permissions?.adminByOwner) return true; + if ( + permissions[section]?.all == "*" || + permissions[section]?.all?.includes(type) || + permissions[section] != undefined + ) return true; return false; }, diff --git a/src/types/permissionTypes.ts b/src/types/permissionTypes.ts index 72f15c7..eff7fd1 100644 --- a/src/types/permissionTypes.ts +++ b/src/types/permissionTypes.ts @@ -31,6 +31,7 @@ export type PermissionString = | `${PermissionSection}.${PermissionModule}.*` // für alle Berechtigungen in einem Modul | `${PermissionSection}.${PermissionType}` // für spezifische Berechtigungen in einem Abschnitt | `${PermissionSection}.*` // für alle Berechtigungen in einem Abschnitt + | `additional.${string}.${string}` // additional | "*"; // für Admin export type PermissionObject = { @@ -39,10 +40,20 @@ export type PermissionObject = { } & { all?: Array | "*" }; } & { admin?: boolean; + adminByOwner?: boolean; +} & { + additional?: { [key: string]: string }; }; export type SectionsAndModulesObject = { [section in PermissionSection]: Array; +} & { + additional?: Array<{ + key: string; + name: string; + type: "number" | "string"; + emptyIfAdmin: boolean; + }>; }; export const permissionSections: Array = ["club", "configuration", "management"]; @@ -87,4 +98,7 @@ export const sectionsAndModules: SectionsAndModulesObject = { "newsletter_config", ], management: ["user", "role", "webapi", "backup", "setting"], + additional: [ + //{ key: "val", name: "name", type: "number", emptyIfAdmin: true }, + ], };