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.Enums;
|
||||||
using Wonky.Client.Models;
|
using Wonky.Client.Models;
|
||||||
using Wonky.Entity.DTO;
|
using Wonky.Entity.DTO;
|
||||||
|
using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Helpers;
|
namespace Wonky.Client.Helpers;
|
||||||
|
|
||||||
|
@ -26,6 +27,85 @@ namespace Wonky.Client.Helpers;
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static class Utils
|
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)
|
public static List<EmailContact> ParseRecipientsFromString(string recipients)
|
||||||
{
|
{
|
||||||
var addresses = recipients
|
var addresses = recipients
|
||||||
|
@ -42,11 +122,7 @@ public static class Utils
|
||||||
}).ToList();
|
}).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)
|
public static List<UserRoleAssignment> MapSaveAssignedRoles(RoleAssignment model)
|
||||||
{
|
{
|
||||||
return new List<UserRoleAssignment>()
|
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)
|
public static RoleAssignment MapEditAssignedRoles(UserManagerEditView model)
|
||||||
{
|
{
|
||||||
var x = new RoleAssignment();
|
var x = new RoleAssignment();
|
||||||
|
@ -103,11 +175,7 @@ public static class Utils
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Sanitize string by removing everything but digits
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="digitString"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static string StringToDigits(string digitString)
|
public static string StringToDigits(string digitString)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(digitString))
|
if (string.IsNullOrWhiteSpace(digitString))
|
||||||
|
@ -116,16 +184,13 @@ public static class Utils
|
||||||
return regexObj.Replace(digitString, "");
|
return regexObj.Replace(digitString, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Validate string is only numbers
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="check"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
private static bool IsDigitsOnly(string check)
|
private static bool IsDigitsOnly(string check)
|
||||||
{
|
{
|
||||||
return check.All(c => c is >= '0' and <= '9');
|
return check.All(c => c is >= '0' and <= '9');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static bool Validate(ValidateType validateType, string toValidate)
|
public static bool Validate(ValidateType validateType, string toValidate)
|
||||||
{
|
{
|
||||||
return validateType switch
|
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)
|
public static bool IsValidPasswd(string toValidate, int length = 10)
|
||||||
{
|
{
|
||||||
if (toValidate.Length < length)
|
if (toValidate.Length < length)
|
||||||
|
@ -170,11 +230,7 @@ public static class Utils
|
||||||
return validConditions == 3;
|
return validConditions == 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// return Country Name from countryCode
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="countryCode"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static string CountryName(string countryCode)
|
public static string CountryName(string countryCode)
|
||||||
{
|
{
|
||||||
return countryCode.ToLower() switch
|
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)
|
public static Dictionary<string, string> ParseQuery(string query)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(query) || query.Contains("://"))
|
if (string.IsNullOrWhiteSpace(query) || query.Contains("://"))
|
||||||
|
@ -206,11 +258,7 @@ public static class Utils
|
||||||
.ToDictionary(element => element[0], element => element[1]);
|
.ToDictionary(element => element[0], element => element[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Validate email format
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="email"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static bool IsValidEmail(string email)
|
public static bool IsValidEmail(string email)
|
||||||
{
|
{
|
||||||
var trimmedEmail = email.Trim();
|
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)
|
public static string EnumToString(Enum value)
|
||||||
{
|
{
|
||||||
return value.ToString();
|
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)
|
public static T StringToEnum<T>(string value)
|
||||||
{
|
{
|
||||||
return (T)Enum.Parse(typeof(T), value, true);
|
return (T)Enum.Parse(typeof(T), value, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Generate unique hashcode from time
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static int GetHashFromNow()
|
public static int GetHashFromNow()
|
||||||
{
|
{
|
||||||
return DateTime.Now.ToFileTimeUtc().GetHashCode();
|
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)
|
public static string GetVisitState(string dtNextVisit)
|
||||||
{
|
{
|
||||||
if (dtNextVisit is "0001-01-01" or "1970-01-01")
|
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";
|
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)
|
public static string GetProcessStatus(string processStatus)
|
||||||
{
|
{
|
||||||
return processStatus.ToLower() switch
|
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(
|
var result = await _client.GetAsync(
|
||||||
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents");
|
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents");
|
||||||
var content = await result.Content.ReadAsStringAsync();
|
var content = await result.Content.ReadAsStringAsync();
|
||||||
if (!result.IsSuccessStatusCode || string.IsNullOrWhiteSpace(content))
|
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)
|
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(
|
await _client.DeleteAsync(
|
||||||
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents/{documentId}");
|
$"{_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(
|
await _client.DeleteAsync(
|
||||||
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents/{apvDocumentId}");
|
$"{_api.CrmCustomers}/{companyId}/{_api.CrmWorkplaceExt}/{workplaceId}/documents/{apvDocumentId}");
|
||||||
|
|
|
@ -18,74 +18,24 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.HttpRepository;
|
namespace Wonky.Client.HttpRepository;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Interface for handling Customer Workplaces (chemical document service)
|
|
||||||
/// </summary>
|
|
||||||
public interface ICrmWorkplaceRepository
|
public interface ICrmWorkplaceRepository
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// Get Workplaces for given customer id
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="companyId"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task<List<WorkplaceListView>> GetWorkplaces(string companyId);
|
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);
|
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);
|
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);
|
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);
|
Task DeleteWorkplace(string companyId, string workplaceId);
|
||||||
|
|
||||||
/// <summary>
|
Task<WorkplaceDocInfo> GetDocuments(string companyId, string workplaceId);
|
||||||
/// 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);
|
|
||||||
|
|
||||||
/// <summary>
|
Task<WorkplaceDocInfo> GetRevisionList(string companyId, string workplaceId);
|
||||||
/// Remove a document pair from the workplace
|
|
||||||
/// </summary>
|
Task DeleteDocument(string companyId, string workplaceId, string documentId);
|
||||||
/// <param name="companyId"></param>
|
|
||||||
/// <param name="workplaceId"></param>
|
Task DeleteVariantDocuments(string companyId, string workplaceId, string apbDocumentId, string apvDocumentId);
|
||||||
/// <param name="apvDocumentId"></param>
|
|
||||||
/// <param name="apbDocumentId"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
Task DeleteWorkplaceDocuments(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;
|
namespace Wonky.Client.Models;
|
||||||
|
|
||||||
public class DocRevisionDto
|
public class WorkplaceDocDto
|
||||||
{
|
{
|
||||||
[Required] public string EyeCleanerLocation { get; set; } = "";
|
[Required] public string EyeCleanerLocation { get; set; } = "";
|
||||||
[Required]public string FirstAidLocation { get; set; } = "";
|
[Required]public string FirstAidLocation { get; set; } = "";
|
||||||
|
@ -17,14 +17,17 @@ public class DocRevisionDto
|
||||||
[Required]public string ApprovedDate { get; set; } = "";
|
[Required]public string ApprovedDate { get; set; } = "";
|
||||||
[Required]public string FollowupDate { 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 ApbDocId { get; set; } = "";
|
||||||
public string VariantName { get; set; } = "";
|
public string ApvDocId { get; set; } = "";
|
||||||
|
public string ProductId { get; set; } = "";
|
||||||
public string S5A { get; set; } = "";
|
public string S5A { get; set; } = "";
|
||||||
public string S9A { 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
|
public partial class ProductSelectionOverlay
|
||||||
{
|
{
|
||||||
//###############################################################
|
//###############################################################
|
||||||
[Parameter] public List<DocSelectDisplay> CurProducts { get; set; } = new();
|
[Parameter] public List<DocView> CurProducts { get; set; } = new();
|
||||||
[Parameter] public List<DocSelectDisplay> NewProducts { get; set; } = new();
|
[Parameter] public List<DocView> NewProducts { get; set; } = new();
|
||||||
[Parameter] public EventCallback<ExternalProductVariantView> OnSelected { get; set; }
|
[Parameter] public EventCallback<ExternalProductVariantView> OnSelected { get; set; }
|
||||||
|
|
||||||
//###############################################################
|
//###############################################################
|
||||||
|
|
|
@ -28,12 +28,12 @@
|
||||||
</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-8">
|
<div class="col-sm-7">
|
||||||
<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">
|
<div class="col-sm-3 text-end">
|
||||||
@if (AppInfo!.Value!.Rc)
|
@if (AppInfo!.Value!.Rc)
|
||||||
{
|
{
|
||||||
@if (UserInfo.CountryCode is "DK")
|
@if (UserInfo.CountryCode is "DK")
|
||||||
|
@ -106,9 +106,9 @@
|
||||||
<ValidationMessage For="@(() => Company.Mobile)"></ValidationMessage>
|
<ValidationMessage For="@(() => Company.Mobile)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
@* Email *@
|
@* 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">
|
<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>
|
<ValidationMessage For="@(() => Company.EanNumber)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -288,7 +288,7 @@
|
||||||
<InputDate id="nextVisit" class="form-control" @bind-Value="@(NextVisit)"/>
|
<InputDate id="nextVisit" class="form-control" @bind-Value="@(NextVisit)"/>
|
||||||
</div>
|
</div>
|
||||||
</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">
|
<div class="col-sm-3">
|
||||||
<InputDate id="lastVisit" class="form-control" @bind-Value="@LastVisit"/>
|
<InputDate id="lastVisit" class="form-control" @bind-Value="@LastVisit"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -24,7 +24,7 @@ using Wonky.Entity.Views;
|
||||||
|
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class CrmCustomerWorkplaceListPage : IDisposable
|
public partial class AdvisorCustomerWorkplaceListPage : IDisposable
|
||||||
{
|
{
|
||||||
// ###############################################################
|
// ###############################################################
|
||||||
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
|
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
|
|
@ -25,14 +25,14 @@ namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
#pragma warning disable CS8618
|
#pragma warning disable CS8618
|
||||||
|
|
||||||
public partial class CrmCustomerWorkplaceNewPage : IDisposable
|
public partial class AdvisorCustomerWorkplaceNewPage : IDisposable
|
||||||
{
|
{
|
||||||
// ###############################################################
|
// ###############################################################
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public ICrmCustomerRepository CustomerRepo { get; set; }
|
[Inject] public ICrmCustomerRepository CustomerRepo { get; set; }
|
||||||
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
|
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
|
||||||
[Inject] public IToastService Toaster { 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; }
|
[Inject] public NavigationManager Navigator { get; set; }
|
||||||
|
|
||||||
// ###############################################################
|
// ###############################################################
|
|
@ -20,7 +20,7 @@
|
||||||
<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-8">
|
<div class="col-sm-8">
|
||||||
<span class="h3">@Workplace.CompanyName</span>
|
<span class="h3"> @Workplace.CompanyName</span>
|
||||||
</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> *@
|
||||||
|
@ -88,34 +88,34 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<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-3">
|
||||||
<div class="form-floating">
|
<div class="form-floating">
|
||||||
<InputText id="authoredBy" class="form-control" @bind-Value="DocumentsDto.AuthoredBy" placeholder="Oprettet af"/>
|
<InputText id="approvedDate" class="form-control" @bind-Value="DocumentsDto.ApprovedDate" placeholder="Oprettet dato"/>
|
||||||
<label for="authoredBy">Oprettet af</label>
|
<label for="approvedDate">Oprettet dato</label>
|
||||||
<ValidationMessage For="@(() => DocumentsDto.AuthoredBy)"></ValidationMessage>
|
<ValidationMessage For="@(() => DocumentsDto.ApprovedBy)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-3">
|
||||||
<div class="form-floating">
|
<div class="form-floating">
|
||||||
<InputText id="followupDate" class="form-control" @bind-Value="DocumentsDto.FollowupDate" placeholder="Revisions dato"/>
|
<InputText id="followupDate" class="form-control" @bind-Value="DocumentsDto.FollowupDate" placeholder="Revisions dato"/>
|
||||||
<label for="followupDate">Revisions dato</label>
|
<label for="followupDate">Revisions dato</label>
|
||||||
<ValidationMessage For="@(() => DocumentsDto.FollowupDate)"></ValidationMessage>
|
<ValidationMessage For="@(() => DocumentsDto.FollowupDate)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</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">
|
<div class="form-floating">
|
||||||
<InputText id="approvedBy" class="form-control" @bind-Value="DocumentsDto.ApprovedBy" placeholder="Godkendt af"/>
|
<InputText id="approvedBy" class="form-control" @bind-Value="DocumentsDto.ApprovedBy" placeholder="Godkendt af"/>
|
||||||
<label for="approvedBy">Godkendt af</label>
|
<label for="approvedBy">Godkendt af</label>
|
||||||
<ValidationMessage For="@(() => DocumentsDto.ApprovedBy)"></ValidationMessage>
|
<ValidationMessage For="@(() => DocumentsDto.ApprovedBy)"></ValidationMessage>
|
||||||
</div>
|
</div>
|
||||||
</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 class="row mb-5">
|
<div class="row mb-5">
|
||||||
<div class="col-sm-4 d-flex">
|
<div class="col-sm-4 d-flex">
|
||||||
|
@ -138,22 +138,28 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@foreach (var doc in DocumentsDto.Items)
|
@foreach (var item in DocumentsDto.Items)
|
||||||
{
|
{
|
||||||
<div class="list-group-item">
|
<div class="list-group-item">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-sm-4">
|
<div class="col-sm-4">
|
||||||
<span class="fw-bold">@doc.VariantName.ToUpperInvariant()</span>
|
<span class="fw-bold">@item.VariantName.ToUpperInvariant()</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-1">
|
||||||
<InputCheckbox id="@doc.VariantId" class="form-check" @bind-Value="@doc.Selected" />
|
<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>
|
||||||
<div class="col-sm-3">
|
<div class="col-sm-3">
|
||||||
@doc.S5A
|
@item.S9A
|
||||||
</div>
|
|
||||||
<div class="col-sm-3">
|
|
||||||
@doc.S9A
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
@ -170,6 +176,7 @@
|
||||||
<WorkingThreeDots/>
|
<WorkingThreeDots/>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<ConfirmDeleteModal BodyMessage="@DeleteMessage" OnOkClicked="RemoveVariant" @ref="ConfirmDeleteVariant"/>
|
||||||
|
|
||||||
@*
|
@*
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-6">
|
|
@ -30,14 +30,14 @@ using Wonky.Client.Helpers;
|
||||||
#pragma warning disable CS8618
|
#pragma warning disable CS8618
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable
|
public partial class AdvisorCustomerWorkplaceRevisionPage : IDisposable
|
||||||
{
|
{
|
||||||
// #############################################################
|
// #############################################################
|
||||||
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
|
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
|
||||||
[Inject] public ICrmPublicProductRepository PublicProductRepo { get; set; }
|
[Inject] public ICrmPublicProductRepository PublicProductRepo { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public NavigationManager Navigator { 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 IToastService Toaster { get; set; }
|
||||||
[Inject] public IUserInfoService UserService { get; set; }
|
[Inject] public IUserInfoService UserService { get; set; }
|
||||||
|
|
||||||
|
@ -49,14 +49,18 @@ public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable
|
||||||
private UserManagerEditView UserInfo { 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 WorkplaceDocInfo WorkplaceInfo { get; set; } = new();
|
||||||
private List<ExternalProductListView> AvailableProducts { 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 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<WorkplaceDocItemDto> CurrentItems { get; set; } = new();
|
||||||
private List<DocRevisionItemDto> NewDocuments { 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()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
FormContext = new EditContext(DocumentsDto);
|
FormContext = new EditContext(DocumentsDto);
|
||||||
|
@ -64,28 +68,29 @@ public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable
|
||||||
Interceptor.RegisterBeforeSendEvent();
|
Interceptor.RegisterBeforeSendEvent();
|
||||||
|
|
||||||
UserInfo = await UserService.GetUserInfo();
|
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)));
|
Logger.LogDebug("Workplace {}", JsonSerializer.Serialize(Workplace, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
|
||||||
WorkplaceInventory = await WorkplaceRepo.GetWorkplaceInventory(CompanyId, WorkplaceId);
|
|
||||||
AvailableProducts = await PublicProductRepo.GetProducts();
|
AvailableProducts = await PublicProductRepo.GetProducts();
|
||||||
|
|
||||||
|
WorkplaceInfo = await WorkplaceRepo.GetRevisionList(CompanyId, WorkplaceId);
|
||||||
|
|
||||||
foreach (var variant in WorkplaceInventory.Products.SelectMany(product => product.Variants))
|
CurrentItems = Utils.GenerateRevListView(WorkplaceInfo.Products);
|
||||||
{
|
Logger.LogDebug("Current Items List {}", JsonSerializer.Serialize(CurrentItems, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
|
||||||
CurDocuments.Add(new DocRevisionItemDto { VariantName = variant.VariantName, VariantId = variant.VariantId });
|
|
||||||
}
|
// create list with variants not in the current variant list
|
||||||
|
|
||||||
DocumentsDto.Items = CurDocuments;
|
|
||||||
Logger.LogDebug("Current Documents List {}", JsonSerializer.Serialize(CurDocuments, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
|
|
||||||
foreach (var variant in AvailableProducts.SelectMany(product => product.Variants))
|
foreach (var variant in AvailableProducts.SelectMany(product => product.Variants))
|
||||||
{
|
{
|
||||||
var x = new DocRevisionItemDto { VariantName = variant.Name, VariantId = variant.VariantId };
|
var x = new WorkplaceDocItemDto { VariantName = variant.Name, VariantId = variant.VariantId };
|
||||||
if (!CurDocuments.Contains(x))
|
if (!CurrentItems.Contains(x))
|
||||||
{
|
{
|
||||||
NewDocuments.Add(x);
|
NewDocuments.Add(x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Logger.LogDebug("New Documents List {}", JsonSerializer.Serialize(NewDocuments, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
|
Logger.LogDebug("New Documents List {}", JsonSerializer.Serialize(NewDocuments, new JsonSerializerOptions(JsonSerializerDefaults.Web)));
|
||||||
|
|
||||||
DocumentsDto.GlovesStorage = Workplace.GlovesStorage;
|
DocumentsDto.GlovesStorage = Workplace.GlovesStorage;
|
||||||
DocumentsDto.GogglesStorage = Workplace.GogglesStorage;
|
DocumentsDto.GogglesStorage = Workplace.GogglesStorage;
|
||||||
DocumentsDto.MaskStorage = Workplace.MaskStorage;
|
DocumentsDto.MaskStorage = Workplace.MaskStorage;
|
||||||
|
@ -98,6 +103,8 @@ public partial class CrmCustomerWorkplaceDocumentAddPage : IDisposable
|
||||||
DocumentsDto.AuthoredBy = $"{UserInfo.FirstName} {UserInfo.LastName}";
|
DocumentsDto.AuthoredBy = $"{UserInfo.FirstName} {UserInfo.LastName}";
|
||||||
DocumentsDto.FollowupDate = $"{DateTime.Now.AddMonths(24):yyyy-MM-dd}";
|
DocumentsDto.FollowupDate = $"{DateTime.Now.AddMonths(24):yyyy-MM-dd}";
|
||||||
|
|
||||||
|
DocumentsDto.Items = CurrentItems;
|
||||||
|
|
||||||
Working = false;
|
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()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
Interceptor.DisposeEvent();
|
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>
|
<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">
|
||||||
<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>
|
||||||
<div class="col-sm-12 col-md-6">
|
<div class="col-sm-12 col-md-6">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
|
@ -141,13 +141,13 @@
|
||||||
</label>
|
</label>
|
||||||
<input class="form-control" id="mailto" type="email" placeholder="Email adresse(r) (max 3)"
|
<input class="form-control" id="mailto" type="email" placeholder="Email adresse(r) (max 3)"
|
||||||
@bind-Value:event="onchange" @bind-Value="LinkRecipients" required/>
|
@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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@if (WorkplaceInventory.Products.Any())
|
@if (WorkplaceDocInfo.Products.Any())
|
||||||
{
|
{
|
||||||
@foreach (var docView in DocViews)
|
@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>
|
<a class="btn btn-dark btn-sm" href="@docView.ApvDocLink" target="_blank"><i class="bi-filetype-html"></i> Kemisk Risiko Vurdering</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-1">
|
<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>
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-2">
|
||||||
@docView.DocumentDate
|
@docView.DocumentDate
|
||||||
|
@ -187,4 +184,3 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
<ConfirmDeleteModal BodyMessage="@DeleteMessage" OnOkClicked="RemoveWorkplace" @ref="ConfirmDeleteWorkplace"/>
|
<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
|
#pragma warning disable CS8618
|
||||||
namespace Wonky.Client.Pages;
|
namespace Wonky.Client.Pages;
|
||||||
|
|
||||||
public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
|
public partial class AdvisorCustomerWorkplaceViewEditPage : IDisposable
|
||||||
{
|
{
|
||||||
// #############################################################
|
// #############################################################
|
||||||
[Inject] public ICrmWorkplaceRepository Workplaces { get; set; }
|
[Inject] public ICrmWorkplaceRepository Workplaces { get; set; }
|
||||||
|
@ -38,7 +38,7 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
|
||||||
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
|
[Inject] public ICrmWorkplaceRepository WorkplaceRepo { get; set; }
|
||||||
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
[Inject] public HttpInterceptorService Interceptor { get; set; }
|
||||||
[Inject] public NavigationManager Navigator { 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 ISystemSendMailService SendMail { get; set; }
|
||||||
[Inject] public IUserInfoService UserInfo { get; set; }
|
[Inject] public IUserInfoService UserInfo { get; set; }
|
||||||
[Inject] public IClipboardService Clipboard { get; set; }
|
[Inject] public IClipboardService Clipboard { get; set; }
|
||||||
|
@ -52,10 +52,9 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
|
||||||
private WorkplaceDto Workplace { get; set; } = new();
|
private WorkplaceDto Workplace { get; set; } = new();
|
||||||
private EditContext WorkplaceContext { get; set; }
|
private EditContext WorkplaceContext { get; set; }
|
||||||
private bool Working { get; set; } = true;
|
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 List<DocView> DocViews { get; set; } = new();
|
||||||
private ConfirmDeleteModal ConfirmDeleteWorkplace { get; set; }
|
private ConfirmDeleteModal ConfirmDeleteWorkplace { get; set; }
|
||||||
private ConfirmDeleteModal ConfirmDeleteVariant { get; set; }
|
|
||||||
private string DeleteMessage { get; set; } = "";
|
private string DeleteMessage { get; set; } = "";
|
||||||
private string LinkRecipients { get; set; } = "";
|
private string LinkRecipients { get; set; } = "";
|
||||||
private const string CopyText = "Kopier";
|
private const string CopyText = "Kopier";
|
||||||
|
@ -64,7 +63,17 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
|
||||||
private const string CopySuccessStyle = "btn btn-success";
|
private const string CopySuccessStyle = "btn btn-success";
|
||||||
private string _copyButtonText = CopyText;
|
private string _copyButtonText = CopyText;
|
||||||
private string _copyButtonStyle = CopyStyle;
|
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;
|
private bool OnlyOne { get; set; } = true;
|
||||||
|
|
||||||
|
|
||||||
|
@ -79,10 +88,12 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
|
||||||
var x = await Workplaces.GetWorkplaces(CompanyId);
|
var x = await Workplaces.GetWorkplaces(CompanyId);
|
||||||
OnlyOne = x.Count is 1;
|
OnlyOne = x.Count is 1;
|
||||||
await Task.Delay(250);
|
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;
|
Working = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +105,8 @@ public partial class CrmCustomerWorkplaceViewEditPage : IDisposable
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Logger.LogDebug("email.To => {}", LinkRecipients);
|
Logger.LogDebug("email.To => {}", LinkRecipients);
|
||||||
|
_linkButtonText = LinkSendingText;
|
||||||
|
_linkButtonStyle = LinkSendingStyle;
|
||||||
|
|
||||||
var bodyText = new StringBuilder();
|
var bodyText = new StringBuilder();
|
||||||
bodyText.AppendLine("Produkt oversigt med QR-koder findes ved at følge linket nedenfor.");
|
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);
|
var result = await SendMail.SendMail("system", email);
|
||||||
if (result.IsSuccess)
|
if (result.IsSuccess)
|
||||||
{
|
{
|
||||||
Toaster.ShowSuccess("Email er sendt");
|
_linkButtonText = LinkSuccessText;
|
||||||
|
_linkButtonStyle = LinkSuccessStyle;
|
||||||
|
StateHasChanged();
|
||||||
|
await Task.Delay(TimeSpan.FromSeconds(2));
|
||||||
}
|
}
|
||||||
else
|
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)
|
private void HandleFieldChanged(object sender, FieldChangedEventArgs e)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"appInfo": {
|
"appInfo": {
|
||||||
"name": "Wonky Online",
|
"name": "Wonky Online",
|
||||||
"version": "148.0",
|
"version": "148.1",
|
||||||
"rc": true,
|
"rc": true,
|
||||||
"sandBox": true,
|
"sandBox": false,
|
||||||
"image": "grumpy-coder.png"
|
"image": "grumpy-coder.png"
|
||||||
},
|
},
|
||||||
"Logging": {
|
"Logging": {
|
||||||
|
|
|
@ -3,7 +3,7 @@ using System.Diagnostics.Contracts;
|
||||||
|
|
||||||
namespace Wonky.Entity.Views;
|
namespace Wonky.Entity.Views;
|
||||||
|
|
||||||
public class WorkplaceInventory
|
public class WorkplaceDocInfo
|
||||||
{
|
{
|
||||||
public string WorkplaceId { get; set; } = "";
|
public string WorkplaceId { get; set; } = "";
|
||||||
public string CompanyName { get; set; } = "";
|
public string CompanyName { get; set; } = "";
|
|
@ -6,5 +6,7 @@ public class WorkplaceProductVariantDoc
|
||||||
public string DocumentTypeEnum { get; set; } = "";
|
public string DocumentTypeEnum { get; set; } = "";
|
||||||
public string DocumentDescription { get; set; } = "";
|
public string DocumentDescription { get; set; } = "";
|
||||||
public string DocumentDate { 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