WIP refactor namespace

This commit is contained in:
Frede Hundewadt 2023-01-16 13:53:09 +01:00
parent 7c43c7d196
commit 431fef2d4b
82 changed files with 335 additions and 1095 deletions

View file

@ -32,7 +32,7 @@
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk"> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk">
<i class="bi-phone"></i> Tlf.Ordre <i class="bi-phone"></i> Tlf.Ordre
</a> </a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/dk"> <a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/dk">
<i class="bi-file-spreadsheet"></i> Priser <i class="bi-file-spreadsheet"></i> Priser
</a> </a>
</div> </div>
@ -53,7 +53,7 @@
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no"> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no">
<i class="bi-phone"></i> Tlf.Ordre <i class="bi-phone"></i> Tlf.Ordre
</a> </a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/no"> <a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/no">
<i class="bi-file-spreadsheet"></i> Priser <i class="bi-file-spreadsheet"></i> Priser
</a> </a>
</div> </div>
@ -74,7 +74,7 @@
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se"> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se">
<i class="bi-phone"></i> Tlf.Ordre <i class="bi-phone"></i> Tlf.Ordre
</a> </a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/se"> <a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/se">
<i class="bi-file-spreadsheet"></i> Priser <i class="bi-file-spreadsheet"></i> Priser
</a> </a>
</div> </div>

View file

@ -29,12 +29,14 @@ namespace Wonky.Client.Components
private Dictionary<string, string> Items { get; set; } = new(); private Dictionary<string, string> Items { get; set; } = new();
private UserPref Prefs = new(); private UserPref Prefs = new();
private string PageSize { get; set; } = ""; private string PageSize { get; set; } = "";
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
ProfileService.OnChange += ProfileServiceOnOnChange; ProfileService.OnChange += ProfileServiceOnOnChange;
Prefs = await ProfileService.GetPreferences(); Prefs = await ProfileService.GetPreferences();
PageSize = Prefs.PageSize; PageSize = Prefs.PageSize;
} }
private async Task OnSelectChanged(ChangeEventArgs e) private async Task OnSelectChanged(ChangeEventArgs e)
{ {
var val = e.Value.ToString(); var val = e.Value.ToString();
@ -42,11 +44,13 @@ namespace Wonky.Client.Components
await OnChanged.InvokeAsync(val); await OnChanged.InvokeAsync(val);
await ProfileService.SetPageSize(val); await ProfileService.SetPageSize(val);
} }
private void ProfileServiceOnOnChange(UserPref newUserPref) private void ProfileServiceOnOnChange(UserPref newUserPref)
{ {
Prefs = newUserPref; Prefs = newUserPref;
StateHasChanged(); StateHasChanged();
} }
public void Dispose() public void Dispose()
{ {
ProfileService.OnChange -= ProfileServiceOnOnChange; ProfileService.OnChange -= ProfileServiceOnOnChange;

View file

@ -8,11 +8,11 @@ public partial class QuoteListComponent
{ {
[Parameter] [Parameter]
public List<ReportItemView> Quotes { get; set; } = new(); public List<ReportItemView> Quotes { get; set; } = new();
[Parameter] public EventCallback<QuoteCallbackArgs> OnChangedCallback { get; set; } [Parameter] public EventCallback<QCallbackArgs> OnChangedCallback { get; set; }
private async Task SetQuote(string eSalesNumber, QStatus status) private async Task SetQuote(string eSalesNumber, QStatus status)
{ {
var args = new QuoteCallbackArgs() var args = new QCallbackArgs()
{ {
ESalesNumber = eSalesNumber, ESalesNumber = eSalesNumber,
Status = status Status = status

View file

@ -21,8 +21,8 @@
<EditForm EditContext="WorkDateContext"> <EditForm EditContext="WorkDateContext">
<div class="container-fluid"> <div class="container-fluid">
<div class="row align-items-center"> <div class="row align-items-center">
<div class="col-sm-7 work-date"> <div class="col-sm-7 fw-bold">
@SelectedDate.ToLongDateString() @SelectedDate.DayOfWeek d. @(SelectedDate.Day)/@(SelectedDate.Month)
</div> </div>
<div class="col-sm-5"> <div class="col-sm-5">
<InputDate class="form-control calendar" @bind-Value="SelectedDate" @oninput="OnDateChanged"/> <InputDate class="form-control calendar" @bind-Value="SelectedDate" @oninput="OnDateChanged"/>

View file

@ -86,7 +86,7 @@ namespace Wonky.Client.HttpInterceptors
if (e.Response == null || e.Response.IsSuccessStatusCode) if (e.Response == null || e.Response.IsSuccessStatusCode)
return; return;
var message = "En fejl er opstået"; var message = $"En fejl er opstået \n {e.Response.Content}";
var currDoc = _navigation.ToBaseRelativePath(_navigation.Uri); var currDoc = _navigation.ToBaseRelativePath(_navigation.Uri);
if (currDoc.Contains("login/")) if (currDoc.Contains("login/"))
currDoc = ""; currDoc = "";
@ -98,20 +98,23 @@ namespace Wonky.Client.HttpInterceptors
break; break;
case HttpStatusCode.BadRequest: case HttpStatusCode.BadRequest:
_logger.LogDebug("BadRequest <= {}", currDoc); _logger.LogDebug("BadRequest <= {}", currDoc);
_logger.LogDebug("{}", message);
break; break;
case HttpStatusCode.Unauthorized: case HttpStatusCode.Unauthorized:
_authenticationService.Logout(); _logger.LogDebug("Unauthorized <= {}", currDoc);
_logger.LogDebug("{}", message);
//_authenticationService.Logout();
_navigation.NavigateTo($"/login/{currDoc}"); _navigation.NavigateTo($"/login/{currDoc}");
message = "Venligst login ...";
_toast.ShowInfo(message); _toast.ShowInfo(message);
break; break;
case HttpStatusCode.Conflict: case HttpStatusCode.Conflict:
_logger.LogDebug("Conflict <= {}", currDoc); _logger.LogDebug("Conflict <= {}", currDoc);
_logger.LogDebug("{}", message);
break; break;
case HttpStatusCode.InternalServerError: case HttpStatusCode.InternalServerError:
// message = "Der er interne problemer på serveren ...";
// _toast.ShowError(message);
_logger.LogDebug("InternalServerError <= {}", currDoc); _logger.LogDebug("InternalServerError <= {}", currDoc);
_logger.LogDebug("{}", message);
break; break;
default: default:
_toast.ShowError(message); _toast.ShowError(message);

View file

@ -1,68 +0,0 @@
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using Wonky.Client.Features;
using Wonky.Entity.Requests;
using Wonky.Entity.Views;
namespace Wonky.Client.HttpInterfaces;
/// <summary>
/// Interface Catalog Http repository
/// </summary>
public interface IAdvisorCatalogRepository
{
/// <summary>
/// Get a paged sales item list
/// </summary>
/// <param name="pagingParameters"></param>
/// <returns></returns>
Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(CatalogPaging pagingParameters);
/// <summary>
/// Get sales item by id
/// </summary>
/// <param name="salesItemId"></param>
/// <returns></returns>
Task<SalesItemView> GetSalesItemId(string salesItemId);
/// <summary>
/// Overload Get sales item by sku and country code
/// </summary>
/// <param name="sku"></param>
/// <param name="countryCode"></param>
/// <returns></returns>
Task<SalesItemView> GetSalesItemSku(string countryCode, string sku);
/// <summary>
/// Get sales item by variant id
/// </summary>
/// <param name="variantId"></param>
/// <returns></returns>
Task<SalesItemView> GetSalesVariantId(string variantId);
/// <summary>
/// Complete catalog for print
/// </summary>
/// <returns></returns>
Task<List<SalesItemView>> GetPriceList();
/// <summary>
/// Complete catalog for print country
/// </summary>
/// <param name="countryCode"></param>
/// <returns></returns>
Task<List<SalesItemView>> GetPriceList(string countryCode);
}

View file

@ -21,7 +21,7 @@ namespace Wonky.Client.HttpInterfaces;
/// <summary> /// <summary>
/// Interface for handling Customer Workplaces (chemical document service) /// Interface for handling Customer Workplaces (chemical document service)
/// </summary> /// </summary>
public interface IWorkplaceRepository public interface IAdvisorWorkplaceRepository
{ {
/// <summary> /// <summary>
/// Get Workplaces for given customer id /// Get Workplaces for given customer id

View file

@ -28,9 +28,9 @@ public interface ICountryCatalogRepository
/// Get a paged sales item list /// Get a paged sales item list
/// </summary> /// </summary>
/// <param name="countryCode"></param> /// <param name="countryCode"></param>
/// <param name="paging"></param> /// <param name="pager"></param>
/// <returns></returns> /// <returns></returns>
Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(string countryCode, CatalogPaging paging); Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(string countryCode, CatalogPager pager);
/// <summary> /// <summary>
/// Get sales item by id /// Get sales item by id

View file

@ -36,7 +36,7 @@ public class AdvisorActivityRepository : IAdvisorActivityRepository
}; };
private readonly NavigationManager _navigation; private readonly NavigationManager _navigation;
private ILogger<AdvisorActivityRepository> _logger; private readonly ILogger<AdvisorActivityRepository> _logger;
private readonly HttpClient _client; private readonly HttpClient _client;
private readonly ApiConfig _api; private readonly ApiConfig _api;
@ -166,7 +166,7 @@ public class AdvisorActivityRepository : IAdvisorActivityRepository
{ {
Code = 404, Code = 404,
IsSuccess = false, IsSuccess = false,
Message = "Uventet svare fra server", Message = "Uventet svar fra server",
Id = "" Id = ""
}; };
} }

View file

@ -1,187 +0,0 @@
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Json;
using System.Text.Json;
using System.Threading.Tasks;
using Wonky.Client.Features;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Options;
using Wonky.Client.HttpInterfaces;
using Wonky.Entity.Configuration;
using Wonky.Entity.DTO;
using Wonky.Entity.Requests;
using Wonky.Entity.Views;
namespace Wonky.Client.HttpRepository;
public class AdvisorCatalogRepository : IAdvisorCatalogRepository
{
private readonly JsonSerializerOptions _options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true
};
private readonly NavigationManager _navigation;
private ILogger<AdvisorCatalogRepository> _logger;
private readonly HttpClient _client;
private readonly ApiConfig _apiConfig;
public AdvisorCatalogRepository(HttpClient client,
ILogger<AdvisorCatalogRepository> logger,
NavigationManager navigation, IOptions<ApiConfig> configuration)
{
_client = client;
_logger = logger;
_navigation = navigation;
_apiConfig = configuration.Value;
}
/// <summary>
/// Get a paged sales item list
/// </summary>
/// <param name="pagingParameters"></param>
/// <returns></returns>
public async Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(CatalogPaging pagingParameters)
{
var queryString = new Dictionary<string, string>
{
["pageNumber"] = pagingParameters.PageNumber.ToString(),
["pageSize"] = pagingParameters.PageSize.ToString(),
["orderBy"] = pagingParameters.OrderBy,
["searchColumn"] = pagingParameters.SearchColumn,
["searchTerm"] = pagingParameters.SearchTerm,
["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup,
};
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>
{
Items = JsonSerializer.Deserialize<List<SalesItemView>>(content, _options),
MetaData = JsonSerializer.Deserialize<MetaData>(
response.Headers.GetValues("X-Pagination").First(), _options)
};
return pagingResponse;
}
/// <summary>
/// Get a paged sales item list for country
/// </summary>
/// <param name="pagingParameters"></param>
/// <param name="countryCode"></param>
/// <returns></returns>
public async Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(CatalogPaging pagingParameters, string countryCode)
{
var queryString = new Dictionary<string, string>
{
["pageNumber"] = pagingParameters.PageNumber.ToString(),
["pageSize"] = pagingParameters.PageSize.ToString(),
["orderBy"] = pagingParameters.OrderBy,
["searchColumn"] = pagingParameters.SearchColumn,
["searchTerm"] = pagingParameters.SearchTerm,
["selectGroup"] = pagingParameters.SelectGroup == "0" ? "" : pagingParameters.SelectGroup,
};
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>
{
Items = JsonSerializer.Deserialize<List<SalesItemView>>(content, _options),
MetaData = JsonSerializer.Deserialize<MetaData>(
response.Headers.GetValues("X-Pagination").First(), _options)
};
return pagingResponse;
}
/// <summary>
/// Get sales item by id
/// </summary>
/// <param name="salesItemId"></param>
/// <returns></returns>
public async Task<SalesItemView> GetSalesItemId(string salesItemId)
{
var salesItem = await _client
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/{salesItemId}");
return salesItem ?? new SalesItemView();
}
/// <summary>
/// Overload Get sales item by sku and country code
/// </summary>
/// <param name="sku"></param>
/// <param name="countryCode"></param>
/// <returns></returns>
public async Task<SalesItemView> GetSalesItemSku(string countryCode, string sku)
{
var salesItem = await _client.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/sku/{countryCode}/{sku}");
return salesItem ?? new SalesItemView();
}
/// <summary>
/// Get sales item by variant id
/// </summary>
/// <param name="variantId"></param>
/// <returns></returns>
public async Task<SalesItemView> GetSalesVariantId(string variantId)
{
var salesItem = await _client
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/variant/{variantId}");
return salesItem ?? new SalesItemView();
}
/// <summary>
/// Complete catalog for print
/// </summary>
/// <returns></returns>
public async Task<List<SalesItemView>> GetPriceList()
{
return await _client.GetFromJsonAsync<List<SalesItemView>>($"{_apiConfig.Catalog}", _options);
}
/// <summary>
/// Complete catalog for print country
/// </summary>
/// <param name="countryCode"></param>
/// <returns></returns>
public async Task<List<SalesItemView>> GetPriceList(string countryCode)
{
return await _client.GetFromJsonAsync<List<SalesItemView>>($"{_apiConfig.Catalog}/{countryCode}", _options);
}
}

View file

@ -24,7 +24,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.HttpRepository; namespace Wonky.Client.HttpRepository;
public class WorkplaceRepository : IWorkplaceRepository public class AdvisorWorkplaceRepository : IAdvisorWorkplaceRepository
{ {
private readonly JsonSerializerOptions? _options = new JsonSerializerOptions private readonly JsonSerializerOptions? _options = new JsonSerializerOptions
{ {
@ -32,12 +32,12 @@ public class WorkplaceRepository : IWorkplaceRepository
}; };
private readonly NavigationManager _navigation; private readonly NavigationManager _navigation;
private ILogger<WorkplaceRepository> _logger; private ILogger<AdvisorWorkplaceRepository> _logger;
private readonly HttpClient _client; private readonly HttpClient _client;
private readonly ApiConfig _api; private readonly ApiConfig _api;
public WorkplaceRepository(HttpClient client, public AdvisorWorkplaceRepository(HttpClient client,
ILogger<WorkplaceRepository> logger, ILogger<AdvisorWorkplaceRepository> logger,
NavigationManager navigation, NavigationManager navigation,
IOptions<ApiConfig> configuration) IOptions<ApiConfig> configuration)
{ {

View file

@ -41,7 +41,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository
private readonly NavigationManager _navigation; private readonly NavigationManager _navigation;
private ILogger<CountryCatalogRepository> _logger; private ILogger<CountryCatalogRepository> _logger;
private readonly HttpClient _client; private readonly HttpClient _client;
private readonly ApiConfig _apiConfig; private readonly ApiConfig _api;
public CountryCatalogRepository(HttpClient client, public CountryCatalogRepository(HttpClient client,
ILogger<CountryCatalogRepository> logger, ILogger<CountryCatalogRepository> logger,
@ -50,28 +50,28 @@ public class CountryCatalogRepository : ICountryCatalogRepository
_client = client; _client = client;
_logger = logger; _logger = logger;
_navigation = navigation; _navigation = navigation;
_apiConfig = configuration.Value; _api = configuration.Value;
} }
/// <summary> /// <summary>
/// Get a paged sales item list /// Get a paged sales item list
/// </summary> /// </summary>
/// <param name="countryCode"></param> /// <param name="countryCode"></param>
/// <param name="paging"></param> /// <param name="pager"></param>
/// <returns></returns> /// <returns></returns>
public async Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(string countryCode, CatalogPaging paging) public async Task<PagingResponse<SalesItemView>> GetSalesItemsPaged(string countryCode, CatalogPager pager)
{ {
var queryString = new Dictionary<string, string> var queryString = new Dictionary<string, string>
{ {
["pageNumber"] = paging.PageNumber.ToString(), ["pageNumber"] = pager.PageNumber.ToString(),
["pageSize"] = paging.PageSize.ToString(), ["pageSize"] = pager.PageSize.ToString(),
["orderBy"] = paging.OrderBy, ["orderBy"] = pager.OrderBy,
["searchColumn"] = paging.SearchColumn, ["searchColumn"] = pager.SearchColumn,
["searchTerm"] = paging.SearchTerm, ["searchTerm"] = pager.SearchTerm,
["selectGroup"] = paging.SelectGroup == "0" ? "" : paging.SelectGroup ["selectGroup"] = pager.SelectGroup == "0" ? "" : pager.SelectGroup
}; };
var response = await _client var response = await _client
.GetAsync(QueryHelpers.AddQueryString($"{_apiConfig.Catalog}/country/{countryCode}/page", queryString)); .GetAsync(QueryHelpers.AddQueryString($"{_api.Catalog}/{countryCode}/page", queryString));
if (!response.IsSuccessStatusCode) if (!response.IsSuccessStatusCode)
{ {
@ -102,7 +102,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository
public async Task<SalesItemView> GetSalesItemId(string countryCode, string salesItemId) public async Task<SalesItemView> GetSalesItemId(string countryCode, string salesItemId)
{ {
var salesItem = await _client var salesItem = await _client
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/country/{countryCode}/{salesItemId}"); .GetFromJsonAsync<SalesItemView>($"{_api.Catalog}/{countryCode}/{salesItemId}");
return salesItem ?? new SalesItemView(); return salesItem ?? new SalesItemView();
} }
@ -114,7 +114,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository
/// <returns></returns> /// <returns></returns>
public async Task<SalesItemView> GetSalesItemSku(string countryCode, string sku) public async Task<SalesItemView> GetSalesItemSku(string countryCode, string sku)
{ {
var salesItem = await _client.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/country/{countryCode}/sku/{sku}"); var salesItem = await _client.GetFromJsonAsync<SalesItemView>($"{_api.Catalog}/{countryCode}/sku/{sku}");
return salesItem ?? new SalesItemView(); return salesItem ?? new SalesItemView();
} }
@ -127,7 +127,7 @@ public class CountryCatalogRepository : ICountryCatalogRepository
public async Task<SalesItemView> GetSalesVariantId(string countryCode, string variantId) public async Task<SalesItemView> GetSalesVariantId(string countryCode, string variantId)
{ {
var salesItem = await _client var salesItem = await _client
.GetFromJsonAsync<SalesItemView>($"{_apiConfig.Catalog}/country/{countryCode}/variant/{variantId}"); .GetFromJsonAsync<SalesItemView>($"{_api.Catalog}/{countryCode}/variant/{variantId}");
return salesItem ?? new SalesItemView(); return salesItem ?? new SalesItemView();
} }
@ -138,6 +138,6 @@ public class CountryCatalogRepository : ICountryCatalogRepository
/// <returns></returns> /// <returns></returns>
public async Task<List<SalesItemView>> GetPriceList(string countryCode) public async Task<List<SalesItemView>> GetPriceList(string countryCode)
{ {
return await _client.GetFromJsonAsync<List<SalesItemView>>($"{_apiConfig.Catalog}/country/{countryCode}", _options); return await _client.GetFromJsonAsync<List<SalesItemView>>($"{_api.Catalog}/{countryCode}", _options);
} }
} }

View file

@ -1,6 +1,6 @@
namespace Wonky.Client.Models; namespace Wonky.Client.Models;
public class QuoteCallbackArgs public class QCallbackArgs
{ {
/// <summary> /// <summary>
/// ESalesNumber /// ESalesNumber

View file

@ -325,7 +325,7 @@ else
} }
<ConfirmWorkDateModal BodyMessage="@PromptDateConfirm" OnOkClicked="WorkDateConfirmCallback" @ref="ConfirmWorkDateModal"/> <ConfirmWorkDateModal BodyMessage="@PromptDateConfirm" OnOkClicked="WorkDateConfirmCallback" @ref="ConfirmWorkDateModal"/>
<PriceListModal OnSelected="PriceListCallback" @ref="PriceListModal"/> <PriceCatalogModal CountryCode="@Company.CountryCode.ToLower()" OnSelected="PriceListCallback" @ref="PriceCatalogModal"/>
<ProductHistoryModal CompanyId="@CompanyId" ItemSku="@SelectedItem.Sku" @ref="HistoryModal"/> <ProductHistoryModal CompanyId="@CompanyId" ItemSku="@SelectedItem.Sku" @ref="HistoryModal"/>
<ProductPriceHistoryModal OnSelected="PriceHistoryCallback" CompanyId="@CompanyId" Sku="@SelectedItem.Sku" @ref="PriceHistoryModal"/> <ProductPriceHistoryModal OnSelected="PriceHistoryCallback" CompanyId="@CompanyId" Sku="@SelectedItem.Sku" @ref="PriceHistoryModal"/>
<ConfirmProductCheckModal BodyMessage="" CompanyId="@CompanyId" Products="CheckList" OnOkClicked="ConfirmProductCheckCallback" @ref="ConfirmProductCheckModal" /> <ConfirmProductCheckModal BodyMessage="" CompanyId="@CompanyId" Products="CheckList" OnOkClicked="ConfirmProductCheckCallback" @ref="ConfirmProductCheckModal" />

View file

@ -30,23 +30,23 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class AdvisorCreateActivityPage : IDisposable public partial class AdvisorActivityCreatePage : IDisposable
{ {
// Parameters // Parameters
[CascadingParameter] DraftStateProvider DraftProvider { get; set; } [CascadingParameter] DraftStateProvider DraftProvider { get; set; }
[Parameter] public string CompanyId { get; set; } [Parameter] public string CompanyId { get; set; }
// Services // Services
[Inject] public ILogger<AdvisorCreateActivityPage> Logger { get; set; } [Inject] public ILogger<AdvisorActivityCreatePage> Logger { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public UserProfileService Profiles { get; set; } [Inject] public UserProfileService Profiles { get; set; }
[Inject] public IToastService Toast { get; set; } [Inject] public IToastService Toast { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public IAdvisorCatalogRepository AdvisorCatalogCrm { get; set; } [Inject] public ICountryCatalogRepository Catalog { get; set; }
[Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } [Inject] public IAdvisorCustomerRepository Companies { get; set; }
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } [Inject] public IAdvisorActivityRepository Actitivites { get; set; }
[Inject] public IAdvisorReportRepository AdvisorReportRepo { get; set; } [Inject] public IAdvisorReportRepository Reports { get; set; }
[Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } [Inject] public IAdvisorCustomerHistoryRepository CustomerHistory { get; set; }
// variables // variables
private readonly JsonSerializerOptions _options = new() {PropertyNameCaseInsensitive = true}; private readonly JsonSerializerOptions _options = new() {PropertyNameCaseInsensitive = true};
private SalesItemView SelectedItem { get; set; } = new(); private SalesItemView SelectedItem { get; set; } = new();
@ -64,13 +64,13 @@ public partial class AdvisorCreateActivityPage : IDisposable
private bool InvalidActivity { get; set; } = true; private bool InvalidActivity { get; set; } = true;
private bool ReportClosed { get; set; } private bool ReportClosed { get; set; }
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
private UserInfoView ThisUserInfo { get; set; } = new(); private UserInfoView SalesRep { get; set; } = new();
private DateTime SelectedDate { get; set; } private DateTime SelectedDate { get; set; }
private string OldPhone { get; set; } = ""; private string OldPhone { get; set; } = "";
private string PromptDateConfirm { get; set; } = ""; private string PromptDateConfirm { get; set; } = "";
// MODAL DIALOGS // MODAL DIALOGS
private PriceListModal PriceListModal { get; set; } = new(); private PriceCatalogModal PriceCatalogModal { get; set; } = new();
private ProductHistoryModal HistoryModal { get; set; } = new(); private ProductHistoryModal HistoryModal { get; set; } = new();
private ProductPriceHistoryModal PriceHistoryModal { get; set; } = new(); private ProductPriceHistoryModal PriceHistoryModal { get; set; } = new();
private ConfirmWorkDateModal ConfirmWorkDateModal { get; set; } = new(); private ConfirmWorkDateModal ConfirmWorkDateModal { get; set; } = new();
@ -93,9 +93,9 @@ public partial class AdvisorCreateActivityPage : IDisposable
// User Preferences // User Preferences
UserPrefs = await Profiles.GetPreferences(); UserPrefs = await Profiles.GetPreferences();
// User Info // User Info
ThisUserInfo = await Storage.GetItemAsync<UserInfoView>("_xu"); SalesRep = await Storage.GetItemAsync<UserInfoView>("_xu");
// Fetch Customer from http // Fetch Customer from http
Company = await CompanyRepo.GetCompanyById(CompanyId); Company = await Companies.GetCompanyById(CompanyId);
if (Company.HasFolded == 1) if (Company.HasFolded == 1)
// Company has shutdown activities // Company has shutdown activities
Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt."; Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt.";
@ -113,9 +113,9 @@ public partial class AdvisorCreateActivityPage : IDisposable
Activity.ActivityStatusEnum = "noSale"; Activity.ActivityStatusEnum = "noSale";
Activity.VisitTypeEnum = Company.Account is "" or "NY" ? "new" : "recall"; Activity.VisitTypeEnum = Company.Account is "" or "NY" ? "new" : "recall";
Activity.CompanyId = Company.CompanyId; Activity.CompanyId = Company.CompanyId;
Activity.SalesRepId = ThisUserInfo.Id; Activity.SalesRepId = SalesRep.Id;
Activity.SalesRep = ThisUserInfo.Advisor; Activity.SalesRep = SalesRep.Advisor;
Activity.CountryCode = ThisUserInfo.CountryCode; Activity.CountryCode = SalesRep.CountryCode;
Activity.Account = Company.Account; Activity.Account = Company.Account;
Activity.VatNumber = Company.VatNumber; Activity.VatNumber = Company.VatNumber;
Activity.Email = Company.Email; Activity.Email = Company.Email;
@ -134,7 +134,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
// Initialize date variable // Initialize date variable
SelectedDate = string.IsNullOrWhiteSpace(UserPrefs.WorkDate) ? DateTime.Now : DateTime.Parse(UserPrefs.WorkDate); SelectedDate = string.IsNullOrWhiteSpace(UserPrefs.WorkDate) ? DateTime.Now : DateTime.Parse(UserPrefs.WorkDate);
// raise flag if report is closed // raise flag if report is closed
ReportClosed = await AdvisorReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}"); ReportClosed = await Reports.ReportExist($"{SelectedDate:yyyy-MM-dd}");
// Ask for confirmation of date // Ask for confirmation of date
Logger.LogDebug("Preferences.DateConfirmed => {}", UserPrefs.DateConfirmed); Logger.LogDebug("Preferences.DateConfirmed => {}", UserPrefs.DateConfirmed);
if (!UserPrefs.DateConfirmed) if (!UserPrefs.DateConfirmed)
@ -182,7 +182,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
// product inventory has not been updated // product inventory has not been updated
// send rpc call to sync ERP to CRM // send rpc call to sync ERP to CRM
Toast.ShowInfo("Vent mens data synkroniseres ...", "ERP til CRM ..."); Toast.ShowInfo("Vent mens data synkroniseres ...", "ERP til CRM ...");
var ts = await HistoryRepo.InvoiceErpToCrmRpc(CompanyId, Company.HistorySync); var ts = await CustomerHistory.InvoiceErpToCrmRpc(CompanyId, Company.HistorySync);
while (string.IsNullOrWhiteSpace(ts)) while (string.IsNullOrWhiteSpace(ts))
await Task.Delay(500); await Task.Delay(500);
// save pDate // save pDate
@ -190,7 +190,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
// request products from backend // request products from backend
Toast.ShowInfo("Vent mens produkt oversigt hentes", "CRM produkt liste"); Toast.ShowInfo("Vent mens produkt oversigt hentes", "CRM produkt liste");
CheckList = await HistoryRepo.FetchInventory(CompanyId); CheckList = await CustomerHistory.FetchInventory(CompanyId);
if(CheckList.Any()) if(CheckList.Any())
CheckList = CheckList.OrderBy(x => x.Description).ToList(); CheckList = CheckList.OrderBy(x => x.Description).ToList();
@ -236,7 +236,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
/// <param name="workDate"></param> /// <param name="workDate"></param>
private async Task WorkDateComponentCallback(string workDate) private async Task WorkDateComponentCallback(string workDate)
{ {
ReportClosed = await AdvisorReportRepo.ReportExist(workDate); ReportClosed = await Reports.ReportExist(workDate);
SelectedDate = DateTime.Parse(workDate); SelectedDate = DateTime.Parse(workDate);
Activity.ActivityDate = workDate; Activity.ActivityDate = workDate;
} }
@ -246,7 +246,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
/// </summary> /// </summary>
private void CallPriceListModal() private void CallPriceListModal()
{ {
PriceListModal.Show(); PriceCatalogModal.Show();
} }
/// <summary> /// <summary>
@ -258,7 +258,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
// get selected item // get selected item
if (string.IsNullOrWhiteSpace(sku.ItemId)) if (string.IsNullOrWhiteSpace(sku.ItemId))
return; return;
SelectedItem = await AdvisorCatalogCrm.GetSalesItemId(sku.ItemId); SelectedItem = await Catalog.GetSalesItemId(SalesRep.CountryCode.ToLower(), sku.ItemId);
ShowItem = true; ShowItem = true;
Price = sku.Rate; Price = sku.Rate;
Quantity = sku.Quantity; Quantity = sku.Quantity;
@ -325,14 +325,14 @@ public partial class AdvisorCreateActivityPage : IDisposable
if (OldPhone != Activity.Phone) if (OldPhone != Activity.Phone)
{ {
Company.Phone = Activity.Phone; Company.Phone = Activity.Phone;
await CompanyRepo.UpdateErpData(Company.CompanyId, Company); await Companies.UpdateErpData(Company.CompanyId, Company);
} }
// begin assembling activity // begin assembling activity
Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}"; Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}";
Activity.OurRef = Activity.ActivityTypeEnum switch Activity.OurRef = Activity.ActivityTypeEnum switch
{ {
"phone" => $"T:{ThisUserInfo.FullName.Split(" ")[0]}", "phone" => $"T:{SalesRep.FullName.Split(" ")[0]}",
"onSite" => $"B:{ThisUserInfo.FullName.Split(" ")[0]}", "onSite" => $"B:{SalesRep.FullName.Split(" ")[0]}",
_ => "" _ => ""
}; };
if (Activity.Express) if (Activity.Express)
@ -361,7 +361,7 @@ public partial class AdvisorCreateActivityPage : IDisposable
// debug logging // debug logging
Logger.LogDebug("CrmNewActivityPage => \n {}", JsonSerializer.Serialize(Activity)); Logger.LogDebug("CrmNewActivityPage => \n {}", JsonSerializer.Serialize(Activity));
// post to api // post to api
var result = await AdvisorActivityRepo.CreateActivity(Activity); var result = await Actitivites.CreateActivity(Activity);
// debug logging // debug logging
Logger.LogDebug("ApiResponseView => \n {}", JsonSerializer.Serialize(result)); Logger.LogDebug("ApiResponseView => \n {}", JsonSerializer.Serialize(result));
// show result message // show result message

View file

@ -30,11 +30,11 @@
<div class="col-sm-2 text-end"> <div class="col-sm-2 text-end">
@if (ReportExist) @if (ReportExist)
{ {
<a class="btn btn-info" href="/advisor/sales-reports/view/@($"{SelectedDate:yyyy-MM-dd}")">Rapport <i style="font-size: 1.2em;" class="bi-info-lg"></i></a> <a class="btn btn-info" href="/advisor/reports/view/@($"{SelectedDate:yyyy-MM-dd}")">Rapport <i style="font-size: 1.2em;" class="bi-info-lg"></i></a>
} }
else else
{ {
<a class="btn btn-primary" href="/advisor/sales-reports/new">Rapport <i style="font-size:1.2em;" class="bi-plus-lg"></i></a> <a class="btn btn-primary" href="/advisor/reports/new">Rapport <i style="font-size:1.2em;" class="bi-plus-lg"></i></a>
} }
</div> </div>
</div> </div>

View file

@ -25,10 +25,10 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class AdvisorTodayActivityListPage : IDisposable public partial class AdvisorActivityTodayListPage : IDisposable
{ {
[Inject] public UserProfileService UserProfileService { get; set; } [Inject] public UserProfileService UserProfileService { get; set; }
[Inject] public ILogger<AdvisorTodayActivityListPage> Logger { get; set; } [Inject] public ILogger<AdvisorActivityTodayListPage> Logger { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }

View file

@ -29,13 +29,13 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class AdvisorViewActivityPage : IDisposable public partial class AdvisorActivityViewPage : IDisposable
{ {
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CompanyId { get; set; } = "";
[Parameter] public string OrderId { get; set; } = ""; [Parameter] public string OrderId { get; set; } = "";
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; } [Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
[Inject] public ILogger<AdvisorViewActivityPage> Logger { get; set; } [Inject] public ILogger<AdvisorActivityViewPage> Logger { get; set; }
[Inject] public IToastService Toaster { get; set; } [Inject] public IToastService Toaster { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
private ReportItemView ReportItem { get; set; } = new(); private ReportItemView ReportItem { get; set; } = new();

View file

@ -1,52 +0,0 @@
@*
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
*@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Advisor")]
@page "/advisor/price-catalog"
<PageTitle>Innotec Produkt Katalog</PageTitle>
<div class="sticky-top bg-dark rounded-2 px-3">
<div class="row g-3 mb-3">
<div class="col-sm-2">
<CatalogGroupComponent OnChanged="SetGroupCol"/>
</div>
<div class="col-sm-2">
<CatalogSearchComponent OnChanged="SetSearchCol"/>
</div>
<div class="col-sm-4">
<CatalogSearchPhraseComponent OnChanged="SetSearchPhrase"/>
</div>
<div class="col-sm-2">
<CatalogSortComponent OnChanged="SetSortCol"/>
</div>
<div class="col-sm-2">
<PageSizeComponent OnChanged="SetPageSize"/>
</div>
<div class="col-sm-10">
<PaginationComponent MetaData="MetaInfo" Spread="2" SelectedPage="SetSelectedPage"/>
</div>
<div class="col-sm-2 text-end">
<a class="btn btn-secondary" href="/print/catalog"><i class="bi-printer"></i> Udskriv</a>
</div>
</div>
</div>
<CatalogListComponent ItemList="Items"/>
@if (Working)
{
<WorkingThreeDots />
}

View file

@ -1,119 +0,0 @@
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using 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 AdvisorCatalogPage : IDisposable
{
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public IAdvisorCatalogRepository ItemRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public UserProfileService ProfileService { get; set; }
private List<SalesItemView> Items { get; set; } = new();
private MetaData MetaInfo { get; set; } = new();
private CatalogPaging _page = new();
private UserPref Prefs = new();
private UserInfoView UserInfo { get; set; } = new();
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
Prefs = await ProfileService.GetPreferences();
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
_page.OrderBy = Prefs.ItemSort;
_page.SearchColumn = Prefs.ItemSearch;
_page.PageSize = Convert.ToInt32(Prefs.PageSize);
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
await FetchSalesItems();
}
private async Task SetSearchPhrase(string searchTerm)
{
Items = new List<SalesItemView>();
_page.PageNumber = 1;
_page.SearchTerm = searchTerm;
await FetchSalesItems();
}
private async Task SetPageSize(string pageSize)
{
Items = new List<SalesItemView>();
_page.PageSize = Convert.ToInt32(pageSize);
_page.PageNumber = 1;
await FetchSalesItems();
}
private async Task SetSearchCol(string columnName)
{
Items = new List<SalesItemView>();
_page.PageNumber = 1;
_page.SearchColumn = columnName;
await FetchSalesItems();
}
private async Task SetSortCol(string orderBy)
{
Items = new List<SalesItemView>();
_page.OrderBy = orderBy;
await FetchSalesItems();
}
private async Task SetSelectedPage(int page)
{
Items = new List<SalesItemView>();
_page.PageNumber = page;
await FetchSalesItems();
}
private async Task SetGroupCol(string groupFilter)
{
Items = new List<SalesItemView>();
_page.PageNumber = 1;
_page.SelectGroup = groupFilter;
await FetchSalesItems();
}
private async Task FetchSalesItems()
{
Working = true;
var pagingResponse = await ItemRepo.GetSalesItemsPaged(_page);
Working = false;
Items = pagingResponse.Items!;
MetaInfo = pagingResponse.MetaData;
}
public void Dispose() => Interceptor.DisposeEvent();
}

View file

@ -37,10 +37,10 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages namespace Wonky.Client.Pages
{ {
public partial class AdvisorCreateCustomerPage : IDisposable public partial class AdvisorCustomerCreatePage : IDisposable
{ {
[Inject] public IToastService Toaster { get; set; } [Inject] public IToastService Toaster { get; set; }
[Inject] public ILogger<AdvisorCreateCustomerPage> Logger { get; set; } [Inject] public ILogger<AdvisorCustomerCreatePage> Logger { get; set; }
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
[Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } [Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; }

View file

@ -25,7 +25,7 @@
<h4 class="pt-1">@Company.Name</h4> <h4 class="pt-1">@Company.Name</h4>
</div> </div>
<div class="col-sm-3 align-content-end"> <div class="col-sm-3 align-content-end">
<a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId"><i class="bi-arrow-left"></i> Kundekort</a> <a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId"><i class="bi-arrow-right"></i> Kundekort</a>
</div> </div>
<div class="col-sm-3 align-content-end"> <div class="col-sm-3 align-content-end">
<a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId/activities/new"><i class="bi-arrow-right"></i> Nyt Besøg</a> <a class="btn btn-primary d-block" href="/advisor/customers/@CompanyId/activities/new"><i class="bi-arrow-right"></i> Nyt Besøg</a>

View file

@ -28,13 +28,13 @@ namespace Wonky.Client.Pages;
public partial class AdvisorCustomerInventoryListPage : IDisposable public partial class AdvisorCustomerInventoryListPage : IDisposable
{ {
[Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; } [Inject] public IAdvisorCustomerHistoryRepository CustomerHistory { get; set; }
[Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; } [Inject] public IAdvisorCustomerRepository Customers { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IToastService Toaster { get; set; } [Inject] public IToastService Toaster { get; set; }
[Inject] public ILogger<AdvisorCustomerInventoryListPage> Logger { get; set; } [Inject] public ILogger<AdvisorCustomerInventoryListPage> Logger { get; set; }
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public IAdvisorCatalogRepository AdvisorCatalogRepo { get; set; } [Inject] public ICountryCatalogRepository Catalog { get; set; }
[CascadingParameter] public DraftStateProvider DraftStateProvider { get; set; } = new(); [CascadingParameter] public DraftStateProvider DraftStateProvider { get; set; } = new();
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CompanyId { get; set; } = "";
@ -53,7 +53,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
Company = await CompanyRepo.GetCompanyById(CompanyId); Company = await Customers.GetCompanyById(CompanyId);
// fetch product inventory // fetch product inventory
await FetchProductInventory(); await FetchProductInventory();
@ -64,7 +64,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
private async Task OnReorderCallback(string sku) private async Task OnReorderCallback(string sku)
{ {
// fetch item from http repo // fetch item from http repo
SalesItem = await AdvisorCatalogRepo.GetSalesItemSku(Company.CountryCode.ToLower(), sku); SalesItem = await Catalog.GetSalesItemSku(Company.CountryCode.ToLower(), sku);
ReorderModal.Show(); ReorderModal.Show();
} }
@ -92,7 +92,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
} }
Logger.LogDebug("pulling products from backend"); Logger.LogDebug("pulling products from backend");
// fetch product history // fetch product history
Inventory = await HistoryRepo.FetchInventory(CompanyId); Inventory = await CustomerHistory.FetchInventory(CompanyId);
// default sort order by description // default sort order by description
if (Inventory.Any()) if (Inventory.Any())
Inventory = Inventory.OrderBy(x => x.Description).ToList(); Inventory = Inventory.OrderBy(x => x.Description).ToList();

View file

@ -1,144 +0,0 @@
@*
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
*@
@using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Components
@attribute [Authorize(Roles = "Advisor")]
@page "/advisor/customers/{CompanyId}/orders/{OrderId}"
<PageTitle>@_reportItem.ESalesNumber - @_reportItem.Company.Name</PageTitle>
<table class="table table-sm table-striped d-print-table">
<thead>
<tr>
<th class="p-0" colspan="4">
@if (_reportItem.Express)
{
<div id="watermark">
<i class="bi-lightning-charge text-dark" style="font-size: 11rem;"></i>
</div>
}
<div class="bg-light text-dark border border-1 rounded-3 pt-3 mb-2">
<h2 class="fw-bold text-center">@_reportItem.Company.Name</h2>
@if (_reportItem.Express)
{
<h2 class="fw-bold text-center"><i class="bi-lightning-charge text-dark" style="font-size: 2rem;"></i> HASTER</h2>
}
@if (_reportItem.VisitTypeEnum.ToLower() == "phone" || _reportItem.OurRef.Contains("T:"))
{
<h5 class="text-center">TELEFONORDRE</h5>
}
@if (_reportItem.StatusTypeEnum is "Quote")
{
<h5 class="text-center">TILBUD</h5>
}
</div>
</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Dato</th>
<td>@_reportItem.OrderDate</td>
<th scope="row">Konto</th>
<td>@_reportItem.Company.Account</td>
</tr>
<tr>
<th scope="col">Telefon</th>
<td>@_reportItem.Company.Phone</td>
<th scope="col">Køber</th>
<td>@_reportItem.YourRef</td>
</tr>
<tr>
<th scope="col">CVR/VAT</th>
<td>@_reportItem.Company.VatNumber</td>
<th scope="col">Rekvisition</th>
<td>@_reportItem.ReferenceNumber</td>
</tr>
<tr>
<th scope="col">Navn</th>
<td>@_reportItem.Company.Name</td>
<th scope="col">Lev.Navn</th>
<td>@_reportItem.DlvName</td>
</tr>
<tr>
<th scope="col">Adresse</th>
<td>@_reportItem.Company.Address1</td>
<th scope="col">Lev.Adresse</th>
<td>@_reportItem.DlvAddress1</td>
</tr>
<tr>
<th scope="col">Adresse</th>
<td>@_reportItem.Company.Address2</td>
<th scope="col">Lev.Adresse</th>
<td>@_reportItem.DlvAddress2</td>
</tr>
<tr>
<th scope="col">Postnr By</th>
<td>@_reportItem.Company.ZipCode @_reportItem.Company.City</td>
<th scope="col">Lev.Postnr By</th>
<td>@_reportItem.DlvZipCity</td>
</tr>
</tbody>
</table>
<table class="table table-sm table-striped table-bordered">
<thead>
<tr class="bg-light text-black">
<th scope="col">Antal</th>
<th scope="col">Varnr</th>
<th scope="col">Beskrivelse</th>
<th class="text-end" scope="col">Pris</th>
<th class="text-end" scope="col">R%</th>
<th class="text-end" scope="col">Beløb</th>
</tr>
</thead>
<tbody>
@foreach (var line in _reportItem.Lines)
{
<tr>
<td>@line.Quantity</td>
<td>@line.Sku</td>
<td>@line.Description</td>
<td class="text-end">@($"{line.Price:N2}")</td>
<td class="text-end">@($"{line.Discount:N2}")</td>
<td class="text-end">@($"{line.LineSum:N2}")</td>
</tr>
}
<tr>
<td colspan="4"></td>
<td>Ordresum</td>
<td class="text-end">@_reportItem.OrderAmount</td>
</tr>
@if (_reportItem.Express)
{
<td class="bg-dark" colspan="4"></td>
<td class="text-end" colspan="2">
<h5 class="fw-bold"><i class="bi-lightning-charge the-fast" style="font-size: 2rem;"></i> HASTER</h5>
</td>
}
</tbody>
</table>
@if (!string.IsNullOrWhiteSpace(_reportItem.OfficeNote))
{
<div class="alert alert-dark">
<h4 class="text-center">@_reportItem.OfficeNote</h4>
</div>
}
@if (Working)
{
<WorkingThreeDots/>
}

View file

@ -1,134 +0,0 @@
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using System.Text;
using System.Text.Json;
using Blazored.Toast.Services;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpInterfaces;
using Wonky.Client.HttpRepository;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
using System.Security.Claims;
using Blazored.LocalStorage;
using Wonky.Client.Services;
namespace Wonky.Client.Pages;
public partial class AdvisorCustomerOrderViewPage : IDisposable
{
[Parameter] public string CompanyId { get; set; } = "";
[Parameter] public string OrderId { get; set; } = "";
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public IAdvisorActivityRepository AdvisorActivityRepo { get; set; }
[Inject] public ISystemSendMailService MailService { get; set; }
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public ISystemUserRepository SystemUserRepo { get; set; }
[Inject] public ILogger<OfficeCustomerOrderViewPage> Logger { get; set; }
[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
{
PropertyNameCaseInsensitive = true
};
protected override async Task OnInitializedAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
// fetch order from backend
_reportItem = await AdvisorActivityRepo.GetReportItem(OrderId);
Logger.LogDebug("ReportItem => \n {}", JsonSerializer.Serialize(_reportItem, _options));
Working = false;
}
/// <summary>
/// Set activity process state to express. Send confirmation notification to salesRep
/// </summary>
private async Task SetExpressState()
{
// disable doubled actions
if (Working)
return;
Working = true;
Logger.LogDebug("GetExpressState => {}", JsonSerializer.Serialize(_reportItem, _options));
// send request to backend
var responseView = await AdvisorActivityRepo.GetExpressState(_reportItem.ActivityId);
Logger.LogDebug("SetExpressState => responseView <= {} ", JsonSerializer.Serialize(responseView));
// get user info from storage
var user = await Storage.GetItemAsync<UserInfoView>("_xu");
// fetch sales rep from response
var salesRep = await SystemUserRepo.GetAdvisorInfo(responseView.Id);
Logger.LogDebug("SetExpressState => salesRep => {}", JsonSerializer.Serialize(salesRep));
// create email notification body
var body = new StringBuilder();
body.AppendLine($"Kvittering for modtagelse af hasteordre {_reportItem.ESalesNumber}");
body.AppendLine($"Konto : {_reportItem.Company.Account}");
body.AppendLine($"Navn : {_reportItem.Company.Name}");
body.AppendLine(
$"Post By : {salesRep.CountryCode.ToUpper()}-{_reportItem.Company.ZipCode} {_reportItem.Company.City}");
body.AppendLine();
body.AppendLine("Med venlig hilsen");
body.AppendLine($"{user.FullName}");
body.AppendLine($"{user.PhoneNumber}");
// create a list of mail addresses
var sendTo = new List<EmailContact>
{
new()
{
Email = salesRep.Email,
Name = $"{salesRep.FirstName} {salesRep.LastName}"
}
};
// create an email
var msg = new EmailMessage
{
Body = body.ToString(),
Subject = $"Haste ordre til {_reportItem.Company.Name} er modtaget.",
To = sendTo,
IsBodyHtml = false
};
Logger.LogDebug("SetExpressState Notification => \n {}", JsonSerializer.Serialize(msg));
// send a system generated email
var sendMail = await MailService.SendMail("System", msg);
// result notification
if (sendMail.IsSuccess)
{
Toast
.ShowSuccess(
$"Status er opdateret og notifikation sendt til {salesRep.FirstName}.", "OK");
}
else
{
Toast
.ShowWarning(
$"Notifikation til {salesRep.FirstName} kunne ikke sendes. {sendMail.Message}", "ADVARSEL");
}
// disable further notifications
_isNotified = true;
Working = false;
}
public void Dispose()
{
Interceptor.DisposeEvent();
}
}

View file

@ -1,6 +0,0 @@
#watermark {
position: fixed;
z-index: 999;
top: 10px;
right: 0;
}

View file

@ -18,7 +18,7 @@
@using Wonky.Client.Models @using Wonky.Client.Models
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Advisor")] @attribute [Authorize(Roles = "Advisor")]
@page "/advisor/open-quotes" @page "/advisor/agreements"
<PageTitle>Aftaler og Tilbud - Oversigt</PageTitle> <PageTitle>Aftaler og Tilbud - Oversigt</PageTitle>
<div class="row g-3 align-items-center"> <div class="row g-3 align-items-center">
<div class="col-sm-8"> <div class="col-sm-8">

View file

@ -54,7 +54,7 @@ public partial class AdvisorQuoteListPage : IDisposable
}; };
} }
private async Task UpdateQuoteCallback(QuoteCallbackArgs args) private async Task UpdateQuoteCallback(QCallbackArgs args)
{ {
Working = true; Working = true;
// find the quote to update // find the quote to update

View file

@ -19,7 +19,7 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Wonky.Entity.Views @using Wonky.Entity.Views
@attribute [Authorize(Roles = "Advisor")] @attribute [Authorize(Roles = "Advisor")]
@page "/advisor/sales-reports/new" @page "/advisor/reports/new"
<PageTitle>Opret Dagsrapport for @_workDate</PageTitle> <PageTitle>Opret Dagsrapport for @_workDate</PageTitle>

View file

@ -70,7 +70,7 @@ public partial class AdvisorReportCreatePage : IDisposable
_workDate = DateTime.Parse(Prefs.WorkDate); _workDate = DateTime.Parse(Prefs.WorkDate);
if(await AdvisorReportRepo.ReportExist(Prefs.WorkDate)) if(await AdvisorReportRepo.ReportExist(Prefs.WorkDate))
Navigator.NavigateTo($"/advisor/sales-reports/view/{_workDate:yyyy-MM-dd}"); Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}");
BeginLeave = _workDate; BeginLeave = _workDate;
EndLeave = _workDate; EndLeave = _workDate;
@ -137,7 +137,7 @@ public partial class AdvisorReportCreatePage : IDisposable
await ProfileService.SetKmMorning(0); await ProfileService.SetKmMorning(0);
// reset date confirmed // reset date confirmed
await ProfileService.SetDateConfirmed(false); await ProfileService.SetDateConfirmed(false);
Navigator.NavigateTo($"/advisor/sales-reports/view/{_workDate:yyyy-MM-dd}"); Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}");
} }
/// <summary> /// <summary>
/// Submit report /// Submit report
@ -252,7 +252,7 @@ public partial class AdvisorReportCreatePage : IDisposable
var data = await AdvisorReportRepo.InitializeReportData($"{_workDate:yyyy-MM-dd}"); var data = await AdvisorReportRepo.InitializeReportData($"{_workDate:yyyy-MM-dd}");
if(data.ReportClosed) if(data.ReportClosed)
Navigator.NavigateTo($"/advisor/sales-reports/view/{_workDate:yyyy-MM-dd}"); Navigator.NavigateTo($"/advisor/reports/view/{_workDate:yyyy-MM-dd}");
Report.Figures = data.ReportData; Report.Figures = data.ReportData;
InitialValues = data.ReportData; InitialValues = data.ReportData;

View file

@ -18,7 +18,7 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Advisor")] @attribute [Authorize(Roles = "Advisor")]
@page "/advisor/sales-reports" @page "/advisor/reports"
<PageTitle>Rapport Arkiv</PageTitle> <PageTitle>Rapport Arkiv</PageTitle>
<div class="card"> <div class="card">
<div class="card-header bg-dark text-white"> <div class="card-header bg-dark text-white">

View file

@ -49,7 +49,7 @@ public partial class AdvisorReportListPage : IDisposable
private void ShowThisReport(string reportDate) private void ShowThisReport(string reportDate)
{ {
Logger.LogDebug("CrmReportListPage => ShowThisReport <= {}", reportDate); Logger.LogDebug("CrmReportListPage => ShowThisReport <= {}", reportDate);
Navigator.NavigateTo($"/advisor/sales-reports/view/{reportDate}"); Navigator.NavigateTo($"/advisor/reports/view/{reportDate}");
} }
public void Dispose() public void Dispose()

View file

@ -19,7 +19,7 @@
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@using Wonky.Client.Models @using Wonky.Client.Models
@attribute [Authorize(Roles = "Advisor,Admin")] @attribute [Authorize(Roles = "Advisor,Admin")]
@page "/advisor/sales-reports/view/{ReportDate}" @page "/advisor/reports/view/{ReportDate}"
<PageTitle>@Report.ReportData.Name</PageTitle> <PageTitle>@Report.ReportData.Name</PageTitle>
<div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center d-print-none"> <div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center d-print-none">
<div class="col-sm-6"> <div class="col-sm-6">
@ -51,7 +51,7 @@
<ReportDistanceLedgerComponent ReportData="Report.ReportData"/> <ReportDistanceLedgerComponent ReportData="Report.ReportData"/>
</div> </div>
</div> </div>
<OfficeReportActivityListComponent ActivityList="Report.ReportItems"/> <AdvisorActivityListComponent ActivityList="Report.ReportItems"/>
<ReportActivityLedgerComponent ReportData="Report.ReportData"/> <ReportActivityLedgerComponent ReportData="Report.ReportData"/>
} }
else else

View file

@ -61,10 +61,10 @@ public partial class AdvisorReportViewPage : IDisposable
switch (target) switch (target)
{ {
case PTarget.OrderPage: case PTarget.OrderPage:
Navigator.NavigateTo($"/print/orders/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}"); Navigator.NavigateTo($"/report/print/orders/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
break; break;
case PTarget.FrontPage: case PTarget.FrontPage:
Navigator.NavigateTo($"/print/report/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}"); Navigator.NavigateTo($"/report/print/summary/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
break; break;
case PTarget.None: case PTarget.None:
break; break;
@ -85,7 +85,7 @@ public partial class AdvisorReportViewPage : IDisposable
} }
// ensure the browser address bar contains the correct link // ensure the browser address bar contains the correct link
Navigator.NavigateTo($"/advisor/sales-reports/view/{workDate}", false, true); Navigator.NavigateTo($"/advisor/reports/view/{workDate}", false, true);
// return if we are already at it // return if we are already at it
if (Working) if (Working)

View file

@ -27,7 +27,7 @@ public partial class AdvisorWorkplaceDocumentListPage
[Parameter] public string WorkplaceId { get; set; } = ""; [Parameter] public string WorkplaceId { get; set; } = "";
[Inject] public HttpInterceptorService _interceptor { get; set; } [Inject] public HttpInterceptorService _interceptor { get; set; }
[Inject] public IWorkplaceRepository WorkplaceCrmRepo { get; set; } [Inject] public IAdvisorWorkplaceRepository Workplaces { get; set; }
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
} }

View file

@ -27,7 +27,7 @@ namespace Wonky.Client.Pages;
public partial class AdvisorWorkplaceListPage : IDisposable public partial class AdvisorWorkplaceListPage : IDisposable
{ {
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CompanyId { get; set; } = "";
[Inject] public IWorkplaceRepository WorkplaceCrmRepo { get; set; } [Inject] public IAdvisorWorkplaceRepository Workplaces { get; set; }
[Inject] public IAdvisorCustomerRepository _companyRepo { get; set; } [Inject] public IAdvisorCustomerRepository _companyRepo { get; set; }
[Inject] public HttpInterceptorService _interceptor { get; set; } [Inject] public HttpInterceptorService _interceptor { get; set; }
private List<WorkplaceListView> _workplaces { get; set; } = new(); private List<WorkplaceListView> _workplaces { get; set; } = new();
@ -45,7 +45,7 @@ public partial class AdvisorWorkplaceListPage : IDisposable
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
Working = true; Working = true;
_workplaces = await WorkplaceCrmRepo.GetWorkplaces(CompanyId); _workplaces = await Workplaces.GetWorkplaces(CompanyId);
Working = false; Working = false;
} }

View file

@ -29,7 +29,7 @@ public partial class AdvisorWorkplaceViewPage : IDisposable
{ {
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CompanyId { get; set; } = "";
[Parameter] public string WorkplaceId { get; set; } = ""; [Parameter] public string WorkplaceId { get; set; } = "";
[Inject] public IWorkplaceRepository WorkplaceCrmRepo { get; set; } [Inject] public IAdvisorWorkplaceRepository Workplaces { get; set; }
[Inject] public IAdvisorCustomerRepository _companyRepo { get; set; } [Inject] public IAdvisorCustomerRepository _companyRepo { get; set; }
[Inject] public HttpInterceptorService _interceptor { get; set; } [Inject] public HttpInterceptorService _interceptor { get; set; }
[Inject] public NavigationManager _navigator { get; set; } [Inject] public NavigationManager _navigator { get; set; }
@ -42,7 +42,7 @@ public partial class AdvisorWorkplaceViewPage : IDisposable
_interceptor.RegisterEvent(); _interceptor.RegisterEvent();
_interceptor.RegisterBeforeSendEvent(); _interceptor.RegisterBeforeSendEvent();
Workplace = await WorkplaceCrmRepo.GetWorkplace(CompanyId, WorkplaceId); Workplace = await Workplaces.GetWorkplace(CompanyId, WorkplaceId);
Working = false; Working = false;
} }
@ -54,14 +54,14 @@ public partial class AdvisorWorkplaceViewPage : IDisposable
private async Task SubmitUpdate() private async Task SubmitUpdate()
{ {
Working = true; Working = true;
await WorkplaceCrmRepo.UpdateWorkplace(CompanyId, Workplace); await Workplaces.UpdateWorkplace(CompanyId, Workplace);
Working = false; Working = false;
} }
private async Task DeleteWorkplace() private async Task DeleteWorkplace()
{ {
Working = true; Working = true;
await WorkplaceCrmRepo.DeleteWorkplace(CompanyId, Workplace.WorkplaceId); await Workplaces.DeleteWorkplace(CompanyId, Workplace.WorkplaceId);
_navigator.NavigateTo($"/advisor/customers/{CompanyId}/workplaces"); _navigator.NavigateTo($"/advisor/customers/{CompanyId}/workplaces");
} }

View file

@ -15,11 +15,14 @@
// //
*@ *@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office,Warehouse")] @using Wonky.Client.Components
@page "/office/catalog/{CountryCode}"
<PageTitle>Produkt Katalog @CountryCode</PageTitle> @attribute [Authorize(Roles = "Admin,Advisor,Office,Supervisor,Warehouse")]
@page "/catalog"
@page "/catalog/{CountryCode}"
<PageTitle>Produkt Katalog @CountryName</PageTitle>
<div class="sticky-top bg-dark rounded-2 px-3"> <div class="sticky-top bg-dark rounded-2 px-3">
<div class="row g-3 mb-3"> <div class="row g-3 mb-3">
@ -42,7 +45,7 @@
<PaginationComponent MetaData="MetaInfo" Spread="2" SelectedPage="SetSelectedPage"/> <PaginationComponent MetaData="MetaInfo" Spread="2" SelectedPage="SetSelectedPage"/>
</div> </div>
<div class="col-sm-2 text-end"> <div class="col-sm-2 text-end">
<a class="btn btn-secondary" href="/print/catalog/@CountryCode"><i class="bi-printer"></i> Udskriv</a> <a class="btn btn-secondary" href="/catalog/@CountryCode/print"><i class="bi-printer"></i> Udskriv</a>
</div> </div>
</div> </div>
</div> </div>

View file

@ -13,9 +13,11 @@
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] // along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
// //
using System.Text.Json;
using Blazored.LocalStorage; using Blazored.LocalStorage;
using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpInterceptors;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Wonky.Client.Helpers;
using Wonky.Client.HttpInterfaces; using Wonky.Client.HttpInterfaces;
using Wonky.Client.Services; using Wonky.Client.Services;
using Wonky.Entity.Requests; using Wonky.Entity.Requests;
@ -23,90 +25,108 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class OfficeCountryCatalogPage : IDisposable public partial class CatalogCountryPage : IDisposable
{ {
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public ICountryCatalogRepository Catalog { get; set; } [Inject] public ICountryCatalogRepository Catalog { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public UserProfileService ProfileService { get; set; } [Inject] public UserProfileService ProfileService { get; set; }
[Inject] public ILogger<CatalogCountryPage> Logger { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
[Parameter] public string CountryCode { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = "";
private List<SalesItemView> Items { get; set; } = new(); private List<SalesItemView> Items { get; set; } = new();
private MetaData MetaInfo { get; set; } = new(); private MetaData MetaInfo { get; set; } = new();
private CatalogPaging Paging = new(); private CatalogPager Pager { get; set; } = new();
private UserPref Prefs = new(); private UserPref Prefs { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new(); private UserInfoView UserInfo { get; set; } = new();
private bool Working { get; set; } = true; private bool Working { get; set; }
private string CountryName { get; set; } = "";
protected override async Task OnParametersSetAsync() protected override async Task OnInitializedAsync()
{ {
Prefs = await ProfileService.GetPreferences(); Prefs = await ProfileService.GetPreferences();
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu"); UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
Paging.OrderBy = Prefs.ItemSort; Pager.OrderBy = Prefs.ItemSort;
Paging.SearchColumn = Prefs.ItemSearch;
Paging.PageSize = Convert.ToInt32(Prefs.PageSize); Pager.SearchColumn = Prefs.ItemSearch;
Pager.PageSize = Convert.ToInt32(Prefs.PageSize);
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
await FetchSalesItems(); if (string.IsNullOrWhiteSpace(CountryCode))
{
while (string.IsNullOrWhiteSpace(UserInfo.CountryCode))
await Task.Delay(500);
CountryCode = UserInfo.CountryCode.ToLower();
Navigator.NavigateTo($"/catalog/{CountryCode}", false, true);
}
CountryName = Utils.CountryName(CountryCode);
await GetCatalogPaged();
} }
private async Task SetSearchPhrase(string searchTerm) private async Task SetSearchPhrase(string searchTerm)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
Paging.PageNumber = 1; Pager.PageNumber = 1;
Paging.SearchTerm = searchTerm; Pager.SearchTerm = searchTerm;
await FetchSalesItems(); await GetCatalogPaged();
} }
private async Task SetPageSize(string pageSize) private async Task SetPageSize(string pageSize)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
Paging.PageSize = Convert.ToInt32(pageSize); Pager.PageSize = Convert.ToInt32(pageSize);
Paging.PageNumber = 1; Pager.PageNumber = 1;
await FetchSalesItems(); await GetCatalogPaged();
} }
private async Task SetSearchCol(string columnName) private async Task SetSearchCol(string columnName)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
Paging.PageNumber = 1; Pager.PageNumber = 1;
Paging.SearchColumn = columnName; Pager.SearchColumn = columnName;
await FetchSalesItems(); await GetCatalogPaged();
} }
private async Task SetSortCol(string orderBy) private async Task SetSortCol(string orderBy)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
Paging.OrderBy = orderBy; Pager.OrderBy = orderBy;
await FetchSalesItems(); await GetCatalogPaged();
} }
private async Task SetSelectedPage(int page) private async Task SetSelectedPage(int page)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
Paging.PageNumber = page; Pager.PageNumber = page;
await FetchSalesItems(); await GetCatalogPaged();
} }
private async Task SetGroupCol(string groupFilter) private async Task SetGroupCol(string groupFilter)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
Paging.PageNumber = 1; Pager.PageNumber = 1;
Paging.SelectGroup = groupFilter; Pager.SelectGroup = groupFilter;
await FetchSalesItems(); await GetCatalogPaged();
} }
private async Task FetchSalesItems() private async Task GetCatalogPaged()
{ {
if (string.IsNullOrWhiteSpace(CountryCode))
return;
if (Working)
return;
Working = true; Working = true;
var pagingResponse = await Catalog.GetSalesItemsPaged(CountryCode, Paging); var page = await Catalog.GetSalesItemsPaged(CountryCode, Pager);
Items = page.Items!;
MetaInfo = page.MetaData!;
Working = false; Working = false;
Items = pagingResponse.Items!;
MetaInfo = pagingResponse.MetaData!;
} }
public void Dispose() => Interceptor.DisposeEvent(); public void Dispose() => Interceptor.DisposeEvent();

View file

@ -17,8 +17,8 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office,Warehouse")] @attribute [Authorize(Roles = "Admin,Advisor,Office,Supervisor,Warehouse")]
@page "/print/catalog/{CountryCode}" @page "/catalog/{CountryCode}/print"
<PageTitle>Udskriv Katalog for @CountryName</PageTitle> <PageTitle>Udskriv Katalog for @CountryName</PageTitle>

View file

@ -30,14 +30,13 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class OfficeCountryPrintCatalogPage : IDisposable public partial class CatalogCountryPrintPage : IDisposable
{ {
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public ICountryCatalogRepository Catalog { get; set; } [Inject] public ICountryCatalogRepository Catalog { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Parameter] public string CountryCode { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = "";
private List<SalesItemView> Items { get; set; } = new(); private List<SalesItemView> Items { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new();
private bool Working { get; set; } = true; private bool Working { get; set; } = true;
private string CountryName { get; set; } = ""; private string CountryName { get; set; } = "";
@ -45,8 +44,6 @@ public partial class OfficeCountryPrintCatalogPage : IDisposable
{ {
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
Items = await Catalog.GetPriceList(CountryCode); Items = await Catalog.GetPriceList(CountryCode);
CountryName = Utils.CountryName(CountryCode); CountryName = Utils.CountryName(CountryCode);
Working = false; Working = false;

View file

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

View file

@ -23,7 +23,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class OfficeCountrySalesRepCustomerListPage : IDisposable public partial class OfficeAdvisorCustomerListPage : IDisposable
{ {
[Parameter] public string UserId { get; set; } = ""; [Parameter] public string UserId { get; set; } = "";
[Parameter] public string CountryCode { get; set; } = "dk"; [Parameter] public string CountryCode { get; set; } = "dk";

View file

@ -26,13 +26,13 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class AdminSalesRepViewPage : IDisposable public partial class OfficeAdvisorViewPage : IDisposable
{ {
[Parameter] public string UserId { get; set; } = ""; [Parameter] public string UserId { get; set; } = "";
[Parameter] public string CountryCode { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = "";
[Inject] public HttpInterceptorService _interceptor { get; set; } [Inject] public HttpInterceptorService _interceptor { get; set; }
[Inject] public ISystemUserRepository SystemUserRepo { get; set; } [Inject] public ISystemUserRepository SystemUserRepo { get; set; }
[Inject] public ILogger<AdminSalesRepViewPage> _logger { get; set; } [Inject] public ILogger<OfficeAdvisorViewPage> _logger { get; set; }
[Inject] public NavigationManager _navigator { get; set; } [Inject] public NavigationManager _navigator { get; set; }
[Inject] public IToastService _toast { get; set; } [Inject] public IToastService _toast { get; set; }
private WebUserInfoView UserInfo { get; set; } = new(); private WebUserInfoView UserInfo { get; set; } = new();

View file

@ -33,7 +33,7 @@
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk"> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/dk">
<i class="bi-phone"></i> Tlf.Ordre <i class="bi-phone"></i> Tlf.Ordre
</a> </a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/dk"> <a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/dk">
<i class="bi-file-spreadsheet"></i> Priser <i class="bi-file-spreadsheet"></i> Priser
</a> </a>
</div> </div>
@ -54,7 +54,7 @@
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no"> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/no">
<i class="bi-phone"></i> Tlf.Ordre <i class="bi-phone"></i> Tlf.Ordre
</a> </a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/no"> <a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/no">
<i class="bi-file-spreadsheet"></i> Priser <i class="bi-file-spreadsheet"></i> Priser
</a> </a>
</div> </div>
@ -75,7 +75,7 @@
<a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se"> <a class="list-group-item list-group-item-action list-group-item-success" href="/office/customers/se">
<i class="bi-phone"></i> Tlf.Ordre <i class="bi-phone"></i> Tlf.Ordre
</a> </a>
<a class="list-group-item list-group-item-action list-group-item-info" href="/office/catalog/se"> <a class="list-group-item list-group-item-action list-group-item-info" href="/catalog/se">
<i class="bi-file-spreadsheet"></i> Priser <i class="bi-file-spreadsheet"></i> Priser
</a> </a>
</div> </div>

View file

@ -225,4 +225,4 @@
</div> </div>
</div> </div>
<PriceListModal OnSelected="PriceListCallback" @ref="PriceList"/> <PriceCatalogModal OnSelected="PriceListCallback" @ref="PriceCatalog"/>

View file

@ -26,9 +26,9 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class OfficeCountryCreateOrderPage : IDisposable public partial class OfficeCustomerCountryCreateOrderPage : IDisposable
{ {
[Inject] public ILogger<OfficeCountryCreateOrderPage> Logger { get; set; } [Inject] public ILogger<OfficeCustomerCountryCreateOrderPage> Logger { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public ICountryCustomerRepository CustomerRepo { get; set; } [Inject] public ICountryCustomerRepository CustomerRepo { get; set; }
[Inject] public ICountryCustomerHistoryRepository InventoryRepo { get; set; } [Inject] public ICountryCustomerHistoryRepository InventoryRepo { get; set; }
@ -59,7 +59,7 @@ public partial class OfficeCountryCreateOrderPage : IDisposable
private bool ReportClosed { get; set; } private bool ReportClosed { get; set; }
private bool PoFormInvalid { get; set; } = true; private bool PoFormInvalid { get; set; } = true;
private bool Working { get; set; } private bool Working { get; set; }
private PriceListModal PriceList { get; set; } = new(); private PriceCatalogModal PriceCatalog { get; set; } = new();
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
@ -75,58 +75,58 @@ public partial class OfficeCountryCreateOrderPage : IDisposable
// fetch customer // fetch customer
Customer = await CustomerRepo.GetByCustomerId(CountryCode, CompanyId); Customer = await CustomerRepo.GetByCustomerId(CountryCode, CompanyId);
Logger.LogDebug("Customer => {}", JsonSerializer.Serialize(Customer)); Logger.LogDebug("Customer => {}", JsonSerializer.Serialize(Customer));
//
var today = $"{DateTime.Now:yyyy-MM-dd}"; // var today = $"{DateTime.Now:yyyy-MM-dd}";
//
// initiate a sync to ensure up-to-date product history // // initiate a sync to ensure up-to-date product history
if (Customer.HistorySync != today) // if (Customer.HistorySync != today)
Customer.HistorySync = await InventoryRepo.InvoiceErpToCrmRpc(CountryCode, CompanyId, Customer.HistorySync); // Customer.HistorySync = await InventoryRepo.InvoiceErpToCrmRpc(CountryCode, CompanyId, Customer.HistorySync);
//
// fetch customer inventory // // fetch customer inventory
CustomerInventory = await InventoryRepo.FetchInventory(CountryCode, CompanyId); // CustomerInventory = await InventoryRepo.FetchInventory(CountryCode, CompanyId);
Logger.LogDebug("Inventory => {}", JsonSerializer.Serialize(CustomerInventory)); // Logger.LogDebug("Inventory => {}", JsonSerializer.Serialize(CustomerInventory));
//
// get sales rep info // // get sales rep info
SalesRep = await UserRepo.GetAdvisorInfo(Customer.SalesRepId); // SalesRep = await UserRepo.GetAdvisorInfo(Customer.SalesRepId);
Logger.LogDebug("SalesRep => {}", JsonSerializer.Serialize(SalesRep)); // Logger.LogDebug("SalesRep => {}", JsonSerializer.Serialize(SalesRep));
//
// set activity salesRep and countryCode // // set activity salesRep and countryCode
Activity.SalesRep = SalesRep.Advisor; // Activity.SalesRep = SalesRep.Advisor;
Activity.CountryCode = SalesRep.CountryCode; // Activity.CountryCode = SalesRep.CountryCode;
//
// add customer info into activity properties // // add customer info into activity properties
Activity.Account = Customer.Account; // Activity.Account = Customer.Account;
Activity.VatNumber = Customer.VatNumber; // Activity.VatNumber = Customer.VatNumber;
Activity.Email = Customer.Email; // Activity.Email = Customer.Email;
Activity.Phone = Customer.Phone; // Activity.Phone = Customer.Phone;
Activity.Mobile = Customer.Mobile; // Activity.Mobile = Customer.Mobile;
Activity.Name = Customer.Name; // Activity.Name = Customer.Name;
Activity.Address1 = Customer.Address1; // Activity.Address1 = Customer.Address1;
Activity.Address2 = Customer.Address2; // Activity.Address2 = Customer.Address2;
Activity.ZipCode = Customer.ZipCode; // Activity.ZipCode = Customer.ZipCode;
Activity.City = Customer.City; // Activity.City = Customer.City;
Activity.DlvName = Customer.Name; // Activity.DlvName = Customer.Name;
Activity.DlvAddress1 = Customer.Address1; // Activity.DlvAddress1 = Customer.Address1;
Activity.DlvAddress2 = Customer.Address2; // Activity.DlvAddress2 = Customer.Address2;
Activity.DlvZipCode = Customer.ZipCode; // Activity.DlvZipCode = Customer.ZipCode;
Activity.DlvCity = Customer.City; // Activity.DlvCity = Customer.City;
Activity.BcId = Customer.BcId; // Activity.BcId = Customer.BcId;
Activity.CompanyId = Customer.CompanyId; // Activity.CompanyId = Customer.CompanyId;
Activity.SalesRepId = Customer.SalesRepId; // Activity.SalesRepId = Customer.SalesRepId;
//
// setting up activity properties // // setting up activity properties
Activity.ActivityStatusEnum = "noSale"; // Activity.ActivityStatusEnum = "noSale";
Activity.VisitTypeEnum = "recall"; // Activity.VisitTypeEnum = "recall";
Activity.ActivityTypeEnum = "phone"; // Activity.ActivityTypeEnum = "phone";
Activity.ActivityStatusEnum = "order"; // Activity.ActivityStatusEnum = "order";
//
// Initialize date variable // // Initialize date variable
SelectedDate = DateTime.Now; // SelectedDate = DateTime.Now;
} }
private void CallPriceListModal() private void CallPriceListModal()
{ {
PriceList.Show(); PriceCatalog.Show();
} }
private async Task PriceListCallback(SelectedSku sku) private async Task PriceListCallback(SelectedSku sku)

View file

@ -28,7 +28,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages namespace Wonky.Client.Pages
{ {
public partial class OfficeCountryCustomerListPage : IDisposable public partial class OfficeCustomerCountryListPage : IDisposable
{ {
[Parameter] public string CountryCode { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = "";
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }

View file

@ -24,6 +24,11 @@
<thead> <thead>
<tr> <tr>
<th class="p-0" colspan="4"> <th class="p-0" colspan="4">
<div class="d-print-none">
<div class="row">
<div class="col-sm-1">
<button type="button" class="btn btn-warning d-block" onclick="window.print();">PRINT</button>
</div>
@if (_reportItem.Express) @if (_reportItem.Express)
{ {
<div id="watermark"> <div id="watermark">
@ -33,20 +38,15 @@
{ {
<AuthorizeView Roles="Admin,Office,Warehouse"> <AuthorizeView Roles="Admin,Office,Warehouse">
<Authorized> <Authorized>
<div class="d-print-none">
<div class="row">
<div class="col-sm-1">
<button type="button" class="btn btn-warning d-block" onclick="window.print();">PRINT</button>
</div>
<div class="col-sm-5"> <div class="col-sm-5">
<button type="button" class="btn btn-warning d-block" @onclick="SetExpressState" disabled="@_isNotified">Kvitter for modtagelse</button> <button type="button" class="btn btn-warning d-block" @onclick="SetExpressState" disabled="@_isNotified">Kvitter for modtagelse</button>
</div> </div>
</div>
</div>
</Authorized> </Authorized>
</AuthorizeView> </AuthorizeView>
} }
} }
</div>
</div>
<div class="bg-light text-dark border border-1 rounded-3 pt-3 mb-2"> <div class="bg-light text-dark border border-1 rounded-3 pt-3 mb-2">
<h2 class="fw-bold text-center">@_reportItem.Company.Name</h2> <h2 class="fw-bold text-center">@_reportItem.Company.Name</h2>
@if (_reportItem.Express) @if (_reportItem.Express)

View file

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

View file

@ -6,7 +6,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class OfficeSalesRepListPage :IDisposable public partial class OfficeUserAdvisorCountryListPage :IDisposable
{ {
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public ISystemUserRepository SystemUserRepo { get; set; } [Inject] public ISystemUserRepository SystemUserRepo { get; set; }

View file

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

View file

@ -23,7 +23,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class OfficeReportListPage : IDisposable public partial class OfficeUserAdvisorCountryReportListPage : IDisposable
{ {
[Parameter] public string UserId { get; set; } = ""; [Parameter] public string UserId { get; set; } = "";
[Parameter] public string CountryCode { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = "";

View file

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

View file

@ -23,7 +23,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class OfficeReportViewPage : IDisposable public partial class OfficeUserAdvisorCountryReportViewPage : IDisposable
{ {
/// <summary> /// <summary>
/// Country code from url parameter /// Country code from url parameter
@ -65,7 +65,7 @@ public partial class OfficeReportViewPage : IDisposable
/// Logger service /// Logger service
/// </summary> /// </summary>
[Inject] [Inject]
public ILogger<OfficeReportViewPage> Logger { get; set; } public ILogger<OfficeUserAdvisorCountryReportViewPage> Logger { get; set; }
/// <summary> /// <summary>
/// Storage service /// Storage service
@ -103,10 +103,10 @@ public partial class OfficeReportViewPage : IDisposable
switch (target) switch (target)
{ {
case PTarget.OrderPage: case PTarget.OrderPage:
Navigator.NavigateTo($"/print/orders/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}"); Navigator.NavigateTo($"/report/print/orders/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}");
break; break;
case PTarget.FrontPage: case PTarget.FrontPage:
Navigator.NavigateTo($"/print/report/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}"); Navigator.NavigateTo($"/report/print/summary/{CountryCode}/{UserId}/{ReportDate}?returnUrl={ReturnUrl}");
break; break;
case PTarget.None: case PTarget.None:
break; break;

View file

@ -22,35 +22,35 @@
<div class="row mb-2"> <div class="row mb-2">
<label class="col-md-3 col-form-label">Side længde</label> <label class="col-md-3 col-form-label">Side længde</label>
<div class="col-md-3"> <div class="col-md-3">
<PageSizeComponent ></PageSizeComponent> <PageSizeComponent />
</div> </div>
</div> </div>
<div class="row mb-2"> <div class="row mb-2">
<label class="col-md-3 col-form-label">Kunde søgning</label> <label class="col-md-3 col-form-label">Kunde søgning</label>
<div class="col-md-3"> <div class="col-md-3">
<CustomerSearchColumnComponent ></CustomerSearchColumnComponent> <CustomerSearchColumnComponent />
</div> </div>
</div> </div>
<div class="row mb-2"> <div class="row mb-2">
<label class="col-md-3 col-form-label">Kunde sortering</label> <label class="col-md-3 col-form-label">Kunde sortering</label>
<div class="col-md-3"> <div class="col-md-3">
<CustomerSortComponent ></CustomerSortComponent> <CustomerSortComponent />
</div> </div>
</div> </div>
<div class="row mb-2"> <div class="row mb-2">
<label class="col-md-3 col-form-label">Produkt søgning</label> <label class="col-md-3 col-form-label">Produkt søgning</label>
<div class="col-md-3"> <div class="col-md-3">
<CatalogSearchComponent ></CatalogSearchComponent> <CatalogSearchComponent />
</div> </div>
</div> </div>
<div class="row mb-2"> <div class="row mb-2">
<label class="col-md-3 col-form-label">Produkt sortering</label> <label class="col-md-3 col-form-label">Produkt sortering</label>
<div class="col-md-3"> <div class="col-md-3">
<CatalogSortComponent ></CatalogSortComponent> <CatalogSortComponent />
</div> </div>
</div> </div>

View file

@ -1,29 +0,0 @@
@*
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
*@
@using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office,Advisor,Warehouse")]
@page "/print/catalog"
<CatalogPrintComponent ItemList="Items" CountryName="@UserInfo.CountryName" />
@if (Working)
{
<WorkingThreeDots/>
}

View file

@ -1,56 +0,0 @@
// Copyright (C) 2022 FCS Frede's Computer Services.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using 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 PrintCatalogPage : IDisposable
{
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public IAdvisorCatalogRepository ItemRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
private List<SalesItemView> Items { get; set; } = new();
private UserInfoView UserInfo { get; set; } = new();
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
Items = await ItemRepo.GetPriceList();
Working = false;
}
public void Dispose() => Interceptor.DisposeEvent();
}

View file

@ -18,7 +18,7 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office,Advisor")] @attribute [Authorize(Roles = "Admin,Office,Advisor")]
@page "/print/orders/{CountryCode}/{UserId}/{ReportDate}" @page "/report/print/orders/{CountryCode}/{UserId}/{ReportDate}"
<div class="row mb-3 d-print-none"> <div class="row mb-3 d-print-none">
<div class="col-sm-6 d-grid"> <div class="col-sm-6 d-grid">

View file

@ -21,7 +21,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class PrintOrderPage public partial class ReportPrintOrderPage
{ {
[Parameter] public string CountryCode { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = "";
[Parameter] public string UserId { get; set; } = ""; [Parameter] public string UserId { get; set; } = "";
@ -29,7 +29,7 @@ public partial class PrintOrderPage
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
[Inject] private IJSRuntime JSRuntime { get; set; } [Inject] private IJSRuntime JSRuntime { get; set; }
[Inject] public ILogger<PrintOrderPage> Logger { get; set; } [Inject] public ILogger<ReportPrintOrderPage> Logger { get; set; }
private ReportView Report { get; set; } = new(); private ReportView Report { get; set; } = new();
private List<ReportItemView> Items { get; set; } = new(); private List<ReportItemView> Items { get; set; } = new();
private IJSObjectReference JsModule { get; set; } private IJSObjectReference JsModule { get; set; }

View file

@ -18,7 +18,7 @@
@using Wonky.Client.Components @using Wonky.Client.Components
@using Microsoft.AspNetCore.Authorization @using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Roles = "Admin,Office,Advisor")] @attribute [Authorize(Roles = "Admin,Office,Advisor")]
@page "/print/report/{CountryCode}/{UserId}/{ReportDate}" @page "/report/print/summary/{CountryCode}/{UserId}/{ReportDate}"
<div class="row mb-3 d-print-none"> <div class="row mb-3 d-print-none">
<div class="col-sm-6 d-grid"> <div class="col-sm-6 d-grid">

View file

@ -22,7 +22,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
public partial class PrintFrontPage public partial class ReportPrintSummaryPage
{ {
[Parameter] public string CountryCode { get; set; } = ""; [Parameter] public string CountryCode { get; set; } = "";
[Parameter] public string UserId { get; set; } = ""; [Parameter] public string UserId { get; set; } = "";
@ -30,7 +30,7 @@ public partial class PrintFrontPage
[Inject] public ILocalStorageService Storage { get; set; } [Inject] public ILocalStorageService Storage { get; set; }
[Inject] public NavigationManager Navigator { get; set; } [Inject] public NavigationManager Navigator { get; set; }
[Inject] private IJSRuntime JSRuntime { get; set; } [Inject] private IJSRuntime JSRuntime { get; set; }
[Inject] public ILogger<PrintFrontPage> Logger { get; set; } [Inject] public ILogger<ReportPrintSummaryPage> Logger { get; set; }
private ReportView Report { get; set; } = new(); private ReportView Report { get; set; } = new();
private IJSObjectReference JsModule { get; set; } private IJSObjectReference JsModule { get; set; }
private string ReturnUrl { get; set; } = ""; private string ReturnUrl { get; set; } = "";

View file

@ -33,4 +33,4 @@
</div> </div>
</div> </div>
<WarehouseListComponent Header="@Header" OrderList="@OrderList" ReadyToShip="@ReadyToShip" <WarehouseListComponent Header="@Header" OrderList="@OrderList" ReadyToShip="@ReadyToShip"
OnGetStatus="GetStatusCallback" OnSetShipped="@SetShippedCallback" OnQPak="QPakCallback"/> OnGetStatus="GetStatusCallback" OnSetShipped="@SetShippedCallback" OnQPak="QPakCallback" />

View file

@ -60,8 +60,7 @@ builder.Services.AddScoped<IAdvisorContactRepository, AdvisorContactRepository>(
builder.Services.AddScoped<IAdvisorCustomerHistoryRepository, AdvisorCustomerHistoryRepository>(); builder.Services.AddScoped<IAdvisorCustomerHistoryRepository, AdvisorCustomerHistoryRepository>();
builder.Services.AddScoped<IAdvisorTaskItemRepository, AdvisorTaskItemRepository>(); builder.Services.AddScoped<IAdvisorTaskItemRepository, AdvisorTaskItemRepository>();
builder.Services.AddScoped<IAdvisorReportRepository, AdvisorReportRepository>(); builder.Services.AddScoped<IAdvisorReportRepository, AdvisorReportRepository>();
builder.Services.AddScoped<IWorkplaceRepository, WorkplaceRepository>(); builder.Services.AddScoped<IAdvisorWorkplaceRepository, AdvisorWorkplaceRepository>();
builder.Services.AddScoped<IAdvisorCatalogRepository, AdvisorCatalogRepository>();
// administrative repositories // administrative repositories
builder.Services.AddScoped<ICountryCustomerHistoryRepository, CountryCustomerHistoryRepository>(); builder.Services.AddScoped<ICountryCustomerHistoryRepository, CountryCustomerHistoryRepository>();
builder.Services.AddScoped<ICountryCatalogRepository, CountryCatalogRepository>(); builder.Services.AddScoped<ICountryCatalogRepository, CountryCatalogRepository>();

View file

@ -18,11 +18,11 @@ namespace Wonky.Client.Services;
public record UserPref public record UserPref
{ {
public string? CompanyFilterPhrase { get; set; } = ""; public string CompanyFilterPhrase { get; set; } = "";
public string? CompanySearch { get; set; } = "name"; public string CompanySearch { get; set; } = "name";
public string? CompanySort { get; set; } = "name"; public string CompanySort { get; set; } = "name";
public string? ItemSearch { get; set; } = "name"; public string ItemSearch { get; set; } = "name";
public string? ItemSort { get; set; } = "name"; public string ItemSort { get; set; } = "name";
public string PageSize { get; set; } = "10"; public string PageSize { get; set; } = "10";
public string WorkDate { get; set; } = ""; public string WorkDate { get; set; } = "";
public int KmMorning { get; set; } public int KmMorning { get; set; }
@ -32,6 +32,7 @@ public record UserPref
public class UserProfileService public class UserProfileService
{ {
private readonly ILocalStorageService _localStorageService; private readonly ILocalStorageService _localStorageService;
private const string KeyName = "preferences";
public event Action<UserPref>? OnChange; public event Action<UserPref>? OnChange;
public UserProfileService(ILocalStorageService localStorageService) public UserProfileService(ILocalStorageService localStorageService)
{ {
@ -46,7 +47,7 @@ public class UserProfileService
{ {
DateConfirmed = confirmed DateConfirmed = confirmed
}; };
await _localStorageService.SetItemAsync("preferences", newPreferences); await _localStorageService.SetItemAsync(KeyName, newPreferences);
OnChange?.Invoke(newPreferences); OnChange?.Invoke(newPreferences);
} }
@ -58,7 +59,7 @@ public class UserProfileService
{ {
KmMorning = kmMorning KmMorning = kmMorning
}; };
await _localStorageService.SetItemAsync("preferences", newPreferences); await _localStorageService.SetItemAsync(KeyName, newPreferences);
OnChange?.Invoke(newPreferences); OnChange?.Invoke(newPreferences);
} }
@ -70,7 +71,7 @@ public class UserProfileService
{ {
CompanyFilterPhrase = filterPhrase CompanyFilterPhrase = filterPhrase
}; };
await _localStorageService.SetItemAsync("preferences", newPreferences); await _localStorageService.SetItemAsync(KeyName, newPreferences);
OnChange?.Invoke(newPreferences); OnChange?.Invoke(newPreferences);
} }
@ -82,7 +83,7 @@ public class UserProfileService
{ {
WorkDate = $"{workDate:yyyy-MM-dd}" WorkDate = $"{workDate:yyyy-MM-dd}"
}; };
await _localStorageService.SetItemAsync("preferences", newPreferences); await _localStorageService.SetItemAsync(KeyName, newPreferences);
OnChange?.Invoke(newPreferences); OnChange?.Invoke(newPreferences);
} }
@ -91,7 +92,7 @@ public class UserProfileService
var preferences = await GetPreferences(); var preferences = await GetPreferences();
var newPreferences = preferences var newPreferences = preferences
with { CompanySearch = companySearch }; with { CompanySearch = companySearch };
await _localStorageService.SetItemAsync("preferences", newPreferences); await _localStorageService.SetItemAsync(KeyName, newPreferences);
OnChange?.Invoke(newPreferences); OnChange?.Invoke(newPreferences);
} }
@ -100,7 +101,7 @@ public class UserProfileService
var preferences = await GetPreferences(); var preferences = await GetPreferences();
var newPreferences = preferences var newPreferences = preferences
with { CompanySort = companySort }; with { CompanySort = companySort };
await _localStorageService.SetItemAsync("preferences", newPreferences); await _localStorageService.SetItemAsync(KeyName, newPreferences);
OnChange?.Invoke(newPreferences); OnChange?.Invoke(newPreferences);
} }
@ -109,7 +110,7 @@ public class UserProfileService
var preferences = await GetPreferences(); var preferences = await GetPreferences();
var newPreferences = preferences var newPreferences = preferences
with { ItemSearch = itemSearch }; with { ItemSearch = itemSearch };
await _localStorageService.SetItemAsync("preferences", newPreferences); await _localStorageService.SetItemAsync(KeyName, newPreferences);
OnChange?.Invoke(newPreferences); OnChange?.Invoke(newPreferences);
} }
@ -118,7 +119,7 @@ public class UserProfileService
var preferences = await GetPreferences(); var preferences = await GetPreferences();
var newPreferences = preferences var newPreferences = preferences
with { ItemSort = itemSort }; with { ItemSort = itemSort };
await _localStorageService.SetItemAsync("preferences", newPreferences); await _localStorageService.SetItemAsync(KeyName, newPreferences);
OnChange?.Invoke(newPreferences); OnChange?.Invoke(newPreferences);
} }
@ -127,13 +128,12 @@ public class UserProfileService
var preferences = await GetPreferences(); var preferences = await GetPreferences();
var newPreferences = preferences var newPreferences = preferences
with { PageSize = pageSize }; with { PageSize = pageSize };
await _localStorageService.SetItemAsync("preferences", newPreferences); await _localStorageService.SetItemAsync(KeyName, newPreferences);
OnChange?.Invoke(newPreferences); OnChange?.Invoke(newPreferences);
} }
public async Task<UserPref> GetPreferences() public async Task<UserPref> GetPreferences()
{ {
return await _localStorageService.GetItemAsync<UserPref>("preferences").ConfigureAwait(true) return await _localStorageService.GetItemAsync<UserPref>(KeyName) ?? new UserPref();
?? new UserPref();
} }
} }

View file

@ -17,6 +17,9 @@
@inject IWebAssemblyHostEnvironment HostEnvironment @inject IWebAssemblyHostEnvironment HostEnvironment
@using Wonky.Client.Components; @using Wonky.Client.Components;
@using Wonky.Client.Services
@using Wonky.Entity.Views
@using Blazored.LocalStorage
<div class="top-row ps-3 navbar navbar-dark"> <div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid"> <div class="container-fluid">
@ -64,18 +67,18 @@
<i class="bi-calendar pe-2" style="font-size:1.3em;" aria-hidden="true"></i> ToDo <i class="bi-calendar pe-2" style="font-size:1.3em;" aria-hidden="true"></i> ToDo
</NavLink> </NavLink>
</div> </div>
<div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/catalog">
<i class="bi-file-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Priskatalog
</NavLink>
</div>
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/advisor/customers"> <NavLink class="nav-link ps-2" href="/advisor/customers">
<i class="bi-building pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Firmaer <i class="bi-building pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Firmaer
</NavLink> </NavLink>
</div> </div>
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/advisor/price-catalog"> <NavLink class="nav-link ps-2" href="/advisor/agreements">
<i class="bi-file-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Priskatalog
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/advisor/open-quotes">
<i class="bi-calculator pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Aftaler/Tilbud <i class="bi-calculator pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Aftaler/Tilbud
</NavLink> </NavLink>
</div> </div>
@ -85,7 +88,7 @@
</NavLink> </NavLink>
</div> </div>
<div class="nav-item px-3"> <div class="nav-item px-3">
<NavLink class="nav-link ps-2" href="/advisor/sales-reports"> <NavLink class="nav-link ps-2" href="/advisor/reports">
<i class="bi-file-earmark-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Dagsrapporter <i class="bi-file-earmark-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Dagsrapporter
</NavLink> </NavLink>
</div> </div>
@ -101,6 +104,7 @@
</div> </div>
@code { @code {
private bool collapseNavMenu = true; private bool collapseNavMenu = true;
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
@ -110,4 +114,5 @@
collapseNavMenu = !collapseNavMenu; collapseNavMenu = !collapseNavMenu;
} }
} }

View file

@ -41,7 +41,7 @@
</div> </div>
<div class="row mb-2"> <div class="row mb-2">
<div class="col-sm-12"> <div class="col-sm-12">
<PaginationComponent MetaData="ResponseMeta" Spread="2" SelectedPage="SelectedPage" /> <PaginationComponent MetaData="MetaInfo" Spread="2" SelectedPage="SelectedPage" />
</div> </div>
</div> </div>
<div class="row text-white"> <div class="row text-white">

View file

@ -24,31 +24,41 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Shared; namespace Wonky.Client.Shared;
public partial class PriceListModal : IDisposable public partial class PriceCatalogModal : IDisposable
{ {
[Parameter] public string CountryCode { get; set; } = "dk"; [Parameter] public string CountryCode { get; set; } = "";
[Parameter] public EventCallback<SelectedSku> OnSelected { get; set; } [Parameter] public EventCallback<SelectedSku> OnSelected { get; set; }
[Inject] public IAdvisorCatalogRepository Catalog { get; set; } [Inject] public ICountryCatalogRepository Catalog { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public UserProfileService ProfileService { get; set; } [Inject] public UserProfileService ProfileService { get; set; }
private string _modalDisplay = ""; private string _modalDisplay = "";
private bool _showBackdrop; private bool _showBackdrop;
private List<SalesItemView> Items { get; set; } = new(); private List<SalesItemView> Items { get; set; } = new();
private MetaData? ResponseMeta { get; set; } = new(); private MetaData? MetaInfo { get; set; } = new();
private CatalogPaging _paging = new(); private CatalogPager _pager = new();
private UserPref _userPref = new(); private UserPref _userPref = new();
protected override async Task OnInitializedAsync() protected override async Task OnParametersSetAsync()
{ {
_userPref = await ProfileService.GetPreferences();
_paging.OrderBy = _userPref.ItemSort;
_paging.SearchColumn = _userPref.ItemSearch;
_paging.PageSize = Convert.ToInt32(_userPref.PageSize);
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
await GetSalesItems(); await GetSalesItems();
} }
protected override async Task OnInitializedAsync()
{
_userPref = await ProfileService.GetPreferences();
_pager.OrderBy = _userPref.ItemSort;
_pager.SearchColumn = _userPref.ItemSearch;
_pager.PageSize = Convert.ToInt32(_userPref.PageSize);
}
private async Task GetSalesItems()
{
var pagingResponse = await Catalog.GetSalesItemsPaged(CountryCode, _pager);
Items = pagingResponse.Items!;
MetaInfo = pagingResponse.MetaData;
}
private void SelectItem(string itemId, string quantity, string rate) private void SelectItem(string itemId, string quantity, string rate)
{ {
@ -59,44 +69,37 @@ public partial class PriceListModal : IDisposable
private async Task SelectedPage(int page) private async Task SelectedPage(int page)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.PageNumber = page; _pager.PageNumber = page;
await GetSalesItems(); await GetSalesItems();
} }
private async Task SetSearchPhrase(string searchTerm) private async Task SetSearchPhrase(string searchTerm)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.PageNumber = 1; _pager.PageNumber = 1;
_paging.SearchTerm = searchTerm; _pager.SearchTerm = searchTerm;
await GetSalesItems(); await GetSalesItems();
} }
private async Task GetSalesItems()
{
var pagingResponse = await Catalog.GetSalesItemsPaged(_paging);
Items = pagingResponse.Items!;
ResponseMeta = pagingResponse.MetaData;
}
private async Task SetPageSize(string pageSize) private async Task SetPageSize(string pageSize)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.PageSize = Convert.ToInt32(pageSize); _pager.PageSize = Convert.ToInt32(pageSize);
_paging.PageNumber = 1; _pager.PageNumber = 1;
await GetSalesItems(); await GetSalesItems();
} }
private async Task SetSearchCol(string columnName) private async Task SetSearchCol(string columnName)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.PageNumber = 1; _pager.PageNumber = 1;
_paging.SearchColumn = columnName; _pager.SearchColumn = columnName;
await GetSalesItems(); await GetSalesItems();
} }
private async Task SetSortCol(string orderBy) private async Task SetSortCol(string orderBy)
{ {
Items = new List<SalesItemView>(); Items = new List<SalesItemView>();
_paging.OrderBy = orderBy; _pager.OrderBy = orderBy;
await GetSalesItems(); await GetSalesItems();
} }

View file

@ -31,6 +31,7 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Remove="wwwroot\icons\**" /> <Content Remove="wwwroot\icons\**" />
<Content Remove="Pages\AdvisorCustomerOrderViewPage.razor" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -3783,6 +3784,7 @@
<ItemGroup> <ItemGroup>
<Compile Remove="wwwroot\icons\**" /> <Compile Remove="wwwroot\icons\**" />
<Compile Remove="Pages\AdvisorCustomerOrderViewPage.razor.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -1,14 +1,14 @@
{ {
"appInfo": { "appInfo": {
"name": "Wonky Client", "name": "Wonky Client",
"version": "0.97.x", "version": "0.97.1",
"rc": true, "rc": true,
"sandBox": false, "sandBox": false,
"image": "grumpy-coder.png" "image": "grumpy-coder.png"
}, },
"apiConfig": { "apiConfig": {
"baseUrl": "https://dev.innotec.dk", "baseUrl": "https://zeta.innotec.dk",
"catalog": "api/v2/catalog", "catalog": "api/v2/catalog/country",
"crmCustomers": "api/v2/crm/companies", "crmCustomers": "api/v2/crm/companies",
"crmInventoryExt": "history/inventory", "crmInventoryExt": "history/inventory",
"crmProductExt": "history/products", "crmProductExt": "history/products",
@ -30,7 +30,7 @@
"servicesVatNo": "api/v2/services/brReg", "servicesVatNo": "api/v2/services/brReg",
"servicesAuth": "token", "servicesAuth": "token",
"syncRpc": "api/v2/rpc", "syncRpc": "api/v2/rpc",
"syncRpcInvoiceExt": "invoices/rpc", "syncRpcInvoiceExt": "invoices",
"userInfo": "api/auth/userinfo", "userInfo": "api/auth/userinfo",
"warehouse": "api/v2/warehouse/packages" "warehouse": "api/v2/warehouse/packages"
}, },

View file

@ -16,7 +16,6 @@ body {
.workDate { .workDate {
font-variant: small-caps; font-variant: small-caps;
} }
.btn.btn-edit { .btn.btn-edit {
color: #030303; color: #030303;
background-color: #a2a2ec; background-color: #a2a2ec;

View file

@ -15,7 +15,7 @@
namespace Wonky.Entity.Requests; namespace Wonky.Entity.Requests;
public class CatalogPaging public class CatalogPager
{ {
/// <summary> /// <summary>
/// internal default page size /// internal default page size