This commit is contained in:
2021-05-22 13:44:34 +01:00
parent 047e8b235a
commit 778ee3aa03
32 changed files with 254 additions and 135 deletions
@@ -12,7 +12,7 @@ using System.Text;
namespace Saxonite.Net.Core.Web.Base.Consoles
{
//=======================================================================
public class SaxDataCacheConsole_Web : SaxDataCacheConsole
public abstract class SaxDataCacheConsole_Web : SaxDataCacheConsole
{
//-------------------------------------------------------------------
// Data members.
@@ -34,6 +34,10 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
base.Dispose(disposing);
}
//-------------------------------------------------------------------
// Utilities.
protected abstract void ForceRefresh();
//-------------------------------------------------------------------
// Regions.
public bool RegionsSupported { get; protected set; } = false;
@@ -48,7 +52,8 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
String fn = GetType().Name + ".ActiveRegions";
if (!RegionsSupported) throw new NotSupportedException(fn + " Regions not supported.");
List<SaxRegion> activeRegions = new List<SaxRegion>();
lock (regionsData)
if (regionsData.regions == null) ForceRefresh();
lock (regionsData)
{
if (regionsData.regions == null) throw new NotSupportedException(fn + " Regions not populated.");
activeRegions = new List<SaxRegion>(regionsData.activeRegions);
@@ -119,9 +124,9 @@ namespace Saxonite.Net.Core.Web.Base.Consoles
String fn = GetType().Name + ".ActiveSports";
if (!SportsSupported) throw new NotSupportedException(fn + " Sports not supported.");
List<SaxSport> activeSports = new List<SaxSport>();
if (sportsData.sports == null) ForceRefresh();
lock (sportsData)
{
if (sportsData.sports == null) throw new NotSupportedException(fn + " Sports not populated.");
foreach (SaxSport sport in sportsData.sports.GetValues())
{
if (IsSportActive(sport))
@@ -78,7 +78,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
return View(new ErrorViewModel(Localiser) { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
//-------------------------------------------------------------------
@@ -65,13 +65,6 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
return View(model);
}
//-------------------------------------------------------------------
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
//-------------------------------------------------------------------
}
//=======================================================================
@@ -1,10 +1,18 @@
using Saxonite.Net.Core.Web.Base.App;
using System;
namespace Saxonite.Net.Core.Web.Admin.Models
{
//=======================================================================
public class ErrorViewModel
public class ErrorViewModel : SaxModel_Admin
{
//-------------------------------------------------------------------
// Construction.
public ErrorViewModel(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
public string RequestId { get; set; }
@@ -21,7 +21,7 @@ namespace Saxonite.Net.Core.Web.Admin.Models
public Model_Security(SaxLocaliser localiser) :
base(localiser)
{
AdditionalFiles_CSS.Add("css/sax-security.css");
//AdditionalFiles_CSS.Add("css/sax-security.css");
AdditionalFiles_JS.Add("js/sax-security.js");
}
@@ -8,11 +8,12 @@
<div class="">
<div class="sax-panel-filter">
<div class="sax-header">
<div class="floatl sax-caption">@Localiser["organisation.caption.organisations"]</div>
<div class="floatr sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="floatr sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col"><div class="sax-caption">@Localiser["organisation.caption.organisations"]</div></div>
<div class="fixed row">
<div class="sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
</div>
</div>
<div class="sax-content">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmOrganisationFilter", @class = "sax-form", @onSubmit = "return false;" }))
@@ -30,10 +31,13 @@
<div class="sax-panel-item-list"></div>
<div class="sax-panel-item-template">
<div class="sax-panel-item Organisation">
<div class="sax-header">
<div class="floatl sax-caption"><div class="OrganisationName">Organisation name</div></div>
<div class="floatr sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col">
<div class="sax-caption"><div class="sax-action OrganisationName">Organisation name</div></div>
</div>
<div class="fixed sax-actions">
<div class="fixed sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
</div>
</div>
<div class="sax-content">
<div class="row">
@@ -8,11 +8,12 @@
<div class="">
<div class="sax-panel-filter OrganisationMembers">
<div class="sax-header">
<div class="floatl sax-caption">@Localiser["organisation.caption.members"]</div>
<div class="floatr sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="floatr sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col"><div class="sax-caption">@Localiser["organisation.caption.members"]</div></div>
<div class="fixed row">
<div class="fixed sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="fixed sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
</div>
</div>
<div class="sax-content">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmMemberFilter", @class = "sax-form", @onSubmit = "return false;" }))
@@ -38,10 +39,13 @@
<div class="sax-panel-item-list"></div>
<div class="sax-panel-item-template">
<div class="sax-panel-item Member">
<div class="sax-header">
<div class="floatl sax-caption"><div class="UserDisplayName"></div></div>
<div class="floatr sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col">
<div class="sax-caption"><div class="sax-action UserDisplayName"></div></div>
</div>
<div class="fixed sax-actions">
<div class="sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
</div>
</div>
<div class="sax-content">
<div class="row">
+13 -9
View File
@@ -8,11 +8,12 @@
<div class="">
<div class="sax-panel-filter">
<div class="sax-header">
<div class="floatl sax-caption">@Localiser["region.caption.regions"]</div>
<div class="floatr sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="floatr sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col"><div class="sax-caption">@Localiser["region.caption.regions"]</div></div>
<div class="fixed row">
<div class="sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
</div>
</div>
<div class="sax-content">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmRegionFilter", @class = "sax-form", @onSubmit = "return false;" }))
@@ -30,10 +31,13 @@
<div class="sax-panel-item-list"></div>
<div class="sax-panel-item-template">
<div class="sax-panel-item Region">
<div class="sax-header">
<div class="floatl sax-caption"><span class="RegionName"></span> <span class="RegionCountryIso2Code"></span></div>
<div class="floatr sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col">
<div class="sax-caption"><div class="sax-action"><span class="RegionName"></span> <span class="RegionCountryIso2Code"></span></div></div>
</div>
<div class="fixed sax-actions">
<div class="sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
</div>
</div>
<div class="sax-content">
<div class="row">
@@ -39,7 +39,6 @@
<div class="row">
<div class="col-auto sax-label-text pt4">@Localiser["label.strength"]&nbsp;</div>
<div id="" class="col-auto"><div id="prgPasswordStrength" class="col-auto"></div></div>
<div class="clearb"></div>
</div>
<div class="sax-message"></div>
</div>
@@ -34,7 +34,6 @@
<div class="sax-action-link" style="font-size:12px;" onclick="sax.goToPage('Security/RequestPassword');">@Localiser["label.forgotten.password"]</div>
</div>
</div>
<div class="clearb"></div>
<div class="sax-control">
@Html.PasswordFor(model => model.Password, new { @id = "ifPassword", @class = "sax-input", @maxlength = @Model.PasswordMaxLength })
</div>
+14 -10
View File
@@ -8,11 +8,12 @@
<div class="">
<div class="sax-panel-filter">
<div class="sax-header">
<div class="floatl sax-caption">@Localiser["sport.caption.sports"]</div>
<div class="floatr sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="floatr sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col"><div class="sax-caption">@Localiser["sport.caption.sports"]</div></div>
<div class="fixed row">
<div class="sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
</div>
</div>
<div class="sax-content">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmSportFilter", @class = "sax-form", @onSubmit = "return false;" }))
@@ -30,10 +31,13 @@
<div class="sax-panel-item-list"></div>
<div class="sax-panel-item-template">
<div class="sax-panel-item Sport">
<div class="sax-header">
<div class="floatl sax-caption"><div class="SportName">Sport name</div></div>
<div class="floatr sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col">
<div class="sax-caption"><div class=" sax-action SportName">Sport name</div></div>
</div>
<div class="fixed sax-actions">
<div class="sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
</div>
</div>
<div class="sax-content">
<div class="row">
@@ -47,7 +51,7 @@
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@@ -7,10 +7,11 @@
<div class="container-fluid">
<div class="sax-panel-filter">
<div class="sax-header">
<div class="floatl sax-caption">@Localiser["system.caption.database"]</div>
<div class="floatr sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col"><div class="sax-caption">@Localiser["system.caption.database"]</div></div>
<div class="fixed row">
<div class="sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
</div>
</div>
<div class="sax-content">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmDatabaseFilter", @class = "sax-form", @onSubmit = "return false;" }))
@@ -29,8 +30,12 @@
<div class="sax-panel-item-template">
<div class="sax-panel-item DatabaseTable">
<div class="sax-header">
<div class="sax-caption TableName"></div>
<div class="sax-header row">
<div class="col">
<div class="sax-caption"><div class="sax-action TableName"></div></div>
</div>
<div class="fixed sax-actions">
</div>
</div>
<div class="sax-content"></div>
</div>
+11 -6
View File
@@ -7,10 +7,11 @@
<div class="container-fluid">
<div class="sax-panel-filter">
<div class="sax-header">
<div class="floatl sax-caption">@Localiser["system.caption.logs"]</div>
<div class="floatr sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col"><div class="sax-caption">@Localiser["system.caption.logs"]</div></div>
<div class="fixed row">
<div class="sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
</div>
</div>
<div class="sax-content">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmLogsFilter", @class = "sax-form", @onSubmit = "return false;" }))
@@ -29,8 +30,12 @@
<div class="sax-panel-item-template">
<div class="sax-panel-item LogFile">
<div class="sax-header">
<div class="sax-caption Filename"></div>
<div class="sax-header row">
<div class="col">
<div class="sax-caption"><div class="sax-action Filename"></div></div>
</div>
<div class="fixed sax-actions">
</div>
</div>
<div class="sax-content"></div>
</div>
+16 -12
View File
@@ -8,11 +8,12 @@
<div class="">
<div class="sax-panel-filter">
<div class="sax-header">
<div class="floatl sax-caption">@Localiser["user.caption.users"]</div>
<div class="floatr sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="floatr sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col"><div class="sax-caption">@Localiser["user.caption.users"]</div></div>
<div class="fixed row">
<div class="sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
</div>
</div>
<div class="sax-content">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmUserFilter", @class = "sax-form", @onSubmit = "return false;" }))
@@ -30,24 +31,27 @@
<div class="sax-panel-item-list"></div>
<div class="sax-panel-item-template">
<div class="sax-panel-item User">
<div class="sax-header">
<div class="floatl sax-caption"><div class="UserEmailAddress"></div></div>
<div class="floatr sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col">
<div class="sax-caption"><div class="sax-action UserEmailAddress"></div></div>
</div>
<div class="fixed sax-actions">
<div class="sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
</div>
</div>
<div class="sax-content">
<div class="row">
<div class="col-sm-4"><span class="UserDisplayName"></span></div>
<div class="col-sm-4"><div>Roles: <span class="UserRoleCount"></span></div></div>
<div class="col-sm-4 right"><div class="StatusDesc"></div></div>
</div>
<div class="col-sm-4 right"><div class="StatusDesc"></div></div>
</div>
<div class="row">
<div class="col-sm-4"></div>
<div class="col-sm-4"><div class=""></div></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
+23 -2
View File
@@ -105,7 +105,7 @@
border-radius: 6px;
-webkit-border-radius: 6px;
-moz-border-radius: 6px;
overflow:hidden;
overflow: hidden;
}
.sax-panel-item .sax-header
@@ -116,13 +116,34 @@
border-bottom: solid 2px #979797;
}
.sax-panel-item .sax-caption
.sax-panel-item .sax-header .sax-caption
{
margin-top: 4px;
font-size: 1.2rem;
font-weight: bold;
}
.sax-panel-item .sax-header .sax-action
{
border-radius: 4px;
}
.sax-panel-item .sax-header .sax-caption .sax-action:hover
{
color: var(--color-light);
}
.sax-panel-item .sax-header .sax-actions .sax-action
{
margin: 2px 0 0 8px;
}
.sax-panel-item .sax-header .sax-actions .sax-action:hover
{
background-color: #c0c0c0;
box-shadow: 0 0 4px 2px #c0c0c080;
}
.sax-panel-item .sax-content
{
margin: 4px 8px;
@@ -22,7 +22,7 @@
}
sax.doRefreshResults = function (response)
{
sax.debug('doRefreshResults', response);
//sax.debug('doRefreshResults', response);
delete sax.awaitingRefreshResponse;
sax.refreshControlValues(response.controlValues);
var $results = $('.sax-panel-results');
@@ -58,7 +58,9 @@
$('.OrganisationSport', $item).text(item.sportName);
$('.OrganisationMemberCount', $item).on('click', function () { sax.onClickMemberCount(item.id); }).find('.MemberCount').text(item.memberCount);
$('.StatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$('.sax-caption .sax-action, .sax-actions .sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$item.off('dblclick').on('dblclick', function () { sax.updateItem(item.id) })
$('.sax-panel-results .sax-panel-messages').hide().empty();
}
//--------------------------------------------------------------
@@ -83,7 +85,7 @@
}
sax.onRegionSelected = function (rgn)
{
sax.debug('onRegionSelected', rgn);
//sax.debug('onRegionSelected', rgn);
let $frm = sax.$frm.organisation;
$('.OrganisationRegionId', $frm).val(rgn.id);
$('.OrganisationRegionCaption', $frm).val(rgn.name);
@@ -111,7 +113,7 @@
}
sax.onSportSelected = function (rgn)
{
sax.debug('onSportSelected', rgn);
//sax.debug('onSportSelected', rgn);
let $frm = sax.$frm.organisation;
$('.OrganisationSportId', $frm).val(rgn.id);
$('.OrganisationSportCaption', $frm).val(rgn.name);
@@ -58,7 +58,9 @@
$('.UserDisplayName', $item).text(item.displayName);
$('.MemberRoleCount .RoleCount', $item).text(item.roleCount);
$('.StatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$('.sax-caption .sax-action, .sax-actions .sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$item.off('dblclick').on('dblclick', function () { sax.updateItem(item.id) })
$('.sax-panel-results .sax-panel-messages').hide().empty();
}
//--------------------------------------------------------------
@@ -56,7 +56,9 @@
$('.RegionTypeDesc', $item).text(item.regionTypeDesc);
$('.RegionParentName', $item).text(item.parentName);
$('.RegionStatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$('.sax-caption .sax-action, .sax-actions .sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$item.off('dblclick').on('dblclick', function () { sax.updateItem(item.id) })
$('.sax-panel-results .sax-panel-messages').hide().empty();
}
//--------------------------------------------------------------
+3 -1
View File
@@ -53,7 +53,9 @@
$item.prop('id', sax.itemIdPrefix + item.id);
$('.SportName', $item).text(item.name);
$('.StatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$('.sax-caption .sax-action, .sax-actions .sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$item.off('dblclick').on('dblclick', function () { sax.updateItem(item.id) })
$('.sax-panel-results .sax-panel-messages').hide().empty();
}
//--------------------------------------------------------------
+3 -1
View File
@@ -65,7 +65,9 @@
$('.UserLastName', $item).text(item.lastName);
$('.UserRoleCount', $item).text(item.userRoleCount);
$('.StatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$('.sax-caption .sax-action, .sax-actions .sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$item.off('dblclick').on('dblclick', function () { sax.updateItem(item.id) })
$('.sax-panel-results .sax-panel-messages').hide().empty();
}
//--------------------------------------------------------------
@@ -1,4 +1,5 @@
using Saxonite.Net.Core.Web.Base.Consoles;
using Sarand.Net.Standard.Base.App;
using Saxonite.Net.Core.Web.Base.Consoles;
using Saxonite.Net.Standard.Base.App;
using Saxonite.Net.Standard.Base.Consoles;
using System;
@@ -17,6 +18,7 @@ namespace Saxonite.Net.Core.Web.Online.Consoles
public SaxDataCacheConsole_Online(SaxSessionContext sessionContext) :
base(sessionContext)
{
String fn = GetType().Name + ".CTR";
RegionsSupported = true;
SportsSupported = true;
@@ -24,11 +26,26 @@ namespace Saxonite.Net.Core.Web.Online.Consoles
refreshTimer = new System.Timers.Timer(Math.Max(2, Sax.Config.Online.DataCache.RefreshIntervalSecs.Initial) * 1000);
refreshTimer.Elapsed += RefreshTimer_Elapsed;
refreshTimer.Start();
SaLogger.Info(fn + " Refresh timer initialised. Interval: " + refreshTimer.Interval, true);
}
//-------------------------------------------------------------------
// Utilities.
protected override void ForceRefresh()
{
String fn = GetType().Name + ".ForceRefresh";
SaLogger.Warn(fn + " Refresh timer initialised", true);
RefreshData();
}
//-------------------------------------------------------------------
// Refresh data cache.
private void RefreshTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
refreshTimer.Stop();
RefreshData();
}
private void RefreshData()
{
refreshTimer.Stop();
@@ -84,7 +84,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
return View(new ErrorViewModel(Localiser) { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
//-------------------------------------------------------------------
@@ -1,10 +1,18 @@
using Saxonite.Net.Core.Web.Base.App;
using System;
namespace Saxonite.Net.Core.Web.Online.Models
{
//=======================================================================
public class ErrorViewModel
public class ErrorViewModel : SaxModel_Online
{
//-------------------------------------------------------------------
// Construction.
public ErrorViewModel(SaxLocaliser localiser) :
base(localiser)
{
}
//-------------------------------------------------------------------
public string RequestId { get; set; }
@@ -7,11 +7,12 @@
<div class="">
<div class="sax-panel-filter">
<div class="sax-header">
<div class="floatl sax-caption">@Localiser["journalist.caption.articles"]</div>
<div class="floatr sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="floatr sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col"><div class="sax-caption">@Localiser["journalist.caption.articles"]</div></div>
<div class="fixed row">
<div class="sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="sax-action sax-item-create"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
</div>
</div>
<div class="sax-content">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmArticleFilter", @class = "sax-form", @action = "#", @method = "POST", onsubmit = "return false;" }))
@@ -29,25 +30,28 @@
<div class="sax-panel-item-list"></div>
<div class="sax-panel-item-template">
<div class="sax-panel-item Article">
<div class="sax-header">
<div class="floatl sax-caption"><div class="ArticleHeadline"></div></div>
<div class="floatr sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
<div class="clearb"></div>
</div>
<div class="sax-content">
<div class="row">
<div class="col-sm-12"><div class="ArticleSummary"></div></div>
<div class="col-sm-6"><div class="ArticleRegionCaption"></div></div>
<div class="col-sm-6 right"><div class="ArticleSportCaption"></div></div>
<div class="sax-header row">
<div class="col">
<div class="sax-caption"><div class="sax-action ArticleHeadline"></div></div>
</div>
<div class="row">
<div class="col-sm-4"><div class="">@Localiser["label.created"]:&nbsp;<span class="ArticleCreatedOn"></span></div></div>
<div class="col-sm-4"><div class="ArticlePublished">@Localiser["label.published"]:&nbsp;<span class="ArticlePublishedOn"></span></div></div>
<div class="col-sm-4 right"><div class="ArticleStatusDesc"></div></div>
<div class="fixed sax-actions">
<div class="sax-action sax-item-update"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
</div>
</div>
<div class="sax-content">
<div class="row">
<div class="col-sm-12"><div class="ArticleSummary"></div></div>
<div class="col-sm-6"><div class="ArticleRegionCaption"></div></div>
<div class="col-sm-6 right"><div class="ArticleSportCaption"></div></div>
</div>
<div class="row">
<div class="col-sm-4"><div class="">@Localiser["label.created"]:&nbsp;<span class="ArticleCreatedOn"></span></div></div>
<div class="col-sm-4"><div class="ArticlePublished">@Localiser["label.published"]:&nbsp;<span class="ArticlePublishedOn"></span></div></div>
<div class="col-sm-4 right"><div class="ArticleStatusDesc"></div></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@@ -7,11 +7,12 @@
<div id="pnlOpportunities">
<div class="sax-panel-filter">
<div class="sax-header">
<div class="floatl sax-caption">@Localiser["organisation.caption.opportunities"]</div>
<div class="floatr sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="floatr sax-action sax-item-create hidden"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
<div class="clearb"></div>
<div class="sax-header row">
<div class="col"><div class="sax-caption">@Localiser["organisation.caption.opportunities"]</div></div>
<div class="fixed row">
<div class="sax-action sax-results-refresh"><img src="~/img/action/refresh24.png" alt="@(Localiser["label.refresh"])" title="@(Localiser["label.refresh"])" /></div>
<div class="sax-action sax-item-create hidden"><img src="~/img/action/add24.png" alt="@(Localiser["label.create"])" title="@(Localiser["label.create"])" /></div>
</div>
</div>
<div class="sax-content">
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmOpportunityFilter", @class = "sax-form", @action = "#", @method = "POST", onsubmit = "return false;" }))
@@ -37,25 +38,28 @@
<div class="sax-panel-item-list"></div>
<div class="sax-panel-item-template">
<div class="sax-panel-item Opportunity">
<div class="sax-header">
<div class="floatl sax-caption"><span class="OpportunityType"></span> - <span class="OpportunityPosition"></span></div>
<div class="floatr sax-action sax-item-update hidden"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
<div class="clearb"></div>
</div>
<div class="sax-content">
<div class="row">
<div class="col-sm-12"><div class="OpportunityOutline"></div></div>
<div class="col-sm-6"><div class="OpportunityRegionCaption"></div></div>
<div class="col-sm-6 right"><div class="OpportunitySportCaption"></div></div>
<div class="sax-header row">
<div class="col">
<div class="sax-caption"><div class="sax-action"><span class="OpportunityType"></span> - <span class="OpportunityPosition"></span></div></div>
</div>
<div class="row">
<div class="col-sm-4"><div class="">@Localiser["label.created"]:&nbsp;<span class="OpportunityCreatedOn"></span></div></div>
<div class="col-sm-4"><div class="OpportunityPublished">@Localiser["label.published"]:&nbsp;<span class="OpportunityPublishedOn"></span></div></div>
<div class="col-sm-4 right"><div class="OpportunityStatusDesc"></div></div>
<div class="fixed sax-actions">
<div class="sax-action sax-item-update hidden"><img src="~/img/action/edit24.png" alt="@(Localiser["label.update"])" title="@(Localiser["label.update"])" /></div>
</div>
</div>
<div class="sax-content">
<div class="row">
<div class="col-sm-12"><div class="OpportunityOutline"></div></div>
<div class="col-sm-6"><div class="OpportunityRegionCaption"></div></div>
<div class="col-sm-6 right"><div class="OpportunitySportCaption"></div></div>
</div>
<div class="row">
<div class="col-sm-4"><div class="">@Localiser["label.created"]:&nbsp;<span class="OpportunityCreatedOn"></span></div></div>
<div class="col-sm-4"><div class="OpportunityPublished">@Localiser["label.published"]:&nbsp;<span class="OpportunityPublishedOn"></span></div></div>
<div class="col-sm-4 right"><div class="OpportunityStatusDesc"></div></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@@ -42,7 +42,6 @@
<div class="row">
<div class="col-auto sax-label-text pt4">@Localiser["label.strength"]&nbsp;</div>
<div id="" class="col-auto"><div id="prgPasswordStrength" class="col-auto"></div></div>
<div class="clearb"></div>
</div>
<div class="sax-message"></div>
</div>
@@ -38,7 +38,6 @@
<div class="sax-action-link" style="font-size:12px;" onclick="sax.goToPage('Security/RequestPassword');">@Localiser["label.forgotten.password"]</div>
</div>
</div>
<div class="clearb"></div>
<div class="sax-control">
@Html.PasswordFor(model => model.Password, new { @id = "ifPassword", @class = "sax-input", @maxlength = @Model.PasswordMaxLength })
</div>
@@ -129,6 +129,27 @@
font-weight: bold;
}
.sax-panel-item .sax-header .sax-action
{
border-radius: 4px;
}
.sax-panel-item .sax-header .sax-caption .sax-action:hover
{
color: var(--color-primary);
}
.sax-panel-item .sax-header .sax-actions .sax-action
{
margin: 2px 0 0 8px;
}
.sax-panel-item .sax-header .sax-actions .sax-action:hover
{
background-color: #c0c0c0;
box-shadow: 0 0 4px 2px #c0c0c080;
}
.sax-panel-item > .sax-content
{
margin: 6px 8px;
@@ -54,7 +54,8 @@
$('.ArticlePublishedOn', $item).text(item.publishedOnFmt);
$('.ArticlePublished', $item).toggle(!!item.publishedOnFmt);
$('.ArticleStatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$('.sax-caption .sax-action, .sax-actions .sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) })
$item.off('dblclick').on('dblclick', function () { sax.updateItem(item.id) })
$('.sax-panel-results .sax-panel-messages').hide().empty();
}
@@ -67,7 +67,8 @@
$('.OpportunityExpiresOn', $item).text(item.expiresOnFmt);
$('.OpportunityExpires', $item).toggle(!!item.expiresOnFmt);
$('.OpportunityStatusDesc', $item).text(item.statusDesc);
$('.sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) });
$('.sax-caption .sax-action, .sax-actions .sax-action.sax-item-update', $item).off('click').on('click', function () { sax.updateItem(item.id) });
$item.off('dblclick').on('dblclick', function () { sax.updateItem(item.id) });
$('.sax-panel-results .sax-panel-messages').hide().empty();
}
+1 -1
View File
@@ -18,7 +18,7 @@ namespace Saxonite.Net.Standard.Base.App
//-------------------------------------------------------------------
public static class Version
{
private static String version { get; } = "1.0.4.0";
private static String version { get; } = "1.0.4.2";
// Retrieve version.
public static String GetFullVersion () { return version; }
public static String GetAppVersion ()
@@ -81,7 +81,7 @@ namespace Saxonite.Net.Standard.Dbas.Mgr
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn(GetType().Name + ".GetUserAccount\n\tQuery: " + dbCommand.CommandText + "\n\t" + exc.GetType().Name + ": " + exc.Message);
SaLogger.Warn(GetType().Name + ".GetUserAccount\n\tQuery: " + dbCommand.CommandText + "\n\t" + ExceptionUtil.GetLogMessage(exc));
}
}
return userAccount;