if (!global.p5UI__MenuStore) throw 'Missing global.p5UI__MenuStore'
var DBG = DBG || 0
var DBG1 = 1
// TODO: mv to React: { state: { menu items, query } }
function renderLabel(item) {
return (item.short_label !== item.desc)
? item.short_label + ' ' + item.desc + ''
: item.short_label
;
}
function renderTitle(item) {
return (item.label !== item.desc)
? item.label + ' (' + item.desc + ')'
: item.label
;
}
function renderStar(id, idsBookmarks) {
return (-1 !== idsBookmarks.indexOf(id))
? ''
: ''
;
}
function makeRenderDropdownListItem(grouped, data) {
return function renderDropdownListItem(baseNs) {
var item = (baseNs in grouped.mapNsToIdx)
? data.objects[ grouped.mapNsToIdx[baseNs] ]
: data.objects[ grouped.mapNsToIdx[ grouped.menuTreeNs[baseNs][0] ] ]
;
DBG && console.log('DBG:renderP5MainMenuDropdown >> render loop', { baseNs, isInMap: (baseNs in grouped.mapNsToIdx), item, idx: [ grouped.mapNsToIdx[baseNs], grouped.menuTreeNs[baseNs][0] ] });
return (grouped.menuTreeNs[baseNs].length > 1)
? '
' + "\n"
: '' +
'' +
renderStar(item.id, data.idsBookmarks) +
' ' + renderLabel(item) +
'' +
'' + "\n"
;
}
}
function renderP5MainMenuDropdown(data) {
DBG && console.log('DBG:renderP5MainMenuDropdown data.objects', data.objects)
var grouped = data.objects.reduce(function (ret, item, idx) {
ret.mapNsToIdx[ item.namespace ] = idx
var nsParts = item.namespace.split('/')
var baseNs = nsParts.slice(0, 2).join('/')
DBG && console.log('DBG:renderP5MainMenuDropdown >> reduce loop ', { nsParts, baseNs });
if (!ret.menuTreeNs[baseNs]) ret.menuTreeNs[baseNs] = []
ret.menuTreeNs[baseNs].push(item.namespace)
return ret;
}, { mapNsToIdx: {}, menuTreeNs: {} })
DBG && console.log('DBG:renderP5MainMenuDropdown grouped', grouped)
var renderDropdownListItem = makeRenderDropdownListItem(grouped, data)
var labels = Object.keys(grouped.menuTreeNs).map(function (baseNs) {
var item = (baseNs in grouped.mapNsToIdx)
? data.objects[ grouped.mapNsToIdx[baseNs] ]
: data.objects[ grouped.mapNsToIdx[ grouped.menuTreeNs[baseNs][0] ] ]
;
return {
ns: baseNs,
label: (item.short_label !== item.desc) ? item.short_label : item.desc,
}
});
DBG && console.log('DBG:renderP5MainMenuDropdown labels', labels)
labels.sort(function (item1, item2) {
var l1 = item1.label.toLowerCase()
var l2 = item2.label.toLowerCase()
if (l1 < l2) { return -1; }
if (l1 > l2) { return 1; }
return 0
})
var groupeByLabel = labels.reduce(function (ret, item) {
if (!ret.length) return [ { prefix: item.label, labels: [ item ] } ];
var last = ret.pop()
var labelLast = last.prefix.replace('_', ' ').split(" ")
var labelItem = item.label.replace('_', ' ').split(" ")
DBG && console.log('DBG:renderP5MainMenuDropdown TODO: group?', { last, item, labelLast, labelItem })
if (labelLast[0] === labelItem[0]) {
last.labels.push(item)
last.prefix = labelLast[0] + " (" + last.labels.length + ")"
ret.push(last)
} else {
ret.push(last)
ret.push({ prefix: item.label, labels: [item] })
return ret;
}
return ret;
}, [])
var nodesGroupedByLabel = groupeByLabel.map(function (item) {
// var baseNs =
if (item.labels.length === 1) {
return renderDropdownListItem(item.labels[0].ns)
} else {
// return '' + item.prefix + '
' +
// '' + item.labels.map(function (label) {
// return renderDropdownListItem(label.ns)
// }).join("\n") +
// '
';
return '' + "\n"
;
}
})
DBG && console.log('DBG:renderP5MainMenuDropdown grouped', { grouped, labels, groupeByLabel })
return nodesGroupedByLabel;
// var jqDropdownMenu = jQuery('#' + idSubMenu)
// jqDropdownMenu.empty()
// jqDropdownMenu.append(searchBox);
// jqDropdownMenu.append(nodesGroupedByLabel);
// var liNodes = Object.keys(grouped.menuTreeNs).map(function (baseNs) {
// var item = (baseNs in grouped.mapNsToIdx)
// ? data.objects[ grouped.mapNsToIdx[baseNs] ]
// : data.objects[ grouped.mapNsToIdx[ grouped.menuTreeNs[baseNs][0] ] ]
// ;
// DBG && console.log('DBG:renderP5MainMenuDropdown >> render loop', { baseNs, isInMap: (baseNs in grouped.mapNsToIdx), item, idx: [ grouped.mapNsToIdx[baseNs], grouped.menuTreeNs[baseNs][0] ] });
// return (grouped.menuTreeNs[baseNs].length > 1)
// ? '' + "\n"
// : '' +
// '' +
// renderStar(item.id, data.idsBookmarks) +
// ' ' + renderLabel(item) +
// '' +
// '' + "\n"
// ;
// })
// jqDropdownMenu.append(liNodes);
}
function initP5MainMenuDropdown( btnNode, idSubMenu ) { // @usage: onClick="return initP5MainMenuDropdown(this, 'SE-menu-tables')"
DBG && console.log('DBG:initP5MainMenuDropdown({idSubMenu: '+idSubMenu+'})');
if (!btnNode._initialized) {
var jqDropdownTrigger = jQuery(btnNode)
var jqDropdownMenu = jQuery('#' + idSubMenu)
var jqDropdownParent = jqDropdownMenu.parent()
var idSearchBoxNode = 'idSubMenu_searchBox';
var rerenderDropdown = (function (global, idSubMenu, jqDropdownMenu, jqDropdownTrigger) {
return function (data) {
DBG && console.log('DBG renderP5MainMenuDropdown', {data, idSubMenu});
var mainMenuFilterCallback = makeMainMenuFilterCallback(jqDropdownMenu, idSearchBoxNode);
var searchBox = document.createElement('div')
searchBox.setAttribute('style', "padding:12px 20px; min-width:200px");
{
var searchBox_group = document.createElement('div')
searchBox_group.setAttribute('class', "input-group");
{
searchBox_group_icon = document.createElement('span')
searchBox_group_icon.setAttribute('class', "input-group-addon");
searchBox_group_icon.innerHTML = '';
searchBox_group.appendChild(searchBox_group_icon)
}
{
searchBox_group_input = document.createElement('input')
searchBox_group_input.setAttribute('type', "text");
searchBox_group_input.setAttribute('class', "form-control");
searchBox_group_input.setAttribute('value', "");
searchBox_group_input.setAttribute('id', idSearchBoxNode);
searchBox_group_input.setAttribute('autofocus', "autofocus");
// onChange: function (fieldName, value) {
// priv.options.filterStore.dispatch(priv.options.filterActions.searchBox_delayFilter(fieldName, value));
// }
jQuery(searchBox_group_input).on('keyup', function (event) {
event.preventDefault()
event.stopPropagation()
searchBox_delayFilter(mainMenuFilterCallback, event.target.value)
})
searchBox_group.appendChild(searchBox_group_input)
}
{
searchBox_group_clear = document.createElement('span')
searchBox_group_clear.setAttribute('class', "input-group-addon");
searchBox_group_clear.style.display = "none";
searchBox_group_clear.style.cursor = "pointer";
searchBox_group_clear.innerHTML = '';
jQuery(searchBox_group_clear).on('click', function (event) {
event.preventDefault()
event.stopPropagation()
DBG && console.log("DBG:searchBox:clear", { value: jQuery('#' + idSearchBoxNode).value, node: jQuery('#' + idSearchBoxNode) })
jQuery('#' + idSearchBoxNode).val('');
mainMenuFilterCallback('')
})
searchBox_group.appendChild(searchBox_group_clear)
}
searchBox.appendChild(searchBox_group)
jQuery(searchBox).on('click', function (event) {
DBG && console.log("DBG:searchBox.on(click) ...")
event.preventDefault()
event.stopPropagation()
})
}
jqDropdownMenu.empty()
jqDropdownMenu.append(searchBox);
jqDropdownMenu.append(renderP5MainMenuDropdown(data));
}
})(global, idSubMenu, jqDropdownMenu, jqDropdownTrigger);
global.p5UI__MenuStore.subscribe(rerenderDropdown)
jqDropdownTrigger.attr('data-toggle', 'dropdown') // is required by bootstrap dorpdown.js even if is called via js
jqDropdownParent.on('shown.bs.dropdown', function () {
// DBG && console.log("DBG:Main menu:shown.bs.dropdown")
jQuery('#' + idSearchBoxNode).focus()
})
jqDropdownParent.on('hidden.bs.dropdown', function () {
// DBG && console.log("DBG:Main menu:hidden.bs.dropdown")
})
global.p5UI__MenuStore.forceUpdate()
jQuery(btnNode).dropdown()
}
btnNode._initialized = true // TODO: DBG TEST
return true;
}
function menuStore__getObjectById(id) {
var allData = global.p5UI__MenuStore.getData()
if (!allData || !allData.objects) return null;
for (var i = 0, l = allData.objects.length; i < l; i++) {
var itemObj = allData.objects[i]
if (itemObj.id === id) return itemObj;
}
return null;
}
function searchBox__isStringMatch(str, query) {
// TODO: split query for words
return (-1 !== str.toLowerCase().search(query.toLowerCase()));
}
function searchBox__isMenuObjectMatch(itemObj, query) {
if (!itemObj) return false;
if (itemObj.label && searchBox__isStringMatch(itemObj.label, query)) return true;
if (itemObj.name && searchBox__isStringMatch(itemObj.name, query)) return true;
if (itemObj.opis && searchBox__isStringMatch(itemObj.opis, query)) return true;
if (itemObj.namespace && searchBox__isStringMatch(itemObj.namespace, query)) return true;
// if (itemObj.desc && searchBox__isStringMatch(itemObj.desc, query)) return true;
// if (itemObj.short_label && searchBox__isStringMatch(itemObj.short_label, query)) return true;
// if (itemObj.id && searchBox__isStringMatch(itemObj.id, query)) return true;
return false;
}
function searchBox__isMenuItemMatch(node, query) {
DBG && console.log("DBG:Main menu:searchBox__isMenuItemMatch", { query: query, label: jQuery(node).children('a').text(), node: node })
if (node.hasAttribute('data-id')) {
var id = parseInt(node.getAttribute('data-id'));
var itemObj = menuStore__getObjectById(id);
return searchBox__isMenuObjectMatch(itemObj, query);
}
if (node.hasChildNodes()) {
{
var groupItemLabel = jQuery(node).children('a').text()
if (searchBox__isStringMatch(groupItemLabel, query)) return true;
}
// DBG && console.log("DBG:Main menu:searchBox__isMenuItemMatch: loop start...", { query: query, label: jQuery(node).children('a').text(), node: node })
for (var i = 0, l = node.childNodes.length; i < l; i++) {
if ("UL" === node.childNodes[i].tagName) {
// DBG && console.log("DBG:Main menu:searchBox__isMenuItemMatch: loop UL ", { query: query, label: jQuery(node).children('a').text(), node: node })
for (var j = 0, l = node.childNodes[i].childNodes.length; j < l; j++) {
if ("LI" === node.childNodes[i].childNodes[j].tagName) {
// DBG && console.log("DBG:Main menu:searchBox__isMenuItemMatch: loop UL > LI ", { query: query, label: jQuery(node).children('a').text(), node: node })
if (searchBox__isMenuItemMatch(node.childNodes[i].childNodes[j], query)) {
return true;
}
}
}
break;
}
}
}
return false;
}
function makeMainMenuFilterCallback(jqDropdownMenu, idSearchBoxNode) {
return function (query) {
DBG && console.log("DBG:Main menu:makeMainMenuFilterCallback", { query: query, jqDropdownMenu, idSearchBoxNode })
jQuery('#' + idSearchBoxNode).next('span').get(0).style.display = query ? 'table-cell' : 'none';
jqDropdownMenu.children('li').each(function (idx, node) {
node.style.display = "list-item";
})
if (!query || query.length < 3) return;
jqDropdownMenu.children('li').each(function (idx, node) {
// if (node.style.display === "none") node.style.display = "";
var id = (node.hasAttribute('data-id')) ? parseInt(node.getAttribute('data-id')) : null;
var itemObj = (id) ? menuStore__getObjectById(id) : null;
var isMatch = searchBox__isMenuItemMatch(node, query)
DBG && console.log("DBG:Main menu:makeMainMenuFilterCallback:loop", { isMatch: isMatch, id: id, itemObj: itemObj, display: node.style.display, node: node })
node.style.display = isMatch ? "list-item" : "none";
})
}
}
var _config_delay_value = 450;
var _config_delay_timeout = null;
function searchBox_delayFilter(callback, value) {
// DBG && console.log('DBG:searchBox:delayFilter', { value });
if (_config_delay_timeout) clearTimeout(_config_delay_timeout)
_config_delay_timeout = setTimeout(function () {
DBG && console.log("DBG:Main menu:delayFilter", { value: value })
callback(value)
}, _config_delay_value)
}
global.initP5MainMenuDropdown = initP5MainMenuDropdown