From a4e65de7e145eb2d881f05e4a5d34ce1ba4a0734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Rua?= <140734849+joao4all@users.noreply.github.com> Date: Thu, 18 Apr 2024 15:56:58 +0100 Subject: [PATCH] Feat #573 System.Drawing.Common version 5.0.3 and #577 Improve Edit/Inspect Person Role (#582) --- COMET.Web.Common/COMET.Web.Common.csproj | 1 + .../PublicationsTableTestFixture.cs | 2 +- .../DomainsOfExpertiseTableTestFixture.cs | 14 ++- .../ActiveDomainsTableTestFixture.cs | 6 +- .../EngineeringModelsTableTestFixture.cs | 4 +- .../ParticipantsTableTestFixture.cs | 2 +- .../Roles/ParticipantRolesTableTestFixture.cs | 6 +- .../Roles/PersonRolesTableTestFixture.cs | 6 +- .../Common/DataItemDetailsComponent.razor | 31 +++++ .../Common/DataItemDetailsComponent.razor.cs | 46 ++++++++ .../Common/DataItemDetailsComponent.razor.css | 10 ++ .../Common/SelectedDataItemBase.razor.cs | 5 + .../CommonFileStoresTable.razor | 26 ++--- .../CommonFileStoresTable.razor.cs | 5 - .../EngineeringModel/OptionsTable.razor | 22 ++-- .../EngineeringModel/OptionsTable.razor.cs | 5 - .../EngineeringModel/PublicationsTable.razor | 2 +- .../PublicationsTable.razor.cs | 7 +- .../DomainsOfExpertiseForm.razor | 46 ++++++++ .../DomainsOfExpertiseForm.razor.cs | 55 +++++++++ .../DomainsOfExpertiseTable.razor | 110 +++++++++--------- .../DomainsOfExpertiseTable.razor.cs | 20 ++-- .../EngineeringModel/ActiveDomainsTable.razor | 2 +- .../ActiveDomainsTable.razor.cs | 7 +- .../EngineeringModelsTable.razor | 42 +++---- .../EngineeringModelsTable.razor.cs | 7 +- .../EngineeringModel/ParticipantsTable.razor | 2 +- .../ParticipantsTable.razor.cs | 7 +- .../Roles/ParticipantRolesTable.razor | 27 +++-- .../Roles/ParticipantRolesTable.razor.cs | 7 +- .../Roles/PersonRolesTable.razor | 27 +++-- .../Roles/PersonRolesTable.razor.cs | 9 +- .../IDeprecatableDataItemTableViewModel.cs | 2 - COMETwebapp/wwwroot/css/app.css | 2 + .../wwwroot/images/comet-logo-black.png | Bin 0 -> 22947 bytes .../wwwroot/images/comet-logo-white.png | Bin 0 -> 24785 bytes 36 files changed, 367 insertions(+), 205 deletions(-) create mode 100644 COMETwebapp/Components/Common/DataItemDetailsComponent.razor create mode 100644 COMETwebapp/Components/Common/DataItemDetailsComponent.razor.cs create mode 100644 COMETwebapp/Components/Common/DataItemDetailsComponent.razor.css create mode 100644 COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseForm.razor create mode 100644 COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseForm.razor.cs create mode 100644 COMETwebapp/wwwroot/images/comet-logo-black.png create mode 100644 COMETwebapp/wwwroot/images/comet-logo-white.png diff --git a/COMET.Web.Common/COMET.Web.Common.csproj b/COMET.Web.Common/COMET.Web.Common.csproj index cab7d65a..1b0339e6 100644 --- a/COMET.Web.Common/COMET.Web.Common.csproj +++ b/COMET.Web.Common/COMET.Web.Common.csproj @@ -38,6 +38,7 @@ + diff --git a/COMETwebapp.Tests/Components/EngineeringModel/PublicationsTableTestFixture.cs b/COMETwebapp.Tests/Components/EngineeringModel/PublicationsTableTestFixture.cs index 05d05d2d..a6dba648 100644 --- a/COMETwebapp.Tests/Components/EngineeringModel/PublicationsTableTestFixture.cs +++ b/COMETwebapp.Tests/Components/EngineeringModel/PublicationsTableTestFixture.cs @@ -144,7 +144,7 @@ public async Task VerifyPublicationDetails() Assert.Multiple(() => { - Assert.That(this.renderer.Instance.IsPublicationDetailsPopupOpen, Is.EqualTo(true)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(true)); Assert.That(this.renderer.Instance.SelectedRow, Is.EqualTo(this.viewModel.Object.Rows.Items.First())); }); } diff --git a/COMETwebapp.Tests/Components/SiteDirectory/DomainsOfExpertiseTableTestFixture.cs b/COMETwebapp.Tests/Components/SiteDirectory/DomainsOfExpertiseTableTestFixture.cs index f01eacc1..a9d7c979 100644 --- a/COMETwebapp.Tests/Components/SiteDirectory/DomainsOfExpertiseTableTestFixture.cs +++ b/COMETwebapp.Tests/Components/SiteDirectory/DomainsOfExpertiseTableTestFixture.cs @@ -42,6 +42,7 @@ namespace COMETwebapp.Tests.Components.SiteDirectory using DynamicData; + using Microsoft.AspNetCore.Components.Forms; using Microsoft.Extensions.DependencyInjection; using Moq; @@ -142,16 +143,21 @@ public async Task VerifyAddingOrEditingDomainOfExpertise() Assert.Multiple(() => { - Assert.That(renderer.Instance.ShouldCreateThing, Is.EqualTo(true)); + Assert.That(renderer.Instance.IsOnEditMode, Is.EqualTo(false)); Assert.That(this.viewModel.Object.Thing, Is.InstanceOf(typeof(DomainOfExpertise))); }); - var editDomainOfExpertiseButton = renderer.FindComponents().First(x => x.Instance.Id == "editDomainOfExpertiseButton"); - await renderer.InvokeAsync(editDomainOfExpertiseButton.Instance.Click.InvokeAsync); + var domainsGrid = renderer.FindComponent(); + await renderer.InvokeAsync(() => domainsGrid.Instance.SelectedDataItemChanged.InvokeAsync(new DomainOfExpertiseRowViewModel(this.domainOfExpertise1))); + Assert.That(renderer.Instance.IsOnEditMode, Is.EqualTo(true)); + + var domainsForm = renderer.FindComponents()[1]; + var domainsEditForm = domainsForm.FindComponent(); + await domainsForm.InvokeAsync(domainsEditForm.Instance.OnValidSubmit.InvokeAsync); Assert.Multiple(() => { - Assert.That(renderer.Instance.ShouldCreateThing, Is.EqualTo(false)); + this.viewModel.Verify(x => x.CreateOrEditDomainOfExpertise(false), Times.Once); Assert.That(this.viewModel.Object.Thing, Is.InstanceOf(typeof(DomainOfExpertise))); }); diff --git a/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/ActiveDomainsTableTestFixture.cs b/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/ActiveDomainsTableTestFixture.cs index e1e504c1..9f44d9bf 100644 --- a/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/ActiveDomainsTableTestFixture.cs +++ b/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/ActiveDomainsTableTestFixture.cs @@ -120,12 +120,12 @@ public void VerifyOnInitialized() [Test] public async Task VerifyEditActiveDomains() { - Assert.That(this.renderer.Instance.IsEditPopupVisible, Is.EqualTo(false)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(false)); var editActiveDomainsClickableItem = this.renderer.FindComponent(); await this.renderer.InvokeAsync(editActiveDomainsClickableItem.Instance.Click.InvokeAsync); - Assert.That(this.renderer.Instance.IsEditPopupVisible, Is.EqualTo(true)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(true)); var saveActiveDomainsButton = this.renderer.FindComponents().First(x => x.Instance.Id == "saveActiveDomainsButton"); await this.renderer.InvokeAsync(saveActiveDomainsButton.Instance.Click.InvokeAsync); @@ -140,7 +140,7 @@ public async Task VerifyEditActiveDomains() Assert.Multiple(() => { this.viewModel.Verify(x => x.ResetSelectedDomainsOfExpertise(), Times.Once); - Assert.That(this.renderer.Instance.IsEditPopupVisible, Is.EqualTo(false)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(false)); }); } } diff --git a/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/EngineeringModelsTableTestFixture.cs b/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/EngineeringModelsTableTestFixture.cs index 679ea7c1..79b45c8e 100644 --- a/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/EngineeringModelsTableTestFixture.cs +++ b/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/EngineeringModelsTableTestFixture.cs @@ -141,13 +141,13 @@ public async Task VerifyAddEngineeringModel() [Test] public async Task VerifyRowClick() { - Assert.That(this.renderer.Instance.IsModelSelected, Is.EqualTo(false)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(false)); var firstRow = this.viewModel.Object.Rows.Items.First(); var grid = this.renderer.FindComponent(); await this.renderer.InvokeAsync(async () => await grid.Instance.SelectedDataItemChanged.InvokeAsync(firstRow)); - Assert.That(this.renderer.Instance.IsModelSelected, Is.EqualTo(true)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(true)); } } } diff --git a/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/ParticipantsTableTestFixture.cs b/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/ParticipantsTableTestFixture.cs index e960fa3b..4e7add78 100644 --- a/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/ParticipantsTableTestFixture.cs +++ b/COMETwebapp.Tests/Components/SiteDirectory/EngineeringModels/ParticipantsTableTestFixture.cs @@ -133,7 +133,7 @@ public void VerifyOnInitialized() var details = this.renderer.Find("a"); details.ClickAsync(new MouseEventArgs()); - Assert.That(this.renderer.Instance.IsActiveDomainsDetailsOpen, Is.EqualTo(true)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(true)); } [Test] diff --git a/COMETwebapp.Tests/Components/SiteDirectory/Roles/ParticipantRolesTableTestFixture.cs b/COMETwebapp.Tests/Components/SiteDirectory/Roles/ParticipantRolesTableTestFixture.cs index 92d16183..ea8beecf 100644 --- a/COMETwebapp.Tests/Components/SiteDirectory/Roles/ParticipantRolesTableTestFixture.cs +++ b/COMETwebapp.Tests/Components/SiteDirectory/Roles/ParticipantRolesTableTestFixture.cs @@ -117,20 +117,20 @@ public async Task VerifyAddParticipantRoleClick() [Test] public async Task VerifyRowClick() { - Assert.That(this.renderer.Instance.IsRoleSelected, Is.EqualTo(false)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(false)); var firstRow = this.viewModel.Object.Rows.Items.First(); var grid = this.renderer.FindComponent(); await this.renderer.InvokeAsync(async () => await grid.Instance.SelectedDataItemChanged.InvokeAsync(firstRow)); - Assert.That(this.renderer.Instance.IsRoleSelected, Is.EqualTo(true)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(true)); var details = this.renderer.FindComponent(); await this.renderer.InvokeAsync(details.Instance.OnSubmit.InvokeAsync); this.viewModel.Verify(x => x.CreateOrEditParticipantRole(false), Times.Once); await this.renderer.InvokeAsync(details.Instance.OnCancel.InvokeAsync); - Assert.That(this.renderer.Instance.IsRoleSelected, Is.EqualTo(false)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(false)); } } } diff --git a/COMETwebapp.Tests/Components/SiteDirectory/Roles/PersonRolesTableTestFixture.cs b/COMETwebapp.Tests/Components/SiteDirectory/Roles/PersonRolesTableTestFixture.cs index c6795a2d..12c42d83 100644 --- a/COMETwebapp.Tests/Components/SiteDirectory/Roles/PersonRolesTableTestFixture.cs +++ b/COMETwebapp.Tests/Components/SiteDirectory/Roles/PersonRolesTableTestFixture.cs @@ -117,20 +117,20 @@ public async Task VerifyAddPersonRoleClick() [Test] public async Task VerifyRowClick() { - Assert.That(this.renderer.Instance.IsRoleSelected, Is.EqualTo(false)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(false)); var firstRow = this.viewModel.Object.Rows.Items.First(); var grid = this.renderer.FindComponent(); await this.renderer.InvokeAsync(async () => await grid.Instance.SelectedDataItemChanged.InvokeAsync(firstRow)); - Assert.That(this.renderer.Instance.IsRoleSelected, Is.EqualTo(true)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(true)); var details = this.renderer.FindComponent(); await this.renderer.InvokeAsync(details.Instance.OnSubmit.InvokeAsync); this.viewModel.Verify(x => x.CreateOrEditPersonRole(false), Times.Once); await this.renderer.InvokeAsync(details.Instance.OnCancel.InvokeAsync); - Assert.That(this.renderer.Instance.IsRoleSelected, Is.EqualTo(false)); + Assert.That(this.renderer.Instance.IsOnEditMode, Is.EqualTo(false)); } } } diff --git a/COMETwebapp/Components/Common/DataItemDetailsComponent.razor b/COMETwebapp/Components/Common/DataItemDetailsComponent.razor new file mode 100644 index 00000000..d165df59 --- /dev/null +++ b/COMETwebapp/Components/Common/DataItemDetailsComponent.razor @@ -0,0 +1,31 @@ + + +@namespace COMETwebapp.Components.Common + +
+ @if (this.IsSelected) + { + @this.ChildContent + } + else + { +
Select an item to view or edit
+ Comet Web + } +
+ diff --git a/COMETwebapp/Components/Common/DataItemDetailsComponent.razor.cs b/COMETwebapp/Components/Common/DataItemDetailsComponent.razor.cs new file mode 100644 index 00000000..cba32465 --- /dev/null +++ b/COMETwebapp/Components/Common/DataItemDetailsComponent.razor.cs @@ -0,0 +1,46 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2023-2024 RHEA System S.A. +// +// Authors: Sam Gerené, Alex Vorobiev, Alexander van Delft, Jaime Bernar, Antoine Théate, João Rua +// +// This file is part of CDP4-COMET WEB Community Edition +// The CDP4-COMET WEB Community Edition is the RHEA Web Application implementation of ECSS-E-TM-10-25 Annex A and Annex C. +// +// The CDP4-COMET WEB Community Edition is free software; you can redistribute it and/or +// modify it under the terms of the GNU Affero General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// The CDP4-COMET WEB Community Edition is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace COMETwebapp.Components.Common +{ + using Microsoft.AspNetCore.Components; + + /// + /// The is used to display the details of a selected data item + /// + public partial class DataItemDetailsComponent + { + /// + /// Value asserting that the is selected or not + /// + [Parameter] + public bool IsSelected { get; set; } + + /// + /// The child content of the component + /// + [Parameter] + public RenderFragment ChildContent { get; set; } + } +} diff --git a/COMETwebapp/Components/Common/DataItemDetailsComponent.razor.css b/COMETwebapp/Components/Common/DataItemDetailsComponent.razor.css new file mode 100644 index 00000000..efc58176 --- /dev/null +++ b/COMETwebapp/Components/Common/DataItemDetailsComponent.razor.css @@ -0,0 +1,10 @@ +.data-item-details-section { + width: 50%; + padding: 30px; +} + +.data-item-details-image { + margin: auto; + display: block; + width: 300px; +} diff --git a/COMETwebapp/Components/Common/SelectedDataItemBase.razor.cs b/COMETwebapp/Components/Common/SelectedDataItemBase.razor.cs index 11779081..c714da11 100644 --- a/COMETwebapp/Components/Common/SelectedDataItemBase.razor.cs +++ b/COMETwebapp/Components/Common/SelectedDataItemBase.razor.cs @@ -53,6 +53,11 @@ public abstract partial class SelectedDataItemBase : DisposableComponen /// public bool ShouldCreateThing { get; protected set; } + /// + /// Gets or sets the condition to check if the current component is on edit mode + /// + public bool IsOnEditMode { get; protected set; } + /// /// Gets or sets the grid control that is being customized. /// diff --git a/COMETwebapp/Components/EngineeringModel/CommonFileStoresTable.razor b/COMETwebapp/Components/EngineeringModel/CommonFileStoresTable.razor index 5bfd0f5a..160fa89f 100644 --- a/COMETwebapp/Components/EngineeringModel/CommonFileStoresTable.razor +++ b/COMETwebapp/Components/EngineeringModel/CommonFileStoresTable.razor @@ -14,12 +14,11 @@ Copyright (c) 2023-2024 RHEA System S.A. You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses/. -------------------------------------------------------------------------------> - @using COMETwebapp.Components.EngineeringModel.FileStore @inherits SelectedDataItemBase -
+
+ PageSizeSelectorAllRowsItemVisible="true" + CssClass="height-fit-content"> @@ -67,18 +67,14 @@ Copyright (c) 2023-2024 RHEA System S.A. - @if (this.IsOnEditMode) - { -
- - - See Folder-File Structure - -
- } - + + + + See Folder-File Structure + +
diff --git a/COMETwebapp/Components/EngineeringModel/CommonFileStoresTable.razor.cs b/COMETwebapp/Components/EngineeringModel/CommonFileStoresTable.razor.cs index e0a576cc..b486fe27 100644 --- a/COMETwebapp/Components/EngineeringModel/CommonFileStoresTable.razor.cs +++ b/COMETwebapp/Components/EngineeringModel/CommonFileStoresTable.razor.cs @@ -47,11 +47,6 @@ public partial class CommonFileStoresTable : SelectedDataItemBase - /// Gets the value to check if component is on edit mode - /// - public bool IsOnEditMode { get; private set; } - /// /// Gets the value to check if the folder file structure component is visible /// diff --git a/COMETwebapp/Components/EngineeringModel/OptionsTable.razor b/COMETwebapp/Components/EngineeringModel/OptionsTable.razor index 00e5bbf3..47786c94 100644 --- a/COMETwebapp/Components/EngineeringModel/OptionsTable.razor +++ b/COMETwebapp/Components/EngineeringModel/OptionsTable.razor @@ -14,11 +14,10 @@ Copyright (c) 2023-2024 RHEA System S.A. You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses/. -------------------------------------------------------------------------------> -@using COMETwebapp.ViewModels.Components.EngineeringModel.Rows -@inherits SelectedDataItemBase +@inherits SelectedDataItemBase -
+
+ PageSizeSelectorAllRowsItemVisible="true" + CssClass="height-fit-content"> @@ -68,15 +68,11 @@ Copyright (c) 2023-2024 RHEA System S.A. - @if (this.IsOnEditMode) - { -
- -
- } - + + +
diff --git a/COMETwebapp/Components/EngineeringModel/OptionsTable.razor.cs b/COMETwebapp/Components/EngineeringModel/OptionsTable.razor.cs index 7241b397..9692bbe2 100644 --- a/COMETwebapp/Components/EngineeringModel/OptionsTable.razor.cs +++ b/COMETwebapp/Components/EngineeringModel/OptionsTable.razor.cs @@ -47,11 +47,6 @@ public partial class OptionsTable : SelectedDataItemBase - /// Gets the value to check if component is on edit mode - /// - public bool IsOnEditMode { get; private set; } - /// /// Method invoked when the component is ready to start, having received its /// initial parameters from its parent in the render tree. diff --git a/COMETwebapp/Components/EngineeringModel/PublicationsTable.razor b/COMETwebapp/Components/EngineeringModel/PublicationsTable.razor index e9919902..bd3f2c72 100644 --- a/COMETwebapp/Components/EngineeringModel/PublicationsTable.razor +++ b/COMETwebapp/Components/EngineeringModel/PublicationsTable.razor @@ -73,7 +73,7 @@ Copyright (c) 2023-2024 RHEA System S.A. - + diff --git a/COMETwebapp/Components/EngineeringModel/PublicationsTable.razor.cs b/COMETwebapp/Components/EngineeringModel/PublicationsTable.razor.cs index 437314b7..6cf91a71 100644 --- a/COMETwebapp/Components/EngineeringModel/PublicationsTable.razor.cs +++ b/COMETwebapp/Components/EngineeringModel/PublicationsTable.razor.cs @@ -54,11 +54,6 @@ public partial class PublicationsTable : SelectedDataItemBase public PublicationRowViewModel SelectedRow { get; private set; } - /// - /// Gets the value to check if the publication details popup is open - /// - public bool IsPublicationDetailsPopupOpen { get; private set; } - /// /// Method invoked when the component is ready to start, having received its /// initial parameters from its parent in the render tree. @@ -78,7 +73,7 @@ protected override void OnInitialized() private void OnSelectedDataItemChanged(PublicationRowViewModel row) { this.SelectedRow = row; - this.IsPublicationDetailsPopupOpen = true; + this.IsOnEditMode = true; } /// diff --git a/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseForm.razor b/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseForm.razor new file mode 100644 index 00000000..546495f7 --- /dev/null +++ b/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseForm.razor @@ -0,0 +1,46 @@ + +@inherits SelectedDataItemForm + + + + + + + + + + + + + + +
+ +
+ + Save + + + + Cancel + +
+
diff --git a/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseForm.razor.cs b/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseForm.razor.cs new file mode 100644 index 00000000..081a6cc7 --- /dev/null +++ b/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseForm.razor.cs @@ -0,0 +1,55 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright (c) 2023-2024 RHEA System S.A. +// +// Authors: Sam Gerené, Alex Vorobiev, Alexander van Delft, Jaime Bernar, Théate Antoine, João Rua +// +// This file is part of CDP4-COMET WEB Community Edition +// The CDP4-COMET WEB Community Edition is the RHEA Web Application implementation of ECSS-E-TM-10-25 Annex A and Annex C. +// +// The CDP4-COMET WEB Community Edition is free software; you can redistribute it and/or +// modify it under the terms of the GNU Affero General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// The CDP4-COMET WEB Community Edition is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +// +// -------------------------------------------------------------------------------------------------------------------- + +namespace COMETwebapp.Components.SiteDirectory +{ + using System.ComponentModel.DataAnnotations; + + using COMETwebapp.Components.Common; + using COMETwebapp.ViewModels.Components.SiteDirectory.DomainsOfExpertise; + + using Microsoft.AspNetCore.Components; + + /// + /// Support class for the + /// + public partial class DomainsOfExpertiseForm : SelectedDataItemForm + { + /// + /// The for this component + /// + [Parameter, Required] + public IDomainsOfExpertiseTableViewModel ViewModel { get; set; } + + /// + /// Method that is executed when there is a valid submit + /// + /// A + protected override async Task OnValidSubmit() + { + await this.ViewModel.CreateOrEditDomainOfExpertise(this.ShouldCreate); + await base.OnValidSubmit(); + } + } +} diff --git a/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseTable.razor b/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseTable.razor index 922b7f37..661b78b1 100644 --- a/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseTable.razor +++ b/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseTable.razor @@ -18,65 +18,65 @@ Copyright (c) 2023-2024 RHEA System S.A. @inherits COMETwebapp.Components.Common.SelectedDeprecatableDataItemBase - - - - - - - - - - - @{ - var row = (DomainOfExpertiseRowViewModel)context.DataItem; +
+ + + + + + + + + + + @{ + var row = (DomainOfExpertiseRowViewModel)context.DataItem; - + + } + + + - - } - - - - - - - - - - - - - - - - - - + + + + - - - + + + - +
diff --git a/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseTable.razor.cs b/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseTable.razor.cs index 29573fc9..c050b2fd 100644 --- a/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseTable.razor.cs +++ b/COMETwebapp/Components/SiteDirectory/DomainsOfExpertiseTable.razor.cs @@ -74,16 +74,18 @@ protected override void CustomizeEditThing(GridCustomizeEditModelEventArgs e) var dataItem = (DomainOfExpertiseRowViewModel)e.DataItem; this.ShouldCreateThing = e.IsNew; + this.ViewModel.Thing = dataItem == null ? new DomainOfExpertise() : dataItem.Thing.Clone(true); + e.EditModel = this.ViewModel.Thing; + } - if (dataItem == null) - { - this.ViewModel.Thing = new DomainOfExpertise(); - e.EditModel = this.ViewModel.Thing; - return; - } - - e.EditModel = dataItem; - this.ViewModel.Thing = dataItem.Thing.Clone(true); + /// + /// Method invoked every time a row is selected + /// + /// The selected row + private void OnSelectedDataItemChanged(DomainOfExpertiseRowViewModel row) + { + this.ViewModel.Thing = row.Thing.Clone(true); + this.IsOnEditMode = true; } } } diff --git a/COMETwebapp/Components/SiteDirectory/EngineeringModel/ActiveDomainsTable.razor b/COMETwebapp/Components/SiteDirectory/EngineeringModel/ActiveDomainsTable.razor index 39c874a5..cfa55519 100644 --- a/COMETwebapp/Components/SiteDirectory/EngineeringModel/ActiveDomainsTable.razor +++ b/COMETwebapp/Components/SiteDirectory/EngineeringModel/ActiveDomainsTable.razor @@ -46,7 +46,7 @@ Copyright (c) 2023-2024 RHEA System S.A. - - /// Gets or sets the condition to check if the edit popup is visible - ///
- public bool IsEditPopupVisible { get; private set; } - /// /// Method invoked when the component is ready to start, having received its /// initial parameters from its parent in the render tree. @@ -80,7 +75,7 @@ protected override void OnParametersSet() /// The visibility of the popup private void SetEditPopupVisibility(bool visible) { - this.IsEditPopupVisible = visible; + this.IsOnEditMode = visible; } /// diff --git a/COMETwebapp/Components/SiteDirectory/EngineeringModel/EngineeringModelsTable.razor b/COMETwebapp/Components/SiteDirectory/EngineeringModel/EngineeringModelsTable.razor index 40c62358..b65c7a18 100644 --- a/COMETwebapp/Components/SiteDirectory/EngineeringModel/EngineeringModelsTable.razor +++ b/COMETwebapp/Components/SiteDirectory/EngineeringModel/EngineeringModelsTable.razor @@ -36,7 +36,7 @@ Copyright (c) 2023-2024 RHEA System S.A. PageSizeSelectorVisible="true" PageSizeSelectorItems="@(new[] { 20, 35, 50 })" PageSizeSelectorAllRowsItemVisible="true" - CssClass="d-inline"> + CssClass="d-inline height-fit-content"> @@ -159,29 +159,25 @@ Copyright (c) 2023-2024 RHEA System S.A. - @if (this.IsModelSelected) - { -
- - - @foreach (var mappedValue in this.mapOfComponentsAndNames) - { - - } - - - - @if (this.SelectedComponent != null) - { - - } + + + + @foreach (var mappedValue in this.mapOfComponentsAndNames) + { + + } + + -
- } + @if (this.SelectedComponent != null) + { + + } +
diff --git a/COMETwebapp/Components/SiteDirectory/EngineeringModel/EngineeringModelsTable.razor.cs b/COMETwebapp/Components/SiteDirectory/EngineeringModel/EngineeringModelsTable.razor.cs index 97a0d7bc..2a1ea2b8 100644 --- a/COMETwebapp/Components/SiteDirectory/EngineeringModel/EngineeringModelsTable.razor.cs +++ b/COMETwebapp/Components/SiteDirectory/EngineeringModel/EngineeringModelsTable.razor.cs @@ -45,11 +45,6 @@ public partial class EngineeringModelsTable : SelectedDataItemBase - /// Gets or sets the value to check if a model has been selected - /// - public bool IsModelSelected { get; private set; } - /// /// Gets the condition to check if the source model was selected in creation form /// @@ -116,7 +111,7 @@ protected override void CustomizeEditThing(GridCustomizeEditModelEventArgs e) private void OnSelectedDataItemChanged(EngineeringModelRowViewModel row) { this.ViewModel.Thing = row.Thing; - this.IsModelSelected = true; + this.IsOnEditMode = true; this.parameters[nameof(EngineeringModelSetup)] = row.Thing; } diff --git a/COMETwebapp/Components/SiteDirectory/EngineeringModel/ParticipantsTable.razor b/COMETwebapp/Components/SiteDirectory/EngineeringModel/ParticipantsTable.razor index 47667161..6bc7ac0b 100644 --- a/COMETwebapp/Components/SiteDirectory/EngineeringModel/ParticipantsTable.razor +++ b/COMETwebapp/Components/SiteDirectory/EngineeringModel/ParticipantsTable.razor @@ -127,7 +127,7 @@ Copyright (c) 2023-2024 RHEA System S.A.
-
    @foreach (var assignedDomain in this.AssignedDomainsPopupText.Split(ParticipantRowViewModel.Separator)) diff --git a/COMETwebapp/Components/SiteDirectory/EngineeringModel/ParticipantsTable.razor.cs b/COMETwebapp/Components/SiteDirectory/EngineeringModel/ParticipantsTable.razor.cs index 1ffbd5c6..2c722fc1 100644 --- a/COMETwebapp/Components/SiteDirectory/EngineeringModel/ParticipantsTable.razor.cs +++ b/COMETwebapp/Components/SiteDirectory/EngineeringModel/ParticipantsTable.razor.cs @@ -51,11 +51,6 @@ public partial class ParticipantsTable : SelectedDataItemBase - /// Gets or sets the condition to check if the active domains details popup is open - /// - public bool IsActiveDomainsDetailsOpen { get; private set; } - /// /// Gets or sets the active domains details text /// @@ -124,7 +119,7 @@ protected override void CustomizeEditThing(GridCustomizeEditModelEventArgs e) private void OpenAssignedDomainDetailsPopup(string text) { this.AssignedDomainsPopupText = text; - this.IsActiveDomainsDetailsOpen = true; + this.IsOnEditMode = true; } /// diff --git a/COMETwebapp/Components/SiteDirectory/Roles/ParticipantRolesTable.razor b/COMETwebapp/Components/SiteDirectory/Roles/ParticipantRolesTable.razor index 42eb500c..e8de84b4 100644 --- a/COMETwebapp/Components/SiteDirectory/Roles/ParticipantRolesTable.razor +++ b/COMETwebapp/Components/SiteDirectory/Roles/ParticipantRolesTable.razor @@ -17,7 +17,7 @@ Copyright (c) 2023-2024 RHEA System S.A. @inherits SelectedDeprecatableDataItemBase -
    +
    + CssClass="d-inline height-fit-content"> @@ -46,6 +46,16 @@ Copyright (c) 2023-2024 RHEA System S.A. + + @{ + var row = (ParticipantRoleRowViewModel)context.DataItem; + + + } + @@ -61,14 +71,11 @@ Copyright (c) 2023-2024 RHEA System S.A. - @if (this.IsRoleSelected) - { -
    - -
    - } + + +
    diff --git a/COMETwebapp/Components/SiteDirectory/Roles/ParticipantRolesTable.razor.cs b/COMETwebapp/Components/SiteDirectory/Roles/ParticipantRolesTable.razor.cs index f7be0cc3..55cd555b 100644 --- a/COMETwebapp/Components/SiteDirectory/Roles/ParticipantRolesTable.razor.cs +++ b/COMETwebapp/Components/SiteDirectory/Roles/ParticipantRolesTable.razor.cs @@ -45,11 +45,6 @@ public partial class ParticipantRolesTable : SelectedDeprecatableDataItemBase - /// Gets the value to check if a role has been selected - ///
    - public bool IsRoleSelected { get; private set; } - /// /// Method invoked when the component is ready to start, having received its /// initial parameters from its parent in the render tree. @@ -88,7 +83,7 @@ protected override void CustomizeEditThing(GridCustomizeEditModelEventArgs e) private void OnSelectedDataItemChanged(ParticipantRoleRowViewModel row) { this.ViewModel.Thing = row.Thing.Clone(true); - this.IsRoleSelected = true; + this.IsOnEditMode = true; } } } diff --git a/COMETwebapp/Components/SiteDirectory/Roles/PersonRolesTable.razor b/COMETwebapp/Components/SiteDirectory/Roles/PersonRolesTable.razor index 585de590..1bbd28a9 100644 --- a/COMETwebapp/Components/SiteDirectory/Roles/PersonRolesTable.razor +++ b/COMETwebapp/Components/SiteDirectory/Roles/PersonRolesTable.razor @@ -17,7 +17,7 @@ Copyright (c) 2023-2024 RHEA System S.A. @inherits SelectedDeprecatableDataItemBase -
    +
    + CssClass="d-inline height-fit-content"> @@ -46,6 +46,16 @@ Copyright (c) 2023-2024 RHEA System S.A. + + @{ + var row = (PersonRoleRowViewModel)context.DataItem; + + + } + @@ -61,14 +71,11 @@ Copyright (c) 2023-2024 RHEA System S.A. - @if (this.IsRoleSelected) - { -
    - -
    - } + + +
    diff --git a/COMETwebapp/Components/SiteDirectory/Roles/PersonRolesTable.razor.cs b/COMETwebapp/Components/SiteDirectory/Roles/PersonRolesTable.razor.cs index 5914391d..fbe664d1 100644 --- a/COMETwebapp/Components/SiteDirectory/Roles/PersonRolesTable.razor.cs +++ b/COMETwebapp/Components/SiteDirectory/Roles/PersonRolesTable.razor.cs @@ -24,8 +24,6 @@ namespace COMETwebapp.Components.SiteDirectory.Roles { - using System.ComponentModel.DataAnnotations; - using CDP4Common.SiteDirectoryData; using COMETwebapp.Components.Common; @@ -47,11 +45,6 @@ public partial class PersonRolesTable : SelectedDeprecatableDataItemBase - /// Gets the value to check if a role has been selected - ///
    - public bool IsRoleSelected { get; private set; } - /// /// Method invoked when the component is ready to start, having received its /// initial parameters from its parent in the render tree. @@ -90,7 +83,7 @@ protected override void CustomizeEditThing(GridCustomizeEditModelEventArgs e) private void OnSelectedDataItemChanged(PersonRoleRowViewModel row) { this.ViewModel.Thing = row.Thing.Clone(true); - this.IsRoleSelected = true; + this.IsOnEditMode = true; } } } diff --git a/COMETwebapp/ViewModels/Components/Common/DeprecatableDataItemTable/IDeprecatableDataItemTableViewModel.cs b/COMETwebapp/ViewModels/Components/Common/DeprecatableDataItemTable/IDeprecatableDataItemTableViewModel.cs index 37f57ae4..c0703029 100644 --- a/COMETwebapp/ViewModels/Components/Common/DeprecatableDataItemTable/IDeprecatableDataItemTableViewModel.cs +++ b/COMETwebapp/ViewModels/Components/Common/DeprecatableDataItemTable/IDeprecatableDataItemTableViewModel.cs @@ -27,8 +27,6 @@ namespace COMETwebapp.ViewModels.Components.Common.DeprecatableDataItemTable using COMETwebapp.Services.ShowHideDeprecatedThingsService; using COMETwebapp.ViewModels.Components.Common.BaseDataItemTable; - using DynamicData; - /// /// View model that provides the basic functionalities for a reference data item /// diff --git a/COMETwebapp/wwwroot/css/app.css b/COMETwebapp/wwwroot/css/app.css index 520eeb2d..9eb1c9d8 100644 --- a/COMETwebapp/wwwroot/css/app.css +++ b/COMETwebapp/wwwroot/css/app.css @@ -51,6 +51,8 @@ html, body, #app { .width-fit-content { width: fit-content; } +.height-fit-content { height: fit-content; } + .max-width-40 { max-width: 40%; } .margin-top-120 { margin-top: 120px; } diff --git a/COMETwebapp/wwwroot/images/comet-logo-black.png b/COMETwebapp/wwwroot/images/comet-logo-black.png new file mode 100644 index 0000000000000000000000000000000000000000..21039642873d2aa088969d349547268da703a931 GIT binary patch literal 22947 zcmce72Rzm9-?uGfM97v+4vu+_nY}leS;w)DV;mf0mu!XXQT8g7Y&q&6ic(hQiK58P zDC_xBzwsaUegE(0dA%Ml>3qM}b$#ah^SM6PIPpdXnv~?s!~mnj9};azy-Zf1$H)Yp@RArT^u&PXS?2pZu7 z^v1)JS3>(Z!aU(9PA9mlySD<@dV3car@ONPmxYwRn7)rH+|6Ap#1C#7VqgXf@q|I0 zxs((+<H{w)9`oTG& zB4Qwzm>8H-1}Xv*6BmyiA#uzi37hNu(&K(QdV4&^Y;%Iz|qgyMb<=3 z<2OIxNrB4^h4PUV6%7gs5($zJLHfChf}v38DGhOP5YPkUAMA~CM1#Ejx&NS`2KR^g zx%;5pk=~rA6dj$A0VoA7K-x1koMC@b^$GCvI-}_f6NP)h5pZvmzbIG)e5%EI_gxW)KYRP5OyGa%_HPOMn+5y8MNQ!T$N)bW9O%yd zhfMw`^*}(K--h`Q2CD}Gdi^=v-ODS$ALZwWLi+uCB7f`f&nlW3x&Hexf0zR$>f`!1 zE!Er+|9$^oS_0kR-u{5Q03ZHkc+LNQ=wEz%{)Ur(FbB{8Xdv;YKt66r6w==f`Cs_- z&*tB1JHupMkbVe9z}W5xM_0J0kGJcod_J=J0Q#LBQI2YkD7XUGDX2kWQXnx2Gcky) zI8;^=d_@c_D<<~4Gt$}JCHOz;s_F*^DE_^xBuHGw>@-xQWhEs4PW7xS($5Tu^!g+E zwEyxfr?`xW6sLf`Bh20VRAs?4QS|j?wY~jOj@~f1wweMLpoxgPyR$4*(h2SYhKqyX zP?$7G5-ctaa)LmdK~mB(Vlqx*E|SiY;(v@+L&5@1!{l`QuVmnigaI`Ew4JOo9O5J+ z4g-V05^y+3T1?Ur1OdaGKyYaZNk^zNSPTMp{)3vKpF5C`9KHTdH6Q>WC#5DX27!u8 zLM2o*)KtJ=C|FV%A_WywlK@MJK~y1s5HNvzJG-9-x~i9>zrO;Pj~^20A`AE(NN;~x zL)H}K=!XjMG4eyYxO)K}Gx7t>@{e79+tW0_>9O^{CR-v8L?G$s|e{*d-e2p}Y6 zwH*Dgx%<02dBF_>;eI}+#1*(S9KHPE|E7zXpQE?GkE0*l8y5V}y$p;1m;q{lxi|qG zWC3}d17L6WkgN^_LtpNkzPnYeWWuWpu}k=1kj6eM|r`2 zr&VPy)bCGT?x!&(>*eST1Tz{0ZaP7 z2Ary3dC}8c>g5hlIs5dBpy=P&0C)lrrUv(O4}?2w_#qLTXL(N6{oi2D5#lT%BL$WO zK_Jpn0Oq9OAc(UIfOeRavy+UII2Jfw@YR2T zGEu-9ztq-p_Xjd+@NXNN!hQd;_F2M~b%dSbRDsLi5wOmwYCsnMx2AzgJ4(SFU7#Ro z7a13jq>}^`1aWed0ZD+RogHBk5Eu*w{bPKP8yp}BBp@+hJ_U(`&A>q3k&%^@w*I4s zKhgyi1fWgX6^PnDfbK;S@)Aj);BqWjl8J3*a5G7xEJkR(LH1q5{hCQmTjQ5*)7a+HEeN&Jg0z}))xSy23sS@0KX{%3su z%S`y6i-8Q{HICpG_(8}P5)JC^52-x=#M&yQ(RI+^8Zsn{W9KP zh1P$Wbew-pFn{3W?_v6g}7`GP=1Js0ma4XαU%LIfmjT}Hz>J~~q&c8| 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 X=$pvC?%GKimPVQ7?!&yXj(hCCuL%X$ literal 0 HcmV?d00001 diff --git a/COMETwebapp/wwwroot/images/comet-logo-white.png b/COMETwebapp/wwwroot/images/comet-logo-white.png new file mode 100644 index 0000000000000000000000000000000000000000..c348f7df81d92d36db875a5279063a6ed1185393 GIT binary patch literal 24785 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 literal 0 HcmV?d00001