WIP: evaluation and management

This commit is contained in:
Frede Hundewadt 2023-04-24 18:09:40 +02:00
parent a906c9966f
commit 8f5178ae6d
38 changed files with 311 additions and 235 deletions

View file

@ -4,6 +4,7 @@ using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Wonky.Entity.Configuration; using Wonky.Entity.Configuration;
using Wonky.Entity.DTO; using Wonky.Entity.DTO;
using Wonky.Entity.Views;
namespace Wonky.Client.HttpRepository; namespace Wonky.Client.HttpRepository;
@ -28,39 +29,61 @@ public class EvaluationRepository : IEvaluationRepository
_navigation = navigation; _navigation = navigation;
_api = configuration.Value; _api = configuration.Value;
} }
public async Task<ManagerView> GetManagerByUserId(string userId)
{
var result = await _client
.GetFromJsonAsync<ManagerView>($"{_api.MemberEvaluation}", _options);
return result ?? new ManagerView();
}
public async Task<MemberView> GetMemberByUserId(string userId)
{
var result = await _client
.GetFromJsonAsync<MemberView>($"{_api.MemberEvaluation}", _options);
return result ?? new MemberView();
}
public async Task<List<EvaluationEditView>> GetByManager(string managerId) public async Task<List<EvaluationEditView>> GetByManager(string managerId)
{ {
var result = await _client var result = await _client
.GetFromJsonAsync<List<EvaluationEditView>>( .GetFromJsonAsync<List<EvaluationEditView>>(
$"{_api.UserEvaluations}/manager/{managerId}", _options); $"{_api.MemberEvaluation}/manager/{managerId}", _options);
return result ?? new List<EvaluationEditView>(); return result ?? new List<EvaluationEditView>();
} }
public async Task<List<EvaluationEditView>> GetByMember(string memberId) public async Task<List<EvaluationEditView>> GetByMember(string memberId)
{ {
var result = await _client var result = await _client
.GetFromJsonAsync<List<EvaluationEditView>>( .GetFromJsonAsync<List<EvaluationEditView>>(
$"{_api.UserEvaluations}/member/{memberId}", _options); $"{_api.MemberEvaluation}/member/{memberId}", _options);
return result ?? new List<EvaluationEditView>(); return result ?? new List<EvaluationEditView>();
} }
public async Task<EvaluationEditView> GetById(string evaluationId) public async Task<EvaluationEditView> GetById(string evaluationId)
{ {
var result = await _client var result = await _client
.GetFromJsonAsync<EvaluationEditView>( .GetFromJsonAsync<EvaluationEditView>(
$"{_api.UserEvaluations}/id/{evaluationId}", _options); $"{_api.MemberEvaluation}/id/{evaluationId}", _options);
return result ?? new EvaluationEditView(); return result ?? new EvaluationEditView();
} }
public async Task<EvaluationEditView> CreateEvaluation(EvaluationEditView evaluation)
public async Task<EvaluationEditView> CreateEvaluation(EvaluationEditView evaluationEditView)
{ {
var result = await _client var result = await _client
.PostAsJsonAsync($"{_api.UserEvaluations}", evaluation, _options); .PostAsJsonAsync($"{_api.MemberEvaluation}", evaluationEditView, _options);
if (!result.IsSuccessStatusCode) if (!result.IsSuccessStatusCode)
{ {
@ -75,10 +98,11 @@ public class EvaluationRepository : IEvaluationRepository
} }
public async Task<EvaluationEditView> UpdateEvaluation(string evaluationId, EvaluationEditView evaluation)
public async Task<EvaluationEditView> UpdateEvaluation(string evaluationId, EvaluationEditView evaluationEditView)
{ {
var result = await _client var result = await _client
.PutAsJsonAsync($"{_api.UserEvaluations}/{evaluationId}", evaluation, _options); .PutAsJsonAsync($"{_api.MemberEvaluation}/{evaluationId}", evaluationEditView, _options);
if (!result.IsSuccessStatusCode) if (!result.IsSuccessStatusCode)
{ {
@ -92,8 +116,9 @@ public class EvaluationRepository : IEvaluationRepository
: JsonSerializer.Deserialize<EvaluationEditView>(content, _options))!; : JsonSerializer.Deserialize<EvaluationEditView>(content, _options))!;
} }
public async Task DeleteEvaluation(string evaluationId) public async Task DeleteEvaluation(string evaluationId)
{ {
await _client.DeleteAsync($"{_api.UserEvaluations}/{evaluationId}"); await _client.DeleteAsync($"{_api.MemberEvaluation}/{evaluationId}");
} }
} }

View file

@ -1,13 +1,16 @@
using Wonky.Entity.DTO; using Wonky.Entity.DTO;
using Wonky.Entity.Views;
namespace Wonky.Client.HttpRepository; namespace Wonky.Client.HttpRepository;
public interface IEvaluationRepository public interface IEvaluationRepository
{ {
Task<ManagerView> GetManagerByUserId(string userId);
Task<MemberView> GetMemberByUserId(string userId);
Task<List<EvaluationEditView>> GetByManager(string managerId); Task<List<EvaluationEditView>> GetByManager(string managerId);
Task<List<EvaluationEditView>> GetByMember(string memberId); Task<List<EvaluationEditView>> GetByMember(string memberId);
Task<EvaluationEditView> GetById(string evaluationId); Task<EvaluationEditView> GetById(string evaluationId);
Task<EvaluationEditView> CreateEvaluation(EvaluationEditView evaluation); Task<EvaluationEditView> CreateEvaluation(EvaluationEditView evaluationEditView);
Task<EvaluationEditView> UpdateEvaluation(string evaluationId, EvaluationEditView evaluation); Task<EvaluationEditView> UpdateEvaluation(string evaluationId, EvaluationEditView evaluationEditView);
Task DeleteEvaluation(string evaluationId); Task DeleteEvaluation(string evaluationId);
} }

View file

@ -43,41 +43,40 @@ public class OfficeUserInfoRepository : IOfficeUserInfoRepository
_api = configuration.Value; _api = configuration.Value;
} }
/// <summary>
/// Get Users
/// </summary>
/// <returns></returns>
public async Task<List<UserInfoListView>> GetUsers() public async Task<List<UserInfoListView>> GetUsers()
{ {
return await _client.GetFromJsonAsync<List<UserInfoListView>>($"{_api.UserData}/list"); var result = await _client
.GetFromJsonAsync<List<UserInfoListView>>($"{_api.UserInfoClient}/list", _options);
return result ?? new List<UserInfoListView>();
} }
/// <summary>
/// Get Users in role
/// </summary>
/// <returns></returns>
public async Task<List<UserInfoListView>> GetUsers(string role) public async Task<List<UserInfoListView>> GetUsers(string role)
{ {
return await _client.GetFromJsonAsync<List<UserInfoListView>>($"{_api.UserData}/role/{role}"); var result = await _client
.GetFromJsonAsync<List<UserInfoListView>>($"{_api.UserInfoClient}/role/{role}", _options);
return result ?? new List<UserInfoListView>();
} }
/// <summary>
/// Get users for logged in supervisor
/// </summary>
/// <returns></returns>
public async Task<List<UserInfoListView>> GetSupervisorUsers() public async Task<List<UserInfoListView>> GetSupervisorUsers()
{ {
return await _client.GetFromJsonAsync<List<UserInfoListView>>($"{_api.UserData}/supervisor"); var result = await _client
.GetFromJsonAsync<List<UserInfoListView>>($"{_api.UserInfoClient}/supervisor", _options);
return result ?? new List<UserInfoListView>();
} }
/// <summary>
/// Get Advisor Info for given userId
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public async Task<UserInfoAdvisorView> GetUserInfo(string userId) public async Task<UserInfoAdvisorView> GetUserInfo(string userId)
{ {
return await _client.GetFromJsonAsync<UserInfoAdvisorView>($"{_api.UserData}/{userId}"); var result = await _client
.GetFromJsonAsync<UserInfoAdvisorView>($"{_api.UserInfoClient}/{userId}", _options);
return result ?? new UserInfoAdvisorView();
} }
} }

View file

@ -135,7 +135,7 @@ public class AuthenticationService : IAuthenticationService
public async Task<UserManagerEditView> UserInfo(bool write = false) public async Task<UserManagerEditView> UserInfo(bool write = false)
{ {
var response = await _client.GetAsync(_apiConfig.Value.UserInfo).ConfigureAwait(true); var response = await _client.GetAsync(_apiConfig.Value.UserInfoAuth).ConfigureAwait(true);
var content = await response.Content.ReadAsStringAsync(); var content = await response.Content.ReadAsStringAsync();
var userInfo = JsonSerializer.Deserialize<UserManagerEditView>(content, _options); var userInfo = JsonSerializer.Deserialize<UserManagerEditView>(content, _options);
if(write) if(write)

View file

@ -20,6 +20,7 @@ namespace Wonky.Client.Local.Services;
public interface IUserInfoService public interface IUserInfoService
{ {
Task<string> GetUserId();
Task<UserManagerEditView> GetUserInfo(); Task<UserManagerEditView> GetUserInfo();
Task SetUserInfo(UserManagerEditView userInfo); Task SetUserInfo(UserManagerEditView userInfo);
Task<bool> IsSupervisor(); Task<bool> IsSupervisor();

View file

@ -38,6 +38,11 @@ public class UserInfoService : IUserInfoService
} }
public async Task<string> GetUserId()
{
var x = await GetUserInfo();
return x.UserId;
}
public async Task<bool> IsSupervisor() public async Task<bool> IsSupervisor()
{ {
var x = await GetUserInfo(); var x = await GetUserInfo();

View file

@ -14,12 +14,35 @@
*@ *@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@attribute [Authorize(Roles = "Management,Supervisor")] @attribute [Authorize(Roles = "Management,Supervisor")]
@page "/ManagerEvaluationListPage" @page "/management/members/{UserId}/evaluations"
<h3>ManagerEvaluationListPage</h3>
@code { <PageTitle>Evalueringer</PageTitle>
<div class="row">
<div class="col">
<h3>Evalueringer</h3>
</div>
<div class="col">
<div class="text-end">
<a class="btn btn-primary" href="/management/members/@UserId/evaluations/new"><i class="bi-plus-circle-fill"></i> Opret Evaluering</a>
@*
<div class="busy-signal" style="display:@(_working ? "block" : "none")">
<div class="spinner-grow text-info" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
*@
</div>
</div>
</div>
@if (Evaluations.Any())
{
} }
else
{
<div>Ingen data</div>
}

View file

@ -13,16 +13,60 @@
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] // along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
// //
using System.Text.Json;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository; using Wonky.Client.HttpRepository;
using Wonky.Entity.DTO;
using Wonky.Entity.Views; using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
#pragma warning disable CS8618 #pragma warning disable CS8618
public partial class ManagerEvaluationListPage public partial class ManagerEvaluationListPage : IDisposable
{ {
// #########################################################
[Inject] public IEvaluationRepository EvaluationRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public ILogger<ManagerEvaluationListPage> Logger { get; set; }
// #########################################################
[Parameter] public string UserId { get; set; } = "";
// #########################################################
private List<EvaluationEditView> Evaluations { get; set; } = new();
private MemberView Member { get; set; } = new();
private bool _working = true;
protected override async Task OnParametersSetAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
Member = await EvaluationRepo.GetMemberByUserId(UserId);
while (string.IsNullOrWhiteSpace(Member.MemberId))
{
await Task.Delay(250);
}
Logger.LogDebug("Member => {}",JsonSerializer.Serialize(Member));
}
protected override async Task OnInitializedAsync()
{
Evaluations = await EvaluationRepo.GetByMember(Member.MemberId);
Logger.LogDebug("{}",JsonSerializer.Serialize(Evaluations));
_working = false;
}
public void Dispose()
{
Interceptor.DisposeEvent();
}
} }

View file

@ -17,9 +17,22 @@
@attribute [Authorize(Roles = "Management,Supervisor")] @attribute [Authorize(Roles = "Management,Supervisor")]
@page "/ManagerEvaluationNewPage" @page "/management/members/{UserId}/evaluations/new"
<h3>ManagerEvaluationNewPage</h3>
@code { <PageTitle>Ny evaluering</PageTitle>
} <div class="card">
<div class="card-header">
<div class="card-title">
<h3>Ny Evaluering</h3>
</div>
</div>
<div class="card-body">
<EditForm EditContext="EvaluationContext">
<DataAnnotationsValidator/>
</EditForm>
</div>
<div class="card-footer">
</div>
</div>

View file

@ -14,15 +14,48 @@
// //
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
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.Entity.Views; using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
#pragma warning disable CS8618 #pragma warning disable CS8618
public partial class ManagerEvaluationNewPage public partial class ManagerEvaluationNewPage : IDisposable
{ {
// ############################################################
[Inject] public IEvaluationRepository EvaluationRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IUserInfoService UserService { get; set; }
// ############################################################
[Parameter] public string UserId { get; set; } = "";
// ############################################################
private EditContext EvaluationContext { get; set; }
private MemberView Member { get; set; } = new();
private ManagerView Manager { get; set; } = new();
protected override async Task OnInitializedAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
Member = await EvaluationRepo.GetMemberByUserId(UserId);
var managerId = await UserService.GetUserId();
Manager = await EvaluationRepo.GetManagerByUserId(managerId);
}
public void Dispose()
{
Interceptor.DisposeEvent();
}
} }

View file

@ -17,8 +17,19 @@
@attribute [Authorize(Roles = "Management,Supervisor")] @attribute [Authorize(Roles = "Management,Supervisor")]
<h3>ManagerEvaluationViewEditPage</h3> @page "/management/members/{UserId}/evaluations/{EvaluationId}"
@code { <div class="row">
<div class="col">
} <h3>Evalueringer</h3>
</div>
<div class="col">
<div class="text-end">
<div class="busy-signal" style="display:@(Working ? "block" : "none")">
<div class="spinner-grow text-info" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
</div>
</div>
</div>

View file

@ -16,6 +16,7 @@
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository; using Wonky.Client.HttpRepository;
using Wonky.Entity.DTO;
using Wonky.Entity.Views; using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
@ -23,7 +24,36 @@ namespace Wonky.Client.Pages;
#pragma warning disable CS8618 #pragma warning disable CS8618
public partial class ManagerEvaluationViewEditPage public partial class ManagerEvaluationViewEditPage : IDisposable
{ {
// #########################################################
[Inject] public IEvaluationRepository EvaluationRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
// #########################################################
[Parameter] public string UserId { get; set; } = "";
[Parameter] public string EvaluationId { get; set; } = "";
// #########################################################
private bool Working { get; set; } = true;
private EvaluationEditView Evaluation { get; set; } = new();
private MemberView Member { get; set; } = new();
protected override async Task OnInitializedAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
Member = await EvaluationRepo.GetMemberByUserId(UserId);
Evaluation = await EvaluationRepo.GetById(EvaluationId);
Working = false;
}
public void Dispose()
{
Interceptor.DisposeEvent();
}
} }

View file

@ -16,7 +16,8 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Management,Supervisor")] @attribute [Authorize(Roles = "Management,Supervisor")]
@page "/management/advisors/{UserId}/reports/{ReportDate}"
@page "/management/members/{UserId}/activities/{ReportDate}"
<div class="report-main d-print-print"> <div class="report-main d-print-print">
@if (!string.IsNullOrWhiteSpace(Report.ReportData.DayTypeEnum)) @if (!string.IsNullOrWhiteSpace(Report.ReportData.DayTypeEnum))

View file

@ -30,13 +30,13 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class ManagerAdvisorReportViewPage : IDisposable public partial class ManagerMemberActivityViewPage : IDisposable
{ {
// ############################################################# // #############################################################
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public ICountryReportRepository ReportRepo { get; set; } [Inject] public ICountryReportRepository ReportRepo { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
[Inject] public ILogger<ManagerAdvisorReportViewPage> Logger { get; set; } [Inject] public ILogger<ManagerMemberActivityViewPage> Logger { get; set; }
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public UserPreferenceService PreferenceService { get; set; } [Inject] public UserPreferenceService PreferenceService { get; set; }
[Inject] public IToastService Toaster { get; set; } [Inject] public IToastService Toaster { get; set; }
@ -45,7 +45,6 @@ public partial class ManagerAdvisorReportViewPage : IDisposable
// ############################################################# // #############################################################
[Parameter] public string CountryCode { get; set; } = "";
[Parameter] public string UserId { get; set; } = ""; [Parameter] public string UserId { get; set; } = "";
[Parameter] public string ReportDate { get; set; } = ""; [Parameter] public string ReportDate { get; set; } = "";
@ -79,7 +78,7 @@ public partial class ManagerAdvisorReportViewPage : IDisposable
{ {
// shoe order/activity document // shoe order/activity document
// the supervisor version // the supervisor version
Navigator.NavigateTo($"/management/advisors/{UserId}/reports/{ReportDate}/activities/{documentId}"); Navigator.NavigateTo($"/management/members/{UserId}/activities/{ReportDate}/visits/{documentId}");
} }
@ -98,7 +97,7 @@ public partial class ManagerAdvisorReportViewPage : IDisposable
ReportDate = workDate; ReportDate = workDate;
// ensure the browser address bar contains the correct link // ensure the browser address bar contains the correct link
Navigator.NavigateTo($"/management/advisors/{UserId}/reports/{workDate}", false, true); Navigator.NavigateTo($"/management/members/{UserId}/activities/{workDate}", false, true);
// return if we are already at it // return if we are already at it
if (Working) if (Working)

View file

@ -14,8 +14,9 @@
*@ *@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Management,Supervisor")] @attribute [Authorize(Roles = "Supervisor")]
@page "/supervisor"
@page "/management"
<PageTitle>Supervisor</PageTitle> <PageTitle>Supervisor</PageTitle>
@ -39,7 +40,7 @@
<div class="row"> <div class="row">
@foreach (var user in Users) @foreach (var user in Users)
{ {
<div class="col"> <div class="col-sm-4">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<div class="card-title"> <div class="card-title">
@ -67,8 +68,8 @@
</table> </table>
</div> </div>
<div class="card-footer"> <div class="card-footer">
<a class="btn btn-info" href="/management/advisors/@user.UserId">Dagsrapporter</a> <a class="btn btn-info" href="/management/members/@user.UserId">Dagsrapporter</a>
<a class="btn btn-primary" href="#">Evalueringer</a> <a class="btn btn-primary" href="/management/members/@user.UserId/evaluations">Evalueringer</a>
</div> </div>
</div> </div>
</div> </div>

View file

@ -22,7 +22,7 @@ namespace Wonky.Client.Pages;
#pragma warning disable CS8618 #pragma warning disable CS8618
public partial class ManagerHomePage public partial class ManagerMemberListPage
{ {
// ############################################################# // #############################################################
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
@ -39,6 +39,7 @@ public partial class ManagerHomePage
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
Users = await UserRepo.GetSupervisorUsers(); Users = await UserRepo.GetSupervisorUsers();
if (Users.Any()) if (Users.Any())
{ {
Users = Users Users = Users
@ -46,6 +47,7 @@ public partial class ManagerHomePage
.ThenBy(x => x.CountryCode) .ThenBy(x => x.CountryCode)
.ToList(); .ToList();
} }
Working = false; Working = false;
} }

View file

@ -16,7 +16,8 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components @using Wonky.Client.Components
@attribute [Authorize(Roles = "Management,Supervisor")] @attribute [Authorize(Roles = "Management,Supervisor")]
@page "/management/advisors/{UserId}"
@page "/management/members/{UserId}"
<PageTitle>Rapport Arkiv @InfoAdvisor.FirstName @InfoAdvisor.LastName</PageTitle> <PageTitle>Rapport Arkiv @InfoAdvisor.FirstName @InfoAdvisor.LastName</PageTitle>
<div class="card"> <div class="card">

View file

@ -7,14 +7,14 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class ManagerAdvisorViewPage : IDisposable public partial class ManagerMemberViewPage : IDisposable
{ {
// ############################################################# // #############################################################
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IOfficeUserInfoRepository UserRepo { get; set; } [Inject] public IOfficeUserInfoRepository UserRepo { get; set; }
[Inject] public ICountryReportRepository ReportRepo { get; set; } [Inject] public ICountryReportRepository ReportRepo { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
[Inject] public ILogger<ManagerAdvisorViewPage> Logger { get; set; } [Inject] public ILogger<ManagerMemberViewPage> Logger { get; set; }
// ############################################################# // #############################################################
@ -56,8 +56,8 @@ public partial class ManagerAdvisorViewPage : IDisposable
var uri = new Uri(Navigator.Uri); var uri = new Uri(Navigator.Uri);
var url = uri.AbsoluteUri; var url = uri.AbsoluteUri;
Logger.LogDebug("ShowReport\n => {}\n =>{}", reportDate, url); Logger.LogDebug("ShowReport\n => {}\n =>{}", reportDate, url);
Logger.LogDebug("ShowReport => NavigateTo => {}",$"{url}/reports/{reportDate}"); Logger.LogDebug("ShowReport => NavigateTo => {}",$"{url}/activities/{reportDate}");
Navigator.NavigateTo($"{url}/reports/{reportDate}"); Navigator.NavigateTo($"{url}/activities/{reportDate}");
} }
public void Dispose() public void Dispose()

View file

@ -17,7 +17,9 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components @using Wonky.Client.Components
@attribute [Authorize(Roles = "Management,Supervisor")] @attribute [Authorize(Roles = "Management,Supervisor")]
@page "/management/advisors/{UserId}/reports/{ReportDate}/activities/{DocumentId}"
@page "/management/members/{UserId}/activities/{ReportDate}/visits/{DocumentId}"
<PageTitle>@ReportItem.ESalesNumber - @ReportItem.Company.Name</PageTitle> <PageTitle>@ReportItem.ESalesNumber - @ReportItem.Company.Name</PageTitle>
<table class="table table-sm table-striped d-print-table"> <table class="table table-sm table-striped d-print-table">
<thead> <thead>

View file

@ -28,7 +28,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class ManagerVisitViewPage : IDisposable public partial class ManagerMemberVisitViewPage : IDisposable
{ {
// ############################################################# // #############################################################
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }

View file

@ -1,81 +0,0 @@
@* Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
*@
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Management,Supervisor")]
@page "/management/advisors"
<PageTitle>Supervisor Sælger Oversigt</PageTitle>
<div class="row">
<div class="col">
<h3>Supervisor Sælger Oversigt</h3>
</div>
<div class="col">
<div class="text-end">
<div class="busy-signal" style="display:@(Working ? "block" : "none")">
<div class="spinner-grow text-info" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
</div>
</div>
</div>
<div class="list-group">
<div class="list-group-item">
<div class="row">
<div class="col-sm-1 mt-3">
</div>
<div class="col-sm-4 mt-3">
<div class="h4">Navn</div>
</div>
<div class="col-sm-3 mt-3">
<div class="h4">Email</div>
</div>
<div class="col-sm-2 mt-3">
<div class="h4">Telefon</div>
</div>
<div class="col-sm-2 text-end mt-1">
</div>
</div>
</div>
@if (Users.Any())
{
foreach (var user in Users)
{
<a class="list-group-item list-group-item-action" href="/management/advisors/@user.UserId">
<div class="row">
<div class="col-sm-1">
@user.CountryCode @user.SalesRep
</div>
<div class="col-sm-4">
@user.FullName
</div>
<div class="col-sm-3">
@user.Email
</div>
<div class="col-sm-2">
@user.PhoneNumber
</div>
<div class="col-sm-2">
@user.Description
</div>
</div>
</a>
}
}
</div>

View file

@ -1,57 +0,0 @@
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using Microsoft.AspNetCore.Components;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
#pragma warning disable CS8618
public partial class ManagerUserListPage : IDisposable
{
// #############################################################
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IOfficeUserInfoRepository UserRepo { get; set; }
// #############################################################
private List<UserInfoListView> Users { get; set; } = new();
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
Users = await UserRepo.GetSupervisorUsers();
if (Users.Any())
{
Users = Users
.OrderBy(x => x.FullName)
.ThenBy(x => x.CountryCode)
.ToList();
}
Working = false;
}
public void Dispose()
{
Interceptor.DisposeEvent();
}
}

View file

@ -17,6 +17,7 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office")] @attribute [Authorize(Roles = "Admin,Office")]
@page "/office/users/advisors/{CountryCode}/{UserId}/customers" @page "/office/users/advisors/{CountryCode}/{UserId}/customers"
<PageTitle>Kundeliste for @SalesRep.FirstName @SalesRep.LastName</PageTitle> <PageTitle>Kundeliste for @SalesRep.FirstName @SalesRep.LastName</PageTitle>

View file

@ -17,6 +17,7 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office,Management")] @attribute [Authorize(Roles = "Admin,Office,Management")]
@page "/office/users/advisors/{CountryCode}" @page "/office/users/advisors/{CountryCode}"
<PageTitle>Sælger Oversigt @CountryName</PageTitle> <PageTitle>Sælger Oversigt @CountryName</PageTitle>

View file

@ -17,6 +17,7 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office")] @attribute [Authorize(Roles = "Admin,Office")]
@page "/office/users/advisors/{CountryCode}/{UserId}/reports" @page "/office/users/advisors/{CountryCode}/{UserId}/reports"
<PageTitle>Rapport Arkiv @InfoAdvisor.FirstName @InfoAdvisor.LastName</PageTitle> <PageTitle>Rapport Arkiv @InfoAdvisor.FirstName @InfoAdvisor.LastName</PageTitle>

View file

@ -18,6 +18,7 @@
@using Wonky.Client.Enums @using Wonky.Client.Enums
@using Wonky.Client.Models @using Wonky.Client.Models
@attribute [Authorize(Roles = "Admin,Office,Supervisor")] @attribute [Authorize(Roles = "Admin,Office,Supervisor")]
@page "/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}" @page "/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}"
<div class="row pt-2 pb-2 mb-3 rounded-2 d-print-none bg-dark text-white"> <div class="row pt-2 pb-2 mb-3 rounded-2 d-print-none bg-dark text-white">

View file

@ -17,6 +17,7 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components @using Wonky.Client.Components
@attribute [Authorize(Roles = "Admin,Office,Warehouse")] @attribute [Authorize(Roles = "Admin,Office,Warehouse")]
@page "/office/country" @page "/office/country"
<PageTitle>Kontor</PageTitle> <PageTitle>Kontor</PageTitle>

View file

@ -17,6 +17,7 @@
@using Wonky.Client.OverlayOrderCreate @using Wonky.Client.OverlayOrderCreate
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office,Supervisor,Warehouse")] @attribute [Authorize(Roles = "Admin,Office,Supervisor,Warehouse")]
@page "/office/customers/{CountryCode}/{CompanyId}/order" @page "/office/customers/{CountryCode}/{CompanyId}/order"
<PageTitle>Telefon Ordre - @Company.Name - @Company.Account</PageTitle> <PageTitle>Telefon Ordre - @Company.Name - @Company.Account</PageTitle>

View file

@ -17,7 +17,9 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components @using Wonky.Client.Components
@attribute [Authorize(Roles = "Admin,Office,Warehouse")] @attribute [Authorize(Roles = "Admin,Office,Warehouse")]
@page "/office/customers/{CompanyId}/orders/{OrderId}" @page "/office/customers/{CompanyId}/orders/{OrderId}"
<PageTitle>@ReportItem.ESalesNumber - @ReportItem.Company.Name</PageTitle> <PageTitle>@ReportItem.ESalesNumber - @ReportItem.Company.Name</PageTitle>
<table class="table table-sm table-striped d-print-table"> <table class="table table-sm table-striped d-print-table">
<thead> <thead>

View file

@ -22,7 +22,7 @@ using Wonky.Entity.DTO;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class SysDocumentTextsViewEditPage public partial class SystemDocumentTextsViewEditPage
{ {
[Inject] public ISystemTextsRepository TextsRepo { get; set; } [Inject] public ISystemTextsRepository TextsRepo { get; set; }

View file

@ -116,17 +116,17 @@
</div> </div>
</AuthorizeView> </AuthorizeView>
<AuthorizeView Roles="Supervisor"> <AuthorizeView Roles="Management,Supervisor">
<Authorized> <Authorized>
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/supervisor"> <NavLink class="nav-link ps-2" href="/management">
<i class="bi-people pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Supervisor <i class="bi-people pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Management
</NavLink> </NavLink>
</div> </div>
</Authorized> </Authorized>
</AuthorizeView> </AuthorizeView>
<AuthorizeView Roles="Admin,Advisor,Office,Supervisor,Warehouse"> <AuthorizeView Roles="Admin,Advisor,Management,Office,Supervisor,Warehouse">
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/info"> <NavLink class="nav-link ps-2" href="/info">
<i class="bi-question pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Hjælp <i class="bi-question pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Hjælp

View file

@ -1,14 +1,14 @@
{ {
"appInfo": { "appInfo": {
"name": "Wonky Online", "name": "Wonky Online",
"version": "0.136.1", "version": "0.137.0",
"rc": true, "rc": true,
"sandBox": false, "sandBox": false,
"image": "grumpy-coder.png" "image": "grumpy-coder.png"
}, },
"Logging": { "Logging": {
"LogLevel": { "LogLevel": {
"Default": "Information", "Default": "Debug",
"System": "Information", "System": "Information",
"Microsoft": "Information" "Microsoft": "Information"
}, },
@ -46,9 +46,9 @@
"systemDocStringUrl": "api/v2/admin/doc", "systemDocStringUrl": "api/v2/admin/doc",
"systemLabels": "api/v2/admin/doc/labels", "systemLabels": "api/v2/admin/doc/labels",
"systemTexts": "api/v2/admin/doc/texts", "systemTexts": "api/v2/admin/doc/texts",
"userData": "/api/v2/client/users", "memberEvaluation": "/api/v2/app/manage/evaluations",
"userEvaluations": "/api/v2/app/manage/evaluations", "userInfoClient": "/api/v2/client/users",
"userInfo": "api/v2/auth/userinfo", "userInfoAuth": "api/v2/auth/userinfo",
"userManager": "api/v2/app/manage/users", "userManager": "api/v2/app/manage/users",
"userManagerSetPasswd": "api/v2/app/manage/passwd", "userManagerSetPasswd": "api/v2/app/manage/passwd",
"userRoles": "api/v2/app/manage/roles", "userRoles": "api/v2/app/manage/roles",

View file

@ -154,17 +154,17 @@ public class ApiConfig
/// <summary> /// <summary>
/// Endpoint for user evaluations /// Endpoint for user evaluations
/// </summary> /// </summary>
public string UserEvaluations { get; set; } = ""; public string MemberEvaluation { get; set; } = "";
/// <summary> /// <summary>
/// Application uri for user information request /// Application uri for user information request
/// </summary> /// </summary>
public string UserData { get; set; } = ""; public string UserInfoClient { get; set; } = "";
/// <summary> /// <summary>
/// Application uri for user information request /// Application uri for user information request
/// </summary> /// </summary>
public string UserInfo { get; set; } = ""; public string UserInfoAuth { get; set; } = "";
/// <summary> /// <summary>
/// Application uri for user management /// Application uri for user management

View file

@ -2,22 +2,19 @@ namespace Wonky.Entity.DTO;
public class EvaluationEditView public class EvaluationEditView
{ {
public class EvaluationViewEdit public string Content { get; set; } = "";
{
public string Content { get; set; } = ""; 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; } = "";
} }
}

View file

@ -0,0 +1,8 @@
namespace Wonky.Entity.Views;
public class ManagerView
{
public string ManagerId { get; set; } = "";
public string UserId { get; set; } = "";
public string FullName { get; set; } = "";
}

View file

@ -0,0 +1,8 @@
namespace Wonky.Entity.Views;
public class MemberView
{
public string MemberId { get; set; } = "";
public string UserId { get; set; } = "";
public string FullName { get; set; } = "";
}