wip: v148.0
This commit is contained in:
parent
ee9921296a
commit
f90e745e1a
41 changed files with 412 additions and 379 deletions
|
@ -26,7 +26,7 @@ public partial class CustomerInventoryListComponent
|
||||||
{
|
{
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
// Parameters
|
// Parameters
|
||||||
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
[Parameter] public List<ProductInventoryItemView> Inventory { get; set; } = new();
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
[Parameter] public EventCallback<string> OnReorderSelected { get; set; }
|
[Parameter] public EventCallback<string> OnReorderSelected { get; set; }
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ using Wonky.Entity.Views;
|
||||||
namespace Wonky.Client.Components;
|
namespace Wonky.Client.Components;
|
||||||
public partial class CustomerProductCheckListComponent
|
public partial class CustomerProductCheckListComponent
|
||||||
{
|
{
|
||||||
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
[Parameter] public List<ProductInventoryItemView> Inventory { get; set; } = new();
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
// private variables
|
// private variables
|
||||||
|
|
|
@ -54,7 +54,7 @@ public partial class OfficeCountryCustomerListComponent
|
||||||
// variables
|
// variables
|
||||||
private InvoiceListView InvoiceList { get; set; } = new();
|
private InvoiceListView InvoiceList { get; set; } = new();
|
||||||
private List<ReportItemView> ActivityList { get; set; } = new();
|
private List<ReportItemView> ActivityList { get; set; } = new();
|
||||||
private List<ProductInventoryView> ProductList { get; set; } = new();
|
private List<ProductInventoryItemView> ProductList { get; set; } = new();
|
||||||
private CompanyDto SelectedCompany { get; set; } = new();
|
private CompanyDto SelectedCompany { get; set; } = new();
|
||||||
|
|
||||||
// ******************************************************
|
// ******************************************************
|
||||||
|
|
|
@ -29,7 +29,7 @@ public partial class OfficeInventoryListComponent
|
||||||
[Inject] public ILocalStorageService Storage { get; set; }
|
[Inject] public ILocalStorageService Storage { get; set; }
|
||||||
// *************************************************************
|
// *************************************************************
|
||||||
// Parameters
|
// Parameters
|
||||||
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
[Parameter] public List<ProductInventoryItemView> Inventory { get; set; } = new();
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
[Parameter] public EventCallback<string> OnReorderSelected { get; set; }
|
[Parameter] public EventCallback<string> OnReorderSelected { get; set; }
|
||||||
// *************************************************************
|
// *************************************************************
|
||||||
|
|
|
@ -79,7 +79,7 @@ public class CountryCustomerHistoryRepository : ICountryCustomerHistoryRepositor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task<List<ProductInventoryView>> GetInventory(string countryCode, string companyId)
|
public async Task<List<ProductInventoryItemView>> GetInventory(string countryCode, string companyId)
|
||||||
{
|
{
|
||||||
var response = await _client
|
var response = await _client
|
||||||
.GetAsync($"{_api.OfficeCustomers}/{countryCode}/{companyId}/history/inventory");
|
.GetAsync($"{_api.OfficeCustomers}/{countryCode}/{companyId}/history/inventory");
|
||||||
|
@ -88,11 +88,11 @@ public class CountryCustomerHistoryRepository : ICountryCustomerHistoryRepositor
|
||||||
|
|
||||||
if (!response.IsSuccessStatusCode || string.IsNullOrWhiteSpace(content))
|
if (!response.IsSuccessStatusCode || string.IsNullOrWhiteSpace(content))
|
||||||
{
|
{
|
||||||
return new List<ProductInventoryView>();
|
return new List<ProductInventoryItemView>();
|
||||||
}
|
}
|
||||||
|
|
||||||
return JsonSerializer.Deserialize<List<ProductInventoryView>>(content, _options)
|
return JsonSerializer.Deserialize<List<ProductInventoryItemView>>(content, _options)
|
||||||
?? new List<ProductInventoryView>();
|
?? new List<ProductInventoryItemView>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -75,15 +75,15 @@ public class CrmCustomerHistoryRepository : ICrmCustomerHistoryRepository
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="companyId"></param>
|
/// <param name="companyId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<List<ProductInventoryView>> FetchInventory(string companyId)
|
public async Task<List<ProductInventoryItemView>> FetchInventory(string companyId)
|
||||||
{
|
{
|
||||||
var response = await _client.GetAsync($"{_api.CrmCustomers}/{companyId}/{_api.CrmInventoryExt}");
|
var response = await _client.GetAsync($"{_api.CrmCustomers}/{companyId}/{_api.CrmInventoryExt}");
|
||||||
if (!response.IsSuccessStatusCode)
|
if (!response.IsSuccessStatusCode)
|
||||||
return new List<ProductInventoryView>();
|
return new List<ProductInventoryItemView>();
|
||||||
var content = await response.Content.ReadAsStringAsync();
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
return string.IsNullOrWhiteSpace(content)
|
return string.IsNullOrWhiteSpace(content)
|
||||||
? new List<ProductInventoryView>()
|
? new List<ProductInventoryItemView>()
|
||||||
: JsonSerializer.Deserialize<List<ProductInventoryView>>(content, _options);
|
: JsonSerializer.Deserialize<List<ProductInventoryItemView>>(content, _options);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -23,7 +23,7 @@ public interface ICountryCustomerHistoryRepository
|
||||||
|
|
||||||
Task<InvoiceView> GetInvoice(string countryCode, string companyId, string invoiceId);
|
Task<InvoiceView> GetInvoice(string countryCode, string companyId, string invoiceId);
|
||||||
|
|
||||||
Task<List<ProductInventoryView>> GetInventory(string countryCode, string companyId);
|
Task<List<ProductInventoryItemView>> GetInventory(string countryCode, string companyId);
|
||||||
|
|
||||||
Task<List<ProductHistoryView>> GetHistory(string countryCode, string companyId);
|
Task<List<ProductHistoryView>> GetHistory(string countryCode, string companyId);
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ public interface ICrmCustomerHistoryRepository
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="companyId"></param>
|
/// <param name="companyId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<List<ProductInventoryView>> FetchInventory(string companyId);
|
Task<List<ProductInventoryItemView>> FetchInventory(string companyId);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Fetch History for given customer
|
/// Fetch History for given customer
|
||||||
|
|
30
Wonky.Client/Models/DocRevisionDto.cs
Normal file
30
Wonky.Client/Models/DocRevisionDto.cs
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using Wonky.Entity.DTO;
|
||||||
|
|
||||||
|
namespace Wonky.Client.Models;
|
||||||
|
|
||||||
|
public class DocRevisionDto
|
||||||
|
{
|
||||||
|
[Required] public string EyeCleanerLocation { get; set; } = "";
|
||||||
|
[Required]public string FirstAidLocation { get; set; } = "";
|
||||||
|
[Required]public string GlovesStorage { get; set; } = "";
|
||||||
|
[Required]public string GogglesStorage { get; set; } = "";
|
||||||
|
[Required]public string MaskStorage { get; set; } = "";
|
||||||
|
[Required]public string ProductStorage { get; set; } = "";
|
||||||
|
[Required]public string WasteDeposit { get; set; } = "";
|
||||||
|
[Required]public string AuthoredBy { get; set; } = "";
|
||||||
|
[Required]public string ApprovedBy { get; set; } = "";
|
||||||
|
[Required]public string ApprovedDate { get; set; } = "";
|
||||||
|
[Required]public string FollowupDate { get; set; } = "";
|
||||||
|
|
||||||
|
public List<DocRevisionItemDto> Items { get; set; } = new();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DocRevisionItemDto
|
||||||
|
{
|
||||||
|
public string VariantId { get; set; } = "";
|
||||||
|
public string VariantName { get; set; } = "";
|
||||||
|
public string S5A { get; set; } = "";
|
||||||
|
public string S9A { get; set; } = "";
|
||||||
|
public bool Selected { get; set; } = true;
|
||||||
|
}
|
10
Wonky.Client/Models/DocSelectDisplay.cs
Normal file
10
Wonky.Client/Models/DocSelectDisplay.cs
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
namespace Wonky.Client.Models;
|
||||||
|
|
||||||
|
public class DocSelectDisplay
|
||||||
|
{
|
||||||
|
public string S5A { get; set; } = "";
|
||||||
|
public string S9A { get; set; } = "";
|
||||||
|
public bool Selected { get; set; }
|
||||||
|
public string VariantId { get; set; } = "";
|
||||||
|
public string VariantName { get; set; } = "";
|
||||||
|
}
|
|
@ -32,7 +32,7 @@ public partial class CustomerInventoryListOverlay : IDisposable
|
||||||
[Parameter] public string CompanyName { get; set; } = "";
|
[Parameter] public string CompanyName { get; set; } = "";
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
[Parameter] public string CountryCode { get; set; } = "";
|
[Parameter] public string CountryCode { get; set; } = "";
|
||||||
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
[Parameter] public List<ProductInventoryItemView> Inventory { get; set; } = new();
|
||||||
|
|
||||||
[Parameter] public EventCallback<DraftItem> OnSelected { get; set; }
|
[Parameter] public EventCallback<DraftItem> OnSelected { get; set; }
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,44 @@
|
||||||
<button type="button" class="btn-close" onclick="@Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
|
<button type="button" class="btn-close" onclick="@Hide" data-bs-dismiss="modal" aria-label="Luk"></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
|
<div class="accordion open" id="productSelection">
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header" id="curProducts">
|
||||||
|
<button class="accordion-button" type="button"
|
||||||
|
data-bs-toggle="collapse" data-bs-target="#curProductList"
|
||||||
|
aria-expanded="true" aria-controls="curProductList">
|
||||||
|
Dokumenterede produkter
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div class="accordion-collapse collapse show" id="curProductList"
|
||||||
|
data-bs-parent="productSelection" aria-labelledby="curProducts">
|
||||||
|
<div class="accordion-body">
|
||||||
|
@if (CurProducts.Any())
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="accordion-item">
|
||||||
|
<h2 class="accordion-header" id="newProducts">
|
||||||
|
<button class="accordion-button" type="button"
|
||||||
|
data-bs-toggle="collapse" data-bs-target="#newProductList"
|
||||||
|
aria-expanded="true" aria-controls="newProductList">
|
||||||
|
Nye kunde produkter
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
|
<div class="accordion-collapse collapse show" id="newProductList"
|
||||||
|
data-bs-parent="productSelection" aria-labelledby="newProducts">
|
||||||
|
<div class="accordion-body">
|
||||||
|
@if (NewProducts.Any())
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
//
|
//
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Components;
|
using Microsoft.AspNetCore.Components;
|
||||||
|
using Wonky.Client.Models;
|
||||||
using Wonky.Entity.Views;
|
using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.OverlayDocuments;
|
namespace Wonky.Client.OverlayDocuments;
|
||||||
|
@ -21,7 +22,8 @@ namespace Wonky.Client.OverlayDocuments;
|
||||||
public partial class ProductSelectionOverlay
|
public partial class ProductSelectionOverlay
|
||||||
{
|
{
|
||||||
//###############################################################
|
//###############################################################
|
||||||
[Parameter] public List<ExternalProductListView> ProductListViews { get; set; } = new();
|
[Parameter] public List<DocSelectDisplay> CurProducts { get; set; } = new();
|
||||||
|
[Parameter] public List<DocSelectDisplay> NewProducts { get; set; } = new();
|
||||||
[Parameter] public EventCallback<ExternalProductVariantView> OnSelected { get; set; }
|
[Parameter] public EventCallback<ExternalProductVariantView> OnSelected { get; set; }
|
||||||
|
|
||||||
//###############################################################
|
//###############################################################
|
||||||
|
|
|
@ -40,7 +40,7 @@ public partial class OfficeCustomerProductListOverlay : IDisposable
|
||||||
private bool Descending { get; set; }
|
private bool Descending { get; set; }
|
||||||
|
|
||||||
[Parameter] public CompanyDto Company { get; set; } = new();
|
[Parameter] public CompanyDto Company { get; set; } = new();
|
||||||
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
[Parameter] public List<ProductInventoryItemView> Inventory { get; set; } = new();
|
||||||
|
|
||||||
protected override void OnParametersSet()
|
protected override void OnParametersSet()
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,7 +31,7 @@ public partial class OfficeOrderInventoryListOverlay : IDisposable
|
||||||
[Inject] public ILogger<OfficeOrderInventoryListOverlay> Logger { get; set; }
|
[Inject] public ILogger<OfficeOrderInventoryListOverlay> Logger { get; set; }
|
||||||
|
|
||||||
[Parameter] public CompanyDto Company { get; set; } = new();
|
[Parameter] public CompanyDto Company { get; set; } = new();
|
||||||
[Parameter] public List<ProductInventoryView> Inventory { get; set; } = new();
|
[Parameter] public List<ProductInventoryItemView> Inventory { get; set; } = new();
|
||||||
[Parameter] public EventCallback<DraftItem> OnSelected { get; set; }
|
[Parameter] public EventCallback<DraftItem> OnSelected { get; set; }
|
||||||
|
|
||||||
private string _modalDisplay = "";
|
private string _modalDisplay = "";
|
||||||
|
|
|
@ -25,7 +25,7 @@ public partial class ProductCheckConfirmationOverlay
|
||||||
private bool _showBackdrop;
|
private bool _showBackdrop;
|
||||||
[Parameter] public string BodyMessage { get; set; } = "";
|
[Parameter] public string BodyMessage { get; set; } = "";
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
[Parameter] public List<ProductInventoryView> Products { get; set; } = new();
|
[Parameter] public List<ProductInventoryItemView> Products { get; set; } = new();
|
||||||
[Parameter] public EventCallback OnOkClicked { get; set; }
|
[Parameter] public EventCallback OnOkClicked { get; set; }
|
||||||
|
|
||||||
public void Show()
|
public void Show()
|
||||||
|
|
|
@ -92,8 +92,8 @@ public partial class AdvisorActivityCreatePage : IDisposable
|
||||||
private CustomerActivityListOverlay ActivityListOverlay { get; set; } = new();
|
private CustomerActivityListOverlay ActivityListOverlay { get; set; } = new();
|
||||||
|
|
||||||
// #############################################################
|
// #############################################################
|
||||||
private List<ProductInventoryView> Inventory { get; set; } = new();
|
private List<ProductInventoryItemView> Inventory { get; set; } = new();
|
||||||
private List<ProductInventoryView> CheckList { get; set; } = new();
|
private List<ProductInventoryItemView> CheckList { get; set; } = new();
|
||||||
private InvoiceListView CompanyInvoices { get; set; } = new();
|
private InvoiceListView CompanyInvoices { get; set; } = new();
|
||||||
private List<ReportItemView> Activities { get; set; } = new();
|
private List<ReportItemView> Activities { get; set; } = new();
|
||||||
private bool Kanvas { get; set; }
|
private bool Kanvas { get; set; }
|
||||||
|
@ -144,6 +144,11 @@ public partial class AdvisorActivityCreatePage : IDisposable
|
||||||
// decide if new or recall
|
// decide if new or recall
|
||||||
Activity.ActivityVisitEnum = Company.Account.StartsWith("NY")
|
Activity.ActivityVisitEnum = Company.Account.StartsWith("NY")
|
||||||
? "new" : "recall";
|
? "new" : "recall";
|
||||||
|
if (string.IsNullOrWhiteSpace(Company.Segment) && SalesRep.CountryCode.ToLower() == "dk")
|
||||||
|
{
|
||||||
|
Toaster.ShowError("Der mangler information om Segment. Ret kunde segment, gem erp data og prøv igen.");
|
||||||
|
Navigator.NavigateTo($"/advisor/customers/{CompanyId}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Populate base activity information
|
// Populate base activity information
|
||||||
|
@ -292,7 +297,7 @@ public partial class AdvisorActivityCreatePage : IDisposable
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// deserialize storage data
|
// deserialize storage data
|
||||||
CheckList = JsonSerializer.Deserialize<List<ProductInventoryView>>(pStorage);
|
CheckList = JsonSerializer.Deserialize<List<ProductInventoryItemView>>(pStorage) ?? new List<ProductInventoryItemView>();
|
||||||
if (CheckList.Any())
|
if (CheckList.Any())
|
||||||
CheckList = CheckList.OrderBy(x => x.Description).ToList();
|
CheckList = CheckList.OrderBy(x => x.Description).ToList();
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
@page "/advisor/customers/new"
|
@page "/advisor/customers/new"
|
||||||
@using Microsoft.AspNetCore.Authorization
|
@using Microsoft.AspNetCore.Authorization
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
|
@using System.Xml
|
||||||
@attribute [Authorize(Roles = "Advisor")]
|
@attribute [Authorize(Roles = "Advisor")]
|
||||||
|
|
||||||
<PageTitle>Rådgiver Opret Kunde</PageTitle>
|
<PageTitle>Rådgiver Opret Kunde</PageTitle>
|
||||||
|
@ -48,43 +49,69 @@
|
||||||
</div>
|
</div>
|
||||||
@* entity name *@
|
@* entity name *@
|
||||||
<label for="name" class="col-sm-1 col-form-label-sm">Navn</label>
|
<label for="name" class="col-sm-1 col-form-label-sm">Navn</label>
|
||||||
<div class="col-sm-7">
|
<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"/>
|
||||||
<ValidationMessage For="@(() => Company.Name)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.Name)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
@* entity attention *@
|
@* entity attention *@
|
||||||
<label for="attention" class="col-sm-1 col-form-label-sm">Att.</label>
|
<label for="attention" class="col-sm-1 col-form-label-sm">Att.</label>
|
||||||
<div class="col-sm-3">
|
<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"/>
|
||||||
<ValidationMessage For="@(() => Company.Attention)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.Attention)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
@* entity address 1 *@
|
@* entity address 1 *@
|
||||||
<label for="address1" class="col-sm-1 col-form-label-sm">Adresse</label>
|
<label for="address1" class="col-sm-1 col-form-label-sm">Adresse</label>
|
||||||
<div class="col-sm-6">
|
<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"/>
|
||||||
<ValidationMessage For="@(() => Company.Address1)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.Address1)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
@* entity address 2 *@
|
@* entity address 2 *@
|
||||||
<label for="address2" class="col-sm-1 col-form-label-sm">Adresse</label>
|
<label for="address2" class="col-sm-1 col-form-label-sm">Adresse</label>
|
||||||
<div class="col-sm-4">
|
<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"/>
|
||||||
<ValidationMessage For="@(() => Company.Address2)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.Address2)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
@* entity postal code *@
|
@* entity postal code *@
|
||||||
<label for="zipCode" class="col-sm-1 col-form-label-sm">Post Nr</label>
|
<label for="zipCode" class="col-sm-1 col-form-label-sm">Post Nr</label>
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-1">
|
||||||
<InputText id="zipCode" class="form-control" @bind-Value="Company.ZipCode"/>
|
<InputText id="zipCode" class="form-control" @bind-Value="Company.ZipCode"/>
|
||||||
<ValidationMessage For="@(() => Company.ZipCode)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.ZipCode)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
@* entity city name *@
|
@* entity city name *@
|
||||||
<label for="city" class="col-sm-1 col-form-label-sm">Bynavn</label>
|
<label for="city" class="col-sm-1 col-form-label-sm">Bynavn</label>
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-3">
|
||||||
<InputText id="city" class="form-control" @bind-Value="Company.City"/>
|
<InputText id="city" class="form-control" @bind-Value="Company.City"/>
|
||||||
<ValidationMessage For="@(() => Company.City)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.City)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
|
@* entity email *@
|
||||||
|
<label for="email" class="col-sm-1 col-form-label-sm">Email</label>
|
||||||
|
<div class="col-sm-5">
|
||||||
|
<InputText id="email" class="form-control" @bind-Value="Company.Email"/>
|
||||||
|
<ValidationMessage For="@(() => Company.Email)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@* entity phone *@
|
||||||
|
<label for="phone" class="col-sm-1 col-form-label-sm">Telefon</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<InputText id="phone" class="form-control" @bind-Value="Company.Phone"/>
|
||||||
|
<ValidationMessage For="@(() => Company.Phone)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@* entity mobile *@
|
||||||
|
<label for="mobile" class="col-sm-1 col-form-label-sm">Mobil</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<InputText id="mobile" class="form-control" @bind-Value="Company.Mobile"/>
|
||||||
|
<ValidationMessage For="@(() => Company.Mobile)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@* placeholder *@
|
||||||
|
<div class="col-sm-6">
|
||||||
|
@* placeholder *@
|
||||||
|
</div>
|
||||||
|
|
||||||
@* entity vat number *@
|
@* entity vat number *@
|
||||||
<label for="vatNumber" class="col-sm-1 col-form-label-sm">Cvr/Org Nr.</label>
|
<label for="vatNumber" class="col-sm-1 col-form-label-sm">Cvr/Org Nr.</label>
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-2">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<span class="input-group-text">
|
<span class="input-group-text">
|
||||||
<DisplayStateComponent StateClass="@RegState"/>
|
<DisplayStateComponent StateClass="@RegState"/>
|
||||||
|
@ -93,24 +120,33 @@
|
||||||
<ValidationMessage For="@(() => Company.VatNumber)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.VatNumber)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@* entity phone *@
|
@* entity segment *@
|
||||||
<label for="phone" class="col-sm-1 col-form-label-sm">Telefon</label>
|
@if (UserInfo.CountryCode.ToLower() == "dk")
|
||||||
<div class="col-sm-3">
|
{
|
||||||
<InputText id="phone" class="form-control" @bind-Value="Company.Phone"/>
|
<label for="segment" class="col-sm-1 col-form-label-sm">Segment</label>
|
||||||
<ValidationMessage For="@(() => Company.Phone)"></ValidationMessage>
|
<div class="col-sm-2">
|
||||||
</div>
|
<InputSelect id="segment" class="form-select bg-warning text-bg-warning"
|
||||||
|
@bind-Value="@Company.Segment">
|
||||||
|
<option value="" disabled>segment</option>
|
||||||
|
<option value="1">AUTO</option>
|
||||||
|
<option value="2">INDUSTRI</option>
|
||||||
|
</InputSelect>
|
||||||
|
<ValidationMessage For="@(() => Company.Segment)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div class="col-sm-3">
|
||||||
|
@* placeholder *@
|
||||||
|
</div>
|
||||||
|
}
|
||||||
@* entity mobile *@
|
@* entity mobile *@
|
||||||
<label for="mobile" class="col-sm-1 col-form-label-sm">Mobil</label>
|
<label for="eanNumber" class="col-sm-1 col-form-label-sm">EAN</label>
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-5">
|
||||||
<InputText id="mobile" class="form-control" @bind-Value="Company.Mobile"/>
|
<InputText id="eanNumber" class="form-control" @bind-Value="Company.EanNumber"/>
|
||||||
<ValidationMessage For="@(() => Company.Mobile)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.EanNumber)"></ValidationMessage>
|
||||||
</div>
|
|
||||||
@* entity email *@
|
|
||||||
<label for="email" class="col-sm-1 col-form-label-sm">Email</label>
|
|
||||||
<div class="col-sm-11">
|
|
||||||
<InputText id="email" class="form-control" @bind-Value="Company.Email"/>
|
|
||||||
<ValidationMessage For="@(() => Company.Email)"></ValidationMessage>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<hr class="mb-3"/>
|
<hr class="mb-3"/>
|
||||||
<div class="row g-2 mb-3">
|
<div class="row g-2 mb-3">
|
||||||
|
|
|
@ -54,6 +54,7 @@ public partial class AdvisorCustomerCreatePage : IDisposable
|
||||||
private DateTime NextVisit { get; set; }
|
private DateTime NextVisit { get; set; }
|
||||||
private bool Dk { get; set; } = true;
|
private bool Dk { get; set; } = true;
|
||||||
private bool Working { get; set; }
|
private bool Working { get; set; }
|
||||||
|
private UserManagerEditView UserInfo { get; set; }
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
|
@ -62,11 +63,11 @@ public partial class AdvisorCustomerCreatePage : IDisposable
|
||||||
CompanyContext.OnFieldChanged += HandleFieldChanged;
|
CompanyContext.OnFieldChanged += HandleFieldChanged;
|
||||||
CompanyContext.OnValidationStateChanged += ValidationChanged;
|
CompanyContext.OnValidationStateChanged += ValidationChanged;
|
||||||
|
|
||||||
var xu = await UserInfoService.GetUserInfo();
|
UserInfo = await UserInfoService.GetUserInfo();
|
||||||
Dk = xu.CountryCode.ToLower() == "dk";
|
Dk = UserInfo.CountryCode.ToLower() == "dk";
|
||||||
|
|
||||||
Company.SalesRepId = xu.UserId;
|
Company.SalesRepId = UserInfo.UserId;
|
||||||
Company.CountryCode = xu.CountryCode.ToLower();
|
Company.CountryCode = UserInfo.CountryCode.ToLower();
|
||||||
|
|
||||||
LastVisit = DateTime.Now;
|
LastVisit = DateTime.Now;
|
||||||
NextVisit = DateTime.Now.AddDays(Company.Interval * 7);
|
NextVisit = DateTime.Now.AddDays(Company.Interval * 7);
|
||||||
|
@ -161,6 +162,17 @@ public partial class AdvisorCustomerCreatePage : IDisposable
|
||||||
FormInvalid = !CompanyContext.Validate();
|
FormInvalid = !CompanyContext.Validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if dk then check content of segment
|
||||||
|
if (UserInfo.CountryCode.ToLower() == "dk")
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(Company.Segment))
|
||||||
|
{
|
||||||
|
Toaster.ShowError("Segment skal vælges - AUTO eller INDUSTRI");
|
||||||
|
FormInvalid = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
StateHasChanged();
|
StateHasChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
|
||||||
private bool Working { get; set; } = true;
|
private bool Working { get; set; } = true;
|
||||||
private SalesItemView SalesItem { get; set; } = new();
|
private SalesItemView SalesItem { get; set; } = new();
|
||||||
private CustomerInventoryReorderOverlay ReorderOverlay { get; set; } = new();
|
private CustomerInventoryReorderOverlay ReorderOverlay { get; set; } = new();
|
||||||
private List<ProductInventoryView> Inventory { get; set; } = new();
|
private List<ProductInventoryItemView> Inventory { get; set; } = new();
|
||||||
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
|
@ -84,7 +84,7 @@ public partial class AdvisorCustomerInventoryListPage : IDisposable
|
||||||
|
|
||||||
private async Task FetchProductInventory()
|
private async Task FetchProductInventory()
|
||||||
{
|
{
|
||||||
Inventory = new List<ProductInventoryView>();
|
Inventory = new List<ProductInventoryItemView>();
|
||||||
Inventory = await HistoryRepo.FetchInventory(CompanyId);
|
Inventory = await HistoryRepo.FetchInventory(CompanyId);
|
||||||
if (Inventory.Any())
|
if (Inventory.Any())
|
||||||
Inventory = Inventory.OrderBy(x => x.Description).ToList();
|
Inventory = Inventory.OrderBy(x => x.Description).ToList();
|
||||||
|
|
|
@ -79,7 +79,7 @@ public partial class AdvisorCustomerPagedListPage : IDisposable
|
||||||
{
|
{
|
||||||
Working = true;
|
Working = true;
|
||||||
ShowFolded = !ShowFolded;
|
ShowFolded = !ShowFolded;
|
||||||
ToggleFoldedText = ShowFolded ? "Normal Visning" : "Vis Lukkede";
|
ToggleFoldedText = ShowFolded ? "Normale" : "Lukkede";
|
||||||
CompanyList = new List<CompanyDto>();
|
CompanyList = new List<CompanyDto>();
|
||||||
Paging.PageNumber = 1;
|
Paging.PageNumber = 1;
|
||||||
Paging.HasFolded = ShowFolded ? 1 : 0;
|
Paging.HasFolded = ShowFolded ? 1 : 0;
|
||||||
|
@ -90,7 +90,7 @@ public partial class AdvisorCustomerPagedListPage : IDisposable
|
||||||
{
|
{
|
||||||
Working = true;
|
Working = true;
|
||||||
ShowHidden = !ShowHidden;
|
ShowHidden = !ShowHidden;
|
||||||
ToggleHiddenText = ShowHidden ? "Normal Visning" : "Inkl. Skjulte";
|
ToggleHiddenText = ShowHidden ? "Aktive" : "Inaktive";
|
||||||
CompanyList = new List<CompanyDto>();
|
CompanyList = new List<CompanyDto>();
|
||||||
Paging.PageNumber = 1;
|
Paging.PageNumber = 1;
|
||||||
Paging.IsHidden = ShowHidden ? 1 : 0;
|
Paging.IsHidden = ShowHidden ? 1 : 0;
|
||||||
|
|
|
@ -28,11 +28,20 @@
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div class="row pt-2 pb-2 mb-2 rounded rounded-2 bg-dark text-white">
|
<div class="row pt-2 pb-2 mb-2 rounded rounded-2 bg-dark text-white">
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-8">
|
||||||
<div class="mt-1">
|
<div class="mt-1">
|
||||||
<span class="h3">@Company.Name</span> <span>(@Company.Account)</span>
|
<span class="h3">@Company.Name</span> <span>(@Company.Account)</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
@if (AppInfo!.Value!.Rc)
|
||||||
|
{
|
||||||
|
@if (UserInfo.CountryCode is "DK")
|
||||||
|
{
|
||||||
|
<a class="btn btn-secondary" href="/advisor/customers/@CompanyId/workplaces/new"><i class="bi-plus-lg"></i> Arbejdssted</a>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</div>
|
||||||
<div class="col-sm-2 text-end">
|
<div class="col-sm-2 text-end">
|
||||||
<a class="btn btn-primary" href="/advisor/customers"><i class="bi-chevron-left"></i> Tilbage</a>
|
<a class="btn btn-primary" href="/advisor/customers"><i class="bi-chevron-left"></i> Tilbage</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -105,22 +114,31 @@
|
||||||
|
|
||||||
@if (!Kanvas)
|
@if (!Kanvas)
|
||||||
{
|
{
|
||||||
<label for="segment" class="col-sm-1 col-form-label-sm">Segment</label>
|
@* entity segment *@
|
||||||
<div class="col-sm-2">
|
@if (UserInfo.CountryCode.ToLower() == "dk")
|
||||||
<InputSelect id="segment" class="form-select bg-warning text-bg-warning"
|
{
|
||||||
@bind-Value="@Company.Segment" disabled="@(ErpEditDisabled)">
|
<label for="segment" class="col-sm-1 col-form-label-sm">Segment</label>
|
||||||
<option value="" disabled>segment</option>
|
<div class="col-sm-2">
|
||||||
<option value="1">AUTO</option>
|
<InputSelect id="segment" class="form-select bg-warning text-bg-warning"
|
||||||
<option value="2">INDUSTRI</option>
|
@bind-Value="@Company.Segment" disabled="@(ErpEditDisabled)">
|
||||||
</InputSelect>
|
<option value="" disabled>segment</option>
|
||||||
<ValidationMessage For="@(() => Company.Segment)"></ValidationMessage>
|
<option value="1">AUTO</option>
|
||||||
</div>
|
<option value="2">INDUSTRI</option>
|
||||||
<div class="col-sm-1">
|
</InputSelect>
|
||||||
<div class="led-box @(DateTime.Now < DateTime.Parse("2023-12-31") ? "inno-display" : "inno-hidden")">
|
<ValidationMessage For="@(() => Company.Segment)"></ValidationMessage>
|
||||||
<div class="led-red"></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="col-sm-1">
|
||||||
|
<div class="led-box @(DateTime.Now < DateTime.Parse("2023-12-31") ? "inno-display" : "inno-hidden")">
|
||||||
|
<div class="led-red"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div class="col-sm-4">
|
||||||
|
@* placeholder *@
|
||||||
|
</div>
|
||||||
|
}
|
||||||
@* Enable edit/save *@
|
@* Enable edit/save *@
|
||||||
<div class="col-sm-2 d-grid mx-auto">
|
<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>
|
<button type="button" class="btn btn-edit" onclick="@ToggleErpEdit"><i class="bi-pencil"></i> STAM data</button>
|
||||||
|
@ -295,7 +313,10 @@
|
||||||
<div class="col-sm-4 d-grid">
|
<div class="col-sm-4 d-grid">
|
||||||
@if (AppInfo!.Value!.Rc)
|
@if (AppInfo!.Value!.Rc)
|
||||||
{
|
{
|
||||||
<a class="btn btn-info" href="@($"/advisor/customers/{CompanyId}/workplaces")">Kemi Dokumentation</a>
|
@if (UserInfo.CountryCode is "DK")
|
||||||
|
{
|
||||||
|
<a class="btn btn-info" href="@($"/advisor/customers/{CompanyId}/workplaces")">Kemi Dokumentation</a>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -94,7 +94,7 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
|
||||||
|
|
||||||
// assign event handlers to context
|
// assign event handlers to context
|
||||||
ErpContext.OnFieldChanged += HandleFieldChanged;
|
ErpContext.OnFieldChanged += HandleFieldChanged;
|
||||||
ErpContext.OnValidationStateChanged += ValidationChanged;
|
ErpContext.OnValidationStateChanged += ValidationChanged!;
|
||||||
|
|
||||||
// fetch user info from local storage
|
// fetch user info from local storage
|
||||||
UserInfo = await UserInfoService.GetUserInfo();
|
UserInfo = await UserInfoService.GetUserInfo();
|
||||||
|
@ -159,8 +159,10 @@ public partial class AdvisorCustomerViewEditPage : IDisposable
|
||||||
|
|
||||||
// create search address from address
|
// create search address from address
|
||||||
if (CountryIsDk)
|
if (CountryIsDk)
|
||||||
|
{
|
||||||
CompanyVatAddress = PrepareVatAddress(Company);
|
CompanyVatAddress = PrepareVatAddress(Company);
|
||||||
|
}
|
||||||
|
|
||||||
await FetchContacts(CompanyId);
|
await FetchContacts(CompanyId);
|
||||||
|
|
||||||
Working = false;
|
Working = false;
|
||||||
|
|
|
@ -18,71 +18,102 @@
|
||||||
@attribute [Authorize(Roles = "Advisor")]
|
@attribute [Authorize(Roles = "Advisor")]
|
||||||
@page "/advisor/customers/{CompanyId}/workplaces/{WorkplaceId}/documents/new"
|
@page "/advisor/customers/{CompanyId}/workplaces/{WorkplaceId}/documents/new"
|
||||||
<PageTitle>@Workplace.CompanyName - @Workplace.Name</PageTitle>
|
<PageTitle>@Workplace.CompanyName - @Workplace.Name</PageTitle>
|
||||||
<div class="row -mb-3">
|
<div class="row mb-3">
|
||||||
<div class="col-sm-4">
|
<div class="col-sm-8">
|
||||||
<h2>@Workplace.CompanyName</h2>
|
<span class="h3">@Workplace.CompanyName</span>
|
||||||
</div>
|
|
||||||
<div class="col-sm-4">
|
|
||||||
<h3>@Workplace.Name @(!string.IsNullOrWhiteSpace(Workplace.Description) ? $"- {Workplace.Description}" : "")</h3>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-2">
|
||||||
<a class="btn btn-primary" href="/advisor/customers/@CompanyId"><i class="bi-chevron-left"></i> Stamkort</a>
|
@* <a class="btn btn-primary" href="/advisor/customers/@CompanyId"><i class="bi-chevron-left"></i> Stamkort</a> *@
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2 text-end">
|
<div class="col-sm-2 text-end">
|
||||||
<a class="btn btn-primary" href="/advisor/customers/@CompanyId/workplaces/@WorkplaceId"><i class="bi-chevron-left"></i> Tilbage</a>
|
<a class="btn btn-primary" href="/advisor/customers/@CompanyId/workplaces/@WorkplaceId"><i class="bi-chevron-left"></i> Tilbage</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<span class="h3">@Workplace.Name</span><span class="text-small">@(!string.IsNullOrWhiteSpace(Workplace.Description) ? $"({Workplace.Description})" : "")</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<EditForm EditContext="FormContext" OnValidSubmit="SubmitForm">
|
<EditForm EditContext="FormContext" OnValidSubmit="SubmitForm">
|
||||||
<DataAnnotationsValidator/>
|
<DataAnnotationsValidator/>
|
||||||
|
@* locations *@
|
||||||
<div class="row g-3 mb-3">
|
<div class="row g-3 mb-3">
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-6">
|
||||||
<div class="form-floating">
|
<div class="form-floating">
|
||||||
<InputText id="eyeCleanerLocation" class="form-control" @bind-Value="WorkplaceDocumentDto.EyeCleanerLocation" placeholder="Øjenskylleflaske"/>
|
<InputText id="eyeCleanerLocation" class="form-control" @bind-Value="DocumentsDto.EyeCleanerLocation" placeholder="Øjenskylleflaske"/>
|
||||||
<label for="eyeCleanerLocation">Øjenskylleflaske</label>
|
<label for="eyeCleanerLocation">Øjenskylleflaske</label>
|
||||||
<ValidationMessage For="@(() => WorkplaceDocumentDto.EyeCleanerLocation)"></ValidationMessage>
|
<ValidationMessage For="@(() => DocumentsDto.EyeCleanerLocation)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-6">
|
||||||
<div class="form-floating">
|
<div class="form-floating">
|
||||||
<InputText id="firstAidStorage" class="form-control" @bind-Value="WorkplaceDocumentDto.FirstAidLocation" placeholder="Førstehjælp"/>
|
<InputText id="firstAidStorage" class="form-control" @bind-Value="DocumentsDto.FirstAidLocation" placeholder="Førstehjælp"/>
|
||||||
<label for="firstAidStorage">Førstehjælp</label>
|
<label for="firstAidStorage">Førstehjælp</label>
|
||||||
<ValidationMessage For="@(() => WorkplaceDocumentDto.FirstAidLocation)"></ValidationMessage>
|
<ValidationMessage For="@(() => DocumentsDto.FirstAidLocation)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-6">
|
||||||
<div class="form-floating">
|
<div class="form-floating">
|
||||||
<InputText id="productStorage" class="form-control" @bind-Value="WorkplaceDocumentDto.ProductStorage" placeholder="Produkt opbevaring"/>
|
<InputText id="productStorage" class="form-control" @bind-Value="DocumentsDto.ProductStorage" placeholder="Produkt opbevaring"/>
|
||||||
<label for="productStorage">Produkt Opbevaring</label>
|
<label for="productStorage">Produkt Opbevaring</label>
|
||||||
<ValidationMessage For="@(() => WorkplaceDocumentDto.ProductStorage)"></ValidationMessage>
|
<ValidationMessage For="@(() => DocumentsDto.ProductStorage)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-6">
|
||||||
<div class="form-floating">
|
<div class="form-floating">
|
||||||
<InputText id="maskStorage" class="form-control" @bind-Value="WorkplaceDocumentDto.MaskStorage" placeholder="Maske opbevaring"/>
|
<InputText id="maskStorage" class="form-control" @bind-Value="DocumentsDto.MaskStorage" placeholder="Maske opbevaring"/>
|
||||||
<label for="maskStorage">Maske Opbevaring</label>
|
<label for="maskStorage">Maske Opbevaring</label>
|
||||||
<ValidationMessage For="@(() => WorkplaceDocumentDto.MaskStorage)"></ValidationMessage>
|
<ValidationMessage For="@(() => DocumentsDto.MaskStorage)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-6">
|
||||||
<div class="form-floating">
|
<div class="form-floating">
|
||||||
<InputText id="glovesStorage" class="form-control" @bind-Value="WorkplaceDocumentDto.GlovesStorage" placeholder="Handsker"/>
|
<InputText id="glovesStorage" class="form-control" @bind-Value="DocumentsDto.GlovesStorage" placeholder="Handsker"/>
|
||||||
<label for="glovesStorage">Handsker</label>
|
<label for="glovesStorage">Handsker</label>
|
||||||
<ValidationMessage For="@(() => WorkplaceDocumentDto.GlovesStorage)"></ValidationMessage>
|
<ValidationMessage For="@(() => DocumentsDto.GlovesStorage)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-6">
|
||||||
<div class="form-floating">
|
<div class="form-floating">
|
||||||
<InputText id="gogglesStorage" class="form-control" @bind-Value="WorkplaceDocumentDto.GogglesStorage" placeholder="Beskyttelsesbriller"/>
|
<InputText id="gogglesStorage" class="form-control" @bind-Value="DocumentsDto.GogglesStorage" placeholder="Beskyttelsesbriller"/>
|
||||||
<label for="gogglesStorage">Beskyttelsesbriller</label>
|
<label for="gogglesStorage">Beskyttelsesbriller</label>
|
||||||
<ValidationMessage For="@(() => WorkplaceDocumentDto.GogglesStorage)"></ValidationMessage>
|
<ValidationMessage For="@(() => DocumentsDto.GogglesStorage)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-6">
|
||||||
<div class="form-floating">
|
<div class="form-floating">
|
||||||
<InputText id="wasteDeposit" class="form-control" @bind-Value="WorkplaceDocumentDto.WasteDeposit" placeholder="Affald og Spild"/>
|
<InputText id="wasteDeposit" class="form-control" @bind-Value="DocumentsDto.WasteDeposit" placeholder="Affald og Spild"/>
|
||||||
<label for="wasteDeposit">Affald og Spild</label>
|
<label for="wasteDeposit">Affald og Spild</label>
|
||||||
<ValidationMessage For="@(() => WorkplaceDocumentDto.WasteDeposit)"></ValidationMessage>
|
<ValidationMessage For="@(() => DocumentsDto.WasteDeposit)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row g-3 mb-3">
|
||||||
|
<div class="col-sm-12 col-md-6">
|
||||||
|
<div class="form-floating">
|
||||||
|
<InputText id="authoredBy" class="form-control" @bind-Value="DocumentsDto.AuthoredBy" placeholder="Oprettet af"/>
|
||||||
|
<label for="authoredBy">Oprettet af</label>
|
||||||
|
<ValidationMessage For="@(() => DocumentsDto.AuthoredBy)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-12 col-md-6">
|
||||||
|
<div class="form-floating">
|
||||||
|
<InputText id="followupDate" class="form-control" @bind-Value="DocumentsDto.FollowupDate" placeholder="Revisions dato"/>
|
||||||
|
<label for="followupDate">Revisions dato</label>
|
||||||
|
<ValidationMessage For="@(() => DocumentsDto.FollowupDate)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-12 col-md-6">
|
||||||
|
<div class="form-floating">
|
||||||
|
<InputText id="approvedBy" class="form-control" @bind-Value="DocumentsDto.ApprovedBy" placeholder="Godkendt af"/>
|
||||||
|
<label for="approvedBy">Godkendt af</label>
|
||||||
|
<ValidationMessage For="@(() => DocumentsDto.ApprovedBy)"></ValidationMessage>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-12 col-md-6">
|
||||||
|
<div class="form-floating">
|
||||||
|
<InputText id="approvedDate" class="form-control" @bind-Value="DocumentsDto.ApprovedDate" placeholder="Godkendt dato"/>
|
||||||
|
<label for="approvedDate">Gokendt dato</label>
|
||||||
|
<ValidationMessage For="@(() => DocumentsDto.ApprovedBy)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -94,8 +125,44 @@
|
||||||
<button type="submit" class="btn btn-success mx-auto" disabled="@FormInvalid"><i class="bi-cloud-upload"></i> Gem</button>
|
<button type="submit" class="btn btn-success mx-auto" disabled="@FormInvalid"><i class="bi-cloud-upload"></i> Gem</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</EditForm>
|
|
||||||
|
|
||||||
|
@* current documents *@
|
||||||
|
<div class="list-group list-group-flush">
|
||||||
|
<div class="list-group-item">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4 h4">
|
||||||
|
Produkt Variant
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-2 h4">
|
||||||
|
Opdater
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@foreach (var doc in DocumentsDto.Items)
|
||||||
|
{
|
||||||
|
<div class="list-group-item">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<span class="fw-bold">@doc.VariantName.ToUpperInvariant()</span>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<InputCheckbox id="@doc.VariantId" class="form-check" @bind-Value="@doc.Selected" />
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
@doc.S5A
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
@doc.S9A
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
<div class="list-group-item">
|
||||||
|
<div class="row">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</EditForm>
|
||||||
|
|
||||||
|
|
||||||
@if (Working)
|
@if (Working)
|
||||||
|
@ -112,4 +179,4 @@
|
||||||
<ValidationMessage For="@(() => Workplace.Name)"></ValidationMessage>
|
<ValidationMessage For="@(() => Workplace.Name)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
*@
|
*@
|
|
@ -39,40 +39,74 @@ public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable
|
||||||
[Inject] public NavigationManager Navigator { get; set; }
|
[Inject] public NavigationManager Navigator { get; set; }
|
||||||
[Inject] public ILogger<CrmCustomerWorkplaceDocumentAddPage> Logger { get; set; }
|
[Inject] public ILogger<CrmCustomerWorkplaceDocumentAddPage> Logger { get; set; }
|
||||||
[Inject] public IToastService Toaster { get; set; }
|
[Inject] public IToastService Toaster { get; set; }
|
||||||
|
[Inject] public IUserInfoService UserService { get; set; }
|
||||||
|
|
||||||
// #############################################################
|
// #############################################################
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
[Parameter] public string WorkplaceId { get; set; } = "";
|
[Parameter] public string WorkplaceId { get; set; } = "";
|
||||||
|
|
||||||
// #############################################################
|
// #############################################################
|
||||||
|
private UserManagerEditView UserInfo { get; set; }
|
||||||
private EditContext FormContext { get; set; }
|
private EditContext FormContext { get; set; }
|
||||||
private WorkplaceDto Workplace { get; set; } = new();
|
private WorkplaceDto Workplace { get; set; } = new();
|
||||||
private WorkplaceInventory WorkplaceInventory { get; set; } = new();
|
private WorkplaceInventory WorkplaceInventory { get; set; } = new();
|
||||||
private List<ExternalProductListView> AvailableProducts { get; set; } = new();
|
private List<ExternalProductListView> AvailableProducts { get; set; } = new();
|
||||||
private WorkplaceDocumentDto WorkplaceDocumentDto { get; set; } = new();
|
private DocRevisionDto DocumentsDto { get; set; } = new();
|
||||||
private bool Working { get; set; } = true;
|
private bool Working { get; set; } = true;
|
||||||
private bool FormInvalid { get; set; } = true;
|
private bool FormInvalid { get; set; } = true;
|
||||||
|
private List<DocRevisionItemDto> CurDocuments { get; set; } = new();
|
||||||
|
private List<DocRevisionItemDto> NewDocuments { get; set; } = new();
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
FormContext = new EditContext(WorkplaceDocumentDto);
|
FormContext = new EditContext(DocumentsDto);
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
|
|
||||||
|
UserInfo = await UserService.GetUserInfo();
|
||||||
Workplace = await WorkplaceRepo.GetWorkplace(CompanyId, WorkplaceId);
|
Workplace = await WorkplaceRepo.GetWorkplace(CompanyId, WorkplaceId);
|
||||||
|
Logger.LogDebug("Workplace {}", JsonSerializer.Serialize(Workplace, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
|
||||||
WorkplaceInventory = await WorkplaceRepo.GetWorkplaceInventory(CompanyId, WorkplaceId);
|
WorkplaceInventory = await WorkplaceRepo.GetWorkplaceInventory(CompanyId, WorkplaceId);
|
||||||
AvailableProducts = await PublicProductRepo.GetProducts();
|
AvailableProducts = await PublicProductRepo.GetProducts();
|
||||||
|
|
||||||
|
foreach (var variant in WorkplaceInventory.Products.SelectMany(product => product.Variants))
|
||||||
|
{
|
||||||
|
CurDocuments.Add(new DocRevisionItemDto { VariantName = variant.VariantName, VariantId = variant.VariantId });
|
||||||
|
}
|
||||||
|
|
||||||
|
DocumentsDto.Items = CurDocuments;
|
||||||
|
Logger.LogDebug("Current Documents List {}", JsonSerializer.Serialize(CurDocuments, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
|
||||||
|
foreach (var variant in AvailableProducts.SelectMany(product => product.Variants))
|
||||||
|
{
|
||||||
|
var x = new DocRevisionItemDto { VariantName = variant.Name, VariantId = variant.VariantId };
|
||||||
|
if (!CurDocuments.Contains(x))
|
||||||
|
{
|
||||||
|
NewDocuments.Add(x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Logger.LogDebug("New Documents List {}", JsonSerializer.Serialize(NewDocuments, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
|
||||||
|
|
||||||
|
DocumentsDto.GlovesStorage = Workplace.GlovesStorage;
|
||||||
|
DocumentsDto.GogglesStorage = Workplace.GogglesStorage;
|
||||||
|
DocumentsDto.MaskStorage = Workplace.MaskStorage;
|
||||||
|
DocumentsDto.ProductStorage = Workplace.ProductStorage;
|
||||||
|
DocumentsDto.EyeCleanerLocation = Workplace.EyeCleanerLocation;
|
||||||
|
DocumentsDto.FirstAidLocation = Workplace.FirstAidStorage;
|
||||||
|
DocumentsDto.WasteDeposit = Workplace.WasteDeposit;
|
||||||
|
|
||||||
|
DocumentsDto.ApprovedDate = $"{DateTime.Now:yyyy-MM-dd}";
|
||||||
|
DocumentsDto.AuthoredBy = $"{UserInfo.FirstName} {UserInfo.LastName}";
|
||||||
|
DocumentsDto.FollowupDate = $"{DateTime.Now.AddMonths(24):yyyy-MM-dd}";
|
||||||
|
|
||||||
Working = false;
|
Working = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SubmitForm()
|
private void SubmitForm()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
Interceptor.DisposeEvent();
|
Interceptor.DisposeEvent();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -23,13 +23,13 @@
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-8">
|
||||||
<h2>@Company.Name</h2>
|
<span class="h3">Arbejdssteder @Company.Name</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-2">
|
||||||
<a class="btn btn-primary" href="/advisor/customers/@CompanyId"><i class="bi-chevron-left"></i> Stamkort</a>
|
<a class="btn btn-primary" href="/advisor/customers/@CompanyId"><i class="bi-chevron-left"></i> Stamkort</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-2">
|
||||||
<a class="btn btn-primary" href="/advisor/customers/@CompanyId/workplaces/new"><i class="bi-plus-lg"></i> Arbejdssted</a>
|
<a class="btn btn-primary" href="/advisor/customers/@CompanyId/workplaces/new"><i class="bi-plus-lg"></i> Arbejdssted</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -29,7 +29,9 @@ public partial class CrmCustomerWorkplaceListPage : IDisposable
|
||||||
// ###############################################################
|
// ###############################################################
|
||||||
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
|
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
|
||||||
[Inject] public ICrmCustomerRepository CustomerRepo { get; set; }
|
[Inject] public ICrmCustomerRepository CustomerRepo { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
|
[Inject] public NavigationManager Navigator { get; set; }
|
||||||
|
|
||||||
|
|
||||||
// ###############################################################
|
// ###############################################################
|
||||||
[Parameter] public string CompanyId { get; set; } = "";
|
[Parameter] public string CompanyId { get; set; } = "";
|
||||||
|
@ -50,15 +52,14 @@ public partial class CrmCustomerWorkplaceListPage : IDisposable
|
||||||
await Task.Delay(150);
|
await Task.Delay(150);
|
||||||
|
|
||||||
Workplaces = await WorkplaceRepo.GetWorkplaces(CompanyId);
|
Workplaces = await WorkplaceRepo.GetWorkplaces(CompanyId);
|
||||||
|
if (Workplaces.Count == 1)
|
||||||
|
{
|
||||||
|
Navigator.NavigateTo($"/advisor/customers/{CompanyId}/workplaces/{Workplaces[0].WorkplaceId}");
|
||||||
|
}
|
||||||
|
|
||||||
Working = false;
|
Working = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<List<WorkplaceListView>> GetWorkplaces()
|
|
||||||
{
|
|
||||||
return await WorkplaceRepo.GetWorkplaces(CompanyId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
<PageTitle>@Company.Name - Opret Arbejdssted</PageTitle>
|
<PageTitle>@Company.Name - Opret Arbejdssted</PageTitle>
|
||||||
<div class="row g-1 mb-3">
|
<div class="row g-1 mb-3">
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
<h3>@Company.Name Opret Arbejdssted</h3>
|
@Company.Name - Opret Arbejdssted
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-2">
|
||||||
<a class="btn btn-primary" href="/advisor/customers/@CompanyId"><i class="bi-chevron-left"></i> Stamkort</a>
|
<a class="btn btn-primary" href="/advisor/customers/@CompanyId"><i class="bi-chevron-left"></i> Stamkort</a>
|
||||||
|
|
|
@ -75,7 +75,9 @@ public partial class CrmCustomerWorkplaceNewPage : IDisposable
|
||||||
{
|
{
|
||||||
Logger.LogDebug("CompanyId {}", JsonSerializer.Serialize(Workplace));
|
Logger.LogDebug("CompanyId {}", JsonSerializer.Serialize(Workplace));
|
||||||
Logger.LogDebug("Workplace {}", JsonSerializer.Serialize(Workplace, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
|
Logger.LogDebug("Workplace {}", JsonSerializer.Serialize(Workplace, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
|
||||||
|
|
||||||
var result = await WorkplaceRepo.CreateWorkplace(CompanyId, Workplace);
|
var result = await WorkplaceRepo.CreateWorkplace(CompanyId, Workplace);
|
||||||
|
|
||||||
Logger.LogDebug("HTTP result {}", result);
|
Logger.LogDebug("HTTP result {}", result);
|
||||||
if (!string.IsNullOrWhiteSpace(result))
|
if (!string.IsNullOrWhiteSpace(result))
|
||||||
{
|
{
|
||||||
|
|
|
@ -17,19 +17,28 @@
|
||||||
@using Wonky.Client.Components
|
@using Wonky.Client.Components
|
||||||
@attribute [Authorize(Roles = "Advisor")]
|
@attribute [Authorize(Roles = "Advisor")]
|
||||||
@page "/advisor/customers/{CompanyId}/workplaces/{WorkplaceId}"
|
@page "/advisor/customers/{CompanyId}/workplaces/{WorkplaceId}"
|
||||||
|
|
||||||
<PageTitle>@Workplace.CompanyName - @Workplace.Name</PageTitle>
|
<PageTitle>@Workplace.CompanyName - @Workplace.Name</PageTitle>
|
||||||
|
|
||||||
<div class="row -mb-3">
|
<div class="row -mb-3">
|
||||||
<div class="col-sm-4">
|
<div class="col-sm-8">
|
||||||
<h2>@Workplace.CompanyName</h2>
|
@Workplace.CompanyName
|
||||||
</div>
|
|
||||||
<div class="col-sm-4">
|
|
||||||
<h3>@Workplace.Name @(!string.IsNullOrWhiteSpace(Workplace.Description) ? $"- {Workplace.Description}" : "")</h3>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-2">
|
||||||
<a class="btn btn-primary" href="/advisor/customers/@CompanyId"><i class="bi-chevron-left"></i> Stamkort</a>
|
<a class="btn btn-primary" href="/advisor/customers/@CompanyId"><i class="bi-chevron-left"></i> Stamkort</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2 text-end">
|
<div class="col-sm-2 text-end">
|
||||||
<a class="btn btn-primary" href="/advisor/customers/@CompanyId/workplaces"><i class="bi-chevron-left"></i> Tilbage</a>
|
@if (OnlyOne)
|
||||||
|
{
|
||||||
|
<a class="btn btn-primary" href="/advisor/customers/@CompanyId"><i class="bi-chevron-left"></i> Tilbage</a>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<a class="btn btn-primary" href="/advisor/customers/@CompanyId/workplaces"><i class="bi-chevron-left"></i> Tilbage</a>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-12">
|
||||||
|
@Workplace.Name @(!string.IsNullOrWhiteSpace(Workplace.Description) ? $" ({Workplace.Description})" : "")
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -114,11 +123,11 @@
|
||||||
<a class="btn btn-primary" href="@Workplace.ShortUrl" target="_blank"><i class="bi-list-ul"></i> Vis QR-koder</a>
|
<a class="btn btn-primary" href="@Workplace.ShortUrl" target="_blank"><i class="bi-list-ul"></i> Vis QR-koder</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3 text-end">
|
<div class="col-sm-3 text-end">
|
||||||
<button class="btn btn-primary"><i class="bi-plus-lg"></i> Produkt(er)</button>
|
<a class="btn btn-primary" href="/advisor/customers/@CompanyId/workplaces/@WorkplaceId/documents/new"><i class="bi-pencil-square"></i> Opret / Ændre</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-6">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<label class="input-group-text" for="qrlink">
|
<label class="input-group-text" for="qrlink" @onclick="@OnCopyLink">
|
||||||
<i class="bi-clipboard-plus"></i>
|
<i class="bi-clipboard-plus"></i>
|
||||||
</label>
|
</label>
|
||||||
<input class="form-control text-muted" id="qrlink" type="text" readonly value="@Workplace.ShortUrl"/>
|
<input class="form-control text-muted" id="qrlink" type="text" readonly value="@Workplace.ShortUrl"/>
|
||||||
|
|
|
@ -65,6 +65,7 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
|
||||||
private string _copyButtonText = CopyText;
|
private string _copyButtonText = CopyText;
|
||||||
private string _copyButtonStyle = CopyStyle;
|
private string _copyButtonStyle = CopyStyle;
|
||||||
private DocView SelectedProduct { get; set; } = new();
|
private DocView SelectedProduct { get; set; } = new();
|
||||||
|
private bool OnlyOne { get; set; } = true;
|
||||||
|
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
|
@ -75,10 +76,12 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
|
||||||
|
|
||||||
Interceptor.RegisterEvent();
|
Interceptor.RegisterEvent();
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
|
var x = await Workplaces.GetWorkplaces(CompanyId);
|
||||||
|
OnlyOne = x.Count is 1;
|
||||||
|
await Task.Delay(250);
|
||||||
Workplace = await Workplaces.GetWorkplace(CompanyId, WorkplaceId);
|
Workplace = await Workplaces.GetWorkplace(CompanyId, WorkplaceId);
|
||||||
WorkplaceInventory = await WorkplaceRepo.GetWorkplaceInventory(CompanyId, WorkplaceId);
|
WorkplaceInventory = await WorkplaceRepo.GetWorkplaceInventory(CompanyId, WorkplaceId);
|
||||||
|
|
||||||
DocViews = GenerateDocumentListView();
|
DocViews = GenerateDocumentListView();
|
||||||
Working = false;
|
Working = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,7 +84,7 @@ public partial class OfficeOrderCreatePage : IDisposable
|
||||||
|
|
||||||
// #############################################################
|
// #############################################################
|
||||||
// lists
|
// lists
|
||||||
private List<ProductInventoryView> CompanyInventory { get; set; } = new();
|
private List<ProductInventoryItemView> CompanyInventory { get; set; } = new();
|
||||||
private InvoiceListView CompanyInvoices { get; set; } = new();
|
private InvoiceListView CompanyInvoices { get; set; } = new();
|
||||||
private List<ReportItemView> CompanyActivities { get; set; } = new();
|
private List<ReportItemView> CompanyActivities { get; set; } = new();
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,7 @@ public class AuthStateProvider : AuthenticationStateProvider
|
||||||
from role in userInfo.AssignedRoles
|
from role in userInfo.AssignedRoles
|
||||||
where role.Assigned select new Claim(ClaimTypes.Role, role.Name)
|
where role.Assigned select new Claim(ClaimTypes.Role, role.Name)
|
||||||
);
|
);
|
||||||
|
claims.Add( new Claim(ClaimTypes.Role, userInfo.CountryCode));
|
||||||
|
|
||||||
// return the authState for the user
|
// return the authState for the user
|
||||||
return new AuthenticationState(
|
return new AuthenticationState(
|
||||||
|
|
|
@ -1,146 +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 GNU Affero 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
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
|
||||||
*@
|
|
||||||
|
|
||||||
|
|
||||||
@inject IWebAssemblyHostEnvironment HostEnvironment
|
|
||||||
@using Wonky.Client.Components;
|
|
||||||
@using Wonky.Entity.Views
|
|
||||||
@using Blazored.LocalStorage
|
|
||||||
|
|
||||||
<div class="top-row ps-3 navbar navbar-dark">
|
|
||||||
<div class="container-fluid">
|
|
||||||
<a class="navbar-brand" href="/"><TopbarDisplayUser /></a>
|
|
||||||
<button title="Navigation menu" class="navbar-toggler" onclick="@ToggleNavMenu">
|
|
||||||
<span class="navbar-toggler-icon"></span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="@NavMenuCssClass" onclick="@ToggleNavMenu">
|
|
||||||
<nav class="flex-column">
|
|
||||||
<AuthorizeView>
|
|
||||||
<NotAuthorized>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/" Match="NavLinkMatch.All">
|
|
||||||
<i class="bi-person-workspace pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Start
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/login">
|
|
||||||
<i class="bi-lock pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Log ind
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
</NotAuthorized>
|
|
||||||
</AuthorizeView>
|
|
||||||
|
|
||||||
<AuthorizeView Roles="Admin,Office,Warehouse">
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/office/country">
|
|
||||||
<i class="bi-people pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Sælgere
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/office/customers/dk">
|
|
||||||
<i class="bi-building pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Kunder DK
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/office/customers/no">
|
|
||||||
<i class="bi-building pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Kunder NO
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/office/customers/se">
|
|
||||||
<i class="bi-building pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Kunder SE
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/warehouse/orders/none">
|
|
||||||
<i class="bi-box pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Forsendelse
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
</AuthorizeView>
|
|
||||||
|
|
||||||
<AuthorizeView Roles="Advisor">
|
|
||||||
<Authorized>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/home">
|
|
||||||
<i class="bi-calendar pe-2" style="font-size:1.3em;" aria-hidden="true"></i> ToDo
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/catalog">
|
|
||||||
<i class="bi-file-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Priskatalog
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/advisor/customers">
|
|
||||||
<i class="bi-building pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Firmaer
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/advisor/agreements">
|
|
||||||
<i class="bi-calculator pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Aftaler/Tilbud
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/advisor/activity-today">
|
|
||||||
<i class="bi-activity pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Aktivitet
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/advisor/reports">
|
|
||||||
<i class="bi-file-earmark-spreadsheet pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Dagsrapporter
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
</Authorized>
|
|
||||||
</AuthorizeView>
|
|
||||||
|
|
||||||
<AuthorizeView Roles="Admin">
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/system">
|
|
||||||
<i class="bi-gear-wide-connected pe-2" style="font-size:1.3em;" aria-hidden="true"></i> System
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
</AuthorizeView>
|
|
||||||
|
|
||||||
<AuthorizeView Roles="Admin,Advisor,Office,Supervisor,Warehouse">
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/info">
|
|
||||||
<i class="bi-question pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Hjælp
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
<div class="nav-item px-3">
|
|
||||||
<NavLink class="nav-link ps-2" href="/logout">
|
|
||||||
<i class="bi-lock pe-2" style="font-size:1.3em;" aria-hidden="true"></i> Log af
|
|
||||||
</NavLink>
|
|
||||||
</div>
|
|
||||||
</AuthorizeView>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
|
|
||||||
private bool collapseNavMenu = true;
|
|
||||||
|
|
||||||
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
|
|
||||||
|
|
||||||
private void ToggleNavMenu()
|
|
||||||
{
|
|
||||||
collapseNavMenu = !collapseNavMenu;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,81 +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 GNU Affero 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
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see [https://www.gnu.org/licenses/agpl-3.0.en.html]
|
|
||||||
*/
|
|
||||||
.navbar-toggler {
|
|
||||||
background-color: rgba(255, 255, 255, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.top-row {
|
|
||||||
height: 3.5rem;
|
|
||||||
background-color: rgba(0,0,0,0.4);
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-brand {
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.oi {
|
|
||||||
width: 2rem;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
vertical-align: text-top;
|
|
||||||
top: -2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-item {
|
|
||||||
font-size: 0.9rem;
|
|
||||||
padding-bottom: 0.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-item:first-of-type {
|
|
||||||
padding-top: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-item:last-of-type {
|
|
||||||
padding-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-item ::deep a {
|
|
||||||
color: #d7d7d7;
|
|
||||||
border-radius: 4px;
|
|
||||||
height: 3rem;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
line-height: 3rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-item ::deep a.active {
|
|
||||||
background-color: rgba(255,255,255,0.25);
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-item ::deep a:hover {
|
|
||||||
background-color: rgba(255,255,255,0.1);
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.list-group.panel > .list-group-item {
|
|
||||||
border-bottom-right-radius: 4px;
|
|
||||||
border-bottom-left-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 1025px) {
|
|
||||||
.navbar-toggler {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapse {
|
|
||||||
/* Never collapse the sidebar for wide screens */
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -34,6 +34,7 @@
|
||||||
<Content Remove="wwwroot\icons\**" />
|
<Content Remove="wwwroot\icons\**" />
|
||||||
<Content Remove="Pages\AdvisorCustomerOrderViewPage.razor" />
|
<Content Remove="Pages\AdvisorCustomerOrderViewPage.razor" />
|
||||||
<Content Remove="Pages\OfficeUserAdvisorViewEditPage.razor" />
|
<Content Remove="Pages\OfficeUserAdvisorViewEditPage.razor" />
|
||||||
|
<Content Remove="Shared\NavMenu-backup.razor" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"appInfo": {
|
"appInfo": {
|
||||||
"name": "Wonky Online",
|
"name": "Wonky Online",
|
||||||
"version": "147.0",
|
"version": "148.0",
|
||||||
"rc": true,
|
"rc": true,
|
||||||
"sandBox": false,
|
"sandBox": true,
|
||||||
"image": "grumpy-coder.png"
|
"image": "grumpy-coder.png"
|
||||||
},
|
},
|
||||||
"Logging": {
|
"Logging": {
|
||||||
|
|
|
@ -25,7 +25,7 @@ html, body {
|
||||||
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1:focus {
|
h1,h2:focus {
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,7 +217,6 @@ a, .btn-link {
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
box-shadow: rgba(0, 0, 0, 0.2) 0 -1px 7px 1px, inset #006 0 -1px 9px, #3F8CFF 0 2px 14px;
|
box-shadow: rgba(0, 0, 0, 0.2) 0 -1px 7px 1px, inset #006 0 -1px 9px, #3F8CFF 0 2px 14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* end led elements */
|
/* end led elements */
|
||||||
|
|
||||||
/*#blazor-error-ui {*/
|
/*#blazor-error-ui {*/
|
||||||
|
|
|
@ -78,8 +78,7 @@ public class CompanyDto
|
||||||
public string SalesRep { get; set; } = "";
|
public string SalesRep { get; set; } = "";
|
||||||
|
|
||||||
public string SalesRepId { get; set; } = "";
|
public string SalesRepId { get; set; } = "";
|
||||||
|
|
||||||
[Required(ErrorMessage = "Segment skal vælges - AUTO eller INDUSTRI")]
|
|
||||||
public string Segment { get; set; } = "";
|
public string Segment { get; set; } = "";
|
||||||
|
|
||||||
public int ValidVat { get; set; }
|
public int ValidVat { get; set; }
|
||||||
|
|
|
@ -15,26 +15,13 @@
|
||||||
|
|
||||||
namespace Wonky.Entity.Views;
|
namespace Wonky.Entity.Views;
|
||||||
|
|
||||||
public class ProductInventoryView
|
public class ProductInventoryItemView
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// entity description
|
|
||||||
/// </summary>
|
|
||||||
public string Description { get; set; } = "";
|
|
||||||
/// <summary>
|
|
||||||
/// entity item number
|
|
||||||
/// </summary>
|
|
||||||
public string Sku { get; set; } = "";
|
|
||||||
/// <summary>
|
|
||||||
/// quantity bought over time
|
|
||||||
/// </summary>
|
|
||||||
public int Quantity { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// Product has been discontinued
|
|
||||||
/// </summary>
|
|
||||||
public bool Discontinued { get; set; }
|
|
||||||
/// <summary>
|
|
||||||
/// Virtual checkmark
|
|
||||||
/// </summary>
|
|
||||||
public virtual bool Check { get; set; }
|
public virtual bool Check { get; set; }
|
||||||
|
public string Description { get; set; } = "";
|
||||||
|
public bool Discontinued { get; set; }
|
||||||
|
public string PictureLink { get; set; } = "";
|
||||||
|
public int Quantity { get; set; }
|
||||||
|
public string Sku { get; set; } = "";
|
||||||
|
public string VendorItemNo { get; set; } = "";
|
||||||
}
|
}
|
|
@ -6,5 +6,6 @@ public class WorkplaceProductVariant
|
||||||
{
|
{
|
||||||
public string VariantName { get; set; } = "";
|
public string VariantName { get; set; } = "";
|
||||||
public string VariantId { get; set; } = "";
|
public string VariantId { get; set; } = "";
|
||||||
|
public string VendorItemNo { get; set; } = "";
|
||||||
public List<WorkplaceProductVariantDoc> Docs { get; set; } = new();
|
public List<WorkplaceProductVariantDoc> Docs { get; set; } = new();
|
||||||
}
|
}
|
Loading…
Reference in a new issue