diff --git a/css/20_map.css b/css/20_map.css index 9ded521e0..0200a8317 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -75,8 +75,11 @@ pointer-events: none !important; } +/* NOTE: when more QA layers are added, replace kr_error with generic QA layer selector */ +/* points, notes & QA */ /* points & notes */ +g.kr_error .stroke, g.note .stroke { stroke: #222; stroke-width: 1; @@ -84,6 +87,7 @@ g.note .stroke { opacity: 0.6; } +g.kr_error.active .stroke, g.note.active .stroke { stroke: #222; stroke-width: 1; @@ -97,6 +101,7 @@ g.point .stroke { fill: #fff; } +g.kr_error .shadow, g.point .shadow, g.note .shadow { fill: none; @@ -105,6 +110,8 @@ g.note .shadow { stroke-opacity: 0; } +g.kr_error.related:not(.selected) .shadow, +g.kr_error.hover:not(.selected) .shadow, g.note.related:not(.selected) .shadow, g.note.hover:not(.selected) .shadow, g.point.related:not(.selected) .shadow, @@ -112,6 +119,7 @@ g.point.hover:not(.selected) .shadow { stroke-opacity: 0.5; } +g.kr_error.selected .shadow, g.note.selected .shadow, g.point.selected .shadow { stroke-opacity: 0.7; diff --git a/css/65_data.css b/css/65_data.css index ba85cc533..ce67cf006 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -20,9 +20,7 @@ } .note-header-icon .note-shadow, -.layer-notes .note .note-shadow, -.kr_error-header-icon .kr_error-shadow, -.layer-keepRight .kr_error .kr_error-shadow { +.layer-notes .note .note-shadow { color: #000; } diff --git a/data/core.yaml b/data/core.yaml index 55b4a3286..2cd79b3aa 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -486,7 +486,9 @@ en: zoom: Zoom to data fill_area: Fill Areas map_features: Map Features - QA: QA + QA: + title: Quality Assurance + keepRight: KeepRight autohidden: "These features have been automatically hidden because too many would be shown on the screen. You can zoom in to edit them." osmhidden: "These features have been automatically hidden because the OpenStreetMap layer is hidden." feature: @@ -912,6 +914,285 @@ en: _390: description: 'missing tracktype' tooltip: This track doesn't have a tracktype + gpx: + local_layer: "Add a GPX" + drag_drop: "Drag and drop a .gpx, .geojson or .kml file on the page, or click the button to the right to browse" + zoom: "Zoom to layer" + browse: "Browse for a file" + mvt: + local_layer: "Add a MVT" + drag_drop: "Drag and drop a .mvt or .pbf file on the page, or click the button to the right to browse" + zoom: "Zoom to layer" + browse: "Browse for a file" + QA: + keepRight: + tooltip: automatically detected errors from keepright.at + description: Keep Right + title: Edit Error + detail_title: Error + detail_description: Description + inputPlaceholder: Enter a comment to share with other users. + newComment: New Comment + upload_explanation: Your comments will be publicly visible to all keepRight.at users. + upload_explanation_with_user: "Your comments as {user} will be publicly visible to all keepRight.at users." + resolve_comment: Comment and Resolve + ignore_comment: Comment and Ignore + resolve: Resolve + ignore: Ignore + toggle-on: All on + toggle-off: All off + entities: + node: node + way: way + relation: relation + highway: highway + cycleway: cycleway + waterway: waterway + riverbank: riverbank + errorTypes: + errors: + _30: + description: 'non-closed_areas' + tooltip: 'This way is tagged with {var1}={var2} and should be closed-loop' + _40: + description: 'dead-ended one-ways' + tooltip: 'The first node (id {var1}) of this one-way is not connected to any other way' + _41: + description: '' + tooltip: 'The last node (id {var1}) of this one-way is not connected to any other way' + _42: + description: '' + tooltip: 'This node cannot be reached because one-ways only lead away from here' + _43: + description: '' + tooltip: 'You cannot escape from this node because one-ways only lead to here' + _50: + description: 'almost-junctions' + tooltip: 'This node is very close but not connected to way #{var1}' + _70: + description: 'missing tags' + tooltip: 'This {var1} has an empty tag: {var2}' + _71: + description: 'way without tags' + tooltip: 'This way has no tags' + _72: + description: 'node without tags' + tooltip: 'This node is not member of any way and doesn''t have any tags' + _90: + description: 'motorways without ref' + tooltip: 'This way is tagged as motorway and therefore needs a ref nat_ref or int_ref tag' + _100: + description: 'places of worship without religion' + tooltip: 'This {var1} is tagged as place of worship and therefore needs a religion tag' + _110: + description: 'point of interest without name' + tooltip: 'This node is tagged as {var1} and therefore needs a name tag' + _120: + description: 'ways without nodes' + tooltip: 'This way has just one single node' + _130: + description: 'floating islands' + tooltip: 'This way is not connected to the rest of the map' + _150: + description: 'railway crossing without tag' + tooltip: 'This crossing of a highway and a railway needs to be tagged as railway=crossing or railway=level_crossing' + _160: + description: 'wrongly used railway tag' + tooltip: 'There are ways in different layers coming together in this railway crossing. There are ways tagged as tunnel or bridge coming together in this railway crossing' + _170: + description: 'FIXME tagged items' + tooltip: '{var1}' + _180: + description: 'relations without type' + tooltip: 'This relation has no type tag which is mandatory for relations' + _190: + description: 'intersections without junctions' + tooltip: 'Finds way crossings on same layer without common node as a junction' + _191: + description: 'highway-highway' + tooltip: 'This {var1} intersects the {var2} #{var3} but there is no junction node' + _192: + description: 'highway-waterway' + tooltip: 'This {var1} intersects the {var2} #{var3}' + _193: + description: 'highway-riverbank' + tooltip: 'This {var1} intersects the {var2} #{var3}' + _194: + description: 'waterway-waterway' + tooltip: 'This {var1} intersects the {var2} #{var3} but there is no junction node' + _195: + description: 'cycleway-cycleway' + tooltip: 'This {var1} intersects the {var2} #{var3} but there is no junction node' + _196: + description: 'highway-cycleway' + tooltip: 'This {var1} intersects the {var2} #{var3} but there is no junction node' + _197: + description: 'cycleway-waterway' + tooltip: 'This {var1} intersects the {var2} #{var3}' + _198: + description: 'cycleway-riverbank' + tooltip: 'This {var1} intersects the {var2} #{var3}' + _200: + description: 'overlapping ways' + tooltip: 'Finds overlapping ways on same layer' + _201: + description: 'highway-highway' + tooltip: 'This {var1} overlaps the {var2} #{var3}' + _202: + description: 'highway-waterway' + tooltip: 'This {var1} overlaps the {var2} #{var3}' + _203: + description: 'highway-riverbank' + tooltip: 'This {var1} overlaps the {var2} #{var3}' + _204: + description: 'waterway-waterway' + tooltip: 'This {var1} overlaps the {var2} #{var3}' + _205: + description: 'cycleway-cycleway' + tooltip: 'This {var1} overlaps the {var2} #{var3}' + _206: + description: 'highway-cycleway' + tooltip: 'This {var1} overlaps the {var2} #{var3}' + _207: + description: 'cycleway-waterway' + tooltip: 'This {var1} overlaps the {var2} #{var3}' + _208: + description: 'cycleway-riverbank' + tooltip: 'This {var1} overlaps the {var2} #{var3}' + _210: + description: 'loopings' + tooltip: 'These errors contain self intersecting ways' + _211: + description: '' + tooltip: 'This way contains more than one node at least twice. Nodes are {var1}. This may or may not be an error' + _212: + description: '' + tooltip: 'This way has only two different nodes and contains one of them more than once' + _220: + description: 'misspelled tags' + tooltip: 'This {var1} is tagged {var2}={var3} where {var4} looks like {var5}' + _221: + description: '' + tooltip: 'The key of this {var1} tag is key {var2}' + _230: + description: 'layer conflicts' + tooltip: '' + _231: + description: 'mixed layers intersection' + tooltip: 'This node is a junction of ways on different layers: {var1}' + _232: + description: 'strange layers' + tooltip: 'This {var1} is tagged with layer {var2}. This need not be an error but it looks strange' + _270: + description: 'motorways connected directly' + tooltip: 'This node is a junction of a motorway and a highway other than motorway, motorway_link, trunk, rest_area or construction. Service or unclassified is only valid if it has access=no/private or it leads to a motorway service area or if it is a service=parking_aisle.' + _280: + description: 'boundaries' + tooltip: '' + _281: + description: 'missing name' + tooltip: 'This boundary has no name' + _282: + description: 'missing admin level' + tooltip: 'The boundary of {var1} has no valid numeric admin_level. Please do not use admin levels like for example 6;7. Always tag the lowest admin_level of all boundaries' + _283: + description: 'no closed loop' + tooltip: 'The boundary of {var1} is not closed-loop' + _284: + description: 'splitting boundary' + tooltip: 'The boundary of {var1} splits here' + _285: + description: 'admin_level too high' + tooltip: 'This boundary-way has admin_level {var1} but belongs to a relation with lower admin_level (higher priority); it should have the lowest admin_level of all relations' + _290: + description: 'restrictions' + tooltip: 'Analyses all relations tagged type=restriction or following variations type=restriction:hgv type=restriction:caravan type=restriction:motorcar type=restriction:bus type=restriction:agricultural type=restriction:motorcycle type=restriction:bicycle and type=restriction:hazmat' + _291: + description: 'missing type' + tooltip: 'This turn-restriction has no known restriction type' + _292: + description: 'missing from way' + tooltip: 'A turn-restriction needs exactly one {var1} member. This one has {var2}' + _293: + description: 'missing to way' + tooltip: 'A turn-restriction needs exactly one {var1} member. This one has {var2}' + _294: + description: 'from or to not a way' + tooltip: 'From- and To-members of turn restrictions need to be ways. {var1}' + _295: + description: 'via is not on the way ends' + tooltip: 'via (node #{var1}) is not the first or the last member of from (way #{var2})' + _296: + description: 'wrong restriction angle' + tooltip: 'restriction type is {var1} but angle is {var2} degrees. Maybe the restriction type is not appropriate?' + _297: + description: 'wrong direction of to member' + tooltip: 'wrong direction of to way {var1}' + _298: + description: 'already restricted by oneway' + tooltip: 'entry already prohibited by oneway tag on {var1}' + _310: + description: 'roundabouts' + tooltip: 'Analyses ways with tag junction=roundabout. More then one way can form a roundabout. It supports tag oneway=-1' + _311: + description: 'not closed loop' + tooltip: 'This way is part of a roundabout but is not closed-loop. (split carriageways approaching a roundabout should not be tagged as roundabout)' + _312: + description: 'wrong direction' + tooltip: 'If this roundabout is in a country with right-hand traffic then its orientation goes the wrong way around | If this roundabout is in a country with left-hand traffic then its orientation goes the wrong way around | If this mini_roundabout is in a country with right-hand traffic then its orientation goes the wrong way around | If this mini_roundabout is in a country with left-hand traffic then its orientation goes the wrong way around' + _313: + description: 'faintly connected' + tooltip: 'This roundabout has only {var1} other roads connected. Roundabouts typically have three' + _320: + description: '*_link connections' + tooltip: 'This way is tagged as highway={var1}_link but doesn''t have a connection to any other {var1} or {var1}_link' + _350: + description: 'bridge-tags' + tooltip: 'This bridge doesn''t have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: {var1}' + _370: + description: 'doubled places' + tooltip: 'This node has tags in common with the surrounding way #{var1} and seems to be redundand | This node has tags in common with the surrounding way #{var1} (including the name {var2}) and seems to be redundand' + _380: + description: 'non-physical use of sport-tag' + tooltip: 'This way is tagged {var1} but has no physical tag like e.g. leisure, building, amenity or highway' + _400: + description: 'geometry glitches' + tooltip: '' + _401: + description: 'missing turn restriction' + tooltip: 'ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning from way {var1} to {var2}' + _402: + description: 'impossible angles' + tooltip: 'this way bends in a very sharp angle here' + _410: + description: 'website' + tooltip: 'Web pages are analyzed. Web page is defined by any of the following tags website=* url=* website:mobile=* contact:website=* contact:url=* image=* source:website=* or source:url=*' + _411: + description: 'http error' + tooltip: 'The URL ({var1}) cannot be opened (HTTP status code {var2})' + _412: + description: 'domain hijacking' + tooltip: 'Possible domain squatting: {var1}. Suspicious text is: "{var2}"' + _413: + description: 'non-match' + tooltip: 'Content of the URL ({var1}) did not contain these keywords: ({var2})' + warnings: + _20: + description: 'multiple nodes on the same spot' + tooltip: 'There is more than one node in this spot. Offending node IDs: {var1}' + _60: + description: 'depreciated tags' + tooltip: 'This {var1} uses deprecated tag {var2}={var3}. Please use {var4} instead!' + _300: + description: 'missing maxspeed' + tooltip: 'missing maxspeed tag' + _360: + description: 'language unknown' + tooltip: 'It would be nice if this {var1} had an additional tag name:XX={var2} where XX shows the language of its name {var2}' + _390: + description: 'missing tracktype' + tooltip: This track doesn't have a tracktype +>>>>>>> cleaned map data UI; commented sub-layer filtering streetside: tooltip: "Streetside photos from Microsoft" title: "Photo Overlay (Bing Streetside)" diff --git a/dist/locales/en.json b/dist/locales/en.json index 60e6beaf6..6a74c08d4 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -591,7 +591,10 @@ }, "fill_area": "Fill Areas", "map_features": "Map Features", - "QA": "QA", + "QA": { + "title": "Quality Assurance", + "keepRight": "KeepRight" + }, "autohidden": "These features have been automatically hidden because too many would be shown on the screen. You can zoom in to edit them.", "osmhidden": "These features have been automatically hidden because the OpenStreetMap layer is hidden." }, @@ -1127,11 +1130,357 @@ }, "_360": { "description": "language unknown", - "tooltip": "It would be nice if this {var1} had an additional tag name:XX={var2} where XX shows the language of its name {var2}" + "tooltip": "It would be nice if this {var1} had an additional tag name:XX={var2} where XX shows the language of its name {var2}", + "QA": { + "keepRight": { + "tooltip": "automatically detected errors from keepright.at", + "description": "Keep Right", + "title": "Edit Error", + "detail_title": "Error", + "detail_description": "Description", + "inputPlaceholder": "Enter a comment to share with other users.", + "newComment": "New Comment", + "upload_explanation": "Your comments will be publicly visible to all keepRight.at users.", + "upload_explanation_with_user": "Your comments as {user} will be publicly visible to all keepRight.at users.", + "resolve_comment": "Comment and Resolve", + "ignore_comment": "Comment and Ignore", + "resolve": "Resolve", + "ignore": "Ignore", + "toggle-on": "All on", + "toggle-off": "All off", + "entities": { + "node": "node", + "way": "way", + "relation": "relation", + "highway": "highway", + "cycleway": "cycleway", + "waterway": "waterway", + "riverbank": "riverbank" + }, + "errorTypes": { + "errors": { + "_30": { + "description": "non-closed_areas", + "tooltip": "This way is tagged with {var1}={var2} and should be closed-loop" + }, + "_40": { + "description": "dead-ended one-ways", + "tooltip": "The first node (id {var1}) of this one-way is not connected to any other way" + }, + "_41": { + "description": "", + "tooltip": "The last node (id {var1}) of this one-way is not connected to any other way" + }, + "_42": { + "description": "", + "tooltip": "This node cannot be reached because one-ways only lead away from here" + }, + "_43": { + "description": "", + "tooltip": "You cannot escape from this node because one-ways only lead to here" + }, + "_50": { + "description": "almost-junctions", + "tooltip": "This node is very close but not connected to way #{var1}" + }, + "_70": { + "description": "missing tags", + "tooltip": "This {var1} has an empty tag: {var2}" + }, + "_71": { + "description": "way without tags", + "tooltip": "This way has no tags" + }, + "_72": { + "description": "node without tags", + "tooltip": "This node is not member of any way and doesn't have any tags" + }, + "_90": { + "description": "motorways without ref", + "tooltip": "This way is tagged as motorway and therefore needs a ref nat_ref or int_ref tag" + }, + "_100": { + "description": "places of worship without religion", + "tooltip": "This {var1} is tagged as place of worship and therefore needs a religion tag" + }, + "_110": { + "description": "point of interest without name", + "tooltip": "This node is tagged as {var1} and therefore needs a name tag" + }, + "_120": { + "description": "ways without nodes", + "tooltip": "This way has just one single node" + }, + "_130": { + "description": "floating islands", + "tooltip": "This way is not connected to the rest of the map" + }, + "_150": { + "description": "railway crossing without tag", + "tooltip": "This crossing of a highway and a railway needs to be tagged as railway=crossing or railway=level_crossing" + }, + "_160": { + "description": "wrongly used railway tag", + "tooltip": "There are ways in different layers coming together in this railway crossing. There are ways tagged as tunnel or bridge coming together in this railway crossing" + }, + "_170": { + "description": "FIXME tagged items", + "tooltip": "{var1}" + }, + "_180": { + "description": "relations without type", + "tooltip": "This relation has no type tag which is mandatory for relations" + }, + "_190": { + "description": "intersections without junctions", + "tooltip": "Finds way crossings on same layer without common node as a junction" + }, + "_191": { + "description": "highway-highway", + "tooltip": "This {var1} intersects the {var2} #{var3} but there is no junction node" + }, + "_192": { + "description": "highway-waterway", + "tooltip": "This {var1} intersects the {var2} #{var3}" + }, + "_193": { + "description": "highway-riverbank", + "tooltip": "This {var1} intersects the {var2} #{var3}" + }, + "_194": { + "description": "waterway-waterway", + "tooltip": "This {var1} intersects the {var2} #{var3} but there is no junction node" + }, + "_195": { + "description": "cycleway-cycleway", + "tooltip": "This {var1} intersects the {var2} #{var3} but there is no junction node" + }, + "_196": { + "description": "highway-cycleway", + "tooltip": "This {var1} intersects the {var2} #{var3} but there is no junction node" + }, + "_197": { + "description": "cycleway-waterway", + "tooltip": "This {var1} intersects the {var2} #{var3}" + }, + "_198": { + "description": "cycleway-riverbank", + "tooltip": "This {var1} intersects the {var2} #{var3}" + }, + "_200": { + "description": "overlapping ways", + "tooltip": "Finds overlapping ways on same layer" + }, + "_201": { + "description": "highway-highway", + "tooltip": "This {var1} overlaps the {var2} #{var3}" + }, + "_202": { + "description": "highway-waterway", + "tooltip": "This {var1} overlaps the {var2} #{var3}" + }, + "_203": { + "description": "highway-riverbank", + "tooltip": "This {var1} overlaps the {var2} #{var3}" + }, + "_204": { + "description": "waterway-waterway", + "tooltip": "This {var1} overlaps the {var2} #{var3}" + }, + "_205": { + "description": "cycleway-cycleway", + "tooltip": "This {var1} overlaps the {var2} #{var3}" + }, + "_206": { + "description": "highway-cycleway", + "tooltip": "This {var1} overlaps the {var2} #{var3}" + }, + "_207": { + "description": "cycleway-waterway", + "tooltip": "This {var1} overlaps the {var2} #{var3}" + }, + "_208": { + "description": "cycleway-riverbank", + "tooltip": "This {var1} overlaps the {var2} #{var3}" + }, + "_210": { + "description": "loopings", + "tooltip": "These errors contain self intersecting ways" + }, + "_211": { + "description": "", + "tooltip": "This way contains more than one node at least twice. Nodes are {var1}. This may or may not be an error" + }, + "_212": { + "description": "", + "tooltip": "This way has only two different nodes and contains one of them more than once" + }, + "_220": { + "description": "misspelled tags", + "tooltip": "This {var1} is tagged {var2}={var3} where {var4} looks like {var5}" + }, + "_221": { + "description": "", + "tooltip": "The key of this {var1} tag is key {var2}" + }, + "_230": { + "description": "layer conflicts", + "tooltip": "" + }, + "_231": { + "description": "mixed layers intersection", + "tooltip": "This node is a junction of ways on different layers: {var1}" + }, + "_232": { + "description": "strange layers", + "tooltip": "This {var1} is tagged with layer {var2}. This need not be an error but it looks strange" + }, + "_270": { + "description": "motorways connected directly", + "tooltip": "This node is a junction of a motorway and a highway other than motorway, motorway_link, trunk, rest_area or construction. Service or unclassified is only valid if it has access=no/private or it leads to a motorway service area or if it is a service=parking_aisle." + }, + "_280": { + "description": "boundaries", + "tooltip": "" + }, + "_281": { + "description": "missing name", + "tooltip": "This boundary has no name" + }, + "_282": { + "description": "missing admin level", + "tooltip": "The boundary of {var1} has no valid numeric admin_level. Please do not use admin levels like for example 6;7. Always tag the lowest admin_level of all boundaries" + }, + "_283": { + "description": "no closed loop", + "tooltip": "The boundary of {var1} is not closed-loop" + }, + "_284": { + "description": "splitting boundary", + "tooltip": "The boundary of {var1} splits here" + }, + "_285": { + "description": "admin_level too high", + "tooltip": "This boundary-way has admin_level {var1} but belongs to a relation with lower admin_level (higher priority); it should have the lowest admin_level of all relations" + }, + "_290": { + "description": "restrictions", + "tooltip": "Analyses all relations tagged type=restriction or following variations type=restriction:hgv type=restriction:caravan type=restriction:motorcar type=restriction:bus type=restriction:agricultural type=restriction:motorcycle type=restriction:bicycle and type=restriction:hazmat" + }, + "_291": { + "description": "missing type", + "tooltip": "This turn-restriction has no known restriction type" + }, + "_292": { + "description": "missing from way", + "tooltip": "A turn-restriction needs exactly one {var1} member. This one has {var2}" + }, + "_293": { + "description": "missing to way", + "tooltip": "A turn-restriction needs exactly one {var1} member. This one has {var2}" + }, + "_294": { + "description": "from or to not a way", + "tooltip": "From- and To-members of turn restrictions need to be ways. {var1}" + }, + "_295": { + "description": "via is not on the way ends", + "tooltip": "via (node #{var1}) is not the first or the last member of from (way #{var2})" + }, + "_296": { + "description": "wrong restriction angle", + "tooltip": "restriction type is {var1} but angle is {var2} degrees. Maybe the restriction type is not appropriate?" + }, + "_297": { + "description": "wrong direction of to member", + "tooltip": "wrong direction of to way {var1}" + }, + "_298": { + "description": "already restricted by oneway", + "tooltip": "entry already prohibited by oneway tag on {var1}" + }, + "_310": { + "description": "roundabouts", + "tooltip": "Analyses ways with tag junction=roundabout. More then one way can form a roundabout. It supports tag oneway=-1" + }, + "_311": { + "description": "not closed loop", + "tooltip": "This way is part of a roundabout but is not closed-loop. (split carriageways approaching a roundabout should not be tagged as roundabout)" + }, + "_312": { + "description": "wrong direction", + "tooltip": "If this roundabout is in a country with right-hand traffic then its orientation goes the wrong way around | If this roundabout is in a country with left-hand traffic then its orientation goes the wrong way around | If this mini_roundabout is in a country with right-hand traffic then its orientation goes the wrong way around | If this mini_roundabout is in a country with left-hand traffic then its orientation goes the wrong way around" + }, + "_313": { + "description": "faintly connected", + "tooltip": "This roundabout has only {var1} other roads connected. Roundabouts typically have three" + }, + "_320": { + "description": "*_link connections", + "tooltip": "This way is tagged as highway={var1}_link but doesn't have a connection to any other {var1} or {var1}_link" + }, + "_350": { + "description": "bridge-tags", + "tooltip": "This bridge doesn't have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: {var1}" + }, + "_370": { + "description": "doubled places", + "tooltip": "This node has tags in common with the surrounding way #{var1} and seems to be redundand | This node has tags in common with the surrounding way #{var1} (including the name {var2}) and seems to be redundand" + }, + "_380": { + "description": "non-physical use of sport-tag", + "tooltip": "This way is tagged {var1} but has no physical tag like e.g. leisure, building, amenity or highway" + }, + "_400": { + "description": "geometry glitches", + "tooltip": "" + }, + "_401": { + "description": "missing turn restriction", + "tooltip": "ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning from way {var1} to {var2}" + }, + "_402": { + "description": "impossible angles", + "tooltip": "this way bends in a very sharp angle here" + }, + "_410": { + "description": "website", + "tooltip": "Web pages are analyzed. Web page is defined by any of the following tags website=* url=* website:mobile=* contact:website=* contact:url=* image=* source:website=* or source:url=*" + }, + "_411": { + "description": "http error", + "tooltip": "The URL ({var1}) cannot be opened (HTTP status code {var2})" + }, + "_412": { + "description": "domain hijacking", + "tooltip": "Possible domain squatting: {var1}. Suspicious text is: \"{var2}\"" + }, + "_413": { + "description": "non-match", + "tooltip": "Content of the URL ({var1}) did not contain these keywords: ({var2})" + } }, - "_390": { - "description": "missing tracktype", - "tooltip": "This track doesn't have a tracktype" + "warnings": { + "_20": { + "description": "multiple nodes on the same spot", + "tooltip": "There is more than one node in this spot. Offending node IDs: {var1}" + }, + "_60": { + "description": "depreciated tags", + "tooltip": "This {var1} uses deprecated tag {var2}={var3}. Please use {var4} instead!" + }, + "_300": { + "description": "missing maxspeed", + "tooltip": "missing maxspeed tag" + }, + "_360": { + "description": "language unknown", + "tooltip": "It would be nice if this {var1} had an additional tag name:XX={var2} where XX shows the language of its name {var2}" + }, + "_390": { + "description": "missing tracktype", + "tooltip": "This track doesn't have a tracktype" + } } } } diff --git a/modules/services/keepRight.js b/modules/services/keepRight.js index 5a1e3dc5d..008605fb6 100644 --- a/modules/services/keepRight.js +++ b/modules/services/keepRight.js @@ -185,7 +185,6 @@ export default { }); }, - // get all cached errors covering the viewport keepRight: function(projection) { var viewport = projection.clipExtent(); diff --git a/modules/svg/keepRight.js b/modules/svg/keepRight.js index cf2b46339..4692f616e 100644 --- a/modules/svg/keepRight.js +++ b/modules/svg/keepRight.js @@ -1,5 +1,7 @@ import _throttle from 'lodash-es/throttle'; import { select as d3_select } from 'd3-selection'; + +import { modeBrowse } from '../modes'; import { svgPointTransform } from './index'; import { services } from '../services'; @@ -10,6 +12,13 @@ export function svgKeepRight(projection, context, dispatch) { var layer = d3_select(null); var _keepRight; + function markerPath(selection, klass) { + selection + .attr('class', klass) + .attr('transform', 'translate(-4, -24)') + .attr('d', 'M11.6,6.2H7.1l1.4-5.1C8.6,0.6,8.1,0,7.5,0H2.2C1.7,0,1.3,0.3,1.3,0.8L0,10.2c-0.1,0.6,0.4,1.1,0.9,1.1h4.6l-1.8,7.6C3.6,19.4,4.1,20,4.7,20c0.3,0,0.6-0.2,0.8-0.5l6.9-11.9C12.7,7,12.3,6.2,11.6,6.2z'); + } + function init() { if (svgKeepRight.initialized) return; // run once @@ -34,12 +43,31 @@ export function svgKeepRight(projection, context, dispatch) { var service = getService(); if (!service) return; editOn(); + + layer + .classed('disabled', false) + .style('opacity', 0) + .transition() + .duration(250) + .style('opacity', 1) + .on('end interrupt', function () { + dispatch.call('change'); + }); } function hideLayer() { throttledRedraw.cancel(); editOff(); + + layer + .transition() + .duration(250) + .style('opacity', 0) + .on('end interrupt', function () { + layer.classed('disabled', true); + dispatch.call('change'); + }); } @@ -107,9 +135,9 @@ export function svgKeepRight(projection, context, dispatch) { .attr('ry', 3) .attr('class', 'stroke'); - // kr_errorsEnter - // .append('path') - // .call(markerPath, 'kr_error-shadow'); + kr_errorsEnter + .append('path') + .call(markerPath, 'shadow'); kr_errorsEnter .append('use') @@ -156,7 +184,7 @@ export function svgKeepRight(projection, context, dispatch) { if (service && ~~context.map().zoom() >= minZoom) { editOn(); update(); - var options = { // TODO: change out these options and place as default + var options = { ch: [0,30,40,50,70,90,100,110,120,130,150,160,170,180,191,192,193,194,195,196,197,198,201,202,203,204,205,206,207,208,210,220,231,232,270,281,282,283,284,285,291,292,293,294,295,296,297,298,311,312,313,320,350,370,380,401,402,411,412,413] }; @@ -175,6 +203,9 @@ export function svgKeepRight(projection, context, dispatch) { showLayer(); } else { hideLayer(); + if (context.selectedErrorID()) { + context.enter(modeBrowse(context)); + } } dispatch.call('change'); return this; diff --git a/modules/ui/keepRight_details.js b/modules/ui/keepRight_details.js index ead79998e..4c1dfd4cc 100644 --- a/modules/ui/keepRight_details.js +++ b/modules/ui/keepRight_details.js @@ -32,7 +32,7 @@ export function uiKeepRightDetails(context) { _parent_error_type = '_' + base_error_type; } - _titleBase = 'keepRight.errorTypes.' + _category + '.'; + _titleBase = 'QA.keepRight.errorTypes.' + _category + '.'; } @@ -64,7 +64,7 @@ export function uiKeepRightDetails(context) { .attr('class', 'kr_error-details-title'); title.append('h4') - .text(function() { return t('keepRight.detail_title'); }); + .text(function() { return t('QA.keepRight.detail_title'); }); title.append('div') .text(function() { @@ -72,7 +72,7 @@ export function uiKeepRightDetails(context) { // if this is a subtype, append it's parent title if (_parent_error_type) { - title = t(_titleBase + _parent_error_type + '.description') + ':\n'; + title = t(_titleBase + _parent_error_type + '.description') + ': \n'; } // append title @@ -91,7 +91,7 @@ export function uiKeepRightDetails(context) { description .append('h4') - .text(function() { return t('keepRight.detail_description'); }); + .text(function() { return t('QA.keepRight.detail_description'); }); description .append('div') diff --git a/modules/ui/keepRight_editor.js b/modules/ui/keepRight_editor.js index 18319539a..3e6fcee88 100644 --- a/modules/ui/keepRight_editor.js +++ b/modules/ui/keepRight_editor.js @@ -49,7 +49,7 @@ export function uiKeepRightEditor(context) { headerEnter .append('h3') - .text(t('keepRight.title')); + .text(t('QA.keepRight.title')); var body = selection.selectAll('.body') @@ -102,13 +102,13 @@ export function uiKeepRightEditor(context) { .append('h4') .attr('class', '.error-save-header') .text(function() { - return t('keepRight.newComment'); + return t('QA.keepRight.newComment'); }); errorSaveEnter .append('textarea') .attr('class', 'new-comment-input') - .attr('placeholder', t('keepRight.inputPlaceholder')) + .attr('placeholder', t('QA.keepRight.inputPlaceholder')) .attr('maxlength', 1000) .property('value', function(d) { return d.newComment; }) .call(utilNoAuto) @@ -201,7 +201,7 @@ export function uiKeepRightEditor(context) { prose = prose.enter() .append('p') .attr('class', 'error-save-prose') - .text(t('keepRight.upload_explanation')) + .text(t('QA.keepRight.upload_explanation')) .merge(prose); osm.userDetails(function(err, user) { @@ -225,7 +225,7 @@ export function uiKeepRightEditor(context) { .attr('target', '_blank'); prose - .html(t('keepRight.upload_explanation_with_user', { user: userLink.html() })); + .html(t('QA.keepRight.upload_explanation_with_user', { user: userLink.html() })); }); } @@ -295,7 +295,7 @@ export function uiKeepRightEditor(context) { .attr('disabled', (hasAuth ? null : true)) .text(function(d) { var andComment = (d.newComment ? '_comment' : ''); - return t('keepRight.resolve' + andComment); + return t('QA.keepRight.resolve' + andComment); }) .on('click.status', function(d) { this.blur(); // avoid keeping focus on the button - #4641 @@ -312,7 +312,7 @@ export function uiKeepRightEditor(context) { .attr('disabled', (hasAuth ? null : true)) .text(function(d) { var andComment = (d.newComment ? '_comment' : ''); - return t('keepRight.ignore' + andComment); + return t('QA.keepRight.ignore' + andComment); }) .on('click.status', function(d) { this.blur(); // avoid keeping focus on the button - #4641 diff --git a/modules/ui/keepRight_header.js b/modules/ui/keepRight_header.js index 770c9be40..836388a30 100644 --- a/modules/ui/keepRight_header.js +++ b/modules/ui/keepRight_header.js @@ -72,7 +72,7 @@ export function uiKeepRightHeader(context) { headerEnter .append('div') .attr('class', 'kr_error-header-label') - .text(function(d) { return t('keepRight.entities.' + d.object_type) + ' '; }) + .text(function(d) { return t('QA.keepRight.entities.' + d.object_type) + ' '; }) .append('span') .append('a') .text(function(d) { return d.object_id; }) diff --git a/modules/ui/map_data.js b/modules/ui/map_data.js index 429fa4f16..316369abd 100644 --- a/modules/ui/map_data.js +++ b/modules/ui/map_data.js @@ -22,7 +22,8 @@ export function uiMapData(context) { var key = t('map_data.key'); var features = context.features().keys(); - var errors = Object.keys(errorTypes.errors); // TODO: add warnings + var QAs = ['keepRight']; + // var errors = Object.keys(errorTypes.errors); // TODO: add warnings var layers = context.layers(); var fills = ['wireframe', 'partial', 'full']; @@ -35,6 +36,7 @@ export function uiMapData(context) { var _fillList = d3_select(null); var _featureList = d3_select(null); var _QAList = d3_select(null); + // var _KeepRightList = d3_select(null); function showsFeature(d) { @@ -43,6 +45,7 @@ export function uiMapData(context) { function autoHiddenFeature(d) { + if (d.type === 'kr_error') return context.errors().autoHidden(d); return context.features().autoHidden(d); } @@ -53,15 +56,31 @@ export function uiMapData(context) { } - function showsError(d) { - // return context.errors().enabled(d); + function showsQA(d) { + + var QAKeys = [d]; + var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; }); + var data = QALayers.filter(function(obj) { return obj.layer.supported(); }); + + function layerSupported(d) { + return d.layer && d.layer.supported(); + } + function layerEnabled(d) { + return layerSupported(d) && d.layer.enabled(); + } + + return layerEnabled(data[0]); + } + // function clickError(d) { - function clickError(d) { - // context.errors().toggle(d); - // update(); - } + // } + + + // function showsError(d) { + + // } function showsFill(d) { @@ -112,7 +131,7 @@ export function uiMapData(context) { function drawPhotoItems(selection) { - var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images', 'keepRight']; + var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images']; var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; }); var data = photoLayers.filter(function(obj) { return obj.layer.supported(); }); @@ -432,37 +451,43 @@ export function uiMapData(context) { var QAButtons = d3_select('.layer-QA').selectAll('li').select('label').select('input'); var buttonSection = selection.selectAll('.QA-buttons') .data([0]); + // function drawQAButtons(selection) { - // exit - buttonSection.exit() - .remove(); + // var QAButtons = d3_select('.layer-QA').selectAll('li').select('label').select('input'); - // enter - var buttonEnter = buttonSection.enter() - .append('div') - .attr('class', 'QA-buttons'); + // var buttonSection = selection.selectAll('.QA-buttons') + // .data([0]); - buttonEnter - .append('button') - .attr('class', 'button QA-toggle-on action') - .text(t('keepRight.toggle-on')) - .on('click', function() { - QAButtons.property('checked', true); - dispatch.call('change'); - }); + // // exit + // buttonSection.exit() + // .remove(); - buttonEnter - .append('button') - .attr('class', 'button QA-toggle-off action') - .text(t('keepRight.toggle-off')) - .on('click', function() { - QAButtons.property('checked', false); - dispatch.call('change'); - }); + // // enter + // var buttonEnter = buttonSection.enter() + // .append('div') + // .attr('class', 'QA-buttons'); - buttonSection = buttonSection - .merge(buttonEnter); - } + // buttonEnter + // .append('button') + // .attr('class', 'button QA-toggle-on action') + // .text(t('QA.keepRight.toggle-on')) + // .on('click', function() { + // QAButtons.property('checked', true); + // dispatch.call('change'); + // }); + + // buttonEnter + // .append('button') + // .attr('class', 'button QA-toggle-off action') + // .text(t('QA.keepRight.toggle-off')) + // .on('click', function() { + // QAButtons.property('checked', false); + // dispatch.call('change'); + // }); + + // buttonSection = buttonSection + // .merge(buttonEnter); + // } function drawListItems(selection, data, type, name, change, active) { @@ -483,7 +508,8 @@ export function uiMapData(context) { var tip = t(name + '.' + d + '.tooltip'), key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null); - if (name === 'feature' && autoHiddenFeature(d)) { + + if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) { var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden'); tip += '
' + msg + '
'; } @@ -514,7 +540,7 @@ export function uiMapData(context) { .selectAll('input') .property('checked', active) .property('indeterminate', function(d) { - return (name === 'feature' && autoHiddenFeature(d)); + return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)); }); } @@ -552,7 +578,7 @@ export function uiMapData(context) { } - function renderQA(selection) { + function renderQAList(selection) { var container = selection.selectAll('layer-QA') .data([0]); @@ -562,6 +588,16 @@ export function uiMapData(context) { .merge(container); } + // function renderKeepRightList(selection) { + // var container = selection.selectAll('layer-keepRight') + // .data([0]); + + // _KeepRightList = container.enter() + // .append('ul') + // .attr('class', 'layer-list layer-keepRight') + // .merge(container); + // } + function update() { _dataLayerContainer @@ -577,9 +613,12 @@ export function uiMapData(context) { .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature); _QAList - .call(drawListItems, errors, 'checkbox', 'keepRight.errorTypes.errors', clickError, showsError); - d3_select('.disclosure-wrap-QA') - .call(drawQAButtons); + .call(drawListItems, QAs, 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA); + + // _KeepRightList + // .call(drawListItems, errors, 'checkbox', 'QA.keepRight.errorTypes.errors', clickError, showsError); + // d3_select('.disclosure-wrap-QA') + // .call(drawQAButtons); } @@ -711,10 +750,19 @@ export function uiMapData(context) { .append('div') .attr('class', 'map-data-QA') .call(uiDisclosure(context, 'QA', false) - .title(t('map_data.QA')) - .content(renderQA) + .title(t('map_data.QA.title')) + .content(renderQAList) ); + // // adding keepRight sublayers + // QA_list + // .append('div') + // .attr('class', 'keepRight-errors') + // .call(uiDisclosure(context, 'keepRight', false) + // .title(t('map_data.QA.keepRight')) + // .content(renderKeepRightList) + // ); + // add listeners context.features() @@ -722,7 +770,6 @@ export function uiMapData(context) { // context.errors() // .on('change.map_data-update', update); // TODO: add errors list to context? -'' update(); setFill(_fillSelected); diff --git a/modules/util/keepRight/keepRight_error.js b/modules/util/keepRight/keepRight_error.js index c9a73047f..83b899801 100644 --- a/modules/util/keepRight/keepRight_error.js +++ b/modules/util/keepRight/keepRight_error.js @@ -81,7 +81,7 @@ export function parseErrorDescriptions(entity) { // if any variables contain common words, like node, way, relation, translate those if (commonEntities.includes(currWord)) { - currWord = t('keepRight.entities.' + currWord); + currWord = t('QA.keepRight.entities.' + currWord); } parsedPhrase += currWord;