Repository: nifi Updated Branches: refs/heads/NIFI-108-2 b212e7516 -> 642c46d06
NIFI-108: - Adding a refresh button to the queue listing table. - Fixing the flowfile summary sorting in the cluster manager. Project: http://git-wip-us.apache.org/repos/asf/nifi/repo Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/642c46d0 Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/642c46d0 Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/642c46d0 Branch: refs/heads/NIFI-108-2 Commit: 642c46d062925b9be440adbb5a5008452ee840cd Parents: b212e75 Author: Matt Gilman <[email protected]> Authored: Fri Jan 8 09:49:50 2016 -0500 Committer: Matt Gilman <[email protected]> Committed: Fri Jan 8 09:49:50 2016 -0500 ---------------------------------------------------------------------- .../nifi/web/api/dto/ListingRequestDTO.java | 3 +- .../nifi/controller/FlowFileSummaries.java | 45 ++++++++++++++++---- .../WEB-INF/partials/canvas/queue-listing.jsp | 7 ++- .../src/main/webapp/css/queue-listing.css | 35 +++++++++++---- .../webapp/js/nf/canvas/nf-queue-listing.js | 23 +++++++--- 5 files changed, 88 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/nifi/blob/642c46d0/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ListingRequestDTO.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ListingRequestDTO.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ListingRequestDTO.java index 67c8389..e5026d6 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ListingRequestDTO.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ListingRequestDTO.java @@ -22,6 +22,7 @@ import java.util.List; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import org.apache.nifi.web.api.dto.util.TimeAdapter; import org.apache.nifi.web.api.dto.util.TimestampAdapter; import com.wordnik.swagger.annotations.ApiModelProperty; @@ -93,7 +94,7 @@ public class ListingRequestDTO { /** * @return the time this request was last updated */ - @XmlJavaTypeAdapter(TimestampAdapter.class) + @XmlJavaTypeAdapter(TimeAdapter.class) @ApiModelProperty( value = "The last time this listing request was updated." ) http://git-wip-us.apache.org/repos/asf/nifi/blob/642c46d0/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowFileSummaries.java ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowFileSummaries.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowFileSummaries.java index 7687d8a..7a303e2 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowFileSummaries.java +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowFileSummaries.java @@ -60,28 +60,57 @@ public class FlowFileSummaries { } } + /** + * Creates a comparator for comparing two FlowFileSummaryDTO objects. The objects must be fully populated in + * @param column + * @param direction + * @return + */ public static Comparator<FlowFileSummaryDTO> createDTOComparator(final SortColumn column, final SortDirection direction) { final Comparator<FlowFileSummaryDTO> comparator = new Comparator<FlowFileSummaryDTO>() { @Override public int compare(final FlowFileSummaryDTO o1, final FlowFileSummaryDTO o2) { + final int val; switch (column) { case FILENAME: - return o1.getFilename().compareTo(o2.getFilename()); + val = o1.getFilename().compareTo(o2.getFilename()); + break; case FLOWFILE_AGE: - return o1.getLineageDuration().compareTo(o2.getLineageDuration()); + val = o1.getLineageDuration().compareTo(o2.getLineageDuration()); + break; case FLOWFILE_SIZE: - return Long.compare(o1.getSize(), o2.getSize()); + val = Long.compare(o1.getSize(), o2.getSize()); + break; case FLOWFILE_UUID: - return o1.getUuid().compareTo(o2.getUuid()); + val = o1.getUuid().compareTo(o2.getUuid()); + break; case PENALIZATION: - return Boolean.compare(o1.getPenalized(), o2.getPenalized()); + val = Boolean.compare(o1.getPenalized(), o2.getPenalized()); + break; case QUEUE_POSITION: - return Long.compare(o1.getPosition(), o2.getPosition()); + val = Long.compare(o1.getPosition(), o2.getPosition()); + break; case QUEUED_DURATION: - return o1.getQueuedDuration().compareTo(o2.getQueuedDuration()); + val = o1.getQueuedDuration().compareTo(o2.getQueuedDuration()); + break; + default: + return 0; } - return 0; + if (val == 0) { + // secondary sort on cluster node id if populated + if (o1.getClusterNodeId() == null && o2.getClusterNodeId() == null) { + return val; + } else if (o2.getClusterNodeId() == null) { + return -1; + } else if (o1.getClusterNodeId() == null) { + return 1; + } else { + return o1.getClusterNodeId().compareTo(o2.getClusterNodeId()); + } + } else { + return val; + } } }; http://git-wip-us.apache.org/repos/asf/nifi/blob/642c46d0/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/queue-listing.jsp ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/queue-listing.jsp b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/queue-listing.jsp index 0d8435a..ab34d63 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/queue-listing.jsp +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/queue-listing.jsp @@ -20,10 +20,15 @@ <div id="queue-listing-header-text"></div> </div> <div id="queue-listing-stats-container"> + <div id="queue-listing-refresh-button" class="pointer" title="Refresh"></div> + <div id="queue-listing-last-refreshed-container"> + Last updated: <span id="queue-listing-last-refreshed"></span> + </div> + <div id="queue-listing-loading-container" class="loading-container"></div> <div id="queue-listing-stats"> Displaying <span id="displayed-flowfiles"></span> of <span id="total-flowfiles-count"></span> (<span id="total-flowfiles-size"></span>) </div> - <div id="queue-listing-loading-container" class="loading-container"></div> + <div class="clear"></div> </div> <div id="queue-listing-table"></div> </div> http://git-wip-us.apache.org/repos/asf/nifi/blob/642c46d0/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/queue-listing.css ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/queue-listing.css b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/queue-listing.css index 689ceaf..73d1868 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/queue-listing.css +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/queue-listing.css @@ -41,19 +41,28 @@ } #queue-listing-stats-container { - margin-left: 15px; - margin-top: 30px; + margin-left: 20px; + margin-top: 18px; -webkit-user-select: none; -moz-user-select: none; } -#queue-listing-stats { - font-size: 9px; +#queue-listing-refresh-button { + float: left; + height: 24px; + width: 26px; +} + +#queue-listing-last-refreshed-container { + float: left; + color: #666; + font-weight: normal; + margin-top: 6px; + margin-left: 3px; +} + +#queue-listing-last-refreshed { font-weight: bold; - color: #9f6000; - clear: left; - line-height: normal; - margin-left: 5px; } #queue-listing-loading-container { @@ -65,6 +74,16 @@ margin-left: 3px; } +#queue-listing-stats { + font-size: 9px; + font-weight: bold; + color: #9f6000; + float: right; + line-height: normal; + margin-right: 20px; + margin-top: 9px; +} + /* queue listing table */ #queue-listing-table { http://git-wip-us.apache.org/repos/asf/nifi/blob/642c46d0/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-queue-listing.js ---------------------------------------------------------------------- diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-queue-listing.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-queue-listing.js index 6bb6df8..eeb2dd2 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-queue-listing.js +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-queue-listing.js @@ -226,6 +226,9 @@ nf.QueueListing = (function () { $('#total-flowfiles-count').text(nf.Common.formatInteger(listingRequest.queueSize.objectCount)); $('#total-flowfiles-size').text(nf.Common.formatDataSize(listingRequest.queueSize.byteCount)); + // update the last updated time + $('#queue-listing-last-refreshed').text(listingRequest.lastUpdated); + // get the grid to load the data var queueListingGrid = $('#queue-listing-table').data('gridInstance'); var queueListingData = queueListingGrid.getData(); @@ -420,6 +423,12 @@ nf.QueueListing = (function () { resetTableSize(); }); + // define mouse over event for the refresh button + nf.Common.addHoverEffect('#queue-listing-refresh-button', 'button-refresh', 'button-refresh-hover').click(function () { + var connection = $('#queue-listing-table').data('connection'); + performListing(connection); + }); + // define a custom formatter for showing more processor details var moreDetailsFormatter = function (row, cell, value, columnDef, dataContext) { return '<img src="images/iconDetails.png" title="View Details" class="pointer show-flowfile-details" style="margin-top: 5px; float: left;"/>'; @@ -449,13 +458,13 @@ nf.QueueListing = (function () { // initialize the queue listing table var queueListingColumns = [ {id: 'moreDetails', field: 'moreDetails', name: ' ', sortable: false, resizable: false, formatter: moreDetailsFormatter, width: 50, maxWidth: 50}, - {id: 'QUEUE_POSITION', name: 'Position', field: 'position', sortable: false, resizable: false, width: 75, maxWidth: 75}, - {id: 'FLOWFILE_UUID', name: 'UUID', field: 'uuid', sortable: false, resizable: true}, - {id: 'FILENAME', name: 'Filename', field: 'filename', sortable: false, resizable: true}, - {id: 'FLOWFILE_SIZE', name: 'File Size', field: 'size', sortable: false, resizable: true, defaultSortAsc: false, formatter: dataSizeFormatter}, - {id: 'QUEUED_DURATION', name: 'Queued Duration', field: 'queuedDuration', sortable: false, resizable: true, formatter: durationFormatter}, - {id: 'FLOWFILE_AGE', name: 'Lineage Duration', field: 'lineageDuration', sortable: false, resizable: true, formatter: durationFormatter}, - {id: 'PENALIZATION', name: 'Penalized', field: 'penalized', sortable: false, resizable: false, width: 100, maxWidth: 100, formatter: penalizedFormatter} + {id: 'position', name: 'Position', field: 'position', sortable: false, resizable: false, width: 75, maxWidth: 75}, + {id: 'uuid', name: 'UUID', field: 'uuid', sortable: false, resizable: true}, + {id: 'filename', name: 'Filename', field: 'filename', sortable: false, resizable: true}, + {id: 'size', name: 'File Size', field: 'size', sortable: false, resizable: true, defaultSortAsc: false, formatter: dataSizeFormatter}, + {id: 'queuedDuration', name: 'Queued Duration', field: 'queuedDuration', sortable: false, resizable: true, formatter: durationFormatter}, + {id: 'lineageDuration', name: 'Lineage Duration', field: 'lineageDuration', sortable: false, resizable: true, formatter: durationFormatter}, + {id: 'penalized', name: 'Penalized', field: 'penalized', sortable: false, resizable: false, width: 100, maxWidth: 100, formatter: penalizedFormatter} ]; // conditionally show the cluster node identifier
