if (!global.p5UI__MenuStore) throw 'Missing global.p5UI__MenuStore' var DBG = DBG || 0 var DBG1 = 1 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, idSubMenu) { 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, } }); 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 }) var jqDropdownMenu = jQuery('#' + idSubMenu) jqDropdownMenu.empty() 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 ) { DBG && console.log('DBG:initP5MainMenuDropdown({idSubMenu: '+idSubMenu+'})'); if (!btnNode._initialized) { var jqDropdownTrigger = jQuery(btnNode) var jqDropdownMenu = jQuery('#' + idSubMenu) var jqDropdownParent = jqDropdownMenu.parent() var rerenderDropdown = (function (global, idSubMenu) { return function (data) { DBG && console.log('DBG renderP5MainMenuDropdown', {data, idSubMenu}); renderP5MainMenuDropdown(data, idSubMenu); } })(global, idSubMenu); global.p5UI__MenuStore.subscribe(rerenderDropdown) jqDropdownTrigger.attr('data-toggle', 'dropdown') // is required by bootstrap dorpdown.js evenf if is called via js global.p5UI__MenuStore.forceUpdate() jQuery(btnNode).dropdown() } // btnNode._initialized = true // TODO: DBG TEST return true; } global.initP5MainMenuDropdown = initP5MainMenuDropdown