built v.0.87.1
This commit is contained in:
parent
137df512e6
commit
6a246b1dc5
32 changed files with 466 additions and 223 deletions
|
@ -20,7 +20,7 @@ namespace Wonky.Client.Components;
|
|||
|
||||
public partial class OfficeReportTableComponent
|
||||
{
|
||||
[Parameter] public List<NgSalesReportListView> ReportList { get; set; } = new();
|
||||
[Parameter] public List<SalesReportListView> ReportList { get; set; } = new();
|
||||
[Parameter] public string UserId { get; set; } = "";
|
||||
[Parameter] public string CountryCode { get; set; } = "";
|
||||
}
|
|
@ -21,8 +21,8 @@ namespace Wonky.Client.Components;
|
|||
|
||||
public partial class ReportTableComponent
|
||||
{
|
||||
[Parameter] public List<NgSalesReportListView> ReportList { get; set; } = new();
|
||||
private List<NgSalesReportListView> _reports { get; set; } = new();
|
||||
[Parameter] public List<SalesReportListView> ReportList { get; set; } = new();
|
||||
private List<SalesReportListView> _reports { get; set; } = new();
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
_reports = ReportList;
|
||||
|
|
|
@ -21,10 +21,10 @@
|
|||
<EditForm EditContext="WorkDateContext">
|
||||
<div class="container-fluid">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-8 work-date fw-bold">
|
||||
<div class="col-sm-7 work-date">
|
||||
@SelectedDate.ToLongDateString()
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<div class="col-sm-5">
|
||||
<InputDate class="form-control calendar" @bind-Value="SelectedDate" @oninput="OnDateChanged"/>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -21,7 +21,7 @@ namespace Wonky.Client.HttpInterfaces;
|
|||
public interface ICrmReportHttpRepository
|
||||
{
|
||||
Task<bool> ReportExist(string workDate);
|
||||
Task<List<NgSalesReportListView>> GetReports();
|
||||
Task<List<SalesReportListView>> GetReports();
|
||||
Task<ReportView> GetReport(string workDate);
|
||||
Task<ReportInitDto> InitializeReportData(string workDate);
|
||||
Task<ApiResponseView> PostReport(string workDate, ReportDto reportDto);
|
||||
|
|
|
@ -20,6 +20,6 @@ namespace Wonky.Client.HttpInterfaces;
|
|||
|
||||
public interface IOfficeReportHttpRepository
|
||||
{
|
||||
Task<List<NgSalesReportListView>> GetReports(string userId);
|
||||
Task<List<SalesReportListView>> GetReports(string userId);
|
||||
Task<ReportView> GetReport(string userId, string workDate);
|
||||
}
|
|
@ -47,9 +47,9 @@ public class CrmReportHttpRepository :ICrmReportHttpRepository
|
|||
_apiConfig = configuration.Value;
|
||||
}
|
||||
|
||||
public async Task<List<NgSalesReportListView>> GetReports()
|
||||
public async Task<List<SalesReportListView>> GetReports()
|
||||
{
|
||||
return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.CrmReports}");
|
||||
return await _client.GetFromJsonAsync<List<SalesReportListView>>($"{_apiConfig.CrmReports}");
|
||||
}
|
||||
public async Task<bool> ReportExist(string workDate)
|
||||
{
|
||||
|
|
|
@ -46,9 +46,9 @@ public class OfficeReportHttpRepository : IOfficeReportHttpRepository
|
|||
_apiConfig = configuration.Value;
|
||||
}
|
||||
|
||||
public async Task<List<NgSalesReportListView>> GetReports(string userId)
|
||||
public async Task<List<SalesReportListView>> GetReports(string userId)
|
||||
{
|
||||
return await _client.GetFromJsonAsync<List<NgSalesReportListView>>($"{_apiConfig.OfficeReports}/{userId}");
|
||||
return await _client.GetFromJsonAsync<List<SalesReportListView>>($"{_apiConfig.OfficeReports}/{userId}");
|
||||
}
|
||||
|
||||
public async Task<ReportView> GetReport(string userId, string workDate)
|
||||
|
|
9
Wonky.Client/Models/PTarget.cs
Normal file
9
Wonky.Client/Models/PTarget.cs
Normal file
|
@ -0,0 +1,9 @@
|
|||
namespace Wonky.Client.Models;
|
||||
|
||||
public enum PTarget
|
||||
{
|
||||
None,
|
||||
All,
|
||||
Report,
|
||||
Order
|
||||
}
|
|
@ -262,23 +262,6 @@ else
|
|||
@* end draft line ------------------------------------------------- *@
|
||||
</div>
|
||||
<div class="accordion" id="crmActivity">
|
||||
@*
|
||||
$1$ Order lines #1#
|
||||
<div class="accordion-item" style="@(Activity.ActivityStatusEnum is "order" or "quote" ? "display: block" : "display:none")">
|
||||
<h2 class="accordion-header" id="catalogHeader">
|
||||
<button class="accordion-button collapsed bg-light" type="button"
|
||||
data-bs-toggle="collapse" data-bs-target="#catalogBody"
|
||||
aria-expanded="false" aria-controls="catalogBody">
|
||||
Bestilling
|
||||
</button>
|
||||
</h2>
|
||||
<div id="catalogBody" class="accordion-collapse collapse" aria-labelledby="catalogHeader" data-bs-parent="#crmActivity">
|
||||
<div class="accordion-body">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
*@
|
||||
@* Delivery address *@
|
||||
<div class="accordion-item" style="@(Activity.ActivityStatusEnum == "order" ? "display: block" : "display:none")">
|
||||
<h2 class="accordion-header" id="deliveryHeader">
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
<PaginationComponent MetaData="MetaInfo" Spread="2" SelectedPage="SetSelectedPage"/>
|
||||
</div>
|
||||
<div class="col-sm-2 text-end">
|
||||
<a class="btn btn-secondary" href="/price-catalog/print"><i class="bi-printer"></i> Udskriv</a>
|
||||
<a class="btn btn-secondary" href="/print/catalog"><i class="bi-printer"></i> Udskriv</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -27,7 +27,7 @@ public partial class CrmReportListPage : IDisposable
|
|||
[Inject] public ICrmReportHttpRepository CrmReportRepo { get; set; }
|
||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||
|
||||
private List<NgSalesReportListView> ReportList { get; set; } = new();
|
||||
private List<SalesReportListView> ReportList { get; set; } = new();
|
||||
private bool Working { get; set; } = true;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
|
|
|
@ -17,36 +17,43 @@
|
|||
|
||||
@using Wonky.Client.Components
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@using Wonky.Client.Models
|
||||
@page "/sales-reports/view/{ReportDate}"
|
||||
@attribute [Authorize(Roles = "Advisor,Admin,Supervisor")]
|
||||
|
||||
<div class="report-main">
|
||||
|
||||
<div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center d-print-none">
|
||||
<div class="col">
|
||||
<WorkDateComponent OnChangedCallback="GetReport" />
|
||||
<div class="col-sm-6">
|
||||
<WorkDateComponent OnChangedCallback="GetReport"/>
|
||||
</div>
|
||||
<div class="col col-md-3 align-content-center">
|
||||
<button class="btn btn-warning" type="button" onclick="window.print();">Print</button>
|
||||
<div class="col-sm-2 d-grid">
|
||||
<button class="btn btn-warning" @onclick="() => Print(PTarget.Report)"><i class="bi-printer"></i> Rapport</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>
|
||||
</div>
|
||||
<div class="col-sm-2 d-grid">
|
||||
<button class="btn btn-primary" type="button" onclick="window.print();"><i class="bi-printer"></i> Print</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (!string.IsNullOrWhiteSpace(_report.ReportData.DayTypeEnum))
|
||||
@if (!string.IsNullOrWhiteSpace(Report.ReportData.DayTypeEnum))
|
||||
{
|
||||
<PageTitle>@_report.ReportData.Name</PageTitle>
|
||||
<PageTitle>@Report.ReportData.Name</PageTitle>
|
||||
<div class="alert bg-light text-dark text-center align-content-center">
|
||||
<h2>@_report.ReportData.Name</h2>
|
||||
<h2>@Report.ReportData.Name</h2>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="w-75">
|
||||
<ReportSummaryComponent ReportData="_report.ReportData" />
|
||||
<ReportSummaryComponent ReportData="Report.ReportData"/>
|
||||
</div>
|
||||
<div class="w-25">
|
||||
<ReportDistanceLedgerComponent ReportData="_report.ReportData" />
|
||||
<ReportDistanceLedgerComponent ReportData="Report.ReportData"/>
|
||||
</div>
|
||||
</div>
|
||||
<OfficeActivityTableComponent ActivityList="_report.ReportItems" />
|
||||
<ReportActivityLedgerComponent ReportData="_report.ReportData" />
|
||||
<OfficeActivityTableComponent ActivityList="Report.ReportItems"/>
|
||||
<ReportActivityLedgerComponent ReportData="Report.ReportData"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -56,13 +63,9 @@
|
|||
}
|
||||
</div>
|
||||
|
||||
<div class="report-main">
|
||||
|
||||
</div>
|
||||
|
||||
@if (_items.Any())
|
||||
@if (Items.Any())
|
||||
{
|
||||
@foreach (var item in _items)
|
||||
@foreach (var item in Items)
|
||||
{
|
||||
<ReportItemComponent ReportItem="@item"></ReportItemComponent>
|
||||
}
|
||||
|
@ -71,5 +74,5 @@
|
|||
|
||||
@if (Working)
|
||||
{
|
||||
<WorkingThreeDots />
|
||||
<WorkingThreeDots/>
|
||||
}
|
|
@ -13,9 +13,11 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.HttpRepository;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Entity.DTO;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
|
@ -24,10 +26,12 @@ namespace Wonky.Client.Pages;
|
|||
public partial class CrmReportViewPage
|
||||
{
|
||||
[Parameter] public string ReportDate { get; set; }
|
||||
[Inject] public ICrmReportHttpRepository CrmReportRepo { get; set; }
|
||||
[Inject] public NavigationManager _navigator { get; set; }
|
||||
private ReportView _report { get; set; } = new();
|
||||
private List<ReportItemView> _items { get; set; } = new ();
|
||||
[Inject] public ICrmReportHttpRepository ReportRepo { get; set; }
|
||||
[Inject] public NavigationManager Navigator { get; set; }
|
||||
[Inject] public ILocalStorageService Storage { get; set; }
|
||||
private ReportView Report { get; set; } = new();
|
||||
private List<ReportItemView> Items { get; set; } = new ();
|
||||
|
||||
private bool Working { get; set; } = true;
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
|
@ -40,17 +44,27 @@ public partial class CrmReportViewPage
|
|||
Working = false;
|
||||
}
|
||||
|
||||
private async Task Print(PTarget target)
|
||||
{
|
||||
var ux = await Storage.GetItemAsync<UserInfoView>("_ux");
|
||||
if (target == PTarget.Order)
|
||||
{
|
||||
Navigator.NavigateTo($"/print/orders/{ux.CountryCode}/{ux.Id}/{ReportDate}");
|
||||
return;
|
||||
}
|
||||
Navigator.NavigateTo($"/print/report/{ux.CountryCode}/{ux.Id}/{ReportDate}");
|
||||
}
|
||||
private async Task GetReport(string workDate)
|
||||
{
|
||||
Working = true;
|
||||
_report = new ReportView();
|
||||
_items = new List<ReportItemView>();
|
||||
Report = new ReportView();
|
||||
Items = new List<ReportItemView>();
|
||||
|
||||
if(workDate != ReportDate)
|
||||
_navigator.NavigateTo($"/sales-reports/view/{workDate}");
|
||||
_report = await CrmReportRepo.GetReport(workDate);
|
||||
Navigator.NavigateTo($"/sales-reports/view/{workDate}");
|
||||
Report = await ReportRepo.GetReport(workDate);
|
||||
|
||||
_items = _report.ReportItems.Where(x => x.Lines.Any()).ToList();
|
||||
Items = Report.ReportItems.Where(x => x.Lines.Any()).ToList();
|
||||
Working = false;
|
||||
}
|
||||
}
|
|
@ -29,7 +29,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<OfficeReportTableComponent CountryCode="@CountryCode" UserId="@UserId" ReportList="@_reports" />
|
||||
<OfficeReportTableComponent CountryCode="@CountryCode" UserId="@UserId" ReportList="@ActivityReports" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
|
|
@ -26,22 +26,31 @@ public partial class OfficeReportListPage : IDisposable
|
|||
{
|
||||
[Parameter] public string UserId { get; set; } = "";
|
||||
[Parameter] public string CountryCode { get; set; } = "";
|
||||
[Inject] public IOfficeReportHttpRepository _reportRepo { get; set; }
|
||||
[Inject] public HttpInterceptorService _interceptor { get; set; }
|
||||
private List<NgSalesReportListView> _reports { get; set; }
|
||||
[Inject] public IOfficeReportHttpRepository ReportRepo { get; set; }
|
||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||
private List<SalesReportListView> ActivityReports { get; set; } = new();
|
||||
private bool Working { get; set; } = true;
|
||||
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
_interceptor.RegisterEvent();
|
||||
_interceptor.RegisterBeforeSendEvent();
|
||||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
|
||||
_reports = await _reportRepo.GetReports(UserId);
|
||||
await FetchReports();
|
||||
Working = false;
|
||||
}
|
||||
|
||||
private async Task FetchReports()
|
||||
{
|
||||
var reports = await ReportRepo.GetReports(UserId);
|
||||
if (reports.Any())
|
||||
ActivityReports = reports.OrderByDescending(x => x.ReportDate).ToList();
|
||||
}
|
||||
|
||||
/// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
|
||||
public void Dispose()
|
||||
{
|
||||
_interceptor.DisposeEvent();
|
||||
Interceptor.DisposeEvent();
|
||||
}
|
||||
}
|
|
@ -17,60 +17,66 @@
|
|||
|
||||
@using Wonky.Client.Components
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@using Wonky.Client.Models
|
||||
@page "/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}"
|
||||
@attribute [Authorize(Roles = "Admin")]
|
||||
|
||||
<div class="report-main">
|
||||
<div class="row mb-3 d-print-none">
|
||||
@* <div class="col-md-6 align-content-center"> *@
|
||||
@* <h3 class="workDate">@DateTime.Parse(ReportDate).ToLongDateString()</h3> *@
|
||||
@* </div> *@
|
||||
<div class="col col-md-6 align-content-center">
|
||||
<WorkDateComponent OnChangedCallback="FetchReport" />
|
||||
</div>
|
||||
<div class="col col-md-6 align-content-center">
|
||||
<button class="btn btn-warning" type="button" onclick="window.print();">Print</button>
|
||||
</div>
|
||||
@* todo
|
||||
option wo print only report
|
||||
*@
|
||||
<div class="row mb-3 g-1 d-print-none">
|
||||
<div class="col-sm-6">
|
||||
<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> Rapport</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>
|
||||
</div>
|
||||
<div class="col-sm-2 d-grid">
|
||||
<button class="btn btn-primary" type="button" onclick="window.print();"><i class="bi-printer"></i> Print</button>
|
||||
</div>
|
||||
@if (!string.IsNullOrWhiteSpace(Report.ReportData.DayTypeEnum))
|
||||
{
|
||||
<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" />
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col">Ingen data</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
@* todo - add flag for printing only report *@
|
||||
@if (_items.Any())
|
||||
@if (ThisTarget is PTarget.Report or PTarget.All)
|
||||
{
|
||||
@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">
|
||||
@if (!string.IsNullOrWhiteSpace(Report.ReportData.DayTypeEnum))
|
||||
{
|
||||
<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" />
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col">Ingen data</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (ThisTarget is PTarget.Order or PTarget.All)
|
||||
{
|
||||
if (Activities.Any())
|
||||
{
|
||||
foreach (var item in Activities.Where(item => item.StatusTypeEnum.ToLower() == "order" && item.ProcessStatusEnum.ToLower() == "none"))
|
||||
{
|
||||
<ReportItemComponent ReportItem="@item"></ReportItemComponent>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@if (Working)
|
||||
{
|
||||
|
|
|
@ -13,11 +13,11 @@
|
|||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||
//
|
||||
|
||||
using System.Text.Json;
|
||||
using Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Wonky.Client.HttpInterceptors;
|
||||
using Wonky.Client.HttpInterfaces;
|
||||
using Wonky.Client.HttpRepository;
|
||||
using Wonky.Client.Models;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
@ -27,46 +27,71 @@ public partial class OfficeReportViewPage : IDisposable
|
|||
/// <summary>
|
||||
/// Country code from url parameter
|
||||
/// </summary>
|
||||
[Parameter] public string CountryCode { get; set; } = "";
|
||||
[Parameter]
|
||||
public string CountryCode { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Report date from url parameter
|
||||
/// </summary>
|
||||
[Parameter] public string ReportDate { get; set; } = "";
|
||||
[Parameter]
|
||||
public string ReportDate { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// User entity Id from url parameter
|
||||
/// </summary>
|
||||
[Parameter] public string UserId { get; set; } = "";
|
||||
[Parameter]
|
||||
public string UserId { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Injected interceptor service
|
||||
/// </summary>
|
||||
[Inject] public HttpInterceptorService _interceptor { get; set; }
|
||||
[Inject]
|
||||
public HttpInterceptorService Interceptor { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Injected administrative report http repo
|
||||
/// </summary>
|
||||
[Inject] public IOfficeReportHttpRepository _reportRepo { get; set; }
|
||||
[Inject]
|
||||
public IOfficeReportHttpRepository ReportRepo { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Navigation Manager
|
||||
/// </summary>
|
||||
[Inject] public NavigationManager _navigator { get; set; }
|
||||
[Inject]
|
||||
public NavigationManager Navigator { get; set; }
|
||||
|
||||
[Inject] public ILogger<OfficeReportViewPage> Logger { get; set; }
|
||||
[Inject] public ILocalStorageService Storage { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Report to render
|
||||
/// </summary>
|
||||
private ReportView Report { get; set; } = new();
|
||||
|
||||
private List<ReportItemView> _items { get; set; } = new();
|
||||
private string _workDate { get; set; } = "";
|
||||
private PTarget ThisTarget { get; set; } = PTarget.All;
|
||||
private List<ReportItemView> Activities { get; set; } = new();
|
||||
private bool Working { get; set; } = true;
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
_interceptor.RegisterEvent();
|
||||
_interceptor.RegisterBeforeSendEvent();
|
||||
|
||||
Interceptor.RegisterEvent();
|
||||
Interceptor.RegisterBeforeSendEvent();
|
||||
await Task.Delay(100);
|
||||
await FetchReport(ReportDate);
|
||||
Working = false;
|
||||
}
|
||||
|
||||
private void Print(PTarget target)
|
||||
{
|
||||
if (target == PTarget.Order)
|
||||
{
|
||||
Navigator.NavigateTo($"/print/orders/{CountryCode}/{UserId}/{ReportDate}");
|
||||
return;
|
||||
}
|
||||
Navigator.NavigateTo($"/print/report/{CountryCode}/{UserId}/{ReportDate}");
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Work date component event handler
|
||||
/// </summary>
|
||||
|
@ -75,20 +100,20 @@ public partial class OfficeReportViewPage : IDisposable
|
|||
{
|
||||
if (workDate != ReportDate)
|
||||
{
|
||||
_navigator.NavigateTo($"/office/users/advisors/{CountryCode}/{UserId}/reports/{workDate}");
|
||||
Navigator.NavigateTo($"/office/users/advisors/{CountryCode}/{UserId}/reports/{workDate}");
|
||||
return;
|
||||
}
|
||||
|
||||
Working = true;
|
||||
Report = new ReportView();
|
||||
_items = new List<ReportItemView>();
|
||||
Activities = new List<ReportItemView>();
|
||||
|
||||
Report = await FetchUserReport(UserId, workDate);
|
||||
//_items = Report.ReportItems.Where(x => x.OrderAmount > 0).ToList();
|
||||
_items = Report.ReportItems.Where(x => x.Lines.Any()).ToList();
|
||||
Activities = Report.ReportItems.Where(x => x.Lines.Any()).ToList();
|
||||
await Storage.SetItemAsync($"{UserId}-{ReportDate}", Report);
|
||||
Working = false;
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get report for user with entity Id for work date
|
||||
/// </summary>
|
||||
|
@ -98,13 +123,13 @@ public partial class OfficeReportViewPage : IDisposable
|
|||
private async Task<ReportView> FetchUserReport(string userId, string workDate)
|
||||
{
|
||||
Working = true;
|
||||
var x =Report = await _reportRepo.GetReport(userId, workDate);
|
||||
var x = Report = await ReportRepo.GetReport(userId, workDate);
|
||||
Working = false;
|
||||
return x;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_interceptor.DisposeEvent();
|
||||
Interceptor.DisposeEvent();
|
||||
}
|
||||
}
|
|
@ -15,7 +15,7 @@
|
|||
//
|
||||
*@
|
||||
|
||||
@page "/price-catalog/print"
|
||||
@page "/print/catalog"
|
||||
@using Wonky.Client.Components
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
|
|
@ -29,7 +29,7 @@ using Wonky.Entity.Views;
|
|||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
public partial class CatalogPrintPage : IDisposable
|
||||
public partial class PrintCatalogPage : IDisposable
|
||||
{
|
||||
[Inject] public ILocalStorageService Storage { get; set; }
|
||||
[Inject] public ICatalogHttpRepository ItemRepo { get; set; }
|
32
Wonky.Client/Pages/PrintOrdersPage.razor
Normal file
32
Wonky.Client/Pages/PrintOrdersPage.razor
Normal file
|
@ -0,0 +1,32 @@
|
|||
@*
|
||||
// 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 Wonky.Client.Components
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@page "/print/orders/{CountryCode}/{UserId}/{ReportDate}"
|
||||
@attribute [Authorize(Roles = "Admin,Advisor")]
|
||||
|
||||
<div class="row mb-3 d-print-none">
|
||||
<div class="col-sm-12 d-grid">
|
||||
<button class="btn btn-primary" type="button" @onclick="Print">Print</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@foreach (var item in Items.Where(item => item.StatusTypeEnum.ToLower() == "order" && item.ProcessStatusEnum.ToLower() == "none"))
|
||||
{
|
||||
<ReportItemComponent ReportItem="@item"></ReportItemComponent>
|
||||
}
|
64
Wonky.Client/Pages/PrintOrdersPage.razor.cs
Normal file
64
Wonky.Client/Pages/PrintOrdersPage.razor.cs
Normal file
|
@ -0,0 +1,64 @@
|
|||
// 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 Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
public partial class PrintOrdersPage
|
||||
{
|
||||
[Parameter] public string CountryCode { get; set; } = "";
|
||||
[Parameter] public string UserId { get; set; } = "";
|
||||
[Parameter] public string ReportDate { get; set; } = "";
|
||||
[Inject] public ILocalStorageService Storage { get; set; }
|
||||
[Inject] public NavigationManager Navigator { get; set; }
|
||||
[Inject] private IJSRuntime JSRuntime { get; set; }
|
||||
[Inject] public ILogger<PrintOrdersPage> Logger { get; set; }
|
||||
private ReportView Report { get; set; } = new();
|
||||
private List<ReportItemView> Items { get; set; } = new();
|
||||
private IJSObjectReference JsModule { get; set; }
|
||||
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
if (firstRender)
|
||||
{
|
||||
JsModule = await JSRuntime
|
||||
.InvokeAsync<IJSObjectReference>("import", "/scripts/print-invoke.js");
|
||||
}
|
||||
}
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
Report = await Storage.GetItemAsync<ReportView>($"{UserId}-{ReportDate}");
|
||||
Items = Report.ReportItems;
|
||||
}
|
||||
|
||||
private async Task Print()
|
||||
{
|
||||
await JsModule.InvokeVoidAsync("printInvoke");
|
||||
|
||||
Navigator.NavigateTo($"/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}");
|
||||
}
|
||||
|
||||
/*
|
||||
* await Task.Delay(1000);
|
||||
* JS.InvokeVoidAsync("invokePrint");
|
||||
* InvokeAsync(() => StateHasChanged());
|
||||
*/
|
||||
}
|
46
Wonky.Client/Pages/PrintReportPage.razor
Normal file
46
Wonky.Client/Pages/PrintReportPage.razor
Normal file
|
@ -0,0 +1,46 @@
|
|||
@*
|
||||
// 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 Wonky.Client.Components
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@page "/print/report/{CountryCode}/{UserId}/{ReportDate}"
|
||||
@attribute [Authorize(Roles = "Admin,Advisor")]
|
||||
|
||||
<div class="row mb-3 d-print-none">
|
||||
<div class="col-sm-12 d-grid">
|
||||
<button class="btn btn-primary" type="button" @onclick="Print">Print</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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>
|
63
Wonky.Client/Pages/PrintReportPage.razor.cs
Normal file
63
Wonky.Client/Pages/PrintReportPage.razor.cs
Normal file
|
@ -0,0 +1,63 @@
|
|||
// 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 Blazored.LocalStorage;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using Wonky.Entity.Views;
|
||||
|
||||
namespace Wonky.Client.Pages;
|
||||
|
||||
public partial class PrintReportPage
|
||||
{
|
||||
[Parameter] public string CountryCode { get; set; } = "";
|
||||
[Parameter] public string UserId { get; set; } = "";
|
||||
[Parameter] public string ReportDate { get; set; } = "";
|
||||
[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; }
|
||||
private ReportView Report { get; set; } = new();
|
||||
private IJSObjectReference JsModule { get; set; }
|
||||
private bool Printed { get; set; }
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
Report = await Storage.GetItemAsync<ReportView>($"{UserId}-{ReportDate}");
|
||||
}
|
||||
|
||||
protected override async Task OnAfterRenderAsync(bool firstRender)
|
||||
{
|
||||
if (firstRender)
|
||||
{
|
||||
JsModule = await JSRuntime
|
||||
.InvokeAsync<IJSObjectReference>("import", "/scripts/print-invoke.js");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task Print()
|
||||
{
|
||||
if(!Printed)
|
||||
Printed = true;
|
||||
await JsModule.InvokeVoidAsync("printInvoke");
|
||||
Navigator.NavigateTo($"/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}");
|
||||
}
|
||||
|
||||
/*
|
||||
* await Task.Delay(1000);
|
||||
* JS.InvokeVoidAsync("invokePrint");
|
||||
* InvokeAsync(() => StateHasChanged());
|
||||
*/
|
||||
}
|
|
@ -32,6 +32,6 @@
|
|||
<div class="content d-none d-print-block">
|
||||
@Body
|
||||
</div>
|
||||
<BlazoredToasts Position="ToastPosition.BottomCenter" Timeout="5"/>
|
||||
<BlazoredToasts Position="ToastPosition.BottomRight" Timeout="10" />
|
||||
</main>
|
||||
</div>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"appInfo": {
|
||||
"name": "Wonky Client",
|
||||
"version": "0.86.1",
|
||||
"version": "0.87.1",
|
||||
"rc": true,
|
||||
"sandBox": false,
|
||||
"image": "grumpy-coder.png"
|
||||
|
|
|
@ -152,55 +152,3 @@ footer.version {
|
|||
right: 25px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* printer classes */
|
||||
@media print {
|
||||
@page {
|
||||
size: a4;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Montserrat';
|
||||
src: url('https://fonts.googleapis.com/css2?family=Montserrat&display=swap');
|
||||
}
|
||||
html, body {
|
||||
height: 290mm;
|
||||
width: 210mm;
|
||||
-webkit-print-color-adjust: exact;
|
||||
color-adjust: exact;
|
||||
}
|
||||
.report-main {
|
||||
font-size: 10px;
|
||||
break-before: page;
|
||||
break-after: page;
|
||||
page-break-after: always;
|
||||
height: initial;
|
||||
border: initial;
|
||||
border-radius: initial;
|
||||
box-shadow: initial;
|
||||
margin: 0;
|
||||
width: initial;
|
||||
-webkit-print-color-adjust: exact;
|
||||
color-adjust: exact;
|
||||
}
|
||||
.report-visit {
|
||||
page-break-before: always;
|
||||
break-after: page;
|
||||
break-before: page;
|
||||
break-inside: avoid-page;
|
||||
height: initial;
|
||||
border: initial;
|
||||
border-radius: initial;
|
||||
box-shadow: initial;
|
||||
margin: 0;
|
||||
width: initial;
|
||||
-webkit-print-color-adjust: exact;
|
||||
color-adjust: exact;
|
||||
}
|
||||
.distance-ledger {}
|
||||
.report-ledger {
|
||||
page-break-inside: avoid;
|
||||
page-break-after: always;
|
||||
break-after: recto;
|
||||
min-height: 300px;
|
||||
}
|
||||
}
|
53
Wonky.Client/wwwroot/css/print.css
Normal file
53
Wonky.Client/wwwroot/css/print.css
Normal file
|
@ -0,0 +1,53 @@
|
|||
/* printer classes */
|
||||
@media print {
|
||||
@page {
|
||||
size: a4;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Montserrat';
|
||||
src: url('https://fonts.googleapis.com/css2?family=Montserrat&display=swap');
|
||||
}
|
||||
html, body {
|
||||
height: 290mm;
|
||||
width: 210mm;
|
||||
-webkit-print-color-adjust: exact;
|
||||
color-adjust: exact;
|
||||
}
|
||||
.report-main {
|
||||
font-size: 10px;
|
||||
break-before: page;
|
||||
break-after: page;
|
||||
page-break-after: always;
|
||||
height: initial;
|
||||
border: initial;
|
||||
border-radius: initial;
|
||||
box-shadow: initial;
|
||||
margin: 0;
|
||||
width: initial;
|
||||
-webkit-print-color-adjust: exact;
|
||||
color-adjust: exact;
|
||||
}
|
||||
.report-visit {
|
||||
page-break-before: always;
|
||||
page-break-after: always;
|
||||
break-after: page;
|
||||
break-before: page;
|
||||
break-inside: avoid-page;
|
||||
height: initial;
|
||||
border: initial;
|
||||
border-radius: initial;
|
||||
box-shadow: initial;
|
||||
min-height: 250mm;
|
||||
margin: 0;
|
||||
width: initial;
|
||||
-webkit-print-color-adjust: exact;
|
||||
color-adjust: exact;
|
||||
}
|
||||
.distance-ledger {}
|
||||
.report-ledger {
|
||||
page-break-inside: avoid;
|
||||
page-break-after: always;
|
||||
break-after: recto;
|
||||
min-height: 300px;
|
||||
}
|
||||
}
|
|
@ -14,12 +14,13 @@
|
|||
<meta name="application-TileColor" content="#ffaa00" />
|
||||
<meta name="theme-color" content="#000" />
|
||||
<base href="/" />
|
||||
<link href="bootstrap/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<link href="bootstrap/css/bootstrap-icons.css" rel="stylesheet" />
|
||||
<link href="flag-icons/flag-icons.css" rel="stylesheet" />
|
||||
<link href="css/app-v0.38.css" rel="stylesheet" />
|
||||
<link href="Wonky.Client.styles.css" rel="stylesheet" />
|
||||
<link href="_content/Blazored.Toast/blazored-toast.min.css" rel="stylesheet" />
|
||||
<link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
|
||||
<link href="/bootstrap/css/bootstrap-icons.css" rel="stylesheet" />
|
||||
<link href="/flag-icons/flag-icons.css" rel="stylesheet" />
|
||||
<link href="/css/app.css" rel="stylesheet" />
|
||||
<link href="/css/print.css" rel="stylesheet" />
|
||||
<link href="/Wonky.Client.styles.css" rel="stylesheet" />
|
||||
<link href="/_content/Blazored.Toast/blazored-toast.min.css" rel="stylesheet" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="app">
|
||||
|
@ -29,7 +30,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<script src="/bootstrap/js/bootstrap.bundle.js"></script>
|
||||
<!--<script src="/scripts/bsTooltip.js"></script>-->
|
||||
<script src="_framework/blazor.webassembly.js"></script>
|
||||
<script src="/_framework/blazor.webassembly.js"></script>
|
||||
<script src="/scripts/print-invoke.js" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
|
||||
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
|
||||
return new bootstrap.Tooltip(tooltipTriggerEl)
|
||||
})
|
7
Wonky.Client/wwwroot/scripts/print-invoke.js
Normal file
7
Wonky.Client/wwwroot/scripts/print-invoke.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
export function printInvoke() {
|
||||
window.print();
|
||||
}
|
||||
|
||||
document.addEventListener("load", function() {
|
||||
window.print();
|
||||
});
|
|
@ -1,16 +0,0 @@
|
|||
(document).ready(function(){
|
||||
$(window).scroll(function () {
|
||||
if ($(this).scrollTop() > 50) {
|
||||
$('#back-to-top').fadeIn();
|
||||
} else {
|
||||
$('#back-to-top').fadeOut();
|
||||
}
|
||||
});
|
||||
// scroll body to 0px on click
|
||||
$('#back-to-top').click(function () {
|
||||
$('body,html').animate({
|
||||
scrollTop: 0
|
||||
}, 400);
|
||||
return false;
|
||||
});
|
||||
});
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
namespace Wonky.Entity.Views;
|
||||
|
||||
public class NgSalesReportListView
|
||||
public class SalesReportListView
|
||||
{
|
||||
public string ReportId { get; set; } = "";
|
||||
public string UserId { get; set; } = "";
|
Loading…
Reference in a new issue