From baa7aa45b2bff14f3f8ba541fff1e5dee1118abe Mon Sep 17 00:00:00 2001 From: Pau Navarro Date: Mon, 23 Jan 2023 14:42:38 +0100 Subject: [PATCH] refs #4074 @2h new directive for the acls --- front/core/directives/acl.js | 6 ---- front/core/directives/index.js | 1 + front/core/directives/user-acl.js | 54 +++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 front/core/directives/user-acl.js diff --git a/front/core/directives/acl.js b/front/core/directives/acl.js index cc3c07f051..9b73285249 100644 --- a/front/core/directives/acl.js +++ b/front/core/directives/acl.js @@ -13,12 +13,6 @@ function vnAcl(aclService) { let action = $attrs.vnAclAction || 'disable'; - if ($attrs.vnAclModel) { - console.log($attrs.vnAclModel, $attrs.vnAclProperty, $attrs.vnAclAccessType); - let hasAcl = aclService.hasAnyACL($attrs.vnAclModel, $attrs.vnAclProperty, $attrs.vnAclAccessType); - if (hasAcl) return; - } - if (aclService.hasAny(acls)) return; if (action === 'disable') { diff --git a/front/core/directives/index.js b/front/core/directives/index.js index e77917285d..701baf1333 100644 --- a/front/core/directives/index.js +++ b/front/core/directives/index.js @@ -5,6 +5,7 @@ import './popover'; import './click-stop'; import './rule'; import './acl'; +import './user-acl'; import './on-error-src'; import './zoom-image'; import './visible-by'; diff --git a/front/core/directives/user-acl.js b/front/core/directives/user-acl.js new file mode 100644 index 0000000000..f66e506691 --- /dev/null +++ b/front/core/directives/user-acl.js @@ -0,0 +1,54 @@ +import ngModule from '../module'; +import FormInput from '../components/form-input'; + +function vnUserAcl(aclService) { + let acls = []; + + return { + restrict: 'A', + priority: -1, + link: function(_, $element, $attrs) { + acls = $attrs.vnUserAcl.split(',').map(i => i.trim()); + if (acls[0] == '') return; + + let action = $attrs.vnAclAction || 'disable'; + + // The acls always come formatted as "Model.property/accessType" + // Example: "Client.create/w" + + let model = acls[0].split('.')[0]; + let property = acls[0].split('.')[1].split('/')[0]; + let accessType = acls[0].split('.')[1].split('/')[1]; + + // There can be 3 cases for the acessType: Write(w), Read(r) or All(*) + + if (accessType === 'w') accessType = 'WRITE'; + else if (accessType === 'r') accessType = 'READ'; + + const hasAny = aclService.hasAnyACL(model, property, accessType); + + if (hasAny) return; + + if (action === 'disable') { + let element = $element[0]; + let elementToDisable = element.$ctrl; + + if (!(elementToDisable instanceof FormInput)) { + let selector = 'input, textarea, button, submit'; + + if (!element.matches(selector)) + element = element.querySelector(selector); + + elementToDisable = element; + } + + if (elementToDisable) + elementToDisable.disabled = true; + } else + $element.remove(); + } + }; +} +vnUserAcl.$inject = ['aclService']; + +ngModule.directive('vnUserAcl', vnUserAcl);