Varie code cleanup

This commit is contained in:
Samuele Locatelli
2026-06-10 16:57:13 +02:00
parent 7f957a8e05
commit 7e65c8a406
55 changed files with 628 additions and 566 deletions
+3 -2
View File
@@ -14,12 +14,13 @@ namespace Lux.API.Controllers
/// </summary>
/// <param name="DLService"></param>
/// <param name="iORService"></param>
/// <param name="iOrdRService"></param>
/// <param name="imgServ"></param>
/// <param name="logger"></param>
public FileController(IDataLayerServices DLService, IOfferRowService iORService, IImageCacheService imgServ)
public FileController(IDataLayerServices DLService, IOfferRowService iORService, IOrderRowService iOrdRService, IImageCacheService imgServ)
{
_DSService = DLService;
_OffRService = iORService;
_OrdRService = iOrdRService;
_imgService = imgServ;
}
+1 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<Version>1.1.2606.1015</Version>
<Version>1.1.2606.1016</Version>
</PropertyGroup>
<ItemGroup>
@@ -85,4 +85,4 @@
</div>
</div>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -128,4 +128,4 @@
}
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
+1 -1
View File
@@ -85,4 +85,4 @@
</div>
</div>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -1,44 +1,41 @@
@inherits BaseComp
<div class="rounded rounded-3 bg-secondary bg-opacity-25 bg-gradient p-2 m-0 shadow">
@if (CurrRecord != null)
{
<div><span class="fs-5"># <b>@(CurrRecord?.CustomerID)</b></span></div>
<div class="row g-1">
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.FirstName">
<label class="small bg-opacity-50">@Traduci("nome")</label>
</div>
<div><span class="fs-5"># <b>@(CurrRecord.CustomerID)</b></span></div>
<div class="row g-1">
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.FirstName">
<label class="small bg-opacity-50">@Traduci("nome")</label>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.LastName" >
<label class="small bg-opacity-50">@Traduci("contatti_cognome")</label>
</div>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.LastName">
<label class="small bg-opacity-50">@Traduci("contatti_cognome")</label>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.CompanyName">
<label class="small bg-opacity-50">@Traduci("contatti_nomeAzienda")</label>
</div>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.CompanyName">
<label class="small bg-opacity-50">@Traduci("contatti_nomeAzienda")</label>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.VAT">
<label class="small bg-opacity-50">@Traduci("contatti_cf")</label>
</div>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.VAT">
<label class="small bg-opacity-50">@Traduci("contatti_cf")</label>
</div>
<div class="col-md-8">
<div class="row g-1 py-1">
<div class="col-md-6">
<button class="btn btn-lg btn-success w-100" @onclick="DoSave">@Traduci("salva")</button>
</div>
<div class="col-md-6">
<button class="btn btn-lg btn-warning w-100" @onclick="DoCancel">@Traduci("annulla")</button>
</div>
</div>
<div class="col-md-8">
<div class="row g-1 py-1">
<div class="col-md-6">
<button class="btn btn-lg btn-success w-100" @onclick="DoSave">@Traduci("salva")</button>
</div>
<div class="col-md-6">
<button class="btn btn-lg btn-warning w-100" @onclick="DoCancel">@Traduci("annulla")</button>
</div>
</div>
</div>
}
</div>
</div>
@@ -5,7 +5,7 @@ namespace Lux.UI.Components.Compo.Contatti
#region Public Properties
[Parameter]
public CustomerModel? CurrRecord { get; set; } = null;
public CustomerModel CurrRecord { get; set; } = null!;
[Parameter]
public EventCallback<bool> EC_Close { get; set; }
@@ -76,4 +76,4 @@ else
</table>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -1,44 +1,41 @@
@inherits BaseComp
<div class="rounded rounded-3 bg-secondary bg-opacity-25 bg-gradient p-2 m-0 shadow">
@if (CurrRecord != null)
{
<div><span class="fs-5"># <b>@(CurrRecord?.DealerID)</b></span></div>
<div class="row g-1">
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.FirstName">
<label class="small bg-opacity-50">@Traduci("nome")</label>
</div>
<div><span class="fs-5"># <b>@(CurrRecord.DealerID)</b></span></div>
<div class="row g-1">
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.FirstName">
<label class="small bg-opacity-50">@Traduci("nome")</label>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.LastName" >
<label class="small bg-opacity-50">@Traduci("contatti_cognome")</label>
</div>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.LastName">
<label class="small bg-opacity-50">@Traduci("contatti_cognome")</label>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.CompanyName">
<label class="small bg-opacity-50">@Traduci("contatti_nomeAzienda")</label>
</div>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.CompanyName">
<label class="small bg-opacity-50">@Traduci("contatti_nomeAzienda")</label>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.VAT">
<label class="small bg-opacity-50">@Traduci("contatti_cf")</label>
</div>
</div>
<div class="col-md-4">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.VAT">
<label class="small bg-opacity-50">@Traduci("contatti_cf")</label>
</div>
<div class="col-md-8">
<div class="row g-1 py-1">
<div class="col-md-6">
<button class="btn btn-lg btn-success w-100" @onclick="DoSave">@Traduci("salva")</button>
</div>
<div class="col-md-6">
<button class="btn btn-lg btn-warning w-100" @onclick="DoCancel">@Traduci("annulla")</button>
</div>
</div>
<div class="col-md-8">
<div class="row g-1 py-1">
<div class="col-md-6">
<button class="btn btn-lg btn-success w-100" @onclick="DoSave">@Traduci("salva")</button>
</div>
<div class="col-md-6">
<button class="btn btn-lg btn-warning w-100" @onclick="DoCancel">@Traduci("annulla")</button>
</div>
</div>
</div>
}
</div>
</div>
@@ -5,7 +5,7 @@ namespace Lux.UI.Components.Compo.Contatti
#region Public Properties
[Parameter]
public DealerModel? CurrRecord { get; set; } = null;
public DealerModel CurrRecord { get; set; } = null!;
[Parameter]
public EventCallback<bool> EC_Close { get; set; }
@@ -76,4 +76,4 @@ else
</table>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -46,71 +46,79 @@
</div>
</div>
}
<table class="table table-sm table-striped">
<thead>
<tr>
<th>
<button class="btn btn-sm btn-primary" title="@Traduci("reset")" @onclick="DoReset"><i class="fa-solid fa-arrow-rotate-right"></i></button>
</th>
<th>@Traduci("cod")</th>
<th>@Traduci("descrizione")</th>
<th class="text-end"># Val</th>
<th class="text-end">
<button class="btn btn-sm btn-success" @onclick="ToggleAdd"><i class="fa-solid fa-plus"></i></button>
</th>
</tr>
</thead>
<tbody>
@foreach (var item in ListRecords)
{
<tr class="@checkSel(item)">
@if (EditRecord != null && item.ClassCod == EditRecord.ClassCod)
{
<td class="text-start text-nowrap">
<button class="btn btn-sm btn-success" title="@Traduci("salva")" @onclick="() => DoSave(item)"><i class="fa-solid fa-save"></i></button>
<button class="btn btn-sm btn-secondary opacity-50" title="@Traduci("modifica")"><i class="fa-solid fa-pencil"></i></button>
</td>
<td>@item.ClassCod</td>
<td><input class="form-control form-control-sm border-2 border-info py-1" type="text" style="width: 12rem;" @bind="@item.Description" /></td>
<td class="text-end">@item.NumChild</td>
<td class="text-end">
<button class="btn btn-sm btn-warning" title="@Traduci("annulla")" @onclick="DoReset"><i class="fa-solid fa-ban"></i></button>
</td>
}
else
{
<td class="text-start text-nowrap">
<button class="btn btn-sm btn-primary" title="@Traduci("seleziona")" @onclick="() => DoSelect(item)"><i class="fa-solid fa-magnifying-glass"></i></button>
<button class="btn btn-sm btn-info" title="@Traduci("modifica")" @onclick="() => DoEdit(item)"><i class="fa-solid fa-pencil"></i></button>
@* <button class="btn btn-sm btn-success" @onclick="() => DoClone(item)"><i class="fa-solid fa-clone"></i></button> *@
</td>
<td>@item.ClassCod</td>
<td>@item.Description</td>
<td class="text-end">@item.NumChild</td>
<td class="text-end">
@if (item.NumChild > 0)
{
<button class="btn btn-sm btn-secondary opacity-50" disabled title="@Traduci("childCorrelati")"><i class="fa-solid fa-trash-can"></i></button>
}
else
{
<button class="btn btn-sm btn-danger" title="@Traduci("elimina")" @onclick="() => DoDelete(item)"><i class="fa-solid fa-trash-can"></i></button>
}
</td>
}
</tr>
}
</tbody>
@if (totalCount >= numRecord)
{
<tfoot>
<tr>
<td colspan="5">
<EgwCoreLib.Razor.DataPager currPage="@currPage" PageSize="@numRecord" totalCount="@totalCount" numPageChanged="SavePage" numRecordChanged="SaveNumRec"></EgwCoreLib.Razor.DataPager>
</td>
</tr>
</tfoot>
}
</table>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
@if (isLoading)
{
<LoadingData></LoadingData>
}
else
{
<table class="table table-sm table-striped">
<thead>
<tr>
<th>
<button class="btn btn-sm btn-primary" title="@Traduci("reset")" @onclick="DoReset"><i class="fa-solid fa-arrow-rotate-right"></i></button>
</th>
<th>@Traduci("cod")</th>
<th>@Traduci("descrizione")</th>
<th class="text-end"># Val</th>
<th class="text-end">
<button class="btn btn-sm btn-success" @onclick="ToggleAdd"><i class="fa-solid fa-plus"></i></button>
</th>
</tr>
</thead>
<tbody>
@foreach (var item in ListRecords)
{
<tr class="@checkSel(item)">
@if (EditRecord != null && item.ClassCod == EditRecord.ClassCod)
{
<td class="text-start text-nowrap">
<button class="btn btn-sm btn-success" title="@Traduci("salva")" @onclick="() => DoSave(item)"><i class="fa-solid fa-save"></i></button>
<button class="btn btn-sm btn-secondary opacity-50" title="@Traduci("modifica")"><i class="fa-solid fa-pencil"></i></button>
</td>
<td>@item.ClassCod</td>
<td><input class="form-control form-control-sm border-2 border-info py-1" type="text" style="width: 12rem;" @bind="@item.Description" /></td>
<td class="text-end">@item.NumChild</td>
<td class="text-end">
<button class="btn btn-sm btn-warning" title="@Traduci("annulla")" @onclick="DoReset"><i class="fa-solid fa-ban"></i></button>
</td>
}
else
{
<td class="text-start text-nowrap">
<button class="btn btn-sm btn-primary" title="@Traduci("seleziona")" @onclick="() => DoSelect(item)"><i class="fa-solid fa-magnifying-glass"></i></button>
<button class="btn btn-sm btn-info" title="@Traduci("modifica")" @onclick="() => DoEdit(item)"><i class="fa-solid fa-pencil"></i></button>
@* <button class="btn btn-sm btn-success" @onclick="() => DoClone(item)"><i class="fa-solid fa-clone"></i></button> *@
</td>
<td>@item.ClassCod</td>
<td>@item.Description</td>
<td class="text-end">@item.NumChild</td>
<td class="text-end">
@if (item.NumChild > 0)
{
<button class="btn btn-sm btn-secondary opacity-50" disabled title="@Traduci("childCorrelati")"><i class="fa-solid fa-trash-can"></i></button>
}
else
{
<button class="btn btn-sm btn-danger" title="@Traduci("elimina")" @onclick="() => DoDelete(item)"><i class="fa-solid fa-trash-can"></i></button>
}
</td>
}
</tr>
}
</tbody>
@if (totalCount >= numRecord)
{
<tfoot>
<tr>
<td colspan="5">
<EgwCoreLib.Razor.DataPager currPage="@currPage" PageSize="@numRecord" totalCount="@totalCount" numPageChanged="SavePage" numRecordChanged="SaveNumRec"></EgwCoreLib.Razor.DataPager>
</td>
</tr>
</tfoot>
}
</table>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -85,4 +85,4 @@ else
</table>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
+92 -95
View File
@@ -1,101 +1,98 @@
@inherits BaseComp
<div class="rounded rounded-3 bg-secondary bg-opacity-25 bg-gradient p-2 m-0 shadow">
@if (CurrRecord != null)
{
<div><span class="fs-5"># <b>@(CurrRecord?.ItemID)</b></span> | Codice @CurrRecord.ItemCode</div>
<div class="row g-1">
<div class="col-md-2">
<div class="form-floating">
<select @bind="@CurrRecord.CodGroup" class="form-select" disabled="@CurrRecord.IsProtected">
@foreach (var item in ListItemGroup)
{
<option value="@item.CodGroup">@item.Description</option>
}
</select>
<label class="small bg-opacity-50">@Traduci("gruppo")</label>
</div>
</div>
<div class="col-md-1">
<div class="form-floating">
<select @bind="@CurrRecord.ItemType" class="form-select" disabled="@CurrRecord.IsProtected">
@foreach (var sType in Enum.GetValues(typeof(EgwCoreLib.Lux.Core.Enums.ItemClassType)))
{
<option value="@sType">@sType</option>
}
</select>
<label class="small bg-opacity-50">@Traduci("tipo")</label>
</div>
</div><div class="col-md-1">
<div class="form-floating">
<div class="form-control ">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" checked="@CurrRecord.IsService">
</div>
</div>
<label class="small bg-opacity-50">@Traduci("articoli_servizio")</label>
</div>
</div>
<div class="col-md-2">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.ExtItemCode" disabled="@CurrRecord.IsProtected">
<label class="small bg-opacity-50">@Traduci("articoli_itemCode")</label>
</div>
</div>
<div class="col-md-3">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.SupplCode" disabled="@CurrRecord.IsProtected">
<label class="small bg-opacity-50">@Traduci("articoli_supplCode")</label>
</div>
</div>
<div class="col-md-2">
<div class="form-floating">
<InputDouble CssClass="form-control form-control-lg text-end" Decimals="2" Step="0.05" @bind-Value="@CurrRecord.Cost"></InputDouble>
@* <input type="number" class="form-control text-end" @bind="@CurrRecord.Cost"> *@
<label class="small bg-opacity-50">@Traduci("articoli_costo")</label>
</div>
</div>
<div class="col-md-1">
<div class="form-floating">
<InputPercent CssClass="form-control form-control-lg text-end" ForceInvariantParsing="true" Decimals="1" @bind-Value="@MarginDec"></InputPercent>
@* <input type="number" class="form-control text-end" @bind="@CurrRecord.Margin"> *@
<label class="small bg-opacity-50">@Traduci("margine")</label>
</div>
</div>
<div class="col-md-6">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.Description" disabled="@CurrRecord.IsProtected">
<label class="small bg-opacity-50">@Traduci("descrizione")</label>
</div>
</div>
<div class="col-md-1">
<div class="form-floating">
<input type="number" class="form-control text-end" @bind="@CurrRecord.QtyMin">
<label class="small bg-opacity-50">@Traduci("articoli_qtyMin")</label>
</div>
</div>
<div class="col-md-1">
<div class="form-floating">
<input type="number" class="form-control text-end" @bind="@CurrRecord.QtyMax">
<label class="small bg-opacity-50">@Traduci("articoli_qtyMax")</label>
</div>
</div>
<div class="col-md-1">
<div class="form-floating">
<input type="text" class="form-control text-end" @bind="@CurrRecord.UM">
<label class="small bg-opacity-50">@Traduci("unitaMisura")</label>
</div>
</div>
<div class="col-md-3">
<div class="row g-1 py-1">
<div class="col-md-6">
<button class="btn btn-lg btn-success w-100" @onclick="DoSave">@Traduci("salva")</button>
</div>
<div class="col-md-6">
<button class="btn btn-lg btn-warning w-100" @onclick="DoCancel">@Traduci("annulla")</button>
</div>
</div>
<div><span class="fs-5"># <b>@(CurrRecord.ItemID)</b></span> | Codice @CurrRecord.ItemCode</div>
<div class="row g-1">
<div class="col-md-2">
<div class="form-floating">
<select @bind="@CurrRecord.CodGroup" class="form-select" disabled="@CurrRecord.IsProtected">
@foreach (var item in ListItemGroup)
{
<option value="@item.CodGroup">@item.Description</option>
}
</select>
<label class="small bg-opacity-50">@Traduci("gruppo")</label>
</div>
</div>
}
<div class="col-md-1">
<div class="form-floating">
<select @bind="@CurrRecord.ItemType" class="form-select" disabled="@CurrRecord.IsProtected">
@foreach (var sType in Enum.GetValues(typeof(EgwCoreLib.Lux.Core.Enums.ItemClassType)))
{
<option value="@sType">@sType</option>
}
</select>
<label class="small bg-opacity-50">@Traduci("tipo")</label>
</div>
</div><div class="col-md-1">
<div class="form-floating">
<div class="form-control ">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" checked="@CurrRecord.IsService">
</div>
</div>
<label class="small bg-opacity-50">@Traduci("articoli_servizio")</label>
</div>
</div>
<div class="col-md-2">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.ExtItemCode" disabled="@CurrRecord.IsProtected">
<label class="small bg-opacity-50">@Traduci("articoli_itemCode")</label>
</div>
</div>
<div class="col-md-3">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.SupplCode" disabled="@CurrRecord.IsProtected">
<label class="small bg-opacity-50">@Traduci("articoli_supplCode")</label>
</div>
</div>
<div class="col-md-2">
<div class="form-floating">
<InputDouble CssClass="form-control form-control-lg text-end" Decimals="2" Step="0.05" @bind-Value="@CurrRecord.Cost"></InputDouble>
@* <input type="number" class="form-control text-end" @bind="@CurrRecord.Cost"> *@
<label class="small bg-opacity-50">@Traduci("articoli_costo")</label>
</div>
</div>
<div class="col-md-1">
<div class="form-floating">
<InputPercent CssClass="form-control form-control-lg text-end" ForceInvariantParsing="true" Decimals="1" @bind-Value="@MarginDec"></InputPercent>
@* <input type="number" class="form-control text-end" @bind="@CurrRecord.Margin"> *@
<label class="small bg-opacity-50">@Traduci("margine")</label>
</div>
</div>
<div class="col-md-6">
<div class="form-floating">
<input type="text" class="form-control" @bind="@CurrRecord.Description" disabled="@CurrRecord.IsProtected">
<label class="small bg-opacity-50">@Traduci("descrizione")</label>
</div>
</div>
<div class="col-md-1">
<div class="form-floating">
<input type="number" class="form-control text-end" @bind="@CurrRecord.QtyMin">
<label class="small bg-opacity-50">@Traduci("articoli_qtyMin")</label>
</div>
</div>
<div class="col-md-1">
<div class="form-floating">
<input type="number" class="form-control text-end" @bind="@CurrRecord.QtyMax">
<label class="small bg-opacity-50">@Traduci("articoli_qtyMax")</label>
</div>
</div>
<div class="col-md-1">
<div class="form-floating">
<input type="text" class="form-control text-end" @bind="@CurrRecord.UM">
<label class="small bg-opacity-50">@Traduci("unitaMisura")</label>
</div>
</div>
<div class="col-md-3">
<div class="row g-1 py-1">
<div class="col-md-6">
<button class="btn btn-lg btn-success w-100" @onclick="DoSave">@Traduci("salva")</button>
</div>
<div class="col-md-6">
<button class="btn btn-lg btn-warning w-100" @onclick="DoCancel">@Traduci("annulla")</button>
</div>
</div>
</div>
</div>
</div>
@@ -5,7 +5,7 @@ namespace Lux.UI.Components.Compo.Item
#region Public Properties
[Parameter]
public ItemModel? CurrRecord { get; set; } = null;
public ItemModel CurrRecord { get; set; } = null!;
[Parameter]
public EventCallback<bool> EC_Close { get; set; }
+1 -1
View File
@@ -101,4 +101,4 @@ else
</table>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -4,7 +4,7 @@
@if (CurrRecord != null)
{
<div>
<span class="fs-5"># <b>@(CurrRecord?.SellingItemID)</b></span> | Codice @CurrRecord?.ItemCode
<span class="fs-5"># <b>@(CurrRecord.SellingItemID)</b></span> | Codice @CurrRecord.ItemCode
</div>
<div class="row g-1">
<div class="col-md-3">
@@ -97,4 +97,4 @@ else
</table>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -176,4 +176,4 @@
</div>
</div>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -7,7 +7,7 @@ namespace Lux.UI.Components.Compo.JobTask
#region Public Properties
[Parameter]
public JobTaskModel CurrJob { get; set; }
public JobTaskModel CurrJob { get; set; } = null!;
[Parameter]
public List<JobStepModel> CurrRecords { get; set; } = null!;
@@ -25,10 +25,10 @@ namespace Lux.UI.Components.Compo.JobTask
public List<string> ListAllTags { get; set; } = new List<string>();
[Parameter]
public List<PhaseModel> ListPhases { get; set; }
public List<PhaseModel> ListPhases { get; set; } = null!;
[Parameter]
public List<ResourceModel> ListResources { get; set; }
public List<ResourceModel> ListResources { get; set; } = null!;
#endregion Public Properties
@@ -197,7 +197,8 @@ namespace Lux.UI.Components.Compo.JobTask
/// </summary>
/// <param name="rec2del"></param>
private async Task DoDelete(JobStepModel rec2del)
{;
{
;
mTitle = "Attenzione";
mMessage = $"Sicuro di voler eliminare il record? {rec2del.Description} ({rec2del.JobStepID})";
mMode = BootstrapModal.ModalMode.Confirm;
@@ -121,4 +121,4 @@ else
</table>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -66,4 +66,4 @@ else
</div>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -39,7 +39,9 @@ namespace Lux.UI.Components.Compo.JobTask
private int currPage = 1;
private ResourceModel? editRecord = null;
#if false
private ResourceModel? editRecord = null;
#endif
private bool isLoading = false;
@@ -143,7 +145,9 @@ namespace Lux.UI.Components.Compo.JobTask
/// </summary>
private async Task DoReset()
{
editRecord = null;
#if false
editRecord = null;
#endif
selRecord = null;
await ReloadBaseData();
ReloadData();
@@ -466,4 +466,4 @@ else
}
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -205,10 +205,12 @@ namespace Lux.UI.Components.Compo.Offer
/// </summary>
private OfferRowModel? EditRecord = null;
#if false
/// <summary>
/// Abilita edit massivo record ITEM
/// </summary>
private bool enableMassEdit = false;
private bool enableMassEdit = false;
#endif
private string genericBasePath = "";
@@ -233,12 +235,14 @@ namespace Lux.UI.Components.Compo.Offer
private int numRecord = 10;
#if false
/// <summary>
/// Versione originale (pre edit)
/// </summary>
private string origJwd = "";
private List<string> PreparedFile = new();
private List<string> PreparedFile = new();
#endif
/// <summary>
/// Versione precedente JWD x test e confronto
@@ -567,4 +567,4 @@ else if (WorkLoadRecord != null)
} *@
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -271,10 +271,12 @@ namespace Lux.UI.Components.Compo.Order
private string noteCss => EditRecord == null ? "btn-success" : "btn-primary bg-gradient";
#if false
/// <summary>
/// Versione originale (pre edit)
/// </summary>
private string origJwd = "";
private string origJwd = "";
#endif
/// <summary>
/// Versione precedente JWD x test e confronto
@@ -155,4 +155,4 @@
</div>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -148,11 +148,14 @@ namespace Lux.UI.Components.Compo.Planner
/// <summary>
/// Sistemazione colore sfonto di ogni evento mostrato
/// </summary>
/// <param name="args"></param>
private void OnAppointmentRender(SchedulerAppointmentRenderEventArgs<EventDto> args)
/// <param name="selEv"></param>
private void OnAppointmentRender(SchedulerAppointmentRenderEventArgs<EventDto> selEv)
{
// Never call StateHasChanged in AppointmentRender - would lead to infinite loop
args.Attributes["style"] = $"background: {args.Data.Color}; color: {args.Data.ForeColor};";
if (selEv.Data != null)
{
// Never call StateHasChanged in AppointmentRender - would lead to infinite loop
selEv.Attributes["style"] = $"background: {selEv.Data.Color}; color: {selEv.Data.ForeColor};";
}
}
/// <summary>
@@ -162,9 +165,11 @@ namespace Lux.UI.Components.Compo.Planner
/// <returns></returns>
private async Task OnAppointmentSelect(SchedulerAppointmentSelectEventArgs<EventDto> selEv)
{
var copy = selEv.Data.Clone();
await Task.Delay(1);
var data = await DialogService.OpenAsync<TaskDetail>("", new Dictionary<string, object> { { "ThisTask", copy } });
if (selEv.Data != null)
{
var copy = selEv.Data.Clone();
var data = await DialogService.OpenAsync<TaskDetail>("", new Dictionary<string, object> { { "ThisTask", copy } });
}
}
/// <summary>
@@ -175,7 +180,10 @@ namespace Lux.UI.Components.Compo.Planner
private async Task OnLoadData(SchedulerLoadDataEventArgs args)
{
await Task.Delay(1);
currView = scheduler.SelectedView.Text.ToLowerInvariant();
if (scheduler.SelectedView != null)
{
currView = scheduler.SelectedView.Text.ToLowerInvariant();
}
DateTime dtMid = args.Start.AddDays(args.End.Subtract(args.Start).TotalDays / 2);
// controllo se sia cambiata data anno precedente...
if (dtMid.Year != SelDate.Year)
@@ -197,48 +205,53 @@ namespace Lux.UI.Components.Compo.Planner
private void OnSlotRender(SchedulerSlotRenderEventArgs args)
{
// Highlight today in month view
if (args.View.Text == "Month" && args.Start.Date == DateTime.Today)
if (args.View != null)
{
args.Attributes["style"] = "background: var(--rz-scheduler-highlight-background-color, rgba(255,220,40,.2));";
}
// Highlight today in month view
if (args.View.Text == "Month" && args.Start.Date == DateTime.Today)
{
args.Attributes["style"] = "background: var(--rz-scheduler-highlight-background-color, rgba(255,220,40,.2));";
}
// Highlight working hours (9-18)
if ((args.View.Text == "Week" || args.View.Text == "Day") && args.Start.Hour > 8 && args.Start.Hour < 19)
{
args.Attributes["style"] = "background: var(--rz-scheduler-highlight-background-color, rgba(255,220,40,.2));";
// Highlight working hours (9-18)
if ((args.View.Text == "Week" || args.View.Text == "Day") && args.Start.Hour > 8 && args.Start.Hour < 19)
{
args.Attributes["style"] = "background: var(--rz-scheduler-highlight-background-color, rgba(255,220,40,.2));";
}
}
}
private async Task OnSlotSelect(SchedulerSlotSelectEventArgs args)
{
int prevIdx = selectedIndex;
await Task.Delay(1);
// verifico indice corretto della vista...
switch (args.View.Text)
if (args.View != null)
{
case "Day":
selectedIndex = 0;
break;
// verifico indice corretto della vista...
switch (args.View.Text)
{
case "Day":
selectedIndex = 0;
break;
case "Week":
selectedIndex = 1;
break;
case "Week":
selectedIndex = 1;
break;
case "Month":
selectedIndex = 2;
break;
case "Month":
selectedIndex = 2;
break;
case "Planner":
selectedIndex = 3;
break;
case "Planner":
selectedIndex = 3;
break;
case "Year":
selectedIndex = 4;
break;
case "Year":
selectedIndex = 4;
break;
default:
break;
default:
break;
}
}
if (prevIdx != selectedIndex)
{
+30 -27
View File
@@ -15,38 +15,41 @@
</tr>
</thead>
<tbody>
@foreach (var item in AllRecords)
@if (AllRecords != null)
{
<tr>
<td class="text-start">
<button class="btn btn-info" @onclick="() => CreateProd(item)" title="Creazione Prod File"><i class="fa-solid fa-floppy-disk"></i></button>
<button class="btn btn-primary" @onclick="() => CalcProd(item)" title="Calcolo Lavorazioni"><i class="fa-solid fa-screwdriver-wrench"></i></button>
</td>
@* <td class="text-center">
foreach (var item in AllRecords)
{
<tr>
<td class="text-start">
<button class="btn btn-info" @onclick="() => CreateProd(item)" title="Creazione Prod File"><i class="fa-solid fa-floppy-disk"></i></button>
<button class="btn btn-primary" @onclick="() => CalcProd(item)" title="Calcolo Lavorazioni"><i class="fa-solid fa-screwdriver-wrench"></i></button>
</td>
@* <td class="text-center">
<button><i class="fa-solid fa-caret-up"></i></button>
@(idx++)
<button><i class="fa-solid fa-caret-down"></i></button>
</td> *@
<td class="text-start">
@item.ProdBatchID
</td>
<td class="text-start">
@item.OdlTag
</td>
<td class="text-start">
@item.ProdPlantCod
</td>
<td class="text-end">
@item.Qty
</td>
<td class="text-end">
@item.Qty
</td>
<td class="text-end fs-3">
<b>@FormatEstTime(item.EstimTime)</b>
</td>
<td></td>
</tr>
<td class="text-start">
@item.ProdBatchID
</td>
<td class="text-start">
@item.OdlTag
</td>
<td class="text-start">
@item.ProdPlantCod
</td>
<td class="text-end">
@item.Qty
</td>
<td class="text-end">
@item.Qty
</td>
<td class="text-end fs-3">
<b>@FormatEstTime(item.EstimTime)</b>
</td>
<td></td>
</tr>
}
}
</tbody>
@* <tfoot class="table-dark text-light">
@@ -31,4 +31,4 @@ else
}
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
+88 -83
View File
@@ -1,111 +1,116 @@
<div class="row">
<div class="col-2 px-2">
<div class="pb-2">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-2 rounded">
<div class="d-flex align-items-center justify-content-center">
<span class="fw-bold text-dark fs-5">Stato offerte</span>
@if (isLoading)
{
<LoadingData></LoadingData>
}
else
{
<div class="row">
<div class="col-2 px-2">
<div class="pb-2">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-2 rounded">
<div class="d-flex align-items-center justify-content-center">
<span class="fw-bold text-dark fs-5">Stato offerte</span>
</div>
</div>
</div>
</div>
<PieChart CanvasId="pieOfferCount" PieDict="@DatasetCount" DictColorFill="@FillColors" DictColorBorder="@BorderColors" Label="# Offerte" />
</div>
<PieChart CanvasId="pieOfferCount" PieDict="@DatasetCount" DictColorFill="@FillColors" DictColorBorder="@BorderColors" Label="# Offerte" />
</div>
<div class="col-2 px-2">
<div class="pb-2">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-2 rounded">
<div class="d-flex align-items-center justify-content-center">
<span class="fw-bold text-dark fs-5">Venditori</span>
<div class="col-2 px-2">
<div class="pb-2">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-2 rounded">
<div class="d-flex align-items-center justify-content-center">
<span class="fw-bold text-dark fs-5">Venditori</span>
</div>
</div>
</div>
</div>
<PieChart CanvasId="pieDealerCount" PieDict="@DatasetDealerCount" DictColorFill="@FillDealerColors" DictColorBorder="@BorderDealerColors" Label="# Offerte" />
</div>
<PieChart CanvasId="pieDealerCount" PieDict="@DatasetDealerCount" DictColorFill="@FillDealerColors" DictColorBorder="@BorderDealerColors" Label="# Offerte" />
</div>
<div class="col-8 ps-4">
<div class="row">
<div class="col-12">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center justify-content-center gap-2">
<span class="fw-bold text-dark fs-5 ps-1">Offerte confermate</span>
<div class="col-8 ps-4">
<div class="row">
<div class="col-12">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center justify-content-center gap-2">
<span class="fw-bold text-dark fs-5 ps-1">Offerte confermate</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row pt-3">
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-coins fa-2x"></i></span>
<span class="fw-bold text-dark fs-5 ps-1">Margine medio:</span>
<span class="text-primary fs-5 fw-semibold">@MargineMedio() %</span>
<div class="row pt-3">
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-coins fa-2x"></i></span>
<span class="fw-bold text-dark fs-5 ps-1">Margine medio:</span>
<span class="text-primary fs-5 fw-semibold">@MargineMedio() %</span>
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-coins fa-2x"></i></span>
<span class="fw-bold text-dark fs-6 ps-1">Margine min:</span>
<span class="text-primary fs-6 fw-semibold">@MargineMin() %</span>
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-coins fa-2x"></i></span>
<span class="fw-bold text-dark fs-6 ps-1">Margine max:</span>
<span class="text-primary fs-6 fw-semibold">@MargineMax() %</span>
</div>
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-coins fa-2x"></i></span>
<span class="fw-bold text-dark fs-6 ps-1">Margine min:</span>
<span class="text-primary fs-6 fw-semibold">@MargineMin() %</span>
<div class="row pt-3">
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-home fa-2x"></i></span>
<span class="fw-bold text-dark fs-5 ps-1">Finestre/Offerta medio:</span>
<span class="text-primary fs-5 fw-semibold">@NumFinestreMedio()</span>
</div>
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-coins fa-2x"></i></span>
<span class="fw-bold text-dark fs-6 ps-1">Margine max:</span>
<span class="text-primary fs-6 fw-semibold">@MargineMax() %</span>
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-home fa-2x"></i></span>
<span class="fw-bold text-dark fs-6 ps-1">N° Finestre min:</span>
<span class="text-primary fs-6 fw-semibold">@NumFinestreMin()</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row pt-3">
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-home fa-2x"></i></span>
<span class="fw-bold text-dark fs-5 ps-1">Finestre/Offerta medio:</span>
<span class="text-primary fs-5 fw-semibold">@NumFinestreMedio()</span>
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-home fa-2x"></i></span>
<span class="fw-bold text-dark fs-6 ps-1">N° Finestre min:</span>
<span class="text-primary fs-6 fw-semibold">@NumFinestreMin()</span>
</div>
</div>
</div>
</div>
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-home fa-2x"></i></span>
<span class="fw-bold text-dark fs-6 ps-1">N° Finestre max:</span>
<span class="text-primary fs-6 fw-semibold">@NumFinestreMax()</span>
<div class="col-4">
<div class="card border-0 rounded-3 shadow">
<div class="card-header bg-primary bg-gradient bg-opacity-25 p-3 rounded">
<div class="d-flex align-items-center gap-2">
<span class="text-primary"><i class="fa-solid fa-home fa-2x"></i></span>
<span class="fw-bold text-dark fs-6 ps-1">N° Finestre max:</span>
<span class="text-primary fs-6 fw-semibold">@NumFinestreMax()</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
}
@@ -1,4 +1,3 @@
using System.Linq;
using static EgwCoreLib.Lux.Core.Enums;
namespace Lux.UI.Components.Compo.Stats
@@ -31,7 +30,7 @@ namespace Lux.UI.Components.Compo.Stats
{
double ans = 0;
var filtRecord = AllRecords.Where(x => x.OffertState.Equals(OfferStates.Confirmed));
if(filtRecord != null && filtRecord.Count() > 0)
if (filtRecord != null && filtRecord.Count() > 0)
ans = Math.Round((filtRecord.Sum(x => x.TotalPrice) - filtRecord.Sum(x => x.TotalCost)) / filtRecord.Sum(x => x.TotalPrice) * 100, 2);
return ans;
}
@@ -41,7 +40,7 @@ namespace Lux.UI.Components.Compo.Stats
double ans = 0;
var filtRecord = AllRecords.Where(x => x.OffertState.Equals(OfferStates.Confirmed));
if (filtRecord != null && filtRecord.Count() > 0)
ans = Math.Round(filtRecord.Min(x=>x.MaxDiscount) * 100, 2);
ans = Math.Round(filtRecord.Min(x => x.MaxDiscount) * 100, 2);
return ans;
}
@@ -65,7 +64,7 @@ namespace Lux.UI.Components.Compo.Stats
private double NumFinestreMin()
{
double ans = 0;
double ans = 0;
var filtRecord = AllRecords.Where(x => x.OffertState.Equals(OfferStates.Confirmed));
if (filtRecord != null && filtRecord.Count() > 0)
ans = filtRecord.Min(x => x.NumItems);
@@ -105,12 +104,11 @@ namespace Lux.UI.Components.Compo.Stats
FillColors[allStates[i]] = "hsla(0, 70%, 50%, 0.5)";
break;
}
//FillColors[allStates[i]] = palette[i];
BorderColors[allStates[i]] = ColorHelper.ToOpaque(FillColors[allStates[i]]);
}
DatasetCount = AllRecords
.Where(p => p.OffertState != null)
//.Where(p => p.OffertState != null)
.GroupBy(p => p.OffertState.ToString())
.ToDictionary(g => g.Key, g => (double)g.Count());
@@ -133,7 +131,7 @@ namespace Lux.UI.Components.Compo.Stats
}
DatasetDealerCount = AllRecords
.Where(p => p.OffertState != null)
//.Where(p => p.OffertState != null)
.GroupBy(p => p.DealerNav.LastName)
.ToDictionary(g => g.Key, g => (double)g.Count());
@@ -62,7 +62,9 @@ namespace Lux.UI.Components.Compo.Stats
private Enums.RuidTagMode SelMode = Enums.RuidTagMode.Envir;
private StatsRealtimeDto? stats;
#if false
private StatsRealtimeDto? stats;
#endif
#endregion Private Fields
@@ -94,4 +94,4 @@ else
}
@* } *@
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -161,4 +161,4 @@ else
}
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -32,7 +32,9 @@ namespace Lux.UI.Components.Compo.Warehouse
#region Private Fields
private bool allSelected = false;
#if false
private bool allSelected = false;
#endif
private string apiUrl = "";
@@ -1,32 +1,39 @@
@inherits BaseComp
<div class="p-2 shadow">
<div class="d-flex justify-content-between">
<div class="px-0 fs-4">
<b>@Traduci("fabbisogno_fornitoreOrd")</b>
</div>
<div class="px-0 d-flex justify-content-between">
<div class="input-group input-group-sm" style="width:10em;" title="@Traduci("ricerca")">
<span class="input-group-text">@Traduci("stato")</span>
<select class="form-select" @bind="@SearchVal">
@foreach (var item in OrderStateList)
{
<option value="@item.ToString()">@Traduci("fornitore_"+item.ToString().ToLower())</option>
}
</select>
@if (isLoading)
{
<LoadingData></LoadingData>
}
else
{
<div class="p-2 shadow">
<div class="d-flex justify-content-between">
<div class="px-0 fs-4">
<b>@Traduci("fabbisogno_fornitoreOrd")</b>
</div>
<div class="px-0 d-flex justify-content-between">
<div class="input-group input-group-sm" style="width:10em;" title="@Traduci("ricerca")">
<span class="input-group-text">@Traduci("stato")</span>
<select class="form-select" @bind="@SearchVal">
@foreach (var item in OrderStateList)
{
<option value="@item.ToString()">@Traduci("fornitore_" + item.ToString().ToLower())</option>
}
</select>
</div>
</div>
</div>
</div>
<div class="my-2 py-1">
@foreach (var item in ListRecords)
<div class="my-2 py-1">
@foreach (var item in ListRecords)
{
<BuyOrderDetail CurrRec="@item" EC_SaveBuyOrder="SaveBuyOrder"></BuyOrderDetail>
}
</div>
@if (totalCount > numRecord)
{
<BuyOrderDetail CurrRec="@item" EC_SaveBuyOrder="SaveBuyOrder"></BuyOrderDetail>
<div class="card-footer py-0 px-1">
<EgwCoreLib.Razor.DataPager currPage="@currPage" PageSize="@numRecord" totalCount="@totalCount" numPageChanged="SavePage" numRecordChanged="SaveNumRec"></EgwCoreLib.Razor.DataPager>
</div>
}
</div>
@if (totalCount > numRecord)
{
<div class="card-footer py-0 px-1">
<EgwCoreLib.Razor.DataPager currPage="@currPage" PageSize="@numRecord" totalCount="@totalCount" numPageChanged="SavePage" numRecordChanged="SaveNumRec"></EgwCoreLib.Razor.DataPager>
</div>
}
</div>
}
@@ -142,7 +142,10 @@ namespace Lux.UI.Components.Compo.Warehouse
}
else
{
query = query.Where(x => x.ItemCode.Contains(searchVal, StringComparison.OrdinalIgnoreCase) || (x.ItemID != null && x.ItemNav.Description.Contains(searchVal, StringComparison.OrdinalIgnoreCase)));
query = query.Where(x =>
x.ItemCode.Contains(searchVal, StringComparison.OrdinalIgnoreCase)
|| (x.ItemID != null && x.ItemNav != null && x.ItemNav.Description.Contains(searchVal, StringComparison.OrdinalIgnoreCase))
);
}
}
// effettuo search
@@ -29,7 +29,7 @@
}
}
</li>
@if (QueuePaged == null || QueuePaged?.Count() == 0)
@if (QueuePaged == null || QueuePaged.Count() == 0)
{
<li class="list-group-item align-items-lg-start">Nessun Job trovato!</li>
}
@@ -235,4 +235,4 @@
</div>
</div>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
+4 -2
View File
@@ -16,7 +16,9 @@ namespace Lux.UI.Components.Pages
#region Private Fields
private ItemModel? editRecord = null;
#if false
private ItemModel? editRecord = null;
#endif
private bool isLoading = false;
private List<GenClassModel> ListGenClass = new List<GenClassModel>();
@@ -83,7 +85,7 @@ namespace Lux.UI.Components.Pages
{
SelCodGroup = codGroup;
}
#endregion Private Methods
}
}
+35 -27
View File
@@ -1,38 +1,46 @@
@page "/OffStats"
@inherits BaseComp
<div class="p-2 shadow">
<div class="d-flex align-items-center justify-content-between">
<a href="@NavigationManager.ToAbsoluteUri("Offers")" class="btn btn-primary shadow-sm rounded-4 px-3">
<i class="fa-solid fa-list me-1"></i>
@Traduci("navMan_offerte")
</a>
<div class="input-group input-group shadow-sm" style="width:35em;">
<div class="input-group">
<span class="input-group-text">Da:</span>
<input type="datetime-local"
class="form-control"
min="@periodoLimit.Inizio.AddHours(-1).ToString("yyyy-MM-ddTHH:mm")"
max="@DateTime.Now.Hour.ToString("yyyy-MM-ddTHH:mm")"
@bind="@dtFrom" />
<span class="input-group-text">A:</span>
<input type="datetime-local"
class="form-control"
min="@periodoLimit.Inizio.ToString("yyyy-MM-ddTHH:mm")"
max="@DateTime.Now.Hour.ToString("yyyy-MM-ddTHH:mm")"
@bind="@dtTo" />
@if (isLoading)
{
<LoadingData></LoadingData>
}
else
{
<div class="p-2 shadow">
<div class="d-flex align-items-center justify-content-between">
<a href="@NavigationManager.ToAbsoluteUri("Offers")" class="btn btn-primary shadow-sm rounded-4 px-3">
<i class="fa-solid fa-list me-1"></i>
@Traduci("navMan_offerte")
</a>
<div class="input-group input-group shadow-sm" style="width:35em;">
<div class="input-group">
<span class="input-group-text">Da:</span>
<input type="datetime-local"
class="form-control"
min="@periodoLimit.Inizio.AddHours(-1).ToString("yyyy-MM-ddTHH:mm")"
max="@DateTime.Now.Hour.ToString("yyyy-MM-ddTHH:mm")"
@bind="@dtFrom" />
<button class="btn btn-sm @btnReload" @onclick="DoReload">
Carica <i class="fa-solid fa-arrows-rotate"></i>
</button>
<span class="input-group-text">A:</span>
<input type="datetime-local"
class="form-control"
min="@periodoLimit.Inizio.ToString("yyyy-MM-ddTHH:mm")"
max="@DateTime.Now.Hour.ToString("yyyy-MM-ddTHH:mm")"
@bind="@dtTo" />
<button class="btn btn-sm @btnReload" @onclick="DoReload">
Carica <i class="fa-solid fa-arrows-rotate"></i>
</button>
</div>
</div>
</div>
<div class="my-2 py-1">
<OfferStats AllRecords="AllOfferRecords"></OfferStats>
</div>
</div>
<div class="my-2 py-1">
<OfferStats AllRecords="AllOfferRecords"></OfferStats>
</div>
</div>
}
@* <div class="card shadow">
+1 -1
View File
@@ -284,4 +284,4 @@ else
{
<PrintModal url="@apiUrl" currId="@currId" repType="Offerta" EC_Close="ClosePrintModal"></PrintModal>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
+3 -3
View File
@@ -166,7 +166,7 @@ namespace Lux.UI.Components.Pages
private IProdService PService { get; set; } = null!;
[Inject]
private NavigationManager NavigationManager { get;set; } = null!;
private NavigationManager NavigationManager { get; set; } = null!;
private string txtState
{
@@ -229,7 +229,7 @@ namespace Lux.UI.Components.Pages
private void DoAdd()
{
int refNum = AllRecords.Where(x=>x.RefYear == DateTime.Today.Year).Max(x=>x.RefNum) + 1;
int refNum = AllRecords.Where(x => x.RefYear == DateTime.Today.Year).Max(x => x.RefNum) + 1;
EditRecord = new OfferModel()
{
RefYear = DateTime.Today.Year,
@@ -498,7 +498,7 @@ namespace Lux.UI.Components.Pages
bool needCalc = false;
// recupero elenco items collegati alla riga d'ordine
var ProdList = await PIService.GetByOrderRowAsync(rigaOrd.OrderRowID);
List<string> TagList = ProdList.Select(x => x.ProdItemTag).ToList();
List<string> TagList = ProdList.Select(x => x.ProdItemTag ?? "").ToList();
//string serTagList = JsonConvert.SerializeObject(TagList);
string serTagList = string.Join(",", TagList);
// preparo richiesta serializzata e la accodo (viene inviata richiesta calcolo)
+3 -2
View File
@@ -163,7 +163,8 @@ else
<option value="">-- @Traduci("tutti") --</option>
@foreach (var sType in Enum.GetValues(typeof(EgwCoreLib.Lux.Core.Enums.OrderStates)))
{
<option value="@sType">@Traduci("ordine_" + sType.ToString().ToLower())</option>
@* <option value="@sType">@Traduci("ordine_" + sType.ToString().ToLower())</option> *@
<option value="@sType">@Traduci($"ordine_{sType}".ToLower())</option>
}
</select>
</div>
@@ -364,4 +365,4 @@ else
<PrintModal url="@apiUrl" currId="@currId" repType="MaterialReqOrd" EC_Close="ClosePrintModal"></PrintModal>
}
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
+4 -2
View File
@@ -84,7 +84,9 @@ namespace Lux.UI.Components.Pages
private int totalCount = 0;
private string txtStyle = "font-size: 1.2em; font-weight:bold; fill: white;";
#if false
private string txtStyle = "font-size: 1.2em; font-weight:bold; fill: white;";
#endif
private BootstrapModal Modal = new();
private string mTitle = "";
@@ -360,7 +362,7 @@ namespace Lux.UI.Components.Pages
var ProdList = await PIService.GetByOrderRowAsync(rigaOrd.OrderRowID);
if (ProdList != null && ProdList.Count > 0)
{
TagsList = ProdList.Select(x => x.ProdItemTag).ToList();
TagsList = ProdList.Select(x => x.ProdItemTag ?? "").ToList();
}
//string serTagList = JsonConvert.SerializeObject(TagList);
string serTagList = string.Join(",", TagsList);
+1 -1
View File
@@ -51,5 +51,5 @@
</div>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
+8 -4
View File
@@ -16,12 +16,14 @@ namespace Lux.UI.Components.Pages
#region Private Fields
private bool addNew = false;
private VocabolarioModel? currRec = null;
private List<VocabolarioModel> FiltVocab = new();
private List<VocabolarioModel> FullVocab = new();
private bool isLoading = false;
private string langDef = "IT";
#if false
private List<VocabolarioModel> FiltVocab = new();
private bool addNew = false;
private string langDef = "IT";
#endif
private List<LinguaModel> ListLingue = new();
private string SearchVal = "";
@@ -32,8 +34,10 @@ namespace Lux.UI.Components.Pages
private string btnResetCss => string.IsNullOrEmpty(SearchVal) ? "btn-secondary" : "btn-primary";
#if false
[Inject]
private IVocabolarioService VService { get; set; } = null!;
private IVocabolarioService VService { get; set; } = null!;
#endif
#endregion Private Properties
@@ -51,4 +51,4 @@
</div>
</div>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="BootstrapModal.ModalMode.Confirm" UserOptions=@modalOpt></BootstrapModal>
<BootstrapModal @ref=Modal Title=@mTitle Message=@mMessage Mode="mMode" UserOptions=@modalOpt></BootstrapModal>
@@ -1,7 +1,6 @@
using EgwCoreLib.Lux.Core.Generic;
using EgwCoreLib.Razor;
using Newtonsoft.Json;
using System.Linq;
using static EgwCoreLib.Lux.Core.Enums;
using static Lux.UI.Components.Compo.Planner.BalanceProgGroup;
@@ -517,79 +516,81 @@ namespace Lux.UI.Components.Pages
var currPOR = ListEstimRecords?.FirstOrDefault(x => x.OrderRowID == prodGroupItem.OrderRowID) ?? new OrderRowModel();
var currRec = await OrdService.GetByIdAsync(currPOR.OrderID, true);
var dictReq = new Dictionary<string, double>();
// verifico se ho 1 sola macchina o molte...
int numMacc = prodGroupItem.WorkGroupList.Count;
if (numMacc == 1)
if (currRec != null)
{
// SE vuoto il nome --> manual!
var curRec = prodGroupItem.WorkGroupList.FirstOrDefault();
string mName = string.IsNullOrEmpty(curRec.Key) ? "Manual" : curRec.Key;
dictReq.Add(mName, 1);
balData.MachineBalance = dictReq;
balData.TagList = curRec.Value.TagList;
}
else
{
List<string> tagList = new();
foreach (var cMacc in prodGroupItem.WorkGroupList)
var dictReq = new Dictionary<string, double>();
// verifico se ho 1 sola macchina o molte...
int numMacc = prodGroupItem.WorkGroupList.Count;
if (numMacc == 1)
{
dictReq.Add(cMacc.Key, 1.0 / numMacc);
tagList.AddRange(cMacc.Value.TagList);
// SE vuoto il nome --> manual!
var curRec = prodGroupItem.WorkGroupList.FirstOrDefault();
string mName = string.IsNullOrEmpty(curRec.Key) ? "Manual" : curRec.Key;
dictReq.Add(mName, 1);
balData.MachineBalance = dictReq;
balData.TagList = curRec.Value.TagList;
}
// verifico tags distinct
balData.MachineBalance = dictReq;
balData.TagList = tagList.Distinct().ToList();
else
{
List<string> tagList = new();
foreach (var cMacc in prodGroupItem.WorkGroupList)
{
dictReq.Add(cMacc.Key, 1.0 / numMacc);
tagList.AddRange(cMacc.Value.TagList);
}
// verifico tags distinct
balData.MachineBalance = dictReq;
balData.TagList = tagList.Distinct().ToList();
}
// preparo oggetto richiesta
Egw.Window.Data.Enums.QuestionModes cMode = Egw.Window.Data.Enums.QuestionModes.ORDER;
Egw.Window.Data.Enums.QuestionOrderSubModes cSubMode = Egw.Window.Data.Enums.QuestionOrderSubModes.BALANCE;
string reqKey = "";
// preparo la richiesta di bilanciamento
CalcRequestDTO calcReq = new CalcRequestDTO();
// elenco tags ricevuto...
List<string> TagList = balData.TagList;
string serTagList = string.Join(",", TagList);
// preparo richiesta serializzata e la accodo (viene inviata richiesta calcolo)
Dictionary<string, string> dictArgs = new Dictionary<string, string>();
// creo registrazione richiesta...
var ruid = await CRService.AddRequestAsync($"{currPOR.Envir}", $"{(int)cMode}-{(int)cSubMode}", currPOR.OrderRowUID);
dictArgs.Add("UID", currPOR.OrderRowUID);
dictArgs.Add("Group", $"{prodGroupItem.GrpIdx}");
// aggiungo RUID effettivo
dictArgs.Add("RUID", ruid);
dictArgs.Add("OrderUID", currRec.OrderCode);
dictArgs.Add("Mode", $"{(int)cMode}");
dictArgs.Add("SubMode", $"{(int)cSubMode}");
dictArgs.Add("TagList", serTagList);
// serializzo la richiesta di bilanciamento...
string reqBalance = JsonConvert.SerializeObject(balData.MachineBalance);
dictArgs.Add("ReqBalance", reqBalance);
dictArgs.Add("BarLenght", $"{balData.BarLenght}");
calcReq = new CalcRequestDTO()
{
DictExec = dictArgs,
EnvType = currPOR.Envir
};
// chiave: composta da cMode, submode, UID riga...
reqKey = $"{cMode}:{cSubMode}:{currPOR.OrderRowUID}.{prodGroupItem.GrpIdx}";
// invio richiesta
await PService.EnqueueRequestAsync("Balance", reqKey, calcReq);
// parto dalla history attuale
var currHist = currRec.LogHistory;
// aggiungo evento...
currHist.Add(new TaskHistDTO()
{
DtEvent = DateTime.Now,
UserName = "Default User",
Message = $"{reqKey}",
IconCss = "fa-solid fa-hourglass-start"
});
currRec.LogHistory = currHist;
await OrdService.UpsertAsync(currRec);
}
// preparo oggetto richiesta
Egw.Window.Data.Enums.QuestionModes cMode = Egw.Window.Data.Enums.QuestionModes.ORDER;
Egw.Window.Data.Enums.QuestionOrderSubModes cSubMode = Egw.Window.Data.Enums.QuestionOrderSubModes.BALANCE;
string reqKey = "";
// preparo la richiesta di bilanciamento
CalcRequestDTO calcReq = new CalcRequestDTO();
// elenco tags ricevuto...
List<string> TagList = balData.TagList;
string serTagList = string.Join(",", TagList);
// preparo richiesta serializzata e la accodo (viene inviata richiesta calcolo)
Dictionary<string, string> dictArgs = new Dictionary<string, string>();
// creo registrazione richiesta...
var ruid = await CRService.AddRequestAsync($"{currPOR.Envir}", $"{(int)cMode}-{(int)cSubMode}", currPOR.OrderRowUID);
dictArgs.Add("UID", currPOR.OrderRowUID);
dictArgs.Add("Group", $"{prodGroupItem.GrpIdx}");
// aggiungo RUID effettivo
dictArgs.Add("RUID", ruid);
dictArgs.Add("OrderUID", currRec.OrderCode);
dictArgs.Add("Mode", $"{(int)cMode}");
dictArgs.Add("SubMode", $"{(int)cSubMode}");
dictArgs.Add("TagList", serTagList);
// serializzo la richiesta di bilanciamento...
string reqBalance = JsonConvert.SerializeObject(balData.MachineBalance);
dictArgs.Add("ReqBalance", reqBalance);
dictArgs.Add("BarLenght", $"{balData.BarLenght}");
calcReq = new CalcRequestDTO()
{
DictExec = dictArgs,
EnvType = currPOR.Envir
};
// chiave: composta da cMode, submode, UID riga...
reqKey = $"{cMode}:{cSubMode}:{currPOR.OrderRowUID}.{prodGroupItem.GrpIdx}";
// invio richiesta
await PService.EnqueueRequestAsync("Balance", reqKey, calcReq);
// parto dalla history attuale
var currHist = currRec.LogHistory;
// aggiungo evento...
currHist.Add(new TaskHistDTO()
{
DtEvent = DateTime.Now,
UserName = "Default User",
Message = $"{reqKey}",
IconCss = "fa-solid fa-hourglass-start"
});
currRec.LogHistory = currHist;
await OrdService.UpsertAsync(currRec);
}
}
@@ -619,7 +620,7 @@ namespace Lux.UI.Components.Pages
{
ListOdl = ListOdlAll.Where(x => FiltEnvir == null || x.Envir == FiltEnvir).ToList();
}
// if (ListEstimRecordsAll != null && ListEstimRecordsAll.Count > 0)
// {
// ListEstimRecords = ListEstimRecordsAll.Where(x => x.Envir.ToString() == searchValByEnvir).ToList();
@@ -632,7 +633,7 @@ namespace Lux.UI.Components.Pages
// {
// ListOdl = ListOdlAll.Where(x => x.Envir.ToString() == searchValByEnvir).ToList();
// }
}
}
/// <summary>
/// Filtro e paginazione
@@ -646,7 +647,7 @@ namespace Lux.UI.Components.Pages
.Take(numRecord)
.ToList();
#endif
}
}
#if false
@@ -659,8 +660,8 @@ namespace Lux.UI.Components.Pages
throw new global::System.NotImplementedException();
}
#endif
#endregion Private Methods
#endregion Private Methods
}
}
+1 -1
View File
@@ -5,7 +5,7 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>aspnet-Lux.UI-a758c101-a2f4-4e38-977d-1c4887dbbd50</UserSecretsId>
<Version>1.1.2606.1015</Version>
<Version>1.1.2606.1016</Version>
</PropertyGroup>
<ItemGroup>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>LUX - Web Windows MES</i>
<h4>Versione: 1.1.2606.1015</h4>
<h4>Versione: 1.1.2606.1016</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
1.1.2606.1015
1.1.2606.1016
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>1.1.2606.1015</version>
<version>1.1.2606.1016</version>
<url>http://nexus.steamware.net/repository/SWS/GPW/stable/GPW.UI.zip</url>
<changelog>http://nexus.steamware.net/repository/SWS/GPW/stable/ChangeLog.html</changelog>
<mandatory>false</mandatory>