WIP: office create order - refactor namespace
This commit is contained in:
parent
308876896f
commit
a2a5e8dd72
28 changed files with 179 additions and 110 deletions
|
@ -30,7 +30,7 @@
|
||||||
"the-bad" => "file-earmark-check",
|
"the-bad" => "file-earmark-check",
|
||||||
"the-ugly" => "box2-fill",
|
"the-ugly" => "box2-fill",
|
||||||
"the-dead" => "truck",
|
"the-dead" => "truck",
|
||||||
"accepted" => "hand-thumbs-up",
|
"accepted" => "printer",
|
||||||
_ => "question-square"
|
_ => "question-square"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ public interface ISystemUserRepositoryGen1
|
||||||
/// <param name="userId"></param>
|
/// <param name="userId"></param>
|
||||||
/// <param name="model"></param>
|
/// <param name="model"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task UpdateAdvisor(string userId, UserUpdateDto model);
|
Task UpdateAdvisor(string userId, X_UserUpdateDto model);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get Administrative Users
|
/// Get Administrative Users
|
||||||
|
@ -56,7 +56,7 @@ public interface ISystemUserRepositoryGen1
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="userId"></param>
|
/// <param name="userId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<UserInfoDto> GetAdminUserInfo(string userId);
|
Task<X_UserInfoDto> GetAdminUserInfo(string userId);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update Admin user using userId and updated data
|
/// Update Admin user using userId and updated data
|
||||||
|
@ -64,7 +64,7 @@ public interface ISystemUserRepositoryGen1
|
||||||
/// <param name="userId"></param>
|
/// <param name="userId"></param>
|
||||||
/// <param name="model"></param>
|
/// <param name="model"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task UpdateAdminUser(string userId, UserUpdateDto model);
|
Task UpdateAdminUser(string userId, X_UserUpdateDto model);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set new user password
|
/// Set new user password
|
||||||
|
|
|
@ -71,7 +71,7 @@ public class SystemUserRepositoryGen1 : ISystemUserRepositoryGen1
|
||||||
/// <param name="userId"></param>
|
/// <param name="userId"></param>
|
||||||
/// <param name="model"></param>
|
/// <param name="model"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task UpdateAdvisor(string userId, UserUpdateDto model)
|
public async Task UpdateAdvisor(string userId, X_UserUpdateDto model)
|
||||||
{
|
{
|
||||||
await _client.PutAsJsonAsync($"{_api.OfficeAdvisors}/{userId}", model, _options);
|
await _client.PutAsJsonAsync($"{_api.OfficeAdvisors}/{userId}", model, _options);
|
||||||
}
|
}
|
||||||
|
@ -90,9 +90,9 @@ public class SystemUserRepositoryGen1 : ISystemUserRepositoryGen1
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="userId"></param>
|
/// <param name="userId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<UserInfoDto> GetAdminUserInfo(string userId)
|
public async Task<X_UserInfoDto> GetAdminUserInfo(string userId)
|
||||||
{
|
{
|
||||||
return await _client.GetFromJsonAsync<UserInfoDto>($"{_api.OfficeUsers}/{userId}");
|
return await _client.GetFromJsonAsync<X_UserInfoDto>($"{_api.OfficeUsers}/{userId}");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -101,7 +101,7 @@ public class SystemUserRepositoryGen1 : ISystemUserRepositoryGen1
|
||||||
/// <param name="userId"></param>
|
/// <param name="userId"></param>
|
||||||
/// <param name="model"></param>
|
/// <param name="model"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task UpdateAdminUser(string userId, UserUpdateDto model)
|
public async Task UpdateAdminUser(string userId, X_UserUpdateDto model)
|
||||||
{
|
{
|
||||||
await _client.PutAsJsonAsync($"{_api.OfficeUsers}/{userId}", model, _options);
|
await _client.PutAsJsonAsync($"{_api.OfficeUsers}/{userId}", model, _options);
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,4 +34,4 @@
|
||||||
<div class="modal-backdrop fade show"></div>
|
<div class="modal-backdrop fade show"></div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<CustomerInventoryReorderOverlay CompanyId="@CompanyId" SalesItem="SalesItem" OnSelected="OnInventorySelected" @ref="ReorderOverlay" />
|
<CustomerInventoryReorderOverlay CompanyId="@CompanyId" SalesItem="SalesItem" OnSelected="OnSelected" @ref="ReorderOverlay" />
|
|
@ -35,7 +35,7 @@ public partial class CustomerInventoryListOverlay : IDisposable
|
||||||
[Parameter] public string CountryCode { get; set; } = "";
|
[Parameter] public string CountryCode { get; set; } = "";
|
||||||
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
||||||
|
|
||||||
[Parameter] public EventCallback<DraftItem> OnInventorySelected { get; set; }
|
[Parameter] public EventCallback<DraftItem> OnSelected { get; set; }
|
||||||
|
|
||||||
private string _modalDisplay = "";
|
private string _modalDisplay = "";
|
||||||
private bool _showBackdrop;
|
private bool _showBackdrop;
|
||||||
|
@ -60,7 +60,7 @@ public partial class CustomerInventoryListOverlay : IDisposable
|
||||||
|
|
||||||
private async Task OnSelectedItem(DraftItem draftItem)
|
private async Task OnSelectedItem(DraftItem draftItem)
|
||||||
{
|
{
|
||||||
await OnInventorySelected.InvokeAsync(draftItem);
|
await OnSelected.InvokeAsync(draftItem);
|
||||||
Hide();
|
Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
||||||
//
|
//
|
||||||
|
|
||||||
|
using System.Text.Json;
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
using Wonky.Client.HttpInterceptors;
|
using Wonky.Client.HttpInterceptors;
|
||||||
using Wonky.Client.HttpInterfaces;
|
using Wonky.Client.HttpInterfaces;
|
||||||
|
@ -27,12 +28,15 @@ namespace Wonky.Client.OverlayOrderCreate;
|
||||||
|
|
||||||
public partial class PriceCatalogOverlay : IDisposable
|
public partial class PriceCatalogOverlay : IDisposable
|
||||||
{
|
{
|
||||||
[Parameter] public string CountryCode { get; set; } = "";
|
// injections
|
||||||
[Parameter] public EventCallback<SelectedSku> OnSelected { get; set; }
|
|
||||||
[Inject] private ICountryCatalogRepository CatalogRepo { get; set; }
|
[Inject] private ICountryCatalogRepository CatalogRepo { get; set; }
|
||||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] private UserProfileService ProfileService { get; set; }
|
[Inject] private UserProfileService ProfileService { get; set; }
|
||||||
|
[Inject] private ILogger<PriceCatalogOverlay> Logger { get; set; }
|
||||||
|
// parameters
|
||||||
|
[Parameter] public string CountryCode { get; set; } = "";
|
||||||
|
[Parameter] public EventCallback<SelectedSku> OnSelected { get; set; }
|
||||||
|
// variables
|
||||||
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();
|
||||||
|
@ -46,6 +50,7 @@ public partial class PriceCatalogOverlay : IDisposable
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
await GetSalesItems();
|
await GetSalesItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
_userProfile = await ProfileService.GetPreferences();
|
_userProfile = await ProfileService.GetPreferences();
|
||||||
|
@ -57,8 +62,11 @@ public partial class PriceCatalogOverlay : IDisposable
|
||||||
private async Task GetSalesItems()
|
private async Task GetSalesItems()
|
||||||
{
|
{
|
||||||
var pagingResponse = await CatalogRepo.GetSalesItemsPaged(CountryCode, _pager);
|
var pagingResponse = await CatalogRepo.GetSalesItemsPaged(CountryCode, _pager);
|
||||||
|
if (pagingResponse == null)
|
||||||
|
Task.Delay(250);
|
||||||
Items = pagingResponse.Items!;
|
Items = pagingResponse.Items!;
|
||||||
MetaInfo = pagingResponse.MetaData;
|
MetaInfo = pagingResponse.MetaData;
|
||||||
|
Logger.LogDebug("PriceCatalogOverlay => Items <= {}", JsonSerializer.Serialize(Items));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SelectItem(string itemId, string quantity, string rate)
|
private void SelectItem(string itemId, string quantity, string rate)
|
||||||
|
|
|
@ -355,6 +355,6 @@ else
|
||||||
<CustomerInvoiceListOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceListOverlay" />
|
<CustomerInvoiceListOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceListOverlay" />
|
||||||
|
|
||||||
<CustomerInventoryListOverlay CompanyName="@Company.Name" CompanyId="@CompanyId" CountryCode="@Company.CountryCode"
|
<CustomerInventoryListOverlay CompanyName="@Company.Name" CompanyId="@CompanyId" CountryCode="@Company.CountryCode"
|
||||||
OnInventorySelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryListOverlay" />
|
OnSelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryListOverlay" />
|
||||||
|
|
||||||
<CustomerActivityListOverlay Activities="Activities" CompanyName="@Company.Name" @ref="ActivityListOverlay" />
|
<CustomerActivityListOverlay Activities="Activities" CompanyName="@Company.Name" @ref="ActivityListOverlay" />
|
|
@ -69,7 +69,7 @@ public partial class AdvisorActivityCreatePage : 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 SalesRep { get; set; } = new();
|
private X_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; } = "";
|
||||||
|
@ -107,7 +107,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
|
||||||
// User Preferences
|
// User Preferences
|
||||||
UserProfile = await ProfileService.GetPreferences();
|
UserProfile = await ProfileService.GetPreferences();
|
||||||
// User Info
|
// User Info
|
||||||
SalesRep = await Storage.GetItemAsync<UserInfoView>("_xu");
|
SalesRep = await Storage.GetItemAsync<X_UserInfoView>("_xu");
|
||||||
// Fetch Customer from http
|
// Fetch Customer from http
|
||||||
Company = await CompanyRepo.GetCompanyById(CompanyId);
|
Company = await CompanyRepo.GetCompanyById(CompanyId);
|
||||||
if (Company.HasFolded == 1)
|
if (Company.HasFolded == 1)
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
|
|
||||||
@attribute [Authorize(Roles = "Admin,Advisor,Warehouse")]
|
@attribute [Authorize(Roles = "Advisor")]
|
||||||
@page "/advisor/customers/{CompanyId}/orders/{OrderId}"
|
@page "/advisor/customers/{CompanyId}/orders/{OrderId}"
|
||||||
@page "/advisor/customers/{CompanyId}/quotes/{OrderId}"
|
@page "/advisor/customers/{CompanyId}/quotes/{OrderId}"
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ namespace Wonky.Client.Pages
|
||||||
CompanyContext.OnFieldChanged += HandleFieldChanged;
|
CompanyContext.OnFieldChanged += HandleFieldChanged;
|
||||||
CompanyContext.OnValidationStateChanged += ValidationChanged;
|
CompanyContext.OnValidationStateChanged += ValidationChanged;
|
||||||
|
|
||||||
var xu = await Storage.GetItemAsync<UserInfoView>("_xu");
|
var xu = await Storage.GetItemAsync<X_UserInfoView>("_xu");
|
||||||
Dk = xu.CountryCode.ToLower() == "dk";
|
Dk = xu.CountryCode.ToLower() == "dk";
|
||||||
|
|
||||||
Company.SalesRepId = xu.Id;
|
Company.SalesRepId = xu.Id;
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace Wonky.Client.Pages
|
||||||
[Inject] private NavigationManager Navigator { get; set; }
|
[Inject] private NavigationManager Navigator { get; set; }
|
||||||
private List<CompanyDto> CompanyList { get; set; } = new();
|
private List<CompanyDto> CompanyList { get; set; } = new();
|
||||||
private UserProfile Profiles { get; set; } = new();
|
private UserProfile Profiles { get; set; } = new();
|
||||||
private UserInfoView UserInfo { get; set; } = new();
|
private X_UserInfoView XUserInfo { get; set; } = new();
|
||||||
private string SavedSearch { get; set; } = "";
|
private string SavedSearch { get; set; } = "";
|
||||||
private bool IncludeFolded { get; set; }
|
private bool IncludeFolded { get; set; }
|
||||||
private bool Working { get; set; } = true;
|
private bool Working { get; set; } = true;
|
||||||
|
@ -54,7 +54,7 @@ namespace Wonky.Client.Pages
|
||||||
{
|
{
|
||||||
// set preferences
|
// set preferences
|
||||||
Profiles = await ProfileService.GetPreferences();
|
Profiles = await ProfileService.GetPreferences();
|
||||||
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
XUserInfo = await Storage.GetItemAsync<X_UserInfoView>("_xu");
|
||||||
Paging.OrderBy = Profiles.CompanySort;
|
Paging.OrderBy = Profiles.CompanySort;
|
||||||
Paging.SearchColumn = Profiles.CompanySearch;
|
Paging.SearchColumn = Profiles.CompanySearch;
|
||||||
Paging.PageSize = Convert.ToInt32(Profiles.PageSize);
|
Paging.PageSize = Convert.ToInt32(Profiles.PageSize);
|
||||||
|
|
|
@ -67,7 +67,7 @@ public partial class AdvisorCustomerViewPage : IDisposable
|
||||||
private ContactDto SelectedContact { get; set; } = new();
|
private ContactDto SelectedContact { get; set; } = new();
|
||||||
private ContactDto DefaultContact { get; set; } = new();
|
private ContactDto DefaultContact { get; set; } = new();
|
||||||
private ContactModal ContactPopup { get; set; } = new();
|
private ContactModal ContactPopup { get; set; } = new();
|
||||||
private UserInfoView UserInfo { get; set; } = new();
|
private X_UserInfoView XUserInfo { get; set; } = new();
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
|
@ -85,8 +85,8 @@ public partial class AdvisorCustomerViewPage : IDisposable
|
||||||
ErpContext.OnValidationStateChanged += ValidationChanged;
|
ErpContext.OnValidationStateChanged += ValidationChanged;
|
||||||
|
|
||||||
// fetch user info from local storage
|
// fetch user info from local storage
|
||||||
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
XUserInfo = await Storage.GetItemAsync<X_UserInfoView>("_xu");
|
||||||
CountryCode = UserInfo.CountryCode.ToLower();
|
CountryCode = XUserInfo.CountryCode.ToLower();
|
||||||
CountryIsDk = CountryCode == "dk";
|
CountryIsDk = CountryCode == "dk";
|
||||||
|
|
||||||
Logger.LogDebug("companyId => {}", CompanyId);
|
Logger.LogDebug("companyId => {}", CompanyId);
|
||||||
|
@ -97,7 +97,7 @@ public partial class AdvisorCustomerViewPage : IDisposable
|
||||||
|
|
||||||
CurrentVat = Company.VatNumber;
|
CurrentVat = Company.VatNumber;
|
||||||
|
|
||||||
Company.CountryCode = UserInfo.CountryCode.ToLower();
|
Company.CountryCode = XUserInfo.CountryCode.ToLower();
|
||||||
// internal flag
|
// internal flag
|
||||||
EnableActivity = Company.ValidVat;
|
EnableActivity = Company.ValidVat;
|
||||||
// override if canvas which has account property as empty string or "NY"
|
// override if canvas which has account property as empty string or "NY"
|
||||||
|
|
|
@ -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 = "Advisor,Admin")]
|
@attribute [Authorize(Roles = "Advisor")]
|
||||||
@page "/advisor/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">
|
||||||
|
|
|
@ -39,7 +39,7 @@ public partial class AdvisorReportViewPage : IDisposable
|
||||||
private ReportView Report { get; set; } = new();
|
private ReportView Report { get; set; } = new();
|
||||||
private List<ReportItemView> Activities { get; set; } = new ();
|
private List<ReportItemView> Activities { get; set; } = new ();
|
||||||
private bool Working { get; set; }
|
private bool Working { get; set; }
|
||||||
private UserInfoView UserInfo { get; set; } = new();
|
private X_UserInfoView XUserInfo { get; set; } = new();
|
||||||
private string ReturnUrl { get; set; } = "";
|
private string ReturnUrl { get; set; } = "";
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
|
@ -47,7 +47,7 @@ public partial class AdvisorReportViewPage : IDisposable
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
|
|
||||||
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
XUserInfo = await Storage.GetItemAsync<X_UserInfoView>("_xu");
|
||||||
|
|
||||||
ProfileService.OnChange += ProfileServiceOnOnChange;
|
ProfileService.OnChange += ProfileServiceOnOnChange;
|
||||||
await ProfileService.SetWorkDate(DateTime.Parse(ReportDate));
|
await ProfileService.SetWorkDate(DateTime.Parse(ReportDate));
|
||||||
|
@ -63,10 +63,10 @@ public partial class AdvisorReportViewPage : IDisposable
|
||||||
switch (target)
|
switch (target)
|
||||||
{
|
{
|
||||||
case PTarget.OrderPage:
|
case PTarget.OrderPage:
|
||||||
Navigator.NavigateTo($"/report/print/orders/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
|
Navigator.NavigateTo($"/report/print/orders/{XUserInfo.CountryCode.ToLower()}/{XUserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
|
||||||
break;
|
break;
|
||||||
case PTarget.FrontPage:
|
case PTarget.FrontPage:
|
||||||
Navigator.NavigateTo($"/report/print/summary/{UserInfo.CountryCode.ToLower()}/{UserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
|
Navigator.NavigateTo($"/report/print/summary/{XUserInfo.CountryCode.ToLower()}/{XUserInfo.Id}/{ReportDate}?returnUrl={ReturnUrl}");
|
||||||
break;
|
break;
|
||||||
case PTarget.None:
|
case PTarget.None:
|
||||||
break;
|
break;
|
||||||
|
@ -111,7 +111,7 @@ public partial class AdvisorReportViewPage : IDisposable
|
||||||
// store the report locally
|
// store the report locally
|
||||||
if (!string.IsNullOrWhiteSpace(Report.ReportData.ReportDate))
|
if (!string.IsNullOrWhiteSpace(Report.ReportData.ReportDate))
|
||||||
{
|
{
|
||||||
await Storage.SetItemAsync($"{UserInfo.Id}-{Report.ReportData.ReportDate}", Report);
|
await Storage.SetItemAsync($"{XUserInfo.Id}-{Report.ReportData.ReportDate}", Report);
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove busy signal
|
// remove busy signal
|
||||||
|
|
|
@ -41,14 +41,14 @@ public partial class CatalogCountryPage : IDisposable
|
||||||
private MetaData MetaInfo { get; set; } = new();
|
private MetaData MetaInfo { get; set; } = new();
|
||||||
private CatalogPager Pager { get; set; } = new();
|
private CatalogPager Pager { get; set; } = new();
|
||||||
private UserProfile Profiles { get; set; } = new();
|
private UserProfile Profiles { get; set; } = new();
|
||||||
private UserInfoView UserInfo { get; set; } = new();
|
private X_UserInfoView XUserInfo { get; set; } = new();
|
||||||
private bool Working { get; set; }
|
private bool Working { get; set; }
|
||||||
private string CountryName { get; set; } = "";
|
private string CountryName { get; set; } = "";
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
Profiles = await ProfileService.GetPreferences();
|
Profiles = await ProfileService.GetPreferences();
|
||||||
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
XUserInfo = await Storage.GetItemAsync<X_UserInfoView>("_xu");
|
||||||
|
|
||||||
Pager.OrderBy = Profiles.ItemSort;
|
Pager.OrderBy = Profiles.ItemSort;
|
||||||
|
|
||||||
|
@ -60,10 +60,10 @@ public partial class CatalogCountryPage : IDisposable
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(CountryCode))
|
if (string.IsNullOrWhiteSpace(CountryCode))
|
||||||
{
|
{
|
||||||
while (string.IsNullOrWhiteSpace(UserInfo.CountryCode))
|
while (string.IsNullOrWhiteSpace(XUserInfo.CountryCode))
|
||||||
await Task.Delay(500);
|
await Task.Delay(500);
|
||||||
|
|
||||||
CountryCode = UserInfo.CountryCode.ToLower();
|
CountryCode = XUserInfo.CountryCode.ToLower();
|
||||||
Navigator.NavigateTo($"/catalog/{CountryCode}", false, true);
|
Navigator.NavigateTo($"/catalog/{CountryCode}", false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,Supervisor")]
|
||||||
@page "/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}"
|
@page "/office/users/advisors/{CountryCode}/{UserId}/reports/{ReportDate}"
|
||||||
|
|
||||||
<div class="row pt-2 pb-2 mb-3 rounded-2 d-print-none bg-dark text-white">
|
<div class="row pt-2 pb-2 mb-3 rounded-2 d-print-none bg-dark text-white">
|
||||||
|
|
|
@ -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,Warehouse")]
|
@attribute [Authorize(Roles = "Admin,Office,Supervisor,Warehouse")]
|
||||||
|
|
||||||
@page "/office/customers/{countryCode}"
|
@page "/office/customers/{countryCode}"
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ namespace Wonky.Client.Pages
|
||||||
[Inject] private NavigationManager Navigator { get; set; }
|
[Inject] private NavigationManager Navigator { get; set; }
|
||||||
private List<CompanyDto> Companies { get; set; } = new();
|
private List<CompanyDto> Companies { get; set; } = new();
|
||||||
private UserProfile Profiles { get; set; } = new();
|
private UserProfile Profiles { get; set; } = new();
|
||||||
private UserInfoView UserInfo { get; set; } = new();
|
private X_UserInfoView XUserInfo { get; set; } = new();
|
||||||
private string SavedSearch { get; set; } = "";
|
private string SavedSearch { get; set; } = "";
|
||||||
private bool ShowFolded { get; set; }
|
private bool ShowFolded { get; set; }
|
||||||
private bool Working { get; set; } = true;
|
private bool Working { get; set; } = true;
|
||||||
|
@ -53,7 +53,7 @@ namespace Wonky.Client.Pages
|
||||||
|
|
||||||
// set preferences
|
// set preferences
|
||||||
Profiles = await ProfileService.GetPreferences();
|
Profiles = await ProfileService.GetPreferences();
|
||||||
UserInfo = await Storage.GetItemAsync<UserInfoView>("_xu");
|
XUserInfo = await Storage.GetItemAsync<X_UserInfoView>("_xu");
|
||||||
Paging.OrderBy = Profiles.CompanySort;
|
Paging.OrderBy = Profiles.CompanySort;
|
||||||
Paging.SearchColumn = Profiles.CompanySearch;
|
Paging.SearchColumn = Profiles.CompanySearch;
|
||||||
Paging.PageSize = Convert.ToInt32(Profiles.PageSize);
|
Paging.PageSize = Convert.ToInt32(Profiles.PageSize);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
//
|
//
|
||||||
*@
|
*@
|
||||||
|
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.OverlayCustomer
|
||||||
@using Wonky.Client.OverlayOrderCreate
|
@using Wonky.Client.OverlayOrderCreate
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@attribute [Authorize(Roles = "Admin,Office,Supervisor,Warehouse")]
|
@attribute [Authorize(Roles = "Admin,Office,Supervisor,Warehouse")]
|
||||||
|
@ -23,22 +23,50 @@
|
||||||
|
|
||||||
<PageTitle>Telefon Ordre - @Customer.Name - @Customer.Account</PageTitle>
|
<PageTitle>Telefon Ordre - @Customer.Name - @Customer.Account</PageTitle>
|
||||||
|
|
||||||
<div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center">
|
|
||||||
<div class="col text-center">
|
|
||||||
@DateTime.Now.ToLongDateString()
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row bg-light border-2 border-dark rounded-3 p-3">
|
<div class="row bg-light border-2 border-dark rounded-3 p-3">
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-8">
|
||||||
<h3>@Customer.Name - @Customer.Account</h3>
|
<h3>@Customer.Name - @Customer.Account</h3>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<h3>@DateTime.Now.ToShortDateString()</h3>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-1">
|
||||||
|
<div class="busy-signal" style="display:@(Working ? "block" : "none")">
|
||||||
|
<div class="spinner-grow text-info" role="status">
|
||||||
|
<span class="visually-hidden">Loading...</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<EditForm EditContext="ActivityContext">
|
<EditForm EditContext="ActivityContext">
|
||||||
<DataAnnotationsValidator/>
|
<DataAnnotationsValidator/>
|
||||||
|
<div class="row mb-3 g-3">
|
||||||
|
<label for="dlvName" class="col-md-2 col-form-label">Lev. Navn</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="dlvName" class="form-control" @bind-Value="Activity.DlvName"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label for="dlvAddress1" class="col-md-2 col-form-label">Lev. Adresse</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="dlvAddress1" class="form-control" @bind-Value="Activity.DlvAddress1"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label for="dlvAddress2" class="col-md-2 col-form-label">Lev. Adresse</label>
|
||||||
|
<div class="col-md-10">
|
||||||
|
<InputText id="dlvAddress2" class="form-control" @bind-Value="Activity.DlvAddress2"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label for="dlvZipCode" class="col-md-2 col-form-label">Lev. Postnr</label>
|
||||||
|
<div class="col-md-2">
|
||||||
|
<InputText id="dlvZipCode" class="form-control" @bind-Value="Activity.DlvZipCode"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label for="dlvCity" class="col-md-2 col-form-label">Lev. Bynavn</label>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<InputText id="dlvCity" class="form-control" @bind-Value="Activity.DlvCity"/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row mb-1 g-3">
|
|
||||||
<label for="yourRef" class="col-sm-2 col-md-2 col-form-label">Indkøber</label>
|
<label for="yourRef" class="col-sm-2 col-md-2 col-form-label">Indkøber</label>
|
||||||
<div class="col-sm-10 col-md-4">
|
<div class="col-sm-10 col-md-4">
|
||||||
<InputText id="yourRef" class="form-control" @bind-Value="Activity.YourRef"/>
|
<InputText id="yourRef" class="form-control" @bind-Value="Activity.YourRef"/>
|
||||||
|
@ -66,6 +94,18 @@
|
||||||
<label class="form-check-label" for="express">Express</label>
|
<label class="form-check-label" for="express">Express</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="col-sm-4 d-grid mx-auto">
|
||||||
|
<button class="btn btn-danger" @onclick="ShowInvoiceOverlay">Faktura</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-sm-4 d-grid mx-auto">
|
||||||
|
<button class="btn btn-warning" @onclick="ShowVisitOverlay">Tidl. besøg</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-sm-4 d-grid mx-auto">
|
||||||
|
<button class="btn btn-success" @onclick="ShowInventoryOverlay">Produkter</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="this-draft" style="@(Activity.ActivityStatusEnum is "order" or "quote" ? "display: block" : "display:none")">
|
<div id="this-draft" style="@(Activity.ActivityStatusEnum is "order" or "quote" ? "display: block" : "display:none")">
|
||||||
|
@ -170,8 +210,9 @@
|
||||||
</div>
|
</div>
|
||||||
@* end draft line ------------------------------------------------- *@
|
@* end draft line ------------------------------------------------- *@
|
||||||
</div>
|
</div>
|
||||||
|
@*
|
||||||
<div class="accordion" id="crmActivity">
|
<div class="accordion" id="crmActivity">
|
||||||
@* Delivery address *@
|
$1$ Delivery address #1#
|
||||||
<div class="accordion-item" style="@(Activity.ActivityStatusEnum == "order" ? "display: block" : "display:none")">
|
<div class="accordion-item" style="@(Activity.ActivityStatusEnum == "order" ? "display: block" : "display:none")">
|
||||||
<h2 class="accordion-header" id="deliveryHeader">
|
<h2 class="accordion-header" id="deliveryHeader">
|
||||||
<button class="accordion-button collapsed bg-light" type="button" data-bs-toggle="collapse" data-bs-target="#deliveryBody" aria-expanded="false" aria-controls="deliveryBody">
|
<button class="accordion-button collapsed bg-light" type="button" data-bs-toggle="collapse" data-bs-target="#deliveryBody" aria-expanded="false" aria-controls="deliveryBody">
|
||||||
|
@ -215,6 +256,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
*@
|
||||||
</EditForm>
|
</EditForm>
|
||||||
<div class="row mt-5 mb-2">
|
<div class="row mt-5 mb-2">
|
||||||
<div class="col-sm-10 text-end">
|
<div class="col-sm-10 text-end">
|
||||||
|
@ -222,4 +264,12 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<PriceCatalogOverlay OnSelected="PriceListCallback" @ref="CatalogOverlay"/>
|
<PriceCatalogOverlay @ref="CatalogOverlay" CountryCode="@CountryCode" OnSelected="PriceListCallback"/>
|
||||||
|
@* <ProductHistoryOverlay @ref="ProductOverlay" CompanyId="@CompanyId" ItemSku="@SelectedItem.Sku"/> *@
|
||||||
|
@* <ProductPriceHistoryOverlay @ref="PriceOverlay" CompanyId="@CompanyId" Sku="@SelectedItem.Sku" *@
|
||||||
|
@* OnSelected="PriceHistoryCallback"/> *@
|
||||||
|
@* <CustomerInvoiceListOverlay @ref="InvoiceListOverlay" CustomerInvoices="CompanyInvoices"/> *@
|
||||||
|
@* <CustomerInventoryListOverlay @ref="InventoryListOverlay" CompanyName="@Customer.Name" CompanyId="@CompanyId" *@
|
||||||
|
@* CountryCode="@CountryCode" Inventory="Inventory" *@
|
||||||
|
@* OnSelected="InventoryCallback"/> *@
|
||||||
|
@* <CustomerActivityListOverlay @ref="ActivityListOverlay" Activities="Activities" CompanyName="@Customer.Name"/> *@
|
|
@ -20,6 +20,7 @@ using Microsoft.AspNetCore.Components.Forms;
|
||||||
using Wonky.Client.HttpInterceptors;
|
using Wonky.Client.HttpInterceptors;
|
||||||
using Wonky.Client.HttpInterfaces;
|
using Wonky.Client.HttpInterfaces;
|
||||||
using Wonky.Client.Models;
|
using Wonky.Client.Models;
|
||||||
|
using Wonky.Client.OverlayCustomer;
|
||||||
using Wonky.Client.OverlayOrderCreate;
|
using Wonky.Client.OverlayOrderCreate;
|
||||||
using Wonky.Client.Shared;
|
using Wonky.Client.Shared;
|
||||||
using Wonky.Entity.DTO;
|
using Wonky.Entity.DTO;
|
||||||
|
@ -60,8 +61,20 @@ public partial class OfficeOrderCreatePage : IDisposable
|
||||||
private string Discount { get; set; } = "0";
|
private string Discount { get; set; } = "0";
|
||||||
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; } = true;
|
||||||
private PriceCatalogOverlay CatalogOverlay { get; set; } = new();
|
private PriceCatalogOverlay CatalogOverlay { get; set; } = new();
|
||||||
|
private ProductHistoryOverlay ProductOverlay { get; set; } = new();
|
||||||
|
private ProductPriceHistoryOverlay PriceOverlay { get; set; } = new();
|
||||||
|
private ConfirmWorkDateModal ConfirmWorkDate { get; set; } = new();
|
||||||
|
private ProductCheckConfirmationOverlay ConfirmationCheckOverlay { get; set; } = new();
|
||||||
|
private CustomerInvoiceListOverlay InvoiceListOverlay { get; set; } = new();
|
||||||
|
private CustomerInventoryListOverlay InventoryListOverlay { get; set; } = new();
|
||||||
|
private CustomerActivityListOverlay ActivityListOverlay { get; set; } = new();
|
||||||
|
private List<ProductInventoryView> Inventory { get; set; } = new();
|
||||||
|
private List<ProductInventoryView> CheckList { get; set; } = new();
|
||||||
|
private InvoiceListView CompanyInvoices { get; set; } = new();
|
||||||
|
|
||||||
|
private List<ReportItemView> Activities { get; set; } = new();
|
||||||
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
|
@ -76,21 +89,23 @@ public partial class OfficeOrderCreatePage : 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("OfficeOrderCreate => Customer => {}", JsonSerializer.Serialize(Customer));
|
||||||
|
|
||||||
var today = $"{DateTime.Now:yyyy-MM-dd}";
|
var today = $"{DateTime.Now:yyyy-MM-dd}";
|
||||||
|
Activity.ActivityDate = today;
|
||||||
|
|
||||||
// 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)
|
||||||
|
Logger.LogDebug("OfficeOrderCreate => ");
|
||||||
Customer.HistorySync = await InventoryRepo.RequestErpToCrmSync(CountryCode, CompanyId, Customer.HistorySync);
|
Customer.HistorySync = await InventoryRepo.RequestErpToCrmSync(CountryCode, CompanyId, Customer.HistorySync);
|
||||||
|
|
||||||
// fetch customer inventory
|
// fetch customer inventory
|
||||||
CustomerInventory = await InventoryRepo.RequestInventory(CountryCode, CompanyId);
|
CustomerInventory = await InventoryRepo.RequestInventory(CountryCode, CompanyId);
|
||||||
Logger.LogDebug("Inventory => {}", JsonSerializer.Serialize(CustomerInventory));
|
Logger.LogDebug("OfficeOrderCreate => 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("OfficeOrderCreate => SalesRep => {}", JsonSerializer.Serialize(SalesRep));
|
||||||
|
|
||||||
// set activity salesRep and countryCode
|
// set activity salesRep and countryCode
|
||||||
Activity.SalesRep = SalesRep.Advisor;
|
Activity.SalesRep = SalesRep.Advisor;
|
||||||
|
@ -124,6 +139,7 @@ public partial class OfficeOrderCreatePage : IDisposable
|
||||||
|
|
||||||
// Initialize date variable
|
// Initialize date variable
|
||||||
SelectedDate = DateTime.Now;
|
SelectedDate = DateTime.Now;
|
||||||
|
Working = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CallPriceListModal()
|
private void CallPriceListModal()
|
||||||
|
@ -143,6 +159,19 @@ public partial class OfficeOrderCreatePage : IDisposable
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ShowInvoiceOverlay()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
private void ShowVisitOverlay()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
private void ShowInventoryOverlay()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private void CallPriceHistoryModal()
|
private void CallPriceHistoryModal()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -167,15 +196,14 @@ public partial class OfficeOrderCreatePage : IDisposable
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
private void PriceHistoryCallback()
|
||||||
/// Work Date component callback
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="workDate"></param>
|
|
||||||
private async Task WorkDateComponentCallback(string workDate)
|
|
||||||
{
|
{
|
||||||
ReportClosed = await ReportRepo.ReportExist(Customer.SalesRepId, workDate);
|
|
||||||
SelectedDate = DateTime.Parse(workDate);
|
}
|
||||||
Activity.ActivityDate = workDate;
|
|
||||||
|
private void InventoryCallback()
|
||||||
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -71,7 +71,7 @@ public partial class OfficeOrderViewPage : IDisposable
|
||||||
var responseView = await AdvisorActivityRepo.GetExpressState(ReportItem.ActivityId);
|
var responseView = await AdvisorActivityRepo.GetExpressState(ReportItem.ActivityId);
|
||||||
Logger.LogDebug("SetExpressState => responseView <= {} ", JsonSerializer.Serialize(responseView));
|
Logger.LogDebug("SetExpressState => responseView <= {} ", JsonSerializer.Serialize(responseView));
|
||||||
// get user info from storage
|
// get user info from storage
|
||||||
var user = await Storage.GetItemAsync<UserInfoView>("_xu");
|
var user = await Storage.GetItemAsync<X_UserInfoView>("_xu");
|
||||||
// fetch sales rep from response
|
// fetch sales rep from response
|
||||||
var salesRep = await SystemUserRepo.GetAdvisorInfo(responseView.Id);
|
var salesRep = await SystemUserRepo.GetAdvisorInfo(responseView.Id);
|
||||||
Logger.LogDebug("SetExpressState => salesRep => {}", JsonSerializer.Serialize(salesRep));
|
Logger.LogDebug("SetExpressState => salesRep => {}", JsonSerializer.Serialize(salesRep));
|
||||||
|
|
|
@ -130,19 +130,19 @@ namespace Wonky.Client.Services
|
||||||
((AuthStateProvider)_authStateProvider).NotifyUserLogout();
|
((AuthStateProvider)_authStateProvider).NotifyUserLogout();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<UserInfoView> UserInfo(bool write = false)
|
public async Task<UserManagerEditView> UserInfo(bool write = false)
|
||||||
{
|
{
|
||||||
_logger.LogDebug("sending userinfo request");
|
_logger.LogDebug("sending userinfo request");
|
||||||
var infoResponse = await _client.GetAsync(_apiConfig.Value.UserInfo).ConfigureAwait(true);
|
var response = await _client.GetAsync(_apiConfig.Value.UserInfo).ConfigureAwait(true);
|
||||||
|
|
||||||
var infoContent = await infoResponse.Content.ReadAsStringAsync();
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
|
||||||
_logger.LogDebug("UserInfo <= {}", infoContent);
|
_logger.LogDebug("UserInfo <= {}", content);
|
||||||
|
|
||||||
var userInfo = JsonSerializer.Deserialize<UserInfoView>(infoContent, _options);
|
var userInfo = JsonSerializer.Deserialize<UserManagerEditView>(content, _options);
|
||||||
if(write)
|
if(write)
|
||||||
await _localStorage.SetItemAsync("_xu", userInfo);
|
await _localStorage.SetItemAsync("_xu", userInfo);
|
||||||
return userInfo ?? new UserInfoView();
|
return userInfo ?? new UserManagerEditView();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace Wonky.Client.Services
|
||||||
Task<AuthResponseView> Login(CredentialDto credentials);
|
Task<AuthResponseView> Login(CredentialDto credentials);
|
||||||
Task Logout();
|
Task Logout();
|
||||||
Task<string> RefreshToken();
|
Task<string> RefreshToken();
|
||||||
Task<UserInfoView> UserInfo(bool write = false);
|
Task<UserManagerEditView> UserInfo(bool write = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ using System.Net.Http.Headers;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using Blazored.LocalStorage;
|
using Blazored.LocalStorage;
|
||||||
using Microsoft.AspNetCore.Components.Authorization;
|
using Microsoft.AspNetCore.Components.Authorization;
|
||||||
|
using Wonky.Entity.DTO;
|
||||||
using Wonky.Entity.Views;
|
using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Shared
|
namespace Wonky.Client.Shared
|
||||||
|
@ -41,22 +42,23 @@ namespace Wonky.Client.Shared
|
||||||
if (string.IsNullOrEmpty(token))
|
if (string.IsNullOrEmpty(token))
|
||||||
return _anonymous;
|
return _anonymous;
|
||||||
|
|
||||||
var userInfo = await _storage.GetItemAsync<UserInfoView>("_xu");
|
var userInfo = await _storage.GetItemAsync<UserManagerEditView>("_xu");
|
||||||
if (userInfo == null)
|
if (userInfo == null)
|
||||||
return _anonymous;
|
return _anonymous;
|
||||||
|
|
||||||
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
|
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
|
||||||
var exp = await _storage.GetItemAsync<string>("_xe");
|
var exp = await _storage.GetItemAsync<string>("_xe");
|
||||||
var roles = ExtractRoles(userInfo);
|
|
||||||
var claims = new List<Claim>
|
var claims = new List<Claim>
|
||||||
{
|
{
|
||||||
new(ClaimTypes.Name, userInfo.FullName),
|
new(ClaimTypes.Name, $"{userInfo.FirstName} {userInfo.LastName}"),
|
||||||
new(ClaimTypes.Email, userInfo.Email),
|
new(ClaimTypes.Email, userInfo.Email),
|
||||||
new(ClaimTypes.Country, userInfo.CountryCode),
|
new(ClaimTypes.Country, userInfo.CountryCode),
|
||||||
new(ClaimTypes.MobilePhone, userInfo.PhoneNumber),
|
new(ClaimTypes.MobilePhone, userInfo.PhoneNumber),
|
||||||
new(ClaimTypes.Expiration, exp)
|
new(ClaimTypes.Expiration, exp)
|
||||||
};
|
};
|
||||||
claims.AddRange(roles.Select(role => new Claim(ClaimTypes.Role, role)));
|
claims.AddRange(
|
||||||
|
from role in userInfo.AssignedRoles
|
||||||
|
where role.Assigned select new Claim(ClaimTypes.Role, role.Name));
|
||||||
|
|
||||||
// return the authState for the user
|
// return the authState for the user
|
||||||
return new AuthenticationState(
|
return new AuthenticationState(
|
||||||
|
@ -71,19 +73,20 @@ namespace Wonky.Client.Shared
|
||||||
|
|
||||||
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
|
_client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", token);
|
||||||
|
|
||||||
var userInfo = await _storage.GetItemAsync<UserInfoView>("_xu");
|
var userInfo = await _storage.GetItemAsync<UserManagerEditView>("_xu");
|
||||||
var exp = await _storage.GetItemAsync<string>("_xe");
|
var exp = await _storage.GetItemAsync<string>("_xe");
|
||||||
|
|
||||||
var roles = ExtractRoles(userInfo);
|
|
||||||
var claims = new List<Claim>
|
var claims = new List<Claim>
|
||||||
{
|
{
|
||||||
new(ClaimTypes.Name, userInfo.FullName),
|
new(ClaimTypes.Name, $"{userInfo.FirstName} {userInfo.LastName}"),
|
||||||
new(ClaimTypes.Email, userInfo.Email),
|
new(ClaimTypes.Email, userInfo.Email),
|
||||||
new(ClaimTypes.Country, userInfo.CountryCode),
|
new(ClaimTypes.Country, userInfo.CountryCode),
|
||||||
new(ClaimTypes.MobilePhone, userInfo.PhoneNumber),
|
new(ClaimTypes.MobilePhone, userInfo.PhoneNumber),
|
||||||
new(ClaimTypes.Expiration, exp)
|
new(ClaimTypes.Expiration, exp)
|
||||||
};
|
};
|
||||||
claims.AddRange(roles.Select(role => new Claim(ClaimTypes.Role, role)));
|
claims.AddRange(
|
||||||
|
from role in userInfo.AssignedRoles
|
||||||
|
where role.Assigned select new Claim(ClaimTypes.Role, role.Name));
|
||||||
|
|
||||||
var authState = Task.FromResult(
|
var authState = Task.FromResult(
|
||||||
new AuthenticationState(
|
new AuthenticationState(
|
||||||
|
@ -97,26 +100,6 @@ namespace Wonky.Client.Shared
|
||||||
var authState = Task.FromResult(_anonymous);
|
var authState = Task.FromResult(_anonymous);
|
||||||
NotifyAuthenticationStateChanged(authState);
|
NotifyAuthenticationStateChanged(authState);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IEnumerable<string> ExtractRoles(UserInfoView userInfoView)
|
|
||||||
{
|
|
||||||
var roles = new List<string>();
|
|
||||||
if (userInfoView.IsAdmin)
|
|
||||||
roles.Add("Admin");
|
|
||||||
if (userInfoView.IsAdvisor)
|
|
||||||
roles.Add("Advisor");
|
|
||||||
if (userInfoView.IsSupervisor)
|
|
||||||
roles.Add("Supervisor");
|
|
||||||
if(userInfoView.IsEDoc)
|
|
||||||
roles.Add("EDoc");
|
|
||||||
if (userInfoView.IsEShop)
|
|
||||||
roles.Add("EShop");
|
|
||||||
if (userInfoView.IsOffice)
|
|
||||||
roles.Add("Office");
|
|
||||||
if (userInfoView.IsWareHouse)
|
|
||||||
roles.Add("Warehouse");
|
|
||||||
return roles;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
"servicesAuth": "token",
|
"servicesAuth": "token",
|
||||||
"syncRpc": "api/v2/rpc",
|
"syncRpc": "api/v2/rpc",
|
||||||
"syncRpcInvoiceExt": "invoices",
|
"syncRpcInvoiceExt": "invoices",
|
||||||
"userInfo": "api/auth/userinfo",
|
"userInfo": "api/v2/auth/userinfo",
|
||||||
"userManager": "api/v2/app/manage/users",
|
"userManager": "api/v2/app/manage/users",
|
||||||
"userManagerSetPasswd": "api/v2/app/manage/users/passwd",
|
"userManagerSetPasswd": "api/v2/app/manage/users/passwd",
|
||||||
"warehouse": "api/v2/warehouse/packages"
|
"warehouse": "api/v2/warehouse/packages"
|
||||||
|
|
|
@ -18,7 +18,7 @@ using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
namespace Wonky.Entity.DTO;
|
namespace Wonky.Entity.DTO;
|
||||||
|
|
||||||
public class UserInfoDto
|
public class X_UserInfoDto
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// User Id
|
/// User Id
|
||||||
|
@ -28,13 +28,13 @@ public class UserInfoDto
|
||||||
/// Sales representative identification
|
/// Sales representative identification
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Required(ErrorMessage = "Sælger identifikation skal angives.")]
|
[Required(ErrorMessage = "Sælger identifikation skal angives.")]
|
||||||
[MaxLength(50,ErrorMessage = "Der kan højst bruges 20 tegn.")]
|
[MaxLength(20,ErrorMessage = "Der kan højst bruges 20 tegn.")]
|
||||||
public string Advisor { get; set; } = "";
|
public string Advisor { get; set; } = "";
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Country code
|
/// Country code
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Required(ErrorMessage = "Landekode skal angives.")]
|
[Required(ErrorMessage = "Landekode skal angives.")]
|
||||||
[MaxLength(50,ErrorMessage = "Der kan højst bruges 3 tegn.")]
|
[MaxLength(3,ErrorMessage = "Der kan højst bruges 3 tegn.")]
|
||||||
public string CountryCode { get; set; } = "";
|
public string CountryCode { get; set; } = "";
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Country name
|
/// Country name
|
||||||
|
@ -44,7 +44,7 @@ public class UserInfoDto
|
||||||
/// Email
|
/// Email
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Required(ErrorMessage = "Email skal angives.")]
|
[Required(ErrorMessage = "Email skal angives.")]
|
||||||
[MaxLength(50, ErrorMessage = "Der kan højst bruges 80 tegn.")]
|
[MaxLength(80, ErrorMessage = "Der kan højst bruges 80 tegn.")]
|
||||||
public string Email { get; set; } = "";
|
public string Email { get; set; } = "";
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// First name
|
/// First name
|
|
@ -18,7 +18,7 @@ using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
namespace Wonky.Entity.DTO;
|
namespace Wonky.Entity.DTO;
|
||||||
|
|
||||||
public class UserUpdateDto
|
public class X_UserUpdateDto
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// User firstname
|
/// User firstname
|
|
@ -18,7 +18,7 @@ using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace Wonky.Entity.Views;
|
namespace Wonky.Entity.Views;
|
||||||
|
|
||||||
public class UserInfoView
|
public class X_UserInfoView
|
||||||
{
|
{
|
||||||
[JsonPropertyName("advisor")] public string Advisor { get; set; } = "";
|
[JsonPropertyName("advisor")] public string Advisor { get; set; } = "";
|
||||||
[JsonPropertyName("companyId")] public string ReferenceId { get; set; } = "";
|
[JsonPropertyName("companyId")] public string ReferenceId { get; set; } = "";
|
Loading…
Reference in a new issue