You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by "Dmitry Gusev (JIRA)" <ji...@apache.org> on 2013/12/09 16:15:07 UTC

[jira] [Updated] (TAP5-2256) Sorting is broken for Grid inline="true" in a loop

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

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

    Description: 
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}

  was:
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:title=GridZoneCorrectorMixin.java|borderStyle=solid}
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}


> 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
>            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)