Files
andy 9f22b522df v1.3.0 Restructure Saxonite workspace and upgrade to .NET 10 (#1)
Move Saxonite’s projects into a dedicated `Workspace` folder and align the solution with .NET 10 and the current Common workspace. Update encryption integration, test project structure and coverage, and repository guidance and upgrade notes.

- Relocate application and library projects while retaining Git rename history.
- Split tests into Admin, Online, and Shared projects; add representative behavioral and serialization tests.
- Update Common integration, application version, and repository documentation.

Application version: 1.3.0

Reviewed-on: #1
Co-authored-by: andy <andy@sarand.com>
2026-10-16 18:24:16 +01:00

218 lines
8.0 KiB
JavaScript

/*
* Admin - System Database page scripts.
*/
(function (win, doc, undef)
{
"use strict";
let sd = sax.sysDb = { env: {} };
//--------------------------------------------------------------
sd.refreshResults = function (env, delay)
{
sax.debug('refreshResults', env);
if (!env.data.awaitingRefreshResponse)
{
env.$pnl.bgr.invisible();
env.$pnl.table.find('tbody tr').remove();
env.$pnl.msgs.hide().empty().append($('<div class="sax-message">' + sax.msg.dataQuerying + '</div>')).fadeIn(200);
}
env.ajax.refreshResults = env.ajax.refreshResults || { url: sax.url.base + 'System/Ajax/GetDatabaseTables', formSel: env.$frm.filter, callbackFn: function (response) { sd.doRefreshResults(env, response); } };
sax.doAjaxRequest(env.ajax.refreshResults, delay || 50);
env.data.awaitingRefreshResponse = true;
}
sd.doRefreshResults = function (env, response)
{
//sax.debug('doRefreshResults', env, response);
delete env.data.awaitingRefreshResponse;
env.$pnl.msgs.hide().empty();
let $table = $('table', env.$pnl.table).find('tbody tr').remove().end();
sax.refreshPaging(response, env.$frm.filter, function () { sd.refreshResults(env); });
if (!response.success) return;
// Menu.
if (env.$pnl.bgr.length)
{
env.$pnl.bgr.invisible();
env.$pnl.mnu.empty();
env.$pnl.mnu.append(sd.getFilterMenuOption(env, sax.lbl.refresh, function () { sd.refreshResults(env); }, 'sax-refresh'));
env.$pnl.bgr.toggleVisibility(!!$('.sax-dropdown-item', env.$pnl.mnu).length);
}
// Items.
var items = response.tables;
if (!items.length)
return env.$pnl.msgs.append($('<div class="sax-message">' + sax.msg.dataNoneFound + '</div>')).fadeIn(500);
for (const item of items)
$table.append(sd.populateItem(env, sd.getItemTemplate(env), item));
}
sd.populateItem = function (env, $item, item)
{
if (!item) return $item;
$item.prop('id', sd.getItemId(item));
$('.TableName', $item).text(item.qualifiedName);
$('.RowCount', $item).text(item.rowCount);
$('.ColumnCount', $item).text(item.columnCount);
$('.IndexCount', $item).text(item.indexCount);
// Actions.
var $bgr = $('.sax-burger', $item).hide();
let $mnu = $('ul.sax-dropdown-menu', $bgr).empty();
if (!item.deleted)
{
let fnUpd = function () { sd.viewItem(env, item) };
$mnu.append(sd.getItemMenuOption(env, sax.lbl.edit, fnUpd, 'sax-edit'));
$('.TableName', $item).off('click').on('click', fnUpd).addClass('sax-action-text');
$item.off('dblclick').on('dblclick', fnUpd);
}
$bgr.toggle(!!$('.sax-dropdown-item', $mnu).length);
return $item;
}
sd.getItemId = function (item)
{
return 'Tbl_' + (item || {}).id;
}
//--------------------------------------------------------------
sd.getFilterDropdownTemplate = function (env)
{
return $('.sax-dropdown-menu.DatabaseTables li.sax-dropdown-item', env.$pnl.tmpls).clone();
}
sd.getItemTemplate = function (env)
{
return env.$pnl.tmpls.find('.sax-row-item.DatabaseTable').clone();
}
sd.getItemDropdownTemplate = function (env)
{
return $('.sax-dropdown-menu.DatabaseTable li.sax-dropdown-item', env.$pnl.tmpls).clone();
}
//--------------------------------------------------------------
sd.getFilterMenuOption = function (env, lbl, fn, cls)
{
return sd.getMenuOption(sd.getFilterDropdownTemplate(env), lbl, fn, cls);
}
sd.getItemMenuOption = function (env, lbl, fn, cls)
{
return sd.getMenuOption(sd.getItemDropdownTemplate(env), lbl, fn, cls);
}
sd.getMenuOption = function ($opt, lbl, fn, cls)
{
return $opt.find('div.sax-label').text(lbl).end().on('click', fn).addClass(cls);
}
//--------------------------------------------------------------
sd.viewItem = function (env, item)
{
sax.debug('viewItem', env, item)
env.$frm.itemId.find('.DatabaseTableInstance').val($('.DatabaseFilterInstance', env.$frm.filter).val());
env.$frm.itemId.find('.DatabaseTableName').val(item.tableName);
env.ajax.updateItem = env.ajax.updateItem || {
url: sax.url.base + 'System/Ajax/GetDatabaseTable', formSel: env.$frm.itemId, callbackFn: function (response) { sd.onViewItem(env, response); } };
sax.doAjaxRequest(env.ajax.updateItem, 50);
}
sd.onViewItem = function (env, response)
{
sax.debug('onViewItem', env, response);
sd.clearItem(env);
if (!response.success) return;
let item = response.table;
let $frmT = env.$frm.item;
$('.DatabaseTableName', $frmT).val(item.name);
// Properties.
let prts = item.properties;
let $prts = $('.TableProperties', env.$dlg.item);
$('tr:not(.sax-heading)', $prts).remove();
for (let prtIdx = 0; prtIdx < prts.length; prtIdx++)
{
let prt = prts[prtIdx];
let $prt = sd.getTablePropertyTemplate(env).addClass('sax-' + (prtIdx % 2 ? 'even' : 'odd'));
$('.Label', $prt).text(prt.label);
$('.Value', $prt).text(prt.value);
$prts.append($prt);
}
// Columns.
let cols = item.columns;
let $cols = $('.TableColumns', env.$dlg.item);
$('tr:not(.sax-heading)', $cols).remove();
for (let colIdx = 0; colIdx < cols.length; colIdx++)
{
let col = cols[colIdx];
let $col = sd.getTableColumnTemplate(env).addClass('sax-' + (colIdx % 2 ? 'even' : 'odd'));
$('.Pos', $col).text(col.pos);
$('.Name', $col).text(col.name);
$('.Format', $col).text(col.format);
$cols.append($col);
}
// Indices.
let idxs = item.indices;
let $idxs = $('.TableIndices', env.$dlg.item);
$('tr:not(.sax-heading)', $idxs).remove();
for (let idxIdx = 0; idxIdx < idxs.length; idxIdx++)
{
let idx = idxs[idxIdx];
let $idx = sd.getTableIndexTemplate(env).addClass('sax-' + (idxIdx % 2 ? 'even' : 'odd'));
$('.Name', $idx).text(idx.name);
for (const col of idx.columns)
$('.Columns', $idx).append($('<div>').text(col.name));
$('.Unique', $idx).text(idx.unique ? 'Yes' : '');
$idxs.append($idx);
}
// Display table details.
env.$dlg.item.dialog('option', 'title', response.popupTitle || "Table: " + item.name);
sax.openDialog(env.$dlg.item, 600, 600);
}
sd.clearItem = function (env)
{
let $frmT = env.$frm.item;
$('input[type="text"],textarea,select', $frmT).val('');
sax.clearControlErrors();
}
sd.getTablePropertyTemplate = function (env)
{
return sd.getTableRowTemplate(env, 'TableProperty');
}
sd.getTableColumnTemplate = function (env)
{
return sd.getTableRowTemplate(env, 'TableColumn');
}
sd.getTableIndexTemplate = function (env)
{
return sd.getTableRowTemplate(env, 'TableIndex');
}
sd.getTableRowTemplate = function (env, name)
{
return $('.sax-panel-item-template .' + name, env.$dlg.item).clone();
}
//--------------------------------------------------------------
$(function ()
{
let env = sd.env.maint = { data: {}, ajax: {}, $pnl: {}, $frm: {}, $ctrl: {}, $dlg: {} };
env.$pnl.items = $('.DatabaseTables');
env.$pnl.header = env.$pnl.items.find('.sax-panel-header');
env.$pnl.bgr = env.$pnl.header.find('.sax-burger');
env.$pnl.mnu = env.$pnl.bgr.find('ul.sax-dropdown-menu');
env.$pnl.table = env.$pnl.items.find('.sax-panel-item-table');
env.$pnl.msgs = env.$pnl.table.find('.sax-panel-messages');
env.$pnl.tmpls = env.$pnl.items.find('.sax-panel-item-template');
env.$pnl.header.on('click', '.sax-action.sax-results-refresh', function () { sd.refreshResults(env); });
env.$frm.filter = $('#frmDbTableFilter');
$('.DatabaseFilterInstance', env.$frm.filter).on('change', function () { sd.refreshResults(env, 250); });
$('.DatabaseFilterSearch', env.$frm.filter).on('input', function () { sd.refreshResults(env, 250); });
env.$frm.itemId = $('#frmDbTableName');
env.$frm.item = $('#frmDbTable').on('input', '.sax-input, .sax-textarea', function () { sax.clearControlError(this); }).on('change', '.sax-select', function () { sax.clearControlError(this); });
var opt = sax.dlgOpts();
opt.dialogClass += " sax-DatabaseTable";
//opt.buttons[sax.dlg.btn.ok] = function () { sax.storeItem(); };
opt.buttons[sax.dlg.btn.close] = function () { $(this).dialog('close'); };
env.$dlg.item = $('#dlgDbTable').dialog(opt);
if (sd.env.maint.$pnl.items.length) setTimeout(function () { sd.refreshResults(sd.env.maint); }, 250);
});
}(window, window.document));
/* The End */