order of appearance list page top

This commit is contained in:
Frede Hundewadt 2022-03-22 07:20:44 +01:00
parent b193209bc3
commit eaf380bec3
21 changed files with 114 additions and 158 deletions

View file

@ -2,7 +2,7 @@ namespace Wonky.Client;
public class AppId public class AppId
{ {
public string Version { get; set; } = "0.2.7"; public string Version { get; set; } = "0.2.9";
public string Name { get; set; } = "Wonky Online"; public string Name { get; set; } = "Wonky Online";
public bool IsBeta { get; set; } = false; public bool IsBeta { get; set; } = false;

View file

@ -14,6 +14,7 @@
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html] // along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
// //
*@ *@
<select class="form-select" @bind-value="@Selection" @bind-value:event="oninput" @onchange="OnSelectionChanged"> <select class="form-select" @bind-value="@Selection" @bind-value:event="oninput" @onchange="OnSelectionChanged">
<option value="-1">SØGNING</option> <option value="-1">SØGNING</option>
<option value="name">Firmanavn</option> <option value="name">Firmanavn</option>
@ -21,4 +22,4 @@
<option value="zipCode">Postnummer</option> <option value="zipCode">Postnummer</option>
<option value="account">Konto</option> <option value="account">Konto</option>
<option value="phone">Telefon</option> <option value="phone">Telefon</option>
</select> </select>

View file

@ -39,7 +39,9 @@ public partial class CompanySearchDropdown : IDisposable
private async Task OnSelectionChanged(ChangeEventArgs e) private async Task OnSelectionChanged(ChangeEventArgs e)
{ {
var val = e.Value.ToString(); var val = e.Value.ToString();
if (val == "-1") return; if (val == "-1")
{
val = "name"; };
await OnChanged.InvokeAsync(val); await OnChanged.InvokeAsync(val);
await UserPreferenceService.SetCompanySearch(val); await UserPreferenceService.SetCompanySearch(val);
} }

View file

@ -38,7 +38,7 @@ namespace Wonky.Client.Components
private async Task OnSelectionChanged(ChangeEventArgs e) private async Task OnSelectionChanged(ChangeEventArgs e)
{ {
var val = e.Value.ToString(); var val = e.Value.ToString();
if (val == "-1") return; if (val == "-1") {val = "name";};
await OnChanged.InvokeAsync(val); await OnChanged.InvokeAsync(val);
await UserPreferenceService.SetCompanySort(val); await UserPreferenceService.SetCompanySort(val);
} }

View file

@ -18,20 +18,22 @@
@using Wonky.Client.Components; @using Wonky.Client.Components;
@if (Companies.Any()) @if (Companies.Any())
{ {
<CompanyListHeader /> <table class="table">
@foreach (var company in Companies) <tbody>
{ @foreach (var company in Companies)
<div class="row p-2 mb-1 border-bottom"> {
<div class="state rounded-circle @(VisitState(company.LastVisit))"></div> <tr>
<div class="col-sm-4">@company.Name</div> <td><DisplayStateComponent StateClass="@(VisitState(company.LastVisit))"></DisplayStateComponent></td>
<div class="col-sm-2">@company.Account</div> <td>@company.Name</td>
<div class="col-sm-4">@company.City</div> <td>@company.Account</td>
<div class="col-sm-1"><a class="btn btn-sm btn-primary mb-1" href="/company/account/@company.Account">Vis</a></div> <td>@company.City</td>
</div> <td><a class="btn btn-primary mb-1" href="/company/account/@company.Account">Vis</a></td>
} </tr>
}
</tbody>
</table>
} }
else else
{ {
<AppSpinner/> <AppSpinner/>
} }

View file

@ -15,11 +15,7 @@
// //
*@ *@
@if (string.IsNullOrEmpty(VatNumber)) <img class="img-fluid float-start state rounded-circle @StateClass" src="state.png" alt="state"/>
{ @code{
<span class="state the-bad rounded-circle mx-3"></span> [Parameter] public string StateClass { get; set; } = "the-ugly";
}
else
{
<span class="state rounded-circle mx-3 @(CurrentRegState == "NORMAL" ? "the-good" : "the-ugly" )"></span>
} }

View file

@ -31,7 +31,7 @@ public partial class ItemGroupDropdown
private async Task OnSelectionChanged(ChangeEventArgs e) private async Task OnSelectionChanged(ChangeEventArgs e)
{ {
var val = e.Value.ToString(); var val = e.Value.ToString();
if (val == "-1") return; if (val == "-1") {val = "0";};
await OnChanged.InvokeAsync(val); await OnChanged.InvokeAsync(val);
} }
} }

View file

@ -36,7 +36,7 @@ public partial class ItemSearchDropdown : IDisposable
private async Task OnSelectChanged(ChangeEventArgs e) private async Task OnSelectChanged(ChangeEventArgs e)
{ {
var val = e.Value.ToString(); var val = e.Value.ToString();
if (val == "-1") return; if (val == "-1") {val = "name";};
await OnChanged.InvokeAsync(val); await OnChanged.InvokeAsync(val);
await UserPreferenceService.SetItemSearch(val); await UserPreferenceService.SetItemSearch(val);
} }

View file

@ -36,7 +36,7 @@ public partial class ItemSortDropdown : IDisposable
private async Task OnSelectChanged(ChangeEventArgs e) private async Task OnSelectChanged(ChangeEventArgs e)
{ {
var val = e.Value.ToString(); var val = e.Value.ToString();
if (val == "-1") return; if (val == "-1") {val = "name";};
await OnChanged.InvokeAsync(val); await OnChanged.InvokeAsync(val);
await UserPreferenceService.SetItemSort(val); await UserPreferenceService.SetItemSort(val);
} }

View file

@ -16,7 +16,7 @@
*@ *@
<select class="form-select" @bind-value="@Selection" @bind-value:event="oninput" @onchange="OnSelectChanged"> <select class="form-select" @bind-value="@Selection" @bind-value:event="oninput" @onchange="OnSelectChanged">
<option value="-1" selected>ANTAL SVAR</option> <option value="-1" selected>RESULTATER</option>
<option value="5">5</option> <option value="5">5</option>
<option value="10">10</option> <option value="10">10</option>
<option value="15">15</option> <option value="15">15</option>

View file

@ -38,6 +38,7 @@ namespace Wonky.Client.Components
private async Task OnSelectChanged(ChangeEventArgs e) private async Task OnSelectChanged(ChangeEventArgs e)
{ {
var val = e.Value.ToString(); var val = e.Value.ToString();
if (val == "-1") {val = "10";};
await OnChanged.InvokeAsync(val); await OnChanged.InvokeAsync(val);
await UserPreferenceService.SetPageSize(val); await UserPreferenceService.SetPageSize(val);
} }

View file

@ -15,7 +15,7 @@
// //
*@ *@
<nav arial-label="Pager"> <div arial-label="Pager">
<ul class="pagination justify-content-center"> <ul class="pagination justify-content-center">
@foreach (var link in _links) @foreach (var link in _links)
{ {
@ -26,4 +26,4 @@
</li> </li>
} }
</ul> </ul>
</nav> </div>

View file

@ -1,44 +0,0 @@
// 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 Affero GNU General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// Affero GNU General Public License for more details.
//
// You should have received a copy of the Affero GNU General Public License
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
//
using Microsoft.AspNetCore.Components;
using Wonky.Client.Services;
using Wonky.Entity.Models;
using Wonky.Entity.Requests;
namespace Wonky.Client.Components;
public partial class RegStateVatNumber
{
[Inject] public VirkRegistryService VirkRegistryService { get; set; }
[Parameter] public string VatNumber { get; set; } = "";
private VirkRegInfo VirkRegInfo { get; set; } = new();
private readonly VirkParams _VirkParams = new();
private string CurrentRegState = "UKENDT";
protected override async Task OnParametersSetAsync()
{
if (!string.IsNullOrEmpty(VatNumber))
{
_VirkParams.VatNumber = VatNumber;
var result = await VirkRegistryService.QueryVirkRegistry(_VirkParams);
VirkRegInfo = result.Any() ? result[0] : new VirkRegInfo();
if (VirkRegInfo.States.Any())
CurrentRegState = VirkRegInfo.States[^1].State;
}
}
}

View file

@ -21,36 +21,29 @@
@attribute [Authorize(Roles = "Adviser")] @attribute [Authorize(Roles = "Adviser")]
<div class="row mb-3"> <div class="container">
<div class="col"> <div class="row mb-3">
<div> <div class="col">
<CompanySortDropdown OnChanged="SetSortCol"/>
</div>
</div>
<div class="col">
<div>
<CompanySearchDropdown OnChanged="SetSearchCol"/> <CompanySearchDropdown OnChanged="SetSearchCol"/>
</div> </div>
</div> <div class="col">
<div class="col">
<div>
<SearchPhrase OnChanged="SetSearchPhrase"/> <SearchPhrase OnChanged="SetSearchPhrase"/>
</div> </div>
</div> <div class="col">
<div class="col"> <CompanySortDropdown OnChanged="SetSortCol"/>
<a class="btn btn-success mb-1" href="/company/create">Nyt firma</a> </div>
<div class="col-md-2">
<PageSizeDropdown OnChanged="SetPageSize"></PageSizeDropdown>
</div>
<div class="col">
<a class="btn btn-success mb-1" href="/company/create">Nyt firma</a>
</div>
</div> </div>
</div> </div>
<div class="row"> <div class="row mb-3">
<div class="col-md-8"> <div class="col">
<Pagination MetaData="MetaData" Spread="2" SelectedPage="SelectedPage"></Pagination> <Pagination MetaData="MetaData" Spread="2" SelectedPage="SelectedPage"></Pagination>
</div> </div>
<div class="col-md-2">
<PageSizeDropdown OnChanged="SetPageSize"></PageSizeDropdown>
</div>
</div> </div>
<div class="row">
<div class="col"> <CompanyTable Companies="Companies" OnDelete="DeleteCompany"></CompanyTable>
<CompanyTable Companies="Companies" OnDelete="DeleteCompany"></CompanyTable>
</div>
</div>

View file

@ -25,7 +25,11 @@
{ {
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header">
<RegStateVatNumber VatNumber="@_companyDto.VatNumber"></RegStateVatNumber> <div>CVR status <DisplayVatStateComponent StateClass="@RegState"></DisplayVatStateComponent></div>
<div>Konto @_companyDto.Account</div>
<div>CompanyId @_companyDto.CompanyId</div>
<div>EDIT Næste besøg @NextVisit</div> <div>EDIT Sidst besøgt @LastVisit</div>
<div>DB Næste besøg @_companyDto.NextVisit</div> <div>DB Sidst besøgt @_companyDto.LastVisit</div>
</div> </div>
<div class="card-body"> <div class="card-body">
<EditForm EditContext="_editContext" OnValidSubmit="Update"> <EditForm EditContext="_editContext" OnValidSubmit="Update">
@ -34,7 +38,6 @@
<label for="name" class="col-md-2 col-form-label">Firmanavn</label> <label for="name" class="col-md-2 col-form-label">Firmanavn</label>
<div class="col-md-10"> <div class="col-md-10">
<InputText id="name" class="form-control" @bind-Value="_companyDto.Name"/> <InputText id="name" class="form-control" @bind-Value="_companyDto.Name"/>
<ValidationMessage For="@(() => _companyDto.Name)"/>
</div> </div>
</div> </div>
<div class="form-group row mb-2"> <div class="form-group row mb-2">
@ -53,21 +56,18 @@
<label for="zipCode" class="col-md-2 col-form-label">Postnr</label> <label for="zipCode" class="col-md-2 col-form-label">Postnr</label>
<div class="col-md-10"> <div class="col-md-10">
<InputText id="zipCode" class="form-control" @bind-Value="_companyDto.ZipCode"/> <InputText id="zipCode" class="form-control" @bind-Value="_companyDto.ZipCode"/>
<ValidationMessage For="@(() => _companyDto.ZipCode)"/>
</div> </div>
</div> </div>
<div class="form-group row mb-2"> <div class="form-group row mb-2">
<label for="city" class="col-md-2 col-form-label">Bynavn</label> <label for="city" class="col-md-2 col-form-label">Bynavn</label>
<div class="col-md-10"> <div class="col-md-10">
<InputText id="city" class="form-control" @bind-Value="_companyDto.City"/> <InputText id="city" class="form-control" @bind-Value="_companyDto.City"/>
<ValidationMessage For="@(() => _companyDto.City)"></ValidationMessage>
</div> </div>
</div> </div>
<div class="form-group row mb-2"> <div class="form-group row mb-2">
<label for="vatNumber" class="col-md-2 col-form-label">CVR/ORG</label> <label for="vatNumber" class="col-md-2 col-form-label">CVR/ORG</label>
<div class="col-md-10"> <div class="col-md-10">
<InputText id="vatNumber" class="form-control" @bind-Value="_companyDto.VatNumber"/> <InputText id="vatNumber" class="form-control" @bind-Value="_companyDto.VatNumber"/>
<ValidationMessage For="@(() => _companyDto.VatNumber)"/>
</div> </div>
</div> </div>
<div class="form-group row mb-2"> <div class="form-group row mb-2">
@ -103,7 +103,7 @@
<div class="form-group row mb-2"> <div class="form-group row mb-2">
<label for="nextVisit" class="col-form-label col-md-2">Næste besøg</label> <label for="nextVisit" class="col-form-label col-md-2">Næste besøg</label>
<div class="col-md-3"> <div class="col-md-3">
<InputDate id="nextVisit" class="form-control" @bind-Value="@(NextVisit)"/> <InputDate id="nextVisit" class="form-control" @bind-Value="@(NextVisit)"/>
</div> </div>
</div> </div>
<div class="form-group row mb-2"> <div class="form-group row mb-2">
@ -114,7 +114,7 @@
</div> </div>
<div class="row mb-2"> <div class="row mb-2">
<div class="col-md-12 text-right"> <div class="col-md-12 text-right">
<button type="submit" class="btn btn-success" disabled="@_formInvalid">GEM</button> <button type="submit" class="btn btn-success" >GEM</button>
</div> </div>
</div> </div>
</EditForm> </EditForm>

View file

@ -37,21 +37,22 @@ public partial class CompanyUpdate : IDisposable
[Parameter] public string Account { get; set; } = null!; [Parameter] public string Account { get; set; } = null!;
private CompanyDto _companyDto; private CompanyDto _companyDto;
private EditContext _editContext; private EditContext _editContext;
private bool _formInvalid = true;
private List<VirkRegInfo> VInfos { get; set; } = new(); private List<VirkRegInfo> VInfos { get; set; } = new();
private VirkRegInfo _virkRegInfo { get; set; } = new(); private VirkRegInfo _virkRegInfo { get; set; } = new();
private DateTime LastVisit { get; set; } private DateTime LastVisit { get; set; }
private DateTime NextVisit { get; set; } private DateTime NextVisit { get; set; }
private string RegState { get; set; } = "the-ugly";
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
_companyDto = await CompanyRepo.GetCompanyByAccount(Account); _companyDto = await CompanyRepo.GetCompanyByAccount(Account);
LastVisit = DateTime.Parse(_companyDto.LastVisit); LastVisit = DateTime.Parse(_companyDto.LastVisit);
NextVisit = DateTime.Parse(_companyDto.NextVisit); NextVisit = DateTime.Parse(_companyDto.NextVisit);
_editContext = new EditContext(_companyDto); _editContext = new EditContext(_companyDto);
_editContext.OnFieldChanged += HandleFieldChanged!;
Interceptor.RegisterEvent(); Interceptor.RegisterEvent();
Interceptor.RegisterBeforeSendEvent(); Interceptor.RegisterBeforeSendEvent();
await GetInfoFromVat(_companyDto.VatNumber);
} }
private async Task Update() private async Task Update()
@ -60,9 +61,39 @@ public partial class CompanyUpdate : IDisposable
_companyDto.LastVisit = $"{LastVisit:yyyy-MM-dd}"; _companyDto.LastVisit = $"{LastVisit:yyyy-MM-dd}";
_companyDto.NextVisit = $"{NextVisit:yyyy-MM-dd}"; _companyDto.NextVisit = $"{NextVisit:yyyy-MM-dd}";
await CompanyRepo.UpdateCompany(_companyDto); var lv = DateTime.TryParse(_companyDto.LastVisit, out var lvValidated);
ToastService.ShowSuccess($"Godt så. Firma '{_companyDto!.Name}' er opdateret."); var nv = DateTime.TryParse(_companyDto.NextVisit, out var nvValidated);
Navigation.NavigateTo($"/company/{_companyDto.CompanyId}"); if (lv && nv)
{
await CompanyRepo.UpdateCompany(_companyDto);
ToastService.ShowSuccess($"Godt så. Firma '{_companyDto!.Name}' er opdateret.");
Navigation.NavigateTo($"/company/account{_companyDto.Account}");
}
}
private async Task GetInfoFromVat(string vatNumber)
{
var result = await VirkRegistryService
.QueryVirkRegistry(
new VirkParams
{
VatNumber = vatNumber
});
if (string.IsNullOrWhiteSpace(result[0].VatNumber))
{
ToastService.ShowError($"CVR '{vatNumber}' findes ikke.");
return;
}
ToastService.ShowSuccess($"Data for '{vatNumber}' er hentet.");
_virkRegInfo = result[0];
RegState = _virkRegInfo.States[^1].State == "NORMAL" ? "the-good" : "the-ugly";
_companyDto.Name = _virkRegInfo.Name;
_companyDto.Address1 = _virkRegInfo.CoName;
_companyDto.Address2 = _virkRegInfo.Address;
_companyDto.ZipCode = _virkRegInfo.ZipCode;
_companyDto.City = _virkRegInfo.City;
_companyDto.VatNumber = _virkRegInfo.VatNumber;
} }
private async Task GetInfoFromAddress(VatAddress address) private async Task GetInfoFromAddress(VatAddress address)
@ -79,29 +110,6 @@ public partial class CompanyUpdate : IDisposable
ToastService.ShowError($"Ingen virksomheder fundet."); ToastService.ShowError($"Ingen virksomheder fundet.");
} }
} }
private async Task GetInfoFromVat(string vatNumber)
{
var result = await VirkRegistryService
.QueryVirkRegistry(
new VirkParams
{
VatNumber = vatNumber
});
if (!result.Any())
{
ToastService.ShowError($"Firma med CVR '{vatNumber}' findes ikke.");
return;
}
ToastService.ShowSuccess($"Data for '{vatNumber}' er hentet.");
_virkRegInfo = result[0];
_companyDto.Name = _virkRegInfo.Name;
_companyDto.Address1 = _virkRegInfo.CoName;
_companyDto.Address2 = _virkRegInfo.Address;
_companyDto.ZipCode = _virkRegInfo.ZipCode;
_companyDto.City = _virkRegInfo.City;
_companyDto.VatNumber = _virkRegInfo.VatNumber;
}
private void SelectCompany(string vatNumber) private void SelectCompany(string vatNumber)
{ {
_virkRegInfo = (from x in VInfos where x.VatNumber == vatNumber select x).First(); _virkRegInfo = (from x in VInfos where x.VatNumber == vatNumber select x).First();
@ -113,16 +121,9 @@ public partial class CompanyUpdate : IDisposable
_companyDto.VatNumber = _virkRegInfo.VatNumber; _companyDto.VatNumber = _virkRegInfo.VatNumber;
} }
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
{
_formInvalid = !_editContext!.Validate();
StateHasChanged();
}
public void Dispose() public void Dispose()
{ {
Interceptor.DisposeEvent(); Interceptor.DisposeEvent();
_editContext.OnFieldChanged -= HandleFieldChanged!;
} }
} }

View file

@ -64,7 +64,7 @@
</tr> </tr>
<tr> <tr>
<th scope="row">Næste besøg</th> <th scope="row">Næste besøg</th>
<td><div class="state rounded-circle @(VisitState(CompanyDto.LastVisit))"></div></td> <td><DisplayStateComponent StateClass="@(VisitState(CompanyDto.LastVisit))"></DisplayStateComponent></td>
<td>@CompanyDto.NextVisit</td> <td>@CompanyDto.NextVisit</td>
</tr> </tr>
</tbody> </tbody>

View file

@ -18,7 +18,9 @@ using System.Threading.Tasks;
using Wonky.Client.HttpInterceptors; using Wonky.Client.HttpInterceptors;
using Wonky.Client.HttpRepository; using Wonky.Client.HttpRepository;
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using Wonky.Client.Services;
using Wonky.Entity.DTO; using Wonky.Entity.DTO;
using Wonky.Entity.Models;
namespace Wonky.Client.Pages; namespace Wonky.Client.Pages;
@ -26,9 +28,11 @@ public partial class CompanyView : IDisposable
{ {
[Inject] public ICompanyHttpRepository CompanyRepo { get; set; } [Inject] public ICompanyHttpRepository CompanyRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; } [Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public VirkRegistryService VirkRegistryService { get; set; }
[Parameter] public string Account { get; set; } = ""; [Parameter] public string Account { get; set; } = "";
[Parameter] public string CompanyId { get; set; } = ""; [Parameter] public string CompanyId { get; set; } = "";
private CompanyDto CompanyDto { get; set; } = new (); private CompanyDto CompanyDto { get; set; } = new ();
private VirkRegInfo VirkRegInfo { get; set; } = new();
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {

View file

@ -23,35 +23,26 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col"> <div class="col">
<div> <ItemGroupDropdown OnChanged="SetItemGroup"/>
<ItemGroupDropdown OnChanged="SetItemGroup"/>
</div>
</div> </div>
<div class="col"> <div class="col">
<div>
<ItemSortDropdown OnChanged="SetSortCol"/>
</div>
</div>
<div class="col">
<div>
<ItemSearchDropdown OnChanged="SetSearchCol"/> <ItemSearchDropdown OnChanged="SetSearchCol"/>
</div>
</div> </div>
<div class="col"> <div class="col">
<div>
<SearchPhrase OnChanged="SetSearchPhrase"/> <SearchPhrase OnChanged="SetSearchPhrase"/>
</div>
</div> </div>
</div> <div class="col">
<div class="row"> <ItemSortDropdown OnChanged="SetSortCol"/>
<div class="col-md-8">
<Pagination MetaData="MetaData" Spread="2" SelectedPage="SelectedPage"></Pagination>
</div> </div>
<div class="col-md-2"> <div class="col-md-2">
<PageSizeDropdown OnChanged="SetPageSize"></PageSizeDropdown> <PageSizeDropdown OnChanged="SetPageSize"></PageSizeDropdown>
</div> </div>
</div> </div>
<div class="row">
<div class="col">
<Pagination MetaData="MetaData" Spread="2" SelectedPage="SelectedPage"></Pagination>
</div>
</div>
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<ItemTable SalesItems="SalesItemList"></ItemTable> <ItemTable SalesItems="SalesItemList"></ItemTable>

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

View file

@ -0,0 +1,9 @@
namespace Wonky.Entity;
public enum VirkState
{
None,
Good,
Bad,
Ugly
}