Merge branch 'Release/Update202506_01'
This commit is contained in:
@@ -28,7 +28,7 @@ namespace MP_TAB3.Components
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
{
|
||||
IobInfo = await TabSrv.IobInfo(idxMacch);
|
||||
IobInfo = await TabSrv.IobInfoAsync(idxMacch);
|
||||
MachineData = TabSrv.MachIobConf(idxMacch);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
@if (odlOk)
|
||||
{
|
||||
<div class="@ConfCssWidth">
|
||||
<button class="btn btn-lg @ConfBg py-2 px-2 text-nowrap text-truncate" style="width: 100%" @onclick="()=>ToggleConfProd()">
|
||||
<button class="btn btn-lg @ConfBg py-2 px-2 text-nowrap text-truncate" style="width: 100%" @onclick="() => ToggleConfProd()">
|
||||
<span>@ConfTitle</span><i class="fa-solid @ConfTitleIcon ps-1"></i>
|
||||
</button>
|
||||
</div>
|
||||
@@ -80,90 +80,99 @@
|
||||
{
|
||||
<div class="cardBg bg-dark bg-gradient p-2 mt-2 border border-success border-2">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="col-6">
|
||||
<div class="p-1">
|
||||
<div class="ps-1 fw-bold" style="font-size: 1.3rem;">Pz CONFERMATI <small>(prod. tot.)</small></div>
|
||||
<div class="rounded">
|
||||
<input class="form-control border-0 fw-bold" style="font-size: 1.5rem; background-color: #fff3cd; color: #000" aria-label="Floating label select example" @bind="numPzProdotti2Rec" @onblur="() => setConfirmBtn(true)" @onfocus="() => setConfirmBtn(false)" />
|
||||
</div>
|
||||
@if (isProcessing)
|
||||
{
|
||||
<div class="col-12">
|
||||
<LoadingData Title="Processing Dati Conferma" DisplayMode="LoadingData.SpinMode.BounceLine" DisplaySize="LoadingData.CtrlSize.Large"></LoadingData>
|
||||
</div>
|
||||
<div class="p-1">
|
||||
@if (enablePzProdLasciati)
|
||||
{
|
||||
<div class="ps-1 fw-bold" style="font-size: 1.3rem;">Pz LASCIATI <small>(prodotti)</small></div>
|
||||
<div class="bg-secondary rounded">
|
||||
<input class="form-control text-light bg-secondary border-0" style="font-size: 1.5rem;" aria-label="Floating label select example" @bind="numPzLasciati" @onblur="() => setConfirmBtn(true)" @onfocus="() => setConfirmBtn(false)" />
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="col-6">
|
||||
<div class="p-1">
|
||||
<div class="ps-1 fw-bold" style="font-size: 1.3rem;">Pz CONFERMATI <small>(prod. tot.)</small></div>
|
||||
<div class="rounded">
|
||||
<input class="form-control border-0 fw-bold" style="font-size: 1.5rem; background-color: #fff3cd; color: #000" aria-label="Floating label select example" @bind="numPzProdotti2Rec" @onblur="() => setConfirmBtn(true)" @onfocus="() => setConfirmBtn(false)" />
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<label class="btn btn-dark text-light btn-lg w-100" Visible="false"> </label>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div style="display: flex; flex-direction: column; justify-content: space-between; height: 100%;">
|
||||
<div class="p-1" style="font-size: 1.4rem">
|
||||
<div class="d-flex justify-content-between lh-sm text-success">
|
||||
@if (lblPz2RecBuoni > 0)
|
||||
{
|
||||
<span>Pz Buoni</span>
|
||||
<span class="fw-bold">@lblPz2RecBuoni</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="text-secondary">Pz Buoni</span>
|
||||
<span class="text-secondary">@lblPz2RecBuoni</span>
|
||||
}
|
||||
</div>
|
||||
<div class="d-flex justify-content-between lh-sm text-danger">
|
||||
@if (lblPz2RecScarto > 0)
|
||||
{
|
||||
<span>Pz scarto</span>
|
||||
<span>@lblPz2RecScarto</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="text-secondary">Pz scarto</span>
|
||||
<span class="text-secondary">@lblPz2RecScarto</span>
|
||||
}
|
||||
</div>
|
||||
<div class="d-flex justify-content-between lh-sm text-info">
|
||||
@if (lblCicliRilavorati > 0)
|
||||
{
|
||||
<span>Cicli Rilav.</span>
|
||||
<span>@lblCicliRilavorati</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="text-secondary">Cicli Rilav.</span>
|
||||
<span class="text-secondary">@lblCicliRilavorati</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center h-100 d-flex flex-column align-items-center flex-nowrap justify-content-end">
|
||||
@($"{dtReqUpdate:HH:mm:ss} | {dtReqUpdate:ddd yyyy.MM.dd}")
|
||||
</div>
|
||||
<div class="p-1">
|
||||
@if (showConfirm && lblPz2RecBuoni >= 0)
|
||||
@if (enablePzProdLasciati)
|
||||
{
|
||||
<button class="btn btn-success text-light btn-lg w-100 h-100" @onclick="SalvaConfPz"><i class="fa-regular fa-floppy-disk"></i></button>
|
||||
}
|
||||
else if (showConfirm && lblPz2RecBuoni < 0 && !chkPzBuoniNeg)
|
||||
{
|
||||
<button class="btn btn-success text-light btn-lg w-100 h-100" @onclick="SalvaConfPz"><i class="fa-regular fa-floppy-disk"></i></button>
|
||||
}
|
||||
else if (showConfirm && lblPz2RecBuoni < 0 && chkPzBuoniNeg)
|
||||
{
|
||||
<div class="btn btn-danger btn-lg text-light fw-bold text-center w-100 h-100">Pezzi buoni negativi!</div>
|
||||
<div class="ps-1 fw-bold" style="font-size: 1.3rem;">Pz LASCIATI <small>(prodotti)</small></div>
|
||||
<div class="bg-secondary rounded">
|
||||
<input class="form-control text-light bg-secondary border-0" style="font-size: 1.5rem;" aria-label="Floating label select example" @bind="numPzLasciati" @onblur="() => setConfirmBtn(true)" @onfocus="() => setConfirmBtn(false)" />
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<btn class="btn btn-info btn-lg w-100 h-100" disabled>Completare le modifiche!</btn>
|
||||
<label class="btn btn-dark text-light btn-lg w-100" Visible="false"> </label>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div style="display: flex; flex-direction: column; justify-content: space-between; height: 100%;">
|
||||
<div class="p-1" style="font-size: 1.4rem">
|
||||
<div class="d-flex justify-content-between lh-sm text-success">
|
||||
@if (lblPz2RecBuoni > 0)
|
||||
{
|
||||
<span>Pz Buoni</span>
|
||||
<span class="fw-bold">@lblPz2RecBuoni</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="text-secondary">Pz Buoni</span>
|
||||
<span class="text-secondary">@lblPz2RecBuoni</span>
|
||||
}
|
||||
</div>
|
||||
<div class="d-flex justify-content-between lh-sm text-danger">
|
||||
@if (lblPz2RecScarto > 0)
|
||||
{
|
||||
<span>Pz scarto</span>
|
||||
<span>@lblPz2RecScarto</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="text-secondary">Pz scarto</span>
|
||||
<span class="text-secondary">@lblPz2RecScarto</span>
|
||||
}
|
||||
</div>
|
||||
<div class="d-flex justify-content-between lh-sm text-info">
|
||||
@if (lblCicliRilavorati > 0)
|
||||
{
|
||||
<span>Cicli Rilav.</span>
|
||||
<span>@lblCicliRilavorati</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="text-secondary">Cicli Rilav.</span>
|
||||
<span class="text-secondary">@lblCicliRilavorati</span>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center h-100 d-flex flex-column align-items-center flex-nowrap justify-content-end">
|
||||
@($"{dtReqUpdate:HH:mm:ss} | {dtReqUpdate:ddd yyyy.MM.dd}")
|
||||
</div>
|
||||
<div class="p-1">
|
||||
@if (showConfirm && lblPz2RecBuoni >= 0)
|
||||
{
|
||||
<button class="btn btn-success text-light btn-lg w-100 h-100" @onclick="SalvaConfPz"><i class="fa-regular fa-floppy-disk"></i></button>
|
||||
}
|
||||
else if (showConfirm && lblPz2RecBuoni < 0 && !chkPzBuoniNeg)
|
||||
{
|
||||
<button class="btn btn-success text-light btn-lg w-100 h-100" @onclick="SalvaConfPz"><i class="fa-regular fa-floppy-disk"></i></button>
|
||||
}
|
||||
else if (showConfirm && lblPz2RecBuoni < 0 && chkPzBuoniNeg)
|
||||
{
|
||||
<div class="btn btn-danger btn-lg text-light fw-bold text-center w-100 h-100">Pezzi buoni negativi!</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<btn class="btn btn-info btn-lg w-100 h-100" disabled>Completare le modifiche!</btn>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
@@ -181,7 +190,7 @@
|
||||
<div class="d-flex align-items-center text-center justify-content-center">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span fs-1 py-1"></i>
|
||||
<i class="fa-solid fa-circle-notch fa-spin fs-1 py-1"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -198,7 +207,7 @@
|
||||
<div class="text-dark d-flex align-items-center text-center justify-content-center">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span fs-1 py-1"></i>
|
||||
<i class="fa-solid fa-circle-notch fa-spin fs-1 py-1"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -215,7 +224,7 @@
|
||||
<div class="text-dark d-flex align-items-center text-center justify-content-center">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span fs-1 py-1"></i>
|
||||
<i class="fa-solid fa-circle-notch fa-spin fs-1 py-1"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -232,7 +241,7 @@
|
||||
<div class="text-dark d-flex align-items-center text-center justify-content-center">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span fs-1 py-1"></i>
|
||||
<i class="fa-solid fa-circle-notch fa-spin fs-1 py-1"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -249,7 +258,7 @@
|
||||
<div class="text-dark d-flex align-items-center text-center justify-content-center">
|
||||
@if (isProcessing)
|
||||
{
|
||||
<i class="fa-solid fa-spinner span fs-1 py-1"></i>
|
||||
<i class="fa-solid fa-circle-notch fa-spin fs-1 py-1"></i>
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<Version>6.16.2506.1215</Version>
|
||||
<Version>6.16.2507.113</Version>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>MP_TAB3</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
@@ -110,7 +110,7 @@ namespace MP_TAB3.Pages
|
||||
|
||||
private string baseLang { get; set; } = "";
|
||||
|
||||
private List<Macchine>? ListMachineEnabled { get; set; } = null;
|
||||
private List<MacchineModel>? ListMachineEnabled { get; set; } = null;
|
||||
|
||||
private List<MappaStatoExplModel>? ListMSE { get; set; } = null;
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace MP_TAB3.Pages
|
||||
protected List<ODLExpModel> ListComplete { get; set; } = new List<ODLExpModel>();
|
||||
|
||||
protected List<ODLExpModel> ListODL { get; set; } = new List<ODLExpModel>();
|
||||
protected List<Macchine> ListMachine { get; set; } = new List<Macchine>();
|
||||
protected List<MacchineModel> ListMachine { get; set; } = new List<MacchineModel>();
|
||||
|
||||
protected int MatrOpr
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<body>
|
||||
<i>Modulo MAPOSPEC </i>
|
||||
<h4>Versione: 6.16.2506.1215</h4>
|
||||
<h4>Versione: 6.16.2507.113</h4>
|
||||
<br /> Note di rilascio:
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
@@ -1 +1 @@
|
||||
6.16.2506.1215
|
||||
6.16.2507.113
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<item>
|
||||
<version>6.16.2506.1215</version>
|
||||
<version>6.16.2507.113</version>
|
||||
<url>https://nexus.steamware.net/repository/SWS/MP-TAB3/stable/LAST/MP-TAB3.zip</url>
|
||||
<changelog>https://nexus.steamware.net/repository/SWS/MP-TAB3/stable/LAST/ChangeLog.html</changelog>
|
||||
<mandatory>false</mandatory>
|
||||
|
||||
@@ -16,6 +16,14 @@ namespace MP.AppAuth.Controllers
|
||||
|
||||
#endregion Public Fields
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static IConfiguration _configuration;
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Public Constructors
|
||||
|
||||
public MPController(IConfiguration configuration)
|
||||
@@ -92,54 +100,6 @@ namespace MP.AppAuth.Controllers
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco Record x AnagMicroStati
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<AnagraficaMicroStati> AnagMicroStati()
|
||||
{
|
||||
List<AnagraficaMicroStati> dbResult = new List<AnagraficaMicroStati>();
|
||||
using (MoonProContext localDbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = localDbCtx
|
||||
.DbSetAnagMicroStati
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco Record x AnagraficaStati
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<AnagraficaStati> AnagStati()
|
||||
{
|
||||
List<AnagraficaStati> dbResult = new List<AnagraficaStati>();
|
||||
using (MoonProContext localDbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = localDbCtx
|
||||
.DbSetAnagStati
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco Record x ListValues
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<ListValues> ListValues()
|
||||
{
|
||||
List<ListValues> dbResult = new List<ListValues>();
|
||||
using (MoonProContext localDbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = localDbCtx
|
||||
.DbSetListValue
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete Record AnagKeyValue
|
||||
/// </summary>
|
||||
@@ -210,6 +170,38 @@ namespace MP.AppAuth.Controllers
|
||||
return fatto;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco Record x AnagMicroStati
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<AnagraficaMicroStati> AnagMicroStati()
|
||||
{
|
||||
List<AnagraficaMicroStati> dbResult = new List<AnagraficaMicroStati>();
|
||||
using (MoonProContext localDbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = localDbCtx
|
||||
.DbSetAnagMicroStati
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco Record x AnagraficaStati
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<AnagraficaStati> AnagStati()
|
||||
{
|
||||
List<AnagraficaStati> dbResult = new List<AnagraficaStati>();
|
||||
using (MoonProContext localDbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = localDbCtx
|
||||
.DbSetAnagStati
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete Record Config
|
||||
/// </summary>
|
||||
@@ -288,6 +280,38 @@ namespace MP.AppAuth.Controllers
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco Record x ListValues
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<ListValues> ListValues()
|
||||
{
|
||||
List<ListValues> dbResult = new List<ListValues>();
|
||||
using (MoonProContext localDbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = localDbCtx
|
||||
.DbSetListValue
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco Record Macchine
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<MacchineModel> MacchineGetAll()
|
||||
{
|
||||
List<MacchineModel> dbResult = new List<MacchineModel>();
|
||||
using (MoonProContext localDbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = localDbCtx
|
||||
.DbSetMacchine
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Delete Record Vocabolario
|
||||
/// </summary>
|
||||
@@ -356,12 +380,5 @@ namespace MP.AppAuth.Controllers
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static IConfiguration _configuration;
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
#endregion Private Fields
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace MP.AppAuth.Models
|
||||
{
|
||||
public partial class Macchine
|
||||
[Table("Macchine")]
|
||||
public partial class MacchineModel
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
public string CodMacchina { get; set; }
|
||||
public int ColNum { get; set; }
|
||||
public string Css { get; set; }
|
||||
public string Descrizione { get; set; }
|
||||
public string IdxMacchina { get; set; }
|
||||
public string Locazione { get; set; }
|
||||
public string CodMacchina { get; set; }
|
||||
public string Nome { get; set; }
|
||||
public string Descrizione { get; set; }
|
||||
public string Locazione { get; set; }
|
||||
public string Note { get; set; }
|
||||
public int RowNum { get; set; }
|
||||
public string Css { get; set; }
|
||||
public string Url { get; set; }
|
||||
public int ColNum { get; set; }
|
||||
public int RowNum { get; set; }
|
||||
|
||||
#endregion Public Properties
|
||||
}
|
||||
@@ -70,7 +70,7 @@ namespace MP.AppAuth
|
||||
public virtual DbSet<KeepAlive> DbSetKeepAlive { get; set; }
|
||||
public virtual DbSet<LinkMenuJqm> DbSetLinkMenuJqm { get; set; }
|
||||
public virtual DbSet<ListValues> DbSetListValue { get; set; }
|
||||
public virtual DbSet<Macchine> DbSetMacchine { get; set; }
|
||||
public virtual DbSet<MacchineModel> DbSetMacchine { get; set; }
|
||||
public virtual DbSet<UpdMan> DbSetUpdMan { get; set; }
|
||||
public virtual DbSet<VocabolarioModel> DbSetVocabolario { get; set; }
|
||||
|
||||
@@ -410,11 +410,11 @@ namespace MP.AppAuth
|
||||
entity.Property(e => e.Ordinal).HasColumnName("ordinal");
|
||||
});
|
||||
|
||||
modelBuilder.Entity<Macchine>(entity =>
|
||||
modelBuilder.Entity<MacchineModel>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.IdxMacchina);
|
||||
|
||||
entity.ToTable("Macchine");
|
||||
//entity.ToTable("Macchine");
|
||||
|
||||
entity.Property(e => e.IdxMacchina).HasMaxLength(50);
|
||||
|
||||
|
||||
@@ -26,6 +26,54 @@ namespace MP.AppAuth.Services
|
||||
|
||||
#endregion Public Fields
|
||||
|
||||
#region Private Fields
|
||||
|
||||
// gestione key Redis
|
||||
private const string redisBaseAddr = "MP:LAND";
|
||||
|
||||
private const string rKeyDirittiUser = $"{redisBaseAddr}:DIR_USER";
|
||||
|
||||
private const string rKeyMacchine = $"{redisBaseAddr}:MACCHINE";
|
||||
|
||||
private const string rKeyPermUser = $"{redisBaseAddr}:PERM_USER";
|
||||
|
||||
private static IConfiguration _configuration;
|
||||
|
||||
private static ILogger<AppAuthService> _logger;
|
||||
|
||||
private static JsonSerializerSettings? JSSettings;
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
private static string Modulo = "";
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache lunga IN SECONDI
|
||||
/// </summary>
|
||||
private int cacheTtlLong = 60 * 5;
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache breve IN SECONDI
|
||||
/// </summary>
|
||||
private int cacheTtlShort = 60 * 1;
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto per connessione a REDIS
|
||||
/// </summary>
|
||||
private IConnectionMultiplexer redisConn;
|
||||
|
||||
//ISubscriber sub = redis.GetSubscriber();
|
||||
/// <summary>
|
||||
/// Oggetto DB redis da impiegare x chiamate R/W
|
||||
/// </summary>
|
||||
private StackExchange.Redis.IDatabase redisDb = null!;
|
||||
|
||||
private Random rnd = new Random();
|
||||
|
||||
private Dictionary<string, string> Vocabolario = new Dictionary<string, string>();
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Public Constructors
|
||||
|
||||
public AppAuthService(IConfiguration configuration, ILogger<AppAuthService> logger, IConnectionMultiplexer redisConnMult)
|
||||
@@ -64,6 +112,36 @@ namespace MP.AppAuth.Services
|
||||
|
||||
#endregion Public Constructors
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private string CodApp { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache lunga (+ perturbazione percentuale +/-10%)
|
||||
/// </summary>
|
||||
private TimeSpan FastCache
|
||||
{
|
||||
get => TimeSpan.FromSeconds(cacheTtlShort * rnd.Next(900, 1100) / 1000);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache lunga (+ perturbazione percentuale +/-10%)
|
||||
/// </summary>
|
||||
private TimeSpan LongCache
|
||||
{
|
||||
get => TimeSpan.FromSeconds(cacheTtlLong * rnd.Next(900, 1100) / 1000);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache lunga (+ perturbazione percentuale +/-10%)
|
||||
/// </summary>
|
||||
private TimeSpan UltraLongCache
|
||||
{
|
||||
get => TimeSpan.FromSeconds(cacheTtlLong * 10 * rnd.Next(900, 1100) / 1000);
|
||||
}
|
||||
|
||||
#endregion Private Properties
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
@@ -114,54 +192,6 @@ namespace MP.AppAuth.Services
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lista AnagEventi
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<AnagraficaIngressi>> AnagIngressi()
|
||||
{
|
||||
List<AnagraficaIngressi> dbResult = new List<AnagraficaIngressi>();
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
dbResult = MpDbController.AnagIngressi();
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Effettuata lettura da DB per AnagIngressi: {ts.TotalMilliseconds} ms");
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lista AnagEventi
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<AnagraficaMicroStati>> AnagMicroStati()
|
||||
{
|
||||
List<AnagraficaMicroStati> dbResult = new List<AnagraficaMicroStati>();
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
dbResult = MpDbController.AnagMicroStati();
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Effettuata lettura da DB per AnagMicroStati: {ts.TotalMilliseconds} ms");
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lista AnagStati
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<AnagraficaStati>> AnagStati()
|
||||
{
|
||||
List<AnagraficaStati> dbResult = new List<AnagraficaStati>();
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
dbResult = MpDbController.AnagStati();
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Effettuata lettura da DB per AnagStati: {ts.TotalMilliseconds} ms");
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lista Gruppi
|
||||
/// </summary>
|
||||
@@ -178,22 +208,6 @@ namespace MP.AppAuth.Services
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco ListValues
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<ListValues>> ListValues()
|
||||
{
|
||||
List<ListValues> dbResult = new List<ListValues>();
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
dbResult = MpDbController.ListValues();
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Effettuata lettura da DB per ListValues: {ts.TotalMilliseconds} ms");
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
public async Task<List<AnagraficaGruppi>> AnagGruppiFilt(string codTipo)
|
||||
{
|
||||
List<AnagraficaGruppi> dbResult = new List<AnagraficaGruppi>();
|
||||
@@ -206,6 +220,22 @@ namespace MP.AppAuth.Services
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lista AnagEventi
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<AnagraficaIngressi>> AnagIngressi()
|
||||
{
|
||||
List<AnagraficaIngressi> dbResult = new List<AnagraficaIngressi>();
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
dbResult = MpDbController.AnagIngressi();
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Effettuata lettura da DB per AnagIngressi: {ts.TotalMilliseconds} ms");
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
public async Task<bool> AnagKeyValAdd(AnagKeyValueModel currRec)
|
||||
{
|
||||
bool answ = false;
|
||||
@@ -254,6 +284,22 @@ namespace MP.AppAuth.Services
|
||||
return await Task.FromResult(answ);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lista AnagEventi
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<AnagraficaMicroStati>> AnagMicroStati()
|
||||
{
|
||||
List<AnagraficaMicroStati> dbResult = new List<AnagraficaMicroStati>();
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
dbResult = MpDbController.AnagMicroStati();
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Effettuata lettura da DB per AnagMicroStati: {ts.TotalMilliseconds} ms");
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
public async Task<List<AnagraficaOperatori>> AnagOperByGroupList(string codGruppo, string searchVal)
|
||||
{
|
||||
List<AnagraficaOperatori> dbResult = new List<AnagraficaOperatori>();
|
||||
@@ -283,6 +329,22 @@ namespace MP.AppAuth.Services
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Lista AnagStati
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<AnagraficaStati>> AnagStati()
|
||||
{
|
||||
List<AnagraficaStati> dbResult = new List<AnagraficaStati>();
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
dbResult = MpDbController.AnagStati();
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Effettuata lettura da DB per AnagStati: {ts.TotalMilliseconds} ms");
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
public async Task<bool> ConfigAdd(ConfigModel currRec)
|
||||
{
|
||||
bool answ = false;
|
||||
@@ -382,6 +444,57 @@ namespace MP.AppAuth.Services
|
||||
CheckVoc();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco ListValues
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<ListValues>> ListValues()
|
||||
{
|
||||
List<ListValues> dbResult = new List<ListValues>();
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
dbResult = MpDbController.ListValues();
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Effettuata lettura da DB per ListValues: {ts.TotalMilliseconds} ms");
|
||||
return await Task.FromResult(dbResult);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco Macchine gestite
|
||||
/// </summary>
|
||||
/// <param name="UserName"></param>
|
||||
/// <returns></returns>
|
||||
public List<MacchineModel> MacchineGetAll()
|
||||
{
|
||||
string source = "DB";
|
||||
List<MacchineModel>? dbResult = new List<MacchineModel>();
|
||||
string currKey = $"{rKeyMacchine}";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
string? rawData = redisDb.StringGet(currKey);
|
||||
if (!string.IsNullOrEmpty(rawData) && rawData.Length > 2)
|
||||
{
|
||||
source = "REDIS";
|
||||
var tempResult = JsonConvert.DeserializeObject<List<MacchineModel>>(rawData);
|
||||
dbResult = tempResult ?? new List<MacchineModel>();
|
||||
}
|
||||
else
|
||||
{
|
||||
// recupero diritti utente
|
||||
dbResult = MpDbController.MacchineGetAll();
|
||||
rawData = JsonConvert.SerializeObject(dbResult, JSSettings);
|
||||
redisDb.StringSet(currKey, rawData, UltraLongCache);
|
||||
}
|
||||
if (dbResult == null)
|
||||
{
|
||||
dbResult = new List<MacchineModel>();
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"MacchineGetAll | {source} | {sw.ElapsedMilliseconds} ms");
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco permessi dato utente
|
||||
/// </summary>
|
||||
@@ -539,84 +652,6 @@ namespace MP.AppAuth.Services
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
// gestione key Redis
|
||||
private const string redisBaseAddr = "MP:LAND";
|
||||
|
||||
private const string rKeyDirittiUser = $"{redisBaseAddr}:DIR_USER";
|
||||
|
||||
private const string rKeyPermUser = $"{redisBaseAddr}:PERM_USER";
|
||||
|
||||
private static IConfiguration _configuration;
|
||||
|
||||
private static ILogger<AppAuthService> _logger;
|
||||
|
||||
private static List<Macchine> ElencoMacchine = new List<Macchine>();
|
||||
|
||||
private static JsonSerializerSettings? JSSettings;
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
private static string Modulo = "";
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache lunga IN SECONDI
|
||||
/// </summary>
|
||||
private int cacheTtlLong = 60 * 5;
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache breve IN SECONDI
|
||||
/// </summary>
|
||||
private int cacheTtlShort = 60 * 1;
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto per connessione a REDIS
|
||||
/// </summary>
|
||||
private IConnectionMultiplexer redisConn;
|
||||
|
||||
//ISubscriber sub = redis.GetSubscriber();
|
||||
/// <summary>
|
||||
/// Oggetto DB redis da impiegare x chiamate R/W
|
||||
/// </summary>
|
||||
private StackExchange.Redis.IDatabase redisDb = null!;
|
||||
|
||||
private Random rnd = new Random();
|
||||
|
||||
private Dictionary<string, string> Vocabolario = new Dictionary<string, string>();
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private string CodApp { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache lunga (+ perturbazione percentuale +/-10%)
|
||||
/// </summary>
|
||||
private TimeSpan FastCache
|
||||
{
|
||||
get => TimeSpan.FromSeconds(cacheTtlShort * rnd.Next(900, 1100) / 1000);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache lunga (+ perturbazione percentuale +/-10%)
|
||||
/// </summary>
|
||||
private TimeSpan LongCache
|
||||
{
|
||||
get => TimeSpan.FromSeconds(cacheTtlLong * rnd.Next(900, 1100) / 1000);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache lunga (+ perturbazione percentuale +/-10%)
|
||||
/// </summary>
|
||||
private TimeSpan UltraLongCache
|
||||
{
|
||||
get => TimeSpan.FromSeconds(cacheTtlLong * 10 * rnd.Next(900, 1100) / 1000);
|
||||
}
|
||||
|
||||
#endregion Private Properties
|
||||
|
||||
#region Private Methods
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -216,9 +216,9 @@ namespace MP.Data.Controllers
|
||||
/// </summary>
|
||||
/// <param name="codGruppo"></param>
|
||||
/// <returns></returns>
|
||||
public List<Macchine> MacchineGetFilt(string codGruppo)
|
||||
public List<MacchineModel> MacchineGetFilt(string codGruppo)
|
||||
{
|
||||
List<Macchine> dbResult = new List<Macchine>();
|
||||
List<MacchineModel> dbResult = new List<MacchineModel>();
|
||||
try
|
||||
{
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using MP.Data.DbModels;
|
||||
using MP.Core.Objects;
|
||||
using MP.Data.DbModels;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using ZXing;
|
||||
using static MP.Core.Objects.Enums;
|
||||
|
||||
namespace MP.Data.Controllers
|
||||
@@ -72,6 +73,76 @@ namespace MP.Data.Controllers
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco Record Macchine
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<MacchineModel> MacchineGetAll()
|
||||
{
|
||||
List<MacchineModel> dbResult = new List<MacchineModel>();
|
||||
using (MoonProContext localDbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = localDbCtx
|
||||
.DbSetMacchine
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupera tutti i record di RemoteRebootLog
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<RemoteRebootLogModel> RemRebootLogGetAll()
|
||||
{
|
||||
List<RemoteRebootLogModel> dbResult = new List<RemoteRebootLogModel>();
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = dbCtx
|
||||
.DbSetRemRebLog
|
||||
.AsNoTracking()
|
||||
.OrderByDescending(x => x.IdxReboot)
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupera ultimo record x ogni IdxMacchina x avere ultimo attivo
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<RemoteRebootLogModel> RemRebootLogGetLast()
|
||||
{
|
||||
List<RemoteRebootLogModel> dbResult = new List<RemoteRebootLogModel>();
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = dbCtx
|
||||
.DbSetRemRebLog
|
||||
.FromSqlRaw("EXEC stp_RRL_getLast")
|
||||
.AsNoTracking()
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupera ultimo record x ogni IdxMacchina x avere ultimo attivo per impianti EXTRA (=no record Macchine)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<RemoteRebootLogModel> RemRebootLogGetLastNoMacc()
|
||||
{
|
||||
List<RemoteRebootLogModel> dbResult = new List<RemoteRebootLogModel>();
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = dbCtx
|
||||
.DbSetRemRebLog
|
||||
.FromSqlRaw("EXEC stp_RRL_GetLastNoMachine")
|
||||
.AsNoTracking()
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Annulla modifiche su una specifica entity (cancel update)
|
||||
/// </summary>
|
||||
|
||||
@@ -71,9 +71,9 @@ namespace MP.Data.Controllers
|
||||
/// Elenco da tabella Macchine
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<DbModels.Macchine> MacchineGetAll()
|
||||
public List<DbModels.MacchineModel> MacchineGetAll()
|
||||
{
|
||||
List<DbModels.Macchine> dbResult = new List<DbModels.Macchine>();
|
||||
List<DbModels.MacchineModel> dbResult = new List<DbModels.MacchineModel>();
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
{
|
||||
dbResult = dbCtx
|
||||
@@ -90,9 +90,9 @@ namespace MP.Data.Controllers
|
||||
/// </summary>
|
||||
/// <param name="codGruppo"></param>
|
||||
/// <returns></returns>
|
||||
public List<Macchine> MacchineGetFilt(string codGruppo)
|
||||
public List<MacchineModel> MacchineGetFilt(string codGruppo)
|
||||
{
|
||||
List<Macchine> dbResult = new List<Macchine>();
|
||||
List<MacchineModel> dbResult = new List<MacchineModel>();
|
||||
try
|
||||
{
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
|
||||
@@ -1425,9 +1425,9 @@ namespace MP.Data.Controllers
|
||||
/// </summary>
|
||||
/// <param name="MatrOpr"></param>
|
||||
/// <returns></returns>
|
||||
public List<Macchine> MacchineByMatrOper(int MatrOpr)
|
||||
public List<MacchineModel> MacchineByMatrOper(int MatrOpr)
|
||||
{
|
||||
List<Macchine> dbResult = new List<Macchine>();
|
||||
List<MacchineModel> dbResult = new List<MacchineModel>();
|
||||
try
|
||||
{
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
@@ -1475,9 +1475,9 @@ namespace MP.Data.Controllers
|
||||
/// </summary>
|
||||
/// <param name="codGruppo"></param>
|
||||
/// <returns></returns>
|
||||
public List<Macchine> MacchineGetFilt(string codGruppo)
|
||||
public List<MacchineModel> MacchineGetFilt(string codGruppo)
|
||||
{
|
||||
List<Macchine> dbResult = new List<Macchine>();
|
||||
List<MacchineModel> dbResult = new List<MacchineModel>();
|
||||
try
|
||||
{
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
@@ -1514,7 +1514,7 @@ namespace MP.Data.Controllers
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco id Macchine che abbiano dati FLuxLog, nel periodo indicato
|
||||
/// Elenco id MacchineModel che abbiano dati FLuxLog, nel periodo indicato
|
||||
/// </summary>
|
||||
/// <param name="dtStart"></param>
|
||||
/// <param name="dtEnd"></param>
|
||||
|
||||
@@ -6,6 +6,7 @@ using MP.Data.DbModels;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Linq;
|
||||
using static MP.Core.Objects.Enums;
|
||||
@@ -122,13 +123,73 @@ namespace MP.Data.Controllers
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce dataset FluxLog filtrato
|
||||
/// </summary>
|
||||
/// <param name="IdxMacchina">Macchina singola, se "" = tutte</param>
|
||||
/// <param name="DtStart">Data inizio selezione odl (inizio/fine)</param>
|
||||
/// <param name="DtEnd">Data fine selezione odl (inizio/fine)</param>
|
||||
/// <param name="fluxType">Tipo Flusso, "" = tutti</param>
|
||||
/// <returns></returns>
|
||||
public List<FLModel> FluxLogRawData(string IdxMacchina, DateTime DtStart, DateTime DtEnd, string fluxType)
|
||||
{
|
||||
List<FLModel> dbResult = new List<FLModel>();
|
||||
using (var dbCtx = new MoonPro_STATSContext(_configuration))
|
||||
{
|
||||
dbResult = dbCtx
|
||||
.DbSetFL
|
||||
.Where(x =>
|
||||
(IdxMacchina == "*" || x.IdxMacchina == IdxMacchina)
|
||||
&& (fluxType == "*" || x.FluxType == fluxType)
|
||||
&& (x.dtEvento >= DtStart && x.dtEvento <= DtEnd))
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco di tipi flusso disponibili
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<string> FluxTypeList()
|
||||
{
|
||||
List<string> dbResult = new List<string>();
|
||||
using (var dbCtx = new MoonPro_STATSContext(_configuration))
|
||||
{
|
||||
dbResult = dbCtx
|
||||
.DbSetFL
|
||||
.Select(x => x.FluxType)
|
||||
.Distinct()
|
||||
.OrderBy(x => x)
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco da tabella Macchine con dati Energy
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<MacchineModel> MacchineEnergy()
|
||||
{
|
||||
List<MacchineModel> dbResult = new List<MacchineModel>();
|
||||
using (var dbCtx = new MoonPro_STATSContext(_configuration))
|
||||
{
|
||||
dbResult = dbCtx
|
||||
.DbSetMacchine
|
||||
.FromSqlRaw("EXEC stp_MaccEnergy")
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco da tabella Macchine
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<Macchine> MacchineGetAll()
|
||||
public List<MacchineModel> MacchineGetAll()
|
||||
{
|
||||
List<Macchine> dbResult = new List<Macchine>();
|
||||
List<MacchineModel> dbResult = new List<MacchineModel>();
|
||||
using (var dbCtx = new MoonPro_STATSContext(_configuration))
|
||||
{
|
||||
dbResult = dbCtx
|
||||
@@ -277,52 +338,6 @@ namespace MP.Data.Controllers
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Restituisce dataset FluxLog filtrato
|
||||
/// </summary>
|
||||
/// <param name="IdxMacchina">Macchina singola, se "" = tutte</param>
|
||||
/// <param name="DtStart">Data inizio selezione odl (inizio/fine)</param>
|
||||
/// <param name="DtEnd">Data fine selezione odl (inizio/fine)</param>
|
||||
/// <param name="fluxType">Tipo Flusso, "" = tutti</param>
|
||||
/// <returns></returns>
|
||||
public List<FLModel> FluxLogRawData(string IdxMacchina, DateTime DtStart, DateTime DtEnd, string fluxType)
|
||||
{
|
||||
List<FLModel> dbResult = new List<FLModel>();
|
||||
using (var dbCtx = new MoonPro_STATSContext(_configuration))
|
||||
{
|
||||
|
||||
dbResult = dbCtx
|
||||
.DbSetFL
|
||||
.Where(x =>
|
||||
(IdxMacchina == "*" || x.IdxMacchina == IdxMacchina)
|
||||
&& (fluxType == "*" || x.FluxType == fluxType)
|
||||
&& (x.dtEvento >= DtStart && x.dtEvento <= DtEnd))
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco di tipi flusso disponibili
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<string> FluxTypeList()
|
||||
{
|
||||
List<string> dbResult = new List<string>();
|
||||
using (var dbCtx = new MoonPro_STATSContext(_configuration))
|
||||
{
|
||||
|
||||
dbResult = dbCtx
|
||||
.DbSetFL
|
||||
.Select(x => x.FluxType)
|
||||
.Distinct()
|
||||
.OrderBy(x => x)
|
||||
.ToList();
|
||||
}
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco tabella ODL da filtro
|
||||
/// </summary>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using Microsoft.Data.SqlClient;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using MP.Data.DbModels;
|
||||
using MP.Core.Objects;
|
||||
using MP.Data.DbModels;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -10,8 +10,6 @@ using System.Data;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using static MP.Core.Objects.Enums;
|
||||
using System.Drawing.Drawing2D;
|
||||
using ZXing;
|
||||
|
||||
namespace MP.Data.Controllers
|
||||
{
|
||||
@@ -936,9 +934,9 @@ namespace MP.Data.Controllers
|
||||
/// </summary>
|
||||
/// <param name="MatrOpr"></param>
|
||||
/// <returns></returns>
|
||||
public List<Macchine> MacchineByMatrOper(int MatrOpr)
|
||||
public List<MacchineModel> MacchineByMatrOper(int MatrOpr)
|
||||
{
|
||||
List<Macchine> dbResult = new List<Macchine>();
|
||||
List<MacchineModel> dbResult = new List<MacchineModel>();
|
||||
try
|
||||
{
|
||||
using (var dbCtx = new MoonProContext(_configuration))
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
using MP.Core.Objects;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MP.Data.DTO
|
||||
{
|
||||
public class IobDTO
|
||||
{
|
||||
#region Public Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Costruttore da dati completi x Macchine
|
||||
/// </summary>
|
||||
/// <param name="recMacc"></param>
|
||||
/// <param name="iobInfo"></param>
|
||||
/// <param name="macInfo"></param>
|
||||
public IobDTO(DbModels.MacchineModel recMacc, IOB_data iobInfo, Dictionary<string, string> macInfo)
|
||||
{
|
||||
this.IdxMacchina = recMacc.IdxMacchina;
|
||||
this.CodMacchina = recMacc.CodMacchina;
|
||||
this.Nome = recMacc.Nome;
|
||||
this.Descrizione = recMacc.Descrizione;
|
||||
this.Note = recMacc.Note ?? "";
|
||||
this.Locazione = recMacc.locazione ?? "";
|
||||
this.OS = $"{iobInfo.iType}";
|
||||
this.IobName = iobInfo.name;
|
||||
this.IobIpv4 = iobInfo.IP;
|
||||
this.IobMac = "";
|
||||
if (macInfo != null && macInfo.Count > 0)
|
||||
{
|
||||
this.AdapName = macInfo.ContainsKey("IobExe") ? macInfo["IobExe"] : "";
|
||||
this.AdapType = macInfo.ContainsKey("IobType") ? macInfo["IobType"] : "";
|
||||
this.AdapVers = macInfo.ContainsKey("IobVersion") ? macInfo["IobVersion"] : "";
|
||||
this.TargetIp = macInfo.ContainsKey("MachIp") ? macInfo["MachIp"] : "";
|
||||
this.TargetPort = macInfo.ContainsKey("MachPort") ? macInfo["MachPort"] : "";
|
||||
}
|
||||
this.IsMachine = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Costruttore empty di default
|
||||
/// </summary>
|
||||
public IobDTO()
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Costruttore da dati RemoteRebootLog e info incomplete
|
||||
/// </summary>
|
||||
/// <param name="recRRL"></param>
|
||||
/// <param name="iobInfo"></param>
|
||||
/// <param name="macInfo"></param>
|
||||
public IobDTO(DbModels.RemoteRebootLogModel recRRL, IOB_data iobInfo, Dictionary<string, string> macInfo)
|
||||
{
|
||||
this.IdxMacchina = recRRL.IdxMacchina;
|
||||
this.Locazione = "NA";
|
||||
this.OS = $"{iobInfo.iType}";
|
||||
this.IobName = iobInfo.name;
|
||||
this.IobIpv4 = iobInfo.IP;
|
||||
this.IobMac = recRRL.MacAddr;
|
||||
if (macInfo != null && macInfo.Count > 0)
|
||||
{
|
||||
this.AdapName = macInfo.ContainsKey("IobExe") ? macInfo["IobExe"] : "";
|
||||
this.AdapType = macInfo.ContainsKey("IobType") ? macInfo["IobType"] : "";
|
||||
this.AdapVers = macInfo.ContainsKey("IobVersion") ? macInfo["IobVersion"] : "";
|
||||
this.TargetIp = macInfo.ContainsKey("MachIp") ? macInfo["MachIp"] : "";
|
||||
this.TargetPort = macInfo.ContainsKey("MachPort") ? macInfo["MachPort"] : "";
|
||||
}
|
||||
this.IsMachine = false;
|
||||
}
|
||||
|
||||
#endregion Public Constructors
|
||||
|
||||
#region Public Properties
|
||||
|
||||
/// <summary>
|
||||
/// Nome Adapter
|
||||
/// </summary>
|
||||
public string AdapName { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Sottotipo Adapter
|
||||
/// </summary>
|
||||
public string AdapType { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Versione Adapter
|
||||
/// </summary>
|
||||
public string AdapVers { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Cod macchina
|
||||
/// </summary>
|
||||
public string CodMacchina { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Descrizione macchina
|
||||
/// </summary>
|
||||
public string Descrizione { get; set; } = "";
|
||||
|
||||
[Key]
|
||||
public string IdxMacchina { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// IP v4 PC Iob
|
||||
/// </summary>
|
||||
public string IobIpv4 { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Mac address IOB
|
||||
/// </summary>
|
||||
public string IobMac { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Nome PC Iob
|
||||
/// </summary>
|
||||
public string IobName { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Indica se sia una macchina effettiva vs Extra da RemoteRebootLog (es PING, ENR, ...)
|
||||
/// </summary>
|
||||
public bool IsMachine { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// Locazione (usata per nascondere in SITE/Tab)
|
||||
/// </summary>
|
||||
public string Locazione { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Nome macchina
|
||||
/// </summary>
|
||||
public string Nome { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Descrizione macchina
|
||||
/// </summary>
|
||||
public string Note { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Tipo di IOB (Win / rPi / Python)
|
||||
/// </summary>
|
||||
public string OS { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// IP del target CNC/PLC
|
||||
/// </summary>
|
||||
public string TargetIp { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Porta del target CNC/PLC
|
||||
/// </summary>
|
||||
public string TargetPort { get; set; } = "";
|
||||
|
||||
#endregion Public Properties
|
||||
}
|
||||
}
|
||||
@@ -35,7 +35,7 @@ namespace MP.Data.DbModels
|
||||
/// Navigazione oggetto Machine
|
||||
/// </summary>
|
||||
[ForeignKey("IdxMacchina")]
|
||||
public virtual Macchine MachineNav { get; set; } = null!;
|
||||
public virtual MacchineModel MachineNav { get; set; } = null!;
|
||||
/// <summary>
|
||||
/// Navigazione oggetto Articolo
|
||||
/// </summary>
|
||||
|
||||
@@ -38,7 +38,7 @@ namespace MP.Data.DbModels
|
||||
/// Navigazione oggetto Machine
|
||||
/// </summary>
|
||||
[ForeignKey("IdxMacchina")]
|
||||
public virtual Macchine MachineNav { get; set; } = null!;
|
||||
public virtual MacchineModel MachineNav { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Navigazione oggetto ODL
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace MP.Data.DbModels
|
||||
/// Navigazione oggetto Machine
|
||||
/// </summary>
|
||||
[ForeignKey("IdxMacchina")]
|
||||
public virtual Macchine MachineNav { get; set; } = null!;
|
||||
public virtual MacchineModel MachineNav { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Navigazione oggetto Articolo
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace MP.Data.DbModels
|
||||
/// Navigazione oggetto Machine
|
||||
/// </summary>
|
||||
[ForeignKey("IdxMacchina")]
|
||||
public virtual Macchine MachineNav { get; set; } = null!;
|
||||
public virtual MacchineModel MachineNav { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Navigazione oggetto Machine
|
||||
|
||||
@@ -58,7 +58,7 @@ namespace MP.Data.DbModels
|
||||
/// Navigazione oggetto Machine
|
||||
/// </summary>
|
||||
[ForeignKey("IdxMacchina")]
|
||||
public virtual Macchine MachineNav { get; set; } = null!;
|
||||
public virtual MacchineModel MachineNav { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Navigazione oggetto Articolo
|
||||
|
||||
@@ -11,7 +11,7 @@ using System.ComponentModel.DataAnnotations.Schema;
|
||||
namespace MP.Data.DbModels
|
||||
{
|
||||
[Table("Macchine")]
|
||||
public partial class Macchine
|
||||
public partial class MacchineModel
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
@@ -29,6 +29,12 @@ namespace MP.Data.DbModels
|
||||
/// Descrizione macchina
|
||||
/// </summary>
|
||||
public string Descrizione { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Note macchina
|
||||
/// </summary>
|
||||
public string Note { get; set; } = "";
|
||||
|
||||
/// <summary>
|
||||
/// Patch del file json di configurazione di una ricetta
|
||||
/// </summary>
|
||||
@@ -51,6 +57,7 @@ namespace MP.Data.DbModels
|
||||
{
|
||||
get => !string.IsNullOrEmpty(RecipePath);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Indica se abbia ricetta calcolata
|
||||
/// </summary>
|
||||
@@ -60,7 +67,6 @@ namespace MP.Data.DbModels
|
||||
get => !string.IsNullOrEmpty(RecipeArchivePath);
|
||||
}
|
||||
|
||||
//public string Note { get; set; } = "";
|
||||
//public string url { get; set; } = "";
|
||||
//public string css { get; set; } = "";
|
||||
//public int RowNum { get; set; } = 0;
|
||||
|
||||
@@ -54,7 +54,7 @@ namespace MP.Data.DbModels
|
||||
/// Navigazione oggetto Machine
|
||||
/// </summary>
|
||||
[ForeignKey("IdxMacchina")]
|
||||
public virtual Macchine MachineNav { get; set; } = null!;
|
||||
public virtual MacchineModel MachineNav { get; set; } = null!;
|
||||
/// <summary>
|
||||
/// Navigazione oggetto Articolo
|
||||
/// </summary>
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace MP.Data.DbModels
|
||||
/// Navigazione oggetto Machine
|
||||
/// </summary>
|
||||
[ForeignKey("IdxMacchina")]
|
||||
public virtual Macchine MachineNav { get; set; } = null!;
|
||||
public virtual MacchineModel MachineNav { get; set; } = null!;
|
||||
/// <summary>
|
||||
/// Navigazione oggetto Articolo
|
||||
/// </summary>
|
||||
|
||||
@@ -74,7 +74,7 @@ namespace MP.Data.DbModels
|
||||
/// Navigazione oggetto Machine
|
||||
/// </summary>
|
||||
[ForeignKey("IdxMacchina")]
|
||||
public virtual Macchine MachineNav { get; set; } = null!;
|
||||
public virtual MacchineModel MachineNav { get; set; } = null!;
|
||||
/// <summary>
|
||||
/// Navigazione oggetto Articolo
|
||||
/// </summary>
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace MP.Data.DbModels
|
||||
/// Navigazione oggetto Machine
|
||||
/// </summary>
|
||||
[ForeignKey("IdxMacchina")]
|
||||
public virtual Macchine MachineNav { get; set; } = null!;
|
||||
public virtual MacchineModel MachineNav { get; set; } = null!;
|
||||
/// <summary>
|
||||
/// Navigazione oggetto Articolo
|
||||
/// </summary>
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.ComponentModel.DataAnnotations.Schema;
|
||||
|
||||
|
||||
#nullable disable
|
||||
// <Auto-Generated>
|
||||
// This is here so CodeMaid doesn't reorganize this document
|
||||
// </Auto-Generated>
|
||||
namespace MP.Data.DbModels
|
||||
{
|
||||
[Table("RemoteRebootLog")]
|
||||
public partial class RemoteRebootLogModel
|
||||
{
|
||||
#region Public Properties
|
||||
|
||||
[Key, Column("idxReboot")]
|
||||
public int IdxReboot { get; set; }
|
||||
public string IdxMacchina { get; set; }
|
||||
public string IPv4 { get; set; } = "";
|
||||
public string Agent { get; set; } = "";
|
||||
public DateTime DataOraBoot { get; set; } = DateTime.Today.AddYears(-10);
|
||||
[Column("macAddr")]
|
||||
public string MacAddr { get; set; } = "";
|
||||
|
||||
#endregion Public Properties
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@ namespace MP.Data.DbModels
|
||||
/// Navigazione oggetto Machine
|
||||
/// </summary>
|
||||
[ForeignKey("IdxMacchina")]
|
||||
public virtual Macchine MachineNav { get; set; } = null!;
|
||||
public virtual MacchineModel MachineNav { get; set; } = null!;
|
||||
|
||||
#endregion Public Properties
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace MP.Data
|
||||
public virtual DbSet<ConfigModel> DbSetConfig { get; set; }
|
||||
public virtual DbSet<LinkMenuModel> DbSetLinkMenu { get; set; }
|
||||
public virtual DbSet<ListValuesModel> DbSetListValues { get; set; }
|
||||
public virtual DbSet<Macchine> DbSetMacchine { get; set; }
|
||||
public virtual DbSet<MacchineModel> DbSetMacchine { get; set; }
|
||||
public virtual DbSet<MappaStatoExplModel> DbSetMSE { get; set; }
|
||||
public virtual DbSet<ODLModel> DbSetODL { get; set; }
|
||||
public virtual DbSet<ODLExpModel> DbSetODLExp { get; set; }
|
||||
@@ -103,6 +103,8 @@ namespace MP.Data
|
||||
public virtual DbSet<TemplateKitModel> DbSetTempKit { get; set; }
|
||||
public virtual DbSet<WipSetupKitModel> DbSetWipKit { get; set; }
|
||||
public virtual DbSet<TksScoreModel> DbSetTksScore { get; set; }
|
||||
public virtual DbSet<RemoteRebootLogModel> DbSetRemRebLog { get; set; }
|
||||
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
@@ -190,7 +192,7 @@ namespace MP.Data
|
||||
.HasMaxLength(50);
|
||||
});
|
||||
|
||||
modelBuilder.Entity<Macchine>(entity =>
|
||||
modelBuilder.Entity<MacchineModel>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.IdxMacchina);
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace MP.Data
|
||||
|
||||
|
||||
public virtual DbSet<AnagArticoliModel> DbSetArticoli { get; set; }
|
||||
public virtual DbSet<Macchine> DbSetMacchine { get; set; }
|
||||
public virtual DbSet<MacchineModel> DbSetMacchine { get; set; }
|
||||
public virtual DbSet<FluxLogModel> DbSetFluxLog { get; set; }
|
||||
public virtual DbSet<DossierModel> DbSetDossiers { get; set; }
|
||||
public virtual DbSet<ParetoFluxLogDTO> DbSetParetoFluxLog { get; set; }
|
||||
@@ -111,7 +111,7 @@ namespace MP.Data
|
||||
.HasMaxLength(50);
|
||||
});
|
||||
|
||||
modelBuilder.Entity<Macchine>(entity =>
|
||||
modelBuilder.Entity<MacchineModel>(entity =>
|
||||
{
|
||||
entity.HasKey(e => e.IdxMacchina);
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace MP.Data
|
||||
public virtual DbSet<ResControlli> DbSetControlli { get; set; }
|
||||
public virtual DbSet<DdbTurni> DbSetDdbTurni { get; set; }
|
||||
public virtual DbSet<FLModel> DbSetFL { get; set; }
|
||||
public virtual DbSet<Macchine> DbSetMacchine { get; set; }
|
||||
public virtual DbSet<MacchineModel> DbSetMacchine { get; set; }
|
||||
public virtual DbSet<StatsODL> DbSetODL { get; set; }
|
||||
public virtual DbSet<OdlEnergyModel> DbSetOdlEnergy { get; set; }
|
||||
public virtual DbSet<ResScarti> DbSetScarti { get; set; }
|
||||
@@ -159,7 +159,7 @@ namespace MP.Data
|
||||
.HasMaxLength(50);
|
||||
});
|
||||
|
||||
modelBuilder.Entity<Macchine>(entity =>
|
||||
modelBuilder.Entity<MacchineModel>(entity =>
|
||||
{
|
||||
entity.HasNoKey();
|
||||
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Options;
|
||||
using MP.Core.Objects;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
using StackExchange.Redis;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
@@ -12,6 +18,153 @@ namespace MP.Data.Services
|
||||
/// </summary>
|
||||
public class BaseServ
|
||||
{
|
||||
#region Public Constructors
|
||||
|
||||
public BaseServ(IConfiguration configuration)
|
||||
{
|
||||
_configuration = configuration;
|
||||
|
||||
// setup compoenti REDIS
|
||||
redisConn = ConnectionMultiplexer.Connect(_configuration.GetConnectionString("Redis"));
|
||||
redisDb = redisConn.GetDatabase();
|
||||
|
||||
// json serializer... FIX errore loop circolare https://www.ryadel.com/en/jsonserializationexception-self-referencing-loop-detected-error-fix-entity-framework-asp-net-core/
|
||||
JSSettings = new JsonSerializerSettings()
|
||||
{
|
||||
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
|
||||
};
|
||||
|
||||
// recupero conf speciali
|
||||
MpIoNS = _configuration.GetValue<string>("ServerConf:MpIoNS");
|
||||
}
|
||||
|
||||
#endregion Public Constructors
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
/// Recupero info IOB x TAB (da info registrate IOB-WIN--> MP-IO)
|
||||
/// </summary>
|
||||
/// <param name="IdxMacchina"></param>
|
||||
/// <returns></returns>
|
||||
public IOB_data IobInfo(string IdxMacchina)
|
||||
{
|
||||
string source = "DB";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
IOB_data? result = new IOB_data();
|
||||
// cerco in redis...
|
||||
string currKey = RedHashMpIO($"hM2IOB:{IdxMacchina}");
|
||||
RedisValue rawData = redisDb.StringGet(currKey);
|
||||
//if (!string.IsNullOrEmpty($"{rawData}"))
|
||||
if (rawData.HasValue)
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<IOB_data>($"{rawData}");
|
||||
source = "REDIS";
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Error($"Errore: non trovato valore <IOB_data> valido in REDIS | key: {currKey}");
|
||||
Log.Info($"REDIS | conf: {redisConn.Configuration}");
|
||||
Log.Info($" --> Valore trovato:{Environment.NewLine}{rawData}");
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new IOB_data();
|
||||
Log.Debug($"Init valore default <IOB_data> | IdxMacchina: {IdxMacchina}");
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"IobInfo per {IdxMacchina} | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupero info Machine-IOB x TAB (da info registrate IOB-WIN --> MP-IO)
|
||||
/// </summary>
|
||||
/// <param name="IdxMacchina"></param>
|
||||
/// <returns></returns>
|
||||
public Dictionary<string, string> MachIobConf(string IdxMacchina)
|
||||
{
|
||||
string source = "NA";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
Dictionary<string, string> result = new Dictionary<string, string>();
|
||||
// cerco in redis...
|
||||
string currKey = RedHashMpIO($"IOB:{IdxMacchina}:MachIobConf");
|
||||
try
|
||||
{
|
||||
result = redisDb
|
||||
.HashGetAll(currKey)
|
||||
.ToDictionary(x => $"{x.Name}", x => $"{x.Value}");
|
||||
source = "REDIS";
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Log.Error($"Errore in MachIobConf{Environment.NewLine}{exc}");
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new Dictionary<string, string>();
|
||||
Log.Debug($"Init valore default MachIobConf | IdxMacchina: {IdxMacchina}");
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"MachIobConf per {IdxMacchina} | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupero Conf Yaml Machine-IOB
|
||||
/// </summary>
|
||||
/// <param name="IdxMacchina"></param>
|
||||
/// <returns></returns>
|
||||
public string MachIobYamlConf(string IdxMacchina)
|
||||
{
|
||||
string source = "NA";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
string result = "";
|
||||
// cerco in redis...
|
||||
string currKey = RedHashMpIO($"IOB:{IdxMacchina}:ConfYaml");
|
||||
try
|
||||
{
|
||||
result = redisDb.StringGet(currKey);
|
||||
source = "REDIS";
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Log.Error($"Errore in MachIobYamlConf{Environment.NewLine}{exc}");
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = "";
|
||||
Log.Debug($"Init valore default MachIobYamlConf | IdxMacchina: {IdxMacchina}");
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"MachIobYamlConf per {IdxMacchina} | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Protected Fields
|
||||
|
||||
protected static IConfiguration _configuration = null!;
|
||||
protected JsonSerializerSettings? JSSettings;
|
||||
protected string MpIoNS = "";
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto per connessione a REDIS
|
||||
/// </summary>
|
||||
protected ConnectionMultiplexer redisConn = null!;
|
||||
|
||||
//ISubscriber sub = redis.GetSubscriber();
|
||||
/// <summary>
|
||||
/// Oggetto DB redis da impiegare x chiamate R/W
|
||||
/// </summary>
|
||||
protected IDatabase redisDb = null!;
|
||||
|
||||
#endregion Protected Fields
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
/// <summary>
|
||||
@@ -48,11 +201,29 @@ namespace MP.Data.Services
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected static IConfiguration _configuration = null!;
|
||||
protected string RedHashMpIO(string keyName)
|
||||
{
|
||||
string result = keyName;
|
||||
try
|
||||
{
|
||||
result = $"{MpIoNS}:{keyName}".Replace("\\", "_");
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Log.Error($"Errore in RedHashMpIO{Environment.NewLine}{exc}");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
/// <summary>
|
||||
/// Durata cache lunga IN SECONDI
|
||||
/// </summary>
|
||||
|
||||
@@ -0,0 +1,184 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using MP.AppAuth.Controllers;
|
||||
using MP.Core.DTO;
|
||||
using MP.Data.Controllers;
|
||||
using MP.Data.DbModels;
|
||||
using MP.Data.DTO;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
using StackExchange.Redis;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MP.Data.Services
|
||||
{
|
||||
public class LandDataService : BaseServ
|
||||
{
|
||||
#region Public Constructors
|
||||
|
||||
public LandDataService(IConfiguration configuration) : base(configuration)
|
||||
{
|
||||
// conf DB
|
||||
string connStr = _configuration.GetConnectionString("MP.Land");
|
||||
if (string.IsNullOrEmpty(connStr))
|
||||
{
|
||||
Log.Error("ConnString empty!");
|
||||
}
|
||||
else
|
||||
{
|
||||
dbController = new Controllers.MpLandController(configuration);
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendLine($"LandService | MpLandController OK");
|
||||
Log.Info(sb.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Public Constructors
|
||||
|
||||
#region Public Properties
|
||||
|
||||
public static Controllers.MpLandController dbController { get; set; } = null!;
|
||||
|
||||
#endregion Public Properties
|
||||
|
||||
#region Public Methods
|
||||
|
||||
/// <summary>
|
||||
/// Elenco INFO IOB da tab Macchine gestite + RemoteRebootLog
|
||||
/// </summary>
|
||||
/// <param name="UserName"></param>
|
||||
/// <returns></returns>
|
||||
public List<IobDTO> IobListAll()
|
||||
{
|
||||
string source = "DB";
|
||||
List<IobDTO>? dbResult = new List<IobDTO>();
|
||||
string currKey = $"{redisBaseKey}:IobList";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
string? rawData = redisDb.StringGet(currKey);
|
||||
if (!string.IsNullOrEmpty(rawData) && rawData.Length > 2)
|
||||
{
|
||||
source = "REDIS";
|
||||
var tempResult = JsonConvert.DeserializeObject<List<IobDTO>>(rawData);
|
||||
dbResult = tempResult ?? new List<IobDTO>();
|
||||
}
|
||||
else
|
||||
{
|
||||
// recupero RRL missing
|
||||
var listRRl = dbController.RemRebootLogGetLast();
|
||||
var listRRlAdd = dbController.RemRebootLogGetLastNoMacc();
|
||||
// recupero lista macchine
|
||||
var ListMacch = dbController.MacchineGetAll();
|
||||
// ...converto in DTO
|
||||
dbResult = ListMacch
|
||||
.Select(x => new IobDTO(x, IobInfo(x.IdxMacchina), MachIobConf(x.IdxMacchina)))
|
||||
.ToList();
|
||||
// completo con RRL i mac address...
|
||||
|
||||
// recupero record RemoteRebootLog mancanti e accodo
|
||||
var listExtra = listRRlAdd.Select(x => new IobDTO(x, IobInfo(x.IdxMacchina), MachIobConf(x.IdxMacchina)))
|
||||
.ToList();
|
||||
dbResult.AddRange(listExtra);
|
||||
|
||||
//ordino x idxmacchina...
|
||||
dbResult = dbResult.OrderBy(x => x.IdxMacchina).ToList();
|
||||
|
||||
// serializzo in cache redis
|
||||
rawData = JsonConvert.SerializeObject(dbResult, JSSettings);
|
||||
redisDb.StringSet(currKey, rawData, UltraLongCache);
|
||||
}
|
||||
if (dbResult == null)
|
||||
{
|
||||
dbResult = new List<IobDTO>();
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"IobListAll | {source} | {sw.ElapsedMilliseconds} ms");
|
||||
return dbResult;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupera tutti i record di RemoteRebootLog
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<RemoteRebootLogModel> RemRebootLogGetAll()
|
||||
{
|
||||
// setup parametri costanti
|
||||
string source = "DB";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
List<RemoteRebootLogModel> result = new List<RemoteRebootLogModel>();
|
||||
// cerco in redis...
|
||||
string currKey = $"{redisBaseKey}:RemRebLog:ALL";
|
||||
RedisValue rawData = redisDb.StringGet(currKey);
|
||||
//if (!string.IsNullOrEmpty($"{rawData}"))
|
||||
if (rawData.HasValue)
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<List<RemoteRebootLogModel>>($"{rawData}");
|
||||
source = "REDIS";
|
||||
}
|
||||
else
|
||||
{
|
||||
result = dbController.RemRebootLogGetAll();
|
||||
// serializzo e salvo...
|
||||
rawData = JsonConvert.SerializeObject(result);
|
||||
redisDb.StringSet(currKey, rawData, UltraFastCache);
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new List<RemoteRebootLogModel>();
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"RemRebootLogGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupera ultimo record x ogni IdxMacchina x avere ultimo attivo
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public List<RemoteRebootLogModel> RemRebootLogGetLast()
|
||||
{
|
||||
// setup parametri costanti
|
||||
string source = "DB";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
List<RemoteRebootLogModel> result = new List<RemoteRebootLogModel>();
|
||||
// cerco in redis...
|
||||
string currKey = $"{redisBaseKey}:RemRebLog:LAST";
|
||||
RedisValue rawData = redisDb.StringGet(currKey);
|
||||
//if (!string.IsNullOrEmpty($"{rawData}"))
|
||||
if (rawData.HasValue)
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<List<RemoteRebootLogModel>>($"{rawData}");
|
||||
source = "REDIS";
|
||||
}
|
||||
else
|
||||
{
|
||||
result = dbController.RemRebootLogGetLast();
|
||||
// serializzo e salvo...
|
||||
rawData = JsonConvert.SerializeObject(result);
|
||||
redisDb.StringSet(currKey, rawData, UltraFastCache);
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new List<RemoteRebootLogModel>();
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"RemRebootLogGetLast | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
private string redisBaseKey = "MP:LAND:Cache";
|
||||
|
||||
#endregion Private Fields
|
||||
}
|
||||
}
|
||||
@@ -22,12 +22,14 @@ namespace MP.Data.Services
|
||||
{
|
||||
#region Public Constructors
|
||||
|
||||
public ListSelectDataSrv(IConfiguration configuration)
|
||||
public ListSelectDataSrv(IConfiguration configuration) : base(configuration)
|
||||
{
|
||||
#if false
|
||||
_configuration = configuration;
|
||||
// setup compoenti REDIS
|
||||
redisConn = ConnectionMultiplexer.Connect(_configuration.GetConnectionString("Redis"));
|
||||
redisDb = redisConn.GetDatabase();
|
||||
redisDb = redisConn.GetDatabase();
|
||||
#endif
|
||||
|
||||
// conf DB
|
||||
string connStr = _configuration.GetConnectionString("MP.All");
|
||||
@@ -234,19 +236,19 @@ namespace MP.Data.Services
|
||||
/// </summary>
|
||||
/// <param name="MatrOpr"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<Macchine>> MacchineByMatrOper(int MatrOpr)
|
||||
public async Task<List<MacchineModel>> MacchineByMatrOper(int MatrOpr)
|
||||
{
|
||||
string source = "DB";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
List<Macchine>? result = new List<Macchine>();
|
||||
List<MacchineModel>? result = new List<MacchineModel>();
|
||||
// cerco in redis...
|
||||
string currKey = $"{redisBaseKey}:Macc:{MatrOpr}";
|
||||
RedisValue rawData = await redisDb.StringGetAsync(currKey);
|
||||
//if (!string.IsNullOrEmpty($"{rawData}"))
|
||||
if (rawData.HasValue)
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<List<Macchine>>($"{rawData}");
|
||||
result = JsonConvert.DeserializeObject<List<MacchineModel>>($"{rawData}");
|
||||
source = "REDIS";
|
||||
}
|
||||
else
|
||||
@@ -258,7 +260,7 @@ namespace MP.Data.Services
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new List<Macchine>();
|
||||
result = new List<MacchineModel>();
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"MacchineGetFilt | MatrOpr: {MatrOpr} | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
@@ -269,6 +271,7 @@ namespace MP.Data.Services
|
||||
|
||||
#region Protected Fields
|
||||
|
||||
#if false
|
||||
/// <summary>
|
||||
/// Oggetto per connessione a REDIS
|
||||
/// </summary>
|
||||
@@ -277,7 +280,8 @@ namespace MP.Data.Services
|
||||
/// <summary>
|
||||
/// Oggetto DB redis da impiegare x chiamate R/W
|
||||
/// </summary>
|
||||
protected IDatabase redisDb = null!;
|
||||
protected IDatabase redisDb = null!;
|
||||
#endif
|
||||
|
||||
#endregion Protected Fields
|
||||
|
||||
|
||||
@@ -125,14 +125,14 @@ namespace MP.Data.Services
|
||||
/// <summary>
|
||||
/// Cache elenco macchine abilitate all'utente, vuoto se scaduto reload
|
||||
/// </summary>
|
||||
public List<Macchine>? ListMachineEnabled
|
||||
public List<MacchineModel>? ListMachineEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
List<Macchine>? answ = userListMachine;
|
||||
List<MacchineModel>? answ = userListMachine;
|
||||
if (DateTime.Now.Subtract(lastUserUpd).TotalSeconds > 30)
|
||||
{
|
||||
answ = new List<Macchine>();
|
||||
answ = new List<MacchineModel>();
|
||||
Log.Debug("ListMachineEnabled unvalidated");
|
||||
}
|
||||
return answ;
|
||||
@@ -710,7 +710,7 @@ namespace MP.Data.Services
|
||||
|
||||
#region Private Properties
|
||||
|
||||
private List<Macchine>? userListMachine { get; set; } = null;
|
||||
private List<MacchineModel>? userListMachine { get; set; } = null;
|
||||
private Dictionary<string, string> UserPrefs { get; set; } = new Dictionary<string, string>();
|
||||
|
||||
#endregion Private Properties
|
||||
|
||||
@@ -22,13 +22,15 @@ namespace MP.Data.Services
|
||||
{
|
||||
#region Public Constructors
|
||||
|
||||
public OrderDataSrv(IConfiguration configuration)
|
||||
public OrderDataSrv(IConfiguration configuration): base(configuration)
|
||||
{
|
||||
#if false
|
||||
_configuration = configuration;
|
||||
|
||||
// setup compoenti REDIS
|
||||
redisConn = ConnectionMultiplexer.Connect(_configuration.GetConnectionString("Redis"));
|
||||
redisDb = redisConn.GetDatabase();
|
||||
redisDb = redisConn.GetDatabase();
|
||||
#endif
|
||||
|
||||
// conf DB
|
||||
string connStr = _configuration.GetConnectionString("MP.All");
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using MP.Data.DbModels;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using MP.Data.DbModels;
|
||||
using NLog;
|
||||
using StackExchange.Redis;
|
||||
using System.Collections.Generic;
|
||||
@@ -8,6 +9,14 @@ namespace MP.Data.Services
|
||||
{
|
||||
public class SharedMemService : BaseServ
|
||||
{
|
||||
/// <summary>
|
||||
/// Init servizio TAB
|
||||
/// </summary>
|
||||
/// <param name="configuration"></param>
|
||||
public SharedMemService(IConfiguration configuration) : base(configuration)
|
||||
{
|
||||
}
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
@@ -167,18 +167,18 @@ namespace MP.Data.Services
|
||||
return outVal;
|
||||
}
|
||||
|
||||
public async Task<List<Macchine>> MacchineGetAll()
|
||||
public async Task<List<MacchineModel>> MacchineGetAll()
|
||||
{
|
||||
Stopwatch sw = new Stopwatch();
|
||||
string source = "DB";
|
||||
sw.Start();
|
||||
List<Macchine>? result = new List<Macchine>();
|
||||
List<MacchineModel>? result = new List<MacchineModel>();
|
||||
// cerco in redis...
|
||||
string currKey = $"{Constants.redisMacchine}:ALL";
|
||||
RedisValue rawData = redisDb.StringGet(currKey);
|
||||
if (rawData.HasValue)
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<List<Macchine>>($"{rawData}");
|
||||
result = JsonConvert.DeserializeObject<List<MacchineModel>>($"{rawData}");
|
||||
source = "REDIS";
|
||||
}
|
||||
else
|
||||
@@ -190,7 +190,7 @@ namespace MP.Data.Services
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new List<Macchine>();
|
||||
result = new List<MacchineModel>();
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"MacchineGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
@@ -198,18 +198,18 @@ namespace MP.Data.Services
|
||||
//return Task.FromResult(dbController.MacchineGetAll());
|
||||
}
|
||||
|
||||
public async Task<List<Macchine>> MacchineGetByGruppo(string CodGruppo)
|
||||
public async Task<List<MacchineModel>> MacchineGetByGruppo(string CodGruppo)
|
||||
{
|
||||
Stopwatch sw = new Stopwatch();
|
||||
string source = "DB";
|
||||
sw.Start();
|
||||
List<Macchine>? result = new List<Macchine>();
|
||||
List<MacchineModel>? result = new List<MacchineModel>();
|
||||
// cerco in redis...
|
||||
string currKey = $"{Constants.redisMacchine}:{CodGruppo}";
|
||||
RedisValue rawData = redisDb.StringGet(currKey);
|
||||
if (rawData.HasValue)
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<List<Macchine>>($"{rawData}");
|
||||
result = JsonConvert.DeserializeObject<List<MacchineModel>>($"{rawData}");
|
||||
source = "REDIS";
|
||||
}
|
||||
else
|
||||
@@ -222,7 +222,7 @@ namespace MP.Data.Services
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new List<Macchine>();
|
||||
result = new List<MacchineModel>();
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"MacchineGetByGruppo | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
|
||||
@@ -1,14 +1,11 @@
|
||||
using EgwCoreLib.Utils;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Options;
|
||||
using MP.Data.DbModels;
|
||||
using MP.Core.DTO;
|
||||
using MP.Data.DTO;
|
||||
using MP.Core.Objects;
|
||||
using MP.Data.DbModels;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
using Org.BouncyCastle.Asn1.IsisMtt.Ocsp;
|
||||
using StackExchange.Redis;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -18,10 +15,6 @@ using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using MongoDB.Driver.Core.Operations;
|
||||
using MP.Data.Controllers;
|
||||
using DnsClient.Protocol;
|
||||
using MP.AppAuth.Controllers;
|
||||
|
||||
namespace MP.Data.Services
|
||||
{
|
||||
@@ -33,7 +26,7 @@ namespace MP.Data.Services
|
||||
/// Init servizio TAB
|
||||
/// </summary>
|
||||
/// <param name="configuration"></param>
|
||||
public TabDataService(IConfiguration configuration)
|
||||
public TabDataService(IConfiguration configuration) : base(configuration)
|
||||
{
|
||||
_configuration = configuration;
|
||||
|
||||
@@ -60,7 +53,9 @@ namespace MP.Data.Services
|
||||
// sistemo i parametri x redHas...
|
||||
CodModulo = _configuration.GetValue<string>("SpecialConf:CodModulo");
|
||||
CodModuloParam = _configuration.GetValue<string>("SpecialConf:CodModuloParam");
|
||||
#if false
|
||||
MpIoNS = _configuration.GetValue<string>("ServerConf:MpIoNS");
|
||||
#endif
|
||||
var cstringArray = ConnStr.Split(";");
|
||||
foreach (var item in cstringArray)
|
||||
{
|
||||
@@ -1241,20 +1236,21 @@ namespace MP.Data.Services
|
||||
return fatto;
|
||||
}
|
||||
|
||||
#if false
|
||||
/// <summary>
|
||||
/// Recupero info IOB x TAB (da info registrate IOB-WIN--> MP-IO)
|
||||
/// </summary>
|
||||
/// <param name="IdxMacchina"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IOB_data> IobInfo(string IdxMacchina)
|
||||
public IOB_data IobInfo(string IdxMacchina)
|
||||
{
|
||||
string source = "DB";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
IOB_data? result = new IOB_data();
|
||||
// cerco in redis...
|
||||
string currKey = redHashMpIO($"hM2IOB:{IdxMacchina}");
|
||||
RedisValue rawData = await redisDb.StringGetAsync(currKey);
|
||||
string currKey = RedHashMpIO($"hM2IOB:{IdxMacchina}");
|
||||
RedisValue rawData = redisDb.StringGet(currKey);
|
||||
//if (!string.IsNullOrEmpty($"{rawData}"))
|
||||
if (rawData.HasValue)
|
||||
{
|
||||
@@ -1276,6 +1272,43 @@ namespace MP.Data.Services
|
||||
Log.Debug($"IobInfo per {IdxMacchina} | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Recupero info IOB x TAB (da info registrate IOB-WIN--> MP-IO)
|
||||
/// </summary>
|
||||
/// <param name="IdxMacchina"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<IOB_data> IobInfoAsync(string IdxMacchina)
|
||||
{
|
||||
string source = "DB";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
IOB_data? result = new IOB_data();
|
||||
// cerco in redis...
|
||||
string currKey = RedHashMpIO($"hM2IOB:{IdxMacchina}");
|
||||
RedisValue rawData = await redisDb.StringGetAsync(currKey);
|
||||
//if (!string.IsNullOrEmpty($"{rawData}"))
|
||||
if (rawData.HasValue)
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<IOB_data>($"{rawData}");
|
||||
source = "REDIS";
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Error($"Errore: non trovato valore <IOB_data> valido in REDIS | key: {currKey}");
|
||||
Log.Info($"REDIS | conf: {redisConn.Configuration}");
|
||||
Log.Info($" --> Valore trovato:{Environment.NewLine}{rawData}");
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new IOB_data();
|
||||
Log.Debug($"Init valore default <IOB_data> | IdxMacchina: {IdxMacchina}");
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"IobInfoAsync per {IdxMacchina} | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
return result;
|
||||
}
|
||||
|
||||
/// Elenco PODL macchina </summary> <param name="idxMacchina">Macchina</param> <param
|
||||
/// name="onlyFree">Solo disponibili (1) o tutte (0)</param> <param
|
||||
@@ -1431,11 +1464,11 @@ namespace MP.Data.Services
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco Macchine dato operatore secondo gruppi (macchine/operatore)
|
||||
/// Elenco MacchineModel dato operatore secondo gruppi (macchine/operatore)
|
||||
/// </summary>
|
||||
/// <param name="MatrOpr"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<Macchine>> MacchineByMatrOper(int MatrOpr)
|
||||
public async Task<List<MacchineModel>> MacchineByMatrOper(int MatrOpr)
|
||||
{
|
||||
int rndWait = rnd.Next(0, 2);
|
||||
await Task.Delay(rndWait);
|
||||
@@ -1443,14 +1476,14 @@ namespace MP.Data.Services
|
||||
string source = "DB";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
List<Macchine> result = new List<Macchine>();
|
||||
List<MacchineModel> result = new List<MacchineModel>();
|
||||
// cerco in redis...
|
||||
string currKey = $"{redisBaseKey}:MachByMatOp:{MatrOpr}";
|
||||
RedisValue rawData = redisDb.StringGet(currKey);
|
||||
//if (!string.IsNullOrEmpty($"{rawData}"))
|
||||
if (rawData.HasValue)
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<List<Macchine>>($"{rawData}");
|
||||
result = JsonConvert.DeserializeObject<List<MacchineModel>>($"{rawData}");
|
||||
source = "REDIS";
|
||||
}
|
||||
else
|
||||
@@ -1462,7 +1495,7 @@ namespace MP.Data.Services
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new List<Macchine>();
|
||||
result = new List<MacchineModel>();
|
||||
}
|
||||
sw.Stop();
|
||||
|
||||
@@ -1488,7 +1521,7 @@ namespace MP.Data.Services
|
||||
sw.Start();
|
||||
List<ObjItemDTO>? result = new List<ObjItemDTO>();
|
||||
// cerco in redis...
|
||||
string currKey = redHashMpIO($"CurrentParameters:{idxMacchina}");
|
||||
string currKey = RedHashMpIO($"CurrentParameters:{idxMacchina}");
|
||||
RedisValue rawData = redisDb.StringGet(currKey);
|
||||
if (rawData.HasValue && rawData.Length() > 2)
|
||||
{
|
||||
@@ -1590,12 +1623,13 @@ namespace MP.Data.Services
|
||||
}
|
||||
// serializzo e salvo
|
||||
string serVal = JsonConvert.SerializeObject(innovations);
|
||||
string currKey = redHashMpIO($"CurrentParameters:{idxMacchina}");
|
||||
string currKey = RedHashMpIO($"CurrentParameters:{idxMacchina}");
|
||||
RedisValue rawData = redisDb.StringSet(currKey, serVal);
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
#if false
|
||||
/// <summary>
|
||||
/// Recupero info Machine-IOB x TAB (da info registrate IOB-WIN --> MP-IO)
|
||||
/// </summary>
|
||||
@@ -1608,7 +1642,7 @@ namespace MP.Data.Services
|
||||
sw.Start();
|
||||
Dictionary<string, string> result = new Dictionary<string, string>();
|
||||
// cerco in redis...
|
||||
string currKey = redHashMpIO($"IOB:{IdxMacchina}:MachIobConf");
|
||||
string currKey = RedHashMpIO($"IOB:{IdxMacchina}:MachIobConf");
|
||||
try
|
||||
{
|
||||
result = redisDb
|
||||
@@ -1630,6 +1664,39 @@ namespace MP.Data.Services
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Recupero Conf Yaml Machine-IOB
|
||||
/// </summary>
|
||||
/// <param name="IdxMacchina"></param>
|
||||
/// <returns></returns>
|
||||
public string MachIobYamlConf(string IdxMacchina)
|
||||
{
|
||||
string source = "NA";
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
string result = "";
|
||||
// cerco in redis...
|
||||
string currKey = RedHashMpIO($"IOB:{IdxMacchina}:ConfYaml");
|
||||
try
|
||||
{
|
||||
result = redisDb.StringGet(currKey);
|
||||
source = "REDIS";
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Log.Error($"Errore in MachIobYamlConf{Environment.NewLine}{exc}");
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = "";
|
||||
Log.Debug($"Init valore default MachIobYamlConf | IdxMacchina: {IdxMacchina}");
|
||||
}
|
||||
sw.Stop();
|
||||
Log.Debug($"MachIobYamlConf per {IdxMacchina} | {source} | {sw.Elapsed.TotalMilliseconds}ms");
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Restitusice elenco KVP dei TASK SALVATI (da passare a IOB-WIN) per l'impianto indicato
|
||||
/// </summary>
|
||||
@@ -3899,6 +3966,8 @@ namespace MP.Data.Services
|
||||
|
||||
protected int expMinutes = 1;
|
||||
|
||||
protected string MpIoNS = "";
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto per connessione a REDIS
|
||||
/// </summary>
|
||||
@@ -3953,8 +4022,6 @@ namespace MP.Data.Services
|
||||
/// </summary>
|
||||
private ExecStatsCollector esCollect = new ExecStatsCollector();
|
||||
|
||||
private string MpIoNS = "";
|
||||
|
||||
/// <summary>
|
||||
/// numero minimo di record per cui iniziare fase di log
|
||||
/// </summary>
|
||||
@@ -4046,7 +4113,7 @@ namespace MP.Data.Services
|
||||
/// <returns></returns>
|
||||
private string exeTaskHash(string idxMacchina)
|
||||
{
|
||||
return redHashMpIO($"ExeTask:{idxMacchina}");
|
||||
return RedHashMpIO($"ExeTask:{idxMacchina}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -4086,7 +4153,8 @@ namespace MP.Data.Services
|
||||
return result;
|
||||
}
|
||||
|
||||
private string redHashMpIO(string keyName)
|
||||
#if false
|
||||
protected string RedHashMpIO(string keyName)
|
||||
{
|
||||
string result = keyName;
|
||||
try
|
||||
@@ -4095,11 +4163,12 @@ namespace MP.Data.Services
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
Log.Error($"Errore in redHashMpIO{Environment.NewLine}{exc}");
|
||||
Log.Error($"Errore in RedHashMpIO{Environment.NewLine}{exc}");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
private string redHashParam(string keyName)
|
||||
{
|
||||
@@ -4224,7 +4293,7 @@ namespace MP.Data.Services
|
||||
/// <returns></returns>
|
||||
private string savedTaskHash(string idxMacchina)
|
||||
{
|
||||
return redHashMpIO($"SavedTask:{idxMacchina}");
|
||||
return RedHashMpIO($"SavedTask:{idxMacchina}");
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
using MP.Data.DbModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MP.Data.Services
|
||||
{
|
||||
public class TimeSeriesUtils
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Riduce una lista di oggetti FLModel mantenendo una spaziatura temporale uniforme.
|
||||
/// Gli oggetti vengono raggruppati in intervalli temporali e viene selezionato un rappresentante per intervallo.
|
||||
/// </summary>
|
||||
/// <param name="data">La lista originale di oggetti FLModel.</param>
|
||||
/// <param name="maxNum">Il numero massimo di oggetti desiderato nella lista risultante.</param>
|
||||
/// <returns>Una nuova lista di FLModel con una distribuzione temporale più uniforme,
|
||||
/// o la lista originale se già minore o uguale a maxNum.</returns>
|
||||
public static List<FLModel> DownsampleFluxModels(List<FLModel> data, int maxNum)
|
||||
{
|
||||
// Caso base: se la lista è vuota o già abbastanza piccola, la restituiamo così com'è.
|
||||
if (data == null || data.Count <= maxNum)
|
||||
{
|
||||
return data;
|
||||
}
|
||||
|
||||
// 1. Ordina la lista per dtEvento. Questo è FONDAMENTALE per il campionamento temporale.
|
||||
// Se la lista non è ordinata, il downsampling non funzionerà correttamente.
|
||||
var sortedData = data.OrderBy(m => m.dtEvento).ToList();
|
||||
|
||||
// Determina l'intervallo temporale totale dei dati.
|
||||
DateTime startTime = sortedData.First().dtEvento;
|
||||
DateTime endTime = sortedData.Last().dtEvento;
|
||||
|
||||
// Calcola la durata totale in millisecondi (o tick per maggiore precisione).
|
||||
long totalDurationTicks = endTime.Ticks - startTime.Ticks;
|
||||
|
||||
// Se tutti gli eventi avvengono nello stesso istante, non possiamo distribuirli.
|
||||
if (totalDurationTicks == 0)
|
||||
{
|
||||
return sortedData.Take(maxNum).ToList();
|
||||
}
|
||||
|
||||
// Inizializza la lista per i risultati campionati.
|
||||
var sampledList = new List<FLModel>();
|
||||
|
||||
// 2. Calcola la dimensione di ciascun bucket temporale.
|
||||
// Dividiamo la durata totale per il numero massimo desiderato di elementi.
|
||||
// Questo ci dà la durata approssimativa di ciascun "bucket" temporale.
|
||||
long ticksPerBucket = totalDurationTicks / maxNum;
|
||||
|
||||
// Garantisce che ticksPerBucket sia almeno 1 per evitare divisioni per zero o bucket infiniti.
|
||||
if (ticksPerBucket == 0)
|
||||
{
|
||||
ticksPerBucket = 1;
|
||||
}
|
||||
|
||||
// 3. Itera attraverso i dati e seleziona un rappresentante per ogni bucket.
|
||||
// Useremo il primo elemento trovato in un nuovo bucket come rappresentante.
|
||||
// Un'alternativa potrebbe essere prendere l'elemento più vicino al centro del bucket,
|
||||
// o l'ultimo elemento del bucket. Per semplicità, scegliamo il primo.
|
||||
|
||||
// Inizializza il "target time" per il primo bucket.
|
||||
DateTime currentBucketStartTime = startTime;
|
||||
FLModel currentBucketRepresentative = null;
|
||||
|
||||
foreach (var item in sortedData)
|
||||
{
|
||||
// Se l'elemento corrente cade nel bucket attuale o in uno precedente,
|
||||
// lo consideriamo per il bucket corrente.
|
||||
// Aggiorniamo il rappresentante solo se è il primo trovato o se si vuole una logica diversa (es. ultimo elemento nel bucket).
|
||||
if (item.dtEvento.Ticks >= currentBucketStartTime.Ticks && item.dtEvento.Ticks < currentBucketStartTime.Ticks + ticksPerBucket)
|
||||
{
|
||||
if (currentBucketRepresentative == null)
|
||||
{
|
||||
currentBucketRepresentative = item;
|
||||
}
|
||||
// Altre logiche per scegliere il rappresentante del bucket (es. ultimo, medio, ecc.)
|
||||
// currentBucketRepresentative = item; // Se vuoi l'ultimo elemento del bucket
|
||||
}
|
||||
else
|
||||
{
|
||||
// Abbiamo superato il bucket corrente.
|
||||
// Aggiungiamo il rappresentante del bucket precedente, se ne abbiamo trovato uno.
|
||||
if (currentBucketRepresentative != null)
|
||||
{
|
||||
sampledList.Add(currentBucketRepresentative);
|
||||
}
|
||||
|
||||
// Sposta al prossimo bucket. Dobbiamo farlo in un loop per coprire eventuali "salti"
|
||||
// nel caso in cui non ci siano dati per diversi bucket consecutivi.
|
||||
while (item.dtEvento.Ticks >= currentBucketStartTime.Ticks + ticksPerBucket)
|
||||
{
|
||||
currentBucketStartTime = new DateTime(currentBucketStartTime.Ticks + ticksPerBucket);
|
||||
// Se non ci sono dati per un bucket, potremmo voler inserire un placeholder
|
||||
// o semplicemente saltarlo. Qui lo saltiamo implicitamente.
|
||||
}
|
||||
|
||||
// Inizia il nuovo bucket con l'elemento corrente come primo rappresentante.
|
||||
currentBucketRepresentative = item;
|
||||
}
|
||||
|
||||
// Se abbiamo già raggiunto il numero massimo desiderato, possiamo fermarci.
|
||||
if (sampledList.Count >= maxNum)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Aggiungi l'ultimo rappresentante del bucket, se presente e se non abbiamo ancora raggiunto maxNum.
|
||||
if (currentBucketRepresentative != null && sampledList.Count < maxNum)
|
||||
{
|
||||
sampledList.Add(currentBucketRepresentative);
|
||||
}
|
||||
|
||||
// In alcuni rari casi (es. dati molto sparsi all'inizio o alla fine, o ticksPerBucket molto grandi)
|
||||
// potremmo non raggiungere maxNum elementi ma comunque voler restituire i dati campionati.
|
||||
// Se la lista campionata è ancora troppo piccola (meno di maxNum),
|
||||
// potremmo voler applicare un'ulteriore logica di selezione o padding.
|
||||
// Per questo problema specifico, l'algoritmo tende a dare al massimo `maxNum` elementi.
|
||||
// Se il numero di bucket generati è maggiore di maxNum (potrebbe succedere con ticksPerBucket=1 e molti dati)
|
||||
// la condizione `if (sampledList.Count >= maxNum)` sopra limiterà l'aggiunta.
|
||||
|
||||
return sampledList;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,7 +22,7 @@ namespace MP.Data.Services
|
||||
{
|
||||
#region Public Constructors
|
||||
|
||||
public TranslateSrv(IConfiguration configuration)
|
||||
public TranslateSrv(IConfiguration configuration) : base(configuration)
|
||||
{
|
||||
Stopwatch sw = Stopwatch.StartNew();
|
||||
sw.Start();
|
||||
|
||||
@@ -858,9 +858,9 @@ namespace MP.IOC.Data
|
||||
/// </summary>
|
||||
/// <param name="codGruppo"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<List<Macchine>> MacchineGetFilt(string codGruppo)
|
||||
public async Task<List<MacchineModel>> MacchineGetFilt(string codGruppo)
|
||||
{
|
||||
List<Macchine>? result = new List<Macchine>();
|
||||
List<MacchineModel>? result = new List<MacchineModel>();
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
string readType = "DB";
|
||||
@@ -870,7 +870,7 @@ namespace MP.IOC.Data
|
||||
RedisValue rawData = redisDb.StringGet(currKey);
|
||||
if (rawData.HasValue)
|
||||
{
|
||||
result = JsonConvert.DeserializeObject<List<Macchine>>($"{rawData}");
|
||||
result = JsonConvert.DeserializeObject<List<MacchineModel>>($"{rawData}");
|
||||
readType = "REDIS";
|
||||
}
|
||||
else
|
||||
@@ -882,7 +882,7 @@ namespace MP.IOC.Data
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new List<Macchine>();
|
||||
result = new List<MacchineModel>();
|
||||
}
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<body>
|
||||
<i>Modulo MP-IOC </i>
|
||||
<h4>Versione: 6.16.2504.1617</h4>
|
||||
<h4>Versione: 6.16.2506.3014</h4>
|
||||
<br /> Note di rilascio:
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
@@ -1 +1 @@
|
||||
6.16.2504.1617
|
||||
6.16.2506.3014
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<item>
|
||||
<version>6.16.2504.1617</version>
|
||||
<version>6.16.2506.3014</version>
|
||||
<url>https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/MP.IOC.zip</url>
|
||||
<changelog>https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/ChangeLog.html</changelog>
|
||||
<mandatory>false</mandatory>
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace MP.Land.Components
|
||||
#endregion Public Properties
|
||||
|
||||
[Inject]
|
||||
protected MessageService MServ { get; set; } = null!;
|
||||
protected LMessageService MServ { get; set; } = null!;
|
||||
|
||||
|
||||
#region Public Classes
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace MP.Land.Components
|
||||
{
|
||||
|
||||
[Inject]
|
||||
protected MessageService AppMService { get; set; }
|
||||
protected LMessageService AppMService { get; set; }
|
||||
|
||||
[Inject]
|
||||
protected AppAuthService DataService { get; set; }
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace MP.Land.Components
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected MessageService AppMessages { get; set; } = null!;
|
||||
protected LMessageService AppMessages { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ namespace MP.Land.Components
|
||||
[Inject]
|
||||
protected AppAuthService DataService { get; set; }
|
||||
[Inject]
|
||||
protected MessageService AppMServ { get; set; } = null!;
|
||||
protected LMessageService AppMServ { get; set; } = null!;
|
||||
|
||||
public string searchVal
|
||||
{
|
||||
|
||||
@@ -286,7 +286,7 @@ namespace MP.Land.Components
|
||||
|
||||
|
||||
[Inject]
|
||||
protected MessageService AppMServ { get; set; } = null!;
|
||||
protected LMessageService AppMServ { get; set; } = null!;
|
||||
|
||||
public string searchVal
|
||||
{
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace MP.Land.Components
|
||||
[Inject]
|
||||
protected IJSRuntime JSRuntime { get; set; } = null!;
|
||||
[Inject]
|
||||
protected MessageService AppMServ { get; set; } = null!;
|
||||
protected LMessageService AppMServ { get; set; } = null!;
|
||||
|
||||
public string searchVal
|
||||
{
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
@inject IConfiguration Configuration
|
||||
@inject AppAuthService DataService
|
||||
@inject MessageService MService
|
||||
@inject LMessageService MService
|
||||
@inject LicenseService LicServ
|
||||
|
||||
@if (authOk())
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
@using MP.Land.Data
|
||||
@using Majorsoft.Blazor.Components.Debounce
|
||||
|
||||
@inject MessageService MessageService
|
||||
@inject LMessageService MessageService
|
||||
|
||||
<div class="input-group input-group-sm">
|
||||
<DebounceInput id="sVal" class="form-control" placeholder="@("Ricerca libera")" autocomplete="off" @ref="debInput" @bind-Value="@_searchVal" @bind-Value:event="OnInput" DebounceTime="@_debMsec" MinLength="@_minChar" OnValueChanged="e => { searchVal = e; }" ForceNotifyByEnter="true" ForceNotifyOnBlur="true" />
|
||||
|
||||
@@ -6,11 +6,11 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace MP.Land.Data
|
||||
{
|
||||
public class MessageService
|
||||
public class LMessageService
|
||||
{
|
||||
#region Public Constructors
|
||||
|
||||
public MessageService(ILocalStorageService genLocalStorage, ISessionStorageService sessStore)
|
||||
public LMessageService(ILocalStorageService genLocalStorage, ISessionStorageService sessStore)
|
||||
{
|
||||
// gestione sessioni in browser
|
||||
localStore = genLocalStorage;
|
||||
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RootNamespace>MP.Land</RootNamespace>
|
||||
<Version>6.16.2505.2814</Version>
|
||||
<Version>6.16.2507.0111</Version>
|
||||
<Configurations>Debug;Release;Debug_LiManDebug</Configurations>
|
||||
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
|
||||
<RunAnalyzersDuringBuild>True</RunAnalyzersDuringBuild>
|
||||
@@ -51,8 +51,8 @@
|
||||
<PackageReference Include="Blazored.LocalStorage" Version="4.5.0" />
|
||||
<PackageReference Include="Blazored.SessionStorage" Version="2.4.0" />
|
||||
<PackageReference Include="DiffMatchPatch" Version="1.0.3" />
|
||||
<PackageReference Include="EgwCoreLib.Razor" Version="1.5.2504.907" />
|
||||
<PackageReference Include="EgwCoreLib.Utils" Version="1.5.2504.907" />
|
||||
<PackageReference Include="EgwCoreLib.Razor" Version="1.5.2506.3019" />
|
||||
<PackageReference Include="EgwCoreLib.Utils" Version="1.5.2506.3019" />
|
||||
<PackageReference Include="Majorsoft.Blazor.Components.Debounce" Version="1.5.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.Negotiate" Version="6.0.11" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<h2>@Titolo</h2>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<div class="badge badge-pill badge-dark px-4 py-2">
|
||||
<div class="badge rounded-pill bg-dark px-4 py-2">
|
||||
<div class="px-1">
|
||||
<a class="text-light" href="https://www.egalware.com/" target="_blank">powered by EgalWare <img width="24" class="img-fluid" src="img/LogoEgalware.svg" /></a>
|
||||
</div>
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace MP.Land.Pages
|
||||
|
||||
|
||||
[Inject]
|
||||
protected MessageService AppMService { get; set; } = null!;
|
||||
protected LMessageService AppMService { get; set; } = null!;
|
||||
[Inject]
|
||||
protected LicenseService LicServ{get;set;}=null!;
|
||||
#region Protected Methods
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
@page "/ConfDetail"
|
||||
|
||||
<div class="card shadow">
|
||||
<div class="card-header d-flex justify-content-between">
|
||||
<div class="px-0">
|
||||
<h3>Current Yaml Config</h3>
|
||||
</div>
|
||||
<div class="px-0">
|
||||
<div class="input-group flex-nowrap">
|
||||
<span class="input-group-text" id="addon-wrapping"># row</span>
|
||||
<input type="number" class="form-control" title="Numero Righe da mostrare" @bind="@numRow">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body small">
|
||||
<div style="height: @(numRow)rem; overflow-y: auto;">@fullConf</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
using EgwCoreLib.Razor.Data;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.WebUtilities;
|
||||
using MP.Data.Services;
|
||||
using System;
|
||||
|
||||
namespace MP.Land.Pages
|
||||
{
|
||||
public partial class ConfDetail
|
||||
{
|
||||
#region Protected Properties
|
||||
|
||||
protected string IdxMacc { get; set; } = "";
|
||||
|
||||
[Inject]
|
||||
protected NavigationManager NavMan { get; set; } = null!;
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabSrv { get; set; } = null!;
|
||||
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
IdxMacc = NavMan.ExtractQueryStringByKey<string>("IdxMacc");
|
||||
var rawData = TabSrv.MachIobYamlConf(IdxMacc);
|
||||
fullConf = getMarkup(rawData);
|
||||
}
|
||||
|
||||
private MarkupString fullConf;
|
||||
/// <summary>
|
||||
/// Converte la stringa in formato markup valido
|
||||
/// </summary>
|
||||
/// <param name="rawData"></param>
|
||||
/// <returns></returns>
|
||||
protected MarkupString getMarkup(string rawData)
|
||||
{
|
||||
return new MarkupString(rawData.Replace("\n", "<br/>").Replace(" ", " "));
|
||||
}
|
||||
|
||||
private int numRow = 40;
|
||||
|
||||
#endregion Protected Methods
|
||||
}
|
||||
}
|
||||
@@ -52,7 +52,7 @@ namespace MP.Land.Pages
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected MessageService AppMService { get; set; }
|
||||
protected LMessageService AppMService { get; set; }
|
||||
|
||||
[Inject]
|
||||
protected IConfiguration Configuration { get; set; }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
@page "/Contacts"
|
||||
@using MP.Land.Data
|
||||
|
||||
@inject MessageService AppMService
|
||||
@inject LMessageService AppMService
|
||||
|
||||
<div class="row mx-2">
|
||||
<div class="col-12 col-xl-10 offset-xl-1">
|
||||
@@ -13,7 +13,7 @@
|
||||
<h2>@Titolo</h2>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<div class="badge badge-pill badge-dark px-4 py-2">
|
||||
<div class="badge rounded-pill bg-dark px-4 py-2">
|
||||
<div class="px-1">
|
||||
<a class="text-light" href="https://www.egalware.com/" target="_blank">powered by EgalWare <img width="24" class="img-fluid" src="img/LogoEgalware.svg" /></a>
|
||||
</div>
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace MP.Land.Pages
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected MessageService AppMService { get; set; }
|
||||
protected LMessageService AppMService { get; set; }
|
||||
|
||||
[Inject]
|
||||
protected AppAuthService DataService { get; set; }
|
||||
|
||||
@@ -0,0 +1,177 @@
|
||||
@page "/IobList"
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="card shadow">
|
||||
<div class="card-header text-center">
|
||||
<div class="row">
|
||||
<div class="col-4">
|
||||
<div class="input-group">
|
||||
<span class="input-group-text">Ricerca</span>
|
||||
<input type="text" class="form-control" placeholder="alt-/" @bind="SearchValue" accesskey="/">
|
||||
<button class="btn @BtnResetCss" @onclick="ResetSearch"><i class="fa-solid fa-rotate-right"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<h2>@Titolo</h2>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<div class="d-flex justify-content-between">
|
||||
<div class="input-group-text">
|
||||
<span class="form-check form-switch small align-content-center">
|
||||
<input class="form-check-input" type="checkbox" role="switch" title="Mostra / Nascondi Accessori/Extra (es PING e ENR)" @bind-value="@ShowExtra" checked="@ShowExtra">
|
||||
<label class="form-check-label">IOB Extra</label>
|
||||
</span>
|
||||
</div>
|
||||
@if (IsSuperAdmin)
|
||||
{
|
||||
<div class="input-group-text">
|
||||
<span class="form-check form-switch small align-content-center me-1">
|
||||
<input class="form-check-input" type="checkbox" role="switch" title="Mostra / Nascondi senza locazione" @bind-value="@ShowEmptyLoc" checked="@ShowEmptyLoc">
|
||||
<label class="form-check-label">No Loc.</label>
|
||||
</span>
|
||||
@if (showEmptyLoc)
|
||||
{
|
||||
<span class="form-check form-switch small align-content-center">
|
||||
<input class="form-check-input" type="checkbox" role="switch" title="Mostra / Nascondi multi (es Tavole)" @bind-value="@ShowMulti" checked="@ShowMulti">
|
||||
<label class="form-check-label">Multi</label>
|
||||
</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
<span class="form-check form-switch small align-content-center">
|
||||
<input class="form-check-input" type="checkbox" role="switch" title="Mostra / Nascondi multi (es Tavole)" @bind-value="@ShowMulti" checked="@ShowMulti" disabled>
|
||||
<label class="form-check-label">Multi</label>
|
||||
</span>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="badge rounded-pill bg-dark px-4 py-2">
|
||||
<div class="px-1">
|
||||
<a class="text-light" href="https://www.egalware.com/" target="_blank">powered by EgalWare <img width="24" class="img-fluid" src="img/LogoEgalware.svg" /></a>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@if (isLoading || ListRecords == null)
|
||||
{
|
||||
<LoadingData></LoadingData>
|
||||
}
|
||||
else if (totalCount == 0)
|
||||
{
|
||||
<div class="alert alert-warning text-center display-4">Nessun record trovato</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<table class="table table-sm table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>IdxMacc <Sorter ParamName="IdxMacc" IsAsc="@sortAsc" CurrParam="@sortField" sortReq="SortRequested"></Sorter></th>
|
||||
<th>Nome <Sorter ParamName="Nome" IsAsc="@sortAsc" CurrParam="@sortField" sortReq="SortRequested"></Sorter></th>
|
||||
@if (IsSuperAdmin)
|
||||
{
|
||||
<th>Descr <Sorter ParamName="Descr" IsAsc="@sortAsc" CurrParam="@sortField" sortReq="SortRequested"></Sorter></th>
|
||||
}
|
||||
<th>OS <Sorter ParamName="OS" IsAsc="@sortAsc" CurrParam="@sortField" sortReq="SortRequested"></Sorter></th>
|
||||
<th><i class="fa-solid fa-computer"></i> PC IOB <Sorter ParamName="IobName" IsAsc="@sortAsc" CurrParam="@sortField" sortReq="SortRequested"></Sorter></th>
|
||||
<th><i class="fa-solid fa-laptop-code"></i> Adapter <Sorter ParamName="AdapName" IsAsc="@sortAsc" CurrParam="@sortField" sortReq="SortRequested"></Sorter></th>
|
||||
<th><i class="fa-solid fa-network-wired"></i> CNC/PLC <Sorter ParamName="TargetIp" IsAsc="@sortAsc" CurrParam="@sortField" sortReq="SortRequested"></Sorter></th>
|
||||
<th>Conf</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var item in ListRecords)
|
||||
{
|
||||
<tr class="@checkSelect(item)">
|
||||
<td class="fs-4 fw-bold">@item.IdxMacchina</td>
|
||||
<td>
|
||||
<div>
|
||||
@item.Nome
|
||||
</div>
|
||||
<div class="small">
|
||||
@item.CodMacchina
|
||||
</div>
|
||||
</td>
|
||||
@if (IsSuperAdmin)
|
||||
{
|
||||
<td>
|
||||
<div>
|
||||
@item.Descrizione
|
||||
</div>
|
||||
<div class="small">
|
||||
@item.Note
|
||||
</div>
|
||||
</td>
|
||||
}
|
||||
<td>@item.OS</td>
|
||||
<td>
|
||||
@if (!string.IsNullOrEmpty(item.IobName))
|
||||
{
|
||||
<div class="fw-bold">
|
||||
@item.IobName
|
||||
</div>
|
||||
<div class="small">@item.IobIpv4</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div>-</div>
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
@if (!string.IsNullOrEmpty(item.AdapName))
|
||||
{
|
||||
<div class="fw-bold">
|
||||
@item.AdapName
|
||||
</div>
|
||||
<div class="small">
|
||||
<span><i class="fa-solid fa-arrow-right"></i> @item.AdapType</span> | @item.AdapVers
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div>-</div>
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
@if (!string.IsNullOrEmpty(item.TargetIp))
|
||||
{
|
||||
<b>@item.TargetIp</b>
|
||||
<div class="small">
|
||||
port: @item.TargetPort
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
<div>-</div>
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
<a class="btn btn-primary btn-sm" target="_blank" href="@($"ConfDetail?idxMacc={item.IdxMacchina}")"><i class="fa-solid fa-gear"></i></a>
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="8">
|
||||
<DataPager PageSize="numRecord" currPage="currPage" numRecordChanged="SetNumRec" numPageChanged="SetPage" totalCount="totalCount" showLoading="isLoading" />
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@* <div class="card-footer py-1">
|
||||
</div> *@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,458 @@
|
||||
using DnsClient.Protocol;
|
||||
using EgwCoreLib.Razor;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.AspNetCore.Components.Authorization;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.JSInterop;
|
||||
using MP.AppAuth.Models;
|
||||
using MP.AppAuth.Services;
|
||||
using MP.Data.DTO;
|
||||
using MP.Data.Services;
|
||||
using MP.Land.Data;
|
||||
using NLog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MP.Land.Pages
|
||||
{
|
||||
public partial class IobList : ComponentBase, IDisposable
|
||||
{
|
||||
#region Public Methods
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
ListRecords = null;
|
||||
GC.Collect();
|
||||
}
|
||||
|
||||
#if false
|
||||
public string MacIobConf(string idxMacc, string kReq)
|
||||
{
|
||||
string answ = "-";
|
||||
if (DictMachData.ContainsKey(idxMacc))
|
||||
{
|
||||
var cRec = DictMachData[idxMacc];
|
||||
if (cRec.ContainsKey(kReq))
|
||||
{
|
||||
answ = cRec[kReq];
|
||||
}
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Protected Fields
|
||||
|
||||
#if false
|
||||
protected Dictionary<string, Core.Objects.IOB_data> DictIobInfo = new Dictionary<string, Core.Objects.IOB_data>();
|
||||
|
||||
protected Dictionary<string, Dictionary<string, string>> DictMachData = new Dictionary<string, Dictionary<string, string>>();
|
||||
#endif
|
||||
|
||||
#endregion Protected Fields
|
||||
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected AppAuthService AppDService { get; set; }
|
||||
|
||||
[Inject]
|
||||
protected LandDataService LDService { get; set; }
|
||||
|
||||
[Inject]
|
||||
protected LMessageService AppMService { get; set; }
|
||||
|
||||
[Inject]
|
||||
protected AuthenticationStateProvider AuthStateProvider { get; set; } = null!;
|
||||
|
||||
protected string BtnResetCss
|
||||
{
|
||||
get => string.IsNullOrEmpty(SearchValue) ? "btn-outline-secondary" : "btn-outline-primary";
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected IConfiguration Configuration { get; set; }
|
||||
|
||||
protected bool IsSuperAdmin
|
||||
{
|
||||
get => HasRight(AppAuthService.RoleSuperAdmin);
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected IJSRuntime JSRuntime { get; set; } = null!;
|
||||
|
||||
protected string SearchValue
|
||||
{
|
||||
get => searchVal;
|
||||
set
|
||||
{
|
||||
searchVal = value;
|
||||
RefreshDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Definisce se mostrare macchine senza locazione
|
||||
/// </summary>
|
||||
protected bool ShowEmptyLoc
|
||||
{
|
||||
get => showEmptyLoc;
|
||||
set
|
||||
{
|
||||
if (value != showEmptyLoc)
|
||||
{
|
||||
showEmptyLoc = value;
|
||||
currPage = 1;
|
||||
RefreshDisplay();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Definisce se mostrare macchine extra (da reboot ma senza riga macchine, es -PING e -ENR)
|
||||
/// </summary>
|
||||
protected bool ShowExtra
|
||||
{
|
||||
get => showExtra;
|
||||
set
|
||||
{
|
||||
if (value != showExtra)
|
||||
{
|
||||
showExtra = value;
|
||||
currPage = 1;
|
||||
RefreshDisplay();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Definisce se mostrare macchine multi (es tavole)
|
||||
/// </summary>
|
||||
protected bool ShowMulti
|
||||
{
|
||||
get => showMulti;
|
||||
set
|
||||
{
|
||||
if (value != showMulti)
|
||||
{
|
||||
showMulti = value;
|
||||
currPage = 1;
|
||||
RefreshDisplay();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Inject]
|
||||
protected TabDataService TabSrv { get; set; } = null!;
|
||||
|
||||
protected List<UserDirittiModel> UserRight { get; set; } = new List<UserDirittiModel>();
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
#region Protected Methods
|
||||
|
||||
protected string checkSelect(IobDTO IdxODL)
|
||||
{
|
||||
string answ = "";
|
||||
#if false
|
||||
if (currRecord != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
answ = (currRecord.IdxOdl == IdxODL) ? "table-info" : "";
|
||||
}
|
||||
catch
|
||||
{ }
|
||||
}
|
||||
#endif
|
||||
return answ;
|
||||
}
|
||||
|
||||
#if false
|
||||
protected Core.Objects.IOB_data CurrIobInfo(string idxMacc)
|
||||
{
|
||||
Core.Objects.IOB_data answ = new Core.Objects.IOB_data();
|
||||
if (DictIobInfo.ContainsKey(idxMacc))
|
||||
{
|
||||
answ = DictIobInfo[idxMacc];
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
#endif
|
||||
|
||||
protected void DataInit()
|
||||
{
|
||||
isLoading = true;
|
||||
// recupero TUTTI i dati IobList già completi anche on i RemoteRebootLog
|
||||
AllRecords = LDService.IobListAll();
|
||||
|
||||
|
||||
#if false
|
||||
// leggo i remoteRebootLog e cerco IdxMacc NON presenti, aggiungendo...
|
||||
|
||||
// fare!!! FixMe ToDo: aggiungere modello RRL, e query specifica x recuperare record con idxMacchina non presenti in tab Macchine..
|
||||
|
||||
// accodo a List di AllRecords
|
||||
|
||||
// leggo le info IOB x ogni record trovato...
|
||||
DictIobInfo = AllRecords.ToDictionary(x => x.IdxMacchina, x => TabSrv.IobInfo(x.IdxMacchina));
|
||||
DictMachData = AllRecords.ToDictionary(x => x.IdxMacchina, x => TabSrv.MachIobConf(x.IdxMacchina));
|
||||
#endif
|
||||
RefreshDisplay();
|
||||
isLoading = false;
|
||||
}
|
||||
|
||||
protected bool HasRight(string codFunz)
|
||||
{
|
||||
bool answ = false;
|
||||
if (UserRight != null && UserRight.Count > 0)
|
||||
{
|
||||
answ = UserRight
|
||||
.Where(x => x.Funzione.Equals(codFunz, System.StringComparison.InvariantCultureIgnoreCase))
|
||||
.Count() > 0;
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
|
||||
#if false
|
||||
protected string IobExeTrim(string IdxMacchina)
|
||||
{
|
||||
string answ = MacIobConf(IdxMacchina, "IobExe");
|
||||
if (!string.IsNullOrEmpty(answ) && answ.Contains(","))
|
||||
{
|
||||
answ = answ.Substring(0, answ.IndexOf(','));
|
||||
}
|
||||
return answ;
|
||||
}
|
||||
#endif
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
ListRecords = null;
|
||||
Titolo = "Elenco IOB Amministrati";
|
||||
AppMService.ShowSearch = false;
|
||||
AppMService.PageName = "IobList";
|
||||
AppMService.PageIcon = "fas fa-computer pe-2";
|
||||
await SetupRight();
|
||||
DataInit();
|
||||
}
|
||||
|
||||
protected void ResetSearch()
|
||||
{
|
||||
SearchValue = "";
|
||||
}
|
||||
|
||||
protected void SetNumRec(int newNum)
|
||||
{
|
||||
numRecord = newNum;
|
||||
RefreshDisplay();
|
||||
}
|
||||
|
||||
protected void SetPage(int newNum)
|
||||
{
|
||||
currPage = newNum;
|
||||
RefreshDisplay();
|
||||
}
|
||||
|
||||
protected void SortRequested(Sorter.SortCallBack e)
|
||||
{
|
||||
if (sortField == e.ParamName)
|
||||
{
|
||||
sortAsc = e.IsAscending;
|
||||
}
|
||||
sortField = e.ParamName;
|
||||
RefreshDisplay();
|
||||
}
|
||||
|
||||
#endregion Protected Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
/// <summary>
|
||||
/// Classe logger
|
||||
/// </summary>
|
||||
private static Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
private List<IobDTO> AllRecords = new List<IobDTO>();
|
||||
private int currPage = 1;
|
||||
private bool isLoading = false;
|
||||
private List<IobDTO> ListRecords = new List<IobDTO>();
|
||||
private int numRecord = 10;
|
||||
private List<IobDTO> SearchRecords = new List<IobDTO>();
|
||||
private string searchVal = "";
|
||||
|
||||
/// <summary>
|
||||
/// Definisce se mostrare macchine senza locazione
|
||||
/// </summary>
|
||||
private bool showEmptyLoc = false;
|
||||
|
||||
/// <summary>
|
||||
/// Definisce se mostrare macchine extra (da reboot ma senza riga macchine, es -PING e -ENR)
|
||||
/// </summary>
|
||||
private bool showExtra = false;
|
||||
|
||||
/// <summary>
|
||||
/// Definisce se mostrare macchine multi (es tavole)
|
||||
/// </summary>
|
||||
private bool showMulti = false;
|
||||
|
||||
private bool sortAsc = true;
|
||||
private string sortField = "";
|
||||
private string Titolo = "";
|
||||
|
||||
private int totalCount = 0;
|
||||
private string userName = "";
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Methods
|
||||
|
||||
private void RefreshDisplay()
|
||||
{
|
||||
// in primis filtro conddizioni da selettori...
|
||||
SearchRecords = AllRecords
|
||||
.Where(x => (!string.IsNullOrEmpty(x.Locazione) || showEmptyLoc)
|
||||
&& (showMulti || !x.IdxMacchina.Contains("#"))
|
||||
&& (showExtra || x.IsMachine)
|
||||
).ToList();
|
||||
|
||||
// se ho ricerca filtro...
|
||||
if (!string.IsNullOrEmpty(searchVal))
|
||||
{
|
||||
SearchRecords = SearchRecords
|
||||
.Where(x => x.Nome.Contains(searchVal, StringComparison.InvariantCultureIgnoreCase)
|
||||
|| x.CodMacchina.Contains(searchVal, StringComparison.InvariantCultureIgnoreCase)
|
||||
|| x.Descrizione.Contains(searchVal, StringComparison.InvariantCultureIgnoreCase)
|
||||
|| x.IdxMacchina.Contains(searchVal, StringComparison.InvariantCultureIgnoreCase))
|
||||
.ToList();
|
||||
}
|
||||
// conto record
|
||||
totalCount = SearchRecords.Count();
|
||||
|
||||
// effettuo sorting
|
||||
|
||||
// se ho ordinamento riordino...
|
||||
if (!string.IsNullOrEmpty(sortField))
|
||||
{
|
||||
switch (sortField)
|
||||
{
|
||||
case "IdxMacc":
|
||||
if (sortAsc)
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderBy(x => x.IdxMacchina).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderByDescending(x => x.IdxMacchina).ToList();
|
||||
}
|
||||
break;
|
||||
|
||||
case "Nome":
|
||||
if (sortAsc)
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderBy(x => x.Nome).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderByDescending(x => x.Nome).ToList();
|
||||
}
|
||||
break;
|
||||
|
||||
case "Descr":
|
||||
if (sortAsc)
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderBy(x => x.Descrizione).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderByDescending(x => x.Descrizione).ToList();
|
||||
}
|
||||
break;
|
||||
|
||||
case "OS":
|
||||
if (sortAsc)
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderBy(x => x.OS).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderByDescending(x => x.OS).ToList();
|
||||
}
|
||||
break;
|
||||
|
||||
case "IobName":
|
||||
if (sortAsc)
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderBy(x => x.IobName).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderByDescending(x => x.IobName).ToList();
|
||||
}
|
||||
break;
|
||||
|
||||
case "AdapName":
|
||||
if (sortAsc)
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderBy(x => x.AdapName).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderByDescending(x => x.AdapName).ToList();
|
||||
}
|
||||
break;
|
||||
|
||||
case "TargetIp":
|
||||
if (sortAsc)
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderBy(x => x.TargetIp).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
SearchRecords = SearchRecords.OrderByDescending(x => x.TargetIp).ToList();
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
SearchRecords = SearchRecords.OrderBy(x => x.IdxMacchina).ToList();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// fix paginazione
|
||||
ListRecords = SearchRecords
|
||||
.Skip(numRecord * (currPage - 1))
|
||||
.Take(numRecord)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
private async Task SetupRight()
|
||||
{
|
||||
var authState = await AuthStateProvider.GetAuthenticationStateAsync();
|
||||
var user = authState.User;
|
||||
if (user.Identity != null && user.Identity.IsAuthenticated)
|
||||
{
|
||||
userName = $"{user.Identity.Name}";
|
||||
}
|
||||
else
|
||||
{
|
||||
userName = "N.A.";
|
||||
}
|
||||
// carico diritti...
|
||||
var domUser = userName.Split("\\");
|
||||
if (domUser.Length > 0)
|
||||
{
|
||||
string dominio = domUser[0];
|
||||
string uName = domUser[1];
|
||||
UserRight = await AppDService.DirittiGetByUser(uName);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
@using Microsoft.Extensions.Configuration
|
||||
|
||||
@inject AppAuthService DataService
|
||||
@inject MessageService AppMService
|
||||
@inject LMessageService AppMService
|
||||
@inject IConfiguration Configuration
|
||||
|
||||
<div class="row mx-2">
|
||||
@@ -18,7 +18,7 @@
|
||||
<h2>@Titolo</h2>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<div class="badge badge-pill badge-dark px-4 py-2">
|
||||
<div class="badge rounded-pill bg-dark px-4 py-2">
|
||||
<div class="px-1">
|
||||
<a class="text-light" href="https://www.egalware.com/" target="_blank">powered by EgalWare <img width="24" class="img-fluid" src="img/LogoEgalware.svg" /></a>
|
||||
</div>
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace MP.Land.Pages
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected Data.MessageService MServ { get; set; } = null!;
|
||||
protected Data.LMessageService MServ { get; set; } = null!;
|
||||
|
||||
#endregion Protected Properties
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace MP.Land.Pages
|
||||
protected AppAuthService AppDService { get; set; }
|
||||
|
||||
[Inject]
|
||||
protected MessageService AppMService { get; set; }
|
||||
protected LMessageService AppMService { get; set; }
|
||||
|
||||
[Inject]
|
||||
protected IConfiguration Configuration { get; set; }
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace MP.Land.Pages
|
||||
#region Protected Properties
|
||||
|
||||
[Inject]
|
||||
protected MessageService AppMService { get; set; }
|
||||
protected LMessageService AppMService { get; set; }
|
||||
|
||||
protected string BaseUrlTab
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<body>
|
||||
<i>Modulo Tablet MAPO - DotNet6</i>
|
||||
<h4>Versione: 6.16.2505.2814</h4>
|
||||
<h4>Versione: 6.16.2507.0111</h4>
|
||||
<br />
|
||||
Note di rilascio:
|
||||
<ul>
|
||||
|
||||
@@ -1 +1 @@
|
||||
6.16.2505.2814
|
||||
6.16.2507.0111
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<item>
|
||||
<version>6.16.2505.2814</version>
|
||||
<version>6.16.2507.0111</version>
|
||||
<url>https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/MP.Land.zip</url>
|
||||
<changelog>https://nexus.steamware.net/repository/SWS/MP-LAND/stable/LAST/ChangeLog.html</changelog>
|
||||
<mandatory>false</mandatory>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
@using MP.Land.Data
|
||||
@using MP.Land.Components
|
||||
|
||||
@inject MessageService AppMService
|
||||
@inject LMessageService AppMService
|
||||
@inject LicenseService LicServ
|
||||
@implements IDisposable
|
||||
|
||||
|
||||
@@ -40,6 +40,15 @@
|
||||
}
|
||||
</NavLink>
|
||||
</div>
|
||||
<div class="nav-item px-2">
|
||||
<NavLink class="nav-link py-0 px-2 mb-0" href="IobList">
|
||||
<span class="fas fa-computer fs-4 pe-2" aria-hidden="true"></span>
|
||||
@if (showText)
|
||||
{
|
||||
<span class="@hideText">IOB List</span>
|
||||
}
|
||||
</NavLink>
|
||||
</div>
|
||||
<div class="nav-item px-2">
|
||||
<NavLink class="nav-link py-0 px-2 mb-0" href="UpdateManager">
|
||||
<span class="fas fa-download fs-4 pe-2" aria-hidden="true"></span>
|
||||
|
||||
+3
-1
@@ -142,9 +142,11 @@ namespace MP.Land
|
||||
services.AddSingleton<SyncService>();
|
||||
services.AddSingleton<RestCallService>();
|
||||
services.AddSingleton<TaskService>();
|
||||
services.AddSingleton<TabDataService>();
|
||||
services.AddSingleton<LandDataService>();
|
||||
|
||||
services.AddScoped<AppAuthService>();
|
||||
services.AddScoped<Data.MessageService>();
|
||||
services.AddScoped<LMessageService>();
|
||||
services.AddSingleton<IConnectionMultiplexer>(redisMultiplexer);
|
||||
|
||||
services.AddBlazoredLocalStorage();
|
||||
|
||||
@@ -60,16 +60,19 @@
|
||||
"MP.All": "Server=SQL2016DEV;Database=MoonPro;User ID=sa;Password=keyhammer16;integrated security=False;MultipleActiveResultSets=True;App=MP.Land;",
|
||||
"MP.Land": "Server=SQL2016DEV;Database=MoonPro;User ID=sa;Password=keyhammer16;integrated security=False;MultipleActiveResultSets=True;App=MP.Land;",
|
||||
"MP.Land.Auth": "Server=SQL2016DEV;Database=MoonPro_Anagrafica;User ID=sa;Password=keyhammer16;integrated security=False;MultipleActiveResultSets=True;App=MP.Land;",
|
||||
"Redis": "redis.ufficio:26379, serviceName=devel, defaultDatabase=1, keepAlive=180, connectTimeout=5000, syncTimeout=5000, asyncTimeout=5000, abortConnect=false, ssl=false, allowAdmin=true"
|
||||
"MP.Tab": "Server=SQL2016DEV;Database=MoonPro; User ID=sa;Password=keyhammer16; integrated security=False; MultipleActiveResultSets=True; App=MP.Land;",
|
||||
//"Redis": "redis.ufficio:26379, serviceName=devel, defaultDatabase=1, keepAlive=180, connectTimeout=5000, syncTimeout=5000, asyncTimeout=5000, abortConnect=false, ssl=false, allowAdmin=true",
|
||||
"Redis": "redis.ufficio:26379, serviceName=devel, DefaultDatabase=5, keepAlive=180, connectTimeout=15000, syncTimeout=15000, asyncTimeout=15000, abortConnect=false, ssl=false, allowAdmin=true"
|
||||
},
|
||||
"Application": {
|
||||
"SafePages": "||LAND|Home|Index|About|Help|Unauthorized|"
|
||||
"SafePages": "||LAND|Home|Index|About|Help|Unauthorized|ConfDetail|"
|
||||
},
|
||||
"ServerConf": {
|
||||
"BaseUrl": "https://localhost:44309/",
|
||||
"downloadPath": "C:\\Steamware\\installers\\MP",
|
||||
"IobUploadPath": "C:\\inetpub\\wwwroot\\MP\\fileUpload",
|
||||
"Modulo": "MoonPro",
|
||||
"MpIoNS": "MoonPro:SQL2016DEV:MoonPro",
|
||||
"Prog.ApiUrl": "https://office.egalware.com/MP/PROG"
|
||||
},
|
||||
"SpecialConf": {
|
||||
|
||||
+2
-1
@@ -11,7 +11,8 @@
|
||||
"destination": "wwwroot/popper.js/"
|
||||
},
|
||||
{
|
||||
"library": "font-awesome@6.5.1",
|
||||
"provider": "cdnjs",
|
||||
"library": "font-awesome@6.6.0",
|
||||
"destination": "wwwroot/lib/font-awesome/"
|
||||
}
|
||||
]
|
||||
|
||||
+133
-260
@@ -1,21 +1,21 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
.fa {
|
||||
font-family: var(--fa-style-family, "Font Awesome 6 Free");
|
||||
font-weight: var(--fa-style, 900); }
|
||||
|
||||
.fa,
|
||||
.fa-classic,
|
||||
.fa-sharp,
|
||||
.fas,
|
||||
.fa-solid,
|
||||
.far,
|
||||
.fa-regular,
|
||||
.fa-brands,
|
||||
.fas,
|
||||
.far,
|
||||
.fab,
|
||||
.fa-brands {
|
||||
.fa-sharp-solid,
|
||||
.fa-classic,
|
||||
.fa {
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
display: var(--fa-display, inline-block);
|
||||
@@ -107,7 +107,7 @@
|
||||
position: relative; }
|
||||
|
||||
.fa-li {
|
||||
left: calc(var(--fa-li-width, 2em) * -1);
|
||||
left: calc(-1 * var(--fa-li-width, 2em));
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: var(--fa-li-width, 2em);
|
||||
@@ -129,118 +129,71 @@
|
||||
margin-left: var(--fa-pull-margin, 0.3em); }
|
||||
|
||||
.fa-beat {
|
||||
-webkit-animation-name: fa-beat;
|
||||
animation-name: fa-beat;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
animation-name: fa-beat;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
|
||||
.fa-bounce {
|
||||
-webkit-animation-name: fa-bounce;
|
||||
animation-name: fa-bounce;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
|
||||
animation-name: fa-bounce;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
|
||||
|
||||
.fa-fade {
|
||||
-webkit-animation-name: fa-fade;
|
||||
animation-name: fa-fade;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
animation-name: fa-fade;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
|
||||
.fa-beat-fade {
|
||||
-webkit-animation-name: fa-beat-fade;
|
||||
animation-name: fa-beat-fade;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
animation-name: fa-beat-fade;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
|
||||
.fa-flip {
|
||||
-webkit-animation-name: fa-flip;
|
||||
animation-name: fa-flip;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
animation-name: fa-flip;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
|
||||
.fa-shake {
|
||||
-webkit-animation-name: fa-shake;
|
||||
animation-name: fa-shake;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
animation-name: fa-shake;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
|
||||
.fa-spin {
|
||||
-webkit-animation-name: fa-spin;
|
||||
animation-name: fa-spin;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 2s);
|
||||
animation-duration: var(--fa-animation-duration, 2s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
animation-name: fa-spin;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 2s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
|
||||
.fa-spin-reverse {
|
||||
--fa-animation-direction: reverse; }
|
||||
|
||||
.fa-pulse,
|
||||
.fa-spin-pulse {
|
||||
-webkit-animation-name: fa-spin;
|
||||
animation-name: fa-spin;
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, steps(8));
|
||||
animation-timing-function: var(--fa-animation-timing, steps(8)); }
|
||||
animation-name: fa-spin;
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, steps(8)); }
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.fa-beat,
|
||||
@@ -252,219 +205,97 @@
|
||||
.fa-shake,
|
||||
.fa-spin,
|
||||
.fa-spin-pulse {
|
||||
-webkit-animation-delay: -1ms;
|
||||
animation-delay: -1ms;
|
||||
-webkit-animation-duration: 1ms;
|
||||
animation-duration: 1ms;
|
||||
-webkit-animation-iteration-count: 1;
|
||||
animation-iteration-count: 1;
|
||||
-webkit-transition-delay: 0s;
|
||||
transition-delay: 0s;
|
||||
-webkit-transition-duration: 0s;
|
||||
transition-duration: 0s; } }
|
||||
|
||||
@-webkit-keyframes fa-beat {
|
||||
0%, 90% {
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
45% {
|
||||
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
animation-delay: -1ms;
|
||||
animation-duration: 1ms;
|
||||
animation-iteration-count: 1;
|
||||
transition-delay: 0s;
|
||||
transition-duration: 0s; } }
|
||||
|
||||
@keyframes fa-beat {
|
||||
0%, 90% {
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
transform: scale(1); }
|
||||
45% {
|
||||
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
|
||||
@-webkit-keyframes fa-bounce {
|
||||
0% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
10% {
|
||||
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
30% {
|
||||
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
50% {
|
||||
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
57% {
|
||||
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
64% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
100% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
|
||||
@keyframes fa-bounce {
|
||||
0% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
10% {
|
||||
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
30% {
|
||||
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
50% {
|
||||
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
57% {
|
||||
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
64% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
100% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
|
||||
@-webkit-keyframes fa-fade {
|
||||
50% {
|
||||
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
|
||||
@keyframes fa-fade {
|
||||
50% {
|
||||
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||
|
||||
@-webkit-keyframes fa-beat-fade {
|
||||
0%, 100% {
|
||||
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
50% {
|
||||
opacity: 1;
|
||||
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@keyframes fa-beat-fade {
|
||||
0%, 100% {
|
||||
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
transform: scale(1); }
|
||||
50% {
|
||||
opacity: 1;
|
||||
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@-webkit-keyframes fa-flip {
|
||||
50% {
|
||||
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@keyframes fa-flip {
|
||||
50% {
|
||||
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
|
||||
@-webkit-keyframes fa-shake {
|
||||
0% {
|
||||
-webkit-transform: rotate(-15deg);
|
||||
transform: rotate(-15deg); }
|
||||
4% {
|
||||
-webkit-transform: rotate(15deg);
|
||||
transform: rotate(15deg); }
|
||||
8%, 24% {
|
||||
-webkit-transform: rotate(-18deg);
|
||||
transform: rotate(-18deg); }
|
||||
12%, 28% {
|
||||
-webkit-transform: rotate(18deg);
|
||||
transform: rotate(18deg); }
|
||||
16% {
|
||||
-webkit-transform: rotate(-22deg);
|
||||
transform: rotate(-22deg); }
|
||||
20% {
|
||||
-webkit-transform: rotate(22deg);
|
||||
transform: rotate(22deg); }
|
||||
32% {
|
||||
-webkit-transform: rotate(-12deg);
|
||||
transform: rotate(-12deg); }
|
||||
36% {
|
||||
-webkit-transform: rotate(12deg);
|
||||
transform: rotate(12deg); }
|
||||
40%, 100% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); } }
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
|
||||
@keyframes fa-shake {
|
||||
0% {
|
||||
-webkit-transform: rotate(-15deg);
|
||||
transform: rotate(-15deg); }
|
||||
transform: rotate(-15deg); }
|
||||
4% {
|
||||
-webkit-transform: rotate(15deg);
|
||||
transform: rotate(15deg); }
|
||||
transform: rotate(15deg); }
|
||||
8%, 24% {
|
||||
-webkit-transform: rotate(-18deg);
|
||||
transform: rotate(-18deg); }
|
||||
transform: rotate(-18deg); }
|
||||
12%, 28% {
|
||||
-webkit-transform: rotate(18deg);
|
||||
transform: rotate(18deg); }
|
||||
transform: rotate(18deg); }
|
||||
16% {
|
||||
-webkit-transform: rotate(-22deg);
|
||||
transform: rotate(-22deg); }
|
||||
transform: rotate(-22deg); }
|
||||
20% {
|
||||
-webkit-transform: rotate(22deg);
|
||||
transform: rotate(22deg); }
|
||||
transform: rotate(22deg); }
|
||||
32% {
|
||||
-webkit-transform: rotate(-12deg);
|
||||
transform: rotate(-12deg); }
|
||||
transform: rotate(-12deg); }
|
||||
36% {
|
||||
-webkit-transform: rotate(12deg);
|
||||
transform: rotate(12deg); }
|
||||
transform: rotate(12deg); }
|
||||
40%, 100% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); } }
|
||||
|
||||
@-webkit-keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); } }
|
||||
transform: rotate(0deg); } }
|
||||
|
||||
@keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); }
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); } }
|
||||
transform: rotate(360deg); } }
|
||||
|
||||
.fa-rotate-90 {
|
||||
-webkit-transform: rotate(90deg);
|
||||
transform: rotate(90deg); }
|
||||
transform: rotate(90deg); }
|
||||
|
||||
.fa-rotate-180 {
|
||||
-webkit-transform: rotate(180deg);
|
||||
transform: rotate(180deg); }
|
||||
transform: rotate(180deg); }
|
||||
|
||||
.fa-rotate-270 {
|
||||
-webkit-transform: rotate(270deg);
|
||||
transform: rotate(270deg); }
|
||||
transform: rotate(270deg); }
|
||||
|
||||
.fa-flip-horizontal {
|
||||
-webkit-transform: scale(-1, 1);
|
||||
transform: scale(-1, 1); }
|
||||
transform: scale(-1, 1); }
|
||||
|
||||
.fa-flip-vertical {
|
||||
-webkit-transform: scale(1, -1);
|
||||
transform: scale(1, -1); }
|
||||
transform: scale(1, -1); }
|
||||
|
||||
.fa-flip-both,
|
||||
.fa-flip-horizontal.fa-flip-vertical {
|
||||
-webkit-transform: scale(-1, -1);
|
||||
transform: scale(-1, -1); }
|
||||
transform: scale(-1, -1); }
|
||||
|
||||
.fa-rotate-by {
|
||||
-webkit-transform: rotate(var(--fa-rotate-angle, none));
|
||||
transform: rotate(var(--fa-rotate-angle, none)); }
|
||||
transform: rotate(var(--fa-rotate-angle, 0)); }
|
||||
|
||||
.fa-stack {
|
||||
display: inline-block;
|
||||
@@ -1892,6 +1723,12 @@ readers do not read off random characters that represent icons */
|
||||
.fa-passport::before {
|
||||
content: "\f5ab"; }
|
||||
|
||||
.fa-thumbtack-slash::before {
|
||||
content: "\e68f"; }
|
||||
|
||||
.fa-thumb-tack-slash::before {
|
||||
content: "\e68f"; }
|
||||
|
||||
.fa-heart-pulse::before {
|
||||
content: "\f21e"; }
|
||||
|
||||
@@ -2768,6 +2605,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-italic::before {
|
||||
content: "\f033"; }
|
||||
|
||||
.fa-table-cells-column-lock::before {
|
||||
content: "\e678"; }
|
||||
|
||||
.fa-church::before {
|
||||
content: "\f51d"; }
|
||||
|
||||
@@ -4940,6 +4780,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-font::before {
|
||||
content: "\f031"; }
|
||||
|
||||
.fa-table-cells-row-lock::before {
|
||||
content: "\e67a"; }
|
||||
|
||||
.fa-rupiah-sign::before {
|
||||
content: "\e23d"; }
|
||||
|
||||
@@ -6197,6 +6040,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-bone::before {
|
||||
content: "\f5d7"; }
|
||||
|
||||
.fa-table-cells-row-unlock::before {
|
||||
content: "\e691"; }
|
||||
|
||||
.fa-user-injured::before {
|
||||
content: "\f728"; }
|
||||
|
||||
@@ -6481,6 +6327,12 @@ readers do not read off random characters that represent icons */
|
||||
.fa-drupal:before {
|
||||
content: "\f1a9"; }
|
||||
|
||||
.fa-jxl:before {
|
||||
content: "\e67b"; }
|
||||
|
||||
.fa-dart-lang:before {
|
||||
content: "\e693"; }
|
||||
|
||||
.fa-hire-a-helper:before {
|
||||
content: "\f3b0"; }
|
||||
|
||||
@@ -6784,6 +6636,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-kickstarter:before {
|
||||
content: "\f3bb"; }
|
||||
|
||||
.fa-square-kickstarter:before {
|
||||
content: "\f3bb"; }
|
||||
|
||||
.fa-grav:before {
|
||||
content: "\f2d6"; }
|
||||
|
||||
@@ -7216,6 +7071,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-google-plus-square:before {
|
||||
content: "\f0d4"; }
|
||||
|
||||
.fa-web-awesome:before {
|
||||
content: "\e682"; }
|
||||
|
||||
.fa-mandalorian:before {
|
||||
content: "\f50f"; }
|
||||
|
||||
@@ -7378,6 +7236,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-xbox:before {
|
||||
content: "\f412"; }
|
||||
|
||||
.fa-square-web-awesome-stroke:before {
|
||||
content: "\e684"; }
|
||||
|
||||
.fa-searchengin:before {
|
||||
content: "\f3eb"; }
|
||||
|
||||
@@ -7411,6 +7272,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-twitch:before {
|
||||
content: "\f1e8"; }
|
||||
|
||||
.fa-flutter:before {
|
||||
content: "\e694"; }
|
||||
|
||||
.fa-ravelry:before {
|
||||
content: "\f2d9"; }
|
||||
|
||||
@@ -7486,6 +7350,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-whatsapp:before {
|
||||
content: "\f232"; }
|
||||
|
||||
.fa-square-upwork:before {
|
||||
content: "\e67c"; }
|
||||
|
||||
.fa-slideshare:before {
|
||||
content: "\f1e7"; }
|
||||
|
||||
@@ -7564,6 +7431,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-sellsy:before {
|
||||
content: "\f213"; }
|
||||
|
||||
.fa-square-web-awesome:before {
|
||||
content: "\e683"; }
|
||||
|
||||
.fa-sass:before {
|
||||
content: "\f41e"; }
|
||||
|
||||
@@ -7600,6 +7470,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-waze:before {
|
||||
content: "\f83f"; }
|
||||
|
||||
.fa-bluesky:before {
|
||||
content: "\e671"; }
|
||||
|
||||
.fa-cc-jcb:before {
|
||||
content: "\f24b"; }
|
||||
|
||||
|
||||
+5
-5
File diff suppressed because one or more lines are too long
+29
-2
@@ -1,7 +1,7 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:root, :host {
|
||||
--fa-style-family-brands: 'Font Awesome 6 Brands';
|
||||
@@ -117,6 +117,12 @@
|
||||
.fa-drupal:before {
|
||||
content: "\f1a9"; }
|
||||
|
||||
.fa-jxl:before {
|
||||
content: "\e67b"; }
|
||||
|
||||
.fa-dart-lang:before {
|
||||
content: "\e693"; }
|
||||
|
||||
.fa-hire-a-helper:before {
|
||||
content: "\f3b0"; }
|
||||
|
||||
@@ -420,6 +426,9 @@
|
||||
.fa-kickstarter:before {
|
||||
content: "\f3bb"; }
|
||||
|
||||
.fa-square-kickstarter:before {
|
||||
content: "\f3bb"; }
|
||||
|
||||
.fa-grav:before {
|
||||
content: "\f2d6"; }
|
||||
|
||||
@@ -852,6 +861,9 @@
|
||||
.fa-google-plus-square:before {
|
||||
content: "\f0d4"; }
|
||||
|
||||
.fa-web-awesome:before {
|
||||
content: "\e682"; }
|
||||
|
||||
.fa-mandalorian:before {
|
||||
content: "\f50f"; }
|
||||
|
||||
@@ -1014,6 +1026,9 @@
|
||||
.fa-xbox:before {
|
||||
content: "\f412"; }
|
||||
|
||||
.fa-square-web-awesome-stroke:before {
|
||||
content: "\e684"; }
|
||||
|
||||
.fa-searchengin:before {
|
||||
content: "\f3eb"; }
|
||||
|
||||
@@ -1047,6 +1062,9 @@
|
||||
.fa-twitch:before {
|
||||
content: "\f1e8"; }
|
||||
|
||||
.fa-flutter:before {
|
||||
content: "\e694"; }
|
||||
|
||||
.fa-ravelry:before {
|
||||
content: "\f2d9"; }
|
||||
|
||||
@@ -1122,6 +1140,9 @@
|
||||
.fa-whatsapp:before {
|
||||
content: "\f232"; }
|
||||
|
||||
.fa-square-upwork:before {
|
||||
content: "\e67c"; }
|
||||
|
||||
.fa-slideshare:before {
|
||||
content: "\f1e7"; }
|
||||
|
||||
@@ -1200,6 +1221,9 @@
|
||||
.fa-sellsy:before {
|
||||
content: "\f213"; }
|
||||
|
||||
.fa-square-web-awesome:before {
|
||||
content: "\e683"; }
|
||||
|
||||
.fa-sass:before {
|
||||
content: "\f41e"; }
|
||||
|
||||
@@ -1236,6 +1260,9 @@
|
||||
.fa-waze:before {
|
||||
content: "\f83f"; }
|
||||
|
||||
.fa-bluesky:before {
|
||||
content: "\e671"; }
|
||||
|
||||
.fa-cc-jcb:before {
|
||||
content: "\f24b"; }
|
||||
|
||||
|
||||
+3
-3
File diff suppressed because one or more lines are too long
+106
-260
@@ -1,21 +1,21 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
.fa {
|
||||
font-family: var(--fa-style-family, "Font Awesome 6 Free");
|
||||
font-weight: var(--fa-style, 900); }
|
||||
|
||||
.fa,
|
||||
.fa-classic,
|
||||
.fa-sharp,
|
||||
.fas,
|
||||
.fa-solid,
|
||||
.far,
|
||||
.fa-regular,
|
||||
.fa-brands,
|
||||
.fas,
|
||||
.far,
|
||||
.fab,
|
||||
.fa-brands {
|
||||
.fa-sharp-solid,
|
||||
.fa-classic,
|
||||
.fa {
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
display: var(--fa-display, inline-block);
|
||||
@@ -107,7 +107,7 @@
|
||||
position: relative; }
|
||||
|
||||
.fa-li {
|
||||
left: calc(var(--fa-li-width, 2em) * -1);
|
||||
left: calc(-1 * var(--fa-li-width, 2em));
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: var(--fa-li-width, 2em);
|
||||
@@ -129,118 +129,71 @@
|
||||
margin-left: var(--fa-pull-margin, 0.3em); }
|
||||
|
||||
.fa-beat {
|
||||
-webkit-animation-name: fa-beat;
|
||||
animation-name: fa-beat;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
animation-name: fa-beat;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
|
||||
.fa-bounce {
|
||||
-webkit-animation-name: fa-bounce;
|
||||
animation-name: fa-bounce;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
|
||||
animation-name: fa-bounce;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
|
||||
|
||||
.fa-fade {
|
||||
-webkit-animation-name: fa-fade;
|
||||
animation-name: fa-fade;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
animation-name: fa-fade;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
|
||||
.fa-beat-fade {
|
||||
-webkit-animation-name: fa-beat-fade;
|
||||
animation-name: fa-beat-fade;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
animation-name: fa-beat-fade;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
|
||||
.fa-flip {
|
||||
-webkit-animation-name: fa-flip;
|
||||
animation-name: fa-flip;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
animation-name: fa-flip;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
|
||||
.fa-shake {
|
||||
-webkit-animation-name: fa-shake;
|
||||
animation-name: fa-shake;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
animation-name: fa-shake;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
|
||||
.fa-spin {
|
||||
-webkit-animation-name: fa-spin;
|
||||
animation-name: fa-spin;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 2s);
|
||||
animation-duration: var(--fa-animation-duration, 2s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
animation-name: fa-spin;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 2s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
|
||||
.fa-spin-reverse {
|
||||
--fa-animation-direction: reverse; }
|
||||
|
||||
.fa-pulse,
|
||||
.fa-spin-pulse {
|
||||
-webkit-animation-name: fa-spin;
|
||||
animation-name: fa-spin;
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, steps(8));
|
||||
animation-timing-function: var(--fa-animation-timing, steps(8)); }
|
||||
animation-name: fa-spin;
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, steps(8)); }
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.fa-beat,
|
||||
@@ -252,219 +205,97 @@
|
||||
.fa-shake,
|
||||
.fa-spin,
|
||||
.fa-spin-pulse {
|
||||
-webkit-animation-delay: -1ms;
|
||||
animation-delay: -1ms;
|
||||
-webkit-animation-duration: 1ms;
|
||||
animation-duration: 1ms;
|
||||
-webkit-animation-iteration-count: 1;
|
||||
animation-iteration-count: 1;
|
||||
-webkit-transition-delay: 0s;
|
||||
transition-delay: 0s;
|
||||
-webkit-transition-duration: 0s;
|
||||
transition-duration: 0s; } }
|
||||
|
||||
@-webkit-keyframes fa-beat {
|
||||
0%, 90% {
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
45% {
|
||||
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
animation-delay: -1ms;
|
||||
animation-duration: 1ms;
|
||||
animation-iteration-count: 1;
|
||||
transition-delay: 0s;
|
||||
transition-duration: 0s; } }
|
||||
|
||||
@keyframes fa-beat {
|
||||
0%, 90% {
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
transform: scale(1); }
|
||||
45% {
|
||||
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
|
||||
@-webkit-keyframes fa-bounce {
|
||||
0% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
10% {
|
||||
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
30% {
|
||||
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
50% {
|
||||
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
57% {
|
||||
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
64% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
100% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
|
||||
@keyframes fa-bounce {
|
||||
0% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
10% {
|
||||
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
30% {
|
||||
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
50% {
|
||||
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
57% {
|
||||
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
64% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
100% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
|
||||
@-webkit-keyframes fa-fade {
|
||||
50% {
|
||||
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
|
||||
@keyframes fa-fade {
|
||||
50% {
|
||||
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||
|
||||
@-webkit-keyframes fa-beat-fade {
|
||||
0%, 100% {
|
||||
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
50% {
|
||||
opacity: 1;
|
||||
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@keyframes fa-beat-fade {
|
||||
0%, 100% {
|
||||
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
transform: scale(1); }
|
||||
50% {
|
||||
opacity: 1;
|
||||
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@-webkit-keyframes fa-flip {
|
||||
50% {
|
||||
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@keyframes fa-flip {
|
||||
50% {
|
||||
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
|
||||
@-webkit-keyframes fa-shake {
|
||||
0% {
|
||||
-webkit-transform: rotate(-15deg);
|
||||
transform: rotate(-15deg); }
|
||||
4% {
|
||||
-webkit-transform: rotate(15deg);
|
||||
transform: rotate(15deg); }
|
||||
8%, 24% {
|
||||
-webkit-transform: rotate(-18deg);
|
||||
transform: rotate(-18deg); }
|
||||
12%, 28% {
|
||||
-webkit-transform: rotate(18deg);
|
||||
transform: rotate(18deg); }
|
||||
16% {
|
||||
-webkit-transform: rotate(-22deg);
|
||||
transform: rotate(-22deg); }
|
||||
20% {
|
||||
-webkit-transform: rotate(22deg);
|
||||
transform: rotate(22deg); }
|
||||
32% {
|
||||
-webkit-transform: rotate(-12deg);
|
||||
transform: rotate(-12deg); }
|
||||
36% {
|
||||
-webkit-transform: rotate(12deg);
|
||||
transform: rotate(12deg); }
|
||||
40%, 100% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); } }
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
|
||||
@keyframes fa-shake {
|
||||
0% {
|
||||
-webkit-transform: rotate(-15deg);
|
||||
transform: rotate(-15deg); }
|
||||
transform: rotate(-15deg); }
|
||||
4% {
|
||||
-webkit-transform: rotate(15deg);
|
||||
transform: rotate(15deg); }
|
||||
transform: rotate(15deg); }
|
||||
8%, 24% {
|
||||
-webkit-transform: rotate(-18deg);
|
||||
transform: rotate(-18deg); }
|
||||
transform: rotate(-18deg); }
|
||||
12%, 28% {
|
||||
-webkit-transform: rotate(18deg);
|
||||
transform: rotate(18deg); }
|
||||
transform: rotate(18deg); }
|
||||
16% {
|
||||
-webkit-transform: rotate(-22deg);
|
||||
transform: rotate(-22deg); }
|
||||
transform: rotate(-22deg); }
|
||||
20% {
|
||||
-webkit-transform: rotate(22deg);
|
||||
transform: rotate(22deg); }
|
||||
transform: rotate(22deg); }
|
||||
32% {
|
||||
-webkit-transform: rotate(-12deg);
|
||||
transform: rotate(-12deg); }
|
||||
transform: rotate(-12deg); }
|
||||
36% {
|
||||
-webkit-transform: rotate(12deg);
|
||||
transform: rotate(12deg); }
|
||||
transform: rotate(12deg); }
|
||||
40%, 100% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); } }
|
||||
|
||||
@-webkit-keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); } }
|
||||
transform: rotate(0deg); } }
|
||||
|
||||
@keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); }
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); } }
|
||||
transform: rotate(360deg); } }
|
||||
|
||||
.fa-rotate-90 {
|
||||
-webkit-transform: rotate(90deg);
|
||||
transform: rotate(90deg); }
|
||||
transform: rotate(90deg); }
|
||||
|
||||
.fa-rotate-180 {
|
||||
-webkit-transform: rotate(180deg);
|
||||
transform: rotate(180deg); }
|
||||
transform: rotate(180deg); }
|
||||
|
||||
.fa-rotate-270 {
|
||||
-webkit-transform: rotate(270deg);
|
||||
transform: rotate(270deg); }
|
||||
transform: rotate(270deg); }
|
||||
|
||||
.fa-flip-horizontal {
|
||||
-webkit-transform: scale(-1, 1);
|
||||
transform: scale(-1, 1); }
|
||||
transform: scale(-1, 1); }
|
||||
|
||||
.fa-flip-vertical {
|
||||
-webkit-transform: scale(1, -1);
|
||||
transform: scale(1, -1); }
|
||||
transform: scale(1, -1); }
|
||||
|
||||
.fa-flip-both,
|
||||
.fa-flip-horizontal.fa-flip-vertical {
|
||||
-webkit-transform: scale(-1, -1);
|
||||
transform: scale(-1, -1); }
|
||||
transform: scale(-1, -1); }
|
||||
|
||||
.fa-rotate-by {
|
||||
-webkit-transform: rotate(var(--fa-rotate-angle, none));
|
||||
transform: rotate(var(--fa-rotate-angle, none)); }
|
||||
transform: rotate(var(--fa-rotate-angle, 0)); }
|
||||
|
||||
.fa-stack {
|
||||
display: inline-block;
|
||||
@@ -1892,6 +1723,12 @@ readers do not read off random characters that represent icons */
|
||||
.fa-passport::before {
|
||||
content: "\f5ab"; }
|
||||
|
||||
.fa-thumbtack-slash::before {
|
||||
content: "\e68f"; }
|
||||
|
||||
.fa-thumb-tack-slash::before {
|
||||
content: "\e68f"; }
|
||||
|
||||
.fa-heart-pulse::before {
|
||||
content: "\f21e"; }
|
||||
|
||||
@@ -2768,6 +2605,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-italic::before {
|
||||
content: "\f033"; }
|
||||
|
||||
.fa-table-cells-column-lock::before {
|
||||
content: "\e678"; }
|
||||
|
||||
.fa-church::before {
|
||||
content: "\f51d"; }
|
||||
|
||||
@@ -4940,6 +4780,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-font::before {
|
||||
content: "\f031"; }
|
||||
|
||||
.fa-table-cells-row-lock::before {
|
||||
content: "\e67a"; }
|
||||
|
||||
.fa-rupiah-sign::before {
|
||||
content: "\e23d"; }
|
||||
|
||||
@@ -6197,6 +6040,9 @@ readers do not read off random characters that represent icons */
|
||||
.fa-bone::before {
|
||||
content: "\f5d7"; }
|
||||
|
||||
.fa-table-cells-row-unlock::before {
|
||||
content: "\e691"; }
|
||||
|
||||
.fa-user-injured::before {
|
||||
content: "\f728"; }
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:root, :host {
|
||||
--fa-style-family-classic: 'Font Awesome 6 Free';
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:root, :host {
|
||||
--fa-style-family-classic: 'Font Awesome 6 Free';
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}
|
||||
+104
-285
@@ -1,19 +1,20 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
:root, :host {
|
||||
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Solid';
|
||||
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Regular';
|
||||
--fa-font-light: normal 300 1em/1 'Font Awesome 6 Light';
|
||||
--fa-font-thin: normal 100 1em/1 'Font Awesome 6 Thin';
|
||||
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free';
|
||||
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free';
|
||||
--fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro';
|
||||
--fa-font-thin: normal 100 1em/1 'Font Awesome 6 Pro';
|
||||
--fa-font-duotone: normal 900 1em/1 'Font Awesome 6 Duotone';
|
||||
--fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands';
|
||||
--fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-sharp-regular: normal 400 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-sharp-light: normal 300 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-sharp-thin: normal 100 1em/1 'Font Awesome 6 Sharp';
|
||||
--fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; }
|
||||
--fa-font-sharp-duotone-solid: normal 900 1em/1 'Font Awesome 6 Sharp Duotone'; }
|
||||
|
||||
svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
|
||||
overflow: visible;
|
||||
@@ -69,16 +70,13 @@ svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
|
||||
vertical-align: -.125em;
|
||||
width: 1em; }
|
||||
.fa-layers svg.svg-inline--fa {
|
||||
-webkit-transform-origin: center center;
|
||||
transform-origin: center center; }
|
||||
transform-origin: center center; }
|
||||
|
||||
.fa-layers-text {
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
-webkit-transform: translate(-50%, -50%);
|
||||
transform: translate(-50%, -50%);
|
||||
-webkit-transform-origin: center center;
|
||||
transform-origin: center center; }
|
||||
transform: translate(-50%, -50%);
|
||||
transform-origin: center center; }
|
||||
|
||||
.fa-layers-counter {
|
||||
background-color: var(--fa-counter-background-color, #ff253a);
|
||||
@@ -93,46 +91,36 @@ svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
|
||||
right: var(--fa-right, 0);
|
||||
text-overflow: ellipsis;
|
||||
top: var(--fa-top, 0);
|
||||
-webkit-transform: scale(var(--fa-counter-scale, 0.25));
|
||||
transform: scale(var(--fa-counter-scale, 0.25));
|
||||
-webkit-transform-origin: top right;
|
||||
transform-origin: top right; }
|
||||
transform: scale(var(--fa-counter-scale, 0.25));
|
||||
transform-origin: top right; }
|
||||
|
||||
.fa-layers-bottom-right {
|
||||
bottom: var(--fa-bottom, 0);
|
||||
right: var(--fa-right, 0);
|
||||
top: auto;
|
||||
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
-webkit-transform-origin: bottom right;
|
||||
transform-origin: bottom right; }
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform-origin: bottom right; }
|
||||
|
||||
.fa-layers-bottom-left {
|
||||
bottom: var(--fa-bottom, 0);
|
||||
left: var(--fa-left, 0);
|
||||
right: auto;
|
||||
top: auto;
|
||||
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
-webkit-transform-origin: bottom left;
|
||||
transform-origin: bottom left; }
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform-origin: bottom left; }
|
||||
|
||||
.fa-layers-top-right {
|
||||
top: var(--fa-top, 0);
|
||||
right: var(--fa-right, 0);
|
||||
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
-webkit-transform-origin: top right;
|
||||
transform-origin: top right; }
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform-origin: top right; }
|
||||
|
||||
.fa-layers-top-left {
|
||||
left: var(--fa-left, 0);
|
||||
right: auto;
|
||||
top: var(--fa-top, 0);
|
||||
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
-webkit-transform-origin: top left;
|
||||
transform-origin: top left; }
|
||||
transform: scale(var(--fa-layers-scale, 0.25));
|
||||
transform-origin: top left; }
|
||||
|
||||
.fa-1x {
|
||||
font-size: 1em; }
|
||||
@@ -206,7 +194,7 @@ svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
|
||||
position: relative; }
|
||||
|
||||
.fa-li {
|
||||
left: calc(var(--fa-li-width, 2em) * -1);
|
||||
left: calc(-1 * var(--fa-li-width, 2em));
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: var(--fa-li-width, 2em);
|
||||
@@ -228,118 +216,71 @@ svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
|
||||
margin-left: var(--fa-pull-margin, 0.3em); }
|
||||
|
||||
.fa-beat {
|
||||
-webkit-animation-name: fa-beat;
|
||||
animation-name: fa-beat;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
animation-name: fa-beat;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
|
||||
.fa-bounce {
|
||||
-webkit-animation-name: fa-bounce;
|
||||
animation-name: fa-bounce;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
|
||||
animation-name: fa-bounce;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
|
||||
|
||||
.fa-fade {
|
||||
-webkit-animation-name: fa-fade;
|
||||
animation-name: fa-fade;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
animation-name: fa-fade;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
|
||||
.fa-beat-fade {
|
||||
-webkit-animation-name: fa-beat-fade;
|
||||
animation-name: fa-beat-fade;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
animation-name: fa-beat-fade;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
|
||||
|
||||
.fa-flip {
|
||||
-webkit-animation-name: fa-flip;
|
||||
animation-name: fa-flip;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
animation-name: fa-flip;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
|
||||
|
||||
.fa-shake {
|
||||
-webkit-animation-name: fa-shake;
|
||||
animation-name: fa-shake;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
animation-name: fa-shake;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
|
||||
.fa-spin {
|
||||
-webkit-animation-name: fa-spin;
|
||||
animation-name: fa-spin;
|
||||
-webkit-animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 2s);
|
||||
animation-duration: var(--fa-animation-duration, 2s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
animation-name: fa-spin;
|
||||
animation-delay: var(--fa-animation-delay, 0s);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 2s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, linear); }
|
||||
|
||||
.fa-spin-reverse {
|
||||
--fa-animation-direction: reverse; }
|
||||
|
||||
.fa-pulse,
|
||||
.fa-spin-pulse {
|
||||
-webkit-animation-name: fa-spin;
|
||||
animation-name: fa-spin;
|
||||
-webkit-animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
-webkit-animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
-webkit-animation-timing-function: var(--fa-animation-timing, steps(8));
|
||||
animation-timing-function: var(--fa-animation-timing, steps(8)); }
|
||||
animation-name: fa-spin;
|
||||
animation-direction: var(--fa-animation-direction, normal);
|
||||
animation-duration: var(--fa-animation-duration, 1s);
|
||||
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
|
||||
animation-timing-function: var(--fa-animation-timing, steps(8)); }
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.fa-beat,
|
||||
@@ -351,219 +292,97 @@ svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
|
||||
.fa-shake,
|
||||
.fa-spin,
|
||||
.fa-spin-pulse {
|
||||
-webkit-animation-delay: -1ms;
|
||||
animation-delay: -1ms;
|
||||
-webkit-animation-duration: 1ms;
|
||||
animation-duration: 1ms;
|
||||
-webkit-animation-iteration-count: 1;
|
||||
animation-iteration-count: 1;
|
||||
-webkit-transition-delay: 0s;
|
||||
transition-delay: 0s;
|
||||
-webkit-transition-duration: 0s;
|
||||
transition-duration: 0s; } }
|
||||
|
||||
@-webkit-keyframes fa-beat {
|
||||
0%, 90% {
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
45% {
|
||||
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
animation-delay: -1ms;
|
||||
animation-duration: 1ms;
|
||||
animation-iteration-count: 1;
|
||||
transition-delay: 0s;
|
||||
transition-duration: 0s; } }
|
||||
|
||||
@keyframes fa-beat {
|
||||
0%, 90% {
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
transform: scale(1); }
|
||||
45% {
|
||||
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
|
||||
@-webkit-keyframes fa-bounce {
|
||||
0% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
10% {
|
||||
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
30% {
|
||||
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
50% {
|
||||
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
57% {
|
||||
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
64% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
100% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
transform: scale(var(--fa-beat-scale, 1.25)); } }
|
||||
|
||||
@keyframes fa-bounce {
|
||||
0% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
10% {
|
||||
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
|
||||
30% {
|
||||
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
|
||||
50% {
|
||||
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
|
||||
57% {
|
||||
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
|
||||
64% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
transform: scale(1, 1) translateY(0); }
|
||||
100% {
|
||||
-webkit-transform: scale(1, 1) translateY(0);
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
|
||||
@-webkit-keyframes fa-fade {
|
||||
50% {
|
||||
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||
transform: scale(1, 1) translateY(0); } }
|
||||
|
||||
@keyframes fa-fade {
|
||||
50% {
|
||||
opacity: var(--fa-fade-opacity, 0.4); } }
|
||||
|
||||
@-webkit-keyframes fa-beat-fade {
|
||||
0%, 100% {
|
||||
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
50% {
|
||||
opacity: 1;
|
||||
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@keyframes fa-beat-fade {
|
||||
0%, 100% {
|
||||
opacity: var(--fa-beat-fade-opacity, 0.4);
|
||||
-webkit-transform: scale(1);
|
||||
transform: scale(1); }
|
||||
transform: scale(1); }
|
||||
50% {
|
||||
opacity: 1;
|
||||
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@-webkit-keyframes fa-flip {
|
||||
50% {
|
||||
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
|
||||
|
||||
@keyframes fa-flip {
|
||||
50% {
|
||||
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
|
||||
@-webkit-keyframes fa-shake {
|
||||
0% {
|
||||
-webkit-transform: rotate(-15deg);
|
||||
transform: rotate(-15deg); }
|
||||
4% {
|
||||
-webkit-transform: rotate(15deg);
|
||||
transform: rotate(15deg); }
|
||||
8%, 24% {
|
||||
-webkit-transform: rotate(-18deg);
|
||||
transform: rotate(-18deg); }
|
||||
12%, 28% {
|
||||
-webkit-transform: rotate(18deg);
|
||||
transform: rotate(18deg); }
|
||||
16% {
|
||||
-webkit-transform: rotate(-22deg);
|
||||
transform: rotate(-22deg); }
|
||||
20% {
|
||||
-webkit-transform: rotate(22deg);
|
||||
transform: rotate(22deg); }
|
||||
32% {
|
||||
-webkit-transform: rotate(-12deg);
|
||||
transform: rotate(-12deg); }
|
||||
36% {
|
||||
-webkit-transform: rotate(12deg);
|
||||
transform: rotate(12deg); }
|
||||
40%, 100% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); } }
|
||||
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
|
||||
|
||||
@keyframes fa-shake {
|
||||
0% {
|
||||
-webkit-transform: rotate(-15deg);
|
||||
transform: rotate(-15deg); }
|
||||
transform: rotate(-15deg); }
|
||||
4% {
|
||||
-webkit-transform: rotate(15deg);
|
||||
transform: rotate(15deg); }
|
||||
transform: rotate(15deg); }
|
||||
8%, 24% {
|
||||
-webkit-transform: rotate(-18deg);
|
||||
transform: rotate(-18deg); }
|
||||
transform: rotate(-18deg); }
|
||||
12%, 28% {
|
||||
-webkit-transform: rotate(18deg);
|
||||
transform: rotate(18deg); }
|
||||
transform: rotate(18deg); }
|
||||
16% {
|
||||
-webkit-transform: rotate(-22deg);
|
||||
transform: rotate(-22deg); }
|
||||
transform: rotate(-22deg); }
|
||||
20% {
|
||||
-webkit-transform: rotate(22deg);
|
||||
transform: rotate(22deg); }
|
||||
transform: rotate(22deg); }
|
||||
32% {
|
||||
-webkit-transform: rotate(-12deg);
|
||||
transform: rotate(-12deg); }
|
||||
transform: rotate(-12deg); }
|
||||
36% {
|
||||
-webkit-transform: rotate(12deg);
|
||||
transform: rotate(12deg); }
|
||||
transform: rotate(12deg); }
|
||||
40%, 100% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); } }
|
||||
|
||||
@-webkit-keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); } }
|
||||
transform: rotate(0deg); } }
|
||||
|
||||
@keyframes fa-spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg); }
|
||||
transform: rotate(0deg); }
|
||||
100% {
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); } }
|
||||
transform: rotate(360deg); } }
|
||||
|
||||
.fa-rotate-90 {
|
||||
-webkit-transform: rotate(90deg);
|
||||
transform: rotate(90deg); }
|
||||
transform: rotate(90deg); }
|
||||
|
||||
.fa-rotate-180 {
|
||||
-webkit-transform: rotate(180deg);
|
||||
transform: rotate(180deg); }
|
||||
transform: rotate(180deg); }
|
||||
|
||||
.fa-rotate-270 {
|
||||
-webkit-transform: rotate(270deg);
|
||||
transform: rotate(270deg); }
|
||||
transform: rotate(270deg); }
|
||||
|
||||
.fa-flip-horizontal {
|
||||
-webkit-transform: scale(-1, 1);
|
||||
transform: scale(-1, 1); }
|
||||
transform: scale(-1, 1); }
|
||||
|
||||
.fa-flip-vertical {
|
||||
-webkit-transform: scale(1, -1);
|
||||
transform: scale(1, -1); }
|
||||
transform: scale(1, -1); }
|
||||
|
||||
.fa-flip-both,
|
||||
.fa-flip-horizontal.fa-flip-vertical {
|
||||
-webkit-transform: scale(-1, -1);
|
||||
transform: scale(-1, -1); }
|
||||
transform: scale(-1, -1); }
|
||||
|
||||
.fa-rotate-by {
|
||||
-webkit-transform: rotate(var(--fa-rotate-angle, none));
|
||||
transform: rotate(var(--fa-rotate-angle, none)); }
|
||||
transform: rotate(var(--fa-rotate-angle, 0)); }
|
||||
|
||||
.fa-stack {
|
||||
display: inline-block;
|
||||
|
||||
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'FontAwesome';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
.fa.fa-glass:before {
|
||||
content: "\f000"; }
|
||||
|
||||
+2
-2
File diff suppressed because one or more lines are too long
+2
-2
@@ -1,7 +1,7 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Brands';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2024 Fonticons, Inc.
|
||||
*/
|
||||
@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}
|
||||
+3262
-3244
File diff suppressed because one or more lines are too long
+3
-3
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user