directive.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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: HTMLElement,
  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 (el && !authMethod(values)) {
  22. if (binding.modifiers.disabled) {
  23. el.classList.add('disabled');
  24. el.setAttribute('disabled', 'disabled');
  25. el.dataset.disabled = binding.arg;
  26. } else el?.remove();
  27. }
  28. }
  29. const mounted = (el: Element, binding: DirectiveBinding<string | string[]>) => {
  30. isAccessible(el, binding);
  31. };
  32. const authDirective: Directive = {
  33. mounted,
  34. };
  35. export function registerAccessDirective(app: App) {
  36. app.directive('access', authDirective);
  37. }