/* * SBM - Control - Instance - Repository. */ (function (win, doc, undef) { "use strict"; let ir = sbc.instanceRepository = { data: {}, ajax: {} }; let $pnl = ir.$pnl = {}, $frm = ir.$frm = {}, $dlg = ir.$dlg = {}; //-------------------------------------------------------------- ir.refreshResults = function (delay) { if (!ir.awaitingRefreshResponse) { $('.sbc-burger', $pnl.header).hide(); $pnl.table.find('tbody tr').remove(); $pnl.msgs.hide().empty().append($('
' + sbc.msg.dataQuerying + '
')).fadeIn(200); } ir.ajax.repositories = ir.ajax.repositories || { url: sbc.url.base + 'Instance/Repository/Ajax/GetRepositories', formSel: $frm.filter, $msgs: $pnl.msgs, callbackFn: ir.handleRepositories }; sbc.doAjaxRequest(ir.ajax.repositories, delay || 50); ir.awaitingRefreshResponse = true; } ir.handleRepositories = function (response) { //sbc.debug('handleRepositories', response); delete ir.awaitingRefreshResponse; let $table = $('table', $pnl.table).find('tbody tr').remove().end(); $pnl.msgs.hide().empty(); sbc.refreshPaging(response, '#frmRepositoryFilter', ir.refreshResults); if (!response.success) return; // Reference data - Statuses. if (response.statuses) sbc.data.statuses = response.statuses; if (response.statusesCreate) sbc.data.statusesCreate = response.statusesCreate; if (response.statusCodeDefault) sbc.data.statusCodeDefault = response.statusCodeDefault; // Menu. 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. let items = response.repositories || []; if (!items.length) return $pnl.msgs.append($('
' + sbc.msg.dataNoneFound + '
')).fadeIn(500); for (const item of items) { $table.append(ir.populateItem(ir.getItemRowTemplate(), item)); ir.addRepoForInfo(item); } } ir.populateItem = function ($item, item) { if (!item) return $item; $pnl.msgs.hide().empty(); $item.prop('id', ir.getItemId(item)); $('.RepositoryOwnerName', $item).text(item.ownerName); $('.RepositoryContext', $item).text(item.context); $('.RepositoryServerName', $item).text(item.serverName); $('.RepositoryInstanceName', $item).text(item.instanceName); $('.RepositoryDatabaseName', $item).text(item.databaseName); $('.RepositoryStatusDesc', $item).text(item.statusDesc).removeStatusClasses().addClass('sbc-status-' + item.statusCode.toLowerCase()); // Actions. let fnUpd = function () { ir.updateItem($item, item) }; let $bgr = $('.sbc-burger', $item).hide(); let $mnu = $('ul.sbc-dropdown-menu', $bgr).empty(); if (!item.deleted) { $mnu.append(ir.getItemMenuOption(sbc.lbl.edit, fnUpd, 'sbc-edit')); $('.RepositoryContext,.RepositoryDatabaseName', $item).off('click').on('click', fnUpd).addClass('sbc-action-text'); $item.off('dblclick').on('dblclick', fnUpd); } $bgr.toggle(!!$('.sbc-dropdown-item', $mnu).length); return $item; } ir.getItemId = function (item) { return 'Repo_' + (item || {}).id; } //-------------------------------------------------------------- const reposForInfo = []; ir.addRepoForInfo = (item) => { if (reposForInfo.some(repo => repo.id == item.id)) return; ir.clearRepoInfo(item); reposForInfo.push(item); if (reposForInfo.length == 1) ir.refreshNextRepoInfo(); } ir.clearRepoInfo = (item) => { $pnl.table.find('#' + ir.getItemId(item)).find('.RepositoryInitialised').empty(); } ir.resetRefreshRepoInfo = () => { reposForInfo.length = 0; sbc.cancelAjaxRequest(ir.ajax.repoInit); } ir.refreshNextRepoInfo = () => { if (ir.ajax.repoInit?.timeout) return; let repo = reposForInfo.shift(); if (repo?.id) ir.refreshRepoInfo(repo.id, 200); } 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($('
').append($('').prop('src', '/img/icon/error-18.png').prop('title', item.unavailable))); else if (!item.initialised) { $repoInit.append($('
').append($('').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($('
').append($('').prop('src', '/img/icon/tick-24.png'))); $bgr.toggle(!!$('.sbc-dropdown-item', $mnu).length); ir.refreshNextRepoInfo(); } ir.onInitRepo = function (item) { ir.addRepoForInfo(item); } //-------------------------------------------------------------- ir.getFilterDropdownTemplate = function () { return $('.sbc-dropdown-menu.RepositoryFilter li.sbc-dropdown-item', $pnl.tmpls).clone(); } ir.getItemRowTemplate = function () { return $('table tr.sbc-row-item.Repository', $pnl.tmpls).clone(); } ir.getItemDropdownTemplate = function () { return $('.sbc-dropdown-menu.Repository li.sbc-dropdown-item', $pnl.tmpls).clone(); } ir.getFilterMenuOption = function (lbl, fn, cls) { return ir.getMenuOption(ir.getFilterDropdownTemplate(), lbl, fn, cls); } ir.getItemMenuOption = function (lbl, fn, cls) { return ir.getMenuOption(ir.getItemDropdownTemplate(), lbl, fn, cls); } ir.getMenuOption = function ($opt, lbl, fn, cls) { return $opt.find('div.sbc-label').text(lbl).end().on('click', fn).addClass(cls); } //-------------------------------------------------------------- ir.createItem = function () { ir.clearItem(); sbc.populateSelectCodeDesc('#cbRepositoryStatus', sbc.data.statusesCreate); $('#cbRepositoryStatus').val(sbc.data.statusCodeDefault).prop('readonly', false); $dlg.item.dialog('option', 'title', sbc.dlg.title.createItem); ir.openRepositoryDlg(); } ir.openRepositoryDlg = function () { sbc.openDialog($dlg.item, 600, 600); } ir.clearItem = function () { $('.RepositoryExists,.RepositoryId,input[type="text"],textarea,select', $frm.item).val(''); sbc.populateSelectCodeDesc('#cbRepositoryStatus', sbc.data.statuses); sbc.clearControlErrors(); } ir.onInputPassword = function () { $('.RepositoryPasswordChanged', $frm.item).val(1); } //-------------------------------------------------------------- ir.updateItem = function ($item, item) { //sbc.debug('updateItem', $item, item); ir.clearItem(); $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) { //sbc.debug('onUpdateItem', response); let $ctrls = $('.sbc-input,.sbc-textarea,.sbc-select', $frm.item); ir.clearItem(); if (!response.success) return; let item = response.repository; $ctrls.filter('.RepositoryExists').val(1); $ctrls.filter('.RepositoryId').val(item.id); $ctrls.filter('.RepositoryOwnerId').val(item.ownerId); $ctrls.filter('.RepositoryOwner').val(item.ownerName); $ctrls.filter('.RepositoryContext').val(item.context); $ctrls.filter('.RepositoryServerName').val(item.serverName); $ctrls.filter('.RepositoryInstanceName').val(item.instanceName); $ctrls.filter('.RepositoryDatabaseName').val(item.databaseName); $ctrls.filter('.RepositoryUserName').val(item.userName); $ctrls.filter('.RepositoryPassword').val('######'); $ctrls.filter('.RepositoryNotes').val(item.notes); $ctrls.filter('.RepositoryStatus').val(item.statusCode).prop('readonly', true); sbc.clearControlErrors(); $dlg.item.dialog('option', 'title', sbc.dlg.title.updateItem); ir.openRepositoryDlg(); } //-------------------------------------------------------------- ir.selectOwner = function () { let fnHandleOwners = function (response) { //sbc.debug('fnHandleOwners', response) if (!response.success) return; let cfg = { caption: sbc.lbl.selectOwner, items: [], itemId: $('.RepositoryOwnerId', $frm.item).val(), fnCallback: fnItemSelected }; (response.owners || []).forEach((o, i) => { cfg.items.push({ id: o.id, name: o.name }) }); sbc.fn.selectItem(cfg); } let fnItemSelected = function (item) { //sbc.debug('fnCallback', item); $('.RepositoryOwnerId', $frm.item).val(item.id); $('.RepositoryOwner', $frm.item).val(item.name); } ir.ajax.owners = ir.ajax.owners || { url: sbc.url.base + 'Instance/Owner/Ajax/GetOwners', formId: $frm.owners.prop('id'), callbackFn: fnHandleOwners }; sbc.doAjaxRequest(ir.ajax.owners, 50); } //-------------------------------------------------------------- ir.storeItem = function () { sbc.ajax.storeItem = sbc.ajax.storeItem || { url: sbc.url.base + 'Instance/Repository/Ajax/StoreItem', formId: 'frmRepository', callbackFn: ir.onStoreItem }; sbc.doAjaxRequest(sbc.ajax.storeItem, 50); } ir.onStoreItem = function (response) { //sbc.debug('onStoreItem', response); sbc.refreshControlValues(response.controlValues); if (!response.success) return; $dlg.item.dialog('close'); let item = response.repository; let $item = $('#' + ir.getItemId(item), $pnl.table); if (!$item.length) { $item = ir.getItemRowTemplate(); $('table tbody', $pnl.table).prepend($item).show(); } ir.populateItem($item, item); ir.addRepoForInfo(item); } //-------------------------------------------------------------- $(function () { $pnl.items = $('.sbc-panel.Repositories'); $pnl.header = $('.sbc-panel-header', $pnl.items); $pnl.filter = $('.sbc-panel-filter', $pnl.items); $pnl.msgs = $('.sbc-panel-messages', $pnl.items); $pnl.table = $('.sbc-panel-item-table', $pnl.items); $pnl.tmpls = $('.sbc-panel-item-template', $pnl.items); $frm.filter = $('#frmRepositoryFilter'); $('.FilterSearch', $frm.filter).on('input', function () { ir.refreshResults(250); }); $frm.itemId = $('#frmRepositoryId'); $frm.owners = $('#frmOwners'); 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); $frm.item = $('#frmRepository'); $($frm.item).on('input', '.sbc-input, .sbc-textarea', function () { sbc.clearControlError(this); }).on('change', '.sbc-select', function () { sbc.clearControlError(this); }); $($frm.item).on('dblclick', '.sbc-input.RepositoryOwner', ir.selectOwner).on('click', '.sbc-action.RepositoryOwnerSearch', ir.selectOwner); $($frm.item).on('input', '.RepositoryPassword', ir.onInputPassword); setTimeout(ir.refreshResults, 250); }); //-------------------------------------------------------------- }(window, window.document)); /* The End */