From 4124669187a3d38f5bfaf401be79e7ff37f832cf Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Thu, 10 Oct 2024 02:34:26 +0200 Subject: [PATCH] MediaRolesEditComponents added --- .../Roles/CreatorRoleMediaRequest.cs | 2 +- .../MediaRolesEditActorComponent.razor | 156 ++++++++++++++++++ .../MediaRolesEditActorComponent.razor.cs | 148 +++++++++++++++++ .../MediaRolesEditActorComponent.razor.css | 0 .../MediaRolesEditCreatorComponent.razor | 142 ++++++++++++++++ .../MediaRolesEditCreatorComponent.razor.cs | 147 +++++++++++++++++ .../MediaRolesEditCreatorComponent.razor.css | 0 .../PersonRolesEditActorComponent.razor | 2 +- .../PersonRolesEditCreatorComponent.razor | 2 +- .../WatchIt.Website/Pages/MediaEditPage.razor | 12 ++ .../Pages/MediaEditPage.razor.cs | 9 + .../WatchIt.Website/_Imports.razor | 1 + 12 files changed, 618 insertions(+), 3 deletions(-) create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.cs create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.css create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.cs create mode 100644 WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.css diff --git a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs index d2373f9..b256322 100644 --- a/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs +++ b/WatchIt.Common/WatchIt.Common.Model/Roles/CreatorRoleMediaRequest.cs @@ -8,7 +8,7 @@ public class CreatorRoleMediaRequest : CreatorRoleRequest, ICreatorRoleMediaRequ #region PROPERTIES [JsonPropertyName("person_id")] - public required long PersonId { get; set; } + public long PersonId { get; set; } #endregion diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor new file mode 100644 index 0000000..ff50f15 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor @@ -0,0 +1,156 @@ +@using Blazorise.Extensions +@using WatchIt.Common.Model.Roles +@using Blazorise.Components +@using WatchIt.Common.Model.Persons + + + +
+ @if (_loaded) + { +
+
+
+
+

Actor roles

+
+ @if (!_editingMode) + { +
+ +
+ } + else + { + if (!string.IsNullOrWhiteSpace(_error)) + { +
+ @(_error) +
+ } +
+ +
+
+ +
+ } +
+
+ @if (!_editingMode) + { + if (_roles.IsNullOrEmpty()) + { + No items + } + else + { + + + + + + + + + + + @foreach (Guid roleId in _roles.Keys) + { + + + + + + + } + +
+ Person + + Role type + + Role name + + Actions +
+ @(Persons[_roles[roleId].Data.PersonId].Name) + + @(_roleTypes[_roles[roleId].Data.TypeId]) + + @(_roles[roleId].Data.Name) + +
+ + +
+
+ } + } + else + { + + +
+
+ +
+ + Sorry... @not_found_context was not found + +
+
+
+ +
+ + @foreach (KeyValuePair type in _roleTypes) + { + + } + +
+
+
+ +
+ +
+
+
+
+ } +
+ } + else + { + + } +
\ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.cs new file mode 100644 index 0000000..8475468 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.cs @@ -0,0 +1,148 @@ +using Microsoft.AspNetCore.Components; +using WatchIt.Common.Model.Media; +using WatchIt.Common.Model.Persons; +using WatchIt.Common.Model.Roles; +using WatchIt.Website.Services.WebAPI.Media; +using WatchIt.Website.Services.WebAPI.Persons; +using WatchIt.Website.Services.WebAPI.Roles; + +namespace WatchIt.Website.Components.MediaEditPage; + +public partial class MediaRolesEditActorComponent : ComponentBase +{ + #region SERVICES + + [Inject] private IPersonsWebAPIService PersonsWebAPIService { get; set; } = default!; + [Inject] private IMediaWebAPIService MediaWebAPIService { get; set; } = default!; + [Inject] private IRolesWebAPIService RolesWebAPIService { get; set; } = default!; + + #endregion + + + + #region PARAMETERS + + [Parameter] public required long? Id { get; set; } + [Parameter] public required Dictionary Persons { get; set; } + [Parameter] public string Class { get; set; } = string.Empty; + + #endregion + + + + #region FIELDS + + private bool _loaded; + private string? _error; + + private Dictionary _roles = []; + private Dictionary _roleTypes = []; + + + private Guid? _editedId; + private IActorRoleMediaRequest? _editedModel; + + private bool _editingMode; + private bool _saving; + + #endregion + + + + #region PUBLIC METHODS + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + List endTasks = new List(); + + // STEP 0 + if (Id.HasValue) + { + endTasks.AddRange( + [ + MediaWebAPIService.GetMediaAllActorRoles(Id.Value, successAction: data => _roles = data.ToDictionary(x => x.Id, x => (x, false))), + RolesWebAPIService.GetAllActorRoleTypes(successAction: data => _roleTypes = data.ToDictionary(x => x.Id, x => x.Name)), + ]); + } + + // END + await Task.WhenAll(endTasks); + + _loaded = true; + StateHasChanged(); + } + } + + private void CancelEdit() + { + _error = null; + _editingMode = false; + } + + private async Task SaveEdit() + { + void SuccessPost(ActorRoleResponse data) + { + _roles[data.Id] = (data, false); + + _saving = false; + _editingMode = false; + } + + void SuccessPut() + { + ActorRoleResponse temp = _roles[_editedId!.Value].Data; + temp.PersonId = _editedModel.PersonId; + temp.TypeId = _editedModel.TypeId; + temp.Name = _editedModel.Name; + + _roles[_editedId!.Value] = (temp, false); + + _saving = false; + _editingMode = false; + } + + void BadRequest(IDictionary errors) + { + _error = errors.SelectMany(x => x.Value).FirstOrDefault() ?? "Unknown error"; + _saving = false; + } + + void Unauthorized() + { + _error = "You do not have permission to do this"; + _saving = false; + } + + _error = null; + _saving = true; + if (_editedId.HasValue) + { + await RolesWebAPIService.PutActorRole(_editedId.Value, _editedModel as ActorRoleUniversalRequest, SuccessPut, BadRequest, Unauthorized); + } + else + { + await MediaWebAPIService.PostMediaActorRole(Id!.Value, _editedModel as ActorRoleMediaRequest, SuccessPost, BadRequest, Unauthorized); + } + } + + private void ActivateEdit(Guid? id = null) + { + _editedId = id; + _editedModel = id.HasValue ? new ActorRoleUniversalRequest(_roles[id.Value].Data) : new ActorRoleMediaRequest() + { + TypeId = _roleTypes.Keys.First() + }; + _editingMode = true; + } + + private async Task Delete(Guid id) + { + _roles[id] = (_roles[id].Data, true); + await RolesWebAPIService.DeleteActorRole(id, () => _roles.Remove(id)); + } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.css b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditActorComponent.razor.css new file mode 100644 index 0000000..e69de29 diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor new file mode 100644 index 0000000..0e240b0 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor @@ -0,0 +1,142 @@ +@using Blazorise.Extensions +@using Blazorise.Components +@using WatchIt.Common.Model.Persons + + +
+ @if (_loaded) + { +
+
+
+
+

Creator roles

+
+ @if (!_editingMode) + { +
+ +
+ } + else + { + if (!string.IsNullOrWhiteSpace(_error)) + { +
+ @(_error) +
+ } +
+ +
+
+ +
+ } +
+
+ @if (!_editingMode) + { + if (_roles.IsNullOrEmpty()) + { + No items + } + else + { + + + + + + + + + + @foreach (Guid roleId in _roles.Keys) + { + + + + + + } + +
+ Person + + Role type + + Actions +
+ @(Persons[_roles[roleId].Data.PersonId].Name) + + @(_roleTypes[_roles[roleId].Data.TypeId]) + +
+ + +
+
+ } + } + else + { + + +
+
+ +
+ + Sorry... @not_found_context was not found + +
+
+
+ +
+ + @foreach (KeyValuePair type in _roleTypes) + { + + } + +
+
+
+
+ } +
+ } + else + { + + } +
\ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.cs b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.cs new file mode 100644 index 0000000..1d43395 --- /dev/null +++ b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.cs @@ -0,0 +1,147 @@ +using Microsoft.AspNetCore.Components; +using WatchIt.Common.Model.Media; +using WatchIt.Common.Model.Persons; +using WatchIt.Common.Model.Roles; +using WatchIt.Website.Services.WebAPI.Media; +using WatchIt.Website.Services.WebAPI.Persons; +using WatchIt.Website.Services.WebAPI.Roles; + +namespace WatchIt.Website.Components.MediaEditPage; + +public partial class MediaRolesEditCreatorComponent : ComponentBase +{ + #region SERVICES + + [Inject] private IPersonsWebAPIService PersonsWebAPIService { get; set; } = default!; + [Inject] private IMediaWebAPIService MediaWebAPIService { get; set; } = default!; + [Inject] private IRolesWebAPIService RolesWebAPIService { get; set; } = default!; + + #endregion + + + + #region PARAMETERS + + [Parameter] public required long? Id { get; set; } + [Parameter] public required Dictionary Persons { get; set; } + [Parameter] public string Class { get; set; } = string.Empty; + + #endregion + + + + #region FIELDS + + private bool _loaded; + private string? _error; + + private Dictionary _roles = []; + private Dictionary _roleTypes = []; + + + private Guid? _editedId; + private ICreatorRoleMediaRequest? _editedModel; + + private bool _editingMode; + private bool _saving; + + #endregion + + + + #region PUBLIC METHODS + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + List endTasks = new List(); + + // STEP 0 + if (Id.HasValue) + { + endTasks.AddRange( + [ + MediaWebAPIService.GetMediaAllCreatorRoles(Id.Value, successAction: data => _roles = data.ToDictionary(x => x.Id, x => (x, false))), + RolesWebAPIService.GetAllCreatorRoleTypes(successAction: data => _roleTypes = data.ToDictionary(x => x.Id, x => x.Name)), + ]); + } + + // END + await Task.WhenAll(endTasks); + + _loaded = true; + StateHasChanged(); + } + } + + private void CancelEdit() + { + _error = null; + _editingMode = false; + } + + private async Task SaveEdit() + { + void SuccessPost(CreatorRoleResponse data) + { + _roles[data.Id] = (data, false); + + _saving = false; + _editingMode = false; + } + + void SuccessPut() + { + CreatorRoleResponse temp = _roles[_editedId!.Value].Data; + temp.PersonId = _editedModel.PersonId; + temp.TypeId = _editedModel.TypeId; + + _roles[_editedId!.Value] = (temp, false); + + _saving = false; + _editingMode = false; + } + + void BadRequest(IDictionary errors) + { + _error = errors.SelectMany(x => x.Value).FirstOrDefault() ?? "Unknown error"; + _saving = false; + } + + void Unauthorized() + { + _error = "You do not have permission to do this"; + _saving = false; + } + + _error = null; + _saving = true; + if (_editedId.HasValue) + { + await RolesWebAPIService.PutCreatorRole(_editedId.Value, _editedModel as CreatorRoleUniversalRequest, SuccessPut, BadRequest, Unauthorized); + } + else + { + await MediaWebAPIService.PostMediaCreatorRole(Id!.Value, _editedModel as CreatorRoleMediaRequest, SuccessPost, BadRequest, Unauthorized); + } + } + + private void ActivateEdit(Guid? id = null) + { + _editedId = id; + _editedModel = id.HasValue ? new CreatorRoleUniversalRequest(_roles[id.Value].Data) : new CreatorRoleMediaRequest() + { + TypeId = _roleTypes.Keys.First() + }; + _editingMode = true; + } + + private async Task Delete(Guid id) + { + _roles[id] = (_roles[id].Data, true); + await RolesWebAPIService.DeleteCreatorRole(id, () => _roles.Remove(id)); + } + + #endregion +} \ No newline at end of file diff --git a/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.css b/WatchIt.Website/WatchIt.Website/Components/MediaEditPage/MediaRolesEditCreatorComponent.razor.css new file mode 100644 index 0000000..e69de29 diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor index a31d7f7..6b95d1b 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditActorComponent.razor @@ -11,7 +11,7 @@
-

Actor roles

+

Actor roles

@if (!_editingMode) { diff --git a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor index 0165b83..e9a3e42 100644 --- a/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor +++ b/WatchIt.Website/WatchIt.Website/Components/PersonEditPage/PersonRolesEditCreatorComponent.razor @@ -10,7 +10,7 @@
-

Creator roles

+

Creator roles

@if (!_editingMode) { diff --git a/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor index 68b0d51..9dd815c 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor +++ b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor @@ -199,6 +199,18 @@
+
+
+ +
+
+
+
+ +
+
diff --git a/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs index e034282..d0dc6f5 100644 --- a/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs +++ b/WatchIt.Website/WatchIt.Website/Pages/MediaEditPage.razor.cs @@ -3,12 +3,14 @@ using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Forms; using WatchIt.Common.Model.Media; using WatchIt.Common.Model.Movies; +using WatchIt.Common.Model.Persons; using WatchIt.Common.Model.Photos; using WatchIt.Common.Model.Series; using WatchIt.Website.Layout; using WatchIt.Website.Services.Utility.Authentication; using WatchIt.Website.Services.WebAPI.Media; using WatchIt.Website.Services.WebAPI.Movies; +using WatchIt.Website.Services.WebAPI.Persons; using WatchIt.Website.Services.WebAPI.Photos; using WatchIt.Website.Services.WebAPI.Series; @@ -24,6 +26,7 @@ public partial class MediaEditPage : ComponentBase [Inject] public IMoviesWebAPIService MoviesWebAPIService { get; set; } = default!; [Inject] public ISeriesWebAPIService SeriesWebAPIService { get; set; } = default!; [Inject] public IPhotosWebAPIService PhotosWebAPIService { get; set; } = default!; + [Inject] public IPersonsWebAPIService PersonsWebAPIService { get; set; } = default!; #endregion @@ -48,6 +51,8 @@ public partial class MediaEditPage : ComponentBase private User? _user; private MediaResponse? _media; + private Dictionary _persons; + private MovieRequest? _movieRequest; private SeriesRequest? _seriesRequest; private Media? _mediaRequest => _movieRequest is not null ? _movieRequest : _seriesRequest; @@ -107,6 +112,10 @@ public partial class MediaEditPage : ComponentBase [ InitializeMedia() ]); + endTasks.AddRange( + [ + PersonsWebAPIService.GetAllPersons(successAction: data => _persons = data.ToDictionary(x => x.Id, x => x)) + ]); } // STEP 2 diff --git a/WatchIt.Website/WatchIt.Website/_Imports.razor b/WatchIt.Website/WatchIt.Website/_Imports.razor index e8981f0..41dfd4d 100644 --- a/WatchIt.Website/WatchIt.Website/_Imports.razor +++ b/WatchIt.Website/WatchIt.Website/_Imports.razor @@ -10,6 +10,7 @@ @using WatchIt.Website.Layout @using WatchIt.Website.Components @using WatchIt.Website.Components.PersonEditPage +@using WatchIt.Website.Components.MediaEditPage @using WatchIt.Common.Model.Accounts @using WatchIt.Common.Model.Media @using WatchIt.Website.Services.Utility.Tokens