This commit is contained in:
Frede Hundewadt 2022-12-29 16:18:26 +01:00
parent b88a5a37a5
commit 76ea8d8fba
17 changed files with 164 additions and 142 deletions

View file

@ -59,13 +59,3 @@
</div>
</div>
</button>
@code {
[Parameter] public SalesReportListView Report { get; set; } = new();
[Parameter] public EventCallback<string> OnShowReport { get; set; }
private void ShowThisReport()
{
OnShowReport.InvokeAsync(Report.ReportDate);
}
}

View file

@ -0,0 +1,15 @@
using Microsoft.AspNetCore.Components;
using Wonky.Entity.Views;
namespace Wonky.Client.Components;
public partial class ReportListItemComponent
{
[Parameter] public SalesReportListView Report { get; set; } = new();
[Parameter] public EventCallback<string> OnShowReport { get; set; }
private void ShowThisReport()
{
OnShowReport.InvokeAsync(Report.ReportDate);
}
}

View file

@ -40,50 +40,6 @@
@foreach (var report in ReportList)
{
<ReportListItemComponent Report="report" OnShowReport="ShowThisReport" />
@*
<a class="list-group-item list-group-item-action" href="/sales-reports/view/@report.ReportDate">
<div class="row">
<div class="col">
@report.ReportDate
</div>
<div class="col">
@{
switch (report.DayTypeEnum)
{
case "Sales":
<span>Salgsdag</span>
break;
case "SickLeave":
<span>Sygdom</span>
break;
case "Office":
<span>Kontordag</span>
break;
case "Meeting":
<span>Salgsmøde</span>
break;
case "Leave":
<span>Ferie</span>
break;
case "Supervisor":
<span>Medkørende Supervisor</span>
break;
}
}
</div>
<div class="col">
@(report.DayTypeEnum == "Sales" ? report.FromDateTime.Split(" ")[1] : report.FromDateTime.Split(" ")[0])
</div>
<div class="col">
@(report.DayTypeEnum == "Sales" ? report.ToDateTime.Split(" ")[1] : report.ToDateTime.Split(" ")[0])
</div>
<div class="col text-end">
@report.Turnover
</div>
</div>
</a>
*@
}
}
else

View file

@ -23,7 +23,9 @@ public partial class ReportTableComponent
{
[Parameter] public List<SalesReportListView> ReportList { get; set; } = new();
[Parameter] public EventCallback<string> OnShowReport { get; set; }
private List<SalesReportListView> Reports { get; set; } = new();
protected override void OnParametersSet()
{
Reports = ReportList;
@ -33,5 +35,4 @@ public partial class ReportTableComponent
{
OnShowReport.InvokeAsync(reportDate);
}
}

View file

@ -4,6 +4,6 @@ public enum PTarget
{
None,
All,
Report,
Order
FrontPage,
OrderPage
}

View file

@ -18,14 +18,13 @@
@using Wonky.Client.Components
@page "/sales-reports"
<div class="alert text-black border border-1">
<div class="row bg-dark text-white rounded-2">
<div class="col">
<h3>Rapport Arkiv</h3>
<h3>Rapport Arkiv --- crmreportlistpage</h3>
</div>
</div>
<ReportTableComponent ReportList="ReportList" />
<ReportTableComponent ReportList="ReportList" OnShowReport="ShowThisReport" />
@if (Working)
{

View file

@ -26,6 +26,8 @@ public partial class CrmReportListPage : IDisposable
{
[Inject] public ICrmReportHttpRepository ReportRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
[Inject] public ILogger<CrmReportListPage> Logger { get; set; }
private List<SalesReportListView> ReportList { get; set; } = new();
private bool Working { get; set; } = true;
@ -34,11 +36,20 @@ public partial class CrmReportListPage : IDisposable
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
await Task.Delay(1000);
ReportList = await ReportRepo.GetReports();
if (ReportList.Any())
ReportList = ReportList.OrderByDescending(x => x.ReportDate).ToList();
Working = false;
}
private void ShowThisReport(string reportDate)
{
Logger.LogDebug("crmreportlistpage => showthisreport <= {}", reportDate);
Navigator.NavigateTo($"/sales-reports/view/{reportDate}");
}
public void Dispose()
{
Interceptor.DisposeEvent();

View file

@ -26,10 +26,10 @@
<WorkDateComponent OnChangedCallback="FetchReport"/>
</div>
<div class="col-sm-2 d-grid">
<button class="btn btn-warning" @onclick="() => Print(PTarget.Report)"><i class="bi-printer"></i> Forside</button>
<button class="btn btn-warning" @onclick="() => Print(PTarget.FrontPage)"><i class="bi-printer"></i> Forside</button>
</div>
<div class="col-sm-2 d-grid">
<button class="btn btn-success" @onclick="() => Print(PTarget.Order)"><i class="bi-printer"></i> Ordrer</button>
<button class="btn btn-success" @onclick="() => Print(PTarget.OrderPage)"><i class="bi-printer"></i> Ordrer</button>
</div>
<div class="col-sm-2 d-grid">
<button class="btn btn-primary" type="button" onclick="window.print();"><i class="bi-printer"></i> Rapport</button>

View file

@ -18,6 +18,7 @@ using Microsoft.AspNetCore.Components;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpInterfaces;
using Wonky.Client.Models;
using Wonky.Client.Services;
using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
@ -30,30 +31,40 @@ public partial class CrmReportViewPage : IDisposable
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public ILogger<CrmReportViewPage> Logger { get; set; }
[Inject] public UserProfileService ProfileService { get; set; }
private UserPref Prefs { get; set; } = new();
private ReportView Report { get; set; } = new();
private List<ReportItemView> Activities { get; set; } = new ();
private bool Working { get; set; }
private UserInfoView UserInfo { get; set; } = new();
private string ReturnUrl = "";
protected override async Task OnInitializedAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
Interceptor.RegisterBeforeSendEvent();
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
ProfileService.OnChange += ProfileServiceOnOnChange;
await ProfileService.SetWorkDate(DateTime.Parse(ReportDate));
if(!string.IsNullOrWhiteSpace(ReportDate))
await FetchReport(ReportDate);
}
private void Print(PTarget target)
{
var returnUrl = new Uri(Navigator.Uri).AbsolutePath;
ReturnUrl = new Uri(Navigator.Uri).AbsolutePath;
switch (target)
{
case PTarget.Order:
Navigator.NavigateTo($"/print/orders/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={returnUrl}");
case PTarget.OrderPage:
Navigator.NavigateTo($"/print/orders/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
break;
case PTarget.Report:
Navigator.NavigateTo($"/print/report/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={returnUrl}");
case PTarget.FrontPage:
Navigator.NavigateTo($"/print/report/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
break;
case PTarget.None:
break;
@ -69,8 +80,13 @@ public partial class CrmReportViewPage : IDisposable
// remove busy signal if report is empty
if (string.IsNullOrWhiteSpace(Report.ReportData.ReportDate))
{
Working = false;
ReportDate = workDate;
}
// ensure the browser address bar contains the correct link
Navigator.NavigateTo($"/sales-reports/view/{workDate}", false, true);
// return if we are already at it
if (Working)
{
@ -80,24 +96,36 @@ public partial class CrmReportViewPage : IDisposable
// reset variables
Report = new ReportView();
Activities = new List<ReportItemView>();
// set busy signal
Working = true;
// fetch report
Report = await ReportRepo.GetReport(workDate);
// extract activities
Activities = Report.ReportItems.Where(x => x.Lines.Any()).ToList();
// store the report locally
if (!string.IsNullOrWhiteSpace(Report.ReportData.ReportDate))
{
await Storage.SetItemAsync($"{UserInfo.Id}-{Report.ReportData.ReportDate}", Report);
}
// remove busy signal
Working = false;
}
private void ProfileServiceOnOnChange(UserPref userPref)
{
Prefs = userPref;
ReportDate = Prefs.WorkDate;
StateHasChanged();
}
public void Dispose()
{
ProfileService.OnChange -= ProfileServiceOnOnChange;
Interceptor.DisposeEvent();
}
}

View file

@ -41,9 +41,11 @@ public partial class OfficeReportListPage : IDisposable
Interceptor.RegisterBeforeSendEvent();
UserInfo = await UserRepo.GetAdvisorInfo(UserId);
var reports = await ReportRepo.GetReports(UserId);
if (reports.Any())
ActivityReports = reports.OrderByDescending(x => x.ReportDate).ToList();
Working = false;
}

View file

@ -26,10 +26,10 @@
<WorkDateComponent OnChangedCallback="FetchUserReport"/>
</div>
<div class="col-sm-2 d-grid">
<button class="btn btn-warning" @onclick="() => Print(PTarget.Report)"><i class="bi-printer"></i> Forside</button>
<button class="btn btn-warning" @onclick="() => Print(PTarget.FrontPage)"><i class="bi-printer"></i> Forside</button>
</div>
<div class="col-sm-2 d-grid">
<button class="btn btn-success" @onclick="() => Print(PTarget.Order)"><i class="bi-printer"></i> Ordrer</button>
<button class="btn btn-success" @onclick="() => Print(PTarget.OrderPage)"><i class="bi-printer"></i> Ordrer</button>
</div>
<div class="col-sm-2 d-grid">
<button class="btn btn-primary" type="button" onclick="window.print();"><i class="bi-printer"></i> Rapport</button>

View file

@ -83,33 +83,28 @@ public partial class OfficeReportViewPage : IDisposable
private bool Working { get; set; } = true;
private UserPref Prefs = new();
private string ReturnUrl = "";
private string PrintUrl = "";
protected override async Task OnParametersSetAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
await ProfileService.SetWorkDate(DateTime.Parse(ReportDate));
ProfileService.OnChange += ProfileServiceOnOnChange;
//ReturnUrl = new Uri(Navigator.Uri).AbsolutePath.Replace($"/{ReportDate}", "");
ReturnUrl = new Uri(Navigator.Uri).AbsolutePath;
Logger.LogDebug("Print() => returnUrl <= {}", ReturnUrl);
await ProfileService.SetWorkDate(DateTime.Parse(ReportDate));
await FetchUserReport(ReportDate);
}
private void Print(PTarget target)
{
Logger.LogDebug("Print() => returnUrl <= {}", ReturnUrl);
ReturnUrl = new Uri(Navigator.Uri).AbsolutePath;
switch (target)
{
case PTarget.Order:
case PTarget.OrderPage:
Navigator.NavigateTo($"/print/orders/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}");
break;
case PTarget.Report:
case PTarget.FrontPage:
Navigator.NavigateTo($"/print/report/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}");
break;
case PTarget.None:
@ -132,34 +127,48 @@ public partial class OfficeReportViewPage : IDisposable
{
Working = false;
}
ReportDate = workDate;
// ensure the browser address bar contains the correct link
Navigator.NavigateTo($"/office/users/advisors/{CountryCode}/{UserId}/reports/{workDate}", false, true);
// return if we are already at it
if (Working)
{
return;
}
// reset variables
Report = new ReportView();
Activities = new List<ReportItemView>();
// set busy signal
Working = true;
// fetch
// fetch report
Report = await ReportRepo.GetReport(UserId, workDate);
// extract activities
Activities = Report.ReportItems.Where(x => x.Lines.Any()).ToList();
// store locally
if (!string.IsNullOrWhiteSpace(Report.ReportData.ReportDate))
{
await Storage.SetItemAsync($"{UserId}-{workDate}", Report);
}
// remove busy signal
Working = false;
}
private void ProfileServiceOnOnChange(UserPref userPref)
{
Logger.LogDebug("OfficeReportViewPage => ProfileServiceOnOnChange");
Prefs = userPref;
Logger.LogDebug("OfficeReportViewPage => ProfileServiceOnOnChange => Prefs.WorkDate <= {}", Prefs.WorkDate);
ReportDate = Prefs.WorkDate;
StateHasChanged();
}

View file

@ -17,7 +17,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@page "/print/orders/{CountryCode}/{UserId}/{ReportDate}"
@page "/print/report/{CountryCode}/{UserId}/{ReportDate}"
@attribute [Authorize(Roles = "Admin,Advisor")]
<div class="row mb-3 d-print-none">
@ -29,7 +29,21 @@
</div>
</div>
@foreach (var item in Items.Where(item => item.StatusTypeEnum.ToLower() == "order" && item.ProcessStatusEnum.ToLower() == "none"))
{
<ReportItemComponent ReportItem="@item"></ReportItemComponent>
}
<div class="report-main d-print-grid">
<PageTitle>@Report.ReportData.Name</PageTitle>
<div class="row">
<div class="col text-center align-content-center">
<h3>@Report.ReportData.Name</h3>
</div>
</div>
<div class="row">
<div class="w-75">
<ReportSummaryComponent ReportData="Report.ReportData"/>
</div>
<div class="w-25">
<ReportDistanceLedgerComponent ReportData="Report.ReportData"/>
</div>
</div>
<OfficeActivityTableComponent ActivityList="Report.ReportItems"/>
<ReportActivityLedgerComponent ReportData="Report.ReportData"/>
</div>

View file

@ -13,6 +13,7 @@
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using System.Runtime.CompilerServices;
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
@ -21,7 +22,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
public partial class PrintFrontPage
public partial class PrintFrontPage
{
[Parameter] public string CountryCode { get; set; } = "";
[Parameter] public string UserId { get; set; } = "";
@ -31,9 +32,18 @@ public partial class PrintFrontPage
[Inject] private IJSRuntime JSRuntime { get; set; }
[Inject] public ILogger<PrintFrontPage> Logger { get; set; }
private ReportView Report { get; set; } = new();
private List<ReportItemView> Items { get; set; } = new();
private IJSObjectReference JsModule { get; set; }
private string ReturnUrl { get; set; } = "";
protected override async Task OnInitializedAsync()
{
var uri = new Uri(Navigator.Uri);
var query = Utils.ParseQuery(uri.Query[1..]);
ReturnUrl = string.IsNullOrWhiteSpace(query["returnUrl"]) ? "/" : $"{query["returnUrl"]}" ;
Report = await Storage.GetItemAsync<ReportView>($"{UserId}-{ReportDate}");
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
@ -42,27 +52,17 @@ public partial class PrintFrontPage
.InvokeAsync<IJSObjectReference>("import", "/scripts/print-invoke.js");
}
}
protected override async Task OnInitializedAsync()
{
var uri = new Uri(Navigator.Uri);
var query = Utils.ParseQuery(uri.Query[1..]);
ReturnUrl = string.IsNullOrWhiteSpace(query["returnUrl"]) ? "/" : $"{query["returnUrl"]}/{ReportDate}";
Report = await Storage.GetItemAsync<ReportView>($"{UserId}-{ReportDate}");
Items = Report.ReportItems;
}
private async Task Print()
{
await JsModule.InvokeVoidAsync("printInvoke");
Navigator.NavigateTo(ReturnUrl);
Navigator.NavigateTo(ReturnUrl);
}
/*
* await Task.Delay(1000);
* JS.InvokeVoidAsync("invokePrint");
* InvokeAsync(() => StateHasChanged());
*/
*/
}

View file

@ -17,7 +17,7 @@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@page "/print/report/{CountryCode}/{UserId}/{ReportDate}"
@page "/print/orders/{CountryCode}/{UserId}/{ReportDate}"
@attribute [Authorize(Roles = "Admin,Advisor")]
<div class="row mb-3 d-print-none">
@ -29,21 +29,18 @@
</div>
</div>
<div class="report-main d-print-grid">
<PageTitle>@Report.ReportData.Name</PageTitle>
@if (Items.Any(item => item.StatusTypeEnum.ToLower() == "order" && item.ProcessStatusEnum.ToLower() == "none"))
{
foreach (var item in Items.Where(item => item.StatusTypeEnum.ToLower() == "order" && item.ProcessStatusEnum.ToLower() == "none"))
{
<ReportItemComponent ReportItem="@item"></ReportItemComponent>
}
}
else
{
<div class="row">
<div class="col text-center align-content-center">
<h3>@Report.ReportData.Name</h3>
<div class="col">
<h3 class="text-center fw-bold">Der er ingen ordrer til udskrivning</h3>
</div>
</div>
<div class="row">
<div class="w-75">
<ReportSummaryComponent ReportData="Report.ReportData"/>
</div>
<div class="w-25">
<ReportDistanceLedgerComponent ReportData="Report.ReportData"/>
</div>
</div>
<OfficeActivityTableComponent ActivityList="Report.ReportItems"/>
<ReportActivityLedgerComponent ReportData="Report.ReportData"/>
</div>
}

View file

@ -13,7 +13,6 @@
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using System.Runtime.CompilerServices;
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
@ -22,7 +21,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
public partial class PrintReportPage
public partial class PrintOrderPage
{
[Parameter] public string CountryCode { get; set; } = "";
[Parameter] public string UserId { get; set; } = "";
@ -30,20 +29,11 @@ public partial class PrintReportPage
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
[Inject] private IJSRuntime JSRuntime { get; set; }
[Inject] public ILogger<PrintReportPage> Logger { get; set; }
[Inject] public ILogger<PrintOrderPage> Logger { get; set; }
private ReportView Report { get; set; } = new();
private List<ReportItemView> Items { get; set; } = new();
private IJSObjectReference JsModule { get; set; }
private string ReturnUrl { get; set; } = "";
protected override async Task OnInitializedAsync()
{
var uri = new Uri(Navigator.Uri);
var query = Utils.ParseQuery(uri.Query[1..]);
ReturnUrl = string.IsNullOrWhiteSpace(query["returnUrl"]) ? "/" : $"{query["returnUrl"]}/{ReportDate}" ;
Report = await Storage.GetItemAsync<ReportView>($"{UserId}-{ReportDate}");
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
@ -52,17 +42,27 @@ public partial class PrintReportPage
.InvokeAsync<IJSObjectReference>("import", "/scripts/print-invoke.js");
}
}
protected override async Task OnInitializedAsync()
{
var uri = new Uri(Navigator.Uri);
var query = Utils.ParseQuery(uri.Query[1..]);
ReturnUrl = string.IsNullOrWhiteSpace(query["returnUrl"]) ? "/" : $"{query["returnUrl"]}";
Report = await Storage.GetItemAsync<ReportView>($"{UserId}-{ReportDate}");
Items = Report.ReportItems;
}
private async Task Print()
{
await JsModule.InvokeVoidAsync("printInvoke");
Navigator.NavigateTo(ReturnUrl);
}
Navigator.NavigateTo(ReturnUrl);
}
/*
* await Task.Delay(1000);
* JS.InvokeVoidAsync("invokePrint");
* InvokeAsync(() => StateHasChanged());
*/
*/
}

View file

@ -1,7 +1,7 @@
{
"appInfo": {
"name": "Wonky Client",
"version": "0.87.7",
"version": "0.90",
"rc": true,
"sandBox": false,
"image": "grumpy-coder.png"