WIP: evaluation and management
This commit is contained in:
parent
8397b82e60
commit
568baf098d
6 changed files with 130 additions and 35 deletions
|
@ -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"/>
|
||||||
|
|
|
@ -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()}?";
|
||||||
|
|
||||||
|
|
|
@ -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>
|
|
|
@ -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!;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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": {
|
||||||
|
|
|
@ -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; } = "";
|
||||||
}
|
}
|
Loading…
Reference in a new issue