diff --git a/data/core.yaml b/data/core.yaml index 05aff73ae..5172ab2c2 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -25,8 +25,6 @@ en: title: Point description: "Add restaurants, monuments, postal boxes or other points to the map." tail: Click on the map to add a point. - add_vertex: - title: Vertex add_note: title: Note description: "Spotted an issue? Let other mappers know." @@ -42,8 +40,6 @@ en: title: "Add {feature} as an area" building: title: "Add {feature} as a building" - vertex: - title: "Add {feature} as a vertex" browse: title: Browse description: Pan and zoom the map. diff --git a/data/presets.yaml b/data/presets.yaml index 2ec08d884..ac6bc045f 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -3137,6 +3137,7 @@ en: area: # area=yes name: Area + # 'terms: polygon' terms: '' area/highway: # 'area:highway=*' @@ -4896,6 +4897,7 @@ en: terms: '' line: name: Line + # 'terms: polyline' terms: '' man_made: # man_made=* @@ -5640,6 +5642,7 @@ en: terms: '' point: name: Point + # 'terms: node,other,vertex,vertices' terms: '' power: # power=* @@ -7040,10 +7043,6 @@ en: # type=waterway name: Waterway terms: '' - vertex: - name: Vertex - # 'terms: other' - terms: '' waterway: # waterway=* name: Waterway diff --git a/data/presets/defaults.json b/data/presets/defaults.json index 7668b15c2..6b0214543 100644 --- a/data/presets/defaults.json +++ b/data/presets/defaults.json @@ -46,7 +46,7 @@ "traffic_calming", "highway/mini_roundabout", "highway/motorway_junction", - "vertex" + "point" ], "relation": [ "category-route", diff --git a/data/presets/presets.json b/data/presets/presets.json index 7f53bbe10..49bb53a12 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -221,7 +221,7 @@ "amenity/waste/dog_excrement": {"icon": "maki-waste-basket", "fields": ["collection_times"], "geometry": ["point", "vertex", "area"], "tags": {"amenity": "waste_basket", "waste": "dog_excrement"}, "reference": {"key": "waste", "value": "dog_excrement"}, "terms": ["bin", "garbage", "rubbish", "litter", "trash", "poo", "dog"], "name": "Dog Excrement Bin"}, "amenity/water_point": {"icon": "maki-drinking-water", "fields": ["operator", "fee", "payment_multi"], "geometry": ["area", "vertex", "point"], "tags": {"amenity": "water_point"}, "name": "RV Drinking Water"}, "amenity/watering_place": {"icon": "maki-drinking-water", "fields": ["operator", "fee", "payment_multi"], "geometry": ["area", "vertex", "point"], "tags": {"amenity": "watering_place"}, "name": "Animal Watering Place"}, - "area": {"fields": ["name"], "geometry": ["area"], "tags": {"area": "yes"}, "name": "Area", "matchScore": 0.1}, + "area": {"fields": ["name"], "geometry": ["area"], "tags": {"area": "yes"}, "terms": ["polygon"], "name": "Area", "matchScore": 0.1}, "area/highway": {"fields": ["name", "area/highway"], "geometry": ["area"], "tags": {"area:highway": "*"}, "name": "Road Surface"}, "attraction/amusement_ride": {"icon": "maki-amusement-park", "geometry": ["point", "area"], "terms": ["theme park", "carnival ride"], "tags": {"attraction": "amusement_ride"}, "name": "Amusement Ride"}, "attraction/animal": {"icon": "maki-zoo", "fields": ["name", "operator"], "geometry": ["point", "area"], "terms": ["amphibian", "animal park", "aquarium", "bear", "bird", "fish", "insect", "lion", "mammal", "monkey", "penguin", "reptile", "safari", "theme park", "tiger", "zoo"], "tags": {"attraction": "animal"}, "name": "Animal Enclosure"}, @@ -610,7 +610,7 @@ "leisure/track/horse_racing": {"icon": "maki-horse-riding", "fields": ["surface", "sport_racing_nonmotor", "lit", "width", "lanes"], "geometry": ["point", "line", "area"], "tags": {"leisure": "track", "sport": "horse_racing"}, "addTags": {"leisure": "track", "sport": "horse_racing", "highway": "bridleway"}, "removeTags": {"leisure": "track", "sport": "horse_racing", "highway": "bridleway"}, "terms": ["equestrian race track", "horse race betting", "horseracing", "horsetrack", "horse racetrack"], "name": "Horse Racing Track"}, "leisure/track/running": {"icon": "maki-pitch", "fields": ["surface", "sport_racing_nonmotor", "lit", "width", "lanes"], "geometry": ["point", "line", "area"], "tags": {"leisure": "track", "sport": "running"}, "addTags": {"leisure": "track", "sport": "running", "highway": "footway"}, "removeTags": {"leisure": "track", "sport": "running", "highway": "footway"}, "terms": ["athletics track", "decathlon", "foot race", "long distance running", "marathon", "middle distance running", "racetrack", "running", "sprint", "track", "walking"], "name": "Running Track"}, "leisure/water_park": {"icon": "maki-swimming", "fields": ["name", "operator", "address"], "moreFields": ["payment_multi", "brand", "website", "phone", "email", "fax"], "geometry": ["point", "area"], "terms": ["swim", "pool", "dive"], "tags": {"leisure": "water_park"}, "name": "Water Park"}, - "line": {"fields": ["name"], "geometry": ["line"], "tags": {}, "name": "Line", "matchScore": 0.1}, + "line": {"fields": ["name"], "geometry": ["line"], "tags": {}, "terms": ["polyline"], "name": "Line", "matchScore": 0.1}, "man_made/adit": {"icon": "maki-triangle", "geometry": ["point", "area"], "fields": ["name", "operator", "resource", "direction"], "terms": ["cave", "horizontal mine entrance", "tunnel", "underground"], "tags": {"man_made": "adit"}, "name": "Adit"}, "man_made/antenna": {"icon": "temaki-antenna", "fields": ["height", "communication_multi"], "geometry": ["point"], "terms": ["broadcast", "cell phone", "cell", "communication", "mobile phone", "radio", "television", "transmission", "tv"], "tags": {"man_made": "antenna"}, "name": "Antenna"}, "man_made/breakwater": {"geometry": ["line", "area"], "tags": {"man_made": "breakwater"}, "name": "Breakwater"}, @@ -771,7 +771,7 @@ "playground/structure": {"icon": "maki-pitch", "geometry": ["point", "area"], "tags": {"playground": "structure"}, "name": "Play Structure"}, "playground/swing": {"icon": "maki-playground", "fields": ["capacity", "playground/baby", "wheelchair"], "geometry": ["point"], "tags": {"playground": "swing"}, "name": "Swing"}, "playground/zipwire": {"icon": "maki-playground", "geometry": ["point", "line"], "tags": {"playground": "zipwire"}, "name": "Zip Wire"}, - "point": {"fields": ["name"], "geometry": ["point"], "tags": {}, "name": "Point", "matchScore": 0.1}, + "point": {"fields": ["name"], "geometry": ["vertex", "point"], "tags": {}, "terms": ["node", "other", "vertex", "vertices"], "name": "Point", "matchScore": 0.1}, "power/sub_station": {"icon": "temaki-power", "fields": ["substation", "operator", "building", "ref"], "geometry": ["point", "area"], "tags": {"power": "sub_station"}, "reference": {"key": "power", "value": "substation"}, "name": "Substation", "searchable": false}, "power/cable/underground": {"fields": ["name", "operator", "voltage", "ref", "layer"], "geometry": ["line"], "tags": {"power": "cable", "location": "underground"}, "name": "Underground Power Cable"}, "power/generator": {"icon": "temaki-power", "fields": ["operator", "generator/source", "generator/method", "generator/type", "generator/output/electricity", "ref"], "geometry": ["point", "vertex", "area"], "terms": ["hydro", "solar", "turbine", "wind"], "tags": {"power": "generator"}, "name": "Power Generator"}, @@ -1078,7 +1078,6 @@ "type/route/tram": {"icon": "iD-route-tram", "fields": ["name", "ref_route", "operator", "network", "to", "from"], "moreFields": ["colour", "interval", "opening_hours", "duration", "wheelchair"], "geometry": ["relation"], "tags": {"type": "route", "route": "tram"}, "name": "Tram Route"}, "type/site": {"icon": "iD-relation", "fields": ["name", "site"], "geometry": ["relation"], "tags": {"type": "site"}, "name": "Site"}, "type/waterway": {"icon": "iD-route-water", "fields": ["name", "waterway", "ref"], "geometry": ["relation"], "tags": {"type": "waterway"}, "name": "Waterway"}, - "vertex": {"moreFields": ["name"], "geometry": ["vertex"], "terms": ["other"], "tags": {}, "name": "Vertex", "matchScore": 0.1}, "waterway/riverbank": {"icon": "maki-water", "geometry": ["area"], "tags": {"waterway": "riverbank"}, "name": "Riverbank", "searchable": false}, "waterway/boatyard": {"icon": "maki-harbor", "fields": ["name", "operator"], "moreFields": ["address", "website", "phone", "email", "fax", "wheelchair"], "geometry": ["area", "vertex", "point"], "tags": {"waterway": "boatyard"}, "name": "Boatyard"}, "waterway/canal": {"icon": "iD-waterway-canal", "fields": ["name", "width", "intermittent"], "moreFields": ["salt"], "geometry": ["line"], "tags": {"waterway": "canal"}, "name": "Canal"}, diff --git a/data/presets/presets/area.json b/data/presets/presets/area.json index ed2a9f379..ab20323aa 100644 --- a/data/presets/presets/area.json +++ b/data/presets/presets/area.json @@ -8,6 +8,9 @@ "tags": { "area": "yes" }, + "terms": [ + "polygon" + ], "name": "Area", "matchScore": 0.1 } diff --git a/data/presets/presets/line.json b/data/presets/presets/line.json index d2339d4c8..3b55d57f2 100644 --- a/data/presets/presets/line.json +++ b/data/presets/presets/line.json @@ -6,6 +6,9 @@ "line" ], "tags": {}, + "terms": [ + "polyline" + ], "name": "Line", "matchScore": 0.1 } diff --git a/data/presets/presets/point.json b/data/presets/presets/point.json index 3a74326a2..4369115f0 100644 --- a/data/presets/presets/point.json +++ b/data/presets/presets/point.json @@ -3,9 +3,16 @@ "name" ], "geometry": [ + "vertex", "point" ], "tags": {}, + "terms": [ + "node", + "other", + "vertex", + "vertices" + ], "name": "Point", "matchScore": 0.1 } diff --git a/data/presets/presets/vertex.json b/data/presets/presets/vertex.json deleted file mode 100644 index 228e00fd3..000000000 --- a/data/presets/presets/vertex.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "moreFields": [ - "name" - ], - "geometry": [ - "vertex" - ], - "terms": [ - "other" - ], - "tags": {}, - "name": "Vertex", - "matchScore": 0.1 -} diff --git a/dist/locales/en.json b/dist/locales/en.json index af8e8ae7e..ac7cc4f5c 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -31,9 +31,6 @@ "description": "Add restaurants, monuments, postal boxes or other points to the map.", "tail": "Click on the map to add a point." }, - "add_vertex": { - "title": "Vertex" - }, "add_note": { "title": "Note", "description": "Spotted an issue? Let other mappers know.", @@ -53,9 +50,6 @@ }, "building": { "title": "Add {feature} as a building" - }, - "vertex": { - "title": "Add {feature} as a vertex" } }, "browse": { @@ -4825,7 +4819,7 @@ }, "area": { "name": "Area", - "terms": "" + "terms": "polygon" }, "area/highway": { "name": "Road Surface", @@ -6381,7 +6375,7 @@ }, "line": { "name": "Line", - "terms": "" + "terms": "polyline" }, "man_made/adit": { "name": "Adit", @@ -7025,7 +7019,7 @@ }, "point": { "name": "Point", - "terms": "" + "terms": "node,other,vertex,vertices" }, "power/sub_station": { "name": "Substation", @@ -8251,10 +8245,6 @@ "name": "Waterway", "terms": "" }, - "vertex": { - "name": "Vertex", - "terms": "other" - }, "waterway/riverbank": { "name": "Riverbank", "terms": "" diff --git a/modules/presets/collection.js b/modules/presets/collection.js index 08a3b65e2..e5c9b426e 100644 --- a/modules/presets/collection.js +++ b/modules/presets/collection.js @@ -42,6 +42,11 @@ export function presetCollection(collection) { })); }, + fallback: function(geometry) { + var id = geometry; + if (id === 'vertex') id = 'point'; + return this.item(id); + }, search: function(value, geometry) { if (!value) return this; @@ -153,10 +158,10 @@ export function presetCollection(collection) { if (geometry) { if (typeof geometry === 'string') { - results.push(presets.item(geometry)); + results.push(presets.fallback(geometry)); } else { geometry.forEach(function(geom) { - results.push(presets.item(geom)); + results.push(presets.fallback(geom)); }); } } diff --git a/modules/presets/index.js b/modules/presets/index.js index c6fbd19db..75d329829 100644 --- a/modules/presets/index.js +++ b/modules/presets/index.js @@ -84,7 +84,7 @@ export function presetIndex(context) { if (address && (!match || match.isFallback())) { match = address; } - return match || all.item(geometry); + return match || all.fallback(geometry); }; all.allowsVertex = function(entity, resolver) { @@ -271,7 +271,7 @@ export function presetIndex(context) { all.defaults = function(geometry, n) { var rec = all.recent().matchGeometry(geometry).collection.slice(0, 4); var def = _uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1); - return presetCollection(_uniq(rec.concat(def).concat(all.item(geometry)))); + return presetCollection(_uniq(rec.concat(def).concat(all.fallback(geometry)))); }; all.recent = function() { @@ -307,10 +307,16 @@ export function presetIndex(context) { function ribbonItemForMinified(d, source) { if (d && d.pID && d.geom) { var preset = all.item(d.pID); + if (!preset) return null; + + var geom = d.geom; + // treat point and vertex features as one geometry + if (geom === 'vertex') geom = 'point'; + // iD's presets could have changed since this was saved, // so make sure it's still valid. - if (preset && preset.matchGeometry(d.geom)) { - return RibbonItem(preset, d.geom, source); + if (preset.matchGeometry(geom) || (geom === 'point' && preset.matchGeometry('vertex'))) { + return RibbonItem(preset, geom, source); } } return null; @@ -364,6 +370,7 @@ export function presetIndex(context) { }; all.toggleFavorite = function(preset, geometry) { + geometry = all.fallback(geometry).id; var favs = all.getFavorites(); var favorite = all.favoriteMatching(preset, geometry); if (favorite) { @@ -381,6 +388,7 @@ export function presetIndex(context) { }; all.removeFavorite = function(preset, geometry) { + geometry = all.fallback(geometry).id; var item = all.favoriteMatching(preset, geometry); if (item) { var items = all.getFavorites(); @@ -399,6 +407,7 @@ export function presetIndex(context) { }; all.favoriteMatching = function(preset, geometry) { + geometry = all.fallback(geometry).id; var favs = all.getFavorites(); for (var index in favs) { if (favs[index].matches(preset, geometry)) { @@ -408,6 +417,7 @@ export function presetIndex(context) { return null; }; all.recentMatching = function(preset, geometry) { + geometry = all.fallback(geometry).id; var items = all.getRecents(); for (var index in items) { if (items[index].matches(preset, geometry)) { @@ -439,6 +449,7 @@ export function presetIndex(context) { }; all.setMostRecent = function(preset, geometry) { + geometry = all.fallback(geometry).id; if (preset.searchable === false) return; var items = all.getRecents(); diff --git a/modules/ui/modes.js b/modules/ui/modes.js index 9cd5c46e4..4087769c9 100644 --- a/modules/ui/modes.js +++ b/modules/ui/modes.js @@ -121,7 +121,7 @@ export function uiModes(context) { if (d.preset.setTags({}, d.geometry).building) { tooltipTitleID = 'modes.add_preset.building.title'; } else { - tooltipTitleID = 'modes.add_preset.' + d.geometry + '.title'; + tooltipTitleID = 'modes.add_preset.' + context.presets().fallback(d.geometry).id + '.title'; } } var protoMode = _clone(d); @@ -209,7 +209,7 @@ export function uiModes(context) { } else { d3_select(this) .call(uiPresetIcon() - .geometry(d.geometry) + .geometry((d.geometry === 'point' && !d.preset.matchGeometry(d.geometry)) ? 'vertex' : d.geometry) .preset(d.preset) .sizeClass('small') ); diff --git a/modules/ui/preset_favorite.js b/modules/ui/preset_favorite.js index 544bb0bff..856d1741e 100644 --- a/modules/ui/preset_favorite.js +++ b/modules/ui/preset_favorite.js @@ -8,6 +8,8 @@ import { svgIcon } from '../svg'; export function uiPresetFavorite(preset, geom, context, klass) { + geom = context.presets().fallback(geom).id; + var presetFavorite = {}; var _button = d3_select(null); diff --git a/modules/ui/search_add.js b/modules/ui/search_add.js index 3e134b8d7..b7555066d 100644 --- a/modules/ui/search_add.js +++ b/modules/ui/search_add.js @@ -361,7 +361,7 @@ export function uiSearchAdd(context) { if (d.preset.setTags({}, d.geometry).building) { return t('presets.presets.building.name'); } - return t('modes.add_' + d.geometry + '.title'); + return t('modes.add_' + context.presets().fallback(d.geometry).id + '.title'); } return d.preset.name(); }); diff --git a/package.json b/package.json index 42d342c09..5f98cd251 100644 --- a/package.json +++ b/package.json @@ -60,9 +60,9 @@ "concat-files": "^0.1.1", "d3": "4.13.0", "ecstatic": "^3.0.0", - "editor-layer-index": "osmlab/editor-layer-index.git#gh-pages", - "eslint": "^5.15.0", - "esm": "~3.2.11", + "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages", + "eslint": "^5.15.3", + "esm": "^3.2.18", "gaze": "^1.1.1", "glob": "^7.1.0", "happen": "^0.3.1", @@ -91,7 +91,7 @@ "smash": "0.0", "svg-sprite": "1.5.0", "temaki": "1.2.0", - "uglify-js": "~3.4.0" + "uglify-js": "^3.4.10" }, "greenkeeper": { "label": "chore-greenkeeper", diff --git a/test/spec/presets/index.js b/test/spec/presets/index.js index 4c0d4696f..c874b314b 100644 --- a/test/spec/presets/index.js +++ b/test/spec/presets/index.js @@ -42,14 +42,14 @@ describe('iD.presetIndex', function () { expect(presets.match(line, graph).id).to.eql('line'); }); - it('matches vertices on a line as vertices', function () { + it('matches vertices on a line as points', function () { iD.data.presets = testPresets; var presets = iD.coreContext().presets(); var point = iD.osmNode({ tags: { leisure: 'park' } }); var line = iD.osmWay({ nodes: [point.id], tags: { 'highway': 'residential' } }); var graph = iD.coreGraph([point, line]); - expect(presets.match(point, graph).id).to.eql('vertex'); + expect(presets.match(point, graph).id).to.eql('point'); }); it('matches vertices on an addr:interpolation line as points', function () {