Repository: nifi
Updated Branches:
  refs/heads/master 540ef63ef -> 4a4c87fa1


NIFI-2849:
- Showing process group name when possible.
- Providing a link to jump to the process group defined in the effective policy.
- Preventing editing an inherited policy.
- When overriding a policy, allowing the user to indicate if the policy should 
be empty or should copy the user/groups of the inherited policy.

This closes #1090.

Signed-off-by: Andy LoPresto <alopre...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/4a4c87fa
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/4a4c87fa
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/4a4c87fa

Branch: refs/heads/master
Commit: 4a4c87fa15efa7adbb08b414bc5a5a280a41803d
Parents: 540ef63
Author: Matt Gilman <matt.c.gil...@gmail.com>
Authored: Tue Oct 4 15:30:41 2016 -0400
Committer: Andy LoPresto <alopre...@apache.org>
Committed: Tue Oct 11 00:06:09 2016 -0700

----------------------------------------------------------------------
 .../nifi/web/api/entity/ComponentEntity.java    |   2 +-
 .../src/main/webapp/WEB-INF/pages/canvas.jsp    |   1 +
 .../partials/canvas/override-policy-dialog.jsp  |  26 ++++
 .../src/main/webapp/css/policy-management.css   |   9 ++
 .../components/nf-ng-template-component.js      |   3 +-
 .../webapp/js/nf/canvas/nf-policy-management.js | 146 ++++++++++++++-----
 .../src/main/webapp/js/nf/nf-dialog.js          |   1 -
 7 files changed, 149 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/4a4c87fa/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ComponentEntity.java
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ComponentEntity.java
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ComponentEntity.java
index 5a2f643..0d81873 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ComponentEntity.java
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/entity/ComponentEntity.java
@@ -28,7 +28,7 @@ import java.util.Objects;
 /**
  * A base type for request/response entities.
  */
-@XmlRootElement(name = "entity")
+@XmlRootElement(name = "componentEntity")
 public class ComponentEntity extends Entity {
 
     private RevisionDTO revision;

http://git-wip-us.apache.org/repos/asf/nifi/blob/4a4c87fa/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
index 6bd1b8c..130284b 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
@@ -125,6 +125,7 @@
         <jsp:include 
page="/WEB-INF/partials/canvas/processor-configuration.jsp"/>
         <jsp:include page="/WEB-INF/partials/processor-details.jsp"/>
         <jsp:include 
page="/WEB-INF/partials/canvas/process-group-configuration.jsp"/>
+        <jsp:include 
page="/WEB-INF/partials/canvas/override-policy-dialog.jsp"/>
         <jsp:include page="/WEB-INF/partials/canvas/policy-management.jsp"/>
         <jsp:include 
page="/WEB-INF/partials/canvas/remote-process-group-configuration.jsp"/>
         <jsp:include 
page="/WEB-INF/partials/canvas/remote-process-group-details.jsp"/>

http://git-wip-us.apache.org/repos/asf/nifi/blob/4a4c87fa/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/override-policy-dialog.jsp
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/override-policy-dialog.jsp
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/override-policy-dialog.jsp
new file mode 100644
index 0000000..b369c48
--- /dev/null
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/override-policy-dialog.jsp
@@ -0,0 +1,26 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+--%>
+<%@ page contentType="text/html" pageEncoding="UTF-8" session="false" %>
+<div id="override-policy-dialog" class="hidden small-dialog">
+    <div class="dialog-content">
+        <div>Do you want to override with a copy of the inherited policy or an 
empty policy?</div>
+        <div style="margin-top: 10px;">
+            <label for="copy-policy-radio-button"><input 
id="copy-policy-radio-button" type="radio" name="emptyOrCopy" value="copy" 
checked="checked"/> Copy</label>
+            <label for="empty-policy-radio-button"><input 
id="empty-policy-radio-button" type="radio" name="emptyOrCopy" value="policy"/> 
Empty</label>
+        </div>
+    </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/nifi/blob/4a4c87fa/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/policy-management.css
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/policy-management.css
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/policy-management.css
index 2fa956b..21cdc1f 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/policy-management.css
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/policy-management.css
@@ -222,3 +222,12 @@ div.policy-selected-component-type {
     font-family: Roboto;
     font-size: 13px;
 }
+
+/*
+    override policy dialog
+*/
+
+#override-policy-dialog label {
+    font-family: inherit;
+    letter-spacing: inherit;
+}

http://git-wip-us.apache.org/repos/asf/nifi/blob/4a4c87fa/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/header/components/nf-ng-template-component.js
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/header/components/nf-ng-template-component.js
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/header/components/nf-ng-template-component.js
index a029e79..61b9c03 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/header/components/nf-ng-template-component.js
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/header/components/nf-ng-template-component.js
@@ -81,8 +81,7 @@ nf.ng.TemplateComponent = function (serviceProvider) {
                 // configure the instantiate template dialog
                 this.getElement().modal({
                     scrollableContentStyle: 'scrollable',
-                    headerText: 'Add Template',
-                    overlayBackgroud: false
+                    headerText: 'Add Template'
                 });
             },
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/4a4c87fa/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-policy-management.js
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-policy-management.js
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-policy-management.js
index cfae290..c8e87f3 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-policy-management.js
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-policy-management.js
@@ -229,9 +229,52 @@ nf.PolicyManagement = (function () {
     };
     
     var initPolicyTable = function () {
-        // create/override a policy
-        $('#create-policy-link, #override-policy-link, 
#add-local-admin-link').on('click', function () {
-            createPolicy();
+        $('#override-policy-dialog').modal({
+            headerText: 'Override Policy',
+            buttons: [{
+                buttonText: 'Override',
+                color: {
+                    base: '#728E9B',
+                    hover: '#004849',
+                    text: '#ffffff'
+                },
+                handler: {
+                    click: function () {
+                        // create the policy, copying if appropriate
+                        
createPolicy($('#copy-policy-radio-button').is(':checked'));
+
+                        $(this).modal('hide');
+                    }
+                }
+            }, {
+                buttonText: 'Cancel',
+                color: {
+                    base: '#E3E8EB',
+                    hover: '#C7D2D7',
+                    text: '#004849'
+                },
+                handler: {
+                    click: function () {
+                        $(this).modal('hide');
+                    }
+                }
+            }],
+            handler: {
+                close: function () {
+                    // reset the radio button
+                    $('#copy-policy-radio-button').prop('checked', true);
+                }
+            }
+        });
+
+        // create/add a policy
+        $('#create-policy-link, #add-local-admin-link').on('click', function 
() {
+            createPolicy(false);
+        });
+
+        // override a policy
+        $('#override-policy-link').on('click', function () {
+            $('#override-policy-dialog').modal('show');
         });
 
         // policy type listing
@@ -413,7 +456,9 @@ nf.PolicyManagement = (function () {
 
             // see if the user has permissions for the current policy
             var currentEntity = $('#policy-table').data('policy');
-            if (currentEntity.permissions.canWrite === true) {
+            var resourceComponentId = 
nf.Common.substringAfterLast(currentEntity.component.resource, '/');
+            var selectedComponentId = 
$('#selected-policy-component-id').text();
+            if (currentEntity.permissions.canWrite === true && 
resourceComponentId === selectedComponentId) {
                 markup += '<div title="Remove" class="pointer delete-user fa 
fa-trash"></div>';
             }
 
@@ -659,13 +704,30 @@ nf.PolicyManagement = (function () {
      *
      * @param resource
      */
-    var convertToHumanReadableResource = function (resource) {
+    var getResourceMessage = function (resource) {
         if (resource === '/policies') {
-            return 'all policies';
+            return $('<span>Showing effective policy inherited from all 
policies.</span>');
         } else if (resource === '/controller') {
-            return 'the controller';
+            return $('<span>Showing effective policy inherited from the 
controller.</span>');
         } else {
-            return 'Process Group ' + nf.Common.substringAfterLast(resource, 
'/');
+            // extract the group id
+            var processGroupId = nf.Common.substringAfterLast(resource, '/');
+            var processGroupName = processGroupId;
+
+            // attempt to resolve the group name
+            var breadcrumbs = 
nf.ng.Bridge.injector.get('breadcrumbsCtrl').getBreadcrumbs();
+            $.each(breadcrumbs, function (_, breadcrumbEntity) {
+                if (breadcrumbEntity.id === processGroupId) {
+                    processGroupName = breadcrumbEntity.label;
+                    return false;
+                }
+            });
+
+            // build the mark up
+            return $('<span>Showing effective policy inherited from Process 
Group </span>').append($('<span 
class="link"></span>').text(processGroupName).on('click', function () {
+                $('#shell-close-button').click();
+                nf.CanvasUtils.enterGroup(processGroupId);
+            })).append('<span>.</span>');
         }
     };
 
@@ -686,21 +748,22 @@ nf.PolicyManagement = (function () {
         // store the current policy version
         $('#policy-table').data('policy', policyEntity);
 
-        // allow modification if allowed
-        $('#new-policy-user-button').prop('disabled', 
policyEntity.permissions.canWrite === false);
-
         // see if the policy is for this resource
         if (resourceAndAction.resource === policy.resource) {
             // allow remove when policy is not inherited
             $('#delete-policy-button').prop('disabled', 
policyEntity.permissions.canWrite === false);
+
+            // allow modification if allowed
+            $('#new-policy-user-button').prop('disabled', 
policyEntity.permissions.canWrite === false);
         } else {
-            $('#policy-message').text('Showing effective policy inherited from 
' + convertToHumanReadableResource(policy.resource) + '. ');
+            $('#policy-message').append(getResourceMessage(policy.resource));
 
             // policy is inherited, we do not know if the user has permissions 
to modify the desired policy... show button and let server decide
             $('#override-policy-message').show();
 
-            // to not support policy deletion
+            // do not support policy deletion/modification
             $('#delete-policy-button').prop('disabled', true);
+            $('#new-policy-user-button').prop('disabled', true);
         }
 
         // populate the table
@@ -732,8 +795,6 @@ nf.PolicyManagement = (function () {
 
                         // if the return policy is for the desired policy (not 
inherited, show it)
                         if (resourceAndAction.resource === policy.resource) {
-                            $('#policy-message').text(policy.resource);
-
                             // populate the policy details
                             populatePolicy(policyEntity);
                         } else {
@@ -803,10 +864,6 @@ nf.PolicyManagement = (function () {
 
                     // ensure appropriate actions for the loaded policy
                     if (policyEntity.permissions.canRead === true) {
-                        var policy = policyEntity.component;
-
-                        $('#policy-message').text(policy.resource);
-
                         // populate the policy details
                         populatePolicy(policyEntity);
                     } else {
@@ -856,10 +913,33 @@ nf.PolicyManagement = (function () {
 
     /**
      * Creates a new policy for the current selection.
+     *
+     * @param copyInheritedPolicy   Whether or not to copy the inherited policy
      */
-    var createPolicy = function () {
+    var createPolicy = function (copyInheritedPolicy) {
         var resourceAndAction = getSelectedResourceAndAction();
 
+        var users = [];
+        var userGroups = [];
+        if (copyInheritedPolicy === true) {
+            var policyGrid = $('#policy-table').data('gridInstance');
+            var policyData = policyGrid.getData();
+
+            var items = policyData.getItems();
+            $.each(items, function (_, item) {
+                var itemCopy = $.extend({}, item);
+
+                if (itemCopy.type === 'user') {
+                    users.push(itemCopy);
+                } else {
+                    userGroups.push(itemCopy);
+                }
+
+                // remove the type as it was added client side to render 
differently and is not part of the actual schema
+                delete itemCopy.type;
+            });
+        }
+
         var entity = {
             'revision': nf.Client.getRevision({
                 'revision': {
@@ -868,7 +948,9 @@ nf.PolicyManagement = (function () {
             }),
             'component': {
                 'action': resourceAndAction.action,
-                'resource': resourceAndAction.resource
+                'resource': resourceAndAction.resource,
+                'users': users,
+                'userGroups': userGroups
             }
         };
 
@@ -881,10 +963,6 @@ nf.PolicyManagement = (function () {
         }).done(function (policyEntity) {
             // ensure appropriate actions for the loaded policy
             if (policyEntity.permissions.canRead === true) {
-                var policy = policyEntity.component;
-
-                $('#policy-message').text(policy.resource);
-
                 // populate the policy details
                 populatePolicy(policyEntity);
             } else {
@@ -907,14 +985,16 @@ nf.PolicyManagement = (function () {
 
         var items = policyData.getItems();
         $.each(items, function (_, item) {
-            if (item.type === 'user') {
-                users.push(item);
+            var itemCopy = $.extend({}, item);
+
+            if (itemCopy.type === 'user') {
+                users.push(itemCopy);
             } else {
-                userGroups.push(item);
+                userGroups.push(itemCopy);
             }
 
-            // remove the type as it was added client side to render 
differently
-            delete item.type;
+            // remove the type as it was added client side to render 
differently and is not part of the actual schema
+            delete itemCopy.type;
         });
 
         var currentEntity = $('#policy-table').data('policy');
@@ -937,10 +1017,6 @@ nf.PolicyManagement = (function () {
             }).done(function (policyEntity) {
                 // ensure appropriate actions for the loaded policy
                 if (policyEntity.permissions.canRead === true) {
-                    var policy = policyEntity.component;
-
-                    $('#policy-message').text(policy.resource);
-
                     // populate the policy details
                     populatePolicy(policyEntity);
                 } else {
@@ -982,7 +1058,7 @@ nf.PolicyManagement = (function () {
      * Reset the policy message.
      */
     var resetPolicyMessage = function () {
-        $('#policy-message').text('');
+        $('#policy-message').text('').empty();
         $('#new-policy-message').hide();
         $('#override-policy-message').hide();
         $('#add-local-admin-message').hide();

http://git-wip-us.apache.org/repos/asf/nifi/blob/4a4c87fa/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/nf-dialog.js
----------------------------------------------------------------------
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/nf-dialog.js
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/nf-dialog.js
index 26d0f30..50aa704 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/nf-dialog.js
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/nf-dialog.js
@@ -94,7 +94,6 @@ nf.Dialog = (function () {
             options = $.extend({
                 headerText: '',
                 dialogContent: '',
-                overlayBackgrond: true,
                 yesText: 'Yes',
                 noText: 'No'
             }, options);

Reply via email to