wip
This commit is contained in:
parent
38b247f048
commit
a6c965ee24
5 changed files with 250 additions and 22 deletions
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
<EditForm EditContext="_editContext" OnValidSubmit="CreateActivity" class="card card-body bg-light mt-5">
|
<EditForm EditContext="_editContext" OnValidSubmit="CreateActivity" class="card card-body bg-light mt-5">
|
||||||
<DataAnnotationsValidator />
|
<DataAnnotationsValidator />
|
||||||
<div class="row mb-4">
|
<div class="row mb-1">
|
||||||
<label for="account" class="col-md-2 col-form-label">Konto</label>
|
<label for="account" class="col-md-2 col-form-label">Konto</label>
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
<InputText id="account" class="form-control" @bind-Value="_purchaseOrder.Account" readonly/>
|
<InputText id="account" class="form-control" @bind-Value="_purchaseOrder.Account" readonly/>
|
||||||
|
@ -35,16 +35,14 @@
|
||||||
<ValidationMessage For="@(() => _purchaseOrder.SalesRep)"></ValidationMessage>
|
<ValidationMessage For="@(() => _purchaseOrder.SalesRep)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr/>
|
<div class="row mb-1">
|
||||||
<div class="row mb-2">
|
|
||||||
<label for="vatNumber" class="col-md-2 col-form-label">CVR nummer</label>
|
<label for="vatNumber" class="col-md-2 col-form-label">CVR nummer</label>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<InputText id="vatNumber" class="form-control" @bind-Value="_purchaseOrder.VatNumber"/>
|
<InputText id="vatNumber" class="form-control" @bind-Value="_purchaseOrder.VatNumber"/>
|
||||||
<ValidationMessage For="@(() => _purchaseOrder.VatNumber)"></ValidationMessage>
|
<ValidationMessage For="@(() => _purchaseOrder.VatNumber)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row mb-1">
|
||||||
<div class="row mb-2">
|
|
||||||
<label for="referenceNumber" class="col-md-2 col-form-label">Rekvisition</label>
|
<label for="referenceNumber" class="col-md-2 col-form-label">Rekvisition</label>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<InputText id="referenceNumber" class="form-control" @bind-Value="_purchaseOrder.ReferenceNumber"v/>
|
<InputText id="referenceNumber" class="form-control" @bind-Value="_purchaseOrder.ReferenceNumber"v/>
|
||||||
|
@ -52,7 +50,7 @@
|
||||||
</div>
|
</div>
|
||||||
</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>
|
<label for="yourRef" class="col-md-2 col-form-label">Indkøber</label>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<InputText id="yourRef" class="form-control" @bind-Value="_purchaseOrder.YourRef"/>
|
<InputText id="yourRef" class="form-control" @bind-Value="_purchaseOrder.YourRef"/>
|
||||||
|
@ -60,7 +58,7 @@
|
||||||
</div>
|
</div>
|
||||||
</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>
|
<label for="orderMessage" class="col-md-2 col-form-label">Besked til kontoret</label>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<InputText id="orderMessage" class="form-control" @bind-Value="_purchaseOrder.OrderMessage"/>
|
<InputText id="orderMessage" class="form-control" @bind-Value="_purchaseOrder.OrderMessage"/>
|
||||||
|
@ -68,39 +66,39 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr/>
|
<hr/>
|
||||||
<div class="row mb-2">
|
<div class="row mb-1">
|
||||||
<label for="dlvName" class="col-md-2 col-form-label">Lev. Navn</label>
|
<label for="dlvName" class="col-md-2 col-form-label">Lev. Navn</label>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<InputText id="dlvName" class="form-control" @bind-Value="_purchaseOrder.DlvName"/>
|
<InputText id="dlvName" class="form-control" @bind-Value="_purchaseOrder.DlvName"/>
|
||||||
</div>
|
</div>
|
||||||
</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>
|
<label for="dlvAddress1" class="col-md-2 col-form-label">Lev. Adresse</label>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<InputText id="dlvAddress1" class="form-control" @bind-Value="_purchaseOrder.DlvAddress1"/>
|
<InputText id="dlvAddress1" class="form-control" @bind-Value="_purchaseOrder.DlvAddress1"/>
|
||||||
</div>
|
</div>
|
||||||
</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>
|
<label for="dlvAddress2" class="col-md-2 col-form-label">Lev. Adresse</label>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<InputText id="dlvAddress2" class="form-control" @bind-Value="_purchaseOrder.DlvAddress2"/>
|
<InputText id="dlvAddress2" class="form-control" @bind-Value="_purchaseOrder.DlvAddress2"/>
|
||||||
</div>
|
</div>
|
||||||
</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>
|
<label for="dlvZipCode" class="col-md-2 col-form-label">Lev. Postnr</label>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<InputText id="dlvZipCode" class="form-control" @bind-Value="_purchaseOrder.DlvZipCode"/>
|
<InputText id="dlvZipCode" class="form-control" @bind-Value="_purchaseOrder.DlvZipCode"/>
|
||||||
</div>
|
</div>
|
||||||
</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>
|
<label for="dlvCity" class="col-md-2 col-form-label">Lev. Bynavn</label>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
<InputText id="dlvCity" class="form-control" @bind-Value="_purchaseOrder.DlvCity"/>
|
<InputText id="dlvCity" class="form-control" @bind-Value="_purchaseOrder.DlvCity"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@* ---------------------------------------------- *@
|
||||||
|
@* Display action buttons *@
|
||||||
<div class="row mb-2">
|
<div class="row mb-2">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<a class="btn btn-primary" href="/company/@_company.CompanyId"></a>
|
<a class="btn btn-primary" href="/company/@_company.CompanyId"></a>
|
||||||
|
@ -112,3 +110,158 @@
|
||||||
</div>
|
</div>
|
||||||
</EditForm>
|
</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"> </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>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,8 @@ using Wonky.Client.HttpRepository;
|
||||||
using Wonky.Client.Models;
|
using Wonky.Client.Models;
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
using Microsoft.AspNetCore.Components.Forms;
|
using Microsoft.AspNetCore.Components.Forms;
|
||||||
|
using Wonky.Client.Services;
|
||||||
|
using Wonky.Client.Shared;
|
||||||
using Wonky.Entity.DTO;
|
using Wonky.Entity.DTO;
|
||||||
using Wonky.Entity.Requests;
|
using Wonky.Entity.Requests;
|
||||||
|
|
||||||
|
@ -31,22 +33,30 @@ namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class PurchaseOrderCreate : IDisposable
|
public partial class PurchaseOrderCreate : IDisposable
|
||||||
{
|
{
|
||||||
private List<SalesItemDto> SalesItemList { get; set; } = new();
|
|
||||||
private PurchaseOrder _purchaseOrder = new ();
|
private PurchaseOrder _purchaseOrder = new ();
|
||||||
private CompanyDto _company = new();
|
private CompanyDto _company = new();
|
||||||
private EditContext _editContext;
|
private EditContext _editContext;
|
||||||
private bool _poFormInvalid = true;
|
private bool _poFormInvalid = true;
|
||||||
private MetaData? MetaData { get; set; } = new();
|
private MetaData? MetaData { get; set; } = new();
|
||||||
private CatalogPagingParams _paging = 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 IToastService ToastService { get; set; }
|
||||||
[Inject] public NavigationManager NavigationManager { 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 ILocalStorageService StorageService { get; set; }
|
||||||
[Inject] public ISalesItemHttpRepository SalesItemRepo { get; set; }
|
[Inject] public ISalesItemHttpRepository SalesItemRepo { get; set; }
|
||||||
[Parameter] public string CompanyId { get; set; }
|
|
||||||
|
|
||||||
public List<CrmSalesLines> Lines { get; set; } = new();
|
public List<CrmSalesLines> Lines { get; set; } = new();
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
|
@ -54,6 +64,9 @@ public partial class PurchaseOrderCreate : IDisposable
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
|
|
||||||
|
_prefs = await UserPrefs.GetPreferences();
|
||||||
|
_paging.SearchColumn = _prefs.ItemSearch;
|
||||||
|
await GetSalesItems();
|
||||||
var ux = await StorageService.GetItemAsync<UserInfoDto>("_ux");
|
var ux = await StorageService.GetItemAsync<UserInfoDto>("_ux");
|
||||||
_company = await CompanyRepo.GetCompanyById(CompanyId);
|
_company = await CompanyRepo.GetCompanyById(CompanyId);
|
||||||
_editContext = new EditContext(_purchaseOrder);
|
_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()
|
private async Task CreateActivity()
|
||||||
{
|
{
|
||||||
await StorageService.SetItemAsync(CompanyId, _purchaseOrder);
|
await StorageService.SetItemAsync(CompanyId, _purchaseOrder);
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
min-width: 24px;
|
min-width: 24px;
|
||||||
min-height: 24px;
|
min-height: 24px;
|
||||||
}
|
}
|
||||||
.the-dead {
|
.tombstone {
|
||||||
background-color: black;
|
background-image: url(../gravestone.png);
|
||||||
}
|
}
|
||||||
.the-draw {
|
.the-draw {
|
||||||
background-color: purple;
|
background-color: purple;
|
||||||
|
|
BIN
Wonky.Client/wwwroot/gravestone.png
Normal file
BIN
Wonky.Client/wwwroot/gravestone.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.5 KiB |
BIN
Wonky.Client/wwwroot/headstone.png
Normal file
BIN
Wonky.Client/wwwroot/headstone.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.3 KiB |
Loading…
Reference in a new issue