Activity index, Db schema validation.
This commit is contained in:
2021-05-31 20:27:40 +01:00
parent 63473c725b
commit 7b0a710b13
36 changed files with 1008 additions and 208 deletions
@@ -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>
+27 -2
View File
@@ -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"]&nbsp;</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"]&nbsp;</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" })
&nbsp;
<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" })
&nbsp;
<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>
+12 -7
View File
@@ -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
+82 -7
View File
@@ -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 */