- orderByDate()">Order Date
- orderByCode()">Order Number
+ Order Date
+ Order Number
Order Description
Doors Number
Model Number
@@ -29,7 +29,7 @@ else
@item.OrderDescript
@item.NumDoors
@item.NumType
- @item.OrderStatus
+ @getOrderStatusLabel(item.OrderStatus)
@($"{item.TotCost:C2}")
@*
diff --git a/WebDoorCreator.UI/Components/Order/OrderList.razor.cs b/WebDoorCreator.UI/Components/Order/OrderList.razor.cs
index ff6e4a2..4368ab5 100644
--- a/WebDoorCreator.UI/Components/Order/OrderList.razor.cs
+++ b/WebDoorCreator.UI/Components/Order/OrderList.razor.cs
@@ -1,3 +1,4 @@
+using EgwCoreLib.Razor;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.DataProtection;
@@ -29,6 +30,17 @@ namespace WebDoorCreator.UI.Components.Order
[Inject]
protected WebDoorCreatorService WDService { get; set; } = null!;
+ private bool sortAsc = true;
+
+ private string sortField = "";
+
+ protected async Task SortRequested(Sorter.SortCallBack e)
+ {
+ sortField = e.ParamName;
+ sortAsc = e.IsAscending;
+ await ReloadData();
+ }
+
[Parameter]
public EventCallback
updateRecordCount { get; set; }
@@ -89,11 +101,6 @@ namespace WebDoorCreator.UI.Components.Order
#region Protected Methods
- //protected override async Task OnInitializedAsync()
- //{
- // //await SetSelectedData();
- //}
-
protected override async Task OnParametersSetAsync()
{
//if (B_doorChaged)
@@ -107,6 +114,7 @@ namespace WebDoorCreator.UI.Components.Order
#region Private Fields
private List? ListOrdersStatus = null;
+ private List? ListValuesAll = null;
#endregion Private Fields
@@ -161,37 +169,55 @@ namespace WebDoorCreator.UI.Components.Order
var domani = DateTime.Today.AddDays(1);
ListOrdersStatus = null;
await Task.Delay(1);
+
+ ListValuesAll = await WDService.ListValuesGetAll("All", "OrderStep");
+
if (userClaims != null)
{
var SearchRecords = await WDService.OrderStatusGetFilt(userCurrCompany, orderStatus, dateFrom, dateTo);
if (SearchRecords != null)
{
- if (orderType == Core.Enum.orderTypeEnum.DateAscending)
- {
- SearchRecords = SearchRecords.OrderBy(x => x.DateIns).ToList();
- }
- else if (orderType == Core.Enum.orderTypeEnum.DateDescending)
- {
- SearchRecords = SearchRecords.OrderByDescending(x => x.OrderExtCode).ToList();
- }
- else if (orderType == Core.Enum.orderTypeEnum.CodeAscending)
- {
- SearchRecords = SearchRecords.OrderBy(x => x.OrderExtCode).ToList();
- }
- else if (orderType == Core.Enum.orderTypeEnum.CodeDescending)
- {
- SearchRecords = SearchRecords.OrderByDescending(x => x.OrderExtCode).ToList();
- }
-
totalCount = SearchRecords.Count;
if (searchVal != "")
{
- ListOrdersStatus = SearchRecords.Where(x=>x.OrderDescript.Contains(searchVal) || x.OrderExtCode.Contains(searchVal)).Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
+ ListOrdersStatus = SearchRecords
+ .Where(x => x.OrderDescript.ToLower().Contains(searchVal.ToLower()) || x.OrderExtCode.ToLower().Contains(searchVal.ToLower()))
+ .Skip(numRecord * (currPage - 1))
+ .Take(numRecord)
+ .ToList();
}
else
{
ListOrdersStatus = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
}
+ if (!string.IsNullOrEmpty(sortField))
+ {
+ switch (sortField)
+ {
+ case "OrderDate":
+ if (sortAsc)
+ {
+ ListOrdersStatus = SearchRecords.OrderBy(x => x.DateIns).ToList();
+ }
+ else
+ {
+ ListOrdersStatus = SearchRecords.OrderByDescending(x => x.DateIns).ToList();
+ }
+ break;
+ default:
+ case "OrderNumber":
+ if (sortAsc)
+ {
+ ListOrdersStatus = SearchRecords.OrderBy(x => x.OrderExtCode).ToList();
+ }
+ else
+ {
+ ListOrdersStatus = SearchRecords.OrderByDescending(x => x.OrderExtCode).ToList();
+ }
+ break;
+ }
+ }
+
}
}
await Task.Delay(1);
@@ -247,8 +273,24 @@ namespace WebDoorCreator.UI.Components.Order
protected Core.Enum.orderTypeEnum orderType = Core.Enum.orderTypeEnum.none;
-
+
#endregion Private Methods
+
+ protected string getOrderStatusLabel(int orderStat)
+ {
+ string answ = "";
+
+ if (ListValuesAll != null)
+ {
+ var currOrdStat = ListValuesAll.Where(x => int.Parse(x.Value) == orderStat).FirstOrDefault();
+ if (currOrdStat != null)
+ {
+ answ = currOrdStat.Label;
+ }
+ }
+
+ return answ;
+ }
}
}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Components/Order/OrderStatusStep.razor b/WebDoorCreator.UI/Components/Order/OrderStatusStep.razor
index d37b7a7..62d6ef8 100644
--- a/WebDoorCreator.UI/Components/Order/OrderStatusStep.razor
+++ b/WebDoorCreator.UI/Components/Order/OrderStatusStep.razor
@@ -8,17 +8,17 @@
@if (int.Parse(item.Value) == CurrOrderStatus)
{
-
+
}
else
{
@if (int.Parse(item.Value) < CurrOrderStatus)
{
-
+
}
else
{
-
+
}
}
diff --git a/WebDoorCreator.UI/Components/Report/ReportList.razor b/WebDoorCreator.UI/Components/Report/ReportList.razor
new file mode 100644
index 0000000..bbf73c9
--- /dev/null
+++ b/WebDoorCreator.UI/Components/Report/ReportList.razor
@@ -0,0 +1,27 @@
+@if (DoorOps != null)
+{
+ @*@getTranslatedLabel(@item.ObjectId) @getTemplate(item)
*@
+
+
+
+
+ Object Name
+ Template
+ Approved By:
+ Approval Date
+
+
+
+ @foreach (var item in DoorOps)
+ {
+
+ @getTranslatedLabel(@item.ObjectId)
+ @getTemplate(item)
+ @item.userConfirm
+ @item.DtConfirm
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Components/Report/ReportList.razor.cs b/WebDoorCreator.UI/Components/Report/ReportList.razor.cs
new file mode 100644
index 0000000..da3a6be
--- /dev/null
+++ b/WebDoorCreator.UI/Components/Report/ReportList.razor.cs
@@ -0,0 +1,68 @@
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Razor.Language.Extensions;
+using Microsoft.Build.Framework;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using WebDoorCreator.Data.DbModels;
+using WebDoorCreator.UI.Data;
+
+namespace WebDoorCreator.UI.Components.Report
+{
+ public partial class ReportList
+ {
+ [Parameter]
+ public int doorId { get; set; } = 0;
+
+ [Parameter]
+ public string Lingua { get; set; } = "EN";
+
+ protected List? DoorOps { get; set; } = null;
+
+ [Inject]
+ protected WebDoorCreatorService WDService { get; set; } = null!;
+ [Inject]
+ protected WDCVocabularyService WDVService { get; set; } = null!;
+
+ protected string getTemplate(DoorOpModel currDoorOp)
+ {
+ string answ = "";
+
+ answ = currDoorOp.CurrVals["template"];
+
+ return answ;
+
+ }
+
+ protected string getTranslatedLabel(string HwId)
+ {
+ string answ = "";
+ var listHw = Task.Run(async () => await WDService.ListValuesGetAll(HwId, "Hardware")).Result;
+ if (listHw != null)
+ {
+ var hw2Translate = listHw.FirstOrDefault();
+ if (hw2Translate != null)
+ {
+
+ answ = translate(hw2Translate.Label);
+ }
+ }
+ return answ;
+ }
+
+ protected async override Task OnParametersSetAsync()
+ {
+ var result = await WDService.DoorOpGetByDoorId(doorId);
+ if (result != null)
+ {
+ DoorOps = result.Where(x => x.ObjectId != "Size" && x.ObjectId != "Profiles" && x.ObjectId != "Swing" && x.ObjectId != "Properties" && x.ObjectId != "Finishing").ToList();
+ }
+ }
+ protected string translate(string lemma)
+ {
+ string answ = "";
+
+ answ = WDVService.Traduci(Lingua, lemma);
+
+ return answ;
+ }
+ }
+}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Components/Report/ReportList.razor.css b/WebDoorCreator.UI/Components/Report/ReportList.razor.css
new file mode 100644
index 0000000..61d5045
--- /dev/null
+++ b/WebDoorCreator.UI/Components/Report/ReportList.razor.css
@@ -0,0 +1,14 @@
+tr {
+ padding: 0.5rem;
+ border-bottom: 1px solid;
+ font-weight: bold;
+ background-color: #fff;
+ color: #000;
+}
+table {
+ width: 100%;
+ height: 100%;
+}
+td {
+ padding: 0.5rem;
+}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Components/Report/ReportList.razor.less b/WebDoorCreator.UI/Components/Report/ReportList.razor.less
new file mode 100644
index 0000000..4e51dfd
--- /dev/null
+++ b/WebDoorCreator.UI/Components/Report/ReportList.razor.less
@@ -0,0 +1,16 @@
+tr {
+ padding: 0.5rem;
+ border-bottom: 1px solid;
+ font-weight: bold;
+ background-color: #fff;
+ color: #000;
+}
+
+table {
+ width: 100%;
+ height: 100%;
+}
+
+td {
+ padding: 0.5rem;
+}
diff --git a/WebDoorCreator.UI/Components/Report/ReportList.razor.min.css b/WebDoorCreator.UI/Components/Report/ReportList.razor.min.css
new file mode 100644
index 0000000..4d7b32b
--- /dev/null
+++ b/WebDoorCreator.UI/Components/Report/ReportList.razor.min.css
@@ -0,0 +1 @@
+tr{padding:.5rem;border-bottom:1px solid;font-weight:bold;background-color:#fff;color:#000;}table{width:100%;height:100%;}td{padding:.5rem;}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Components/SvgComp/DoorSvgObj.razor b/WebDoorCreator.UI/Components/SvgComp/DoorSvgObj.razor
index 825b422..c49079b 100644
--- a/WebDoorCreator.UI/Components/SvgComp/DoorSvgObj.razor
+++ b/WebDoorCreator.UI/Components/SvgComp/DoorSvgObj.razor
@@ -1,16 +1,17 @@
+
- @foreach (var item in TextData)
- {
-
- @item.Key
-
-
- @item.Value
-
- }
+ @foreach (var item in TextData)
+ {
+
+ @item.Key
+
+
+ @item.Value
+
+ }
diff --git a/WebDoorCreator.UI/Components/SvgComp/DoorSvgObj.razor.cs b/WebDoorCreator.UI/Components/SvgComp/DoorSvgObj.razor.cs
index 7555d2f..b7ddb01 100644
--- a/WebDoorCreator.UI/Components/SvgComp/DoorSvgObj.razor.cs
+++ b/WebDoorCreator.UI/Components/SvgComp/DoorSvgObj.razor.cs
@@ -7,7 +7,7 @@ namespace WebDoorCreator.UI.Components.SvgComp
#region Public Properties
[Parameter]
- public EventCallback EC_ExeFunct { get; set; }
+ public EventCallback EC_ExeFunct { get; set; }
[Parameter]
public string ImagePath { get; set; } = "images/LogoEgw.png";
@@ -34,7 +34,14 @@ namespace WebDoorCreator.UI.Components.SvgComp
public string TextStyle { get; set; } = "font-size: 1.5em; fill: #000;";
[Parameter]
- public string Message { get; set; } = "";
+ public string Message1 { get; set; } = "";
+ [Parameter]
+ public string Message2 { get; set; } = "";
+
+ [Parameter]
+ public string LeftTextClass { get; set; } = "";
+ [Parameter]
+ public string RightTextClass { get; set; } = "";
#endregion Public Properties
@@ -64,7 +71,7 @@ namespace WebDoorCreator.UI.Components.SvgComp
protected void execFunc()
{
- EC_ExeFunct.InvokeAsync(Message);
+ EC_ExeFunct.InvokeAsync(true);
}
protected override void OnParametersSet()
diff --git a/WebDoorCreator.UI/Components/SvgComp/HomeCard.razor b/WebDoorCreator.UI/Components/SvgComp/HomeCard.razor
new file mode 100644
index 0000000..4fc943d
--- /dev/null
+++ b/WebDoorCreator.UI/Components/SvgComp/HomeCard.razor
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @TitleText
+
+
+ @BodyText
+
+
+ raiseEvent()">
+ @ButtonText
+
+
+
+
+
+
diff --git a/WebDoorCreator.UI/Components/SvgComp/HomeCard.razor.cs b/WebDoorCreator.UI/Components/SvgComp/HomeCard.razor.cs
new file mode 100644
index 0000000..3e07d2e
--- /dev/null
+++ b/WebDoorCreator.UI/Components/SvgComp/HomeCard.razor.cs
@@ -0,0 +1,164 @@
+using Microsoft.AspNetCore.Components;
+
+namespace WebDoorCreator.UI.Components.SvgComp
+{
+ public partial class HomeCard
+ {
+ #region Public Properties
+
+ [Parameter]
+ public string BodyStyle { get; set; } = "font-size: 2em;";
+
+ [Parameter]
+ public string BodyText { get; set; } = "Body Text";
+
+ [Parameter]
+ public string ButtonText { get; set; } = "Button Text";
+
+ [Parameter]
+ public EventCallback EC_ExeFunct { get; set; }
+
+ [Parameter]
+ public string ImagePath { get; set; } = "images/DOORBG.png";
+
+ [Parameter]
+ public string LineColor { get; set; } = "#3989CC";
+
+ [Parameter]
+ public int LineWidth { get; set; } = 16;
+
+ [Parameter]
+ public int ObjH { get; set; } = 204;
+
+ [Parameter]
+ public int ObjId { get; set; } = 0;
+
+ [Parameter]
+ public int ObjW { get; set; } = 450;
+
+ [Parameter]
+ public int StartPoint { get; set; } = 220;
+
+ [Parameter]
+ public string TitleStyle { get; set; } = "font-size: 5.5em;";
+
+ [Parameter]
+ public string TitleText { get; set; } = "Title Text";
+
+ #endregion Public Properties
+
+ #region Protected Properties
+
+ protected List PathClip { get; set; } = null!;
+
+ protected string PathClipData
+ {
+ get
+ {
+ //string path = $"{PathLineData} L1200,0 L1920,0 L1920,1080 L900,1080 Z";
+ string path = PathLineData;
+ if (pathClipCloseList.Count > 0)
+ {
+ for (int i = 0; i < pathClipCloseList.Count; i++)
+ {
+ path += $" L{pathClipCloseList[i].px},{pathClipCloseList[i].py}";
+ }
+ }
+ path += " Z";
+ return path;
+ }
+ }
+
+ protected List PathLine { get; set; } = null!;
+
+ protected string PathLineData
+ {
+ get
+ {
+ string path = "";
+ if (pathPointList.Count > 0)
+ {
+ path = $"M{pathPointList[0].px},{pathPointList[0].py} Q";
+ for (int i = 1; i < pathPointList.Count; i++)
+ {
+ path += $" {pathPointList[i].px},{pathPointList[i].py}";
+ }
+ }
+ return path;
+ }
+ }
+
+ #endregion Protected Properties
+
+ #region Protected Methods
+
+ protected void execFunc()
+ {
+ EC_ExeFunct.InvokeAsync(true);
+ }
+
+ protected override void OnParametersSet()
+ {
+ setupGraphParams();
+ }
+
+ protected void setupGraphParams()
+ {
+ pathPointList = new List();
+ pathClipCloseList = new List();
+ // calcolo i dati necessari a disegnare
+ int deltaX = (ObjW / 2 - StartPoint) / 6;
+ int deltaY = ObjH / 3;
+ // inizio aggiungendo punti parametrici
+ pathPointList.Add(new PointData(StartPoint, ObjH));
+ pathPointList.Add(new PointData(StartPoint - deltaX, ObjH - (deltaY / 2)));
+ pathPointList.Add(new PointData(StartPoint + deltaX, ObjH - deltaY));
+ pathPointList.Add(new PointData((ObjW / 2) - deltaX * 3, (ObjH / 2) + deltaY / 8));
+ pathPointList.Add(new PointData(ObjW / 2, ObjH / 2));
+ pathPointList.Add(new PointData((ObjW / 2) + deltaX * 3, (ObjH / 2) - deltaY / 8));
+ pathPointList.Add(new PointData(ObjW - (StartPoint + deltaX), deltaY));
+ pathPointList.Add(new PointData(ObjW - (StartPoint - deltaX), (deltaY / 2)));
+ pathPointList.Add(new PointData(ObjW - StartPoint, 0));
+ // ora provvedo x la parte clip
+ pathClipCloseList.Add(new PointData(ObjW - StartPoint, 0));
+ pathClipCloseList.Add(new PointData(ObjW, 0));
+ pathClipCloseList.Add(new PointData(ObjW, ObjH));
+ pathClipCloseList.Add(new PointData(StartPoint, ObjH));
+
+ }
+
+ protected List pathPointList = new List();
+ protected List pathClipCloseList = new List();
+
+ #endregion Protected Methods
+
+ #region Protected Classes
+
+ protected class PointData
+ {
+ #region Public Constructors
+
+ public PointData(int valx, int valy)
+ {
+ px = valx;
+ py = valy;
+ }
+
+ #endregion Public Constructors
+
+ #region Public Properties
+
+ public int px { get; set; } = 0;
+ public int py { get; set; } = 0;
+
+ #endregion Public Properties
+ }
+
+ protected async Task raiseEvent()
+ {
+ await EC_ExeFunct.InvokeAsync(true);
+ }
+
+ #endregion Protected Classes
+ }
+}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Components/SvgComp/StepArrow.razor b/WebDoorCreator.UI/Components/SvgComp/StepArrow.razor
deleted file mode 100644
index f68580a..0000000
--- a/WebDoorCreator.UI/Components/SvgComp/StepArrow.razor
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
- @StepText
-
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Components/SvgComp/StepArrow.razor.cs b/WebDoorCreator.UI/Components/SvgComp/StepArrow.razor.cs
deleted file mode 100644
index df760f3..0000000
--- a/WebDoorCreator.UI/Components/SvgComp/StepArrow.razor.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-using Microsoft.AspNetCore.Components;
-
-namespace WebDoorCreator.UI.Components.SvgComp
-{
- public partial class StepArrow
- {
- #region Public Properties
-
- [Parameter]
- public int ObjH { get; set; } = 100;
-
- [Parameter]
- public int ObjId { get; set; } = 0;
-
- [Parameter]
- public int ObjW { get; set; } = 500;
-
- [Parameter]
- public string StepText { get; set; } = "Arrow Stepped";
-
- [Parameter]
- public string TextStyle { get; set; } = "font-size: 2.5em; font-weight:bold; fill: white;";
-
-
- [Parameter]
- public string BlockStyle { get; set; } = "fill:rgb(0,0,255);stroke-width:0;stroke:rgb(0,0,0);";
-
- [Parameter]
- public string BlockStyleBorderUp { get; set; } = "stroke-width:5px;stroke:rgb(255,255,255);stroke-dasharray: 650,600;";
-
- #endregion Public Properties
-
- #region Protected Properties
-
- protected int deltaH
- {
- get => ObjH / 100;
- }
-
- protected int rectH
- {
- get => (ObjH / 2);
- //* (96 / 100);
- }
-
- protected int rectW
- {
- get => ObjW - ObjH / 2;
- }
-
- protected int tipSize
- {
- get => ObjH / 3;
- }
-
- #endregion Protected Properties
- }
-}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Data/DoorsSelectFilter.cs b/WebDoorCreator.UI/Data/DoorsSelectFilter.cs
new file mode 100644
index 0000000..27b7d7f
--- /dev/null
+++ b/WebDoorCreator.UI/Data/DoorsSelectFilter.cs
@@ -0,0 +1,78 @@
+namespace WebDoorCreator.UI.Data
+{
+ public class DoorsSelectFilter
+ {
+ #region Public Constructors
+
+ public DoorsSelectFilter()
+ { }
+
+ #endregion Public Constructors
+
+ #region Public Properties
+
+ public int CurrPage { get; set; } = 1;
+
+ public string Id { get; set; } = "*";
+ public string searchValue { get; set; } = "";
+ public int MaxRecord { get; set; } = 100;
+
+ public int NumRec { get; set; } = 10;
+
+ public int TotCount { get; set; } = 0;
+
+ #endregion Public Properties
+
+ #region Public Methods
+
+ public DoorsSelectFilter clone()
+ {
+ DoorsSelectFilter clonedData = new DoorsSelectFilter()
+ {
+ CurrPage = this.CurrPage,
+ MaxRecord = this.MaxRecord,
+ NumRec = this.NumRec,
+ searchValue = this.searchValue,
+ TotCount = this.TotCount,
+ Id = this.Id
+ };
+ return clonedData;
+ }
+
+ public override bool Equals(object? obj)
+ {
+ if (obj == null)
+ return false;
+
+ if (!(obj is OrderSelectFilter item))
+ return false;
+
+ if (MaxRecord != item.MaxRecord)
+ return false;
+
+ if (NumRec != item.NumRec)
+ return false;
+
+ if (TotCount != item.TotCount)
+ return false;
+
+ if (searchValue != item.searchValue)
+ return false;
+
+ if (CurrPage != item.CurrPage)
+ return false;
+
+ if (Id != item.Id)
+ return false;
+
+ return true;
+ }
+
+ public override int GetHashCode()
+ {
+ return base.GetHashCode();
+ }
+
+ #endregion Public Methods
+ }
+}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Data/WebDoorCreatorService.cs b/WebDoorCreator.UI/Data/WebDoorCreatorService.cs
index eed0c89..8fe8575 100644
--- a/WebDoorCreator.UI/Data/WebDoorCreatorService.cs
+++ b/WebDoorCreator.UI/Data/WebDoorCreatorService.cs
@@ -201,7 +201,7 @@ namespace WebDoorCreator.UI.Data
TableName = "All",
FieldName = "OrderStep",
Value = "10",
- Label = "DoorDef",
+ Label = "Door Draft",
Ordinal = 10,
DefaultVal = "#EF6C00",
InputType = ""
@@ -212,7 +212,7 @@ namespace WebDoorCreator.UI.Data
TableName = "All",
FieldName = "OrderStep",
Value = "20",
- Label = "Sent",
+ Label = "Sent to ABH",
Ordinal = 20,
DefaultVal = "#FBC02D",
InputType = ""
@@ -223,7 +223,7 @@ namespace WebDoorCreator.UI.Data
TableName = "All",
FieldName = "OrderStep",
Value = "30",
- Label = "ApprovedByMaker",
+ Label = "Approved By Maker",
Ordinal = 30,
DefaultVal = "#2962FF",
InputType = ""
@@ -234,7 +234,7 @@ namespace WebDoorCreator.UI.Data
TableName = "All",
FieldName = "OrderStep",
Value = "40",
- Label = "ApprovedByCustomer",
+ Label = "Approved By Customer",
Ordinal = 40,
DefaultVal = "#673AB7",
InputType = ""
@@ -256,7 +256,7 @@ namespace WebDoorCreator.UI.Data
TableName = "All",
FieldName = "OrderStep",
Value = "60",
- Label = "InProduction",
+ Label = "In Production",
Ordinal = 60,
DefaultVal = "#43A047",
InputType = ""
@@ -272,6 +272,7 @@ namespace WebDoorCreator.UI.Data
DefaultVal = "#AEEA00",
InputType = ""
};
+
listValues.Add(listValObj);
listValObj = new ListValuesTempModel()
{
@@ -459,6 +460,27 @@ namespace WebDoorCreator.UI.Data
isSerializable = true
};
listValues.Add(listValObj);
+ int i = 0;
+
+#if false
+ var o = listActiveCompo.ToArray();
+
+ for (int t = 0; t < dirs.Length; t++)
+ {
+ var dirPath = dirs[t];
+ var h = dirPath.Split("\\");
+ var c = h[h.Length - 1];
+ c = o[t];
+ StringBuilder sb = new StringBuilder();
+ foreach (var item in h)
+ {
+ sb.Append($"{item}\\");
+ }
+ sb.Append(c);
+ dirs[t] = $"{sb}";
+ }
+#endif
+
foreach (string dir in dirs)
{
int numPar = 1;
@@ -488,6 +510,10 @@ namespace WebDoorCreator.UI.Data
string layerName = fIni.ReadString("Layer", "LayerName", "LAYER");
// lo slash indica l'alias
var compoNameSplit = compoName.Split("/");
+
+ var compoAcArray = listActiveCompo.ToArray();
+ var x = Array.FindIndex(compoAcArray, row => row == compoNameSplit[0]);
+
if (listActiveCompo.Contains(compoNameSplit[0].ToString()))
{
//creo il componente (padre)
@@ -497,7 +523,7 @@ namespace WebDoorCreator.UI.Data
FieldName = "Hardware",
Value = $"{compoNameSplit[0]}",
Label = $"{compoNameSplit[1]}",
- Ordinal = 0,
+ Ordinal = x,
DefaultVal = " ",
InputType = " "
};
@@ -505,6 +531,7 @@ namespace WebDoorCreator.UI.Data
//await dbController.CompoAdd(compoConfig);
//listCompoS.Add(compoConfig);
listValues.Add(listValObj);
+ i++;
//cerco all'interno del file tutte le sezioni che contengono "[Graphic" così da poter prendere il nome della sezione ES: [Graphic parameters1] = Graphic parameters1
var lineToSearch = lines.Where(x => x.Contains("[Graphic")).ToList();
numHead = 1;
@@ -695,7 +722,7 @@ namespace WebDoorCreator.UI.Data
///
/// Doors list by orderId
///
- public async Task?> DoorOpGetByDoorId(int doorId)
+ public async Task> DoorOpGetByDoorId(int doorId)
{
string source = "DB";
List? dbResult = new List();
@@ -732,6 +759,26 @@ namespace WebDoorCreator.UI.Data
Log.Debug($"DoorOpGetByDoorId | {source} in: {ts.TotalMilliseconds} ms");
return dbResult;
}
+ ///
+ /// Doors list by orderId
+ ///
+ public async Task DoorOpGetById(int doorOpId)
+ {
+ await Task.Delay(1);
+ string source = "DB";
+ DoorOpModel? dbResult = new DoorOpModel();
+ Stopwatch stopWatch = new Stopwatch();
+ stopWatch.Start();
+ dbResult = dbController.DoorOpGetById(doorOpId);
+ if (dbResult == null)
+ {
+ dbResult = new DoorOpModel();
+ }
+ stopWatch.Stop();
+ TimeSpan ts = stopWatch.Elapsed;
+ Log.Debug($"DoorOpGetById | {source} in: {ts.TotalMilliseconds} ms");
+ return dbResult;
+ }
///
/// lista DoorOpList necessarie all'init
diff --git a/WebDoorCreator.UI/Pages/DoorDefinition.razor b/WebDoorCreator.UI/Pages/DoorDefinition.razor
index 0dc0891..1534989 100644
--- a/WebDoorCreator.UI/Pages/DoorDefinition.razor
+++ b/WebDoorCreator.UI/Pages/DoorDefinition.razor
@@ -33,6 +33,10 @@
{
}
+ else if (currDefStep == 30)
+ {
+
+ }
diff --git a/WebDoorCreator.UI/Pages/HwPdfConfirm.razor b/WebDoorCreator.UI/Pages/HwPdfConfirm.razor
new file mode 100644
index 0000000..0bc13e5
--- /dev/null
+++ b/WebDoorCreator.UI/Pages/HwPdfConfirm.razor
@@ -0,0 +1,26 @@
+@page "/HwPdfConfirm"
+
+@if (currDoorOp != null)
+{
+
+ @*@if (currDoorOp.DtConfirm != null && currDoorOp.userConfirm != "")
+ {*@
+
+ Please press
+
+ doConfirm()">
+ CONFIRM
+
+
+ after reading the whole file
+
+ @*}
+ else
+ {
+
+ Template already confirmed by user: @currDoorOp.userConfirm on @currDoorOp.DtConfirm
+
+ }*@
+
+
+}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.cs b/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.cs
new file mode 100644
index 0000000..a6eb179
--- /dev/null
+++ b/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.cs
@@ -0,0 +1,80 @@
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.WebUtilities;
+using Newtonsoft.Json;
+using WebDoorCreator.Data.DbModels;
+using WebDoorCreator.UI.Data;
+
+namespace WebDoorCreator.UI.Pages
+{
+ public partial class HwPdfConfirm
+ {
+ [Inject]
+ protected NavigationManager NavManager { get; set; } = null!;
+ [Inject]
+ protected WDCUserService WDCUService { get; set; } = null!;
+
+ protected int idHwInst { get; set; } = 0;
+ protected DoorOpModel currDoorOp { get; set; } = new DoorOpModel();
+ protected List allDoorOps { get; set; } = new List();
+
+ protected async override Task OnInitializedAsync()
+ {
+ await Task.Delay(1);
+ var uri = NavManager.ToAbsoluteUri(NavManager.Uri);
+ if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("idHwInst", out var _idHwInst))
+ {
+ idHwInst = int.Parse(_idHwInst);
+ await ReloadData();
+ }
+ }
+
+ protected async Task ReloadData()
+ {
+ currDoorOp = await WDService.DoorOpGetById(idHwInst);
+ if (currDoorOp != null)
+ {
+ allDoorOps = await WDService.DoorOpGetByDoorId(currDoorOp.DoorId);
+
+ }
+ await Task.Delay(1);
+ }
+ [Inject]
+ protected WebDoorCreatorService WDService { get; set; } = null!;
+
+ protected async Task doConfirm()
+ {
+ currDoorOp.userConfirm = WDCUService.userId;
+ currDoorOp.DtConfirm = DateTime.Now;
+
+ var doorOps2Save = new List() { currDoorOp };
+
+ await WDService.DoorOpUpdate(doorOps2Save);
+ }
+
+ protected bool checkIfConf()
+ {
+ bool answ = false;
+ if (allDoorOps != null)
+ {
+ var rawObj = JsonConvert.DeserializeObject>>(currDoorOp.JsoncActVal!);
+ if (rawObj != null)
+ {
+ foreach (var op in allDoorOps)
+ {
+ var opObj = JsonConvert.DeserializeObject>>(op.JsoncActVal!);
+ if (opObj != null)
+ {
+
+ if (rawObj["template"] == opObj["template"] && op.DtConfirm != null && op.userConfirm != "")
+ {
+ answ = true;
+ }
+ }
+ }
+ }
+ }
+ return answ;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.css b/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.css
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.css
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.less b/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.less
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.less
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.min.css b/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.min.css
new file mode 100644
index 0000000..5f28270
--- /dev/null
+++ b/WebDoorCreator.UI/Pages/HwPdfConfirm.razor.min.css
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Pages/Index.razor b/WebDoorCreator.UI/Pages/Index.razor
index baa924b..a393302 100644
--- a/WebDoorCreator.UI/Pages/Index.razor
+++ b/WebDoorCreator.UI/Pages/Index.razor
@@ -2,8 +2,8 @@
Index
-
\ No newline at end of file
+
+
+
+
+
diff --git a/WebDoorCreator.UI/Pages/Index.razor.cs b/WebDoorCreator.UI/Pages/Index.razor.cs
new file mode 100644
index 0000000..5fa1a39
--- /dev/null
+++ b/WebDoorCreator.UI/Pages/Index.razor.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Components;
+using System.Net.Http;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Components.Authorization;
+using Microsoft.AspNetCore.Components.Forms;
+using Microsoft.AspNetCore.Components.Routing;
+using Microsoft.AspNetCore.Components.Web;
+using Microsoft.AspNetCore.Components.Web.Virtualization;
+using Microsoft.JSInterop;
+using WebDoorCreator.UI;
+using WebDoorCreator.UI.Components;
+using WebDoorCreator.UI.Components.Buttons;
+using WebDoorCreator.UI.Components.CompMan;
+using WebDoorCreator.UI.Components.DoorMan;
+using WebDoorCreator.UI.Components.DoorDef;
+using WebDoorCreator.UI.Components.Gen;
+using WebDoorCreator.UI.Components.Order;
+using WebDoorCreator.UI.Components.Users;
+using WebDoorCreator.UI.Components.Hardware;
+using WebDoorCreator.UI.Components.SvgComp;
+using WebDoorCreator.UI.Components.Filters;
+using WebDoorCreator.UI.Shared;
+using WebDoorCreator.Data.DbModels;
+using EgwCoreLib.Razor;
+
+namespace WebDoorCreator.UI.Pages
+{
+ public partial class Index
+ {
+ [Inject]
+ protected NavigationManager NavManager { get; set; } = null!;
+ protected async Task changePage(bool newPage)
+ {
+ await Task.Delay(1);
+ NavManager.NavigateTo("OrdersHomePage");
+ }
+ }
+}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Pages/OrderDetails.razor b/WebDoorCreator.UI/Pages/OrderDetails.razor
index 5f1be2d..6ec3e55 100644
--- a/WebDoorCreator.UI/Pages/OrderDetails.razor
+++ b/WebDoorCreator.UI/Pages/OrderDetails.razor
@@ -25,14 +25,14 @@
@orderView.NumDoors
-@*
-
-
- mm
- inch
-
- createDoor()">+ Add new door
-
*@
+ @*
+
+
+ mm
+ inch
+
+ createDoor()">+ Add new door
+
*@
}
@@ -42,5 +42,8 @@
diff --git a/WebDoorCreator.UI/Pages/OrderDetails.razor.cs b/WebDoorCreator.UI/Pages/OrderDetails.razor.cs
index 45d009c..ed56961 100644
--- a/WebDoorCreator.UI/Pages/OrderDetails.razor.cs
+++ b/WebDoorCreator.UI/Pages/OrderDetails.razor.cs
@@ -1,3 +1,4 @@
+using EgwCoreLib.Razor;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.WebUtilities;
using Newtonsoft.Json;
@@ -11,6 +12,8 @@ namespace WebDoorCreator.UI.Pages
{
#region Public Properties
+ protected DataPager? pagerDoors = null!;
+
public string userId
{
get
@@ -106,8 +109,56 @@ namespace WebDoorCreator.UI.Pages
#region Private Fields
- private List? ListOrdersStatus = null;
#endregion Private Fields
+
+ protected DoorsSelectFilter currFilter { get; set; } = new DoorsSelectFilter();
+
+ private int currPage
+ {
+ get => currFilter.CurrPage;
+ set => currFilter.CurrPage = value;
+ }
+
+ private bool isLoading { get; set; } = false;
+
+ private int numRecord
+ {
+ get => currFilter.NumRec;
+ set => currFilter.NumRec = value;
+ }
+ private string searchValue
+ {
+ get => currFilter.searchValue;
+ set => currFilter.searchValue = value;
+ }
+
+ protected int totalCount { get; set; }
+
+ protected void ForceReload(int newNum)
+ {
+ numRecord = newNum;
+ }
+
+ protected void ForceReloadPage(int newNum)
+ {
+ currPage = newNum;
+ }
+ protected void UpdateTotCount(int newTotCount)
+ {
+ totalCount = newTotCount;
+ }
+
+ private async Task updateFilter(DoorsSelectFilter newParams)
+ {
+ isLoading = true;
+ await Task.Delay(1);
+ currPage = 1;
+ searchValue = newParams.searchValue;
+ await Task.Delay(1);
+ await InvokeAsync(() => StateHasChanged());
+ currFilter = newParams;
+ isLoading = false;
+ }
}
}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/Pages/OrdersHomePage.razor b/WebDoorCreator.UI/Pages/OrdersHomePage.razor
index 57fe87f..94d1b3a 100644
--- a/WebDoorCreator.UI/Pages/OrdersHomePage.razor
+++ b/WebDoorCreator.UI/Pages/OrdersHomePage.razor
@@ -19,26 +19,34 @@
*@
-
- @*
+
+
+ @*
-
*@
-
- WEB DOOR CREATOR
-
-
-
-
- @*
+
*@
+
+ WEB DOOR CREATOR
+
+
+
+
+ Add new order
+
+
+ @*
-
*@
-
-
-
+
*@
+
+
+
+
+
+
+
+
-
-
+
diff --git a/WebDoorCreator.UI/Pages/OrdersHomePage.razor.cs b/WebDoorCreator.UI/Pages/OrdersHomePage.razor.cs
index 39f3ab0..6174ee7 100644
--- a/WebDoorCreator.UI/Pages/OrdersHomePage.razor.cs
+++ b/WebDoorCreator.UI/Pages/OrdersHomePage.razor.cs
@@ -8,9 +8,8 @@ namespace WebDoorCreator.UI.Pages
{
public partial class OrdersHomePage : IDisposable
{
- public OrderSelectFilter currFilter { get; set; } = new OrderSelectFilter();
-
protected DataPager? pagerOrderHP = null!;
+ protected OrderSelectFilter currFilter { get; set; } = new OrderSelectFilter();
#region Public Properties
[Parameter]
@@ -222,25 +221,14 @@ namespace WebDoorCreator.UI.Pages
#endregion Protected Methods
+ protected int totalCount { get; set; }
+
private int currPage
{
get => currFilter.CurrPage;
set => currFilter.CurrPage = value;
}
- private bool isLoading { get; set; } = false;
-
- private int numRecord
- {
- get => currFilter.NumRec;
- set => currFilter.NumRec = value;
- }
- private string searchValue
- {
- get => currFilter.searchValue;
- set => currFilter.searchValue = value;
- }
-
private DateTime dateFrom
{
get => currFilter.DateFrom;
@@ -252,14 +240,25 @@ namespace WebDoorCreator.UI.Pages
get => currFilter.DateTo;
set => currFilter.DateTo = value;
}
+
+ private bool isLoading { get; set; } = false;
+
+ private int numRecord
+ {
+ get => currFilter.NumRec;
+ set => currFilter.NumRec = value;
+ }
private int orderStatus
{
get => currFilter.OrderStatus;
set => currFilter.OrderStatus = value;
}
- protected int totalCount { get; set; }
-
+ private string searchValue
+ {
+ get => currFilter.searchValue;
+ set => currFilter.searchValue = value;
+ }
protected void ForceReload(int newNum)
{
numRecord = newNum;
diff --git a/WebDoorCreator.UI/Program.cs b/WebDoorCreator.UI/Program.cs
index 40143ee..da0d9ee 100644
--- a/WebDoorCreator.UI/Program.cs
+++ b/WebDoorCreator.UI/Program.cs
@@ -15,7 +15,7 @@ using WebDoorCreator.Data.Services;
using WebDoorCreator.UI.Areas.Identity;
using WebDoorCreator.UI.Data;
-var builder = WebApplication.CreateBuilder(args);
+ var builder = WebApplication.CreateBuilder(args);
// configuration setup
ConfigurationManager configuration = builder.Configuration;
diff --git a/WebDoorCreator.UI/Shared/MainLayout.razor b/WebDoorCreator.UI/Shared/MainLayout.razor
index 67227d6..a3a70e3 100644
--- a/WebDoorCreator.UI/Shared/MainLayout.razor
+++ b/WebDoorCreator.UI/Shared/MainLayout.razor
@@ -16,15 +16,9 @@
- @if (NavManager.Uri.Contains("OrderDetails"))
+ @if (NavManager.Uri == NavManager.BaseUri)
{
-
- @Body
-
- }
- else if (NavManager.Uri.Contains("DoorDefinition"))
- {
-
+
@Body
}
@@ -34,6 +28,16 @@
@Body
}
+ @*else if (NavManager.Uri.Contains("DoorDefinition"))
+ {
+
+ @Body
+
+ }
+ else
+ {
+ }*@
+
@*
*@
diff --git a/WebDoorCreator.UI/WebDoorCreator.UI.csproj b/WebDoorCreator.UI/WebDoorCreator.UI.csproj
index c21f9c1..6ff3724 100644
--- a/WebDoorCreator.UI/WebDoorCreator.UI.csproj
+++ b/WebDoorCreator.UI/WebDoorCreator.UI.csproj
@@ -34,7 +34,7 @@
-
+
diff --git a/WebDoorCreator.UI/_Imports.razor b/WebDoorCreator.UI/_Imports.razor
index c1fe929..1e50b8f 100644
--- a/WebDoorCreator.UI/_Imports.razor
+++ b/WebDoorCreator.UI/_Imports.razor
@@ -18,6 +18,9 @@
@using WebDoorCreator.UI.Components.Hardware
@using WebDoorCreator.UI.Components.SvgComp
@using WebDoorCreator.UI.Components.Filters
+@using WebDoorCreator.UI.Components.Report
@using WebDoorCreator.UI.Shared
-@using WebDoorCreator.Data.DbModels
+@using WebDoorCreator.Data.DbModels
+@using EgwCoreLib.Razor
+
diff --git a/WebDoorCreator.UI/compilerconfig.json b/WebDoorCreator.UI/compilerconfig.json
index d7d703d..c8e2006 100644
--- a/WebDoorCreator.UI/compilerconfig.json
+++ b/WebDoorCreator.UI/compilerconfig.json
@@ -46,5 +46,21 @@
{
"outputFile": "Components/Order/OrderList.razor.css",
"inputFile": "Components/Order/OrderList.razor.less"
+ },
+ {
+ "outputFile": "Components/DoorDef/DoorDataBlock.razor.css",
+ "inputFile": "Components/DoorDef/DoorDataBlock.razor.less"
+ },
+ {
+ "outputFile": "Pages/HwPdfConfirm.razor.css",
+ "inputFile": "Pages/HwPdfConfirm.razor.less"
+ },
+ {
+ "outputFile": "Components/Gen/NavMenuHorizontal.razor.css",
+ "inputFile": "Components/Gen/NavMenuHorizontal.razor.less"
+ },
+ {
+ "outputFile": "Components/Report/ReportList.razor.css",
+ "inputFile": "Components/Report/ReportList.razor.less"
}
]
\ No newline at end of file
diff --git a/WebDoorCreator.UI/temp/Conf.yaml b/WebDoorCreator.UI/temp/Conf.yaml
index 8b4aff9..c01dd34 100644
--- a/WebDoorCreator.UI/temp/Conf.yaml
+++ b/WebDoorCreator.UI/temp/Conf.yaml
@@ -4,7 +4,7 @@
version: 2
produce: true
-measures: inch
+measures: inches
code: 0015943
order:
customer:
@@ -12,17 +12,22 @@ order:
project:
pO:
line:
-date: 2023-05-05T00:00:00.0000000Z
+date: 2023-11-05T00:00:00.0000000
piece: DO_1
-properties: Maple
+size: {}
+swing: {}
+properties: Pine
finishing: Varnishing
size:
width: 33.8125
height: 81.25
thickness: 1.75
-swing: LH
+swing: RH
secure: UP
material: wood
+profiles: {}
+hardware: {}
+
profiles:
lockedge:
type: SQ
@@ -40,6 +45,39 @@ profiles:
type: SQ
machining: ON
overmaterial: 0.1
-hardware: {}
+hardware:
+ flush_pulls:
+ - template: Generic\Circle
+ position: 35
+ back_set: 5
+ depth: 1
+ face: secure
+ - template: Generic\Circle
+ position: 35
+ back_set: 5
+ depth: 1
+ face: secure
+
+ locks:
+ - template: Generic\DocMyTest5Bore.nge
+ position: 45.875
+ back_set: 2.0
+ offset_WS: 0.0
+ side: lock_top
+
+ hinges:
+ - template: Generic Conceiled\StdConHingeDeepR
+ ToptoCL: 4.875
+ back_set: 0.125
+ thickness: 0.25
+
+ groove:
+ - template: Generic\Groove
+ type: side
+ width: 0.6
+ depth: 0.8
+ offset_WS: 0
+ side: bottom
+
---
diff --git a/WebDoorCreator.UI/wwwroot/Docs/1001.pdf b/WebDoorCreator.UI/wwwroot/Docs/1001.pdf
new file mode 100644
index 0000000..2f6d075
Binary files /dev/null and b/WebDoorCreator.UI/wwwroot/Docs/1001.pdf differ
diff --git a/WebDoorCreator.UI/wwwroot/css/site.css b/WebDoorCreator.UI/wwwroot/css/site.css
index 5f6b65a..60c1fcf 100644
--- a/WebDoorCreator.UI/wwwroot/css/site.css
+++ b/WebDoorCreator.UI/wwwroot/css/site.css
@@ -26,6 +26,9 @@ a,
background-color: #AEEA00;
color: #000;
}
+#viewer > #toolbar {
+ display: none;
+}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
diff --git a/WebDoorCreator.UI/wwwroot/css/site.less b/WebDoorCreator.UI/wwwroot/css/site.less
index 9bcccc3..50ca386 100644
--- a/WebDoorCreator.UI/wwwroot/css/site.less
+++ b/WebDoorCreator.UI/wwwroot/css/site.less
@@ -32,6 +32,10 @@ a, .btn-link {
color: #000;
}
+#viewer > #toolbar {
+ display: none;
+}
+
.btn-primary {
color: #fff;
diff --git a/WebDoorCreator.UI/wwwroot/css/site.min.css b/WebDoorCreator.UI/wwwroot/css/site.min.css
index 8de6fdb..4827fd7 100644
--- a/WebDoorCreator.UI/wwwroot/css/site.min.css
+++ b/WebDoorCreator.UI/wwwroot/css/site.min.css
@@ -1 +1 @@
-@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');html,body{font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;}h1:focus{outline:0;}a,.btn-link{color:#0071c1;}.bg-orange{background-color:#ef6c00;color:#000;}.bg-purple{background-color:#673ab7;color:#fff;}.bg-turquoise{background-color:#00b8d4;color:#000;}.bg-lGreen{background-color:#aeea00;color:#000;}.btn-primary{color:#fff;background-color:#1b6ec2;border-color:#1861ac;}.content{padding-top:1.1rem;}.valid.modified:not([type=checkbox]){outline:1px solid #26b050;}.invalid{outline:1px solid #f00;}.validation-message{color:#f00;}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1000;}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem;}.blazor-error-boundary{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem,#b32121;padding:1rem 1rem 1rem 3.7rem;color:#fff;}.blazor-error-boundary::after{content:"An error has occurred.";}
\ No newline at end of file
+@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');html,body{font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;}h1:focus{outline:0;}a,.btn-link{color:#0071c1;}.bg-orange{background-color:#ef6c00;color:#000;}.bg-purple{background-color:#673ab7;color:#fff;}.bg-turquoise{background-color:#00b8d4;color:#000;}.bg-lGreen{background-color:#aeea00;color:#000;}#viewer>#toolbar{display:none;}.btn-primary{color:#fff;background-color:#1b6ec2;border-color:#1861ac;}.content{padding-top:1.1rem;}.valid.modified:not([type=checkbox]){outline:1px solid #26b050;}.invalid{outline:1px solid #f00;}.validation-message{color:#f00;}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1000;}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem;}.blazor-error-boundary{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem,#b32121;padding:1rem 1rem 1rem 3.7rem;color:#fff;}.blazor-error-boundary::after{content:"An error has occurred.";}
\ No newline at end of file
diff --git a/WebDoorCreator.UI/wwwroot/images/HeroSecDoor.png b/WebDoorCreator.UI/wwwroot/images/HeroSecDoor.png
new file mode 100644
index 0000000..80055e3
Binary files /dev/null and b/WebDoorCreator.UI/wwwroot/images/HeroSecDoor.png differ