Merge branch 'Release/Update202506_01'

This commit is contained in:
Samuele Locatelli
2025-07-02 17:52:05 +02:00
156 changed files with 11292 additions and 9897 deletions
+1 -1
View File
@@ -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);
}
+88 -79
View File
@@ -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">&nbsp;</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">&nbsp;</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
{
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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;
+1 -1
View File
@@ -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 -1
View File
@@ -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
View File
@@ -1 +1 @@
6.16.2506.1215
6.16.2507.113
+1 -1
View File
@@ -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>
+72 -55
View File
@@ -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
}
+3 -3
View File
@@ -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);
+177 -142
View File
@@ -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>
+2 -2
View File
@@ -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))
+72 -1
View File
@@ -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>
+4 -4
View File
@@ -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))
+5 -5
View File
@@ -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>
+63 -48
View File
@@ -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>
+3 -5
View File
@@ -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))
+160
View File
@@ -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
}
}
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+8 -2
View File
@@ -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;
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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>
+29
View File
@@ -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
}
}
+1 -1
View File
@@ -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
}
+4 -2
View File
@@ -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);
+2 -2
View File
@@ -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);
+2 -2
View File
@@ -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();
+172 -1
View File
@@ -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--&gt; 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 --&gt; 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>
+184
View File
@@ -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
}
}
+11 -7
View File
@@ -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
+4 -4
View File
@@ -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
+4 -2
View File
@@ -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");
+10 -1
View File
@@ -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();
+8 -8
View File
@@ -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");
+95 -26
View File
@@ -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--&gt; 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--&gt; 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 --&gt; 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
+129
View File
@@ -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;
}
}
}
+1 -1
View File
@@ -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();
+4 -4
View File
@@ -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 -1
View File
@@ -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
View File
@@ -1 +1 @@
6.16.2504.1617
6.16.2506.3014
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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; }
+1 -1
View File
@@ -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
{
+1 -1
View File
@@ -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
{
+1 -1
View File
@@ -5,7 +5,7 @@
@inject IConfiguration Configuration
@inject AppAuthService DataService
@inject MessageService MService
@inject LMessageService MService
@inject LicenseService LicServ
@if (authOk())
+1 -1
View File
@@ -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 -3
View File
@@ -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" />
+1 -1
View File
@@ -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&nbsp;EgalWare &nbsp;<img width="24" class="img-fluid" src="img/LogoEgalware.svg" /></a>
</div>
+1 -1
View File
@@ -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
+21
View File
@@ -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>
+48
View File
@@ -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(" ", "&nbsp;&nbsp;"));
}
private int numRow = 40;
#endregion Protected Methods
}
}
+1 -1
View File
@@ -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; }
+2 -2
View File
@@ -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&nbsp;EgalWare &nbsp;<img width="24" class="img-fluid" src="img/LogoEgalware.svg" /></a>
</div>
+1 -1
View File
@@ -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; }
+177
View File
@@ -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&nbsp;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>
+458
View File
@@ -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
}
}
+2 -2
View File
@@ -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&nbsp;EgalWare <img width="24" class="img-fluid" src="img/LogoEgalware.svg" /></a>
</div>
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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; }
+1 -1
View File
@@ -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 -1
View File
@@ -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
View File
@@ -1 +1 @@
6.16.2505.2814
6.16.2507.0111
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -3,7 +3,7 @@
@using MP.Land.Data
@using MP.Land.Components
@inject MessageService AppMService
@inject LMessageService AppMService
@inject LicenseService LicServ
@implements IDisposable
+9
View File
@@ -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
View File
@@ -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();
+5 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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"; }
File diff suppressed because one or more lines are too long
+29 -2
View File
@@ -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"; }
File diff suppressed because one or more lines are too long
+106 -260
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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';
+2 -2
View File
@@ -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
View File
@@ -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"; }
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -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';
+2 -2
View File
@@ -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")}
File diff suppressed because one or more lines are too long
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