From cec601ea5930e878c2f1f66f8823cfe1528c9327 Mon Sep 17 00:00:00 2001 From: Jonas Hendrickx Date: Fri, 15 Nov 2024 09:57:41 +0100 Subject: [PATCH] wip --- .../AdminConsole/{ => Components}/App.razor | 2 +- .../{ => Components}/App.razor.cs | 8 +- .../Organizations/ListOrganizationsPage.razor | 232 ++++++++---------- .../Components/Shared/Table/PageLink.razor | 16 ++ .../Components/Shared/Table/PageLink.razor.cs | 15 ++ .../AdminConsole/Components/_Imports.razor | 17 +- src/Admin/AdminConsole/_Imports.razor | 15 -- src/Admin/Sass/site.scss | 8 + src/Admin/Startup.cs | 1 + test/Admin.Test/Admin.Test.csproj | 1 + .../Components/Shared/PageLinkTests.cs | 51 ++++ 11 files changed, 213 insertions(+), 153 deletions(-) rename src/Admin/AdminConsole/{ => Components}/App.razor (98%) rename src/Admin/AdminConsole/{ => Components}/App.razor.cs (93%) create mode 100644 src/Admin/AdminConsole/Components/Shared/Table/PageLink.razor create mode 100644 src/Admin/AdminConsole/Components/Shared/Table/PageLink.razor.cs create mode 100644 test/Admin.Test/AdminConsole/Components/Shared/PageLinkTests.cs diff --git a/src/Admin/AdminConsole/App.razor b/src/Admin/AdminConsole/Components/App.razor similarity index 98% rename from src/Admin/AdminConsole/App.razor rename to src/Admin/AdminConsole/Components/App.razor index 7a895a78e4..2c25e3b694 100644 --- a/src/Admin/AdminConsole/App.razor +++ b/src/Admin/AdminConsole/Components/App.razor @@ -1,6 +1,6 @@ @using Bit.Admin.Services @using Microsoft.AspNetCore.Identity -@using Bit.Admin.Components.Navigation + @inject IHttpContextAccessor HttpContextAccessor @inject SignInManager SignInManager @inject Core.Settings.GlobalSettings GlobalSettings diff --git a/src/Admin/AdminConsole/App.razor.cs b/src/Admin/AdminConsole/Components/App.razor.cs similarity index 93% rename from src/Admin/AdminConsole/App.razor.cs rename to src/Admin/AdminConsole/Components/App.razor.cs index d139d5bc7e..3655bc0866 100644 --- a/src/Admin/AdminConsole/App.razor.cs +++ b/src/Admin/AdminConsole/Components/App.razor.cs @@ -1,7 +1,8 @@ -using Bit.Admin.Enums; +using Bit.Admin.Components.Navigation; +using Bit.Admin.Enums; using Microsoft.AspNetCore.Components; -namespace Bit.Admin.AdminConsole; +namespace Bit.Admin.AdminConsole.Components; public partial class App : ComponentBase { @@ -17,8 +18,7 @@ public partial class App : ComponentBase var canPromoteAdmin = AccessControlService.UserHasPermission(Permission.Tools_PromoteAdmin); var canGenerateLicense = AccessControlService.UserHasPermission(Permission.Tools_GenerateLicenseFile); var canManageTaxRates = AccessControlService.UserHasPermission(Permission.Tools_ManageTaxRates); - var canManageStripeSubscriptions = - AccessControlService.UserHasPermission(Permission.Tools_ManageStripeSubscriptions); + var canManageStripeSubscriptions = AccessControlService.UserHasPermission(Permission.Tools_ManageStripeSubscriptions); var canProcessStripeEvents = AccessControlService.UserHasPermission(Permission.Tools_ProcessStripeEvents); var canMigrateProviders = AccessControlService.UserHasPermission(Permission.Tools_MigrateProviders); diff --git a/src/Admin/AdminConsole/Components/Pages/Organizations/ListOrganizationsPage.razor b/src/Admin/AdminConsole/Components/Pages/Organizations/ListOrganizationsPage.razor index 5dd2e8da07..a622a9a721 100644 --- a/src/Admin/AdminConsole/Components/Pages/Organizations/ListOrganizationsPage.razor +++ b/src/Admin/AdminConsole/Components/Pages/Organizations/ListOrganizationsPage.razor @@ -1,156 +1,124 @@ @page "/organizations2" @using Bit.Core.Repositories @using Bit.Core.Settings -@using Bit.Infrastructure.EntityFramework.AdminConsole.Models +@using Bit.Admin.AdminConsole.Components.Shared.Table @inject IGlobalSettings GlobalSettings @inject IOrganizationRepository OrganizationRepository - - - - - - - - - - - @if (!Model.SelfHosted) - { - - - - - - - } - - - -
- - - - - - - - - - - - @if (Model.Items is { Count: > 0 }) + +
+ + + + + + @if (!Model.SelfHosted) { - @foreach (var organization in Model.Items) + + + + + + + } + +
+ +
+
NamePlanSeatsCreatedDetails
+ + + + + + + + + + + @if (Model.Items is { Count: > 0 }) { - - - - - - + + + + + + @if (organization.Enabled) + { + + + } + else + { + + } + @if (organization.TwoFactorIsEnabled()) + { + + } + else + { + + } + + + } + } + else + { + + } - } - else - { - - - - } - -
NamePlanSeatsCreatedDetails
- @organization.DisplayName() - - @organization.Plan - - @organization.Seats - - - @organization.CreationDate.ToShortDateString() - - - @if (!GlobalSettings.SelfHosted) - { - if (!string.IsNullOrWhiteSpace(organization.GatewaySubscriptionId)) + @foreach (var organization in Model.Items) + { +
+ @organization.DisplayName() + + @organization.Plan + + @organization.Seats + + + @organization.CreationDate.ToShortDateString() + + + @if (!GlobalSettings.SelfHosted) { - + if (!string.IsNullOrWhiteSpace(organization.GatewaySubscriptionId)) + { + + } + else + { + + } + } + @if (organization.MaxStorageGb is > 1) + { + + } else { - + + } - } - @if (organization.MaxStorageGb is > 1) - { - - - } - else - { - - - } - @if (organization.Enabled) - { - - - } - else - { - - } - @if (organization.TwoFactorIsEnabled()) - { - - } - else - { - - } -
No results to list.
No results to list.
-
+ + + - diff --git a/src/Admin/AdminConsole/Components/Shared/Table/PageLink.razor b/src/Admin/AdminConsole/Components/Shared/Table/PageLink.razor new file mode 100644 index 0000000000..aab1e1f67a --- /dev/null +++ b/src/Admin/AdminConsole/Components/Shared/Table/PageLink.razor @@ -0,0 +1,16 @@ +@if (Page.HasValue) +{ +
  • + +
  • +} +else +{ +
  • + + @Label + +
  • +} diff --git a/src/Admin/AdminConsole/Components/Shared/Table/PageLink.razor.cs b/src/Admin/AdminConsole/Components/Shared/Table/PageLink.razor.cs new file mode 100644 index 0000000000..c4ff685c24 --- /dev/null +++ b/src/Admin/AdminConsole/Components/Shared/Table/PageLink.razor.cs @@ -0,0 +1,15 @@ +using Microsoft.AspNetCore.Components; + +namespace Bit.Admin.AdminConsole.Components.Shared.Table; + +public partial class PageLink : ComponentBase +{ + [Parameter] + public string Label { get; set; } + + [Parameter] + public string? FormKey { get; set; } + + [Parameter] + public int? Page { get; set; } +} diff --git a/src/Admin/AdminConsole/Components/_Imports.razor b/src/Admin/AdminConsole/Components/_Imports.razor index 7b48dcecad..42b17f2d22 100644 --- a/src/Admin/AdminConsole/Components/_Imports.razor +++ b/src/Admin/AdminConsole/Components/_Imports.razor @@ -1,3 +1,18 @@ @attribute [Authorize] -@using Bit.Admin.Components +@using Microsoft.AspNetCore.Authorization +@using Microsoft.AspNetCore.Components.Authorization +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web + +@using Microsoft.AspNetCore.Mvc.ViewFeatures +@using static Microsoft.AspNetCore.Components.Web.RenderMode +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.JSInterop +@using System.Net.Http +@using System.Net.Http.Json +@using System.Text.Json + +@using Bit.Admin.Components; +@using Bit.Admin.Components.Navigation; diff --git a/src/Admin/AdminConsole/_Imports.razor b/src/Admin/AdminConsole/_Imports.razor index d50bf8b980..e69de29bb2 100644 --- a/src/Admin/AdminConsole/_Imports.razor +++ b/src/Admin/AdminConsole/_Imports.razor @@ -1,15 +0,0 @@ -@attribute [Authorize] - -@using Microsoft.AspNetCore.Authorization -@using Microsoft.AspNetCore.Components.Authorization -@using Microsoft.AspNetCore.Components.Forms -@using Microsoft.AspNetCore.Components.Routing -@using Microsoft.AspNetCore.Components.Web - -@using Microsoft.AspNetCore.Mvc.ViewFeatures -@using static Microsoft.AspNetCore.Components.Web.RenderMode -@using Microsoft.AspNetCore.Components.Web.Virtualization -@using Microsoft.JSInterop -@using System.Net.Http -@using System.Net.Http.Json -@using System.Text.Json diff --git a/src/Admin/Sass/site.scss b/src/Admin/Sass/site.scss index ab9699de72..829c96679e 100644 --- a/src/Admin/Sass/site.scss +++ b/src/Admin/Sass/site.scss @@ -49,3 +49,11 @@ h3 { .form-check-input { margin-top: .45rem; } + +input.invalid { + border-color: $danger; +} + +.validation-message { + color: $danger; +} diff --git a/src/Admin/Startup.cs b/src/Admin/Startup.cs index 470bf65c58..808deaf197 100644 --- a/src/Admin/Startup.cs +++ b/src/Admin/Startup.cs @@ -1,5 +1,6 @@ using System.Globalization; using Bit.Admin.AdminConsole; +using Bit.Admin.AdminConsole.Components; using Bit.Admin.IdentityServer; using Bit.Core.Context; using Bit.Core.Settings; diff --git a/test/Admin.Test/Admin.Test.csproj b/test/Admin.Test/Admin.Test.csproj index 585da019d0..01d5be219e 100644 --- a/test/Admin.Test/Admin.Test.csproj +++ b/test/Admin.Test/Admin.Test.csproj @@ -4,6 +4,7 @@ Admin.Test + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/test/Admin.Test/AdminConsole/Components/Shared/PageLinkTests.cs b/test/Admin.Test/AdminConsole/Components/Shared/PageLinkTests.cs new file mode 100644 index 0000000000..b903e4cd86 --- /dev/null +++ b/test/Admin.Test/AdminConsole/Components/Shared/PageLinkTests.cs @@ -0,0 +1,51 @@ +using Bit.Admin.AdminConsole.Components.Shared.Table; +using Bunit; + +namespace Admin.Test.AdminConsole.Components.Shared; + +public class PageLinkTests : TestContext +{ + [Fact] + public void PageLink_Renders_ClickableLinksCorrectlyWhenPageParameterIsSet() + { + // Arrange + const string formKey = "Key"; + const string label = "Test"; + const int page = 1; + + // Act + var cut = RenderComponent( + (nameof(PageLink.FormKey), formKey), + (nameof(PageLink.Label), label), + (nameof(PageLink.Page), page) + + ); + + // Assert + var button = cut.Find("button"); + Assert.Equal(formKey, button.Attributes.Single(x => x.Name == "name").Value); + Assert.Equal(label, button.InnerHtml); + Assert.Equal(page.ToString(), button.Attributes.Single(x => x.Name == "value").Value); + } + + [Fact] + public void PageLink_Renders_ClickableLinksCorrectlyWhenPageParameterIsNotSet() + { + // Arrange + const string formKey = "Key"; + const string label = "Test"; + int? page = null; + + // Act + var cut = RenderComponent( + (nameof(PageLink.FormKey), formKey), + (nameof(PageLink.Label), label), + (nameof(PageLink.Page), page) + + ); + + // Assert + var disabledButton = cut.Find("a"); + Assert.Equal("#", disabledButton.Attributes.Single(x => x.Name == "href").Value); + } +}