SmartGWT LGPL 6.0p, nightly build 2018-01-03, SmartClient Version: v11.0p_2018-01-03/LGPL Development Only (built 2018-01-03)
When grouping a ListGrid configured with setFilterLocalData(true) with a field, an endless loop is encountered and the browser throws a "Maximum call stack size exceeded" error (in Chrome). It seems that the error is thrown (at least) with the first grouping which is done.
Reproducible with the following code:
To reproduce, run the following code, group the field with some field (for example field "f2") and observe, that the grouping takes a while by freezing the browser and the console is printed with the stack error.
When grouping a ListGrid configured with setFilterLocalData(true) with a field, an endless loop is encountered and the browser throws a "Maximum call stack size exceeded" error (in Chrome). It seems that the error is thrown (at least) with the first grouping which is done.
Code:
RangeError: Maximum call stack size exceeded Stack from error.stack: cons.getTotalRows(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:40132:31 cons.dataChanged(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:16407:24 cons.<anonymous>(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:15659:35 cons.observation(<no args: exited>) on [ResultSet ID:isc_ResultSet_1(dataSource: myDS, created directly)] @ Class.js:2554:28 cons._doneChangingData(<no args: exited>) on [ResultSet ID:isc_ResultSet_1(dataSource: myDS, created directly)] @ ResultSet.js:2968:14 cons.filterLocalData(<no args: exited>) on [ResultSet ID:isc_ResultSet_1(dataSource: myDS, created directly)] @ ResultSet.js:4245:28 cons.dataChanged(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:16296:22 cons.groupBy(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:50038:10 cons.setGroupSpecifiers(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:49851:14 cons.groupBy(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:49944:18 cons.dataChanged(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:16322:14 cons.groupBy(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:50038:10 cons.setGroupSpecifiers(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:49851:14 cons.groupBy(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:49944:18 cons.dataChanged(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:16322:14 cons.groupBy(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:50038:10 cons.setGroupSpecifiers(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:49851:14 cons.groupBy(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:49944:18 cons.dataChanged(<no args: exited>) on[ListGrid ID:isc_ListGrid_0] @ ListGrid.js:16322:14 ...
Code:
public void doOnModuleLoad() { viewport = new VLayout(); viewport.setWidth100(); viewport.setHeight100(); viewport.setOverflow(Overflow.HIDDEN); final DataSource ds = new DataSource(); ds.setID("myDS"); DataSourceIntegerField f1 = new DataSourceIntegerField("f1"); f1.setPrimaryKey(true); f1.setHidden(true); DataSourceTextField f2 = new DataSourceTextField("f2"); DataSourceIntegerField f3 = new DataSourceIntegerField("f3"); HashMap vm = new HashMap(); vm.put(0, "first val"); vm.put(1, "second val"); f3.setValueMap(vm); ds.setFields(f1, f2, f3); ds.setClientOnly(true); ListGridRecord[] recs = new ListGridRecord[999]; for(int i=0; i<999; i++) { final ListGridRecord r = new ListGridRecord(); r.setAttribute("f1", "" + i); r.setAttribute("f2", i + " value"); r.setAttribute("f3", i % 0); recs[i] = r; } ds.setTestData(recs); final ListGrid g = new ListGrid(); g.setDataSource(ds); g.setCanGroupBy(true); // if set, first grouping of the grid goes to endless loop and throws "maximum call stack exceeded" (in chrome) g.setFilterLocalData(true); ListGridField gf1 = new ListGridField("f1"); ListGridField gf2 = new ListGridField("f2"); ListGridField gf3 = new ListGridField("f3"); g.setFields(gf1, gf2, gf3); final Criteria fetchCriteria = new Criteria(); ds.fetchData(fetchCriteria, new DSCallback() { @Override public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest) { ResultSet resultSet = new ResultSet(ds); resultSet.setAllRows(dsResponse.getData()); resultSet.setCriteria(fetchCriteria); g.setData(resultSet); } }); viewport.addMember(g); viewport.draw(); SC.showConsole(); }
Comment