You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by sc...@apache.org on 2019/09/05 18:07:20 UTC

[nifi] branch master updated (78d9f13 -> fa8a446)

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

scottyaslan pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/nifi.git.


    from 78d9f13  NIFI-6416: This closes #3654. Removing swap locations on SWAP_IN
     new eddc562  NIFI-6506 - Add ability to convert properties to parameters * open existing add param dialog from property table * convert prop to param, update param context * keep add parameter dialog open until update of the context completes when converting property to param * Updating parameter context while converting property to parameter. * Disable the Apply button while updating * When Cancel is pressed and there is an update in progress, issue the DELETE request to cancel the  [...]
     new f3a0452  NIFI-6506 - Fix syntax/style issues. Apply same logic for disabled state when converting prop to param.
     new aa07378  NIFI-6505 - Addressing review feedback: reuse single method for getting parameter field values.
     new 10b4f6f  NIFI-6506 - review feedback * fixed issues converting sensitive props to parameters * only include parameter value if it has changed (even for non-sensitive params) * do not allow null parameter values when editing parameters.
     new 385c067  NIFI-6505 - fixing issues uncovered in code review.
     new 5936fe3  NIFI-6506 - navigate to process group when selecting to go to controller service from referencing components on parameter context dialog.
     new 93d9982  NIFI-6506 - more review fixes
     new 183ece1  NIFI-6506 - update parameter context list after successful update.
     new a52d176  NIFI-6506 - review feedback
     new 5cbade7  NIFI-6505 - fix for editing parameter value. simplify logic in edit dialog for disabled state of the apply button.
     new 3c918e2  NIFI-6506 - better empty-string/null handling for edit parameters
     new fa8a446  NIFI-6506 - don't show 'Sensitive value set' for null, sensitive params'

The 12 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../canvas/new-parameter-context-dialog.jsp        |   4 +
 .../nifi-web-ui/src/main/webapp/css/dialog.css     |   1 +
 .../webapp/css/new-parameter-context-dialog.css    |  20 +
 .../jquery/propertytable/jquery.propertytable.js   |  63 +-
 .../webapp/js/nf/canvas/nf-controller-service.js   |  10 +
 .../webapp/js/nf/canvas/nf-parameter-contexts.js   | 652 ++++++++++++++-------
 .../js/nf/canvas/nf-processor-configuration.js     |   6 +-
 7 files changed, 540 insertions(+), 216 deletions(-)


[nifi] 07/12: NIFI-6506 - more review fixes

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 93d99820b775b48905ad670ad5bcda7b7535186f
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Wed Sep 4 10:45:52 2019 -0400

    NIFI-6506 - more review fixes
---
 .../canvas/new-parameter-context-dialog.jsp        |  2 +-
 .../nifi-web-ui/src/main/webapp/css/dialog.css     | 20 +---------------
 .../webapp/css/new-parameter-context-dialog.css    | 20 ++++++++++++++++
 .../webapp/js/nf/canvas/nf-parameter-contexts.js   | 28 ++++++++++++++--------
 4 files changed, 40 insertions(+), 30 deletions(-)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/new-parameter-context-dialog.jsp b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/new-parameter-context-dialog.jsp
index 3735355..cf1f56b 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/new-parameter-context-dialog.jsp
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/new-parameter-context-dialog.jsp
@@ -119,7 +119,7 @@
     </div>
     <div id="parameter-context-updating-status">
         <div class='parameter-context-step ajax-loading'></div>
-        <div class='status-message'>Updating parameter context</div>
+        <div class='status-message ellipsis'>Updating parameter context</div>
     </div>
 </div>
 <div id="referencing-components-template" class="referencing-components-template hidden clear">
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/dialog.css b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/dialog.css
index 0503100..ffad338 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/dialog.css
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/dialog.css
@@ -379,27 +379,9 @@ div.variable-step {
 }
 
 div.parameter-context-step {
+    min-width: 16px;
     width: 16px;
     height: 16px;
     background-color: transparent;
     float: right;
 }
-
-#parameter-context-updating-status {
-    display: none;
-    position: absolute;
-    left: 12px;
-    bottom: 0;
-    height: 32px;
-}
-
-#parameter-context-updating-status.show-status {
-    display: flex;
-    flex-direction: row;
-    align-items: center;
-}
-
-#parameter-context-updating-status .status-message {
-    white-space: nowrap;
-    margin-left: 6px;
-}
\ No newline at end of file
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/new-parameter-context-dialog.css b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/new-parameter-context-dialog.css
index 2ccb910..8c7501b 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/new-parameter-context-dialog.css
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/new-parameter-context-dialog.css
@@ -101,3 +101,23 @@ span.parameter-context-referencing-component-name {
     margin-right: 5px;
     max-width: calc(100% - 10px);
 }
+
+#parameter-context-updating-status {
+    display: none;
+    position: absolute;
+    left: 12px;
+    bottom: 0;
+    height: 32px;
+    max-width: calc(100% - 230px);
+}
+
+#parameter-context-updating-status.show-status {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+}
+
+#parameter-context-updating-status .status-message {
+    white-space: nowrap;
+    margin-left: 6px;
+}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index fdafdfb..d9aadf0 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -217,6 +217,21 @@
     };
 
     /**
+     * Resets all of the fields in the add/edit parameter dialog
+     */
+    var resetParameterDialog = function () {
+        $('#parameter-name').val('');
+        $('#parameter-value-field').val('');
+        $('#parameter-description-field').val('');
+        $('#parameter-sensitive-radio-button').prop('checked', false);
+        $('#parameter-not-sensitive-radio-button').prop('checked', false);
+        $('#parameter-name').prop('disabled', false);
+        $('#parameter-sensitive-radio-button').prop('disabled', false);
+        $('#parameter-not-sensitive-radio-button').prop('disabled', false);
+        $('#parameter-set-empty-string-field').removeClass('checkbox-checked').addClass('checkbox-unchecked');
+    };
+
+    /**
      * Marshals the parameters in the table.
      */
     var marshalParameters = function () {
@@ -1600,7 +1615,7 @@
                             },
                             disabled: function () {
                                 var param = serializeParameter(parameter);
-                                if (_.isEmpty(param.value) && !param.isEmptyStringSet) {
+                                if (_.isEmpty(param.value) && !param.isEmptyStringSet && !param.sensitive) {
                                     // must have a value when editing
                                     return true;
                                 } else {
@@ -1766,15 +1781,7 @@
 
         $('#add-parameter').on('click', function () {
             var closeHandler = function () {
-                $('#parameter-name').val('');
-                $('#parameter-value-field').val('');
-                $('#parameter-description-field').val('');
-                $('#parameter-sensitive-radio-button').prop('checked', false);
-                $('#parameter-not-sensitive-radio-button').prop('checked', false);
-                $('#parameter-name').prop('disabled', false);
-                $('#parameter-sensitive-radio-button').prop('disabled', false);
-                $('#parameter-not-sensitive-radio-button').prop('disabled', false);
-                $('#parameter-set-empty-string-field').removeClass('checkbox-checked').addClass('checkbox-unchecked');
+                resetParameterDialog();
             };
 
             var openHandler = function () {
@@ -2480,6 +2487,7 @@
                                         clearTimeout(updateTimeoutReference);
                                     }
                                 }
+                                resetParameterDialog();
 
                                 // hide the dialog
                                 $(this).modal('hide');


[nifi] 09/12: NIFI-6506 - review feedback

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a52d17628a0ebfab6ca749abf546a9e5e0875eff
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Wed Sep 4 13:43:13 2019 -0400

    NIFI-6506 - review feedback
---
 .../webapp/js/nf/canvas/nf-parameter-contexts.js   | 25 +++++++++-------------
 1 file changed, 10 insertions(+), 15 deletions(-)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index d7429f7..7764410 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -888,14 +888,6 @@
         // validate the parameter is not a duplicate
         var matchingParameter = _.find(existingParameters, { name: parameter.name });
 
-        // If in edit mode, the value can not be null
-        if (editMode === true && _.isNil(parameter.value)) {
-            nfDialog.showOkDialog({
-                headerText: 'Configuration Error',
-                dialogContent: 'The value of the parameter must be specified.'
-            });
-        }
-
         // Valid if no duplicate is found or it is edit mode and a matching parameter was found
         if (_.isNil(matchingParameter) || (editMode === true && !_.isNil(matchingParameter))) {
             return true;
@@ -1183,7 +1175,7 @@
                                     component: updateRequestEntity.request.parameterContext
                                 });
 
-                                var item = parameterContextData.getItemById(parameterContextEntity.component.id);
+                                var item = parameterContextData.getItemById(parameterContextEntity.id);
                                 if (nfCommon.isDefinedAndNotNull(item)) {
                                     parameterContextData.updateItem(parameterContextEntity.id, parameterContextEntity);
                                 }
@@ -1615,11 +1607,14 @@
                             },
                             disabled: function () {
                                 var param = serializeParameter(parameter);
-                                if (_.isEmpty(param.value) && !param.isEmptyStringSet && !param.sensitive) {
-                                    // must have a value when editing
-                                    return true;
+                                if (param.hasValueChanged) {
+                                    if (_.isEmpty(param.value) && !param.isEmptyStringSet) {
+                                        // must have a value when editing
+                                        return true;
+                                    }
+                                    return false;
                                 } else {
-                                    return !param.hasValueChanged && !param.hasDescriptionChanged;
+                                    return !param.hasDescriptionChanged;
                                 }
                             },
                             handler: {
@@ -1825,8 +1820,8 @@
                             $(this).modal('hide');
                         }
                     }
-                }]).modal('show');
-            $('#parameter-dialog').modal('show');
+                }])
+                .modal('show');
         });
 
         $('#parameter-context-name').on('keyup', function (evt) {


[nifi] 05/12: NIFI-6505 - fixing issues uncovered in code review.

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 385c06750705c280f0768f214d3c5bfb63b4b4ef
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Wed Sep 4 08:41:53 2019 -0400

    NIFI-6505 - fixing issues uncovered in code review.
---
 .../webapp/js/nf/canvas/nf-parameter-contexts.js   | 31 +++++++++++++---------
 1 file changed, 18 insertions(+), 13 deletions(-)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index 3fdc7f0..083138e 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -810,7 +810,7 @@
      * Builds a parameter object from the user-entered parameter inputs
      *
      * @param originalParameter Optional parameter to compare value against to determine if it has changed
-     * @return {{isEmptyStringSet: *, name: *, description: *, sensitive: *, value: *}}
+     * @return {{isEmptyStringSet: *, name: *, description: *, sensitive: *, value: *, hasValueChanged: *, hasDescriptionChanged: *}}
      */
     var serializeParameter = function (originalParameter) {
         var name = $.trim($('#parameter-name').val());
@@ -821,8 +821,8 @@
 
         var parameter = {
             name: name,
-            value: value,
-            description: description,
+            value: null,
+            description: null,
             sensitive: isSensitive,
             isEmptyStringSet: isEmptyStringSet,
             previousValue: null,
@@ -837,7 +837,8 @@
             description: description,
             sensitive: isSensitive,
             isEmptyStringSet: isEmptyStringSet,
-            hasValueChanged: serializedValue.hasChanged
+            hasValueChanged: serializedValue.hasChanged,
+            hasDescriptionChanged: description !== _.get(originalParameter, 'description', '')
         }
     };
 
@@ -904,9 +905,10 @@
 
     var serializeValue = function (input, parameter, isChecked) {
         var serializedValue;
-        var hasChanged = parameter.value !== parameter.previousValue;
 
         var value = input.val();
+        var hasChanged = parameter.value !== value;
+
         if (!nfCommon.isBlank(value)) {
             // if the value is sensitive and the user has not made a change
             if (!_.isEmpty(parameter) && parameter.sensitive === true && input.hasClass('sensitive') && parameter.isNew === false) {
@@ -957,7 +959,8 @@
                 isEmptyStringSet: serializedParam.isEmptyStringSet,
                 isNew: originalParameter.isNew,
                 hasValueChanged: serializedParam.hasValueChanged,
-                isModified: serializedParam.hasValueChanged || serializedParam.description !== originalParameter.description
+                hasDescriptionChanged: serializedParam.hasDescriptionChanged,
+                isModified: serializedParam.hasValueChanged || serializedParam.hasDescriptionChanged
             });
 
             // update row for the parameter
@@ -1032,11 +1035,10 @@
                         text: '#ffffff'
                     },
                     disabled: function () {
-                        var param = serializeParameter();
-                        if (_.isEmpty(param.name) || (_.isNil(param.value) && !param.isEmptyStringSet)) {
-                            return true;
+                        if ($('#parameter-context-name').val() !== '') {
+                            return false;
                         }
-                        return false;
+                        return true;
                     },
                     handler: {
                         click: function () {
@@ -1596,7 +1598,12 @@
                             },
                             disabled: function () {
                                 var param = serializeParameter(parameter);
-                                return !param.hasValueChanged && param.description === parameter.description;
+                                if (_.isEmpty(param.value) && !param.isEmptyStringSet) {
+                                    // must have a value when editing
+                                    return true;
+                                } else {
+                                    return !param.hasValueChanged && !param.hasDescriptionChanged;
+                                }
                             },
                             handler: {
                                 click: function () {
@@ -1889,8 +1896,6 @@
                 }
             }])
             .modal('show');
-
-        $('#parameter-dialog').modal('show');
     };
 
     /**


[nifi] 10/12: NIFI-6505 - fix for editing parameter value. simplify logic in edit dialog for disabled state of the apply button.

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5cbade7b1d6ab3fe19827d393b4066db677ed309
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Wed Sep 4 14:36:57 2019 -0400

    NIFI-6505 - fix for editing parameter value. simplify logic in edit dialog for disabled state of the apply button.
---
 .../webapp/js/nf/canvas/nf-parameter-contexts.js     | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index 7764410..99a2e70 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -836,6 +836,16 @@
         var description = $('#parameter-description-field').val();
         var isSensitive = $('#parameter-dialog').find('input[name="sensitive"]:checked').val() === 'sensitive' ? true : false;
 
+        var validateValue = function () {
+            // updates to a parameter cannot have a null value
+            if (!this.isNew) {
+                if (_.isEmpty(this.value) && !this.isEmptyStringSet) {
+                    return false;
+                }
+            }
+            return true;
+        };
+
         var parameter = {
             name: name,
             value: null,
@@ -855,7 +865,8 @@
             sensitive: isSensitive,
             isEmptyStringSet: isEmptyStringSet,
             hasValueChanged: serializedValue.hasChanged,
-            hasDescriptionChanged: description !== _.get(originalParameter, 'description', '')
+            hasDescriptionChanged: description !== _.get(originalParameter, 'description', ''),
+            isValueValid: validateValue
         }
     };
 
@@ -969,6 +980,7 @@
                 isNew: originalParameter.isNew,
                 hasValueChanged: serializedParam.hasValueChanged,
                 hasDescriptionChanged: serializedParam.hasDescriptionChanged,
+                value: serializedParam.value,
                 isModified: serializedParam.hasValueChanged || serializedParam.hasDescriptionChanged
             });
 
@@ -1608,11 +1620,7 @@
                             disabled: function () {
                                 var param = serializeParameter(parameter);
                                 if (param.hasValueChanged) {
-                                    if (_.isEmpty(param.value) && !param.isEmptyStringSet) {
-                                        // must have a value when editing
-                                        return true;
-                                    }
-                                    return false;
+                                    return !param.isValueValid();
                                 } else {
                                     return !param.hasDescriptionChanged;
                                 }


[nifi] 01/12: NIFI-6506 - Add ability to convert properties to parameters * open existing add param dialog from property table * convert prop to param, update param context * keep add parameter dialog open until update of the context completes when converting property to param * Updating parameter context while converting property to parameter. * Disable the Apply button while updating * When Cancel is pressed and there is an update in progress, issue the DELETE request to cancel the update. * Show some [...]

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit eddc5624d8b4da4707d790c563c929dfd1af4bf1
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Tue Aug 13 14:36:13 2019 -0400

    NIFI-6506 - Add ability to convert properties to parameters
    * open existing add param dialog from property table
    * convert prop to param, update param context
    * keep add parameter dialog open until update of the context completes when converting property to param
    * Updating parameter context while converting property to parameter.
    * Disable the Apply button while updating
    * When Cancel is pressed and there is an update in progress, issue the DELETE request to cancel the update.
    * Show some status in the Add Parameter dialog when parameter context is updating following a property conversion.
    * enforce character restrictions on property names.
    * Add convert property to parameter to controller service config.
    * Properly set sensitive setting when converting sensitive properties
    * Allow converting of properties from controller services configuration into parameters
    * Refactor addNewParameter method to be able to share common parts with convertPropertyToParameter
---
 .../canvas/new-parameter-context-dialog.jsp        |   4 +
 .../nifi-web-ui/src/main/webapp/css/dialog.css     |  19 +
 .../jquery/propertytable/jquery.propertytable.js   |  62 ++-
 .../webapp/js/nf/canvas/nf-controller-service.js   |  10 +
 .../webapp/js/nf/canvas/nf-parameter-contexts.js   | 444 +++++++++++++++------
 .../js/nf/canvas/nf-processor-configuration.js     |   6 +-
 6 files changed, 418 insertions(+), 127 deletions(-)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/new-parameter-context-dialog.jsp b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/new-parameter-context-dialog.jsp
index bc264bd..3735355 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/new-parameter-context-dialog.jsp
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/new-parameter-context-dialog.jsp
@@ -117,6 +117,10 @@
             <div class="clear"></div>
         </div>
     </div>
+    <div id="parameter-context-updating-status">
+        <div class='parameter-context-step ajax-loading'></div>
+        <div class='status-message'>Updating parameter context</div>
+    </div>
 </div>
 <div id="referencing-components-template" class="referencing-components-template hidden clear">
     <div class="setting">
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/dialog.css b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/dialog.css
index eb71a9e..0503100 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/dialog.css
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/dialog.css
@@ -384,3 +384,22 @@ div.parameter-context-step {
     background-color: transparent;
     float: right;
 }
+
+#parameter-context-updating-status {
+    display: none;
+    position: absolute;
+    left: 12px;
+    bottom: 0;
+    height: 32px;
+}
+
+#parameter-context-updating-status.show-status {
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+}
+
+#parameter-context-updating-status .status-message {
+    white-space: nowrap;
+    margin-left: 6px;
+}
\ No newline at end of file
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 39334ac..7709824 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
@@ -30,7 +30,9 @@
                 'nf.Client',
                 'nf.ErrorHandler',
                 'nf.ProcessGroupConfiguration',
-                'nf.Settings'],
+                'nf.Settings',
+                'nf.ParameterContexts',
+                'lodash-core'],
             function ($,
                       Slick,
                       nfCommon,
@@ -40,7 +42,9 @@
                       nfClient,
                       nfErrorHandler,
                       nfProcessGroupConfiguration,
-                      nfSettings) {
+                      nfSettings,
+                      nfParameterContexts,
+                      _) {
                 factory($,
                     Slick,
                     nfCommon,
@@ -50,7 +54,9 @@
                     nfClient,
                     nfErrorHandler,
                     nfProcessGroupConfiguration,
-                    nfSettings);
+                    nfSettings,
+                    nfParameterContexts,
+                    _);
             });
     } else if (typeof exports === 'object' && typeof module === 'object') {
         factory(require('jquery'),
@@ -62,7 +68,9 @@
             require('nf.Client'),
             require('nf.ErrorHandler'),
             require('nf.ProcessGroupConfiguration'),
-            require('nf.Settings'));
+            require('nf.Settings'),
+            recuire('nf.ParameterContexts'),
+            require('lodash-core'));
     } else {
         factory(root.$,
             root.Slick,
@@ -73,7 +81,9 @@
             root.nf.Client,
             root.nf.ErrorHandler,
             root.nf.ProcessGroupConfiguration,
-            root.nf.Settings);
+            root.nf.Settings,
+            root.nf.ParameterContexts,
+            root._);
     }
 }(this, function ($,
                   Slick,
@@ -84,7 +94,9 @@
                   nfClient,
                   nfErrorHandler,
                   nfProcessGroupConfiguration,
-                  nfSettings) {
+                  nfSettings,
+                  nfParameterContexts,
+                  _) {
 
     var groupId = null;
     var COMBO_MIN_WIDTH = 212;
@@ -1350,9 +1362,22 @@
                 });
             }
 
-            // allow user defined properties to be removed
-            if (options.readOnly !== true && dataContext.type === 'userDefined') {
-                markup += '<div title="Delete" class="delete-property pointer fa fa-trash"></div>';
+            if (options.readOnly !== true) {
+                var canModifyParamContexts = nfCommon.canModifyParameterContexts();
+                var paramContextIsSet = false;
+                if (_.isFunction(options.getParameterContextId)) {
+                    paramContextIsSet = !_.isNil(options.getParameterContextId(groupId));
+                }
+                var referencesParam = referencesParameter(dataContext.value);
+
+                if (canModifyParamContexts && paramContextIsSet && !referencesParam && !identifiesControllerService) {
+                    markup += '<div title="Convert to parameter" class="convert-to-parameter pointer fa fa-level-up"></div>';
+                }
+
+                // allow user defined properties to be removed
+                if (dataContext.type === 'userDefined') {
+                    markup += '<div title="Delete" class="delete-property pointer fa fa-trash"></div>';
+                }
             }
 
             return markup;
@@ -1545,6 +1570,25 @@
                             });
                         }
                     }
+                } else if (target.hasClass('convert-to-parameter')) {
+                    var parameterContextId;
+                    if (_.isFunction(options.getParameterContextId)) {
+                        parameterContextId = options.getParameterContextId(groupId);
+                    }
+
+                    if (options.readOnly !== true && !_.isNil(parameterContextId)) {
+                        var descriptors = table.data('descriptors');
+                        var propertyDescriptor = descriptors[property.displayName];
+
+                        nfParameterContexts.convertPropertyToParameter(property, propertyDescriptor, parameterContextId)
+                            .done(function (parameter) {
+                                // set the property value to the reference the parameter that was created
+                                propertyData.updateItem(property.id, $.extend(property, {
+                                    previousValue: property.value,
+                                    value: '#{' + parameter.name + '}'
+                                }));
+                            });
+                    }
                 }
             }
         });
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 6814edc..c80d8c5 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
@@ -1875,6 +1875,16 @@
                     },
                     goToServiceDeferred: function () {
                         return goToServiceFromProperty(serviceTable);
+                    },
+                    getParameterContextId: function (groupId) {
+                        // attempt to identify the parameter context id, conditional based on whether
+                        // the user is configuring the current process group
+                        if (_.isNil(groupId) || groupId === nfCanvasUtils.getGroupId()) {
+                            return nfCanvasUtils.getParameterContextId();
+                        } else {
+                            var parentProcessGroup = nfCanvasUtils.getComponentByType('ProcessGroup').get(groupId);
+                            return parentProcessGroup.parameterContextId;
+                        }
                     }
                 });
 
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index 336d7de..ec617aa 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -36,9 +36,10 @@
                 'nf.PolicyManagement',
                 'nf.Processor',
                 'nf.ProcessGroup',
-                'nf.ProcessGroupConfiguration'],
-            function ($, Slick, d3, nfClient, nfDialog, nfStorage, nfCommon, nfCanvasUtils, nfNgBridge, nfErrorHandler, nfFilteredDialogCommon, nfShell, nfComponentState, nfComponentVersion, nfPolicyManagement, nfProcessor, nfProcessGroup, nfProcessGroupConfiguration) {
-                return (nf.ParameterContexts = factory($, Slick, d3, nfClient, nfDialog, nfStorage, nfCommon, nfCanvasUtils, nfNgBridge, nfErrorHandler, nfFilteredDialogCommon, nfShell, nfComponentState, nfComponentVersion, nfPolicyManagement, nfProcessor, nfProcessGroup, nfProcessGroupConfiguration));
+                'nf.ProcessGroupConfiguration',
+                'lodash-core'],
+            function ($, Slick, d3, nfClient, nfDialog, nfStorage, nfCommon, nfCanvasUtils, nfNgBridge, nfErrorHandler, nfFilteredDialogCommon, nfShell, nfComponentState, nfComponentVersion, nfPolicyManagement, nfProcessor, nfProcessGroup, nfProcessGroupConfiguration, _) {
+                return (nf.ParameterContexts = factory($, Slick, d3, nfClient, nfDialog, nfStorage, nfCommon, nfCanvasUtils, nfNgBridge, nfErrorHandler, nfFilteredDialogCommon, nfShell, nfComponentState, nfComponentVersion, nfPolicyManagement, nfProcessor, nfProcessGroup, nfProcessGroupConfiguration, _));
             });
     } else if (typeof exports === 'object' && typeof module === 'object') {
         module.exports = (nf.ParameterContexts =
@@ -59,7 +60,8 @@
                 require('nf.PolicyManagement'),
                 require('nf.Processor'),
                 require('nf.ProcessGroup'),
-                require('nf.ProcessGroupConfiguration')));
+                require('nf.ProcessGroupConfiguration'),
+                require('lodash-core')));
     } else {
         nf.ParameterContexts = factory(root.$,
             root.Slick,
@@ -78,9 +80,10 @@
             root.nf.PolicyManagement,
             root.nf.Processor,
             root.nf.ProcessGroup,
-            root.nf.ProcessGroupConfiguration);
+            root.nf.ProcessGroupConfiguration,
+            root._);
     }
-}(this, function ($, Slick, d3, nfClient, nfDialog, nfStorage, nfCommon, nfCanvasUtils, nfNgBridge, nfErrorHandler, nfFilteredDialogCommon, nfShell, nfComponentState, nfComponentVersion, nfPolicyManagement, nfProcessor, nfProcessGroup, nfProcessGroupConfiguration) {
+}(this, function ($, Slick, d3, nfClient, nfDialog, nfStorage, nfCommon, nfCanvasUtils, nfNgBridge, nfErrorHandler, nfFilteredDialogCommon, nfShell, nfComponentState, nfComponentVersion, nfPolicyManagement, nfProcessor, nfProcessGroup, nfProcessGroupConfiguration, _) {
     'use strict';
 
     var config = {
@@ -139,8 +142,10 @@
         // defines a function for sorting
         var comparer = function (a, b) {
             if (a.permissions.canRead && b.permissions.canRead) {
-                var aString = nfCommon.isDefinedAndNotNull(a.component[sortDetails.columnId]) ? a.component[sortDetails.columnId] : '';
-                var bString = nfCommon.isDefinedAndNotNull(b.component[sortDetails.columnId]) ? b.component[sortDetails.columnId] : '';
+
+                // use _.get to try to access the piece of the object you want, but provide a default value it it is not there
+                var aString = _.get(a, 'component[' +  sortDetails.columnId + ']', '');
+                var bString = _.get(b, 'component[' +  sortDetails.columnId + ']', '');
                 return aString === bString ? 0 : aString > bString ? 1 : -1;
             } else {
                 if (!a.permissions.canRead && !b.permissions.canRead) {
@@ -170,8 +175,8 @@
         // defines a function for sorting
         var comparer = function (a, b) {
             if (sortDetails.columnId === 'name') {
-                var aString = nfCommon.isDefinedAndNotNull(a[sortDetails.columnId]) ? a[sortDetails.columnId] : '';
-                var bString = nfCommon.isDefinedAndNotNull(b[sortDetails.columnId]) ? b[sortDetails.columnId] : '';
+                var aString = _.get(a, '[' +  sortDetails.columnId + ']', '');
+                var bString = _.get(b, '[' +  sortDetails.columnId + ']', '');
                 return aString === bString ? 0 : aString > bString ? 1 : -1;
             }
         };
@@ -752,139 +757,128 @@
         return a.component.name.localeCompare(b.component.name);
     };
 
-    var parameterKeyRegex = /^[a-zA-Z0-9-_. ]+$/;
-
     /**
      * Adds a new parameter.
      */
     var addNewParameter = function () {
-        var parameterName = $.trim($('#parameter-name').val());
+        var param = getParameterFromFieldValues();
 
-        // ensure the parameter name is specified
-        if (parameterName !== '' && parameterKeyRegex.test(parameterName)) {
-            var parameterGrid = $('#parameter-table').data('gridInstance');
-            var parameterData = parameterGrid.getData();
+        var parameterGrid = $('#parameter-table').data('gridInstance');
+        var parameterData = parameterGrid.getData();
 
-            // ensure the parameter name is unique
-            var matchingParameter = null;
-            $.each(parameterData.getItems(), function (_, item) {
-                if (parameterName === item.name) {
-                    matchingParameter = item;
-                    return false;
-                }
-            });
+        var isValid = validateParameter(param, parameterData.getItems());
 
-            var isSensitive = $('#parameter-dialog').find('input[name="sensitive"]:checked').val() === "sensitive" ? true : false;
-            var isChecked = $('#parameter-set-empty-string-field').hasClass('checkbox-checked');
+        if (isValid) {
 
-            if (matchingParameter === null) {
-                var parameter = {
-                    id: parameterCount,
-                    hidden: false,
-                    type: 'Parameter',
-                    sensitive: isSensitive,
-                    name: parameterName,
-                    description: $('#parameter-description-field').val(),
-                    previousValue: null,
-                    previousDescription: null,
-                    isEditable: true,
-                    isEmptyStringSet: isChecked,
-                    isModified: true,
-                    hasValueChanged: false,
-                    isNew: true
-                };
-
-                var value = $('#parameter-value-field').val();
-                if (!nfCommon.isBlank(value)) {
-                    parameter.value = value;
-                } else {
-                    if (isChecked) {
-                        parameter.value = '';
-                    } else {
-                        parameter.value = null;
-                    }
-                }
+            var parameter = _.extend({}, param, {
+                id: _.defaultTo(param.id, parameterCount),
+                hidden: false,
+                type: 'Parameter',
+                previousValue: null,
+                previousDescription: null,
+                isEditable: true,
+                isModified: true,
+                hasValueChanged: false,
+                isNew: true,
+            });
 
+            if (_.isNil(param.id)) {
                 // add a row for the new parameter
                 parameterData.addItem(parameter);
-
-                // sort the data
-                parameterData.reSort();
-
-                // select the new parameter row
-                var row = parameterData.getRowById(parameterCount);
-                parameterGrid.setActiveCell(row, parameterGrid.getColumnIndex('value'));
-                parameterCount++;
             } else {
-                // if this row is currently hidden, make sure the sensitivity is equivalent before we allow recreate
-                if (matchingParameter.hidden === true && matchingParameter.sensitive !== isSensitive) {
-                    nfDialog.showOkDialog({
-                        headerText: 'Parameter Exists',
-                        dialogContent: 'A parameter with this name has been marked for deletion. Please apply this change to delete this parameter from the parameter context before recreating it with a different sensitivity.'
-                    });
-                } else if (matchingParameter.hidden === true && matchingParameter.sensitive === isSensitive) {
-                    var parameter = $.extend(matchingParameter, {
-                        hidden: false,
-                        sensitive: isSensitive,
-                        previousValue: null,
-                        description: $('#parameter-description-field').val(),
-                        previousDescription: null,
-                        isEditable: true,
-                        isEmptyStringSet: isChecked,
-                        isModified: true,
-                        hasValueChanged: false,
-                        isNew: true
-                    });
+                parameterData.updateItem(param.id, parameter);
+            }
 
-                    var value = $('#parameter-value-field').val();
-                    if (!nfCommon.isBlank(value)) {
-                        parameter.value = value;
-                    } else {
-                        if (isChecked) {
-                            parameter.value = '';
-                        } else {
-                            parameter.value = null;
-                        }
-                    }
+            // sort the data
+            parameterData.reSort();
 
-                    parameterData.updateItem(matchingParameter.id, parameter);
+            // select the new parameter row
+            var row = parameterData.getRowById(parameterCount);
+            parameterGrid.setActiveCell(row, parameterGrid.getColumnIndex('value'));
+            parameterCount++;
 
-                    // sort the data
-                    parameterData.reSort();
+            // close the new parameter dialog
+            $('#parameter-dialog').modal('hide');
 
-                    // select the new parameter row
-                    var row = parameterData.getRowById(matchingParameter.id);
-                    parameterGrid.setActiveCell(row, parameterGrid.getColumnIndex('value'));
-                    parameterCount++;
-                } else {
-                    nfDialog.showOkDialog({
-                        headerText: 'Parameter Exists',
-                        dialogContent: 'A parameter with this name already exists.'
-                    });
+        }
 
-                    // select the existing properties row
-                    var matchingRow = parameterData.getRowById(matchingParameter.id);
-                    parameterGrid.setSelectedRows([matchingRow]);
-                    parameterGrid.scrollRowIntoView(matchingRow);
-                }
-            }
+        // update the buttons to possibly trigger the disabled state
+        $('#parameter-context-dialog').modal('refreshButtons');
+    };
 
-            // close the new parameter dialog
-            $('#parameter-dialog').modal('hide');
+    /**
+     * Builds a parameter object from the user-entered parameter inputs
+     *
+     * @return {{isEmptyStringSet: *, name: *, description: *, sensitive: *, value: *}}
+     */
+    var getParameterFromFieldValues = function () {
+        var name = $.trim($('#parameter-name').val());
+        var value = $('#parameter-value-field').val();
+        var description = $('#parameter-description-field').val();
+        var isSensitive = $('#parameter-dialog').find('input[name="sensitive"]:checked').val() === 'sensitive' ? true : false;
+        var isEmptyStringSet = $('#parameter-set-empty-string-field').hasClass('checkbox-checked');
+
+        if (_.isEmpty(value)) {
+            value = isEmptyStringSet ? '' : null;
+        }
 
-            // update the buttons to possibly trigger the disabled state
-            $('#parameter-context-dialog').modal('refreshButtons');
+        return {
+            name,
+            value,
+            description,
+            sensitive: isSensitive,
+            isEmptyStringSet
+        }
+    };
 
-        } else if (!parameterKeyRegex.test(parameterName)) {
+    /**
+     * Checks the validity of a parameter
+     * @param parameter Parameter to validate
+     * @param existingParameters Existing parameters to verify there are no duplicates
+     * @return {boolean}
+     */
+    var validateParameter = function (parameter, existingParameters) {
+        if (parameter.name === '') {
             nfDialog.showOkDialog({
                 headerText: 'Configuration Error',
-                dialogContent: 'This parameter appears to have an invalid character or characters. Only alpha-numeric characters (a-z, A-Z, 0-9), hyphens (-), underscores (_), periods (.), and spaces ( ) are accepted.'
+                dialogContent: 'The name of the parameter must be specified.'
             });
-        } else {
+            return false;
+        }
+
+        // make sure the parameter name does not use any unsupported characters
+        var parameterNameRegex = /^[a-zA-Z0-9-_. ]+$/;
+        if (!parameterNameRegex.test(parameter.name)) {
             nfDialog.showOkDialog({
                 headerText: 'Configuration Error',
-                dialogContent: 'The name of the parameter must be specified.'
+                dialogContent: 'The name of the parameter appears to have an invalid character or characters. Only alpha-numeric characters (a-z, A-Z, 0-9), hyphens (-), underscores (_), periods (.), and spaces ( ) are accepted.'
             });
+            return false;
+        }
+
+        // validate the parameter is not a duplicate
+        var matchingParameter = _.find(existingParameters, { name: parameter.name });
+
+        if (_.isNil(matchingParameter)) {
+            return true;
+        } else {
+            var matchingParamIsHidden = _.get(matchingParameter, 'hidden', false);
+            if (matchingParamIsHidden && matchingParameter.sensitive !== parameter.sensitive) {
+                nfDialog.showOkDialog({
+                    headerText: 'Parameter Exists',
+                    dialogContent: 'A parameter with this name has been marked for deletion. Please apply this change to delete this parameter from the parameter context before recreating it with a different sensitivity.'
+                });
+            } else if (matchingParamIsHidden && matchingParameter.sensitive === parameter.sensitive) {
+                // set the id of the parameter that was found. It could be used to update it.
+                parameter.id = matchingParameter.id;
+                return true;
+            } else {
+                nfDialog.showOkDialog({
+                    headerText: 'Parameter Exists',
+                    dialogContent: 'A parameter with this name already exists.'
+                });
+            }
+            return false;
         }
     };
 
@@ -1856,6 +1850,50 @@
         initParameterTable();
     };
 
+    var openAddParameterDialog = function ({ onApply, onCancel }) {
+        $('#parameter-dialog')
+            .modal('setHeaderText', 'Add Parameter')
+            .modal('setButtonModel', [{
+                buttonText: 'Apply',
+                color: {
+                    base: '#728E9B',
+                    hover: '#004849',
+                    text: '#ffffff'
+                },
+                disabled: function () {
+                    var parameterName = $('#parameter-name').val();
+                    var parameterValue = $('#parameter-value-field').val();
+                    var isEmptyString = $('#parameter-dialog').find('.nf-checkbox').hasClass('checkbox-checked');
+                    var isUpdatingParameterContext = $('#parameter-context-updating-status').hasClass('show-status');
+
+                    if (isUpdatingParameterContext) {
+                        return true;
+                    }
+
+                    if ((parameterName !== '' && parameterValue !== '') || (parameterName !== '' && isEmptyString)) {
+                        return false;
+                    }
+                    return true;
+                },
+                handler: {
+                    click: onApply
+                }
+            }, {
+                buttonText: 'Cancel',
+                color: {
+                    base: '#E3E8EB',
+                    hover: '#C7D2D7',
+                    text: '#004849'
+                },
+                handler: {
+                    click: onCancel
+                }
+            }])
+            .modal('show');
+
+        $('#parameter-dialog').modal('show');
+    };
+
     /**
      * Loads the parameter contexts.
      */
@@ -2298,6 +2336,178 @@
                 var parameterContextData = parameterContextGrid.getData();
                 parameterContextData.deleteItem(parameterContextEntity.id);
             }).fail(nfErrorHandler.handleAjaxError);
+        },
+
+        /**
+         * Converts a property in to a parameter and adds the parameter to the current parameter context.
+         * @param property              property to convert
+         * @param propertyDescriptor    property descriptor for the property bering converted
+         * @param parameterContextId    id of the current parameter context
+         * @return Promise              A Promise that resolves with the added parameter
+         */
+        convertPropertyToParameter: function (property, propertyDescriptor, parameterContextId) {
+            return $.Deferred(function (deferred) {
+
+                if (_.isNil(parameterContextId)) {
+                    nfDialog.showOkDialog({
+                        headerText: 'Unable to Convert Property',
+                        dialogContent: 'There is no parameter context set for the current process group.'
+                    });
+
+                    deferred.reject();
+                }
+
+                var getContext = $.ajax({
+                    type: 'GET',
+                    url: config.urls.parameterContexts + '/' + encodeURIComponent(parameterContextId),
+                    dataType: 'json'
+                });
+
+                // get the parameter context, show the dialog
+                getContext
+                    .done(function (parameterContextEntity) {
+                        var showUpdateStatus = function (isOn) {
+                            if (isOn) {
+                                // show the status message
+                                $('#parameter-context-updating-status').addClass('show-status');
+
+                                // disable the apply button
+                                $('#parameter-dialog').modal('refreshButtons');
+                            } else {
+                                $('#parameter-context-updating-status').removeClass('show-status');
+
+                                // possibly re-enable the apply button
+                                $('#parameter-dialog').modal('refreshButtons');
+                            }
+                        };
+
+                        var requestId;
+                        var updateTimeoutReference;
+
+                        openAddParameterDialog({
+                            onApply: function () {
+                                showUpdateStatus(true);
+
+                                var existingParameters = parameterContextEntity.component.parameters.map(function(p) { return p.parameter });
+                                var parameter = getParameterFromFieldValues();
+
+                                var isValid = validateParameter(parameter, existingParameters);
+
+                                if (!isValid) {
+                                    // Do not resolve or reject here. Give the user the chance to fix the issue.
+                                    showUpdateStatus(false);
+                                    return;
+                                }
+
+                                // only adding a new parameter, just put the new one in the list for the update
+                                parameterContextEntity.component.parameters = [{
+                                    parameter: {
+                                        name: parameter.name,
+                                        value: parameter.value,
+                                        sensitive: parameter.sensitive,
+                                        description: parameter.description
+                                    }}];
+
+                                requestId = null;
+
+                                // initiate the parameter context update with the new parameter
+                                submitUpdateRequest(parameterContextEntity)
+                                    .done(function(response) {
+                                        var pollUpdateRequest = function (updateRequestEntity) {
+                                            var updateRequest = updateRequestEntity.request;
+                                            var errored = !_.isEmpty(updateRequest.failureReason);
+
+                                            // get the request id
+                                            requestId = updateRequest.requestId;
+
+                                            if (updateRequest.complete === true) {
+                                                showUpdateStatus(false);
+
+                                                if (errored) {
+                                                    nfDialog.showOkDialog({
+                                                        headerText: 'Parameter Context Update Error',
+                                                        dialogContent: 'Unable to complete parameter context update request: ' + nfCommon.escapeHtml(updateRequest.failureReason)
+                                                    });
+                                                    // update failed, therefore converting failed. reject the promise for the caller
+                                                    deferred.reject();
+                                                } else {
+                                                    // resolve the promise for the caller if the update was successful
+                                                    deferred.resolve(parameter);
+                                                }
+
+                                                // delete the update request
+                                                deleteUpdateRequest(parameterContextEntity.id, requestId);
+
+                                                // hide the param dialog
+                                                $('#parameter-dialog').modal('hide');
+
+                                            } else {
+                                                // wait to get an updated status
+                                                updateTimeoutReference = setTimeout(function () {
+                                                    getUpdateRequest(parameterContextEntity.id, requestId)
+                                                        .done(function (getResponse) {
+                                                            pollUpdateRequest(getResponse);
+                                                        })
+                                                        .fail(function (e) {
+                                                            if (!_.isNil(parameterContextEntity.id) && !_.isNil(requestId)) {
+                                                                deleteUpdateRequest(parameterContextEntity.id, requestId);
+                                                            }
+                                                            deferred.reject(e)
+                                                        });
+                                                }, 1000);
+                                            }
+                                        };
+
+                                        pollUpdateRequest(response);
+                                    })
+                                    .fail(function (e) {
+                                        deferred.reject(e)
+                                    });
+                            },
+                            onCancel: function() {
+                                showUpdateStatus(false);
+
+                                if (!_.isNil(parameterContextEntity.id) && !_.isNil(requestId)) {
+                                    deleteUpdateRequest(parameterContextEntity.id, requestId);
+                                    requestId = null;
+                                    if (!_.isNil(updateTimeoutReference)) {
+                                        clearTimeout(updateTimeoutReference);
+                                    }
+                                }
+
+                                // hide the dialog
+                                $(this).modal('hide');
+                            }
+                        });
+
+                        // set the values of the form from the passed in property
+                        $('#parameter-name').val(property.displayName);
+                        $('#parameter-name').prop('disabled', false);
+                        $('#parameter-sensitive-radio-button').prop('disabled', true);
+                        $('#parameter-not-sensitive-radio-button').prop('disabled', true);
+                        if (property.value === '') {
+                            $('#parameter-dialog').find('.nf-checkbox').removeClass('checkbox-unchecked').addClass('checkbox-checked');
+                        } else {
+                            $('#parameter-dialog').find('.nf-checkbox').removeClass('checkbox-checked').addClass('checkbox-unchecked');
+                        }
+
+                        if (nfCommon.isSensitiveProperty(propertyDescriptor)) {
+                            $('#parameter-sensitive-radio-button').prop('checked', true);
+                            $('#parameter-not-sensitive-radio-button').prop('checked', false);
+                        } else {
+                            $('#parameter-sensitive-radio-button').prop('checked', false);
+                            $('#parameter-not-sensitive-radio-button').prop('checked', true);
+                            $('#parameter-value-field').val(property.value);
+                        }
+                        $('#parameter-description-field').val(property.description);
+
+                        // update the buttons to possibly trigger the disabled state
+                        $('#parameter-dialog').modal('refreshButtons');
+                    })
+                    .fail(function(e) {
+                        deferred.reject(e);
+                    });
+            }).promise();
         }
     };
 
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 aaa45f4..90cd05f 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
@@ -659,7 +659,11 @@
                         }
                     }).promise();
                 },
-                goToServiceDeferred: goToServiceFromProperty
+                goToServiceDeferred: goToServiceFromProperty,
+                getParameterContextId: function (groupId) {
+                    // processors being configured must be in the current group
+                    return nfCanvasUtils.getParameterContextId();
+                }
             });
         },
 


[nifi] 11/12: NIFI-6506 - better empty-string/null handling for edit parameters

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 3c918e25bd08d9dea4dc3c92e7a410839045ed92
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Wed Sep 4 15:11:24 2019 -0400

    NIFI-6506 - better empty-string/null handling for edit parameters
---
 .../nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index 99a2e70..63f3da8 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -927,6 +927,10 @@
         var serializedValue;
 
         var value = input.val();
+        if (!isChecked && _.isEmpty(value)) {
+            value = null;
+        }
+
         var hasChanged = parameter.value !== value;
 
         if (!nfCommon.isBlank(value)) {


[nifi] 02/12: NIFI-6506 - Fix syntax/style issues. Apply same logic for disabled state when converting prop to param.

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit f3a04521c2cb37c1bc03a0c458e90889b43a9878
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Tue Sep 3 08:54:29 2019 -0400

    NIFI-6506 - Fix syntax/style issues. Apply same logic for disabled state when converting prop to param.
---
 .../webapp/js/nf/canvas/nf-parameter-contexts.js   | 32 +++++++++++++++-------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index ec617aa..e3eac2c 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -823,11 +823,11 @@
         }
 
         return {
-            name,
-            value,
-            description,
+            name: name,
+            value: value,
+            description: description,
             sensitive: isSensitive,
-            isEmptyStringSet
+            isEmptyStringSet: isEmptyStringSet
         }
     };
 
@@ -1850,7 +1850,21 @@
         initParameterTable();
     };
 
-    var openAddParameterDialog = function ({ onApply, onCancel }) {
+    /**
+     * Opens the Add Parameter Dialog.
+     * @param {Object} callbacks object with callbacks for handling the cancel and apply button functionality:
+     *
+     * @example
+     * openAddParameterDialog({
+     *     onApply: function () {
+     *         // handle the apply button being clicked
+     *     },
+     *     onCancel: function() {
+     *         // handle the cancel button being clicked
+     *     }
+     * });
+     */
+    var openAddParameterDialog = function (callbacks) {
         $('#parameter-dialog')
             .modal('setHeaderText', 'Add Parameter')
             .modal('setButtonModel', [{
@@ -1862,21 +1876,19 @@
                 },
                 disabled: function () {
                     var parameterName = $('#parameter-name').val();
-                    var parameterValue = $('#parameter-value-field').val();
-                    var isEmptyString = $('#parameter-dialog').find('.nf-checkbox').hasClass('checkbox-checked');
                     var isUpdatingParameterContext = $('#parameter-context-updating-status').hasClass('show-status');
 
                     if (isUpdatingParameterContext) {
                         return true;
                     }
 
-                    if ((parameterName !== '' && parameterValue !== '') || (parameterName !== '' && isEmptyString)) {
+                    if (parameterName !== '') {
                         return false;
                     }
                     return true;
                 },
                 handler: {
-                    click: onApply
+                    click: callbacks.onApply
                 }
             }, {
                 buttonText: 'Cancel',
@@ -1886,7 +1898,7 @@
                     text: '#004849'
                 },
                 handler: {
-                    click: onCancel
+                    click: callbacks.onCancel
                 }
             }])
             .modal('show');


[nifi] 06/12: NIFI-6506 - navigate to process group when selecting to go to controller service from referencing components on parameter context dialog.

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5936fe34877ca1a5730b7f7fe5fda6cd16ff9213
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Wed Sep 4 09:34:41 2019 -0400

    NIFI-6506 - navigate to process group when selecting to go to controller service from referencing components on parameter context dialog.
---
 .../nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js   | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index 083138e..fdafdfb 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -439,6 +439,8 @@
                 // close the shell
                 $('#shell-dialog').modal('hide');
 
+                nfProcessGroup.enterGroup(referencingControllerService.processGroupId);
+
                 // show the component in question
                 nfProcessGroupConfiguration.showConfiguration(referencingControllerService.processGroupId).done(function () {
                     nfProcessGroupConfiguration.selectControllerService(referencingControllerService.id);


[nifi] 04/12: NIFI-6506 - review feedback * fixed issues converting sensitive props to parameters * only include parameter value if it has changed (even for non-sensitive params) * do not allow null parameter values when editing parameters.

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 10b4f6fd89cfb7f996a9ab1258eee7c8e00f6a8a
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Tue Sep 3 16:57:47 2019 -0400

    NIFI-6506 - review feedback
    * fixed issues converting sensitive props to parameters
    * only include parameter value if it has changed (even for non-sensitive params)
    * do not allow null parameter values when editing parameters.
---
 .../jquery/propertytable/jquery.propertytable.js   |  9 +++--
 .../webapp/js/nf/canvas/nf-parameter-contexts.js   | 47 +++++++++++++++-------
 2 files changed, 37 insertions(+), 19 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 7709824..c4050d6 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
@@ -1578,15 +1578,16 @@
 
                     if (options.readOnly !== true && !_.isNil(parameterContextId)) {
                         var descriptors = table.data('descriptors');
-                        var propertyDescriptor = descriptors[property.displayName];
+                        var propertyDescriptor = descriptors[property.property];
 
                         nfParameterContexts.convertPropertyToParameter(property, propertyDescriptor, parameterContextId)
                             .done(function (parameter) {
-                                // set the property value to the reference the parameter that was created
-                                propertyData.updateItem(property.id, $.extend(property, {
+                                var updatedItem = _.extend({}, property, {
                                     previousValue: property.value,
                                     value: '#{' + parameter.name + '}'
-                                }));
+                                });
+                                // set the property value to the reference the parameter that was created
+                                propertyData.updateItem(property.id, updatedItem);
                             });
                     }
                 }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index 49aa47e..3fdc7f0 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -814,12 +814,23 @@
      */
     var serializeParameter = function (originalParameter) {
         var name = $.trim($('#parameter-name').val());
+        var value = $('#parameter-value-field').val();
         var isEmptyStringSet = $('#parameter-set-empty-string-field').hasClass('checkbox-checked');
-
-        var serializedValue = serializeValue($('#parameter-value-field'), originalParameter, isEmptyStringSet);
         var description = $('#parameter-description-field').val();
         var isSensitive = $('#parameter-dialog').find('input[name="sensitive"]:checked').val() === 'sensitive' ? true : false;
 
+        var parameter = {
+            name: name,
+            value: value,
+            description: description,
+            sensitive: isSensitive,
+            isEmptyStringSet: isEmptyStringSet,
+            previousValue: null,
+            isNew: true
+        };
+
+        var serializedValue = serializeValue($('#parameter-value-field'), _.isNil(originalParameter) ? parameter : originalParameter, isEmptyStringSet);
+
         return {
             name: name,
             value: serializedValue.value,
@@ -859,6 +870,14 @@
         // validate the parameter is not a duplicate
         var matchingParameter = _.find(existingParameters, { name: parameter.name });
 
+        // If in edit mode, the value can not be null
+        if (editMode === true && _.isNil(parameter.value)) {
+            nfDialog.showOkDialog({
+                headerText: 'Configuration Error',
+                dialogContent: 'The value of the parameter must be specified.'
+            });
+        }
+
         // Valid if no duplicate is found or it is edit mode and a matching parameter was found
         if (_.isNil(matchingParameter) || (editMode === true && !_.isNil(matchingParameter))) {
             return true;
@@ -885,7 +904,7 @@
 
     var serializeValue = function (input, parameter, isChecked) {
         var serializedValue;
-        var hasChanged = true;
+        var hasChanged = parameter.value !== parameter.previousValue;
 
         var value = input.val();
         if (!nfCommon.isBlank(value)) {
@@ -938,7 +957,7 @@
                 isEmptyStringSet: serializedParam.isEmptyStringSet,
                 isNew: originalParameter.isNew,
                 hasValueChanged: serializedParam.hasValueChanged,
-                isModified: serializedParam.value !== originalParameter.value || serializedParam.description !== originalParameter.description
+                isModified: serializedParam.hasValueChanged || serializedParam.description !== originalParameter.description
             });
 
             // update row for the parameter
@@ -1013,10 +1032,11 @@
                         text: '#ffffff'
                     },
                     disabled: function () {
-                        if ($('#parameter-context-name').val() !== '') {
-                            return false;
+                        var param = serializeParameter();
+                        if (_.isEmpty(param.name) || (_.isNil(param.value) && !param.isEmptyStringSet)) {
+                            return true;
                         }
-                        return true;
+                        return false;
                     },
                     handler: {
                         click: function () {
@@ -1400,7 +1420,7 @@
                 return '<span class="table-cell sensitive">Sensitive value set</span>';
             } else if (value === '') {
                 return '<span class="table-cell blank">Empty string set</span>';
-            } else if (nfCommon.isNull(value)) {
+            } else if (_.isNil(value)) {
                 return '<span class="unset">No value set</span>';
             } else {
                 return nfCommon.escapeHtml(value);
@@ -1576,7 +1596,7 @@
                             },
                             disabled: function () {
                                 var param = serializeParameter(parameter);
-                                return param.value === parameter.value && param.description === parameter.description;
+                                return !param.hasValueChanged && param.description === parameter.description;
                             },
                             handler: {
                                 click: function () {
@@ -1849,14 +1869,10 @@
                     var param = serializeParameter();
                     var isUpdatingParameterContext = $('#parameter-context-updating-status').hasClass('show-status');
 
-                    if (isUpdatingParameterContext) {
+                    if (isUpdatingParameterContext || _.isEmpty(param.name)) {
                         return true;
                     }
-
-                    if (param.name !== '') {
-                        return false;
-                    }
-                    return true;
+                    return false;
                 },
                 handler: {
                     click: callbacks.onApply
@@ -2477,6 +2493,7 @@
                         if (nfCommon.isSensitiveProperty(propertyDescriptor)) {
                             $('#parameter-sensitive-radio-button').prop('checked', true);
                             $('#parameter-not-sensitive-radio-button').prop('checked', false);
+                            $('#parameter-value-field').val(null);
                         } else {
                             $('#parameter-sensitive-radio-button').prop('checked', false);
                             $('#parameter-not-sensitive-radio-button').prop('checked', true);


[nifi] 03/12: NIFI-6505 - Addressing review feedback: reuse single method for getting parameter field values.

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit aa07378a0322ca314524154066dc552739adbae5
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Tue Sep 3 12:31:03 2019 -0400

    NIFI-6505 - Addressing review feedback: reuse single method for getting parameter field values.
---
 .../webapp/js/nf/canvas/nf-parameter-contexts.js   | 141 ++++++++-------------
 1 file changed, 56 insertions(+), 85 deletions(-)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index e3eac2c..49aa47e 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -761,7 +761,7 @@
      * Adds a new parameter.
      */
     var addNewParameter = function () {
-        var param = getParameterFromFieldValues();
+        var param = serializeParameter();
 
         var parameterGrid = $('#parameter-table').data('gridInstance');
         var parameterData = parameterGrid.getData();
@@ -809,25 +809,24 @@
     /**
      * Builds a parameter object from the user-entered parameter inputs
      *
+     * @param originalParameter Optional parameter to compare value against to determine if it has changed
      * @return {{isEmptyStringSet: *, name: *, description: *, sensitive: *, value: *}}
      */
-    var getParameterFromFieldValues = function () {
+    var serializeParameter = function (originalParameter) {
         var name = $.trim($('#parameter-name').val());
-        var value = $('#parameter-value-field').val();
-        var description = $('#parameter-description-field').val();
-        var isSensitive = $('#parameter-dialog').find('input[name="sensitive"]:checked').val() === 'sensitive' ? true : false;
         var isEmptyStringSet = $('#parameter-set-empty-string-field').hasClass('checkbox-checked');
 
-        if (_.isEmpty(value)) {
-            value = isEmptyStringSet ? '' : null;
-        }
+        var serializedValue = serializeValue($('#parameter-value-field'), originalParameter, isEmptyStringSet);
+        var description = $('#parameter-description-field').val();
+        var isSensitive = $('#parameter-dialog').find('input[name="sensitive"]:checked').val() === 'sensitive' ? true : false;
 
         return {
             name: name,
-            value: value,
+            value: serializedValue.value,
             description: description,
             sensitive: isSensitive,
-            isEmptyStringSet: isEmptyStringSet
+            isEmptyStringSet: isEmptyStringSet,
+            hasValueChanged: serializedValue.hasChanged
         }
     };
 
@@ -835,9 +834,10 @@
      * Checks the validity of a parameter
      * @param parameter Parameter to validate
      * @param existingParameters Existing parameters to verify there are no duplicates
+     * @param editMode boolean indicating if validation should account for editing an existing parameter
      * @return {boolean}
      */
-    var validateParameter = function (parameter, existingParameters) {
+    var validateParameter = function (parameter, existingParameters, editMode) {
         if (parameter.name === '') {
             nfDialog.showOkDialog({
                 headerText: 'Configuration Error',
@@ -859,7 +859,8 @@
         // validate the parameter is not a duplicate
         var matchingParameter = _.find(existingParameters, { name: parameter.name });
 
-        if (_.isNil(matchingParameter)) {
+        // Valid if no duplicate is found or it is edit mode and a matching parameter was found
+        if (_.isNil(matchingParameter) || (editMode === true && !_.isNil(matchingParameter))) {
             return true;
         } else {
             var matchingParamIsHidden = _.get(matchingParameter, 'hidden', false);
@@ -889,7 +890,7 @@
         var value = input.val();
         if (!nfCommon.isBlank(value)) {
             // if the value is sensitive and the user has not made a change
-            if (parameter.sensitive === true && input.hasClass('sensitive') && parameter.isNew === false) {
+            if (!_.isEmpty(parameter) && parameter.sensitive === true && input.hasClass('sensitive') && parameter.isNew === false) {
                 serializedValue = parameter.previousValue;
                 hasChanged = false;
             } else {
@@ -912,77 +913,53 @@
 
     /**
      * Update a parameter.
+     *
+     * @param originalParameter that is being edited
      */
-    var updateParameter = function () {
-        var parameterName = $('#parameter-name').val();
+    var updateParameter = function (originalParameter) {
+        var serializedParam = serializeParameter(originalParameter);
+        var parameterGrid = $('#parameter-table').data('gridInstance');
+        var parameterData = parameterGrid.getData();
 
-        // ensure the parameter name is specified
-        if (parameterName !== '') {
-            var parameterGrid = $('#parameter-table').data('gridInstance');
-            var parameterData = parameterGrid.getData();
+        var isValid = validateParameter(serializedParam, parameterData.getItems(), true);
 
-            // ensure the parameter name is unique
-            var matchingParameter = null;
-            $.each(parameterData.getItems(), function (_, item) {
-                if (parameterName === item.name) {
-                    matchingParameter = item;
-                    return false;
-                }
+        if (isValid) {
+            var parameter = _.extend({}, originalParameter, {
+                id: originalParameter.id,
+                hidden: false,
+                type: 'Parameter',
+                sensitive: originalParameter.sensitive,
+                name: originalParameter.name,
+                description: serializedParam.description,
+                referencingComponents: originalParameter.referencingComponents,
+                previousValue: originalParameter.value,
+                previousDescription: originalParameter.description,
+                isEditable: originalParameter.isEditable,
+                isEmptyStringSet: serializedParam.isEmptyStringSet,
+                isNew: originalParameter.isNew,
+                hasValueChanged: serializedParam.hasValueChanged,
+                isModified: serializedParam.value !== originalParameter.value || serializedParam.description !== originalParameter.description
             });
 
-            if (matchingParameter !== null) {
-                var isChecked = $('#parameter-set-empty-string-field').hasClass('checkbox-checked');
-
-                var parameter = {
-                    id: matchingParameter.id,
-                    hidden: false,
-                    type: 'Parameter',
-                    sensitive: matchingParameter.sensitive,
-                    name: parameterName,
-                    description: $('#parameter-description-field').val(),
-                    referencingComponents: matchingParameter.referencingComponents,
-                    previousValue: matchingParameter.value,
-                    previousDescription: matchingParameter.description,
-                    isEditable: matchingParameter.isEditable,
-                    isEmptyStringSet: isChecked,
-                    isNew: matchingParameter.isNew
-                };
-
-                var input = $('#parameter-value-field');
-                var serializedValue = serializeValue(input, parameter, isChecked);
-                parameter.value = serializedValue.value;
-                parameter.isModified = serializedValue.hasChanged || parameter.description !== parameter.previousDescription;
-                parameter.hasValueChanged = serializedValue.hasChanged;
-
-                // update row for the parameter
-                parameterData.updateItem(matchingParameter.id, parameter);
+            // update row for the parameter
+            parameterData.updateItem(originalParameter.id, parameter);
 
-                // sort the data
-                parameterData.reSort();
+            // sort the data
+            parameterData.reSort();
 
-                // select the parameter row
-                var row = parameterData.getRowById(matchingParameter.id);
-                parameterGrid.setActiveCell(row, parameterGrid.getColumnIndex('value'));
-            } else {
-                nfDialog.showOkDialog({
-                    headerText: 'Parameter Does Not Exists',
-                    dialogContent: 'A parameter with this name does not exist.'
-                });
-            }
+            // select the parameter row
+            var row = parameterData.getRowById(originalParameter.id);
+            parameterGrid.setActiveCell(row, parameterGrid.getColumnIndex('value'));
 
             // close the new parameter dialog
             $('#parameter-dialog').modal('hide');
-
-            // update the buttons to possibly trigger the disabled state
-            $('#parameter-context-dialog').modal('refreshButtons');
-        } else {
-            nfDialog.showOkDialog({
-                headerText: 'Create Parameter Error',
-                dialogContent: 'The name of the parameter must be specified.'
-            });
         }
+
+        // update the buttons to possibly trigger the disabled state
+        $('#parameter-context-dialog').modal('refreshButtons');
     };
 
+
     /**
      * Updates parameter contexts by issuing an update request and polling until it's completion.
      *
@@ -1598,19 +1575,12 @@
                                 text: '#ffffff'
                             },
                             disabled: function () {
-                                var input = $('#parameter-value-field');
-                                var isChecked = $('#parameter-set-empty-string-field').hasClass('checkbox-checked');
-                                var serializedValue = serializeValue(input, parameter, isChecked);
-
-                                var description = $('#parameter-description-field').val();
-
-                                var hasChanged = serializedValue.hasChanged || description !== parameter.previousDescription;
-
-                                return !hasChanged;
+                                var param = serializeParameter(parameter);
+                                return param.value === parameter.value && param.description === parameter.description;
                             },
                             handler: {
                                 click: function () {
-                                    updateParameter();
+                                    updateParameter(parameter);
                                 }
                             }
                         }, {
@@ -1796,7 +1766,8 @@
                         text: '#ffffff'
                     },
                     disabled: function () {
-                        if ($('#parameter-name').val() !== '') {
+                        var param = serializeParameter();
+                        if (param.name !== '') {
                             return false;
                         }
                         return true;
@@ -1875,14 +1846,14 @@
                     text: '#ffffff'
                 },
                 disabled: function () {
-                    var parameterName = $('#parameter-name').val();
+                    var param = serializeParameter();
                     var isUpdatingParameterContext = $('#parameter-context-updating-status').hasClass('show-status');
 
                     if (isUpdatingParameterContext) {
                         return true;
                     }
 
-                    if (parameterName !== '') {
+                    if (param.name !== '') {
                         return false;
                     }
                     return true;
@@ -2401,7 +2372,7 @@
                                 showUpdateStatus(true);
 
                                 var existingParameters = parameterContextEntity.component.parameters.map(function(p) { return p.parameter });
-                                var parameter = getParameterFromFieldValues();
+                                var parameter = serializeParameter();
 
                                 var isValid = validateParameter(parameter, existingParameters);
 


[nifi] 12/12: NIFI-6506 - don't show 'Sensitive value set' for null, sensitive params'

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit fa8a4462e73a7ef417b23644edb9629f2955c0b0
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Thu Sep 5 10:33:39 2019 -0400

    NIFI-6506 - don't show 'Sensitive value set' for null, sensitive params'
    
    This closes #3683
    
    Signed-off-by: Scott Aslan <sc...@gmail.com>
---
 .../webapp/js/nf/canvas/nf-parameter-contexts.js     | 20 ++++++++++++++------
 1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index 63f3da8..f2a73c4 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -1443,7 +1443,7 @@
         };
 
         var valueFormatter = function (row, cell, value, columnDef, dataContext) {
-            if (dataContext.sensitive === true) {
+            if (dataContext.sensitive === true && !_.isNil(value)) {
                 return '<span class="table-cell sensitive">Sensitive value set</span>';
             } else if (value === '') {
                 return '<span class="table-cell blank">Empty string set</span>';
@@ -1532,10 +1532,16 @@
 
                 // determine the desired action
                 if (target.hasClass('delete-parameter')) {
-                    // mark the property in question for removal and refresh the table
-                    parameterData.updateItem(parameter.id, $.extend(parameter, {
-                        hidden: true
-                    }));
+                    if (!parameter.isNew) {
+                        // mark the parameter in question for removal and refresh the table
+                        parameterData.updateItem(parameter.id, $.extend(parameter, {
+                            hidden: true
+                        }));
+                    } else {
+                        // remove the parameter from the table
+                        parameterData.deleteItem(parameter.id);
+                    }
+
 
                     // reset the selection if necessary
                     var selectedRows = parametersGrid.getSelectedRows();
@@ -1598,7 +1604,9 @@
                         if (parameter.sensitive) {
                             $('#parameter-sensitive-radio-button').prop('checked', true);
                             $('#parameter-not-sensitive-radio-button').prop('checked', false);
-                            $('#parameter-value-field').addClass('sensitive').val(nfCommon.config.sensitiveText).select();
+                            if (!_.isNil(parameter.value)) {
+                                $('#parameter-value-field').addClass('sensitive').val(nfCommon.config.sensitiveText).select();
+                            }
                         } else {
                             $('#parameter-sensitive-radio-button').prop('checked', false);
                             $('#parameter-not-sensitive-radio-button').prop('checked', true);


[nifi] 08/12: NIFI-6506 - update parameter context list after successful update.

Posted by sc...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 183ece194e1ca6957981f8521a5d6813f1310f4e
Author: Rob Fellows <ro...@gmail.com>
AuthorDate: Wed Sep 4 11:03:58 2019 -0400

    NIFI-6506 - update parameter context list after successful update.
---
 .../nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
index d9aadf0..d7429f7 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-parameter-contexts.js
@@ -1183,7 +1183,7 @@
                                     component: updateRequestEntity.request.parameterContext
                                 });
 
-                                var item = parameterContextData.getItem(parameterContextEntity.id);
+                                var item = parameterContextData.getItemById(parameterContextEntity.component.id);
                                 if (nfCommon.isDefinedAndNotNull(item)) {
                                     parameterContextData.updateItem(parameterContextEntity.id, parameterContextEntity);
                                 }