wip - transfer draft to customer
This commit is contained in:
parent
734dd2768a
commit
bfb3b10019
16 changed files with 217 additions and 286 deletions
|
@ -15,7 +15,7 @@
|
||||||
//
|
//
|
||||||
*@
|
*@
|
||||||
<CascadingAuthenticationState>
|
<CascadingAuthenticationState>
|
||||||
<CartStateProvider>
|
<DraftStateProvider>
|
||||||
<Router AppAssembly="@typeof(App).Assembly">
|
<Router AppAssembly="@typeof(App).Assembly">
|
||||||
<Found Context="routeData">
|
<Found Context="routeData">
|
||||||
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
|
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
|
||||||
|
@ -31,6 +31,6 @@
|
||||||
</LayoutView>
|
</LayoutView>
|
||||||
</NotFound>
|
</NotFound>
|
||||||
</Router>
|
</Router>
|
||||||
</CartStateProvider>
|
</DraftStateProvider>
|
||||||
</CascadingAuthenticationState>
|
</CascadingAuthenticationState>
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
<div>
|
<div>
|
||||||
<img class="spinner px-3" src="loader.gif" alt="Afventer svar fra service ..."/>Afventer svar fra service ...
|
<img class="spinner px-3" src="loader.gif" alt="Afventer netværk svar ..."/>Afventer netværk svar ...
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -22,11 +22,11 @@ namespace Wonky.Client.Components;
|
||||||
public partial class CompanySearchColumn
|
public partial class CompanySearchColumn
|
||||||
{
|
{
|
||||||
[Parameter]
|
[Parameter]
|
||||||
public EventCallback<string> OnFilterChanged { get; set; }
|
public EventCallback<string> OnColumnChanged { get; set; }
|
||||||
|
|
||||||
private string SearchColumn { get; set; } = "name";
|
private string SearchColumn { get; set; } = "name";
|
||||||
private async Task ApplyFilter(ChangeEventArgs eventArgs)
|
private async Task ApplyFilter(ChangeEventArgs eventArgs)
|
||||||
{
|
{
|
||||||
await OnFilterChanged.InvokeAsync(SearchColumn);
|
await OnColumnChanged.InvokeAsync(SearchColumn);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -26,44 +26,9 @@
|
||||||
<div class="col-sm-4">@company.Name</div>
|
<div class="col-sm-4">@company.Name</div>
|
||||||
<div class="col-sm-2">@company.Account</div>
|
<div class="col-sm-2">@company.Account</div>
|
||||||
<div class="col-sm-4">@company.City</div>
|
<div class="col-sm-4">@company.City</div>
|
||||||
<div class="col-sm-1"><a class="btn btn-sm btn-primary mb-1" href="/company/account/@company.Account"><i class="oi oi-arrow-circle-right"></i></a></div>
|
<div class="col-sm-1"><a class="btn btn-sm btn-primary mb-1" href="/company/account/@company.Account">Vis</a></div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@*
|
|
||||||
<table class="table">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Status</th>
|
|
||||||
<th scope="col">Navn</th>
|
|
||||||
<th scope="col">Konto</th>
|
|
||||||
<th scope="col">Bynavn</th>
|
|
||||||
<th></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach (var company in Companies)
|
|
||||||
{
|
|
||||||
<tr>
|
|
||||||
<td class="align-middle">
|
|
||||||
<CvrStatus VatNumber="@company.VatNumber" />
|
|
||||||
</td>
|
|
||||||
<td class="align-middle">
|
|
||||||
@company.Name
|
|
||||||
</td>
|
|
||||||
<td class="align-middle">
|
|
||||||
@company.Account
|
|
||||||
</td>
|
|
||||||
<td class="align-middle">
|
|
||||||
@company.City
|
|
||||||
</td>
|
|
||||||
<td class="align-middle">
|
|
||||||
<a class="btn btn-primary mb-1" href="/company/@company.Account"><i class="oi oi-arrow-circle-right"></i></a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
*@
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,20 +25,21 @@ namespace Wonky.Client.Components
|
||||||
{
|
{
|
||||||
[Parameter] public List<CompanyDto> Companies { get; set; } = new();
|
[Parameter] public List<CompanyDto> Companies { get; set; } = new();
|
||||||
[Parameter] public EventCallback<string> OnDelete { get; set; }
|
[Parameter] public EventCallback<string> OnDelete { get; set; }
|
||||||
|
[Parameter] public EventCallback<string> OnSelect { get; set; }
|
||||||
|
|
||||||
private Confirmation _confirmation = new ();
|
private Confirmation _confirmation = new ();
|
||||||
private string _companyIdToDelete = string.Empty;
|
private string _companyId = string.Empty;
|
||||||
|
|
||||||
private void CallConfirmationModal(string companyId)
|
private void CallConfirmationModal(string companyId)
|
||||||
{
|
{
|
||||||
_companyIdToDelete = companyId;
|
_companyId = companyId;
|
||||||
_confirmation.Show();
|
_confirmation.Show();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DeleteProduct()
|
private async Task DeleteCompany()
|
||||||
{
|
{
|
||||||
_confirmation.Hide();
|
_confirmation.Hide();
|
||||||
await OnDelete.InvokeAsync(_companyIdToDelete);
|
await OnDelete.InvokeAsync(_companyId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<CompanySearchColumn OnFilterChanged="FilterChanged" />
|
<CompanySearchColumn OnColumnChanged="FilterChanged" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<SearchPhrase OnSearchPhraseChanged="SearchChanged"/>
|
<SearchPhrase OnSearchPhraseChanged="SearchChanged"/>
|
||||||
|
|
|
@ -22,27 +22,8 @@
|
||||||
@attribute [Authorize(Roles = "Adviser")]
|
@attribute [Authorize(Roles = "Adviser")]
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col">
|
|
||||||
<RegStateVatNumber VatNumber="@CompanyDto.VatNumber"/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
@CompanyDto.Name
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col">
|
|
||||||
<a class="btn btn-info" href="/company/account/@CompanyDto.Account/document">Tilbud</a>
|
|
||||||
<a class="btn btn-info" href="#">Ordre</a>
|
|
||||||
<a class="btn btn-info" href="#">Faktura</a>
|
|
||||||
<a class="btn btn-info" href="#">Produkter</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
<div class="card-header"><RegStateVatNumber VatNumber="@CompanyDto.VatNumber"/>@CompanyDto.Name</div>
|
||||||
<table class="table table-striped table-bordered">
|
<table class="table table-striped table-bordered">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -78,8 +59,8 @@
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td>@CompanyDto.Interval</td>
|
<td>@CompanyDto.Interval</td>
|
||||||
<td>@($"{CompanyDto.LastVisitDate:dd-MM-yyyy}")</td>
|
<td>@($"{CompanyDto.LastVisitDate:yy-MM-dd}")</td>
|
||||||
<td>@($"{CompanyDto.NextVisitDate:dd-MM-yyyy}")</td>
|
<td>@($"{CompanyDto.NextVisitDate:yy-MM-dd}")</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
152
Wonky.Client/Pages/DraftDocument.razor
Normal file
152
Wonky.Client/Pages/DraftDocument.razor
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
@using Wonky.Client.Components
|
||||||
|
@using System.Net.Http.Headers
|
||||||
|
@page "/OrdreKladde"
|
||||||
|
|
||||||
|
@* display product filter options *@
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col">
|
||||||
|
<ItemSearchColumn OnSearchColumnChanged="SearchColumnChanged"></ItemSearchColumn>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<SearchPhrase OnSearchPhraseChanged="SearchPhraseChanged"></SearchPhrase>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<ItemGroupFilter OnGroupFilterChanged="GroupFilterChanged"></ItemGroupFilter>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@if (SalesItems.Any())
|
||||||
|
{
|
||||||
|
// display filtered product list
|
||||||
|
<table class="table table-hover table-striped justify-content-center">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col" style="width: 50%;">Navn</th>
|
||||||
|
<th scope="col" style="width: 30%;" class="text-nowrap">Varenr</th>
|
||||||
|
<th scope="col" style="width: 20%">Stk / Pris</th>
|
||||||
|
<th scope="col"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach (var item in SalesItems)
|
||||||
|
{
|
||||||
|
<tr>
|
||||||
|
<td>@item.Name</td>
|
||||||
|
<td>@item.Sku</td>
|
||||||
|
<td><ul class="list-group">
|
||||||
|
@foreach (var rate in item.Rates)
|
||||||
|
{
|
||||||
|
<li class="list-group-item d-flex justify-content-between align-items-end">
|
||||||
|
<div class="text-sm-start px-2">@rate.Quantity</div>
|
||||||
|
<div class="text-sm-end">@rate.Rate</div>
|
||||||
|
</li>
|
||||||
|
}
|
||||||
|
</ul></td>
|
||||||
|
<td><button class="btn btn-primary" @onclick="@(() => SelectItem(item.ItemId))">Vælg</button></td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<AppSpinner/>
|
||||||
|
}
|
||||||
|
@* Display draft line *@
|
||||||
|
@if (_selectedItem != null && ShowItem)
|
||||||
|
{
|
||||||
|
<div class="card mb-3 mt-3">
|
||||||
|
<div class="card-header bg-info fw-bold text-white">Kladdelinje</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col col-md-4 fw-bold">
|
||||||
|
Varenavn
|
||||||
|
</div>
|
||||||
|
<div class="col fw-bold">
|
||||||
|
Varenr
|
||||||
|
</div>
|
||||||
|
<div class="col fw-bold">
|
||||||
|
Antal
|
||||||
|
</div>
|
||||||
|
<div class="col fw-bold">
|
||||||
|
Pris
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col col-md-4">
|
||||||
|
@_selectedItem.Name
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
@_selectedItem.Sku
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<input class="form-control" type="number" @bind-value="@Quantity"/>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<input class="form-control" type="number" @bind-value="@Price"/>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<button class="btn btn-info" @onclick="@(() => AddItem(_selectedItem))">Læg til</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
@* Display draft lines *@
|
||||||
|
@if (DraftStateProvider != null && DraftStateProvider.Draft.Items.Count > 0)
|
||||||
|
{
|
||||||
|
<div class="card mt-3 mb-3">
|
||||||
|
<div class="card-header bg-success text-white fw-bold">Ordrekladde <span class="draft-expires-msg">(udløber efter @(DraftStateProvider.Draft.TimeToLiveInSeconds)s inaktivitet)</span></div>
|
||||||
|
<div class="card-body">
|
||||||
|
<table class="table table-hover table-striped justify-content-center">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Navn</th>
|
||||||
|
<th scope="col" class="text-nowrap">Varenr</th>
|
||||||
|
<th scope="col" class="text-end">Antal</th>
|
||||||
|
<th scope="col" class="text-end">Enhedspris</th>
|
||||||
|
<th scope="col" class="text-end">Linjesum</th>
|
||||||
|
<th scope="col"> </th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach (var cItem in DraftStateProvider.Draft.Items)
|
||||||
|
{
|
||||||
|
<tr>
|
||||||
|
<td>@cItem.Item.Name</td>
|
||||||
|
<td>@cItem.Item.Sku</td>
|
||||||
|
<td class="text-end">@cItem.Quantity</td>
|
||||||
|
<td class="text-end">@cItem.Price</td>
|
||||||
|
<td class="text-end">@cItem.Total</td>
|
||||||
|
<td><button class="btn btn-warning" @onclick="@(() => RemoveItem(@cItem))">Slet</button></td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td class="text-black text-end fw-bold">Total</td>
|
||||||
|
<td class="text-black text-end fw-bold">@DraftStateProvider.Draft.Total</td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="card-footer">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<button class="btn btn-danger" @onclick="DeleteDraft">Slet kladde</button>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<a class="btn btn-success" href="/Companies">Overfør</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
|
@ -8,18 +8,21 @@ using Wonky.Entity.Requests;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class OrderDraft : IDisposable
|
public partial class DraftDocument : IDisposable
|
||||||
{
|
{
|
||||||
[CascadingParameter] CartStateProvider CartStateProvider { get; set; }
|
[CascadingParameter] DraftStateProvider DraftStateProvider { get; set; }
|
||||||
private bool ShowItem;
|
private bool ShowItem;
|
||||||
|
private bool ShowSearchView;
|
||||||
private string Quantity = "1";
|
private string Quantity = "1";
|
||||||
private string Price = "0";
|
private string Price = "0";
|
||||||
private SalesItemDto _selectedItem { get; set; } = new();
|
private SalesItemDto _selectedItem { get; set; } = new();
|
||||||
private List<SalesItemDto> SalesItems { get; set; } = new();
|
private List<SalesItemDto> SalesItems { get; set; } = new();
|
||||||
private SalesItemDto SelectedItem { get; set; } = new();
|
private List<CompanyDto> CompanyList { get; set; } = new();
|
||||||
|
// private SalesItemDto SelectedItem { get; set; } = new();
|
||||||
private MetaData _meta { get; set; } = new();
|
private MetaData _meta { get; set; } = new();
|
||||||
private PagingParams _paging { get; set; } = new();
|
private PagingParams _paging { get; set; } = new();
|
||||||
[Inject] private ISalesItemHttpRepository ItemRepo { get; set; }
|
[Inject] private ISalesItemHttpRepository ItemRepo { get; set; }
|
||||||
|
[Inject] private ICompanyHttpRepository CompanyRepo { get; set; }
|
||||||
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
[Inject] private HttpInterceptorService Interceptor { get; set; }
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
|
@ -34,8 +37,13 @@ public partial class OrderDraft : IDisposable
|
||||||
SalesItems = response.Items!;
|
SalesItems = response.Items!;
|
||||||
_meta = response.MetaData;
|
_meta = response.MetaData;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ItemSelect(string itemId)
|
private async Task DeleteDraft()
|
||||||
|
{
|
||||||
|
await DraftStateProvider.DeleteDraftAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SelectItem(string itemId)
|
||||||
{
|
{
|
||||||
ShowItem = true;
|
ShowItem = true;
|
||||||
_selectedItem = (from x in SalesItems where x.ItemId == itemId select x).First();
|
_selectedItem = (from x in SalesItems where x.ItemId == itemId select x).First();
|
||||||
|
@ -43,11 +51,11 @@ public partial class OrderDraft : IDisposable
|
||||||
Quantity = "1";
|
Quantity = "1";
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task AddToCart(SalesItemDto salesItem)
|
private async Task AddItem(SalesItemDto salesItem)
|
||||||
{
|
{
|
||||||
ShowItem = false;
|
ShowItem = false;
|
||||||
// create a new cart item
|
// create a new cart item
|
||||||
var item = new CartItem
|
var item = new DraftItem
|
||||||
{
|
{
|
||||||
Item = salesItem,
|
Item = salesItem,
|
||||||
Quantity = Convert.ToInt32(Quantity),
|
Quantity = Convert.ToInt32(Quantity),
|
||||||
|
@ -55,22 +63,18 @@ public partial class OrderDraft : IDisposable
|
||||||
};
|
};
|
||||||
|
|
||||||
// add it to the cart
|
// add it to the cart
|
||||||
CartStateProvider.ShoppingCart.Items.Add(item);
|
DraftStateProvider.Draft.Items.Add(item);
|
||||||
|
|
||||||
// reset variables
|
|
||||||
_selectedItem = new();
|
|
||||||
Quantity = "1";
|
|
||||||
Price = "0";
|
|
||||||
|
|
||||||
// save the item using the CartStateProvider's save method
|
// save the item using the CartStateProvider's save method
|
||||||
await CartStateProvider.SaveChangesAsync();
|
await DraftStateProvider.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
private async Task RemoveItem(CartItem item)
|
private async Task RemoveItem(DraftItem item)
|
||||||
{
|
{
|
||||||
// click on remove
|
// remove item
|
||||||
CartStateProvider.ShoppingCart.Items.Remove(item);
|
DraftStateProvider.Draft.Items.Remove(item);
|
||||||
// save the cart
|
|
||||||
await CartStateProvider.SaveChangesAsync();
|
// save the remaining draft
|
||||||
|
await DraftStateProvider.SaveChangesAsync();
|
||||||
}
|
}
|
||||||
private async Task GroupFilterChanged(string groupFilter)
|
private async Task GroupFilterChanged(string groupFilter)
|
||||||
{
|
{
|
|
@ -1,159 +0,0 @@
|
||||||
@using Wonky.Client.Components
|
|
||||||
@using System.ComponentModel.DataAnnotations
|
|
||||||
|
|
||||||
@page "/OrdreKladde"
|
|
||||||
<div class="row mb-3">
|
|
||||||
<div class="col">
|
|
||||||
<ItemSearchColumn OnSearchColumnChanged="SearchColumnChanged"></ItemSearchColumn>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<SearchPhrase OnSearchPhraseChanged="SearchPhraseChanged"></SearchPhrase>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<ItemGroupFilter OnGroupFilterChanged="GroupFilterChanged"></ItemGroupFilter>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@if (SalesItems.Any())
|
|
||||||
{
|
|
||||||
<table class="table table-hover table-striped justify-content-center">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col" style="width: 50%;">Navn</th>
|
|
||||||
<th scope="col" style="width: 30%;" class="text-nowrap">Varenr</th>
|
|
||||||
<th scope="col" style="width: 20%">Stk / Pris</th>
|
|
||||||
<th scope="col"></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach (var item in SalesItems)
|
|
||||||
{
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
@item.Name
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
@item.Sku
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<ul class="list-group">
|
|
||||||
@foreach (var rate in item.Rates)
|
|
||||||
{
|
|
||||||
<li class="list-group-item d-flex justify-content-between align-items-end">
|
|
||||||
<div class="text-sm-start px-2">@rate.Quantity</div>
|
|
||||||
<div class="text-sm-end">@rate.Rate</div>
|
|
||||||
</li>
|
|
||||||
}
|
|
||||||
</ul>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<button class="btn btn-primary" @onclick="@(() => ItemSelect(item.ItemId))">Vælg</button>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<AppSpinner/>
|
|
||||||
}
|
|
||||||
@if (_selectedItem != null && ShowItem)
|
|
||||||
{
|
|
||||||
<div class="card mb-3 mt-3">
|
|
||||||
<div class="card-header bg-info fw-bold text-white">Kladdelinje</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col col-md-4 fw-bold">
|
|
||||||
Varenavn
|
|
||||||
</div>
|
|
||||||
<div class="col fw-bold">
|
|
||||||
Varenr
|
|
||||||
</div>
|
|
||||||
<div class="col fw-bold">
|
|
||||||
Antal
|
|
||||||
</div>
|
|
||||||
<div class="col fw-bold">
|
|
||||||
Pris
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col col-md-4">
|
|
||||||
@_selectedItem.Name
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
@_selectedItem.Sku
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<input class="form-control" type="number" @bind-value="@Quantity"/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<input class="form-control" type="number" @bind-value="@Price"/>
|
|
||||||
</div>
|
|
||||||
<div class="col">
|
|
||||||
<button class="btn btn-info" @onclick="@(() => AddToCart(_selectedItem))">Læg til</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
|
|
||||||
@* Show the cart contents if there are items in it. *@
|
|
||||||
@if (CartStateProvider != null && CartStateProvider.ShoppingCart.Items.Count > 0)
|
|
||||||
{
|
|
||||||
<div class="card mt-3 mb-3">
|
|
||||||
<div class="card-header bg-success text-white fw-bold">Ordrekladde</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<table class="table table-hover table-striped justify-content-center">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">Navn</th>
|
|
||||||
<th scope="col" class="text-nowrap">Varenr</th>
|
|
||||||
<th scope="col" class="text-end">Antal</th>
|
|
||||||
<th scope="col" class="text-end">Enhedspris</th>
|
|
||||||
<th scope="col" class="text-end">Linjesum</th>
|
|
||||||
<th scope="col"> </th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
@foreach (var cItem in CartStateProvider.ShoppingCart.Items)
|
|
||||||
{
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
@cItem.Item.Name
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
@cItem.Item.Sku
|
|
||||||
</td>
|
|
||||||
<td class="text-end">
|
|
||||||
@cItem.Quantity
|
|
||||||
</td>
|
|
||||||
<td class="text-end">
|
|
||||||
@cItem.Price
|
|
||||||
</td>
|
|
||||||
<td class="text-end">
|
|
||||||
@cItem.Total
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<button class="btn btn-warning" @onclick="@(() => RemoveItem(@cItem))">Slet</button>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
}
|
|
||||||
<tr>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td></td>
|
|
||||||
<td class="text-black text-end fw-bold">Total</td>
|
|
||||||
<td class="text-black text-end fw-bold">@CartStateProvider.ShoppingCart.Total</td>
|
|
||||||
<td></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
|
@ -21,10 +21,10 @@ using Wonky.Entity.Models;
|
||||||
|
|
||||||
namespace Wonky.Client.Shared;
|
namespace Wonky.Client.Shared;
|
||||||
|
|
||||||
public partial class CartStateProvider
|
public partial class DraftStateProvider
|
||||||
{
|
{
|
||||||
[Parameter] public RenderFragment ChildContent { get; set; }
|
[Parameter] public RenderFragment ChildContent { get; set; }
|
||||||
public Cart ShoppingCart { get; set; }
|
public Draft Draft { get; set; }
|
||||||
[Parameter] public string Account { get; set; } = "MyCart";
|
[Parameter] public string Account { get; set; } = "MyCart";
|
||||||
[Inject] public ILocalStorageService LocalStorageService { get; set; }
|
[Inject] public ILocalStorageService LocalStorageService { get; set; }
|
||||||
|
|
||||||
|
@ -32,26 +32,30 @@ public partial class CartStateProvider
|
||||||
|
|
||||||
protected override async Task OnParametersSetAsync()
|
protected override async Task OnParametersSetAsync()
|
||||||
{
|
{
|
||||||
ShoppingCart = await LocalStorageService.GetItemAsync<Cart>(Account);
|
Draft = await LocalStorageService.GetItemAsync<Draft>(Account);
|
||||||
|
|
||||||
if (ShoppingCart == null || ShoppingCart.Items.Count == 0)
|
if (Draft == null || Draft.Items.Count == 0)
|
||||||
{
|
{
|
||||||
ShoppingCart = new Cart();
|
Draft = new Draft();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (DateTime.Now > ShoppingCart.LastAccessed.AddSeconds(ShoppingCart.TimeToLiveInSeconds))
|
if (DateTime.Now > Draft.LastAccessed.AddSeconds(Draft.TimeToLiveInSeconds))
|
||||||
{
|
{
|
||||||
ShoppingCart = new Cart();
|
Draft = new Draft();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Draft.LastAccessed = DateTime.Now;
|
||||||
ShoppingCart.LastAccessed = DateTime.Now;
|
|
||||||
_hasLoaded = true;
|
_hasLoaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task SaveChangesAsync()
|
public async Task SaveChangesAsync()
|
||||||
{
|
{
|
||||||
await LocalStorageService.SetItemAsync(Account, ShoppingCart);
|
await LocalStorageService.SetItemAsync(Account, Draft);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteDraftAsync()
|
||||||
|
{
|
||||||
|
await LocalStorageService.RemoveItemAsync(Account);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,21 +0,0 @@
|
||||||
{
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Debug",
|
|
||||||
"System": "Debug",
|
|
||||||
"Microsoft": "Information"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"apiConfig": {
|
|
||||||
"baseAddress": "https://api.innotec.dk",
|
|
||||||
"tokenPath": "token",
|
|
||||||
"userInfo": "api/auth/userinfo",
|
|
||||||
"crmCompanies": "api/v2/crm/companies",
|
|
||||||
"priceCatalog": "api/v2/crm/catalog",
|
|
||||||
"cvrLookup": "/api/v2/services/virk",
|
|
||||||
"krvProducts": "api/v2/admin/q/products",
|
|
||||||
"krvVariants": "api/v2/admin/q/variants",
|
|
||||||
"imageUpload": "api/v2/admin/upload2",
|
|
||||||
"userRegistration": "api/auth/register"
|
|
||||||
}
|
|
||||||
}
|
|
1
Wonky.Client/wwwroot/appsettings.json
Symbolic link
1
Wonky.Client/wwwroot/appsettings.json
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../../appsettings.json
|
|
@ -1,7 +1,10 @@
|
||||||
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
|
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
|
||||||
|
|
||||||
|
.draft-expires-msg {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
.spinner {
|
.spinner {
|
||||||
height: 32px;
|
height: 48px;
|
||||||
}
|
}
|
||||||
|
|
||||||
html, body {
|
html, body {
|
||||||
|
|
|
@ -25,9 +25,9 @@ public class CompanyDto
|
||||||
[Required(ErrorMessage = "Postnummer skal udfyldes")] public string ZipCode { get; set; } = "";
|
[Required(ErrorMessage = "Postnummer skal udfyldes")] public string ZipCode { get; set; } = "";
|
||||||
[Required(ErrorMessage = "Bynavn skal udfyldes")] public string City { get; set; } = "";
|
[Required(ErrorMessage = "Bynavn skal udfyldes")] public string City { get; set; } = "";
|
||||||
[Required(ErrorMessage = "CVR nummer skal udfyldes")] public string VatNumber { get; set; } = "";
|
[Required(ErrorMessage = "CVR nummer skal udfyldes")] public string VatNumber { get; set; } = "";
|
||||||
|
|
||||||
public string CompanyId { get; set; } = "";
|
public string CompanyId { get; set; } = "";
|
||||||
public string SalesRepId { get; set; } = "";
|
public string SalesRepId { get; set; } = "";
|
||||||
|
public string BcId { get; set; } = "";
|
||||||
public string Address1 { get; set; } = "";
|
public string Address1 { get; set; } = "";
|
||||||
public string Address2 { get; set; } = "";
|
public string Address2 { get; set; } = "";
|
||||||
public string Account { get; set; } = "";
|
public string Account { get; set; } = "";
|
||||||
|
@ -35,7 +35,7 @@ public class CompanyDto
|
||||||
public string Mobile { get; set; } = "";
|
public string Mobile { get; set; } = "";
|
||||||
public string Email { get; set; } = "";
|
public string Email { get; set; } = "";
|
||||||
public string Attention { get; set; } = "";
|
public string Attention { get; set; } = "";
|
||||||
[JsonPropertyName("LastVisitTimestamp")] public DateTime LastVisitDate { get; set; }
|
public string LastVisitDate { get; set; } = "";
|
||||||
[JsonPropertyName("NextVisitTimestamp")] public DateTime NextVisitDate { get; set; }
|
public string NextVisitDate { get; set; } = "";
|
||||||
public int Interval { get; set; } = 12;
|
public int Interval { get; set; } = 12;
|
||||||
}
|
}
|
|
@ -2,7 +2,7 @@ using Wonky.Entity.DTO;
|
||||||
|
|
||||||
namespace Wonky.Entity.Models;
|
namespace Wonky.Entity.Models;
|
||||||
|
|
||||||
public class CartItem
|
public class DraftItem
|
||||||
{
|
{
|
||||||
public int Quantity { get; set; }
|
public int Quantity { get; set; }
|
||||||
public SalesItemDto Item { get; set; }
|
public SalesItemDto Item { get; set; }
|
||||||
|
@ -21,9 +21,9 @@ public class CartItem
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class Cart
|
public class Draft
|
||||||
{
|
{
|
||||||
public List<CartItem> Items { get; set; } = new List<CartItem>();
|
public List<DraftItem> Items { get; set; } = new List<DraftItem>();
|
||||||
|
|
||||||
public decimal Total
|
public decimal Total
|
||||||
{
|
{
|
||||||
|
@ -33,5 +33,5 @@ public class Cart
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public DateTime LastAccessed { get; set; }
|
public DateTime LastAccessed { get; set; }
|
||||||
public int TimeToLiveInSeconds { get; set; } = 60; // default
|
public int TimeToLiveInSeconds { get; set; } = 300; // default
|
||||||
}
|
}
|
Loading…
Reference in a new issue