initP5MainMenuDropdown.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. if (!global.p5UI__MenuStore) throw 'Missing global.p5UI__MenuStore'
  2. var DBG = DBG || 0
  3. var DBG1 = 1
  4. function renderLabel(item) {
  5. return (item.short_label !== item.desc)
  6. ? item.short_label + ' <em>' + item.desc + '</em>'
  7. : item.short_label
  8. ;
  9. }
  10. function renderTitle(item) {
  11. return (item.label !== item.desc)
  12. ? item.label + ' (' + item.desc + ')'
  13. : item.label
  14. ;
  15. }
  16. function renderStar(id, idsBookmarks) {
  17. return (-1 !== idsBookmarks.indexOf(id))
  18. ? '<i class=\"bookmark-item-rem glyphicon glyphicon-star\" title=\"Usuń z ulubionych\" onClick=\"return p5BookmarksRemove(event, ' + id + ')\"></i>'
  19. : '<i class=\"bookmark-item-add glyphicon glyphicon-star-empty\" title=\"Dodaj do ulubionych\" onClick=\"return p5BookmarksAdd(event, ' + id + ')\"></i>'
  20. ;
  21. }
  22. function renderP5MainMenuDropdown(data, idSubMenu) {
  23. DBG && console.log('DBG:renderP5MainMenuDropdown data.objects', data.objects)
  24. var grouped = data.objects.reduce(function (ret, item, idx) {
  25. ret.mapNsToIdx[ item.namespace ] = idx
  26. var nsParts = item.namespace.split('/')
  27. var baseNs = nsParts.slice(0, 2).join('/')
  28. DBG && console.log('DBG:renderP5MainMenuDropdown >> reduce loop ', { nsParts, baseNs });
  29. if (!ret.menuTreeNs[baseNs]) ret.menuTreeNs[baseNs] = []
  30. ret.menuTreeNs[baseNs].push(item.namespace)
  31. return ret;
  32. }, { mapNsToIdx: {}, menuTreeNs: {} })
  33. DBG && console.log('DBG:renderP5MainMenuDropdown grouped', grouped)
  34. var jqDropdownMenu = jQuery('#' + idSubMenu)
  35. jqDropdownMenu.empty()
  36. liNodes = Object.keys(grouped.menuTreeNs).map(function (baseNs) {
  37. var item = (baseNs in grouped.mapNsToIdx)
  38. ? data.objects[ grouped.mapNsToIdx[baseNs] ]
  39. : data.objects[ grouped.mapNsToIdx[ grouped.menuTreeNs[baseNs][0] ] ]
  40. ;
  41. DBG && console.log('DBG:renderP5MainMenuDropdown >> render loop', { baseNs, isInMap: (baseNs in grouped.mapNsToIdx), item, idx: [ grouped.mapNsToIdx[baseNs], grouped.menuTreeNs[baseNs][0] ] });
  42. return (grouped.menuTreeNs[baseNs].length > 1)
  43. ? '<li class="dropdown-submenu">' +
  44. '<a href=\"index.php?_route=ViewTableAjax&namespace=' + item.namespace + '\" title="' + renderTitle(item) + '">' +
  45. renderStar(item.id, data.idsBookmarks) +
  46. ' ' + renderLabel(item) +
  47. '</a>' + "\n" +
  48. '<ul class="dropdown-menu">' +
  49. grouped.menuTreeNs[baseNs].map(function (subItemNs) {
  50. var subItem = data.objects[ grouped.mapNsToIdx[subItemNs] ]
  51. return '<li>' +
  52. '<a href=\"index.php?_route=ViewTableAjax&namespace=' + subItem.namespace + '\" title="' + renderTitle(subItem) + '">' +
  53. renderStar(subItem.id, data.idsBookmarks) +
  54. ' ' + renderLabel(subItem) +
  55. '</a>' +
  56. '</li>'
  57. ;
  58. }).join("\n") +
  59. '</ul>' +
  60. '</li>' + "\n"
  61. : '<li>' +
  62. '<a href=\"index.php?_route=ViewTableAjax&namespace=' + item.namespace + '\" title="' + renderTitle(item) + '">' +
  63. renderStar(item.id, data.idsBookmarks) +
  64. ' ' + renderLabel(item) +
  65. '</a>' +
  66. '</li>' + "\n"
  67. ;
  68. })
  69. jqDropdownMenu.append(liNodes);
  70. }
  71. function initP5MainMenuDropdown( btnNode, idSubMenu ) {
  72. DBG && console.log('DBG:initP5MainMenuDropdown({idSubMenu: '+idSubMenu+'})');
  73. if (!btnNode._initialized) {
  74. var jqDropdownTrigger = jQuery(btnNode)
  75. var jqDropdownMenu = jQuery('#' + idSubMenu)
  76. var jqDropdownParent = jqDropdownMenu.parent()
  77. var rerenderDropdown = (function (global, idSubMenu) {
  78. return function (data) {
  79. DBG && console.log('DBG renderP5MainMenuDropdown', {data, idSubMenu});
  80. renderP5MainMenuDropdown(data, idSubMenu);
  81. }
  82. })(global, idSubMenu);
  83. global.p5UI__MenuStore.subscribe(rerenderDropdown)
  84. jqDropdownTrigger.attr('data-toggle', 'dropdown') // is required by bootstrap dorpdown.js evenf if is called via js
  85. global.p5UI__MenuStore.forceUpdate()
  86. jQuery(btnNode).dropdown()
  87. }
  88. // btnNode._initialized = true // TODO: DBG TEST
  89. return true;
  90. }
  91. global.initP5MainMenuDropdown = initP5MainMenuDropdown