[ 
https://issues.apache.org/jira/browse/TAP5-2256?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Dmitry Gusev updated TAP5-2256:
-------------------------------

    Affects Version/s: 5.4

> Sorting is broken for Grid inline="true" in a loop
> --------------------------------------------------
>
>                 Key: TAP5-2256
>                 URL: https://issues.apache.org/jira/browse/TAP5-2256
>             Project: Tapestry 5
>          Issue Type: Bug
>          Components: tapestry-core
>    Affects Versions: 5.3.7, 5.4
>            Reporter: Dmitry Gusev
>
> Placing Grid with inline="true" to a loop leads to only first grid will 
> generate zone div.
> All subsequent grids won't generate any new zone divs, instead the will 
> target first div. So, for example, if you click sort by column on the second 
> grid  result will appear in the first one.
> Looking at the code this the cause is that Grid instance caches value of zone 
> property here:
> https://github.com/apache/tapestry-5/blob/5.3.7/tapestry-core/src/main/java/org/apache/tapestry5/corelib/components/Grid.java#L494
> This isn't applied to 5.4, because this part was rewritten there.
> Assuming that no new 5.3.x releases will appear here is a "hacky" workaround 
> in the form of mixin that may be applied to a grid to fix this:
> {code}
> import java.lang.reflect.Field;
> import org.apache.tapestry5.MarkupWriter;
> import org.apache.tapestry5.annotations.InjectContainer;
> import org.apache.tapestry5.annotations.MixinAfter;
> import org.apache.tapestry5.corelib.components.Grid;
> import org.apache.tapestry5.plastic.FieldConduit;
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
> @MixinAfter
> public class GridZoneCorrectorMixin
> {
>     private static final Logger logger = 
> LoggerFactory.getLogger(GridZoneCorrectorMixin.class);
>     
>     @InjectContainer
>     private Grid container;
>     
>     void afterRender(MarkupWriter writer)
>     {
>         try
>         {
>             Field zoneConduitField = 
> container.getClass().getDeclaredField("zone_FieldConduit");
>             zoneConduitField.setAccessible(true);
>             FieldConduit<?> conduit = (FieldConduit<?>) 
> zoneConduitField.get(container);
>             conduit.set(container, null, null);
>         }
>         catch (Exception e)
>         {
>             logger.error("Error correcting grid zone", e);
>         }
>     }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.1.4#6159)

Reply via email to