directive.ts 874 B

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