From 625a16498edacbdf7cea3a0d2167d616d65eb0ec Mon Sep 17 00:00:00 2001 From: Benjamin Edward Sonday Date: Mon, 5 Jan 2015 17:03:48 -0500 Subject: [PATCH 1/2] Adding quick example around inserting a row --- examples/example-insert-row.html | 91 ++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 examples/example-insert-row.html diff --git a/examples/example-insert-row.html b/examples/example-insert-row.html new file mode 100644 index 000000000..eff3c10d9 --- /dev/null +++ b/examples/example-insert-row.html @@ -0,0 +1,91 @@ + + + + + SlickGrid example: Insert or delete a row + + + + + + + + + + +
+
+
+

Demonstrates:

+
    +
  • adding a row
  • +
+

View Source:

+ + +
+ + + + + + + + + + + From c7531e4d938af0b8a05606f5a3bcc499a2e90ab1 Mon Sep 17 00:00:00 2001 From: Benjamin Edward Sonday Date: Mon, 5 Jan 2015 17:10:02 -0500 Subject: [PATCH 2/2] Test that one can't insert using ids already taken --- slick.dataview.js | 25 +++++++++++++++++++++---- tests/dataview/dataview.js | 12 +++++++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/slick.dataview.js b/slick.dataview.js index f1c1b5e34..0ff68fa9b 100644 --- a/slick.dataview.js +++ b/slick.dataview.js @@ -336,13 +336,30 @@ refresh(); } + /** + * @param newRow we wish to add. Checks that newRow defines + * property idProperty, and that newRow[idProperty] is + * not already taken by something in the idxById map + */ + function ensureIdAndThatItDoesNotExist(newRow) { + var id = newRow[idProperty] + if (id === undefined) { + throw "Each data element must implement a unique 'id' property"; + } + if (idxById.hasOwnProperty(id)) { + throw "Id " + newId + " is already taken"; + } + } + function insertItem(insertBefore, item) { + ensureIdAndThatItDoesNotExist(item) items.splice(insertBefore, 0, item); updateIdxById(insertBefore); refresh(); } function addItem(item) { + ensureIdAndThatItDoesNotExist(item) items.push(item); updateIdxById(items.length - 1); refresh(); @@ -512,7 +529,7 @@ group = groups[i]; group.groups = extractGroups(group.rows, group); } - } + } groups.sort(groupingInfos[level].comparer); @@ -562,7 +579,7 @@ level = level || 0; var gi = groupingInfos[level]; var groupCollapsed = gi.collapsed; - var toggledGroups = toggledGroupsByLevel[level]; + var toggledGroups = toggledGroupsByLevel[level]; var idx = groups.length, g; while (idx--) { g = groups[idx]; @@ -584,7 +601,7 @@ g.collapsed = groupCollapsed ^ toggledGroups[g.groupingKey]; g.title = gi.formatter ? gi.formatter(g) : g.value; } - } + } function flattenGroupedRows(groups, level) { level = level || 0; @@ -901,7 +918,7 @@ inHandler = true; var selectedRows = self.mapIdsToRows(selectedRowIds); if (!preserveHidden) { - setSelectedRowIds(self.mapRowsToIds(selectedRows)); + setSelectedRowIds(self.mapRowsToIds(selectedRows)); } grid.setSelectedRows(selectedRows); inHandler = false; diff --git a/tests/dataview/dataview.js b/tests/dataview/dataview.js index c1eb384b4..f326da713 100644 --- a/tests/dataview/dataview.js +++ b/tests/dataview/dataview.js @@ -475,7 +475,7 @@ test("updating an item to pass the filter", function() { same(args.pageSize, 0, "pageSize arg"); same(args.pageNum, 0, "pageNum arg"); same(args.totalRows, 4, "totalRows arg"); - count++; + count++; }); dv.updateItem(3,{id:3,val:3}); equal(count, 3, "events fired"); @@ -697,6 +697,16 @@ test("insert at the end", function() { assertConsistency(dv); }); +test("insert with id already taken", function() { + var dv = new Slick.Data.DataView() + dv.setItems([{id:0,val:0},{id:1,val:1},{id:2,val:2}]); + try { + dv.insertItem(2, {id:2,val:1337}); + ok(false, "exception thrown"); + } + catch (ex) {} +}) + module("deleteItem"); test("must have id", function() {