v1.0.5.3
Activity index, Db schema validation.
This commit is contained in:
@@ -3,13 +3,19 @@ using Sarand.Net.Standard.Base.App;
|
||||
using Sarand.Net.Standard.Base.Bus;
|
||||
using Sarand.Net.Standard.Base.Core;
|
||||
using Sarand.Net.Standard.Base.Dbas;
|
||||
using Sarand.Net.Standard.Base.Helpers;
|
||||
using Sarand.Net.Standard.Base.Procs;
|
||||
using Sarand.Net.Standard.Base.Utils;
|
||||
using Sarand.Net.Standard.Dbas.Data;
|
||||
using Sarand.Net.Standard.Dbas.Proc;
|
||||
using Saxonite.Net.Core.Web.Admin.Models;
|
||||
using Saxonite.Net.Standard.Base.App;
|
||||
using Saxonite.Net.Standard.Base.Bus;
|
||||
using Saxonite.Net.Standard.Dbas.App;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Saxonite.Net.Core.Web.Admin.Controllers
|
||||
@@ -17,7 +23,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
|
||||
//=======================================================================
|
||||
// System - Ajax - Database controller
|
||||
//=======================================================================
|
||||
partial class SystemController
|
||||
partial class SystemController : SaDbProcess_CompareDatabaseSchemas.IProcessNotifier
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Database data.
|
||||
@@ -92,6 +98,90 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Validate Database Schema ajax request.
|
||||
//-------------------------------------------------------------------
|
||||
public class DbSchemaItemResponseData
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public String TableName { get; set; }
|
||||
public String ColumnName { get; set; }
|
||||
public int ColumnPosition { get; set; }
|
||||
public String IndexName { get; set; }
|
||||
public String Comment { get; set; }
|
||||
}
|
||||
public class AjaxResponse_ValidateDatabaseSchema : AjaxResponse_Data
|
||||
{
|
||||
public List<DbSchemaItemResponseData> Items { get; } = new List<DbSchemaItemResponseData>();
|
||||
}
|
||||
//-------------------------------------------------------------------
|
||||
[HttpPost]
|
||||
[Route("System/Ajax/ValidateDatabaseSchema")]
|
||||
public IActionResult Ajax_ValidateDatabaseSchema(Model_Sport model)
|
||||
{
|
||||
String fn = GetType().Name + ".Ajax_GetDatabaseTables";
|
||||
String messageTitle = Localiser["system.caption.database"];
|
||||
AjaxResponse_ValidateDatabaseSchema responseData = new AjaxResponse_ValidateDatabaseSchema();
|
||||
|
||||
// Validate session.
|
||||
if (!ValidUserSession)
|
||||
return GetAjaxResult_InvalidSession(responseData);
|
||||
|
||||
// Core Database connection.
|
||||
ISacsDatabase db = SaxGlobals.App.GetCoreDatabase(SessionContext);
|
||||
|
||||
// Retrieve XML database schema definition.
|
||||
var assembly = typeof(SaxSystem_Dbas).GetTypeInfo().Assembly;
|
||||
String xmlSchema = SacsResourceHelper.GetManifestResourceAsText(assembly, "", "SaxDbDfn_Core.xml");
|
||||
if (StringUtil.IsEmpty(xmlSchema))
|
||||
return Json(responseData.SetMessage(messageTitle, "Failed to extract XML schema definition."));
|
||||
|
||||
// Extract schema from XML definition.
|
||||
SaDbProcess_ConvertDbSchema.Config cfgSchemaConvert = new SaDbProcess_ConvertDbSchema.Config();
|
||||
SaDbProcess_ConvertDbSchema procSchemaConvert = new SaDbProcess_ConvertDbSchema(cfgSchemaConvert);
|
||||
List<DbDfnTable> tables = procSchemaConvert.ConvertXmlToTables(xmlSchema);
|
||||
if (procSchemaConvert.HasProcessError())
|
||||
return Json(responseData.SetMessage(messageTitle, "Failed to convert XML schema: " + procSchemaConvert.GetProcessError()));
|
||||
|
||||
SaDbProcess_CompareDatabaseSchemas.Config cfgSchemaCompare = new SaDbProcess_CompareDatabaseSchemas.Config(tables, db);
|
||||
cfgSchemaCompare.HideIdenticalObjects = true;
|
||||
SaDbProcess_CompareDatabaseSchemas procSchemaCompare = new SaDbProcess_CompareDatabaseSchemas(cfgSchemaCompare);
|
||||
procSchemaCompare.ProcessNotifier = this;
|
||||
procSchemaCompare.RunProcess();
|
||||
|
||||
List<SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem> schemaComparisonItems = procSchemaCompare.GetSchemaComparisonItems();
|
||||
foreach (SaDbProcess_CompareDatabaseSchemas.SchemaComparisonItem schemaComparisonItem in schemaComparisonItems)
|
||||
{
|
||||
DbSchemaItemResponseData item = new DbSchemaItemResponseData()
|
||||
{
|
||||
Id = schemaComparisonItem.Id,
|
||||
TableName = schemaComparisonItem.TableName,
|
||||
ColumnName = schemaComparisonItem.ColumnName,
|
||||
ColumnPosition = schemaComparisonItem.ColumnPosition,
|
||||
IndexName = schemaComparisonItem.IndexName,
|
||||
Comment = schemaComparisonItem.Comment
|
||||
};
|
||||
responseData.Items.Add(item);
|
||||
}
|
||||
|
||||
// Complete response.
|
||||
responseData.Success = true;
|
||||
return Json(responseData);
|
||||
}
|
||||
|
||||
public void OnStartProcess()
|
||||
{
|
||||
}
|
||||
public void SetProgressInfo(List<string> progressInfo)
|
||||
{
|
||||
}
|
||||
public void OnEndProcess()
|
||||
{
|
||||
}
|
||||
public void OnSchemaComparisonItemAdded(SaDbProcess_CompareDatabaseSchemas proc)
|
||||
{
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace Saxonite.Net.Core.Web.Admin.Models
|
||||
public Model_Home(SaxLocaliser localiser) :
|
||||
base(localiser)
|
||||
{
|
||||
AdditionalFiles_JS.Add("js/sax-home.js");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
@@ -159,6 +159,9 @@
|
||||
<data name="label.close" xml:space="preserve">
|
||||
<value>Close</value>
|
||||
</data>
|
||||
<data name="label.column" xml:space="preserve">
|
||||
<value>Column</value>
|
||||
</data>
|
||||
<data name="label.columns" xml:space="preserve">
|
||||
<value>Columns</value>
|
||||
</data>
|
||||
@@ -186,6 +189,9 @@
|
||||
<data name="label.forgotten.password" xml:space="preserve">
|
||||
<value>Forgotten password?</value>
|
||||
</data>
|
||||
<data name="label.index" xml:space="preserve">
|
||||
<value>Index</value>
|
||||
</data>
|
||||
<data name="label.indices" xml:space="preserve">
|
||||
<value>Indices</value>
|
||||
</data>
|
||||
@@ -273,6 +279,9 @@
|
||||
<data name="label.system" xml:space="preserve">
|
||||
<value>System</value>
|
||||
</data>
|
||||
<data name="label.table" xml:space="preserve">
|
||||
<value>Table</value>
|
||||
</data>
|
||||
<data name="label.title" xml:space="preserve">
|
||||
<value>Title</value>
|
||||
</data>
|
||||
@@ -441,9 +450,15 @@
|
||||
<data name="system.caption.database" xml:space="preserve">
|
||||
<value>System - Database</value>
|
||||
</data>
|
||||
<data name="system.caption.database.schema" xml:space="preserve">
|
||||
<value>Database Schema</value>
|
||||
</data>
|
||||
<data name="system.caption.logs" xml:space="preserve">
|
||||
<value>System - Logs</value>
|
||||
</data>
|
||||
<data name="system.msg.database.schema.valid" xml:space="preserve">
|
||||
<value>Database schema is valid.</value>
|
||||
</data>
|
||||
<data name="user.caption.select.user.roles" xml:space="preserve">
|
||||
<value>Select User Roles</value>
|
||||
</data>
|
||||
|
||||
@@ -3,6 +3,31 @@
|
||||
ViewData["Title"] = "Home Page";
|
||||
}
|
||||
|
||||
<div class="text-center">
|
||||
<h1 class="display-4">Welcome</h1>
|
||||
<script>
|
||||
sax.msg.dbSchemaValid = '@Localiser.GetJavascriptText("system.msg.database.schema.valid")';
|
||||
</script>
|
||||
|
||||
<div class="sax-panel-info sax-panel-results DbSchema">
|
||||
|
||||
<div class="sax-header">
|
||||
<div class="sax-caption">@Localiser["system.caption.database.schema"]</div>
|
||||
</div>
|
||||
<div class="sax-content">
|
||||
<div class="sax-panel-messages"></div>
|
||||
<div class="sax-panel-item-list"></div>
|
||||
<div class="sax-panel-item-template">
|
||||
<div class="sax-panel-item DbSchemaItem">
|
||||
<div class="sax-header">
|
||||
<div class="sax-caption SchemaTable">@(Localiser["label.table"]): <span class="TableName"></span></div>
|
||||
</div>
|
||||
<div class="sax-content">
|
||||
<div class="SchemaIndex">@(Localiser["label.index"]): <span class="IndexName"></span></div>
|
||||
<div class="SChemColumn">@(Localiser["label.column"]): <span class="ColumnName"></span></div>
|
||||
<div class=""><span class="Comment"></span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@@ -6,57 +6,60 @@
|
||||
|
||||
<div class="">
|
||||
<div class="sax-panel-form security">
|
||||
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmChangePassword", @class = "sax-form" }))
|
||||
{
|
||||
|
||||
<div class="sax-heading"><div class="sax-caption">@Localiser["security.caption.change.password"]</div></div>
|
||||
<div class="sax-header"><div class="sax-caption">@Localiser["security.caption.change.password"]</div></div>
|
||||
|
||||
<div class="sax-content">
|
||||
|
||||
@if (!Model.RequestPasswordMode)
|
||||
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmChangePassword", @class = "sax-form" }))
|
||||
{
|
||||
/* Current password - required when setting password within user session. */
|
||||
|
||||
@if (!Model.RequestPasswordMode)
|
||||
{
|
||||
/* Current password - required when setting password within user session. */
|
||||
<div class="sax-form-control">
|
||||
<div class="sax-label"><label for="ifPasswordCurrent"><span><span class="required">*</span> @Localiser["label.password.current"]</span></label></div>
|
||||
<div class="sax-control">
|
||||
@Html.PasswordFor(model => model.PasswordCurrent, new { @id = "ifPasswordCurrent", @class = "sax-input", @maxlength = Model.PasswordMaxLength })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 'Request Password' encrypted parameters from email link. */
|
||||
@Html.HiddenFor(model => model.rpe, new { @id = "ifRpe" });
|
||||
}
|
||||
|
||||
<div class="spacer4"></div>
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="sax-label"><label for="ifPasswordCurrent"><span><span class="required">*</span> @Localiser["label.password.current"]</span></label></div>
|
||||
<div class="sax-label"><label for="ifPassword"><span><span class="required">*</span> @Localiser["label.password"]</span></label></div>
|
||||
<div class="sax-control">
|
||||
@Html.PasswordFor(model => model.PasswordCurrent, new { @id = "ifPasswordCurrent", @class = "sax-input", @maxlength = Model.PasswordMaxLength })
|
||||
@Html.PasswordFor(model => model.Password, new { @id = "ifPassword", @class = "sax-input", @maxlength = Model.PasswordMaxLength })
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-auto sax-label-text pt4">@Localiser["label.strength"] </div>
|
||||
<div id="" class="col-auto"><div id="prgPasswordStrength" class="col-auto"></div></div>
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="sax-label"><label for="ifPasswordConfirm"><span><span class="required">*</span> @Localiser["label.password.confirm"]</span></label></div>
|
||||
<div class="sax-control">
|
||||
@Html.PasswordFor(model => model.PasswordConfirm, new { @id = "ifPasswordConfirm", @class = "sax-input", @maxlength = Model.PasswordMaxLength })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
|
||||
<div class="spacer4"></div>
|
||||
|
||||
<div class="">
|
||||
<div id="pbChangePassword" class="sax-button-action fullwidth pointer" style="margin:16px 0;">@Localiser["security.caption.change.password"]</div>
|
||||
</div>
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
/* 'Request Password' encrypted parameters from email link. */
|
||||
@Html.HiddenFor(model => model.rpe, new { @id = "ifRpe" });
|
||||
}
|
||||
|
||||
<div class="spacer4"></div>
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="sax-label"><label for="ifPassword"><span><span class="required">*</span> @Localiser["label.password"]</span></label></div>
|
||||
<div class="sax-control">
|
||||
@Html.PasswordFor(model => model.Password, new { @id = "ifPassword", @class = "sax-input", @maxlength = Model.PasswordMaxLength })
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-auto sax-label-text pt4">@Localiser["label.strength"] </div>
|
||||
<div id="" class="col-auto"><div id="prgPasswordStrength" class="col-auto"></div></div>
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="sax-label"><label for="ifPasswordConfirm"><span><span class="required">*</span> @Localiser["label.password.confirm"]</span></label></div>
|
||||
<div class="sax-control">
|
||||
@Html.PasswordFor(model => model.PasswordConfirm, new { @id = "ifPasswordConfirm", @class = "sax-input", @maxlength = Model.PasswordMaxLength })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
|
||||
<div class="spacer4"></div>
|
||||
|
||||
<div class="">
|
||||
<div id="pbChangePassword" class="sax-button-action fullwidth pointer" style="margin:16px 0;">@Localiser["security.caption.change.password"]</div>
|
||||
</div>
|
||||
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,27 +6,31 @@
|
||||
|
||||
<div class="">
|
||||
<div class="sax-panel-form security">
|
||||
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmRequestPassword", @class = "sax-form" }))
|
||||
{
|
||||
|
||||
<div class="sax-heading"><div class="sax-caption">@Localiser["security.caption.request.password"]</div></div>
|
||||
<div class="sax-header"><div class="sax-caption">@Localiser["security.caption.request.password"]</div></div>
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="sax-label">
|
||||
<label for="ifEmailAddress"><span><span class="required">*</span> @Localiser["label.email.address"]</span></label>
|
||||
<div class="sax-content">
|
||||
|
||||
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmRequestPassword", @class = "sax-form" }))
|
||||
{
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="sax-label">
|
||||
<label for="ifEmailAddress"><span><span class="required">*</span> @Localiser["label.email.address"]</span></label>
|
||||
</div>
|
||||
<div class="sax-control">
|
||||
@Html.TextBoxFor(model => model.EmailAddress, new { @id = "ifEmailAddress", @class = "sax-input lower", @maxlength = "128" })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
<div class="sax-control">
|
||||
@Html.TextBoxFor(model => model.EmailAddress, new { @id = "ifEmailAddress", @class = "sax-input lower", @maxlength = "128" })
|
||||
|
||||
<div class="spacer4"></div>
|
||||
|
||||
<div class="">
|
||||
<div id="pbRequestPassword" class="sax-button-action fullwidth pointer" style="margin:16px 0;">@Localiser["security.caption.request.password"]</div>
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
|
||||
<div class="spacer4"></div>
|
||||
|
||||
<div class="">
|
||||
<div id="pbRequestPassword" class="sax-button-action fullwidth pointer" style="margin:16px 0;">@Localiser["security.caption.request.password"]</div>
|
||||
</div>
|
||||
|
||||
}
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -8,53 +8,55 @@
|
||||
|
||||
<div class="sax-panel-form security">
|
||||
|
||||
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmSignIn", @class = "sax-form" }))
|
||||
{
|
||||
<div class="sax-header"><div class="sax-caption">@Localiser["security.caption.signin"]</div></div>
|
||||
|
||||
<div class="sax-heading"><div class="sax-caption">@Localiser["security.caption.signin"]</div></div>
|
||||
<div class="sax-content">
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="sax-label">
|
||||
<label for="ifEmailAddress"><span><span class="required">*</span> @Localiser["label.email.address"]</span></label>
|
||||
@using (@Html.BeginForm(FormMethod.Post, new { @id = "frmSignIn", @class = "sax-form" }))
|
||||
{
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="sax-label">
|
||||
<label for="ifEmailAddress"><span><span class="required">*</span> @Localiser["label.email.address"]</span></label>
|
||||
</div>
|
||||
<div class="sax-control">
|
||||
@Html.TextBoxFor(model => model.EmailAddress, new { @id = "ifEmailAddress", @class = "sax-input lower", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress) })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
<div class="sax-control">
|
||||
@Html.TextBoxFor(model => model.EmailAddress, new { @id = "ifEmailAddress", @class = "sax-input lower", @maxlength = @Model.GetControlMaxLength(SaxDbDfn_Core.ColumnIdx.UserAccount_EmailAddress) })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="sax-label">
|
||||
<label for="ifPassword"><span><span class="required">*</span> @Localiser["label.password"]</span></label>
|
||||
<div class="sax-form-control">
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<div class="sax-label">
|
||||
<label for="ifPassword"><span><span class="required">*</span> @Localiser["label.password"]</span></label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 right">
|
||||
<div class="sax-action-link" style="font-size:12px;" onclick="sax.goToPage('Security/RequestPassword');">@Localiser["label.forgotten.password"]</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6 right">
|
||||
<div class="sax-action-link" style="font-size:12px;" onclick="sax.goToPage('Security/RequestPassword');">@Localiser["label.forgotten.password"]</div>
|
||||
<div class="sax-control">
|
||||
@Html.PasswordFor(model => model.Password, new { @id = "ifPassword", @class = "sax-input", @maxlength = @Model.PasswordMaxLength })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
|
||||
<div class="spacer4"></div>
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="">
|
||||
@Html.CheckBoxFor(model => model.KeepMeSignedIn, new { @id = "chkKeepMeSignedIn" })
|
||||
|
||||
<span class="sax-label pointer" onclick="$('#chkKeepMeSignedIn').click()">@Localiser["label.keep.signed.in"]</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sax-control">
|
||||
@Html.PasswordFor(model => model.Password, new { @id = "ifPassword", @class = "sax-input", @maxlength = @Model.PasswordMaxLength })
|
||||
</div>
|
||||
<div class="sax-message"></div>
|
||||
</div>
|
||||
|
||||
<div class="spacer4"></div>
|
||||
|
||||
<div class="sax-form-control">
|
||||
<div class="">
|
||||
@Html.CheckBoxFor(model => model.KeepMeSignedIn, new { @id = "chkKeepMeSignedIn" })
|
||||
|
||||
<span class="sax-label pointer" onclick="$('#chkKeepMeSignedIn').click()">@Localiser["label.keep.signed.in"]</span>
|
||||
<div id="pbSignIn" class="sax-button-action fullwidth pointer" style="margin:16px 0;">@Localiser["security.caption.signin"]</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="">
|
||||
<div id="pbSignIn" class="sax-button-action fullwidth pointer" style="margin:16px 0;">@Localiser["security.caption.signin"]</div>
|
||||
</div>
|
||||
|
||||
}
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
}
|
||||
|
||||
@* Scripts *@
|
||||
<script>
|
||||
<script>
|
||||
var sax = sax || { page: {}, url: {}, links: {}, form: {}, data: {}, msg: {}, lbl: {}, dlg: { title: {}, btn: {} }, $frm: {}, $dlg: {} };
|
||||
sax.url.base = '@Model.RedirectLocation.Base';
|
||||
sax.url.home = '@Model.RedirectLocation.Home';
|
||||
@@ -84,7 +84,7 @@
|
||||
sax.keepLoggedIn = @keepLoggedIn;
|
||||
sax.keepLoggedInDelay = @(Sax.Config.Admin.Session.Cookie.KeepLoggedInTimeoutMillis);
|
||||
sax.debugMode = @debug;
|
||||
</script>
|
||||
</script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
@@ -102,9 +102,11 @@
|
||||
</button>
|
||||
<div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
|
||||
<ul class="navbar-nav flex-grow-1">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">@Localiser["home.caption.home"]</a>
|
||||
</li>
|
||||
@*
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">@Localiser["home.caption.home"]</a>
|
||||
</li>
|
||||
*@
|
||||
@if (Model.AwaitingLogin)
|
||||
{
|
||||
<li class="nav-item">
|
||||
@@ -179,7 +181,7 @@
|
||||
@* Footer *@
|
||||
<footer class="border-top footer text-muted">
|
||||
<div class="container">
|
||||
@(Model.CopyrightNotice) - @Localiser["company.name"] @(Model.InstanceVersion) - <a asp-area="" asp-controller="Home" asp-action="">Home</a> - <a asp-area="" asp-controller="Policies" asp-action="Privacy">Privacy</a>
|
||||
@(Model.CopyrightNotice) - @Localiser["company.name"] @(Model.InstanceVersion) - <a asp-area="" asp-controller="Home" asp-action="">Home</a>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.sax-panel-item .sax-header
|
||||
.sax-panel-item > .sax-header
|
||||
{
|
||||
padding: 2px 8px;
|
||||
min-height: 24px;
|
||||
@@ -116,40 +116,45 @@
|
||||
border-bottom: solid 2px #979797;
|
||||
}
|
||||
|
||||
.sax-panel-item .sax-header .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
|
||||
.sax-panel-item > .sax-header .sax-action
|
||||
{
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.sax-panel-item .sax-header .sax-caption .sax-action:hover
|
||||
.sax-panel-item >.sax-header .sax-caption .sax-action:hover
|
||||
{
|
||||
color: var(--color-light);
|
||||
}
|
||||
|
||||
.sax-panel-item .sax-header .sax-actions .sax-action
|
||||
.sax-panel-item > .sax-header .sax-actions .sax-action
|
||||
{
|
||||
margin: 2px 0 0 8px;
|
||||
}
|
||||
|
||||
.sax-panel-item .sax-header .sax-actions .sax-action:hover
|
||||
.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
|
||||
.sax-panel-item > .sax-content
|
||||
{
|
||||
margin: 4px 8px;
|
||||
padding: 4px 4px;
|
||||
}
|
||||
|
||||
.sax-panel-item .sax-note
|
||||
{
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
@media (min-width: 576px)
|
||||
{
|
||||
.sax-panel-filter
|
||||
|
||||
@@ -8,17 +8,19 @@
|
||||
{
|
||||
max-width: 720px;
|
||||
margin: 24px auto;
|
||||
padding: 24px 24px;
|
||||
padding: 0;
|
||||
background-color: #fff;
|
||||
border: solid 2px #979797;
|
||||
border-color: var(--color-primary);
|
||||
border-radius: 4px;
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.sax-panel-form.security
|
||||
{
|
||||
max-width:520px;
|
||||
max-width: 520px;
|
||||
}
|
||||
|
||||
@media (min-width: 576px)
|
||||
@@ -28,22 +30,95 @@
|
||||
}
|
||||
}
|
||||
|
||||
.sax-panel-info > .sax-header,
|
||||
.sax-panel-form > .sax-header
|
||||
{
|
||||
padding: 12px 12px;
|
||||
text-align: center;
|
||||
background-color: #e8e8e8;
|
||||
border-bottom: solid 1px #606060;
|
||||
border-color: var(--color-primary);
|
||||
}
|
||||
|
||||
.sax-panel-info > .sax-header .sax-caption,
|
||||
.sax-panel-form > .sax-header .sax-caption
|
||||
{
|
||||
font-size: 1.5rem;
|
||||
font-weight: bold;
|
||||
color: var(--color-primary-dark);
|
||||
}
|
||||
|
||||
.sax-panel-info > .sax-header .sax-action img:hover,
|
||||
.sax-panel-form > .sax-header .sax-action img:hover
|
||||
{
|
||||
background-color: #f0f0f0;
|
||||
border-radius: 4px;
|
||||
box-shadow: 2px 2px 4px 0 #80808080;
|
||||
}
|
||||
|
||||
.sax-panel-info > .sax-content,
|
||||
.sax-panel-form > .sax-content
|
||||
{
|
||||
max-height: 400px;
|
||||
padding: 12px 12px;
|
||||
background-color: #f8f8f8;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.sax-panel-section.sax-edit .sax-panel-info,
|
||||
.sax-panel-section.sax-populating .sax-button-action.edit,
|
||||
.sax-panel-section .sax-panel-form
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sax-panel-section.sax-edit .sax-panel-form
|
||||
{
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Form */
|
||||
|
||||
.sax-form
|
||||
{
|
||||
}
|
||||
|
||||
.sax-form .sax-heading
|
||||
/* Labels, values, notes */
|
||||
|
||||
.sax-panel-info .sax-label, .sax-panel-info .sax-value
|
||||
{
|
||||
margin-bottom: 20px;
|
||||
margin-bottom: 6px;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.sax-form .sax-heading .sax-caption
|
||||
.sax-panel-info .sax-label
|
||||
{
|
||||
font-size: 1.5rem;
|
||||
padding-right: 16px;
|
||||
font-weight: bold;
|
||||
color: var(--color-primary);
|
||||
color: #808080;
|
||||
}
|
||||
|
||||
.sax-panel-info .sax-value
|
||||
{
|
||||
}
|
||||
|
||||
.sax-form .sax-form-control .sax-label
|
||||
{
|
||||
margin: 0 0 8px 0;
|
||||
font-size: 1rem;
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.sax-form .sax-form-control .sax-label-text
|
||||
{
|
||||
font-size: 1rem;
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.sax-form .sax-form-control .sax-note
|
||||
{
|
||||
font-size: 0.9rem;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
/* Controls */
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Admin - Home page scripts.
|
||||
*/
|
||||
|
||||
(function (win, doc, undef)
|
||||
{
|
||||
"use strict";
|
||||
sax.itemIdPrefix = 'Itm_';
|
||||
|
||||
//--------------------------------------------------------------
|
||||
sax.refreshDbSchema= function (delay)
|
||||
{
|
||||
var $results = $('.sax-panel-results.DbSchema');
|
||||
if (!sax.awaitingRefreshResponse)
|
||||
{
|
||||
var $items = $('.sax-panel-item-list', $results).fadeOut(200).empty();
|
||||
var $msgs = $('.sax-panel-messages', $results).hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).fadeIn(200);
|
||||
}
|
||||
sax.ajaxDbSchema = sax.ajaxDbSchema || { url: sax.url.base + 'System/Ajax/ValidateDatabaseSchema', formId: 'frmNavigate', callbackFn: sax.handleDbSchemaResponse, noWaitIcon: true };
|
||||
sax.doAjaxRequest(sax.ajaxDbSchema, delay || 50);
|
||||
sax.awaitingRefreshResponse = true;
|
||||
}
|
||||
sax.handleDbSchemaResponse = function (response)
|
||||
{
|
||||
sax.debug('handleDbSchemaResponse', response);
|
||||
delete sax.awaitingRefreshResponse;
|
||||
var $results = $('.sax-panel-results.DbSchema');
|
||||
var $msgs = $('.sax-panel-messages', $results).hide().empty();
|
||||
var $items = $('.sax-panel-item-list', $results).hide().empty();
|
||||
var $tmpl = $('.sax-panel-item-template .sax-panel-item.DbSchemaItem', $results);
|
||||
if (!response.success) return;
|
||||
// Items.
|
||||
var items = response.items;
|
||||
if (!items.length)
|
||||
return $msgs.append($('<div class="sax-message">' + sax.msg.dbSchemaValid + '</div>')).fadeIn(500);
|
||||
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
|
||||
{
|
||||
let item = items[itemIdx];
|
||||
let $item = $tmpl.clone();
|
||||
sax.populateItem($item, item);
|
||||
$items.append($item);
|
||||
}
|
||||
$items.fadeIn(50);
|
||||
}
|
||||
sax.populateItem = function ($item, item)
|
||||
{
|
||||
if (!item) return;
|
||||
$item.prop('id', sax.itemIdPrefix + item.id);
|
||||
$('.TableName', $item).text(item.tableName);
|
||||
$('.IndexName', $item).text(item.indexName);
|
||||
$('.SchemaIndex', $item).toggle(!!item.indexName);
|
||||
$('.ColumnName', $item).text(item.columnName);
|
||||
$('.SchemaColumn', $item).toggle(!!item.columnName);
|
||||
$('.Comment', $item).text(item.comment);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
$(function ()
|
||||
{
|
||||
setTimeout(sax.refreshDbSchema, 250);
|
||||
});
|
||||
|
||||
}(window, window.document));
|
||||
|
||||
/* The End */
|
||||
Reference in New Issue
Block a user