This commit is contained in:
Frede Hundewadt 2022-04-08 12:46:40 +02:00
parent 38b247f048
commit a6c965ee24
5 changed files with 250 additions and 22 deletions

View file

@ -23,7 +23,7 @@
<EditForm EditContext="_editContext" OnValidSubmit="CreateActivity" class="card card-body bg-light mt-5">
<DataAnnotationsValidator />
<div class="row mb-4">
<div class="row mb-1">
<label for="account" class="col-md-2 col-form-label">Konto</label>
<div class="col-md-4">
<InputText id="account" class="form-control" @bind-Value="_purchaseOrder.Account" readonly/>
@ -35,16 +35,14 @@
<ValidationMessage For="@(() => _purchaseOrder.SalesRep)"></ValidationMessage>
</div>
</div>
<hr/>
<div class="row mb-2">
<div class="row mb-1">
<label for="vatNumber" class="col-md-2 col-form-label">CVR nummer</label>
<div class="col-md-10">
<InputText id="vatNumber" class="form-control" @bind-Value="_purchaseOrder.VatNumber"/>
<ValidationMessage For="@(() => _purchaseOrder.VatNumber)"></ValidationMessage>
</div>
</div>
<div class="row mb-2">
<div class="row mb-1">
<label for="referenceNumber" class="col-md-2 col-form-label">Rekvisition</label>
<div class="col-md-10">
<InputText id="referenceNumber" class="form-control" @bind-Value="_purchaseOrder.ReferenceNumber"v/>
@ -52,7 +50,7 @@
</div>
</div>
<div class="row mb-2">
<div class="row mb-1">
<label for="yourRef" class="col-md-2 col-form-label">Indkøber</label>
<div class="col-md-10">
<InputText id="yourRef" class="form-control" @bind-Value="_purchaseOrder.YourRef"/>
@ -60,7 +58,7 @@
</div>
</div>
<div class="row mb-2">
<div class="row mb-1">
<label for="orderMessage" class="col-md-2 col-form-label">Besked til kontoret</label>
<div class="col-md-10">
<InputText id="orderMessage" class="form-control" @bind-Value="_purchaseOrder.OrderMessage"/>
@ -68,39 +66,39 @@
</div>
</div>
<hr/>
<div class="row mb-2">
<div class="row mb-1">
<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="_purchaseOrder.DlvName"/>
</div>
</div>
<div class="row mb-2">
<div class="row mb-1">
<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="_purchaseOrder.DlvAddress1"/>
</div>
</div>
<div class="row mb-2">
<div class="row mb-1">
<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="_purchaseOrder.DlvAddress2"/>
</div>
</div>
<div class="row mb-2">
<div class="row mb-1">
<label for="dlvZipCode" class="col-md-2 col-form-label">Lev. Postnr</label>
<div class="col-md-10">
<InputText id="dlvZipCode" class="form-control" @bind-Value="_purchaseOrder.DlvZipCode"/>
</div>
</div>
<div class="row mb-2">
<div class="row mb-1">
<label for="dlvCity" class="col-md-2 col-form-label">Lev. Bynavn</label>
<div class="col-md-10">
<InputText id="dlvCity" class="form-control" @bind-Value="_purchaseOrder.DlvCity"/>
</div>
</div>
@* ---------------------------------------------- *@
@* Display action buttons *@
<div class="row mb-2">
<div class="col">
<a class="btn btn-primary" href="/company/@_company.CompanyId"></a>
@ -112,3 +110,158 @@
</div>
</EditForm>
@* ---------------------------------------------- *@
@* display product filter options *@
<div class="row mb-3">
<div class="col">
<ItemGroupDropdown OnChanged="SetItemGroup" />
</div>
<div class="col">
<ItemSearchDropdown OnChanged="SetSearchCol" />
</div>
<div class="col">
<SearchPhrase OnChanged="SetSortCol" />
</div>
<div class="col">
</div>
</div>
@* ---------------------------------------------- *@
@* display catolog *@
@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 content *@
@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">(Kladde udløber efter @(DraftStateProvider.Draft.TimeToLiveInSeconds / 60)m)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">&nbsp;</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>
}

View file

@ -24,6 +24,8 @@ using Wonky.Client.HttpRepository;
using Wonky.Client.Models;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Forms;
using Wonky.Client.Services;
using Wonky.Client.Shared;
using Wonky.Entity.DTO;
using Wonky.Entity.Requests;
@ -31,22 +33,30 @@ namespace Wonky.Client.Pages;
public partial class PurchaseOrderCreate : IDisposable
{
private List<SalesItemDto> SalesItemList { get; set; } = new();
private PurchaseOrder _purchaseOrder = new ();
private CompanyDto _company = new();
private EditContext _editContext;
private bool _poFormInvalid = true;
private MetaData? MetaData { get; set; } = new();
private CatalogPagingParams _paging = new();
private bool ShowItem;
private bool ShowSearchView;
private string Quantity = "1";
private string Price = "0";
private SalesItemDto _selectedItem { get; set; } = new();
private List<SalesItemDto> SalesItems { get; set; } = new();
private MetaData _meta { get; set; } = new();
private Preferences _prefs { get; set; } = new();
[Parameter] public string CompanyId { get; set; }
[CascadingParameter] DraftStateProvider DraftStateProvider { get; set; }
[Inject] private ISalesItemHttpRepository ItemRepo { get; set; }
[Inject] private ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] private HttpInterceptorService Interceptor { get; set; }
[Inject] private UserPreferenceService UserPrefs { get; set; }
[Inject] public IToastService ToastService { get; set; }
[Inject] public NavigationManager NavigationManager { get; set; }
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public ILocalStorageService StorageService { get; set; }
[Inject] public ISalesItemHttpRepository SalesItemRepo { get; set; }
[Parameter] public string CompanyId { get; set; }
public List<CrmSalesLines> Lines { get; set; } = new();
protected override async Task OnInitializedAsync()
@ -54,6 +64,9 @@ public partial class PurchaseOrderCreate : IDisposable
Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent();
_prefs = await UserPrefs.GetPreferences();
_paging.SearchColumn = _prefs.ItemSearch;
await GetSalesItems();
var ux = await StorageService.GetItemAsync<UserInfoDto>("_ux");
_company = await CompanyRepo.GetCompanyById(CompanyId);
_editContext = new EditContext(_purchaseOrder);
@ -84,7 +97,69 @@ public partial class PurchaseOrderCreate : IDisposable
}
private async Task DeleteDraft()
{
await DraftStateProvider.DeleteDraftAsync();
}
private void SelectItem(string itemId)
{
ShowItem = true;
_selectedItem = (from x in SalesItems where x.ItemId == itemId select x).First();
Price = _selectedItem.Rates[0].Rate;
Quantity = "1";
}
private async Task AddItem(SalesItemDto salesItem)
{
ShowItem = false;
// create a new cart item
var item = new DraftItem
{
Item = salesItem,
Quantity = Convert.ToInt32(Quantity),
Price = Convert.ToDecimal(Price)
};
// add it to the cart
DraftStateProvider.Draft.Items.Add(item);
// save the item using the CartStateProvider's save method
await DraftStateProvider.SaveChangesAsync();
}
private async Task RemoveItem(DraftItem item)
{
// remove item
DraftStateProvider.Draft.Items.Remove(item);
// save the remaining draft
await DraftStateProvider.SaveChangesAsync();
}
private async Task SetItemGroup(string groupFilter)
{
_paging.PageNumber = 1;
_paging.SelectGroup = groupFilter;
await GetSalesItems();
}
private async Task SetSearchCol(string columnName)
{
_paging.PageNumber = 1;
_paging.SearchTerm = "";
_paging.SearchColumn = columnName;
await GetSalesItems();
}
private async Task SetSortCol(string searchTerm)
{
_paging.PageNumber = 1;
_paging.SearchTerm = searchTerm;
await GetSalesItems();
}
private async Task GetSalesItems()
{
_paging.PageSize = 5;
var response = await ItemRepo.GetSalesItemsPaged(_paging);
SalesItems = response.Items!;
_meta = response.MetaData;
}
private async Task CreateActivity()
{
await StorageService.SetItemAsync(CompanyId, _purchaseOrder);

View file

@ -14,8 +14,8 @@
min-width: 24px;
min-height: 24px;
}
.the-dead {
background-color: black;
.tombstone {
background-image: url(../gravestone.png);
}
.the-draw {
background-color: purple;

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB