From 51b3fd41f0a1e81e36c5bd8d3df2fac6f0272bb9 Mon Sep 17 00:00:00 2001 From: Mark Friedrich Date: Thu, 18 Apr 2019 23:44:41 +0200 Subject: [PATCH] - improved "signature panel". "leads to" select for WHs now groups already linked systems, closed #727 --- js/app/ui/module/system_signature.js | 59 ++++++++++++++++++- js/app/util.js | 4 ++ .../v1.5.1/app/ui/module/system_signature.js | 59 ++++++++++++++++++- public/js/v1.5.1/app/util.js | 4 ++ 4 files changed, 120 insertions(+), 6 deletions(-) diff --git a/js/app/ui/module/system_signature.js b/js/app/ui/module/system_signature.js index d6846067..f0a89d8f 100644 --- a/js/app/ui/module/system_signature.js +++ b/js/app/ui/module/system_signature.js @@ -1083,16 +1083,69 @@ define([ /** * helper function - set 'shown' observer for xEditable connection cell * -> enable Select2 for xEditable form + * @param tableApi * @param cell */ - let editableConnectionOnShown = cell => { + let editableConnectionOnShown = (tableApi, cell) => { $(cell).on('shown', function(e, editable){ let inputField = editable.input.$input; + if(!$(tableApi.table().node()).hasClass(config.sigTablePrimaryClass)){ + // we need the primary table API to get selected connections + let metaData = getTableMetaData(tableApi); + tableApi = getDataTableInstance(metaData.mapId, metaData.systemId, 'primary'); + } + // Select2 init would work without passing select options as "data", Select2 would grap data from DOM // -> We want to pass "meta" data for each option into Select2 for formatting + let selectOptions = Util.convertXEditableOptionsToSelect2(editable); + + // for better UX, systems that are already linked to a wh signatures should be "disabled" + // -> and grouped into a new + let linkedConnectionIds = tableApi.column('connection:name').data().toArray(); + linkedConnectionIds = linkedConnectionIds.filter(id => id > 0); + + if(linkedConnectionIds.length){ + let groupedSelectOptions = []; + let newSelectOptionGroupDisabled = []; + for(let selectOptionGroup of selectOptions){ + if(Array.isArray(selectOptionGroup.children)){ + let newSelectOptionGroup = []; + for(let option of selectOptionGroup.children){ + if(!option.selected && linkedConnectionIds.includes(option.id)){ + // connection already linked -> move to "disabled" group + option.disabled = true; + newSelectOptionGroupDisabled.push(option); + }else{ + // connection is available for link + newSelectOptionGroup.push(option); + } + } + + if(newSelectOptionGroup.length){ + groupedSelectOptions.push({ + text: selectOptionGroup.text, + children: newSelectOptionGroup + }); + } + }else{ + // option has no children -> is prepend (id = 0) option + groupedSelectOptions.push(selectOptionGroup); + } + } + + if(newSelectOptionGroupDisabled.length){ + groupedSelectOptions.push({ + text: 'linked', + children: newSelectOptionGroupDisabled + }); + } + + selectOptions = groupedSelectOptions; + } + let options = { - data: Util.convertXEditableOptionsToSelect2(editable) + data: selectOptions }; inputField.addClass('pf-select2').initSignatureConnectionSelect(options); @@ -1484,7 +1537,7 @@ define([ editableOnSave(tableApi, cell, [], ['action:name']); editableOnHidden(tableApi, cell); editableConnectionOnInit(cell); - editableConnectionOnShown(cell); + editableConnectionOnShown(tableApi, cell); editableConnectionOnSave(cell); $(cell).editable($.extend({ diff --git a/js/app/util.js b/js/app/util.js index d0a56a83..5b76da5c 100644 --- a/js/app/util.js +++ b/js/app/util.js @@ -1046,6 +1046,10 @@ define([ data.selected = true; } + if(option.disabled === true){ + data.disabled = true; + } + // optional "metaData" that belongs to this option if(option.hasOwnProperty('metaData')){ data.metaData = option.metaData; diff --git a/public/js/v1.5.1/app/ui/module/system_signature.js b/public/js/v1.5.1/app/ui/module/system_signature.js index d6846067..f0a89d8f 100644 --- a/public/js/v1.5.1/app/ui/module/system_signature.js +++ b/public/js/v1.5.1/app/ui/module/system_signature.js @@ -1083,16 +1083,69 @@ define([ /** * helper function - set 'shown' observer for xEditable connection cell * -> enable Select2 for xEditable form + * @param tableApi * @param cell */ - let editableConnectionOnShown = cell => { + let editableConnectionOnShown = (tableApi, cell) => { $(cell).on('shown', function(e, editable){ let inputField = editable.input.$input; + if(!$(tableApi.table().node()).hasClass(config.sigTablePrimaryClass)){ + // we need the primary table API to get selected connections + let metaData = getTableMetaData(tableApi); + tableApi = getDataTableInstance(metaData.mapId, metaData.systemId, 'primary'); + } + // Select2 init would work without passing select options as "data", Select2 would grap data from DOM // -> We want to pass "meta" data for each option into Select2 for formatting + let selectOptions = Util.convertXEditableOptionsToSelect2(editable); + + // for better UX, systems that are already linked to a wh signatures should be "disabled" + // -> and grouped into a new + let linkedConnectionIds = tableApi.column('connection:name').data().toArray(); + linkedConnectionIds = linkedConnectionIds.filter(id => id > 0); + + if(linkedConnectionIds.length){ + let groupedSelectOptions = []; + let newSelectOptionGroupDisabled = []; + for(let selectOptionGroup of selectOptions){ + if(Array.isArray(selectOptionGroup.children)){ + let newSelectOptionGroup = []; + for(let option of selectOptionGroup.children){ + if(!option.selected && linkedConnectionIds.includes(option.id)){ + // connection already linked -> move to "disabled" group + option.disabled = true; + newSelectOptionGroupDisabled.push(option); + }else{ + // connection is available for link + newSelectOptionGroup.push(option); + } + } + + if(newSelectOptionGroup.length){ + groupedSelectOptions.push({ + text: selectOptionGroup.text, + children: newSelectOptionGroup + }); + } + }else{ + // option has no children -> is prepend (id = 0) option + groupedSelectOptions.push(selectOptionGroup); + } + } + + if(newSelectOptionGroupDisabled.length){ + groupedSelectOptions.push({ + text: 'linked', + children: newSelectOptionGroupDisabled + }); + } + + selectOptions = groupedSelectOptions; + } + let options = { - data: Util.convertXEditableOptionsToSelect2(editable) + data: selectOptions }; inputField.addClass('pf-select2').initSignatureConnectionSelect(options); @@ -1484,7 +1537,7 @@ define([ editableOnSave(tableApi, cell, [], ['action:name']); editableOnHidden(tableApi, cell); editableConnectionOnInit(cell); - editableConnectionOnShown(cell); + editableConnectionOnShown(tableApi, cell); editableConnectionOnSave(cell); $(cell).editable($.extend({ diff --git a/public/js/v1.5.1/app/util.js b/public/js/v1.5.1/app/util.js index d0a56a83..5b76da5c 100644 --- a/public/js/v1.5.1/app/util.js +++ b/public/js/v1.5.1/app/util.js @@ -1046,6 +1046,10 @@ define([ data.selected = true; } + if(option.disabled === true){ + data.disabled = true; + } + // optional "metaData" that belongs to this option if(option.hasOwnProperty('metaData')){ data.metaData = option.metaData;