Skip to content

Commit 6d8001a

Browse files
authored
add version filter in the version tab (#10543)
1 parent fd5bdb6 commit 6d8001a

7 files changed

Lines changed: 140 additions & 4 deletions

File tree

src/Bootstrap/dist/css/bootstrap-theme.css

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Bootstrap/dist/js/bootstrap.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*!
22
* Bootstrap v3.4.1 (https://getbootstrap.com/)
3-
* Copyright 2011-2025 Twitter, Inc.
3+
* Copyright 2011-2026 Twitter, Inc.
44
* Licensed under the MIT license
55
*/
66

src/Bootstrap/less/theme/page-display-package.less

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -815,4 +815,19 @@
815815
padding: 1.25rem;
816816
}
817817
}
818+
819+
.version-filter-container {
820+
margin-bottom: 2rem;
821+
display: flex;
822+
flex-wrap: wrap;
823+
824+
.form-group {
825+
margin-right: 2rem;
826+
margin-bottom: 0;
827+
}
828+
829+
input[type="checkbox"] {
830+
margin-right: 0.5rem;
831+
}
832+
}
818833
}

src/NuGetGallery/Content/gallery/css/bootstrap.min.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/NuGetGallery/Helpers/ViewModelExtensions/DisplayPackageViewModelFactory.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ private DisplayPackageViewModel SetupCommon(
222222
&& packageKeyToVulnerabilities.TryGetValue(package.Key, out var vulnerabilities)
223223
&& vulnerabilities != null && vulnerabilities.Any())
224224
{
225+
viewModel.IsVulnerable = true;
225226
viewModel.Vulnerabilities = vulnerabilities.OrderByDescending(vul => vul.Severity).ToList().AsReadOnly();
226227
maxVulnerabilitySeverity = viewModel.Vulnerabilities.Max(v => v.Severity); // cache for messaging
227228
viewModel.MaxVulnerabilitySeverity = maxVulnerabilitySeverity.Value;

src/NuGetGallery/Scripts/gallery/page-display-package.js

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ $(function () {
158158
var storage = window['localStorage'];
159159
var packageManagerStorageKey = 'preferred_package_manager';
160160
var bodyStorageKey = 'preferred_body_tab';
161+
var versionFilterPrereleaseKey = 'version_filter_include_prerelease';
162+
var versionFilterVulnerableKey = 'version_filter_include_vulnerable';
163+
var versionFilterDeprecatedKey = 'version_filter_include_deprecated';
161164
var restorePreferredBodyTab = true;
162165

163166
var windowHash = window.location.hash;
@@ -190,6 +193,79 @@ $(function () {
190193
}
191194
}
192195

196+
function applyVersionFilters() {
197+
var includePrerelease = $('#include-prerelease').is(':checked');
198+
var includeVulnerable = $('#include-vulnerable').is(':checked');
199+
var includeDeprecated = $('#include-deprecated').is(':checked');
200+
201+
if (storage) {
202+
storage.setItem(versionFilterPrereleaseKey, includePrerelease);
203+
storage.setItem(versionFilterVulnerableKey, includeVulnerable);
204+
storage.setItem(versionFilterDeprecatedKey, includeDeprecated);
205+
}
206+
207+
$('.version-row').each(function () {
208+
var isCurrent = $(this).hasClass('bg-brand-info');
209+
if (isCurrent) {
210+
$(this).show();
211+
return;
212+
}
213+
214+
var isPrerelease = $(this).data('prerelease') === true;
215+
var isVulnerable = $(this).data('vulnerable') === true;
216+
var isDeprecated = $(this).data('deprecated') === true;
217+
var showRow = true;
218+
219+
if (!includePrerelease && isPrerelease) {
220+
showRow = false;
221+
}
222+
if (!includeVulnerable && isVulnerable) {
223+
showRow = false;
224+
}
225+
if (!includeDeprecated && isDeprecated) {
226+
showRow = false;
227+
}
228+
229+
if (showRow) {
230+
$(this).show();
231+
} else {
232+
$(this).hide();
233+
}
234+
});
235+
}
236+
237+
if (storage) {
238+
var savedIncludePrerelease = storage.getItem(versionFilterPrereleaseKey);
239+
if (savedIncludePrerelease !== null) {
240+
$('#include-prerelease').prop('checked', savedIncludePrerelease === 'true');
241+
} else {
242+
$('#include-prerelease').prop('checked', true);
243+
}
244+
245+
var savedIncludeVulnerable = storage.getItem(versionFilterVulnerableKey);
246+
if (savedIncludeVulnerable !== null) {
247+
$('#include-vulnerable').prop('checked', savedIncludeVulnerable === 'true');
248+
} else {
249+
$('#include-vulnerable').prop('checked', true);
250+
}
251+
252+
var savedIncludeDeprecated = storage.getItem(versionFilterDeprecatedKey);
253+
if (savedIncludeDeprecated !== null) {
254+
$('#include-deprecated').prop('checked', savedIncludeDeprecated === 'true');
255+
} else {
256+
$('#include-deprecated').prop('checked', true);
257+
}
258+
} else {
259+
$('#include-prerelease').prop('checked', true);
260+
$('#include-vulnerable').prop('checked', true);
261+
$('#include-deprecated').prop('checked', true);
262+
}
263+
264+
$('#include-prerelease').change(applyVersionFilters);
265+
$('#include-vulnerable').change(applyVersionFilters);
266+
$('#include-deprecated').change(applyVersionFilters);
267+
applyVersionFilters();
268+
193269
var usedByClamped = false;
194270
var usedByTab = $('#usedby-tab');
195271

src/NuGetGallery/Views/Packages/DisplayPackage.cshtml

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,6 +1049,32 @@
10491049
</div>
10501050
<div role="tabpanel" class="tab-pane @(activeBodyTab == "versions" ? "active" : "")" id="versions-tab" aria-label="Versions tab content">
10511051
<div class="version-history" id="version-history">
1052+
<div class="version-filter-container">
1053+
<div class="form-group">
1054+
<label class="brand-checkbox">
1055+
<input type="checkbox" id="include-prerelease">
1056+
<span>Include prerelease</span>
1057+
</label>
1058+
</div>
1059+
@if (Model.IsPackageVulnerabilitiesEnabled)
1060+
{
1061+
<div class="form-group">
1062+
<label class="brand-checkbox">
1063+
<input type="checkbox" id="include-vulnerable">
1064+
<span>Include vulnerable</span>
1065+
</label>
1066+
</div>
1067+
}
1068+
@if (Model.IsPackageDeprecationEnabled)
1069+
{
1070+
<div class="form-group">
1071+
<label class="brand-checkbox">
1072+
<input type="checkbox" id="include-deprecated">
1073+
<span>Include deprecated</span>
1074+
</label>
1075+
</div>
1076+
}
1077+
</div>
10521078
<table aria-label="Version History of @Model.Id" class="table borderless">
10531079
<thead>
10541080
<tr>
@@ -1092,7 +1118,10 @@
10921118
if ((packageVersion.Available && packageVersion.Listed && Model.ShowDetailsAndLinks)
10931119
|| (!packageVersion.Deleted && Model.CanDisplayPrivateMetadata))
10941120
{
1095-
<tr class="@(packageVersion.IsCurrent(Model) ? "bg-brand-info" : null)">
1121+
<tr class="@(packageVersion.IsCurrent(Model) ? "bg-brand-info" : null) version-row"
1122+
data-prerelease="@packageVersion.Prerelease.ToString().ToLowerInvariant()"
1123+
data-vulnerable="@packageVersion.IsVulnerable.ToString().ToLowerInvariant()"
1124+
data-deprecated="@((packageVersion.DeprecationStatus != PackageDeprecationStatus.NotDeprecated).ToString().ToLowerInvariant())">
10961125
<td>
10971126
<a href="@Url.Package(packageVersion)" title="@packageVersion.Version">
10981127
@packageVersion.Version.Abbreviate(30)
@@ -1165,7 +1194,10 @@
11651194
}
11661195
else if (packageVersion.Deleted && packageVersion.CanDisplayPrivateMetadata)
11671196
{
1168-
<tr class="deleted">
1197+
<tr class="deleted version-row"
1198+
data-prerelease="@packageVersion.Prerelease.ToString().ToLowerInvariant()"
1199+
data-vulnerable="@packageVersion.IsVulnerable.ToString().ToLowerInvariant()"
1200+
data-deprecated="@((packageVersion.DeprecationStatus != PackageDeprecationStatus.NotDeprecated).ToString().ToLowerInvariant())">
11691201
<td class="version">
11701202
@packageVersion.Version
11711203
</td>

0 commit comments

Comments
 (0)