2020-05-27 13:38:05 +01:00
|
|
|
using System;
|
2020-05-26 03:02:50 +01:00
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Threading.Tasks;
|
2020-05-27 13:38:05 +01:00
|
|
|
using Blazorise;
|
2020-05-26 03:02:50 +01:00
|
|
|
using Marechai.Database.Models;
|
2020-05-27 13:38:05 +01:00
|
|
|
using Marechai.Shared;
|
|
|
|
|
using Marechai.ViewModels;
|
2020-05-26 03:02:50 +01:00
|
|
|
using Microsoft.AspNetCore.Components;
|
|
|
|
|
|
|
|
|
|
namespace Marechai.Pages.Admin.Details
|
|
|
|
|
{
|
|
|
|
|
public partial class Person
|
|
|
|
|
{
|
2020-05-27 13:38:05 +01:00
|
|
|
List<Iso31661Numeric> _countries;
|
|
|
|
|
bool _editing;
|
|
|
|
|
bool _loaded;
|
|
|
|
|
PersonViewModel _model;
|
|
|
|
|
bool _unknownAlias;
|
|
|
|
|
bool _unknownCountry;
|
|
|
|
|
bool _unknownDeathDate;
|
|
|
|
|
bool _unknownDisplayName;
|
|
|
|
|
bool _unknownFacebook;
|
|
|
|
|
bool _unknownName;
|
|
|
|
|
bool _unknownSurname;
|
|
|
|
|
bool _unknownTwitter;
|
|
|
|
|
bool _unknownWebpage;
|
2020-05-26 03:02:50 +01:00
|
|
|
[Parameter]
|
|
|
|
|
public int Id { get; set; }
|
|
|
|
|
|
|
|
|
|
protected override async Task OnAfterRenderAsync(bool firstRender)
|
|
|
|
|
{
|
|
|
|
|
if(_loaded)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
_loaded = true;
|
|
|
|
|
|
|
|
|
|
if(Id <= 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
_countries = await CountriesService.GetAsync();
|
|
|
|
|
_model = await Service.GetAsync(Id);
|
|
|
|
|
|
2020-05-27 13:38:05 +01:00
|
|
|
_editing = NavigationManager.ToBaseRelativePath(NavigationManager.Uri).ToLowerInvariant().
|
|
|
|
|
StartsWith("admin/people/edit/", StringComparison.InvariantCulture);
|
|
|
|
|
|
|
|
|
|
if(_editing)
|
|
|
|
|
SetCheckboxes();
|
|
|
|
|
|
2020-05-26 03:02:50 +01:00
|
|
|
StateHasChanged();
|
|
|
|
|
}
|
2020-05-27 13:38:05 +01:00
|
|
|
|
|
|
|
|
void SetCheckboxes()
|
|
|
|
|
{
|
|
|
|
|
_unknownAlias = string.IsNullOrWhiteSpace(_model.Alias);
|
|
|
|
|
_unknownCountry = !_model.CountryOfBirthId.HasValue;
|
|
|
|
|
_unknownDeathDate = !_model.DeathDate.HasValue;
|
|
|
|
|
_unknownDisplayName = string.IsNullOrWhiteSpace(_model.DisplayName);
|
|
|
|
|
_unknownFacebook = string.IsNullOrWhiteSpace(_model.Facebook);
|
|
|
|
|
_unknownName = string.IsNullOrWhiteSpace(_model.Name);
|
|
|
|
|
_unknownSurname = string.IsNullOrWhiteSpace(_model.Surname);
|
|
|
|
|
_unknownTwitter = string.IsNullOrWhiteSpace(_model.Twitter);
|
|
|
|
|
_unknownWebpage = string.IsNullOrWhiteSpace(_model.Webpage);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OnEditClicked()
|
|
|
|
|
{
|
|
|
|
|
_editing = true;
|
|
|
|
|
SetCheckboxes();
|
|
|
|
|
StateHasChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async void OnCancelClicked()
|
|
|
|
|
{
|
|
|
|
|
_editing = false;
|
|
|
|
|
_model = await Service.GetAsync(Id);
|
|
|
|
|
SetCheckboxes();
|
|
|
|
|
StateHasChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async void OnSaveClicked()
|
|
|
|
|
{
|
|
|
|
|
if(_unknownAlias)
|
|
|
|
|
_model.Alias = null;
|
|
|
|
|
else if(string.IsNullOrWhiteSpace(_model.Alias))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(_unknownCountry)
|
|
|
|
|
_model.CountryOfBirthId = null;
|
|
|
|
|
else if(_model.CountryOfBirthId < 0)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(_model.BirthDate.Date >= DateTime.UtcNow.Date)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(_unknownDeathDate)
|
|
|
|
|
_model.DeathDate = null;
|
|
|
|
|
else if(_model.DeathDate?.Date >= DateTime.UtcNow.Date)
|
|
|
|
|
return;
|
|
|
|
|
else if(_model.DeathDate?.Date <= _model.BirthDate.Date)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(_unknownAlias)
|
|
|
|
|
_model.Alias = null;
|
|
|
|
|
else if(string.IsNullOrWhiteSpace(_model.Alias))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(_unknownDisplayName)
|
2020-05-27 19:14:18 +01:00
|
|
|
_model.DisplayName = null;
|
|
|
|
|
else if(string.IsNullOrWhiteSpace(_model.DisplayName))
|
2020-05-27 13:38:05 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(_unknownFacebook)
|
2020-05-27 19:14:18 +01:00
|
|
|
_model.Facebook = null;
|
|
|
|
|
else if(string.IsNullOrWhiteSpace(_model.Facebook))
|
2020-05-27 13:38:05 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(_unknownName)
|
2020-05-27 19:14:18 +01:00
|
|
|
_model.Name = null;
|
|
|
|
|
else if(string.IsNullOrWhiteSpace(_model.Name))
|
2020-05-27 13:38:05 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(_unknownSurname)
|
2020-05-27 19:14:18 +01:00
|
|
|
_model.Surname = null;
|
|
|
|
|
else if(string.IsNullOrWhiteSpace(_model.Surname))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(_unknownTwitter)
|
|
|
|
|
_model.Twitter = null;
|
|
|
|
|
else if(string.IsNullOrWhiteSpace(_model.Twitter))
|
2020-05-27 13:38:05 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(_unknownWebpage)
|
2020-05-27 19:14:18 +01:00
|
|
|
_model.Webpage = null;
|
|
|
|
|
else if(string.IsNullOrWhiteSpace(_model.Webpage))
|
2020-05-27 13:38:05 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if((_unknownName && !_unknownSurname) ||
|
|
|
|
|
(!_unknownName && _unknownSurname))
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// TODO: Show error here
|
|
|
|
|
if(_unknownName &&
|
|
|
|
|
_unknownSurname &&
|
|
|
|
|
_unknownAlias &&
|
|
|
|
|
_unknownDisplayName)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
_editing = false;
|
|
|
|
|
await Service.UpdateAsync(_model);
|
|
|
|
|
_model = await Service.GetAsync(Id);
|
|
|
|
|
SetCheckboxes();
|
|
|
|
|
StateHasChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ValidateName(ValidatorEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(!(e.Value is string name))
|
|
|
|
|
{
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(name.Length < 1 ||
|
|
|
|
|
name.Length > 256)
|
|
|
|
|
{
|
|
|
|
|
e.ErrorText = L["Name must be smaller than 256 characters."];
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!string.IsNullOrWhiteSpace(_model.Surname) &&
|
|
|
|
|
!_unknownSurname)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
e.ErrorText = L["Both name and surname must be known and filled, or both unknown."];
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ValidateSurname(ValidatorEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(!(e.Value is string surname))
|
|
|
|
|
{
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(surname.Length < 1 ||
|
|
|
|
|
surname.Length > 256)
|
|
|
|
|
{
|
|
|
|
|
e.ErrorText = L["Surname must be smaller than 256 characters."];
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(!string.IsNullOrWhiteSpace(_model.Surname) &&
|
|
|
|
|
!_unknownSurname)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
e.ErrorText = L["Both name and surname must be known and filled, or both unknown."];
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ValidateAlias(ValidatorEventArgs e) =>
|
|
|
|
|
Validators.ValidateString(e, L["Alias must be smaller than 256 characters."], 256);
|
|
|
|
|
|
|
|
|
|
void ValidateDisplayName(ValidatorEventArgs e) =>
|
|
|
|
|
Validators.ValidateString(e, L["Display name must be smaller than 256 characters."], 256);
|
|
|
|
|
|
|
|
|
|
void ValidateBirthDate(ValidatorEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(!(e.Value is DateTime date))
|
|
|
|
|
{
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(date.Date >= DateTime.UtcNow.Date)
|
|
|
|
|
{
|
|
|
|
|
e.ErrorText = L["Birth date must be before today."];
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(_unknownDeathDate || !_model.DeathDate.HasValue)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if(date.Date < _model.DeathDate?.Date)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
e.ErrorText = L["Birth date must be before death date."];
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ValidateDeathDate(ValidatorEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(!(e.Value is DateTime date))
|
|
|
|
|
{
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(date.Date >= DateTime.UtcNow.Date)
|
|
|
|
|
{
|
|
|
|
|
e.ErrorText = L["Death date must be before today."];
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(date.Date > _model.BirthDate.Date)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
e.ErrorText = L["Death date must be after birth date."];
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-27 15:01:55 +01:00
|
|
|
void ValidateWebpage(ValidatorEventArgs e) =>
|
|
|
|
|
Validators.ValidateUrl(e, L["Webpage must be smaller than 255 characters."], 255);
|
2020-05-27 13:38:05 +01:00
|
|
|
|
|
|
|
|
void ValidateTwitter(ValidatorEventArgs e)
|
|
|
|
|
{
|
|
|
|
|
if(!(e.Value is string twitter))
|
|
|
|
|
{
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(twitter.Length < 1 ||
|
|
|
|
|
twitter.Length > 255)
|
|
|
|
|
{
|
|
|
|
|
e.ErrorText = L["Twitter handle must be smaller than 255 characters."];
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(twitter[0] == '@')
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
e.ErrorText = L["Invalid Twitter handle."];
|
|
|
|
|
e.Status = ValidationStatus.Error;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ValidateFacebook(ValidatorEventArgs e) =>
|
|
|
|
|
Validators.ValidateString(e, L["Facebook username must be smaller than 256 characters."], 256);
|
2020-05-26 03:02:50 +01:00
|
|
|
}
|
|
|
|
|
}
|