Compare commits

...

12 Commits

Author SHA1 Message Date
Samuele Locatelli e842228baf Merge branch 'release/FixDownloadCsvOnDataPager' 2022-05-23 11:11:27 +02:00
Samuele Locatelli 25d2ada96e Fix errore eliminazione download csv da datapager 2022-05-23 11:10:04 +02:00
Samuele Locatelli f22933f925 Merge branch 'develop' 2022-05-03 14:49:30 +02:00
Samuele Locatelli 009b5f6452 Update x nuovo installer MON da testare 2022-05-03 14:49:22 +02:00
Samuele Locatelli 94c72b7e11 Merge tag 'FixSetupCssSemaforoAssente' into develop
Correzione mON nuovo: se manca colore semaforo x una macchina si pianta
--> metto nero (tipicamente al setup)
2022-05-02 19:06:09 +02:00
Samuele Locatelli 11a1925660 Merge branch 'release/FixSetupCssSemaforoAssente' 2022-05-02 19:05:10 +02:00
Samuele Locatelli 6ce8386248 Fix x caso colore semaforo assente (es setup iniziale) --> mette NERO 2022-05-02 19:04:26 +02:00
Samuele Locatelli 1739dcf38a Merge tag 'AddCheckLicMapo' into develop
Aggiunto controllo licenze in pagina about
2022-04-26 12:15:35 +02:00
Samuele Locatelli 1a42d581d4 Merge branch 'release/AddCheckLicMapo' 2022-04-26 12:15:22 +02:00
Samuele Locatelli 625433a3af Update visualizzazione licenze x MAPO 2022-04-26 12:14:52 +02:00
Samuele Locatelli 782a01a4b0 UIpdate pagina about x check licenze e server 2022-04-23 09:50:15 +02:00
Samuele Locatelli e65105b305 Merge tag 'FixDeployMaster' into develop
Sistemazione ciclo deploy su Master + fix vers number
2022-04-14 16:53:34 +02:00
21 changed files with 464 additions and 83 deletions
+181 -51
View File
@@ -28,6 +28,12 @@ namespace MP.Land.Data
/// URL dell'API x chiamate gestione licenze
/// </summary>
private static string apiUrl = "https://liman.egalware.com/ELM.API/";
//private static string apiUrl = "https://localhost:44351/";
/// <summary>
/// Chiave redis x info della licenza
/// </summary>
private static string rkeyAppInfo = "LongCache:AppInfo";
private readonly IDistributedCache distributedCache;
@@ -120,10 +126,26 @@ namespace MP.Land.Data
public DateTime infoExpiry { get; set; } = DateTime.Today.AddDays(1);
/// <summary>
/// Codice cliente/installazione
/// </summary>
public string Installazione { get; set; } = "";
/// <summary>
/// Master key licenza principale
/// </summary>
public string MasterKey { get; set; } = "";
/// <summary>
/// Numero licenze da DB
/// </summary>
public int NumLicDb { get; set; } = -1;
/// <summary>
/// Numero licenze da auth remota
/// </summary>
public int NumLicRemote { get; set; } = -1;
public bool ValidData
{
get
@@ -160,7 +182,7 @@ namespace MP.Land.Data
RestClient client = new RestClient(apiUrl);
//client.Authenticator = new HttpBasicAuthenticator("username", "password");
string MKeyEnc = HttpUtility.UrlEncode(MasterKey);
var request = new RestRequest($"/api/attivazioni/?chiave={MKeyEnc}", Method.Get);
var request = new RestRequest($"api/attivazioni/?chiave={MKeyEnc}", Method.Get);
var response = await client.GetAsync(request);
// controllo risposta
if (response.StatusCode == System.Net.HttpStatusCode.OK)
@@ -172,6 +194,29 @@ namespace MP.Land.Data
return await Task.FromResult(answ);
}
/// <summary>
/// Recupera info licenza da remoto
/// </summary>
private async Task<List<LiManObj.ApplicativoDTO>> OnlineAppInfo()
{
List<LiManObj.ApplicativoDTO> answ = new List<LiManObj.ApplicativoDTO>();
// cerco online
RestClient client = new RestClient(apiUrl);
string MKeyEnc = HttpUtility.UrlEncode(MasterKey);
//string mKey = System.Net.WebUtility.UrlEncode(MasterKey);
string reqUrl = $"api/licenza/{Installazione}?CodApp={Applicazione}&Chiave={MKeyEnc}";
var request = new RestRequest(reqUrl, Method.Get);
var response = await client.GetAsync(request);
// controllo risposta
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
// verifico risposta
string rawData = $"{response.Content}";
answ = JsonConvert.DeserializeObject<List<LiManObj.ApplicativoDTO>?>(rawData);
}
return await Task.FromResult(answ);
}
private void ReportUpdated()
{
if (EA_InfoUpdated != null)
@@ -184,6 +229,25 @@ namespace MP.Land.Data
#region Protected Methods
/// <summary>
/// Cerca di recuperare valore INT da elenco AKV
/// </summary>
/// <param name="varReq">Chiave AKV richiesta</param>
/// <returns></returns>
protected int getAVKInt(string varReq)
{
int answ = -9999;
if (AKVList != null && AKVList.Count > 0)
{
var currRec = AKVList.Where(x => x.NomeVar == varReq).FirstOrDefault();
if (currRec != null)
{
answ = currRec.ValInt ?? 0;
}
}
return answ;
}
/// <summary>
/// Cerca di recuperare valore string da elenco AKV
/// </summary>
@@ -285,55 +349,6 @@ namespace MP.Land.Data
return await Task.FromResult(dbResult);
}
/// <summary>
/// Init della classe con variabili di base da Redis/DB
/// </summary>
public bool InitAkv()
{
bool fatto = false;
Applicazione = "MAPO";
Installazione = getAVKStr("Installazione");
MasterKey = getAVKStr(Applicazione);
fatto = !string.IsNullOrEmpty($"{Installazione}{MasterKey}");
return fatto;
}
/// <summary>
/// Init della classe con variabili di base da Redis/DB
/// </summary>
public async Task<bool> RefreshLicense()
{
bool fatto = false;
var onlineAct = await OnlineActivationList();
if (onlineAct != null)
{
if (onlineAct.Count > 0)
{
// scadenza info a 15 gg...
int numDays = 15;
infoExpiry = DateTime.Now.AddDays(numDays);
ActivList = onlineAct;
fatto = await setActivList(onlineAct, numDays);
}
}
await Task.Delay(1);
return fatto;
}
public async Task<bool> setActivList(List<LiManObj.AttivazioneDTO> newActList, int numDays)
{
bool fatto = false;
string cacheKey = $"{rKeyAttByLic}:{MasterKey}";
var rawData = JsonConvert.SerializeObject(newActList);
await setRSV(cacheKey, rawData, numDays * cacheFact * 24);
fatto = true;
if (EA_InfoUpdated != null)
{
EA_InfoUpdated?.Invoke();
}
return fatto;
}
/// <summary>
/// Verifica attivazione licenza
/// </summary>
@@ -363,6 +378,121 @@ namespace MP.Land.Data
return answ;
}
/// <summary>
/// Stato server gestione licenze
/// </summary>
public async Task<string> checkLimanServer()
{
string answ = "ND";
// cerco online
RestClient client = new RestClient(apiUrl);
var request = new RestRequest($"api/health", Method.Get);
var response = await client.GetAsync(request);
// controllo risposta
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
// verifico risposta
answ = response.Content.Replace("\"", "");
}
return await Task.FromResult(answ);
}
/// <summary>
/// Init della classe con variabili di base da Redis/DB
/// </summary>
public bool InitAkv()
{
bool fatto = false;
Applicazione = "MAPO";
Installazione = getAVKStr("Installazione");
MasterKey = getAVKStr(Applicazione);
NumLicDb = getAVKInt(Applicazione);
fatto = !string.IsNullOrEmpty($"{Installazione}{MasterKey}");
return fatto;
}
public async Task<List<LiManObj.ApplicativoDTO>> LicAppCache()
{
List<LiManObj.ApplicativoDTO> dbResult = new List<LiManObj.ApplicativoDTO>();
string cacheKey = $"{rkeyAppInfo}:{MasterKey}";
trackCache(cacheKey);
string rawData = await getRSV(cacheKey);
if (!string.IsNullOrEmpty(rawData))
{
var cacheRes = JsonConvert.DeserializeObject<List<LiManObj.ApplicativoDTO>?>(rawData);
if (cacheRes != null)
{
dbResult = cacheRes;
}
}
return await Task.FromResult(dbResult);
}
/// <summary>
/// Init della classe con variabili di base da Redis/DB
/// </summary>
public async Task<bool> RefreshLicense()
{
bool fatto = false;
// scadenza info a 15 gg...
int numDays = 15;
// dati applicativo
var appData = await OnlineAppInfo();
if (appData != null)
{
if (appData.Count > 0)
{
fatto = await setAppInfo(appData, numDays);
// salvo info licenza...
NumLicRemote = appData[0].NumLicenze;
}
}
// dati attivazioni
var onlineAct = await OnlineActivationList();
if (onlineAct != null)
{
if (onlineAct.Count > 0)
{
infoExpiry = DateTime.Now.AddDays(numDays);
ActivList = onlineAct;
fatto = await setActivList(onlineAct, numDays);
}
}
await Task.Delay(1);
return fatto;
}
public async Task<bool> setActivList(List<LiManObj.AttivazioneDTO> newActList, int numDays)
{
bool fatto = false;
string cacheKey = $"{rKeyAttByLic}:{MasterKey}";
var rawData = JsonConvert.SerializeObject(newActList);
await setRSV(cacheKey, rawData, numDays * cacheFact * 24);
fatto = true;
if (EA_InfoUpdated != null)
{
EA_InfoUpdated?.Invoke();
}
return fatto;
}
public async Task<bool> setAppInfo(List<LiManObj.ApplicativoDTO> newAppInfo, int numDays)
{
bool fatto = false;
string cacheKey = $"{rkeyAppInfo}:{MasterKey}";
var rawData = JsonConvert.SerializeObject(newAppInfo);
await setRSV(cacheKey, rawData, numDays * cacheFact * 24);
fatto = true;
if (EA_InfoUpdated != null)
{
EA_InfoUpdated?.Invoke();
}
return fatto;
}
#endregion Public Methods
}
}
}
+1 -1
View File
@@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<RootNamespace>MP.Land</RootNamespace>
<Version>6.15.2204.1216</Version>
<Version>6.15.2204.2612</Version>
</PropertyGroup>
<ItemGroup>
+59 -15
View File
@@ -2,9 +2,10 @@
@using MP.Land.Data
@inject MessageService AppMService
@inject LicenseService LicServ
<div class="row mx-2">
<div class="col-12 col-lg-8 offset-lg-2">
<div class="col-12 col-lg-10 offset-lg-1">
<div class="card">
<div class="card-header text-center">
<div class="row">
@@ -28,28 +29,71 @@
<img src="img/LogoMapoFull.png" class="img-fluid" />
</div>
<div class="col-lg-3"></div>
<div class="col-12">
<div class="col-6">
<h4 class="card-title">@Messaggio</h4>
<br />
<p>MoonPro / MAPO sono una suite di applicazioni e dispositivi hw dedicati per l'IOT,l'industry 4.0 e la gestione automatizzata dei processi produttivi.</p>
<hr />
<p>Per maggiori informazioni <a href="http://www.steamware.net/iot" target="_blank">visita il link</a> sul nostro sito.</p>
</div>
<div class="col-6 text-right">
<div runat="server" id="divCheck" class="@mainCss">
<h4>Info installazione</h4>
<hr />
<div class="d-flex justify-content-between @remSrvCss">
<div class="px-2">
<i class="fa fa-server" aria-hidden="true"></i> Remote Server:
</div>
<div class="px-2">
<b>@ServerStatus</b>
</div>
</div>
<div class="d-flex justify-content-between">
<div class="px-2">
<i class="fa fa-certificate" aria-hidden="true"></i> Cliente:
</div>
<div class="px-2">
<b>@Installazione</b>
</div>
</div>
<div class="d-flex justify-content-between">
<div class="px-2">
<i class="fa fa-desktop" aria-hidden="true"></i> App:
</div>
<div class="px-2">
<b>@Applicazione</b>
</div>
</div>
<div class="d-flex justify-content-between">
<div class="px-2">
<i class="fa fa-users" aria-hidden="true"></i> Licenze:
</div>
<div class="px-2">
<b title="# Licenze locali / # Licenze Remote">@Licenze</b>
</div>
</div>
<div class="d-flex justify-content-between @expDateCss">
<div class="px-2">
<i class="far fa-calendar-check" aria-hidden="true"></i> Scadenza:
</div>
<div class="px-2">
<b>@($"{Scadenza:yyyy/MM/dd}")</b>
</div>
</div>
<div class="d-flex justify-content-between">
<div class="px-2">
<i class="fa fa-key" aria-hidden="true"></i> Key
</div>
<div class="px-2">
<span Font-Size="0.6em" class="small">@MastKey</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@code {
protected string Titolo = "";
protected string Messaggio = "";
protected override void OnInitialized()
{
Titolo = "MES | SCADA | IOT";
Messaggio = "Soluzione integrata per la gestione della produzione";
AppMService.ShowSearch = false;
AppMService.PageName = "About";
AppMService.PageIcon = "fas fa-info-circle pr-2";
}
}
+78
View File
@@ -0,0 +1,78 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components;
using System.Net.Http;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.Web.Virtualization;
using Microsoft.JSInterop;
using MP.Land;
using MP.Land.Shared;
using MP.Land.Data;
namespace MP.Land.Pages
{
public partial class About
{
protected string Titolo = "";
protected string Messaggio = "";
protected string ServerStatus = "SrvState";
protected string Installazione = "Inst";
protected string Applicazione = "App";
protected string Licenze = "#";
protected DateTime Scadenza = DateTime.Today;
protected string MastKey = "########################";
protected string mainCss = "alert alert-info";
protected string remSrvCss = "bg-danger text-warning";
protected string expDateCss = "bg-danger text-warning";
protected override async Task OnInitializedAsync()
{
updatePageHead();
await reloadLicenseData();
}
private async Task reloadLicenseData()
{
int cDelay = 5;
// recupero dati
await Task.Delay(cDelay);
LicServ.InitAkv();
Installazione = LicServ.Installazione;
Applicazione = LicServ.Applicazione;
MastKey = LicServ.MasterKey;
await Task.Delay(cDelay);
var fatto = await LicServ.RefreshLicense();
await Task.Delay(cDelay);
Licenze = $"{LicServ.NumLicDb}/{LicServ.NumLicRemote}";
// verifico stati
ServerStatus = await LicServ.checkLimanServer();
bool okRemoteSrv = ServerStatus == "OK";
bool okScadenza = LicServ.checkLicenseActive(LicServ.MasterKey);
bool okNumLic = (LicServ.NumLicDb <= LicServ.NumLicRemote);
// aggiornamento css secondo status colore da check
mainCss = okNumLic ? "alert alert-success shadowBox" : "alert alert-warning shadowBox";
expDateCss = okScadenza ? "d-flex justify-content-between" : "d-flex justify-content-between bg-danger text-warning";
remSrvCss = okRemoteSrv ? "d-flex justify-content-between" : "d-flex justify-content-between bg-danger text-warning";
await Task.Delay(cDelay);
}
private void updatePageHead()
{
Titolo = "MES | SCADA | IOT";
Messaggio = "Soluzione integrata per la gestione della produzione";
AppMService.ShowSearch = false;
AppMService.PageName = "About";
AppMService.PageIcon = "fas fa-info-circle pr-2";
}
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo gestione Programmi MAPO</i>
<h4>Versione: 6.15.2204.1216</h4>
<h4>Versione: 6.15.2204.2612</h4>
<br />
Note di rilascio:
<ul>
+1 -1
View File
@@ -1 +1 @@
6.15.2204.1216
6.15.2204.2612
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.15.2204.1216</version>
<version>6.15.2204.2612</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>
+50 -4
View File
@@ -63,6 +63,52 @@ a,
.footer {
line-height: 1.8em;
}
.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;
}
/*------------------------------------------------------------------
[ Shortcuts / .shortcuts ]
*/
@@ -76,7 +122,7 @@ a,
min-width: 9rem;
min-height: 5rem;
display: inline-block;
padding: 0.66666667rem 0;
padding: 2rem/3 0;
margin: 0 2px 1em;
vertical-align: top;
text-decoration: none;
@@ -89,13 +135,13 @@ a,
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeeeeee', GradientType=0);
border: 1px solid #ddd;
box-sizing: border-box;
border-radius: 0.5rem;
border-radius: 1rem/2;
}
.shortcuts .shortcut-sm {
min-width: 4.5rem;
min-height: 3rem;
display: inline-block;
padding: 0.25rem 0;
padding: 1rem/4 0;
margin: 0 2px 1em;
vertical-align: top;
text-decoration: none;
@@ -108,7 +154,7 @@ a,
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffeeeeee', GradientType=0);
border: 1px solid #ddd;
box-sizing: border-box;
border-radius: 0.5rem;
border-radius: 1rem/2;
}
.shortcuts .shortcut .shortcut-icon {
width: 100%;
+44
View File
@@ -63,6 +63,50 @@ a, .btn-link {
line-height: 1.8em;
}
.textTrim {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.maxChar {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.max5Char {
.maxChar;
width: 5rem;
}
.max10Char {
.maxChar;
width: 10rem;
}
.max20Char {
.maxChar;
width: 20rem;
}
.max30Char {
.maxChar;
width: 30rem;
}
.max40Char {
.maxChar;
width: 40rem;
}
.max50Char {
.maxChar;
width: 50rem;
}
/*------------------------------------------------------------------
[ Shortcuts / .shortcuts ]
*/
+1 -1
View File
@@ -1 +1 @@
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');@import url('fonts.min.css');h1,h2,h3,h4,h5,h6,b,display-1,display-2,display-3,display-4{font-family:'Lato',sans-serif}html,body,.textCondensed{font-family:'Roboto Condensed',sans-serif}a,.btn-link{color:#0366d6}.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}.textStriked{text-decoration:line-through}#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}.footer{line-height:1.8em}.shortcuts{text-align:center}.shortcuts .shortcut-icon{font-size:2rem}.shortcuts .shortcut{min-width:9rem;min-height:5rem;display:inline-block;padding:.66666667rem 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:.5rem}.shortcuts .shortcut-sm{min-width:4.5rem;min-height:3rem;display:inline-block;padding:.25rem 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:.5rem}.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}@media(max-width:640px){.shortcuts .shortcut{min-width:8rem;min-height:4rem}body{font-size:.8em}}
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');@import url('fonts.min.css');h1,h2,h3,h4,h5,h6,b,display-1,display-2,display-3,display-4{font-family:'Lato',sans-serif}html,body,.textCondensed{font-family:'Roboto Condensed',sans-serif}a,.btn-link{color:#0366d6}.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}.textStriked{text-decoration:line-through}#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}.footer{line-height:1.8em}.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}.shortcuts{text-align:center}.shortcuts .shortcut-icon{font-size:2rem}.shortcuts .shortcut{min-width:9rem;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}@media(max-width:640px){.shortcuts .shortcut{min-width:8rem;min-height:4rem}body{font-size:.8em}}
+5
View File
@@ -38,6 +38,11 @@ namespace MP.Mon.Components
private string cssStatus(string codSemaforo)
{
// se vuoto --> mostra nero!
if (string.IsNullOrEmpty(codSemaforo))
{
codSemaforo = "sNe";
}
string codColore = codSemaforo.Substring(1, 2);
string answ = $"{baseCss}{codColore}";
if (doAnimate && codColore != "Ve")
+7 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<Version>6.15.2204.1416</Version>
<Version>6.15.2205.219</Version>
</PropertyGroup>
<ItemGroup>
@@ -37,6 +37,12 @@
<ItemGroup>
<ProjectReference Include="..\MP.Data\MP.Data.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="logs\.placeholder">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="powershell.exe -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File $(ProjectDir)\post-build.ps1 -ProjectDir $(ProjectDir) -ProjectPath $(ProjectPath)" />
</Target>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MON MAPO</i>
<h4>Versione: 6.15.2204.1416</h4>
<h4>Versione: 6.15.2205.219</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
6.15.2204.1416
6.15.2205.219
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.15.2204.1416</version>
<version>6.15.2205.219</version>
<url>https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/MP.Mon.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
+17
View File
@@ -0,0 +1,17 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"CodApp": "MP.MON",
"ConnectionStrings": {
"MP.Mon": "Server=localhost\\SQLEXPRESS;Database=MoonPro; User ID=steamware;Password=viadante16; integrated security=False; MultipleActiveResultSets=True; App=Blazor.ServerApp;",
"MP.Stats": "Server=localhost\\SQLEXPRESS;Database=MoonPro_STATS; User ID=steamware;Password=viadante16; integrated security=False; MultipleActiveResultSets=True; App=Blazor.ServerApp;",
"Redis": "localhost:6379,DefaultDatabase=13,connectTimeout=5000,syncTimeout=5000,asyncTimeout=5000,abortConnect=false,ssl=false"
}
}
+11
View File
@@ -36,6 +36,17 @@
{
<span>@totalCount records</span>
}
@if (totalCount > 0)
{
if (!fileExist)
{
<button class="btn btn-block btn-sm btn-primary" @onclick="() => requestSave()"><span class="oi oi-wrench"></span> Prepare Data</button>
}
else
{
<a target="_blank" href="Download?fileName=@fileName" class="btn btn-block btn-sm btn-success"><span class="oi oi-cloud-download"></span> Download Data</a>
}
}
</div>
<div class="p-1 flex-fill text-right small">
@if (totalCount > 0)
+1 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net6.0</TargetFramework>
<RootNamespace>MP.Stats</RootNamespace>
<UserSecretsId>826e877c-ba70-4253-84cb-d0b1cafd4440</UserSecretsId>
<Version>6.15.2204.1416</Version>
<Version>6.15.2205.2311</Version>
</PropertyGroup>
<ItemGroup>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo statistiche MAPO</i>
<h4>Versione: 6.15.2204.1416</h4>
<h4>Versione: 6.15.2205.2311</h4>
<br />
Note di rilascio:
<ul>
+1 -1
View File
@@ -1 +1 @@
6.15.2204.1416
6.15.2205.2311
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.15.2204.1416</version>
<version>6.15.2205.2311</version>
<url>https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>