initP5MainMenuDropdown.js 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  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 makeRenderDropdownListItem(grouped, data) {
  23. return function renderDropdownListItem(baseNs) {
  24. var item = (baseNs in grouped.mapNsToIdx)
  25. ? data.objects[ grouped.mapNsToIdx[baseNs] ]
  26. : data.objects[ grouped.mapNsToIdx[ grouped.menuTreeNs[baseNs][0] ] ]
  27. ;
  28. DBG && console.log('DBG:renderP5MainMenuDropdown >> render loop', { baseNs, isInMap: (baseNs in grouped.mapNsToIdx), item, idx: [ grouped.mapNsToIdx[baseNs], grouped.menuTreeNs[baseNs][0] ] });
  29. return (grouped.menuTreeNs[baseNs].length > 1)
  30. ? '<li class="dropdown-submenu">' +
  31. '<a href=\"index.php?_route=ViewTableAjax&namespace=' + item.namespace + '\" title="' + renderTitle(item) + '">' +
  32. renderStar(item.id, data.idsBookmarks) +
  33. ' ' + renderLabel(item) +
  34. '</a>' + "\n" +
  35. '<ul class="dropdown-menu">' +
  36. grouped.menuTreeNs[baseNs].map(function (subItemNs) {
  37. var subItem = data.objects[ grouped.mapNsToIdx[subItemNs] ]
  38. return '<li>' +
  39. '<a href=\"index.php?_route=ViewTableAjax&namespace=' + subItem.namespace + '\" title="' + renderTitle(subItem) + '">' +
  40. renderStar(subItem.id, data.idsBookmarks) +
  41. ' ' + renderLabel(subItem) +
  42. '</a>' +
  43. '</li>'
  44. ;
  45. }).join("\n") +
  46. '</ul>' +
  47. '</li>' + "\n"
  48. : '<li>' +
  49. '<a href=\"index.php?_route=ViewTableAjax&namespace=' + item.namespace + '\" title="' + renderTitle(item) + '">' +
  50. renderStar(item.id, data.idsBookmarks) +
  51. ' ' + renderLabel(item) +
  52. '</a>' +
  53. '</li>' + "\n"
  54. ;
  55. }
  56. }
  57. function renderP5MainMenuDropdown(data, idSubMenu) {
  58. DBG && console.log('DBG:renderP5MainMenuDropdown data.objects', data.objects)
  59. var grouped = data.objects.reduce(function (ret, item, idx) {
  60. ret.mapNsToIdx[ item.namespace ] = idx
  61. var nsParts = item.namespace.split('/')
  62. var baseNs = nsParts.slice(0, 2).join('/')
  63. DBG && console.log('DBG:renderP5MainMenuDropdown >> reduce loop ', { nsParts, baseNs });
  64. if (!ret.menuTreeNs[baseNs]) ret.menuTreeNs[baseNs] = []
  65. ret.menuTreeNs[baseNs].push(item.namespace)
  66. return ret;
  67. }, { mapNsToIdx: {}, menuTreeNs: {} })
  68. DBG && console.log('DBG:renderP5MainMenuDropdown grouped', grouped)
  69. var renderDropdownListItem = makeRenderDropdownListItem(grouped, data)
  70. var labels = Object.keys(grouped.menuTreeNs).map(function (baseNs) {
  71. var item = (baseNs in grouped.mapNsToIdx)
  72. ? data.objects[ grouped.mapNsToIdx[baseNs] ]
  73. : data.objects[ grouped.mapNsToIdx[ grouped.menuTreeNs[baseNs][0] ] ]
  74. ;
  75. return {
  76. ns: baseNs,
  77. label: (item.short_label !== item.desc) ? item.short_label : item.desc,
  78. }
  79. });
  80. var groupeByLabel = labels.reduce(function (ret, item) {
  81. if (!ret.length) return [ { prefix: item.label, labels: [ item ] } ];
  82. var last = ret.pop()
  83. var labelLast = last.prefix.replace('_', ' ').split(" ")
  84. var labelItem = item.label.replace('_', ' ').split(" ")
  85. DBG && console.log('DBG:renderP5MainMenuDropdown TODO: group?', { last, item, labelLast, labelItem })
  86. if (labelLast[0] === labelItem[0]) {
  87. last.labels.push(item)
  88. last.prefix = labelLast[0] + " <em>(" + last.labels.length + ")</em>"
  89. ret.push(last)
  90. } else {
  91. ret.push(last)
  92. ret.push({ prefix: item.label, labels: [item] })
  93. return ret;
  94. }
  95. return ret;
  96. }, [])
  97. var nodesGroupedByLabel = groupeByLabel.map(function (item) {
  98. // var baseNs =
  99. if (item.labels.length === 1) {
  100. return renderDropdownListItem(item.labels[0].ns)
  101. } else {
  102. // return '<details><summary>' + item.prefix + '</summary><div>' +
  103. // '' + item.labels.map(function (label) {
  104. // return renderDropdownListItem(label.ns)
  105. // }).join("\n") +
  106. // '</div></details>';
  107. return '<li class="dropdown-submenu">' +
  108. '<a href=\"#\" onClick="return false">' +
  109. // '<b style="padding-left:18px">' + item.prefix + '</b>' +
  110. '<i class="glyphicon glyphicon-folder-open" style="opacity:0.5; font-size:90%; padding-right:3px"></i>' + " " +
  111. '<b>' + item.prefix + '</b>' +
  112. '</a>' + "\n" +
  113. '<ul class="dropdown-menu">' +
  114. item.labels.map(function (label) {
  115. return renderDropdownListItem(label.ns);
  116. }).join("\n") +
  117. '</ul>' +
  118. '</li>' + "\n"
  119. ;
  120. }
  121. })
  122. DBG && console.log('DBG:renderP5MainMenuDropdown grouped', { grouped, labels, groupeByLabel })
  123. var jqDropdownMenu = jQuery('#' + idSubMenu)
  124. jqDropdownMenu.empty()
  125. jqDropdownMenu.append(nodesGroupedByLabel);
  126. // var liNodes = Object.keys(grouped.menuTreeNs).map(function (baseNs) {
  127. // var item = (baseNs in grouped.mapNsToIdx)
  128. // ? data.objects[ grouped.mapNsToIdx[baseNs] ]
  129. // : data.objects[ grouped.mapNsToIdx[ grouped.menuTreeNs[baseNs][0] ] ]
  130. // ;
  131. // DBG && console.log('DBG:renderP5MainMenuDropdown >> render loop', { baseNs, isInMap: (baseNs in grouped.mapNsToIdx), item, idx: [ grouped.mapNsToIdx[baseNs], grouped.menuTreeNs[baseNs][0] ] });
  132. // return (grouped.menuTreeNs[baseNs].length > 1)
  133. // ? '<li class="dropdown-submenu">' +
  134. // '<a href=\"index.php?_route=ViewTableAjax&namespace=' + item.namespace + '\" title="' + renderTitle(item) + '">' +
  135. // renderStar(item.id, data.idsBookmarks) +
  136. // ' ' + renderLabel(item) +
  137. // '</a>' + "\n" +
  138. // '<ul class="dropdown-menu">' +
  139. // grouped.menuTreeNs[baseNs].map(function (subItemNs) {
  140. // var subItem = data.objects[ grouped.mapNsToIdx[subItemNs] ]
  141. // return '<li>' +
  142. // '<a href=\"index.php?_route=ViewTableAjax&namespace=' + subItem.namespace + '\" title="' + renderTitle(subItem) + '">' +
  143. // renderStar(subItem.id, data.idsBookmarks) +
  144. // ' ' + renderLabel(subItem) +
  145. // '</a>' +
  146. // '</li>'
  147. // ;
  148. // }).join("\n") +
  149. // '</ul>' +
  150. // '</li>' + "\n"
  151. // : '<li>' +
  152. // '<a href=\"index.php?_route=ViewTableAjax&namespace=' + item.namespace + '\" title="' + renderTitle(item) + '">' +
  153. // renderStar(item.id, data.idsBookmarks) +
  154. // ' ' + renderLabel(item) +
  155. // '</a>' +
  156. // '</li>' + "\n"
  157. // ;
  158. // })
  159. // jqDropdownMenu.append(liNodes);
  160. }
  161. function initP5MainMenuDropdown( btnNode, idSubMenu ) {
  162. DBG && console.log('DBG:initP5MainMenuDropdown({idSubMenu: '+idSubMenu+'})');
  163. if (!btnNode._initialized) {
  164. var jqDropdownTrigger = jQuery(btnNode)
  165. var jqDropdownMenu = jQuery('#' + idSubMenu)
  166. var jqDropdownParent = jqDropdownMenu.parent()
  167. var rerenderDropdown = (function (global, idSubMenu) {
  168. return function (data) {
  169. DBG && console.log('DBG renderP5MainMenuDropdown', {data, idSubMenu});
  170. renderP5MainMenuDropdown(data, idSubMenu);
  171. }
  172. })(global, idSubMenu);
  173. global.p5UI__MenuStore.subscribe(rerenderDropdown)
  174. jqDropdownTrigger.attr('data-toggle', 'dropdown') // is required by bootstrap dorpdown.js evenf if is called via js
  175. global.p5UI__MenuStore.forceUpdate()
  176. jQuery(btnNode).dropdown()
  177. }
  178. // btnNode._initialized = true // TODO: DBG TEST
  179. return true;
  180. }
  181. global.initP5MainMenuDropdown = initP5MainMenuDropdown