I'll test it this afternoon. For some reason svn.apache.org is unreachable for me this morning.

sean schofield (JIRA) wrote:

    [ 
http://issues.apache.org/jira/browse/MYFACES-243?page=comments#action_65928 ]
sean schofield commented on MYFACES-243:
----------------------------------------

Patch has been applied.  Grant, can you verify problem has been resolved and 
then close this issue?  I wasn't able to see how the original patch failed 
(only checked the simple examples though.)

ClientId not used, so JSCookMenu fires multiple actions in tables
-----------------------------------------------------------------

        Key: MYFACES-243
        URL: http://issues.apache.org/jira/browse/MYFACES-243
    Project: MyFaces
       Type: Bug
   Versions: 1.0.9 beta
   Reporter: Neal Haggard
   Assignee: sean schofield
    Fix For: Nightly Build
Attachments: patch.txt, patch2.txt

The fix to add the id to the action (so that the proper action can be fired on 
decode) works fine for multiple JSCookMenu components on the same page, however 
when a JSCookMenu is placed in something that uses the component as a template 
(such as within a HtmlDataTable's Column), the NamingContainer doesn't get 
invoked, so a click on an action triggers once for every row in the table.
The simple fix is to change the call to getId() to getClientId(context), however, that also 
requires a change to processDecodes, to change the .indexOf(":") to 
.lastIndexOf(":").
There are also some other underlying issues with the id in the rest of the 
component.  The Javascript that defines the menu uses a generic variable name 
of 'menuBar'.  If you have more than one JSCookMenu on the page with different 
CommandNavigationItems, you will only get the last one.
The solution to this is to supplement the JavaScript variable name with the 
clientId, much like the div later in encodeEnd.
I've tied all these changes together by creating a private method called 
getMenuId() which encapsulates the logic behind getting the clientId(context) 
and converting all the colons(:) to underscores(_).  Then in encodeChildren(), 
encodeEnd() and encodeNavigationMenuItems(), I use this method, so that the 
same id is used throughout.
Also included in my patch is a quick-fix to allow null labels to not print out 
the default value (1).
Hopefully this will be a useful addition to the MyFaces Community.


Reply via email to