Bonjour à tous,
Je viens une fois de plus en quête d'informations concernant certains points de JSF et Richfaces. Je me trouve confronté à un problème que je résoudrais en une douzaine de secondes par du code javascript si je faisais du servlet ou du jsp, mais avec JSF... j'ai encore des blocages
Mon problème est relativement simple : mon menu est formé d'un rich:panelMenuGroup contenant plusieurs rich:panelMenuItem. Rien de bien sorcier jusqu'ici. Le moteur JSF s'arrange pour placer la classe rich-pmenu-selected-element sur la balise <tr> de l'élément de menu sur laquelle le clic est effectué. Tout marche très bien, le texte de mon menu est correctement mis en gras lorsque je clique dessus.
Mon problème vient quand je change de page par des liens qui ne sont pas dans le menu mais à l'intérieur de la page. Tant que je ne reclique pas sur un élément du menu, celui qui est sélectionné ne change pas.
Typiquement : je clique sur la page de recherche d'objet et une liste s'affiche. Je clique sur le lien "ajouter un élément" tout en bas de la liste. Je suis donc sur la page d'ajout / d'édition d'objet. L'élément de menu dont le texte est en gras est par contre toujours "Rechercher" et non "Ajouter un élément" vu que je n'ai pas cliqué dans le menu.
Dans un premier temps j'ai cherché à comparer lors du rendu du panelMenuItem la page sur laquelle je suis avec celle cible du lien, et de changer la classe en utilisant styleClass="rich-pmenu-item" (si la cible du lien n'est pas la page actuelle) et styleClass="rich-pmenu-selected-element" (si la cible du lien est la page actuelle.
Je tombe sur deux problèmes avec cette tentative :
1) styleClass pose la classe CSS sur la balise <table> de l'élément de menu, alors que JSF pose rich-pmenu-selected-element sur le <tr>, donc au niveau du dessous. Je n'arrive donc pas à accéder par ce biais à la bonne balise pour y changer la classe.
2) styleClass ajoute des classes CSS mais n'en enlève visiblement pas, je me retrouve donc souvent avec sur la balise <table> plusieurs fois la même classe.
Mon autre tentative a été dans la balise onClick de mon lien à l'intérieur de la page de déplacer la classe rich-pmenu-selected-element en la supprimant du <tr> qui était sélectionné et en la plaçant sur le <tr> qui devrait l'être après le changement de page (en javascript natif avec un getElementById('tr')...). Seulement... les identifiants que place JSF sur les éléments de menus sont un peu spéciaux et contiennent des préfixes et des suffixes numériques, par exemple tablehidetemplateForm:j_id18 si on est dans un formulaire nommé templateForm, ce qui est peu pratique.
Mes questions donc :
1) est-ce une bonne idée de mêler du javascript natif dans des onClick à toute la mécanique Ajax (dont on n'écrit pas une seule ligne) généré par richfaces ? J'ai l'impression que non, je trouve ça pas terrible mais il fallait bien tester quelque chose.
2) existe-t-il un moyen autre que styleClass dans le panelMenuItem pour changer les classes des éléments HTML générés par ce tag ? visiblement il y a <div><table><tbody><tr><td> généré pour chaque élément de type panelMenuItem, et les classes sont réparties sur ces éléments HTML.
3) la solution est-elle tout autre ? ou ai-je fait une grossière erreur de conception en ayant une navigation à l'intérieur de ma page et en voulant adapter le menu en fonction de la navigation interne ?
Je débute, je suis navré si l'explication de mon problème ci-dessus n'est pas super bien formulé et pas dans le langage habituel du monde JSF / richfaces.
Merci et bonne journée !
Partager