You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

137 lines
3.7KB

  1. var treeInit = function(root, searchbox)
  2. {
  3. $(root).addClass("tree");
  4. // Attribut value de chaque li contient l'ensemble du texte de ses descendants (chemin d'accès aux résultats de recherche facile)
  5. $(root).find('li').
  6. map(function()
  7. {
  8. $(this).
  9. attr("value",
  10. $(this).
  11. text().
  12. replace(/^ *\n/mg, "").
  13. replace(/ +/g, " ").
  14. replace(/( \d)*/g, "").
  15. replace(/ O /g, " ").
  16. toLowerCase())
  17. });
  18. // Tous les ul sauf le premier son cachés, et leurs parents li prennent l'attribut closed
  19. $(root).
  20. find('li').
  21. children('ul').hide().
  22. parent().addClass("closed");
  23. // Évènements
  24. // Cliquer pour ouvrir/fermer un noeud
  25. $(root).find('li').click(toggleNode);
  26. // Chercher dans l'arbre en tapant dans le champ de recherche
  27. $(searchbox).keyup($(root), searchTree);
  28. // Recherche par niveau de cma au clic sur un niveau de cma
  29. $(root).find('li > span').click($(searchbox), searchCMA);
  30. }
  31. var toggleNode = function(event)
  32. {
  33. var target = $(event.target);
  34. if (target.hasClass("closed"))
  35. {
  36. // Deplier explicitement fait toujours tout afficher
  37. target.
  38. children('ul').slideDown().
  39. find('li').slideDown();
  40. // Et switch l'attribut du li
  41. target.
  42. removeClass("closed").
  43. addClass("open");
  44. }
  45. else if (target.hasClass("open"))
  46. {
  47. // Replier explicitement ne fait que cacher l'ul
  48. target.
  49. children('ul').slideUp();
  50. // Et switch l'attribut du li
  51. target.
  52. removeClass("open").
  53. addClass("closed");
  54. }
  55. event.stopPropagation();
  56. }
  57. var searchTree = function(event)
  58. {
  59. var tree = event.data;
  60. var val = $(event.target).val().toLowerCase();
  61. // à chaque actualisation de la recherche ferme tout et rétablit l'attribut closed
  62. $(tree).find('li').
  63. children('ul').hide().
  64. parent().addClass("closed").
  65. removeClass("open");
  66. // si le champ n'est pas assez rempli on remontre bien tous les noeuds
  67. if (val.length < 1)
  68. {
  69. $(tree).find('li').show();
  70. return;
  71. }
  72. var result = $(tree).find('li[value *= "'+ val +'"]');
  73. // on cache tous les noeuds puis on montre et déplie les résultats
  74. $(tree).find('li').hide();
  75. result.show().
  76. children('ul').show();
  77. // si tous les sous-noeuds sont montrés par la recherche, on met le statut du parent à open
  78. result.children('ul').each(function()
  79. {
  80. if ($(this).children('li[style *= "none"]').length == 0)
  81. {
  82. $(this).parent().addClass("open").removeClass("closed");
  83. }
  84. });
  85. }
  86. var searchCMA = function(event)
  87. {
  88. var searchbox = event.data;
  89. var this_ = $(event.target).parent();
  90. var cma = this_.add(this_.find('li > span:contains("' + $(this).text() + '")').parent());
  91. // cacher tous les sous-noeuds
  92. this_.find('li').hide();
  93. // capture de résultats de la recherche sous le noeud pour continuer à les afficher
  94. if (typeof $(searchbox).val() != 'undefined')
  95. {
  96. var result = this_.find('li[value *= "'+ $(searchbox).val().toLowerCase() +'"]');
  97. result.show().
  98. children('ul').show();
  99. }
  100. // this_ est-il une feuille ?
  101. var leaf = !(this_.hasClass("closed") || this_.hasClass("open"))
  102. this_.show().
  103. addClass("closed").
  104. removeClass("open").
  105. children('ul').show();
  106. if (leaf)
  107. this_.removeClass("closed");
  108. cma.show().
  109. children('ul').show();
  110. cma.children('ul').each(function()
  111. {
  112. if ($(this).children('li[style *= "none"]').length == 0)
  113. {
  114. $(this).parent().addClass("open").removeClass("closed");
  115. }
  116. });
  117. }