wip: v148.1
This commit is contained in:
parent
f90e745e1a
commit
7111ec5676
18 changed files with 261 additions and 292 deletions
|
@ -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
|
||||
|
|
|
@ -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}");
|
||||
|
|
|
@ -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);
|
||||
}
|
|
@ -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; } = "";
|
||||
}
|
|
@ -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; } = "";
|
||||
}
|
|
@ -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; }
|
||||
|
||||
//###############################################################
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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; }
|
|
@ -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; }
|
||||
|
||||
// ###############################################################
|
|
@ -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">
|
|
@ -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();
|
|
@ -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"/>
|
|
@ -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)
|
||||
{
|
||||
|
|
@ -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": {
|
||||
|
|
|
@ -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; } = "";
|
|
@ -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; } = "";
|
||||
}
|
Loading…
Reference in a new issue