initP5MainMenuDropdown.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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. DBG && console.log('DBG:renderP5MainMenuDropdown labels', labels)
  81. labels.sort(function (item1, item2) {
  82. var l1 = item1.label.toLowerCase()
  83. var l2 = item2.label.toLowerCase()
  84. if (l1 < l2) { return -1; }
  85. if (l1 > l2) { return 1; }
  86. return 0
  87. })
  88. var groupeByLabel = labels.reduce(function (ret, item) {
  89. if (!ret.length) return [ { prefix: item.label, labels: [ item ] } ];
  90. var last = ret.pop()
  91. var labelLast = last.prefix.replace('_', ' ').split(" ")
  92. var labelItem = item.label.replace('_', ' ').split(" ")
  93. DBG && console.log('DBG:renderP5MainMenuDropdown TODO: group?', { last, item, labelLast, labelItem })
  94. if (labelLast[0] === labelItem[0]) {
  95. last.labels.push(item)
  96. last.prefix = labelLast[0] + " <em>(" + last.labels.length + ")</em>"
  97. ret.push(last)
  98. } else {
  99. ret.push(last)
  100. ret.push({ prefix: item.label, labels: [item] })
  101. return ret;
  102. }
  103. return ret;
  104. }, [])
  105. var nodesGroupedByLabel = groupeByLabel.map(function (item) {
  106. // var baseNs =
  107. if (item.labels.length === 1) {
  108. return renderDropdownListItem(item.labels[0].ns)
  109. } else {
  110. // return '<details><summary>' + item.prefix + '</summary><div>' +
  111. // '' + item.labels.map(function (label) {
  112. // return renderDropdownListItem(label.ns)
  113. // }).join("\n") +
  114. // '</div></details>';
  115. return '<li class="dropdown-submenu">' +
  116. '<a href=\"#\" onClick="return false">' +
  117. // '<b style="padding-left:18px">' + item.prefix + '</b>' +
  118. '<i class="glyphicon glyphicon-folder-open" style="opacity:0.5; font-size:90%; padding-right:3px"></i>' + " " +
  119. '<b>' + item.prefix + '</b>' +
  120. '</a>' + "\n" +
  121. '<ul class="dropdown-menu">' +
  122. item.labels.map(function (label) {
  123. return renderDropdownListItem(label.ns);
  124. }).join("\n") +
  125. '</ul>' +
  126. '</li>' + "\n"
  127. ;
  128. }
  129. })
  130. DBG && console.log('DBG:renderP5MainMenuDropdown grouped', { grouped, labels, groupeByLabel })
  131. var jqDropdownMenu = jQuery('#' + idSubMenu)
  132. jqDropdownMenu.empty()
  133. jqDropdownMenu.append(nodesGroupedByLabel);
  134. // var liNodes = Object.keys(grouped.menuTreeNs).map(function (baseNs) {
  135. // var item = (baseNs in grouped.mapNsToIdx)
  136. // ? data.objects[ grouped.mapNsToIdx[baseNs] ]
  137. // : data.objects[ grouped.mapNsToIdx[ grouped.menuTreeNs[baseNs][0] ] ]
  138. // ;
  139. // DBG && console.log('DBG:renderP5MainMenuDropdown >> render loop', { baseNs, isInMap: (baseNs in grouped.mapNsToIdx), item, idx: [ grouped.mapNsToIdx[baseNs], grouped.menuTreeNs[baseNs][0] ] });
  140. // return (grouped.menuTreeNs[baseNs].length > 1)
  141. // ? '<li class="dropdown-submenu">' +
  142. // '<a href=\"index.php?_route=ViewTableAjax&namespace=' + item.namespace + '\" title="' + renderTitle(item) + '">' +
  143. // renderStar(item.id, data.idsBookmarks) +
  144. // ' ' + renderLabel(item) +
  145. // '</a>' + "\n" +
  146. // '<ul class="dropdown-menu">' +
  147. // grouped.menuTreeNs[baseNs].map(function (subItemNs) {
  148. // var subItem = data.objects[ grouped.mapNsToIdx[subItemNs] ]
  149. // return '<li>' +
  150. // '<a href=\"index.php?_route=ViewTableAjax&namespace=' + subItem.namespace + '\" title="' + renderTitle(subItem) + '">' +
  151. // renderStar(subItem.id, data.idsBookmarks) +
  152. // ' ' + renderLabel(subItem) +
  153. // '</a>' +
  154. // '</li>'
  155. // ;
  156. // }).join("\n") +
  157. // '</ul>' +
  158. // '</li>' + "\n"
  159. // : '<li>' +
  160. // '<a href=\"index.php?_route=ViewTableAjax&namespace=' + item.namespace + '\" title="' + renderTitle(item) + '">' +
  161. // renderStar(item.id, data.idsBookmarks) +
  162. // ' ' + renderLabel(item) +
  163. // '</a>' +
  164. // '</li>' + "\n"
  165. // ;
  166. // })
  167. // jqDropdownMenu.append(liNodes);
  168. }
  169. function initP5MainMenuDropdown( btnNode, idSubMenu ) {
  170. DBG && console.log('DBG:initP5MainMenuDropdown({idSubMenu: '+idSubMenu+'})');
  171. if (!btnNode._initialized) {
  172. var jqDropdownTrigger = jQuery(btnNode)
  173. var jqDropdownMenu = jQuery('#' + idSubMenu)
  174. var jqDropdownParent = jqDropdownMenu.parent()
  175. var rerenderDropdown = (function (global, idSubMenu) {
  176. return function (data) {
  177. DBG && console.log('DBG renderP5MainMenuDropdown', {data, idSubMenu});
  178. renderP5MainMenuDropdown(data, idSubMenu);
  179. }
  180. })(global, idSubMenu);
  181. global.p5UI__MenuStore.subscribe(rerenderDropdown)
  182. jqDropdownTrigger.attr('data-toggle', 'dropdown') // is required by bootstrap dorpdown.js evenf if is called via js
  183. global.p5UI__MenuStore.forceUpdate()
  184. jQuery(btnNode).dropdown()
  185. }
  186. // btnNode._initialized = true // TODO: DBG TEST
  187. return true;
  188. }
  189. global.initP5MainMenuDropdown = initP5MainMenuDropdown