toggle edit in customer view/edit page

This commit is contained in:
Frede Hundewadt 2023-02-26 09:17:59 +01:00
parent 1a0255a14a
commit 41eccd64bf
32 changed files with 1523 additions and 1483 deletions

View file

@ -26,10 +26,10 @@ using Wonky.Entity.Views;
#pragma warning disable CS8618
namespace Wonky.Client.Components
namespace Wonky.Client.Components;
public partial class AdvisorCustomerListComponent
{
public partial class AdvisorCustomerListComponent
{
[Parameter] public List<CompanyDto> CompanyList { get; set; } = new();
[Parameter] public EventCallback<string> OnDelete { get; set; }
[Parameter] public EventCallback<string> OnSelect { get; set; }
@ -52,5 +52,4 @@ namespace Wonky.Client.Components
InfoMessage = info;
InformationModal.Show();
}
}
}

View file

@ -17,10 +17,10 @@ using System.Timers;
using Microsoft.AspNetCore.Components;
using Timer = System.Timers.Timer;
namespace Wonky.Client.Components
namespace Wonky.Client.Components;
public partial class CatalogSearchPhraseComponent
{
public partial class CatalogSearchPhraseComponent
{
private Timer Timer { get; set; } = new();
private string SearchTerm { get; set; } = "";
[Parameter] public EventCallback<string> OnChanged { get; set; }
@ -47,5 +47,4 @@ namespace Wonky.Client.Components
Timer.Enabled = false;
Timer.Dispose();
}
}
}

View file

@ -19,10 +19,10 @@ using Wonky.Client.Services;
using Timer = System.Timers.Timer;
#pragma warning disable CS8618
namespace Wonky.Client.Components
namespace Wonky.Client.Components;
public partial class CustomerSearchPhraseComponent
{
public partial class CustomerSearchPhraseComponent
{
private Timer InputTimer { get; set; } = new();
private string SearchTerm { get; set; } = "";
private UserProfile Profiles { get; set; } = new ();
@ -62,5 +62,4 @@ namespace Wonky.Client.Components
InputTimer.Dispose();
OnChanged.InvokeAsync(SearchTerm);
}
}
}

View file

@ -20,10 +20,10 @@ using Microsoft.AspNetCore.Components;
using Wonky.Client.Services;
#pragma warning disable CS8618
namespace Wonky.Client.Components
namespace Wonky.Client.Components;
public partial class CustomerSortComponent : IDisposable
{
public partial class CustomerSortComponent : IDisposable
{
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public UserProfileService ProfileService { get; set; }
[Parameter] public EventCallback<string> OnChanged { get; set; }
@ -52,6 +52,4 @@ namespace Wonky.Client.Components
{
ProfileService.OnChange -= ProfileServiceOnOnChange;
}
}
}

View file

@ -27,10 +27,10 @@ using Utils = Wonky.Client.Helpers.Utils;
#pragma warning disable CS8618
namespace Wonky.Client.Components
namespace Wonky.Client.Components;
public partial class OfficeCountryCustomerListComponent
{
public partial class OfficeCountryCustomerListComponent
{
// ******************************************************
// parameters
[Parameter] public string CountryCode { get; set; } = "";
@ -99,5 +99,4 @@ namespace Wonky.Client.Components
if (!Utils.Validate(VType.Id, companyId)) return;
SelectedCompany = CompanyList.First(x => x.CompanyId == companyId);
}
}
}

View file

@ -20,35 +20,37 @@ using Microsoft.AspNetCore.Components;
using Wonky.Client.Services;
#pragma warning disable CS8618
namespace Wonky.Client.Components
namespace Wonky.Client.Components;
public partial class PageSizeComponent : IDisposable
{
public partial class PageSizeComponent : IDisposable
{
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public UserProfileService ProfileService { get; set; }
[Parameter] public EventCallback<string> OnChanged { get; set; }
private Dictionary<string, string> Items { get; set; } = new();
private UserProfile _profiles = new();
private string PageSize { get; set; } = "";
private UserProfile Profile { get; set; } = new();
private string PageSize { get; set; }
protected override async Task OnInitializedAsync()
{
ProfileService.OnChange += ProfileServiceOnOnChange;
_profiles = await ProfileService.GetProfile();
PageSize = _profiles.PageSize;
Profile = await ProfileService.GetProfile();
PageSize = Profile.PageSize;
}
private async Task OnSelectChanged(ChangeEventArgs e)
{
var val = e.Value.ToString();
var val = e.Value?.ToString();
if (val == "-1") return;
var cVal = Convert.ToInt32(val);
if (cVal > 50) val = "50"; // mitigate variable manipulation
await OnChanged.InvokeAsync(val);
await ProfileService.SetPageSize(val);
}
private void ProfileServiceOnOnChange(UserProfile newUserProfile)
{
_profiles = newUserProfile;
Profile = newUserProfile;
StateHasChanged();
}
@ -56,5 +58,4 @@ namespace Wonky.Client.Components
{
ProfileService.OnChange -= ProfileServiceOnOnChange;
}
}
}

View file

@ -19,10 +19,10 @@ using Microsoft.AspNetCore.Components;
using Wonky.Client.Features;
using Wonky.Entity.Requests;
namespace Wonky.Client.Components
namespace Wonky.Client.Components;
public partial class PaginationComponent
{
public partial class PaginationComponent
{
[Parameter] public MetaData MetaData { get; set; } = new();
[Parameter] public int Spread { get; set; }
[Parameter] public EventCallback<int> SelectedPage { get; set; }
@ -58,5 +58,4 @@ namespace Wonky.Client.Components
MetaData.CurrentPage = link.Page;
await SelectedPage.InvokeAsync(link.Page);
}
}
}

View file

@ -21,10 +21,10 @@ using Wonky.Client.HttpRepository;
using Wonky.Client.Shared;
using Wonky.Entity.DTO;
namespace Wonky.Client.Components
namespace Wonky.Client.Components;
public partial class TaskItemTableComponent
{
public partial class TaskItemTableComponent
{
[Parameter] public List<TaskItemDto> TaskItemList { get; set; } = new();
[Parameter] public EventCallback<string> OnDeleteTask { get; set; }
[Parameter] public EventCallback<string> OnCompleteTask { get; set; }
@ -73,5 +73,4 @@ namespace Wonky.Client.Components
_confirmationModal.Hide();
await OnDeleteTask.InvokeAsync(_taskItemIdToDelete);
}
}
}

View file

@ -15,6 +15,7 @@
using System.Globalization;
using System.Text.Json;
using Blazored.LocalStorage;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
@ -69,8 +70,8 @@ public partial class WorkDateComponent : IDisposable
/// <param name="e"></param>
private async Task OnDateChanged(ChangeEventArgs e)
{
var x = DateTime.TryParse(e.Value.ToString(), out var setDate);
if (x)
if (string.IsNullOrWhiteSpace(e.Value.ToString())) return;
if (DateTime.TryParse(e.Value.ToString(), out var setDate))
{
await UserProfile.SetWorkDate(setDate);
await OnChangedCallback.InvokeAsync($"{setDate:yyyy-MM-dd}");

View file

@ -26,14 +26,14 @@
using System.Diagnostics;
namespace Wonky.Client.Helpers
namespace Wonky.Client.Helpers;
/// <summary>
/// Squid is guid string shortened and url safe
/// </summary>
[DebuggerDisplay("{" + nameof(Value) + "}")]
public readonly struct Squid : IEquatable<Squid>
{
/// <summary>
/// Squid is guid string shortened and url safe
/// </summary>
[DebuggerDisplay("{" + nameof(Value) + "}")]
public readonly struct Squid : IEquatable<Squid>
{
/// <summary>
/// Return Empty value
/// </summary>
@ -358,5 +358,4 @@ namespace Wonky.Client.Helpers
{
return oGuid == Guid.Empty ? Empty : new Squid(oGuid);
}
}
}

View file

@ -23,10 +23,10 @@ using Wonky.Client.Services;
using Microsoft.AspNetCore.Components;
using Toolbelt.Blazor;
namespace Wonky.Client.HttpInterceptors
namespace Wonky.Client.HttpInterceptors;
public class HttpInterceptorService
{
public class HttpInterceptorService
{
private readonly HttpClientInterceptor _interceptor;
private readonly NavigationManager _navigation;
private readonly IToastService _toast;
@ -121,6 +121,4 @@ namespace Wonky.Client.HttpInterceptors
}
// throw new HttpResponseException(message);
}
}
}

View file

@ -16,11 +16,11 @@
using System.Runtime.Serialization;
namespace Wonky.Client.HttpInterceptors
namespace Wonky.Client.HttpInterceptors;
[Serializable]
public class HttpResponseException : Exception
{
[Serializable]
public class HttpResponseException : Exception
{
public HttpResponseException()
{
}
@ -37,5 +37,4 @@ namespace Wonky.Client.HttpInterceptors
{
}
}
}

View file

@ -30,7 +30,7 @@
<div class="row g-3">
<label for="date" class="col-form-label-sm col-sm-1">Dato</label>
<div class="col-sm-3">
<input id="date" class="form-control" type="text" value="@(DateTime.Parse(ReportItem.CreateTimestamp).ToShortDateString())" readonly/>
<input id="date" class="form-control" type="text" value="@ReportItem.CreateTimestamp" readonly/>
</div>
<label for="account" class="col-form-label-sm col-sm-1">Konto</label>

View file

@ -26,7 +26,7 @@
<div class="row bg-dark text-white rounded-2 mb-2 py-2 align-items-center">
<div class="col">
<WorkDateComponent OnChangedCallback="WorkDateComponentCallback" />
<WorkDateComponent OnChangedCallback="WorkDateComponentCallback"/>
</div>
</div>
@ -49,7 +49,6 @@
<h3>Der kan ikke oprettes besøg når der findes rapport for @SelectedDate.ToShortDateString()</h3>
</div>
</div>
}
else
{
@ -82,7 +81,7 @@ else
<option value="order">Bestilling</option>
}
@if(DraftProvider.Draft.DraftType == "offer")
@if (DraftProvider.Draft.DraftType == "offer")
{
<option selected value="quote">Tilbud</option>
}
@ -153,8 +152,8 @@ else
<div class="col-sm-6"></div>
<label for="vatNumber" class="col-sm-2 col-form-label-sm">Cvr/Org nr.</label>
<div class="col-sm-4">
<InputText id="vatNumber" class="form-control" @bind-Value="Activity.VatNumber" />
<ValidationMessage For="@(() => Activity.VatNumber)" />
<InputText id="vatNumber" class="form-control" @bind-Value="Activity.VatNumber"/>
<ValidationMessage For="@(() => Activity.VatNumber)"/>
</div>
</div>
@ -360,13 +359,15 @@ else
***************** Confirm product check overlay button *****************************
***************** Continue by submitton order to erp *****************************
*@
<button type="button" class="btn btn-warning" @onclick="CallConfirmCheckOverlay" disabled="@(PoFormInvalid || Working)"><i class="bi-cloud-arrow-up"></i> @ButtonText</button>
<button type="button" class="btn btn-warning" @onclick="CallConfirmCheckOverlay" disabled="@(PoFormInvalid || Working)">
<i class="bi-cloud-arrow-up"></i> @ButtonText
</button>
</div>
</div>
}
<ProductCheckConfirmationOverlay BodyMessage="" CompanyId="@CompanyId" Products="CheckList"
OnOkClicked="ConfirmProductCheckCallback" @ref="ConfirmationCheckOverlay" />
OnOkClicked="ConfirmProductCheckCallback" @ref="ConfirmationCheckOverlay"/>
<ConfirmWorkDateModal BodyMessage="@PromptDateConfirm"
OnOkClicked="WorkDateConfirmCallback" @ref="ConfirmWorkDate"/>
@ -376,10 +377,9 @@ else
<ProductPriceHistoryOverlay CompanyId="@CompanyId" Sku="@SelectedItem.Sku" OnSelected="PriceHistoryCallback" @ref="PriceOverlay"/>
<CustomerInvoiceListOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceListOverlay" />
<CustomerInvoiceListOverlay CustomerInvoices="CompanyInvoices" @ref="InvoiceListOverlay"/>
<CustomerActivityListOverlay Activities="Activities" CompanyName="@Company.Name" @ref="ActivityListOverlay" />
<CustomerActivityListOverlay Activities="Activities" CompanyName="@Company.Name" @ref="ActivityListOverlay"/>
<CustomerInventoryListOverlay CompanyName="@Company.Name" CompanyId="@CompanyId" CountryCode="@Company.CountryCode"
OnSelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryListOverlay" />
OnSelected="OnInventoryCallback" Inventory="Inventory" @ref="InventoryListOverlay"/>

View file

@ -1,5 +1,4 @@

// Copyright (C) 2022 FCS Frede's Computer Services.
// 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
@ -30,6 +29,7 @@ using Wonky.Client.Services;
using Wonky.Client.Shared;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
#pragma warning disable CS8618
namespace Wonky.Client.Pages;
@ -49,18 +49,22 @@ public partial class AdvisorActivityCreatePage : IDisposable
[Inject] public IAdvisorActivityRepository ActivityRepo { get; set; }
[Inject] public IAdvisorReportRepository ReportRepo { get; set; }
[Inject] public IAdvisorCustomerHistoryRepository HistoryRepo { get; set; }
[Inject] public IUserInfoService UserInfoService { get; set; }
[Inject] public IUserInfoService UserService { get; set; }
// *************************************************************
// Parameters
[CascadingParameter] private DraftStateProvider DraftProvider { get; set; } = new();
[Parameter] public string CompanyId { get; set; } = "";
// *************************************************************
// Variables
private readonly JsonSerializerOptions _options = new() {PropertyNameCaseInsensitive = true};
private readonly JsonSerializerOptions _options = new() { PropertyNameCaseInsensitive = true };
private SalesItemView SelectedItem { get; set; } = new();
private UserProfile UserProfile { get; set; } = new();
private ActivityDto Activity { get; set; } = new();
private CompanyDto Company = new();
private CompanyDto Company { get; set; } = new();
private EditContext? ActivityContext { get; set; }
private bool PoFormInvalid { get; set; } = true;
private bool ShowItem { get; set; }
@ -78,7 +82,9 @@ public partial class AdvisorActivityCreatePage : IDisposable
private string PromptDateConfirm { get; set; } = "";
private string ButtonText { get; set; } = "Gem besøg";
private bool OrgWarning { get; set; }
private const string PromptDemoForgotten = "Har du glemt demo?";
// *************************************************************
// Overlays
private PriceCatalogOverlay CatalogOverlay { get; set; } = new();
@ -88,7 +94,9 @@ public partial class AdvisorActivityCreatePage : IDisposable
private ProductCheckConfirmationOverlay ConfirmationCheckOverlay { get; set; } = new();
private CustomerInvoiceListOverlay InvoiceListOverlay { get; set; } = new();
private CustomerInventoryListOverlay InventoryListOverlay { get; set; } = new();
private CustomerActivityListOverlay ActivityListOverlay { get; set; } = new();
// *************************************************************
// Lists
private List<ProductInventoryView> Inventory { get; set; } = new();
@ -110,11 +118,11 @@ public partial class AdvisorActivityCreatePage : IDisposable
// User Preferences
UserProfile = await ProfileService.GetProfile();
// User Info
SalesRep = await UserInfoService.GetUserInfo();
SalesRep = await UserService.GetUserInfo();
// Fetch Customer from http
Company = await CompanyRepo.GetCompanyById(CompanyId);
if (Company.HasFolded == 1)
// Company has shutdown activities
// Company has shut down
Activity.OrderMessage = "BEMÆRK: CVR nummer er ophørt.";
// variable to validate if customer needs phone number update
@ -150,7 +158,10 @@ public partial class AdvisorActivityCreatePage : IDisposable
Activity.DlvZipCode = Company.ZipCode;
Activity.DlvCity = Company.City;
// Initialize date variable
SelectedDate = string.IsNullOrWhiteSpace(UserProfile.WorkDate) ? DateTime.Now : DateTime.Parse(UserProfile.WorkDate);
Logger.LogDebug("AdvisorActivityCreatePage => DateTime parser => {}", UserProfile.WorkDate);
SelectedDate = string.IsNullOrWhiteSpace(UserProfile.WorkDate)
? DateTime.Now
: DateTime.Parse(UserProfile.WorkDate);
// raise flag if report is closed
ReportClosed = await ReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}");
// Ask for confirmation of date
@ -160,6 +171,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
PromptDateConfirm = $"Aktiviteter oprettes med dato {SelectedDate.ToShortDateString()}. Er dette OK?";
ConfirmWorkDate.Show();
}
// Lines may already have been added from the company inventory page
if (DraftProvider.Draft.DraftType == "order")
{
@ -168,6 +180,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
Activity.ActivityStatusEnum = "order";
PoFormInvalid = false;
}
Working = false;
}
@ -218,7 +231,8 @@ public partial class AdvisorActivityCreatePage : IDisposable
var iDate = await Storage.GetItemAsStringAsync($"{CompanyId}-iDate");
// if we have a list and iDate was today return the list
if (!string.IsNullOrWhiteSpace(storage) && (!string.IsNullOrWhiteSpace(iDate) && DateTime.Parse(iDate.Replace("\"", "")) >= DateTime.Now))
if (!string.IsNullOrWhiteSpace(storage) && (!string.IsNullOrWhiteSpace(iDate) &&
DateTime.Parse(iDate.Replace("\"", "")) >= DateTime.Now))
{
Logger.LogDebug("fetching invoices from storage");
Logger.LogDebug("storage contains <= {}", storage);
@ -242,7 +256,8 @@ public partial class AdvisorActivityCreatePage : IDisposable
if (OrgWarning)
return;
OrgWarning = true;
if (Company.CountryCode.ToLower() == "se" && VatUtils.SanitizeVatNumber(Activity.VatNumber).Length < 10 && Activity.ActivityStatusEnum == "order")
if (Company.CountryCode.ToLower() == "se" && VatUtils.SanitizeVatNumber(Activity.VatNumber).Length < 10 &&
Activity.ActivityStatusEnum == "order")
{
Toaster.ShowWarning("Org nummer er ufuldstændig. Skal opdateres før bestilling kan sendes. ", "ADVARSEL");
}
@ -275,7 +290,9 @@ public partial class AdvisorActivityCreatePage : IDisposable
{
Working = true;
// pop a message
Toaster.ShowError("Produkt gennemgang mangler. Vent mens produkt oversigt indlæses. Gå ikke væk fra siden!", "Produkt check ...");
Toaster.ShowError(
"Produkt gennemgang mangler. Vent mens produkt oversigt indlæses. Gå ikke væk fra siden!",
"Produkt check ...");
// product inventory has not been updated
// send rpc call to sync ERP to CRM
Toaster.ShowInfo("Vent mens data synkroniseres ...", "ERP til CRM ...");
@ -288,7 +305,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
Toaster.ShowInfo("Vent mens produkt oversigt hentes", "CRM produkt liste");
CheckList = await HistoryRepo.FetchInventory(CompanyId);
if(CheckList.Any())
if (CheckList.Any())
CheckList = CheckList.OrderBy(x => x.Description).ToList();
await Storage.SetItemAsync($"{CompanyId}-products", CheckList);
@ -298,7 +315,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
{
// deserialize storage data
CheckList = JsonSerializer.Deserialize<List<ProductInventoryView>>(pStorage);
if(CheckList.Any())
if (CheckList.Any())
CheckList = CheckList.OrderBy(x => x.Description).ToList();
}
@ -314,8 +331,8 @@ public partial class AdvisorActivityCreatePage : IDisposable
{
item.Check = false;
}
await Storage.SetItemAsync($"{CompanyId}-products", CheckList);
await Storage.SetItemAsync($"{CompanyId}-products", CheckList);
}
private async Task WorkDateConfirmCallback()
@ -352,7 +369,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
private void ShowPriceHistoryOverlay()
{
if(ShowItem)
if (ShowItem)
PriceOverlay.Show();
}
@ -376,6 +393,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
Toaster.ShowError("Kunde adresse er ufuldstændig.");
return;
}
// validate org number
// - this is a required input
// - must validate according to country rules.
@ -384,6 +402,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
Toaster.ShowError("Firma registreringsnummer er ikke korrekt.");
return;
}
// validate input according to status
switch (Activity.ActivityStatusEnum)
{
@ -400,6 +419,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
Toaster.ShowError("Ved tilbud skal en gyldig email adresse angives.");
return;
}
// raise working flag
Working = true;
@ -412,6 +432,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
Activity.OrderMessage = $"Telefonnr. opdateret.\n{Activity.OrderMessage}";
await CompanyRepo.UpdateErpData(Company.CompanyId, Company);
}
// begin assembling activity
Activity.ActivityDate = $"{SelectedDate:yyyy-MM-dd}";
Activity.OurRef = Activity.ActivityTypeEnum switch
@ -443,6 +464,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
.ToList();
Activity.Lines = lines;
}
// debug logging
Logger.LogDebug("CrmNewActivityPage => \n {}", JsonSerializer.Serialize(Activity));
// post to api
@ -458,6 +480,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
Navigator.NavigateTo($"/advisor/customers");
return;
}
// lower working flag
Working = false;
// show error message
@ -489,7 +512,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
Discount = "0";
// add it to the cart
DraftProvider.Draft.Items.Add(item);
if(Activity.ActivityStatusEnum != "quote")
if (Activity.ActivityStatusEnum != "quote")
Activity.ActivityStatusEnum = "order";
// save the item using the CartStateProvider's save method
await DraftProvider.SaveChangesAsync();
@ -507,7 +530,8 @@ public partial class AdvisorActivityCreatePage : IDisposable
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
{
Logger.LogDebug("ActivityNewPage => HandleFieldChanged => ActivityStatusEnum <= '{}'", Activity.ActivityStatusEnum);
Logger.LogDebug("ActivityNewPage => HandleFieldChanged => ActivityStatusEnum <= '{}'",
Activity.ActivityStatusEnum);
DraftProvider.Draft.DraftType = Activity.ActivityStatusEnum;
if (Activity.ActivityStatusEnum == "noSale")
{
@ -532,6 +556,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
PoFormInvalid = true;
return;
}
PoFormInvalid = !ActivityContext.Validate();
StateHasChanged();
}

View file

@ -1,4 +1,3 @@
// 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
@ -14,6 +13,7 @@
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
using Blazored.Toast.Services;
using Microsoft.AspNetCore.Components;
@ -21,6 +21,7 @@ using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Wonky.Client.Services;
using Wonky.Entity.Views;
#pragma warning disable CS8618
namespace Wonky.Client.Pages;
@ -45,7 +46,9 @@ public partial class AdvisorActivityTodayListPage : IDisposable
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
UserProfile = await ProfileService.GetProfile();
SelectedDate = string.IsNullOrWhiteSpace(UserProfile.WorkDate) ? DateTime.Now : DateTime.Parse(UserProfile.WorkDate);
SelectedDate = string.IsNullOrWhiteSpace(UserProfile.WorkDate)
? DateTime.Now
: DateTime.Parse(UserProfile.WorkDate);
ReportExist = await ReportRepo.ReportExist($"{SelectedDate:yyyy-MM-dd}");
await GetActivities($"{SelectedDate:yyyy-MM-dd}");
Working = false;
@ -68,5 +71,4 @@ public partial class AdvisorActivityTodayListPage : IDisposable
{
Interceptor.DisposeEvent();
}
}

View file

@ -23,7 +23,6 @@
@page "/advisor/customers/{CompanyId}/quotes/{OrderId}"
<PageTitle>@ReportItem.Company.Name @ReportItem.OrderDate</PageTitle>
@* <ReportItemComponent ReportItem="@_item" /> *@
<table class="table table-sm table-striped d-print-table">
<thead>
@ -124,7 +123,9 @@
{
<tr>
<td colspan="4"></td>
<td colspan="2"><h5 class="fw-bold text-center"><i class="bi-lightning-charge the-fast" style="font-size: 2rem;"></i> HASTER</h5></td>
<td colspan="2">
<h5 class="fw-bold text-center"><i class="bi-lightning-charge the-fast" style="font-size: 2rem;"></i> HASTER</h5>
</td>
</tr>
}
</tbody>

View file

@ -1,4 +1,3 @@
// 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
@ -22,6 +21,7 @@ using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
#pragma warning disable CS8618
namespace Wonky.Client.Pages;
@ -42,6 +42,7 @@ public partial class AdvisorActivityViewEditPage : IDisposable
private int GraceTime { get; set; } = 60;
private bool Working { get; set; } = true;
protected override async Task OnInitializedAsync()
{
Interceptor.RegisterEvent();

View file

@ -36,7 +36,7 @@
</div>
</div>
<CustomerActivityListComponent Activities="ActivityList" />
<CustomerActivityListComponent Activities="ActivityList"/>
}
@if (Working)
{

View file

@ -1,4 +1,3 @@
// 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
@ -20,6 +19,7 @@ using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
#pragma warning disable CS8618
namespace Wonky.Client.Pages;
@ -48,7 +48,7 @@ public partial class AdvisorCustomerActivityListPage : IDisposable
{
Working = true;
ActivityList = await AdvisorActivityRepo.GetCustomerActivities(CompanyId);
if(ActivityList.Any())
if (ActivityList.Any())
ActivityList = ActivityList.OrderByDescending(x => x.OrderDate).ToList();
Working = false;
}

View file

@ -14,7 +14,6 @@
//
using System.Text.Json;
using System.Xml;
using Blazored.LocalStorage;
using Blazored.Toast.Services;
using Microsoft.AspNetCore.Components;
@ -27,13 +26,13 @@ using Wonky.Client.Services;
using Wonky.Client.Shared;
using Wonky.Entity.DTO;
using Wonky.Entity.Models;
using Wonky.Entity.Views;
#pragma warning disable CS8618
namespace Wonky.Client.Pages
namespace Wonky.Client.Pages;
public partial class AdvisorCustomerCreatePage : IDisposable
{
public partial class AdvisorCustomerCreatePage : IDisposable
{
[Inject] public IToastService Toaster { get; set; }
[Inject] public ILogger<AdvisorCustomerCreatePage> Logger { get; set; }
[Inject] public ILocalStorageService Storage { get; set; }
@ -184,5 +183,4 @@ namespace Wonky.Client.Pages
CompanyContext.OnFieldChanged -= HandleFieldChanged;
CompanyContext.OnValidationStateChanged -= ValidationChanged;
}
}
}

View file

@ -23,40 +23,42 @@
<div class="sticky-top bg-dark text-light rounded-2 px-3">
<div class="row g-3">
<div class="col-sm-2">
<CustomerSearchColumnComponent OnChanged="SetSearchCol" />
<CustomerSearchColumnComponent OnChanged="SetSearchCol"/>
</div>
<div class="col-sm-6">
<CustomerSearchPhraseComponent OnChanged="SetSearchPhrase" />
<CustomerSearchPhraseComponent OnChanged="SetSearchPhrase"/>
</div>
<div class="col-sm-2">
<CustomerSortComponent OnChanged="SetSortCol" />
<CustomerSortComponent OnChanged="SetSortCol"/>
</div>
<div class="col-sm-2">
<PageSizeComponent OnChanged="SetPageSize" />
<PageSizeComponent OnChanged="SetPageSize"/>
</div>
<div class="col-sm-3">
<div class="col-sm-2 mx-auto">
<button type button class="btn btn-warning @(ShowFolded ? "active" : "")"
data-bs-toggle="button" aria-pressed="@ShowFolded" @onclick="OnFoldedClick">
@ButtonFoldedText
</button>
<button type button class="btn btn-warning @(@ShowHidden ? "active" : "")"
data-bs-toggle="button" aria-pressed="@ShowHidden" @onclick="OnHiddenClick">
@ButtonHiddenText
data-bs-toggle="button" aria-pressed="@ShowFolded" @onclick="ToggleFolded">
@ToggleFoldedText
</button>
</div>
<div class="col-sm-7">
<div class="col-sm-2 mx-auto">
<button type button class="btn btn-warning @(@ShowHidden ? "active" : "")"
data-bs-toggle="button" aria-pressed="@ShowHidden" @onclick="ToggleHidden">
@ToggleHiddenText
</button>
</div>
<div class="col-sm-5">
<PaginationComponent MetaData="PageData" Spread="2" SelectedPage="SelectedPage"/>
</div>
<div class="col-sm-2 text-end">
<div class="col-sm-1">@* placeholder *@</div>
<div class="col-sm-2 mx-auto">
<a class="btn btn-success text-nowrap" href="/advisor/customers/new">Opret kunde <i class="bi-plus"></i></a>
</div>
</div>
</div>
<AdvisorCustomerListComponent CompanyList="CompanyList" OnDelete="DeleteCompany" />
<AdvisorCustomerListComponent CompanyList="CompanyList" OnDelete="DeleteCompany"/>
@if (Working)
{
<WorkingThreeDots />
<WorkingThreeDots/>
}

View file

@ -1,4 +1,3 @@
// 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
@ -22,12 +21,13 @@ using Wonky.Client.Services;
using Wonky.Entity.DTO;
using Wonky.Entity.Requests;
using Wonky.Entity.Views;
#pragma warning disable CS8618
namespace Wonky.Client.Pages
namespace Wonky.Client.Pages;
public partial class AdvisorCustomerListPage : IDisposable
{
public partial class AdvisorCustomerListPage : IDisposable
{
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public UserProfileService ProfileService { get; set; }
[Inject] public IAdvisorCustomerRepository CompanyRepo { get; set; }
@ -36,58 +36,59 @@ namespace Wonky.Client.Pages
[Inject] public IUserInfoService UserInfoService { get; set; }
private List<CompanyDto> CompanyList { get; set; } = new();
private UserProfile Profiles { get; set; } = new();
private UserManagerEditView XUserInfo { get; set; } = new();
private UserProfile Profile { get; set; } = new();
private UserManagerEditView UserInfo { get; set; } = new();
private string SavedSearch { get; set; } = "";
private bool Working { get; set; } = true;
private MetaData PageData { get; set; } = new();
private CustomerPaging Paging { get; set; } = new();
private string ButtonFoldedText { get; set; } = "Vis Ophørte";
private string ToggleFoldedText { get; set; } = "Vis Lukkede";
private bool ShowFolded { get; set; }
private string ButtonHiddenText { get; set; } = "Vis Skjulte";
private string ToggleHiddenText { get; set; } = "Inkl. Skjulte";
private bool ShowHidden { get; set; }
protected override void OnParametersSet()
{
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
}
protected override async Task OnInitializedAsync()
{
// set preferences
Profiles = await ProfileService.GetProfile();
XUserInfo = await UserInfoService.GetUserInfo();
Paging.OrderBy = Profiles.CompanySort;
Paging.SearchColumn = Profiles.CompanySearch;
Paging.PageSize = Convert.ToInt32(Profiles.PageSize);
Profile = await ProfileService.GetProfile();
UserInfo = await UserInfoService.GetUserInfo();
Paging.OrderBy = Profile.CompanySort;
Paging.SearchColumn = Profile.CompanySearch;
Paging.PageSize = Convert.ToInt32(Profile.PageSize);
Paging.HasFolded = ShowFolded ? 1 : 0;
// load saved search
SavedSearch = string.IsNullOrWhiteSpace(Profiles.CompanyFilterPhrase) ? "" : Profiles.CompanyFilterPhrase;
SavedSearch = string.IsNullOrWhiteSpace(Profile.CompanyFilterPhrase) ? "" : Profile.CompanyFilterPhrase;
Paging.SearchTerm = SavedSearch;
// get companies
await FetchCustomers();
Working = false;
}
private async Task OnFoldedClick()
private async Task ToggleFolded()
{
Working = true;
ShowFolded = !ShowFolded;
ButtonFoldedText = ShowFolded ? "Vis Aktive" : "Vis Ophørte";
ToggleFoldedText = ShowFolded ? "Normal Visning" : "Vis Lukkede";
CompanyList = new List<CompanyDto>();
Paging.PageNumber = 1;
Paging.HasFolded = ShowFolded ? 1 : 0;
await FetchCustomers();
}
private async Task OnHiddenClick()
private async Task ToggleHidden()
{
Working = true;
ShowHidden = !ShowHidden;
ButtonHiddenText = ShowHidden ? "Vis Normale" : "Vis skjulte";
ToggleHiddenText = ShowHidden ? "Normal Visning" : "Inkl. Skjulte";
CompanyList = new List<CompanyDto>();
Paging.PageNumber = 1;
Paging.IsHidden = ShowHidden ? 1 : 0;
@ -108,6 +109,7 @@ namespace Wonky.Client.Pages
Paging.PageNumber = 1;
await FetchCustomers();
}
private async Task SetPageSize(string pageSize)
{
CompanyList = new List<CompanyDto>();
@ -162,7 +164,4 @@ namespace Wonky.Client.Pages
}
public void Dispose() => Interceptor.DisposeEvent();
}
}

View file

@ -36,85 +36,86 @@
// erp context
<EditForm EditContext="ErpContext">
<DataAnnotationsValidator/>
<div class="row g-3">
<div class="row g-1">
@* Company Name *@
<label for="name" class="col-sm-1 col-form-label-sm">Navn</label>
<div class="col-sm-5">
<InputText id="name" class="form-control" @bind-Value="Company.Name"/>
<InputText id="name" class="form-control" @bind-Value="Company.Name" readonly="@(ErpEditDisabled)"/>
<ValidationMessage For="@(() => Company.Name)"></ValidationMessage>
</div>
@* Company Attention *@
<label for="attention" class="col-sm-1 col-form-label-sm">Att.</label>
<div class="col-sm-5">
<InputText id="attention" class="form-control" @bind-Value="Company.Attention"/>
<InputText id="attention" class="form-control" @bind-Value="Company.Attention" readonly="@(ErpEditDisabled)"/>
<ValidationMessage For="@(() => Company.Attention)"></ValidationMessage>
</div>
@* Address 1 *@
<label for="address1" class="col-sm-1 col-form-label-sm">Adresse</label>
<div class="col-sm-5">
<InputText id="address1" class="form-control" @bind-Value="Company.Address1"/>
<InputText id="address1" class="form-control" @bind-Value="Company.Address1" readonly="@(ErpEditDisabled)"/>
<ValidationMessage For="@(() => Company.Address1)"></ValidationMessage>
</div>
@* Address 2 *@
<label for="address2" class="col-sm-1 col-form-label-sm">Adresse</label>
<div class="col-sm-5">
<InputText id="address2" class="form-control" @bind-Value="Company.Address2"/>
<InputText id="address2" class="form-control" @bind-Value="Company.Address2" readonly="@(ErpEditDisabled)"/>
<ValidationMessage For="@(() => Company.Address2)"></ValidationMessage>
</div>
@* Post Code *@
<label for="zipCode" class="col-sm-1 col-form-label-sm">PostNr</label>
<div class="col-sm-2">
<InputText id="zipCode" class="form-control" @bind-Value="Company.ZipCode"/>
<InputText id="zipCode" class="form-control" @bind-Value="Company.ZipCode" readonly="@(ErpEditDisabled)"/>
<ValidationMessage For="@(() => Company.ZipCode)"></ValidationMessage>
</div>
@* City Name *@
<label for="city" class="col-sm-1 col-form-label-sm">Bynavn</label>
<div class="col-sm-8">
<InputText id="city" class="form-control" @bind-Value="Company.City"/>
<InputText id="city" class="form-control" @bind-Value="Company.City" readonly="@(ErpEditDisabled)"/>
<ValidationMessage For="@(() => Company.City)"></ValidationMessage>
</div>
@* Phone *@
<label for="phone" class="col-sm-1 col-form-label-sm">Telefon</label>
<div class="col-sm-3">
<InputText id="phone" class="form-control" @bind-Value="Company.Phone"/>
<div class="col-sm-2">
<InputText id="phone" class="form-control" @bind-Value="Company.Phone" readonly="@(ErpEditDisabled)"/>
<ValidationMessage For="@(() => Company.Phone)"></ValidationMessage>
</div>
@* Mobile *@
<label for="mobile" class="col-sm-1 col-form-label-sm">Mobil</label>
<div class="col-sm-3">
<InputText id="mobile" class="form-control" @bind-Value="Company.Mobile"/>
<div class="col-sm-2">
<InputText id="mobile" class="form-control" @bind-Value="Company.Mobile" readonly="@(ErpEditDisabled)"/>
<ValidationMessage For="@(() => Company.Mobile)"></ValidationMessage>
</div>
<div class="col-sm-4 d-grid mx-auto">
<button type="button" class="btn btn-danger" @onclick="ToggleVisibility">@ToggleButtonText</button>
</div>
@* Email *@
<label for="email" class="col-sm-1 col-form-label-sm">Epost</label>
<div class="col-sm-5">
<InputText id="email" class="form-control" @bind-Value="Company.Email"/>
<InputText id="email" class="form-control" @bind-Value="Company.Email" readonly="@(ErpEditDisabled)"/>
<ValidationMessage For="@(() => Company.Email)"></ValidationMessage>
</div>
<div class="col-sm-3 d-grid mx-auto">
<button type="button" class="btn btn-primary d-block" disabled="@(Company.HasFolded == 0 || Company.Name == "ERROR")" onclick="@ForceActivity">Aktiver besøg</button>
<div class="col-sm-4">@* ---- placeholder --- *@</div>
<div class="col-sm-2 d-grid mx-auto">
<button type="button" class="btn btn-edit" @onclick="ToggleErpEdit"><i class="bi-pencil"></i> STAM data</button>
</div>
<div class="col-sm-3 d-grid mx-auto">
<button type="button" class="btn btn-danger d-block" onclick="@UpdateErpData" disabled="@(Working || Company.Name == "ERROR")"><i class="bi-cloud-arrow-up"></i> STAM data </button>
<button type="button" class="btn btn-primary d-block" disabled="@(Company.HasFolded == 0 || Company.Name == "ERROR")" @onclick="ForceActivity">Aktiver besøg</button>
</div>
<div class="col-sm-3 d-grid mx-auto">
<button type="button" class="btn btn-danger d-block" onclick="@UpdateErpData" disabled="@(Working || Company.Name == "ERROR" || ErpEditDisabled)"><i class="bi-cloud-arrow-up"></i> STAM data </button>
</div>
<hr class="mb-3"/>
<div class="row">
@* vat number*@
<label for="vatNumber" class="col-sm-2 col-form-label-sm">CVR/Org nr.</label>
<div class="col-sm-4">
<label for="vatNumber" class="col-sm-1 col-form-label-sm">CVR/Org nr.</label>
<div class="col-sm-3">
<div class="input-group">
<span class="input-group-text">
<DisplayStateComponent StateClass="@VatState"/>
</span>
<InputText id="vatNumber" class="form-control" @bind-Value="Company.VatNumber"/>
<InputText id="vatNumber" class="form-control" @bind-Value="Company.VatNumber" readonly="@(VatEditDisabled)"/>
<ValidationMessage For="@(() => Company.VatNumber)"></ValidationMessage>
</div>
</div>
<div class="col-sm-2 d-grid mx-auto">
<button type="button" class="btn btn-edit" @onclick="ToggleVatEdit"><i class="bi-pencil"></i> Moms/Org Nr.</button>
</div>
@* vat lookup *@
<div class="col-sm-3 d-grid mx-auto">
@switch (CountryCode)
@ -132,7 +133,7 @@
</div>
@* save vat number *@
<div class="col-sm-3 d-grid mx-auto">
<button type="button" class="btn btn-warning d-block" @onclick="UpdateVatNumber"><i class="bi-cloud-arrow-up"></i> Moms/Org Nr.</button>
<button type="button" class="btn btn-warning d-block" @onclick="UpdateVatNumber" disabled="@(VatEditDisabled)"><i class="bi-cloud-arrow-up"></i> Moms/Org Nr.</button>
</div>
</div>
@ -240,6 +241,11 @@
<InputTextArea id="crmNotes" class="form-control" @bind-Value="Company.CrmNotes"/>
</div>
</div>
<div class="row pt-3">
<div class="col-sm-3 d-grid">
<button type="button" class="btn btn-danger" @onclick="ToggleVisibility">@ToggleButtonText</button>
</div>
</div>
</EditForm>
}

View file

@ -1,4 +1,3 @@
// 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
@ -28,7 +27,7 @@ using Wonky.Client.Services;
using Wonky.Client.Shared;
using Wonky.Entity.DTO;
using Wonky.Entity.Models;
using Wonky.Entity.Views;
#pragma warning disable CS8618
namespace Wonky.Client.Pages;
@ -47,7 +46,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public IUserInfoService UserInfoService { get; set; }
private readonly JsonSerializerOptions _options = new () { PropertyNameCaseInsensitive = true };
private readonly JsonSerializerOptions _options = new() { PropertyNameCaseInsensitive = true };
private CompanyDto Company { get; set; } = new();
private EditContext ErpContext { get; set; }
private DateTime LastVisit { get; set; }
@ -63,6 +62,8 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
private string ActionLink { get; set; } = "";
private bool Working { get; set; } = true;
private bool CountryIsDk { get; set; } = true;
private bool ErpEditDisabled { get; set; } = true;
private bool VatEditDisabled { get; set; } = true;
private List<ContactDto> Contacts { get; set; } = new();
private VatLookupDkModal VatLookupPopup { get; set; } = new();
private ContactDto SelectedContact { get; set; } = new();
@ -78,7 +79,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
Interceptor.RegisterBeforeSendEvent();
// initialize default contact
DefaultContact = new ContactDto { CompanyId = CompanyId, ContactId = "", FirstName = ""};
DefaultContact = new ContactDto { CompanyId = CompanyId, ContactId = "", FirstName = "" };
// setup form context
ErpContext = new EditContext(Company);
@ -96,7 +97,8 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
Company = await CustomerRepo.GetCompanyById(CompanyId);
Logger.LogDebug("company => {}", JsonSerializer.Serialize(Company));
ToggleButtonText = Company.IsHidden == 0 ? "Skjul kunde" : "Vis kunde";
// toggle view button text
ToggleButtonText = Company.IsHidden == 0 ? "Udelad kunde i oversigt" : "Brug Normal Visning";
CurrentVat = Company.VatNumber;
Company.CountryCode = UserInfo.CountryCode.ToLower();
// internal flag
@ -121,7 +123,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
// action link passed to activity button component
ActionLink = $"/advisor/customers/{CompanyId}/activities/new"; // used when drawing visit button
// handle company out of business case
if(Company.HasFolded == 1)
if (Company.HasFolded == 1)
{
// this is only used if user has selected to show closed companies
HasFolded = true;
@ -137,6 +139,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
// vat state css class
VatState = Company.ValidVat == 1 ? "the-good" : "no-vat"; // assign css class
}
// create search address from address
if (CountryIsDk)
CompanyVatAddress = PrepareVatAddress(Company);
@ -149,16 +152,28 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
await RequestErpUpdate();
}
private void ToggleErpEdit()
{
ErpEditDisabled = !ErpEditDisabled;
}
private void ToggleVatEdit()
{
VatEditDisabled = !VatEditDisabled;
}
private async Task ToggleVisibility()
{
Company.IsHidden = Company.IsHidden == 0 ? 1 : 0;
ToggleButtonText = Company.IsHidden == 0 ? "Skjul kunde" : "Vis kunde";
// toggle view button text
ToggleButtonText = Company.IsHidden == 0 ? "Udelad kunde i oversigt" : "Brug Normal Visning";
Logger.LogDebug("ToggleVisibility => Company.IsHidden == {}", Company.IsHidden);
await CustomerRepo.UpdateCrmData(CompanyId, Company);
}
private async Task RequestErpUpdate()
{
if(Working)
if (Working)
return;
Working = true;
Company.HistorySync = await HistoryRepo.InvoiceErpToCrmRpc(CompanyId, Company.HistorySync);
@ -173,7 +188,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
{
// load contacts
Contacts = await AdvisorContactRepo.GetContacts(companyId);
if(Contacts.Any() && Contacts.Count > 1)
if (Contacts.Any() && Contacts.Count > 1)
Contacts = Contacts.OrderBy(x => x.FirstName).ToList();
}
@ -206,6 +221,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
Company.ZipCode = regInfo.ZipCode;
Company.City = regInfo.City;
}
Company.VatNumber = regInfo.VatNumber;
}
@ -247,6 +263,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
// send put request to backend
await AdvisorContactRepo.UpdateContact(contact);
}
// reset selected contact
SelectedContact = new ContactDto();
// reload contacts from backend
@ -290,6 +307,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
Company = result;
StateHasChanged();
}
Working = false;
Toaster.ClearAll();
}
@ -302,6 +320,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
{
if (Working)
return;
ErpEditDisabled = true;
Working = true;
Toaster.ShowInfo("Vent venligst ...", "OPDATERER STAM DATA");
var result = await CustomerRepo.UpdateErpData(CompanyId, Company);
@ -310,6 +329,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
Company = result;
StateHasChanged();
}
Working = false;
Toaster.ClearAll();
}
@ -326,8 +346,10 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
Toaster.ShowError($"Moms Nummer ugyldigt");
return;
}
if (Working)
return;
VatEditDisabled = true;
Working = true;
Toaster.ShowInfo("Vent venligst ...", "OPDATERER MOMS NUMMER");
var result = await CustomerRepo.UpdateCompanyVat(CompanyId, Company.VatNumber);
@ -336,6 +358,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
Company = result;
StateHasChanged();
}
Toaster.ClearAll();
Working = false;
}
@ -359,6 +382,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
HouseNumber = Regex.Replace(model.Address1[pos1..], "[^0-9]", "").Trim()
};
}
// process address2
var pos2 = model.Address2.IndexOfAny(digits);
if (pos2 > 0)
@ -370,6 +394,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
HouseNumber = Regex.Replace(model.Address2[pos2..], "[^0-9]", "").Trim()
};
}
// return empty model
return new VatAddress();
}
@ -398,6 +423,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
ValidVat = true;
EnableActivity = 1;
}
StateHasChanged();
}

View file

@ -16,13 +16,12 @@
using Microsoft.AspNetCore.Components;
namespace Wonky.Client.Pages
namespace Wonky.Client.Pages;
public partial class ErrorReportPage
{
public partial class ErrorReportPage
{
[Parameter]
public int ErrorCode { get; set; }
[Parameter] public string ErrorDescription { get; set; } = "";
}
}

View file

@ -24,10 +24,10 @@ using Wonky.Entity.Requests;
using Wonky.Entity.Views;
#pragma warning disable CS8618
namespace Wonky.Client.Pages
namespace Wonky.Client.Pages;
public partial class OfficeCountryCustomerListPage : IDisposable
{
public partial class OfficeCountryCustomerListPage : IDisposable
{
[Parameter] public string CountryCode { get; set; } = "";
[Inject] public ILocalStorageService Storage { get; set; }
[Inject] public UserProfileService ProfileService { get; set; }
@ -140,7 +140,4 @@ namespace Wonky.Client.Pages
}
public void Dispose() => Interceptor.DisposeEvent();
}
}

View file

@ -24,10 +24,10 @@ using Wonky.Entity.Configuration;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
namespace Wonky.Client.Services
namespace Wonky.Client.Services;
public class AuthenticationService : IAuthenticationService
{
public class AuthenticationService : IAuthenticationService
{
private readonly JsonSerializerOptions _options = new() { PropertyNameCaseInsensitive = true };
private readonly HttpClient _client;
private readonly AuthenticationStateProvider _authStateProvider;
@ -141,6 +141,4 @@ namespace Wonky.Client.Services
await _infoService.SetUserInfo(userInfo);
return userInfo ?? new UserManagerEditView();
}
}
}

View file

@ -17,14 +17,12 @@
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
namespace Wonky.Client.Services
namespace Wonky.Client.Services;
public interface IAuthenticationService
{
public interface IAuthenticationService
{
Task<AuthResponseView> Login(CredentialDto credentials);
Task Logout();
Task<string> RefreshToken();
Task<UserManagerEditView> UserInfo(bool write = false);
}
}

View file

@ -22,10 +22,10 @@ using Wonky.Client.Services;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
namespace Wonky.Client.Shared
namespace Wonky.Client.Shared;
public class AuthStateProvider : AuthenticationStateProvider
{
public class AuthStateProvider : AuthenticationStateProvider
{
private readonly HttpClient _client;
// private readonly ILocalStorageService _storage;
private readonly AuthenticationState _anonymous;
@ -102,6 +102,4 @@ namespace Wonky.Client.Shared
var authState = Task.FromResult(_anonymous);
NotifyAuthenticationStateChanged(authState);
}
}
}

View file

@ -1,7 +1,7 @@
{
"appInfo": {
"name": "Wonky Online",
"version": "0.117.1",
"version": "0.118.0",
"rc": true,
"sandBox": false,
"image": "grumpy-coder.png"
@ -19,7 +19,7 @@
}
},
"apiConfig": {
"baseUrl": "https://dev.innotec.dk",
"baseUrl": "https://zeta.innotec.dk",
"catalog": "api/v2/catalog/country",
"crmCustomers": "api/v2/crm/companies",
"crmInventoryExt": "history/inventory",