mirror of https://github.com/apache/nifi.git
NIFI-9288:
- Allowing the user to submit a verification request for Processors, Controller Services, and Reporting Tasks. - Tracking progress of verification requests. - Showing the verification results. NIFI-9288: - Fixing class name which prevented styles from being applied. NIFI-9288: - Ensuring that previously entered referenced attribute values take precedence. NIFI-9288: - Positioning the property listing and verification results based on percentages instead of fixed values. - Removing the additional dialog height. NIFI-9288: - Allowing attribute value entry to be skipped when appropriate. NIFI-9288: - Working around an issue caused by css minification. NIFI-9288: - Adding some padding to the verifying progress dialog. This closes #5461 Signed-off-by: Scott Aslan <scottyaslan@gmail.com>
This commit is contained in:
parent
8e1b762998
commit
1bec905890
|
@ -501,6 +501,7 @@
|
||||||
<include>${staging.dir}/js/nf/canvas/nf-canvas-utils.js</include>
|
<include>${staging.dir}/js/nf/canvas/nf-canvas-utils.js</include>
|
||||||
<include>${staging.dir}/js/nf/canvas/nf-go-to.js</include>
|
<include>${staging.dir}/js/nf/canvas/nf-go-to.js</include>
|
||||||
<include>${staging.dir}/js/nf/canvas/nf-snippet.js</include>
|
<include>${staging.dir}/js/nf/canvas/nf-snippet.js</include>
|
||||||
|
<include>${staging.dir}/js/nf/canvas/nf-verify.js</include>
|
||||||
<include>${staging.dir}/js/nf/canvas/nf-connection.js</include>
|
<include>${staging.dir}/js/nf/canvas/nf-connection.js</include>
|
||||||
<include>${staging.dir}/js/nf/canvas/nf-funnel.js</include>
|
<include>${staging.dir}/js/nf/canvas/nf-funnel.js</include>
|
||||||
<include>${staging.dir}/js/nf/canvas/nf-label.js</include>
|
<include>${staging.dir}/js/nf/canvas/nf-label.js</include>
|
||||||
|
|
|
@ -31,6 +31,7 @@ nf.canvas.script.tags=<script type="text/javascript" src="js/nf/nf-ng-bridge.js?
|
||||||
<script type="text/javascript" src="js/nf/canvas/nf-canvas-utils.js?${project.version}"></script>\n\
|
<script type="text/javascript" src="js/nf/canvas/nf-canvas-utils.js?${project.version}"></script>\n\
|
||||||
<script type="text/javascript" src="js/nf/canvas/nf-go-to.js?${project.version}"></script>\n\
|
<script type="text/javascript" src="js/nf/canvas/nf-go-to.js?${project.version}"></script>\n\
|
||||||
<script type="text/javascript" src="js/nf/canvas/nf-snippet.js?${project.version}"></script>\n\
|
<script type="text/javascript" src="js/nf/canvas/nf-snippet.js?${project.version}"></script>\n\
|
||||||
|
<script type="text/javascript" src="js/nf/canvas/nf-verify.js?${project.version}"></script>\n\
|
||||||
<script type="text/javascript" src="js/nf/canvas/nf-connection.js?${project.version}"></script>\n\
|
<script type="text/javascript" src="js/nf/canvas/nf-connection.js?${project.version}"></script>\n\
|
||||||
<script type="text/javascript" src="js/nf/canvas/nf-funnel.js?${project.version}"></script>\n\
|
<script type="text/javascript" src="js/nf/canvas/nf-funnel.js?${project.version}"></script>\n\
|
||||||
<script type="text/javascript" src="js/nf/canvas/nf-label.js?${project.version}"></script>\n\
|
<script type="text/javascript" src="js/nf/canvas/nf-label.js?${project.version}"></script>\n\
|
||||||
|
|
|
@ -158,6 +158,8 @@
|
||||||
<jsp:include page="/WEB-INF/partials/canvas/drop-request-status-dialog.jsp"/>
|
<jsp:include page="/WEB-INF/partials/canvas/drop-request-status-dialog.jsp"/>
|
||||||
<jsp:include page="/WEB-INF/partials/canvas/flowfile-details-dialog.jsp"/>
|
<jsp:include page="/WEB-INF/partials/canvas/flowfile-details-dialog.jsp"/>
|
||||||
<jsp:include page="/WEB-INF/partials/canvas/listing-request-status-dialog.jsp"/>
|
<jsp:include page="/WEB-INF/partials/canvas/listing-request-status-dialog.jsp"/>
|
||||||
|
<jsp:include page="/WEB-INF/partials/canvas/verification-request-status-dialog.jsp"/>
|
||||||
|
<jsp:include page="/WEB-INF/partials/canvas/referenced-attributes-configuration.jsp"/>
|
||||||
<jsp:include page="/WEB-INF/partials/canvas/queue-listing.jsp"/>
|
<jsp:include page="/WEB-INF/partials/canvas/queue-listing.jsp"/>
|
||||||
<jsp:include page="/WEB-INF/partials/canvas/component-state-dialog.jsp"/>
|
<jsp:include page="/WEB-INF/partials/canvas/component-state-dialog.jsp"/>
|
||||||
<jsp:include page="/WEB-INF/partials/canvas/component-version-dialog.jsp"/>
|
<jsp:include page="/WEB-INF/partials/canvas/component-version-dialog.jsp"/>
|
||||||
|
|
|
@ -66,6 +66,10 @@
|
||||||
</div>
|
</div>
|
||||||
<div id="controller-service-properties-tab-content" class="configuration-tab">
|
<div id="controller-service-properties-tab-content" class="configuration-tab">
|
||||||
<div id="controller-service-properties"></div>
|
<div id="controller-service-properties"></div>
|
||||||
|
<div id="controller-service-properties-verification-results" class="verification-results">
|
||||||
|
<div class="verification-results-header">Verification Results</div>
|
||||||
|
<div id="controller-service-properties-verification-results-listing" class="verification-results-listing"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="controller-service-comments-tab-content" class="configuration-tab">
|
<div id="controller-service-comments-tab-content" class="configuration-tab">
|
||||||
<textarea cols="30" rows="4" id="controller-service-comments" name="controller-service-comments" class="controller-service-editable setting-input"></textarea>
|
<textarea cols="30" rows="4" id="controller-service-comments" name="controller-service-comments" class="controller-service-editable setting-input"></textarea>
|
||||||
|
@ -79,4 +83,4 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="new-controller-service-property-container"></div>
|
<div id="new-controller-service-property-container"></div>
|
||||||
|
|
|
@ -218,6 +218,10 @@
|
||||||
</div>
|
</div>
|
||||||
<div id="processor-properties-tab-content" class="configuration-tab">
|
<div id="processor-properties-tab-content" class="configuration-tab">
|
||||||
<div id="processor-properties"></div>
|
<div id="processor-properties"></div>
|
||||||
|
<div id="processor-properties-verification-results" class="verification-results">
|
||||||
|
<div class="verification-results-header">Verification Results</div>
|
||||||
|
<div id="processor-properties-verification-results-listing" class="verification-results-listing"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="processor-comments-tab-content" class="configuration-tab">
|
<div id="processor-comments-tab-content" class="configuration-tab">
|
||||||
<textarea cols="30" rows="4" id="processor-comments" name="processor-comments" class="setting-input"></textarea>
|
<textarea cols="30" rows="4" id="processor-comments" name="processor-comments" class="setting-input"></textarea>
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
<%--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
--%>
|
||||||
|
<%@ page contentType="text/html" pageEncoding="UTF-8" session="false" %>
|
||||||
|
<div id="referenced-attributes-dialog" class="hidden medium-dialog">
|
||||||
|
<div class="dialog-content">
|
||||||
|
<div class="setting">
|
||||||
|
<div id="referenced-attributes-header">
|
||||||
|
<div id="referenced-attributes-title" class="setting-name">
|
||||||
|
Enter Attribute Values
|
||||||
|
<div class="fa fa-question-circle" alt="Info"
|
||||||
|
title="Supply attribute values that should be considered when performing property verification."></div>
|
||||||
|
</div>
|
||||||
|
<div id="add-referenced-attribute">
|
||||||
|
<button class="button fa fa-plus"></button>
|
||||||
|
</div>
|
||||||
|
<div class="clear"></div>
|
||||||
|
</div>
|
||||||
|
<div class="setting-field">
|
||||||
|
<div id="referenced-attributes-table"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="new-referenced-attribute-dialog" class="dialog cancellable small-dialog hidden">
|
||||||
|
<div class="dialog-content">
|
||||||
|
<div>
|
||||||
|
<div class="setting-name">Attribute name</div>
|
||||||
|
<div class="setting-field">
|
||||||
|
<input id="new-referenced-attribute-name" type="text"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -83,6 +83,10 @@
|
||||||
</div>
|
</div>
|
||||||
<div id="reporting-task-properties-tab-content" class="configuration-tab">
|
<div id="reporting-task-properties-tab-content" class="configuration-tab">
|
||||||
<div id="reporting-task-properties"></div>
|
<div id="reporting-task-properties"></div>
|
||||||
|
<div id="reporting-task-properties-verification-results" class="verification-results">
|
||||||
|
<div class="verification-results-header">Verification Results</div>
|
||||||
|
<div id="reporting-task-properties-verification-results-listing" class="verification-results-listing"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="reporting-task-comments-tab-content" class="configuration-tab">
|
<div id="reporting-task-comments-tab-content" class="configuration-tab">
|
||||||
<textarea cols="30" rows="4" id="reporting-task-comments" name="reporting-task-comments" class="reporting-task-editable setting-input"></textarea>
|
<textarea cols="30" rows="4" id="reporting-task-comments" name="reporting-task-comments" class="reporting-task-editable setting-input"></textarea>
|
||||||
|
@ -96,4 +100,4 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="new-reporting-task-property-container"></div>
|
<div id="new-reporting-task-property-container"></div>
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
<%--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
--%>
|
||||||
|
<%@ page contentType="text/html" pageEncoding="UTF-8" session="false" %>
|
||||||
|
<div id="verification-request-status-dialog" layout="column" class="hidden small-dialog">
|
||||||
|
<div class="dialog-content">
|
||||||
|
<div class="setting">
|
||||||
|
<div class="setting-field">
|
||||||
|
<div id="verification-request-status-message"></div>
|
||||||
|
</div>
|
||||||
|
<div class="setting-field">
|
||||||
|
<div id="verification-request-percent-complete"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -284,6 +284,98 @@ div.local-changes-message {
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Referenced Attributes
|
||||||
|
*/
|
||||||
|
|
||||||
|
#referenced-attributes-table {
|
||||||
|
position: relative;
|
||||||
|
height: 240px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#add-referenced-attribute {
|
||||||
|
float: right;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
font-size: 16px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
#referenced-attributes-title {
|
||||||
|
font-size: 12px;
|
||||||
|
float: left;
|
||||||
|
height: 28px;
|
||||||
|
line-height: 28px;
|
||||||
|
margin-left: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#verification-request-percent-complete {
|
||||||
|
margin-top: 10px;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verification-results {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: calc(60% - -10px);
|
||||||
|
right: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verification-results-header {
|
||||||
|
color: #728e9b;
|
||||||
|
font-size: 16px;
|
||||||
|
font-family: 'Roboto Slab';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verification-results-listing {
|
||||||
|
border: 0 solid #CCCCCC;
|
||||||
|
overflow: auto;
|
||||||
|
position: absolute;
|
||||||
|
top: 20px;
|
||||||
|
right: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verification-result {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verification-result-outcome {
|
||||||
|
float: left;
|
||||||
|
font-size: 14px;
|
||||||
|
width: 14px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verification-result-outcome.fa-check {
|
||||||
|
color: #4fa885;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verification-result-outcome.fa-times {
|
||||||
|
color: #e21a1a;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verification-result-outcome.fa-exclamation {
|
||||||
|
color: #eB8f11;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verification-result-step-name {
|
||||||
|
float: left;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.verification-result-explanation {
|
||||||
|
font-size: 12px;
|
||||||
|
margin-left: 24px;
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Variable Registry
|
Variable Registry
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -191,4 +191,4 @@ div.processor-relationship-container {
|
||||||
/* status bar button icon */
|
/* status bar button icon */
|
||||||
#processor-configuration div.dialog-status-bar div.button-icon.fa-hourglass-end {
|
#processor-configuration div.dialog-status-bar div.button-icon.fa-hourglass-end {
|
||||||
font-size : 11px !important;
|
font-size : 11px !important;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,28 +28,20 @@ div.required-property-note {
|
||||||
margin-left: 6px;
|
margin-left: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.add-property {
|
div.add-property, div.verify-properties {
|
||||||
float: right;
|
float: right;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
|
margin-left: 4px;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.add-property-text {
|
|
||||||
float: left;
|
|
||||||
margin-left: 5px;
|
|
||||||
height: 19px;
|
|
||||||
line-height: 19px;
|
|
||||||
color: #262626;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.property-table {
|
div.property-table {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 42px;
|
top: 42px;
|
||||||
bottom: 0px;
|
bottom: 0px;
|
||||||
left: 0px;
|
left: 0px;
|
||||||
right: 0px;
|
right: 0px;
|
||||||
min-height: 150px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.property-table .fa {
|
.property-table .fa {
|
||||||
|
|
|
@ -105,6 +105,7 @@
|
||||||
_) {
|
_) {
|
||||||
|
|
||||||
var groupId = null;
|
var groupId = null;
|
||||||
|
var propertyVerificationCallback = null;
|
||||||
var COMBO_MIN_WIDTH = 212;
|
var COMBO_MIN_WIDTH = 212;
|
||||||
var EDITOR_MIN_WIDTH = 212;
|
var EDITOR_MIN_WIDTH = 212;
|
||||||
var EDITOR_MIN_HEIGHT = 100;
|
var EDITOR_MIN_HEIGHT = 100;
|
||||||
|
@ -1784,6 +1785,22 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var marshalProperties = function (table) {
|
||||||
|
var properties = {};
|
||||||
|
var propertyGrid = table.data('gridInstance');
|
||||||
|
var propertyData = propertyGrid.getData();
|
||||||
|
$.each(propertyData.getItems(), function () {
|
||||||
|
if (this.hidden === true && !(this.dependent === true)) {
|
||||||
|
// hidden properties were removed by the user, clear the value
|
||||||
|
properties[this.property] = null;
|
||||||
|
} else if (this.value !== this.previousValue) {
|
||||||
|
// the value has changed
|
||||||
|
properties[this.property] = this.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return properties;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs the filtering.
|
* Performs the filtering.
|
||||||
*
|
*
|
||||||
|
@ -1954,7 +1971,8 @@
|
||||||
* return $.Deferred(function (deferred) {
|
* return $.Deferred(function (deferred) {
|
||||||
* deferred.resolve();
|
* deferred.resolve();
|
||||||
* }).promise;
|
* }).promise;
|
||||||
* }
|
* },
|
||||||
|
* propertyVerificationCallback: function () {}
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* @argument {object} options The options for the tag cloud
|
* @argument {object} options The options for the tag cloud
|
||||||
|
@ -2125,7 +2143,7 @@
|
||||||
newPropertyDialog.on('click', 'div.new-property-ok', add).on('click', 'div.new-property-cancel', cancel);
|
newPropertyDialog.on('click', 'div.new-property-ok', add).on('click', 'div.new-property-cancel', cancel);
|
||||||
|
|
||||||
// build the control to open the new property dialog
|
// build the control to open the new property dialog
|
||||||
var addProperty = $('<div class="add-property"></div>').appendTo(header);
|
var addProperty = $('<div class="add-property" title="Add Property"></div>').appendTo(header);
|
||||||
$('<button class="button fa fa-plus"></button>').on('click', function () {
|
$('<button class="button fa fa-plus"></button>').on('click', function () {
|
||||||
// close all fields currently being edited
|
// close all fields currently being edited
|
||||||
saveRow(table);
|
saveRow(table);
|
||||||
|
@ -2139,6 +2157,21 @@
|
||||||
// set the initial focus
|
// set the initial focus
|
||||||
newPropertyNameField.focus();
|
newPropertyNameField.focus();
|
||||||
}).appendTo(addProperty);
|
}).appendTo(addProperty);
|
||||||
|
|
||||||
|
// build the control to trigger verification
|
||||||
|
var verifyProperties = $('<div class="verify-properties hidden" title="Verify Properties"></div>').appendTo(header);
|
||||||
|
$('<button class="button fa fa-check-circle-o"></button>').on('click', function () {
|
||||||
|
// close all fields currently being edited
|
||||||
|
saveRow(table);
|
||||||
|
|
||||||
|
// invoke the verification callback with the current properties
|
||||||
|
propertyVerificationCallback(marshalProperties(table));
|
||||||
|
}).appendTo(verifyProperties);
|
||||||
|
|
||||||
|
// if there is a verification callback registered show the verify button
|
||||||
|
propertyVerificationCallback = options.propertyVerificationCallback;
|
||||||
|
var supportsVerification = typeof propertyVerificationCallback === 'function';
|
||||||
|
verifyProperties.toggleClass('hidden', !supportsVerification);
|
||||||
}
|
}
|
||||||
$('<div class="clear"></div>').appendTo(header);
|
$('<div class="clear"></div>').appendTo(header);
|
||||||
|
|
||||||
|
@ -2265,18 +2298,7 @@
|
||||||
this.each(function () {
|
this.each(function () {
|
||||||
// get the property grid data
|
// get the property grid data
|
||||||
var table = $(this).find('div.property-table');
|
var table = $(this).find('div.property-table');
|
||||||
var propertyGrid = table.data('gridInstance');
|
properties = marshalProperties(table);
|
||||||
var propertyData = propertyGrid.getData();
|
|
||||||
$.each(propertyData.getItems(), function () {
|
|
||||||
if (this.hidden === true && !(this.dependent === true)) {
|
|
||||||
// hidden properties were removed by the user, clear the value
|
|
||||||
properties[this.property] = null;
|
|
||||||
} else if (this.value !== this.previousValue) {
|
|
||||||
// the value has changed
|
|
||||||
properties[this.property] = this.value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -2291,6 +2313,18 @@
|
||||||
return this.each(function () {
|
return this.each(function () {
|
||||||
groupId = currentGroupId;
|
groupId = currentGroupId;
|
||||||
});
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the property verification callback.
|
||||||
|
*/
|
||||||
|
setPropertyVerificationCallback: function (currentPropertyVerificationCallback) {
|
||||||
|
return this.each(function () {
|
||||||
|
propertyVerificationCallback = currentPropertyVerificationCallback;
|
||||||
|
|
||||||
|
var supportsVerification = typeof currentPropertyVerificationCallback === 'function';
|
||||||
|
$(this).find('div.verify-properties').toggleClass('hidden', !supportsVerification);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
'nf.Snippet',
|
'nf.Snippet',
|
||||||
'nf.Actions',
|
'nf.Actions',
|
||||||
'nf.QueueListing',
|
'nf.QueueListing',
|
||||||
|
'nf.Verify',
|
||||||
'nf.VariableRegistry',
|
'nf.VariableRegistry',
|
||||||
'nf.ComponentState',
|
'nf.ComponentState',
|
||||||
'nf.FlowVersion',
|
'nf.FlowVersion',
|
||||||
|
@ -83,8 +84,8 @@
|
||||||
'nf.ng.Canvas.OperateCtrl',
|
'nf.ng.Canvas.OperateCtrl',
|
||||||
'nf.ng.BreadcrumbsDirective',
|
'nf.ng.BreadcrumbsDirective',
|
||||||
'nf.ng.DraggableDirective'],
|
'nf.ng.DraggableDirective'],
|
||||||
function ($, angular, nfCommon, nfCanvasUtils, nfErrorHandler, nfClient, nfDialog, nfStorage, nfCanvas, nfGraph, nfContextMenu, nfQuickSelect, nfShell, nfParameterContexts, nfSettings, nfActions, nfSnippet, nfQueueListing, nfVariableRegistry, nfComponentState, nfFlowVersion, nfComponentVersion, nfDraggable, nfConnectable, nfStatusHistory, nfBirdseye, nfConnectionConfiguration, nfControllerService, nfReportingTask, nfPolicyManagement, nfProcessorConfiguration, nfProcessGroupConfiguration, nfControllerServices, nfRemoteProcessGroupConfiguration, nfRemoteProcessGroupPorts, nfPortConfiguration, nfLabelConfiguration, nfProcessorDetails, nfPortDetails, nfConnectionDetails, nfRemoteProcessGroupDetails, nfGoto, nfNgBridge, appCtrl, appConfig, serviceProvider, breadcrumbsCtrl, headerCtrl, flowStatusCtrl, globalMenuCtrl, toolboxCtrl, processorComponent, inputPortComponent, outputPortComponent, processGroupComponent, remoteProcessGroupComponent, funnelComponent, templateComponent, labelComponent, graphControlsCtrl, navigateCtrl, operateCtrl, breadcrumbsDirective, draggableDirective) {
|
function ($, angular, nfCommon, nfCanvasUtils, nfErrorHandler, nfClient, nfDialog, nfStorage, nfCanvas, nfGraph, nfContextMenu, nfQuickSelect, nfShell, nfParameterContexts, nfSettings, nfActions, nfSnippet, nfQueueListing, nfVerify, nfVariableRegistry, nfComponentState, nfFlowVersion, nfComponentVersion, nfDraggable, nfConnectable, nfStatusHistory, nfBirdseye, nfConnectionConfiguration, nfControllerService, nfReportingTask, nfPolicyManagement, nfProcessorConfiguration, nfProcessGroupConfiguration, nfControllerServices, nfRemoteProcessGroupConfiguration, nfRemoteProcessGroupPorts, nfPortConfiguration, nfLabelConfiguration, nfProcessorDetails, nfPortDetails, nfConnectionDetails, nfRemoteProcessGroupDetails, nfGoto, nfNgBridge, appCtrl, appConfig, serviceProvider, breadcrumbsCtrl, headerCtrl, flowStatusCtrl, globalMenuCtrl, toolboxCtrl, processorComponent, inputPortComponent, outputPortComponent, processGroupComponent, remoteProcessGroupComponent, funnelComponent, templateComponent, labelComponent, graphControlsCtrl, navigateCtrl, operateCtrl, breadcrumbsDirective, draggableDirective) {
|
||||||
return factory($, angular, nfCommon, nfCanvasUtils, nfErrorHandler, nfClient, nfDialog, nfStorage, nfCanvas, nfGraph, nfContextMenu, nfQuickSelect, nfShell, nfParameterContexts, nfSettings, nfActions, nfSnippet, nfQueueListing, nfVariableRegistry, nfComponentState, nfFlowVersion, nfComponentVersion, nfDraggable, nfConnectable, nfStatusHistory, nfBirdseye, nfConnectionConfiguration, nfControllerService, nfReportingTask, nfPolicyManagement, nfProcessorConfiguration, nfProcessGroupConfiguration, nfControllerServices, nfRemoteProcessGroupConfiguration, nfRemoteProcessGroupPorts, nfPortConfiguration, nfLabelConfiguration, nfProcessorDetails, nfPortDetails, nfConnectionDetails, nfRemoteProcessGroupDetails, nfGoto, nfNgBridge, appCtrl, appConfig, serviceProvider, breadcrumbsCtrl, headerCtrl, flowStatusCtrl, globalMenuCtrl, toolboxCtrl, processorComponent, inputPortComponent, outputPortComponent, processGroupComponent, remoteProcessGroupComponent, funnelComponent, templateComponent, labelComponent, graphControlsCtrl, navigateCtrl, operateCtrl, breadcrumbsDirective, draggableDirective);
|
return factory($, angular, nfCommon, nfCanvasUtils, nfErrorHandler, nfClient, nfDialog, nfStorage, nfCanvas, nfGraph, nfContextMenu, nfQuickSelect, nfShell, nfParameterContexts, nfSettings, nfActions, nfSnippet, nfQueueListing, nfVerify, nfVariableRegistry, nfComponentState, nfFlowVersion, nfComponentVersion, nfDraggable, nfConnectable, nfStatusHistory, nfBirdseye, nfConnectionConfiguration, nfControllerService, nfReportingTask, nfPolicyManagement, nfProcessorConfiguration, nfProcessGroupConfiguration, nfControllerServices, nfRemoteProcessGroupConfiguration, nfRemoteProcessGroupPorts, nfPortConfiguration, nfLabelConfiguration, nfProcessorDetails, nfPortDetails, nfConnectionDetails, nfRemoteProcessGroupDetails, nfGoto, nfNgBridge, appCtrl, appConfig, serviceProvider, breadcrumbsCtrl, headerCtrl, flowStatusCtrl, globalMenuCtrl, toolboxCtrl, processorComponent, inputPortComponent, outputPortComponent, processGroupComponent, remoteProcessGroupComponent, funnelComponent, templateComponent, labelComponent, graphControlsCtrl, navigateCtrl, operateCtrl, breadcrumbsDirective, draggableDirective);
|
||||||
});
|
});
|
||||||
} else if (typeof exports === 'object' && typeof module === 'object') {
|
} else if (typeof exports === 'object' && typeof module === 'object') {
|
||||||
module.exports = factory(require('jquery'),
|
module.exports = factory(require('jquery'),
|
||||||
|
@ -105,6 +106,7 @@
|
||||||
require('nf.Actions'),
|
require('nf.Actions'),
|
||||||
require('nf.Snippet'),
|
require('nf.Snippet'),
|
||||||
require('nf.QueueListing'),
|
require('nf.QueueListing'),
|
||||||
|
require('nf.Verify'),
|
||||||
require('nf.VariableRegistry'),
|
require('nf.VariableRegistry'),
|
||||||
require('nf.ComponentState'),
|
require('nf.ComponentState'),
|
||||||
require('nf.FlowVersion'),
|
require('nf.FlowVersion'),
|
||||||
|
@ -170,6 +172,7 @@
|
||||||
root.nf.Actions,
|
root.nf.Actions,
|
||||||
root.nf.Snippet,
|
root.nf.Snippet,
|
||||||
root.nf.QueueListing,
|
root.nf.QueueListing,
|
||||||
|
root.nf.Verify,
|
||||||
root.nf.VariableRegistry,
|
root.nf.VariableRegistry,
|
||||||
root.nf.ComponentState,
|
root.nf.ComponentState,
|
||||||
root.nf.FlowVersion,
|
root.nf.FlowVersion,
|
||||||
|
@ -217,7 +220,7 @@
|
||||||
root.nf.ng.BreadcrumbsDirective,
|
root.nf.ng.BreadcrumbsDirective,
|
||||||
root.nf.ng.DraggableDirective);
|
root.nf.ng.DraggableDirective);
|
||||||
}
|
}
|
||||||
}(this, function ($, angular, nfCommon, nfCanvasUtils, nfErrorHandler, nfClient, nfDialog, nfStorage, nfCanvas, nfGraph, nfContextMenu, nfQuickSelect, nfShell, nfParameterContexts, nfSettings, nfActions, nfSnippet, nfQueueListing, nfVariableRegistry, nfComponentState, nfFlowVersion, nfComponentVersion, nfDraggable, nfConnectable, nfStatusHistory, nfBirdseye, nfConnectionConfiguration, nfControllerService, nfReportingTask, nfPolicyManagement, nfProcessorConfiguration, nfProcessGroupConfiguration, nfControllerServices, nfRemoteProcessGroupConfiguration, nfRemoteProcessGroupPorts, nfPortConfiguration, nfLabelConfiguration, nfProcessorDetails, nfPortDetails, nfConnectionDetails, nfRemoteProcessGroupDetails, nfGoto, nfNgBridge, appCtrl, appConfig, serviceProvider, breadcrumbsCtrl, headerCtrl, flowStatusCtrl, globalMenuCtrl, toolboxCtrl, processorComponent, inputPortComponent, outputPortComponent, processGroupComponent, remoteProcessGroupComponent, funnelComponent, templateComponent, labelComponent, graphControlsCtrl, navigateCtrl, operateCtrl, breadcrumbsDirective, draggableDirective) {
|
}(this, function ($, angular, nfCommon, nfCanvasUtils, nfErrorHandler, nfClient, nfDialog, nfStorage, nfCanvas, nfGraph, nfContextMenu, nfQuickSelect, nfShell, nfParameterContexts, nfSettings, nfActions, nfSnippet, nfQueueListing, nfVerify, nfVariableRegistry, nfComponentState, nfFlowVersion, nfComponentVersion, nfDraggable, nfConnectable, nfStatusHistory, nfBirdseye, nfConnectionConfiguration, nfControllerService, nfReportingTask, nfPolicyManagement, nfProcessorConfiguration, nfProcessGroupConfiguration, nfControllerServices, nfRemoteProcessGroupConfiguration, nfRemoteProcessGroupPorts, nfPortConfiguration, nfLabelConfiguration, nfProcessorDetails, nfPortDetails, nfConnectionDetails, nfRemoteProcessGroupDetails, nfGoto, nfNgBridge, appCtrl, appConfig, serviceProvider, breadcrumbsCtrl, headerCtrl, flowStatusCtrl, globalMenuCtrl, toolboxCtrl, processorComponent, inputPortComponent, outputPortComponent, processGroupComponent, remoteProcessGroupComponent, funnelComponent, templateComponent, labelComponent, graphControlsCtrl, navigateCtrl, operateCtrl, breadcrumbsDirective, draggableDirective) {
|
||||||
|
|
||||||
var config = {
|
var config = {
|
||||||
urls: {
|
urls: {
|
||||||
|
@ -349,6 +352,7 @@
|
||||||
nfParameterContexts.init();
|
nfParameterContexts.init();
|
||||||
nfActions.init();
|
nfActions.init();
|
||||||
nfQueueListing.init();
|
nfQueueListing.init();
|
||||||
|
nfVerify.init();
|
||||||
nfVariableRegistry.init();
|
nfVariableRegistry.init();
|
||||||
nfComponentState.init();
|
nfComponentState.init();
|
||||||
nfFlowVersion.init(configDetails.timeOffset);
|
nfFlowVersion.init(configDetails.timeOffset);
|
||||||
|
|
|
@ -29,10 +29,11 @@
|
||||||
'nf.Settings',
|
'nf.Settings',
|
||||||
'nf.UniversalCapture',
|
'nf.UniversalCapture',
|
||||||
'nf.CustomUi',
|
'nf.CustomUi',
|
||||||
|
'nf.Verify',
|
||||||
'nf.CanvasUtils',
|
'nf.CanvasUtils',
|
||||||
'nf.Processor'],
|
'nf.Processor'],
|
||||||
function ($, d3, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfSettings, nfUniversalCapture, nfCustomUi, nfCanvasUtils, nfProcessor) {
|
function ($, d3, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfSettings, nfUniversalCapture, nfCustomUi, nfVerify, nfCanvasUtils, nfProcessor) {
|
||||||
return (nf.ControllerService = factory($, d3, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfSettings, nfUniversalCapture, nfCustomUi, nfCanvasUtils, nfProcessor));
|
return (nf.ControllerService = factory($, d3, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfSettings, nfUniversalCapture, nfVerify, nfCustomUi, nfCanvasUtils, nfProcessor));
|
||||||
});
|
});
|
||||||
} else if (typeof exports === 'object' && typeof module === 'object') {
|
} else if (typeof exports === 'object' && typeof module === 'object') {
|
||||||
module.exports = (nf.ControllerService =
|
module.exports = (nf.ControllerService =
|
||||||
|
@ -46,6 +47,7 @@
|
||||||
require('nf.Settings'),
|
require('nf.Settings'),
|
||||||
require('nf.UniversalCapture'),
|
require('nf.UniversalCapture'),
|
||||||
require('nf.CustomUi'),
|
require('nf.CustomUi'),
|
||||||
|
require('nf.Verify'),
|
||||||
require('nf.CanvasUtils'),
|
require('nf.CanvasUtils'),
|
||||||
require('nf.Processor')));
|
require('nf.Processor')));
|
||||||
} else {
|
} else {
|
||||||
|
@ -59,10 +61,11 @@
|
||||||
root.nf.Settings,
|
root.nf.Settings,
|
||||||
root.nf.UniversalCapture,
|
root.nf.UniversalCapture,
|
||||||
root.nf.CustomUi,
|
root.nf.CustomUi,
|
||||||
|
root.nf.Verify,
|
||||||
root.nf.CanvasUtils,
|
root.nf.CanvasUtils,
|
||||||
root.nf.Processor);
|
root.nf.Processor);
|
||||||
}
|
}
|
||||||
}(this, function ($, d3, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfSettings, nfUniversalCapture, nfCustomUi, nfCanvasUtils, nfProcessor) {
|
}(this, function ($, d3, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfSettings, nfUniversalCapture, nfCustomUi, nfVerify, nfCanvasUtils, nfProcessor) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var nfControllerServices, nfReportingTask;
|
var nfControllerServices, nfReportingTask;
|
||||||
|
@ -77,6 +80,9 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// the last submitted referenced attributes
|
||||||
|
var referencedAttributes = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines whether the user has made any changes to the controller service configuration
|
* Determines whether the user has made any changes to the controller service configuration
|
||||||
* that needs to be saved.
|
* that needs to be saved.
|
||||||
|
@ -1696,6 +1702,29 @@
|
||||||
return referencedServices;
|
return referencedServices;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles verification results.
|
||||||
|
*/
|
||||||
|
var handleVerificationResults = function (verificationResults, referencedAttributeMap) {
|
||||||
|
// record the most recently submitted referenced attributes
|
||||||
|
referencedAttributes = referencedAttributeMap;
|
||||||
|
|
||||||
|
var verificationResultsContainer = $('#controller-service-properties-verification-results');
|
||||||
|
|
||||||
|
// expand the dialog to make room for the verification result
|
||||||
|
if (verificationResultsContainer.is(':visible') === false) {
|
||||||
|
// show the verification results
|
||||||
|
$('#controller-service-properties').css('bottom', '40%').propertytable('resetTableSize')
|
||||||
|
verificationResultsContainer.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
// show borders if appropriate
|
||||||
|
var verificationResultsListing = $('#controller-service-properties-verification-results-listing');
|
||||||
|
if (verificationResultsListing.get(0).scrollHeight > Math.round(verificationResultsListing.innerHeight())) {
|
||||||
|
verificationResultsListing.css('border-width', '1px');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Track the current table
|
* Track the current table
|
||||||
*/
|
*/
|
||||||
|
@ -1768,6 +1797,14 @@
|
||||||
|
|
||||||
// removed the cached controller service details
|
// removed the cached controller service details
|
||||||
$('#controller-service-configuration').removeData('controllerServiceDetails');
|
$('#controller-service-configuration').removeData('controllerServiceDetails');
|
||||||
|
|
||||||
|
// clean up an shown verification errors
|
||||||
|
$('#controller-service-properties-verification-results').hide();
|
||||||
|
$('#controller-service-properties-verification-results-listing').css('border-width', '0').empty();
|
||||||
|
$('#controller-service-properties').css('bottom', '0');
|
||||||
|
|
||||||
|
// clear most recently submitted referenced attributes
|
||||||
|
referencedAttributes = null;
|
||||||
},
|
},
|
||||||
open: function () {
|
open: function () {
|
||||||
nfCommon.toggleScrollable($('#' + this.find('.tab-container').attr('id') + '-content').get(0));
|
nfCommon.toggleScrollable($('#' + this.find('.tab-container').attr('id') + '-content').get(0));
|
||||||
|
@ -2061,7 +2098,10 @@
|
||||||
// load the property table
|
// load the property table
|
||||||
$('#controller-service-properties')
|
$('#controller-service-properties')
|
||||||
.propertytable('setGroupId', controllerService.parentGroupId)
|
.propertytable('setGroupId', controllerService.parentGroupId)
|
||||||
.propertytable('loadProperties', controllerService.properties, controllerService.descriptors, controllerServiceHistory.propertyHistory);
|
.propertytable('loadProperties', controllerService.properties, controllerService.descriptors, controllerServiceHistory.propertyHistory)
|
||||||
|
.propertytable('setPropertyVerificationCallback', function (proposedProperties) {
|
||||||
|
nfVerify.verify(controllerService['id'], controllerServiceEntity['uri'], proposedProperties, referencedAttributes, handleVerificationResults, $('#controller-service-properties-verification-results-listing'));
|
||||||
|
});
|
||||||
|
|
||||||
// show the details
|
// show the details
|
||||||
controllerServiceDialog.modal('show');
|
controllerServiceDialog.modal('show');
|
||||||
|
|
|
@ -30,10 +30,11 @@
|
||||||
'nf.Processor',
|
'nf.Processor',
|
||||||
'nf.ClusterSummary',
|
'nf.ClusterSummary',
|
||||||
'nf.CustomUi',
|
'nf.CustomUi',
|
||||||
|
'nf.Verify',
|
||||||
'nf.UniversalCapture',
|
'nf.UniversalCapture',
|
||||||
'nf.Connection'],
|
'nf.Connection'],
|
||||||
function ($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfCanvasUtils, nfNgBridge, nfProcessor, nfClusterSummary, nfCustomUi, nfUniversalCapture, nfConnection) {
|
function ($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfCanvasUtils, nfNgBridge, nfProcessor, nfClusterSummary, nfCustomUi, nfVerify, nfUniversalCapture, nfConnection) {
|
||||||
return (nf.ProcessorConfiguration = factory($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfCanvasUtils, nfNgBridge, nfProcessor, nfClusterSummary, nfCustomUi, nfUniversalCapture, nfConnection));
|
return (nf.ProcessorConfiguration = factory($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfCanvasUtils, nfNgBridge, nfProcessor, nfClusterSummary, nfCustomUi, nfVerify, nfUniversalCapture, nfConnection));
|
||||||
});
|
});
|
||||||
} else if (typeof exports === 'object' && typeof module === 'object') {
|
} else if (typeof exports === 'object' && typeof module === 'object') {
|
||||||
module.exports = (nf.ProcessorConfiguration =
|
module.exports = (nf.ProcessorConfiguration =
|
||||||
|
@ -48,6 +49,7 @@
|
||||||
require('nf.Processor'),
|
require('nf.Processor'),
|
||||||
require('nf.ClusterSummary'),
|
require('nf.ClusterSummary'),
|
||||||
require('nf.CustomUi'),
|
require('nf.CustomUi'),
|
||||||
|
require('nf.Verify'),
|
||||||
require('nf.UniversalCapture'),
|
require('nf.UniversalCapture'),
|
||||||
require('nf.Connection')));
|
require('nf.Connection')));
|
||||||
} else {
|
} else {
|
||||||
|
@ -62,10 +64,11 @@
|
||||||
root.nf.Processor,
|
root.nf.Processor,
|
||||||
root.nf.ClusterSummary,
|
root.nf.ClusterSummary,
|
||||||
root.nf.CustomUi,
|
root.nf.CustomUi,
|
||||||
|
root.nf.Verify,
|
||||||
root.nf.UniversalCapture,
|
root.nf.UniversalCapture,
|
||||||
root.nf.Connection);
|
root.nf.Connection);
|
||||||
}
|
}
|
||||||
}(this, function ($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfCanvasUtils, nfNgBridge, nfProcessor, nfClusterSummary, nfCustomUi, nfUniversalCapture, nfConnection) {
|
}(this, function ($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfCanvasUtils, nfNgBridge, nfProcessor, nfClusterSummary, nfCustomUi, nfVerify, nfUniversalCapture, nfConnection) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -81,6 +84,9 @@
|
||||||
RUN_STATUS_KEY = 'status.aggregateSnapshot.runStatus',
|
RUN_STATUS_KEY = 'status.aggregateSnapshot.runStatus',
|
||||||
BULLETINS_KEY = 'bulletins';
|
BULLETINS_KEY = 'bulletins';
|
||||||
|
|
||||||
|
// the last submitted referenced attributes
|
||||||
|
var referencedAttributes = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the available scheduling strategies based on the specified processor.
|
* Gets the available scheduling strategies based on the specified processor.
|
||||||
*
|
*
|
||||||
|
@ -499,6 +505,29 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles verification results.
|
||||||
|
*/
|
||||||
|
var handleVerificationResults = function (verificationResults, referencedAttributeMap) {
|
||||||
|
// record the most recently submitted referenced attributes
|
||||||
|
referencedAttributes = referencedAttributeMap;
|
||||||
|
|
||||||
|
var verificationResultsContainer = $('#processor-properties-verification-results');
|
||||||
|
|
||||||
|
// expand the dialog to make room for the verification result
|
||||||
|
if (verificationResultsContainer.is(':visible') === false) {
|
||||||
|
// show the verification results
|
||||||
|
$('#processor-properties').css('bottom', '40%').propertytable('resetTableSize')
|
||||||
|
verificationResultsContainer.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
// show borders if appropriate
|
||||||
|
var verificationResultsListing = $('#processor-properties-verification-results-listing');
|
||||||
|
if (verificationResultsListing.get(0).scrollHeight > Math.round(verificationResultsListing.innerHeight())) {
|
||||||
|
verificationResultsListing.css('border-width', '1px');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
/**
|
/**
|
||||||
* Initializes the processor properties tab.
|
* Initializes the processor properties tab.
|
||||||
|
@ -562,8 +591,16 @@
|
||||||
// removed the cached processor details
|
// removed the cached processor details
|
||||||
$('#processor-configuration').removeData('processorDetails');
|
$('#processor-configuration').removeData('processorDetails');
|
||||||
|
|
||||||
|
// clean up an shown verification errors
|
||||||
|
$('#processor-properties-verification-results').hide();
|
||||||
|
$('#processor-properties-verification-results-listing').css('border-width', '0').empty();
|
||||||
|
$('#processor-properties').css('bottom', '0');
|
||||||
|
|
||||||
|
// clear most recently submitted referenced attributes
|
||||||
|
referencedAttributes = null;
|
||||||
|
|
||||||
//stop any synchronization
|
//stop any synchronization
|
||||||
if(config.supportsStatusBar){
|
if (config.supportsStatusBar){
|
||||||
$('#processor-configuration-status-bar').statusbar('disconnect');
|
$('#processor-configuration-status-bar').statusbar('disconnect');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -982,7 +1019,10 @@
|
||||||
// load the property table
|
// load the property table
|
||||||
$('#processor-properties')
|
$('#processor-properties')
|
||||||
.propertytable('setGroupId', processor.parentGroupId)
|
.propertytable('setGroupId', processor.parentGroupId)
|
||||||
.propertytable('loadProperties', processor.config.properties, processor.config.descriptors, processorHistory.propertyHistory);
|
.propertytable('loadProperties', processor.config.properties, processor.config.descriptors, processorHistory.propertyHistory)
|
||||||
|
.propertytable('setPropertyVerificationCallback', function (proposedProperties) {
|
||||||
|
nfVerify.verify(processor['id'], processorResponse['uri'], proposedProperties, referencedAttributes, handleVerificationResults, $('#processor-properties-verification-results-listing'));
|
||||||
|
});
|
||||||
|
|
||||||
// show the details
|
// show the details
|
||||||
$('#processor-configuration').modal('show');
|
$('#processor-configuration').modal('show');
|
||||||
|
@ -997,13 +1037,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure the properties table has rendered correctly if initially selected
|
// Ensure the properties table has rendered correctly if initially selected
|
||||||
if ($('#processor-configuration-tabs').find('.selected-tab').text() === 'Properties' &&
|
if ($('#processor-configuration-tabs').find('.selected-tab').text() === 'Properties') {
|
||||||
$('#processor-properties').find('.slick-viewport').height() == 0) {
|
|
||||||
$('#processor-properties').propertytable('resetTableSize');
|
$('#processor-properties').propertytable('resetTableSize');
|
||||||
}
|
}
|
||||||
|
|
||||||
//execute the callback if one was provided
|
// execute the callback if one was provided
|
||||||
if(typeof cb == 'function'){
|
if (typeof cb == 'function'){
|
||||||
cb();
|
cb();
|
||||||
}
|
}
|
||||||
}).fail(nfErrorHandler.handleAjaxError);
|
}).fail(nfErrorHandler.handleAjaxError);
|
||||||
|
|
|
@ -28,9 +28,10 @@
|
||||||
'nf.ControllerService',
|
'nf.ControllerService',
|
||||||
'nf.ControllerServices',
|
'nf.ControllerServices',
|
||||||
'nf.UniversalCapture',
|
'nf.UniversalCapture',
|
||||||
'nf.CustomUi'],
|
'nf.CustomUi',
|
||||||
function ($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfControllerService, nfControllerServices, nfUniversalCapture, nfCustomUi) {
|
'nf.Verify'],
|
||||||
return (nf.ReportingTask = factory($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfControllerService, nfControllerServices, nfUniversalCapture, nfCustomUi));
|
function ($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfControllerService, nfControllerServices, nfUniversalCapture, nfCustomUi, nfVerify) {
|
||||||
|
return (nf.ReportingTask = factory($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfControllerService, nfControllerServices, nfUniversalCapture, nfCustomUi, nfVerify));
|
||||||
});
|
});
|
||||||
} else if (typeof exports === 'object' && typeof module === 'object') {
|
} else if (typeof exports === 'object' && typeof module === 'object') {
|
||||||
module.exports = (nf.ReportingTask =
|
module.exports = (nf.ReportingTask =
|
||||||
|
@ -43,7 +44,8 @@
|
||||||
require('nf.ControllerService'),
|
require('nf.ControllerService'),
|
||||||
require('nf.ControllerServices'),
|
require('nf.ControllerServices'),
|
||||||
require('nf.UniversalCapture'),
|
require('nf.UniversalCapture'),
|
||||||
require('nf.CustomUi')));
|
require('nf.CustomUi'),
|
||||||
|
require('nf.Verify')));
|
||||||
} else {
|
} else {
|
||||||
nf.ReportingTask = factory(root.$,
|
nf.ReportingTask = factory(root.$,
|
||||||
root.nf.ErrorHandler,
|
root.nf.ErrorHandler,
|
||||||
|
@ -54,9 +56,10 @@
|
||||||
root.nf.ControllerService,
|
root.nf.ControllerService,
|
||||||
root.nf.ControllerServices,
|
root.nf.ControllerServices,
|
||||||
root.nf.UniversalCapture,
|
root.nf.UniversalCapture,
|
||||||
root.nf.CustomUi);
|
root.nf.CustomUi,
|
||||||
|
root.nf.Verify);
|
||||||
}
|
}
|
||||||
}(this, function ($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfControllerService, nfControllerServices, nfUniversalCapture, nfCustomUi) {
|
}(this, function ($, nfErrorHandler, nfCommon, nfDialog, nfStorage, nfClient, nfControllerService, nfControllerServices, nfUniversalCapture, nfCustomUi, nfVerify) {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var nfSettings;
|
var nfSettings;
|
||||||
|
@ -69,6 +72,9 @@
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// the last submitted referenced attributes
|
||||||
|
var referencedAttributes = null;
|
||||||
|
|
||||||
// load the controller services
|
// load the controller services
|
||||||
var controllerServicesUri = config.urls.api + '/flow/controller/controller-services';
|
var controllerServicesUri = config.urls.api + '/flow/controller/controller-services';
|
||||||
|
|
||||||
|
@ -320,6 +326,30 @@
|
||||||
}).fail(nfErrorHandler.handleAjaxError);
|
}).fail(nfErrorHandler.handleAjaxError);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles verification results.
|
||||||
|
*/
|
||||||
|
var handleVerificationResults = function (verificationResults, referencedAttributeMap) {
|
||||||
|
// record the most recently submitted referenced attributes
|
||||||
|
referencedAttributes = referencedAttributeMap;
|
||||||
|
|
||||||
|
var verificationResultsContainer = $('#reporting-task-properties-verification-results');
|
||||||
|
|
||||||
|
// expand the dialog to make room for the verification result
|
||||||
|
if (verificationResultsContainer.is(':visible') === false) {
|
||||||
|
// show the verification results
|
||||||
|
$('#reporting-task-properties').css('bottom', '40%').propertytable('resetTableSize')
|
||||||
|
verificationResultsContainer.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
// show borders if appropriate
|
||||||
|
var verificationResultsListing = $('#reporting-task-properties-verification-results-listing');
|
||||||
|
if (verificationResultsListing.get(0).scrollHeight > Math.round(verificationResultsListing.innerHeight())) {
|
||||||
|
verificationResultsListing.css('border-width', '1px');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
var nfReportingTask = {
|
var nfReportingTask = {
|
||||||
/**
|
/**
|
||||||
* Initializes the reporting task configuration dialog.
|
* Initializes the reporting task configuration dialog.
|
||||||
|
@ -375,6 +405,14 @@
|
||||||
|
|
||||||
// removed the cached reporting task details
|
// removed the cached reporting task details
|
||||||
$('#reporting-task-configuration').removeData('reportingTaskDetails');
|
$('#reporting-task-configuration').removeData('reportingTaskDetails');
|
||||||
|
|
||||||
|
// clean up an shown verification errors
|
||||||
|
$('#reporting-task-properties-verification-results').hide();
|
||||||
|
$('#reporting-task-properties-verification-results-listing').css('border-width', '0').empty();
|
||||||
|
$('#reporting-task-properties').css('bottom', '0');
|
||||||
|
|
||||||
|
// clear most recently submitted referenced attributes
|
||||||
|
referencedAttributes = null;
|
||||||
},
|
},
|
||||||
open: function () {
|
open: function () {
|
||||||
nfCommon.toggleScrollable($('#' + this.find('.tab-container').attr('id') + '-content').get(0));
|
nfCommon.toggleScrollable($('#' + this.find('.tab-container').attr('id') + '-content').get(0));
|
||||||
|
@ -605,7 +643,10 @@
|
||||||
// load the property table
|
// load the property table
|
||||||
$('#reporting-task-properties')
|
$('#reporting-task-properties')
|
||||||
.propertytable('setGroupId', null)
|
.propertytable('setGroupId', null)
|
||||||
.propertytable('loadProperties', reportingTask.properties, reportingTask.descriptors, reportingTaskHistory.propertyHistory);
|
.propertytable('loadProperties', reportingTask.properties, reportingTask.descriptors, reportingTaskHistory.propertyHistory)
|
||||||
|
.propertytable('setPropertyVerificationCallback', function (proposedProperties) {
|
||||||
|
nfVerify.verify(reportingTask['id'], reportingTaskEntity['uri'], proposedProperties, referencedAttributes, handleVerificationResults, $('#reporting-task-properties-verification-results-listing'));
|
||||||
|
});
|
||||||
|
|
||||||
// show the details
|
// show the details
|
||||||
$('#reporting-task-configuration').modal('show');
|
$('#reporting-task-configuration').modal('show');
|
||||||
|
|
|
@ -0,0 +1,847 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* global define, module, require, exports */
|
||||||
|
|
||||||
|
(function (root, factory) {
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
define(['jquery',
|
||||||
|
'nf.Common',
|
||||||
|
'nf.Dialog',
|
||||||
|
'nf.ng.Bridge',
|
||||||
|
'nf.ErrorHandler'],
|
||||||
|
function ($, nfCommon, nfDialog, nfNgBridge, nfErrorHandler) {
|
||||||
|
return (nf.Verify = factory($, nfCommon, nfDialog, nfNgBridge, nfErrorHandler));
|
||||||
|
});
|
||||||
|
} else if (typeof exports === 'object' && typeof module === 'object') {
|
||||||
|
module.exports = (nf.Verify =
|
||||||
|
factory(require('jquery'),
|
||||||
|
require('nf.Common'),
|
||||||
|
require('nf.Dialog'),
|
||||||
|
require('nf.ng.Bridge'),
|
||||||
|
require('nf.ErrorHandler')));
|
||||||
|
} else {
|
||||||
|
nf.Verify = factory(root.$,
|
||||||
|
root.nf.Common,
|
||||||
|
root.nf.Dialog,
|
||||||
|
root.nf.ng.Bridge,
|
||||||
|
root.nf.ErrorHandler);
|
||||||
|
}
|
||||||
|
}(this, function ($, nfCommon, nfDialog, nfNgBridge, nfErrorHandler) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var gridOptions = {
|
||||||
|
autosizeColsMode: Slick.GridAutosizeColsMode.LegacyForceFit,
|
||||||
|
enableTextSelectionOnCells: true,
|
||||||
|
enableCellNavigation: true,
|
||||||
|
enableColumnReorder: false,
|
||||||
|
editable: true,
|
||||||
|
enableAddRow: false,
|
||||||
|
autoEdit: false,
|
||||||
|
multiSelect: false,
|
||||||
|
rowHeight: 24
|
||||||
|
};
|
||||||
|
|
||||||
|
// text editor
|
||||||
|
var textEditor = function (args) {
|
||||||
|
var scope = this;
|
||||||
|
var initialValue = '';
|
||||||
|
var previousValue;
|
||||||
|
var wrapper;
|
||||||
|
var isEmpty;
|
||||||
|
var input;
|
||||||
|
|
||||||
|
this.init = function () {
|
||||||
|
var container = $('body');
|
||||||
|
|
||||||
|
// record the previous value
|
||||||
|
previousValue = args.item[args.column.field];
|
||||||
|
|
||||||
|
// create the wrapper
|
||||||
|
wrapper = $('<div></div>').addClass('slickgrid-editor').css({
|
||||||
|
'z-index': 100000,
|
||||||
|
'position': 'absolute',
|
||||||
|
'border-radius': '2px',
|
||||||
|
'box-shadow': 'rgba(0, 0, 0, 0.247059) 0px 2px 5px',
|
||||||
|
'background-color': 'rgb(255, 255, 255)',
|
||||||
|
'overflow': 'hidden',
|
||||||
|
'padding': '10px 20px',
|
||||||
|
'cursor': 'move',
|
||||||
|
'transform': 'translate3d(0px, 0px, 0px)'
|
||||||
|
}).appendTo(container);
|
||||||
|
|
||||||
|
// create the input field
|
||||||
|
input = $('<textarea hidefocus rows="5"/>').css({
|
||||||
|
'height': '80px',
|
||||||
|
'width': args.position.width + 'px',
|
||||||
|
'min-width': '212px',
|
||||||
|
'margin-bottom': '5px',
|
||||||
|
'margin-top': '10px',
|
||||||
|
'white-space': 'pre'
|
||||||
|
}).tab().on('keydown', scope.handleKeyDown).appendTo(wrapper);
|
||||||
|
|
||||||
|
wrapper.draggable({
|
||||||
|
cancel: '.button, textarea, .nf-checkbox',
|
||||||
|
containment: 'parent'
|
||||||
|
});
|
||||||
|
|
||||||
|
// create the button panel
|
||||||
|
var stringCheckPanel = $('<div class="string-check-container" />');
|
||||||
|
stringCheckPanel.appendTo(wrapper);
|
||||||
|
|
||||||
|
// build the custom checkbox
|
||||||
|
isEmpty = $('<div class="nf-checkbox string-check" />')
|
||||||
|
.on('change', function (event, args) {
|
||||||
|
// if we are setting as an empty string, disable the editor
|
||||||
|
if (args.isChecked) {
|
||||||
|
input.prop('disabled', true).val('');
|
||||||
|
} else {
|
||||||
|
input.prop('disabled', false).val(previousValue);
|
||||||
|
}
|
||||||
|
}).appendTo(stringCheckPanel);
|
||||||
|
$('<span class="string-check-label nf-checkbox-label"> Set empty string</span>').appendTo(stringCheckPanel);
|
||||||
|
|
||||||
|
var ok = $('<div class="button">Ok</div>').css({
|
||||||
|
'color': '#fff',
|
||||||
|
'background': '#728E9B'
|
||||||
|
}).hover(
|
||||||
|
function () {
|
||||||
|
$(this).css('background', '#004849');
|
||||||
|
}, function () {
|
||||||
|
$(this).css('background', '#728E9B');
|
||||||
|
}).on('click', scope.save);
|
||||||
|
var cancel = $('<div class="secondary-button">Cancel</div>').css({
|
||||||
|
'color': '#004849',
|
||||||
|
'background': '#E3E8EB'
|
||||||
|
}).hover(
|
||||||
|
function () {
|
||||||
|
$(this).css('background', '#C7D2D7');
|
||||||
|
}, function () {
|
||||||
|
$(this).css('background', '#E3E8EB');
|
||||||
|
}).on('click', scope.cancel);
|
||||||
|
$('<div></div>').css({
|
||||||
|
'position': 'relative',
|
||||||
|
'top': '10px',
|
||||||
|
'left': '20px',
|
||||||
|
'width': '212px',
|
||||||
|
'clear': 'both',
|
||||||
|
'float': 'right'
|
||||||
|
}).append(ok).append(cancel).append('<div class="clear"></div>').appendTo(wrapper);
|
||||||
|
|
||||||
|
// position and focus
|
||||||
|
scope.position(args.position);
|
||||||
|
input.focus().select();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.handleKeyDown = function (e) {
|
||||||
|
if (e.which === $.ui.keyCode.ENTER && !e.shiftKey) {
|
||||||
|
scope.save();
|
||||||
|
} else if (e.which === $.ui.keyCode.ESCAPE) {
|
||||||
|
scope.cancel();
|
||||||
|
|
||||||
|
// prevent further propagation or escape press and prevent default behavior
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.save = function () {
|
||||||
|
args.commitChanges();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.cancel = function () {
|
||||||
|
input.val(initialValue);
|
||||||
|
args.cancelChanges();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.hide = function () {
|
||||||
|
wrapper.hide();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.show = function () {
|
||||||
|
wrapper.show();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.position = function (position) {
|
||||||
|
wrapper.css({
|
||||||
|
'top': position.top - 27,
|
||||||
|
'left': position.left - 20
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.destroy = function () {
|
||||||
|
wrapper.remove();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.focus = function () {
|
||||||
|
input.focus();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.loadValue = function (item) {
|
||||||
|
var isEmptyChecked = false;
|
||||||
|
|
||||||
|
// determine the value to use when populating the text field
|
||||||
|
if (nfCommon.isDefinedAndNotNull(item[args.column.field])) {
|
||||||
|
initialValue = item[args.column.field];
|
||||||
|
isEmptyChecked = initialValue === '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// determine if its an empty string
|
||||||
|
var checkboxStyle = isEmptyChecked ? 'checkbox-checked' : 'checkbox-unchecked';
|
||||||
|
isEmpty.addClass(checkboxStyle);
|
||||||
|
|
||||||
|
input.val(initialValue);
|
||||||
|
input.select();
|
||||||
|
};
|
||||||
|
|
||||||
|
this.serializeValue = function () {
|
||||||
|
// if the field has been cleared, set the value accordingly
|
||||||
|
if (input.val() === '') {
|
||||||
|
// if the user has checked the empty string checkbox, use emtpy string
|
||||||
|
if (isEmpty.hasClass('checkbox-checked')) {
|
||||||
|
return '';
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// if there is text specified, use that value
|
||||||
|
return input.val();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
this.applyValue = function (item, state) {
|
||||||
|
item[args.column.field] = state;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.isValueChanged = function () {
|
||||||
|
return scope.serializeValue() !== previousValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.validate = function () {
|
||||||
|
return {
|
||||||
|
valid: true,
|
||||||
|
msg: null
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// initialize the custom long text editor
|
||||||
|
this.init();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the dialog.
|
||||||
|
*/
|
||||||
|
var resetDialog = function () {
|
||||||
|
var referencedAttributesGrid = $('#referenced-attributes-table').data('gridInstance');
|
||||||
|
var referencedAttributesData = referencedAttributesGrid.getData();
|
||||||
|
referencedAttributesGrid.setSelectedRows([]);
|
||||||
|
referencedAttributesData.setItems([]);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialized the referenced attributes dialog.
|
||||||
|
*/
|
||||||
|
var initializeReferencedAttributesDialog = function () {
|
||||||
|
$('#referenced-attributes-dialog').modal({
|
||||||
|
scrollableContentStyle: 'scrollable',
|
||||||
|
headerText: 'Referenced Attributes',
|
||||||
|
handler: {
|
||||||
|
close: function () {
|
||||||
|
resetDialog();
|
||||||
|
},
|
||||||
|
open: function () {
|
||||||
|
var referencedAttributesGrid = $('#referenced-attributes-table').data('gridInstance');
|
||||||
|
if (nfCommon.isDefinedAndNotNull(referencedAttributesGrid)) {
|
||||||
|
referencedAttributesGrid.resizeCanvas();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var verify = function (componentId, componentUri, proposedProperties, referencedAttributeMap, handleVerificationResults, verificationResultsContainer) {
|
||||||
|
// submit verification
|
||||||
|
performVerification(componentId, componentUri, proposedProperties, referencedAttributeMap).done(function (verificationResults) {
|
||||||
|
// empty the previous listing
|
||||||
|
verificationResultsContainer.empty();
|
||||||
|
|
||||||
|
// render the verification results
|
||||||
|
$.each(verificationResults, function (i, result) {
|
||||||
|
var verificationResultContainer = $('<div class="verification-result"></div>').appendTo(verificationResultsContainer);
|
||||||
|
|
||||||
|
// determine the icon for this result
|
||||||
|
var outcomeClass;
|
||||||
|
switch (result.outcome) {
|
||||||
|
case 'SUCCESSFUL':
|
||||||
|
outcomeClass = 'fa-check';
|
||||||
|
break;
|
||||||
|
case 'FAILED':
|
||||||
|
outcomeClass = 'fa-times';
|
||||||
|
break;
|
||||||
|
case 'SKIPPED':
|
||||||
|
outcomeClass = 'fa-exclamation';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// build the header
|
||||||
|
var verificationHeader = $('<div class="verification-result-header"></div>').appendTo(verificationResultContainer);
|
||||||
|
$('<div class="verification-result-outcome fa ' + outcomeClass + '"></div>').appendTo(verificationHeader);
|
||||||
|
$('<div class="verification-result-step-name"></div>').text(result.verificationStepName).appendTo(verificationHeader);
|
||||||
|
$('<div class="clear"></div>').appendTo(verificationHeader);
|
||||||
|
|
||||||
|
// build the explanation
|
||||||
|
$('<div class="verification-result-explanation"></div>').text(result.explanation).appendTo(verificationResultContainer);
|
||||||
|
});
|
||||||
|
|
||||||
|
// invoke the verification callback if specified
|
||||||
|
if (typeof handleVerificationResults === 'function') {
|
||||||
|
handleVerificationResults(verificationResults, referencedAttributeMap);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the button model for the verification of this component and proposed properties.
|
||||||
|
*
|
||||||
|
* @param componentId the component id
|
||||||
|
* @param componentUri the component uri
|
||||||
|
* @param proposedProperties the proposed properties
|
||||||
|
* @param handleVerificationResults verification results callback
|
||||||
|
* @param verificationResultsContainer container where verification results should be rendered
|
||||||
|
*/
|
||||||
|
var updateReferencedAttributesButtonModel = function (componentId, componentUri, proposedProperties, handleVerificationResults, verificationResultsContainer) {
|
||||||
|
$('#referenced-attributes-dialog').modal('setButtonModel', [{
|
||||||
|
buttonText: 'Verify',
|
||||||
|
color: {
|
||||||
|
base: '#728E9B',
|
||||||
|
hover: '#004849',
|
||||||
|
text: '#ffffff'
|
||||||
|
},
|
||||||
|
handler: {
|
||||||
|
click: function () {
|
||||||
|
// get the referenced attributes name/values
|
||||||
|
var referencedAttributesGrid = $('#referenced-attributes-table').data('gridInstance');
|
||||||
|
var referencedAttributesData = referencedAttributesGrid.getData();
|
||||||
|
var referencedAttributes = referencedAttributesData.getItems();
|
||||||
|
|
||||||
|
// map the referenced attributes
|
||||||
|
var referencedAttributeMap = referencedAttributes.reduce(function(map, referencedAttribute) {
|
||||||
|
map[referencedAttribute.name] = referencedAttribute.value;
|
||||||
|
return map;
|
||||||
|
}, {});
|
||||||
|
|
||||||
|
// hide the referenced attributes dialog prior to performing the verification
|
||||||
|
$('#referenced-attributes-dialog').modal('hide');
|
||||||
|
|
||||||
|
// verify
|
||||||
|
verify(componentId, componentUri, proposedProperties, referencedAttributeMap, handleVerificationResults, verificationResultsContainer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
buttonText: 'Cancel',
|
||||||
|
color: {
|
||||||
|
base: '#E3E8EB',
|
||||||
|
hover: '#C7D2D7',
|
||||||
|
text: '#004849'
|
||||||
|
},
|
||||||
|
handler: {
|
||||||
|
click: function () {
|
||||||
|
$('#referenced-attributes-dialog').modal('hide');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the verification request status dialog.
|
||||||
|
*/
|
||||||
|
var initializeVerificationRequestStatusDialog = function () {
|
||||||
|
// configure the verification request status dialog
|
||||||
|
$('#verification-request-status-dialog').modal({
|
||||||
|
scrollableContentStyle: 'scrollable',
|
||||||
|
headerText: 'Verifying Properties',
|
||||||
|
handler: {
|
||||||
|
close: function () {
|
||||||
|
// clear the current button model
|
||||||
|
$('#verification-request-status-dialog').modal('setButtonModel', []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialized the new referenced attribute dialog.
|
||||||
|
*/
|
||||||
|
var initializeNewAttributeDialog = function () {
|
||||||
|
$('#new-referenced-attribute-dialog').modal({
|
||||||
|
headerText: 'New Attribute',
|
||||||
|
buttons: [{
|
||||||
|
buttonText: 'Ok',
|
||||||
|
color: {
|
||||||
|
base: '#728E9B',
|
||||||
|
hover: '#004849',
|
||||||
|
text: '#ffffff'
|
||||||
|
},
|
||||||
|
handler: {
|
||||||
|
click: function () {
|
||||||
|
addNewReferencedAttribute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
buttonText: 'Cancel',
|
||||||
|
color: {
|
||||||
|
base: '#E3E8EB',
|
||||||
|
hover: '#C7D2D7',
|
||||||
|
text: '#004849'
|
||||||
|
},
|
||||||
|
handler: {
|
||||||
|
click: function () {
|
||||||
|
$('#new-referenced-attribute-dialog').modal('hide');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
handler: {
|
||||||
|
close: function () {
|
||||||
|
$('#new-referenced-attribute-name').val('');
|
||||||
|
},
|
||||||
|
open: function () {
|
||||||
|
$('#new-referenced-attribute-name').focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#new-referenced-attribute-name').on('keydown', function (e) {
|
||||||
|
var code = e.keyCode ? e.keyCode : e.which;
|
||||||
|
if (code === $.ui.keyCode.ENTER) {
|
||||||
|
addNewReferencedAttribute();
|
||||||
|
|
||||||
|
// prevents the enter from propagating into the field for editing the new property value
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#add-referenced-attribute').on('click', function () {
|
||||||
|
$('#new-referenced-attribute-dialog').modal('show');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a new referenced attribute.
|
||||||
|
*/
|
||||||
|
var addNewReferencedAttribute = function () {
|
||||||
|
var attributeName = $.trim($('#new-referenced-attribute-name').val());
|
||||||
|
|
||||||
|
// ensure the property name is specified
|
||||||
|
if (attributeName !== '') {
|
||||||
|
var referencedAttributeGrid = $('#referenced-attributes-table').data('gridInstance');
|
||||||
|
var referencedAttributeData = referencedAttributeGrid.getData();
|
||||||
|
|
||||||
|
// ensure the property name is unique
|
||||||
|
var matchingAttribute = null;
|
||||||
|
$.each(referencedAttributeData.getItems(), function (_, item) {
|
||||||
|
if (attributeName === item.name) {
|
||||||
|
matchingAttribute = item;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (matchingAttribute === null) {
|
||||||
|
referencedAttributeData.beginUpdate();
|
||||||
|
|
||||||
|
// add a row for the new attribute
|
||||||
|
referencedAttributeData.addItem({
|
||||||
|
id: attributeName,
|
||||||
|
name: attributeName,
|
||||||
|
value: null,
|
||||||
|
});
|
||||||
|
|
||||||
|
referencedAttributeData.endUpdate();
|
||||||
|
|
||||||
|
// sort the data
|
||||||
|
referencedAttributeData.reSort();
|
||||||
|
|
||||||
|
// select the new variable row
|
||||||
|
var row = referencedAttributeData.getRowById(attributeName);
|
||||||
|
referencedAttributeGrid.setActiveCell(row, referencedAttributeGrid.getColumnIndex('value'));
|
||||||
|
referencedAttributeGrid.editActiveCell();
|
||||||
|
} else {
|
||||||
|
// if this row is currently hidden, clear the value and show it
|
||||||
|
nfDialog.showOkDialog({
|
||||||
|
headerText: 'Attribute Exists',
|
||||||
|
dialogContent: 'An attribute with this name already exists.'
|
||||||
|
});
|
||||||
|
|
||||||
|
// select the existing properties row
|
||||||
|
var matchingRow = referencedAttributeData.getRowById(matchingAttribute.id);
|
||||||
|
referencedAttributeGrid.setSelectedRows([matchingRow]);
|
||||||
|
referencedAttributeGrid.scrollRowIntoView(matchingRow);
|
||||||
|
}
|
||||||
|
|
||||||
|
// close the new variable dialog
|
||||||
|
$('#new-referenced-attribute-dialog').modal('hide');
|
||||||
|
} else {
|
||||||
|
nfDialog.showOkDialog({
|
||||||
|
headerText: 'Attribute Error',
|
||||||
|
dialogContent: 'The name of the attribute must be specified.'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sorts the specified data using the specified sort details.
|
||||||
|
*
|
||||||
|
* @param {object} sortDetails
|
||||||
|
* @param {object} data
|
||||||
|
*/
|
||||||
|
var sortReferencedAttributes = function (sortDetails, data) {
|
||||||
|
// defines a function for sorting
|
||||||
|
var comparer = function (a, b) {
|
||||||
|
var aString = nfCommon.isDefinedAndNotNull(a[sortDetails.columnId]) ? a[sortDetails.columnId] : '';
|
||||||
|
var bString = nfCommon.isDefinedAndNotNull(b[sortDetails.columnId]) ? b[sortDetails.columnId] : '';
|
||||||
|
return aString === bString ? 0 : aString > bString ? 1 : -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
// perform the sort
|
||||||
|
data.sort(comparer, sortDetails.sortAsc);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the referenced attributes table
|
||||||
|
*/
|
||||||
|
var initializeReferencedAttributesTable = function () {
|
||||||
|
var referencedAttributesGridElement = $('#referenced-attributes-table');
|
||||||
|
|
||||||
|
var nameFormatter = function (row, cell, value, columnDef, dataContext) {
|
||||||
|
return nfCommon.escapeHtml(value);
|
||||||
|
};
|
||||||
|
|
||||||
|
var valueFormatter = function (row, cell, value, columnDef, dataContext) {
|
||||||
|
if (value === '') {
|
||||||
|
return '<span class="table-cell blank">Empty string set</span>';
|
||||||
|
} else if (value === null) {
|
||||||
|
return '<span class="unset">No value set</span>';
|
||||||
|
} else {
|
||||||
|
return nfCommon.escapeHtml(value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// define the column model for the referenced attributes table
|
||||||
|
var referencedAttributesColumns = [
|
||||||
|
{
|
||||||
|
id: 'name',
|
||||||
|
name: 'Name',
|
||||||
|
field: 'name',
|
||||||
|
formatter: nameFormatter,
|
||||||
|
sortable: true,
|
||||||
|
resizable: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'value',
|
||||||
|
name: 'Value',
|
||||||
|
field: 'value',
|
||||||
|
formatter: valueFormatter,
|
||||||
|
sortable: true,
|
||||||
|
resizable: true,
|
||||||
|
cssClass: 'pointer'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
// initialize the dataview
|
||||||
|
var referencedAttributesData = new Slick.Data.DataView({
|
||||||
|
inlineFilters: false
|
||||||
|
});
|
||||||
|
referencedAttributesData.getItemMetadata = function (index) {
|
||||||
|
return {
|
||||||
|
columns: {
|
||||||
|
value: {
|
||||||
|
editor: textEditor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// initialize the sort
|
||||||
|
sortReferencedAttributes({
|
||||||
|
columnId: 'name',
|
||||||
|
sortAsc: true
|
||||||
|
}, referencedAttributesData);
|
||||||
|
|
||||||
|
// initialize the grid
|
||||||
|
var referencedAttributesGrid = new Slick.Grid(referencedAttributesGridElement, referencedAttributesData, referencedAttributesColumns, gridOptions);
|
||||||
|
referencedAttributesGrid.setSelectionModel(new Slick.RowSelectionModel());
|
||||||
|
referencedAttributesGrid.registerPlugin(new Slick.AutoTooltips());
|
||||||
|
referencedAttributesGrid.setSortColumn('name', true);
|
||||||
|
referencedAttributesGrid.onSort.subscribe(function (e, args) {
|
||||||
|
sortReferencedAttributes({
|
||||||
|
columnId: args.sortCol.id,
|
||||||
|
sortAsc: args.sortAsc
|
||||||
|
}, referencedAttributesData);
|
||||||
|
});
|
||||||
|
referencedAttributesGrid.onClick.subscribe(function (e, args) {
|
||||||
|
if (referencedAttributesGrid.getColumns()[args.cell].id === 'value') {
|
||||||
|
referencedAttributesGrid.gotoCell(args.row, args.cell, true);
|
||||||
|
|
||||||
|
// prevents standard edit logic
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
referencedAttributesGrid.onBeforeCellEditorDestroy.subscribe(function (e, args) {
|
||||||
|
setTimeout(function() {
|
||||||
|
referencedAttributesGrid.resizeCanvas();
|
||||||
|
}, 50);
|
||||||
|
});
|
||||||
|
|
||||||
|
// wire up the dataview to the grid
|
||||||
|
referencedAttributesData.onRowCountChanged.subscribe(function (e, args) {
|
||||||
|
referencedAttributesGrid.updateRowCount();
|
||||||
|
referencedAttributesGrid.render();
|
||||||
|
});
|
||||||
|
referencedAttributesData.onRowsChanged.subscribe(function (e, args) {
|
||||||
|
referencedAttributesGrid.invalidateRows(args.rows);
|
||||||
|
referencedAttributesGrid.render();
|
||||||
|
});
|
||||||
|
referencedAttributesData.syncGridSelection(referencedAttributesGrid, true);
|
||||||
|
|
||||||
|
// hold onto an instance of the grid
|
||||||
|
referencedAttributesGridElement.data('gridInstance', referencedAttributesGrid);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs verification for the specific configuration and referenced attributes.
|
||||||
|
*
|
||||||
|
* @param id the component id
|
||||||
|
* @param componentUrl the component url
|
||||||
|
* @param proposedProperties the proposed properties
|
||||||
|
* @param attributes the attributes names/values
|
||||||
|
*/
|
||||||
|
var performVerification = function (id, componentUrl, proposedProperties, attributes) {
|
||||||
|
var MAX_DELAY = 4;
|
||||||
|
var cancelled = false;
|
||||||
|
var verificationRequest = null;
|
||||||
|
var verificationRequestTimer = null;
|
||||||
|
|
||||||
|
return $.Deferred(function (deferred) {
|
||||||
|
// updates the progress bar
|
||||||
|
var updateProgress = function (percentComplete) {
|
||||||
|
// remove existing labels
|
||||||
|
var progressBar = $('#verification-request-percent-complete');
|
||||||
|
progressBar.find('div.progress-label').remove();
|
||||||
|
progressBar.find('md-progress-linear').remove();
|
||||||
|
|
||||||
|
// update the progress
|
||||||
|
var label = $('<div class="progress-label"></div>').text(percentComplete + '%');
|
||||||
|
(nfNgBridge.injector.get('$compile')($('<md-progress-linear ng-cloak ng-value="' + percentComplete + '" class="md-hue-2" md-mode="determinate" aria-label="Searching Queue"></md-progress-linear>'))(nfNgBridge.rootScope)).appendTo(progressBar);
|
||||||
|
progressBar.append(label);
|
||||||
|
};
|
||||||
|
|
||||||
|
// update the button model of the drop request status dialog
|
||||||
|
$('#verification-request-status-dialog').modal('setButtonModel', [{
|
||||||
|
headerText: 'Verifying Properties',
|
||||||
|
buttonText: 'Stop',
|
||||||
|
color: {
|
||||||
|
base: '#728E9B',
|
||||||
|
hover: '#004849',
|
||||||
|
text: '#ffffff'
|
||||||
|
},
|
||||||
|
handler: {
|
||||||
|
click: function () {
|
||||||
|
cancelled = true;
|
||||||
|
|
||||||
|
// we are waiting for the next poll attempt
|
||||||
|
if (verificationRequestTimer !== null) {
|
||||||
|
// cancel it
|
||||||
|
clearTimeout(verificationRequestTimer);
|
||||||
|
|
||||||
|
// cancel the verification request
|
||||||
|
completeVerificationRequest();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
|
||||||
|
// completes the verification request by removing it
|
||||||
|
var completeVerificationRequest = function () {
|
||||||
|
$('#verification-request-status-dialog').modal('hide');
|
||||||
|
|
||||||
|
var reject = cancelled;
|
||||||
|
|
||||||
|
// ensure the verification requests are present
|
||||||
|
if (nfCommon.isDefinedAndNotNull(verificationRequest)) {
|
||||||
|
$.ajax({
|
||||||
|
type: 'DELETE',
|
||||||
|
url: verificationRequest.uri,
|
||||||
|
dataType: 'json'
|
||||||
|
});
|
||||||
|
|
||||||
|
// use the verification request from when the verification completed
|
||||||
|
if (nfCommon.isEmpty(verificationRequest.results)) {
|
||||||
|
if (cancelled === false) {
|
||||||
|
reject = true;
|
||||||
|
|
||||||
|
// show the dialog
|
||||||
|
nfDialog.showOkDialog({
|
||||||
|
headerText: 'Verifying Properties',
|
||||||
|
dialogContent: 'There are no results.'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
reject = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reject) {
|
||||||
|
deferred.reject();
|
||||||
|
} else {
|
||||||
|
deferred.resolve(verificationRequest.results);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// process the verification request
|
||||||
|
var processVerificationRequest = function (delay) {
|
||||||
|
// update the percent complete
|
||||||
|
updateProgress(verificationRequest.percentCompleted);
|
||||||
|
|
||||||
|
// update the status of the verification request
|
||||||
|
$('#verification-request-status-message').text(verificationRequest.state);
|
||||||
|
|
||||||
|
// close the dialog if the
|
||||||
|
if (verificationRequest.complete === true || cancelled === true) {
|
||||||
|
completeVerificationRequest();
|
||||||
|
} else {
|
||||||
|
// wait delay to poll again
|
||||||
|
verificationRequestTimer = setTimeout(function () {
|
||||||
|
// clear the verification request timer
|
||||||
|
verificationRequestTimer = null;
|
||||||
|
|
||||||
|
// schedule to poll the status again in nextDelay
|
||||||
|
pollVerificationRequest(Math.min(MAX_DELAY, delay * 2));
|
||||||
|
}, delay * 1000);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// schedule for the next poll iteration
|
||||||
|
var pollVerificationRequest = function (nextDelay) {
|
||||||
|
$.ajax({
|
||||||
|
type: 'GET',
|
||||||
|
url: verificationRequest.uri,
|
||||||
|
dataType: 'json'
|
||||||
|
}).done(function (response) {
|
||||||
|
verificationRequest = response.request;
|
||||||
|
processVerificationRequest(nextDelay);
|
||||||
|
}).fail(completeVerificationRequest).fail(nfErrorHandler.handleAjaxError);
|
||||||
|
};
|
||||||
|
|
||||||
|
// initialize the progress bar value
|
||||||
|
updateProgress(0);
|
||||||
|
|
||||||
|
// show the progress dialog
|
||||||
|
$('#verification-request-status-dialog').modal('show');
|
||||||
|
|
||||||
|
// issue the request to verify the properties
|
||||||
|
$.ajax({
|
||||||
|
type: 'POST',
|
||||||
|
url: componentUrl + '/config/verification-requests',
|
||||||
|
data: JSON.stringify({
|
||||||
|
request: {
|
||||||
|
componentId: id,
|
||||||
|
properties: proposedProperties,
|
||||||
|
attributes: attributes
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
dataType: 'json',
|
||||||
|
contentType: 'application/json'
|
||||||
|
}).done(function (response) {
|
||||||
|
// process the verification request
|
||||||
|
verificationRequest = response.request;
|
||||||
|
processVerificationRequest(1);
|
||||||
|
}).fail(completeVerificationRequest).fail(nfErrorHandler.handleAjaxError);
|
||||||
|
}).promise();
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the verification component.
|
||||||
|
*/
|
||||||
|
init: function () {
|
||||||
|
initializeVerificationRequestStatusDialog();
|
||||||
|
initializeReferencedAttributesDialog();
|
||||||
|
initializeReferencedAttributesTable();
|
||||||
|
initializeNewAttributeDialog();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Peforms verification for a given component.
|
||||||
|
*
|
||||||
|
* @param id the component id
|
||||||
|
* @param componentUrl the component url
|
||||||
|
* @param proposedProperties the proposed attributes
|
||||||
|
* @param referencedAttributes the most recently submitted referenced attributes, null if not submitted previously
|
||||||
|
* @param handleVerificationResults callback for handling verification results
|
||||||
|
* @param verificationResultsContainer container where verification results should be rendered
|
||||||
|
*/
|
||||||
|
verify: function (id, componentUrl, proposedProperties, referencedAttributes, handleVerificationResults, verificationResultsContainer) {
|
||||||
|
// get the referenced attributes
|
||||||
|
$.ajax({
|
||||||
|
type: 'POST',
|
||||||
|
url: componentUrl + '/config/analysis',
|
||||||
|
data: JSON.stringify({
|
||||||
|
configurationAnalysis: {
|
||||||
|
componentId: id,
|
||||||
|
properties: proposedProperties
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
dataType: 'json',
|
||||||
|
contentType: 'application/json'
|
||||||
|
}).done(function(response) {
|
||||||
|
var configurationAnalysis = response.configurationAnalysis;
|
||||||
|
|
||||||
|
// if the component does not support additional verification there is no need to prompt for attribute values
|
||||||
|
if (configurationAnalysis.supportsVerification === false) {
|
||||||
|
verify(id, componentUrl, proposedProperties, {}, handleVerificationResults, verificationResultsContainer);
|
||||||
|
} else {
|
||||||
|
// combine the previously entered referenced attributes with the updated attributes from the configuration analysis
|
||||||
|
var combinedReferencedAttributes = $.extend({}, configurationAnalysis.referencedAttributes, referencedAttributes);
|
||||||
|
|
||||||
|
var referencedAttributesGrid = $('#referenced-attributes-table').data('gridInstance');
|
||||||
|
var referencedAttributesData = referencedAttributesGrid.getData();
|
||||||
|
|
||||||
|
// begin the update
|
||||||
|
referencedAttributesData.beginUpdate();
|
||||||
|
|
||||||
|
$.each(combinedReferencedAttributes, function (name, value) {
|
||||||
|
referencedAttributesData.addItem({
|
||||||
|
id: name,
|
||||||
|
name: name,
|
||||||
|
value: value
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// complete the update
|
||||||
|
referencedAttributesData.endUpdate();
|
||||||
|
referencedAttributesData.reSort();
|
||||||
|
|
||||||
|
// update the button model for this verification
|
||||||
|
updateReferencedAttributesButtonModel(id, componentUrl, proposedProperties, handleVerificationResults, verificationResultsContainer);
|
||||||
|
|
||||||
|
// show the dialog
|
||||||
|
$('#referenced-attributes-dialog').modal('show');
|
||||||
|
}
|
||||||
|
}).fail(nfErrorHandler.handleAjaxError);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}));
|
Loading…
Reference in New Issue