diff options
author | mleibman <michael.leibman@gmail.com> | 2011-01-01 21:01:36 -0800 |
---|---|---|
committer | mleibman <michael.leibman@gmail.com> | 2011-01-01 21:01:36 -0800 |
commit | 29801364543e273d842e6cee04535e8d33a52b3d (patch) | |
tree | fa9fafd49aa756dffde18e4b3646a37320a3fe78 /slick.dataview.js | |
parent | ec6dafce31bf8ce716d860d6481f06d8164c5dde (diff) | |
download | SlickGrid-29801364543e273d842e6cee04535e8d33a52b3d.zip SlickGrid-29801364543e273d842e6cee04535e8d33a52b3d.tar.gz SlickGrid-29801364543e273d842e6cee04535e8d33a52b3d.tar.bz2 |
DataView code cleanup.
Fixed paging when using a DataView without a filter.
Diffstat (limited to 'slick.dataview.js')
-rw-r--r-- | slick.dataview.js | 66 |
1 files changed, 39 insertions, 27 deletions
diff --git a/slick.dataview.js b/slick.dataview.js index fd5bcb0..668d17c 100644 --- a/slick.dataview.js +++ b/slick.dataview.js @@ -32,6 +32,8 @@ var updated = null; // updated item ids var suspend = false; // suspends the recalculation var sortComparer; + + // grouping var groupingGetter; var groupingGetterIsAFn; var groupingFormatter; @@ -254,7 +256,7 @@ group.value = val; group.start = i; group.collapsed = (val in collapsedGroups); - groups.push(group); + groups[groups.length] = group; } } if (group) { @@ -302,32 +304,25 @@ aggregators[idx].storeResult(t); } groupedRows[gl++] = t; - totals.push(t); + totals[totals.length] = t; } } return groupedRows; } - function recalc(_items, _rows, _filter, _updated) { - var diff = []; - - rowsById = null; - - // go over all items remapping them to rows on the fly - // while keeping track of the differences and updating indexes + function getFilteredAndPagedItems(items, filter) { var pageStartRow = pagesize * pagenum; var pageEndRow = pageStartRow + pagesize; - var item,id; + var itemIdx = 0, rowIdx = 0, item; var newRows = []; - var il = _items.length; - var rl = _rows.length; - var itemIdx = 0, rowIdx = 0; // filter the data and get the current page if paging - if (_filter) { - for (var i = 0; i < il; ++i) { - item = _items[i]; - if (_filter(item)) { + // TODO: replace pagesize by a slice() if no filter + if (filter || pagesize) { + for (var i = 0, il = items.length; i < il; ++i) { + item = items[i]; + + if (!filter || filter(item)) { if (!pagesize || (itemIdx >= pageStartRow && itemIdx < pageEndRow)) { newRows[rowIdx] = item; rowIdx++; @@ -337,10 +332,27 @@ } } else { - newRows = _items.concat(); + newRows = items.concat(); itemIdx = il; } + return {totalRows:itemIdx, rows:newRows}; + } + + function recalc(_items, _rows, _filter, _updated) { + var diff = []; + + rowsById = null; + + // go over all items remapping them to rows on the fly + // while keeping track of the differences and updating indexes + var item; + var newRows = []; + + var filteredItems = getFilteredAndPagedItems(_items, _filter); + totalRows = filteredItems.totalRows; + newRows = filteredItems.rows; + groups = []; if (groupingGetter != null) { groups = extractGroups(newRows); @@ -350,28 +362,28 @@ } var eitherIsNonData; - for (var i = 0, nrl = newRows.length, r; i < nrl; i++) { + for (var i = 0, rl = _rows.length, nrl = newRows.length, r; i < nrl; i++) { item = newRows[i]; r = _rows[i]; - if (i >= rl || - (groupingGetter && (eitherIsNonData = (item instanceof Slick.NonDataRow) || (r instanceof Slick.NonDataRow)) && + if (i >= rl + || (groupingGetter && (eitherIsNonData = (item instanceof Slick.NonDataRow) || (r instanceof Slick.NonDataRow)) && (item instanceof Slick.Group !== r instanceof Slick.Group || - (item instanceof Slick.Group && !item.equals(r)))) || - (aggregators && eitherIsNonData && + (item instanceof Slick.Group && !item.equals(r)))) + || (aggregators && eitherIsNonData && // no good way to compare totals since they are arbitrary DTOs // deep object comparison is pretty expensive // always considering them 'dirty' seems easier for the time being - (item instanceof Slick.GroupTotals || r instanceof Slick.GroupTotals)) || - item[idProperty] != r[idProperty] || - (_updated && _updated[item[idProperty]])) { + (item instanceof Slick.GroupTotals || r instanceof Slick.GroupTotals)) + || item[idProperty] != r[idProperty] + || (_updated && _updated[item[idProperty]]) + ) { diff[diff.length] = i; } } rows = newRows; - totalRows = itemIdx; return diff; } |