From 8cc6542980596923c1dc477542af503a168c4755 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 10 Aug 2020 03:18:09 +0100 Subject: [PATCH] Add people to magazine admin page. --- .../Pages/Admin/Details/MagazineIssue.razor | 66 +++++++++++ .../Admin/Details/MagazineIssue.razor.cs | 108 +++++++++++++++++- .../Resources/Services/MagazineIssues.en.resx | 18 +++ .../Resources/Services/MagazineIssues.es.resx | 18 +++ Marechai/Services/PeopleByMagazineService.cs | 83 ++++++++++++++ Marechai/Services/Register.cs | 1 + .../ViewModels/PersonByMagazineViewModel.cs | 41 +++++++ 7 files changed, 331 insertions(+), 4 deletions(-) create mode 100644 Marechai/Services/PeopleByMagazineService.cs create mode 100644 Marechai/ViewModels/PersonByMagazineViewModel.cs diff --git a/Marechai/Pages/Admin/Details/MagazineIssue.razor b/Marechai/Pages/Admin/Details/MagazineIssue.razor index df1c8fd0..f8a87ac1 100644 --- a/Marechai/Pages/Admin/Details/MagazineIssue.razor +++ b/Marechai/Pages/Admin/Details/MagazineIssue.razor @@ -37,6 +37,9 @@ @inject MagazinesByMachineFamilyService MagazinesByMachineFamilyService @inject MachinesService MachinesService @inject MagazinesByMachineService MagazinesByMachineService +@inject DocumentPeopleService PeopleService +@inject PeopleByMagazineService PeopleByMagazineService +@inject DocumentRolesService DocumentRolesService @inject NavigationManager NavigationManager @inject IWebHostEnvironment Host @inject IJSRuntime JSRuntime @@ -195,6 +198,69 @@ @if (!_editing) { +
+

@L["People involved in this magazine"]

+ + @if (_addingPerson) + { +
+ + @L["Person"] + + + + @L["Role"] + + + + +
+ } + @if (_magazinePeople?.Count > 0) + { +
+ + + + + + + + + + @foreach (var item in _magazinePeople) + { + + + + + + } + +
+ @L["Person"] + + @L["Role"] +
+ @item.FullName + + @item.Role + + +
+
+ } +

@L["Machine families this magazine issue talks about"]

diff --git a/Marechai/Pages/Admin/Details/MagazineIssue.razor.cs b/Marechai/Pages/Admin/Details/MagazineIssue.razor.cs index 513d0487..4e8b8003 100644 --- a/Marechai/Pages/Admin/Details/MagazineIssue.razor.cs +++ b/Marechai/Pages/Admin/Details/MagazineIssue.razor.cs @@ -37,19 +37,25 @@ namespace Marechai.Pages.Admin.Details { public partial class MagazineIssue { - bool _addingMachine; - bool _addingMachineFamily; - int? _addingMachineFamilyId; - int? _addingMachineId; + bool _addingMachine; + bool _addingMachineFamily; + int? _addingMachineFamilyId; + int? _addingMachineId; + + bool _addingPerson; + int? _addingPersonId; + string _addingPersonRoleId; AuthenticationState _authState; bool _creating; MagazineByMachineViewModel _currentMagazineByMachine; MagazineByMachineFamilyViewModel _currentMagazineByMachineFamily; + PersonByMagazineViewModel _currentPersonByMagazine; bool _deleteInProgress; string _deleteText; string _deleteTitle; bool _deletingMagazineByMachine; bool _deletingMagazineByMachineFamily; + bool _deletingPersonByMagazine; bool _editing; Modal _frmDelete; bool _loaded; @@ -57,10 +63,14 @@ namespace Marechai.Pages.Admin.Details List _machines; List _magazineMachineFamilies; List _magazineMachines; + List _magazinePeople; List _magazines; MagazineIssueViewModel _model; + List _people; + List _roles; bool _savingMachine; bool _savingMachineFamily; + bool _savingPerson; bool _unknownIssueNumber; bool _unknownNativeCaption; bool _unknownPages; @@ -87,12 +97,15 @@ namespace Marechai.Pages.Admin.Details _magazines = await MagazinesService.GetTitlesAsync(); _machineFamilies = await MachineFamiliesService.GetAsync(); _machines = await MachinesService.GetAsync(); + _roles = await DocumentRolesService.GetEnabledAsync(); _model = _creating ? new MagazineIssueViewModel() : await Service.GetAsync(Id); _authState = await AuthenticationStateProvider.GetAuthenticationStateAsync(); _addingMachineFamilyId = _machineFamilies.First().Id; _magazineMachineFamilies = await MagazinesByMachineFamilyService.GetByMagazine(Id); _addingMachineId = _machines.First().Id; _magazineMachines = await MagazinesByMachineService.GetByMagazine(Id); + _addingPersonRoleId = _roles.First().Id; + _magazinePeople = await PeopleByMagazineService.GetByMagazine(Id); _editing = _creating || NavigationManager.ToBaseRelativePath(NavigationManager.Uri).ToLowerInvariant(). StartsWith("admin/magazine_issues/edit/", @@ -201,6 +214,8 @@ namespace Marechai.Pages.Admin.Details _currentMagazineByMachineFamily = null; _deletingMagazineByMachine = false; _currentMagazineByMachine = null; + _deletingPersonByMagazine = false; + _currentPersonByMagazine = null; } void HideModal() => _frmDelete.Hide(); @@ -211,6 +226,8 @@ namespace Marechai.Pages.Admin.Details await ConfirmDeleteMagazineByMachineFamily(); else if(_deletingMagazineByMachine) await ConfirmDeleteMagazineByMachine(); + else if(_deletingPersonByMagazine) + await ConfirmDeletePersonByMagazine(); } void OnAddFamilyClick() @@ -377,5 +394,88 @@ namespace Marechai.Pages.Admin.Details // Tell we finished loading StateHasChanged(); } + + void OnAddPersonClick() + { + _addingPerson = true; + _savingPerson = false; + _addingPersonId = _people.First().Id; + } + + void CancelAddPerson() + { + _addingPerson = false; + _savingPerson = false; + _addingPersonId = null; + } + + async Task ConfirmAddPerson() + { + if(_addingPersonId is null || + _addingPersonId <= 0) + { + CancelAddPerson(); + + return; + } + + _savingPerson = true; + + // Yield thread to let UI to update + await Task.Yield(); + + await PeopleByMagazineService.CreateAsync(_addingPersonId.Value, Id, _addingPersonRoleId, + (await UserManager.GetUserAsync(_authState.User)).Id); + + _magazinePeople = await PeopleByMagazineService.GetByMagazine(Id); + + _addingPerson = false; + _savingPerson = false; + _addingPersonId = null; + + // Yield thread to let UI to update + await Task.Yield(); + + // Tell we finished loading + StateHasChanged(); + } + + void ShowPersonDeleteModal(long itemId) + { + _currentPersonByMagazine = _magazinePeople.FirstOrDefault(n => n.Id == itemId); + _deletingPersonByMagazine = true; + _deleteTitle = L["Delete person from this magazine"]; + + _deleteText = + string.Format(L["Are you sure you want to delete the person {0} with role {1} from this magazine?"], + _currentPersonByMagazine?.FullName, _currentPersonByMagazine?.Role); + + _frmDelete.Show(); + } + + async Task ConfirmDeletePersonByMagazine() + { + if(_currentPersonByMagazine is null) + return; + + _deleteInProgress = true; + + // Yield thread to let UI to update + await Task.Yield(); + + await PeopleByMagazineService.DeleteAsync(_currentPersonByMagazine.Id, + (await UserManager.GetUserAsync(_authState.User)).Id); + + _magazinePeople = await PeopleByMagazineService.GetByMagazine(Id); + + _deleteInProgress = false; + _frmDelete.Hide(); + + // Yield thread to let UI to update + await Task.Yield(); + + // Tell we finished loading + StateHasChanged(); + } } } \ No newline at end of file diff --git a/Marechai/Resources/Services/MagazineIssues.en.resx b/Marechai/Resources/Services/MagazineIssues.en.resx index 6f711a42..5ae54a01 100644 --- a/Marechai/Resources/Services/MagazineIssues.en.resx +++ b/Marechai/Resources/Services/MagazineIssues.en.resx @@ -149,4 +149,22 @@ Are you sure you want to delete the machine family {0} from this magazine issue? + + People involved in this magazine + + + Add new + + + Person + + + Role + + + Delete person from this magazine + + + Are you sure you want to delete the person {0} with role {1} from this magazine? + \ No newline at end of file diff --git a/Marechai/Resources/Services/MagazineIssues.es.resx b/Marechai/Resources/Services/MagazineIssues.es.resx index 6dd10c7e..94905aca 100644 --- a/Marechai/Resources/Services/MagazineIssues.es.resx +++ b/Marechai/Resources/Services/MagazineIssues.es.resx @@ -256,4 +256,22 @@ ¿Estás seguro de eliminar la familia de máquinas {0} de esta revista? + + Añadir nueva + + + ¿Estás seguro de eliminar la persona {0} con rol {1} de esta revista? + + + Eliminar persona de esta revista + + + Personas involucradas en esta revista + + + Persona + + + Rol + \ No newline at end of file diff --git a/Marechai/Services/PeopleByMagazineService.cs b/Marechai/Services/PeopleByMagazineService.cs new file mode 100644 index 00000000..46bea57a --- /dev/null +++ b/Marechai/Services/PeopleByMagazineService.cs @@ -0,0 +1,83 @@ +/****************************************************************************** +// MARECHAI: Master repository of computing history artifacts information +// ---------------------------------------------------------------------------- +// +// Author(s) : Natalia Portillo +// +// --[ License ] -------------------------------------------------------------- +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2003-2020 Natalia Portillo +*******************************************************************************/ + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Marechai.Database.Models; +using Marechai.ViewModels; +using Microsoft.EntityFrameworkCore; + +namespace Marechai.Services +{ + public class PeopleByMagazineService + { + readonly MarechaiContext _context; + + public PeopleByMagazineService(MarechaiContext context) => _context = context; + + public async Task> GetByMagazine(long magazineId) => + (await _context.PeopleByMagazines.Where(p => p.MagazineId == magazineId). + Select(p => new PersonByMagazineViewModel + { + Id = p.Id, + Name = p.Person.Name, + Surname = p.Person.Surname, + Alias = p.Person.Alias, + DisplayName = p.Person.DisplayName, + PersonId = p.PersonId, + RoleId = p.RoleId, + Role = p.Role.Name, + MagazineId = p.MagazineId + }).ToListAsync()).OrderBy(p => p.FullName).ThenBy(p => p.Role).ToList(); + + public async Task DeleteAsync(long id, string userId) + { + PeopleByMagazine item = await _context.PeopleByMagazines.FindAsync(id); + + if(item is null) + return; + + _context.PeopleByMagazines.Remove(item); + + await _context.SaveChangesWithUserAsync(userId); + } + + public async Task CreateAsync(int personId, long magazineId, string roleId, string userId) + { + var item = new PeopleByMagazine + { + PersonId = personId, + MagazineId = magazineId, + RoleId = roleId + }; + + await _context.PeopleByMagazines.AddAsync(item); + await _context.SaveChangesWithUserAsync(userId); + + return item.Id; + } + } +} \ No newline at end of file diff --git a/Marechai/Services/Register.cs b/Marechai/Services/Register.cs index 79d674d7..55ba279f 100644 --- a/Marechai/Services/Register.cs +++ b/Marechai/Services/Register.cs @@ -93,6 +93,7 @@ namespace Marechai.Services services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } } } \ No newline at end of file diff --git a/Marechai/ViewModels/PersonByMagazineViewModel.cs b/Marechai/ViewModels/PersonByMagazineViewModel.cs new file mode 100644 index 00000000..9e3e6f99 --- /dev/null +++ b/Marechai/ViewModels/PersonByMagazineViewModel.cs @@ -0,0 +1,41 @@ +/****************************************************************************** +// MARECHAI: Master repository of computing history artifacts information +// ---------------------------------------------------------------------------- +// +// Author(s) : Natalia Portillo +// +// --[ License ] -------------------------------------------------------------- +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2003-2020 Natalia Portillo +*******************************************************************************/ + +namespace Marechai.ViewModels +{ + public class PersonByMagazineViewModel : BaseViewModel + { + public int PersonId { get; set; } + public long MagazineId { get; set; } + public string RoleId { get; set; } + public string Role { get; set; } + public string Name { get; set; } + public string Alias { get; set; } + public string Surname { get; set; } + public string DisplayName { get; set; } + + public string FullName => DisplayName ?? Alias ?? $"{Name} {Surname}"; + } +} \ No newline at end of file