Compare commits

...

7 Commits

Author SHA1 Message Date
Samuele Locatelli 4644646fa4 Merge branch 'Release/220921_FixAndNugetUpdate' 2022-09-21 14:53:05 +02:00
Samuele Locatelli c3c5300830 Nuget Update:
- nlog
- newtonsoft json
2022-09-21 14:52:25 +02:00
Samuele Locatelli ebeeab69e1 Nuget Update: dotNet framework 2022-09-21 14:50:56 +02:00
Samuele Locatelli 2a41e8070b CodeMaid
- fix componenti UI
- lasciati invariati in area wwwroot
2022-09-21 14:49:45 +02:00
Samuele Locatelli 3a5b77314a CodeMaid:
- DTO e MOdelli NON riorganizzabili
- refresh globale ordinamenti
- test rebuild
2022-09-21 14:45:57 +02:00
zaccaria.majid 16c7b0bc6b modifiche grafiche + fix paginazione 2022-09-21 14:21:22 +02:00
Samuele Locatelli 46f284ae0c Merge tag 'FirstSpecStableRelease' into develop
Prima release master con fix vari grafici + tutte le funzionalità
2022-09-21 10:36:57 +02:00
51 changed files with 409 additions and 381 deletions
+5 -5
View File
@@ -1,8 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MP.Data.Conf namespace MP.Data.Conf
{ {
@@ -11,9 +7,13 @@ namespace MP.Data.Conf
/// </summary> /// </summary>
public class IobTags public class IobTags
{ {
#region Public Fields
/// <summary> /// <summary>
/// Oggetto dizionario di configurazione x IOB /// Oggetto dizionario di configurazione x IOB
/// </summary> /// </summary>
public Dictionary<string, List<TagData>> IobSetup = new Dictionary<string, List<TagData>>(); public Dictionary<string, List<TagData>> IobSetup = new Dictionary<string, List<TagData>>();
#endregion Public Fields
} }
} }
+17 -11
View File
@@ -1,37 +1,41 @@
using System; namespace MP.Data.Conf
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MP.Data.Conf
{ {
/// <summary> /// <summary>
/// Item da mostrare nei blocchi MON degli impianti come override ai dati MSE /// Item da mostrare nei blocchi MON degli impianti come override ai dati MSE
/// </summary> /// </summary>
public class TagData public class TagData
{ {
#region Public Properties
/// <summary> /// <summary>
/// Indice della colonna (ordine) del dato /// Indice della colonna (ordine) del dato
/// </summary> /// </summary>
public int ColNum { get; set; } = 0; public int ColNum { get; set; } = 0;
/// <summary> /// <summary>
/// Indice della riga del dato /// Indice della riga del dato
/// </summary> /// </summary>
public int RowNum { get; set; } = 0; public int RowNum { get; set; } = 0;
/// <summary> /// <summary>
/// Override CSS (es fontSmall) /// Override CSS (es fontSmall)
/// </summary> /// </summary>
public string TagCss { get; set; } = ""; public string TagCss { get; set; } = "";
/// <summary>
/// Etichetta da mostrare
/// </summary>
public string TagName { get; set; } = "";
/// <summary> /// <summary>
/// Indicazione della chiave REDIS dove recuperare il tag indicato (già in formato string) /// Indicazione della chiave REDIS dove recuperare il tag indicato (già in formato string)
/// </summary> /// </summary>
public string TagLocation { get; set; } = ""; public string TagLocation { get; set; } = "";
/// <summary>
/// Etichetta da mostrare
/// </summary>
public string TagName { get; set; } = "";
#endregion Public Properties
#region Public Methods
/// <summary> /// <summary>
/// Clone dell'oggetto /// Clone dell'oggetto
/// </summary> /// </summary>
@@ -40,5 +44,7 @@ namespace MP.Data.Conf
{ {
return (TagData)this.MemberwiseClone(); return (TagData)this.MemberwiseClone();
} }
#endregion Public Methods
} }
} }
+8 -10
View File
@@ -1,21 +1,19 @@
using System; namespace MP.Data
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MP.Data
{ {
public class Constants public class Constants
{ {
#region Public Fields
public static readonly string ACT_BLINK_KEY = $"{BASE_HASH}:Current:Blink";
public static readonly string ACT_MSE_DATA_KEY = $"{BASE_HASH}:Current:MSE";
// dati conf REDIS Cache // dati conf REDIS Cache
public static readonly string BASE_HASH = "MAPO"; public static readonly string BASE_HASH = "MAPO";
// REDIS KEY Dati correnti // REDIS KEY Dati correnti
public static readonly string CONF_MON_KEY = $"{BASE_HASH}:Conf:MonDispData"; public static readonly string CONF_MON_KEY = $"{BASE_HASH}:Conf:MonDispData";
public static readonly string ACT_MSE_DATA_KEY = $"{BASE_HASH}:Current:MSE";
public static readonly string ACT_BLINK_KEY = $"{BASE_HASH}:Current:Blink";
#endregion Public Fields
} }
} }
+8 -8
View File
@@ -10,14 +10,6 @@ namespace MP.Data.Controllers
{ {
public class MpStatsController : IDisposable public class MpStatsController : IDisposable
{ {
#region Private Fields
private static IConfiguration _configuration;
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
#endregion Private Fields
#region Public Constructors #region Public Constructors
public MpStatsController(IConfiguration configuration) public MpStatsController(IConfiguration configuration)
@@ -326,5 +318,13 @@ namespace MP.Data.Controllers
} }
#endregion Public Methods #endregion Public Methods
#region Private Fields
private static IConfiguration _configuration;
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
#endregion Private Fields
} }
} }
+4
View File
@@ -5,6 +5,10 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DTO namespace MP.Data.DTO
{ {
public class DossierFluxLogDTO public class DossierFluxLogDTO
+3 -1
View File
@@ -3,7 +3,9 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable #nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("AnagArticoli")] [Table("AnagArticoli")]
+3 -1
View File
@@ -4,7 +4,9 @@ using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable #nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("AnagraficaGruppi")] [Table("AnagraficaGruppi")]
+3 -1
View File
@@ -2,7 +2,9 @@
using System.Collections.Generic; using System.Collections.Generic;
#nullable disable #nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
public partial class AzioniUL public partial class AzioniUL
+4
View File
@@ -2,6 +2,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("Config")] [Table("Config")]
+3
View File
@@ -4,6 +4,9 @@ using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable #nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
+7 -5
View File
@@ -2,8 +2,11 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("Dossiers")] [Table("Dossiers")]
@@ -12,15 +15,14 @@ namespace MP.Data.DatabaseModels
#region Public Properties #region Public Properties
[MaxLength(50)] [MaxLength(50)]
public string IdxMacchina { get; set; } public string DataType { get; set; }
public DateTime DtRif { get; set; } public DateTime DtRif { get; set; }
public int IdxODL { get; set; }
[MaxLength(50)] [MaxLength(50)]
public string DataType { get; set; } public string IdxMacchina { get; set; }
public int IdxODL { get; set; }
public string Valore { get; set; } public string Valore { get; set; }
#endregion Public Properties #endregion Public Properties
+4 -1
View File
@@ -2,8 +2,11 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("FluxLog")] [Table("FluxLog")]
+4 -1
View File
@@ -3,8 +3,11 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("LinkMenuJQM")] [Table("LinkMenuJQM")]
+4 -1
View File
@@ -1,8 +1,11 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("ListValues")] [Table("ListValues")]
+4 -1
View File
@@ -1,8 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
public partial class Macchine public partial class Macchine
+4
View File
@@ -1,6 +1,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
public partial class MappaStatoExpl public partial class MappaStatoExpl
+4 -1
View File
@@ -3,8 +3,11 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("ODL")] [Table("ODL")]
+4 -1
View File
@@ -3,8 +3,11 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
[Table("PromesseODL")] [Table("PromesseODL")]
+4 -1
View File
@@ -1,8 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
public partial class ResControlli public partial class ResControlli
+4 -1
View File
@@ -1,8 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
public partial class ResScarti public partial class ResScarti
+4 -1
View File
@@ -1,8 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
public partial class StatsAnagArticoli public partial class StatsAnagArticoli
+4 -1
View File
@@ -1,8 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
public partial class StatsODL public partial class StatsODL
+4 -1
View File
@@ -3,8 +3,11 @@ using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
public partial class TurniOee public partial class TurniOee
+4 -1
View File
@@ -1,8 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
#nullable disable
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels namespace MP.Data.DatabaseModels
{ {
public partial class UserActionLog public partial class UserActionLog
+6 -6
View File
@@ -12,14 +12,14 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.7" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.7" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.7" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.7"> <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.9">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="6.0.7" /> <PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="6.0.9" />
<PackageReference Include="NLog" Version="5.0.1" /> <PackageReference Include="NLog" Version="5.0.4" />
</ItemGroup> </ItemGroup>
</Project> </Project>
+45 -49
View File
@@ -1,29 +1,11 @@
using NLog; using NLog;
using StackExchange.Redis; using StackExchange.Redis;
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MP.Data namespace MP.Data
{ {
public class MessagePipe public class MessagePipe
{ {
#region Private Fields
private bool enableLog = false;
private IConnectionMultiplexer redis;
private IDatabase? redisDb;
#endregion Private Fields
#region Protected Fields
protected static Logger Log = LogManager.GetCurrentClassLogger();
#endregion Protected Fields
#region Public Constructors #region Public Constructors
public MessagePipe(IConnectionMultiplexer redisConn, string channelName, bool enableLog = false) public MessagePipe(IConnectionMultiplexer redisConn, string channelName, bool enableLog = false)
@@ -44,37 +26,6 @@ namespace MP.Data
#endregion Public Events #endregion Public Events
#region Private Properties
/// <summary>
/// Canale associato al gestore pipeline messaggi
/// </summary>
private string _channel { get; set; } = "";
#endregion Private Properties
#region Private Methods
private void setupSubscriber()
{
ISubscriber sub = redis.GetSubscriber();
//Subscribe to the channel named messages
sub.Subscribe(_channel, (channel, message) =>
{
Log.Trace($"ch {channel} | {message}");
// messaggio
PubSubEventArgs mea = new PubSubEventArgs(message);
// se qualcuno ascolta sollevo evento nuovo valore...
if (EA_NewMessage != null)
{
EA_NewMessage(this, mea);
}
});
Log.Info($"Subscribed {_channel}");
}
#endregion Private Methods
#region Public Methods #region Public Methods
public bool saveAndSendMessage(string memKey, string message) public bool saveAndSendMessage(string memKey, string message)
@@ -108,6 +59,51 @@ namespace MP.Data
#endregion Public Methods #endregion Public Methods
#region Protected Fields
protected static Logger Log = LogManager.GetCurrentClassLogger();
#endregion Protected Fields
#region Private Fields
private bool enableLog = false;
private IConnectionMultiplexer redis;
private IDatabase? redisDb;
#endregion Private Fields
#region Private Properties
/// <summary>
/// Canale associato al gestore pipeline messaggi
/// </summary>
private string _channel { get; set; } = "";
#endregion Private Properties
#region Private Methods
private void setupSubscriber()
{
ISubscriber sub = redis.GetSubscriber();
//Subscribe to the channel named messages
sub.Subscribe(_channel, (channel, message) =>
{
Log.Trace($"ch {channel} | {message}");
// messaggio
PubSubEventArgs mea = new PubSubEventArgs(message);
// se qualcuno ascolta sollevo evento nuovo valore...
if (EA_NewMessage != null)
{
EA_NewMessage(this, mea);
}
});
Log.Info($"Subscribed {_channel}");
}
#endregion Private Methods
/// <summary> /// <summary>
/// Invio messaggio sul canale + salvataggio in cache REDIS /// Invio messaggio sul canale + salvataggio in cache REDIS
/// </summary> /// </summary>
+3 -1
View File
@@ -6,7 +6,9 @@ using MP.Data.DatabaseModels;
using NLog; using NLog;
#nullable disable #nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data namespace MP.Data
{ {
public partial class MoonProContext : DbContext public partial class MoonProContext : DbContext
+3 -1
View File
@@ -6,7 +6,9 @@ using MP.Data.DatabaseModels;
using NLog; using NLog;
#nullable disable #nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data namespace MP.Data
{ {
public partial class MoonPro_STATSContext : DbContext public partial class MoonPro_STATSContext : DbContext
+30 -25
View File
@@ -3,13 +3,26 @@ using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace MP.Data namespace MP.Data
{ {
public class Utils public class Utils
{ {
#region Public Properties
public static string redKeyArtUsed
{
get => RedHash($"CACHE:CheckArtUsed");
}
public static string redKeyTabCheckArt
{
get => RedHash($"CACHE:TabCheckArt");
}
#endregion Public Properties
#region Public Methods #region Public Methods
public static string ConvMinToTime(double minutes) public static string ConvMinToTime(double minutes)
@@ -28,6 +41,22 @@ namespace MP.Data
return answ; return answ;
} }
/// <summary>
/// Nome della variabile HASH da utilizzare (dato CodModulo / Server / DB impiegato da
/// funzionalita' DbConfig) + keyName richiesto...
/// </summary>
public static string RedHash(string keyName)
{
string answ = keyName;
try
{
answ = $"MP:Data:{keyName}";
}
catch
{ }
return answ;
}
public static async Task SaveToCsv<T>(List<T> reportData, string path) public static async Task SaveToCsv<T>(List<T> reportData, string path)
{ {
var lines = new List<string>(); var lines = new List<string>();
@@ -39,30 +68,6 @@ namespace MP.Data
await Task.Run(() => File.WriteAllLines(path, lines.ToArray())); await Task.Run(() => File.WriteAllLines(path, lines.ToArray()));
} }
public static string redKeyArtUsed
{
get => RedHash($"CACHE:CheckArtUsed");
}
public static string redKeyTabCheckArt
{
get => RedHash($"CACHE:TabCheckArt");
}
/// <summary>
/// Nome della variabile HASH da utilizzare (dato CodModulo / Server / DB impiegato da funzionalita' DbConfig) + keyName richiesto...
/// </summary>
public static string RedHash(string keyName)
{
string answ = keyName;
try
{
answ =$"MP:Data:{keyName}";
}
catch
{ }
return answ;
}
#endregion Public Methods #endregion Public Methods
} }
} }
+4 -4
View File
@@ -33,15 +33,15 @@ namespace MP.SPEC.Components
aTimer.Start(); aTimer.Start();
} }
#endregion Public Methods
#region Protected Methods
protected override void OnInitialized() protected override void OnInitialized()
{ {
version = typeof(Program).Assembly.GetName().Version; version = typeof(Program).Assembly.GetName().Version;
} }
#endregion Public Methods
#region Protected Methods
#endregion Protected Methods #endregion Protected Methods
#region Private Fields #region Private Fields
+10 -6
View File
@@ -24,12 +24,6 @@ namespace MP.SPEC.Components
} }
} }
public async Task resetCurrPage()
{
await Task.Delay(1);
currPage = 1;
}
[Parameter] [Parameter]
public EventCallback<int> numPageChanged { get; set; } public EventCallback<int> numPageChanged { get; set; }
@@ -82,6 +76,16 @@ namespace MP.SPEC.Components
#endregion Public Properties #endregion Public Properties
#region Public Methods
public async Task resetCurrPage()
{
await Task.Delay(1);
currPage = 1;
}
#endregion Public Methods
#region Protected Fields #region Protected Fields
protected bool _showLoading = false; protected bool _showLoading = false;
+2 -49
View File
@@ -5,53 +5,6 @@
<div class="px-0 col-6"> <div class="px-0 col-6">
<div class=""> <div class="">
@*@if (showEditPar)
{
<div class="px-0 input-group py-1" id="basic-addon1">
<button class="btn btn-primary" @onclick="() => toggleParams()"> <i class="fa-solid fa-arrow-right"></i></button>
<label class="input-group-text" for="tempoAgg" title="Selezionare il tempo di aggiornamento dei dati"><i class="fa-solid fa-clock"></i></label>
<select @bind="@selTempoAgg" class="form-select" id="tempoAgg" title="Selezionare il tempo di aggiornamento dei dati">
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
</select>
<label class="input-group-text" for="maxRecord" title="Selezionare il numero massimo di record da visualizzare"><i class="fa-solid fa-list-ol"></i></label>
<select @bind="@selMaxRecord" class="form-select" id="maxRecord" title="Selezionare il numero massimo di record da visualizzare">
<option value="50">50</option>
<option value="100">100</option>
<option value="150">150</option>
<option value="200">200</option>
<option value="250">250</option>
<option value="300">300</option>
<option value="350">350</option>
<option value="400">400</option>
<option value="450">450</option>
<option value="500">500</option>
</select>
</div>
}
else
{
<div class="px-2 py-1">
<button class="btn btn-primary" @onclick="() => toggleParams()"><i class="fa-solid fa-arrow-left"></i></button>
</div>
}*@
<div class="px-0 py-1"> <div class="px-0 py-1">
<div class="px-2 input-group" id="basic-addon1"> <div class="px-2 input-group" id="basic-addon1">
<label class="input-group-text" for="macchina" title="Selezionare la macchina"><i class="fa-solid fa-hard-drive"></i></label> <label class="input-group-text" for="macchina" title="Selezionare la macchina"><i class="fa-solid fa-hard-drive"></i></label>
@@ -65,8 +18,8 @@
} }
} }
</select> </select>
<label class="input-group-text" for="DtRef" title="Selezionare il tipo di flusso"><i class="fa-solid fa-calendar-check"></i></label> <label class="input-group-text" for="DtRef" title="Selezionare la data da visualizzare"><i class="fa-solid fa-calendar-check"></i></label>
<input @bind="@selDtRef" id="DtRef" class="form-control" type="datetime-local" /> <input @bind="@selDtRef" id="DtRef" class="form-control" type="datetime-local" title="Selezionare la data da visualizzare" />
</div> </div>
</div> </div>
</div> </div>
+17 -38
View File
@@ -1,21 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components; 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.SPEC;
using MP.SPEC.Shared;
using MP.SPEC.Components;
using MP.SPEC.Data;
using MP.Data.DatabaseModels; using MP.Data.DatabaseModels;
using MP.SPEC.Data;
namespace MP.SPEC.Components namespace MP.SPEC.Components
{ {
@@ -31,15 +16,27 @@ namespace MP.SPEC.Components
#endregion Public Properties #endregion Public Properties
#region Protected Fields
#endregion Protected Fields
#region Protected Properties #region Protected Properties
[Inject] [Inject]
protected MpDataService MDService { get; set; } = null!; protected MpDataService MDService { get; set; } = null!;
protected DateTime selDtRef
{
get
{
return SelFilterDossier.DtRef;
}
set
{
if (!SelFilterDossier.DtRef.Equals(value))
{
SelFilterDossier.DtRef = value;
reportChange();
}
}
}
protected string selMacchina protected string selMacchina
{ {
@@ -60,7 +57,6 @@ namespace MP.SPEC.Components
} }
} }
protected int selMaxRecord protected int selMaxRecord
{ {
get get
@@ -78,23 +74,6 @@ namespace MP.SPEC.Components
} }
} }
protected DateTime selDtRef
{
get
{
return SelFilterDossier.DtRef;
}
set
{
if (!SelFilterDossier.DtRef.Equals(value))
{
SelFilterDossier.DtRef = value;
reportChange();
}
}
}
#endregion Protected Properties #endregion Protected Properties
#region Protected Methods #region Protected Methods
+2 -5
View File
@@ -22,7 +22,7 @@ else
<th><i class="fa-solid fa-hard-drive"></i> Macchina</th> <th><i class="fa-solid fa-hard-drive"></i> Macchina</th>
<th><i class="fa-regular fa-calendar-days"></i> Data</th> <th><i class="fa-regular fa-calendar-days"></i> Data</th>
<th><i class="fa-solid fa-sliders"></i> ODL</th> <th><i class="fa-solid fa-sliders"></i> ODL</th>
<th><i class="fa-solid fa-sliders"></i> DATA TYPE</th> <th><i class="fa-solid fa-circle-info"></i> DATA TYPE</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -64,8 +64,7 @@ else
<th><i class="fa-solid fa-hard-drive"></i> Macchina</th> <th><i class="fa-solid fa-hard-drive"></i> Macchina</th>
<th><i class="fa-regular fa-calendar-days"></i> Data</th> <th><i class="fa-regular fa-calendar-days"></i> Data</th>
<th><i class="fa-solid fa-sliders"></i> ODL</th> <th><i class="fa-solid fa-sliders"></i> ODL</th>
<th class="d-flex justify-content-between"><i class="fa-solid fa-sliders"></i> Valore <button class="btn btn-primary btn-sm py-0" @onclick="() => unToggleTableFlux()"><i class="fa-solid fa-xmark"></i></button></th> <th class="d-flex justify-content-between"> Valore <button class="btn btn-primary btn-sm py-0" @onclick="() => unToggleTableFlux()"><i class="fa-solid fa-xmark"></i></button></th>
@*<th class="d-flex justify-content-end"><button class="btn btn-primary btn-sm py-0" @onclick="() => unToggleTableFlux()"><i class="fa-solid fa-xmark"></i></button></th>*@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -84,8 +83,6 @@ else
<td style="text-align: right;"> <td style="text-align: right;">
<b>@record.Valore</b> <b>@record.Valore</b>
</td> </td>
@* <td>
</td>*@
</tr> </tr>
} }
</tbody> </tbody>
+2 -1
View File
@@ -111,10 +111,11 @@ namespace MP.SPEC.Components
{ {
get => SelFilter.TempoAgg; get => SelFilter.TempoAgg;
} }
//protected int RefreshPeriod { get; set; } = 5000;
#endregion Protected Properties #endregion Protected Properties
//protected int RefreshPeriod { get; set; } = 5000;
#region Protected Methods #region Protected Methods
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
+43 -47
View File
@@ -12,7 +12,6 @@ namespace MP.SPEC.Components
[Parameter] [Parameter]
public EventCallback<bool> PagerResetReq { get; set; } public EventCallback<bool> PagerResetReq { get; set; }
[Parameter] [Parameter]
public EventCallback<PODLModel> RecordSel { get; set; } public EventCallback<PODLModel> RecordSel { get; set; }
@@ -35,38 +34,6 @@ namespace MP.SPEC.Components
return answ; return answ;
} }
protected async Task resetSel()
{
await RecordSel.InvokeAsync(null);
}
protected bool POdlDelEnabled(int idxOdl)
{
return idxOdl == 0;
}
protected async Task selRecord(PODLModel selRec)
{
await RecordSel.InvokeAsync(selRec);
}
/// <summary>
/// Eliminazione record selezioanto (previa conferma)
/// </summary>
/// <param name="selRec"></param>
/// <returns></returns>
protected async Task deleteRecord(PODLModel selRec)
{
if (!await JSRuntime.InvokeAsync<bool>("confirm", "Eliminazione Record: sei sicuro di voler procedere?"))
return;
await Task.Delay(1);
var done = await MDService.PODLDeleteRecord(selRec);
currRecord = null;
await reloadData();
await Task.Delay(1);
}
#endregion Public Methods #endregion Public Methods
#region Protected Properties #region Protected Properties
@@ -84,6 +51,22 @@ namespace MP.SPEC.Components
#region Protected Methods #region Protected Methods
/// <summary>
/// Eliminazione record selezioanto (previa conferma)
/// </summary>
/// <param name="selRec"></param>
/// <returns></returns>
protected async Task deleteRecord(PODLModel selRec)
{
if (!await JSRuntime.InvokeAsync<bool>("confirm", "Eliminazione Record: sei sicuro di voler procedere?"))
return;
await Task.Delay(1);
var done = await MDService.PODLDeleteRecord(selRec);
currRecord = null;
await reloadData();
await Task.Delay(1);
}
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
MsgService.EA_PageUpdated += MessageService_EA_PageUpdated; MsgService.EA_PageUpdated += MessageService_EA_PageUpdated;
@@ -104,6 +87,21 @@ namespace MP.SPEC.Components
}); });
} }
protected bool POdlDelEnabled(int idxOdl)
{
return idxOdl == 0;
}
protected async Task resetSel()
{
await RecordSel.InvokeAsync(null);
}
protected async Task selRecord(PODLModel selRec)
{
await RecordSel.InvokeAsync(selRec);
}
protected async Task UpdateData() protected async Task UpdateData()
{ {
currRecord = null; currRecord = null;
@@ -118,6 +116,7 @@ namespace MP.SPEC.Components
private List<PODLModel>? ListRecords; private List<PODLModel>? ListRecords;
private List<ListValues>? ListStati;
private List<PODLModel>? SearchRecords; private List<PODLModel>? SearchRecords;
#endregion Private Fields #endregion Private Fields
@@ -175,6 +174,17 @@ namespace MP.SPEC.Components
}); });
} }
private async Task reloadData()
{
isLoading = true;
SearchRecords = await MDService.ListPODLFilt(SearchVal, StatoSel);
totalCount = SearchRecords.Count;
ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
await Task.Delay(1);
await InvokeAsync(() => StateHasChanged());
isLoading = false;
}
private string tradFase(string codFase) private string tradFase(string codFase)
{ {
string answ = codFase; string answ = codFase;
@@ -189,20 +199,6 @@ namespace MP.SPEC.Components
return answ; return answ;
} }
private List<ListValues>? ListStati;
private async Task reloadData()
{
isLoading = true;
SearchRecords = await MDService.ListPODLFilt(SearchVal, StatoSel);
totalCount = SearchRecords.Count;
ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
await Task.Delay(1);
await InvokeAsync(() => StateHasChanged());
isLoading = false;
}
#endregion Private Methods #endregion Private Methods
} }
} }
+9 -13
View File
@@ -15,7 +15,7 @@ namespace MP.SPEC.Components
#endregion Public Properties #endregion Public Properties
#region Protected Fields #region Protected Properties
protected string lastUpdate protected string lastUpdate
{ {
@@ -23,10 +23,6 @@ namespace MP.SPEC.Components
set => SelFilter.lastUpdate = value; set => SelFilter.lastUpdate = value;
} }
#endregion Protected Fields
#region Protected Properties
protected bool liveUpdate protected bool liveUpdate
{ {
get => SelFilter.LiveUpdate; get => SelFilter.LiveUpdate;
@@ -134,6 +130,14 @@ namespace MP.SPEC.Components
await FilterChanged.InvokeAsync(SelFilter); await FilterChanged.InvokeAsync(SelFilter);
} }
protected async Task takeSnapshot()
{
// fermo udpate
liveUpdate = false;
await MDService.DossiersTakeParamsSnapshot(selMacchina, 10);
lastUpdate = $"Last Snapshot: {DateTime.Now:yyyy/MM/dd HH:mm:ss}";
}
protected void toggleParams() protected void toggleParams()
{ {
showEditPar = !showEditPar; showEditPar = !showEditPar;
@@ -149,14 +153,6 @@ namespace MP.SPEC.Components
} }
} }
protected async Task takeSnapshot()
{
// fermo udpate
liveUpdate = false;
await MDService.DossiersTakeParamsSnapshot(selMacchina, 10);
lastUpdate = $"Last Snapshot: {DateTime.Now:yyyy/MM/dd HH:mm:ss}";
}
#endregion Protected Methods #endregion Protected Methods
#region Private Fields #region Private Fields
+18 -16
View File
@@ -11,13 +11,25 @@
#region Public Properties #region Public Properties
public int CurrPage { get; set; } = 1;
public DateTime DtRef { get; set; } = Init(5);
public string IdxMacchina { get; set; } = "*";
public int MaxRecord { get; set; } = 100;
#endregion Public Properties
#region Public Methods
/// <summary> /// <summary>
        /// Inizializzazione con periodo e arrotondamento         /// Inizializzazione con periodo e arrotondamento
        /// </summary>         /// </summary>
        /// <param name="minRound"></param>         /// <param name="minRound"></param>
        /// <param name="numDayPrev"></param>         /// <param name="numDayPrev"></param>
        /// <returns></returns>         /// <returns></returns>
        public static DateTime Init(int minRound) public static DateTime Init(int minRound)
{ {
TimeSpan DayElapsed = DateTime.Now.Subtract(DateTime.Today); TimeSpan DayElapsed = DateTime.Now.Subtract(DateTime.Today);
int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound; int minDay = (int)Math.Ceiling((double)(DayElapsed.TotalMinutes / minRound)) * minRound;
@@ -25,16 +37,6 @@
return endRounded; return endRounded;
} }
public string IdxMacchina { get; set; } = "*";
public int MaxRecord { get; set; } = 100;
public DateTime DtRef { get; set; } = Init(5);
public int CurrPage { get; set; } = 1;
#endregion Public Properties
#region Public Methods
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
if (!(obj is SelectDossierParams item)) if (!(obj is SelectDossierParams item))
+2 -2
View File
@@ -12,13 +12,13 @@
#region Public Properties #region Public Properties
public string CodFlux { get; set; } = "*"; public string CodFlux { get; set; } = "*";
public int CurrPage { get; set; } = 1;
public string IdxMacchina { get; set; } = "*"; public string IdxMacchina { get; set; } = "*";
public string lastUpdate { get; set; } = "-";
public bool LiveUpdate { get; set; } = true; public bool LiveUpdate { get; set; } = true;
public int MaxRecord { get; set; } = 100; public int MaxRecord { get; set; } = 100;
public int TempoAgg { get; set; } = 2000; public int TempoAgg { get; set; } = 2000;
public int CurrPage { get; set; } = 1;
public string lastUpdate { get; set; } = "-";
#endregion Public Properties #endregion Public Properties
+3 -3
View File
@@ -5,7 +5,7 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>MP.SPEC</RootNamespace> <RootNamespace>MP.SPEC</RootNamespace>
<Version>6.16.2209.2110</Version> <Version>6.16.2209.2114</Version>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -17,8 +17,8 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.Negotiate" Version="6.0.6" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.Negotiate" Version="6.0.9" />
<PackageReference Include="Newtonsoft.Json" Version="9.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
+1 -1
View File
@@ -30,7 +30,7 @@
} }
</div> </div>
<div class="card-footer py-1"> <div class="card-footer py-1">
<DataPager @ref="pagerODL" PageSize="numRecord" currPage="currPage" numRecordChanged="ForceReload" totalCount="totalCount" showLoading="isLoading" /> <DataPager @ref="pagerODL" PageSize="numRecord" currPage="currPage" numRecordChanged="ForceReload" numPageChanged="ForceReloadPage" totalCount="totalCount" showLoading="isLoading" />
</div> </div>
</div> </div>
+6
View File
@@ -26,6 +26,12 @@ namespace MP.SPEC.Pages
numRecord = newNum; numRecord = newNum;
} }
protected void ForceReloadPage(int newNum)
{
currPage = newNum;
StateHasChanged();
}
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
isLoading = true; isLoading = true;
+21 -5
View File
@@ -8,20 +8,36 @@ namespace MP.SPEC.Pages
[IgnoreAntiforgeryToken] [IgnoreAntiforgeryToken]
public class ErrorModel : PageModel public class ErrorModel : PageModel
{ {
public string? RequestId { get; set; } #region Public Constructors
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
private readonly ILogger<ErrorModel> _logger;
public ErrorModel(ILogger<ErrorModel> logger) public ErrorModel(ILogger<ErrorModel> logger)
{ {
_logger = logger; _logger = logger;
} }
#endregion Public Constructors
#region Public Properties
public string? RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
#endregion Public Properties
#region Public Methods
public void OnGet() public void OnGet()
{ {
RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
} }
#endregion Public Methods
#region Private Fields
private readonly ILogger<ErrorModel> _logger;
#endregion Private Fields
} }
} }
+2 -7
View File
@@ -29,7 +29,7 @@ namespace MP.SPEC.Pages
protected void ForceReloadPage(int newNum) protected void ForceReloadPage(int newNum)
{ {
currPage = newNum; currPage = newNum;
currFilter.lastUpdate= $"Last Snapshot: {DateTime.Now:yyyy/MM/dd HH:mm:ss}"; currFilter.lastUpdate = $"Last Snapshot: {DateTime.Now:yyyy/MM/dd HH:mm:ss}";
currFilter.LiveUpdate = (currPage == 1); currFilter.LiveUpdate = (currPage == 1);
StateHasChanged(); StateHasChanged();
} }
@@ -66,11 +66,6 @@ namespace MP.SPEC.Pages
#endregion Protected Methods #endregion Protected Methods
#region Private Fields
#endregion Private Fields
#region Private Properties #region Private Properties
private SelectFluxParams currFilter { get; set; } = new SelectFluxParams(); private SelectFluxParams currFilter { get; set; } = new SelectFluxParams();
@@ -81,8 +76,8 @@ namespace MP.SPEC.Pages
set => MsgService.currPage = value; set => MsgService.currPage = value;
} }
private bool isLoading { get; set; } = true;
private bool isFiltering { get; set; } = false; private bool isFiltering { get; set; } = false;
private bool isLoading { get; set; } = true;
private int numRecord private int numRecord
{ {
+10 -3
View File
@@ -1,18 +1,25 @@
using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components;
using MP.SPEC.Data; using MP.SPEC.Data;
using System.Reflection;
namespace MP.SPEC.Pages namespace MP.SPEC.Pages
{ {
public partial class Utils public partial class Utils
{ {
[Inject] #region Public Methods
protected MpDataService MDService { get; set; }
public async Task flushCache() public async Task flushCache()
{ {
await Task.Delay(1); await Task.Delay(1);
await MDService.FlushRedisCache(); await MDService.FlushRedisCache();
} }
#endregion Public Methods
#region Protected Properties
[Inject]
protected MpDataService MDService { get; set; }
#endregion Protected Properties
} }
} }
+25 -25
View File
@@ -1,28 +1,28 @@
{ {
"iisSettings": { "iisSettings": {
"windowsAuthentication": true, "windowsAuthentication": true,
"anonymousAuthentication": false, "anonymousAuthentication": false,
"iisExpress": { "iisExpress": {
"applicationUrl": "http://localhost:46815", "applicationUrl": "http://localhost:46815",
"sslPort": 44370 "sslPort": 44370
}
},
"profiles": {
"MP.SPEC": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7212;http://localhost:5212",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
} }
},
"profiles": {
"MP.SPEC": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:7212;http://localhost:5212",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
} }
+1 -1
View File
@@ -1,6 +1,6 @@
<body> <body>
<i>Modulo MAPOSPEC </i> <i>Modulo MAPOSPEC </i>
<h4>Versione: 6.16.2209.2110</h4> <h4>Versione: 6.16.2209.2114</h4>
<br /> Note di rilascio: <br /> Note di rilascio:
<ul> <ul>
<li> <li>
+1 -1
View File
@@ -1 +1 @@
6.16.2209.2110 6.16.2209.2114
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<item> <item>
<version>6.16.2209.2110</version> <version>6.16.2209.2114</version>
<url>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip</url> <url>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html</changelog> <changelog>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory> <mandatory>false</mandatory>
+18 -10
View File
@@ -24,16 +24,16 @@ main {
display: flex;*/ display: flex;*/
} }
.top-row ::deep a, .top-row ::deep a,
.top-row .btn-link { .top-row .btn-link {
white-space: nowrap; white-space: nowrap;
margin-left: 1.5rem; margin-left: 1.5rem;
} }
.top-row a:first-child { .top-row a:first-child {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.bottom-row { .bottom-row {
color: #dedede; color: #dedede;
@@ -46,9 +46,11 @@ main {
.top-row:not(.auth) { .top-row:not(.auth) {
display: none; display: none;
} }
.top-row.auth { .top-row.auth {
justify-content: space-between; justify-content: space-between;
} }
.top-row a, .top-row a,
.top-row .btn-link { .top-row .btn-link {
margin-left: 0; margin-left: 0;
@@ -59,34 +61,40 @@ main {
.page { .page {
flex-direction: row; flex-direction: row;
} }
.sidebar { .sidebar {
width: 15rem; width: 15rem;
height: 100vh; height: 100vh;
position: sticky; position: sticky;
top: 0; top: 0;
} }
.sidebarSmall { .sidebarSmall {
width: 5rem; width: 5rem;
height: 100vh; height: 100vh;
position: sticky; position: sticky;
top: 0; top: 0;
} }
.top-row { .top-row {
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 1; z-index: 1;
} }
.top-row, .top-row,
article { article {
padding-left: 0.5rem !important; padding-left: 0.5rem !important;
padding-right: 0.5rem !important; padding-right: 0.5rem !important;
} }
.bottom-row { .bottom-row {
position: fixed; position: fixed;
bottom: 0; bottom: 0;
z-index: 1; z-index: 1;
} }
.main>div {
.main > div {
padding-left: 0.5rem !important; padding-left: 0.5rem !important;
padding-right: 0.5rem !important; padding-right: 0.5rem !important;
/*padding-left: 2rem !important; /*padding-left: 2rem !important;