소스 검색

group Narzędzia menu

Piotr Labudda 6 년 전
부모
커밋
ade2997958
2개의 변경된 파일103개의 추가작업 그리고 44개의 파일을 삭제
  1. 1 44
      SE/se-lib/tmpl/menuMain.php
  2. 102 0
      SE/static/p5UI/initP5UrlsMenuDropdown.js

+ 1 - 44
SE/se-lib/tmpl/menuMain.php

@@ -556,50 +556,7 @@ echo UI::h('script', [], "
 
 UI::inlineCSS(APP_PATH_WWW . '/static/p5UI/initP5MainMenuDropdown.css');
 UI::inlineJS(APP_PATH_WWW . '/static/p5UI/initP5MainMenuDropdown.js', [ 'DBG' => 0 ]);
-
-echo UI::h('script', [], "
-    (function (global) {
-        if (!global.p5UI__MenuStore) throw 'Missing global.p5UI__MenuStore'
-
-        function initP5UrlsMenuDropdown( btnNode, idSubMenu ) {
-            if (!btnNode._initialized) {
-                var jqDropdownTrigger = jQuery(btnNode)
-                var jqDropdownMenu = jQuery('#' + idSubMenu)
-                var jqDropdownParent = jqDropdownMenu.parent()
-                global.p5UI__MenuStore.subscribe(
-                    (function (global, idSubMenu) {
-                        return function renderP5MainMenuDropdown(data) {
-                            var jqDropdownMenu = jQuery('#' + idSubMenu)
-                            jqDropdownMenu.empty()
-                            jqDropdownMenu.append(data.urls.map(function (item) {
-                                var star = (-1 !== data.idsBookmarks.indexOf(item.id))
-                                    ? '<i class=\"bookmark-item-rem glyphicon glyphicon-star\" title=\"Usuń z ulubionych\" onClick=\"return p5BookmarksRemove(event, ' + item.id + ')\"></i>'
-                                    : '<i class=\"bookmark-item-add glyphicon glyphicon-star-empty\" title=\"Dodaj do ulubionych\" onClick=\"return p5BookmarksAdd(event, ' + item.id + ')\"></i>'
-                                return jQuery('<li>' +
-                                    '<a href=\"index.php?FUNCTION_INIT=URL_INIT&ZASOB_ID=' + item.id + '\" target=\"_blank\" title=\"' + item.raw_label + '\">' +
-                                        star +
-                                        ' ' + '<code>' + item.id + '</code>' +
-                                        ' ' + item.label +
-                                    '</a>' +
-                                '</li>');
-                            }))
-                        }
-                    })(global, idSubMenu)
-                )
-
-                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
-            return true;
-        }
-
-        global.initP5UrlsMenuDropdown = initP5UrlsMenuDropdown
-    })(window)
-");
+UI::inlineJS(APP_PATH_WWW . '/static/p5UI/initP5UrlsMenuDropdown.js', [ 'DBG' => 0 ]);
 
 echo UI::h('script', [], "
     (function (global) {

+ 102 - 0
SE/static/p5UI/initP5UrlsMenuDropdown.js

@@ -0,0 +1,102 @@
+if (!global.p5UI__MenuStore) throw 'Missing global.p5UI__MenuStore'
+var DBG = DBG || 0
+var DBG1 = 1
+
+if (!global.p5UI__MenuStore) throw 'Missing global.p5UI__MenuStore'
+
+function makeRenderDropdownListItem(data) {
+	return function renderDropdownListItem(idx) {
+		var item = data.urls[idx]
+		if (!item) return '';
+		var star = (-1 !== data.idsBookmarks.indexOf(item.id))
+			? '<i class=\"bookmark-item-rem glyphicon glyphicon-star\" title=\"Usuń z ulubionych\" onClick=\"return p5BookmarksRemove(event, ' + item.id + ')\"></i>'
+			: '<i class=\"bookmark-item-add glyphicon glyphicon-star-empty\" title=\"Dodaj do ulubionych\" onClick=\"return p5BookmarksAdd(event, ' + item.id + ')\"></i>'
+		;
+
+		return '<li>' +
+				'<a href=\"index.php?FUNCTION_INIT=URL_INIT&ZASOB_ID=' + item.id + '\" target=\"_blank\" title=\"' + item.raw_label + '\">' +
+					star +
+					' ' + '<code>' + item.id + '</code>' +
+					' ' + item.label +
+				'</a>' +
+			'</li>'
+		;
+	}
+}
+
+function renderP5UrlsMenuDropdown(data, idSubMenu) {
+	var renderDropdownListItem = makeRenderDropdownListItem(data)
+
+	var labels = data.urls.map(function (item, idx) {
+		return {
+			idx: idx,
+			label: item.label,
+		}
+	});
+	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(" ")
+		if (labelLast[0] === labelItem[0]) {
+			last.labels.push(item)
+			last.prefix = labelLast[0] + " <em>(" + last.labels.length + ")</em>"
+			ret.push(last)
+		} else {
+			ret.push(last)
+			ret.push({ prefix: item.label, labels: [item] })
+			return ret;
+		}
+		return ret;
+	}, [])
+	DBG && console.log('DBG:renderP5UrlsMenuDropdown groupeByLabel ', { groupeByLabel })
+
+	var nodesGroupedByLabel = groupeByLabel.map(function (item) {
+		if (item.labels.length === 1) {
+			return renderDropdownListItem(item.labels[0].idx)
+		} else {
+			return '<li class="dropdown-submenu">' +
+					'<a href=\"#\" onClick="return false">' +
+						// '<b style="padding-left:18px">' + item.prefix + '</b>' +
+						'<i class="glyphicon glyphicon-folder-open" style="opacity:0.5; font-size:90%; padding-right:3px"></i>' + " " +
+						'<b>' + item.prefix + '</b>' +
+					'</a>' + "\n" +
+					'<ul class="dropdown-menu">' +
+						item.labels.map(function (label) {
+							return renderDropdownListItem(label.idx);
+						}).join("\n") +
+					'</ul>' +
+				'</li>' + "\n"
+			;
+		}
+	})
+
+	var jqDropdownMenu = jQuery('#' + idSubMenu)
+	jqDropdownMenu.empty()
+	jqDropdownMenu.append(nodesGroupedByLabel)
+}
+
+function initP5UrlsMenuDropdown(btnNode, idSubMenu) {
+	if (!btnNode._initialized) {
+		var jqDropdownTrigger = jQuery(btnNode)
+		var rerenderDropdown = (function (global, idSubMenu) {
+			return function (data) {
+				DBG && console.log('DBG renderP5MainMenuDropdown', { data, idSubMenu });
+				renderP5UrlsMenuDropdown(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
+	return true;
+}
+
+global.initP5UrlsMenuDropdown = initP5UrlsMenuDropdown