wip: v148.1

This commit is contained in:
Frede Hundewadt 2023-05-28 14:12:20 +02:00
parent f90e745e1a
commit 7111ec5676
18 changed files with 261 additions and 292 deletions

View file

@ -18,6 +18,7 @@ using System.Text.RegularExpressions;
using Wonky.Client.Enums;
using Wonky.Client.Models;
using Wonky.Entity.DTO;
using Wonky.Entity.Views;
namespace Wonky.Client.Helpers;
@ -26,6 +27,85 @@ namespace Wonky.Client.Helpers;
/// </summary>
public static class Utils
{
public static List<WorkplaceDocItemDto> GenerateRevListView(IEnumerable<WorkplaceProduct> products)
{
var result = new List<WorkplaceDocItemDto>();
var docProducts = products.OrderBy(x => x.TradingName).ToList();
foreach (var product in docProducts)
{
foreach (var variant in product.Variants)
{
var newDoc = new WorkplaceDocItemDto
{
ProductId = product.ProductId,
VariantId = variant.VariantId,
VariantName = variant.VariantName,
};
var docs = variant.Docs.OrderBy(x => x.DocumentTypeEnum).ToList();
foreach (var doc in docs)
{
switch (doc.DocumentTypeEnum.ToLower())
{
case "apb":
newDoc.ApbDocId = doc.DocumentId;
break;
case "apv":
newDoc.ApvDocId = doc.DocumentId;
newDoc.S5A = doc.S5A;
newDoc.S9A = doc.S9A;
break;
}
}
result.Add(newDoc);
}
}
return result.OrderBy(x => x.VariantName).ToList();
}
public static List<DocView> GenerateDocListView(IEnumerable<WorkplaceProduct> products)
{
var result = new List<DocView>();
var docProducts = products.OrderBy(x => x.TradingName).ToList();
foreach (var product in docProducts)
{
foreach (var variant in product.Variants)
{
var newDoc = new DocView
{
ProductId = product.ProductId,
VariantId = variant.VariantId,
VariantName = variant.VariantName,
DocumentDate = variant.Docs[0].DocumentDate
};
var docs = variant.Docs.OrderBy(x => x.DocumentTypeEnum).ToList();
foreach (var doc in docs)
{
switch (doc.DocumentTypeEnum.ToLower())
{
case "apb":
newDoc.ApbDocLink = doc.DocumentLink;
newDoc.ApbDocId = doc.DocumentId;
break;
case "apv":
newDoc.ApvDocLink = doc.DocumentLink;
newDoc.ApvDocId = doc.DocumentId;
break;
}
}
result.Add(newDoc);
}
}
return result.OrderBy(x => x.VariantName).ToList();
}
public static List<EmailContact> ParseRecipientsFromString(string recipients)
{
var addresses = recipients
@ -42,11 +122,7 @@ public static class Utils
}).ToList();
}
/// <summary>
/// map user role edit model to role assignment model
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public static List<UserRoleAssignment> MapSaveAssignedRoles(RoleAssignment model)
{
return new List<UserRoleAssignment>()
@ -62,11 +138,7 @@ public static class Utils
};
}
/// <summary>
/// map user role assignment to edit model
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public static RoleAssignment MapEditAssignedRoles(UserManagerEditView model)
{
var x = new RoleAssignment();
@ -103,11 +175,7 @@ public static class Utils
return x;
}
/// <summary>
/// Sanitize string by removing everything but digits
/// </summary>
/// <param name="digitString"></param>
/// <returns></returns>
public static string StringToDigits(string digitString)
{
if (string.IsNullOrWhiteSpace(digitString))
@ -116,16 +184,13 @@ public static class Utils
return regexObj.Replace(digitString, "");
}
/// <summary>
/// Validate string is only numbers
/// </summary>
/// <param name="check"></param>
/// <returns></returns>
private static bool IsDigitsOnly(string check)
{
return check.All(c => c is >= '0' and <= '9');
}
public static bool Validate(ValidateType validateType, string toValidate)
{
return validateType switch
@ -138,12 +203,7 @@ public static class Utils
};
}
/// <summary>
/// validate password to contain a-z and A-Z and 0-9
/// </summary>
/// <param name="toValidate"></param>
/// <param name="length">optional (default 10)</param>
/// <returns></returns>
public static bool IsValidPasswd(string toValidate, int length = 10)
{
if (toValidate.Length < length)
@ -170,11 +230,7 @@ public static class Utils
return validConditions == 3;
}
/// <summary>
/// return Country Name from countryCode
/// </summary>
/// <param name="countryCode"></param>
/// <returns></returns>
public static string CountryName(string countryCode)
{
return countryCode.ToLower() switch
@ -186,11 +242,7 @@ public static class Utils
};
}
/// <summary>
/// Helper to parse querystring
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
public static Dictionary<string, string> ParseQuery(string query)
{
if (string.IsNullOrWhiteSpace(query) || query.Contains("://"))
@ -206,11 +258,7 @@ public static class Utils
.ToDictionary(element => element[0], element => element[1]);
}
/// <summary>
/// Validate email format
/// </summary>
/// <param name="email"></param>
/// <returns></returns>
public static bool IsValidEmail(string email)
{
var trimmedEmail = email.Trim();
@ -231,41 +279,25 @@ public static class Utils
}
}
/// <summary>
/// return enum as the string value
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public static string EnumToString(Enum value)
{
return value.ToString();
}
/// <summary>
/// Parse string to enum of T
/// </summary>
/// <param name="value"></param>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static T StringToEnum<T>(string value)
{
return (T)Enum.Parse(typeof(T), value, true);
}
/// <summary>
/// Generate unique hashcode from time
/// </summary>
/// <returns></returns>
public static int GetHashFromNow()
{
return DateTime.Now.ToFileTimeUtc().GetHashCode();
}
/// <summary>
/// Get visit state as colored icon
/// </summary>
/// <param name="dtNextVisit"></param>
/// <returns></returns>
public static string GetVisitState(string dtNextVisit)
{
if (dtNextVisit is "0001-01-01" or "1970-01-01")
@ -281,11 +313,7 @@ public static class Utils
return dtNow > dtNext.AddDays(-14) ? "the-bad" : "the-good";
}
/// <summary>
/// Translate process status to icon
/// </summary>
/// <param name="processStatus"></param>
/// <returns></returns>
public static string GetProcessStatus(string processStatus)
{
return processStatus.ToLower() switch

View file

@ -74,18 +74,29 @@ public class CrmWorkplaceRepository : ICrmWorkplaceRepository
}
public async Task<WorkplaceInventory> GetWorkplaceInventory(string companyId, string workplaceId)
public async Task<WorkplaceDocInfo> GetDocuments(string companyId, string workplaceId)
{
var result = await _client.GetAsync(
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents");
var content = await result.Content.ReadAsStringAsync();
if (!result.IsSuccessStatusCode || string.IsNullOrWhiteSpace(content))
{
return new WorkplaceInventory();
return new WorkplaceDocInfo();
}
return JsonSerializer.Deserialize<WorkplaceInventory>(content, _options) ?? new WorkplaceInventory();
return JsonSerializer.Deserialize<WorkplaceDocInfo>(content, _options) ?? new WorkplaceDocInfo();
}
public async Task<WorkplaceDocInfo> GetRevisionList(string companyId, string workplaceId)
{
var result = await _client.GetAsync(
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents/revision");
var content = await result.Content.ReadAsStringAsync();
if (!result.IsSuccessStatusCode || string.IsNullOrWhiteSpace(content))
{
return new WorkplaceDocInfo();
}
return JsonSerializer.Deserialize<WorkplaceDocInfo>(content, _options) ?? new WorkplaceDocInfo();
}
public async Task<string> CreateWorkplace(string companyId, WorkplaceDto workplace)
{
@ -114,14 +125,14 @@ public class CrmWorkplaceRepository : ICrmWorkplaceRepository
}
public async Task DeleteWorkplaceDocuments(string companyId, string workplaceId, string documentId)
public async Task DeleteDocument(string companyId, string workplaceId, string documentId)
{
await _client.DeleteAsync(
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents/{documentId}");
}
public async Task DeleteWorkplaceDocuments(string companyId, string workplaceId, string apbDocumentId, string apvDocumentId)
public async Task DeleteVariantDocuments(string companyId, string workplaceId, string apbDocumentId, string apvDocumentId)
{
await _client.DeleteAsync(
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents/{apvDocumentId}");

View file

@ -18,74 +18,24 @@ using Wonky.Entity.Views;
namespace Wonky.Client.HttpRepository;
/// <summary>
/// Interface for handling Customer Workplaces (chemical document service)
/// </summary>
public interface ICrmWorkplaceRepository
{
/// <summary>
/// Get Workplaces for given customer id
/// </summary>
/// <param name="companyId"></param>
/// <returns></returns>
Task<List<WorkplaceListView>> GetWorkplaces(string companyId);
/// <summary>
/// Get specific workplace using customer id and workplace id
/// </summary>
/// <param name="companyId"></param>
/// <param name="workplaceId"></param>
/// <returns></returns>
Task<WorkplaceDto> GetWorkplace(string companyId, string workplaceId);
/// <summary>
/// Create new workplace given the customer id and workplace data
/// </summary>
/// <param name="companyId"></param>
/// <param name="workplace"></param>
/// <returns></returns>
Task<string> CreateWorkplace(string companyId, WorkplaceDto workplace);
/// <summary>
/// Update workplace given the customer id and updated data
/// </summary>
/// <param name="companyId"></param>
/// <param name="workplace"></param>
/// <returns></returns>
Task UpdateWorkplace(string companyId, WorkplaceDto workplace);
/// <summary>
/// Delete workplace given customer id and workplace id
/// </summary>
/// <param name="companyId"></param>
/// <param name="workplaceId"></param>
/// <returns></returns>
Task DeleteWorkplace(string companyId, string workplaceId);
/// <summary>
/// Get list of products and documentation for workplace
/// </summary>
/// <param name="companyId"></param>
/// <param name="workplaceId"></param>
/// <returns></returns>
Task<WorkplaceInventory> GetWorkplaceInventory(string companyId, string workplaceId);
/// <summary>
/// Remove single document by Id
/// </summary>
/// <param name="companyId"></param>
/// <param name="workplaceId"></param>
/// <param name="documentId"></param>
/// <returns></returns>
Task DeleteWorkplaceDocuments(string companyId, string workplaceId, string documentId);
Task<WorkplaceDocInfo> GetDocuments(string companyId, string workplaceId);
/// <summary>
/// Remove a document pair from the workplace
/// </summary>
/// <param name="companyId"></param>
/// <param name="workplaceId"></param>
/// <param name="apvDocumentId"></param>
/// <param name="apbDocumentId"></param>
/// <returns></returns>
Task DeleteWorkplaceDocuments(string companyId, string workplaceId, string apbDocumentId, string apvDocumentId);
Task<WorkplaceDocInfo> GetRevisionList(string companyId, string workplaceId);
Task DeleteDocument(string companyId, string workplaceId, string documentId);
Task DeleteVariantDocuments(string companyId, string workplaceId, string apbDocumentId, string apvDocumentId);
}

View file

@ -1,10 +0,0 @@
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; } = "";
}

View file

@ -3,7 +3,7 @@ using Wonky.Entity.DTO;
namespace Wonky.Client.Models;
public class DocRevisionDto
public class WorkplaceDocDto
{
[Required] public string EyeCleanerLocation { get; set; } = "";
[Required]public string FirstAidLocation { get; set; } = "";
@ -17,14 +17,17 @@ public class DocRevisionDto
[Required]public string ApprovedDate { get; set; } = "";
[Required]public string FollowupDate { get; set; } = "";
public List<DocRevisionItemDto> Items { get; set; } = new();
public List<WorkplaceDocItemDto> Items { get; set; } = new();
}
public class DocRevisionItemDto
public class WorkplaceDocItemDto
{
public string VariantId { get; set; } = "";
public string VariantName { get; set; } = "";
public string ApbDocId { get; set; } = "";
public string ApvDocId { get; set; } = "";
public string ProductId { get; set; } = "";
public string S5A { get; set; } = "";
public string S9A { get; set; } = "";
public bool Selected { get; set; } = true;
public bool Selected { get; set; }
public string VariantId { get; set; } = "";
public string VariantName { get; set; } = "";
}

View file

@ -22,8 +22,8 @@ namespace Wonky.Client.OverlayDocuments;
public partial class ProductSelectionOverlay
{
//###############################################################
[Parameter] public List<DocSelectDisplay> CurProducts { get; set; } = new();
[Parameter] public List<DocSelectDisplay> NewProducts { get; set; } = new();
[Parameter] public List<DocView> CurProducts { get; set; } = new();
[Parameter] public List<DocView> NewProducts { get; set; } = new();
[Parameter] public EventCallback<ExternalProductVariantView> OnSelected { get; set; }
//###############################################################

View file

@ -28,12 +28,12 @@
</div>
}
<div class="row pt-2 pb-2 mb-2 rounded rounded-2 bg-dark text-white">
<div class="col-sm-8">
<div class="col-sm-7">
<div class="mt-1">
<span class="h3">@Company.Name</span> <span>(@Company.Account)</span>
</div>
</div>
<div class="col-sm-2">
<div class="col-sm-3 text-end">
@if (AppInfo!.Value!.Rc)
{
@if (UserInfo.CountryCode is "DK")
@ -106,9 +106,9 @@
<ValidationMessage For="@(() => Company.Mobile)"></ValidationMessage>
</div>
@* Email *@
<label for="email" class="col-sm-1 col-form-label-sm">EAN</label>
<label for="eanNumber" class="col-sm-1 col-form-label-sm">EAN</label>
<div class="col-sm-5">
<InputText id="email" class="form-control" @bind-Value="Company.EanNumber" readonly="@(ErpEditDisabled)"/>
<InputText id="eanNumber" class="form-control" @bind-Value="Company.EanNumber" readonly="@(ErpEditDisabled)"/>
<ValidationMessage For="@(() => Company.EanNumber)"></ValidationMessage>
</div>
@ -288,7 +288,7 @@
<InputDate id="nextVisit" class="form-control" @bind-Value="@(NextVisit)"/>
</div>
</div>
<label for="lastVisit" class="col-sm-1 col-form-label-sm">Sidse besøg</label>
<label for="lastVisit" class="col-sm-1 col-form-label-sm">Sidste besøg</label>
<div class="col-sm-3">
<InputDate id="lastVisit" class="form-control" @bind-Value="@LastVisit"/>
</div>

View file

@ -24,7 +24,7 @@ using Wonky.Entity.Views;
namespace Wonky.Client.Pages;
public partial class CrmCustomerWorkplaceListPage : IDisposable
public partial class AdvisorCustomerWorkplaceListPage : IDisposable
{
// ###############################################################
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }

View file

@ -25,14 +25,14 @@ namespace Wonky.Client.Pages;
#pragma warning disable CS8618
public partial class CrmCustomerWorkplaceNewPage : IDisposable
public partial class AdvisorCustomerWorkplaceNewPage : IDisposable
{
// ###############################################################
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public ICrmCustomerRepository CustomerRepo { get; set; }
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
[Inject] public IToastService Toaster { get; set; }
[Inject] public ILogger<CrmCustomerWorkplaceNewPage> Logger { get; set; }
[Inject] public ILogger<AdvisorCustomerWorkplaceNewPage> Logger { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
// ###############################################################

View file

@ -20,7 +20,7 @@
<PageTitle>@Workplace.CompanyName - @Workplace.Name</PageTitle>
<div class="row mb-3">
<div class="col-sm-8">
<span class="h3">@Workplace.CompanyName</span>
<span class="h3"> @Workplace.CompanyName</span>
</div>
<div class="col-sm-2">
@* <a class="btn btn-primary" href="/advisor/customers/@CompanyId"><i class="bi-chevron-left"></i> Stamkort</a> *@
@ -88,34 +88,34 @@
</div>
</div>
<div class="row g-3 mb-3">
<div class="col-sm-12 col-md-6">
<div class="col-sm-12 col-md-3">
<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>
<InputText id="approvedDate" class="form-control" @bind-Value="DocumentsDto.ApprovedDate" placeholder="Oprettet dato"/>
<label for="approvedDate">Oprettet dato</label>
<ValidationMessage For="@(() => DocumentsDto.ApprovedBy)"></ValidationMessage>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div class="col-sm-12 col-md-3">
<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="col-sm-12 col-md-3">
<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-3">
<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 class="row mb-5">
<div class="col-sm-4 d-flex">
@ -138,22 +138,28 @@
</div>
</div>
</div>
@foreach (var doc in DocumentsDto.Items)
@foreach (var item in DocumentsDto.Items)
{
<div class="list-group-item">
<div class="row">
<div class="col-sm-4">
<span class="fw-bold">@doc.VariantName.ToUpperInvariant()</span>
<span class="fw-bold">@item.VariantName.ToUpperInvariant()</span>
</div>
<div class="col-sm-2">
<InputCheckbox id="@doc.VariantId" class="form-check" @bind-Value="@doc.Selected" />
<div class="col-sm-1">
<InputCheckbox id="@item.VariantId" class="form-check" @bind-Value="@item.Selected" />
</div>
<div class="col-sm-1">
<button type="button" class="btn btn-danger btn-sm" @onclick="@(() => OnConfirmDeleteVariant(item))">
<i class="bi-trash"></i>
</button>
</div>
<div class="col-sm-3">
@item.S5A
</div>
<div class="col-sm-3">
@doc.S5A
</div>
<div class="col-sm-3">
@doc.S9A
@item.S9A
</div>
</div>
</div>
}
@ -170,6 +176,7 @@
<WorkingThreeDots/>
}
<ConfirmDeleteModal BodyMessage="@DeleteMessage" OnOkClicked="RemoveVariant" @ref="ConfirmDeleteVariant"/>
@*
<div class="col-sm-12 col-md-6">

View file

@ -30,14 +30,14 @@ using Wonky.Client.Helpers;
#pragma warning disable CS8618
namespace Wonky.Client.Pages;
public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable
public partial class AdvisorCustomerWorkplaceRevisionPage : IDisposable
{
// #############################################################
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
[Inject] public ICrmPublicProductRepository PublicProductRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
[Inject] public ILogger<CrmCustomerWorkplaceDocumentAddPage> Logger { get; set; }
[Inject] public ILogger<AdvisorCustomerWorkplaceRevisionPage> Logger { get; set; }
[Inject] public IToastService Toaster { get; set; }
[Inject] public IUserInfoService UserService { get; set; }
@ -49,14 +49,18 @@ public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable
private UserManagerEditView UserInfo { get; set; }
private EditContext FormContext { get; set; }
private WorkplaceDto Workplace { get; set; } = new();
private WorkplaceInventory WorkplaceInventory { get; set; } = new();
private WorkplaceDocInfo WorkplaceInfo { get; set; } = new();
private List<ExternalProductListView> AvailableProducts { get; set; } = new();
private DocRevisionDto DocumentsDto { get; set; } = new();
private WorkplaceDocDto DocumentsDto { get; set; } = new();
private bool Working { get; set; } = true;
private bool FormInvalid { get; set; } = true;
private List<DocRevisionItemDto> CurDocuments { get; set; } = new();
private List<DocRevisionItemDto> NewDocuments { get; set; } = new();
private List<WorkplaceDocItemDto> CurrentItems { get; set; } = new();
private List<WorkplaceDocItemDto> NewDocuments { get; set; } = new();
private WorkplaceDocItemDto SelectedItem { get; set; } = new();
private ConfirmDeleteModal ConfirmDeleteVariant { get; set; }
private string DeleteMessage { get; set; } = "";
protected override async Task OnInitializedAsync()
{
FormContext = new EditContext(DocumentsDto);
@ -64,28 +68,29 @@ public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable
Interceptor.RegisterBeforeSendEvent();
UserInfo = await UserService.GetUserInfo();
Workplace = await WorkplaceRepo.GetWorkplace(CompanyId, WorkplaceId);
Logger.LogDebug("Workplace {}", JsonSerializer.Serialize(Workplace, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
WorkplaceInventory = await WorkplaceRepo.GetWorkplaceInventory(CompanyId, WorkplaceId);
AvailableProducts = await PublicProductRepo.GetProducts();
WorkplaceInfo = await WorkplaceRepo.GetRevisionList(CompanyId, WorkplaceId);
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)));
CurrentItems = Utils.GenerateRevListView(WorkplaceInfo.Products);
Logger.LogDebug("Current Items List {}", JsonSerializer.Serialize(CurrentItems, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
// create list with variants not in the current variant list
foreach (var variant in AvailableProducts.SelectMany(product => product.Variants))
{
var x = new DocRevisionItemDto { VariantName = variant.Name, VariantId = variant.VariantId };
if (!CurDocuments.Contains(x))
var x = new WorkplaceDocItemDto { VariantName = variant.Name, VariantId = variant.VariantId };
if (!CurrentItems.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;
@ -98,6 +103,8 @@ public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable
DocumentsDto.AuthoredBy = $"{UserInfo.FirstName} {UserInfo.LastName}";
DocumentsDto.FollowupDate = $"{DateTime.Now.AddMonths(24):yyyy-MM-dd}";
DocumentsDto.Items = CurrentItems;
Working = false;
}
@ -105,6 +112,37 @@ public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable
{
}
private void OnConfirmDeleteVariant(WorkplaceDocItemDto selectedItem)
{
SelectedItem = selectedItem;
DeleteMessage = $"Bekræft at du sletter<br/><strong>{selectedItem.VariantName}</strong> fra <strong>{Workplace.CompanyName}</strong>?<br/>AL INFORMATION slettes og handlingen er uigenkaldelig.";
Logger.LogDebug("ConfirmDeleteProduct");
ConfirmDeleteVariant.Show();
}
private async Task RemoveVariant()
{
if (Working)
{
return;
}
Working = true;
var item = WorkplaceInfo
.Products
.First(x => x.ProductId == SelectedItem.ProductId);
await WorkplaceRepo
.DeleteVariantDocuments(CompanyId, WorkplaceId, SelectedItem.ApbDocId, SelectedItem.ApvDocId);
WorkplaceInfo.Products.Remove(item);
CurrentItems = Utils.GenerateRevListView(WorkplaceInfo.Products);
Toaster.ShowInfo("Produkt dokumenter er slettet.");
SelectedItem = new WorkplaceDocItemDto();
Working = false;
}
public void Dispose()
{
Interceptor.DisposeEvent();

View file

@ -123,7 +123,7 @@
<a class="btn btn-primary" href="@Workplace.ShortUrl" target="_blank"><i class="bi-list-ul"></i> Vis QR-koder</a>
</div>
<div class="col-sm-3 text-end">
<a class="btn btn-primary" href="/advisor/customers/@CompanyId/workplaces/@WorkplaceId/documents/new"><i class="bi-pencil-square"></i> Opret / Ændre</a>
<a class="btn btn-primary" href="/advisor/customers/@CompanyId/workplaces/@WorkplaceId/documents/new"><i class="bi-pencil-square"></i> Revision</a>
</div>
<div class="col-sm-12 col-md-6">
<div class="input-group">
@ -141,13 +141,13 @@
</label>
<input class="form-control" id="mailto" type="email" placeholder="Email adresse(r) (max 3)"
@bind-Value:event="onchange" @bind-Value="LinkRecipients" required/>
<button type="button" class="btn btn-primary" onclick="@OnSendLink">Send Link</button>
<button type="button" class="@_linkButtonStyle" onclick="@OnSendLink">@_linkButtonText</button>
</div>
</div>
</div>
</li>
@if (WorkplaceInventory.Products.Any())
@if (WorkplaceDocInfo.Products.Any())
{
@foreach (var docView in DocViews)
{
@ -162,9 +162,6 @@
<a class="btn btn-dark btn-sm" href="@docView.ApvDocLink" target="_blank"><i class="bi-filetype-html"></i> Kemisk Risiko Vurdering</a>
</div>
<div class="col-sm-1">
<button type="button" class="btn btn-danger btn-sm" @onclick="@(() => OnConfirmDeleteVariant(docView))">
<i class="bi-trash"></i>
</button>
</div>
<div class="col-sm-2">
@docView.DocumentDate
@ -187,4 +184,3 @@
}
<ConfirmDeleteModal BodyMessage="@DeleteMessage" OnOkClicked="RemoveWorkplace" @ref="ConfirmDeleteWorkplace"/>
<ConfirmDeleteModal BodyMessage="@DeleteMessage" OnOkClicked="RemoveVariant" @ref="ConfirmDeleteVariant"/>

View file

@ -30,7 +30,7 @@ using Wonky.Client.Helpers;
#pragma warning disable CS8618
namespace Wonky.Client.Pages;
public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
public partial class AdvisorCustomerWorkplaceViewEditPage : IDisposable
{
// #############################################################
[Inject] public ICrmWorkplaceRepository Workplaces { get; set; }
@ -38,7 +38,7 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
[Inject] public HttpInterceptorService Interceptor { get; set; }
[Inject] public NavigationManager Navigator { get; set; }
[Inject] public ILogger<CrmCustomerWorkplaceViewEditPage> Logger { get; set; }
[Inject] public ILogger<AdvisorCustomerWorkplaceViewEditPage> Logger { get; set; }
[Inject] public ISystemSendMailService SendMail { get; set; }
[Inject] public IUserInfoService UserInfo { get; set; }
[Inject] public IClipboardService Clipboard { get; set; }
@ -52,10 +52,9 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
private WorkplaceDto Workplace { get; set; } = new();
private EditContext WorkplaceContext { get; set; }
private bool Working { get; set; } = true;
private WorkplaceInventory WorkplaceInventory { get; set; } = new();
private WorkplaceDocInfo WorkplaceDocInfo { get; set; } = new();
private List<DocView> DocViews { get; set; } = new();
private ConfirmDeleteModal ConfirmDeleteWorkplace { get; set; }
private ConfirmDeleteModal ConfirmDeleteVariant { get; set; }
private string DeleteMessage { get; set; } = "";
private string LinkRecipients { get; set; } = "";
private const string CopyText = "Kopier";
@ -64,7 +63,17 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
private const string CopySuccessStyle = "btn btn-success";
private string _copyButtonText = CopyText;
private string _copyButtonStyle = CopyStyle;
private DocView SelectedProduct { get; set; } = new();
private const string LinkText = "Send Link";
private const string LinkStyle = "btn btn-primary";
private const string LinkSuccessText = "Link Sendt";
private const string LinkSuccessStyle = "btn btn-success";
private const string LinkFailText = "Link ikke Sendt";
private const string LinkFailStyle = "btn btn-danger";
private const string LinkSendingText = "Arbejder";
private const string LinkSendingStyle = "btn btn-warning";
private string _linkButtonText = LinkText;
private string _linkButtonStyle = LinkStyle;
private bool OnlyOne { get; set; } = true;
@ -79,10 +88,12 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
var x = await Workplaces.GetWorkplaces(CompanyId);
OnlyOne = x.Count is 1;
await Task.Delay(250);
Workplace = await Workplaces.GetWorkplace(CompanyId, WorkplaceId);
WorkplaceInventory = await WorkplaceRepo.GetWorkplaceInventory(CompanyId, WorkplaceId);
DocViews = GenerateDocumentListView();
Workplace = await Workplaces.GetWorkplace(CompanyId, WorkplaceId);
WorkplaceDocInfo = await WorkplaceRepo.GetDocuments(CompanyId, WorkplaceId);
DocViews = Utils.GenerateDocListView(WorkplaceDocInfo.Products);
Working = false;
}
@ -94,6 +105,8 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
return;
}
Logger.LogDebug("email.To => {}", LinkRecipients);
_linkButtonText = LinkSendingText;
_linkButtonStyle = LinkSendingStyle;
var bodyText = new StringBuilder();
bodyText.AppendLine("Produkt oversigt med QR-koder findes ved at følge linket nedenfor.");
@ -126,12 +139,20 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
var result = await SendMail.SendMail("system", email);
if (result.IsSuccess)
{
Toaster.ShowSuccess("Email er sendt");
_linkButtonText = LinkSuccessText;
_linkButtonStyle = LinkSuccessStyle;
StateHasChanged();
await Task.Delay(TimeSpan.FromSeconds(2));
}
else
{
Toaster.ShowWarning("Email er ikke sendt.");
_linkButtonText = LinkFailText;
_linkButtonStyle = LinkFailStyle;
StateHasChanged();
await Task.Delay(TimeSpan.FromSeconds(2));
}
_linkButtonText = LinkText;
_linkButtonStyle = LinkStyle;
}
}
@ -188,83 +209,6 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
}
private void OnConfirmDeleteVariant(DocView selectedProduct)
{
SelectedProduct = selectedProduct;
DeleteMessage = $"Bekræft at du sletter<br/><strong>{selectedProduct.VariantName}</strong> fra <strong>{Workplace.CompanyName}</strong>?<br/>AL INFORMATION slettes og handlingen er uigenkaldelig.";
Logger.LogDebug("ConfirmDeleteProduct");
ConfirmDeleteVariant.Show();
}
private async Task RemoveVariant()
{
if (Working)
{
return;
}
Working = true;
var product = WorkplaceInventory
.Products
.First(x => x.ProductId == SelectedProduct.ProductId);
await WorkplaceRepo
.DeleteWorkplaceDocuments(CompanyId, WorkplaceId, SelectedProduct.ApbDocId, SelectedProduct.ApvDocId);
WorkplaceInventory.Products.Remove(product);
DocViews = GenerateDocumentListView();
Toaster.ShowInfo("Produkt dokumenter er slettet.");
Working = false;
}
private List<DocView> GenerateDocumentListView()
{
var docViews = new List<DocView>();
var docProducts = WorkplaceInventory.Products.OrderBy(x => x.TradingName).ToList();
foreach (var product in docProducts)
{
foreach (var variant in product.Variants)
{
var newDoc = new DocView
{
ProductId = product.ProductId,
VariantId = variant.VariantId,
VariantName = variant.VariantName,
DocumentDate = variant.Docs[0].DocumentDate
};
var docs = variant.Docs.OrderBy(x => x.DocumentTypeEnum).ToList();
foreach (var doc in docs)
{
switch (doc.DocumentTypeEnum.ToLower())
{
case "apb":
newDoc.ApbDocLink = doc.DocumentLink;
newDoc.ApbDocId = doc.DocumentId;
break;
case "apv":
newDoc.ApvDocLink = doc.DocumentLink;
newDoc.ApvDocId = doc.DocumentId;
break;
}
}
docViews.Add(newDoc);
}
}
return docViews.OrderBy(x => x.VariantName).ToList();
}
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
{

View file

@ -1,9 +1,9 @@
{
"appInfo": {
"name": "Wonky Online",
"version": "148.0",
"version": "148.1",
"rc": true,
"sandBox": true,
"sandBox": false,
"image": "grumpy-coder.png"
},
"Logging": {

View file

@ -3,7 +3,7 @@ using System.Diagnostics.Contracts;
namespace Wonky.Entity.Views;
public class WorkplaceInventory
public class WorkplaceDocInfo
{
public string WorkplaceId { get; set; } = "";
public string CompanyName { get; set; } = "";

View file

@ -6,5 +6,7 @@ public class WorkplaceProductVariantDoc
public string DocumentTypeEnum { get; set; } = "";
public string DocumentDescription { get; set; } = "";
public string DocumentDate { get; set; } = "";
public string DocumentLink { get; set; } = "";
public string DocumentLink { get; set; } = "";
public string S5A { get; set; } = "";
public string S9A { get; set; } = "";
}