diff --git a/API.md b/API.md
index 8e4ab5194..3a506b020 100644
--- a/API.md
+++ b/API.md
@@ -8,28 +8,32 @@ iD supports several URL parameters. When constructing a URL to a standalone inst
of iD (e.g. `http://preview.ideditor.com/release/`), the following parameters are available
in the hash portion of the URL:
-* `map` - A slash separated `zoom/latitude/longitude`. Example:
- `map=20.00/38.90085/-77.02271`
-* `id` - The character 'n', 'w', or 'r', followed by the OSM ID of a node,
+* __`map`__ - A slash separated `zoom/latitude/longitude`.
+ _Example:_ `map=20.00/38.90085/-77.02271`
+* __`id`__ - The character 'n', 'w', or 'r', followed by the OSM ID of a node,
way or relation, respectively. Selects the specified entity, and, unless
a `map` parameter is also provided, centers the map on it.
-* `background` - The value from a `sourcetag` property in iD's
+* __`background`__ - The value from a `sourcetag` property in iD's
[imagery list](https://github.com/openstreetmap/iD/blob/master/data/imagery.json),
or a custom tile URL. A custom URL is specified in the format `custom:`,
where the URL can contain the standard tile URL placeholders `{x}`, `{y}` and
`{z}`/`{zoom}`, `{ty}` for flipped TMS-style Y coordinates, and `{switch:a,b,c}` for
- DNS multiplexing. Example:
- `background=custom:https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png`
-* `gpx` - A custom URL for loading a gpx track. Specifying a `gpx` parameter will
- automatically enable the gpx layer for display. Example:
- `gpx=https://tasks.hotosm.org/project/592/task/16.gpx`
-* `offset` - imagery offset in meters, formatted as `east,north`. Example:
- `offset=-10,5`
-* `comment` - Prefills the changeset comment box, for use when integrating iD with
- external task management or quality assurance tools. Example:
- `comment=CAR%20crisis%2C%20refugee%20areas%20in%20Cameroon%20%23hotosm-task-592`.
-* `rtl=true` - Force iD into right-to-left mode (useful for testing).
-* `walkthrough=true` - Start the walkthrough automatically
+ DNS multiplexing.
+ _Example:_ `background=custom:https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png`
+* __`gpx`__ - A custom URL for loading a gpx track. Specifying a `gpx` parameter will
+ automatically enable the gpx layer for display.
+ _Example:_ `gpx=https://tasks.hotosm.org/project/592/task/16.gpx`
+* __`offset`__ - imagery offset in meters, formatted as `east,north`.
+ _Example:_ `offset=-10,5`
+* __`comment`__ - Prefills the changeset comment. Pass a url encoded string.
+ _Example:_ `comment=CAR%20crisis%2C%20refugee%20areas%20in%20Cameroon`
+* __`hashtags`__ - Prefills the changeset hashtags. Pass a url encoded list of event
+ hashtags separated by commas, semicolons, or spaces. Leading '#' symbols are
+ optional and will be added automatically. (Note that hashtag-like strings are
+ automatically detected in the `comment`).
+ _Example:_ `hashtags=%23hotosm-task-592,%23MissingMaps`
+* __`rtl=true`__ - Force iD into right-to-left mode (useful for testing).
+* __`walkthrough=true`__ - Start the walkthrough automatically
##### iD on openstreetmap.org (Rails Port)
@@ -37,14 +41,15 @@ When constructing a URL to an instance of iD embedded in the OpenStreetMap Rails
Port (e.g. `http://www.openstreetmap.org/edit?editor=id`), the following parameters
are available as regular URL query parameters:
-* `map` - same as standalone
-* `lat`, `lon`, `zoom` - Self-explanatory.
-* `node`, `way`, `relation` - Select the specified entity.
-* `background` - same as standalone
-* `gpx` - same as standalone
-* `offset` - same as standalone
-* `comment` - same as standalone
-* `walkthrough` - same as standalone
+* __`map`__ - same as standalone
+* __`lat`__, __`lon`__, __`zoom`__ - Self-explanatory.
+* __`node`__, __`way`__, __`relation`__ - Select the specified entity.
+* __`background`__ - same as standalone
+* __`gpx`__ - same as standalone
+* __`offset`__ - same as standalone
+* __`comment`__ - same as standalone
+* __`hashtags`__ - same as standalone
+* __`walkthrough`__ - same as standalone
## CSS selectors
diff --git a/modules/behavior/hash.js b/modules/behavior/hash.js
index 431594a7c..63cece2df 100644
--- a/modules/behavior/hash.js
+++ b/modules/behavior/hash.js
@@ -37,7 +37,9 @@ export function behaviorHash(context) {
var center = map.center(),
zoom = map.zoom(),
precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)),
- q = _.omit(utilStringQs(window.location.hash.substring(1)), ['comment', 'walkthrough']),
+ q = _.omit(utilStringQs(window.location.hash.substring(1)),
+ ['comment', 'hashtags', 'walkthrough']
+ ),
newParams = {};
delete q.id;
@@ -99,6 +101,10 @@ export function behaviorHash(context) {
context.storage('commentDate', Date.now());
}
+ if (q.hashtags) {
+ context.storage('hashtags', q.hashtags);
+ }
+
if (q.walkthrough === 'true') {
hash.startWalkthrough = true;
}
diff --git a/modules/ui/commit.js b/modules/ui/commit.js
index 5b492a949..aaab49f4c 100644
--- a/modules/ui/commit.js
+++ b/modules/ui/commit.js
@@ -34,12 +34,14 @@ export function uiCommit(context) {
var comment = context.storage('comment') || '',
commentDate = +context.storage('commentDate') || 0,
+ hashtags = context.storage('hashtags'),
currDate = Date.now(),
cutoff = 2 * 86400 * 1000; // 2 days
- // expire the stored comment if it is too old - #3947
+ // expire stored comment and hashtags after cutoff datetime - #3947
if (commentDate > currDate || currDate - commentDate > cutoff) {
comment = '';
+ hashtags = undefined;
}
var tags;
@@ -49,6 +51,7 @@ export function uiCommit(context) {
comment: comment,
created_by: ('iD ' + context.version).substr(0, 255),
imagery_used: context.history().imageryUsed().join(';').substr(0, 255),
+ hashtags: hashtags,
host: detected.host.substr(0, 255),
locale: detected.locale.substr(0, 255)
};
@@ -311,9 +314,12 @@ export function uiCommit(context) {
});
if (!onInput) {
- var hashtags = findHashtags(tags);
- if (hashtags.length) {
- tags.hashtags = hashtags.join(';').substr(0, 255);
+ var arr = findHashtags(tags);
+ if (arr.length) {
+ tags.hashtags = arr.join(';').substr(0, 255);
+ context.storage('hashtags', tags.hashtags);
+ } else {
+ context.storage('hashtags', null);
}
}