This is an automated email from the ASF dual-hosted git repository.

mcgilman pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 09cef4ff99 NIFI-11287: detect dependent properties when the property 
it depends on references a parameter (UI) (#7117)
09cef4ff99 is described below

commit 09cef4ff99428e841cd0c4c2725bb80d4f2ea138
Author: M Tien <[email protected]>
AuthorDate: Thu May 11 14:00:57 2023 -0700

    NIFI-11287: detect dependent properties when the property it depends on 
references a parameter (UI) (#7117)
    
    * NIFI-11287: detect dependent properties when the property it depends on 
references a parameter
    
    * address review feedback
    
    * address more review comments
    
    * - loadProperties checks type before getting the parameter context
    - retrieve the parameter context with ajax call from inside the class
    
    * add type parameter to all places calling loadProperties
    
    * get reference parameters by invoking provided callbacks from the client
    
    * check for user permissions before requesting for referenced parameters
    
    * address review feedback
    
    This closes #7117
---
 .../jquery/propertytable/jquery.propertytable.js   | 104 ++++++++++++++++++---
 .../main/webapp/js/nf/canvas/nf-canvas-utils.js    |   2 +-
 .../webapp/js/nf/canvas/nf-controller-service.js   |   6 +-
 .../js/nf/canvas/nf-processor-configuration.js     |   4 +-
 4 files changed, 94 insertions(+), 22 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/propertytable/jquery.propertytable.js
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/propertytable/jquery.propertytable.js
index 4fc73ba7da..0929daee79 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/propertytable/jquery.propertytable.js
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/jquery/propertytable/jquery.propertytable.js
@@ -73,7 +73,7 @@
             require('nf.ProcessGroup'),
             require('nf.ProcessGroupConfiguration'),
             require('nf.Settings'),
-            recuire('nf.ParameterContexts'),
+            require('nf.ParameterContexts'),
             require('lodash'));
     } else {
         factory(root.$,
@@ -107,6 +107,7 @@
     var groupId = null;
     var supportsSensitiveDynamicProperties = false;
     var propertyVerificationCallback = null;
+    var currentParameters = null;
     var COMBO_MIN_WIDTH = 212;
     var EDITOR_MIN_WIDTH = 212;
     var EDITOR_MIN_HEIGHT = 100;
@@ -1466,7 +1467,8 @@
 
             // sets the available parameters for the specified property 
descriptor
             var loadParameters = function (propertyDescriptor, 
parameterDeferred, setParameters) {
-                parameterDeferred(propertyDescriptor, groupId).done(function 
(parameters) {
+                
parameterDeferred(nfCommon.isSensitiveProperty(propertyDescriptor), 
groupId).done(function (parameters) {
+                    currentParameters = parameters;
                     setParameters(parameters);
                 });
             };
@@ -1720,12 +1722,20 @@
                                                 // Get the current property 
value to compare with the dependent value
                                                 var propertyValue = 
property.value;
 
+                                                var referencingParameter = 
null;
+
+                                                // check if the property 
references a parameter
+                                                if 
(!_.isEmpty(currentParameters)) {
+                                                    const paramReference = 
getExistingParametersReferenced(propertyValue);
+                                                    if (paramReference.length 
> 0) {
+                                                        referencingParameter = 
paramReference[0].value;
+                                                    }
+                                                }
+
                                                 // Test the dependentValues 
array against the current value of the property
                                                 // If not, then mark the 
current property hidden attribute is true
-                                                if (propertyValue != null) {
-                                                    if 
(dependency.hasOwnProperty("dependentValues")) {
-                                                        hidden = 
!dependency.dependentValues.includes(propertyValue);
-                                                    }
+                                                if (propertyValue != null && 
dependency.hasOwnProperty("dependentValues")) {
+                                                    hidden = 
!dependency.dependentValues.includes(referencingParameter || propertyValue);
                                                 } else {
                                                     hidden = true;
                                                 }
@@ -1867,14 +1877,30 @@
      * @param {type} properties
      * @param {type} descriptors
      * @param {type} history
+     * @param {type} options
      */
-    var loadProperties = function (table, properties, descriptors, history) {
+    var loadProperties = function (table, properties, descriptors, history, 
options) {
         // save the original descriptors and history
         table.data({
             'descriptors': descriptors,
             'history': history
         });
 
+        if (_.isFunction(options.parameterDeferred) && 
_.isFunction(options.getParameterContext)) {
+            var paramContext = options.getParameterContext(groupId);
+            var canReadParamContext = _.get(paramContext, 
'permissions.canRead', false);
+            if (canReadParamContext) {
+                options.parameterDeferred(false, groupId).done(function 
(parameters) {
+                    currentParameters = parameters;
+                    processProperties(table, properties, descriptors);
+                });
+                return;
+            }
+        }
+        processProperties(table, properties, descriptors);
+    };
+
+    var processProperties = function (table, properties, descriptors) {
         // get the grid
         var propertyGrid = table.data('gridInstance');
         var propertyData = propertyGrid.getData();
@@ -1931,13 +1957,20 @@
                                 if (property.hidden === false) {
                                     // Get the property value by propertyName
                                     var propertyValue = 
properties[dependency.propertyName];
+                                    var referencingParameter = null;
+
+                                    // check if the property references a 
parameter
+                                    if (!_.isEmpty(currentParameters)) {
+                                        const paramReference = 
getExistingParametersReferenced(propertyValue);
+                                        if (paramReference.length > 0) {
+                                            referencingParameter = 
paramReference[0].value;
+                                        }
+                                    }
 
                                     // Test the dependentValues against the 
current value of the property
                                     // If not, then mark the current property 
hidden attribute is true
-                                    if (propertyValue != null) {
-                                        if 
(dependency.hasOwnProperty("dependentValues")) {
-                                            hidden = 
!dependency.dependentValues.includes(propertyValue);
-                                        }
+                                    if (propertyValue != null && 
dependency.hasOwnProperty("dependentValues")) {
+                                        hidden = 
!dependency.dependentValues.includes(referencingParameter || propertyValue);
                                     } else {
                                         hidden = true;
                                     }
@@ -1978,6 +2011,7 @@
      * @param {jQuery} propertyTableContainer
      */
     var clear = function (propertyTableContainer) {
+        currentParameters = null;
         var options = propertyTableContainer.data('options');
         if (options.readOnly === true) {
             nfUniversalCapture.removeAllPropertyDetailDialogs();
@@ -2001,6 +2035,43 @@
         propertyData.setItems([]);
     };
 
+    /**
+     * Gets all the referenced parameters from the {currentParameters} based 
on the value of {parameterReference}
+     *
+     * @param {string} parameterReference
+     * @returns {ParameterEntity[]}
+     */
+    var getExistingParametersReferenced = function (parameterReference) {
+        if (_.isEmpty(currentParameters)) {
+            return [];
+        }
+        var existingParametersReferenced = [];
+
+        if (!_.isNil(parameterReference)) {
+            // can't use from common/constants because we are modifying the 
lastIndex below
+            var paramRefsRegex = /#{(')?([a-zA-Z0-9-_. ]+)\1}/gm;
+            var possibleMatch;
+
+            while ((possibleMatch = paramRefsRegex.exec(parameterReference)) 
!== null) {
+                // This is necessary to avoid infinite loops with zero-width 
matches
+                if (possibleMatch.index === paramRefsRegex.lastIndex) {
+                    paramRefsRegex.lastIndex++;
+                }
+
+                if (!_.isEmpty(possibleMatch) && possibleMatch.length === 3) {
+                    const parameterName = possibleMatch[2];
+                    var found = currentParameters.find(function (param) {
+                        return param.name === parameterName;
+                    });
+                    if (!_.isNil(found)) {
+                        existingParametersReferenced.push(found);
+                    }
+                }
+            }
+        }
+        return existingParametersReferenced;
+    };
+
     var methods = {
         /**
          * Create a property table. The options are specified in the following
@@ -2263,9 +2334,14 @@
          * @argument {map} history
          */
         loadProperties: function (properties, descriptors, history) {
-            return this.each(function () {
-                var table = $(this).find('div.property-table');
-                loadProperties(table, properties, descriptors, history);
+            var self = this;
+
+            return self.each(function () {
+                var propertyTableContainer = $(this);
+                var options = propertyTableContainer.data('options');
+
+                var table = propertyTableContainer.find('div.property-table');
+                loadProperties(table, properties, descriptors, history, 
options);
             });
         },
 
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas-utils.js
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas-utils.js
index c70bfb327b..2fb1b75d34 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas-utils.js
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas-utils.js
@@ -2173,7 +2173,7 @@
         /**
          * Whether the current user can read from this group.
          *
-         * @returns {boolean}   can write
+         * @returns {boolean}   can read
          */
         canReadCurrentGroup: function () {
             return nfCanvas.canRead();
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-controller-service.js
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-controller-service.js
index b705e98adf..42801224b5 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-controller-service.js
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-controller-service.js
@@ -1672,11 +1672,11 @@
     /**
      * Gets the parameters for the specified property descriptor and group.
      *
-     * @param propertyDescriptor    The property descriptor in question
+     * @param sensitive             The sensitivity of property descriptor in 
question
      * @param groupId               The group in question
      * @returns {deferred}
      */
-    var getParameters = function (propertyDescriptor, groupId) {
+    var getParameters = function (sensitive, groupId) {
         return $.Deferred(function (deferred) {
             if (nfCommon.isDefinedAndNotNull(groupId)) {
                 var parameterContext;
@@ -1699,8 +1699,6 @@
                         },
                         dataType: 'json'
                     }).done(function (response) {
-                        var sensitive = 
nfCommon.isSensitiveProperty(propertyDescriptor);
-
                         
deferred.resolve(response.component.parameters.map(function (parameterEntity) {
                             return parameterEntity.parameter;
                         }).filter(function (parameter) {
diff --git 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-processor-configuration.js
 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-processor-configuration.js
index 027f4ff27d..c148e06a85 100644
--- 
a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-processor-configuration.js
+++ 
b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-processor-configuration.js
@@ -714,7 +714,7 @@
                         dataType: 'json'
                     }).fail(nfErrorHandler.handleAjaxError);
                 },
-                parameterDeferred: function (propertyDescriptor, groupId) {
+                parameterDeferred: function (sensitive, groupId) {
                     return $.Deferred(function (deferred) {
                         if (nfCommon.isDefinedAndNotNull(groupId)) {
                             // processors being configured must be in the 
current group
@@ -729,8 +729,6 @@
                                     },
                                     dataType: 'json'
                                 }).done(function (response) {
-                                    var sensitive = 
nfCommon.isSensitiveProperty(propertyDescriptor);
-
                                     
deferred.resolve(response.component.parameters.map(function (parameterEntity) {
                                         return parameterEntity.parameter;
                                     }).filter(function (parameter) {

Reply via email to