This commit is contained in:
Emmanuele Sassi
2023-05-18 11:18:36 +02:00
51 changed files with 1006 additions and 609 deletions
+29 -23
View File
@@ -2,7 +2,7 @@
## Framework
Traduzione OVUNQUE x ogni termine/etichetta/button
Traduzione OVUNQUE x ogni termine/etichetta/button..
## Pagine
@@ -17,52 +17,58 @@ Traduzione OVUNQUE x ogni termine/etichetta/button
### Orders Home page
Per completare
- <del>aggiunta paginatore</del>
- <del>aggiunta stato ordine</del>
- <del>aggiunta filtri ricerca
- [x] <del>aggiunta paginatore</del>
- [x] <del>aggiunta stato ordine</del>
- [x] <del>aggiunta filtri ricerca
- periodo da-a
- search generico
- stato ordine</del>
- <del>ordinamento</del>
- [x] <del>ordinamento</del>
### DCA Order Man
### DCA Order Mans
FORSE la Orders home Page NON VA bene x gli utenti backoffice, oppure va estesa, perché x confermare quotazione, indicare avanzamento ordini gli operatori ABH/DCA devono avere una pagina operativa...
### OrderDetails
Per completare:
- <del>aggiunta button x il cambio stato da end-user</del>
- <del>sistemare con paginatore max 3 righe x 4 porte</del>
- <del>fix button verde add-new</del>
- [x] <del>aggiunta button x il cambio stato da end-user</del>
- [x] <del>sistemare con paginatore max 3 righe x 4 porte</del>
- [x] <del>fix button verde add-new</del>
- [x] <del>ombreggiatura blocco</del>
### DoorDefinition BaseParams
- <del>conteggio num modifiche da salvare</del>
- <del>armonizzare il cancel/save nella pagina</del>
- <del>revisione testata fino al btn del salva generale</del>
- <del>sostituire il salva generale con 2 buttons:
- [x] <del>conteggio num modifiche da salvare</del>
- [x] <del>armonizzare il cancel/save nella pagina</del>
- [x] <del>revisione testata fino al btn del salva generale</del>
- [x] <del>sostituire il salva generale con 2 buttons:
- salva, o meglio RECALC PNG = update PNG, potrebbe andare in automatico DOPO i vari SALVA nella pagina (opzione x auto-recalc?!?)
- get 3D obj (in new window/tab)</del>
- [x] <del>delete singola porta da ordine</del>
- [x] <del>navigazione in ritorno come da FIGMA in HwNewInst</del>
- [x] <del>refresh conteggi su approvazione</del>
- [x] <del>conteggio istanze in aggiunta HW</del>
### DoorDefinition Hardware
Sistemare:
- <del>da implementare davvero lettura pdf (da cartella pdf di esempi)</del>
- <del>fix cancel/save: globale x Hardware oppure x ognuno con icona?</del>
- verificare perché NON si aggiorna al salvataggio pagina dei 18 hw
- <del>mancano il totale componenti x ogni hw attivato</del>
- [x] <del>da implementare davvero lettura pdf (da cartella pdf di esempi)</del>
- [x] <del>fix cancel/save: globale x Hardware oppure x ognuno con icona?</del>
- [ ] verificare perché NON si aggiorna al salvataggio pagina dei 18 hw
- [x] <del>mancano il totale componenti x ogni hw attivato</del>
#### Report
<del>Va inserita una lista dei componenti + elenco quote.</del>
Va pensato esportabile in pdf, comprensivo di "check pdf fatto da tizio alle ..."
- [x] <del>Va inserita una lista dei componenti + elenco quote.</del>
- [ ] Va pensato esportabile in pdf, comprensivo di "check pdf fatto da tizio alle ..."
## Componenti
### Top
Da sistemare
- <del>btn effettivi</del>
- <del>dinamico da user-role?</del>
- <del>fix responsive</del>
- [x] <del>btn effettivi</del>
- [x] <del>dinamico da user-role?</del>
- [x] <del>fix responsive</del>
Binary file not shown.
+1
View File
@@ -42,6 +42,7 @@ namespace WebDoorCreator.Core
public const string rKeyDoorOpType = $"{redisBaseAddr}:Cache:DoorOpType";
public const string rKeyGraphicParameters = $"{redisBaseAddr}:Cache:GraphicParameters";
public const string rKeyListValues = $"{redisBaseAddr}:Cache:ListValues";
public const string rKeyDoorLast = $"{redisBaseAddr}:Cache:DoorList";
public const string rKeyOrderDetail = $"{redisBaseAddr}:Cache:OrderDetail";
public const string rKeyOrderStatus = $"{redisBaseAddr}:Cache:OrderStatus";
public const string rKeyRoles = $"{redisBaseAddr}:Cache:Roles";
@@ -1,7 +1,5 @@
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Data.SqlClient;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using Microsoft.Extensions.Configuration;
using NLog;
using System.Data;
@@ -254,6 +252,66 @@ namespace WebDoorCreator.Data.Controllers
return fatto;
}
/// <summary>
/// Delete doorOp instance
/// </summary>
/// <param name="modOpRec">Record to delete</param>
/// <returns></returns>
public async Task<bool> DoorOpDelete(DoorOpModel modOpRec)
{
bool fatto = false;
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
var currRec = localDbCtx
.DbSetDoorOp
.Where(x => x.DoorId == modOpRec.DoorId && x.DoorOpId == modOpRec.DoorOpId)
.FirstOrDefault();
//if is not null edit the record found
if (currRec != null)
{
var recToRem = localDbCtx
.DbSetDoorOp
.Remove(currRec);
await localDbCtx.SaveChangesAsync();
fatto = true;
}
}
catch (Exception exc)
{
Log.Error($"Eccezione durante DoorOpDelete: {Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary>
/// Delete doorOp list
/// </summary>
/// <param name="modOpRec">Record to delete</param>
/// <returns></returns>
public async Task<bool> DoorOpDeleteRange(List<DoorOpModel> listOpRec)
{
bool fatto = false;
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
localDbCtx
.DbSetDoorOp
.RemoveRange(listOpRec);
await localDbCtx.SaveChangesAsync();
fatto = true;
}
catch (Exception exc)
{
Log.Error($"Eccezione durante DoorOpDeleteRange: {Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary>
/// Retrieving current data from door
/// </summary>
@@ -278,6 +336,7 @@ namespace WebDoorCreator.Data.Controllers
}
return dbResult;
}
/// <summary>
/// Retrieving current door operations by id
/// </summary>
@@ -295,7 +354,7 @@ namespace WebDoorCreator.Data.Controllers
.Where(x => x.DoorOpId == doorOpId)
.FirstOrDefault();
if(temp != null)
if (temp != null)
{
dbResult = temp;
}
@@ -333,106 +392,6 @@ namespace WebDoorCreator.Data.Controllers
}
return fatto;
}
/// <summary>
/// Update door's OP
/// </summary>
/// <param name="modOpRec">Records to add</param>
/// <returns></returns>
public async Task<bool> DoorOpUpdate(List<DoorOpModel> modOpRec)
{
bool fatto = false;
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
foreach (var item in modOpRec)
{
var currRec = localDbCtx
.DbSetDoorOp
.Where(x => x.DoorId == item.DoorId && x.DoorOpId == item.DoorOpId)
.FirstOrDefault();
if (currRec != null) //if is not null edit the record found
{
currRec.JsoncActVal = item.JsoncActVal;
currRec.JsoncConfigVal = item.JsoncConfigVal;
currRec.userConfirm = item.userConfirm;
currRec.DtConfirm = item.DtConfirm;
localDbCtx.Entry(currRec).State = EntityState.Modified;
}
}
await localDbCtx.SaveChangesAsync();
fatto = true;
}
catch (Exception exc)
{
Log.Error($"Eccezione durante DoorOpUpdate: {Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary>
/// Delete doorOp instance
/// </summary>
/// <param name="modOpRec">Record to delete</param>
/// <returns></returns>
public async Task<bool> DoorOpDelete(DoorOpModel modOpRec)
{
bool fatto = false;
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
var currRec = localDbCtx
.DbSetDoorOp
.Where(x => x.DoorId == modOpRec.DoorId && x.DoorOpId == modOpRec.DoorOpId)
.FirstOrDefault();
//if is not null edit the record found
if (currRec != null)
{
var recToRem = localDbCtx
.DbSetDoorOp
.Remove(currRec);
await localDbCtx.SaveChangesAsync();
fatto = true;
}
}
catch (Exception exc)
{
Log.Error($"Eccezione durante DoorOpDelete: {Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary>
/// Delete doorOp list
/// </summary>
/// <param name="modOpRec">Record to delete</param>
/// <returns></returns>
public async Task<bool> DoorOpDeleteRange(List<DoorOpModel> listOpRec)
{
bool fatto = false;
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
localDbCtx
.DbSetDoorOp
.RemoveRange(listOpRec);
await localDbCtx.SaveChangesAsync();
fatto = true;
}
catch (Exception exc)
{
Log.Error($"Eccezione durante DoorOpDeleteRange: {Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary>
/// Adding a new DoorOpType
@@ -534,7 +493,45 @@ namespace WebDoorCreator.Data.Controllers
}
/// <summary>
/// Getting door data by orderId
/// Update door's OP
/// </summary>
/// <param name="modOpRec">Records to add</param>
/// <returns></returns>
public async Task<bool> DoorOpUpdate(List<DoorOpModel> modOpRec)
{
bool fatto = false;
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
foreach (var item in modOpRec)
{
var currRec = localDbCtx
.DbSetDoorOp
.Where(x => x.DoorId == item.DoorId && x.DoorOpId == item.DoorOpId)
.FirstOrDefault();
if (currRec != null) //if is not null edit the record found
{
currRec.JsoncActVal = item.JsoncActVal;
currRec.JsoncConfigVal = item.JsoncConfigVal;
currRec.userConfirm = item.userConfirm;
currRec.DtConfirm = item.DtConfirm;
localDbCtx.Entry(currRec).State = EntityState.Modified;
}
}
await localDbCtx.SaveChangesAsync();
fatto = true;
}
catch (Exception exc)
{
Log.Error($"Eccezione durante DoorOpUpdate: {Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary>
/// Getting door data by numRec
/// </summary>
/// <returns></returns>
public List<DoorModel> DoorsGetByOrderId(int orderId)
@@ -563,6 +560,36 @@ namespace WebDoorCreator.Data.Controllers
return dbResult;
}
/// <summary>
/// Getting door list (last numRec)
/// </summary>
/// <returns></returns>
public List<DoorModel> DoorsGetLast(int numRec)
{
List<DoorModel> dbResult = new List<DoorModel>();
// retrieving data from db
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
// extracting entire set
dbResult = localDbCtx
.DbSetDoor
.Include(o => o.OrderNav)
.Include(t => t.TypeNav)
.OrderByDescending(x => x.DoorId)
.Take(numRec)
.AsNoTracking()
.ToList();
}
catch (Exception exc)
{
Log.Error($"Error in DoorsGetLast:{Environment.NewLine}{exc}");
}
}
return dbResult;
}
/// <summary>
/// Modifying or adding a new door
/// </summary>
@@ -626,6 +653,47 @@ namespace WebDoorCreator.Data.Controllers
return dbResult;
}
/// <summary>
/// Adding a new list value
/// </summary>
/// <param name="addRec">Record to add</param>
/// <returns></returns>
public async Task<bool> ListValuesAdd(List<ListValuesTempModel> addList)
{
bool fatto = false;
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
// stored di reset ListValues
var storedRes = localDbCtx
.Database
.ExecuteSqlRaw("exec dbo.stp_ListVal_Prepare");
await localDbCtx.SaveChangesAsync();
// import massivo dati in tab temp
localDbCtx
.DbSetValuesTemp
.AddRange(addList);
await localDbCtx.SaveChangesAsync();
// stored di merge dati in vocabolario
storedRes = localDbCtx
.Database
.ExecuteSqlRaw("exec dbo.stp_ListVal_Import");
fatto = true;
fatto = true;
}
catch (Exception exc)
{
Log.Error($"Eccezione durante ListValuesAdd: {Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary>
/// ListValues list (All)
/// </summary>
@@ -640,7 +708,6 @@ namespace WebDoorCreator.Data.Controllers
{
if (tableName != "*" && fieldName != "*")
{
// extracting entire set
dbResult = localDbCtx
.DbSetValues
@@ -673,49 +740,6 @@ namespace WebDoorCreator.Data.Controllers
return dbResult;
}
/// <summary>
/// Adding a new list value
/// </summary>
/// <param name="addRec">Record to add</param>
/// <returns></returns>
public async Task<bool> ListValuesAdd(List<ListValuesTempModel> addList)
{
bool fatto = false;
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
// stored di reset ListValues
var storedRes = localDbCtx
.Database
.ExecuteSqlRaw("exec dbo.stp_ListVal_Prepare");
await localDbCtx.SaveChangesAsync();
// import massivo dati in tab temp
localDbCtx
.DbSetValuesTemp
.AddRange(addList);
await localDbCtx.SaveChangesAsync();
// stored di merge dati in vocabolario
storedRes = localDbCtx
.Database
.ExecuteSqlRaw("exec dbo.stp_ListVal_Import");
fatto = true;
fatto = true;
}
catch (Exception exc)
{
Log.Error($"Eccezione durante ListValuesAdd: {Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary>
/// Adding a new order
/// </summary>
@@ -742,40 +766,6 @@ namespace WebDoorCreator.Data.Controllers
return fatto;
}
/// <summary>
/// Updating an order status
/// </summary>
/// <param name="orderId"></param>
/// <param name="newStatus"></param>
/// <returns></returns>
public async Task<bool> OrderUpdate(int orderId, int newStatus)
{
bool fatto = false;
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
var currRec = localDbCtx
.DbSetOrders
.Where(x => x.OrderId == orderId)
.FirstOrDefault();
//if is not null edit the record found
if (currRec != null)
{
currRec.Status = newStatus;
localDbCtx.Entry(currRec).State = EntityState.Modified;
}
await localDbCtx.SaveChangesAsync();
fatto = true;
}
catch (Exception exc)
{
Log.Error($"Eccezione durante OrderUpdate: {Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary>
/// Remove order
/// </summary>
@@ -841,6 +831,40 @@ namespace WebDoorCreator.Data.Controllers
return dbResult;
}
/// <summary>
/// Updating an order status
/// </summary>
/// <param name="orderId"></param>
/// <param name="newStatus"></param>
/// <returns></returns>
public async Task<bool> OrderUpdate(int orderId, int newStatus)
{
bool fatto = false;
using (WDCDataContext localDbCtx = new WDCDataContext(_configuration))
{
try
{
var currRec = localDbCtx
.DbSetOrders
.Where(x => x.OrderId == orderId)
.FirstOrDefault();
//if is not null edit the record found
if (currRec != null)
{
currRec.Status = newStatus;
localDbCtx.Entry(currRec).State = EntityState.Modified;
}
await localDbCtx.SaveChangesAsync();
fatto = true;
}
catch (Exception exc)
{
Log.Error($"Eccezione durante OrderUpdate: {Environment.NewLine}{exc}");
}
}
return fatto;
}
/// <summary>
/// Adding a new graphic param
/// </summary>
@@ -1051,6 +1075,7 @@ namespace WebDoorCreator.Data.Controllers
}
return dbResult;
}
public Dictionary<string, Dictionary<string, string>> VocLemmaGetAll()
{
Dictionary<string, Dictionary<string, string>> DTOResult = new Dictionary<string, Dictionary<string, string>>();
@@ -171,6 +171,16 @@ namespace WebDoorCreator.Data.Services
answ = $"{rawData}";
}
}
// se non trovata --> missing!
if (string.IsNullOrEmpty(answ))
{
// leggo missing standard...
string missingFilePath = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "wwwroot/images", "MissingOrange.svg");
if (File.Exists(missingFilePath))
{
answ = File.ReadAllText(missingFilePath);
}
}
return answ;
}
@@ -1,7 +1,5 @@
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using Newtonsoft.Json;
using System.Configuration;
using WebDoorCreator.Data.DbModels;
using WebDoorCreator.Data.DTO;
using WebDoorCreator.Data.Services;
@@ -11,11 +9,14 @@ namespace WebDoorCreator.UI.Components.Buttons
{
public partial class ButtonsDoorDef
{
#region Public Properties
[CascadingParameter]
public bool B_doorOpUpd { get; set; }
[CascadingParameter]
public string ErrCode { get; set; } = "ERROREEEEE";
[CascadingParameter]
public int idDoor { get; set; } = 0;
@@ -24,6 +25,28 @@ namespace WebDoorCreator.UI.Components.Buttons
[CascadingParameter]
public bool IsErr { get; set; } = false;
#endregion Public Properties
#region Public Methods
public async Task SaveYaml(string ddfContent)
{
await Task.Delay(1);
string fileName = Path.Combine("temp", $"Conf.yaml");
if (File.Exists(fileName))
{
File.Delete(fileName);
}
// scrivo!
File.WriteAllText(fileName, ddfContent);
}
#endregion Public Methods
#region Protected Properties
protected Dictionary<string, string> a { get; set; } = new Dictionary<string, string>();
protected bool change
@@ -62,20 +85,13 @@ namespace WebDoorCreator.UI.Components.Buttons
[Inject]
protected WebDoorCreatorService WDCService { get; set; } = null!;
[Inject]
protected WDCUserService WDCUService { get; set; } = null!;
public async Task SaveYaml(string ddfContent)
{
await Task.Delay(1);
string fileName = Path.Combine("temp", $"Conf.yaml");
if (File.Exists(fileName))
{
File.Delete(fileName);
}
// scrivo!
File.WriteAllText(fileName, ddfContent);
}
#endregion Protected Properties
#region Protected Methods
/// <summary>
/// Effettua Richiesta visione porta 3D
@@ -117,7 +133,7 @@ namespace WebDoorCreator.UI.Components.Buttons
// versione corrente del DDF generato
int currVers = await QDataServ.SendCalcReq(idDoor, currDdf);
if(currVers > 0)
if (currVers > 0)
{
IsErr = false;
}
@@ -150,6 +166,11 @@ namespace WebDoorCreator.UI.Components.Buttons
await Task.Delay(1);
NavManager.NavigateTo($"OrderDetails?idOrd={idOrd}");
}
#endregion Protected Methods
#region Private Methods
private async void WDCRService_EA_UpdDoorOp()
{
await InvokeAsync(() =>
@@ -157,5 +178,7 @@ namespace WebDoorCreator.UI.Components.Buttons
StateHasChanged();
});
}
#endregion Private Methods
}
}
@@ -2,6 +2,9 @@
{
<div class="d-flex justify-content-between px-2 py-2" style="background-color: @bgColor">
<div class="d-flex justify-content-between">
<button class="btn btn-danger" @onclick="() => deleteRecord()">Delete Door <i class="fa-solid fa-trash"></i></button>
</div>
<div class="d-flex justify-content-between">
@*<div class="badge rounded-pilll bg-dark text-light">Insert Date</div>*@
<div>Insert Date: <b>@currOrderStatus.DateIns</b></div>
</div>
@@ -1,15 +1,66 @@
using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using WebDoorCreator.Data.DbModels;
using WebDoorCreator.UI.Data;
namespace WebDoorCreator.UI.Components.DoorDef
{
public partial class DoorDefOrderTopRow
{
[Parameter]
public OrderStatusViewModel? currOrderStatus { get; set; } = null;
#region Public Properties
[Parameter]
public string bgColor { get; set; } = "";
[CascadingParameter]
public int idDoor { get; set; } = 0;
[Parameter]
public OrderStatusViewModel? currOrderStatus { get; set; } = null;
#endregion Public Properties
#region Protected Properties
[Inject]
protected IJSRuntime JSRuntime { get; set; } = null!;
[Inject]
protected WebDoorCreatorService WDCService { get; set; } = null!;
[Inject]
protected NavigationManager NavManager { get; set; } = null!;
#endregion Protected Properties
#region Protected Methods
/// <summary>
/// Elimina porta se richiesto
/// </summary>
/// <returns></returns>
protected async Task deleteRecord()
{
if (!await JSRuntime.InvokeAsync<bool>("confirm", $"Do you really want to delete this door?"))
return;
await Task.Delay(1);
if (idDoor > 0 && currOrderStatus != null)
{
var ordDoors = await WDCService.DoorGetByOrderId(currOrderStatus.OrderId);
if (ordDoors != null)
{
var CurrDoor = ordDoors.Where(x => x.DoorId == idDoor).FirstOrDefault();
if (CurrDoor != null)
{
await WDCService.DoorDelete(CurrDoor);
if (currOrderStatus != null)
{
NavManager.NavigateTo($"OrderDetails?idOrd={currOrderStatus.OrderId}&orderStat={currOrderStatus.OrderStatus}");
}
}
}
}
}
#endregion Protected Methods
}
}
@@ -1,12 +1,12 @@
<div class="" style="height:100%; width:100%; position:sticky; background: linear-gradient(#AFCFD1, #92B2C4);min-height: 55rem;max-height: 55rem;">
@*@if (IsErr)
{
@*<div class="alert alert-warning text-center fs-2">@ErrCode</div>
}*@
@*<div class="" style="height:100%; width:100%; position:sticky; background: linear-gradient(#AFCFD1, #92B2C4);min-height: 55rem;max-height: 55rem;">*@
<div class="" style="height:100%; width:100%; background: linear-gradient(#AFCFD1, #92B2C4);min-height: 50rem;">
@if (!string.IsNullOrEmpty(@SvgContent))
{
<div style="height: 0;width: 15rem;align-items: center;display: flex;flex-wrap: wrap;justify-content: center;">
@svgPreview
@*<div style="height: 0;width: 15rem;align-items: center;display: flex;flex-wrap: wrap;justify-content: center;">*@
<div style="align-items: center;display: flex;flex-wrap: wrap;justify-content: center;">
<div style="width: 50%; max-height: 30rem;">
@svgPreview
</div>
</div>
}
</div>
@@ -10,7 +10,7 @@
<DoorSvgObj LineColor="rgb(39, 174, 96)" LineWidth="8" ObjH="200" ObjW="900" LeftTextClass="col-10 fs-1 fw-bold" RightTextClass="col-2" EC_ExeFunct="@(()=> setCloneDoorMode(""))" ObjId="-2" TextData="@AddFromTemplDict" ImagePath="images/LogoEgwBlue.png"></DoorSvgObj>
</div>
<div class="col-4 py-1">
<DoorSvgObj LineColor="#8E44AD" LineWidth="8" ObjH="200" ObjW="900" LeftTextClass="col-10 fs-1 fw-bold" RightTextClass="col-2" EC_ExeFunct="@(()=> sendToAbh(currOrderId, orderStatus))" ObjId="-3" TextData="@SendOrderDict" Message1="@currOrderId.ToString()" Message2="@orderStatus.ToString()" ImagePath="images/LogoEgwWhite.png"></DoorSvgObj>
<DoorSvgObj LineColor="#8E44AD" LineWidth="8" ObjH="200" ObjW="900" LeftTextClass="col-10 fs-1 fw-bold" RightTextClass="col-2" EC_ExeFunct="@(()=> sendToCompany(currOrderId, orderStatus))" ObjId="-3" TextData="@SendOrderDict" Message1="@currOrderId.ToString()" Message2="@orderStatus.ToString()" ImagePath="images/LogoEgwWhite.png"></DoorSvgObj>
</div>
</div>
}
@@ -73,7 +73,7 @@ namespace WebDoorCreator.UI.Components.DoorMan
protected async Task editRec(string doorId)
{
await Task.Delay(1);
NavManager.NavigateTo($"/DoorDefinition?idOrd={currOrderId}&idDoor={int.Parse(doorId)}");
NavManager.NavigateTo($"DoorDefinition?idOrd={currOrderId}&idDoor={int.Parse(doorId)}");
}
protected async Task getBackStatus()
@@ -111,9 +111,9 @@ namespace WebDoorCreator.UI.Components.DoorMan
{
AddFromTemplDict.Add("ADD NEW DOOR FROM TEMPLATE", "");
}
if (!SendOrderDict.ContainsKey("SEND TO ABH"))
if (!SendOrderDict.ContainsKey("SEND TO DCA"))
{
SendOrderDict.Add("SEND TO ABH", "");
SendOrderDict.Add("SEND TO DCA", "");
}
if (currOrderId != -1)
{
@@ -147,8 +147,8 @@ namespace WebDoorCreator.UI.Components.DoorMan
protected Dictionary<string, string> textDictSetup(DoorModel door)
{
Dictionary<string, string> answ = new Dictionary<string, string>();
answ.Add("Doors N°:", $"{door.Quantity}");
answ.Add("Model N°:", $"{door.TypeNav?.TypeId}");
answ.Add("Doors N:", $"{door.Quantity}");
answ.Add("Model N:", $"{door.TypeNav?.TypeId}");
answ.Add("DoorPrice:", $"{(door.Quantity * door.UnitCost):C2}");
return answ;
}
@@ -176,7 +176,7 @@ namespace WebDoorCreator.UI.Components.DoorMan
}
// rimando alla pagina... dettaglio...
NavManager.NavigateTo($"/DoorDefinition?idOrd={currOrderId}&idDoor={doorId}");
NavManager.NavigateTo($"DoorDefinition?idOrd={currOrderId}&idDoor={doorId}");
}
/// <summary>
/// Path del servizio di recupero SVG delle porte
@@ -245,7 +245,7 @@ namespace WebDoorCreator.UI.Components.DoorMan
}
}
}
protected async void sendToAbh(int ordId, int orderStat)
protected async void sendToCompany(int ordId, int orderStat)
{
if (orderStat == 10)
{
@@ -5,7 +5,7 @@
<div class="d-flex justify-content-between w-100 px-4">
<div class="d-flex justify-content-between" style="width: 80%;">
<a class="navbar-brand" href="/">
<img src="/images/DCOlogoCut.png" style="width: 7.5rem;height: 3rem;" />
<img src="images/DCOlogoCut.png" style="width: 7.5rem;height: 3rem;" />
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
@@ -4,11 +4,7 @@
@if (HwToShow != null)
{
<div class="row m-0">
<HardwareNewPanel HwInst="getInstNumber(HwToShow.Value)" HwLabel="@HwToShow.Label" E_act2Rel="setRefOnDelete" Lingua="@Lingua" HwCode="@HwToShow.TableName" HwAdded="@hwAdd" DoorId="@DoorId"></HardwareNewPanel>
</div>
<div>
<button class="btn btn-info" @onclick="()=>backToList()">BACK TO LIST</button>
<HardwareNewPanel HwLabel="@HwToShow.Label" E_act2Rel="setRefOnDelete" Lingua="@Lingua" HwCode="@HwToShow.TableName" HwAdded="@hwAdd" DoorId="@DoorId"></HardwareNewPanel>
</div>
}
else
@@ -47,12 +47,6 @@ namespace WebDoorCreator.UI.Components.Hardware
#region Protected Methods
protected async Task backToList()
{
await Task.Delay(1);
HwToShow = null;
}
protected async Task hwToAdd()
{
await Task.Delay(1);
@@ -250,6 +244,7 @@ namespace WebDoorCreator.UI.Components.Hardware
{
if (isDel)
{
HwToShow = null;
await ReloadData();
}
}
@@ -6,16 +6,14 @@ else
{
@if (DoorOpList != null)
{
@*<div class="text-center">
<div class="row col-4">
<div class="rectangle">
@(translate(HwLabel))
<div class="circle" @onclick="()=>hwToAdd()"></div>
</div>
<div class="row">
<div class="col-4">
<HwSvgObj LineColor="#CFD8DC" LineWidth="8" ObjH="200" ObjW="700" EC_ExeFunct="exeFun" ObjId="RETURN" ItemName="Back to List" ItemCount="0" ShowPlus="false" ImagePath="images/icons/ExitWhite.svg"></HwSvgObj>
</div>
<div class="col-4"></div>
<div class="col-4">
<HwSvgObj LineColor="#CFD8DC" LineWidth="8" ObjH="200" ObjW="700" EC_ExeFunct="exeFun" ObjId="@HwCode" ItemName="@(translate(HwLabel))" ItemCount="@HwInst" ShowPlus="true" ImagePath="images/icons/PlusWhite.svg"></HwSvgObj>
</div>
</div>*@
<div class="row col-4">
<HwSvgObj LineColor="#CFD8DC" LineWidth="8" ObjH="200" ObjW="700" EC_ExePlus="@(()=> hwToAdd(""))" ObjId="@HwCode" ItemName="@(translate(HwLabel))" ItemCount="@HwInst" ShowPlus="true" ImagePath=""></HwSvgObj>
</div>
<div class="row">
@@ -1,8 +1,7 @@
using Microsoft.AspNetCore.Components;
using Newtonsoft.Json;
using WebDoorCreator.Data;
using WebDoorCreator.Data.DbModels;
using WebDoorCreator.UI.Components.DoorMan;
using WebDoorCreator.UI.Components.SvgComp;
using WebDoorCreator.UI.Data;
using static WebDoorCreator.UI.Data.WDCRefreshService;
@@ -33,25 +32,95 @@ namespace WebDoorCreator.UI.Components.Hardware
[Parameter]
public string HwLabel { get; set; } = "";
[Parameter]
public int HwInst { get; set; } = 0;
[Parameter]
public string Lingua { get; set; } = "EN";
[CascadingParameter]
public string UserId { get; set; } = "";
protected bool _isDoorOpConf { get; set; } = false;
#endregion Public Properties
#region Public Methods
public void Dispose()
{
WDCRefresh.EA_ConfDoorOp -= WDCRefresh_EA_ConfDoorOp;
}
#endregion Public Methods
#region Protected Properties
protected List<DoorOpModel>? DoorOpList { get; set; } = null!;
protected bool _isDoorOpConf { get; set; } = false;
protected bool B_doorOpUpd
{
get => WDCRService.isDoorOpUpd;
set => WDCRService.isDoorOpUpd = value;
}
protected List<DoorOpModel> DoorOp2ModList { get; set; } = new List<DoorOpModel>();
protected List<DoorOpModel>? DoorOpList { get; set; } = null!;
protected int HwInst
{
get
{
int answ = 0;
if (DoorOpList != null)
{
answ = DoorOpList
.Where(x => x.ObjectId == HwCode)
.ToList()
.Count();
}
return answ;
}
}
//protected int instNum { get; set; } = 1;
protected bool isLoading { get; set; } = false;
protected List<DoorOpModel>? ListRecord { get; set; } = null;
[Inject]
protected WDCRefreshService WDCRefresh { get; set; } = null!;
[Inject]
protected WDCRefreshService WDCRService { get; set; } = null!;
[Inject]
protected WebDoorCreatorService WDCService { get; set; } = null!;
[Inject]
protected WDCVocabularyService WDVService { get; set; } = null!;
#endregion Protected Properties
#region Protected Methods
protected async Task exeFun(HwSvgObj.ActionReq action)
{
await Task.Delay(1);
switch (action)
{
case HwSvgObj.ActionReq.Minus:
// nulla (x ora)
break;
case HwSvgObj.ActionReq.Plus:
await hwToAdd("");
break;
case HwSvgObj.ActionReq.Select:
default:
await E_act2Rel.InvokeAsync(true);
break;
}
}
protected int getDoorOpInstNum(int doorOpId)
{
int answ = 0;
@@ -62,56 +131,6 @@ namespace WebDoorCreator.UI.Components.Hardware
return answ + 1;
}
[Inject]
protected WDCRefreshService WDCRefresh { get; set; } = null!;
[Inject]
protected WebDoorCreatorService WDCService { get; set; } = null!;
[Inject]
protected WDCVocabularyService WDVService { get; set; } = null!;
public void Dispose()
{
WDCRefresh.EA_ConfDoorOp -= WDCRefresh_EA_ConfDoorOp;
}
protected override async Task OnInitializedAsync()
{
await Task.Delay(1);
WDCRefresh.EA_ConfDoorOp += WDCRefresh_EA_ConfDoorOp;
//return base.OnInitializedAsync();
}
protected string translate(string lemma)
{
string answ = "";
answ = WDVService.Traduci(Lingua, lemma);
return answ;
}
private void WDCRefresh_EA_ConfDoorOp(object? sender, EventArgs e)
{
DOPEventArgs currArgs = (DOPEventArgs)e;
// SE sono sula porta indicata + objId corretto --> refresh
if (currArgs.DoorId == DoorId && currArgs.ObjectId == HwCode)
{
var pupd = InvokeAsync(async () => await ReloadData());
}
}
#endregion Protected Properties
#region Protected Methods
protected bool B_doorOpUpd
{
get => WDCRService.isDoorOpUpd;
set => WDCRService.isDoorOpUpd = value;
}
[Inject]
protected WDCRefreshService WDCRService { get; set; } = null!;
protected async Task hwToAdd(string message)
{
await Task.Delay(1);
@@ -236,22 +255,21 @@ namespace WebDoorCreator.UI.Components.Hardware
await Task.Delay(1);
B_doorOpUpd = true;
DoorOp2ModList.Add(currItem);
}
}
protected override async Task OnInitializedAsync()
{
await Task.Delay(1);
WDCRefresh.EA_ConfDoorOp += WDCRefresh_EA_ConfDoorOp;
//return base.OnInitializedAsync();
}
protected override async Task OnParametersSetAsync()
{
await ReloadData();
}
#endregion Protected Methods
#region Private Methods
protected bool isLoading { get; set; } = false;
protected List<DoorOpModel>? ListRecord { get; set; } = null;
protected async Task setRefOnDelete(bool isDel)
{
if (isDel)
@@ -260,6 +278,19 @@ namespace WebDoorCreator.UI.Components.Hardware
}
}
protected string translate(string lemma)
{
string answ = "";
answ = WDVService.Traduci(Lingua, lemma);
return answ;
}
#endregion Protected Methods
#region Private Methods
private async Task ReloadData()
{
isLoading = true;
@@ -269,17 +300,25 @@ namespace WebDoorCreator.UI.Components.Hardware
DoorOpList = null;
await Task.Delay(1);
ListRecord = await WDCService.DoorOpGetByDoorId(DoorId);
var tempListVal = await WDCService.ListValuesGetAll(HwCode, "Folder");
if (ListRecord != null)
{
DoorOpList = ListRecord.Where(x => (x.DoorId == DoorId) && (x.ObjectId == HwCode)).ToList();
}
isLoading = false;
//await Task.Delay(50);
//await Task.Delay(50);
await InvokeAsync(StateHasChanged);
}
private void WDCRefresh_EA_ConfDoorOp(object? sender, EventArgs e)
{
DOPEventArgs currArgs = (DOPEventArgs)e;
// SE sono sula porta indicata + objId corretto --> refresh
if (currArgs.DoorId == DoorId && currArgs.ObjectId == HwCode)
{
var pupd = InvokeAsync(async () => await ReloadData());
}
}
#endregion Private Methods
}
}
@@ -1,7 +1,7 @@
<svg viewBox="0 0 @ObjW @ObjH" width="100%" height="100%" xmlns="http://www.w3.org/2000/svg">
<g transform="translate(0,@LineDist)">
<foreignObject width="@TextAreaWidth" height="100%">
<div class="d-flex justify-content-between rectangle p-3 @cardClass" style="@TextStyle" @onclick="()=>execFunc(false)">
<div class="d-flex justify-content-between rectangle p-3 @cardClass" style="@TextStyle;" @onclick="() => doExecFunc(ActionReq.Select, false)">
<div>
@ItemName
</div>
@@ -29,16 +29,16 @@
<image x="@(CircleImg.rad/2)" y="0" href="@ImagePath" width="@CircleImg.rad" height="100%"></image>
@if (ShowPlus)
{
<rect x="0" y="0" width="100%" height="100%" fill="@PlusColor" style="opacity: 20%;" />
<rect x="0" y="0" width="100%" height="100%" fill="@PlusColor" style="opacity: 30%;" />
}
</pattern>
</defs>
@if (ShowPlus)
{
<circle id="circleCont" cx="@CircleImg.cx" cy="@CircleImg.cy" r="@CircleImg.rad" fill="url(#@($"contImg_{ObjId}"))" style="cursor: pointer;" @onclick="()=>execPlus()" />
<circle id="circleCont" cx="@CircleImg.cx" cy="@CircleImg.cy" r="@CircleImg.rad" fill="url(#@($"contImg_{ObjId}"))" style="cursor: pointer;" @onclick="() => doExecFunc(ActionReq.Plus, true)" />
}
else
{
<circle id="circleCont" cx="@CircleImg.cx" cy="@CircleImg.cy" r="@CircleImg.rad" fill="url(#@($"contImg_{ObjId}"))" style="cursor: pointer;" @onclick="()=>execFunc(true)" />
<circle id="circleCont" cx="@CircleImg.cx" cy="@CircleImg.cy" r="@CircleImg.rad" fill="url(#@($"contImg_{ObjId}"))" style="cursor: pointer;" @onclick="() => doExecFunc(ActionReq.Select, true)" />
}
</svg>
@@ -1,47 +1,39 @@
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.Components.Report;
using WebDoorCreator.UI.Shared;
using WebDoorCreator.Data.DbModels;
using EgwCoreLib.Razor;
namespace WebDoorCreator.UI.Components.SvgComp
{
public partial class HwSvgObj
{
#region Public Enums
/// <summary>
/// Enum delle azioni associate al controllo
/// </summary>
public enum ActionReq
{
Minus,
Plus,
Select
}
#endregion Public Enums
#region Public Properties
[Parameter]
public EventCallback<bool> EC_ExeFunct { get; set; }
public EventCallback<ActionReq> EC_ExeFunct { get; set; }
/// <summary>
/// Path img da mostrare
/// </summary>
[Parameter]
public string ImagePath { get; set; } = "";
[Parameter]
public EventCallback<bool> EC_ExePlus { get; set; }
public int ItemCount { get; set; } = 0;
[Parameter]
public string ImagePath { get; set; } = "images/LogoEgw.png";
public string ItemName { get; set; } = "";
[Parameter]
public string LineColor { get; set; } = "#00838F";
@@ -49,16 +41,6 @@ namespace WebDoorCreator.UI.Components.SvgComp
[Parameter]
public int LineWidth { get; set; } = 8;
[Parameter]
public string ItemName { get; set; } = "";
[Parameter]
public int ItemCount { get; set; } = 0;
[Parameter]
public string PlusColor { get; set; } = "green";
[Parameter]
public int ObjH { get; set; } = 204;
@@ -68,6 +50,9 @@ namespace WebDoorCreator.UI.Components.SvgComp
[Parameter]
public int ObjW { get; set; } = 450;
[Parameter]
public string PlusColor { get; set; } = "#69FF69";
[Parameter]
public bool ShowPlus { get; set; } = false;
@@ -78,6 +63,10 @@ namespace WebDoorCreator.UI.Components.SvgComp
#region Protected Properties
protected string cardClass
{
get => ItemCount > 0 ? "bg-primary text-light" : "bg-inactive text-dark";
}
protected CircleData CircleImg { get; set; } = null!;
@@ -95,11 +84,6 @@ namespace WebDoorCreator.UI.Components.SvgComp
get => ObjW - (ObjH * 90 / 100);
}
protected string cardClass
{
get => ItemCount > 0 ? "bg-primary text-light" : "bg-inactive text-dark";
}
#endregion Protected Properties
#region Protected Methods
@@ -107,20 +91,19 @@ namespace WebDoorCreator.UI.Components.SvgComp
/// <summary>
/// Invia evento principale
/// </summary>
/// <param name="forceSend">se true manda sempre EC_ExeFunct, altrimenti NON invia se showPlus attivo...</param>
protected void execFunc(bool forceSend)
/// <param name="action">Azione richiesta</param>
/// <param name="forceSend">
/// se true manda sempre EC_ExeFunct, altrimenti NON invia se showPlus attivo...
/// </param>
protected void doExecFunc(ActionReq action, bool forceSend)
{
// invia la chiamata richiesta secondo configurazione...
if (forceSend || !ShowPlus)
{
EC_ExeFunct.InvokeAsync(true);
EC_ExeFunct.InvokeAsync(action);
}
}
protected void execPlus()
{
EC_ExePlus.InvokeAsync(true);
}
protected override void OnParametersSet()
{
setupGraphParams();
@@ -212,7 +212,7 @@ namespace WebDoorCreator.UI.Data
TableName = "All",
FieldName = "OrderStep",
Value = "20",
Label = "Sent to ABH",
Label = "Sent to DCA",
Ordinal = 20,
DefaultVal = "#FBC02D",
InputType = ""
@@ -597,7 +597,47 @@ namespace WebDoorCreator.UI.Data
}
/// <summary>
/// Doors list by orderId
/// Doors list, last in desc order
/// </summary>
public async Task<List<DoorModel>?> DoorGetLast(int numRec)
{
string source = "DB";
List<DoorModel>? dbResult = new List<DoorModel>();
// cerco da cache
string currKey = $"{Constants.rKeyDoorLast}:{numRec}";
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
string? rawData = await redisDb.StringGetAsync(currKey);
if (!string.IsNullOrEmpty(rawData))
{
source = "REDIS";
var tempResult = JsonConvert.DeserializeObject<List<DoorModel>>(rawData);
if (tempResult == null)
{
dbResult = new List<DoorModel>();
}
else
{
dbResult = tempResult;
}
}
else
{
dbResult = dbController.DoorsGetLast(numRec);
rawData = JsonConvert.SerializeObject(dbResult, JSSettings);
await redisDb.StringSetAsync(currKey, rawData, FastCache);
}
if (dbResult == null)
{
dbResult = new List<DoorModel>();
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"DoorGetLast | {source} in: {ts.TotalMilliseconds} ms");
return dbResult;
}
/// <summary>
/// Doors list by numRec
/// </summary>
public async Task<List<DoorModel>?> DoorGetByOrderId(int orderId)
{
@@ -720,7 +760,7 @@ namespace WebDoorCreator.UI.Data
}
/// <summary>
/// Doors list by orderId
/// Doors list by numRec
/// </summary>
public async Task<List<DoorOpModel>> DoorOpGetByDoorId(int doorId)
{
@@ -760,7 +800,7 @@ namespace WebDoorCreator.UI.Data
return dbResult;
}
/// <summary>
/// Doors list by orderId
/// Doors list by numRec
/// </summary>
public async Task<DoorOpModel> DoorOpGetById(int doorOpId)
{
@@ -906,7 +946,7 @@ namespace WebDoorCreator.UI.Data
{
// cerco il setup del template selezionato
var listRecordTmp = await ListValuesGetAll(currDoorOp.ObjectId, "template");
if (listRecordTmp != null && actDict.ContainsKey("Folder") && (actDict.ContainsKey("template") || actDict.ContainsKey("shape")) )
if (listRecordTmp != null && actDict.ContainsKey("Folder") && (actDict.ContainsKey("template") || actDict.ContainsKey("shape")))
{
string actKey = actDict["template"];// Path.Combine(actDict["Folder"], actDict["template"]);
var firstTemplate = listRecordTmp.Where(x => x.Value == actKey).FirstOrDefault();
@@ -962,7 +1002,7 @@ namespace WebDoorCreator.UI.Data
}
/// <summary>
/// Doors list by orderId
/// Doors list by numRec
/// </summary>
public async Task<List<DoorOpTypeModel>?> DoorOpTypeGetAll()
{
@@ -1365,7 +1405,9 @@ namespace WebDoorCreator.UI.Data
}
else
{
dbResult = dbController.OrderStatusGetAll(companyId, orderStatus, dataFrom, dataTo);
var rawResult = dbController.OrderStatusGetAll(companyId, orderStatus, dataFrom, dataTo);
// ordino desc in ram...
dbResult = rawResult.OrderByDescending(x => x.OrderId).ToList();
rawData = JsonConvert.SerializeObject(dbResult, JSSettings);
await redisDb.StringSetAsync(currKey, rawData, UltraLongCache);
}
@@ -1,9 +0,0 @@
@page "/abhapprove"
<h3>Approved by ABH</h3>
<img src="images/Approved_by_ABH.png" />
@code {
}
@@ -0,0 +1,9 @@
@page "/ApprovedByCompany"
<h3>Approved by DCA</h3>
<img src="images/Approved_by_DCA.png" />
@code {
}
@@ -1,9 +0,0 @@
@page "/senttoabh"
<h3>Sent to ABH</h3>
<img src="images/Sent_to_ABH.png" />
@code {
}
@@ -1,4 +1,4 @@
@page "/definingdoorsstage"
@page "/DefinitionDoorStage"
<h3>Order definition stage</h3>
+3 -3
View File
@@ -18,11 +18,11 @@
</CascadingValue>
</CascadingValue>
</div>
<div class="col-7 pe-0">
<div class="col-8 pe-0">
<div class="mb-3 ps-1 pe-0">
<DoorDefStepList CurrDoorDefStatus="currDefStep" E_CurrStep="setStep"></DoorDefStepList>
</div>
<div class="px-4">
<div class="px-2">
<CascadingValue Value="@WDCUService.userId">
@if (currDefStep == 10)
{
@@ -44,7 +44,7 @@
</CascadingValue>
</div>
</div>
<div class="col-5 p-0">
<div class="col-4 p-0">
<CascadingValue Value="@idDoor">
<DoorPreview SvgContent="@DoorSvgContent"></DoorPreview>
</CascadingValue>
@@ -6,7 +6,6 @@ using WebDoorCreator.Data;
using WebDoorCreator.Data.DbModels;
using WebDoorCreator.Data.Services;
using WebDoorCreator.UI.Data;
using static WebDoorCreator.UI.Data.WDCRefreshService;
namespace WebDoorCreator.UI.Pages
{
@@ -34,6 +33,7 @@ namespace WebDoorCreator.UI.Pages
protected int idOrd { get; set; } = 0;
protected bool isDoorOpConf { get; set; } = false;
protected bool IsErr { get; set; } = false;
[Inject]
@@ -50,7 +50,6 @@ namespace WebDoorCreator.UI.Pages
protected QueueDataService QDataServ { get; set; } = null!;
protected string userLang { get; set; } = "EN";
protected bool isDoorOpConf { get; set; } = false;
[Inject]
protected WDCRefreshService WDCRService { get; set; } = null!;
@@ -75,7 +74,6 @@ namespace WebDoorCreator.UI.Pages
});
}
/// <summary>
/// gestione rilettura info
/// </summary>
@@ -101,13 +99,13 @@ namespace WebDoorCreator.UI.Pages
}
userLang = WDCUService.currLanguage ?? "EN";
#if false
isDoorOpConf = WDCRService.isDoorOpConf;
isDoorOpConf = WDCRService.isDoorOpConf;
#endif
WDCUService.EA_CurrLanguage += WDUService_EA_CurrLanguage;
QDataServ.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage;
WDCRService.EA_UpdDoorOp += WDService_EA_DoorOpUpdated;
#if false
WDCRService.EA_ConfDoorOp += WDService_EA_DoorOpConfirmed;
WDCRService.EA_ConfDoorOp += WDService_EA_DoorOpConfirmed;
#endif
}
@@ -215,8 +213,6 @@ namespace WebDoorCreator.UI.Pages
//if (string.IsNullOrEmpty(DoorSvgContent))
//{
//}
await Task.Run(async () => await InvokeAsync(StateHasChanged));
}
@@ -235,14 +231,14 @@ namespace WebDoorCreator.UI.Pages
StateHasChanged();
}
#endregion Private Methods
#if false
private void WDService_EA_DoorOpConfirmed()
{
isDoorOpConf = WDCRService.isDoorOpConf;
StateHasChanged();
}
}
#endif
#endregion Private Methods
}
}
@@ -31,7 +31,7 @@ namespace WebDoorCreator.UI.Pages
protected OrderStatusViewModel? orderView { get; set; } = null;
/// <summary>
/// Unità di misura selezionata
/// Unit di misura selezionata
/// </summary>
protected string currMeaUnit { get; set; } = "mm";
@@ -67,7 +67,7 @@ namespace WebDoorCreator.UI.Pages
}
// rimando alla pagina... dettaglio...
NavManager.NavigateTo($"/DoorDefinition?idOrd={idOrd}&idDoor={doorId}");
NavManager.NavigateTo($"DoorDefinition?idOrd={idOrd}&idDoor={doorId}");
}
+10 -3
View File
@@ -5,12 +5,19 @@
padding: 1rem 4rem 4.5rem 4rem;
}
.cardDoors {
/*width: 100%;
//transform: translate(0, -53px);
border-radius: 60px 60px 0 0;
transform: translate(0, -120px);
background-color: #FFF;
padding: 0;
box-shadow: rgba(0, 0, 0, 0.45) 0px -24px 27px -20px;*/
width: 100%;
border-radius: 60px 60px 0 0;
border-radius: 60px;
transform: translate(0, -120px);
background-color: #FFF;
padding: 0;
box-shadow: rgba(0, 0, 0, 0.45) 0px -24px 27px -20px;
background-color: #FFF;
box-shadow: rgba(0, 0, 0, 0.45) 0px 20px 22px -2px;
}
.testataOrder {
border: 3px solid var(--bgStepColor);
@@ -6,13 +6,21 @@
}
.cardDoors {
width: 100%;
/*width: 100%;
//transform: translate(0, -53px);
border-radius: 60px 60px 0 0;
transform: translate(0, -120px);
background-color: #FFF;
padding: 0;
box-shadow: rgba(0, 0, 0, 0.45) 0px -24px 27px -20px;
box-shadow: rgba(0, 0, 0, 0.45) 0px -24px 27px -20px;*/
width: 100%;
border-radius: 60px;
transform: translate(0, -120px);
padding: 0;
background-color: #FFF;
box-shadow: rgba(0, 0, 0, 0.45) 0px 20px 22px -2px;
}
.testataOrder {
+1 -1
View File
@@ -1 +1 @@
.cardStatus{border-radius:60px;background-color:var(--bgStepColor);transform:translate(0,-65px);padding:1rem 4rem 4.5rem 4rem;}.cardDoors{width:100%;border-radius:60px 60px 0 0;transform:translate(0,-120px);background-color:#fff;padding:0;box-shadow:rgba(0,0,0,.45) 0 -24px 27px -20px;}.testataOrder{border:3px solid var(--bgStepColor);padding:1rem 1rem 4.5rem 1rem;border-radius:60px 60px 20px 20px;transform:translate(63px,0);width:93%;z-index:-99999;position:relative;font-size:17px;background-color:#031926;}
.cardStatus{border-radius:60px;background-color:var(--bgStepColor);transform:translate(0,-65px);padding:1rem 4rem 4.5rem 4rem;}.cardDoors{width:100%;border-radius:60px;transform:translate(0,-120px);padding:0;background-color:#fff;box-shadow:rgba(0,0,0,.45) 0 20px 22px -2px;}.testataOrder{border:3px solid var(--bgStepColor);padding:1rem 1rem 4.5rem 1rem;border-radius:60px 60px 20px 20px;transform:translate(63px,0);width:93%;z-index:-99999;position:relative;font-size:17px;background-color:#031926;}
+1 -1
View File
@@ -3,7 +3,7 @@
<AuthorizeView>
<Authorized>
<div style="border-radius: 18px; padding: 1rem 4rem 0.5rem 4rem; box-shadow: rgba(0, 0, 0, 0.45) 0px 20px 22px -9px; margin-top: 0.5rem; margin-bottom: 1rem;">
<div class="cardOrders">
<div class="row mb-3">
<div class="fw-bold fs-2 text-start col-4">
WEB DOOR CREATOR
@@ -178,7 +178,7 @@ namespace WebDoorCreator.UI.Pages
await Task.Delay(1);
currOrderId = orderId;
await ReloadData();
goToDefPage = $"/DoorDefinition?idOrd={orderId}";
goToDefPage = $"DoorDefinition?idOrd={orderId}";
}
protected async Task catchDoorChange(bool isChanged)
@@ -0,0 +1,9 @@
.cardOrders {
width: 100%;
border-radius: 18px;
padding: 1rem 4rem 0.5rem 4rem;
box-shadow: rgba(0, 0, 0, 0.45) 0px 20px 22px 3px;
/*box-shadow: rgba(0, 0, 0, 0.45) 0px 20px 22px -9px;*/
margin-top: 0.5rem;
margin-bottom: 1rem;
}
@@ -0,0 +1,9 @@
.cardOrders {
width: 100%;
border-radius: 18px;
padding: 1rem 4rem 0.5rem 4rem;
box-shadow: rgba(0, 0, 0, 0.45) 0px 20px 22px 3px;
/*box-shadow: rgba(0, 0, 0, 0.45) 0px 20px 22px -9px;*/
margin-top: 0.5rem;
margin-bottom: 1rem;
}
+1
View File
@@ -0,0 +1 @@
.cardOrders{width:100%;border-radius:18px;padding:1rem 4rem .5rem 4rem;box-shadow:rgba(0,0,0,.45) 0 20px 22px 3px;margin-top:.5rem;margin-bottom:1rem;}
@@ -0,0 +1,9 @@
@page "/SentToCompany"
<h3>Sent to DCA</h3>
<img src="images/Sent_to_DCA.png" />
@code {
}
+39 -14
View File
@@ -1,6 +1,9 @@
@using WebDoorCreator.UI.Components.SvgComp
@using WebDoorCreator.UI.Data
@page "/TestPage"
@inject WebDoorCreatorService WDCService
<h3>TestPage</h3>
@@ -18,34 +21,49 @@
<div class="col-3">
</div>
<div class="col-3">
<DoorSvgObj LineColor="#8E44AD" LineWidth="8" ObjH="200" ObjW="900" LeftTextClass="col-10 fs-1 fw-bold" RightTextClass="col-2" EC_ExeFunct="@(()=> exeFun())" ObjId="1" TextData="@msgList" Message1="messaggio 1" Message2="messaggio 2" ImagePath="@svgUrl(196)"></DoorSvgObj>
<DoorSvgObj LineColor="#8E44AD" LineWidth="8" ObjH="200" ObjW="900" LeftTextClass="col-10 fs-1 fw-bold" RightTextClass="col-2" EC_ExeFunct="@(()=> exeDoor())" ObjId="1" TextData="@msgList" Message1="messaggio 1" Message2="messaggio 2" ImagePath="@svgUrl(196)"></DoorSvgObj>
</div>
<div class="col-3">
<DoorSvgObj LineColor="#8E44AD" LineWidth="8" ObjH="200" ObjW="900" LeftTextClass="col-10 fs-1 fw-bold" RightTextClass="col-2" EC_ExeFunct="@(()=> exeFun())" ObjId="2" TextData="@msgList" Message1="messaggio 1" Message2="messaggio 2" ShowPlusMinus="true" ImagePath="@svgUrl(186)"></DoorSvgObj>
<DoorSvgObj LineColor="#8E44AD" LineWidth="8" ObjH="200" ObjW="900" LeftTextClass="col-10 fs-1 fw-bold" RightTextClass="col-2" EC_ExeFunct="@(()=> exeDoor())" ObjId="2" TextData="@msgList" Message1="messaggio 1" Message2="messaggio 2" ShowPlusMinus="true" ImagePath="@svgUrl(186)"></DoorSvgObj>
</div>
<div class="col-3">
</div>
</div>
<div class="row my-2">
<div class="col-4">
<HwSvgObj LineColor="#CFD8DC" LineWidth="8" ObjH="200" ObjW="700" EC_ExeFunct="@(()=> exeFun())" ObjId="21" ItemName="Flush Pull" ItemCount="2" ImagePath="@svgUrl(196)"></HwSvgObj>
<div class="col-3">
<HwSvgObj LineColor="#CFD8DC" LineWidth="8" ObjH="200" ObjW="700" EC_ExeFunct="@exeFun" ObjId="21" ItemName="Flush Pull" ItemCount="2" ImagePath="@svgUrl(196)"></HwSvgObj>
</div>
<div class="col-4">
<div class="col-3">
<HwSvgObj LineColor="#CFD8DC" LineWidth="8" ObjH="200" ObjW="700" EC_ExeFunct="@exeFun" ObjId="22" ItemName="Hinge" ItemCount="0" ImagePath="images/icons/ExitWhite.svg"></HwSvgObj>
</div>
<div class="col-4">
<HwSvgObj LineColor="#CFD8DC" LineWidth="8" ObjH="200" ObjW="700" EC_ExeFunct="@(()=> exeFun())" ObjId="22" ItemName="Hinge" ItemCount="0" ShowPlus="true" ImagePath="@svgUrl(186)"></HwSvgObj>
<div class="col-3">
<HwSvgObj LineColor="#CFD8DC" LineWidth="8" ObjH="200" ObjW="700" EC_ExeFunct="@exeFun" ObjId="23" ItemName="Hinge" ItemCount="0" ImagePath="images/icons/PlusWhite.svg" ShowPlus="true"></HwSvgObj>
</div>
<div class="col-3">
<HwSvgObj LineColor="#CFD8DC" LineWidth="8" ObjH="200" ObjW="700" EC_ExeFunct="@exeFun" ObjId="24" ItemName="Hinge" ItemCount="0" ShowPlus="true" ImagePath="@svgUrl(186)"></HwSvgObj>
</div>
</div>
<div class="row my-2">
@for (int i = 183; i < 205; i++)
@if (DoorsList == null)
{
<div class="col-1 text-center border rounded-2 m-2" style="height:100%; background: linear-gradient(#AFCFD1, #92B2C4);">
<b>@i</b><br />
<img width="80" height="80" src="@svgUrl(i)" />
</div>
<LoadingData></LoadingData>
}
else
{
foreach (var door in DoorsList)
{
@*}
for (int i = 183; i < 220; i++)
{*@
<div class="col-1 text-center border rounded-2 m-2" style="height:100%; background: linear-gradient(#AFCFD1, #92B2C4);">
<b>@door.DoorId</b><br />
<img width="80" height="80" src="@svgUrl(door.DoorId)" />
</div>
}
}
</div>
@@ -80,15 +98,22 @@
protected Dictionary<string, string> msgList = new Dictionary<string, string>();
protected override void OnInitialized()
protected override async Task OnInitializedAsync()
{
msgList = new Dictionary<string, string>();
msgList.Add("T1", "Titolo");
msgList.Add("M1", "Messaggio 1");
msgList.Add("M2", "MEssaggio 2");
DoorsList = await WDCService.DoorGetLast(100);
}
protected async Task exeFun()
protected List<DoorModel>? DoorsList { get; set; } = null;
protected async Task exeDoor()
{
await Task.Delay(1);
}
protected async Task exeFun(HwSvgObj.ActionReq action)
{
await Task.Delay(1);
}
+4
View File
@@ -62,6 +62,10 @@ builder.Services.AddBlazoredLocalStorage();
builder.Services.AddBlazoredSessionStorage();
var app = builder.Build();
// aggiunt base URL x routing corretto
//app.UsePathBase("/WDC/UI");
app.UsePathBase(configuration["RumtimeOpt:BaseUrl"]);
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
@@ -1,28 +1,30 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:38024",
"sslPort": 44365
}
},
"profiles": {
"WebDoorCreator.UI": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7196;http://localhost:5013",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:38024",
"launchUrl": "https://localhost:38024",
"sslPort": 44365
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
"profiles": {
"WebDoorCreator.UI": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7196;http://localhost:5013",
"launchUrl": "https://localhost:7196",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
}
}
+89 -90
View File
@@ -1,96 +1,95 @@
@*<AuthorizeView>
@*<AuthorizeView>
<Authorized>*@
<div class="text-start d-flex justify-content-between w-50" style="height: 70%;">
@if (NavManager.Uri.Contains("DoorDefinition"))
{
<div>
<a href="sizing" target="_blank">
<img src="images/Sizing.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Sizing definition page</div>
</a>
</div>
<div>
<a href="opening" target="_blank">
<img src="images/Opening.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Opening definition page</div>
</a>
</div>
<div>
<a href="edges" target="_blank">
<img src="images/Edges.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Edges definition page</div>
</a>
</div>
<div>
<a href="hwallclosed" target="_blank">
<img src="images/Hardware_all_closed.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Hardware list page</div>
</a>
</div>
<div>
<a href="hwadd" target="_blank">
<img src="images/Hardware_flush_pull_open_add_one.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">New hw page</div>
</a>
</div>
}
else if (NavManager.Uri.Contains("OrdersHomePage"))
{
<div>
<a href="ordershome" target="_blank">
<img src="images/Home_page_orders.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Orders home</div>
</a>
</div>
<div>
<a href="ordershomefilter" target="_blank">
<img src="images/Home_page_orders_orange_filter.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Orders home filtered</div>
</a>
</div>
<div>
<a href="definingdoorsstage" target="_blank">
<img src="images/Defining_Doors_stage.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Defining doors</div>
</a>
</div>
<div>
<a href="senttoabh" target="_blank">
<img src="images/Sent_to_ABH.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Sent to abh</div>
</a>
</div>
<div>
<a href="abhapprove" target="_blank">
<img src="images/Approved_by_ABH.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Approved by ABH</div>
</a>
</div>
<div>
<a href="userapprove" target="_blank">
<img src="images/Approved_by_user.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Approved by user</div>
</a>
</div>
<div>
<a href="production" target="_blank">
<img src="images/InProduction.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">In production</div>
</a>
</div>
}
<div class="text-start d-flex justify-content-between w-50" style="height: 70%;">
@if (NavManager.Uri.Contains("DoorDefinition"))
{
<div>
<a href="sizing" target="_blank">
<img src="images/Sizing.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Sizing definition page</div>
</a>
</div>
@*</Authorized>
<div>
<a href="opening" target="_blank">
<img src="images/Opening.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Opening definition page</div>
</a>
</div>
<div>
<a href="edges" target="_blank">
<img src="images/Edges.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Edges definition page</div>
</a>
</div>
<div>
<a href="hwallclosed" target="_blank">
<img src="images/Hardware_all_closed.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Hardware list page</div>
</a>
</div>
<div>
<a href="hwadd" target="_blank">
<img src="images/Hardware_flush_pull_open_add_one.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">New hw page</div>
</a>
</div>
}
else if (NavManager.Uri.Contains("OrdersHomePage"))
{
<div>
<a href="ordershome" target="_blank">
<img src="images/Home_page_orders.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Orders home</div>
</a>
</div>
<div>
<a href="ordershomefilter" target="_blank">
<img src="images/Home_page_orders_orange_filter.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Orders home filtered</div>
</a>
</div>
<div>
<a href="definingdoorsstage" target="_blank">
<img src="images/Defining_Doors_stage.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Defining doors</div>
</a>
</div>
<div>
<a href="SentToCompany" target="_blank">
<img src="images/Sent_to_DCA.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Sent to DCA</div>
</a>
</div>
<div>
<a href="ApprovedByCompany" target="_blank">
<img src="images/Approved_by_DCA.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Approved by DCA</div>
</a>
</div>
<div>
<a href="userapprove" target="_blank">
<img src="images/Approved_by_user.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">Approved by user</div>
</a>
</div>
<div>
<a href="production" target="_blank">
<img src="images/InProduction.png" style="height: 100%;" />
<div class="btn btn-sm btn-info">In production</div>
</a>
</div>
}
</div>
@*</Authorized>
<NotAuthorized>*@
@if (!NavManager.Uri.Contains("Register") || !NavManager.Uri.Contains("Login"))
{
<a href="Identity/Account/Register">Register</a>
<a href="Identity/Account/Login">Log in</a>
}
@*</NotAuthorized>
@if (!NavManager.Uri.Contains("Register") || !NavManager.Uri.Contains("Login"))
{
<a href="Identity/Account/Register">Register</a>
<a href="Identity/Account/Login">Log in</a>
}
@*</NotAuthorized>
</AuthorizeView>*@
@@ -0,0 +1,13 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"RumtimeOpt": {
"MaxDayCalcCache": 7,
"BaseUrl": "/WDC/UI"
}
}
@@ -0,0 +1,13 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"RumtimeOpt": {
"MaxDayCalcCache": 7,
"BaseUrl": "/WDC/UI"
}
}
+45 -44
View File
@@ -1,47 +1,48 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"Identity.DB": "Server=SQL2016DEV;Database=WebDoorCreator; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=WebDoorCreator.UI;",
"Redis": "nkcredis.steamware.net:6379, DefaultDatabase=11, connectTimeout=5000, syncTimeout=5000, asyncTimeout=5000, abortConnect=false, ssl=false, password=BtN9Py1wtLfLRvmzWnOPJ7RytDM+CLiVsJ/16zduNTlV8IOPGNrtzJSXPUnImA5PqmUMhKaUqo9NdHIG",
"WDC.DB": "Server=SQL2016DEV;Database=WebDoorCreator; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=WebDoorCreator.UI;"
},
"ExternalProviders": {
"MailKit": {
"SMTP": {
"Address": "smtp-mail.outlook.com",
"Port": "587",
"Account": "steamwarebot@outlook.it",
"Password": "siamoInViaNazionale93",
"SenderEmail": "steamwarebot@outlook.it",
"SenderName": "Steamware Email BOT"
}
}
},
"SetupOpt": {
"DisableIdentMigrate": true,
"DisableWDCMigrate": true
},
"RumtimeOpt": {
"MaxDayCalcCache": 7,
"BaseUrl": "/WDC/UI"
},
"ConfDDF": {
"Header": [
"#WEBDOORCREATOR",
"#Config: EgtCompoBase",
"#Door1",
""
],
"Footer": [
"",
"---"
],
"VersNumber": "2",
"RemoveDoorOps": true
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"Identity.DB": "Server=SQL2016DEV;Database=WebDoorCreator; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=WebDoorCreator.UI;",
"Redis": "nkcredis.steamware.net:6379, DefaultDatabase=11, connectTimeout=5000, syncTimeout=5000, asyncTimeout=5000, abortConnect=false, ssl=false, password=BtN9Py1wtLfLRvmzWnOPJ7RytDM+CLiVsJ/16zduNTlV8IOPGNrtzJSXPUnImA5PqmUMhKaUqo9NdHIG",
"WDC.DB": "Server=SQL2016DEV;Database=WebDoorCreator; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=WebDoorCreator.UI;"
},
"ExternalProviders": {
"MailKit": {
"SMTP": {
"Address": "smtp-mail.outlook.com",
"Port": "587",
"Account": "steamwarebot@outlook.it",
"Password": "siamoInViaNazionale93",
"SenderEmail": "steamwarebot@outlook.it",
"SenderName": "Steamware Email BOT"
}
}
},
"SetupOpt": {
"DisableIdentMigrate": true,
"DisableWDCMigrate": true
},
"RumtimeOpt": {
"MaxDayCalcCache": 7
},
"ConfDDF": {
"Header": [
"#WEBDOORCREATOR",
"#Config: EgtCompoBase",
"#Door1",
""
],
"Footer": [
"",
"---"
],
"VersNumber": "2",
"RemoveDoorOps": true
}
}
+4
View File
@@ -78,5 +78,9 @@
{
"outputFile": "Components/SvgComp/HwSvgObj.razor.css",
"inputFile": "Components/SvgComp/HwSvgObj.razor.less"
},
{
"outputFile": "Pages/OrdersHomePage.razor.css",
"inputFile": "Pages/OrdersHomePage.razor.less"
}
]

Before

Width:  |  Height:  |  Size: 112 KiB

After

Width:  |  Height:  |  Size: 112 KiB

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg41"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="Missing.svg">
<defs
id="defs35" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="400"
inkscape:cy="560"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="1406"
inkscape:window-height="1198"
inkscape:window-x="78"
inkscape:window-y="78"
inkscape:window-maximized="0" />
<metadata
id="metadata38">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Livello 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:#454c55;stroke:none;stroke-width:0.460184"
d="M 67.284871,27.840094 C 54.209292,29.845169 46.354698,40.041553 37.483749,49.537223 30.786635,56.705844 22.139596,63.788212 18.364192,73.342671 13.425835,85.840068 15.688899,101.95827 15.688899,115.24029 v 83.31911 42.37372 c 0,7.58822 -0.702068,15.87777 3.692177,22.37522 8.317054,12.29838 27.557626,8.09577 39.897523,8.09577 h 79.617931 c 12.51202,0 26.8348,2.07774 39.14178,-0.29328 20.95597,-4.03694 15.56774,-34.14276 15.56774,-50.65042 V 90.482618 57.154964 c 0,-6.779801 0.48839,-13.912333 -2.82399,-19.996591 C 184.24273,25.145859 170.34873,27.636197 159.357,27.636197 H 97.975587 c -9.965149,0 -20.828764,-1.308344 -30.690716,0.203897 M 65.950496,40.491145 V 68.58159 c 0,3.334243 0.635156,8.230973 -1.880591,10.762918 -2.011793,2.023943 -4.923857,1.615918 -7.460068,1.615918 -5.485632,0 -10.971706,-0.02807 -16.457327,3.51e-4 -3.463614,0.01808 -8.012815,1.523078 -7.777343,6.188941 0.285906,5.66571 6.133826,5.71331 10.001297,5.71331 9.131159,0 21.653851,2.511 28.904873,-4.80536 C 76.981364,82.306261 76.62552,75.34031 76.62552,67.629244 V 39.538921 h 78.72834 c 6.51178,0 22.20629,-3.148174 26.00571,3.816212 2.13101,3.906515 1.12667,9.914114 1.12667,14.275944 v 32.375431 120.931732 37.1365 c 0,5.08581 -0.86957,10.76627 -6.6719,11.37664 -12.057,1.26788 -24.7972,0.0499 -36.91781,0.0499 H 64.616109 38.818123 c -3.881264,0 -8.102032,0.52467 -10.615648,-3.37704 -2.606754,-4.04646 -1.39376,-10.98766 -1.39376,-15.66733 V 202.84434 121.42967 94.767548 c 0,-5.82043 -0.394349,-11.702756 1.918165,-17.139934 2.59243,-6.095472 7.972696,-10.587133 12.315209,-15.235482 6.361872,-6.809749 15.302659,-20.997658 24.908407,-21.901027 M 82.852622,149.04404 v -0.47611 c 2.228416,-1.68019 4.853137,-4.06073 6.164829,-6.66553 2.329384,-4.62682 -1.57368,-9.44601 -6.164829,-8.43713 -3.058838,0.67179 -5.856141,4.41734 -7.561479,7.00881 -2.09231,-2.23963 -4.330057,-5.57095 -7.116681,-6.80503 -4.373656,-1.9373 -8.256257,2.08393 -7.460067,6.80503 0.576892,3.41988 5.655983,5.35289 5.655983,8.56996 0,4.59303 -10.127493,8.24193 -4.321609,14.09569 5.910848,5.95899 8.604069,-4.54684 13.241932,-4.54684 3.099767,0 4.747268,5.79806 8.451512,6.10419 3.582359,0.29567 6.831128,-3.17374 5.852131,-7.08307 -0.79484,-3.17279 -4.32427,-6.70886 -6.741722,-8.56997 M 122.88576,133.6857 c -9.48787,3.93362 2.64207,11.32569 2.64207,15.35834 0,2.57527 -4.14146,4.93963 -5.25034,7.14164 -1.98378,3.9398 0.69032,8.54283 4.83046,8.52854 2.37029,-0.008 4.14858,-1.65495 5.7823,-3.31039 0.99056,-1.00411 2.41256,-3.18612 4.00314,-2.73905 3.99602,1.12314 5.45272,7.87723 10.67459,5.7376 5.41757,-2.22011 3.38931,-8.28002 0.43857,-11.54947 -0.94741,-1.04934 -2.98768,-2.58336 -2.57001,-4.28498 0.66941,-2.72953 4.0823,-4.4221 5.14402,-7.14163 1.96465,-5.03392 -2.79463,-10.02972 -7.46007,-7.53253 -2.13189,1.14124 -4.21841,5.60143 -6.6719,5.60143 -4.45949,0 -5.69601,-8.24194 -11.56283,-5.8095 m -24.46539,56.98172 c -11.577511,1.64734 -22.445577,5.80805 -31.580295,13.80716 -3.447589,3.019 -10.885415,12.52215 -1.77917,14.39182 5.186728,1.06506 11.254602,-7.31684 15.567751,-9.8983 9.005719,-5.39003 19.519294,-7.81533 29.801124,-6.46365 7.65399,1.00649 15.44988,3.90551 21.79485,8.6428 3.52988,2.63526 7.64111,8.85895 12.45376,7.69677 3.41067,-0.82366 5.02037,-5.08246 3.47917,-8.3819 -1.80408,-3.86172 -6.4366,-7.01927 -9.70583,-9.35316 -11.39247,-8.13337 -26.34952,-12.38788 -40.03136,-10.44154 z"
id="path22" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg41"
inkscape:version="1.0.2-2 (e86c870879, 2021-01-15)"
sodipodi:docname="Missing.svg">
<defs
id="defs35" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.35"
inkscape:cx="400"
inkscape:cy="560"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
inkscape:window-width="1406"
inkscape:window-height="1198"
inkscape:window-x="78"
inkscape:window-y="78"
inkscape:window-maximized="0" />
<metadata
id="metadata38">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Livello 1"
inkscape:groupmode="layer"
id="layer1">
<path
style="fill:#FD8C00;stroke:none;stroke-width:0.460184"
d="M 67.284871,27.840094 C 54.209292,29.845169 46.354698,40.041553 37.483749,49.537223 30.786635,56.705844 22.139596,63.788212 18.364192,73.342671 13.425835,85.840068 15.688899,101.95827 15.688899,115.24029 v 83.31911 42.37372 c 0,7.58822 -0.702068,15.87777 3.692177,22.37522 8.317054,12.29838 27.557626,8.09577 39.897523,8.09577 h 79.617931 c 12.51202,0 26.8348,2.07774 39.14178,-0.29328 20.95597,-4.03694 15.56774,-34.14276 15.56774,-50.65042 V 90.482618 57.154964 c 0,-6.779801 0.48839,-13.912333 -2.82399,-19.996591 C 184.24273,25.145859 170.34873,27.636197 159.357,27.636197 H 97.975587 c -9.965149,0 -20.828764,-1.308344 -30.690716,0.203897 M 65.950496,40.491145 V 68.58159 c 0,3.334243 0.635156,8.230973 -1.880591,10.762918 -2.011793,2.023943 -4.923857,1.615918 -7.460068,1.615918 -5.485632,0 -10.971706,-0.02807 -16.457327,3.51e-4 -3.463614,0.01808 -8.012815,1.523078 -7.777343,6.188941 0.285906,5.66571 6.133826,5.71331 10.001297,5.71331 9.131159,0 21.653851,2.511 28.904873,-4.80536 C 76.981364,82.306261 76.62552,75.34031 76.62552,67.629244 V 39.538921 h 78.72834 c 6.51178,0 22.20629,-3.148174 26.00571,3.816212 2.13101,3.906515 1.12667,9.914114 1.12667,14.275944 v 32.375431 120.931732 37.1365 c 0,5.08581 -0.86957,10.76627 -6.6719,11.37664 -12.057,1.26788 -24.7972,0.0499 -36.91781,0.0499 H 64.616109 38.818123 c -3.881264,0 -8.102032,0.52467 -10.615648,-3.37704 -2.606754,-4.04646 -1.39376,-10.98766 -1.39376,-15.66733 V 202.84434 121.42967 94.767548 c 0,-5.82043 -0.394349,-11.702756 1.918165,-17.139934 2.59243,-6.095472 7.972696,-10.587133 12.315209,-15.235482 6.361872,-6.809749 15.302659,-20.997658 24.908407,-21.901027 M 82.852622,149.04404 v -0.47611 c 2.228416,-1.68019 4.853137,-4.06073 6.164829,-6.66553 2.329384,-4.62682 -1.57368,-9.44601 -6.164829,-8.43713 -3.058838,0.67179 -5.856141,4.41734 -7.561479,7.00881 -2.09231,-2.23963 -4.330057,-5.57095 -7.116681,-6.80503 -4.373656,-1.9373 -8.256257,2.08393 -7.460067,6.80503 0.576892,3.41988 5.655983,5.35289 5.655983,8.56996 0,4.59303 -10.127493,8.24193 -4.321609,14.09569 5.910848,5.95899 8.604069,-4.54684 13.241932,-4.54684 3.099767,0 4.747268,5.79806 8.451512,6.10419 3.582359,0.29567 6.831128,-3.17374 5.852131,-7.08307 -0.79484,-3.17279 -4.32427,-6.70886 -6.741722,-8.56997 M 122.88576,133.6857 c -9.48787,3.93362 2.64207,11.32569 2.64207,15.35834 0,2.57527 -4.14146,4.93963 -5.25034,7.14164 -1.98378,3.9398 0.69032,8.54283 4.83046,8.52854 2.37029,-0.008 4.14858,-1.65495 5.7823,-3.31039 0.99056,-1.00411 2.41256,-3.18612 4.00314,-2.73905 3.99602,1.12314 5.45272,7.87723 10.67459,5.7376 5.41757,-2.22011 3.38931,-8.28002 0.43857,-11.54947 -0.94741,-1.04934 -2.98768,-2.58336 -2.57001,-4.28498 0.66941,-2.72953 4.0823,-4.4221 5.14402,-7.14163 1.96465,-5.03392 -2.79463,-10.02972 -7.46007,-7.53253 -2.13189,1.14124 -4.21841,5.60143 -6.6719,5.60143 -4.45949,0 -5.69601,-8.24194 -11.56283,-5.8095 m -24.46539,56.98172 c -11.577511,1.64734 -22.445577,5.80805 -31.580295,13.80716 -3.447589,3.019 -10.885415,12.52215 -1.77917,14.39182 5.186728,1.06506 11.254602,-7.31684 15.567751,-9.8983 9.005719,-5.39003 19.519294,-7.81533 29.801124,-6.46365 7.65399,1.00649 15.44988,3.90551 21.79485,8.6428 3.52988,2.63526 7.64111,8.85895 12.45376,7.69677 3.41067,-0.82366 5.02037,-5.08246 3.47917,-8.3819 -1.80408,-3.86172 -6.4366,-7.01927 -9.70583,-9.35316 -11.39247,-8.13337 -26.34952,-12.38788 -40.03136,-10.44154 z"
id="path22" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path d="M377.9 105.9L500.7 228.7c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L377.9 406.1c-6.4 6.4-15 9.9-24 9.9c-18.7 0-33.9-15.2-33.9-33.9l0-62.1-128 0c-17.7 0-32-14.3-32-32l0-64c0-17.7 14.3-32 32-32l128 0 0-62.1c0-18.7 15.2-33.9 33.9-33.9c9 0 17.6 3.6 24 9.9zM160 96L96 96c-17.7 0-32 14.3-32 32l0 256c0 17.7 14.3 32 32 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c-53 0-96-43-96-96L0 128C0 75 43 32 96 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32z"/>
</svg>
@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path fill="white" d="M377.9 105.9L500.7 228.7c7.2 7.2 11.3 17.1 11.3 27.3s-4.1 20.1-11.3 27.3L377.9 406.1c-6.4 6.4-15 9.9-24 9.9c-18.7 0-33.9-15.2-33.9-33.9l0-62.1-128 0c-17.7 0-32-14.3-32-32l0-64c0-17.7 14.3-32 32-32l128 0 0-62.1c0-18.7 15.2-33.9 33.9-33.9c9 0 17.6 3.6 24 9.9zM160 96L96 96c-17.7 0-32 14.3-32 32l0 256c0 17.7 14.3 32 32 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c-53 0-96-43-96-96L0 128C0 75 43 32 96 32l64 0c17.7 0 32 14.3 32 32s-14.3 32-32 32z"/>
</svg>
@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path d="M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32V224H48c-17.7 0-32 14.3-32 32s14.3 32 32 32H192V432c0 17.7 14.3 32 32 32s32-14.3 32-32V288H400c17.7 0 32-14.3 32-32s-14.3-32-32-32H256V80z"/>
</svg>
@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">
<!--! Font Awesome Pro 6.4.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2023 Fonticons, Inc. -->
<path fill="white" d="M256 80c0-17.7-14.3-32-32-32s-32 14.3-32 32V224H48c-17.7 0-32 14.3-32 32s14.3 32 32 32H192V432c0 17.7 14.3 32 32 32s32-14.3 32-32V288H400c17.7 0 32-14.3 32-32s-14.3-32-32-32H256V80z" />
</svg>