Control - Repository initialisation.

This commit is contained in:
Andy Howard
2025-01-09 16:30:52 +00:00
parent d015470f58
commit 4a72043f00
103 changed files with 4324 additions and 469 deletions
@@ -6,7 +6,7 @@
.sbc-panel-data
{
margin: 6px auto;
margin: 0 auto;
background-color: #f8f8f8;
border: solid 1px var(--color-panel-data-border);
border-radius: 6px;
@@ -62,6 +62,14 @@
color: var(--color-primary-dark);
}
.sbc-form .sbc-caption
{
margin: 0 0 12px 0;
font-size: 1.25rem;
font-weight: bold;
color: var(--color-primary-dark);
}
.sbc-panel-info .sbc-panel-info > .sbc-header .sbc-caption
{
font-size: 1.25rem;
@@ -65,6 +65,7 @@ body
{
flex: 1;
min-height: 0;
overflow-y: auto;
}
}
@@ -0,0 +1,113 @@
/*
* SBM - Control - Instance - Core Database.
*/
(function (win, doc, undef)
{
"use strict";
let cd = sbc.mdl.coreDatabase = { env: {}, data: {} };
//--------------------------------------------------------------
cd.refreshItems = function (env, delay)
{
//sbc.debug('refreshItems', env);
if (!env.$frm.filter.find('.FilterContext').val()) return;
if (!cd.awaitingRefreshResponse)
{
env.$pnl.bgr.invisible();
env.$pnl.table.find('tbody tr').remove();
env.$pnl.msgs.hide().empty().append($('<div class="sbc-message">' + sbc.msg.dataQuerying + '</div>')).fadeIn(200);
}
env.ajax.tables = env.ajax.tables || { url: sbc.url.base + 'Instance/CoreDatabase/Ajax/GetTables', formSel: env.$frm.filter, callbackFn: function (response) { cd.displayItems(env, response); } };
sbc.doAjaxRequest(env.ajax.tables, delay || 50);
cd.awaitingRefreshResponse = true;
}
cd.displayItems = function (env, response)
{
//sbc.debug('displayItems', env, response);
delete cd.awaitingRefreshResponse;
env.$pnl.msgs.hide().empty();
let $table = $('table', env.$pnl.table).find('tbody tr').remove().end();
if (!response.success) return;
env.config = response.config || {};
// Menu.
if (env.$pnl.bgr.length)
{
env.$pnl.bgr.invisible();
env.$pnl.mnu.empty();
env.$pnl.mnu.append(cd.getFilterMenuOption(env, sbc.lbl.refresh, function () { cd.refreshItems(env); }, 'sbc-refresh'));
env.$pnl.bgr.toggleVisibility(!!$('.sbc-dropdown-item', env.$pnl.mnu).length);
}
// Items.
var items = response.tables || [];
if (!items.length)
return env.$pnl.msgs.append($('<div class="sbc-message">' + sbc.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
$table.append(cd.populateItem(env, cd.getItemTemplate(env), items[itemIdx]));
sbc.configureItemTable(env.config, $table);
}
cd.populateItem = function (env, $item, item)
{
if (!item) return $item;
$item.prop('id', cd.getItemId(item));
$('.SchemaName', $item).text(item.schemaName);
$('.TableName', $item).text(item.tableName);
if (item.columnCount) $('.ColumnCount', $item).text(item.columnCount);
if (item.indexCount) $('.IndexCount', $item).text(item.indexCount);
if (item.rowCount) $('.RowCount', $item).text(item.rowCount);
return $item;
}
cd.getItemId = function (item)
{
return 'Tbl_' + (item || {}).TableName;
}
//--------------------------------------------------------------
cd.getFilterDropdownTemplate = function (env)
{
return env.$pnl.tmpls.find('.sbc-dropdown-menu.TableFilter li.sbc-dropdown-item').clone();
}
cd.getItemTemplate = function (env)
{
return env.$pnl.tmpls.find('table tr.sbc-row-item.Table').clone();
}
cd.getItemDropdownTemplate = function (env)
{
return env.$pnl.tmpls.find('.sbc-dropdown-menu.Table li.sbc-dropdown-item').clone();
}
cd.getFilterMenuOption = function (env, lbl, fn, cls)
{
return cd.getMenuOption(cd.getFilterDropdownTemplate(env), lbl, fn, cls);
}
cd.getItemMenuOption = function (env, lbl, fn, cls)
{
return cd.getMenuOption(cd.getItemDropdownTemplate(env), lbl, fn, cls);
}
cd.getMenuOption = function ($opt, lbl, fn, cls)
{
return $opt.find('div.sbc-label').text(lbl).end().on('click', fn).addClass(cls);
}
//--------------------------------------------------------------
$(function ()
{
let env = cd.env.init = { data: {}, ajax: {}, $pnl: {}, $frm: {}, $ctrl: {}, $dlg: {} };
env.$pnl.items = $('.sbc-panel.Tables');
env.$pnl.header = env.$pnl.items.find('.sbc-panel-header');
env.$pnl.bgr = env.$pnl.header.find('.sbc-burger');
env.$pnl.mnu = env.$pnl.bgr.find('ul.sbc-dropdown-menu');
env.$pnl.table = env.$pnl.items.find('.sbc-panel-item-table');
env.$pnl.msgs = env.$pnl.table.find('.sbc-panel-messages');
env.$pnl.tmpls = env.$pnl.items.find('.sbc-panel-item-template');
env.$frm.filter = env.$pnl.items.find('#frmTableFilter');
env.$frm.filter.on('input', '.FilterSearch', function () { cd.refreshItems(env, 250); }).on('change', '.FilterContext', function () { cd.refreshItems(env, 100); });
if (env.$frm.filter.length) cd.refreshItems(env, 250);
});
//--------------------------------------------------------------
}(window, window.document));
/* The End */
@@ -50,7 +50,7 @@
}
io.populateItem = function ($item, item)
{
if (!item) return;
if (!item) return $item;
$pnl.msgs.hide().empty();
$item.prop('id', io.getItemId(item));
$('.OwnerName', $item).text(item.name);
@@ -0,0 +1,92 @@
/*
* SBM - Control - Instance - Repository - Initialise.
*/
(function (win, doc, undef)
{
"use strict";
let ir = sbc.mdl.initRepository = { env: {} };
//--------------------------------------------------------------
/*
Initialise Repository.
Config:
- id Repository
- fnSuccess Callback
*/
sbc.fn.initialiseRepo = function (cfg)
{
//sbc.debug('initialiseRepo', cfg);
let env = ir.env.init;
env.cfg = cfg;
let $frm = env.$frm.itemId;
$frm.find('.RepositoryId').val(cfg.id)
env.ajax.initQuery = env.ajax.initQuery || { url: sbc.url.base + 'Instance/Repository/Ajax/GetInitInfo', formSel: $frm, callbackFn: function (response) { ir.onInitQuery(env, response); } };
sbc.doAjaxRequest(env.ajax.initQuery, 50);
}
ir.onInitQuery = function (env, response)
{
sbc.debug('onInitQuery', response);
if (!response.success) return;
let $ctrls = env.$frm.init.find('.sbc-input,.sbc-textarea,.sbc-select').val('');
let repo = response.repository
$ctrls.filter('.RepositoryId').val(repo.id);
$ctrls.filter('.OwnerName').val(repo.ownerName);
$ctrls.filter('.RepositoryContext').val(repo.context);
let orgs = repo.organisations || [];
if (orgs.length)
{
let org = orgs[0];
$ctrls.filter('.OrganisationAssociationId').val(org.associationId);
$ctrls.filter('.OrganisationAffiliateId').val(org.affiliateId);
$ctrls.filter('.OrganisationName').val(org.name);
$ctrls.filter('.OrganisationWebsite').val(org.website);
$ctrls.filter('.OrganisationCompanyNo').val(org.companyNo);
$ctrls.filter('.OrganisationVatReg').val(org.vatReg);
let usrs = org.users || [];
if (usrs.length)
{
let usr = usrs[0];
$ctrls.filter('.UserAffiliateId').val(usr.affiliateId);
$ctrls.filter('.UserSecurityItemId').val(usr.securityItemId);
}
}
sbc.openDialog(env.$dlg.init, 600, 640);
}
//--------------------------------------------------------------
ir.initRepo = function (env)
{
env.ajax.initRepo = env.ajax.initRepo || { url: sbc.url.base + 'Instance/Repository/Ajax/Initialise', formSel: env.$frm.init, callbackFn: function (response) { ir.onInitRepo(env, response); } };
sbc.doAjaxRequest(env.ajax.initRepo, 50);
}
ir.onInitRepo = function(env, response)
{
sbc.debug('onInitRepo', env, response);
sbc.refreshControlValues(response.controlValues);
if (!response.success) return;
env.$dlg.init.dialog('close');
if (env.cfg.fnSuccess) env.cfg.fnSuccess();
delete env.cfg;
}
//--------------------------------------------------------------
$(function ()
{
let env = ir.env.init = { data: {}, ajax: {}, $pnl: {}, $frm: {}, $ctrl: {}, $dlg: {} };
env.$pnl.init = $('.sbc-panel.RepositoryInit');
env.$frm.itemId = env.$pnl.init.find('.RepositoryIdForm');
let opt = sbc.dlgOpts();
opt.buttons[sbc.lbl.ok] = function () { ir.initRepo(env); };
opt.buttons[sbc.lbl.cancel] = function () { delete env.cfg; $(this).dialog('close'); };
env.$dlg.init = env.$pnl.init.find('.RepositoryInitDlg').dialog(opt);
env.$frm.init = env.$dlg.init.find('.RepositoryInitForm');
env.$frm.init.on('input', '.sbc-input, .sbc-textarea', function () { sbc.clearControlError(this); }).on('change', '.sbc-select', function () { sbc.clearControlError(this); });
});
//--------------------------------------------------------------
}(window, window.document));
/* The End */
@@ -17,7 +17,7 @@
$pnl.table.find('tbody tr').remove();
$pnl.msgs.hide().empty().append($('<div class="sbc-message">' + sbc.msg.dataQuerying + '</div>')).fadeIn(200);
}
ir.ajax.repositories = ir.ajax.repositories || { url: sbc.url.base + 'Instance/Repository/Ajax/GetRepositories', formId: $frm.filter.prop('id'), callbackFn: ir.handleRepositories };
ir.ajax.repositories = ir.ajax.repositories || { url: sbc.url.base + 'Instance/Repository/Ajax/GetRepositories', formSel: $frm.filter, callbackFn: ir.handleRepositories };
sbc.doAjaxRequest(ir.ajax.repositories, delay || 50);
ir.awaitingRefreshResponse = true;
}
@@ -36,21 +36,22 @@
if (response.statusCodeDefault) sbc.data.statusCodeDefault = response.statusCodeDefault;
// Menu.
var $bgr = $('.sbc-burger', $pnl.header).hide();
var $mnu = $('ul.sbc-dropdown-menu', $bgr).empty();
let $bgr = $('.sbc-burger', $pnl.header).hide();
let $mnu = $('ul.sbc-dropdown-menu', $bgr).empty();
$mnu.append(ir.getFilterMenuOption(sbc.lbl.refresh, function () { ir.refreshResults(); }, 'sbc-refresh'));
$mnu.append(ir.getFilterMenuOption(sbc.lbl.create, function () { ir.createItem(); }, 'sbc-add'));
$bgr.toggle(!!$('.sbc-dropdown-item', $mnu).length);
// Items.
var items = response.repositories || [];
let items = response.repositories || [];
if (!items.length)
return $pnl.msgs.append($('<div class="sbc-message">' + sbc.msg.dataNoneFound + '</div>')).fadeIn(500);
for (let itemIdx = 0; itemIdx < items.length; itemIdx++)
$table.append(ir.populateItem(ir.getItemRowTemplate(), items[itemIdx]));
ir.refreshRepoInfo(items[0].id, 500);
}
ir.populateItem = function ($item, item)
{
if (!item) return;
if (!item) return $item;
$pnl.msgs.hide().empty();
$item.prop('id', ir.getItemId(item));
$('.RepositoryOwnerName', $item).text(item.ownerName);
@@ -61,7 +62,7 @@
$('.RepositoryStatusDesc', $item).text(item.statusDesc).removeStatusClasses().addClass('sbc-status-' + item.statusCode.toLowerCase());
// Actions.
let fnUpd = function () { ir.updateItem($item, item) };
var $bgr = $('.sbc-burger', $item).hide();
let $bgr = $('.sbc-burger', $item).hide();
let $mnu = $('ul.sbc-dropdown-menu', $bgr).empty();
if (!item.deleted)
{
@@ -74,7 +75,41 @@
}
ir.getItemId = function (item)
{
return 'Itm_' + (item || {}).id;
return 'Repo_' + (item || {}).id;
}
//--------------------------------------------------------------
ir.refreshRepoInfo = function (id, delay)
{
$frm.itemId.find('.RepositoryId').val(id);
ir.ajax.repoInit = ir.ajax.repoInit || { url: sbc.url.base + 'Instance/Repository/Ajax/GetRepositoryInfo', formSel: $frm.itemId, callbackFn: ir.handleRepoInfo };
sbc.doAjaxRequest(ir.ajax.repoInit, delay || 50);
}
ir.handleRepoInfo = function (response)
{
//sbc.debug('handleRepoInfo', response);
if (!response.success) return;
let item = response.repository;
let $item = $pnl.table.find('#' + ir.getItemId(item));
let $bgr = $item.find('.sbc-burger').hide();
let $mnu = $bgr.find('ul.sbc-dropdown-menu');
let $repoInit = $item.find('.RepositoryInitialised').empty();
if (!!item.unavailable)
$repoInit.append($('<div>').append($('<img style="width:16px">').prop('src', '/img/icon/error-18.png').prop('title', item.unavailable)));
else if (!item.initialised)
{
$repoInit.append($('<div>').append($('<img style="width:16px">').prop('src', '/img/icon/cross-24.png').prop('title', item.uninitialised)));
$mnu.append(ir.getItemMenuOption(sbc.lbl.init, function () { sbc.fn.initialiseRepo({ id: item.id, fnSuccess: ir.onInitRepo }); }, 'sbc-process RepoInit'));
}
else $repoInit.append($('<div>').append($('<img style="width:16px">').prop('src', '/img/icon/tick-24.png')));
$bgr.toggle(!!$('.sbc-dropdown-item', $mnu).length);
let $next = $item.next();
if ($next.length) ir.refreshRepoInfo($next.prop('id').replace(/[^0-9]/g, ''), 200);
}
ir.onInitRepo = function (id)
{
sbc.debug('onInitRepo', id);
ir.refreshResults(50);
}
//--------------------------------------------------------------
@@ -132,8 +167,8 @@
{
//sbc.debug('updateItem', $item, item);
ir.clearItem();
$('.RepositoryId', $frm.itemId).val(item.id);
sbc.ajax.updateItem = sbc.ajax.updateItem || { url: sbc.url.base + 'Instance/Repository/Ajax/GetItem', formId: $frm.itemId.prop('id'), callbackFn: ir.onUpdateItem };
$frm.itemId.find('.RepositoryId').val(item.id);
sbc.ajax.updateItem = sbc.ajax.updateItem || { url: sbc.url.base + 'Instance/Repository/Ajax/GetItem', formSel: $frm.itemId, callbackFn: ir.onUpdateItem };
sbc.doAjaxRequest(sbc.ajax.updateItem, 50);
}
ir.onUpdateItem = function (response)
@@ -194,8 +229,8 @@
if (!response.success) return;
$dlg.item.dialog('close');
var item = response.repository;
var $item = $('#' + ir.getItemId(item), $pnl.table);
let item = response.repository;
let $item = $('#' + ir.getItemId(item), $pnl.table);
if (!$item.length)
{
$item = ir.getItemRowTemplate();
@@ -219,7 +254,7 @@
$frm.itemId = $('#frmRepositoryId');
$frm.owners = $('#frmOwners');
var opt = sbc.dlgOpts();
let opt = sbc.dlgOpts();
opt.buttons[sbc.lbl.save] = function () { ir.storeItem(); };
opt.buttons[sbc.lbl.cancel] = function () { $(this).dialog('close'); };
$dlg.item = $('#dlgRepository').dialog(opt);
@@ -90,16 +90,17 @@
};
//--------------------------------------------------------------
sbc.setOddDataRowClass = function (rowSel)
sbc.setOddDataRowClass = function (rowSel, cName)
{
$(rowSel).addClass(function (index, currentClasses)
{
return index % 2 == 1 ? "other" : "";
return index % 2 == 1 ? (cName || "other") : "";
});
}
sbc.selectOrAdd = function ($sel, code, desc)
{
if ($sel.val(code) == code) return;
$sel = $($sel);
if ($sel.val(code).val() == code) return;
$sel.append($('<option>').prop('value', code).text(desc));
$sel.val(code);
}
@@ -113,7 +114,7 @@
}
sbc.populateSelectCodeDesc = function ($sel, values)
{
sbc.populateSelect($sel, values);
sbc.populateSelect($($sel), values);
}
sbc.checkTextAreaMaxLength = function (ctrl, len)
{
@@ -153,6 +154,41 @@
sbc.resultsPaging.fn.refreshPaging(response.paging, context, refreshFn);
}
//--------------------------------------------------------------
sbc.configureItemTable = function (cfg, $sel)
{
//sbc.debug('configureItemTable', cfg, $sel);
let col = cfg.column || {};
let $cell = $('th,td', $sel).removeClass('hidden');
(col.hide || []).forEach(function (v, i, a) { $cell.filter('.' + col.prefix + v).addClass('hidden'); });
}
sbc.populateItemValues = function (cfg, $item, val)
{
//sbc.debug('populateItemValues', cfg, $item, val);
for (var name in val || []) { $item.find('.' + cfg.column.prefix + name).text(val[name]); };
}
sbc.clearItemForm = function ($frm)
{
//sbc.clearControlErrors($frm);
$('.sbc-input,.sbc-textarea,.sbc-select', $frm).val('').prop('readonly', false).prop('disabled', false);
$('.sbc-checkbox', $frm).prop('readonly', false).prop('disabled', false).removeAttr('checked');
}
sbc.configureItemControls = function (cfg, $frm)
{
//sbc.debug('configureItemControls', cfg);
let fld = cfg.field || {};
let $ctrl = $('.sbc-form-control', $frm).show();
for (var name in fld.label || {}) { /* ... */ };
(fld.hide || []).forEach(function (v, i, a) { $ctrl.filter('.' + fld.prefix + v).hide().find('.sbc-input,.sbc-textarea,.sbc-select,.sbc-checkbox').prop('disabled', true); });
(fld.readonly || []).forEach(function (v, i, a) { $ctrl.filter('.' + fld.prefix + v).find('.sbc-input,.sbc.textarea,.sbc-select,.sbc-checkbox').prop('readonly', true).prop('disabled', true); });
}
sbc.populateFormValues = function (cfg, $frm, val)
{
//sbc.debug('populateFormValues', cfg, $frm, val);
let $ctrl = $('.sbc-form-control', $frm);
for (var name in val || {}) { $ctrl.filter('.' + cfg.field.prefix + name).find('.sbc-input,.sbc-textarea,.sbc-select').filter('.sbc-auto-val').val(val[name]).end().find('.sbc-checkbox').prop('checked', !!val[name]); };
}
//--------------------------------------------------------------
// Page navigation.
sbc.navigateTo = function (action)
@@ -189,10 +225,11 @@
// Dialogs.
sbc.openDialog = function ($dlg, width, height)
{
let $win = $(win);
$dlg.dialog(
{
minWidth: null, maxWidth: null, width: Math.min(width || 400, $(win).width() * .98),
minHeight: null, maxHeight: null, height: Math.min(height || 320, $(win).innerHeight() * .98)
minWidth: null, maxWidth: null, width: Math.min(width || 400, $win.width() * .98),
minHeight: null, maxHeight: null, height: Math.min(height || 320, $win.innerHeight() * .98)
}).dialog('open');
return $dlg;
}
@@ -324,7 +361,7 @@
type: 'POST',
cache: false,
//enctype: 'multipart/form-data',
data: ajax.formData || $("#" + ajax.formId).serialize(),
data: ajax.formData || $(ajax.formSel || "#" + ajax.formId).serialize(),
dataType: 'json',
success: function (response, status, jqXHR)
{
@@ -56,7 +56,7 @@
}
ip.populateItem = function ($item, item)
{
if (!item) return;
if (!item) return $item;
$pnl.msgs.hide().empty();
$item.prop('id', ip.getItemId(item));
$('.ParamItem', $item).text(item.itemCaption);
@@ -50,7 +50,7 @@
}
ua.populateItem = function ($item, item)
{
if (!item) return;
if (!item) return $item;
$pnl.msgs.hide().empty();
$item.prop('id', ua.getItemId(item));
$('.UserEmailAddress', $item).text(item.emailAddress);