diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/cluster/nf-cluster-table.js b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/cluster/nf-cluster-table.js index 13b0e5f24c..29689190a7 100644 --- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/cluster/nf-cluster-table.js +++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/cluster/nf-cluster-table.js @@ -109,6 +109,22 @@ nf.ClusterTable = (function () { return nf.Common.escapeHtml(node.address) + ':' + nf.Common.escapeHtml(node.apiPort); }; + /** + * Prompts to verify node connection. + * + * @argument {object} node The node + */ + var promptForConnect = function (node) { + // prompt to connect + nf.Dialog.showYesNoDialog({ + dialogContent: 'Connect \'' + formatNodeAddress(node) + '\' to this cluster?', + overlayBackground: false, + yesHandler: function () { + connect(node.nodeId); + } + }); + }; + /** * Connects the node in the specified row. * @@ -132,6 +148,22 @@ nf.ClusterTable = (function () { }).fail(nf.Common.handleAjaxError); }; + /** + * Prompts to verify node disconnection. + * + * @argument {object} node The node + */ + var promptForDisconnect = function (node) { + // prompt for disconnect + nf.Dialog.showYesNoDialog({ + dialogContent: 'Disconnect \'' + formatNodeAddress(node) + '\' from the cluster?', + overlayBackground: false, + yesHandler: function () { + disconnect(node.nodeId); + } + }); + }; + /** * Disconnects the node in the specified row. * @@ -155,6 +187,22 @@ nf.ClusterTable = (function () { }).fail(nf.Common.handleAjaxError); }; + /** + * Prompts to verify node disconnection. + * + * @argument {object} node The node + */ + var promptForRemoval = function (node) { + // prompt for disconnect + nf.Dialog.showYesNoDialog({ + dialogContent: 'Remove \'' + formatNodeAddress(node) + '\' from the cluster?', + overlayBackground: false, + yesHandler: function () { + remove(node.nodeId); + } + }); + }; + /** * Disconnects the node in the specified row. * @@ -230,6 +278,86 @@ nf.ClusterTable = (function () { // perform the filter return item[args.property].search(filterExp) >= 0; }; + + /** + * Show the node details. + * + * @argument {object} item The item + */ + var showNodeDetails = function (item) { + $.ajax({ + type: 'GET', + url: config.urls.nodes + '/' + encodeURIComponent(item.nodeId), + dataType: 'json' + }).done(function (response) { + var node = response.node; + + // update the dialog fields + $('#node-id').text(node.nodeId); + $('#node-address').text(formatNodeAddress(node)); + + // format the events + var events = $('#node-events'); + if ($.isArray(node.events) && node.events.length > 0) { + var eventMessages = []; + $.each(node.events, function (i, event) { + eventMessages.push(event.timestamp + ": " + event.message); + }); + $('
').append(nf.Common.formatUnorderedList(eventMessages)).appendTo(events); + } else { + events.append('
None
'); + } + + // show the dialog + $('#node-details-dialog').modal('show'); + }).fail(nf.Common.handleAjaxError); + }; + + /** + * Makes the specified node the primary node of the cluster. + * + * @argument {object} item The node item + */ + var makePrimary = function (item) { + $.ajax({ + type: 'PUT', + url: config.urls.nodes + '/' + encodeURIComponent(item.nodeId), + data: { + primary: true + }, + dataType: 'json' + }).done(function (response) { + var grid = $('#cluster-table').data('gridInstance'); + var data = grid.getData(); + + var node = response.node; + + // start the update + data.beginUpdate(); + data.updateItem(node.nodeId, node); + + // need to find the previous primary node + // get the property grid data + var clusterItems = data.getItems(); + $.each(clusterItems, function (i, otherNode) { + // attempt to identify the previous primary node + if (node.nodeId !== otherNode.nodeId && otherNode.primary === true) { + // reset its primary status + otherNode.primary = false; + otherNode.status = 'CONNECTED'; + + // set the new node state + data.updateItem(otherNode.nodeId, otherNode); + + // no need to continue processing + return false; + } + }); + + // end the update + data.endUpdate(); + }).fail(nf.Common.handleAjaxError); + }; return { /** @@ -292,7 +420,7 @@ nf.ClusterTable = (function () { // define a custom formatter for the more details column var moreDetailsFormatter = function (row, cell, value, columnDef, dataContext) { - return ''; + return ''; }; // define a custom formatter for the run status column @@ -348,11 +476,11 @@ nf.ClusterTable = (function () { // return the appropriate markup if (canConnect) { - return ' '; + return ' '; } else if (canDisconnect) { - var actions = ''; + var actions = ''; if (canBecomePrimary) { - actions += ' '; + actions += ' '; } return actions; } else { @@ -360,7 +488,7 @@ nf.ClusterTable = (function () { } }; - columnModel.push({id: 'action', label: ' ', formatter: actionFormatter, resizable: false, sortable: false, width: 80, maxWidth: 80}); + columnModel.push({id: 'actions', label: ' ', formatter: actionFormatter, resizable: false, sortable: false, width: 80, maxWidth: 80}); } var clusterOptions = { @@ -398,6 +526,31 @@ nf.ClusterTable = (function () { sortAsc: args.sortAsc }, clusterData); }); + + // configure a click listener + clusterGrid.onClick.subscribe(function (e, args) { + var target = $(e.target); + + // get the node at this row + var item = clusterData.getItem(args.row); + + // determine the desired action + if (clusterGrid.getColumns()[args.cell].id === 'actions') { + if (target.hasClass('prompt-for-connect')) { + promptForConnect(item); + } else if (target.hasClass('prompt-for-removal')) { + promptForRemoval(item); + } else if (target.hasClass('prompt-for-disconnect')) { + promptForDisconnect(item); + } else if (target.hasClass('make-primary')) { + makePrimary(item); + } + } else if (clusterGrid.getColumns()[args.cell].id === 'moreDetails') { + if (target.hasClass('show-node-details')) { + showNodeDetails(item); + } + } + }); // wire up the dataview to the grid clusterData.onRowCountChanged.subscribe(function (e, args) { @@ -419,122 +572,6 @@ nf.ClusterTable = (function () { $('#displayed-nodes').text('0'); }, - /** - * Prompts to verify node connection. - * - * @argument {string} row The row - */ - promptForConnect: function (row) { - var grid = $('#cluster-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var node = data.getItem(row); - - // prompt to connect - nf.Dialog.showYesNoDialog({ - dialogContent: 'Connect \'' + formatNodeAddress(node) + '\' to this cluster?', - overlayBackground: false, - yesHandler: function () { - connect(node.nodeId); - } - }); - } - - }, - - /** - * Prompts to verify node disconnection. - * - * @argument {string} row The row - */ - promptForDisconnect: function (row) { - var grid = $('#cluster-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var node = data.getItem(row); - - // prompt for disconnect - nf.Dialog.showYesNoDialog({ - dialogContent: 'Disconnect \'' + formatNodeAddress(node) + '\' from the cluster?', - overlayBackground: false, - yesHandler: function () { - disconnect(node.nodeId); - } - }); - } - }, - - /** - * Makes the specified node the primary node of the cluster. - * - * @argument {string} row The row - */ - makePrimary: function (row) { - var grid = $('#cluster-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - $.ajax({ - type: 'PUT', - url: config.urls.nodes + '/' + encodeURIComponent(item.nodeId), - data: { - primary: true - }, - dataType: 'json' - }).done(function (response) { - var node = response.node; - - // start the update - data.beginUpdate(); - data.updateItem(node.nodeId, node); - - // need to find the previous primary node - // get the property grid data - var clusterItems = data.getItems(); - $.each(clusterItems, function (i, otherNode) { - // attempt to identify the previous primary node - if (node.nodeId !== otherNode.nodeId && otherNode.primary === true) { - // reset its primary status - otherNode.primary = false; - otherNode.status = 'CONNECTED'; - - // set the new node state - data.updateItem(otherNode.nodeId, otherNode); - - // no need to continue processing - return false; - } - }); - - // end the update - data.endUpdate(); - }).fail(nf.Common.handleAjaxError); - } - }, - - /** - * Prompts to verify node disconnection. - * - * @argument {string} row The row - */ - promptForRemoval: function (row) { - var grid = $('#cluster-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var node = data.getItem(row); - - // prompt for disconnect - nf.Dialog.showYesNoDialog({ - dialogContent: 'Remove \'' + formatNodeAddress(node) + '\' from the cluster?', - overlayBackground: false, - yesHandler: function () { - remove(node.nodeId); - } - }); - } - }, - /** * Update the size of the grid based on its container's current size. */ @@ -575,46 +612,6 @@ nf.ClusterTable = (function () { $('#total-nodes').text('0'); } }).fail(nf.Common.handleAjaxError); - }, - - /** - * Populate the expanded row. - * - * @argument {string} row The row - */ - showNodeDetails: function (row) { - var grid = $('#cluster-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - $.ajax({ - type: 'GET', - url: config.urls.nodes + '/' + encodeURIComponent(item.nodeId), - dataType: 'json' - }).done(function (response) { - var node = response.node; - - // update the dialog fields - $('#node-id').text(node.nodeId); - $('#node-address').text(formatNodeAddress(node)); - - // format the events - var events = $('#node-events'); - if ($.isArray(node.events) && node.events.length > 0) { - var eventMessages = []; - $.each(node.events, function (i, event) { - eventMessages.push(event.timestamp + ": " + event.message); - }); - $('
').append(nf.Common.formatUnorderedList(eventMessages)).appendTo(events); - } else { - events.append('
None
'); - } - - // show the dialog - $('#node-details-dialog').modal('show'); - }).fail(nf.Common.handleAjaxError); - } } }; }()); \ No newline at end of file diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/counters/nf-counters-table.js b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/counters/nf-counters-table.js index 536ffdbcf3..2b26aaa12e 100644 --- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/counters/nf-counters-table.js +++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/counters/nf-counters-table.js @@ -110,6 +110,26 @@ nf.CountersTable = (function () { // perform the filter return item[args.property].search(filterExp) >= 0; }; + + /** + * Resets the specified counter. + * + * @argument {object} item The counter item + */ + var resetCounter = function (item) { + $.ajax({ + type: 'PUT', + url: config.urls.counters + '/' + encodeURIComponent(item.id), + dataType: 'json' + }).done(function (response) { + var counter = response.counter; + + // get the table and update the row accordingly + var countersGrid = $('#counters-table').data('gridInstance'); + var countersData = countersGrid.getData(); + countersData.updateItem(counter.id, counter); + }).fail(nf.Common.handleAjaxError); + }; return { /** @@ -159,7 +179,7 @@ nf.CountersTable = (function () { if (nf.Common.isDFM()) { // function for formatting the actions column var actionFormatter = function (row, cell, value, columnDef, dataContext) { - return ''; + return ''; }; // add the action column @@ -202,6 +222,21 @@ nf.CountersTable = (function () { sortAsc: args.sortAsc }, countersData); }); + + // configure a click listener + countersGrid.onClick.subscribe(function (e, args) { + var target = $(e.target); + + // get the node at this row + var item = countersData.getItem(args.row); + + // determine the desired action + if (countersGrid.getColumns()[args.cell].id === 'actions') { + if (target.hasClass('reset-counter')) { + resetCounter(item); + } + } + }); // wire up the dataview to the grid countersData.onRowCountChanged.subscribe(function (e, args) { @@ -223,32 +258,6 @@ nf.CountersTable = (function () { $('#displayed-counters').text('0'); }, - /** - * Resets the specified counter. - * - * @argument {string} row The row - */ - resetCounter: function (row) { - var grid = $('#counters-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - $.ajax({ - type: 'PUT', - url: config.urls.counters + '/' + encodeURIComponent(item.id), - dataType: 'json' - }).done(function (response) { - var counter = response.counter; - - // get the table and update the row accordingly - var countersGrid = $('#counters-table').data('gridInstance'); - var countersData = countersGrid.getData(); - countersData.updateItem(counter.id, counter); - }).fail(nf.Common.handleAjaxError); - } - }, - /** * Update the size of the grid based on its container's current size. */ diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/history/nf-history-table.js b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/history/nf-history-table.js index be0ea73bc1..72fc549a72 100644 --- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/history/nf-history-table.js +++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/history/nf-history-table.js @@ -244,7 +244,7 @@ nf.HistoryTable = (function () { // define a custom formatter for the more details column var moreDetailsFormatter = function (row, cell, value, columnDef, dataContext) { - return ''; + return ''; }; // initialize the templates table @@ -283,6 +283,21 @@ nf.HistoryTable = (function () { }); historyGrid.setSortColumn('timestamp', false); + // configure a click listener + historyGrid.onClick.subscribe(function (e, args) { + var target = $(e.target); + + // get the node at this row + var item = historyModel.getItem(args.row); + + // determine the desired action + if (historyGrid.getColumns()[args.cell].id === 'moreDetails') { + if (target.hasClass('show-action-details')) { + showActionDetails(item); + } + } + }); + // listen for when the viewport changes so we can fetch the appropriate records historyGrid.onViewportChanged.subscribe(function (e, args) { var vp = historyGrid.getViewport(); @@ -325,6 +340,68 @@ nf.HistoryTable = (function () { nf.HistoryTable.loadHistoryTable(); }).fail(nf.Common.handleAjaxError); }; + + /** + * Shows the details for the specified action. + * + * @param {object} action + */ + var showActionDetails = function (action) { + // create the markup for the dialog + var detailsMarkup = $('
').append( + $('
Id
' + nf.Common.escapeHtml(action.sourceId) + '
')); + + // get any component details + var componentDetails = action.componentDetails; + + // inspect the operation to determine if there are any component details + if (nf.Common.isDefinedAndNotNull(componentDetails)) { + if (action.sourceType === 'Processor') { + detailsMarkup.append( + $('
Type
' + nf.Common.escapeHtml(componentDetails.type) + '
')); + } else if (action.sourceType === 'RemoteProcessGroup') { + detailsMarkup.append( + $('
Uri
' + nf.Common.formatValue(componentDetails.uri) + '
')); + } + } + + // get any action details + var actionDetails = action.actionDetails; + + // inspect the operation to determine if there are any action details + if (nf.Common.isDefinedAndNotNull(actionDetails)) { + if (action.operation === 'Configure') { + detailsMarkup.append( + $('
Name
' + nf.Common.formatValue(actionDetails.name) + '
')).append( + $('
Value
' + nf.Common.formatValue(actionDetails.value) + '
')).append( + $('
Previous Value
' + nf.Common.formatValue(actionDetails.previousValue) + '
')); + } else if (action.operation === 'Connect' || action.operation === 'Disconnect') { + detailsMarkup.append( + $('
Source Id
' + nf.Common.escapeHtml(actionDetails.sourceId) + '
')).append( + $('
Source Name
' + nf.Common.formatValue(actionDetails.sourceName) + '
')).append( + $('
Source Type
' + nf.Common.escapeHtml(actionDetails.sourceType) + '
')).append( + $('
Relationship(s)
' + nf.Common.formatValue(actionDetails.relationship) + '
')).append( + $('
Destination Id
' + nf.Common.escapeHtml(actionDetails.destinationId) + '
')).append( + $('
Destination Name
' + nf.Common.formatValue(actionDetails.destinationName) + '
')).append( + $('
Destination Type
' + nf.Common.escapeHtml(actionDetails.destinationType) + '
')); + } else if (action.operation === 'Move') { + detailsMarkup.append( + $('
Group
' + nf.Common.formatValue(actionDetails.group) + '
')).append( + $('
Group Id
' + nf.Common.escapeHtml(actionDetails.groupId) + '
')).append( + $('
Previous Group
' + nf.Common.formatValue(actionDetails.previousGroup) + '
')).append( + $('
Previous Group Id
' + nf.Common.escapeHtml(actionDetails.previousGroupId) + '
')); + } else if (action.operation === 'Purge') { + detailsMarkup.append( + $('
End Date
' + nf.Common.escapeHtml(actionDetails.endDate) + '
')); + } + } + + // populate the dialog + $('#action-details').append(detailsMarkup); + + // show the dialog + $('#action-details-dialog').modal('show'); + }; return { init: function () { @@ -356,74 +433,6 @@ nf.HistoryTable = (function () { // request refresh of the current 'page' historyGrid.onViewportChanged.notify(); - }, - - /** - * Shows the details for the specified action. - * - * @param {object} index - */ - showActionDetails: function (index) { - var historyGrid = $('#history-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(historyGrid)) { - var historyModel = historyGrid.getData(); - var action = historyModel.getItem(index); - - // create the markup for the dialog - var detailsMarkup = $('
').append( - $('
Id
' + nf.Common.escapeHtml(action.sourceId) + '
')); - - // get any component details - var componentDetails = action.componentDetails; - - // inspect the operation to determine if there are any component details - if (nf.Common.isDefinedAndNotNull(componentDetails)) { - if (action.sourceType === 'Processor') { - detailsMarkup.append( - $('
Type
' + nf.Common.escapeHtml(componentDetails.type) + '
')); - } else if (action.sourceType === 'RemoteProcessGroup') { - detailsMarkup.append( - $('
Uri
' + nf.Common.formatValue(componentDetails.uri) + '
')); - } - } - - // get any action details - var actionDetails = action.actionDetails; - - // inspect the operation to determine if there are any action details - if (nf.Common.isDefinedAndNotNull(actionDetails)) { - if (action.operation === 'Configure') { - detailsMarkup.append( - $('
Name
' + nf.Common.formatValue(actionDetails.name) + '
')).append( - $('
Value
' + nf.Common.formatValue(actionDetails.value) + '
')).append( - $('
Previous Value
' + nf.Common.formatValue(actionDetails.previousValue) + '
')); - } else if (action.operation === 'Connect' || action.operation === 'Disconnect') { - detailsMarkup.append( - $('
Source Id
' + nf.Common.escapeHtml(actionDetails.sourceId) + '
')).append( - $('
Source Name
' + nf.Common.formatValue(actionDetails.sourceName) + '
')).append( - $('
Source Type
' + nf.Common.escapeHtml(actionDetails.sourceType) + '
')).append( - $('
Relationship(s)
' + nf.Common.formatValue(actionDetails.relationship) + '
')).append( - $('
Destination Id
' + nf.Common.escapeHtml(actionDetails.destinationId) + '
')).append( - $('
Destination Name
' + nf.Common.formatValue(actionDetails.destinationName) + '
')).append( - $('
Destination Type
' + nf.Common.escapeHtml(actionDetails.destinationType) + '
')); - } else if (action.operation === 'Move') { - detailsMarkup.append( - $('
Group
' + nf.Common.formatValue(actionDetails.group) + '
')).append( - $('
Group Id
' + nf.Common.escapeHtml(actionDetails.groupId) + '
')).append( - $('
Previous Group
' + nf.Common.formatValue(actionDetails.previousGroup) + '
')).append( - $('
Previous Group Id
' + nf.Common.escapeHtml(actionDetails.previousGroupId) + '
')); - } else if (action.operation === 'Purge') { - detailsMarkup.append( - $('
End Date
' + nf.Common.escapeHtml(actionDetails.endDate) + '
')); - } - } - - // populate the dialog - $('#action-details').append(detailsMarkup); - - // show the dialog - $('#action-details-dialog').modal('show'); - } } }; }()); \ No newline at end of file diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/provenance/nf-provenance-table.js b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/provenance/nf-provenance-table.js index 759bcda0d1..28803757db 100644 --- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/provenance/nf-provenance-table.js +++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/provenance/nf-provenance-table.js @@ -553,7 +553,7 @@ nf.ProvenanceTable = (function () { // define a custom formatter for the more details column var moreDetailsFormatter = function (row, cell, value, columnDef, dataContext) { - return ''; + return ''; }; // define how general values are formatted @@ -570,12 +570,12 @@ nf.ProvenanceTable = (function () { // conditionally include the cluster node id if (nf.Common.SUPPORTS_SVG) { - markup += ''; + markup += ''; } // conditionally support going to the component if (isInShell && nf.Common.isDefinedAndNotNull(dataContext.groupId)) { - markup += ' '; + markup += ' '; } return markup; @@ -599,7 +599,7 @@ nf.ProvenanceTable = (function () { // conditionally show the action column if (nf.Common.SUPPORTS_SVG || isInShell) { - provenanceColumns.push({id: 'action', name: ' ', formatter: showLineageFormatter, resizable: false, sortable: false, width: 50, maxWidth: 50}); + provenanceColumns.push({id: 'actions', name: ' ', formatter: showLineageFormatter, resizable: false, sortable: false, width: 50, maxWidth: 50}); } var provenanceOptions = { @@ -641,6 +641,27 @@ nf.ProvenanceTable = (function () { sortAsc: args.sortAsc }, provenanceData); }); + + // configure a click listener + provenanceGrid.onClick.subscribe(function (e, args) { + var target = $(e.target); + + // get the node at this row + var item = provenanceData.getItem(args.row); + + // determine the desired action + if (provenanceGrid.getColumns()[args.cell].id === 'actions') { + if (target.hasClass('show-lineage')) { + nf.ProvenanceLineage.showLineage(item.flowFileUuid, item.eventId.toString(), item.clusterNodeId); + } else if (target.hasClass('go-to')) { + goTo(item); + } + } else if (provenanceGrid.getColumns()[args.cell].id === 'moreDetails') { + if (target.hasClass('show-event-details')) { + nf.ProvenanceTable.showEventDetails(item); + } + } + }); // wire up the dataview to the grid provenanceData.onRowCountChanged.subscribe(function (e, args) { @@ -884,6 +905,25 @@ nf.ProvenanceTable = (function () { } }; + /** + * Goes to the specified component if possible. + * + * @argument {object} item The event it + */ + var goTo = function (item) { + // ensure the component is still present in the flow + if (nf.Common.isDefinedAndNotNull(item.groupId)) { + // only attempt this if we're within a frame + if (top !== window) { + // and our parent has canvas utils and shell defined + if (nf.Common.isDefinedAndNotNull(parent.nf) && nf.Common.isDefinedAndNotNull(parent.nf.CanvasUtils) && nf.Common.isDefinedAndNotNull(parent.nf.Shell)) { + parent.nf.CanvasUtils.showComponent(item.groupId, item.componentId); + parent.$('#shell-close-button').click(); + } + } + } + }; + return { /** * The max delay between requests. @@ -909,31 +949,6 @@ nf.ProvenanceTable = (function () { }).fail(nf.Common.handleAjaxError); }, - /** - * Goes to the specified component if possible. - * - * @argument {string} row The row - */ - goTo: function (row) { - var grid = $('#provenance-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - // ensure the component is still present in the flow - if (nf.Common.isDefinedAndNotNull(item.groupId)) { - // only attempt this if we're within a frame - if (top !== window) { - // and our parent has canvas utils and shell defined - if (nf.Common.isDefinedAndNotNull(parent.nf) && nf.Common.isDefinedAndNotNull(parent.nf.CanvasUtils) && nf.Common.isDefinedAndNotNull(parent.nf.Shell)) { - parent.nf.CanvasUtils.showComponent(item.groupId, item.componentId); - parent.$('#shell-close-button').click(); - } - } - } - } - }, - /** * Update the size of the grid based on its container's current size. */ @@ -1095,36 +1110,6 @@ nf.ProvenanceTable = (function () { }).fail(closeDialog); }, - /** - * Shows the lineage for the event in the specified row. - * - * @param {type} row - */ - showLineage: function (row) { - var grid = $('#provenance-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - nf.ProvenanceLineage.showLineage(item.flowFileUuid, item.eventId.toString(), item.clusterNodeId); - } - }, - - /** - * Gets the event details and shows the details dialog. - * - * @param {long} index - */ - showEventDetailsByIndex: function (index) { - var provenanceGrid = $('#provenance-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(provenanceGrid)) { - var provenanceModel = provenanceGrid.getData(); - var event = provenanceModel.getItem(index); - - // show the event details - nf.ProvenanceTable.showEventDetails(event); - } - }, - /** * Shows the details for the specified action. * diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/templates/nf-templates-table.js b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/templates/nf-templates-table.js index 175620746c..ec8f49ec46 100644 --- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/templates/nf-templates-table.js +++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/templates/nf-templates-table.js @@ -53,6 +53,22 @@ nf.TemplatesTable = (function () { data.sort(comparer, sortDetails.sortAsc); }; + /** + * Prompts the user before attempting to delete the specified template. + * + * @argument {object} template The template + */ + var promptToDeleteTemplate = function (template) { + // prompt for deletion + nf.Dialog.showYesNoDialog({ + dialogContent: 'Delete template \'' + nf.Common.escapeHtml(template.name) + '\'?', + overlayBackground: false, + yesHandler: function () { + deleteTemplate(template.id); + } + }); + }; + /** * Deletes the template with the specified id. * @@ -177,11 +193,11 @@ nf.TemplatesTable = (function () { // function for formatting the actions column var actionFormatter = function (row, cell, value, columnDef, dataContext) { - var markup = ''; + var markup = ''; // all DFMs to remove templates if (nf.Common.isDFM()) { - markup += ' '; + markup += ' '; } return markup; }; @@ -230,6 +246,23 @@ nf.TemplatesTable = (function () { }, templatesData); }); + // configure a click listener + templatesGrid.onClick.subscribe(function (e, args) { + var target = $(e.target); + + // get the node at this row + var item = templatesData.getItem(args.row); + + // determine the desired action + if (templatesGrid.getColumns()[args.cell].id === 'actions') { + if (target.hasClass('export-template')) { + window.open(config.urls.templates + '/' + encodeURIComponent(item.id)); + } else if (target.hasClass('prompt-to-delete-template')) { + promptToDeleteTemplate(item); + } + } + }); + // wire up the dataview to the grid templatesData.onRowCountChanged.subscribe(function (e, args) { templatesGrid.updateRowCount(); @@ -260,42 +293,6 @@ nf.TemplatesTable = (function () { } }, - /** - * Exports the specified template. - * - * @argument {string} row The row - */ - exportTemplate: function (row) { - var grid = $('#templates-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - window.open(config.urls.templates + '/' + encodeURIComponent(item.id)); - } - }, - - /** - * Prompts the user before attempting to delete the specified template. - * - * @argument {string} row The row - */ - promptToDeleteTemplate: function (row) { - var grid = $('#templates-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var template = data.getItem(row); - - // prompt for deletion - nf.Dialog.showYesNoDialog({ - dialogContent: 'Delete template \'' + nf.Common.escapeHtml(template.name) + '\'?', - overlayBackground: false, - yesHandler: function () { - deleteTemplate(template.id); - } - }); - } - }, - /** * Load the processor templates table. */ diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/users/nf-users-table.js b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/users/nf-users-table.js index 996544f142..88ea225fc2 100644 --- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/users/nf-users-table.js +++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/users/nf-users-table.js @@ -483,7 +483,7 @@ nf.UsersTable = (function () { // define a custom formatter for the more details column var moreDetailsFormatter = function (row, cell, value, columnDef, dataContext) { - return ''; + return ''; }; // function for formatting the last accessed time @@ -566,20 +566,20 @@ nf.UsersTable = (function () { // if this represents a grouped row if (nf.Common.isDefinedAndNotNull(dataContext.userGroup) && grouped) { - var actions = '   '; + var actions = '   '; } else { // return the appropriate markup for an individual user - var actions = ''; + var actions = ''; if (dataContext.status === 'ACTIVE') { - actions += ' '; + actions += ' '; // add an ungroup active if appropriate if (nf.Common.isDefinedAndNotNull(dataContext.userGroup)) { - actions += '  '; + actions += '  '; } } else { - actions += ' '; + actions += ' '; } } @@ -632,6 +632,37 @@ nf.UsersTable = (function () { sortAsc: args.sortAsc }, usersData); }); + + // configure a click listener + usersGrid.onClick.subscribe(function (e, args) { + var target = $(e.target); + + // get the node at this row + var item = usersData.getItem(args.row); + + // determine the desired action + if (usersGrid.getColumns()[args.cell].id === 'actions') { + if (target.hasClass('update-group-access')) { + updateGroupAccess(item); + } else if (target.hasClass('revoke-group-access')) { + revokeGroupAccess(item); + } else if (target.hasClass('ungroup')) { + ungroup(item); + } else if (target.hasClass('update-user-access')) { + updateUserAccess(item); + } else if (target.hasClass('revoke-user-access')) { + revokeUserAccess(item); + } else if (target.hasClass('ungroup-user')) { + ungroupUser(item); + } else if (target.hasClass('delete-user-account')) { + deleteUserAccount(item); + } + } else if (usersGrid.getColumns()[args.cell].id === 'moreDetails') { + if (target.hasClass('show-user-details')) { + showUserDetails(item); + } + } + }); // wire up the dataview to the grid usersData.onRowCountChanged.subscribe(function (e, args) { @@ -804,6 +835,182 @@ nf.UsersTable = (function () { } }; + /** + * Shows details for the specified user. + * + * @param {object} user + */ + var showUserDetails = function (user) { + var grouped = $('#group-collaspe-checkbox').hasClass('checkbox-checked'); + + // update the dialog fields + $('#user-name-details-dialog').text(user.userName); + $('#user-dn-details-dialog').text(user.dn); + + // handle fields that could vary for groups + if (nf.Common.isDefinedAndNotNull(user.creation)) { + $('#user-created-details-dialog').text(user.creation); + } else if (grouped && nf.Common.isDefinedAndNotNull(user.userGroup)) { + $('#user-created-details-dialog').html('Multiple users with different creation timestamps.'); + } else { + $('#user-created-details-dialog').html('No creation timestamp set'); + } + + if (nf.Common.isDefinedAndNotNull(user.lastVerified)) { + $('#user-verified-details-dialog').text(user.lastVerified); + } else if (grouped && nf.Common.isDefinedAndNotNull(user.userGroup)) { + $('#user-verified-details-dialog').html('Multiple users with different last verified timestamps.'); + } else { + $('#user-verified-details-dialog').html('No last verified timestamp set.'); + } + + if (nf.Common.isDefinedAndNotNull(user.justification)) { + $('#user-justification-details-dialog').text(user.justification); + } else if (grouped && nf.Common.isDefinedAndNotNull(user.userGroup)) { + $('#user-justification-details-dialog').html('Multiple users with different justifications.'); + } else { + $('#user-justification-details-dialog').html('No justification set.'); + } + + // show the dialog + $('#user-details-dialog').modal('show'); + }; + + /** + * Updates the specified groups level of access. + * + * @argument {object} item The user item + */ + var updateGroupAccess = function (item) { + // record the current group + $('#group-name-roles-dialog').text(item.userGroup); + + // show the dialog + $('#group-roles-dialog').modal('show'); + }; + + /** + * Disables the specified group's account. + * + * @argument {object} item The user item + */ + var revokeGroupAccess = function (item) { + // record the current group + $('#group-name-revoke-dialog').text(item.userGroup); + + // show the dialog + $('#group-revoke-dialog').modal('show'); + }; + + /** + * Ungroups the specified group. + * + * @argument {object} item The user item + */ + var ungroup = function (item) { + // prompt for ungroup + nf.Dialog.showYesNoDialog({ + dialogContent: 'Remove all users from group \'' + nf.Common.escapeHtml(item.userGroup) + '\'?', + overlayBackground: false, + yesHandler: function () { + $.ajax({ + type: 'DELETE', + url: config.urls.userGroups + '/' + encodeURIComponent(item.userGroup), + dataType: 'json' + }).done(function (response) { + nf.UsersTable.loadUsersTable(); + }).fail(nf.Common.handleAjaxError); + } + }); + }; + + /** + * Updates the specified users's level of access. + * + * @argument {object} item The user item + */ + var updateUserAccess = function (item) { + // populate the user info + $('#user-id-roles-dialog').val(item.id); + $('#user-name-roles-dialog').attr('title', item.dn).text(item.userName); + $('#user-justification-roles-dialog').html(nf.Common.formatValue(item.justification)); + + // function for checking a checkbox + var check = function (domId) { + $('#' + domId).removeClass('checkbox-unchecked').addClass('checkbox-checked'); + }; + + // go through each user role + $.each(item.authorities, function (i, authority) { + if (authority === 'ROLE_ADMIN') { + check('role-admin-checkbox'); + } else if (authority === 'ROLE_DFM') { + check('role-dfm-checkbox'); + } else if (authority === 'ROLE_PROVENANCE') { + check('role-provenance-checkbox'); + } else if (authority === 'ROLE_MONITOR') { + check('role-monitor-checkbox'); + } else if (authority === 'ROLE_NIFI') { + check('role-nifi-checkbox'); + } else if (authority === 'ROLE_PROXY') { + check('role-proxy-checkbox'); + } + }); + + // show the dialog + $('#user-roles-dialog').modal('show'); + }; + + /** + * Disables the specified user's account. + * + * @argument {object} item The user item + */ + var revokeUserAccess = function (item) { + // populate the users info + $('#user-id-revoke-dialog').val(item.id); + $('#user-name-revoke-dialog').text(item.userName); + + // show the dialog + $('#user-revoke-dialog').modal('show'); + }; + + /** + * Prompts to verify group removal. + * + * @argument {object} item The user item + */ + var ungroupUser = function (item) { + // prompt for ungroup + nf.Dialog.showYesNoDialog({ + dialogContent: 'Remove user \'' + nf.Common.escapeHtml(item.userName) + '\' from group \'' + nf.Common.escapeHtml(item.userGroup) + '\'?', + overlayBackground: false, + yesHandler: function () { + $.ajax({ + type: 'DELETE', + url: config.urls.userGroups + '/' + encodeURIComponent(item.userGroup) + '/users/' + encodeURIComponent(item.id), + dataType: 'json' + }).done(function (response) { + nf.UsersTable.loadUsersTable(); + }).fail(nf.Common.handleAjaxError); + } + }); + }; + + /** + * Delete's the specified user's account. + * + * @argument {object} item The user item + */ + var deleteUserAccount = function (item) { + // populate the users info + $('#user-id-delete-dialog').val(item.id); + $('#user-name-delete-dialog').text(item.userName); + + // show the dialog + $('#user-delete-dialog').modal('show'); + }; + return { init: function () { initUserDetailsDialog(); @@ -816,183 +1023,6 @@ nf.UsersTable = (function () { initUsersTable(); }, - /** - * Disables the specified user's account. - * - * @argument {string} row The row - */ - revokeUserAccess: function (row) { - var grid = $('#users-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - // populate the users info - $('#user-id-revoke-dialog').val(item.id); - $('#user-name-revoke-dialog').text(item.userName); - - // show the dialog - $('#user-revoke-dialog').modal('show'); - } - }, - - /** - * Delete's the specified user's account. - * - * @argument {string} row The row - */ - deleteUserAccount: function (row) { - var grid = $('#users-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - // populate the users info - $('#user-id-delete-dialog').val(item.id); - $('#user-name-delete-dialog').text(item.userName); - - // show the dialog - $('#user-delete-dialog').modal('show'); - } - }, - - /** - * Disables the specified group's account. - * - * @argument {string} row The row - */ - revokeGroupAccess: function (row) { - var grid = $('#users-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - // record the current group - $('#group-name-revoke-dialog').text(item.userGroup); - - // show the dialog - $('#group-revoke-dialog').modal('show'); - } - }, - - /** - * Updates the specified users's level of access. - * - * @argument {string} row The row - */ - updateUserAccess: function (row) { - var grid = $('#users-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - // populate the user info - $('#user-id-roles-dialog').val(item.id); - $('#user-name-roles-dialog').attr('title', item.dn).text(item.userName); - $('#user-justification-roles-dialog').html(nf.Common.formatValue(item.justification)); - - // function for checking a checkbox - var check = function (domId) { - $('#' + domId).removeClass('checkbox-unchecked').addClass('checkbox-checked'); - }; - - // go through each user role - $.each(item.authorities, function (i, authority) { - if (authority === 'ROLE_ADMIN') { - check('role-admin-checkbox'); - } else if (authority === 'ROLE_DFM') { - check('role-dfm-checkbox'); - } else if (authority === 'ROLE_PROVENANCE') { - check('role-provenance-checkbox'); - } else if (authority === 'ROLE_MONITOR') { - check('role-monitor-checkbox'); - } else if (authority === 'ROLE_NIFI') { - check('role-nifi-checkbox'); - } else if (authority === 'ROLE_PROXY') { - check('role-proxy-checkbox'); - } - }); - - // show the dialog - $('#user-roles-dialog').modal('show'); - } - }, - - /** - * Updates the specified groups level of access. - * - * @argument {string} row The row - */ - updateGroupAccess: function (row) { - var grid = $('#users-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - // record the current group - $('#group-name-roles-dialog').text(item.userGroup); - - // show the dialog - $('#group-roles-dialog').modal('show'); - } - }, - - /** - * Prompts to verify group removal. - * - * @argument {string} row The row - */ - ungroupUser: function (row) { - var grid = $('#users-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - // prompt for ungroup - nf.Dialog.showYesNoDialog({ - dialogContent: 'Remove user \'' + nf.Common.escapeHtml(item.userName) + '\' from group \'' + nf.Common.escapeHtml(item.userGroup) + '\'?', - overlayBackground: false, - yesHandler: function () { - $.ajax({ - type: 'DELETE', - url: config.urls.userGroups + '/' + encodeURIComponent(item.userGroup) + '/users/' + encodeURIComponent(item.id), - dataType: 'json' - }).done(function (response) { - nf.UsersTable.loadUsersTable(); - }).fail(nf.Common.handleAjaxError); - } - }); - } - }, - - /** - * Ungroups the specified group. - * - * @argument {string} row The row - */ - ungroup: function (row) { - var grid = $('#users-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(grid)) { - var data = grid.getData(); - var item = data.getItem(row); - - // prompt for ungroup - nf.Dialog.showYesNoDialog({ - dialogContent: 'Remove all users from group \'' + nf.Common.escapeHtml(item.userGroup) + '\'?', - overlayBackground: false, - yesHandler: function () { - $.ajax({ - type: 'DELETE', - url: config.urls.userGroups + '/' + encodeURIComponent(item.userGroup), - dataType: 'json' - }).done(function (response) { - nf.UsersTable.loadUsersTable(); - }).fail(nf.Common.handleAjaxError); - } - }); - } - }, - /** * Update the size of the grid based on its container's current size. */ @@ -1037,54 +1067,6 @@ nf.UsersTable = (function () { $('#total-users').text('0'); } }).fail(nf.Common.handleAjaxError); - }, - - /** - * Shows details for the specified user. - * - * @param {string} row - */ - showUserDetails: function (row) { - var usersGrid = $('#users-table').data('gridInstance'); - if (nf.Common.isDefinedAndNotNull(usersGrid)) { - var usersData = usersGrid.getData(); - - // get the user - var user = usersData.getItem(row); - var grouped = $('#group-collaspe-checkbox').hasClass('checkbox-checked'); - - // update the dialog fields - $('#user-name-details-dialog').text(user.userName); - $('#user-dn-details-dialog').text(user.dn); - - // handle fields that could vary for groups - if (nf.Common.isDefinedAndNotNull(user.creation)) { - $('#user-created-details-dialog').text(user.creation); - } else if (grouped && nf.Common.isDefinedAndNotNull(user.userGroup)) { - $('#user-created-details-dialog').html('Multiple users with different creation timestamps.'); - } else { - $('#user-created-details-dialog').html('No creation timestamp set'); - } - - if (nf.Common.isDefinedAndNotNull(user.lastVerified)) { - $('#user-verified-details-dialog').text(user.lastVerified); - } else if (grouped && nf.Common.isDefinedAndNotNull(user.userGroup)) { - $('#user-verified-details-dialog').html('Multiple users with different last verified timestamps.'); - } else { - $('#user-verified-details-dialog').html('No last verified timestamp set.'); - } - - if (nf.Common.isDefinedAndNotNull(user.justification)) { - $('#user-justification-details-dialog').text(user.justification); - } else if (grouped && nf.Common.isDefinedAndNotNull(user.userGroup)) { - $('#user-justification-details-dialog').html('Multiple users with different justifications.'); - } else { - $('#user-justification-details-dialog').html('No justification set.'); - } - - // show the dialog - $('#user-details-dialog').modal('show'); - } } }; }()); \ No newline at end of file