directive.ts 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. /**
  2. * Global authority directive
  3. * Used for fine-grained control of component permissions
  4. * @Example v-access:role="[ROLE_NAME]" or v-access:role="ROLE_NAME"
  5. * @Example v-access:code="[ROLE_CODE]" or v-access:code="ROLE_CODE"
  6. */
  7. import type { App, Directive, DirectiveBinding } from 'vue';
  8. import { useAccess } from './use-access';
  9. function isAccessible(
  10. el: Element,
  11. binding: DirectiveBinding<string | string[]>,
  12. ) {
  13. const { accessMode, hasAccessByCodes, hasAccessByRoles } = useAccess();
  14. const value = binding.value;
  15. if (!value) return;
  16. const authMethod =
  17. accessMode.value === 'frontend' && binding.arg === 'role'
  18. ? hasAccessByRoles
  19. : hasAccessByCodes;
  20. const values = Array.isArray(value) ? value : [value];
  21. if (!authMethod(values)) {
  22. el?.remove();
  23. }
  24. }
  25. const mounted = (el: Element, binding: DirectiveBinding<string | string[]>) => {
  26. isAccessible(el, binding);
  27. };
  28. const authDirective: Directive = {
  29. mounted,
  30. };
  31. export function registerAccessDirective(app: App) {
  32. app.directive('access', authDirective);
  33. }