From 7cdcf74d1bcdde28d178c5cae0037a95b8cdbb40 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Mon, 4 Aug 2025 17:31:41 +0200 Subject: [PATCH] Update pagina test scratch con comunicazione IN/OUT verso API calcolo --- EgwCoreLib.Lux.Core/Constants.cs | 29 ++++ EgwCoreLib.Lux.Core/PubSubEventArgs.cs | 28 ++++ .../Controllers/LuxController.cs | 14 +- EgwCoreLib.Lux.Data/Services/BaseServ.cs | 31 +++- .../Services/DataLayerServices.cs | 4 +- .../Services/ImageCacheService.cs | 2 +- EgwCoreLib.Lux.Data/Services/MessagePipe.cs | 154 ++++++++++++++++++ Lux.API/Lux.API.csproj | 2 +- Lux.UI/Components/Pages/Scratch.razor | 22 ++- Lux.UI/Components/Pages/Scratch.razor.cs | 125 +++++++++----- Lux.UI/Lux.UI.csproj | 2 +- Lux.UI/Program.cs | 3 + Lux.UI/wwwroot/css/site.css | 9 + Lux.UI/wwwroot/css/site.less | 12 ++ Lux.UI/wwwroot/css/site.min.css | 2 +- Resources/ChangeLog.html | 2 +- Resources/VersNum.txt | 2 +- Resources/manifest.xml | 2 +- 18 files changed, 372 insertions(+), 73 deletions(-) create mode 100644 EgwCoreLib.Lux.Core/Constants.cs create mode 100644 EgwCoreLib.Lux.Core/PubSubEventArgs.cs create mode 100644 EgwCoreLib.Lux.Data/Services/MessagePipe.cs diff --git a/EgwCoreLib.Lux.Core/Constants.cs b/EgwCoreLib.Lux.Core/Constants.cs new file mode 100644 index 00000000..06cf482d --- /dev/null +++ b/EgwCoreLib.Lux.Core/Constants.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +//// +//// This is here so CodeMaid doesn't reorganize this document +//// +namespace EgwCoreLib.Lux.Core +{ + /// + /// Configurazione costanti applicative + /// + public class Constants + { + + // dati conf REDIS Cache + public static readonly string BASE_HASH = "LUX"; +#if false + public static readonly string BASE_PATH = Directory.GetCurrentDirectory(); + + public static readonly string CALC_REQ_DONE = $"{BASE_HASH}:CalcRequests:Completed"; + // REDIS Channels messaggi x QueueMan (verso UI/srv) + public static readonly string CALC_REQ_QUEUE = $"CalcRequest"; +#endif + public static readonly string CALC_DONE_QUEUE = $"CalcCompleted"; + } +} diff --git a/EgwCoreLib.Lux.Core/PubSubEventArgs.cs b/EgwCoreLib.Lux.Core/PubSubEventArgs.cs new file mode 100644 index 00000000..a620d056 --- /dev/null +++ b/EgwCoreLib.Lux.Core/PubSubEventArgs.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EgwCoreLib.Lux.Core +{ + public class PubSubEventArgs : EventArgs + { + #region Public Constructors + + public PubSubEventArgs(string uid, string messaggio) + { + this.msgUid = uid; + this.newMessage = messaggio; + } + + #endregion Public Constructors + + #region Public Properties + + public string newMessage { get; set; } = ""; + public string msgUid { get; set; } = ""; + + #endregion Public Properties + } +} \ No newline at end of file diff --git a/EgwCoreLib.Lux.Data/Controllers/LuxController.cs b/EgwCoreLib.Lux.Data/Controllers/LuxController.cs index 48d55960..5bbf5584 100644 --- a/EgwCoreLib.Lux.Data/Controllers/LuxController.cs +++ b/EgwCoreLib.Lux.Data/Controllers/LuxController.cs @@ -24,7 +24,7 @@ namespace EgwCoreLib.Lux.Data.Controllers public List CustomersGetAll() { List dbResult = new List(); - //using (DataLayerContext dbCtx = new DataLayerContext(_configuration)) + //using (DataLayerContext dbCtx = new DataLayerContext(configuration)) using (DataLayerContext dbCtx = new DataLayerContext()) { try @@ -48,7 +48,7 @@ namespace EgwCoreLib.Lux.Data.Controllers public List DealersGetAll() { List dbResult = new List(); - //using (DataLayerContext dbCtx = new DataLayerContext(_configuration)) + //using (DataLayerContext dbCtx = new DataLayerContext(configuration)) using (DataLayerContext dbCtx = new DataLayerContext()) { try @@ -68,7 +68,7 @@ namespace EgwCoreLib.Lux.Data.Controllers public List ItemGetAll() { List dbResult = new List(); - //using (DataLayerContext dbCtx = new DataLayerContext(_configuration)) + //using (DataLayerContext dbCtx = new DataLayerContext(configuration)) using (DataLayerContext dbCtx = new DataLayerContext()) { try @@ -88,7 +88,7 @@ namespace EgwCoreLib.Lux.Data.Controllers public List ItemGetSearch(string term) { List dbResult = new List(); - //using (DataLayerContext dbCtx = new DataLayerContext(_configuration)) + //using (DataLayerContext dbCtx = new DataLayerContext(configuration)) using (DataLayerContext dbCtx = new DataLayerContext()) { try @@ -109,7 +109,7 @@ namespace EgwCoreLib.Lux.Data.Controllers public bool ItemUpsert(ItemModel newRec) { bool answ = false; - //using (DataLayerContext dbCtx = new DataLayerContext(_configuration)) + //using (DataLayerContext dbCtx = new DataLayerContext(configuration)) using (DataLayerContext dbCtx = new DataLayerContext()) { try @@ -153,7 +153,7 @@ namespace EgwCoreLib.Lux.Data.Controllers public List OfferGetAll() { List dbResult = new List(); - //using (DataLayerContext dbCtx = new DataLayerContext(_configuration)) + //using (DataLayerContext dbCtx = new DataLayerContext(configuration)) using (DataLayerContext dbCtx = new DataLayerContext()) { try @@ -180,7 +180,7 @@ namespace EgwCoreLib.Lux.Data.Controllers public List OfferRowGetByOffer(int OfferID) { List dbResult = new List(); - //using (DataLayerContext dbCtx = new DataLayerContext(_configuration)) + //using (DataLayerContext dbCtx = new DataLayerContext(configuration)) using (DataLayerContext dbCtx = new DataLayerContext()) { try diff --git a/EgwCoreLib.Lux.Data/Services/BaseServ.cs b/EgwCoreLib.Lux.Data/Services/BaseServ.cs index 4823706f..1cb1d8c8 100644 --- a/EgwCoreLib.Lux.Data/Services/BaseServ.cs +++ b/EgwCoreLib.Lux.Data/Services/BaseServ.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; +using Microsoft.VisualBasic; using Newtonsoft.Json; using NLog; using StackExchange.Redis; @@ -16,34 +17,50 @@ namespace EgwCoreLib.Lux.Data.Services { #region Public Constructors - public BaseServ(IConfiguration configuration) + public BaseServ(IConfiguration Configuration, IConnectionMultiplexer RedisConn) { - _configuration = configuration; + configuration = Configuration; // setup componenti REDIS - redisConn = ConnectionMultiplexer.Connect(_configuration.GetConnectionString("Redis")??"localhost"); +#if false + redisConn = ConnectionMultiplexer.Connect(_configuration.GetConnectionString("Redis") ?? "localhost"); +#endif + redisConn = RedisConn; redisDb = redisConn.GetDatabase(); + svgChannel = configuration.GetValue("ServerConf:SvgChannel") ?? "svg:img"; + // aggiungo ricerca generica ":*" al channel... + if (!svgChannel.EndsWith(":*")) + { + svgChannel += ":*"; + } + // 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 + // conf message pipe + CalcDonePipe = new MessagePipe(redisConn, svgChannel); } #endregion Public Constructors #region Protected Fields - protected static IConfiguration _configuration = null!; + private string svgChannel = ""; + protected static IConfiguration configuration = null!; protected JsonSerializerSettings? JSSettings; + /// + /// Message pipe esecuzione elaborazione EgwCalc >> UI + /// + public MessagePipe CalcDonePipe { get; set; } = null!; + /// /// Oggetto per connessione a REDIS /// - protected ConnectionMultiplexer redisConn = null!; + protected IConnectionMultiplexer redisConn = null!; //ISubscriber sub = redis.GetSubscriber(); /// diff --git a/EgwCoreLib.Lux.Data/Services/DataLayerServices.cs b/EgwCoreLib.Lux.Data/Services/DataLayerServices.cs index a3fa3bd1..fd8d723a 100644 --- a/EgwCoreLib.Lux.Data/Services/DataLayerServices.cs +++ b/EgwCoreLib.Lux.Data/Services/DataLayerServices.cs @@ -18,10 +18,10 @@ namespace EgwCoreLib.Lux.Data.Services { #region Public Constructors - public DataLayerServices(IConfiguration configuration) : base(configuration) + public DataLayerServices(IConfiguration configuration, IConnectionMultiplexer RedisConn) : base(configuration, RedisConn) { // conf DB - string connStr = _configuration.GetConnectionString("Lux.All"); + string connStr = BaseServ.configuration.GetConnectionString("Lux.All") ?? ""; if (string.IsNullOrEmpty(connStr)) { Log.Error("ConnString empty!"); diff --git a/EgwCoreLib.Lux.Data/Services/ImageCacheService.cs b/EgwCoreLib.Lux.Data/Services/ImageCacheService.cs index b6ce4113..fe91f4ff 100644 --- a/EgwCoreLib.Lux.Data/Services/ImageCacheService.cs +++ b/EgwCoreLib.Lux.Data/Services/ImageCacheService.cs @@ -15,7 +15,7 @@ namespace EgwCoreLib.Lux.Data.Services { #region Public Constructors - public ImageCacheService(IConfiguration config, IConfiguration configuration, IRedisService redisService) + public ImageCacheService(IConfiguration config, IRedisService redisService) { _config = config; _redisService = redisService; diff --git a/EgwCoreLib.Lux.Data/Services/MessagePipe.cs b/EgwCoreLib.Lux.Data/Services/MessagePipe.cs new file mode 100644 index 00000000..00eb4a12 --- /dev/null +++ b/EgwCoreLib.Lux.Data/Services/MessagePipe.cs @@ -0,0 +1,154 @@ +using EgwCoreLib.Lux.Core; +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 EgwCoreLib.Lux.Data.Services +{ + + public class MessagePipe : IDisposable + { + #region Public Constructors + + public MessagePipe(IConnectionMultiplexer redisConn, string channelName, bool enableLog = false) + { + _channel = channelName; + rChannel = new RedisChannel(_channel, RedisChannel.PatternMode.Pattern); + this.redisConn = redisConn; + redisDb = this.redisConn.GetDatabase(); + redisSub = this.redisConn.GetSubscriber(); + this.enableLog = enableLog; + // aggiungo sottoscrittore + setupSubscriber(); + } + + #endregion Public Constructors + + #region Public Events + + public event EventHandler EA_NewMessage = delegate { }; + + #endregion Public Events + + #region Public Methods + + public void Dispose() + { + redisDb = null; + redisSub = null; + } + + /// + /// Invio messaggio sul canale + salvataggio in cache REDIS + /// + /// Chiave REDIS x salvare valore + /// Messaggio serializzato da inviare + public bool saveAndSendMessage(string memKey, string message) + { + bool answ = false; + Stopwatch stopWatch = new Stopwatch(); + stopWatch.Start(); + + // invio notifica tramite il canale richiesto + answ = sendMessage(message); + if (redisDb != null) + { + redisDb.StringSetAsync(memKey, message); + } + stopWatch.Stop(); + TimeSpan ts = stopWatch.Elapsed; + if (numSent.ContainsKey(memKey)) + { + numSent[memKey]++; + } + else + { + numSent.Add(memKey, 1); + } + if (enableLog || numSent[memKey] > 30) + { + Log.Info($"saveAndSendMessage| mKey {memKey} x {numSent[memKey]} | {message.Length} size | {ts.TotalMilliseconds} ms"); + + numSent[memKey] = 0; + } + return answ; + } + + /// + /// Invio messaggio sul canale + /// + /// + /// + public bool sendMessage(string newMess) + { + bool answ = false; + if (!string.IsNullOrEmpty(_channel)) + { + var numCli = redisSub.Publish(rChannel, newMess); + answ = numCli > 0; + } + return answ; + } + + #endregion Public Methods + + #region Protected Fields + + protected static Logger Log = LogManager.GetCurrentClassLogger(); + + #endregion Protected Fields + + #region Private Fields + + /// + /// Nome Canale associato al gestore pipeline messaggi + /// + private string _channel = ""; + + private bool enableLog = false; + private Dictionary numSent = new Dictionary(); + + /// + /// Channel di comunicazione REDIS + /// + private RedisChannel rChannel; + + private IConnectionMultiplexer redisConn; + private IDatabase redisDb; + private ISubscriber redisSub; + + #endregion Private Fields + + #region Private Methods + + private void setupSubscriber() + { + redisSub.Subscribe(rChannel, (channel, message) => + { + if (enableLog) + { + Log.Trace($"req setup ch {channel} | {message}"); + } + // messaggio + PubSubEventArgs mea = new PubSubEventArgs($"{channel}", $"{message}"); + // se qualcuno ascolta sollevo evento nuovo valore... + if (EA_NewMessage != null) + { + EA_NewMessage(this, mea); + } + }); + if (enableLog) + { + Log.Info($"Subscribed {_channel}"); + } + } + + #endregion Private Methods + } + +} diff --git a/Lux.API/Lux.API.csproj b/Lux.API/Lux.API.csproj index a484e024..84d74f1f 100644 --- a/Lux.API/Lux.API.csproj +++ b/Lux.API/Lux.API.csproj @@ -4,7 +4,7 @@ net8.0 enable enable - 0.9.2508.0412 + 0.9.2508.0416 diff --git a/Lux.UI/Components/Pages/Scratch.razor b/Lux.UI/Components/Pages/Scratch.razor index 8789b29f..cbc2d89a 100644 --- a/Lux.UI/Components/Pages/Scratch.razor +++ b/Lux.UI/Components/Pages/Scratch.razor @@ -1,23 +1,27 @@ @page "/scratch" -

Scratch Test

- -
-
-
+
+
-
- +
+
- +
+
+ +
+
+ +
+
-
+
@outSvg
diff --git a/Lux.UI/Components/Pages/Scratch.razor.cs b/Lux.UI/Components/Pages/Scratch.razor.cs index c3ab8bd5..1ea2ac04 100644 --- a/Lux.UI/Components/Pages/Scratch.razor.cs +++ b/Lux.UI/Components/Pages/Scratch.razor.cs @@ -1,66 +1,109 @@ +using EgwCoreLib.Lux.Core; using EgwCoreLib.Lux.Data; using EgwCoreLib.Lux.Data.Services; using Microsoft.AspNetCore.Components; namespace Lux.UI.Components.Pages { - public partial class Scratch + public partial class Scratch : IDisposable { - private string windowUid = "TestWindow"; + #region Public Methods + + public void Dispose() + { + DLService.CalcDonePipe.EA_NewMessage -= CalcDonePipe_EA_NewMessage; + } + + #endregion Public Methods + + #region Protected Properties + + [Inject] + protected IConfiguration Config { get; set; } = null!; + + [Inject] + protected DataLayerServices DLService { get; set; } = null!; + + [Inject] + protected ImageCacheService ICService { get; set; } = null!; + + /// + /// Generazione componente SVG da mostrare + /// + protected MarkupString outSvg + { + get + { + // aggiunta gestione classe svg per posizionamento con costraints + var newSvg = currSvg.Replace("("ServerConf:Prog.ApiUrl") ?? ""; + calcTag = Config.GetValue("ServerConf:ImageCalcTag") ?? ""; + subChannel = Config.GetValue("ServerConf:SvgChannel") ?? ""; + DLService.CalcDonePipe.EA_NewMessage += CalcDonePipe_EA_NewMessage; + } + + protected void Reset() + { + currSvg = ""; + } + + protected async Task SendCalc() + { + // chiamo la chiamata POST alla API, che manda la richiesta via REDIS + await ICService.CallRestPost(apiUrl, $"{calcTag}/{windowUid}", demoJwd); + } + + #endregion Protected Methods + + #region Private Fields + + private string apiUrl = ""; + private string calcTag = ""; + private string currSvg = ""; + /// /// Demorichiesta jwd x fare test richiesta calcolo /// private string demoJwd = "{\r\n\"ProfilePath\":\"Profilo78\",\r\n\"AreaList\":[\r\n{\r\n\"Shape\":\"RECTANGLE\",\r\n\"DimensionList\":[\r\n{\r\n\"nIndex\":1,\r\n\"sName\":\"Width\",\r\n\"dValue\":1200.0\r\n},\r\n{\r\n\"nIndex\":2,\r\n\"sName\":\"Height\",\r\n\"dValue\":1500.0\r\n}\r\n],\r\n\"JointList\":[\r\n{\r\n\"nIndex\":1,\r\n\"JointType\":\"FULL_V\"\r\n},\r\n{\r\n\"nIndex\":2,\r\n\"JointType\":\"FULL_V\"\r\n},\r\n{\r\n\"nIndex\":3,\r\n\"JointType\":\"FULL_V\"\r\n},\r\n{\r\n\"nIndex\":4,\r\n\"JointType\":\"FULL_V\"\r\n}\r\n],\r\n\"BottomRail\":false,\r\n\"BottomRailQty\":0,\r\n\"AreaList\":[\r\n{\r\n\"bIsSashVertical\":true,\r\n\"SashList\":[\r\n{\r\n\"OpeningType\":\"TURNONLY_LEFT\",\r\n\"bHasHandle\":false,\r\n\"dDimension\":50.0\r\n},\r\n{\r\n\"OpeningType\":\"TILTTURN_RIGHT\",\r\n\"bHasHandle\":true,\r\n\"dDimension\":50.0\r\n}\r\n],\r\n\"SashType\":\"NULL\",\r\n\"JointList\":[\r\n{\r\n\"nIndex\":1,\r\n\"JointType\":\"FULL_V\"\r\n},\r\n{\r\n\"nIndex\":2,\r\n\"JointType\":\"FULL_V\"\r\n},\r\n{\r\n\"nIndex\":3,\r\n\"JointType\":\"FULL_V\"\r\n},\r\n{\r\n\"nIndex\":4,\r\n\"JointType\":\"FULL_V\"\r\n}\r\n],\r\n\"Hardware\":\"000000\",\r\n\"AreaList\":[\r\n{\r\n\"AreaList\":[\r\n{\r\n\"FillType\":\"GLASS\",\r\n\"AreaList\":[],\r\n\"AreaType\":\"FILL\"\r\n}\r\n],\r\n\"AreaType\":\"SPLITTED\"\r\n},\r\n{\r\n\"AreaList\":[\r\n{\r\n\"FillType\":\"GLASS\",\r\n\"AreaList\":[],\r\n\"AreaType\":\"FILL\"\r\n}\r\n],\r\n\"AreaType\":\"SPLITTED\"\r\n}\r\n],\r\n\"AreaType\":\"SASH\"\r\n}\r\n],\r\n\"AreaType\":\"FRAME\"\r\n}\r\n]\r\n}"; + private string subChannel = ""; + private string windowUid = "TestWindow"; - [Inject] - protected ImageCacheService ICService { get; set; } = null!; - + #endregion Private Fields +#if false [Inject] protected IRedisService RedServ { get; set; } = null!; +#endif - [Inject] - protected IConfiguration Config { get; set; } = null!; + #region Private Methods - private string apiUrl = ""; - private string calcTag = ""; - private string subChannel = ""; - private string currChannel = ""; - - - protected override Task OnInitializedAsync() + private async void CalcDonePipe_EA_NewMessage(object? sender, EventArgs e) { - apiUrl = Config.GetValue("ServerConf:Prog.ApiUrl") ?? ""; - calcTag = Config.GetValue("ServerConf:ImageCalcTag") ?? ""; - subChannel = Config.GetValue("ServerConf:SvgChannel") ?? ""; - RedServ.Subscribe($"{subChannel}:*", (ch, msg) => + // aggiorno visualizzazione + PubSubEventArgs currArgs = (PubSubEventArgs)e; + // conversione on-the-fly SVG da mostrare + if (!string.IsNullOrEmpty(currArgs.newMessage)) { - saveSvg($"{ch}", $"{msg}"); - }); - - return Task.CompletedTask; - } - - private void saveSvg(string channel, string newSvg) - { - // se è la mia immagine - if (channel.EndsWith(windowUid) || true) - { - currSvg = newSvg; + if (currArgs.msgUid.Equals($"{subChannel}:{windowUid}")) + { + currSvg = currArgs.newMessage; + } + await InvokeAsync(StateHasChanged); } + await Task.Delay(1); } - - protected async Task SendCalc() - { - await ICService.CallRestPost(apiUrl, $"{calcTag}/{windowUid}", demoJwd); - } - - - protected MarkupString outSvg { get; set; } = (MarkupString)""; - - private string currSvg = ""; - + #endregion Private Methods } } \ No newline at end of file diff --git a/Lux.UI/Lux.UI.csproj b/Lux.UI/Lux.UI.csproj index bfe18a94..1d831f3c 100644 --- a/Lux.UI/Lux.UI.csproj +++ b/Lux.UI/Lux.UI.csproj @@ -5,7 +5,7 @@ enable enable aspnet-Lux.UI-a758c101-a2f4-4e38-977d-1c4887dbbd50 - 0.9.2508.0412 + 0.9.2508.0417 diff --git a/Lux.UI/Program.cs b/Lux.UI/Program.cs index bfdf5006..07d870bc 100644 --- a/Lux.UI/Program.cs +++ b/Lux.UI/Program.cs @@ -64,6 +64,9 @@ builder.Services.AddSingleton(); // Aggiunta servizi specifici builder.Services.AddSingleton(); builder.Services.AddSingleton(); +#if false +builder.Services.AddSingleton(); +#endif var app = builder.Build(); diff --git a/Lux.UI/wwwroot/css/site.css b/Lux.UI/wwwroot/css/site.css index 71183def..eeba4d85 100644 --- a/Lux.UI/wwwroot/css/site.css +++ b/Lux.UI/wwwroot/css/site.css @@ -215,6 +215,15 @@ a, .blazor-error-boundary::after { content: "An error has occurred."; } +/* gestione SVG responsive */ +.responsive-svg { + /* SVG scala a fit del container */ + width: 100%; + /* Altezza massima in rem (caratteri) */ + height: 40rem; + /* Removes extra space below SVG */ + display: block; +} /*------------------------------------------------------------------ [ Shortcuts / .shortcuts ] */ diff --git a/Lux.UI/wwwroot/css/site.less b/Lux.UI/wwwroot/css/site.less index edb73237..50cf1f71 100644 --- a/Lux.UI/wwwroot/css/site.less +++ b/Lux.UI/wwwroot/css/site.less @@ -193,6 +193,18 @@ a, .btn-link { } + + +/* gestione SVG responsive */ +.responsive-svg { + /* SVG scala a fit del container */ + width: 100%; + /* Altezza massima in rem (caratteri) */ + height: 40rem; + /* Removes extra space below SVG */ + display: block; +} + /*------------------------------------------------------------------ [ Shortcuts / .shortcuts ] */ diff --git a/Lux.UI/wwwroot/css/site.min.css b/Lux.UI/wwwroot/css/site.min.css index 44167912..28b81084 100644 --- a/Lux.UI/wwwroot/css/site.min.css +++ b/Lux.UI/wwwroot/css/site.min.css @@ -1 +1 @@ -h1,h2,h3,h4,h5,h6,b,display-1,display-2,display-3,display-4{font-family:'Lato',sans-serif;}html,body{font-family:'Roboto',sans-serif;line-height:1.3;}h1:focus{outline:0;}a,.btn-link{color:#0071c1;}.btn-primary{color:#fff;background-color:#1b6ec2;border-color:#1861ac;}.content{padding-top:1.1rem;}.valid.modified:not([type=checkbox]){outline:1px solid #26b050;}.invalid{outline:1px solid #f00;}.validation-message{color:#f00;}.regionnotclicked{fill:white;}.regionclicked{fill:red;}.striked{text-decoration:line-through;}.dropdown{position:relative;display:inline-block;}.dropdown:hover .dropdown-content,.dropdown:hover .dropdown-content-top,.dropdown:hover .dropdown-content-left,.dropdown:hover .dropdown-content-top-left{display:block;}.dropdown-content{display:none;position:absolute;left:-10em;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;}.dropdown-content .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content .a:hover{background-color:#ddd;}.dropdown-content-top{display:none;position:absolute;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;top:-13em;left:-10em;}.dropdown-content-top .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content-top .a:hover{background-color:#ddd;}.dropdown-content-left{display:none;position:absolute;left:-10em;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;left:-24em;}.dropdown-content-left .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content-left .a:hover{background-color:#ddd;}.dropdown-content-top-left{display:none;position:absolute;left:-10em;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;top:-13em;left:-24em;}.dropdown-content-top-left .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content-top-left .a:hover{background-color:#ddd;}.textTrim{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.maxChar{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.max5Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:5rem;}.max10Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:10rem;}.max20Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:20rem;}.max30Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:30rem;}.max40Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:40rem;}.max50Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:50rem;}.max100Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100rem;}.footer{line-height:1.8em;}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1000;}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem;}.blazor-error-boundary{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem,#b32121;padding:1rem 1rem 1rem 3.7rem;color:#fff;}.blazor-error-boundary::after{content:"An error has occurred.";}.shortcuts{text-align:center;}.shortcuts .shortcut-icon{font-size:2rem;}.shortcuts .shortcut{min-width:10rem;min-height:5rem;display:inline-block;padding:2rem/3 0;margin:0 2px 1em;vertical-align:top;text-decoration:none;background:#f3f3f3;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff,0%,#eee,100%);background-image:-moz-linear-gradient(top,#fff 0%,#eee 100%);background-image:linear-gradient(to bottom,#fff 0%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffeeeeee',GradientType=0);border:1px solid #ddd;box-sizing:border-box;border-radius:1rem/2;}.shortcuts .shortcut-sm{min-width:4.5rem;min-height:3rem;display:inline-block;padding:1rem/4 0;margin:0 2px 1em;vertical-align:top;text-decoration:none;background:#f3f3f3;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff,0%,#eee,100%);background-image:-moz-linear-gradient(top,#fff 0%,#eee 100%);background-image:linear-gradient(to bottom,#fff 0%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffeeeeee',GradientType=0);border:1px solid #ddd;box-sizing:border-box;border-radius:1rem/2;}.shortcuts .shortcut .shortcut-icon{width:100%;margin-top:0;margin-bottom:0;font-size:2rem;color:#333;}.shortcuts .shortcut-sm .shortcut-icon{width:100%;margin-top:0;margin-bottom:0;font-size:2rem;color:#333;}.shortcuts .shortcut:hover{background:#e8e8e8;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fafafa),to(#e1e1e1));background-image:-webkit-linear-gradient(top,#fafafa,0%,#e1e1e1,100%);background-image:-moz-linear-gradient(top,#fafafa 0%,#e1e1e1 100%);background-image:linear-gradient(to bottom,#fafafa 0%,#e1e1e1 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa',endColorstr='#ffe1e1e1',GradientType=0);}.shortcuts .shortcut-sm:hover{background:#e8e8e8;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fafafa),to(#e1e1e1));background-image:-webkit-linear-gradient(top,#fafafa,0%,#e1e1e1,100%);background-image:-moz-linear-gradient(top,#fafafa 0%,#e1e1e1 100%);background-image:linear-gradient(to bottom,#fafafa 0%,#e1e1e1 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa',endColorstr='#ffe1e1e1',GradientType=0);}.shortcuts .shortcut:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);}.shortcuts .shortcut-sm:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);}.shortcuts .shortcut:hover .shortcut-icon{color:#c93;}.shortcuts .shortcut-sm:hover .shortcut-icon{color:#666;}.shortcuts .shortcut-label{display:block;margin-top:.75em;font-weight:400;color:#666;}.wHead{line-height:1;}@media(max-width:640px){.shortcuts .shortcut{min-width:8rem;min-height:4rem;}body{font-size:.8em;line-height:1.1;}}@media(max-width:1650px){body{font-size:.9em;line-height:1.2;}}.reportPivot{background:#efefef;background-image:url(../images/PivotData.png);background-repeat:no-repeat;background-position:top;background-position:left;min-height:250px;height:100%;width:100%;display:block;position:relative;}.reportOre{background:#efefef;background-image:url(../images/ReportGerarchico.png);background-repeat:no-repeat;background-position:top;background-position:left;min-height:250px;height:100%;width:100%;display:block;position:relative;}.reportFolders{background:#efefef;background-image:url(../images/ReportFolders.png);background-repeat:no-repeat;background-position:top;background-position:left;min-height:250px;height:100%;width:100%;display:block;position:relative;}.reportBadge{background:#efefef;background-image:url(../images/Barcode.png);background-repeat:no-repeat;background-position:top;background-position:left;min-height:250px;height:100%;width:100%;display:block;position:relative;}.areaTesto{white-space:normal;overflow:visible;position:absolute;left:0;right:0;bottom:50%;bottom:0;margin:0;padding:0 20px;min-height:25%;line-height:1.5;color:#fff;background:#333;background:rgba(50,50,50,.9);-webkit-background-clip:padding;background-clip:padding-box;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;}.areaTestoSmall{white-space:normal;overflow:visible;position:absolute;left:0;right:0;bottom:50%;bottom:0;margin:0;padding:0 3px;min-height:50%;line-height:1.5;font-size:7pt;color:#fff;background:#999;background:rgba(160,160,160,.9);-webkit-background-clip:padding;background-clip:padding-box;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;}.reportFoldersSmall{background:#efefef;background-image:url(../images/ReportGerarchico.png);background-repeat:no-repeat;background-position:left top;background-size:60px 60px;min-height:36px;height:100%;width:100%;max-width:100%;display:block;position:relative;} \ No newline at end of file +h1,h2,h3,h4,h5,h6,b,display-1,display-2,display-3,display-4{font-family:'Lato',sans-serif;}html,body{font-family:'Roboto',sans-serif;line-height:1.3;}h1:focus{outline:0;}a,.btn-link{color:#0071c1;}.btn-primary{color:#fff;background-color:#1b6ec2;border-color:#1861ac;}.content{padding-top:1.1rem;}.valid.modified:not([type=checkbox]){outline:1px solid #26b050;}.invalid{outline:1px solid #f00;}.validation-message{color:#f00;}.regionnotclicked{fill:white;}.regionclicked{fill:red;}.striked{text-decoration:line-through;}.dropdown{position:relative;display:inline-block;}.dropdown:hover .dropdown-content,.dropdown:hover .dropdown-content-top,.dropdown:hover .dropdown-content-left,.dropdown:hover .dropdown-content-top-left{display:block;}.dropdown-content{display:none;position:absolute;left:-10em;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;}.dropdown-content .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content .a:hover{background-color:#ddd;}.dropdown-content-top{display:none;position:absolute;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;top:-13em;left:-10em;}.dropdown-content-top .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content-top .a:hover{background-color:#ddd;}.dropdown-content-left{display:none;position:absolute;left:-10em;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;left:-24em;}.dropdown-content-left .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content-left .a:hover{background-color:#ddd;}.dropdown-content-top-left{display:none;position:absolute;left:-10em;min-width:8em;box-shadow:0 8px 16px 0 rgba(0,0,0,.2);z-index:1;top:-13em;left:-24em;}.dropdown-content-top-left .a{color:#000;padding:12px 16px;text-decoration:none;display:block;}.dropdown-content-top-left .a:hover{background-color:#ddd;}.textTrim{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.maxChar{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}.max5Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:5rem;}.max10Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:10rem;}.max20Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:20rem;}.max30Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:30rem;}.max40Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:40rem;}.max50Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:50rem;}.max100Char{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100rem;}.footer{line-height:1.8em;}#blazor-error-ui{background:#ffffe0;bottom:0;box-shadow:0 -1px 2px rgba(0,0,0,.2);display:none;left:0;padding:.6rem 1.25rem .7rem 1.25rem;position:fixed;width:100%;z-index:1000;}#blazor-error-ui .dismiss{cursor:pointer;position:absolute;right:.75rem;top:.5rem;}.blazor-error-boundary{background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem,#b32121;padding:1rem 1rem 1rem 3.7rem;color:#fff;}.blazor-error-boundary::after{content:"An error has occurred.";}.responsive-svg{width:100%;height:40rem;display:block;}.shortcuts{text-align:center;}.shortcuts .shortcut-icon{font-size:2rem;}.shortcuts .shortcut{min-width:10rem;min-height:5rem;display:inline-block;padding:2rem/3 0;margin:0 2px 1em;vertical-align:top;text-decoration:none;background:#f3f3f3;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff,0%,#eee,100%);background-image:-moz-linear-gradient(top,#fff 0%,#eee 100%);background-image:linear-gradient(to bottom,#fff 0%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffeeeeee',GradientType=0);border:1px solid #ddd;box-sizing:border-box;border-radius:1rem/2;}.shortcuts .shortcut-sm{min-width:4.5rem;min-height:3rem;display:inline-block;padding:1rem/4 0;margin:0 2px 1em;vertical-align:top;text-decoration:none;background:#f3f3f3;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff,0%,#eee,100%);background-image:-moz-linear-gradient(top,#fff 0%,#eee 100%);background-image:linear-gradient(to bottom,#fff 0%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffeeeeee',GradientType=0);border:1px solid #ddd;box-sizing:border-box;border-radius:1rem/2;}.shortcuts .shortcut .shortcut-icon{width:100%;margin-top:0;margin-bottom:0;font-size:2rem;color:#333;}.shortcuts .shortcut-sm .shortcut-icon{width:100%;margin-top:0;margin-bottom:0;font-size:2rem;color:#333;}.shortcuts .shortcut:hover{background:#e8e8e8;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fafafa),to(#e1e1e1));background-image:-webkit-linear-gradient(top,#fafafa,0%,#e1e1e1,100%);background-image:-moz-linear-gradient(top,#fafafa 0%,#e1e1e1 100%);background-image:linear-gradient(to bottom,#fafafa 0%,#e1e1e1 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa',endColorstr='#ffe1e1e1',GradientType=0);}.shortcuts .shortcut-sm:hover{background:#e8e8e8;background-image:-webkit-gradient(linear,left 0%,left 100%,from(#fafafa),to(#e1e1e1));background-image:-webkit-linear-gradient(top,#fafafa,0%,#e1e1e1,100%);background-image:-moz-linear-gradient(top,#fafafa 0%,#e1e1e1 100%);background-image:linear-gradient(to bottom,#fafafa 0%,#e1e1e1 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffafafa',endColorstr='#ffe1e1e1',GradientType=0);}.shortcuts .shortcut:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);}.shortcuts .shortcut-sm:active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125);}.shortcuts .shortcut:hover .shortcut-icon{color:#c93;}.shortcuts .shortcut-sm:hover .shortcut-icon{color:#666;}.shortcuts .shortcut-label{display:block;margin-top:.75em;font-weight:400;color:#666;}.wHead{line-height:1;}@media(max-width:640px){.shortcuts .shortcut{min-width:8rem;min-height:4rem;}body{font-size:.8em;line-height:1.1;}}@media(max-width:1650px){body{font-size:.9em;line-height:1.2;}}.reportPivot{background:#efefef;background-image:url(../images/PivotData.png);background-repeat:no-repeat;background-position:top;background-position:left;min-height:250px;height:100%;width:100%;display:block;position:relative;}.reportOre{background:#efefef;background-image:url(../images/ReportGerarchico.png);background-repeat:no-repeat;background-position:top;background-position:left;min-height:250px;height:100%;width:100%;display:block;position:relative;}.reportFolders{background:#efefef;background-image:url(../images/ReportFolders.png);background-repeat:no-repeat;background-position:top;background-position:left;min-height:250px;height:100%;width:100%;display:block;position:relative;}.reportBadge{background:#efefef;background-image:url(../images/Barcode.png);background-repeat:no-repeat;background-position:top;background-position:left;min-height:250px;height:100%;width:100%;display:block;position:relative;}.areaTesto{white-space:normal;overflow:visible;position:absolute;left:0;right:0;bottom:50%;bottom:0;margin:0;padding:0 20px;min-height:25%;line-height:1.5;color:#fff;background:#333;background:rgba(50,50,50,.9);-webkit-background-clip:padding;background-clip:padding-box;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;}.areaTestoSmall{white-space:normal;overflow:visible;position:absolute;left:0;right:0;bottom:50%;bottom:0;margin:0;padding:0 3px;min-height:50%;line-height:1.5;font-size:7pt;color:#fff;background:#999;background:rgba(160,160,160,.9);-webkit-background-clip:padding;background-clip:padding-box;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;}.reportFoldersSmall{background:#efefef;background-image:url(../images/ReportGerarchico.png);background-repeat:no-repeat;background-position:left top;background-size:60px 60px;min-height:36px;height:100%;width:100%;max-width:100%;display:block;position:relative;} \ No newline at end of file diff --git a/Resources/ChangeLog.html b/Resources/ChangeLog.html index 243d0079..ccdeb046 100644 --- a/Resources/ChangeLog.html +++ b/Resources/ChangeLog.html @@ -1,6 +1,6 @@ LUX - Web Windows MES -

Versione: 0.9.2508.0412

+

Versione: 0.9.2508.0417


Note di rilascio:
  • diff --git a/Resources/VersNum.txt b/Resources/VersNum.txt index d7bcfacd..88f4dd9e 100644 --- a/Resources/VersNum.txt +++ b/Resources/VersNum.txt @@ -1 +1 @@ -0.9.2508.0412 +0.9.2508.0417 diff --git a/Resources/manifest.xml b/Resources/manifest.xml index 3d9f583b..02cf22b0 100644 --- a/Resources/manifest.xml +++ b/Resources/manifest.xml @@ -1,6 +1,6 @@ - 0.9.2508.0412 + 0.9.2508.0417 http://nexus.steamware.net/repository/SWS/GPW/stable/GPW.UI.zip http://nexus.steamware.net/repository/SWS/GPW/stable/ChangeLog.html false