From 72de8cafa5a2013b16930749b8eb9ab95c1192f5 Mon Sep 17 00:00:00 2001 From: Simon Schulze Date: Wed, 8 Mar 2023 14:24:04 +0100 Subject: [PATCH 01/18] Add new header with nav-links --- src/iRLeagueManager.Web/Shared/Header.razor | 185 +++++++++++++++++- .../Shared/Header.razor.css | 1 + .../Shared/LeagueComponentBase.cs | 51 ++++- .../Shared/MainLayout.razor | 13 +- src/iRLeagueManager.Web/appsettings.json | 4 +- src/iRLeagueManager.Web/wwwroot/css/site.css | 19 +- .../wwwroot/logo/iRLM_Logo_17_darkbg.png | Bin 0 -> 41380 bytes 7 files changed, 248 insertions(+), 25 deletions(-) create mode 100644 src/iRLeagueManager.Web/Shared/Header.razor.css create mode 100644 src/iRLeagueManager.Web/wwwroot/logo/iRLM_Logo_17_darkbg.png diff --git a/src/iRLeagueManager.Web/Shared/Header.razor b/src/iRLeagueManager.Web/Shared/Header.razor index 45f4cfc9..0e3999c4 100644 --- a/src/iRLeagueManager.Web/Shared/Header.razor +++ b/src/iRLeagueManager.Web/Shared/Header.razor @@ -1,13 +1,182 @@ @inherits LeagueComponentBase +@inject LeaguesViewModel Vm -@if (string.IsNullOrEmpty(Shared.LeagueName)) -{ -

iRLeaguemanager

-} -else -{ -

@Shared.LeagueName

-} + @code { + private static string VersionString { get; } = $"{System.Reflection.Assembly.GetEntryAssembly()!.GetName().Version!.Major}.{System.Reflection.Assembly.GetEntryAssembly()!.GetName().Version!.Minor}.{System.Reflection.Assembly.GetEntryAssembly()!.GetName().Version!.Build}"; + + private string CurrentLeagueTarget => string.IsNullOrEmpty(Shared.LeagueName) ? "Leagues" : Shared.LeagueName; + + private string UserName => Shared.Username ?? string.Empty; + + private long SeasonSelect + { + get => Shared.SeasonId; + set => _ = OnSeasonSelectChanged(value); + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + await base.OnAfterRenderAsync(firstRender); + if (firstRender == false) + { + return; + } + if (Vm.Leagues.Count > 0) + { + return; + } + await Vm.OnAfterRenderAsync(firstRender); + } + + private async Task OnSeasonSelectChanged(long value) + { + if (Shared.LeagueName == null || value == 0) + { + return; + } + await ApiService.SetCurrentSeasonAsync(Shared.LeagueName, value); + if (NavigationManager.Uri.Contains($"{Shared.LeagueName}/Results")) + { + ForceNavigateTo($"{Shared.LeagueName}/Results"); + } + if (NavigationManager.Uri.Contains($"{Shared.LeagueName}/Schedules")) + { + ForceNavigateTo($"{Shared.LeagueName}/Schedules"); + } + if (NavigationManager.Uri.Contains($"{Shared.LeagueName}/Standings")) + { + ForceNavigateTo($"{Shared.LeagueName}/Standings"); + } + if (NavigationManager.Uri.Contains($"{Shared.LeagueName}/Reviews")) + { + ForceNavigateTo($"{Shared.LeagueName}/Reviews"); + } + await InvokeAsync(StateHasChanged); + } } diff --git a/src/iRLeagueManager.Web/Shared/Header.razor.css b/src/iRLeagueManager.Web/Shared/Header.razor.css new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/src/iRLeagueManager.Web/Shared/Header.razor.css @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/iRLeagueManager.Web/Shared/LeagueComponentBase.cs b/src/iRLeagueManager.Web/Shared/LeagueComponentBase.cs index ec42edc4..0077dcda 100644 --- a/src/iRLeagueManager.Web/Shared/LeagueComponentBase.cs +++ b/src/iRLeagueManager.Web/Shared/LeagueComponentBase.cs @@ -6,6 +6,7 @@ using Microsoft.JSInterop; using MvvmBlazor.Components; using System.ComponentModel; +using System.Net; namespace iRLeagueManager.Web.Shared; @@ -17,6 +18,7 @@ public abstract partial class LeagueComponentBase : MvvmComponentBase public LeagueApiService ApiService { get; set; } = default!; [Inject] public NavigationManager NavigationManager { get; set; } = default!; + [Inject] protected IJSRuntime JsRuntime { get; set; } = default!; @@ -65,6 +67,13 @@ protected override void OnParametersSet() { SeasonId = Shared.SeasonId; } + if (HasRendered) + { + if (EventId != Event?.EventId) + { + EventList.Selected = EventList.EventList.FirstOrDefault(x => x.EventId == EventId); + } + } ParametersSet = true; } @@ -135,7 +144,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) } } - protected async Task LoadEventList(long seasonId) + public async Task LoadEventList(long seasonId) { await EventList.LoadEventListAsync(seasonId); } @@ -185,4 +194,44 @@ protected async Task ScrollToElementId(string id) { await JsRuntime.InvokeVoidAsync("scrollToElementId", id); } + + protected void NavigateTo(string url, bool replace = false) + { + NavigationManager.NavigateTo(url, replace: replace); + } + + protected void ForceNavigateTo(string url, bool fullReload = false) + { + if (fullReload) + { + NavigationManager.NavigateTo(url, forceLoad: true); + return; + } + + NavigationManager.NavigateTo("/"); + NavigationManager.NavigateTo(url); + } + + /// + /// Get the current url as HTML encoded + /// + /// + protected string GetCurrentUrlEncoded() + { + return WebUtility.UrlEncode(new Uri(NavigationManager.Uri).PathAndQuery); + } + + /// + /// Get the url from returnUrl= parameter. If returnUrl is not set -> return the current url as HTML encoded instead + /// + /// + protected string GetReturnUrl() + { + var returnUrl = NavigationManager.QueryParameter("returnUrl"); + if (string.IsNullOrEmpty(returnUrl)) + { + return GetCurrentUrlEncoded(); + } + return WebUtility.UrlEncode(returnUrl); + } } diff --git a/src/iRLeagueManager.Web/Shared/MainLayout.razor b/src/iRLeagueManager.Web/Shared/MainLayout.razor index 16545ad0..73292278 100644 --- a/src/iRLeagueManager.Web/Shared/MainLayout.razor +++ b/src/iRLeagueManager.Web/Shared/MainLayout.razor @@ -1,18 +1,9 @@ @inherits LayoutComponentBase iRLeagueManager.Web +
- - -
- - - - +
@Body diff --git a/src/iRLeagueManager.Web/appsettings.json b/src/iRLeagueManager.Web/appsettings.json index 8813a99e..bc04f2c2 100644 --- a/src/iRLeagueManager.Web/appsettings.json +++ b/src/iRLeagueManager.Web/appsettings.json @@ -9,8 +9,8 @@ } }, "AllowedHosts": "*", - "APIServer": "http://localhost:5000", - //"APIServer": "https://irleaguemanager.net/api/", + //"APIServer": "http://localhost:5000", + "APIServer": "https://irleaguemanager.net/api/", "DefaultUser": "testuser", "DefaultPassword": "TestPass123!" } diff --git a/src/iRLeagueManager.Web/wwwroot/css/site.css b/src/iRLeagueManager.Web/wwwroot/css/site.css index 499ad32b..0aa5b7f0 100644 --- a/src/iRLeagueManager.Web/wwwroot/css/site.css +++ b/src/iRLeagueManager.Web/wwwroot/css/site.css @@ -1,6 +1,20 @@ @import url('open-iconic/font/css/open-iconic-bootstrap.min.css'); @import url(toggle.css); +.logo { + margin: 0; + height: 45px; + width: auto; + overflow: hidden; + align-items: center; +} + + .logo img { + height: 100%; + vertical-align: central; + margin-bottom: 4px; + } + .root { --bs-border-radius: .25rem; } @@ -46,9 +60,8 @@ h3 { .page-header { background: #34495e; color: #ffffff; - text-align: center; - padding: 0.5rem; - height: 4rem; + padding: 0.25rem 0.75rem; + height: auto; } .alternate > tbody > tr:nth-child(odd) { diff --git a/src/iRLeagueManager.Web/wwwroot/logo/iRLM_Logo_17_darkbg.png b/src/iRLeagueManager.Web/wwwroot/logo/iRLM_Logo_17_darkbg.png new file mode 100644 index 0000000000000000000000000000000000000000..f1962877d53794079e5b5d751869312d23da72f7 GIT binary patch literal 41380 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 literal 0 HcmV?d00001 From 6ff44df02efa1544b81560a64a6f992fe34d6a1f Mon Sep 17 00:00:00 2001 From: Simon Schulze Date: Wed, 8 Mar 2023 14:24:36 +0100 Subject: [PATCH 02/18] Enhance navigation behaviour when selected event changes --- src/iRLeagueManager.Web/Pages/Protests.razor | 2 +- src/iRLeagueManager.Web/Pages/Results.razor | 9 +++--- src/iRLeagueManager.Web/Pages/Reviews.razor | 9 +++--- src/iRLeagueManager.Web/Pages/Seasons.razor | 3 +- src/iRLeagueManager.Web/Pages/Standings.razor | 10 +++---- .../ViewModels/EventListViewModel.cs | 28 ++++++++++++++++++- .../iRLeagueManager.Web.csproj | 2 +- 7 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/iRLeagueManager.Web/Pages/Protests.razor b/src/iRLeagueManager.Web/Pages/Protests.razor index d2297440..223b9aca 100644 --- a/src/iRLeagueManager.Web/Pages/Protests.razor +++ b/src/iRLeagueManager.Web/Pages/Protests.razor @@ -189,7 +189,7 @@ if (@event?.EventId != null) { var navUrl = $"./{LeagueName}/Protests/Events/{@event.EventId}"; - NavigationManager.NavigateTo(navUrl); + NavigationManager.NavigateTo(navUrl, replace: true); await ReviewsVm.LoadFromEventAsync(@event.EventId); } SessionId = @event?.Sessions.FirstOrDefault()?.SessionId; diff --git a/src/iRLeagueManager.Web/Pages/Results.razor b/src/iRLeagueManager.Web/Pages/Results.razor index cab774b6..06ae86a7 100644 --- a/src/iRLeagueManager.Web/Pages/Results.razor +++ b/src/iRLeagueManager.Web/Pages/Results.razor @@ -30,7 +30,7 @@ @foreach((var eventResult, var i) in @Bind(vm, x => x.Results).Select((x, i) => (x,i))) { } @@ -96,8 +96,9 @@ { resultIndex = 0; } - var navUri = $"./{LeagueName}/Results/Events/{@event.EventId}?{resultTabParam}={resultIndex}"; - NavigationManager.NavigateTo(navUri); + var navUri = $"/{LeagueName}/Results/Events/{@event.EventId}?{resultTabParam}={resultIndex}"; + bool replace = NavigationManager.Uri.Contains($"/Events/") == false || NavigationManager.Uri.Contains(navUri); + NavigationManager.NavigateTo(navUri, replace: replace); } } @@ -116,7 +117,7 @@ private void SetSelectedResultIndex(int index) { - NavigationManager.NavigateTo(GetTabLink(index)); + NavigationManager.NavigateTo(GetTabLink(index), replace: true); } private string GetTabLink(int index) diff --git a/src/iRLeagueManager.Web/Pages/Reviews.razor b/src/iRLeagueManager.Web/Pages/Reviews.razor index aa3947ed..eca0a435 100644 --- a/src/iRLeagueManager.Web/Pages/Reviews.razor +++ b/src/iRLeagueManager.Web/Pages/Reviews.razor @@ -23,10 +23,10 @@ { } @@ -183,9 +183,10 @@ { if (@event?.EventId != null) { - var navUrl = $"./{LeagueName}/Reviews/Events/{@event.EventId}?{NavigationManager.QueryString()}"; + var navUrl = $"/{LeagueName}/Reviews/Events/{@event.EventId}?{NavigationManager.QueryString()}"; navUrl = NavigationManager.GetUriWithQueryParameters(navUrl, GetQueryParameters()); - NavigationManager.NavigateTo(navUrl); + bool replace = NavigationManager.Uri.Contains($"/Events/") == false || NavigationManager.Uri.Contains(navUrl); + NavigationManager.NavigateTo(navUrl, replace: replace); await ReviewsVm.LoadFromEventAsync(@event.EventId); } } diff --git a/src/iRLeagueManager.Web/Pages/Seasons.razor b/src/iRLeagueManager.Web/Pages/Seasons.razor index 7042bda7..cbfee91f 100644 --- a/src/iRLeagueManager.Web/Pages/Seasons.razor +++ b/src/iRLeagueManager.Web/Pages/Seasons.razor @@ -1,4 +1,5 @@ -@page "/{LeagueName}/Seasons" +@page "/{LeagueName}" +@page "/{LeagueName}/Seasons" @page "/{LeagueName}/Seasons/{SeasonId:long}" @using iRLeagueManager.Web.Components @using iRLeagueManager.Web.ViewModels diff --git a/src/iRLeagueManager.Web/Pages/Standings.razor b/src/iRLeagueManager.Web/Pages/Standings.razor index 09ad1de0..b4a98839 100644 --- a/src/iRLeagueManager.Web/Pages/Standings.razor +++ b/src/iRLeagueManager.Web/Pages/Standings.razor @@ -30,7 +30,7 @@ @foreach((var standing, var i) in @Bind(vm, x => x.Standings).Select((x, i) => (x,i))) { } @@ -54,15 +54,15 @@ if (@event?.EventId != null) { var standingIndex = NavigationManager.QueryParameter(standingTabParam); - NavigationManager.NavigateTo($"./{LeagueName}/Standings/Events/{@event.EventId}"); await vm.LoadFromEventAsync(@event.EventId); - + if (standingIndex >= vm.Standings.Count() || standingIndex < 0) { standingIndex = 0; } - var navUri = $"./{LeagueName}/Standings/Events/{@event.EventId}?{standingTabParam}={standingIndex}"; - NavigationManager.NavigateTo(navUri); + var navUri = $"/{LeagueName}/Standings/Events/{@event.EventId}?{standingTabParam}={standingIndex}"; + bool replace = NavigationManager.Uri.Contains($"/Events/") == false || NavigationManager.Uri.Contains(navUri); + NavigationManager.NavigateTo(navUri, replace: replace); } } diff --git a/src/iRLeagueManager.Web/ViewModels/EventListViewModel.cs b/src/iRLeagueManager.Web/ViewModels/EventListViewModel.cs index de672f3e..a1344001 100644 --- a/src/iRLeagueManager.Web/ViewModels/EventListViewModel.cs +++ b/src/iRLeagueManager.Web/ViewModels/EventListViewModel.cs @@ -15,7 +15,21 @@ public EventListViewModel(ILoggerFactory loggerFactory, LeagueApiService apiServ public ObservableCollection EventList { get => eventList; set => Set(ref eventList, value); } private EventViewModel? selected; - public EventViewModel? Selected { get => selected; set => Set(ref selected, value); } + public EventViewModel? Selected + { + get => selected; + set + { + var old = selected; + Set(ref selected, value); + if (selected?.EventId != old?.EventId) + { + EventChanged?.Invoke(this, new EventChangedEventArgs(old, value)); + } + } + } + + public event EventHandler EventChanged; public async Task LoadEventListAsync(long seasonId) { @@ -83,4 +97,16 @@ public async Task LoadEventListFromEventAsync(long eventId, CancellationToken ca Loading = false; } } + + public class EventChangedEventArgs : EventArgs + { + public EventViewModel? Old; + public EventViewModel? New; + + public EventChangedEventArgs(EventViewModel? old, EventViewModel? @new) + { + Old = old; + New = @new; + } + } } diff --git a/src/iRLeagueManager.Web/iRLeagueManager.Web.csproj b/src/iRLeagueManager.Web/iRLeagueManager.Web.csproj index 693ec648..420a33b5 100644 --- a/src/iRLeagueManager.Web/iRLeagueManager.Web.csproj +++ b/src/iRLeagueManager.Web/iRLeagueManager.Web.csproj @@ -2,7 +2,7 @@ net6.0 - 0.5.0 + 0.5.1-dev.1 enable enable aspnet-iRLeagueManager.Web-2B05F9DC-55A3-49D1-BD64-31507000EDF3 From 83a052ad9c33b19ab2eee4b5d2e0b24ecebd122b Mon Sep 17 00:00:00 2001 From: Simon Schulze Date: Wed, 8 Mar 2023 14:51:51 +0100 Subject: [PATCH 03/18] Fix error on review page --- src/iRLeagueManager.Web/Pages/Reviews.razor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/iRLeagueManager.Web/Pages/Reviews.razor b/src/iRLeagueManager.Web/Pages/Reviews.razor index eca0a435..443e1c52 100644 --- a/src/iRLeagueManager.Web/Pages/Reviews.razor +++ b/src/iRLeagueManager.Web/Pages/Reviews.razor @@ -23,10 +23,10 @@ { } From 206a12ca106df839bf666b270f40263f4c7f5603 Mon Sep 17 00:00:00 2001 From: Simon Schulze Date: Wed, 8 Mar 2023 15:16:12 +0100 Subject: [PATCH 04/18] Experiment sticky header --- src/iRLeagueManager.Web/Pages/Results.razor | 65 +++++++++++---------- 1 file changed, 33 insertions(+), 32 deletions(-) diff --git a/src/iRLeagueManager.Web/Pages/Results.razor b/src/iRLeagueManager.Web/Pages/Results.razor index 06ae86a7..f1d943a5 100644 --- a/src/iRLeagueManager.Web/Pages/Results.razor +++ b/src/iRLeagueManager.Web/Pages/Results.razor @@ -14,42 +14,43 @@ @inject ResultsPageViewModel vm
- x.Loading)> -

Results

-
- - - @if (@Bind(vm, x => x.Results)?.Count == 0) - { -
-

No Results

-
- } -
- - - - @if (vm.SelectedEvent?.HasResult == true && SharedState.SeasonFinished == false) +
+ x.Loading)> +

Results

+
+ + @if (@Bind(vm, x => x.Results)?.Count == 0) + { +
+

No Results

+
+ } +
+ + + + @if (vm.SelectedEvent?.HasResult == true && SharedState.SeasonFinished == false) { - + @if (vm.Results.Count > 0) + { + + } } - } - - + + +
@if (@Bind(vm, x => x.SelectedEvent) != null && @Bind(vm, x => x.SelectedEventResult) != null) { From 4700637e8dd23b78c5acb7ee2e340dc6082a2bd5 Mon Sep 17 00:00:00 2001 From: Simon Schulze Date: Wed, 8 Mar 2023 16:43:41 +0100 Subject: [PATCH 05/18] Sticky headers for page content --- src/iRLeagueManager.Web/Pages/Leagues.razor | 8 ++-- src/iRLeagueManager.Web/Pages/Results.razor | 3 +- src/iRLeagueManager.Web/Pages/Reviews.razor | 32 ++++++++------- src/iRLeagueManager.Web/Pages/Schedules.razor | 8 ++-- src/iRLeagueManager.Web/Pages/Standings.razor | 39 ++++++++++--------- src/iRLeagueManager.Web/Shared/Header.razor | 4 +- src/iRLeagueManager.Web/wwwroot/css/site.css | 9 +++++ 7 files changed, 61 insertions(+), 42 deletions(-) diff --git a/src/iRLeagueManager.Web/Pages/Leagues.razor b/src/iRLeagueManager.Web/Pages/Leagues.razor index 8a807393..7f184b95 100644 --- a/src/iRLeagueManager.Web/Pages/Leagues.razor +++ b/src/iRLeagueManager.Web/Pages/Leagues.razor @@ -9,9 +9,11 @@ @inject ILeagueApiClient apiClient
- x.Loading)> -

Leagues

-
+ diff --git a/src/iRLeagueManager.Web/Pages/Results.razor b/src/iRLeagueManager.Web/Pages/Results.razor index f1d943a5..53c56913 100644 --- a/src/iRLeagueManager.Web/Pages/Results.razor +++ b/src/iRLeagueManager.Web/Pages/Results.razor @@ -14,7 +14,7 @@ @inject ResultsPageViewModel vm
-
+
+ @if (@Bind(vm, x => x.SelectedEvent) != null && @Bind(vm, x => x.SelectedEventResult) != null) { @foreach(var result in @Bind(vm.SelectedEventResult!, x => x.SessionResults).OrderByDescending(x => x.SessionNr)) diff --git a/src/iRLeagueManager.Web/Pages/Reviews.razor b/src/iRLeagueManager.Web/Pages/Reviews.razor index 443e1c52..fa11fd59 100644 --- a/src/iRLeagueManager.Web/Pages/Reviews.razor +++ b/src/iRLeagueManager.Web/Pages/Reviews.razor @@ -13,23 +13,25 @@ @inject ClientLocalTimeProvider ClientTime
- x.Loading))> -

Reviews

-
+ @switch (SelectedTabIndex) diff --git a/src/iRLeagueManager.Web/Pages/Schedules.razor b/src/iRLeagueManager.Web/Pages/Schedules.razor index a35aaf18..230e8be4 100644 --- a/src/iRLeagueManager.Web/Pages/Schedules.razor +++ b/src/iRLeagueManager.Web/Pages/Schedules.razor @@ -10,9 +10,11 @@ @inject JsonSerializerOptions jsonOptions
- x.Loading)> -

Schedules

-
+ diff --git a/src/iRLeagueManager.Web/Pages/Standings.razor b/src/iRLeagueManager.Web/Pages/Standings.razor index b4a98839..c72b4274 100644 --- a/src/iRLeagueManager.Web/Pages/Standings.razor +++ b/src/iRLeagueManager.Web/Pages/Standings.razor @@ -15,25 +15,28 @@ @inject StandingsPageViewModel vm
- x.Loading)> -

Standings

-
+ - - @if (@Bind(vm, x => x.Standings)?.Count == 0) - { -
-

No Standings

-
- } - @if (@Bind(vm, x => x.SelectedStanding) != null) { x.SelectedStanding)/> diff --git a/src/iRLeagueManager.Web/Shared/Header.razor b/src/iRLeagueManager.Web/Shared/Header.razor index 0e3999c4..21911f85 100644 --- a/src/iRLeagueManager.Web/Shared/Header.razor +++ b/src/iRLeagueManager.Web/Shared/Header.razor @@ -1,8 +1,8 @@ @inherits LeagueComponentBase @inject LeaguesViewModel Vm -
+
diff --git a/src/iRLeagueManager.Web/Pages/_Layout.cshtml b/src/iRLeagueManager.Web/Pages/_Layout.cshtml index 5589a7ad..bd4cbd82 100644 --- a/src/iRLeagueManager.Web/Pages/_Layout.cshtml +++ b/src/iRLeagueManager.Web/Pages/_Layout.cshtml @@ -8,7 +8,11 @@ - + + @**@ + + + diff --git a/src/iRLeagueManager.Web/wwwroot/css/site.css b/src/iRLeagueManager.Web/wwwroot/css/site.css index 8a48b246..b7b6fb14 100644 --- a/src/iRLeagueManager.Web/wwwroot/css/site.css +++ b/src/iRLeagueManager.Web/wwwroot/css/site.css @@ -19,13 +19,17 @@ --bs-border-radius: .25rem; } +.blazored-modal { + background-color: var(--bs-body-bg) !important; +} + .sticky-header { position: sticky; z-index: 10; top: 4rem; padding-top: 0.25rem; padding-bottom: 0.25rem; - background: var(--bs-white); + background: var(--bs-body-bg); } html, body { diff --git a/src/iRLeagueManager.Web/wwwroot/css/toggle.css b/src/iRLeagueManager.Web/wwwroot/css/toggle.css index efdb1109..b21c19b5 100644 --- a/src/iRLeagueManager.Web/wwwroot/css/toggle.css +++ b/src/iRLeagueManager.Web/wwwroot/css/toggle.css @@ -1,4 +1,4 @@ -@import url(bootstrap/bootstrap.min.css); +/*@import url(bootstrap/bootstrap.min.css);*/ /* The switch - the box around the slider */ .switch { From 4178e15421b80cea727a024a190a506d775eb6bc Mon Sep 17 00:00:00 2001 From: Simon Schulze Date: Thu, 9 Mar 2023 08:00:20 +0100 Subject: [PATCH 12/18] xxl width step for container --- src/iRLeagueManager.Web/Pages/Settings/Settings.razor | 1 - src/iRLeagueManager.Web/ViewModels/EventListViewModel.cs | 2 +- src/iRLeagueManager.Web/wwwroot/css/site.css | 6 ++++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/iRLeagueManager.Web/Pages/Settings/Settings.razor b/src/iRLeagueManager.Web/Pages/Settings/Settings.razor index c50c3a9c..b8f1da45 100644 --- a/src/iRLeagueManager.Web/Pages/Settings/Settings.razor +++ b/src/iRLeagueManager.Web/Pages/Settings/Settings.razor @@ -1,6 +1,5 @@ @page "/{LeagueName}/Settings" @page "/{LeagueName}/Settings/Season/{SeasonId:long}" -@attribute [Authorize] @using System.Text @using iRLeagueManager.Web.Components @using iRLeagueManager.Web.Components.Settings diff --git a/src/iRLeagueManager.Web/ViewModels/EventListViewModel.cs b/src/iRLeagueManager.Web/ViewModels/EventListViewModel.cs index a1344001..fb503d17 100644 --- a/src/iRLeagueManager.Web/ViewModels/EventListViewModel.cs +++ b/src/iRLeagueManager.Web/ViewModels/EventListViewModel.cs @@ -29,7 +29,7 @@ public EventViewModel? Selected } } - public event EventHandler EventChanged; + public event EventHandler? EventChanged; public async Task LoadEventListAsync(long seasonId) { diff --git a/src/iRLeagueManager.Web/wwwroot/css/site.css b/src/iRLeagueManager.Web/wwwroot/css/site.css index b7b6fb14..da7f80a4 100644 --- a/src/iRLeagueManager.Web/wwwroot/css/site.css +++ b/src/iRLeagueManager.Web/wwwroot/css/site.css @@ -277,6 +277,12 @@ a, .btn-link { display: none; } +@media (min-width: 1600px) { + .container, .container-lg, .container-md, .container-sm, .container-xl, .container-xxl { + max-width: 1520px; + } +} + @keyframes lds-ring { 0% { transform: rotate(0deg); From ca2922005d73cb88d36bf801fa08a19ab18a731a Mon Sep 17 00:00:00 2001 From: Simon Schulze Date: Thu, 9 Mar 2023 12:49:10 +0100 Subject: [PATCH 13/18] Unstick footer Remove sticky header below certain height. --- src/iRLeagueManager.Web/Shared/MainLayout.razor.css | 6 +++--- src/iRLeagueManager.Web/wwwroot/css/site.css | 9 +++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/iRLeagueManager.Web/Shared/MainLayout.razor.css b/src/iRLeagueManager.Web/Shared/MainLayout.razor.css index fe0df7db..137a5609 100644 --- a/src/iRLeagueManager.Web/Shared/MainLayout.razor.css +++ b/src/iRLeagueManager.Web/Shared/MainLayout.razor.css @@ -3,15 +3,15 @@ position: relative; display: flex; flex-direction: column; - min-height: 100vh; + min-height: calc(100vh - 2em); } .page-footer { - position: fixed; + position: relative; left: 0; bottom: 0; width: 100%; - height: 1.25rem; + height: auto; background-color: dimgray; color: white; padding: 0px, 4px, 0px, 4px !important; diff --git a/src/iRLeagueManager.Web/wwwroot/css/site.css b/src/iRLeagueManager.Web/wwwroot/css/site.css index da7f80a4..fb76e4bf 100644 --- a/src/iRLeagueManager.Web/wwwroot/css/site.css +++ b/src/iRLeagueManager.Web/wwwroot/css/site.css @@ -32,6 +32,14 @@ background: var(--bs-body-bg); } +@media (max-height: 900px) { + .sticky-header { + position: unset; + z-index: inherit; + top: 0; + } +} + html, body { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 1rem; @@ -75,6 +83,7 @@ h3 { background: #34495e; color: #ffffff; padding: 0.25rem 0.75rem; + min-height: 4em; } .alternate > tbody > tr:nth-child(odd) { From bc7dc46eacfa255a8a49b1fe11cd6d895f58a920 Mon Sep 17 00:00:00 2001 From: Simon Schulze Date: Thu, 9 Mar 2023 13:57:46 +0100 Subject: [PATCH 14/18] Improve visuals for input groups --- src/iRLeagueManager.Web/Pages/_Layout.cshtml | 2 +- src/iRLeagueManager.Web/wwwroot/css/site.css | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/iRLeagueManager.Web/Pages/_Layout.cshtml b/src/iRLeagueManager.Web/Pages/_Layout.cshtml index bd4cbd82..84ed86be 100644 --- a/src/iRLeagueManager.Web/Pages/_Layout.cshtml +++ b/src/iRLeagueManager.Web/Pages/_Layout.cshtml @@ -13,9 +13,9 @@ + - diff --git a/src/iRLeagueManager.Web/wwwroot/css/site.css b/src/iRLeagueManager.Web/wwwroot/css/site.css index fb76e4bf..dbfaf027 100644 --- a/src/iRLeagueManager.Web/wwwroot/css/site.css +++ b/src/iRLeagueManager.Web/wwwroot/css/site.css @@ -197,6 +197,10 @@ a, .btn-link { filter: brightness(110%); } +.input-group > .valid, .invalid { + outline-offset: -1px; +} + .input-group-list > .input-group:not(:first-child) > * { border-top-left-radius: 0; border-top-right-radius: 0; @@ -205,6 +209,9 @@ a, .btn-link { .input-group-list > .input-group:not(:last-child) > * { border-bottom-left-radius: 0; border-bottom-right-radius: 0; +} + +.input-group-list > .input-group:not(:last-child) > *:not(:focus):not(.btn) { border-bottom: none; } From 3a17cef7cc905a8c17d2f655f312831c5decde7d Mon Sep 17 00:00:00 2001 From: Simon Schulze Date: Sun, 12 Mar 2023 12:40:19 +0100 Subject: [PATCH 15/18] Tweak dark mode colors Optimize flex layout on pages with event-select --- .../Components/EditEventModal.razor | 3 +- .../Components/EventSelect.razor | 2 +- .../Components/LoadingHeader.razor | 4 +- .../Components/Reviews/ReviewCard.razor | 4 +- src/iRLeagueManager.Web/Pages/Leagues.razor | 2 +- src/iRLeagueManager.Web/Pages/Protests.razor | 2 +- src/iRLeagueManager.Web/Pages/Results.razor | 12 +-- src/iRLeagueManager.Web/Pages/Reviews.razor | 13 +-- src/iRLeagueManager.Web/Pages/Schedules.razor | 2 +- src/iRLeagueManager.Web/Pages/Seasons.razor | 2 +- .../Pages/Settings/Settings.razor | 2 +- src/iRLeagueManager.Web/Pages/Standings.razor | 12 +-- src/iRLeagueManager.Web/Pages/_Layout.cshtml | 2 +- .../Shared/MainLayout.razor.css | 3 +- src/iRLeagueManager.Web/wwwroot/css/site.css | 87 +++++++++++++++++++ 15 files changed, 122 insertions(+), 30 deletions(-) diff --git a/src/iRLeagueManager.Web/Components/EditEventModal.razor b/src/iRLeagueManager.Web/Components/EditEventModal.razor index a5855fd1..039497dd 100644 --- a/src/iRLeagueManager.Web/Components/EditEventModal.razor +++ b/src/iRLeagueManager.Web/Components/EditEventModal.razor @@ -26,8 +26,7 @@ MinimumLength=1 MaximumSuggestions=100 EnableDropDown=true - class="form-control py-0 px-0 ps-1 border border-top-0" - style="border-color: #ced4da !important" + class="form-control py-0 px-0 ps-1" placeholder="Search by Track name..."> @track?.TrackName diff --git a/src/iRLeagueManager.Web/Components/EventSelect.razor b/src/iRLeagueManager.Web/Components/EventSelect.razor index 947f15f9..0db65bfb 100644 --- a/src/iRLeagueManager.Web/Components/EventSelect.razor +++ b/src/iRLeagueManager.Web/Components/EventSelect.razor @@ -64,7 +64,7 @@ [Parameter] public EventCallback SelectedChanged { get; set; } - private const string BaseClass = "input-group container px-0 mb-2 mx-0"; + private const string BaseClass = "input-group"; private string CssClass { get diff --git a/src/iRLeagueManager.Web/Components/LoadingHeader.razor b/src/iRLeagueManager.Web/Components/LoadingHeader.razor index ef046d5f..f1bde7b6 100644 --- a/src/iRLeagueManager.Web/Components/LoadingHeader.razor +++ b/src/iRLeagueManager.Web/Components/LoadingHeader.razor @@ -1,10 +1,10 @@ @using System.ComponentModel
-
+
@ChildContent +
-
@code { diff --git a/src/iRLeagueManager.Web/Components/Reviews/ReviewCard.razor b/src/iRLeagueManager.Web/Components/Reviews/ReviewCard.razor index d86db5f5..25e3f752 100644 --- a/src/iRLeagueManager.Web/Components/Reviews/ReviewCard.razor +++ b/src/iRLeagueManager.Web/Components/Reviews/ReviewCard.razor @@ -51,7 +51,7 @@
-
+
Involved
@@ -76,7 +76,7 @@
-
+
Involved Drivers
diff --git a/src/iRLeagueManager.Web/Pages/Leagues.razor b/src/iRLeagueManager.Web/Pages/Leagues.razor index 8ffb838d..13d024ee 100644 --- a/src/iRLeagueManager.Web/Pages/Leagues.razor +++ b/src/iRLeagueManager.Web/Pages/Leagues.razor @@ -8,7 +8,7 @@ @inject LeaguesViewModel vm @inject ILeagueApiClient apiClient -
+
Id
@@ -24,10 +26,6 @@
} - else - { - Points from source - }
@code { @@ -41,4 +39,22 @@ base.OnParametersSet(); BlazorParameterNullException.ThrowIfNull(this, PointRule); } + + private string GetPointTypeString() + { + if (PointRule.PointsPerPlace.Count() == 0) + { + return "Keep points"; + } + switch (PointRule.RuleType) + { + case PointRuleType.PointList: + return "Points per place"; + case PointRuleType.MaxPoints: + return $"Max pts.: {PointRule.MaxPoints}; Drop-off: {PointRule.PointDropOff}"; + case PointRuleType.Formula: + return $"Formula"; + } + return "Unknown"; + } } diff --git a/src/iRLeagueManager.Web/Components/Settings/ResultConfigPreview.razor b/src/iRLeagueManager.Web/Components/Settings/ResultConfigPreview.razor index 5e3f7887..fbbc164c 100644 --- a/src/iRLeagueManager.Web/Components/Settings/ResultConfigPreview.razor +++ b/src/iRLeagueManager.Web/Components/Settings/ResultConfigPreview.razor @@ -16,6 +16,7 @@
@scoring.Name
+ Sort results by: @string.Join(" then ", scoring.PointRule.FinalSortOptions)
diff --git a/src/iRLeagueManager.Web/Pages/Settings/Settings.razor b/src/iRLeagueManager.Web/Pages/Settings/Settings.razor index 2dc2cfb4..2d9e9688 100644 --- a/src/iRLeagueManager.Web/Pages/Settings/Settings.razor +++ b/src/iRLeagueManager.Web/Pages/Settings/Settings.razor @@ -44,19 +44,19 @@ @switch (selectedTabIndex) { case 0: - + break; case 1: - + break; case 2: - + break; case 3: - + break; case 4: - + break; default:

Index out of bounds!

From 8cc3173df3092d457d59e8f3c873eb8c8ba0ddba Mon Sep 17 00:00:00 2001 From: Simon Schulze Date: Sun, 12 Mar 2023 18:35:32 +0100 Subject: [PATCH 17/18] Improve header design Fix missing form-select background --- src/iRLeagueManager.Web/Shared/Header.razor | 79 +++++++++++++------ .../Shared/LeagueComponentBase.cs | 4 +- src/iRLeagueManager.Web/wwwroot/css/site.css | 5 ++ 3 files changed, 62 insertions(+), 26 deletions(-) diff --git a/src/iRLeagueManager.Web/Shared/Header.razor b/src/iRLeagueManager.Web/Shared/Header.razor index d0ec3c1c..cca95e89 100644 --- a/src/iRLeagueManager.Web/Shared/Header.razor +++ b/src/iRLeagueManager.Web/Shared/Header.razor @@ -1,4 +1,5 @@ -@inherits LeagueComponentBase +@using System.Security.Claims; +@inherits LeagueComponentBase @inject LeaguesViewModel Vm