diff --git a/css/app.css b/css/app.css index ec44e1f16..4891a9a4a 100644 --- a/css/app.css +++ b/css/app.css @@ -2047,10 +2047,12 @@ img.wiki-image { } .map-data-control .map-overlay, -.background-control .map-overlay { +.background-control .map-overlay, +.help-control .map-overlay { z-index: -1; } + /* Geolocator */ .geolocate-control { @@ -2668,6 +2670,7 @@ img.wiki-image { .tooltip-inner { display: inline-block; + border-radius: 3px; max-width: 200px; min-width: 80px; padding: 10px; @@ -2700,6 +2703,7 @@ img.wiki-image { } .tail div { + border-radius: 3px; padding: 10px; background: white; position: absolute; @@ -2767,6 +2771,7 @@ img.wiki-image { background: #F6F6F6; padding: 10px; margin: 10px -10px -10px; + border-radius: 0 0 3px 3px; } .tooltip-inner .keyhint { diff --git a/css/map.css b/css/map.css index b5d3d6613..b3ec162e5 100644 --- a/css/map.css +++ b/css/map.css @@ -207,6 +207,7 @@ path.stroke.tag-natural-wood, path.stroke.tag-natural-tree, path.stroke.tag-natural-grassland, path.stroke.tag-natural-grass, +path.stroke.tag-leisure-nature_reserve, path.stroke.tag-leisure-pitch, path.stroke.tag-leisure-park { stroke: rgb(140, 208, 95); @@ -216,6 +217,7 @@ path.fill.tag-natural-wood, path.fill.tag-natural-tree, path.fill.tag-natural-grassland, path.fill.tag-natural-grass, +path.fill.tag-leisure-nature_reserve, path.fill.tag-leisure-pitch, path.fill.tag-leisure-park { stroke: rgba(140, 208, 95, 0.3); @@ -226,6 +228,7 @@ path.fill.tag-leisure-park { .preset-icon-fill-area.tag-natural-tree, .preset-icon-fill-area.tag-natural-grassland, .preset-icon-fill-area.tag-natural-grass, +.preset-icon-fill-area.tag-leisure-nature_reserve, .preset-icon-fill-area.tag-leisure-pitch, .preset-icon-fill-area.tag-leisure-park { border-color: rgb(140, 208, 95); diff --git a/data/core.yaml b/data/core.yaml index 594be8c53..3bed0cd43 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -231,8 +231,8 @@ en: feature_list: Search features edit: Edit feature check: - yes: Yes - no: No + "yes": "Yes" + "no": "No" none: None node: Node way: Way diff --git a/data/presets.yaml b/data/presets.yaml index c4b14add5..74d3abeff 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -120,6 +120,8 @@ en: label: Type boundary: label: Type + brand: + label: Brand building: label: Building building_area: @@ -167,6 +169,8 @@ en: label: Type cuisine: label: Cuisine + delivery: + label: Delivery denomination: label: Denomination denotation: @@ -225,6 +229,13 @@ en: label: Sells Premium Gasoline gauge: label: Gauge + gender: + label: Gender + placeholder: Unknown + options: + male: Male + female: Female + unisex: Unisex generator/method: label: Method generator/source: @@ -269,6 +280,21 @@ en: placeholder: "1, 2, 3..." layer: label: Layer + leaf_cycle: + label: Leaf Cycle + options: + evergreen: Evergreen + deciduous: Deciduous + semi_evergreen: Semi-Evergreen + semi_deciduous: Semi-Deciduous + mixed: Mixed + leaf_type: + label: Leaf Type + options: + broadleaved: Broadleaved + needleleaved: Needleleaved + mixed: Mixed + leafless: Leafless leisure: label: Type length: @@ -436,6 +462,18 @@ en: label: Seasonal service: label: Type + service/bicycle/chaintool: + label: Chain Tool + options: + undefined: Assumed to be No + "yes": "Yes" + "no": "No" + service/bicycle/pump: + label: Air Pump + options: + undefined: Assumed to be No + "yes": "Yes" + "no": "No" shelter: label: Shelter shelter_type: @@ -488,12 +526,21 @@ en: ford: Ford studio_type: label: Type + substation: + label: Type supervised: label: Supervised surface: label: Surface tactile_paving: label: Tactile Paving + takeaway: + label: Takeaway + placeholder: "Yes, No, Takeaway Only..." + options: + "yes": "Yes" + "no": "No" + only: Takeaway Only toilets/disposal: label: Disposal options: @@ -524,8 +571,6 @@ en: bad: "Bad: no markers, path sometimes invisible/pathless" horrible: "Horrible: often pathless, some orientation skills required" "no": "No: pathless, excellent orientation skills required" - tree_type: - label: Type trees: label: Trees tunnel: @@ -547,8 +592,6 @@ en: label: Width (Meters) wikipedia: label: Wikipedia - wood: - label: Type presets: address: name: Address @@ -637,6 +680,9 @@ en: amenity/bicycle_rental: name: Bicycle Rental terms: "" + amenity/bicycle_repair_station: + name: Bicycle Repair Station + terms: "" amenity/boat_rental: name: Boat Rental terms: "" @@ -715,6 +761,9 @@ en: amenity/grave_yard: name: Graveyard terms: "" + amenity/grit_bin: + name: Grit Bin + terms: "" amenity/hospital: name: Hospital Grounds terms: "" @@ -766,12 +815,18 @@ en: amenity/pub: name: Pub terms: "" + amenity/public_bookcase: + name: Public Bookcase + terms: "" amenity/ranger_station: name: Ranger Station terms: "" amenity/recycling: name: Recycling terms: "" + amenity/register_office: + name: Register Office + terms: "" amenity/restaurant: name: Restaurant terms: "" @@ -1327,6 +1382,9 @@ en: historic/wayside_shrine: name: Wayside Shrine terms: "" + junction: + name: Junction + terms: "" landuse: name: Landuse terms: "" @@ -1343,14 +1401,14 @@ en: name: Churchyard terms: "" landuse/commercial: - name: Commercial - terms: "" + name: Commercial Area + terms: "" landuse/construction: name: Construction terms: "" landuse/farm: - name: Farm - terms: "" + name: Farmland + terms: "" landuse/farmland: name: Farmland terms: "" @@ -1360,12 +1418,15 @@ en: landuse/forest: name: Forest terms: "" + landuse/garages: + name: Garages + terms: "" landuse/grass: name: Grass terms: "" landuse/industrial: - name: Industrial - terms: "" + name: Industrial Area + terms: "" landuse/landfill: name: Landfill terms: "" @@ -1373,8 +1434,8 @@ en: name: Meadow terms: "" landuse/military: - name: Military - terms: "" + name: Military Area + terms: "" landuse/orchard: name: Orchard terms: "" @@ -1382,11 +1443,11 @@ en: name: Quarry terms: "" landuse/residential: - name: Residential - terms: "" + name: Residential Area + terms: "" landuse/retail: - name: Retail - terms: "" + name: Retail Area + terms: "" landuse/vineyard: name: Vineyard terms: "" @@ -1414,6 +1475,9 @@ en: leisure/marina: name: Marina terms: "" + leisure/nature_reserve: + name: Nature Reserve + terms: "" leisure/park: name: Park terms: "" @@ -1534,6 +1598,9 @@ en: natural/beach: name: Beach terms: "" + natural/cave_entrance: + name: Cave Entrance + terms: "" natural/cliff: name: Cliff terms: "" @@ -1936,6 +2003,9 @@ en: shop/hifi: name: Hifi Store terms: "" + shop/houseware: + name: Houseware Store + terms: "" shop/interior_decoration: name: Interior Decoration Store terms: "" diff --git a/data/presets/defaults.json b/data/presets/defaults.json index 9ee114295..5954b3db1 100644 --- a/data/presets/defaults.json +++ b/data/presets/defaults.json @@ -24,6 +24,7 @@ "amenity/place_of_worship", "amenity/cafe", "amenity/restaurant", + "amenity/fast_food", "amenity/bar", "amenity/bank", "shop/supermarket", diff --git a/data/presets/fields.json b/data/presets/fields.json index d42f0c1b6..1c1519b22 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -217,6 +217,11 @@ "type": "combo", "label": "Type" }, + "brand": { + "key": "brand", + "type": "text", + "label": "Brand" + }, "building": { "key": "building", "type": "typeCombo", @@ -311,6 +316,11 @@ "type": "combo", "label": "Cuisine" }, + "delivery": { + "key": "delivery", + "type": "check", + "label": "Delivery" + }, "denomination": { "key": "denomination", "type": "combo", @@ -446,6 +456,23 @@ "type": "combo", "label": "Gauge" }, + "gender": { + "type": "radio", + "keys": [ + "male", + "female", + "unisex" + ], + "label": "Gender", + "placeholder": "Unknown", + "strings": { + "options": { + "male": "Male", + "female": "Female", + "unisex": "Unisex" + } + } + }, "generator/method": { "key": "generator:method", "type": "combo", @@ -544,6 +571,33 @@ "type": "combo", "label": "Layer" }, + "leaf_cycle": { + "key": "leaf_cycle", + "type": "combo", + "label": "Leaf Cycle", + "strings": { + "options": { + "evergreen": "Evergreen", + "deciduous": "Deciduous", + "semi_evergreen": "Semi-Evergreen", + "semi_deciduous": "Semi-Deciduous", + "mixed": "Mixed" + } + } + }, + "leaf_type": { + "key": "leaf_type", + "type": "combo", + "label": "Leaf Type", + "strings": { + "options": { + "broadleaved": "Broadleaved", + "needleleaved": "Needleleaved", + "mixed": "Mixed", + "leafless": "Leafless" + } + } + }, "leisure": { "key": "leisure", "type": "typeCombo", @@ -888,6 +942,30 @@ "drive-through" ] }, + "service/bicycle/chaintool": { + "key": "service:bicycle:chaintool", + "type": "check", + "label": "Chain Tool", + "strings": { + "options": { + "undefined": "Assumed to be No", + "yes": "Yes", + "no": "No" + } + } + }, + "service/bicycle/pump": { + "key": "service:bicycle:pump", + "type": "check", + "label": "Air Pump", + "strings": { + "options": { + "undefined": "Assumed to be No", + "yes": "Yes", + "no": "No" + } + } + }, "shelter": { "key": "shelter", "type": "check", @@ -1032,6 +1110,11 @@ "video" ] }, + "substation": { + "key": "substation", + "type": "typeCombo", + "label": "Type" + }, "supervised": { "key": "supervised", "type": "check", @@ -1047,6 +1130,19 @@ "type": "check", "label": "Tactile Paving" }, + "takeaway": { + "key": "takeaway", + "type": "combo", + "label": "Takeaway", + "placeholder": "Yes, No, Takeaway Only...", + "strings": { + "options": { + "yes": "Yes", + "no": "No", + "only": "Takeaway Only" + } + } + }, "toilets/disposal": { "key": "toilets:disposal", "type": "combo", @@ -1101,16 +1197,6 @@ } } }, - "tree_type": { - "key": "type", - "type": "combo", - "label": "Type", - "options": [ - "broad_leaved", - "conifer", - "palm" - ] - }, "trees": { "key": "trees", "type": "combo", @@ -1172,10 +1258,5 @@ "icon": "wikipedia", "universal": true, "label": "Wikipedia" - }, - "wood": { - "key": "wood", - "type": "combo", - "label": "Type" } } \ No newline at end of file diff --git a/data/presets/fields/brand.json b/data/presets/fields/brand.json new file mode 100644 index 000000000..73dd2a71c --- /dev/null +++ b/data/presets/fields/brand.json @@ -0,0 +1,5 @@ +{ + "key": "brand", + "type": "text", + "label": "Brand" +} diff --git a/data/presets/fields/delivery.json b/data/presets/fields/delivery.json new file mode 100644 index 000000000..78ca3d341 --- /dev/null +++ b/data/presets/fields/delivery.json @@ -0,0 +1,5 @@ +{ + "key": "delivery", + "type": "check", + "label": "Delivery" +} diff --git a/data/presets/fields/gender.json b/data/presets/fields/gender.json new file mode 100644 index 000000000..e514b5a56 --- /dev/null +++ b/data/presets/fields/gender.json @@ -0,0 +1,17 @@ +{ + "type": "radio", + "keys": [ + "male", + "female", + "unisex" + ], + "label": "Gender", + "placeholder": "Unknown", + "strings": { + "options": { + "male": "Male", + "female": "Female", + "unisex": "Unisex" + } + } +} diff --git a/data/presets/fields/leaf_cycle.json b/data/presets/fields/leaf_cycle.json new file mode 100644 index 000000000..96851b55b --- /dev/null +++ b/data/presets/fields/leaf_cycle.json @@ -0,0 +1,14 @@ +{ + "key": "leaf_cycle", + "type": "combo", + "label": "Leaf Cycle", + "strings": { + "options": { + "evergreen": "Evergreen", + "deciduous": "Deciduous", + "semi_evergreen": "Semi-Evergreen", + "semi_deciduous": "Semi-Deciduous", + "mixed": "Mixed" + } + } +} diff --git a/data/presets/fields/leaf_type.json b/data/presets/fields/leaf_type.json new file mode 100644 index 000000000..864c0478e --- /dev/null +++ b/data/presets/fields/leaf_type.json @@ -0,0 +1,13 @@ +{ + "key": "leaf_type", + "type": "combo", + "label": "Leaf Type", + "strings": { + "options": { + "broadleaved": "Broadleaved", + "needleleaved": "Needleleaved", + "mixed": "Mixed", + "leafless": "Leafless" + } + } +} diff --git a/data/presets/fields/service/bicycle/chaintool.json b/data/presets/fields/service/bicycle/chaintool.json new file mode 100644 index 000000000..8d34c8615 --- /dev/null +++ b/data/presets/fields/service/bicycle/chaintool.json @@ -0,0 +1,12 @@ +{ + "key": "service:bicycle:chaintool", + "type": "check", + "label": "Chain Tool", + "strings": { + "options": { + "undefined": "Assumed to be No", + "yes": "Yes", + "no": "No" + } + } +} diff --git a/data/presets/fields/service/bicycle/pump.json b/data/presets/fields/service/bicycle/pump.json new file mode 100644 index 000000000..bb14992ec --- /dev/null +++ b/data/presets/fields/service/bicycle/pump.json @@ -0,0 +1,12 @@ +{ + "key": "service:bicycle:pump", + "type": "check", + "label": "Air Pump", + "strings": { + "options": { + "undefined": "Assumed to be No", + "yes": "Yes", + "no": "No" + } + } +} diff --git a/data/presets/fields/substation.json b/data/presets/fields/substation.json new file mode 100644 index 000000000..07a8ed80c --- /dev/null +++ b/data/presets/fields/substation.json @@ -0,0 +1,5 @@ +{ + "key": "substation", + "type": "typeCombo", + "label": "Type" +} \ No newline at end of file diff --git a/data/presets/fields/takeaway.json b/data/presets/fields/takeaway.json new file mode 100644 index 000000000..d71b9c177 --- /dev/null +++ b/data/presets/fields/takeaway.json @@ -0,0 +1,13 @@ +{ + "key": "takeaway", + "type": "combo", + "label": "Takeaway", + "placeholder": "Yes, No, Takeaway Only...", + "strings": { + "options": { + "yes": "Yes", + "no": "No", + "only": "Takeaway Only" + } + } +} diff --git a/data/presets/fields/tree_type.json b/data/presets/fields/tree_type.json deleted file mode 100644 index 54faa3793..000000000 --- a/data/presets/fields/tree_type.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "key": "type", - "type": "combo", - "label": "Type", - "options": [ - "broad_leaved", - "conifer", - "palm" - ] -} diff --git a/data/presets/fields/wood.json b/data/presets/fields/wood.json deleted file mode 100644 index f9ed5c6f7..000000000 --- a/data/presets/fields/wood.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "key": "wood", - "type": "combo", - "label": "Type" -} \ No newline at end of file diff --git a/data/presets/presets.json b/data/presets/presets.json index 8a194f323..232143ef0 100644 --- a/data/presets/presets.json +++ b/data/presets/presets.json @@ -499,6 +499,29 @@ }, "name": "Bicycle Rental" }, + "amenity/bicycle_repair_station": { + "icon": "bicycle", + "fields": [ + "operator", + "brand", + "opening_hours", + "fee", + "service/bicycle/chaintool", + "service/bicycle/pump" + ], + "geometry": [ + "point", + "vertex", + "area" + ], + "terms": [ + "bike" + ], + "tags": { + "amenity": "bicycle_repair_station" + }, + "name": "Bicycle Repair Station" + }, "amenity/boat_rental": { "fields": [ "operator" @@ -873,6 +896,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "geometry": [ @@ -955,6 +980,23 @@ }, "name": "Graveyard" }, + "amenity/grit_bin": { + "fields": [ + "access_simple" + ], + "geometry": [ + "point", + "vertex" + ], + "tags": { + "amenity": "grit_bin" + }, + "terms": [ + "salt", + "sand" + ], + "name": "Grit Bin" + }, "amenity/hospital": { "icon": "hospital", "fields": [ @@ -1362,6 +1404,27 @@ ], "name": "Pub" }, + "amenity/public_bookcase": { + "icon": "library", + "fields": [ + "name", + "operator", + "capacity", + "website" + ], + "geometry": [ + "point", + "area" + ], + "terms": [ + "library", + "bookcrossing" + ], + "tags": { + "amenity": "public_bookcase" + }, + "name": "Public Bookcase" + }, "amenity/ranger_station": { "fields": [ "operator", @@ -1413,6 +1476,24 @@ }, "name": "Recycling" }, + "amenity/register_office": { + "icon": "town-hall", + "fields": [ + "address", + "building_area", + "opening_hours", + "operator" + ], + "geometry": [ + "point", + "area" + ], + "terms": [], + "tags": { + "amenity": "register_office" + }, + "name": "Register Office" + }, "amenity/restaurant": { "icon": "restaurant", "fields": [ @@ -1421,6 +1502,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "geometry": [ @@ -1547,7 +1630,7 @@ "tags": { "amenity": "social_facility", "social_facility": "group_home", - "social_facility_for": "senior" + "social_facility:for": "senior" }, "name": "Elderly Group Home" }, @@ -1671,7 +1754,8 @@ "toilets/disposal", "operator", "building_area", - "access_toilets" + "access_toilets", + "gender" ], "geometry": [ "point", @@ -2156,6 +2240,7 @@ "icon": "commercial", "fields": [ "address", + "levels", "smoking" ], "geometry": [ @@ -4511,6 +4596,16 @@ }, "name": "Wayside Shrine" }, + "junction": { + "geometry": [ + "vertex", + "area" + ], + "tags": { + "junction": "yes" + }, + "name": "Junction" + }, "landuse": { "fields": [ "landuse" @@ -4527,7 +4622,6 @@ }, "landuse/allotments": { "geometry": [ - "point", "area" ], "tags": { @@ -4538,7 +4632,6 @@ }, "landuse/basin": { "geometry": [ - "point", "area" ], "tags": { @@ -4554,8 +4647,6 @@ "denomination" ], "geometry": [ - "point", - "vertex", "area" ], "tags": { @@ -4581,14 +4672,13 @@ "landuse/commercial": { "icon": "commercial", "geometry": [ - "point", "area" ], "tags": { "landuse": "commercial" }, "terms": [], - "name": "Commercial" + "name": "Commercial Area" }, "landuse/construction": { "fields": [ @@ -4596,7 +4686,6 @@ "operator" ], "geometry": [ - "point", "area" ], "tags": { @@ -4606,6 +4695,7 @@ "name": "Construction" }, "landuse/farm": { + "icon": "farm", "fields": [ "crop" ], @@ -4617,58 +4707,66 @@ "landuse": "farm" }, "terms": [], - "name": "Farm", - "icon": "farm" + "name": "Farmland", + "searchable": false }, "landuse/farmland": { + "icon": "farm", "fields": [ "crop" ], "geometry": [ - "point", "area" ], "tags": { "landuse": "farmland" }, "terms": [], - "name": "Farmland", - "icon": "farm", - "searchable": false + "name": "Farmland" }, "landuse/farmyard": { + "icon": "farm", "fields": [ "crop" ], "geometry": [ - "point", "area" ], "tags": { "landuse": "farmyard" }, "terms": [], - "name": "Farmyard", - "icon": "farm" + "name": "Farmyard" }, "landuse/forest": { - "fields": [ - "wood" - ], "icon": "park2", + "fields": [ + "leaf_type", + "leaf_cycle" + ], "geometry": [ - "point", "area" ], "tags": { "landuse": "forest" }, - "terms": [], + "terms": [ + "tree" + ], "name": "Forest" }, + "landuse/garages": { + "geometry": [ + "area" + ], + "tags": { + "landuse": "garages" + }, + "terms": [], + "name": "Garages" + }, "landuse/grass": { "geometry": [ - "point", "area" ], "tags": { @@ -4680,14 +4778,13 @@ "landuse/industrial": { "icon": "industrial", "geometry": [ - "point", "area" ], "tags": { "landuse": "industrial" }, "terms": [], - "name": "Industrial" + "name": "Industrial Area" }, "landuse/landfill": { "geometry": [ @@ -4703,7 +4800,6 @@ }, "landuse/meadow": { "geometry": [ - "point", "area" ], "tags": { @@ -4720,26 +4816,24 @@ "landuse": "military" }, "terms": [], - "name": "Military" + "name": "Military Area" }, "landuse/orchard": { + "icon": "park2", "fields": [ "trees" ], "geometry": [ - "point", "area" ], "tags": { "landuse": "orchard" }, "terms": [], - "name": "Orchard", - "icon": "park2" + "name": "Orchard" }, "landuse/quarry": { "geometry": [ - "point", "area" ], "tags": { @@ -4751,29 +4845,26 @@ "landuse/residential": { "icon": "building", "geometry": [ - "point", "area" ], "tags": { "landuse": "residential" }, "terms": [], - "name": "Residential" + "name": "Residential Area" }, "landuse/retail": { "icon": "shop", "geometry": [ - "point", "area" ], "tags": { "landuse": "retail" }, - "name": "Retail" + "name": "Retail Area" }, "landuse/vineyard": { "geometry": [ - "point", "area" ], "tags": { @@ -4905,6 +4996,21 @@ }, "name": "Marina" }, + "leisure/nature_reserve": { + "icon": "park", + "geometry": [ + "point", + "area" + ], + "tags": { + "leisure": "nature_reserve" + }, + "terms": [ + "protected", + "wildlife" + ], + "name": "Nature Reserve" + }, "leisure/park": { "icon": "park", "geometry": [ @@ -5495,6 +5601,21 @@ }, "name": "Beach" }, + "natural/cave_entrance": { + "geometry": [ + "point", + "area" + ], + "fields": [ + "fee", + "access_simple" + ], + "terms": [], + "tags": { + "natural": "cave_entrance" + }, + "name": "Cave Entrance" + }, "natural/cliff": { "geometry": [ "point", @@ -5625,7 +5746,8 @@ }, "natural/tree": { "fields": [ - "tree_type", + "leaf_type", + "leaf_cycle", "denotation" ], "icon": "park", @@ -5713,10 +5835,11 @@ "name": "Wetland" }, "natural/wood": { - "fields": [ - "wood" - ], "icon": "park2", + "fields": [ + "leaf_type", + "leaf_cycle" + ], "geometry": [ "point", "area" @@ -5724,7 +5847,9 @@ "tags": { "natural": "wood" }, - "terms": [], + "terms": [ + "tree" + ], "name": "Wood" }, "office": { @@ -6360,6 +6485,7 @@ }, "power/sub_station": { "fields": [ + "substation", "operator", "building" ], @@ -6375,6 +6501,7 @@ }, "power/substation": { "fields": [ + "substation", "operator", "building" ], @@ -7754,6 +7881,27 @@ }, "name": "Hifi Store" }, + "shop/houseware": { + "icon": "shop", + "fields": [ + "operator", + "address", + "building_area", + "opening_hours" + ], + "geometry": [ + "point", + "area" + ], + "terms": [ + "home", + "household" + ], + "tags": { + "shop": "houseware" + }, + "name": "Houseware Store" + }, "shop/interior_decoration": { "icon": "shop", "fields": [ @@ -13657,6 +13805,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13679,6 +13829,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13701,6 +13853,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13723,6 +13877,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13744,6 +13900,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13766,6 +13924,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13787,6 +13947,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13809,6 +13971,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13831,6 +13995,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13852,6 +14018,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13873,6 +14041,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13894,6 +14064,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13915,6 +14087,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13937,6 +14111,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13958,6 +14134,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -13979,6 +14157,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14001,6 +14181,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14022,6 +14204,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14043,6 +14227,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14064,6 +14250,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14085,6 +14273,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14106,6 +14296,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14127,6 +14319,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14148,6 +14342,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14169,6 +14365,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14190,6 +14388,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14212,6 +14412,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14233,6 +14435,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14254,6 +14458,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14275,6 +14481,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14296,6 +14504,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14317,6 +14527,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14339,6 +14551,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14361,6 +14575,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14382,6 +14598,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14404,6 +14622,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14425,6 +14645,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14446,6 +14668,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14468,6 +14692,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14489,6 +14715,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14510,6 +14738,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14531,6 +14761,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14553,6 +14785,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14574,6 +14808,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14595,6 +14831,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14617,6 +14855,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14640,6 +14880,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14661,6 +14903,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14682,6 +14926,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14703,6 +14949,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14724,6 +14972,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14745,6 +14995,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14768,6 +15020,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14789,6 +15043,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14810,6 +15066,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14832,6 +15090,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14853,6 +15113,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14874,6 +15136,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14895,6 +15159,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14916,6 +15182,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14937,6 +15205,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14959,6 +15229,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -14980,6 +15252,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15001,6 +15275,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15022,6 +15298,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15043,6 +15321,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15064,6 +15344,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15085,6 +15367,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15106,6 +15390,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15128,6 +15414,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15149,6 +15437,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15170,6 +15460,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15191,6 +15483,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15213,6 +15507,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15235,6 +15531,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15256,6 +15554,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15277,6 +15577,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15298,6 +15600,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15319,6 +15623,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15340,6 +15646,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15361,6 +15669,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15382,6 +15692,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15403,6 +15715,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15424,6 +15738,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15445,6 +15761,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15466,6 +15784,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15487,6 +15807,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15508,6 +15830,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15529,6 +15853,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15550,6 +15876,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15571,6 +15899,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15592,6 +15922,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15613,6 +15945,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15634,6 +15968,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15655,6 +15991,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15676,6 +16014,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15697,6 +16037,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15718,6 +16060,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15739,6 +16083,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15760,6 +16106,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15781,6 +16129,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15802,6 +16152,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15823,6 +16175,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15844,6 +16198,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15865,6 +16221,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15886,6 +16244,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15907,6 +16267,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15928,6 +16290,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15949,6 +16313,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15970,6 +16336,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -15991,6 +16359,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16012,6 +16382,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16033,6 +16405,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16054,6 +16428,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16075,6 +16451,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16096,6 +16474,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16117,6 +16497,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16138,6 +16520,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16159,6 +16543,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16180,6 +16566,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16201,6 +16589,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16222,6 +16612,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16243,6 +16635,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16264,6 +16658,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16285,6 +16681,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16306,6 +16704,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16327,6 +16727,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16348,6 +16750,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16369,6 +16773,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16390,6 +16796,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16411,6 +16819,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16432,6 +16842,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16453,6 +16865,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16474,6 +16888,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16495,6 +16911,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16516,6 +16934,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16537,6 +16957,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16558,6 +16980,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16579,6 +17003,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16600,6 +17026,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16621,6 +17049,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16642,6 +17072,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16663,6 +17095,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16684,6 +17118,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16705,6 +17141,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16726,6 +17164,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16747,6 +17187,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16768,6 +17210,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16789,6 +17233,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16810,6 +17256,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16831,6 +17279,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16852,6 +17302,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16873,6 +17325,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16894,6 +17348,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16915,6 +17371,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16936,6 +17394,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16957,6 +17417,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16978,6 +17440,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -16999,6 +17463,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17020,6 +17486,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17041,6 +17509,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17062,6 +17532,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17083,6 +17555,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17104,6 +17578,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17125,6 +17601,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17146,6 +17624,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17167,6 +17647,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17188,6 +17670,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17209,6 +17693,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17230,6 +17716,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17251,6 +17739,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17272,6 +17762,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17293,6 +17785,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17314,6 +17808,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17335,6 +17831,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17356,6 +17854,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17377,6 +17877,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17398,6 +17900,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17419,6 +17923,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17440,6 +17946,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17462,6 +17970,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17483,6 +17993,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17504,6 +18016,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17525,6 +18039,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17546,6 +18062,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17567,6 +18085,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17588,6 +18108,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17609,6 +18131,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17630,6 +18154,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17651,6 +18177,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17672,6 +18200,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17693,6 +18223,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17714,6 +18246,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17735,6 +18269,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17756,6 +18292,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17777,6 +18315,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17798,6 +18338,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17819,6 +18361,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17840,6 +18384,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17861,6 +18407,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17882,6 +18430,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true @@ -17903,6 +18453,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "suggestion": true diff --git a/data/presets/presets/amenity/bicycle_repair_station.json b/data/presets/presets/amenity/bicycle_repair_station.json new file mode 100644 index 000000000..91c51a608 --- /dev/null +++ b/data/presets/presets/amenity/bicycle_repair_station.json @@ -0,0 +1,23 @@ +{ + "icon": "bicycle", + "fields": [ + "operator", + "brand", + "opening_hours", + "fee", + "service/bicycle/chaintool", + "service/bicycle/pump" + ], + "geometry": [ + "point", + "vertex", + "area" + ], + "terms": [ + "bike" + ], + "tags": { + "amenity": "bicycle_repair_station" + }, + "name": "Bicycle Repair Station" +} diff --git a/data/presets/presets/amenity/fast_food.json b/data/presets/presets/amenity/fast_food.json index a73c2c112..c2c26b4f5 100644 --- a/data/presets/presets/amenity/fast_food.json +++ b/data/presets/presets/amenity/fast_food.json @@ -6,6 +6,8 @@ "address", "building_area", "opening_hours", + "takeaway", + "delivery", "smoking" ], "geometry": [ diff --git a/data/presets/presets/amenity/grit_bin.json b/data/presets/presets/amenity/grit_bin.json new file mode 100644 index 000000000..4ef5f12f2 --- /dev/null +++ b/data/presets/presets/amenity/grit_bin.json @@ -0,0 +1,17 @@ +{ + "fields": [ + "access_simple" + ], + "geometry": [ + "point", + "vertex" + ], + "tags": { + "amenity": "grit_bin" + }, + "terms": [ + "salt", + "sand" + ], + "name": "Grit Bin" +} diff --git a/data/presets/presets/amenity/public_bookcase.json b/data/presets/presets/amenity/public_bookcase.json new file mode 100644 index 000000000..f15c6c9b5 --- /dev/null +++ b/data/presets/presets/amenity/public_bookcase.json @@ -0,0 +1,21 @@ +{ + "icon": "library", + "fields": [ + "name", + "operator", + "capacity", + "website" + ], + "geometry": [ + "point", + "area" + ], + "terms": [ + "library", + "bookcrossing" + ], + "tags": { + "amenity": "public_bookcase" + }, + "name": "Public Bookcase" +} diff --git a/data/presets/presets/amenity/register_office.json b/data/presets/presets/amenity/register_office.json new file mode 100644 index 000000000..5719531e2 --- /dev/null +++ b/data/presets/presets/amenity/register_office.json @@ -0,0 +1,19 @@ +{ + "icon": "town-hall", + "fields": [ + "address", + "building_area", + "opening_hours", + "operator" + ], + "geometry": [ + "point", + "area" + ], + "terms": [ + ], + "tags": { + "amenity": "register_office" + }, + "name": "Register Office" +} diff --git a/data/presets/presets/amenity/restaurant.json b/data/presets/presets/amenity/restaurant.json index e643665fb..87be53bf6 100644 --- a/data/presets/presets/amenity/restaurant.json +++ b/data/presets/presets/amenity/restaurant.json @@ -6,6 +6,8 @@ "building_area", "opening_hours", "capacity", + "takeaway", + "delivery", "smoking" ], "geometry": [ diff --git a/data/presets/presets/amenity/social_facility/group_home.json b/data/presets/presets/amenity/social_facility/group_home.json index 4bb14e9aa..ccf07da2a 100644 --- a/data/presets/presets/amenity/social_facility/group_home.json +++ b/data/presets/presets/amenity/social_facility/group_home.json @@ -19,7 +19,7 @@ "tags": { "amenity": "social_facility", "social_facility": "group_home", - "social_facility_for": "senior" + "social_facility:for": "senior" }, "name": "Elderly Group Home" } diff --git a/data/presets/presets/amenity/toilets.json b/data/presets/presets/amenity/toilets.json index 756bd8a85..4e92698b8 100644 --- a/data/presets/presets/amenity/toilets.json +++ b/data/presets/presets/amenity/toilets.json @@ -4,7 +4,8 @@ "toilets/disposal", "operator", "building_area", - "access_toilets" + "access_toilets", + "gender" ], "geometry": [ "point", diff --git a/data/presets/presets/building/commercial.json b/data/presets/presets/building/commercial.json index ced3c7a50..1290bc445 100644 --- a/data/presets/presets/building/commercial.json +++ b/data/presets/presets/building/commercial.json @@ -2,6 +2,7 @@ "icon": "commercial", "fields": [ "address", + "levels", "smoking" ], "geometry": [ diff --git a/data/presets/presets/junction.json b/data/presets/presets/junction.json new file mode 100644 index 000000000..5c4c12918 --- /dev/null +++ b/data/presets/presets/junction.json @@ -0,0 +1,10 @@ +{ + "geometry": [ + "vertex", + "area" + ], + "tags": { + "junction": "yes" + }, + "name": "Junction" +} diff --git a/data/presets/presets/landuse/allotments.json b/data/presets/presets/landuse/allotments.json index 51e6768db..3fe01c238 100644 --- a/data/presets/presets/landuse/allotments.json +++ b/data/presets/presets/landuse/allotments.json @@ -1,6 +1,5 @@ { "geometry": [ - "point", "area" ], "tags": { @@ -8,4 +7,4 @@ }, "terms": [], "name": "Allotments" -} \ No newline at end of file +} diff --git a/data/presets/presets/landuse/basin.json b/data/presets/presets/landuse/basin.json index a7602808f..8e1895a33 100644 --- a/data/presets/presets/landuse/basin.json +++ b/data/presets/presets/landuse/basin.json @@ -1,6 +1,5 @@ { "geometry": [ - "point", "area" ], "tags": { @@ -8,4 +7,4 @@ }, "terms": [], "name": "Basin" -} \ No newline at end of file +} diff --git a/data/presets/presets/landuse/cemetery.json b/data/presets/presets/landuse/cemetery.json index f41808f27..3ac95a358 100644 --- a/data/presets/presets/landuse/cemetery.json +++ b/data/presets/presets/landuse/cemetery.json @@ -5,8 +5,6 @@ "denomination" ], "geometry": [ - "point", - "vertex", "area" ], "tags": { diff --git a/data/presets/presets/landuse/commercial.json b/data/presets/presets/landuse/commercial.json index d7610d78e..45592cce2 100644 --- a/data/presets/presets/landuse/commercial.json +++ b/data/presets/presets/landuse/commercial.json @@ -1,12 +1,11 @@ { "icon": "commercial", "geometry": [ - "point", "area" ], "tags": { "landuse": "commercial" }, "terms": [], - "name": "Commercial" -} \ No newline at end of file + "name": "Commercial Area" +} diff --git a/data/presets/presets/landuse/construction.json b/data/presets/presets/landuse/construction.json index b1cfbaac6..899b70383 100644 --- a/data/presets/presets/landuse/construction.json +++ b/data/presets/presets/landuse/construction.json @@ -4,7 +4,6 @@ "operator" ], "geometry": [ - "point", "area" ], "tags": { @@ -12,4 +11,4 @@ }, "terms": [], "name": "Construction" -} \ No newline at end of file +} diff --git a/data/presets/presets/landuse/farm.json b/data/presets/presets/landuse/farm.json index b27292562..96e63edfc 100644 --- a/data/presets/presets/landuse/farm.json +++ b/data/presets/presets/landuse/farm.json @@ -1,4 +1,5 @@ { + "icon": "farm", "fields": [ "crop" ], @@ -10,6 +11,6 @@ "landuse": "farm" }, "terms": [], - "name": "Farm", - "icon": "farm" + "name": "Farmland", + "searchable": false } diff --git a/data/presets/presets/landuse/farmland.json b/data/presets/presets/landuse/farmland.json index 9e92de83d..6c13c415f 100644 --- a/data/presets/presets/landuse/farmland.json +++ b/data/presets/presets/landuse/farmland.json @@ -1,16 +1,14 @@ { + "icon": "farm", "fields": [ "crop" ], "geometry": [ - "point", "area" ], "tags": { "landuse": "farmland" }, "terms": [], - "name": "Farmland", - "icon": "farm", - "searchable": false + "name": "Farmland" } diff --git a/data/presets/presets/landuse/farmyard.json b/data/presets/presets/landuse/farmyard.json index 1d6e93d15..5b2b4b714 100644 --- a/data/presets/presets/landuse/farmyard.json +++ b/data/presets/presets/landuse/farmyard.json @@ -1,15 +1,14 @@ { + "icon": "farm", "fields": [ "crop" ], "geometry": [ - "point", "area" ], "tags": { "landuse": "farmyard" }, "terms": [], - "name": "Farmyard", - "icon": "farm" + "name": "Farmyard" } diff --git a/data/presets/presets/landuse/forest.json b/data/presets/presets/landuse/forest.json index 8c6af66e1..9c0dd25e4 100644 --- a/data/presets/presets/landuse/forest.json +++ b/data/presets/presets/landuse/forest.json @@ -1,15 +1,17 @@ { - "fields": [ - "wood" - ], "icon": "park2", + "fields": [ + "leaf_type", + "leaf_cycle" + ], "geometry": [ - "point", "area" ], "tags": { "landuse": "forest" }, - "terms": [], + "terms": [ + "tree" + ], "name": "Forest" -} \ No newline at end of file +} diff --git a/data/presets/presets/landuse/garages.json b/data/presets/presets/landuse/garages.json new file mode 100644 index 000000000..c9328b015 --- /dev/null +++ b/data/presets/presets/landuse/garages.json @@ -0,0 +1,10 @@ +{ + "geometry": [ + "area" + ], + "tags": { + "landuse": "garages" + }, + "terms": [], + "name": "Garages" +} diff --git a/data/presets/presets/landuse/grass.json b/data/presets/presets/landuse/grass.json index 35d46fbb2..8d1fdfa80 100644 --- a/data/presets/presets/landuse/grass.json +++ b/data/presets/presets/landuse/grass.json @@ -1,6 +1,5 @@ { "geometry": [ - "point", "area" ], "tags": { @@ -8,4 +7,4 @@ }, "terms": [], "name": "Grass" -} \ No newline at end of file +} diff --git a/data/presets/presets/landuse/industrial.json b/data/presets/presets/landuse/industrial.json index d55844e3e..b92c3e507 100644 --- a/data/presets/presets/landuse/industrial.json +++ b/data/presets/presets/landuse/industrial.json @@ -1,12 +1,11 @@ { "icon": "industrial", "geometry": [ - "point", "area" ], "tags": { "landuse": "industrial" }, "terms": [], - "name": "Industrial" -} \ No newline at end of file + "name": "Industrial Area" +} diff --git a/data/presets/presets/landuse/meadow.json b/data/presets/presets/landuse/meadow.json index eba4bfec1..3de68e377 100644 --- a/data/presets/presets/landuse/meadow.json +++ b/data/presets/presets/landuse/meadow.json @@ -1,6 +1,5 @@ { "geometry": [ - "point", "area" ], "tags": { @@ -8,4 +7,4 @@ }, "terms": [], "name": "Meadow" -} \ No newline at end of file +} diff --git a/data/presets/presets/landuse/military.json b/data/presets/presets/landuse/military.json index e3937f1dc..132ca89c0 100644 --- a/data/presets/presets/landuse/military.json +++ b/data/presets/presets/landuse/military.json @@ -6,5 +6,5 @@ "landuse": "military" }, "terms": [], - "name": "Military" -} \ No newline at end of file + "name": "Military Area" +} diff --git a/data/presets/presets/landuse/orchard.json b/data/presets/presets/landuse/orchard.json index ca6cb0ebd..e2f15af79 100644 --- a/data/presets/presets/landuse/orchard.json +++ b/data/presets/presets/landuse/orchard.json @@ -1,15 +1,14 @@ { + "icon": "park2", "fields": [ "trees" ], "geometry": [ - "point", "area" ], "tags": { "landuse": "orchard" }, "terms": [], - "name": "Orchard", - "icon": "park2" + "name": "Orchard" } diff --git a/data/presets/presets/landuse/quarry.json b/data/presets/presets/landuse/quarry.json index aee2bc306..d58c0deda 100644 --- a/data/presets/presets/landuse/quarry.json +++ b/data/presets/presets/landuse/quarry.json @@ -1,6 +1,5 @@ { "geometry": [ - "point", "area" ], "tags": { @@ -8,4 +7,4 @@ }, "terms": [], "name": "Quarry" -} \ No newline at end of file +} diff --git a/data/presets/presets/landuse/residential.json b/data/presets/presets/landuse/residential.json index ef0b5e31a..4048c3200 100644 --- a/data/presets/presets/landuse/residential.json +++ b/data/presets/presets/landuse/residential.json @@ -1,12 +1,11 @@ { "icon": "building", "geometry": [ - "point", "area" ], "tags": { "landuse": "residential" }, "terms": [], - "name": "Residential" -} \ No newline at end of file + "name": "Residential Area" +} diff --git a/data/presets/presets/landuse/retail.json b/data/presets/presets/landuse/retail.json index a0e25082b..feb32ca11 100644 --- a/data/presets/presets/landuse/retail.json +++ b/data/presets/presets/landuse/retail.json @@ -1,11 +1,10 @@ { "icon": "shop", "geometry": [ - "point", "area" ], "tags": { "landuse": "retail" }, - "name": "Retail" -} \ No newline at end of file + "name": "Retail Area" +} diff --git a/data/presets/presets/landuse/vineyard.json b/data/presets/presets/landuse/vineyard.json index 08f813bca..47bdef728 100644 --- a/data/presets/presets/landuse/vineyard.json +++ b/data/presets/presets/landuse/vineyard.json @@ -1,6 +1,5 @@ { "geometry": [ - "point", "area" ], "tags": { @@ -8,4 +7,4 @@ }, "terms": [], "name": "Vineyard" -} \ No newline at end of file +} diff --git a/data/presets/presets/leisure/nature_reserve.json b/data/presets/presets/leisure/nature_reserve.json new file mode 100644 index 000000000..e4a178b70 --- /dev/null +++ b/data/presets/presets/leisure/nature_reserve.json @@ -0,0 +1,15 @@ +{ + "icon": "park", + "geometry": [ + "point", + "area" + ], + "tags": { + "leisure": "nature_reserve" + }, + "terms": [ + "protected", + "wildlife" + ], + "name": "Nature Reserve" +} diff --git a/data/presets/presets/natural/cave_entrance.json b/data/presets/presets/natural/cave_entrance.json new file mode 100644 index 000000000..b40351239 --- /dev/null +++ b/data/presets/presets/natural/cave_entrance.json @@ -0,0 +1,15 @@ +{ + "geometry": [ + "point", + "area" + ], + "fields": [ + "fee", + "access_simple" + ], + "terms": [], + "tags": { + "natural": "cave_entrance" + }, + "name": "Cave Entrance" +} \ No newline at end of file diff --git a/data/presets/presets/natural/tree.json b/data/presets/presets/natural/tree.json index 29337059b..218a3fe44 100644 --- a/data/presets/presets/natural/tree.json +++ b/data/presets/presets/natural/tree.json @@ -1,6 +1,7 @@ { "fields": [ - "tree_type", + "leaf_type", + "leaf_cycle", "denotation" ], "icon": "park", diff --git a/data/presets/presets/natural/wood.json b/data/presets/presets/natural/wood.json index e4afa1ad8..f8ab42d78 100644 --- a/data/presets/presets/natural/wood.json +++ b/data/presets/presets/natural/wood.json @@ -1,8 +1,9 @@ { - "fields": [ - "wood" - ], "icon": "park2", + "fields": [ + "leaf_type", + "leaf_cycle" + ], "geometry": [ "point", "area" @@ -10,6 +11,8 @@ "tags": { "natural": "wood" }, - "terms": [], + "terms": [ + "tree" + ], "name": "Wood" -} \ No newline at end of file +} diff --git a/data/presets/presets/power/sub_station.json b/data/presets/presets/power/sub_station.json index 08c0c38b0..21cc29c86 100644 --- a/data/presets/presets/power/sub_station.json +++ b/data/presets/presets/power/sub_station.json @@ -1,5 +1,6 @@ { "fields": [ + "substation", "operator", "building" ], diff --git a/data/presets/presets/power/substation.json b/data/presets/presets/power/substation.json index b7559051f..6cf9593ef 100644 --- a/data/presets/presets/power/substation.json +++ b/data/presets/presets/power/substation.json @@ -1,5 +1,6 @@ { "fields": [ + "substation", "operator", "building" ], diff --git a/data/presets/presets/shop/houseware.json b/data/presets/presets/shop/houseware.json new file mode 100644 index 000000000..8bbb42d27 --- /dev/null +++ b/data/presets/presets/shop/houseware.json @@ -0,0 +1,21 @@ +{ + "icon": "shop", + "fields": [ + "operator", + "address", + "building_area", + "opening_hours" + ], + "geometry": [ + "point", + "area" + ], + "terms": [ + "home", + "household" + ], + "tags": { + "shop": "houseware" + }, + "name": "Houseware Store" +} diff --git a/data/taginfo.json b/data/taginfo.json index 28db82fc3..d9dc3b7b4 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -124,6 +124,10 @@ "key": "amenity", "value": "bicycle_rental" }, + { + "key": "amenity", + "value": "bicycle_repair_station" + }, { "key": "amenity", "value": "boat_rental" @@ -228,6 +232,10 @@ "key": "amenity", "value": "grave_yard" }, + { + "key": "amenity", + "value": "grit_bin" + }, { "key": "amenity", "value": "hospital" @@ -296,6 +304,10 @@ "key": "amenity", "value": "pub" }, + { + "key": "amenity", + "value": "public_bookcase" + }, { "key": "amenity", "value": "ranger_station" @@ -304,6 +316,10 @@ "key": "amenity", "value": "recycling" }, + { + "key": "amenity", + "value": "register_office" + }, { "key": "amenity", "value": "restaurant" @@ -325,7 +341,7 @@ "value": "food_bank" }, { - "key": "social_facility_for", + "key": "social_facility:for", "value": "senior" }, { @@ -1038,6 +1054,10 @@ "key": "historic", "value": "wayside_shrine" }, + { + "key": "junction", + "value": "yes" + }, { "key": "landuse" }, @@ -1081,6 +1101,10 @@ "key": "landuse", "value": "forest" }, + { + "key": "landuse", + "value": "garages" + }, { "key": "landuse", "value": "grass" @@ -1152,6 +1176,10 @@ "key": "leisure", "value": "marina" }, + { + "key": "leisure", + "value": "nature_reserve" + }, { "key": "leisure", "value": "park" @@ -1306,6 +1334,10 @@ "key": "natural", "value": "beach" }, + { + "key": "natural", + "value": "cave_entrance" + }, { "key": "natural", "value": "cliff" @@ -1828,6 +1860,10 @@ "key": "shop", "value": "hifi" }, + { + "key": "shop", + "value": "houseware" + }, { "key": "shop", "value": "interior_decoration" diff --git a/dist/locales/en.json b/dist/locales/en.json index c14ddf3dc..0e6785614 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -702,6 +702,9 @@ "boundary": { "label": "Type" }, + "brand": { + "label": "Brand" + }, "building": { "label": "Building" }, @@ -764,6 +767,9 @@ "cuisine": { "label": "Cuisine" }, + "delivery": { + "label": "Delivery" + }, "denomination": { "label": "Denomination" }, @@ -847,6 +853,15 @@ "gauge": { "label": "Gauge" }, + "gender": { + "label": "Gender", + "placeholder": "Unknown", + "options": { + "male": "Male", + "female": "Female", + "unisex": "Unisex" + } + }, "generator/method": { "label": "Method" }, @@ -909,6 +924,25 @@ "layer": { "label": "Layer" }, + "leaf_cycle": { + "label": "Leaf Cycle", + "options": { + "evergreen": "Evergreen", + "deciduous": "Deciduous", + "semi_evergreen": "Semi-Evergreen", + "semi_deciduous": "Semi-Deciduous", + "mixed": "Mixed" + } + }, + "leaf_type": { + "label": "Leaf Type", + "options": { + "broadleaved": "Broadleaved", + "needleleaved": "Needleleaved", + "mixed": "Mixed", + "leafless": "Leafless" + } + }, "leisure": { "label": "Type" }, @@ -1130,6 +1164,22 @@ "service": { "label": "Type" }, + "service/bicycle/chaintool": { + "label": "Chain Tool", + "options": { + "undefined": "Assumed to be No", + "yes": "Yes", + "no": "No" + } + }, + "service/bicycle/pump": { + "label": "Air Pump", + "options": { + "undefined": "Assumed to be No", + "yes": "Yes", + "no": "No" + } + }, "shelter": { "label": "Shelter" }, @@ -1198,6 +1248,9 @@ "studio_type": { "label": "Type" }, + "substation": { + "label": "Type" + }, "supervised": { "label": "Supervised" }, @@ -1207,6 +1260,15 @@ "tactile_paving": { "label": "Tactile Paving" }, + "takeaway": { + "label": "Takeaway", + "placeholder": "Yes, No, Takeaway Only...", + "options": { + "yes": "Yes", + "no": "No", + "only": "Takeaway Only" + } + }, "toilets/disposal": { "label": "Disposal", "options": { @@ -1245,9 +1307,6 @@ "no": "No: pathless, excellent orientation skills required" } }, - "tree_type": { - "label": "Type" - }, "trees": { "label": "Trees" }, @@ -1278,9 +1337,6 @@ }, "wikipedia": { "label": "Wikipedia" - }, - "wood": { - "label": "Type" } }, "presets": { @@ -1400,6 +1456,10 @@ "name": "Bicycle Rental", "terms": "bike" }, + "amenity/bicycle_repair_station": { + "name": "Bicycle Repair Station", + "terms": "bike" + }, "amenity/boat_rental": { "name": "Boat Rental", "terms": "" @@ -1504,6 +1564,10 @@ "name": "Graveyard", "terms": "" }, + "amenity/grit_bin": { + "name": "Grit Bin", + "terms": "salt,sand" + }, "amenity/hospital": { "name": "Hospital Grounds", "terms": "clinic,doctor,emergency room,health service,hospice,infirmary,institution,nursing home,sanatorium,sanitarium,sick,surgery,ward" @@ -1572,6 +1636,10 @@ "name": "Pub", "terms": "dive,beer,bier,booze" }, + "amenity/public_bookcase": { + "name": "Public Bookcase", + "terms": "library,bookcrossing" + }, "amenity/ranger_station": { "name": "Ranger Station", "terms": "visitor center,visitor centre,permit center,permit centre,backcountry office,warden office,warden center" @@ -1580,6 +1648,10 @@ "name": "Recycling", "terms": "can,bottle,garbage,scrap,trash" }, + "amenity/register_office": { + "name": "Register Office", + "terms": "" + }, "amenity/restaurant": { "name": "Restaurant", "terms": "bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table" @@ -2320,6 +2392,10 @@ "name": "Wayside Shrine", "terms": "" }, + "junction": { + "name": "Junction", + "terms": "" + }, "landuse": { "name": "Landuse", "terms": "" @@ -2341,7 +2417,7 @@ "terms": "" }, "landuse/commercial": { - "name": "Commercial", + "name": "Commercial Area", "terms": "" }, "landuse/construction": { @@ -2349,7 +2425,7 @@ "terms": "" }, "landuse/farm": { - "name": "Farm", + "name": "Farmland", "terms": "" }, "landuse/farmland": { @@ -2362,6 +2438,10 @@ }, "landuse/forest": { "name": "Forest", + "terms": "tree" + }, + "landuse/garages": { + "name": "Garages", "terms": "" }, "landuse/grass": { @@ -2369,7 +2449,7 @@ "terms": "" }, "landuse/industrial": { - "name": "Industrial", + "name": "Industrial Area", "terms": "" }, "landuse/landfill": { @@ -2381,7 +2461,7 @@ "terms": "" }, "landuse/military": { - "name": "Military", + "name": "Military Area", "terms": "" }, "landuse/orchard": { @@ -2393,11 +2473,11 @@ "terms": "" }, "landuse/residential": { - "name": "Residential", + "name": "Residential Area", "terms": "" }, "landuse/retail": { - "name": "Retail", + "name": "Retail Area", "terms": "" }, "landuse/vineyard": { @@ -2436,6 +2516,10 @@ "name": "Marina", "terms": "boat" }, + "leisure/nature_reserve": { + "name": "Nature Reserve", + "terms": "protected,wildlife" + }, "leisure/park": { "name": "Park", "terms": "esplanade,estate,forest,garden,grass,green,grounds,lawn,lot,meadow,parkland,place,playground,plaza,pleasure garden,recreation area,square,tract,village green,woodland" @@ -2596,6 +2680,10 @@ "name": "Beach", "terms": "" }, + "natural/cave_entrance": { + "name": "Cave Entrance", + "terms": "" + }, "natural/cliff": { "name": "Cliff", "terms": "" @@ -2662,7 +2750,7 @@ }, "natural/wood": { "name": "Wood", - "terms": "" + "terms": "tree" }, "office": { "name": "Office", @@ -3132,6 +3220,10 @@ "name": "Hifi Store", "terms": "stereo,video" }, + "shop/houseware": { + "name": "Houseware Store", + "terms": "home,household" + }, "shop/interior_decoration": { "name": "Interior Decoration Store", "terms": "" diff --git a/index.html b/index.html index f9c75ac76..6bf9b4a51 100644 --- a/index.html +++ b/index.html @@ -148,6 +148,7 @@ + @@ -172,6 +173,7 @@ + @@ -179,6 +181,7 @@ + diff --git a/js/id/actions/copy_entity.js b/js/id/actions/copy_entity.js new file mode 100644 index 000000000..af4a9138a --- /dev/null +++ b/js/id/actions/copy_entity.js @@ -0,0 +1,19 @@ +iD.actions.CopyEntity = function(entity, deep) { + var newEntities = []; + + var action = function(graph) { + newEntities = entity.copy(deep, graph); + + for (var i = 0; i < newEntities.length; i++) { + graph = graph.replace(newEntities[i]); + } + + return graph; + }; + + action.newEntities = function() { + return newEntities; + }; + + return action; +}; diff --git a/js/id/behavior/copy.js b/js/id/behavior/copy.js new file mode 100644 index 000000000..cc4647708 --- /dev/null +++ b/js/id/behavior/copy.js @@ -0,0 +1,78 @@ +iD.behavior.Copy = function(context) { + var keybinding = d3.keybinding('copy'); + + function groupEntities(ids, graph) { + var entities = ids.map(function (id) { return graph.entity(id); }); + return _.extend({relation: [], way: [], node: []}, + _.groupBy(entities, function(entity) { return entity.type; })); + } + + function getDescendants(id, graph, descendants) { + var entity = graph.entity(id), + i, children; + + descendants = descendants || {}; + + if (entity.type === 'relation') { + children = _.pluck(entity.members, 'id'); + } else if (entity.type === 'way') { + children = entity.nodes; + } else { + children = []; + } + + for (i = 0; i < children.length; i++) { + if (!descendants[children[i]]) { + descendants[children[i]] = true; + descendants = getDescendants(children[i], graph, descendants); + } + } + + return descendants; + } + + function doCopy() { + d3.event.preventDefault(); + + var graph = context.graph(), + selected = groupEntities(context.selectedIDs(), graph), + canCopy = [], + skip = {}, + i, entity; + + for (i = 0; i < selected.relation.length; i++) { + entity = selected.relation[i]; + if (!skip[entity.id] && entity.isComplete(graph)) { + canCopy.push(entity.id); + skip = getDescendants(entity.id, graph, skip); + } + } + for (i = 0; i < selected.way.length; i++) { + entity = selected.way[i]; + if (!skip[entity.id]) { + canCopy.push(entity.id); + skip = getDescendants(entity.id, graph, skip); + } + } + for (i = 0; i < selected.node.length; i++) { + entity = selected.node[i]; + if (!skip[entity.id]) { + canCopy.push(entity.id); + } + } + + context.copiedIDs(canCopy); + } + + function copy() { + keybinding.on(iD.ui.cmd('⌘C'), doCopy); + d3.select(document).call(keybinding); + return copy; + } + + copy.off = function() { + d3.select(document).call(keybinding.off); + }; + + return copy; +}; diff --git a/js/id/behavior/paste.js b/js/id/behavior/paste.js new file mode 100644 index 000000000..92bf92d31 --- /dev/null +++ b/js/id/behavior/paste.js @@ -0,0 +1,75 @@ +iD.behavior.Paste = function(context) { + var keybinding = d3.keybinding('paste'); + + function omitTag(v, k) { + return ( + k === 'phone' || + k === 'fax' || + k === 'email' || + k === 'website' || + k === 'url' || + k === 'note' || + k === 'description' || + k.indexOf('name') !== -1 || + k.indexOf('wiki') === 0 || + k.indexOf('addr:') === 0 || + k.indexOf('contact:') === 0 + ); + } + + function doPaste() { + d3.event.preventDefault(); + + var mouse = context.mouse(), + projection = context.projection, + viewport = iD.geo.Extent(projection.clipExtent()).polygon(); + + if (!iD.geo.pointInPolygon(mouse, viewport)) return; + + var graph = context.graph(), + extent = iD.geo.Extent(), + oldIDs = context.copiedIDs(), + newIDs = [], + i, j; + + for (i = 0; i < oldIDs.length; i++) { + var oldEntity = graph.entity(oldIDs[i]), + action = iD.actions.CopyEntity(oldEntity, true), + newEntities; + + extent._extend(oldEntity.extent(graph)); + context.perform(action); + + // First element in `newEntities` contains the copied Entity, + // Subsequent array elements contain any descendants.. + newEntities = action.newEntities(); + newIDs.push(newEntities[0].id); + + for (j = 0; j < newEntities.length; j++) { + var newEntity = newEntities[j], + tags = _.omit(newEntity.tags, omitTag); + + context.perform(iD.actions.ChangeTags(newEntity.id, tags)); + } + } + + // Put pasted objects where mouse pointer is.. + var center = projection(extent.center()), + delta = [ mouse[0] - center[0], mouse[1] - center[1] ]; + + context.perform(iD.actions.Move(newIDs, delta, projection)); + context.enter(iD.modes.Move(context, newIDs)); + } + + function paste() { + keybinding.on(iD.ui.cmd('⌘V'), doPaste); + d3.select(document).call(keybinding); + return paste; + } + + paste.off = function() { + d3.select(document).call(keybinding.off); + }; + + return paste; +}; diff --git a/js/id/core/entity.js b/js/id/core/entity.js index 53a7ca17f..f4f52274c 100644 --- a/js/id/core/entity.js +++ b/js/id/core/entity.js @@ -44,7 +44,11 @@ iD.Entity.prototype = { var source = sources[i]; for (var prop in source) { if (Object.prototype.hasOwnProperty.call(source, prop)) { - this[prop] = source[prop]; + if (source[prop] === undefined) { + delete this[prop]; + } else { + this[prop] = source[prop]; + } } } } @@ -65,6 +69,12 @@ iD.Entity.prototype = { return this; }, + copy: function() { + // Returns an array so that we can support deep copying ways and relations. + // The first array element will contain this.copy, followed by any descendants. + return [iD.Entity(this, {id: undefined, user: undefined, version: undefined})]; + }, + osmId: function() { return iD.Entity.id.toOSM(this.id); }, diff --git a/js/id/core/relation.js b/js/id/core/relation.js index 038785b81..761db2a65 100644 --- a/js/id/core/relation.js +++ b/js/id/core/relation.js @@ -20,6 +20,34 @@ _.extend(iD.Relation.prototype, { type: 'relation', members: [], + copy: function(deep, resolver, replacements) { + var copy = iD.Entity.prototype.copy.call(this); + if (!deep || !resolver || !this.isComplete(resolver)) { + return copy; + } + + var members = [], + i, oldmember, oldid, newid, children; + + replacements = replacements || {}; + replacements[this.id] = copy[0].id; + + for (i = 0; i < this.members.length; i++) { + oldmember = this.members[i]; + oldid = oldmember.id; + newid = replacements[oldid]; + if (!newid) { + children = resolver.entity(oldid).copy(true, resolver, replacements); + newid = replacements[oldid] = children[0].id; + copy = copy.concat(children); + } + members.push({id: newid, type: oldmember.type, role: oldmember.role}); + } + + copy[0] = copy[0].update({members: members}); + return copy; + }, + extent: function(resolver, memo) { return resolver.transient(this, 'extent', function() { if (memo && memo[this.id]) return iD.geo.Extent(); diff --git a/js/id/core/way.js b/js/id/core/way.js index a1a9f88a8..7fad36eba 100644 --- a/js/id/core/way.js +++ b/js/id/core/way.js @@ -12,6 +12,32 @@ _.extend(iD.Way.prototype, { type: 'way', nodes: [], + copy: function(deep, resolver) { + var copy = iD.Entity.prototype.copy.call(this); + + if (!deep || !resolver) { + return copy; + } + + var nodes = [], + replacements = {}, + i, oldid, newid, child; + + for (i = 0; i < this.nodes.length; i++) { + oldid = this.nodes[i]; + newid = replacements[oldid]; + if (!newid) { + child = resolver.entity(oldid).copy(); + newid = replacements[oldid] = child[0].id; + copy = copy.concat(child); + } + nodes.push(newid); + } + + copy[0] = copy[0].update({nodes: nodes}); + return copy; + }, + extent: function(resolver) { return resolver.transient(this, 'extent', function() { var extent = iD.geo.Extent(); diff --git a/js/id/id.js b/js/id/id.js index 39f925215..1310999a7 100644 --- a/js/id/id.js +++ b/js/id/id.js @@ -220,6 +220,14 @@ window.iD = function () { context.surface().call(behavior.off); }; + /* Copy/Paste */ + var copiedIDs = []; + context.copiedIDs = function(_) { + if (!arguments.length) return copiedIDs; + copiedIDs = _; + return context; + }; + /* Projection */ context.projection = iD.geo.RawMercator(); diff --git a/js/id/modes/browse.js b/js/id/modes/browse.js index 1487fa832..9e33a1eb0 100644 --- a/js/id/modes/browse.js +++ b/js/id/modes/browse.js @@ -7,6 +7,7 @@ iD.modes.Browse = function(context) { }, sidebar; var behaviors = [ + iD.behavior.Paste(context), iD.behavior.Hover(context) .on('hover', context.ui().sidebar.hover), iD.behavior.Select(context), diff --git a/js/id/modes/select.js b/js/id/modes/select.js index 787a2eef0..45d1c42c0 100644 --- a/js/id/modes/select.js +++ b/js/id/modes/select.js @@ -7,6 +7,8 @@ iD.modes.Select = function(context, selectedIDs) { var keybinding = d3.keybinding('select'), timeout = null, behaviors = [ + iD.behavior.Copy(context), + iD.behavior.Paste(context), iD.behavior.Hover(context), iD.behavior.Select(context), iD.behavior.Lasso(context), @@ -21,26 +23,43 @@ iD.modes.Select = function(context, selectedIDs) { var wrap = context.container() .select('.inspector-wrap'); + function singular() { if (selectedIDs.length === 1) { return context.entity(selectedIDs[0]); } } - function positionMenu() { - var entity = singular(); + function closeMenu() { + if (radialMenu) { + context.surface().call(radialMenu.close); + } + } - if (entity && entity.type === 'node') { + function positionMenu() { + if (suppressMenu || !radialMenu) { return; } + + var entity = singular(); + if (entity && context.geometry(entity.id) === 'relation') { + suppressMenu = true; + } else if (entity && entity.type === 'node') { radialMenu.center(context.projection(entity.loc)); } else { - radialMenu.center(context.mouse()); + var point = context.mouse(), + viewport = iD.geo.Extent(context.projection.clipExtent()).polygon(); + if (iD.geo.pointInPolygon(point, viewport)) { + radialMenu.center(point); + } else { + suppressMenu = true; + } } } function showMenu() { - context.surface() - .call(radialMenu.close) - .call(radialMenu); + closeMenu(); + if (!suppressMenu && radialMenu) { + context.surface().call(radialMenu); + } } mode.selectedIDs = function() { @@ -70,51 +89,14 @@ iD.modes.Select = function(context, selectedIDs) { }; mode.enter = function() { - behaviors.forEach(function(behavior) { - context.install(behavior); - }); - - var operations = _.without(d3.values(iD.operations), iD.operations.Delete) - .map(function(o) { return o(selectedIDs, context); }) - .filter(function(o) { return o.available(); }); - operations.unshift(iD.operations.Delete(selectedIDs, context)); - - keybinding.on('⎋', function() { - context.enter(iD.modes.Browse(context)); - }, true); - - operations.forEach(function(operation) { - operation.keys.forEach(function(key) { - keybinding.on(key, function() { - if (!operation.disabled()) { - operation(); - } - }); - }); - }); - - radialMenu = iD.ui.RadialMenu(context, operations); - - context.ui().sidebar - .select(singular() ? singular().id : null, newFeature); - - context.history() - .on('undone.select', update) - .on('redone.select', update); - function update() { - context.surface().call(radialMenu.close); - + closeMenu(); if (_.any(selectedIDs, function(id) { return !context.hasEntity(id); })) { // Exit mode if selected entity gets undone context.enter(iD.modes.Browse(context)); } } - context.map().on('move.select', function() { - context.surface().call(radialMenu.close); - }); - function dblclick() { var target = d3.select(d3.event.target), datum = target.datum(); @@ -135,23 +117,67 @@ iD.modes.Select = function(context, selectedIDs) { } } - d3.select(document) - .call(keybinding); + function selectElements(drawn) { + var entity = singular(); + if (entity && context.geometry(entity.id) === 'relation') { + suppressMenu = true; + return; + } - function selectElements() { var selection = context.surface() .selectAll(iD.util.entityOrMemberSelector(selectedIDs, context.graph())); if (selection.empty()) { - // Exit mode if selected DOM elements have disappeared.. - context.enter(iD.modes.Browse(context)); + if (drawn) { // Exit mode if selected DOM elements have disappeared.. + context.enter(iD.modes.Browse(context)); + } } else { selection .classed('selected', true); } } - context.map().on('drawn.select', selectElements); + + behaviors.forEach(function(behavior) { + context.install(behavior); + }); + + var operations = _.without(d3.values(iD.operations), iD.operations.Delete) + .map(function(o) { return o(selectedIDs, context); }) + .filter(function(o) { return o.available(); }); + + operations.unshift(iD.operations.Delete(selectedIDs, context)); + + keybinding.on('⎋', function() { + context.enter(iD.modes.Browse(context)); + }, true); + + operations.forEach(function(operation) { + operation.keys.forEach(function(key) { + keybinding.on(key, function() { + if (!operation.disabled()) { + operation(); + } + }); + }); + }); + + d3.select(document) + .call(keybinding); + + radialMenu = iD.ui.RadialMenu(context, operations); + + context.ui().sidebar + .select(singular() ? singular().id : null, newFeature); + + context.history() + .on('undone.select', update) + .on('redone.select', update); + + context.map() + .on('move.select', closeMenu) + .on('drawn.select', selectElements); + selectElements(); var show = d3.event && !suppressMenu; @@ -185,13 +211,14 @@ iD.modes.Select = function(context, selectedIDs) { }); keybinding.off(); + closeMenu(); + radialMenu = undefined; context.history() .on('undone.select', null) .on('redone.select', null); context.surface() - .call(radialMenu.close) .on('dblclick.select', null) .selectAll('.selected') .classed('selected', false); diff --git a/js/id/renderer/map.js b/js/id/renderer/map.js index f6389e6d9..8532bde71 100644 --- a/js/id/renderer/map.js +++ b/js/id/renderer/map.js @@ -138,14 +138,8 @@ iD.Map = function(context) { } function editOff() { - var mode = context.mode(); - context.features().resetStats(); surface.selectAll('.layer *').remove(); - if (!(mode && mode.id === 'browse')) { - context.enter(iD.modes.Browse(context)); - } - dispatch.drawn({full: true}); } @@ -332,6 +326,13 @@ iD.Map = function(context) { return Math.max(Math.log(projection.scale() * 2 * Math.PI) / Math.LN2 - 8, 0); } + if (z < minzoom) { + iD.ui.flash(context.container()) + .select('.content') + .text(t('cannot_zoom')); + z = context.minEditableZoom(); + } + if (setZoom(z)) { dispatch.move(map); } diff --git a/js/id/ui.js b/js/id/ui.js index 23acc2649..1513488a4 100644 --- a/js/id/ui.js +++ b/js/id/ui.js @@ -54,10 +54,6 @@ iD.ui = function(context) { .attr('class', 'spinner') .call(iD.ui.Spinner(context)); - content.append('div') - .style('display', 'none') - .attr('class', 'help-wrap map-overlay fillL col5 content'); - var controls = bar.append('div') .attr('class', 'map-controls'); diff --git a/js/id/ui/background.js b/js/id/ui/background.js index b9fc8eedf..fa34aceec 100644 --- a/js/id/ui/background.js +++ b/js/id/ui/background.js @@ -139,13 +139,6 @@ iD.ui.Background = function(context) { } } - var content = selection.append('div') - .attr('class', 'fillL map-overlay col3 content hide'), - tooltip = bootstrap.tooltip() - .placement('left') - .html(true) - .title(iD.ui.tooltipHtml(t('background.description'), key)); - function hide() { setVisible(false); } function toggle() { @@ -182,18 +175,26 @@ iD.ui.Background = function(context) { } } - var button = selection.append('button') + + var content = selection.append('div') + .attr('class', 'fillL map-overlay col3 content hide'), + tooltip = bootstrap.tooltip() + .placement('left') + .html(true) + .title(iD.ui.tooltipHtml(t('background.description'), key)), + button = selection.append('button') .attr('tabindex', -1) .on('click', toggle) .call(tooltip), - opa = content - .append('div') - .attr('class', 'opacity-options-wrapper'), shown = false; button.append('span') .attr('class', 'icon layers light'); + + var opa = content.append('div') + .attr('class', 'opacity-options-wrapper'); + opa.append('h4') .text(t('background.title')); diff --git a/js/id/ui/help.js b/js/id/ui/help.js index 820318925..d7ec5799d 100644 --- a/js/id/ui/help.js +++ b/js/id/ui/help.js @@ -21,7 +21,6 @@ iD.ui.Help = function(context) { }); function help(selection) { - var shown = false; function hide() { setVisible(false); @@ -37,7 +36,11 @@ iD.ui.Help = function(context) { if (show !== shown) { button.classed('active', show); shown = show; + if (show) { + selection.on('mousedown.help-inside', function() { + return d3.event.stopPropagation(); + }); pane.style('display', 'block') .style('right', '-500px') .transition() @@ -51,6 +54,7 @@ iD.ui.Help = function(context) { .each('end', function() { d3.select(this).style('display', 'none'); }); + selection.on('mousedown.help-inside', null); } } } @@ -92,21 +96,22 @@ iD.ui.Help = function(context) { setVisible(false); } - var tooltip = bootstrap.tooltip() - .placement('left') - .html(true) - .title(iD.ui.tooltipHtml(t('help.title'), key)); - var button = selection.append('button') - .attr('tabindex', -1) - .on('click', toggle) - .call(tooltip); + var pane = selection.append('div') + .attr('class', 'help-wrap map-overlay fillL col5 content hide'), + tooltip = bootstrap.tooltip() + .placement('left') + .html(true) + .title(iD.ui.tooltipHtml(t('help.title'), key)), + button = selection.append('button') + .attr('tabindex', -1) + .on('click', toggle) + .call(tooltip), + shown = false; button.append('span') .attr('class', 'icon help light'); - var pane = context.container() - .select('.help-wrap'); var toc = pane.append('ul') .attr('class', 'toc'); @@ -148,12 +153,7 @@ iD.ui.Help = function(context) { .call(keybinding); context.surface().on('mousedown.help-outside', hide); - context.container().on('mousedown.b.help-outside', hide); - - pane.on('mousedown.help-inside', function() { - return d3.event.stopPropagation(); - }); - + context.container().on('mousedown.help-outside', hide); } return help; diff --git a/js/id/ui/map_data.js b/js/id/ui/map_data.js index a5cc8584a..d5f282af0 100644 --- a/js/id/ui/map_data.js +++ b/js/id/ui/map_data.js @@ -116,13 +116,6 @@ iD.ui.MapData = function(context) { .property('checked', showsMapillary); } - var content = selection.append('div') - .attr('class', 'fillL map-overlay col3 content hide'), - tooltip = bootstrap.tooltip() - .placement('left') - .html(true) - .title(iD.ui.tooltipHtml(t('map_data.description'), key)); - function hidePanel() { setVisible(false); } function togglePanel() { @@ -167,7 +160,14 @@ iD.ui.MapData = function(context) { } } - var button = selection.append('button') + + var content = selection.append('div') + .attr('class', 'fillL map-overlay col3 content hide'), + tooltip = bootstrap.tooltip() + .placement('left') + .html(true) + .title(iD.ui.tooltipHtml(t('map_data.description'), key)), + button = selection.append('button') .attr('tabindex', -1) .on('click', togglePanel) .call(tooltip), diff --git a/js/id/ui/raw_tag_editor.js b/js/id/ui/raw_tag_editor.js index 8bacb7b89..f6b8224f1 100644 --- a/js/id/ui/raw_tag_editor.js +++ b/js/id/ui/raw_tag_editor.js @@ -192,6 +192,7 @@ iD.ui.RawTagEditor = function(context) { var tag = {}; tag[d.key] = undefined; event.change(tag); + d3.select(this.parentNode).remove(); } function addTag() { diff --git a/test/index.html b/test/index.html index d2d4fa359..7643c1bc5 100644 --- a/test/index.html +++ b/test/index.html @@ -127,6 +127,7 @@ + @@ -151,6 +152,7 @@ + @@ -158,6 +160,7 @@ + @@ -228,6 +231,7 @@ + diff --git a/test/index_packaged.html b/test/index_packaged.html index 681c741d9..fe590c099 100644 --- a/test/index_packaged.html +++ b/test/index_packaged.html @@ -36,6 +36,7 @@ + diff --git a/test/spec/actions/copy_entity.js b/test/spec/actions/copy_entity.js new file mode 100644 index 000000000..14f2de0fb --- /dev/null +++ b/test/spec/actions/copy_entity.js @@ -0,0 +1,76 @@ +describe("iD.actions.CopyEntity", function () { + it("copies a Node and adds it to the graph", function () { + var a = iD.Node({id: 'a'}), + base = iD.Graph([a]), + head = iD.actions.CopyEntity(a)(base), + diff = iD.Difference(base, head), + created = diff.created(); + + expect(head.hasEntity('a')).to.be.ok; + expect(created).to.have.length(1); + expect(created[0]).to.be.an.instanceof(iD.Node); + }); + + it("shallow copies a Way and adds it to the graph", function () { + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + w = iD.Way({id: 'w', nodes: ['a', 'b']}), + base = iD.Graph([a, b, w]), + head = iD.actions.CopyEntity(w)(base), + diff = iD.Difference(base, head), + created = diff.created(); + + expect(head.hasEntity('w')).to.be.ok; + expect(created).to.have.length(1); + expect(created[0]).to.be.an.instanceof(iD.Way); + }); + + it("deep copies a Way and child Nodes and adds them to the graph", function () { + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + w = iD.Way({id: 'w', nodes: ['a', 'b']}), + base = iD.Graph([a, b, w]), + head = iD.actions.CopyEntity(w, true)(base), + diff = iD.Difference(base, head), + created = diff.created(); + + expect(head.hasEntity('w')).to.be.ok; + expect(created).to.have.length(3); + expect(created[0]).to.be.an.instanceof(iD.Way); + expect(created[1]).to.be.an.instanceof(iD.Node); + expect(created[2]).to.be.an.instanceof(iD.Node); + }); + + it("shallow copies a Relation and adds it to the graph", function () { + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + w = iD.Way({id: 'w', nodes: ['a', 'b']}), + r = iD.Relation({id: 'r', members: [{id: 'w'}]}), + base = iD.Graph([a, b, w, r]), + head = iD.actions.CopyEntity(r)(base), + diff = iD.Difference(base, head), + created = diff.created(); + + expect(head.hasEntity('r')).to.be.ok; + expect(created).to.have.length(1); + expect(created[0]).to.be.an.instanceof(iD.Relation); + }); + + it("deep copies a Relation, member Ways, and child Nodes and adds them to the graph", function () { + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + w = iD.Way({id: 'w', nodes: ['a', 'b']}), + r = iD.Relation({id: 'r', members: [{id: 'w'}]}), + base = iD.Graph([a, b, w, r]), + head = iD.actions.CopyEntity(r, true)(base), + diff = iD.Difference(base, head), + created = diff.created(); + + expect(head.hasEntity('r')).to.be.ok; + expect(created).to.have.length(4); + expect(created[0]).to.be.an.instanceof(iD.Relation); + expect(created[1]).to.be.an.instanceof(iD.Way); + expect(created[2]).to.be.an.instanceof(iD.Node); + expect(created[3]).to.be.an.instanceof(iD.Node); + }); +}); diff --git a/test/spec/core/entity.js b/test/spec/core/entity.js index 85dd41ec7..5a6e0aa79 100644 --- a/test/spec/core/entity.js +++ b/test/spec/core/entity.js @@ -36,6 +36,30 @@ describe('iD.Entity', function () { }); }); + describe("#copy", function () { + it("returns a new Entity", function () { + var a = iD.Entity(), + result = a.copy(); + expect(result).to.have.length(1); + expect(result[0]).to.be.an.instanceof(iD.Entity); + expect(a).not.to.equal(result[0]); + }); + + it("resets 'id', 'user', and 'version' properties", function () { + var a = iD.Entity({id: 'n1234', version: 10, user: 'bot-mode'}), + b = a.copy()[0]; + expect(b.isNew()).to.be.ok; + expect(b.version).to.be.undefined; + expect(b.user).to.be.undefined; + }); + + it("copies tags", function () { + var a = iD.Entity({id: 'n1234', version: 10, user: 'test', tags: {foo: 'foo'}}), + b = a.copy()[0]; + expect(b.tags).to.deep.equal(a.tags); + }); + }); + describe("#update", function () { it("returns a new Entity", function () { var a = iD.Entity(), diff --git a/test/spec/core/relation.js b/test/spec/core/relation.js index 4a617421b..8588f3781 100644 --- a/test/spec/core/relation.js +++ b/test/spec/core/relation.js @@ -26,6 +26,101 @@ describe('iD.Relation', function () { expect(iD.Relation({tags: {foo: 'bar'}}).tags).to.eql({foo: 'bar'}); }); + describe("#copy", function () { + it("returns a new Relation", function () { + var r1 = iD.Relation({id: 'r1'}), + result = r1.copy(), + r2 = result[0]; + + expect(result).to.have.length(1); + expect(r2).to.be.an.instanceof(iD.Relation); + expect(r1).not.to.equal(r2); + }); + + it("keeps same members when deep = false", function () { + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + c = iD.Node({id: 'c'}), + w1 = iD.Way({id: 'w1', nodes: ['a','b','c','a']}), + r1 = iD.Relation({id: 'r1', members: [{id: 'w1', role: 'outer'}]}), + graph = iD.Graph([a, b, c, w1, r1]), + result = r1.copy(), + r1_copy = result[0]; + + expect(result).to.have.length(1); + expect(r1.members).to.deep.equal(r1_copy.members); + }); + + it("makes new members when deep = true", function () { + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + c = iD.Node({id: 'c'}), + w1 = iD.Way({id: 'w1', nodes: ['a','b','c','a']}), + r1 = iD.Relation({id: 'r1', members: [{id: 'w1', role: 'outer'}]}), + graph = iD.Graph([a, b, c, w1, r1]), + result = r1.copy(true, graph), + r1_copy = result[0]; + + expect(result).to.have.length(5); + expect(result[0]).to.be.an.instanceof(iD.Relation); + expect(result[1]).to.be.an.instanceof(iD.Way); + expect(result[2]).to.be.an.instanceof(iD.Node); + expect(result[3]).to.be.an.instanceof(iD.Node); + expect(result[4]).to.be.an.instanceof(iD.Node); + + expect(r1_copy.members[0].id).not.to.equal(r1.members[0].id); + expect(r1_copy.members[0].role).to.equal(r1.members[0].role); + }); + + it("deep copies non-tree relation graphs without duplicating children", function () { + var w = iD.Way({id: 'w'}), + r1 = iD.Relation({id: 'r1', members: [{id: 'r2'}, {id: 'w'}]}), + r2 = iD.Relation({id: 'r2', members: [{id: 'w'}]}), + graph = iD.Graph([w, r1, r2]), + result = r1.copy(true, graph), + r1_copy = result[0], + r2_copy = result[1], + w_copy = result[2]; + + expect(result).to.have.length(3); + expect(r1_copy).to.be.an.instanceof(iD.Relation); + expect(r2_copy).to.be.an.instanceof(iD.Relation); + expect(w_copy).to.be.an.instanceof(iD.Way); + + expect(r1_copy.members[0].id).to.equal(r2_copy.id); + expect(r1_copy.members[1].id).to.equal(r2_copy.members[0].id); + }); + + // it("deep copies cyclical relation graphs without issue", function () { + // var r1 = iD.Relation({id: 'r1', members: [{id: 'r2'}]}), + // r2 = iD.Relation({id: 'r2', members: [{id: 'r1'}]}), + // graph = iD.Graph([r1, r2]), + // result = r1.copy(true, graph), + // r1_copy = result[0], + // r2_copy = result[1]; + + // expect(result).to.have.length(2); + // expect(r1_copy).to.be.an.instanceof(iD.Relation); + // expect(r2_copy).to.be.an.instanceof(iD.Relation); + + // var msg = 'r1_copy = ' + JSON.stringify(r1_copy) + + // 'r2_copy = ' + JSON.stringify(r2_copy); + // expect(r1_copy.members[0].id).to.equal(r2_copy.id, msg); + // expect(r2_copy.members[0].id).to.equal(r1_copy.id, msg); + // }); + + // it("deep copies self-refrencing relations without issue", function () { + // var r1 = iD.Relation({id: 'r1', members: [{id: 'r1'}]}), + // graph = iD.Graph([r1]), + // result = r1.copy(true, graph), + // r1_copy = result[0]; + + // expect(result).to.have.length(1); + // expect(r1_copy).to.be.an.instanceof(iD.Relation); + // expect(r1_copy.members[0].id).to.equal(r1_copy.id); + // }); + }); + describe("#extent", function () { it("returns the minimal extent containing the extents of all members", function () { var a = iD.Node({loc: [0, 0]}), diff --git a/test/spec/core/way.js b/test/spec/core/way.js index 0ff1a56fc..274835fb1 100644 --- a/test/spec/core/way.js +++ b/test/spec/core/way.js @@ -26,6 +26,52 @@ describe('iD.Way', function() { expect(iD.Way({tags: {foo: 'bar'}}).tags).to.eql({foo: 'bar'}); }); + describe("#copy", function () { + it("returns a new Way", function () { + var w1 = iD.Way({id: 'w1'}), + result = w1.copy(), + w2 = result[0]; + + expect(result).to.have.length(1); + expect(w2).to.be.an.instanceof(iD.Way); + expect(w1).not.to.equal(w2); + }); + + it("keeps same nodes when deep = false", function () { + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + c = iD.Node({id: 'c'}), + w1 = iD.Entity({id: 'w1', nodes: ['a','b','c','a']}), + graph = iD.Graph([a, b, c, w1]), + result = w1.copy(), + w2 = result[0]; + + expect(result).to.have.length(1); + expect(w1.nodes).to.deep.equal(w2.nodes); + }); + + it("makes new nodes when deep = true", function () { + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + c = iD.Node({id: 'c'}), + w1 = iD.Entity({id: 'w1', nodes: ['a','b','c','a']}), + graph = iD.Graph([a, b, c, w1]), + result = w1.copy(true, graph), + w2 = result[0]; + + expect(result).to.have.length(4); + expect(result[0]).to.be.an.instanceof(iD.Way); + expect(result[1]).to.be.an.instanceof(iD.Node); + expect(result[2]).to.be.an.instanceof(iD.Node); + expect(result[3]).to.be.an.instanceof(iD.Node); + + expect(w2.nodes[0]).not.to.equal(w1.nodes[0]); + expect(w2.nodes[1]).not.to.equal(w1.nodes[1]); + expect(w2.nodes[2]).not.to.equal(w1.nodes[2]); + expect(w2.nodes[3]).to.equal(w2.nodes[0]); + }); + }); + describe("#first", function () { it("returns the first node", function () { expect(iD.Way({nodes: ['a', 'b', 'c']}).first()).to.equal('a'); diff --git a/test/spec/renderer/map.js b/test/spec/renderer/map.js index 43e9c59f1..42d10b110 100644 --- a/test/spec/renderer/map.js +++ b/test/spec/renderer/map.js @@ -30,6 +30,12 @@ describe('iD.Map', function() { map.zoom(4); expect(spy).not.to.have.been.called; }); + + it('respects minzoom', function() { + map.minzoom(16); + map.zoom(15); + expect(map.zoom()).to.equal(16); + }); }); describe('#zoomIn', function() {