diff --git a/modules/presets/index.js b/modules/presets/index.js index 2bf6c8571..ad69d863d 100644 --- a/modules/presets/index.js +++ b/modules/presets/index.js @@ -338,11 +338,19 @@ export function presetIndex() { _this.addablePresetIDs = function(val) { if (!arguments.length) return _addablePresetIDs; + // accept and convert arrays + if (Array.isArray(val)) val = new Set(val); + _addablePresetIDs = val; if (_addablePresetIDs) { // reset all presets - _this.collection.forEach(p => p.addable(_addablePresetIDs.has(p.id))); + _this.collection.forEach(p => { + // categories aren't addable + if (p.addable) p.addable(_addablePresetIDs.has(p.id)); + }); } else { - _this.collection.forEach(p => p.addable(true)); + _this.collection.forEach(p => { + if (p.addable) p.addable(true); + }); } return _this; diff --git a/test/spec/presets/index.js b/test/spec/presets/index.js index cbec7863e..c656cf159 100644 --- a/test/spec/presets/index.js +++ b/test/spec/presets/index.js @@ -198,6 +198,10 @@ describe('iD.presetIndex', function () { iD.fileFetcher.cache().preset_presets = testPresets; var presets = iD.presetIndex(); presets.ensureLoaded().then(function() { + + expect(presets.item('residential').addable()).to.be.true; + expect(presets.item('park').addable()).to.be.true; + var ids = new Set(['residential']); // can only add preset with this ID presets.addablePresetIDs(ids); @@ -208,6 +212,42 @@ describe('iD.presetIndex', function () { presets.addablePresetIDs(null); expect(presets.item('residential').addable()).to.be.true; expect(presets.item('park').addable()).to.be.true; + + done(); + }); + }); + + it('ignores invalid IDs in addablePresetIDs', function (done) { + iD.fileFetcher.cache().preset_presets = testPresets; + var presets = iD.presetIndex(); + presets.ensureLoaded().then(function() { + + expect(presets.item(null)).to.eql(undefined); + expect(presets.item(undefined)).to.eql(undefined); + expect(presets.item('')).to.eql(undefined); + expect(presets.item('garbage')).to.eql(undefined); + expect(presets.item('residential').addable()).to.be.true; + expect(presets.item('park').addable()).to.be.true; + + var ids = new Set([null, undefined, '', 'garbage', 'residential']); // can only add preset with these IDs + presets.addablePresetIDs(ids); + + expect(presets.item(null)).to.eql(undefined); + expect(presets.item(undefined)).to.eql(undefined); + expect(presets.item('')).to.eql(undefined); + expect(presets.item('garbage')).to.eql(undefined); + expect(presets.item('residential').addable()).to.be.true; + expect(presets.item('park').addable()).to.be.false; + expect(presets.addablePresetIDs()).to.eql(ids); + + presets.addablePresetIDs(null); + expect(presets.item(null)).to.eql(undefined); + expect(presets.item(undefined)).to.eql(undefined); + expect(presets.item('')).to.eql(undefined); + expect(presets.item('garbage')).to.eql(undefined); + expect(presets.item('residential').addable()).to.be.true; + expect(presets.item('park').addable()).to.be.true; + done(); }); });