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:
+
+ View Source:
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
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() {