WIP: evaluation and management

This commit is contained in:
Frede Hundewadt 2023-04-25 18:59:00 +02:00
parent 8397b82e60
commit 568baf098d
6 changed files with 130 additions and 35 deletions

View file

@ -76,7 +76,7 @@
}
else
{
Report.Figures.KmMorning = Profiles.KmMorning;
Report.Figures.KmMorning = Preference.KmMorning;
<td>
<input type="time" id="checkIn" class="form-control"
@bind-Value="CheckIn" @bind-Value:event="oninput" @onchange="OnTimeChanged"/>

View file

@ -34,7 +34,6 @@ public partial class AdvisorReportCreatePage : IDisposable
// ##########################################################################
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public UserPreferenceService PreferenceService { get; set; }
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
[Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
[Inject] public ILogger<AdvisorReportCreatePage> Logger { get; set; }
@ -47,7 +46,7 @@ public partial class AdvisorReportCreatePage : IDisposable
private ReportDto Report { get; set; } = new();
private List<ReportItemView> Activities { get; set; } = new();
private ReportFiguresDto InitialValues { get; set; } = new();
private UserPreference Profiles { get; set; } = new();
private UserPreference Preference { get; set; } = new();
private bool FormInvalid { get; set; } = true;
private bool NoFigures { get; set; } = true;
private bool Working { get; set; }
@ -75,14 +74,16 @@ public partial class AdvisorReportCreatePage : IDisposable
IsSupervisor = await UserInfo.IsSupervisor();
ReportContext = new EditContext(Report);
ReportContext.OnFieldChanged += HandleFieldChanged;
ReportContext.OnValidationStateChanged += ValidationChanged;
PreferenceService.OnChange += ProfileServiceOnOnChange;
Profiles = await PreferenceService.GetProfile();
Logger.LogDebug("{}", JsonSerializer.Serialize(Profiles));
WorkDate = Profiles.WorkDate;
Preference = await PreferenceService.GetProfile();
Logger.LogDebug("{}", JsonSerializer.Serialize(Preference));
WorkDate = Preference.WorkDate;
if (string.IsNullOrWhiteSpace(WorkDate))
{
ThisWorkDate = DateTime.Now;
@ -93,9 +94,11 @@ public partial class AdvisorReportCreatePage : IDisposable
{
ThisWorkDate = DateTime.Parse(WorkDate);
}
if(await AdvisorReportRepo.ReportExist(WorkDate))
Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}");
if (await AdvisorReportRepo.ReportExist(WorkDate))
{
Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}");
}
BeginLeave = ThisWorkDate;
EndLeave = ThisWorkDate;
@ -115,8 +118,8 @@ public partial class AdvisorReportCreatePage : IDisposable
private void ProfileServiceOnOnChange(UserPreference userPreference)
{
Profiles = userPreference;
WorkDate = Profiles.WorkDate;
Preference = userPreference;
WorkDate = Preference.WorkDate;
StateHasChanged();
}
@ -148,7 +151,7 @@ public partial class AdvisorReportCreatePage : IDisposable
}
else
{
Report.Figures.KmMorning = Profiles.KmMorning;
Report.Figures.KmMorning = Preference.KmMorning;
}
NoFigures = false;
@ -262,8 +265,9 @@ public partial class AdvisorReportCreatePage : IDisposable
// pop confirmation
// create a prompt for popup confirmation
var warning = Report.Figures.KmEvening - Report.Figures.KmMorning > 1000 ?
$"Kørte km for rapporten er '{Report.Figures.KmEvening - Report.Figures.KmMorning}'. Er du sikker på at det er rigtigt?<br/>" : "";
var warning = Report.Figures.KmEvening - Report.Figures.KmMorning > 1000
? $"Kørte km for rapporten er '{Report.Figures.KmEvening - Report.Figures.KmMorning}'. Er du sikker på at det er rigtigt?<br/>"
: "";
Prompt = $"{warning}<br/>Gem rapport for {ThisWorkDate.ToLongDateString()}?";

View file

@ -21,18 +21,43 @@
<PageTitle>Ny evaluering</PageTitle>
<div class="card">
<div class="card-header">
<EditForm EditContext="FormContext" OnValidSubmit="SubmitDocument">
<DataAnnotationsValidator/>
<div class="card">
<div class="card-title">
<h3>Ny Evaluering</h3>
<h3>Evaluering</h3>
</div>
<div class="card-body">
<div class="row d-flex g-3">
<label for="supervisor" class="col-sm-2 col-form-label-sm">Supervisor</label>
<div class="col-sm-4">
<InputText id="supervisor" class="form-control" @bind-Value="Document.ManagerName" readonly></InputText>
</div>
<label for="salesRep" class="col-sm-2 col-form-label-sm">Sælger</label>
<div class="col-sm-4">
<InputText id="salesRep" class="form-control" @bind-Value="Document.MemberName" readonly></InputText>
</div>
<label for="documentDate" class="col-sm-2 col-form-label-sm">Dato</label>
<div class="col-sm-4">
<InputDate id="documentDate" class="form-control" @bind-Value="DocumentDate"></InputDate>
</div>
<div class="col-sm-6"></div>
<label for="description" class="col-sm-2 col-form-label-sm">Overskrift</label>
<div class="col-sm-10">
<InputText id="description" class="form-control" @bind-Value="Document.Description"></InputText>
<ValidationMessage For="@(() => Document.Description)"/>
</div>
<label for="content" class="col-sm-2 col-form-label-sm">Indhold</label>
<div class="col-sm-10">
<InputTextArea id="content" class="form-control" rows="10" @bind-Value="Document.Content"></InputTextArea>
<ValidationMessage For="@(() => Document.Content)"/>
</div>
</div>
</div>
<div class="card-footer">
<div class="text-end">
<button type="submit" class="btn btn-primary" disabled="@FormInvalid" ><i class="bi-cloud-upload"></i> Gem</button>
</div>
</div>
</div>
<div class="card-body">
<EditForm EditContext="EvaluationContext">
<DataAnnotationsValidator/>
</EditForm>
</div>
<div class="card-footer">
</div>
</div>
</EditForm>

View file

@ -14,11 +14,13 @@
//
using System.Text.Json;
using Blazored.Toast.Services;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Wonky.Client.Local.Services;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
@ -32,6 +34,8 @@ public partial class ManagerEvaluationNewPage : IDisposable
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IUserInfoService UserService { get; set; }
[Inject] public ILogger<ManagerEvaluationNewPage> Logger { get; set; }
[Inject] public IToastService Toaster { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
// ############################################################
@ -39,16 +43,23 @@ public partial class ManagerEvaluationNewPage : IDisposable
// ############################################################
private EditContext EvaluationContext { get; set; }
private EditContext FormContext { get; set; }
private MemberView Member { get; set; } = new();
private ManagerView Manager { get; set; } = new();
private EvaluationEditView Document { get; set; } = new();
private DateTime DocumentDate { get; set; } = DateTime.Now;
private bool FormInvalid { get; set; } = true;
protected override async Task OnInitializedAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
FormContext = new EditContext(Document);
FormContext.OnFieldChanged += HandleFieldChanged!;
FormContext.OnValidationStateChanged += ValidationChanged!;
Member = await MemberSupportRepo.GetMemberByUserId(UserId);
Logger.LogDebug("Member => {}", JsonSerializer.Serialize(Member));
@ -60,11 +71,61 @@ public partial class ManagerEvaluationNewPage : IDisposable
Manager = await MemberSupportRepo.GetManagerByUserId(managerId);
Logger.LogDebug("Manager => {}", JsonSerializer.Serialize(Manager));
Document.EvaluationDate = $"{DocumentDate:yyyy-MM-dd}";
Document.ManagerId = Manager.ManagerId;
Document.ManagerName = Manager.FullName;
Document.MemberId = Member.MemberId;
Document.MemberName = Member.FullName;
}
private async Task SubmitDocument()
{
Toaster.ShowInfo("Gemmer Evaluering");
var x = await MemberSupportRepo.CreateEvaluation(Document);
if (string.IsNullOrWhiteSpace(x.EvaluationId))
{
Toaster.ShowError("Fejl");
}
else
{
Toaster.ShowSuccess("Ok");
Navigator.NavigateTo($"/supervisor/members/{UserId}/evaluations/{x.EvaluationId}");
}
}
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
{
Document.EvaluationDate = $"{DocumentDate:yyyy-MM-dd}";
FormInvalid = !FormContext.Validate();
StateHasChanged();
}
/// <summary>
/// Validation change event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ValidationChanged(object sender, ValidationStateChangedEventArgs e)
{
FormInvalid = false;
FormContext.OnFieldChanged -= HandleFieldChanged!;
FormContext.OnValidationStateChanged -= ValidationChanged!;
FormContext = new EditContext(Document);
FormContext.OnFieldChanged += HandleFieldChanged!;
FormContext.OnValidationStateChanged += ValidationChanged!;
}
public void Dispose()
{
Interceptor.DisposeEvent();
FormContext.OnFieldChanged -= HandleFieldChanged!;
FormContext.OnValidationStateChanged -= ValidationChanged!;
}
}

View file

@ -1,7 +1,7 @@
{
"appInfo": {
"name": "Wonky Online",
"version": "0.137.0",
"version": "0.138.0",
"rc": true,
"sandBox": false,
"image": "grumpy-coder.png"
@ -9,7 +9,7 @@
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"System": "Debug",
"Microsoft": "Information"
},
"Debug": {

View file

@ -1,20 +1,25 @@
using System.ComponentModel.DataAnnotations;
namespace Wonky.Entity.DTO;
public class EvaluationEditView
{
[Required(ErrorMessage = "Indhold mangler")]
public string Content { get; set; } = "";
[Required(ErrorMessage = "Beskrivelse mangler")]
[MaxLength(128, ErrorMessage = "Der er kun afsat 128 tegn.")]
public string Description { get; set; } = "";
public string EvaluationDate { get; set; } = "";
public string EvaluationId { get; set; } = "";
public string ManagerId { get; set; } = "";
public string ManagerName { get; set; } = "";
public string MemberId { get; set; } = "";
public string MemberName { get; set; } = "";
}
}