tree.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. const CLASSNAME_EXPANDED = "bi bi-chevron-down";
  2. const CLASSNAME_COLLAPSED = "bi bi-chevron-up";
  3. window["makeTree"] = function (ulRoot) {
  4. let makeTree = (li) => {
  5. let button = li.children[0];
  6. let list = li.children[1];
  7. if (button && list && button.nodeName == 'SPAN' && list.nodeName == 'UL') {
  8. button.className = CLASSNAME_COLLAPSED;
  9. list.style.display = 'block';
  10. button.addEventListener("click", (e) => {
  11. let visible = list.style.display === 'block';
  12. if (visible) {
  13. button.className = CLASSNAME_EXPANDED;
  14. list.style.display = "none";
  15. } else {
  16. button.className = CLASSNAME_COLLAPSED;
  17. list.style.display = "block";
  18. }
  19. });
  20. for (var i = 0; i < list.children.length; ++i)
  21. makeTree(list.children[i]);
  22. }
  23. };
  24. for (var i = 0; i < ulRoot.children.length; ++i)
  25. makeTree(ulRoot.children[i]);
  26. }
  27. $(() => {
  28. var FILTER = "";
  29. function treeChildren(root) {
  30. let result = [];
  31. if (root.classList.contains("treeroot"))
  32. return root.children;
  33. for (var i of root.children)
  34. if (i.classList.contains("treebranch"))
  35. for (var j of i.children)
  36. if (j.classList.contains("treeitem"))
  37. result.push(j);
  38. return result;
  39. }
  40. function updateUiFilter(filterText, treeNode) {
  41. if (isFiltered(filterText, treeNode)) {
  42. treeNode.classList.add("hidden");
  43. } else {
  44. setChildVisibility(treeNode);
  45. if ((treeNode.dataset?.fullname?.toLowerCase() || "").indexOf(filterText) >= 0)
  46. return;
  47. for (var treeBranch of treeChildren(treeNode))
  48. updateUiFilter(filterText, treeBranch);
  49. }
  50. }
  51. function setChildVisibility(treeNode) {
  52. treeNode.classList.remove("hidden");
  53. for (var i of treeNode.querySelectorAll(".treeitem.hidden"))
  54. i.classList.remove("hidden");
  55. }
  56. function isFiltered(filterText, node) {
  57. return node.textContent.toLowerCase().indexOf(filterText) < 0;
  58. }
  59. function filterUpdated() {
  60. updateUiFilter(FILTER.toLowerCase(), document.querySelector(".treeroot"));
  61. }
  62. const searchInput = document.getElementById("searchinput");
  63. function onSearchInputChanged() {
  64. if (FILTER === searchInput.value)
  65. return;
  66. FILTER = searchInput.value;
  67. filterUpdated();
  68. }
  69. searchInput.addEventListener('input', onSearchInputChanged);
  70. onSearchInputChanged();
  71. });