Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    ListGrid Grouping With Header Summary - Max depth?

    I have a ListGrid that's set up with multiple groupings. Each grouping has header summaries (sum function) on a few columns. It seems as if once I get to 4 levels deep, the summary function stops and the header is rendered without the summary values.

    I assume it's the depth because when changing the group order, it's always the last one that does not have the header summary.

    I also tried adding a 5th depth level and the last two levels did not have header summaries.

    Is this a limitation of the ListGrid or have I set things up wrong?

    #2
    Not an intentional limitation.. are you able to make this happen in a sample?

    Comment


      #3
      Here's an almost standalone example.

      Code:
      import com.google.gwt.i18n.client.NumberFormat;
      import com.google.gwt.i18n.shared.DateTimeFormat;
      import com.smartgwt.client.data.DataSource;
      import com.smartgwt.client.data.DataSourceField;
      import com.smartgwt.client.data.Record;
      import com.smartgwt.client.types.DateDisplayFormat;
      import com.smartgwt.client.types.FieldType;
      import com.smartgwt.client.types.GroupStartOpen;
      import com.smartgwt.client.types.ListGridFieldType;
      import com.smartgwt.client.types.SummaryFunctionType;
      import com.smartgwt.client.widgets.Canvas;
      import com.smartgwt.client.widgets.grid.CellFormatter;
      import com.smartgwt.client.widgets.grid.GroupNode;
      import com.smartgwt.client.widgets.grid.GroupTitleRenderer;
      import com.smartgwt.client.widgets.grid.GroupValueFunction;
      import com.smartgwt.client.widgets.grid.ListGrid;
      import com.smartgwt.client.widgets.grid.ListGridField;
      import com.smartgwt.client.widgets.grid.ListGridRecord;
      import com.smartgwt.client.widgets.layout.HLayout;
      import com.smartgwt.client.widgets.layout.LayoutSpacer;
      import com.smartgwt.client.widgets.layout.VLayout;
      
      import java.util.ArrayList;
      import java.util.Date;
      import java.util.HashMap;
      
      
      public class panels_GroupingTest {
      	private Canvas d_mainCanvas;
      
      
      
      
      
      
      	private static final String tst_KP = "KP";
      	private static final String tst_KS = "KS";
      	private static final String tst_KT = "KT";
      	private static final String tst_KHT = "KHT";
      	private static final String tst_KRT = "KRT";
      	private static final String tst_KM = "KM";
      	private static final String tst_KMW = "KMW";
      	private static final String tst_KBD = "KBD";
      	private static final String tst_KSD = "KSD";
      	private static final String tst_KAD = "KAD";
      	private static final String tst_KDA = "KDa";
      	private static final String tst_KPLN = "KPLN";
      	private static final String tst_KMV = "KMV";
      	private static final String tst_KPL = "KPL";
      
      
      
      	public panels_GroupingTest() {
      
      		ListGrid testTable = new ListGrid(setUpTestDS());
      		ArrayList<ListGridField> testFields = setUpTestFields();
      		testTable.setFields(testFields.toArray(new ListGridField[testFields.size()]));
      		Record[] testData = manufactureTestData();
      		testTable.setData(testData);
      		testTable.getDataSource().setTestData(testData);
      
      		VLayout layout = new VLayout();
      
      		layout.setWidth100();
      
      		LayoutSpacer lp = new LayoutSpacer();
      		lp.setWidth100();
      
      		{
      			configureTable(testTable);
      			testTable.setGroupByField(
      					tst_KP,
      					tst_KT,
      					tst_KM,
      					tst_KRT
      
      			);
      
      			testTable.setGroupStartOpen(
      					GroupStartOpen.FIRST
      			);
      
      		}
      
      		{
      			layout.addMember(testTable);
      
      
      			HLayout hlayout = new HLayout();
      			hlayout.setWidth100();
      
      
      			layout.addMember(hlayout);
      		}
      
      		d_mainCanvas = new Canvas();
      
      		d_mainCanvas.addChild(layout);
      
      
      	}
      
      	private void configureTable(ListGrid table) {
      		table.setShowFilterEditor(true);
      		table.setFilterOnKeypress(false);
      		table.setFilterLocalData(true);
      		table.setAutoFetchData(false);
      		table.setWidth100();
      		table.setHeight(800);
      
      		table.setShowGroupSummary(true);
      		table.setShowGridSummary(true);
      //			table.setGroupStartOpen(GroupStartOpen.ALL);
      		table.setShowGroupSummaryInHeader(true);
      	}
      
      
      	private ArrayList<ListGridField> setUpTestFields() {
      		ArrayList<ListGridField> fields = new ArrayList<ListGridField>();
      		ListGridField field;
      
      		final NumberFormat floatNoDecFormat = NumberFormat.getFormat("#,###");
      		final CellFormatter cf_floatNoDec = new CellFormatter() {
      			public String format(Object value, ListGridRecord listGridRecord, int i, int i1) {
      				if (value != null && value instanceof Number) {
      					return floatNoDecFormat.format((Number) value);
      				} else {
      					return null;
      				}
      			}
      		};
      
      		final NumberFormat floatOneDecFormat = NumberFormat.getFormat("#,###.0");
      		final CellFormatter cf_floatOneDec = new CellFormatter() {
      			public String format(Object value, ListGridRecord listGridRecord, int i, int i1) {
      				if (value != null && value instanceof Number) {
      					return floatOneDecFormat.format((Number) value);
      				} else {
      					return null;
      				}
      			}
      		};
      
      
      		field = new ListGridField(tst_KP);
      		field.setType(ListGridFieldType.TEXT);
      		field.setWidth(150);
      		fields.add(field);
      
      		field = new ListGridField(tst_KS);
      		field.setType(ListGridFieldType.TEXT);
      		field.setWidth(150);
      		fields.add(field);
      
      		field = new ListGridField(tst_KT);
      		field.setType(ListGridFieldType.TEXT);
      		field.setWidth(150);
      		fields.add(field);
      
      
      		field = new ListGridField(tst_KHT);
      		field.setType(ListGridFieldType.TEXT);
      		field.setWidth(150);
      		fields.add(field);
      
      
      		field = new ListGridField(tst_KRT);
      		field.setType(ListGridFieldType.TEXT);
      		field.setWidth(150);
      		fields.add(field);
      
      
      		field = new ListGridField(tst_KM);
      		field.setType(ListGridFieldType.DATE);
      		field.setWidth(150);
      		field.setShowGroupSummary(true);
      		field.setShowGridSummary(true);
      		fields.add(field);
      		{
      			final DateTimeFormat dtf2 = DateTimeFormat.getFormat("MMMM yyyy");
      			final CellFormatter cf = new CellFormatter() {
      				public String format(Object value, ListGridRecord listGridRecord, int i, int i1) {
      					if (value != null && value instanceof Date) {
      						return dtf2.format((Date) value);
      					} else {
      						return null;
      					}
      				}
      			};
      
      			field.setCellFormatter(cf);
      
      			field.setGroupTitleRenderer(new GroupTitleRenderer() {
      				public String getGroupTitle(Object o, GroupNode groupNode, ListGridField listGridField, String s, ListGrid listGrid) {
      					String huh = "??";
      					if (o instanceof Date) {
      						return dtf2.format((Date) o);
      
      					} else if (o instanceof Long) {
      						Date d = new Date((Long) o);
      						return dtf2.format(d);
      					} else if (o instanceof Number) {
      						return dtf2.format(new Date(((Number) o).longValue()));
      
      
      					} else if (groupNode != null) {
      						Record[] r = groupNode.getGroupMembers();
      						if (r != null && r.length > 0) {
      							Date mo = r[0].getAttributeAsDate(tst_KM);
      							if (mo != null) {
      								return dtf2.format( mo);
      
      							}
      						}
      
      					} else {
      						return huh;
      					}
      					return huh;
      				}
      			});
      
      			field.setGroupValueFunction(new GroupValueFunction() {
      				public Object getGroupValue(Object o, ListGridRecord listGridRecord, ListGridField listGridField, String s, ListGrid listGrid) {
      					if (o instanceof Date) {
      						return ((Date) o).getTime();
      					} else {
      						return "Huh?";
      					}
      				}
      			});
      
      
      		}
      
      
      		{
      			field.setSortByDisplayField(false);
      			field.setSortByMappedValue(true);
      		}
      
      		field = new ListGridField(tst_KMW);
      		field.setType(ListGridFieldType.FLOAT);
      		field.setWidth(100);
      		field.setDecimalPrecision(1);
      		field.setCellFormatter(cf_floatOneDec);
      		fields.add(field);
      
      
      		field = new ListGridField(tst_KBD);
      		field.setType(ListGridFieldType.FLOAT);
      		field.setWidth(100);
      		field.setDecimalPrecision(2);
      		fields.add(field);
      		field.setCellFormatter(cf_floatNoDec);
      		field.setShowGridSummary(true);
      		field.setShowGroupSummary(true);
      		field.setSummaryFunction(SummaryFunctionType.SUM);
      
      
      		field = new ListGridField(tst_KSD);
      		field.setType(ListGridFieldType.FLOAT);
      		field.setWidth(100);
      		field.setDecimalPrecision(2);
      		fields.add(field);
      		field.setCellFormatter(cf_floatNoDec);
      		field.setShowGridSummary(true);
      		field.setShowGroupSummary(true);
      		field.setSummaryFunction(SummaryFunctionType.SUM);
      
      		field = new ListGridField(tst_KAD);
      		field.setType(ListGridFieldType.FLOAT);
      		field.setWidth(100);
      		field.setDecimalPrecision(2);
      		fields.add(field);
      		field.setCellFormatter(cf_floatNoDec);
      		field.setShowGridSummary(true);
      		field.setShowGroupSummary(true);
      		field.setSummaryFunction(SummaryFunctionType.SUM);
      
      		field = new ListGridField(tst_KDA);
      		field.setType(ListGridFieldType.FLOAT);
      		field.setWidth(100);
      		field.setDecimalPrecision(2);
      		fields.add(field);
      		field.setCellFormatter(cf_floatNoDec);
      		field.setShowGridSummary(true);
      		field.setShowGroupSummary(true);
      		field.setSummaryFunction(SummaryFunctionType.SUM);
      
      
      		field = new ListGridField(tst_KMV);
      		field.setType(ListGridFieldType.FLOAT);
      		field.setWidth(100);
      		field.setDecimalPrecision(2);
      		fields.add(field);
      		field.setCellFormatter(cf_floatNoDec);
      		field.setShowGridSummary(true);
      		field.setShowGroupSummary(true);
      		field.setSummaryFunction(SummaryFunctionType.SUM);
      
      
      		field = new ListGridField(tst_KPLN);
      		field.setType(ListGridFieldType.FLOAT);
      		field.setWidth(100);
      		field.setDecimalPrecision(2);
      		fields.add(field);
      		field.setCellFormatter(cf_floatNoDec);
      		field.setShowGridSummary(true);
      		field.setShowGroupSummary(true);
      		field.setSummaryFunction(SummaryFunctionType.SUM);
      
      		field = new ListGridField(tst_KPL);
      		field.setType(ListGridFieldType.FLOAT);
      		field.setWidth(100);
      		field.setDecimalPrecision(2);
      		fields.add(field);
      		field.setCellFormatter(cf_floatNoDec);
      		field.setShowGridSummary(true);
      		field.setShowGroupSummary(true);
      		field.setSummaryFunction(SummaryFunctionType.SUM);
      		return fields;
      	}
      
      
      
      
      	private static Record[] manufactureTestData() {
      		String[] kp = {"AAA"};
      		String[] ks = {"S1", "S2", "S3"};
      		String[] kt = {"TA", "TB"};
      		String[] kht = {"HTA", "HTB"};
      		String[] krt = {"RTA", "RTB"};
      
      		long now = System.currentTimeMillis();
      		long approxmillisPerMonth = 1000L * 60 * 60 * 24 * 30;
      		Date[] days = new Date[12];
      		for (int idx = 0; idx < 12; idx++) {
      			days[idx] = new Date(now - approxmillisPerMonth * idx);
      		}
      
      		ArrayList<HashMap<String, Object>> ret = new ArrayList<HashMap<String, Object>>(32767);
      		for (String p : kp) {
      			for (Date d : days) {
      				for (String s : ks) {
      					for (String t : kt) {
      						for (String ht : kht) {
      							for (String rt : krt) {
      
      								HashMap<String, Object> row = new HashMap<String, Object>();
      								row.put(tst_KP, p);
      								row.put(tst_KM, d);
      								row.put(tst_KS, s);
      								row.put(tst_KT, t);
      								row.put(tst_KHT, ht);
      								row.put(tst_KRT, rt);
      
      								row.put(tst_KMW, Math.random());
      								row.put(tst_KAD, Math.random());
      								row.put(tst_KBD, Math.random());
      								row.put(tst_KSD, Math.random());
      								row.put(tst_KPLN, Math.random());
      								row.put(tst_KPL, Math.random());
      
      								ret.add(row);
      							}
      						}
      					}
      				}
      			}
      		}
      
      		Record[] retR = new Record[ret.size()];
      		for (int i = 0; i < retR.length; i++) {
      			Record r = new Record(ret.get(i));
      			retR[i] = r;
      		}
      		return retR;
      	}
      
      	private DataSource setUpTestDS() {
      		DataSource ds2 = new DataSource();
      		ds2.setClientOnly(true);
      		ds2.setAutoCacheAllData(true);
      
      
      		DataSourceField dsfKP = new DataSourceField(tst_KP, FieldType.TEXT);
      		dsfKP.setCanFilter(true);
      		dsfKP.setCanView(true);
      
      
      		DataSourceField dfsKS = new DataSourceField(tst_KS, FieldType.TEXT);
      		dfsKS.setCanFilter(true);
      		dfsKS.setCanView(true);
      
      		DataSourceField dsfKT = new DataSourceField(tst_KT, FieldType.TEXT);
      		dsfKT.setCanFilter(true);
      		dsfKT.setCanView(true);
      
      
      		DataSourceField dsfKHT = new DataSourceField(tst_KHT, FieldType.TEXT);
      		dsfKHT.setCanFilter(true);
      		dsfKHT.setCanView(true);
      
      		DataSourceField dsfKRT = new DataSourceField(tst_KRT, FieldType.TEXT);
      		dsfKRT.setCanFilter(true);
      		dsfKRT.setCanView(true);
      
      
      		DataSourceField dsfKM = new DataSourceField(tst_KM, FieldType.DATE);
      		dsfKM.setCanFilter(true);
      		dsfKM.setCanView(true);
      		dsfKM.setDateFormatter(DateDisplayFormat.TOUSSHORTDATE);
      
      
      		DataSourceField dsfKMW = new DataSourceField(tst_KMW, FieldType.FLOAT);
      		dsfKMW.setCanFilter(true);
      		dsfKMW.setCanView(true);
      
      		DataSourceField dsfKBD = new DataSourceField(tst_KBD, FieldType.FLOAT);
      		dsfKBD.setCanFilter(true);
      		dsfKBD.setCanView(true);
      
      		DataSourceField dsfKSD = new DataSourceField(tst_KSD, FieldType.FLOAT);
      		dsfKSD.setCanFilter(true);
      		dsfKSD.setCanView(true);
      
      		DataSourceField dsfKAD = new DataSourceField(tst_KAD, FieldType.FLOAT);
      		dsfKAD.setCanFilter(true);
      		dsfKAD.setCanView(true);
      
      		DataSourceField dsfKDA = new DataSourceField(tst_KDA, FieldType.FLOAT);
      		dsfKDA.setCanFilter(true);
      		dsfKDA.setCanView(true);
      
      		DataSourceField dsfKPLM = new DataSourceField(tst_KPLN, FieldType.FLOAT);
      		dsfKPLM.setCanFilter(true);
      		dsfKPLM.setCanView(true);
      
      		DataSourceField dsfKPL = new DataSourceField(tst_KPL, FieldType.FLOAT);
      		dsfKPL.setCanFilter(true);
      		dsfKPL.setCanView(true);
      
      		ds2.setFields(dsfKP, dsfKT, dsfKHT, dfsKS, dsfKRT, dsfKMW, dsfKBD, dsfKSD, dsfKAD, dsfKDA, dsfKPLM, dsfKPL);
      
      		return ds2;
      	}
      
      
      	public Canvas getMainCanvas() {
      		return d_mainCanvas;
      	}

      Comment


        #4
        We've made a change to address this in the 3.1p branch
        Please try the next nightly build and let us know if you continue to have problems with it

        Thanks
        Isomorphic Software

        Comment

        Working...
        X