internal refactor - added catalog print page

This commit is contained in:
Frede Hundewadt 2022-12-03 12:37:45 +01:00
parent 2cc9d55220
commit e7b91dec1f
113 changed files with 1013 additions and 672 deletions

View file

@ -8,19 +8,19 @@
@code {
[Inject] public PreferenceService UserPrefService { get; set; }
[Inject] public UserPrefService PrefService { get; set; }
private int KmMorning { get; set; }
private Preferences Preferences { get; set; } = new();
private UserPref Prefs { get; set; } = new();
protected override async Task OnInitializedAsync()
{
Preferences = await UserPrefService.GetPreferences();
KmMorning = Preferences.KmMorning;
Prefs = await PrefService.GetPreferences();
KmMorning = Prefs.KmMorning;
}
private async Task OnKmChanged()
{
await UserPrefService.SetKmMorning(KmMorning);
await PrefService.SetKmMorning(KmMorning);
}
}

View file

@ -16,7 +16,7 @@
//
*@
@if (Activities.Any())
@if (ActivityList.Any())
{
<table class="table table-bordered d-print-table table-striped">
<thead>
@ -35,7 +35,7 @@
</tr>
</thead>
<tbody>
@foreach (var activity in Activities)
@foreach (var activity in ActivityList)
{
<tr>
<td class="align-middle"><a class="btn btn-outline-info text-black d-block" href="/companies/@activity.Company.CompanyId/orders/@activity.ActivityId">@activity.Company.Name</a></td>
@ -68,7 +68,7 @@
<tr>
<td colspan="5" class="bg-dark"></td>
<td class="align-middle text-center">Total</td>
<td class="align-middle text-end">@Activities.Where(x => x.StatusTypeEnum == "Order").Sum(x => x.OrderAmount)</td>
<td class="align-middle text-end">@ActivityList.Where(x => x.StatusTypeEnum == "Order").Sum(x => x.OrderAmount)</td>
<td colspan="4" class="bg-dark"></td>
</tr>
</tbody>

View file

@ -20,7 +20,7 @@ namespace Wonky.Client.Components;
public partial class AdvisorActivityTableComponent
{
[Parameter] public List<ReportItemView> Activities { get; set; }
[Parameter] public List<ReportItemView> ActivityList { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
// private void ShowOrder(string companyId, string orderId)

View file

@ -18,7 +18,9 @@
@using Wonky.Client.Components;
@using Wonky.Client.Helpers;
<table class="table table-striped">
@if (CompanyList.Any())
{
<table class="table table-striped">
<thead>
<tr>
<th scope="col">BS</th>
@ -31,7 +33,7 @@
</tr>
</thead>
<tbody>
@foreach (var company in Companies)
@foreach (var company in CompanyList)
{
<tr @onclick="() => { ViewCustomer(company.CompanyId); }" style="cursor: pointer">
<td class="state align-middle">
@ -61,8 +63,11 @@
</td>
</tr>
}
</tbody>
</table>
<InformationModal BodyMessage="@_info"/>
</table>
}
else
{
<div>Ingen data</div>
}
<InformationModal BodyMessage="@InfoMessage"/>

View file

@ -29,32 +29,26 @@ namespace Wonky.Client.Components
{
public partial class AdvisorCompanyTableComponent
{
[Parameter] public List<CompanyDto> Companies { get; set; } = new();
[Parameter] public List<CompanyDto> CompanyList { get; set; } = new();
[Parameter] public EventCallback<string> OnDelete { get; set; }
[Parameter] public EventCallback<string> OnSelect { get; set; }
[Inject] public NavigationManager _navigator { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
[Inject] public IJSRuntime Js { get; set; }
private Lazy<IJSObjectReference> BsTooltip = new();
private InformationModal InformationModal { get; set; } = new();
private string _info { get; set; } = "";
private string _companyId { get; set; } = "";
// private string _actionUrl { get; set; } = "";
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
}
private string InfoMessage { get; set; } = "";
private string CompanyId { get; set; } = "";
private void ViewCustomer(string companyId)
{
_navigator.NavigateTo($"/companies/{companyId}");
Navigator.NavigateTo($"/companies/{companyId}");
}
private void CallInformationModal(string info)
{
_info = info;
InfoMessage = info;
InformationModal.Show();
}
}

View file

@ -15,7 +15,7 @@
//
*@
<select class="form-select" @bind-value="Selection" @bind-value:event="oninput" @onchange="OnSelectionChanged">
<select class="form-select bg-primary text-bg-primary" @bind-value="GroupCol" @bind-value:event="oninput" @onchange="OnSelectionChanged">
<option value="-1" disabled>VARE GRUPPE</option>
<option value="0" selected>Alle</option>
<option value="1">Lim Sealer Reparation</option>

View file

@ -22,13 +22,13 @@ namespace Wonky.Client.Components;
public partial class CatalogGroupComponent
{
[Inject] public ILocalStorageService LocalStorage { get; set; }
[Inject] public PreferenceService PreferenceService { get; set; }
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public UserPrefService PrefService { get; set; }
[Parameter] public EventCallback<string> OnChanged { get; set; }
private Dictionary<string, string> Items { get; set; } = new();
private Preferences _preferences = new();
private UserPref Prefs = new();
private string? Selection { get; set; }
private string? GroupCol { get; set; }
private async Task OnSelectionChanged(ChangeEventArgs e)
{

View file

@ -15,7 +15,7 @@
//
*@
<select class="form-select" @bind-value="@_selectedItem" @bind-value:event="oninput" @onchange="OnSelectChanged">
<select class="form-select bg-primary text-bg-primary" @bind-value="@SearchCol" @bind-value:event="oninput" @onchange="OnSelectChanged">
<option value="-1" selected disabled>SØGNING</option>
<option value="name">Navn</option>
<option value="sku">Nummer</option>

View file

@ -24,7 +24,7 @@ public partial class CatalogSearchComponent : IDisposable
/// <summary>
/// User preference service
/// </summary>
[Inject] public PreferenceService _preferenceService { get; set; }
[Inject] public UserPrefService PrefService { get; set; }
/// <summary>
/// OnChanged event callback
@ -34,22 +34,22 @@ public partial class CatalogSearchComponent : IDisposable
/// <summary>
/// User preferences
/// </summary>
private Preferences _preferences = new();
private UserPref Prefs { get; set; } = new();
/// <summary>
/// Selected item
/// </summary>
private string _selectedItem { get; set; } = "";
private string SearchCol { get; set; } = "";
/// <summary>
/// Component initialization
/// </summary>
protected override async Task OnInitializedAsync()
{
_preferenceService.OnChange += ProfileServiceOnOnChange;
_preferences = await _preferenceService.GetPreferences();
_selectedItem = _preferences.ItemSearch;
await OnChanged.InvokeAsync(_selectedItem);
PrefService.OnChange += ProfileServiceOnOnChange;
Prefs = await PrefService.GetPreferences();
SearchCol = Prefs.ItemSearch;
await OnChanged.InvokeAsync(SearchCol);
}
/// <summary>
@ -61,16 +61,16 @@ public partial class CatalogSearchComponent : IDisposable
var val = e.Value.ToString();
if (val == "-1") return;
await OnChanged.InvokeAsync(val);
await _preferenceService.SetItemSearch(val);
await PrefService.SetItemSearch(val);
}
/// <summary>
/// Preference update from profile service
/// </summary>
/// <param name="newPreferences"></param>
private void ProfileServiceOnOnChange(Preferences newPreferences)
/// <param name="newUserPref"></param>
private void ProfileServiceOnOnChange(UserPref newUserPref)
{
_preferences = newPreferences;
Prefs = newUserPref;
StateHasChanged();
}
@ -79,6 +79,6 @@ public partial class CatalogSearchComponent : IDisposable
/// </summary>
public void Dispose()
{
_preferenceService.OnChange -= ProfileServiceOnOnChange;
PrefService.OnChange -= ProfileServiceOnOnChange;
}
}

View file

@ -17,7 +17,7 @@
<div class="input-group">
<input id="search-input" type="text" class="form-control" placeholder="Søg ..." aria-described-by="search-addon"
@bind-value="@_searchTerm" @bind-value:event="oninput" @onkeyup="OnSearchChanged" />
@bind-value="@SearchTerm" @bind-value:event="oninput" @onkeyup="OnSearchChanged" />
<span class="input-group-text" id="search-addon"><i class="oi oi-delete" @onclick="ClearSearch"></i></span>
</div>

View file

@ -21,31 +21,31 @@ namespace Wonky.Client.Components
{
public partial class CatalogSearchPhraseComponent
{
private Timer _timer { get; set; } = new();
private string _searchTerm { get; set; } = "";
private Timer Timer { get; set; } = new();
private string SearchTerm { get; set; } = "";
[Parameter] public EventCallback<string> OnChanged { get; set; }
private void ClearSearch()
{
_searchTerm = "";
SearchTerm = "";
OnChanged.InvokeAsync("");
}
private void OnSearchChanged()
{
_timer.Dispose();
_timer = new Timer(500);
_timer.AutoReset = false;
_timer.Elapsed += OnTimerElapsed;
_timer.Enabled = true;
Timer.Dispose();
Timer = new Timer(500);
Timer.AutoReset = false;
Timer.Elapsed += OnTimerElapsed;
Timer.Enabled = true;
}
private void OnTimerElapsed(object? sender, ElapsedEventArgs e)
{
OnChanged.InvokeAsync(_searchTerm);
_timer.Elapsed -= OnTimerElapsed;
_timer.Enabled = false;
_timer.Dispose();
OnChanged.InvokeAsync(SearchTerm);
Timer.Elapsed -= OnTimerElapsed;
Timer.Enabled = false;
Timer.Dispose();
}
}
}

View file

@ -15,7 +15,7 @@
//
*@
<select class="form-select" @bind-value="@_selectedItem" @bind-value:event="oninput" @onchange="OnSelectChanged">
<select class="form-select bg-primary text-bg-primary" @bind-value="@SortCol" @bind-value:event="oninput" @onchange="OnSelectChanged">
<option value="-1" selected disabled>SORTERING</option>
<option value="name">Navn</option>
<option value="sku">Nummer</option>

View file

@ -24,7 +24,7 @@ public partial class CatalogSortComponent : IDisposable
/// <summary>
/// User preference service
/// </summary>
[Inject] public PreferenceService _preferenceService { get; set; }
[Inject] public UserPrefService PrefService { get; set; }
/// <summary>
/// OnChanged callback function
@ -34,21 +34,21 @@ public partial class CatalogSortComponent : IDisposable
/// <summary>
/// User's preferences
/// </summary>
private Preferences _preferences = new();
private UserPref Prefs = new();
/// <summary>
/// Item selected by user
/// </summary>
private string? _selectedItem { get; set; }
private string SortCol { get; set; }
/// <summary>
/// Component initialization
/// </summary>
protected override async Task OnInitializedAsync()
{
_preferenceService.OnChange += ProfileServiceOnOnChange;
_preferences = await _preferenceService.GetPreferences();
_selectedItem = _preferences.ItemSort;
PrefService.OnChange += ProfileServiceOnOnChange;
Prefs = await PrefService.GetPreferences();
SortCol = Prefs.ItemSort;
}
/// <summary>
@ -60,16 +60,16 @@ public partial class CatalogSortComponent : IDisposable
var val = e.Value.ToString();
if (val == "-1") return;
await OnChanged.InvokeAsync(val);
await _preferenceService.SetItemSort(val);
await PrefService.SetItemSort(val);
}
/// <summary>
/// Get updated settings from preference service
/// </summary>
/// <param name="newPreferences"></param>
private void ProfileServiceOnOnChange(Preferences newPreferences)
/// <param name="newUserPref"></param>
private void ProfileServiceOnOnChange(UserPref newUserPref)
{
_preferences = newPreferences;
Prefs = newUserPref;
StateHasChanged();
}
@ -78,6 +78,6 @@ public partial class CatalogSortComponent : IDisposable
/// </summary>
public void Dispose()
{
_preferenceService.OnChange -= ProfileServiceOnOnChange;
PrefService.OnChange -= ProfileServiceOnOnChange;
}
}

View file

@ -15,7 +15,7 @@
//
*@
@if (SalesItems.Any())
@if (ItemList.Any())
{
<table class="table table-hover table-striped justify-content-center">
<thead>
@ -27,7 +27,7 @@
</tr>
</thead>
<tbody>
@foreach (var salesItem in SalesItems)
@foreach (var salesItem in ItemList)
{
<tr>
<td class="align-middle">
@ -55,5 +55,5 @@
}
else
{
<LoaderThreeDots />
<div>Ingen data</div>
}

View file

@ -23,7 +23,7 @@ namespace Wonky.Client.Components;
public partial class CatalogTableComponent
{
[Parameter] public List<SalesItemView> SalesItems { get; set; } = new();
[Parameter] public List<SalesItemView> ItemList { get; set; } = new();
[Inject] public IToastService ToastService { get; set; }
private void AddToDraft()
{

View file

@ -1,3 +0,0 @@
.product-img {
width: 80px;
}

View file

@ -0,0 +1,79 @@
@*
// 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]
//
*@
@if (ItemList.Any())
{
<table class="table table-hover table-striped justify-content-center">
<thead>
<tr>
<th colspan="4">
<div class="row">
<div class="col">
<h2>Innotec Prisliste</h2>
</div>
<div class="col-sm-2 text-end">
<button type="button" class="d-print-none btn btn-primary mx-3" onclick="window.print();"><i class="bi-printer"></i> Udskriv</button>
</div>
</div>
</th>
</tr>
<tr class="bg-black text-white opacity-75">
<th scope="col">Navn</th>
<th scope="col">Fork</th>
<th scope="col" class="text-nowrap">Varenr</th>
<th scope="col">Stk / Pris</th>
</tr>
</thead>
<tbody>
@foreach (var salesItem in ItemList)
{
<tr>
<td class="align-middle">
@salesItem.Name
</td>
<td class="align-middle">@salesItem.ShortName</td>
<td class="align-middle">
@salesItem.Sku
</td>
<td class="align-middle">
<ul class="list-group">
@foreach (var rate in salesItem.Rates)
{
<li class="list-group-item d-flex justify-content-between align-items-end">
<div class="pe-2">@rate.Quantity</div>
<div class="text-end pe-2">@rate.Rate</div>
</li>
}
</ul>
</td>
</tr>
}
</tbody>
<tfoot>
<tr>
<td colspan="4" class="text-end bg-dark text-white">
@DateTime.Now.ToShortDateString() - @DateTime.Now.ToShortTimeString()
</td>
</tr>
</tfoot>
</table>
}
else
{
<div>Ingen data</div>
}

View file

@ -0,0 +1,27 @@
// 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.Toast.Services;
using Microsoft.AspNetCore.Components;
using Wonky.Entity.DTO;
using Wonky.Entity.Models;
using Wonky.Entity.Views;
namespace Wonky.Client.Components;
public partial class CatalogTablePrintComponent
{
[Parameter] public List<SalesItemView> ItemList { get; set; } = new();
}

View file

@ -15,7 +15,7 @@
//
*@
<select class="form-select" @bind-value="@Selection" @bind-value:event="oninput" @onchange="OnSelectionChanged">
<select class="form-select bg-primary text-bg-primary" @bind-value="@SearchCol" @bind-value:event="oninput" @onchange="OnSelectionChanged">
<option value="-1" disabled>SØGNING</option>
<option value="name">Navn</option>
<option value="city">By</option>

View file

@ -24,32 +24,32 @@ namespace Wonky.Client.Components;
public partial class CompanySearchColumnComponent : IDisposable
{
[Inject] public ILocalStorageService LocalStorage { get; set; }
[Inject] public PreferenceService PreferenceService { get; set; }
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public UserPrefService PrefService { get; set; }
[Parameter] public EventCallback<string> OnChanged { get; set; }
private Dictionary<string, string> Items { get; set; } = new();
private Preferences _preferences = new();
private string Selection { get; set; } = "name";
private UserPref Prefs { get; set; } = new();
private string SearchCol { get; set; } = "name";
protected override async Task OnInitializedAsync()
{
PreferenceService.OnChange += ProfileServiceOnOnChange;
_preferences = await PreferenceService.GetPreferences();
Selection = _preferences.CompanySearch;
PrefService.OnChange += ProfileServiceOnOnChange;
Prefs = await PrefService.GetPreferences();
SearchCol = Prefs.CompanySearch;
}
private async Task OnSelectionChanged(ChangeEventArgs e)
{
var val = e.Value.ToString();
if (val == "-1") return;
await OnChanged.InvokeAsync(val);
await PreferenceService.SetCompanySearch(val);
await PrefService.SetCompanySearch(val);
}
private void ProfileServiceOnOnChange(Preferences newPreferences)
private void ProfileServiceOnOnChange(UserPref newUserPref)
{
_preferences = newPreferences;
Prefs = newUserPref;
StateHasChanged();
}
public void Dispose()
{
PreferenceService.OnChange -= ProfileServiceOnOnChange;
PrefService.OnChange -= ProfileServiceOnOnChange;
}
}

View file

@ -24,14 +24,14 @@ namespace Wonky.Client.Components
{
private Timer InputTimer { get; set; } = new();
private string SearchTerm { get; set; } = "";
private Preferences Preferences { get; set; } = new ();
[Inject] public PreferenceService PreferenceService { get; set; }
private UserPref Prefs { get; set; } = new ();
[Inject] public UserPrefService PrefService { get; set; }
[Parameter] public EventCallback<string> OnChanged { get; set; }
protected override async Task OnInitializedAsync()
{
Preferences = await PreferenceService.GetPreferences();
SearchTerm = string.IsNullOrWhiteSpace(Preferences.CompanyFilterPhrase) ? "" : Preferences.CompanyFilterPhrase.Trim();
Prefs = await PrefService.GetPreferences();
SearchTerm = string.IsNullOrWhiteSpace(Prefs.CompanyFilterPhrase) ? "" : Prefs.CompanyFilterPhrase.Trim();
if(!string.IsNullOrWhiteSpace(SearchTerm))
await OnChanged.InvokeAsync(SearchTerm);
@ -41,13 +41,13 @@ namespace Wonky.Client.Components
{
InputTimer.Dispose();
SearchTerm = "";
await PreferenceService.SetCompanyFilterPhrase(SearchTerm.Trim());
await PrefService.SetCompanyFilterPhrase(SearchTerm.Trim());
await OnChanged.InvokeAsync(SearchTerm);
}
private async Task OnSearchChanged()
{
await PreferenceService.SetCompanyFilterPhrase(SearchTerm.Trim());
await PrefService.SetCompanyFilterPhrase(SearchTerm.Trim());
InputTimer.Dispose();
InputTimer = new Timer(500);
InputTimer.AutoReset = false;

View file

@ -15,7 +15,7 @@
//
*@
<select class="form-select" @bind-value="@Selection" @bind-value:event="oninput" @onchange="OnSelectionChanged">
<select class="form-select bg-primary text-bg-primary" @bind-value="@SortCol" @bind-value:event="oninput" @onchange="OnSelectionChanged">
<option value="-1" selected disabled>SORTERING</option>
<option value="name">Navn</option>
<option value="city">By</option>

View file

@ -23,33 +23,33 @@ namespace Wonky.Client.Components
{
public partial class CompanySortComponent : IDisposable
{
[Inject] public ILocalStorageService LocalStorage { get; set; }
[Inject] public PreferenceService PreferenceService { get; set; }
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public UserPrefService PrefService { get; set; }
[Parameter] public EventCallback<string> OnChanged { get; set; }
private Dictionary<string, string> Items { get; set; } = new();
private Preferences _preferences = new();
private string Selection { get; set; } = "name";
private UserPref Prefs = new();
private string SortCol { get; set; } = "name";
protected override async Task OnInitializedAsync()
{
PreferenceService.OnChange += ProfileServiceOnOnChange;
_preferences = await PreferenceService.GetPreferences();
Selection = _preferences.CompanySort;
PrefService.OnChange += ProfileServiceOnOnChange;
Prefs = await PrefService.GetPreferences();
SortCol = Prefs.CompanySort;
}
private async Task OnSelectionChanged(ChangeEventArgs e)
{
var val = e.Value.ToString();
if (val == "-1") return;
await OnChanged.InvokeAsync(val);
await PreferenceService.SetCompanySort(val);
await PrefService.SetCompanySort(val);
}
private void ProfileServiceOnOnChange(Preferences newPreferences)
private void ProfileServiceOnOnChange(UserPref newUserPref)
{
_preferences = newPreferences;
Prefs = newUserPref;
StateHasChanged();
}
public void Dispose()
{
PreferenceService.OnChange -= ProfileServiceOnOnChange;
PrefService.OnChange -= ProfileServiceOnOnChange;
}
}
}

View file

@ -47,6 +47,6 @@
}
else
{
<span>Ingen data</span>
<div>Ingen data</div>
}
<InvoiceViewModal CompanyId="@CompanyId" InvoiceId="@InvoiceId" @ref="InvoiceView" />

View file

@ -32,12 +32,12 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Components;
public partial class LandingComponentAdmin : IDisposable
{
[Inject] public PreferenceService _preferenceService { get; set; }
[Inject] public ILogger<LandingComponentAdmin> _logger { get; set; }
[Inject] public HttpInterceptorService _interceptor { get; set; }
[Inject] public IToastService _toast { get; set; }
[Inject] public UserPrefService PrefService { get; set; }
[Inject] public ILogger<LandingComponentAdmin> Logger { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IToastService Toaster { get; set; }
[Inject] public ICrmTaskItemHttpRepository CrmTaskItemRepo { get; set; }
[Inject] public NavigationManager _navigator { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
private readonly JsonSerializerOptions _options = new JsonSerializerOptions
{
@ -45,24 +45,24 @@ public partial class LandingComponentAdmin : IDisposable
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
private Preferences _prefs { get; set; } = new();
private string _workDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
private string _today { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
private UserPref Prefs { get; set; } = new();
private string WordDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
private string Today { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
protected override async Task OnInitializedAsync()
{
_prefs = await _preferenceService.GetPreferences();
if(!string.IsNullOrWhiteSpace(_prefs.WorkDate))
_workDate = _prefs.WorkDate;
Prefs = await PrefService.GetPreferences();
if(!string.IsNullOrWhiteSpace(Prefs.WorkDate))
WordDate = Prefs.WorkDate;
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
}
public void Dispose()
{
_interceptor.DisposeEvent();
Interceptor.DisposeEvent();
}
}

View file

@ -24,6 +24,6 @@
<div class="bg-dark text-white rounded-2 mb-2 py-2">
<WorkDateComponent OnChangedCallback="GetWorkdayTasks"/>
</div>
<TaskItemTableComponent TaskItemList="_taskItems" OnCompleteTask="OnCompleteTask"
<TaskItemTableComponent TaskItemList="TaskItems" OnCompleteTask="OnCompleteTask"
OnDeleteTask="OnDeleteConfirmed" OnTaskCompleted="OnTaskCompleted"/>
</AuthorizeView>

View file

@ -32,30 +32,30 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Components;
public partial class LandingComponentAdvisor : IDisposable
{
[Inject] public PreferenceService _preferenceService { get; set; }
[Inject] public ILogger<LandingComponentAdvisor> _logger { get; set; }
[Inject] public HttpInterceptorService _interceptor { get; set; }
[Inject] public IToastService _toast { get; set; }
[Inject] public ICrmTaskItemHttpRepository CrmTaskItemRepo { get; set; }
[Inject] public NavigationManager _navigator { get; set; }
[Inject] public UserPrefService PrefService { get; set; }
[Inject] public ILogger<LandingComponentAdvisor> Logger { get; set; }
[Inject] public HttpInterceptorService Inteceptor { get; set; }
[Inject] public IToastService Toaster { get; set; }
[Inject] public ICrmTaskItemHttpRepository TaskItemRepo { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
private readonly JsonSerializerOptions _options = new JsonSerializerOptions
private readonly JsonSerializerOptions JsonOptions = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
private Preferences _prefs { get; set; } = new();
private UserPref Prefs { get; set; } = new();
private DateTime SelectedDate { get; set; }
private List<TaskItemDto>? _taskItems { get; set; } = new();
private List<TaskItemDto> TaskItems { get; set; } = new();
protected override async Task OnInitializedAsync()
{
_prefs = await _preferenceService.GetPreferences();
SelectedDate = string.IsNullOrWhiteSpace(_prefs.WorkDate) ? DateTime.Now : DateTime.Parse(_prefs.WorkDate);
Prefs = await PrefService.GetPreferences();
SelectedDate = string.IsNullOrWhiteSpace(Prefs.WorkDate) ? DateTime.Now : DateTime.Parse(Prefs.WorkDate);
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
Inteceptor.RegisterEvent();
Inteceptor.RegisterBeforeSendEvent();
//await GetTaskItems(_workDate);
await GetAllTasks();
@ -63,43 +63,43 @@ public partial class LandingComponentAdvisor : IDisposable
private async Task GetAllTasks()
{
_taskItems = await CrmTaskItemRepo.GetTaskList();
TaskItems = await TaskItemRepo.GetTaskList();
}
private async Task OnCompleteTask(string taskItemId)
{
await _preferenceService.SetWorkDate(DateTime.Now);
var item = _taskItems.Find(x => x.TaskItemId == taskItemId);
_navigator.NavigateTo($"/companies/{item.ReferenceId}/activities/new");
await PrefService.SetWorkDate(DateTime.Now);
var item = TaskItems.Find(x => x.TaskItemId == taskItemId);
Navigator.NavigateTo($"/companies/{item.ReferenceId}/activities/new");
}
private async Task GetWorkdayTasks(string workDate)
{
SelectedDate = DateTime.Parse(workDate);
_taskItems = new List<TaskItemDto>();
_taskItems = await CrmTaskItemRepo.GetTaskList($"{SelectedDate:yyyy-MM-dd}");
TaskItems = new List<TaskItemDto>();
TaskItems = await TaskItemRepo.GetTaskList($"{SelectedDate:yyyy-MM-dd}");
}
private async Task OnTaskCompleted(string taskItemId)
{
var item = _taskItems.Find(x => x.TaskItemId == taskItemId);
var item = TaskItems.Find(x => x.TaskItemId == taskItemId);
item.IsCompleted = true;
await CrmTaskItemRepo.UpdateTaskItem(taskItemId, item);
_taskItems.Remove(item);
_toast.ShowInfo("Opgaven er markeret som udført.");
await TaskItemRepo.UpdateTaskItem(taskItemId, item);
TaskItems.Remove(item);
Toaster.ShowInfo("Opgaven er markeret som udført.");
}
private async Task OnDeleteConfirmed(string taskItemId)
{
var item = _taskItems.First(x => x.TaskItemId == taskItemId);
_taskItems.Remove(item);
await CrmTaskItemRepo.DeleteTaskItem(taskItemId);
_toast.ShowInfo("Opgaven er slettet.");
var item = TaskItems.First(x => x.TaskItemId == taskItemId);
TaskItems.Remove(item);
await TaskItemRepo.DeleteTaskItem(taskItemId);
Toaster.ShowInfo("Opgaven er slettet.");
}
public void Dispose()
{
_interceptor.DisposeEvent();
Inteceptor.DisposeEvent();
}
}

View file

@ -1,14 +0,0 @@
using Microsoft.AspNetCore.Components;
namespace Wonky.Client.Components;
public partial class LoaderThreeDots
{
private bool ShowMe { get; set; } = true;
protected override async Task OnInitializedAsync()
{
await Task.Delay(15000);
ShowMe = false;
}
}

View file

@ -15,7 +15,7 @@
//
*@
@if (Activities.Any())
@if (ActivityList.Any())
{
<table class="table table-bordered d-print-table table-striped">
<thead>
@ -34,7 +34,7 @@
</tr>
</thead>
<tbody>
@foreach (var activity in Activities)
@foreach (var activity in ActivityList)
{
<tr class="border-bottom">
<td class="align-middle"><a href="/office/customers/@activity.Company.CompanyId/orders/@activity.ActivityId">@activity.Company.Name</a></td>
@ -67,3 +67,7 @@
</tbody>
</table>
}
else
{
<div>Ingen data</div>
}

View file

@ -20,8 +20,8 @@ namespace Wonky.Client.Components;
public partial class OfficeActivityTableComponent
{
[Parameter] public List<ReportItemView> Activities { get; set; }
[Inject] public NavigationManager _navigator { get; set; }
[Parameter] public List<ReportItemView> ActivityList { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
private static string GetProcessStatus(string processStatus)
{
@ -38,6 +38,6 @@ public partial class OfficeActivityTableComponent
private void ShowOrder(string companyId, string orderId)
{
_navigator.NavigateTo($"office/customers/{companyId}/orders/{orderId}");
Navigator.NavigateTo($"office/customers/{companyId}/orders/{orderId}");
}
}

View file

@ -54,5 +54,5 @@
}
else
{
<LoaderThreeDots />
<div>Ingen data</div>
}

View file

@ -18,7 +18,7 @@
@using Wonky.Client.Components;
@using Wonky.Client.Helpers;
@if (Companies.Any())
@if (CompanyList.Any())
{
<div class="list-group list-group-flush">
<div class="list-group-item px-3 bg-black text-white opacity-75">
@ -40,7 +40,7 @@
</div>
</div>
</div>
@foreach (var company in Companies)
@foreach (var company in CompanyList)
{
<a class=" list-group-item list-group-item-action" href="/office/customers/@company.CompanyId/orders/new">
<div class="row align-items-center">
@ -59,14 +59,6 @@
<div class="col">
@company.CountryCode.ToUpper()-@company.ZipCode @company.City
</div>
@* <div class="col justify-content-end"> *@
@* <ActivityButton CompanyId="@company.CompanyId" *@
@* ActionLink="/office/customers/$ID$/orders/new" *@
@* ButtonText="Telefon Ordre" *@
@* ButtonType="primary" *@
@* Enabled=1> *@
@* </ActivityButton> *@
@* </div> *@
</div>
</a>
}
@ -74,5 +66,5 @@
}
else
{
<LoaderThreeDots />
<div>Ingen data</div>
}

View file

@ -26,17 +26,7 @@ namespace Wonky.Client.Components
{
public partial class OfficeCustomerTableComponent
{
[Parameter] public List<CompanyDto> Companies { get; set; } = new();
// [Parameter] public EventCallback<string> OnDelete { get; set; }
// [Parameter] public EventCallback<string> OnSelect { get; set; }
//
// private Confirmation _confirmation = new ();
// private string _companyId = "";
// private string _actionUrl = "";
//
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
}
[Parameter] public List<CompanyDto> CompanyList { get; set; } = new();
}
}

View file

@ -17,7 +17,7 @@
@using System.Globalization
@if (ReportList != null)
@if (ReportList.Any())
{
<div class="list-group list-group-flush">
<div class="list-group-item px-3 bg-black text-white opacity-75">
@ -87,5 +87,5 @@
}
else
{
<LoaderThreeDots />
<div>Ingen data</div>
}

View file

@ -51,5 +51,5 @@
}
else
{
<LoaderThreeDots />
<div>Ingen data</div>
}

View file

@ -15,7 +15,7 @@
//
*@
<select class="form-select" @bind-value="@Selection" @bind-value:event="oninput" @onchange="OnSelectChanged">
<select class="form-select bg-primary text-bg-primary" @bind-value="@PageSize" @bind-value:event="oninput" @onchange="OnSelectChanged">
<option value="-1" selected disabled>RESULTATER</option>
<option value="5">5</option>
<option value="10">10</option>

View file

@ -23,33 +23,33 @@ namespace Wonky.Client.Components
{
public partial class PageSizeComponent : IDisposable
{
[Inject] public ILocalStorageService LocalStorage { get; set; }
[Inject] public PreferenceService PreferenceService { get; set; }
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public UserPrefService PrefService { get; set; }
[Parameter] public EventCallback<string> OnChanged { get; set; }
private Dictionary<string, string> Items { get; set; } = new();
private Preferences _preferences = new();
private string Selection { get; set; } = "";
private UserPref Prefs = new();
private string PageSize { get; set; } = "";
protected override async Task OnInitializedAsync()
{
PreferenceService.OnChange += ProfileServiceOnOnChange;
_preferences = await PreferenceService.GetPreferences();
Selection = _preferences.PageSize;
PrefService.OnChange += ProfileServiceOnOnChange;
Prefs = await PrefService.GetPreferences();
PageSize = Prefs.PageSize;
}
private async Task OnSelectChanged(ChangeEventArgs e)
{
var val = e.Value.ToString();
if (val == "-1") return;
await OnChanged.InvokeAsync(val);
await PreferenceService.SetPageSize(val);
await PrefService.SetPageSize(val);
}
private void ProfileServiceOnOnChange(Preferences newPreferences)
private void ProfileServiceOnOnChange(UserPref newUserPref)
{
_preferences = newPreferences;
Prefs = newUserPref;
StateHasChanged();
}
public void Dispose()
{
PreferenceService.OnChange -= ProfileServiceOnOnChange;
PrefService.OnChange -= ProfileServiceOnOnChange;
}
}
}

View file

@ -17,7 +17,7 @@
<div arial-label="Pager">
<ul class="pagination justify-content-center">
@foreach (var link in _links)
@foreach (var link in Links)
{
<li @onclick="() => OnSelectedPage(link)" style="cursor: pointer"
class="page-item @(link.Enabled ? null : "disabled")

View file

@ -26,8 +26,7 @@ namespace Wonky.Client.Components
[Parameter] public MetaData MetaData { get; set; } = new();
[Parameter] public int Spread { get; set; }
[Parameter] public EventCallback<int> SelectedPage { get; set; }
private List<PagingLink> _links { get; set; } = new();
private List<PagingLink> Links { get; set; } = new();
protected override void OnParametersSet()
{
@ -36,7 +35,7 @@ namespace Wonky.Client.Components
private void CreatePaginationLinks()
{
_links = new List<PagingLink>
Links = new List<PagingLink>
{
new(MetaData.CurrentPage - 1, MetaData.HasPrevious, "Forrige")
};
@ -45,11 +44,11 @@ namespace Wonky.Client.Components
{
if (i >= MetaData.CurrentPage - Spread && i <= MetaData.CurrentPage + Spread)
{
_links.Add(new PagingLink(i, true, i.ToString()) {Active = MetaData.CurrentPage == i});
Links.Add(new PagingLink(i, true, i.ToString()) {Active = MetaData.CurrentPage == i});
}
}
_links.Add(new PagingLink(MetaData.CurrentPage + 1, MetaData.HasNext, "Næste"));
Links.Add(new PagingLink(MetaData.CurrentPage + 1, MetaData.HasNext, "Næste"));
}
private async Task OnSelectedPage(PagingLink link)

View file

@ -15,7 +15,7 @@
//
*@
@if (Inventory.Any())
@if (ProductList.Any())
{
@*
<div class="list-group">
@ -40,7 +40,7 @@
*@
<table class="table table-striped table-borderless">
<tbody>
@foreach (var product in Inventory)
@foreach (var product in ProductList)
{
<tr style="cursor: pointer" @onclick="() => CallShowReorderModal(product.Sku)">
<td class="align-middle">
@ -59,6 +59,9 @@
}
</tbody>
</table>
<InventoryReorderModal OnSelected="@OnSelectedItem" CompanyId="@CompanyId" SalesItem="@SalesItem" @ref="ReorderModal"/>
}
else
{
<div>Ingen data</div>
}
<InventoryReorderModal OnSelected="@OnSelectedItem" CompanyId="@CompanyId" SalesItem="@SalesItem" @ref="ReorderModal"/>

View file

@ -26,7 +26,7 @@ namespace Wonky.Client.Components;
public partial class ProductInventoryTableComponent
{
[CascadingParameter] DraftStateProvider DraftStateProvider { get; set; }
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
[Parameter] public List<ProductInventoryView> ProductList { get; set; } = new();
[Parameter] public string CompanyId { get; set; } = "";
[Inject] public ICatalogHttpRepository Catalog { get; set; }
// private variables

View file

@ -67,3 +67,7 @@
</tbody>
</table>
}
else
{
<div>Ingen data</div>
}

View file

@ -84,6 +84,7 @@
}
else
{
<LoaderThreeDots/>
<div>Ingen data</div>
}
</div>

View file

@ -18,35 +18,34 @@
<div class="row mb-3">
<div class="col-md-4">
<div class="btn-group" role="group" aria-label="Ordre status">
<input type="radio" class="btn-check" name="btn-order" id="btn-order1" autocomplete="off" checked @onchange="@GetOrderStatusNone" />
<input type="radio" class="btn-check" name="btn-order" id="btn-order1" autocomplete="off" checked @onchange="@GetOrderStatusNone"/>
<label class="btn btn-outline-success" for="btn-order1">Ubehandlet</label>
<input type="radio" class="btn-check" name="btn-order" id="btn-order2" autocomplete="off" @onchange="@GetOrderStatusPicked"/>
<label class="btn btn-outline-warning" for="btn-order2">Plukket</label>
<input type="radio" class="btn-check" name="btn-order" id="btn-order3" autocomplete="off" @onchange="@GetOrderStatusPacked" />
<input type="radio" class="btn-check" name="btn-order" id="btn-order3" autocomplete="off" @onchange="@GetOrderStatusPacked"/>
<label class="btn btn-outline-danger" for="btn-order3">Pakket</label>
<input type="radio" class="btn-check" name="btn-order" id="btn-order4" autocomplete="off" @onchange="@GetOrderStatusShipped" />
<input type="radio" class="btn-check" name="btn-order" id="btn-order4" autocomplete="off" @onchange="@GetOrderStatusShipped"/>
<label class="btn btn-outline-info" for="btn-order4">Afsendt</label>
</div>
</div>
<div class="col-md-4 text-end">
<label class="btn btn-outline-dark position-relative">@_header
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger">@_orders.Count</span>
<label class="btn btn-outline-dark position-relative">
@Header
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger">@OrderList.Count</span>
<span class="visually-hidden">ordrer i listen</span>
</label>
</div>
<div class="col-md-4 text-end">
@if (_readyToShip && _orders.Any())
@if (ReadyToShip && OrderList.Any())
{
<button type="button" class="btn btn-primary text-sm-center" @onclick="SetAllPackedStatusToShipped">Sæt alle afsendt</button>
}
</div>
</div>
@if (_orders.Any())
{
<div class="list-group list-group-flush">
<div class="list-group list-group-flush">
<div class="list-group-item">
<div class="row mb-1">
<div class="col-md-2">
@ -59,14 +58,18 @@
<h4>Postnr. Bynavn</h4>
</div>
<div class="col-md-1 text-center">
<h4><i class="oi oi-flash"></i></h4>
<h4>
<i class="oi oi-flash"></i>
</h4>
</div>
<div class="col-md-2">
<h4>Status</h4>
</div>
</div>
</div>
@foreach (var order in _orders)
@if (OrderList.Any())
{
@foreach (var order in OrderList)
{
<a class="list-group-item list-group-item-action" href="warehouse/orders/process/@order.OrderId">
<div class="row">
@ -105,9 +108,11 @@
</div>
</a>
}
}
else
{
<div>
Flot klaret - bordet er ryddet
</div>
}
else
{
<LoaderThreeDots />
}
}
</div>

View file

@ -27,38 +27,38 @@ namespace Wonky.Client.Components;
public partial class WarehouseListComponent
{
[Parameter] public string Status { get; set; } = "none";
[Inject] public HttpInterceptorService _interceptor { get; set; }
[Inject] public IWarehouseHttpRepository _warehouseRepo { get; set; }
[Inject] public IToastService _toast { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IWarehouseHttpRepository WarehouseRepo { get; set; }
[Inject] public IToastService Toaster { get; set; }
private string _items { get; set; }
private bool _readyToShip;
private string _header = "Ubehandlet";
private string ItemList { get; set; } = "";
private bool ReadyToShip;
private string Header = "Ubehandlet";
private List<WarehouseOrderView> _orders { get; set; }
private bool Loading { get; set; }
private List<WarehouseOrderView> OrderList { get; set; }
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
switch (Status.ToLower())
{
case "none":
_header = "Ubehandlede ordrer";
Header = "Ubehandlede ordrer";
await GetOrderStatusNone();
break;
case "picked":
_header = "Plukkede ordrer";
Header = "Plukkede ordrer";
await GetOrderStatusPicked();
break;
case "packed":
_header = "Pakkede ordrer";
Header = "Pakkede ordrer";
await GetOrderStatusPacked();
break;
case "shipped":
_header = "Afsendte ordrer";
Header = "Afsendte ordrer";
await GetOrderStatusShipped();
break;
default:
@ -69,56 +69,61 @@ public partial class WarehouseListComponent
private async Task GetOrderStatusNone()
{
_orders = new List<WarehouseOrderView>();
_header = "Ubehandlede ordrer";
_readyToShip = false;
Loading = true;
_orders = new List<WarehouseOrderView>();
_orders = await _warehouseRepo.GetWarehouseOrderListByStatus("none");
if(_orders.Any(x => x.Express))
_orders = _orders.OrderByDescending(x => x.Express).ToList();
Loading = false;
Working = true;
OrderList = new List<WarehouseOrderView>();
Header = "Ubehandlede ordrer";
ReadyToShip = false;
Working = true;
OrderList = new List<WarehouseOrderView>();
OrderList = await WarehouseRepo.GetWarehouseOrderListByStatus("none");
if(OrderList.Any(x => x.Express))
OrderList = OrderList.OrderByDescending(x => x.Express).ToList();
Working = false;
}
private async Task GetOrderStatusPicked()
{
_orders = new List<WarehouseOrderView>();
_header = "Plukkede ordrer";
_readyToShip = false;
Loading = true;
_orders = new List<WarehouseOrderView>();
_orders = await _warehouseRepo.GetWarehouseOrderListByStatus("picked");
Loading = false;
Working = true;
OrderList = new List<WarehouseOrderView>();
Header = "Plukkede ordrer";
ReadyToShip = false;
Working = true;
OrderList = new List<WarehouseOrderView>();
OrderList = await WarehouseRepo.GetWarehouseOrderListByStatus("picked");
Working = false;
}
private async Task GetOrderStatusPacked()
{
_orders = new List<WarehouseOrderView>();
_header = "Pakkede ordrer";
Loading = true;
_orders = new List<WarehouseOrderView>();
_orders = await _warehouseRepo.GetWarehouseOrderListByStatus("packed");
_readyToShip = true;
Loading = false;
Working = true;
OrderList = new List<WarehouseOrderView>();
Header = "Pakkede ordrer";
Working = true;
OrderList = new List<WarehouseOrderView>();
OrderList = await WarehouseRepo.GetWarehouseOrderListByStatus("packed");
ReadyToShip = true;
Working = false;
}
private async Task GetOrderStatusShipped()
{
_orders = new List<WarehouseOrderView>();
_header = "Afsendte ordrer";
_readyToShip = false;
_toast.ShowWarning("Det kan tage lidt tid at hente alle.\nVent venligst.\nMåske skal vi tænke over hvor mange vi henter?");
Loading = true;
_orders = new List<WarehouseOrderView>();
var orderList = await _warehouseRepo.GetWarehouseOrderListByStatus("shipped");
_orders = orderList.OrderByDescending(x => x.OrderDate).ToList();
_toast.ShowInfo("Her er de så ....");
Loading = false;
Working = true;
OrderList = new List<WarehouseOrderView>();
Header = "Afsendte ordrer";
ReadyToShip = false;
Toaster.ShowWarning("Det kan tage lidt tid at hente alle.\nVent venligst.\nMåske skal vi tænke over hvor mange vi henter?");
Working = true;
OrderList = new List<WarehouseOrderView>();
var orderList = await WarehouseRepo.GetWarehouseOrderListByStatus("shipped");
OrderList = orderList.OrderByDescending(x => x.OrderDate).ToList();
Toaster.ShowInfo("Her er de så ....");
Working = false;
}
private async Task SetAllPackedStatusToShipped()
{
foreach (var order in _orders.Where(order => order.ProcessStatusEnum.ToLower() == "packed"))
Working = true;
foreach (var order in OrderList.Where(order => order.ProcessStatusEnum.ToLower() == "packed"))
{
order.ProcessStatusEnum = "shipped";
var process = new WarehouseProcess
@ -126,13 +131,13 @@ public partial class WarehouseListComponent
OrderId = order.OrderId,
ProcessStatusEnum = "shipped"
};
await _warehouseRepo.UpdateWarehouseOrderStatus(process);
await WarehouseRepo.UpdateWarehouseOrderStatus(process);
}
Working = false;
}
public void Dispose()
{
_interceptor.DisposeEvent();
Interceptor.DisposeEvent();
}
}

View file

@ -27,7 +27,7 @@ public partial class WorkDateComponent : IDisposable
/// <summary>
/// User preference service
/// </summary>
[Inject] public PreferenceService Prefs { get; set; }
[Inject] public UserPrefService Prefs { get; set; }
/// <summary>
/// OnChanged callback function
/// </summary>
@ -40,7 +40,7 @@ public partial class WorkDateComponent : IDisposable
/// <summary>
/// user preferences
/// </summary>
private Preferences _prefs = new();
private UserPref _prefs = new();
/// <summary>
/// Component Initialization
/// </summary>
@ -66,10 +66,10 @@ public partial class WorkDateComponent : IDisposable
/// <summary>
/// ProfileService
/// </summary>
/// <param name="newPreferences"></param>
private void ProfileServiceOnOnChange(Preferences newPreferences)
/// <param name="newUserPref"></param>
private void ProfileServiceOnOnChange(UserPref newUserPref)
{
_prefs = newPreferences;
_prefs = newUserPref;
StateHasChanged();
}
/// <summary>

View file

@ -15,12 +15,9 @@
//
*@
@if (ShowMe)
{
<div class="m-5">
<div class="m-5">
<div class="d-flex justify-content-center">
<!-- loader credit: samherbert.net/svg-loaders -->
<img src="/svg-loaders/three-dots.svg" alt="loading ..."/>
</div>
</div>
}
</div>

View file

@ -0,0 +1,9 @@
using Blazored.Toast.Services;
using Microsoft.AspNetCore.Components;
namespace Wonky.Client.Components;
public partial class WorkingThreeDots
{
}

View file

@ -56,4 +56,6 @@ public interface ICatalogHttpRepository
/// <param name="variantId"></param>
/// <returns></returns>
Task<SalesItemView> GetSalesVariantId(string variantId);
Task<List<SalesItemView>> GetPriceList();
}

View file

@ -72,6 +72,14 @@ public class CatalogHttpRepository : ICatalogHttpRepository
var response = await _client
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.Catalog}/page", queryString));
if (!response.IsSuccessStatusCode)
{
return new PagingResponse<SalesItemView>
{
Items = new List<SalesItemView>(),
MetaData = new MetaData()
};
}
var content = await response.Content.ReadAsStringAsync();
var pagingResponse = new PagingResponse<SalesItemView>
@ -129,4 +137,9 @@ public class CatalogHttpRepository : ICatalogHttpRepository
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/variant/{variantId}");
return salesItem ?? new SalesItemView();
}
public async Task<List<SalesItemView>> GetPriceList()
{
return await _client.GetFromJsonAsync<List<SalesItemView>>($"{_apiConfig.Catalog}", _options);
}
}

View file

@ -76,6 +76,14 @@ public class CrmCompanyHttpRepository : ICrmCompanyHttpRepository
};
var response = await _client.GetAsync(QueryHelpers.AddQueryString($"{_conf.CrmCustomers}/page", queryString));
if (!response.IsSuccessStatusCode)
{
return new PagingResponse<CompanyDto>
{
Items = new List<CompanyDto>(),
MetaData = new MetaData()
};
}
var content = await response.Content.ReadAsStringAsync();
var pagingResponse = new PagingResponse<CompanyDto>

View file

@ -22,30 +22,32 @@
@attribute [Authorize(Roles = "Advisor,Admin,Office")]
<div class="sticky-top bg-dark rounded-2 px-3">
<div class="container-fluid pt-3">
<div class="row mb-3">
<div class="col">
<div class="row g-3 mb-3">
<div class="col-sm-2">
<CatalogGroupComponent OnChanged="SetItemGroup"/>
</div>
<div class="col">
<div class="col-sm-2">
<CatalogSearchComponent OnChanged="SetSearchCol"/>
</div>
<div class="col">
<div class="col-sm-4">
<CatalogSearchPhraseComponent OnChanged="SetSearchPhrase"/>
</div>
<div class="col">
<div class="col-sm-2">
<CatalogSortComponent OnChanged="SetSortCol"/>
</div>
<div class="col-md-2">
<PageSizeComponent OnChanged="SetPageSize" />
<div class="col-sm-2">
<PageSizeComponent OnChanged="SetPageSize"/>
</div>
<div class="col-sm-10">
<PaginationComponent MetaData="_metaData" Spread="2" SelectedPage="SelectedPage"/>
</div>
<div class="row mb-3">
<div class="col-md-10">
<PaginationComponent MetaData="_metaData" Spread="2" SelectedPage="SelectedPage" />
</div>
<div class="col-sm-2 text-end">
<a class="btn btn-secondary" href="/price-catalog/print"><i class="bi-printer"></i> Udskriv</a>
</div>
</div>
</div>
<CatalogTableComponent SalesItems="_items" />
@if (Working)
{
<WorkingThreeDots />
}
<CatalogTableComponent ItemList="_items"/>

View file

@ -34,23 +34,24 @@ public partial class CatalogPage : IDisposable
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public ICatalogHttpRepository ItemRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public PreferenceService PreferenceService { get; set; }
[Inject] public UserPrefService UserPrefService { get; set; }
private List<SalesItemView> _items { get; set; } = new();
private MetaData _metaData { get; set; } = new();
private CatalogPagingParams _paging = new();
private Preferences _preferences = new();
private UserPref _userPref = new();
private UserInfoView _user { get; set; } = new();
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
_preferences = await PreferenceService.GetPreferences();
_userPref = await UserPrefService.GetPreferences();
_user = await Storage.GetItemAsync<UserInfoView>("_xu");
_paging.CountryCode = _user.CountryCode;
_paging.OrderBy = _preferences.ItemSort;
_paging.SearchColumn = _preferences.ItemSearch;
_paging.PageSize = Convert.ToInt32(_preferences.PageSize);
_paging.OrderBy = _userPref.ItemSort;
_paging.SearchColumn = _userPref.ItemSearch;
_paging.PageSize = Convert.ToInt32(_userPref.PageSize);
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
@ -105,9 +106,12 @@ public partial class CatalogPage : IDisposable
private async Task GetSalesItems()
{
Working = true;
var pagingResponse = await ItemRepo.GetSalesItemsPaged(_paging);
Working = false;
_items = pagingResponse.Items!;
_metaData = pagingResponse.MetaData;
}

View 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]
//
*@
@page "/price-catalog/print"
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Advisor,Office,Warehouse")]
@if (Working)
{
<WorkingThreeDots />
}
else
{
<CatalogTablePrintComponent ItemList="Items" />
}

View file

@ -0,0 +1,56 @@
// 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 System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Blazored.LocalStorage;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Microsoft.AspNetCore.Components;
using Wonky.Client.Components;
using Wonky.Client.HttpInterfaces;
using Wonky.Client.Services;
using Wonky.Entity.DTO;
using Wonky.Entity.Requests;
using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
public partial class CatalogPrintPage : IDisposable
{
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public ICatalogHttpRepository ItemRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public UserPrefService UserPrefService { get; set; }
private List<SalesItemView> Items { get; set; } = new();
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
await GetSalesItems();
}
private async Task GetSalesItems()
{
Items = await ItemRepo.GetPriceList();
Working = false;
}
public void Dispose() => Interceptor.DisposeEvent();
}

View file

@ -233,21 +233,21 @@ else
<tbody>
<tr>
<td class="align-middle">
<InputNumber TValue="int" class="form-control" @bind-value="@Quantity"/>
<input type="number" class="form-control" @bind-value="@Quantity"/>
</td>
<td class="align-middle">
<div class="input-group">
<InputNumber TValue="decimal" class="form-control" @bind-value="@Price"/>
<input type="number" class="form-control" @bind-value="@Price"/>
<button class="btn btn-warning" type="button" @onclick="CallPriceHistoryModal">
<i class="bi-list-ul"></i>
</button>
</div>
</td>
<td class="align-middle">
<InputNumber TValue="decimal" class="form-control" @bind-value="@Discount"/>
<input type="number" class="form-control" @bind-value="@Discount"/>
</td>
<td class="align-middle align-content-center justify-content-center">
<InputCheckbox class="form-check" @bind-value="@Sas"/>
<input type="checkbox" class="form-check" @bind-value="@Sas"/>
</td>
<td class="align-middle">@SelectedItem.Sku</td>
<td class="align-middle">

View file

@ -39,7 +39,7 @@ public partial class CrmActivityNewPage : IDisposable
// Services
[Inject] public ILogger<CrmActivityNewPage> Logger { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public PreferenceService Prefs { get; set; }
[Inject] public UserPrefService Prefs { get; set; }
[Inject] public IToastService Toast { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
[Inject] public ILocalStorageService Storage { get; set; }
@ -50,7 +50,7 @@ public partial class CrmActivityNewPage : IDisposable
// variables
private readonly JsonSerializerOptions? _options = new() {PropertyNameCaseInsensitive = true};
private SalesItemView SelectedItem { get; set; } = new();
private Preferences UserPrefs { get; set; } = new();
private UserPref UserPrefs { get; set; } = new();
private ActivityDto Activity { get; set; } = new();
private CompanyDto Company = new();
private EditContext ActivityContext { get; set; }

View file

@ -38,12 +38,11 @@
}
</div>
</div>
@if (ReportStatusView.ReportItems.Any())
{
<AdvisorActivityTableComponent Activities="ReportStatusView.ReportItems"/>
}
@if (Working)
{
<LoaderThreeDots/>
<WorkingThreeDots/>
}
@if (ReportStatusView.ReportItems.Any())
{
<AdvisorActivityTableComponent ActivityList="ReportStatusView.ReportItems"/>
}

View file

@ -27,7 +27,7 @@ namespace Wonky.Client.Pages;
public partial class CrmActivityTodayPage : IDisposable
{
[Inject] public PreferenceService PreferenceService { get; set; }
[Inject] public UserPrefService UserPrefService { get; set; }
[Inject] public ILogger<CrmActivityTodayPage> Logger { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
@ -35,7 +35,7 @@ public partial class CrmActivityTodayPage : IDisposable
[Inject] public ICrmReportHttpRepository CrmReportRepo { get; set; }
[Inject] public IToastService Toaster { get; set; }
private ReportStatusView? ReportStatusView { get; set; } = new();
private Preferences Preferences { get; set; } = new();
private UserPref UserPref { get; set; } = new();
private DateTime SelectedDate { get; set; }
private bool ReportExist { get; set; }
private bool Working { get; set; } = true;
@ -44,8 +44,8 @@ public partial class CrmActivityTodayPage : IDisposable
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
Preferences = await PreferenceService.GetPreferences();
SelectedDate = string.IsNullOrWhiteSpace(Preferences.WorkDate) ? DateTime.Now : DateTime.Parse(Preferences.WorkDate);
UserPref = await UserPrefService.GetPreferences();
SelectedDate = string.IsNullOrWhiteSpace(UserPref.WorkDate) ? DateTime.Now : DateTime.Parse(UserPref.WorkDate);
ReportExist = await CrmReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}");
await GetActivities($"{SelectedDate:yyyy-MM-dd}");
Working = false;

View file

@ -23,6 +23,10 @@
@* <ReportItemComponent ReportItem="@_item" /> *@
@if (Working)
{
<LoaderThreeDots/>
}
<table class="table table-sm table-striped d-print-table">
<thead>
<tr>

View file

@ -43,6 +43,7 @@ public partial class CrmActivityViewPage : IDisposable
private EditContext NoteContext { get; set; }
private bool Disabled { get; set; }
private int GraceTime { get; set; } = 60;
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
@ -54,6 +55,7 @@ public partial class CrmActivityViewPage : IDisposable
Note.ActivityId = ReportItem.ActivityId;
Note.OfficeNote = ReportItem.OfficeNote;
Logger.LogDebug("ReportItem => \n {}", JsonSerializer.Serialize(ReportItem));
Working = false;
}
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
@ -63,6 +65,7 @@ public partial class CrmActivityViewPage : IDisposable
private async Task UpdateOfficeNote()
{
Working = true;
Disabled = true;
Logger.LogDebug("OfficeNote => \n {}", JsonSerializer.Serialize(Note));
await ActivityRepo.UpdateOfficeNote(Note);

View file

@ -20,6 +20,10 @@
@page "/companies/{CompanyId}/activities"
@attribute [Authorize(Roles = "Advisor")]
@if (Working)
{
<WorkingThreeDots/>
}
@if (!string.IsNullOrWhiteSpace(Company.Name))
{
<div class="row pt-2 pb-1 rounded-2 bg-dark text-white">
@ -92,8 +96,3 @@
}
</div>
}
@if (Working)
{
<LoaderThreeDots/>
}

View file

@ -19,6 +19,10 @@
@using Microsoft.AspNetCore.Authorization
@page "/companies/{CompanyId}/h/i"
@attribute [Authorize(Roles = "Advisor")]
@if (Working)
{
<WorkingThreeDots />
}
<div class="row pt-2 pb-1 rounded-2 bg-dark text-white">
<div class="col-sm-6">
<h4 class="pt-1">@Company.Name</h4>
@ -30,11 +34,4 @@
<a class="btn btn-primary d-block" href="/companies/@Company.CompanyId/activities/new"><i class="bi-arrow-right"></i> Besøg</a>
</div>
</div>
@if (Loading)
{
<LoaderThreeDots />
}
else
{
<ProductInventoryTableComponent CompanyId="@CompanyId" Inventory="Inventory"/>
}
<ProductInventoryTableComponent CompanyId="@CompanyId" ProductList="Inventory"/>

View file

@ -35,7 +35,7 @@ public partial class CrmCompanyInventoryPage : IDisposable
[Inject] public ILogger<CrmCompanyInventoryPage> Logger { get; set; }
private CompanyDto Company { get; set; } = new();
private List<ProductInventoryView>? Inventory { get; set; }
private bool Loading { get; set; } = true;
private bool Working { get; set; } = true;
protected override async Task OnParametersSetAsync()
{
@ -44,15 +44,18 @@ public partial class CrmCompanyInventoryPage : IDisposable
Company = await CompanyRepo.GetCompanyById(CompanyId);
await RefreshHistory();
await FetchInventory();
Working = false;
}
private async Task RefreshHistory()
private async Task FetchInventory()
{
Working = true;
Toaster.ShowInfo("Arbejder på sagen ...", "Vent venligst");
Inventory = await CrmHistoryRepo.FetchInventory(CompanyId);
Inventory = Inventory?.OrderBy(x => x.Description).ToList();
Loading = false;
if(Inventory.Any())
Inventory = Inventory.OrderBy(x => x.Description).ToList();
Working = false;
Toaster.ClearAll();
}

View file

@ -1,5 +1,11 @@
@page "/companies/{CompanyId}/invoices"
@using Wonky.Client.Components
@if (Working)
{
<WorkingThreeDots />
}
@if (!string.IsNullOrWhiteSpace(Company.Name))
{
<div class="row pt-2 pb-1 rounded-2 bg-dark text-white">
@ -15,10 +21,3 @@
</div>
<InvoiceTableComponent CompanyId="@CompanyId" InvoiceList="@History.Invoices"/>
}
else
{
@if (Loading)
{
<LoaderThreeDots />
}
}

View file

@ -19,7 +19,7 @@ public partial class CrmCompanyInvoiceListPage : IDisposable
private InvoiceListView History { get; set; } = new();
private CompanyDto Company { get; set; } = new();
private bool Loading { get; set; } = true;
private bool Working { get; set; } = true;
protected override async Task OnParametersSetAsync()
{
@ -28,14 +28,16 @@ public partial class CrmCompanyInvoiceListPage : IDisposable
Company = await CompanyRepo.GetCompanyById(CompanyId);
await GetInvoices();
await FetchInvoices();
Working = false;
}
private async Task GetInvoices()
private async Task FetchInvoices()
{
Working = true;
Toaster.ShowInfo("Arbejder på sagen ...", "Vent venligst");
History = await HistoryRepo.FetchInvoiceList(CompanyId);
Loading = false;
Working = false;
Toaster.ClearAll();
}

View file

@ -22,40 +22,39 @@
@attribute [Authorize(Roles = "Advisor")]
<div class="sticky-top bg-dark text-light rounded-2 px-3">
<div class="container-fluid pt-3">
<div class="row mb-2">
<div class="col-md-3">
<div class="row g-3">
<div class="col-sm-2">
<CompanySearchColumnComponent OnChanged="SetSearchCol" />
</div>
<div class="col-md-3">
<div class="col-sm-6">
<CompanySearchPhraseComponent OnChanged="SetSearchPhrase" />
</div>
<div class="col-md-3">
<div class="col-sm-2">
<CompanySortComponent OnChanged="SetSortCol" />
</div>
<div class="col-md-3">
<div class="col-sm-2">
<PageSizeComponent OnChanged="SetPageSize" />
</div>
</div>
<div class="row mb-2">
<div class="col-3">
<div class="col-sm-2">
<div class="form-check">
<input type="checkbox" id="folded" class="form-check-input" checked="@_includeFolded" @onclick="OnFoldedClick" >
<input type="checkbox" id="folded" class="form-check-input" checked="@IncludeFolded" @onclick="OnFoldedClick" >
<label for="folded" class="form-check-label">Ophørte</label>
</div>
</div>
<div class="col-6">
<PaginationComponent MetaData="_metaData" Spread="2" SelectedPage="SelectedPage"/>
</div>
<div class="col-3 justify-content-end">
<a class="btn btn-success text-nowrap" href="/companies/new">Opret kunde</a>
<div class="col-sm-8">
<PaginationComponent MetaData="PageData" Spread="2" SelectedPage="SelectedPage"/>
</div>
<div class="col-sm-2 text-end">
<a class="btn btn-success text-nowrap" href="/companies/new">Opret kunde <i class="bi-plus"></i></a>
</div>
</div>
</div>
<AdvisorCompanyTableComponent Companies="_companyList" OnDelete="DeleteCompany" />
@if (Working)
{
<LoaderThreeDots />
<WorkingThreeDots />
}
else
{
<AdvisorCompanyTableComponent CompanyList="Companies" OnDelete="DeleteCompany" />
}

View file

@ -30,92 +30,87 @@ namespace Wonky.Client.Pages
{
public partial class CrmCompanyListPage : IDisposable
{
[Inject] public ILocalStorageService _storage { get; set; }
[Inject] public PreferenceService _preferenceService { get; set; }
[Inject] public ICrmCompanyHttpRepository _companyRepo { get; set; }
[Inject] public HttpInterceptorService _interceptor { get; set; }
[Inject] public NavigationManager _navigator { get; set; }
private List<CompanyDto> _companyList { get; set; } = new();
private MetaData _metaData { get; set; } = new();
private CompanyPagingParams _paging = new();
private Preferences _preferences { get; set; } = new();
private UserInfoView _userInfo { get; set; } = new();
private string _savedSearch { get; set; } = "";
private bool _includeFolded { get; set; }
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public UserPrefService PrefService { get; set; }
[Inject] public ICrmCompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
private List<CompanyDto> Companies { get; set; } = new();
private MetaData PageData { get; set; } = new();
private CompanyPagingParams PageParams = new();
private UserPref Prefs { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new();
private string SavedSearch { get; set; } = "";
private bool IncludeFolded { get; set; }
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
// set preferences
_preferences = await _preferenceService.GetPreferences();
_userInfo = await _storage.GetItemAsync<UserInfoView>("_xu");
_paging.OrderBy = _preferences.CompanySort;
_paging.SearchColumn = _preferences.CompanySearch;
_paging.PageSize = Convert.ToInt32(_preferences.PageSize);
_paging.HasFolded = _includeFolded ? 1 : 0;
_paging.CountryCode = _userInfo.CountryCode;
Prefs = await PrefService.GetPreferences();
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
PageParams.OrderBy = Prefs.CompanySort;
PageParams.SearchColumn = Prefs.CompanySearch;
PageParams.PageSize = Convert.ToInt32(Prefs.PageSize);
PageParams.HasFolded = IncludeFolded ? 1 : 0;
PageParams.CountryCode = UserInfo.CountryCode;
// load saved search
_savedSearch = _preferences.CompanyFilterPhrase;
_paging.SearchTerm = _savedSearch;
SavedSearch = string.IsNullOrWhiteSpace(Prefs.CompanyFilterPhrase) ? "" : Prefs.CompanyFilterPhrase;
PageParams.SearchTerm = SavedSearch;
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
// get companies
await GetCompanies();
await FetchCompanies();
Working = false;
}
private async Task OnFoldedClick()
{
_includeFolded = !_includeFolded;
_companyList = new List<CompanyDto>();
_paging.PageNumber = 1;
_paging.HasFolded = _includeFolded ? 1 : 0;
await GetCompanies();
IncludeFolded = !IncludeFolded;
Companies = new List<CompanyDto>();
PageParams.PageNumber = 1;
PageParams.HasFolded = IncludeFolded ? 1 : 0;
await FetchCompanies();
}
private async Task SelectedPage(int page)
{
_companyList = new List<CompanyDto>();
_paging.PageNumber = page;
await GetCompanies();
Companies = new List<CompanyDto>();
PageParams.PageNumber = page;
await FetchCompanies();
}
private async Task SetSearchCol(string searchColumn)
{
_companyList = new List<CompanyDto>();
_paging.SearchColumn = searchColumn;
_paging.PageNumber = 1;
await GetCompanies();
Companies = new List<CompanyDto>();
PageParams.SearchColumn = searchColumn;
PageParams.PageNumber = 1;
await FetchCompanies();
}
private async Task SetPageSize(string pageSize)
{
_companyList = new List<CompanyDto>();
_paging.PageSize = Convert.ToInt32(pageSize);
_paging.PageNumber = 1;
await GetCompanies();
Companies = new List<CompanyDto>();
PageParams.PageSize = Convert.ToInt32(pageSize);
PageParams.PageNumber = 1;
await FetchCompanies();
}
private async Task SetSearchPhrase(string searchTerm)
{
// if (!string.IsNullOrWhiteSpace(searchTerm) && searchTerm.Length < 3) return;
_companyList = new List<CompanyDto>();
_paging.PageNumber = 1;
_paging.SearchTerm = searchTerm;
await GetCompanies();
if (!string.IsNullOrWhiteSpace(searchTerm) && searchTerm.TrimEnd().Length > 2)
{
_savedSearch = searchTerm;
await _preferenceService.SetCompanyFilterPhrase(searchTerm.Trim());
}
Companies = new List<CompanyDto>();
PageParams.PageNumber = 1;
PageParams.SearchTerm = searchTerm;
await FetchCompanies();
}
private async Task SetSortCol(string orderBy)
{
_companyList = new List<CompanyDto>();
_paging.OrderBy = orderBy;
await GetCompanies();
Companies = new List<CompanyDto>();
PageParams.OrderBy = orderBy;
await FetchCompanies();
}
/// <summary>
@ -124,23 +119,31 @@ namespace Wonky.Client.Pages
/// <param name="companyId"></param>
private async Task DeleteCompany(string companyId)
{
_companyList = new List<CompanyDto>();
await _companyRepo.DeleteCompany(companyId);
if (_paging.PageNumber > 1 && _companyList.Count == 1)
_paging.PageNumber--;
await GetCompanies();
Companies = new List<CompanyDto>();
await CompanyRepo.DeleteCompany(companyId);
if (PageParams.PageNumber > 1 && Companies.Count == 1)
PageParams.PageNumber--;
await FetchCompanies();
}
private async Task GetCompanies()
private async Task FetchCompanies()
{
Working = true;
var pagingResponse = await _companyRepo.GetCompanies(_paging);
_companyList = pagingResponse.Items;
_metaData = pagingResponse.MetaData;
var pagingResponse = await CompanyRepo.GetCompanies(PageParams);
Working = false;
if (pagingResponse.Items.Any())
{
Companies = pagingResponse.Items;
PageData = pagingResponse.MetaData;
}
else
{
Companies = new List<CompanyDto>();
PageData = new MetaData();
}
}
public void Dispose() => _interceptor.DisposeEvent();
public void Dispose() => Interceptor.DisposeEvent();
}
}

View file

@ -23,7 +23,10 @@
<h2>Opret kunde</h2>
@if (Working)
{
<WorkingThreeDots/>
}
<EditForm EditContext="CompanyContext" OnValidSubmit="SubmitCompanyForm">
<DataAnnotationsValidator/>
<InputText type="hidden" id="salesRepId" @bind-Value="Company.SalesRepId"/>

View file

@ -59,6 +59,7 @@ namespace Wonky.Client.Pages
private DateTime NextVisit { get; set; }
private bool Dk { get; set; } = true;
private bool ShowInfos = true;
private bool Working { get; set; }
protected override async Task OnInitializedAsync()
{
@ -139,10 +140,8 @@ namespace Wonky.Client.Pages
// this can be removed in favor of the new data returned from updating the VatNumber
RegState = regInfo.States[0].State.ToLower() == "normal" ? "the-good" : "the-dead";
if (regInfo.SyncAll)
{
Company.Name = regInfo.Name;
Company.Address1 = regInfo.Address;
Company.Address2 = regInfo.CoName;
@ -168,6 +167,7 @@ namespace Wonky.Client.Pages
}
private async Task SubmitCompanyForm()
{
Working = true;
FormInvalid = true;
Company.LastVisit = $"{LastVisit:yyyy-MM-dd}";
Company.NextVisit = $"{NextVisit:yyyy-MM-dd}";
@ -184,6 +184,8 @@ namespace Wonky.Client.Pages
Toaster.ShowWarning($"'{Company.Name}' IKKE oprettet.");
FormInvalid = false;
}
Working = false;
}
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)

View file

@ -23,7 +23,7 @@
@if (Working)
{
<LoaderThreeDots />
<WorkingThreeDots />
}
@if (!string.IsNullOrWhiteSpace(Company.Account))
{
@ -131,7 +131,7 @@
@* activity buttons *@
<div class="row mt-3 mb-2">
<div class="col">
<a class="btn btn-dark opacity-50 d-block" href="/companies/@Company.CompanyId/invoices">Poster</a>
<a class="btn btn-dark opacity-50 d-block" href="/companies/@Company.CompanyId/invoices">Faktura</a>
</div>
<div class="col">
<a class="btn btn-dark opacity-50 d-block" href="/companies/@Company.CompanyId/quotes">Tilbud</a>

View file

@ -76,7 +76,7 @@ public partial class CrmCompanyViewPage : IDisposable
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
// fetch company from backend
await GetCompany(CompanyId);
await FetchCompany(CompanyId);
// initialize default contact
DefaultContact = new ContactDto { CompanyId = CompanyId, ContactId = "", FirstName = ""};
// setup form context
@ -87,7 +87,7 @@ public partial class CrmCompanyViewPage : IDisposable
// call background task to sync backend with erp
await SyncCompanyHistory(CompanyId, Company.HistorySync);
// call background task to fetch contacts
await GetContacts(CompanyId);
await FetchContacts(CompanyId);
// remove loading image
Working = false;
}
@ -96,7 +96,7 @@ public partial class CrmCompanyViewPage : IDisposable
/// Get company by id
/// </summary>
/// <param name="companyId"></param>
private async Task GetCompany(string companyId)
private async Task FetchCompany(string companyId)
{
Company = await CompanyRepo.GetCompanyById(companyId);
CurrentVat = Company.VatNumber;
@ -142,17 +142,20 @@ public partial class CrmCompanyViewPage : IDisposable
// create search address from address
if (CountryIsDk)
CompanyVatAddress = PrepareVatAddress(Company);
Working = false;
}
/// <summary>
/// Fetch contacts from backend
/// </summary>
/// <param name="companyId"></param>
private async Task GetContacts(string companyId)
private async Task FetchContacts(string companyId)
{
Working = true;
// load contacts
Contacts = await ContactRepo.GetContacts(companyId);
Contacts = Contacts.OrderBy(x => x.FirstName).ToList();
Working = false;
}
/// <summary>
@ -207,6 +210,7 @@ public partial class CrmCompanyViewPage : IDisposable
/// <param name="contact"></param>
private async Task WriteContactCallback(ContactDto contact)
{
Working = true;
// write contact to debug log
Logger.LogDebug("CompanyView => SaveContactCallback <= {}", JsonSerializer.Serialize(contact));
if (string.IsNullOrWhiteSpace(contact.ContactId))
@ -226,7 +230,8 @@ public partial class CrmCompanyViewPage : IDisposable
// reset selected contact
SelectedContact = new ContactDto();
// reload contacts from backend
await GetContacts(CompanyId);
await FetchContacts(CompanyId);
Working = false;
}
/// <summary>
@ -235,13 +240,15 @@ public partial class CrmCompanyViewPage : IDisposable
/// <param name="contactId"></param>
private async Task DeleteContactCallback(string contactId)
{
Working = true;
Logger.LogDebug("delete {}", contactId);
// send delete request to backend
await ContactRepo.DeleteContact(CompanyId, contactId);
// reset selected contact
SelectedContact = new ContactDto();
// reload contacts from backend
await GetContacts(CompanyId);
await FetchContacts(CompanyId);
Working = false;
}
/// <summary>
@ -346,8 +353,10 @@ public partial class CrmCompanyViewPage : IDisposable
/// </summary>
private async Task SyncCompanyHistory(string companyId, string syncDate)
{
Working = true;
// send rpc request to backend
await HistoryRepo.RpcSyncErpToCrm(companyId, syncDate);
Working = false;
}
/// <summary>

View file

@ -18,9 +18,13 @@
@using Wonky.Client.Components
@page "/sales-reports"
<div class="alert text-black border border-1">
@if (Working)
{
<WorkingThreeDots/>
}
<div class="alert text-black border border-1">
<div class="col">
<h3>Rapport Arkiv</h3>
</div>
</div>
<ReportTableComponent ReportList="_reports" />
</div>
<ReportTableComponent ReportList="ReportList" />

View file

@ -25,20 +25,22 @@ namespace Wonky.Client.Pages;
public partial class CrmReportListPage : IDisposable
{
[Inject] public ICrmReportHttpRepository CrmReportRepo { get; set; }
[Inject] public HttpInterceptorService _interceptor { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
private List<NgSalesReportListView> _reports { get; set; }
private List<NgSalesReportListView> ReportList { get; set; } = new();
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
_reports = await CrmReportRepo.GetReports();
ReportList = await CrmReportRepo.GetReports();
Working = false;
}
public void Dispose()
{
_interceptor.DisposeEvent();
Interceptor.DisposeEvent();
}
}

View file

@ -22,7 +22,7 @@
@if (Working)
{
<LoaderThreeDots/>
<WorkingThreeDots/>
}
@* report header *@
@ -76,7 +76,7 @@
}
else
{
Report.Figures.KmMorning = Preferences.KmMorning;
Report.Figures.KmMorning = UserPref.KmMorning;
<td>
<input type="time" id="checkIn" class="form-control"
@bind-Value="_checkIn" @bind-Value:event="oninput" @onchange="OnTimeChanged"/>

View file

@ -35,7 +35,7 @@ namespace Wonky.Client.Pages;
public partial class CrmReportNewPage : IDisposable
{
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public PreferenceService PreferenceService { get; set; }
[Inject] public UserPrefService UserPrefService { get; set; }
[Inject] public ICrmActivityHttpRepository CrmActivityRepo { get; set; }
[Inject] public ICrmReportHttpRepository CrmReportRepo { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
@ -45,7 +45,7 @@ public partial class CrmReportNewPage : IDisposable
private ReportDto Report { get; set; } = new();
private List<ReportItemView> Activities { get; set; } = new();
private ReportFiguresDto InitialValues { get; set; }
private Preferences Preferences { get; set; } = new();
private UserPref UserPref { get; set; } = new();
private bool FormInvalid { get; set; } = true;
private bool NoFigures { get; set; } = true;
private bool Working { get; set; } = true;
@ -68,12 +68,12 @@ public partial class CrmReportNewPage : IDisposable
ReportContext.OnFieldChanged += HandleFieldChanged;
ReportContext.OnValidationStateChanged += ValidationChanged;
Preferences = await PreferenceService.GetPreferences();
if (!string.IsNullOrWhiteSpace(Preferences.WorkDate))
_workDate = DateTime.Parse(Preferences.WorkDate);
UserPref = await UserPrefService.GetPreferences();
if (!string.IsNullOrWhiteSpace(UserPref.WorkDate))
_workDate = DateTime.Parse(UserPref.WorkDate);
if(await CrmReportRepo.ReportExist(Preferences.WorkDate))
Navigator.NavigateTo($"/sales-reports/view/{Preferences.WorkDate}");
if(await CrmReportRepo.ReportExist(UserPref.WorkDate))
Navigator.NavigateTo($"/sales-reports/view/{UserPref.WorkDate}");
BeginLeave = _workDate;
EndLeave = _workDate;
@ -84,6 +84,7 @@ public partial class CrmReportNewPage : IDisposable
Report.Figures.Distance = 0;
Report.Figures.DistancePrivateMonth = 0;
await GetKeyFigures();
Working = false;
}
/// <summary>
@ -127,7 +128,7 @@ public partial class CrmReportNewPage : IDisposable
// reset km and date confirmation
// await PreferenceService.SetKmMorning(0);
// reset date confirmed
await PreferenceService.SetDateConfirmed(false);
await UserPrefService.SetDateConfirmed(false);
Navigator.NavigateTo($"/sales-reports/view/{_workDate:yyyy-MM-dd}");
}
/// <summary>
@ -235,7 +236,7 @@ public partial class CrmReportNewPage : IDisposable
Activities = data.ReportItems;
if(!Report.DayTypeEnum.ToLower().Contains("leave"))
Report.Figures.KmMorning = Preferences.KmMorning;
Report.Figures.KmMorning = UserPref.KmMorning;
NoFigures = false;
Working = false;

View file

@ -20,6 +20,10 @@
@page "/sales-reports/view/{ReportDate}"
@attribute [Authorize(Roles = "Advisor,Admin,Supervisor")]
@if (Working)
{
<WorkingThreeDots/>
}
<div class="report-main">
<div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center d-print-none">
@ -45,7 +49,7 @@
<ReportDistanceLedgerComponent ReportData="_report.ReportData" />
</div>
</div>
<OfficeActivityTableComponent Activities="_report.ReportItems" />
<OfficeActivityTableComponent ActivityList="_report.ReportItems" />
<ReportActivityLedgerComponent ReportData="_report.ReportData" />
}
else

View file

@ -28,6 +28,7 @@ public partial class CrmReportViewPage
[Inject] public NavigationManager _navigator { 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()
{
@ -35,10 +36,13 @@ public partial class CrmReportViewPage
{
await GetReport(ReportDate);
}
Working = false;
}
private async Task GetReport(string workDate)
{
Working = true;
_report = new ReportView();
_items = new List<ReportItemView>();
@ -47,6 +51,6 @@ public partial class CrmReportViewPage
_report = await CrmReportRepo.GetReport(workDate);
_items = _report.ReportItems.Where(x => x.Lines.Any()).ToList();
Working = false;
}
}

View file

@ -20,6 +20,10 @@
@attribute [Authorize(Roles = "Advisor")]
@page "/task-items"
@if (Working)
{
<WorkingThreeDots/>
}
<div class="card">
<div class="card-header">
<div class="row mb-1 align-items-center">

View file

@ -27,34 +27,38 @@ namespace Wonky.Client.Pages;
public partial class CrmTaskItemListPage : IDisposable
{
[Inject] public PreferenceService PreferenceService { get; set; }
[Inject] public UserPrefService UserPrefService { get; set; }
[Inject] public ILogger<CrmTaskItemListPage> Logger { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
[Inject] public ICrmTaskItemHttpRepository TaskItemRepo { get; set; }
[Inject] public IToastService Toaster { get; set; }
private Preferences Prefs { get; set; } = new();
private UserPref Prefs { get; set; } = new();
private string WorkDate { get; set; } = $"{DateTime.Now:yyyy-MM-dd}";
private bool ReportExist = false;
private List<TaskItemDto> TaskItems { get; set; } = new();
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
Prefs = await PreferenceService.GetPreferences();
Prefs = await UserPrefService.GetPreferences();
if(!string.IsNullOrWhiteSpace(Prefs.WorkDate))
WorkDate = Prefs.WorkDate;
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
await GetTaskItems(WorkDate);
Working = false;
}
private async Task GetTaskItems(string workDate)
{
Working = true;
Toaster.ShowInfo("Vent nogle sekunder for data");
TaskItems = await TaskItemRepo.GetTaskList(workDate);
Toaster.ClearAll();
Working = false;
}
public void Dispose()

View file

@ -19,6 +19,10 @@
@attribute [Authorize(Roles = "Advisor")]
@page "/tasks/{TaskItemId}"
@if (Working)
{
<WorkingThreeDots/>
}
<div class="card">
<div class="card-header">
<h3>Opgave</h3>

View file

@ -31,6 +31,7 @@ public partial class CrmTaskItemViewPage : IDisposable
[Inject] public ICrmTaskItemHttpRepository CrmTaskItemRepo { get; set; }
private TaskItemDto _taskItem = new ();
private EditContext _editContext { get; set; }
private bool Working { get; set; } = true;
protected override async Task OnParametersSetAsync()
@ -40,6 +41,7 @@ public partial class CrmTaskItemViewPage : IDisposable
_taskItem = await CrmTaskItemRepo.GetTaskItem(TaskItemId);
Console.WriteLine(JsonSerializer.Serialize(_taskItem));
Working = false;
}
protected override void OnInitialized()

View file

@ -21,3 +21,7 @@
@page "/companies/{CompanyId}/workplaces/{WorkplaceId}/documents"
<h2>Dokumenter</h2>
@if (Working)
{
<WorkingThreeDots/>
}

View file

@ -28,9 +28,6 @@ public partial class CrmWorkplaceDocumentListPage
[Inject] public HttpInterceptorService _interceptor { get; set; }
[Inject] public ICrmWorkplaceHttpRepository CrmWorkplaceRepo { get; set; }
private bool Working { get; set; } = true;
protected override async Task OnParametersSetAsync()
{
}
}

View file

@ -25,6 +25,10 @@
<h2>@_company.Name</h2>
</div>
</div>
@if (Working)
{
<WorkingThreeDots/>
}
<div class="row">
<WorkplaceListComponent CompanyId="@CompanyId" Workplaces="@_workplaces" />
</div>

View file

@ -32,17 +32,21 @@ public partial class CrmWorkplaceListPage : IDisposable
[Inject] public HttpInterceptorService _interceptor { get; set; }
private List<WorkplaceListView> _workplaces { get; set; } = new();
private CompanyDto _company { get; set; } = new();
private bool Working { get; set; } = true;
protected override async Task OnParametersSetAsync()
{
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
_company = await _companyRepo.GetCompanyById(CompanyId);
Working = false;
}
protected override async Task OnInitializedAsync()
{
Working = true;
_workplaces = await CrmWorkplaceRepo.GetWorkplaces(CompanyId);
Working = false;
}
public void Dispose()

View file

@ -20,6 +20,10 @@
@attribute [Authorize(Roles = "Advisor")]
@page "/companies/{CompanyId}/workplaces/{WorkplaceId}"
@if (Working)
{
<WorkingThreeDots/>
}
<div class="card">
<div class="card-header">
<div class="card-title">

View file

@ -35,12 +35,15 @@ public partial class CrmWorkplaceViewPage : IDisposable
[Inject] public NavigationManager _navigator { get; set; }
private WorkplaceDto _workplace { get; set; } = new();
private EditContext _editContext { get; set; }
private bool Working { get; set; } = true;
protected override async Task OnParametersSetAsync()
{
_interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent();
_workplace = await CrmWorkplaceRepo.GetWorkplace(CompanyId, WorkplaceId);
Working = false;
}
protected override void OnInitialized()
@ -50,11 +53,14 @@ public partial class CrmWorkplaceViewPage : IDisposable
private async Task SubmitUpdate()
{
Working = true;
await CrmWorkplaceRepo.UpdateWorkplace(CompanyId, _workplace);
Working = false;
}
private async Task DeleteWorkplace()
{
Working = true;
await CrmWorkplaceRepo.DeleteWorkplace(CompanyId, _workplace.WorkplaceId);
_navigator.NavigateTo($"/companies/{CompanyId}/workplaces");
}

View file

@ -67,7 +67,7 @@
<div class="col d-flex justify-content-center">
@if (execLogin)
{
<LoaderThreeDots/>
<WorkingThreeDots/>
}
</div>
</div>

View file

@ -53,4 +53,8 @@
</div>
</div>
<AdvisorCompanyTableComponent Companies="_companyList" />
@if (Working)
{
<WorkingThreeDots/>
}
<AdvisorCompanyTableComponent CompanyList="_companyList" />

View file

@ -30,13 +30,14 @@ public partial class OfficeCustomerListPage : IDisposable
[Inject] public ILogger<OfficeCustomerListPage> Logger { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IOfficeCustomerHttpRepository CustomerRepo { get; set; }
[Inject] public PreferenceService PreferenceService { get; set; }
[Inject] public UserPrefService UserPrefService { get; set; }
private List<CompanyDto> _companyList { get; set; } = new();
private MetaData _metaData { get; set; } = new();
private CompanyPagingParams _paging = new();
private Preferences _preferences { get; set; } = new();
private UserPref UserPref { get; set; } = new();
private string _savedSearch { get; set; } = "";
private bool _includeFolded { get; set; }
private bool Working { get; set; } = true;
protected override async Task OnParametersSetAsync()
{
@ -44,20 +45,21 @@ public partial class OfficeCustomerListPage : IDisposable
Interceptor.RegisterBeforeSendEvent();
// set preferences
_preferences = await PreferenceService.GetPreferences();
UserPref = await UserPrefService.GetPreferences();
_paging.CountryCode = CountryCode;
_paging.OrderBy = _preferences.CompanySort;
_paging.SearchColumn = _preferences.CompanySearch;
_paging.PageSize = Convert.ToInt32(_preferences.PageSize);
_paging.OrderBy = UserPref.CompanySort;
_paging.SearchColumn = UserPref.CompanySearch;
_paging.PageSize = Convert.ToInt32(UserPref.PageSize);
_paging.HasFolded = _includeFolded ? 1 : 0;
// load saved search
_savedSearch = _preferences.CompanyFilterPhrase;
_savedSearch = UserPref.CompanyFilterPhrase;
_paging.SearchTerm = _savedSearch;
await GetCompanies();
await FetchCompanies();
Working = false;
}
private async Task OnFoldedClick()
@ -66,14 +68,14 @@ public partial class OfficeCustomerListPage : IDisposable
_companyList = new List<CompanyDto>();
_paging.PageNumber = 1;
_paging.HasFolded = _includeFolded ? 1 : 0;
await GetCompanies();
await FetchCompanies();
}
private async Task SelectedPage(int page)
{
_companyList = new List<CompanyDto>();
_paging.PageNumber = page;
await GetCompanies();
await FetchCompanies();
}
private async Task SetSearchCol(string searchColumn)
@ -81,14 +83,14 @@ public partial class OfficeCustomerListPage : IDisposable
_companyList = new List<CompanyDto>();
_paging.SearchColumn = searchColumn;
_paging.PageNumber = 1;
await GetCompanies();
await FetchCompanies();
}
private async Task SetPageSize(string pageSize)
{
_companyList = new List<CompanyDto>();
_paging.PageSize = Convert.ToInt32(pageSize);
_paging.PageNumber = 1;
await GetCompanies();
await FetchCompanies();
}
private async Task SetSearchPhrase(string searchTerm)
@ -98,11 +100,11 @@ public partial class OfficeCustomerListPage : IDisposable
_companyList = new List<CompanyDto>();
_paging.PageNumber = 1;
_paging.SearchTerm = searchTerm;
await GetCompanies();
await FetchCompanies();
if (!string.IsNullOrWhiteSpace(searchTerm) && searchTerm.TrimEnd().Length > 2)
{
_savedSearch = searchTerm;
await PreferenceService.SetCompanyFilterPhrase(searchTerm.Trim());
await UserPrefService.SetCompanyFilterPhrase(searchTerm.Trim());
}
}
@ -110,14 +112,16 @@ public partial class OfficeCustomerListPage : IDisposable
{
_companyList = new List<CompanyDto>();
_paging.OrderBy = orderBy;
await GetCompanies();
await FetchCompanies();
}
private async Task GetCompanies()
private async Task FetchCompanies()
{
Working = true;
var pagingResponse = await CustomerRepo.GetCompaniesPagedSalesRep(UserId, _paging);
_companyList = pagingResponse.Items;
_metaData = pagingResponse.MetaData;
Working = false;
}
public void Dispose()

View file

@ -52,5 +52,8 @@
</div>
</div>
</div>
<OfficeCustomerTableComponent Companies="_companyList" />
@if (Working)
{
<WorkingThreeDots/>
}
<OfficeCustomerTableComponent CompanyList="_companyList" />

View file

@ -30,13 +30,14 @@ public partial class OfficeCustomerSalesRepListPage : IDisposable
[Inject] public ILogger<OfficeCustomerSalesRepListPage> Logger { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IOfficeCustomerHttpRepository CustomerRepo { get; set; }
[Inject] public PreferenceService PreferenceService { get; set; }
[Inject] public UserPrefService UserPrefService { get; set; }
private List<CompanyDto> _companyList { get; set; } = new();
private MetaData _metaData { get; set; } = new();
private CompanyPagingParams _paging = new();
private Preferences _preferences { get; set; } = new();
private UserPref UserPref { get; set; } = new();
private string _savedSearch { get; set; } = "";
private bool _includeFolded { get; set; }
private bool Working { get; set; } = true;
protected override async Task OnParametersSetAsync()
{
@ -44,18 +45,19 @@ public partial class OfficeCustomerSalesRepListPage : IDisposable
Interceptor.RegisterBeforeSendEvent();
// set preferences
_preferences = await PreferenceService.GetPreferences();
UserPref = await UserPrefService.GetPreferences();
_paging.CountryCode = CountryCode;
_paging.OrderBy = _preferences.CompanySort;
_paging.SearchColumn = _preferences.CompanySearch;
_paging.PageSize = Convert.ToInt32(_preferences.PageSize);
_paging.OrderBy = UserPref.CompanySort;
_paging.SearchColumn = UserPref.CompanySearch;
_paging.PageSize = Convert.ToInt32(UserPref.PageSize);
_paging.HasFolded = _includeFolded ? 1 : 0;
// load saved search
_savedSearch = _preferences.CompanyFilterPhrase;
_savedSearch = UserPref.CompanyFilterPhrase;
_paging.SearchTerm = _savedSearch;
await GetCompanies();
await FetchCompanies();
Working = false;
}
private async Task OnFoldedClick()
@ -64,14 +66,14 @@ public partial class OfficeCustomerSalesRepListPage : IDisposable
_companyList = new List<CompanyDto>();
_paging.PageNumber = 1;
_paging.HasFolded = _includeFolded ? 1 : 0;
await GetCompanies();
await FetchCompanies();
}
private async Task SelectedPage(int page)
{
_companyList = new List<CompanyDto>();
_paging.PageNumber = page;
await GetCompanies();
await FetchCompanies();
}
private async Task SetSearchCol(string searchColumn)
@ -79,7 +81,7 @@ public partial class OfficeCustomerSalesRepListPage : IDisposable
_companyList = new List<CompanyDto>();
_paging.SearchColumn = searchColumn;
_paging.PageNumber = 1;
await GetCompanies();
await FetchCompanies();
}
private async Task SetPageSize(string pageSize)
@ -87,7 +89,7 @@ public partial class OfficeCustomerSalesRepListPage : IDisposable
_companyList = new List<CompanyDto>();
_paging.PageSize = Convert.ToInt32(pageSize);
_paging.PageNumber = 1;
await GetCompanies();
await FetchCompanies();
}
private async Task SetSearchPhrase(string searchTerm)
@ -97,11 +99,11 @@ public partial class OfficeCustomerSalesRepListPage : IDisposable
_companyList = new List<CompanyDto>();
_paging.PageNumber = 1;
_paging.SearchTerm = searchTerm;
await GetCompanies();
await FetchCompanies();
if (!string.IsNullOrWhiteSpace(searchTerm) && searchTerm.TrimEnd().Length > 2)
{
_savedSearch = searchTerm;
await PreferenceService.SetCompanyFilterPhrase(searchTerm.Trim());
await UserPrefService.SetCompanyFilterPhrase(searchTerm.Trim());
}
}
@ -109,14 +111,16 @@ public partial class OfficeCustomerSalesRepListPage : IDisposable
{
_companyList = new List<CompanyDto>();
_paging.OrderBy = orderBy;
await GetCompanies();
await FetchCompanies();
}
private async Task GetCompanies()
private async Task FetchCompanies()
{
Working = true;
var pagingResponse = await CustomerRepo.GetCompaniesPagedSalesRep(UserId, _paging);
_companyList = pagingResponse.Items;
_metaData = pagingResponse.MetaData;
Working = false;
}
public void Dispose()

View file

@ -20,6 +20,10 @@
@attribute [Authorize(Roles = "Admin,Office,Warehouse")]
@page "/office/customers/{CompanyId}/orders/new"
@if (Working)
{
<WorkingThreeDots/>
}
<EditForm EditContext="_editContext">
<DataAnnotationsValidator/>
<div class="row mb-1">
@ -186,7 +190,7 @@
<div class="card-footer">
@if (HideButton)
{
<LoaderThreeDots/>
<WorkingThreeDots/>
}
else
{

View file

@ -53,6 +53,7 @@ public partial class OfficeOrderNewPage : IDisposable
private bool Sas { get; set; }
private bool FormInvalid { get; set; } = true;
private bool HideButton { get; set; }
private bool Working { get; set; } = true;
protected override async Task OnParametersSetAsync()
{
@ -107,6 +108,8 @@ public partial class OfficeOrderNewPage : IDisposable
_activity.DlvZipCode = _company.ZipCode;
_activity.DlvCity = _company.City;
Working = false;
}
private void CallPriceListModal()
{
@ -128,7 +131,9 @@ public partial class OfficeOrderNewPage : IDisposable
private async Task CreateOrder()
{
Working = true;
await CrmActivityRepo.CreateActivity(_activity);
Working = false;
}
private async Task AddItem(SalesItemView salesItem)
{

View file

@ -20,6 +20,10 @@
@attribute [Authorize(Roles = "Admin,Office,Warehouse,Advisor")]
@page "/office/customers/{CompanyId}/orders/{OrderId}"
@if (Working)
{
<WorkingThreeDots/>
}
<table class="table table-sm table-striped d-print-table">
<thead>
<tr>

View file

@ -43,6 +43,7 @@ public partial class OfficeOrderViewPage : IDisposable
[Inject] public IToastService Toast { get; set; }
private ReportItemView _reportItem { get; set; } = new();
private bool _isNotified { get; set; }
private bool Working { get; set; } = true;
private readonly JsonSerializerOptions? _options = new JsonSerializerOptions
{
@ -55,6 +56,7 @@ public partial class OfficeOrderViewPage : IDisposable
Interceptor.RegisterBeforeSendEvent();
_reportItem = await ActivityRepo.GetReportItem(OrderId);
Logger.LogDebug("ReportItem => \n {}", JsonSerializer.Serialize(_reportItem, _options));
Working = false;
}
/// <summary>
@ -62,6 +64,9 @@ public partial class OfficeOrderViewPage : IDisposable
/// </summary>
private async Task SetExpressState()
{
if (Working)
return;
Working = true;
Logger.LogDebug("SetExpressState => \n {}", JsonSerializer.Serialize(_reportItem, _options));
var responseView = await ActivityRepo.SetProcessStateExpress(_reportItem.ActivityId);
Logger.LogDebug("SetExpressState => \n {}", responseView.Message );
@ -69,6 +74,7 @@ public partial class OfficeOrderViewPage : IDisposable
if (!responseView.IsSuccess)
{
Toast.ShowError(responseView.Message);
Working = false;
return;
}
@ -120,6 +126,7 @@ public partial class OfficeOrderViewPage : IDisposable
}
_isNotified = true;
Working = false;
}
public void Dispose()

View file

@ -20,6 +20,10 @@
@attribute [Authorize(Roles = "Admin")]
@page "/office/users/advisors/{CountryCode}/{UserId}/reports"
@if (Working)
{
<WorkingThreeDots/>
}
<div class="card">
<div class="card-header bg-dark text-white">
<div class="row">

View file

@ -29,6 +29,7 @@ public partial class OfficeReportListPage : IDisposable
[Inject] public IOfficeReportHttpRepository _reportRepo { get; set; }
[Inject] public HttpInterceptorService _interceptor { get; set; }
private List<NgSalesReportListView> _reports { get; set; }
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
@ -36,6 +37,7 @@ public partial class OfficeReportListPage : IDisposable
_interceptor.RegisterBeforeSendEvent();
_reports = await _reportRepo.GetReports(UserId);
Working = false;
}
public void Dispose()

View file

@ -20,13 +20,18 @@
@page "/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}"
@attribute [Authorize(Roles = "Admin")]
@if (Working)
{
<WorkingThreeDots/>
}
<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="GetReport" />
<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>
@ -51,7 +56,7 @@
<ReportDistanceLedgerComponent ReportData="Report.ReportData" />
</div>
</div>
<OfficeActivityTableComponent Activities="Report.ReportItems" />
<OfficeActivityTableComponent ActivityList="Report.ReportItems" />
<ReportActivityLedgerComponent ReportData="Report.ReportData" />
}
else

Some files were not shown because too many files have changed in this diff Show more