/* * Admin - Code selection. */ (function (win, doc, undef) { "use strict"; let sc = sax.selectCode = sax.selectCode || { fn: {}, $dlg: {}, codeIdPrefix: 'Code_' }; //-------------------------------------------------------------- /* * 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. */ sc.fn.openSelectCode = function (cfg) { //sax.debug('openSelectCode', cfg); sc.cfg = cfg; sc.selectedCodes = cfg.selectedCodes || []; sc.fn.displayCodes(cfg.codes); sax.openDialog(sc.$dlg.dialog('option', { title: cfg.caption || 'Select Codes' }), sc.cfg.width || 400, sc.cfg.height || 400); } sc.fn.displayCodes = function (codes) { let $codesAvail = $('.sax-selectCode-codes.AvailableCodes').empty(); let $codesSelec = $('.sax-selectCode-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 = sc.selectedCodes.indexOf(code.code) >= 0; let $code = $codeTmpl.clone(); $($code).prop('id', sc.codeIdPrefix + code.code).attr('aria-code', code.code).on('click', function () { sc.fn.onClickCode(code.code); }).on('dblclick', function () { sc.fn.onDblClickCode(code.code); }).find('.CodeDesc').text(code.desc).end(); if (selected) $codesSelec.append($code); else $codesAvail.append($code); } } sc.fn.onClickCode = function (code) { $('.sax-panel-item.Code').removeClass('sel'); $('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel'); } sc.fn.onDblClickCode = function (code) { let codeIdx = sc.selectedCodes.indexOf(code); //sax.debug('onDblClickCode', code, codeIdx); if (codeIdx >= 0) sc.selectedCodes.splice(codeIdx, 1); else sc.selectedCodes.push(code) sc.fn.displayCodes(sc.cfg.codes) $('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel'); } sc.fn.onClickSelect = function () { let codes = []; $('.sax-selectCode-codes.AvailableCodes .sax-panel-item.Code.sel').each(function (idx, el) { let code = $(el).attr('aria-code'); if (code) { codes.push(code); sc.selectedCodes.push(code); }; }); sc.fn.displayCodes(sc.cfg.codes) for (const code of codes) $('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel'); } sc.fn.onClickRemove = function () { let codes = []; $('.sax-selectCode-codes.SelectedCodes .sax-panel-item.Code.sel').each(function (idx, el) { let code = $(el).attr('aria-code'); if (code) { let codeIdx = sc.selectedCodes.indexOf(code); if (codeIdx >= 0) { codes.push(code); sc.selectedCodes.splice(codeIdx, 1); } }; }); sc.fn.displayCodes(sc.cfg.codes) for (const code of codes) $('.sax-panel-item.Code[aria-code="' + code + '"]').addClass('sel'); } sc.fn.storeSelectCode = function () { //sax.debug('storeSelectCode', sc.cfg, sc.selectedCodes); if (sc.cfg.fnCallback) sc.cfg.fnCallback(sc.selectedCodes); sc.$dlg.dialog('close'); sc.fn.cleanUp(); } sc.fn.cleanUp = function () { delete sc.cfg; delete sc.selectedCodes; } //-------------------------------------------------------------- $(function () { var opt = sax.dlgOpts(); opt.buttons[sax.dlg.btn.ok] = function () { sc.fn.storeSelectCode(); }; opt.buttons[sax.dlg.btn.cancel] = function () { sc.fn.cleanUp(); $(this).dialog('close'); }; sc.$dlg = $('#dlgSelectCode').dialog(opt); $('.sax-button.Select', sc.$dlg).on('click', function () { sc.fn.onClickSelect(); }); $('.sax-button.Remove', sc.$dlg).on('click', function () { sc.fn.onClickRemove(); }); }); //-------------------------------------------------------------- }(window, window.document)); /* The End */