diff --git a/static/css/core-ui.css b/static/css/core-ui.css index 70f69384e..e66c40e15 100644 --- a/static/css/core-ui.css +++ b/static/css/core-ui.css @@ -279,6 +279,7 @@ a:focus { } .co-tabs li a { + display: inline-block; height: 60px; line-height: 60px; white-space: nowrap; diff --git a/static/css/directives/repo-view/repo-panel-tags.css b/static/css/directives/repo-view/repo-panel-tags.css index 0e1d0a9c5..0208ca3c3 100644 --- a/static/css/directives/repo-view/repo-panel-tags.css +++ b/static/css/directives/repo-view/repo-panel-tags.css @@ -57,10 +57,6 @@ display: block; } -.repo-panel-tags-element .image-id-col { - width: 100px; -} - .repo-panel-tags-element .options-col { padding-left: 20px; } diff --git a/static/directives/repo-view/repo-panel-tags.html b/static/directives/repo-view/repo-panel-tags.html index 360082a45..4c5ddba14 100644 --- a/static/directives/repo-view/repo-panel-tags.html +++ b/static/directives/repo-view/repo-panel-tags.html @@ -38,7 +38,7 @@
+ ng-repeat="it in imageTrackEntries"> {{ it.image_id.substr(0, 12) }}
@@ -90,25 +90,30 @@ Security Scan - Size + style="width: 120px;"> Image - + + + + - + Unknown - + - + - - - + + + + + + + + + + + + = 0) { checked.push(tagInfo); } + + if (!imageIndexMap[tagInfo.image_id]) { + imageIndexMap[tagInfo.image_id] = {'start': i, 'end': i}; + } + + imageIndexMap[tagInfo.image_id]['end'] = i; }; // Calculate the image tracks. var colors = d3.scale.category10(); - var index = 0; + var imageTracks = []; + var imageTrackEntries = []; imageIDs.sort().map(function(image_id) { if (imageMap[image_id].length >= 2){ - imageTracks.push({ + // Create the track entry. + var index = imageTrackEntries.length; + var trackEntry = { 'image_id': image_id, 'color': colors(index), 'count': imageMap[image_id].length, 'tags': imageMap[image_id] - }); + }; + + imageTrackEntries.push(trackEntry); imageMap[image_id]['color'] = colors(index); + var currentImageIndex = imageIndexMap[image_id]; - ++index; + // Find the track in which we can place the entry, if any. + var existingTrack = null; + for (var i = 0; i < imageTracks.length; ++i) { + // For the current track, ensure that the start and end index + // for the current entry is outside of the range of the track's + // entries. If so, then we can add the entry to the track. + var currentTrack = imageTracks[i]; + var canAddToCurrentTrack = true; + for (var j = 0; j < currentTrack.entries.length; ++j) { + var currentTrackEntry = currentTrack.entries[j]; + var entryInfo = imageIndexMap[currentTrackEntry.image_id]; + if (Math.max(entryInfo.start, currentImageIndex.start) <= Math.min(entryInfo.end, currentImageIndex.end)) { + canAddToCurrentTrack = false; + break; + } + } + + if (canAddToCurrentTrack) { + existingTrack = currentTrack; + break; + } + } + + // Add the entry to the track or create a new track if necessary. + if (existingTrack) { + existingTrack.entries.push(trackEntry) + } else { + imageTracks.push({ + 'entries': [trackEntry] + }); + } } }); $scope.imageMap = imageMap; $scope.imageTracks = imageTracks; + $scope.imageTrackEntries = imageTrackEntries; + $scope.options.page = 0; $scope.tags = ordered;