123 lines
3.9 KiB
JavaScript
123 lines
3.9 KiB
JavaScript
/*
|
|
* Code selection.
|
|
*/
|
|
|
|
(function (win, doc, undef)
|
|
{
|
|
"use strict";
|
|
let cs = sax.codeSelect = sax.codeSelect || { fn: {}, $dlg: {} };
|
|
|
|
//--------------------------------------------------------------
|
|
/*
|
|
* Code selection config:
|
|
* - caption - dialog title.
|
|
* - width: preferred dialog width (default: 400).
|
|
* - height: preferred dialog height (default: 400).
|
|
* - showFilter: whether to display filter control(s).
|
|
* - filterLabel: filter code field caption.
|
|
* - maxItems: maximum number of available items to list.
|
|
* - codes - list of {code,desc,comment} objects
|
|
* - selectedCodes - list of codes.
|
|
* - fnCallback - method to call on completion to store codes taking list of selected codes as parameter.
|
|
*/
|
|
cs.fn.openCodeSelect = function (cfg)
|
|
{
|
|
//sax.debug('openSelectCode', cfg);
|
|
cs.fn.init();
|
|
cs.cfg = cfg;
|
|
cs.selectedCodes = cfg.selectedCodes || [];
|
|
cs.fn.displayCodes(cfg.codes);
|
|
sax.openDialog(cs.$dlg.dialog('option', { title: cfg.caption || 'Select Codes' }), cs.cfg.width || 400, cs.cfg.height || 400);
|
|
}
|
|
cs.fn.displayCodes = function (codes)
|
|
{
|
|
let $codesAvail = $('.sax-codeSelect-codes.AvailableCodes').empty();
|
|
let $codesSelec = $('.sax-codeSelect-codes.SelectedCodes').empty();
|
|
let $codeTmpl = $('.sax-panel-item-template .sax-panel-item.Code');
|
|
for (let codeIdx = 0; codeIdx < codes.length; codeIdx++)
|
|
{
|
|
let code = codes[codeIdx];
|
|
let selected = cs.selectedCodes.indexOf(code.code) >= 0;
|
|
let $code = $codeTmpl.clone();
|
|
$($code).attr('aria-code', code.code).on('click', function () { cs.fn.onClickCode(code.code, $code); }).on('dblclick', function () { cs.fn.onDblClickCode(code.code, $code); }).find('.CodeDesc').text(code.desc).end();
|
|
if (selected) $codesSelec.append($code);
|
|
else $codesAvail.append($code);
|
|
}
|
|
}
|
|
cs.fn.onClickCode = function (code, $code)
|
|
{
|
|
$('.sax-panel-item.Code').removeClass('sel');
|
|
$code.addClass('sel');
|
|
}
|
|
cs.fn.onDblClickCode = function (code, $code)
|
|
{
|
|
let codeIdx = cs.selectedCodes.indexOf(code);
|
|
//sax.debug('onDblClickCode', code, codeIdx);
|
|
if (codeIdx >= 0) cs.selectedCodes.splice(codeIdx, 1); else cs.selectedCodes.push(code)
|
|
cs.fn.displayCodes(cs.cfg.codes)
|
|
$code.addClass('sel');
|
|
}
|
|
cs.fn.onClickSelect = function ()
|
|
{
|
|
let codes = [];
|
|
$('.sax-codeSelect-codes.AvailableCodes .sax-panel-item.Code.sel').each(function (idx, el)
|
|
{
|
|
let code = $(el).attr('aria-code');
|
|
if (code)
|
|
{
|
|
codes.push(code);
|
|
cs.selectedCodes.push(code);
|
|
};
|
|
});
|
|
cs.fn.displayCodes(cs.cfg.codes)
|
|
for (const code of codes)
|
|
$('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel');
|
|
}
|
|
cs.fn.onClickRemove = function ()
|
|
{
|
|
let codes = [];
|
|
$('.sax-codeSelect-codes.SelectedCodes .sax-panel-item.Code.sel').each(function (idx, el)
|
|
{
|
|
let code = $(el).attr('aria-code');
|
|
if (code)
|
|
{
|
|
let codeIdx = cs.selectedCodes.indexOf(code);
|
|
if (codeIdx >= 0)
|
|
{
|
|
codes.push(code);
|
|
cs.selectedCodes.splice(codeIdx, 1);
|
|
}
|
|
};
|
|
});
|
|
cs.fn.displayCodes(cs.cfg.codes)
|
|
for (const code of codes)
|
|
$('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel');
|
|
}
|
|
cs.fn.storeSelectCode = function ()
|
|
{
|
|
//sax.debug('storeSelectCode', cs.cfg, cs.selectedCodes);
|
|
if (cs.cfg.fnCallback) cs.cfg.fnCallback(cs.selectedCodes);
|
|
cs.$dlg.dialog('close');
|
|
cs.fn.cleanUp();
|
|
}
|
|
cs.fn.cleanUp = function ()
|
|
{
|
|
delete cs.cfg;
|
|
delete cs.selectedCodes;
|
|
}
|
|
|
|
//--------------------------------------------------------------
|
|
cs.fn.init = function ()
|
|
{
|
|
if (!cs.$dlg) return;
|
|
var opt = sax.dlgOpts();
|
|
opt.buttons[sax.dlg.btn.ok] = function () { cs.fn.storeSelectCode(); };
|
|
opt.buttons[sax.dlg.btn.cancel] = function () { cs.fn.cleanUp(); $(this).dialog('close'); };
|
|
cs.$dlg = $('#dlgCodeSelect').dialog(opt);
|
|
$('.sax-button.Select', cs.$dlg).on('click', function () { cs.fn.onClickSelect(); });
|
|
$('.sax-button.Remove', cs.$dlg).on('click', function () { cs.fn.onClickRemove(); });
|
|
}
|
|
|
|
}(window, window.document));
|
|
|
|
/* The End */ |