tapestry-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Thiago H. de Paula Figueiredo (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (TAP5-1918) RenderInformals mixin doesn't always work as expected
Date Wed, 16 Mar 2016 20:30:33 GMT

    [ https://issues.apache.org/jira/browse/TAP5-1918?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15198093#comment-15198093
] 

Thiago H. de Paula Figueiredo commented on TAP5-1918:
-----------------------------------------------------

I believe that, if the target component implements {code}ClientElement{code}, we should take
advantage of knowing what the client id (HTML id) is and using it with {code}markupWriter.getDocument().getElementById(clientElement.getClientId()).
When it's not, then the only guaranteed way of implementing this I can think of is using a
MarkupWriterListener and apllying the mixin logic to the first element generated by the component
and throw an exception if none is generated.

> RenderInformals mixin doesn't always work as expected
> -----------------------------------------------------
>
>                 Key: TAP5-1918
>                 URL: https://issues.apache.org/jira/browse/TAP5-1918
>             Project: Tapestry 5
>          Issue Type: Bug
>          Components: tapestry-core
>    Affects Versions: 5.3.1, 5.3.2, 5.3.3, 5.4
>            Reporter: Lance
>            Priority: Minor
>
> The following code:
> {code}
> <div>
>   <t:beaneditform t:id="entity" ...  t:mixins="RenderInformals" data-foo="bar" />
> </div>
> {code}
> Results in the following HTML:
> {code}
> <div class="form-horizontal" data-foo="bar">
>    <form ...>
>    </form
> </div> 
> {code}
> As you can see, the informal parameter was added to the div instead of the form.
> The current implementation of RenderInformals assumes that a component has populated
the MarkupWriter with an element in beginRender() which is not always the case. I think it
should be changed to use an afterRender() method and add informals to the current element's
last child.
> eg:
> {code}
> @MixinAfter
> @SupportsInformalParameters
> public class RenderInformals
> {
>    @Inject
>    private ComponentResources resources;
>    
>    void afterRender(MarkupWriter writer)
>    {
>       List<Node> children = writer.getElement().getChildren();
>       if (!children.isEmpty()) {
>          Element lastChild = (Element) children.get(children.size() - 1);
>          for (String name : resources.getInformalParameterNames()) {
>             lastChild.attribute(name, resources.getInformalParameter(name, String.class));
>          }
>       }
>    }
> } 
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message