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 else
{ {
Report.Figures.KmMorning = Profiles.KmMorning; Report.Figures.KmMorning = Preference.KmMorning;
<td> <td>
<input type="time" id="checkIn" class="form-control" <input type="time" id="checkIn" class="form-control"
@bind-Value="CheckIn" @bind-Value:event="oninput" @onchange="OnTimeChanged"/> @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 HttpInterceptorService Interceptor { get; set; }
[Inject] public UserPreferenceService PreferenceService { get; set; } [Inject] public UserPreferenceService PreferenceService { get; set; }
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
[Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } [Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
[Inject] public ILogger<AdvisorReportCreatePage> Logger { 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 ReportDto Report { get; set; } = new();
private List<ReportItemView> Activities { get; set; } = new(); private List<ReportItemView> Activities { get; set; } = new();
private ReportFiguresDto InitialValues { 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 FormInvalid { get; set; } = true;
private bool NoFigures { get; set; } = true; private bool NoFigures { get; set; } = true;
private bool Working { get; set; } private bool Working { get; set; }
@ -75,14 +74,16 @@ public partial class AdvisorReportCreatePage : IDisposable
IsSupervisor = await UserInfo.IsSupervisor(); IsSupervisor = await UserInfo.IsSupervisor();
ReportContext = new EditContext(Report); ReportContext = new EditContext(Report);
ReportContext.OnFieldChanged += HandleFieldChanged; ReportContext.OnFieldChanged += HandleFieldChanged;
ReportContext.OnValidationStateChanged += ValidationChanged; ReportContext.OnValidationStateChanged += ValidationChanged;
PreferenceService.OnChange += ProfileServiceOnOnChange; 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)) if (string.IsNullOrWhiteSpace(WorkDate))
{ {
ThisWorkDate = DateTime.Now; ThisWorkDate = DateTime.Now;
@ -93,9 +94,11 @@ public partial class AdvisorReportCreatePage : IDisposable
{ {
ThisWorkDate = DateTime.Parse(WorkDate); ThisWorkDate = DateTime.Parse(WorkDate);
} }
if(await AdvisorReportRepo.ReportExist(WorkDate)) if (await AdvisorReportRepo.ReportExist(WorkDate))
Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}"); {
Navigator.NavigateTo($"/advisor/reports/view/{ThisWorkDate:yyyy-MM-dd}");
}
BeginLeave = ThisWorkDate; BeginLeave = ThisWorkDate;
EndLeave = ThisWorkDate; EndLeave = ThisWorkDate;
@ -115,8 +118,8 @@ public partial class AdvisorReportCreatePage : IDisposable
private void ProfileServiceOnOnChange(UserPreference userPreference) private void ProfileServiceOnOnChange(UserPreference userPreference)
{ {
Profiles = userPreference; Preference = userPreference;
WorkDate = Profiles.WorkDate; WorkDate = Preference.WorkDate;
StateHasChanged(); StateHasChanged();
} }
@ -148,7 +151,7 @@ public partial class AdvisorReportCreatePage : IDisposable
} }
else else
{ {
Report.Figures.KmMorning = Profiles.KmMorning; Report.Figures.KmMorning = Preference.KmMorning;
} }
NoFigures = false; NoFigures = false;
@ -262,8 +265,9 @@ public partial class AdvisorReportCreatePage : IDisposable
// pop confirmation // pop confirmation
// create a prompt for popup confirmation // create a prompt for popup confirmation
var warning = Report.Figures.KmEvening - Report.Figures.KmMorning > 1000 ? 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/>" : ""; ? $"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()}?"; Prompt = $"{warning}<br/>Gem rapport for {ThisWorkDate.ToLongDateString()}?";

View file

@ -21,18 +21,43 @@
<PageTitle>Ny evaluering</PageTitle> <PageTitle>Ny evaluering</PageTitle>
<div class="card"> <EditForm EditContext="FormContext" OnValidSubmit="SubmitDocument">
<div class="card-header"> <DataAnnotationsValidator/>
<div class="card">
<div class="card-title"> <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> </div>
<div class="card-body"> </EditForm>
<EditForm EditContext="EvaluationContext">
<DataAnnotationsValidator/>
</EditForm>
</div>
<div class="card-footer">
</div>
</div>

View file

@ -14,11 +14,13 @@
// //
using System.Text.Json; using System.Text.Json;
using Blazored.Toast.Services;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms; using Microsoft.AspNetCore.Components.Forms;
using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository; using Wonky.Client.HttpRepository;
using Wonky.Client.Local.Services; using Wonky.Client.Local.Services;
using Wonky.Entity.DTO;
using Wonky.Entity.Views; using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
@ -32,6 +34,8 @@ public partial class ManagerEvaluationNewPage : IDisposable
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IUserInfoService UserService { get; set; } [Inject] public IUserInfoService UserService { get; set; }
[Inject] public ILogger<ManagerEvaluationNewPage> Logger { 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 MemberView Member { get; set; } = new();
private ManagerView Manager { 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() protected override async Task OnInitializedAsync()
{ {
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
FormContext = new EditContext(Document);
FormContext.OnFieldChanged += HandleFieldChanged!;
FormContext.OnValidationStateChanged += ValidationChanged!;
Member = await MemberSupportRepo.GetMemberByUserId(UserId); Member = await MemberSupportRepo.GetMemberByUserId(UserId);
Logger.LogDebug("Member => {}", JsonSerializer.Serialize(Member)); Logger.LogDebug("Member => {}", JsonSerializer.Serialize(Member));
@ -60,11 +71,61 @@ public partial class ManagerEvaluationNewPage : IDisposable
Manager = await MemberSupportRepo.GetManagerByUserId(managerId); Manager = await MemberSupportRepo.GetManagerByUserId(managerId);
Logger.LogDebug("Manager => {}", JsonSerializer.Serialize(Manager)); 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() public void Dispose()
{ {
Interceptor.DisposeEvent(); Interceptor.DisposeEvent();
FormContext.OnFieldChanged -= HandleFieldChanged!;
FormContext.OnValidationStateChanged -= ValidationChanged!;
} }
} }

View file

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

View file

@ -1,20 +1,25 @@
using System.ComponentModel.DataAnnotations;
namespace Wonky.Entity.DTO; namespace Wonky.Entity.DTO;
public class EvaluationEditView public class EvaluationEditView
{ {
[Required(ErrorMessage = "Indhold mangler")]
public string Content { get; set; } = ""; 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 Description { get; set; } = "";
public string EvaluationDate { get; set; } = ""; public string EvaluationDate { get; set; } = "";
public string EvaluationId { get; set; } = ""; public string EvaluationId { get; set; } = "";
public string ManagerId { get; set; } = ""; public string ManagerId { get; set; } = "";
public string ManagerName { get; set; } = ""; public string ManagerName { get; set; } = "";
public string MemberId { get; set; } = ""; public string MemberId { get; set; } = "";
public string MemberName { get; set; } = ""; public string MemberName { get; set; } = "";
} }