diff --git a/src/dotnet/APIView/APIViewWeb/Client/css/site.scss b/src/dotnet/APIView/APIViewWeb/Client/css/site.scss index dbeaa1f1bb8..dae7b62d5fc 100644 --- a/src/dotnet/APIView/APIViewWeb/Client/css/site.scss +++ b/src/dotnet/APIView/APIViewWeb/Client/css/site.scss @@ -1,4 +1,63 @@ -/* Mixins, Media, Include and Keyframes +/* Themes +------------------------------------------------------------------------------------------------------------------------------------------------------------*/ +.light-theme { + --background-color: #fff; + --border-color: #dee2e6; + --text-color: #212529; + --bg-light: #f8f9fa; + --bg-light-hover: #e2e6ea; + --link-color: #006ee5; + --link-color-hover: #0056b3; + --btn-outline-dark: #343a40; + --monochrome-8: rgb(0 0 0 / 8%); + --monochrome-2: rgba(0, 0, 0, 0.2); + --monochrome-25: rgba(0, 0, 0, 0.25); + --monochrome-19: rgba(0, 0, 0, 0.19); + --monochrome-15: rgba(0, 0, 0, 0.15); + --monochrome-75: rgba(0, 0, 0, .075); + --monochrome-5: rgba(0, 0, 0, 0.5); + --monochrome-03: rgba(0, 0, 0, 0.03); + --monochrome-125: rgba(0, 0, 0, 0.125); + --focus-shadow: rgb(0 123 255 / 25%); + --muted-color: #6c757d; + --icon-color-filter: invert(0.0); + --keyword-color: blue; + --class-color: #007e79; + --code-color: #d1377e; + --code-diagnostics-error-color: lightpink; + --code-diagnostics-warn-color: lightyellow; + --code-diagnostics-info-color: lightblue; +} + +.dark-theme { + --background-color: #010409; + --border-color: #30363d; + --text-color: #c9d1d9; + --bg-light: #161b22; + --bg-light-hover: #30363d; + --link-color: #0084ff; + --link-color-hover: #a8d2ff; + --btn-outline-dark: #ccd6df; + --monochrome-8: rgba(255, 255, 255, 8%); + --monochrome-2: rgba(255, 255, 255, 0.2); + --monochrome-25: rgba(255, 255, 255, 0.25); + --monochrome-19: rgba(255, 255, 255, 0.19); + --monochrome-15: rgba(255, 255, 255, 0.15); + --monochrome-75: rgba(255, 255, 255, .075); + --monochrome-5: rgba(255, 255, 255, 0.5); + --monochrome-03: rgba(255, 255, 255, 0.03); + --monochrome-125: rgba(255, 255, 255, 0.125); + --focus-shadow: rgba(0, 123, 255, 0.642); + --muted-color: #717a83; + --icon-color-filter: invert(0.5); + --keyword-color: #ff7b72; + --class-color: #d2a8ff; + --code-color: #db3984; + --code-diagnostics-error-color: darkmagenta; + --code-diagnostics-warn-color: #846007; + --code-diagnostics-info-color: darkblue; +} +/* Mixins, Media, Include and Keyframes ------------------------------------------------------------------------------------------------------------------------------------------------------------*/ @mixin placeholder { @@ -36,20 +95,24 @@ /* Color table ------------------------------------------------------------------------------------------------------------------------------------------------------------*/ -$gray-light: #f6f8fa; -$primary-blue: #006ee5; $success-green: #208636; $pale-green: #008484; /* HTML Tags ------------------------------------------------------------------------------------------------------------------------------------------------------------*/ a { - color: $primary-blue; + color: var(--link-color); +} + +a:hover { + color: var(--link-color-hover); } body { /* Margin bottom by footer height */ margin-bottom: 60px; + background-color: var(--background-color); + color: var(--text-color); } button.accept-policy { @@ -107,6 +170,7 @@ input[type="search"]::-webkit-search-cancel-button { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; + border-top: 1px solid var(--border-color); } #reviews-table-search-container { @@ -117,39 +181,230 @@ input[type="search"]::-webkit-search-cancel-button { /* Classes ------------------------------------------------------------------------------------------------------------------------------------------------------------*/ -/* Bootstrap Classes Overridden +/* Classes Overridden ----------------------------------------------------------------------*/ +.badge-light { + color: var(--text-color); + background-color: var(--bg-light-hover); +} + +.bg-light { + background-color: var(--bg-light) !important; +} + +.border { + border: 1px solid var(--border-color) !important; +} + +.border-left { + border-left: 1px solid var(--border-color) !important; +} .border-top { - border-top: 1px solid #e5e5e5; + border-top: 1px solid var(--border-color) !important; } .border-bottom { - border-bottom: 1px solid #e5e5e5; + border-bottom: 1px solid var(--border-color) !important; } .bootstrap-select .dropdown-toggle .filter-option-inner-inner { - color: #626262; + color: var(--text-color); +} + +.bootstrap-select.show-menu-arrow .dropdown-toggle .filter-option:after { + border-bottom: 6px solid var(--background-color); +} + +.btn-light { + color: var(--text-color); + background-color: var(--bg-light); + border-color: var(--bg-light); +} + +.btn-light:hover, .btn-light:active { + color: var(--text-color); + background-color: var(--bg-light-hover); +} + +.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active, .show > .btn-light.dropdown-toggle { + color: var(--text-color); + background-color: var(--bg-light-hover); } .btn-success { background-color: $success-green; } +.card-header { + background-color: var(--monochrome-03); + border-bottom: 1px solid var(--monochrome-125); +} + +.custom-file-label { + color: var(--text-color); + background-color: var(--background-color); + border: 1px solid var(--border-color); +} + +.custom-file-label::after { + color: var(--text-color); + background-color: var(--bg-light); +} + +.close { + color: var(--text-color); +} + +.dropdown-menu { + color: var(--text-color); + background-color: var(--background-color); + border: 1px solid var(--monochrome-15); +} + +.dropdown-item { + color: var(--text-color); +} + +.dropdown-item:hover, .dropdown-item:focus { + color: var(--text-color); + background-color: var(--bg-light); +} + +.form-control { + color: var(--text-color); + background-color: var(--background-color); + border: 1px solid var(--border-color); +} + +.form-control { + color: var(--text-color); + background-color: var(--background-color); + border: 1px solid var(--border-color); +} + +.form-control:focus { + color: var(--text-color); + background-color: var(--background-color); + border-color: var(--border-color); + box-shadow: 0 0 0 0.2rem var(--focus-shadow); +} + +.list-group-item +{ + background-color: var(--background-color); + border: 1px solid var(--border-color); +} + +.modal-header { + border-bottom: 1px solid var(--border-color); +} + +.modal-content { + background-color: var(--background-color); + border: 1px solid var(--monochrome-2); +} + +.modal-footer { + border-top: 1px solid var(--border-color); +} + .nav-pills .nav-link.active, .nav-pills .show > .nav-link { - background-color: $primary-blue; + background-color: var(--link-color); +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem var(--monochrome-8) !important; +} + +.table { + color: var(--text-color); +} + +.table th, .table td { + border-top: 1px solid var(--border-color); +} + +.table thead th { + border-bottom: 2px solid var(--border-color); +} + +.table-hover tbody tr:hover { + color: var(--text-color); + background-color: var(--monochrome-75); +} + +.text-black-50 { + color: var(--monochrome-5) !important; +} + +.text-dark { + color: var(--text-color) !important;; +} + +.text-muted { + color: var(--muted-color) !important; +} + +a.text-dark:focus, a.text-dark:hover { + color: var(--text-color) !important; +} + +.page-link { + background-color: var(--background-color); + border: 1px solid var(--border-color); +} + +.page-link:hover { + background-color: var(--bg-light-hover); + border-color: var(--border-color); +} + +.page-item.disabled .page-link { + color: var(--text-color); + background-color: var(--background-color); + border-color: var(--border-color); +} + +pre { + color: var(--text-color); +} + +.popover { + border-color: var(--border-color); +} + +.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^="bottom"] > .arrow::after { + border-bottom-color: var(--background-color); +} + +.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^="bottom"] > .arrow::before { + border-bottom-color: var(--monochrome-25); +} + +.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^="bottom"] .popover-header::before { + border-bottom: 1px solid var(--background-color); +} + +.popover-header { + background-color: var(--background-color); + color: var(--text-color); +} +.popover-body { + background-color: var(--background-color); + color: var(--text-color); } /* Code rendering classes ----------------------------------------------------------------------*/ .class { - color: #007e79; + color: var(--class-color); scroll-margin-top: calc(50px + 1.7em); } code { - color: #d1377e; + color: var(--code-color); } .code-comment { @@ -161,11 +416,11 @@ code { } .keyword { - color: blue; + color: var(--keyword-color); } .name { - color: black; + color: var(--text-color); } .specialName { @@ -231,12 +486,17 @@ code { } .btn-primary { - background-color: #006ee5; + background-color: var(--link-color); } .btn-outline-primary { - color: #006ee5; - border-color: #006ee5; + color: var(--link-color); + border-color: var(--link-color); +} + +.btn-outline-dark { + color: var(--btn-outline-dark); + border-color: var(--btn-outline-dark); } .btn-circle { @@ -254,7 +514,7 @@ code { line-height: 1.2rem; font-weight: bold; font-size: 1.0rem; - box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + box-shadow: 0 4px 8px 0 var(--monochrome-2), 0 6px 20px 0 var(--monochrome-19); } .btn-xs { @@ -267,17 +527,17 @@ code { /* Diagnostics ----------------------------------------------------------------------*/ .code-diagnostics-error { - background-color: lightpink; + background-color: var(--code-diagnostics-error-color); border: 1px solid red; } .code-diagnostics-warn { - background-color: lightyellow; + background-color: var(--code-diagnostics-warn-color); border: 1px solid #ffe066; } .code-diagnostics-info { - background-color: #e0ffff; + background-color: var(--code-diagnostics-info-color); border: 1px solid blue; } @@ -309,10 +569,10 @@ code { } .comment-row { - border: 1px solid gray; + border: 1px solid var(--border-color); border-spacing: 0; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background-color: white; + background-color: var(--background-color); } .comment-cancel-button { @@ -366,7 +626,7 @@ code { border-collapse: separate; tab-size: 8; border-spacing: 0; - background-color: white; // prevents code-window from overlapping stickySidebar + background-color: var(--background-color); // prevents code-window from overlapping stickySidebar width: 100%; } @@ -412,16 +672,20 @@ code { } .code-added { - background-color: #e6ffed; + background-color: rgba(46,160,67,0.15); } .code-removed { - background-color: #ffeef0; + background-color: rgba(248,81,73,0.15); } .deprecated { text-decoration: line-through; } +.file-code-icon { + filter: var(--icon-color-filter); +} + .footer { position: absolute; bottom: 0; @@ -435,7 +699,7 @@ code { .gutter { &:hover { - background-color: $gray-light; + background-color: var(--bg-light); } &.gutter-horizontal { @@ -620,8 +884,8 @@ code { .line-details { border-right: 1px solid; - border-right: 1px solid #DEE2E6; - background-color: white; + border-right: 1px solid var(--border-color); + background-color: var(--background-color); color: darkcyan; z-index:1; position: sticky; @@ -699,6 +963,10 @@ mark { .navbar-dark .navbar-nav .nav-link { color: #fff; } + +.navbar-expand-sm .navbar-nav .dropdown-menu { + z-index: 1030; +} /*----------------------------------------------------------------------*/ .namespace-view { @@ -717,13 +985,13 @@ mark { border-collapse: separate; tab-size: 8; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; - background-color: $gray-light; + background-color: var(--bg-light); } .new-thread-comment-text { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; font-size: 14px; - background-color: $gray-light; + background-color: var(--bg-light); max-width: 758px; } @@ -750,7 +1018,7 @@ mark { } .review-thread-reply { - background-color: $gray-light; + background-color: var(--bg-light); border-radius: 0 0 3px 3px; border-top: 1px solid #E1E4E8; border-bottom: 1px solid #E1E4E8; diff --git a/src/dotnet/APIView/APIViewWeb/Client/src/comments.ts b/src/dotnet/APIView/APIViewWeb/Client/src/comments.ts index 0691176959e..0b9519c95e1 100644 --- a/src/dotnet/APIView/APIViewWeb/Client/src/comments.ts +++ b/src/dotnet/APIView/APIViewWeb/Client/src/comments.ts @@ -323,14 +323,14 @@ if (commentRows.length != 1) { if (index == 0) { - commentNavigationButtons.append(``) + commentNavigationButtons.append(``) } else if (index == commentRows.length - 1) { - commentNavigationButtons.append(``) + commentNavigationButtons.append(``) } else { - commentNavigationButtons.append(``) - commentNavigationButtons.append(``) + commentNavigationButtons.append(``) + commentNavigationButtons.append(``) } } }); diff --git a/src/dotnet/APIView/APIViewWeb/Client/src/helpers.ts b/src/dotnet/APIView/APIViewWeb/Client/src/helpers.ts new file mode 100644 index 00000000000..91e0d022b08 --- /dev/null +++ b/src/dotnet/APIView/APIViewWeb/Client/src/helpers.ts @@ -0,0 +1,12 @@ +// Updated Page Setting by Updating UserPreference +export function updatePageSettings(callBack) { + var hideLineNumbers = $("#hide-line-numbers").prop("checked"); + var hideLeftNavigation = $("#hide-left-navigation").prop("checked"); + var selectedTheme = $("#theme-selector").children(":selected").val() as string; + var uri = location.origin + `/account/updatesettings?hideLineNumbers=${hideLineNumbers}&hideLeftNavigation=${hideLeftNavigation}&theme=${selectedTheme}`; + + $.ajax({ + type: "PUT", + url: uri + }).done(callBack()); +} \ No newline at end of file diff --git a/src/dotnet/APIView/APIViewWeb/Client/src/navbar.ts b/src/dotnet/APIView/APIViewWeb/Client/src/navbar.ts index 5f282702bb0..effd5a797be 100644 --- a/src/dotnet/APIView/APIViewWeb/Client/src/navbar.ts +++ b/src/dotnet/APIView/APIViewWeb/Client/src/navbar.ts @@ -1 +1,29 @@ - \ No newline at end of file +import Split from "split.js"; +import { updatePageSettings } from "./helpers"; + +addEventListener("load", () => { + $(".nav-list-toggle").click(function () { + $(this).parents(".nav-list-group").first().toggleClass("nav-list-collapsed"); + }); +}); + +$(() => { + const themeSelector = $( '#theme-selector' ); + + // Add EventListener for Changing CSS Theme + themeSelector.on('change', function() { + updatePageSettings(function(){ + var allThemes = themeSelector.children(); + var newTheme = themeSelector.children(":selected").val() as string; + var themesToRemove = allThemes.filter(function(){ + return ($(this).val() as string) != newTheme; + }); + var body = $('body'); + + themesToRemove.each(function(){ + body.removeClass(($(this).val() as string)); + }) + body.addClass(newTheme); + }); + }); +}); diff --git a/src/dotnet/APIView/APIViewWeb/Client/src/review.ts b/src/dotnet/APIView/APIViewWeb/Client/src/review.ts index db73075ac47..f91a4672aa9 100644 --- a/src/dotnet/APIView/APIViewWeb/Client/src/review.ts +++ b/src/dotnet/APIView/APIViewWeb/Client/src/review.ts @@ -1,4 +1,5 @@ import Split from "split.js"; +import { updatePageSettings } from "./helpers"; $(() => { const SEL_DOC_CLASS = ".documentation"; @@ -7,8 +8,6 @@ $(() => { const SHOW_DOC_HREF = ".show-document"; const SHOW_DIFFONLY_CHECKBOX = ".show-diffonly-checkbox"; const SHOW_DIFFONLY_HREF = ".show-diffonly"; - const HIDE_LINE_NUMBERS = "#hide-line-numbers"; - const HIDE_LEFT_NAVIGATION = "#hide-left-navigation"; hideCheckboxIfNoDocs(); @@ -43,18 +42,6 @@ $(() => { } } - // Updated Page Setting by Updating UserPreference - function updatePageSettings(callBack) { - var hideLineNumbers = $(HIDE_LINE_NUMBERS).prop("checked"); - var hideLeftNavigation = $(HIDE_LEFT_NAVIGATION).prop("checked"); - var uri = `?handler=updatepagesettings&hideLineNumbers=${hideLineNumbers}&hideLeftNavigation=${hideLeftNavigation}`; - - $.ajax({ - type: "GET", - url: uri - }).done(callBack()); - } - /* ADD EVENT LISTENER FOR TOGGLING LEFT NAVIGATION --------------------------------------------------------------------------------------------------------------------------------------------------------*/ addEventListener("load", () => { @@ -83,13 +70,13 @@ $(() => { $(SHOW_DIFFONLY_HREF)[0].click(); }); - $(HIDE_LINE_NUMBERS).on("click", e => { + $("#hide-line-numbers").on("click", e => { updatePageSettings(function(){ $(".line-number").toggleClass("d-none"); }); }); - $(HIDE_LEFT_NAVIGATION).on("click", e => { + $("#hide-left-navigation").on("click", e => { updatePageSettings(function(){ var leftContainer = $("#review-left"); var rightContainer = $("#review-right"); diff --git a/src/dotnet/APIView/APIViewWeb/Controllers/AccountController.cs b/src/dotnet/APIView/APIViewWeb/Controllers/AccountController.cs index 38e5a4ba79d..6f1a6628f4f 100644 --- a/src/dotnet/APIView/APIViewWeb/Controllers/AccountController.cs +++ b/src/dotnet/APIView/APIViewWeb/Controllers/AccountController.cs @@ -2,12 +2,21 @@ using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; +using APIViewWeb.Repositories; +using APIViewWeb.Models; + namespace APIViewWeb.Controllers { [AllowAnonymous] public class AccountController : Controller { + private readonly UserPreferenceCache _preferenceCache; + public AccountController(UserPreferenceCache preferenceCache) + { + _preferenceCache = preferenceCache; + } + [HttpGet] public async Task Login(string returnUrl = "/") { @@ -25,5 +34,19 @@ public async Task Logout() await HttpContext.SignOutAsync(); return RedirectToPage("/Login"); } + + [HttpPut] + [Authorize("RequireOrganization")] + public ActionResult UpdateSettings(bool? hideLineNumbers = null, bool? hideLeftNavigation = null, string theme = "light-theme") + { + _preferenceCache.UpdateUserPreference(new UserPreferenceModel() + { + UserName = User.GetGitHubLogin(), + HideLeftNavigation = hideLeftNavigation, + HideLineNumbers = hideLineNumbers, + Theme = theme + }); + return Ok(); + } } } diff --git a/src/dotnet/APIView/APIViewWeb/Helpers/AutoMapperProfiles.cs b/src/dotnet/APIView/APIViewWeb/Helpers/AutoMapperProfiles.cs index 7ae47cfc55f..335f9a3fb83 100644 --- a/src/dotnet/APIView/APIViewWeb/Helpers/AutoMapperProfiles.cs +++ b/src/dotnet/APIView/APIViewWeb/Helpers/AutoMapperProfiles.cs @@ -15,7 +15,8 @@ public AutoMapperProfiles() .ForMember(dest => dest.State, opt => opt.MapFrom((src, dest) => src.State != null ? src.State : dest.State)) .ForMember(dest => dest.Status, opt => opt.MapFrom((src, dest) => src.Status != null ? src.Status : dest.Status)) .ForMember(dest => dest.HideLineNumbers, opt => opt.MapFrom((src, dest) => src.HideLineNumbers != null ? src.HideLineNumbers : dest.HideLineNumbers)) - .ForMember(dest => dest.HideLeftNavigation, opt => opt.MapFrom((src, dest) => src.HideLeftNavigation != null ? src.HideLeftNavigation : dest.HideLeftNavigation)); + .ForMember(dest => dest.HideLeftNavigation, opt => opt.MapFrom((src, dest) => src.HideLeftNavigation != null ? src.HideLeftNavigation : dest.HideLeftNavigation)) + .ForMember(dest => dest.Theme, opt => opt.MapFrom((src, dest) => src.Theme != null ? src.Theme : dest.Theme)); } } } diff --git a/src/dotnet/APIView/APIViewWeb/Helpers/PageModelHelpers.cs b/src/dotnet/APIView/APIViewWeb/Helpers/PageModelHelpers.cs new file mode 100644 index 00000000000..a6f8579ec61 --- /dev/null +++ b/src/dotnet/APIView/APIViewWeb/Helpers/PageModelHelpers.cs @@ -0,0 +1,13 @@ +using APIViewWeb.Models; +using APIViewWeb.Repositories; + +namespace APIViewWeb.Helpers +{ + public static class PageModelHelpers + { + public static UserPreferenceModel GetUserPreference(UserPreferenceCache preferenceCache, string userName) + { + return preferenceCache.GetUserPreferences(userName); + } + } +} diff --git a/src/dotnet/APIView/APIViewWeb/Models/UserPreferenceModel.cs b/src/dotnet/APIView/APIViewWeb/Models/UserPreferenceModel.cs index 29157c38bc1..44afcdfe847 100644 --- a/src/dotnet/APIView/APIViewWeb/Models/UserPreferenceModel.cs +++ b/src/dotnet/APIView/APIViewWeb/Models/UserPreferenceModel.cs @@ -21,5 +21,7 @@ public class UserPreferenceModel public bool? HideLineNumbers { get; set; } [Name("HideLeftNavigation")] public bool? HideLeftNavigation { get; set; } + [Name("Theme")] + public string Theme { get; set; } } } diff --git a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Conversation.cshtml b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Conversation.cshtml index d652826526b..fce25ea8819 100644 --- a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Conversation.cshtml +++ b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Conversation.cshtml @@ -1,8 +1,11 @@ @page "{id?}" @model APIViewWeb.Pages.Assemblies.ConversationModel +@using APIViewWeb.Helpers +@using APIViewWeb.Models @{ Layout = "ReviewLayout"; ViewData["Title"] = "Conversation"; + ViewData["UserPreference"] = PageModelHelpers.GetUserPreference(Model._preferenceCache, User.GetGitHubLogin()) ?? new UserPreferenceModel(); }
diff --git a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Conversation.cshtml.cs b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Conversation.cshtml.cs index 58d522d0d4d..e32b51e71df 100644 --- a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Conversation.cshtml.cs +++ b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Conversation.cshtml.cs @@ -16,6 +16,7 @@ public class ConversationModel : PageModel private readonly ReviewManager _reviewManager; private const string ENDPOINT_SETTING = "Endpoint"; private readonly BlobCodeFileRepository _codeFileRepository; + public readonly UserPreferenceCache _preferenceCache; public string Endpoint { get; } public ReviewModel Review { get; private set; } @@ -26,12 +27,14 @@ public ConversationModel( IConfiguration configuration, BlobCodeFileRepository codeFileRepository, CommentsManager commentsManager, - ReviewManager reviewManager) + ReviewManager reviewManager, + UserPreferenceCache preferenceCache) { _codeFileRepository = codeFileRepository; _commentsManager = commentsManager; _reviewManager = reviewManager; Endpoint = configuration.GetValue(ENDPOINT_SETTING); + _preferenceCache = preferenceCache; } public async Task OnGetAsync(string id) diff --git a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Delete.cshtml b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Delete.cshtml index 97f04be7b83..6a25f7de99e 100644 --- a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Delete.cshtml +++ b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Delete.cshtml @@ -1,7 +1,10 @@ @page @model APIViewWeb.Pages.Assemblies.DeleteModel +@using APIViewWeb.Helpers +@using APIViewWeb.Models @{ ViewData["Title"] = "Delete"; + ViewData["UserPreference"] = PageModelHelpers.GetUserPreference(Model._preferenceCache, User.GetGitHubLogin()) ?? new UserPreferenceModel(); }
diff --git a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Delete.cshtml.cs b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Delete.cshtml.cs index 356a79891d2..b6537dbe961 100644 --- a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Delete.cshtml.cs +++ b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Delete.cshtml.cs @@ -8,10 +8,12 @@ namespace APIViewWeb.Pages.Assemblies public class DeleteModel : PageModel { private readonly ReviewManager _manager; + public readonly UserPreferenceCache _preferenceCache; - public DeleteModel(ReviewManager manager) + public DeleteModel(ReviewManager manager, UserPreferenceCache preferenceCache) { _manager = manager; + _preferenceCache = preferenceCache; } public string AssemblyName { get; set; } diff --git a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Index.cshtml b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Index.cshtml index d7d2fe6e2ff..8a4abc723a3 100644 --- a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Index.cshtml +++ b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Index.cshtml @@ -3,8 +3,11 @@ @using APIViewWeb @using System @using System.Text.RegularExpressions +@using APIViewWeb.Helpers +@using APIViewWeb.Models @{ ViewData["Title"] = "Reviews"; + ViewData["UserPreference"] = PageModelHelpers.GetUserPreference(Model._preferenceCache, User.GetGitHubLogin()) ?? new UserPreferenceModel(); } @section Scripts { @@ -48,7 +51,7 @@
diff --git a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Index.cshtml.cs b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Index.cshtml.cs index 4e3341ada69..bd0d63790bd 100644 --- a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Index.cshtml.cs +++ b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Index.cshtml.cs @@ -13,7 +13,7 @@ namespace APIViewWeb.Pages.Assemblies public class IndexPageModel : PageModel { private readonly ReviewManager _manager; - private readonly UserPreferenceCache _preferenceCache; + public readonly UserPreferenceCache _preferenceCache; public const int _defaultPageSize = 50; public const string _defaultSortField = "LastUpdated"; diff --git a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/LegacyReview.cshtml b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/LegacyReview.cshtml index 3e702f6eaa5..8c695209fa3 100644 --- a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/LegacyReview.cshtml +++ b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/LegacyReview.cshtml @@ -1,8 +1,10 @@ @page - @model APIViewWeb.Pages.Assemblies.LegacyReview +@using APIViewWeb.Helpers +@using APIViewWeb.Models @{ ViewData["Title"] = "Legacy Review"; + ViewData["UserPreference"] = PageModelHelpers.GetUserPreference(Model._preferenceCache, User.GetGitHubLogin()) ?? new UserPreferenceModel(); }

This review can not be viewed anymore but here are the comments:

diff --git a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/LegacyReview.cshtml.cs b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/LegacyReview.cshtml.cs index 8e905bb1972..c73f1b6020e 100644 --- a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/LegacyReview.cshtml.cs +++ b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/LegacyReview.cshtml.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using ApiView; using APIViewWeb.Models; +using APIViewWeb.Repositories; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; @@ -12,10 +13,12 @@ namespace APIViewWeb.Pages.Assemblies public class LegacyReview: PageModel { private CommentsManager _commentsManager; + public readonly UserPreferenceCache _preferenceCache; - public LegacyReview(CommentsManager commentsManager) + public LegacyReview(CommentsManager commentsManager, UserPreferenceCache preferenceCache) { _commentsManager = commentsManager; + _preferenceCache = preferenceCache; } public string Id { get; set; } diff --git a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Review.cshtml b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Review.cshtml index 7850da5404c..5722855b14e 100644 --- a/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Review.cshtml +++ b/src/dotnet/APIView/APIViewWeb/Pages/Assemblies/Review.cshtml @@ -1,8 +1,12 @@ @page "{id}/{revisionId?}" @model APIViewWeb.Pages.Assemblies.ReviewPageModel +@using APIViewWeb.Helpers +@using APIViewWeb.Models @{ Layout = "ReviewLayout"; ViewData["Title"] = Model.Review.DisplayName; + var userPreference = PageModelHelpers.GetUserPreference(Model._preferenceCache, User.GetGitHubLogin()) ?? new UserPreferenceModel(); + ViewData["UserPreference"] = userPreference; }
@@ -45,13 +49,13 @@ @{ var popOverContent = $"{Model.ActiveConversations} active revision threads.
{Model.TotalActiveConversations} total active threads.
" + $"Current Revision: {@Model.Revision.DisplayName}"; - @if (Model.DiffRevisionId != null) + @if (Model.DiffRevisionId != null) { popOverContent += $"
Current Diff: {@Model.DiffRevision?.DisplayName}"; } - + }
@@ -114,7 +118,7 @@