From 82263aea7c272a46cb9b4d13459c7ea6b62ce794 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Sun, 18 Nov 2018 19:38:19 -0500 Subject: [PATCH] Adds a Wikidata field --- data/presets.yaml | 3 + data/presets/fields.json | 1 + data/presets/fields/wikidata.json | 7 ++ data/presets/schema/field.json | 1 + data/taginfo.json | 2 +- dist/locales/en.json | 3 + modules/presets/index.js | 4 ++ modules/ui/fields/index.js | 3 + modules/ui/fields/wikidata.js | 106 ++++++++++++++++++++++++++++++ 9 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 data/presets/fields/wikidata.json create mode 100644 modules/ui/fields/wikidata.js diff --git a/data/presets.yaml b/data/presets.yaml index 0dd5a484f..92a364263 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -2025,6 +2025,9 @@ en: width: # width=* label: Width (Meters) + wikidata: + # wikidata=* + label: Wikidata wikipedia: # 'wikipedia=*, wikidata=*' label: Wikipedia diff --git a/data/presets/fields.json b/data/presets/fields.json index fafe8b83d..056f65bd3 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -342,6 +342,7 @@ "wheelchair": {"key": "wheelchair", "type": "radio", "options": ["yes", "limited", "no"], "icon": "maki-wheelchair", "universal": true, "label": "Wheelchair Access"}, "wholesale": {"key": "wholesale", "type": "typeCombo", "label": "Wholesale"}, "width": {"key": "width", "type": "number", "minValue": 0, "label": "Width (Meters)"}, + "wikidata": {"key": "wikidata", "type": "wikidata", "icon": "wikipedia", "universal": true, "label": "Wikidata"}, "wikipedia": {"key": "wikipedia", "keys": ["wikipedia", "wikidata"], "type": "wikipedia", "icon": "wikipedia", "universal": true, "label": "Wikipedia"}, "windings": {"key": "windings", "type": "number", "minValue": 1, "label": "Windings", "placeholder": "1, 2, 3..."}, "windings/configuration": {"key": "windings:configuration", "type": "combo", "label": "Windings Configuration", "strings": {"options": {"star": "Star / Wye", "delta": "Delta", "open-delta": "Open Delta", "zigzag": "Zig Zag", "open": "Open", "scott": "Scott", "leblanc": "Leblanc"}}} diff --git a/data/presets/fields/wikidata.json b/data/presets/fields/wikidata.json new file mode 100644 index 000000000..d1c5f478a --- /dev/null +++ b/data/presets/fields/wikidata.json @@ -0,0 +1,7 @@ +{ + "key": "wikidata", + "type": "wikidata", + "icon": "wikipedia", + "universal": true, + "label": "Wikidata" +} diff --git a/data/presets/schema/field.json b/data/presets/schema/field.json index 0683361b1..b77a28413 100644 --- a/data/presets/schema/field.json +++ b/data/presets/schema/field.json @@ -71,6 +71,7 @@ "text", "typeCombo", "url", + "wikidata", "wikipedia" ], "required": true diff --git a/data/taginfo.json b/data/taginfo.json index 96dc57fc7..6d335a975 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -7863,8 +7863,8 @@ {"key": "wheelchair", "description": "Wheelchair Access"}, {"key": "wholesale", "description": "Wholesale"}, {"key": "width", "description": "Width (Meters)"}, + {"key": "wikidata", "description": "Wikidata, Wikipedia"}, {"key": "wikipedia", "description": "Wikipedia"}, - {"key": "wikidata", "description": "Wikipedia"}, {"key": "windings", "description": "Windings"}, { "key": "windings:configuration", diff --git a/dist/locales/en.json b/dist/locales/en.json index 7e95240b7..74779740b 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -3155,6 +3155,9 @@ "width": { "label": "Width (Meters)" }, + "wikidata": { + "label": "Wikidata" + }, "wikipedia": { "label": "Wikipedia" }, diff --git a/modules/presets/index.js b/modules/presets/index.js index 70038eef7..9a7297803 100644 --- a/modules/presets/index.js +++ b/modules/presets/index.js @@ -139,6 +139,10 @@ export function presetIndex() { }); } + // move the wikidata field to directly follow the wikipedia field + _universal.splice(_universal.indexOf(_fields.wikidata), 1); + _universal.splice(_universal.indexOf(_fields.wikipedia)+1, 0, _fields.wikidata); + if (d.presets) { _forEach(d.presets, function(d, id) { all.collection.push(presetPreset(id, d, _fields)); diff --git a/modules/ui/fields/index.js b/modules/ui/fields/index.js index 27950023a..12f5a7350 100644 --- a/modules/ui/fields/index.js +++ b/modules/ui/fields/index.js @@ -10,6 +10,7 @@ export * from './maxspeed'; export * from './radio'; export * from './restrictions'; export * from './textarea'; +export * from './wikidata'; export * from './wikipedia'; import { @@ -47,6 +48,7 @@ import { uiFieldLocalized } from './localized'; import { uiFieldMaxspeed } from './maxspeed'; import { uiFieldRestrictions } from './restrictions'; import { uiFieldTextarea } from './textarea'; +import { uiFieldWikidata } from './wikidata'; import { uiFieldWikipedia } from './wikipedia'; export var uiFields = { @@ -73,5 +75,6 @@ export var uiFields = { textarea: uiFieldTextarea, typeCombo: uiFieldTypeCombo, url: uiFieldUrl, + wikidata: uiFieldWikidata, wikipedia: uiFieldWikipedia }; diff --git a/modules/ui/fields/wikidata.js b/modules/ui/fields/wikidata.js new file mode 100644 index 000000000..e0e2e75d9 --- /dev/null +++ b/modules/ui/fields/wikidata.js @@ -0,0 +1,106 @@ +import { dispatch as d3_dispatch } from 'd3-dispatch'; + +import { + select as d3_select, + event as d3_event +} from 'd3-selection'; + +import { svgIcon } from '../../svg/index'; +import { + utilGetSetValue, + utilNoAuto, + utilRebind +} from '../../util'; + + +export function uiFieldWikidata(field) { + var dispatch = d3_dispatch('change'), + link = d3_select(null), + title = d3_select(null), + wikiURL = '', + entity; + + + function wiki(selection) { + + title = selection.selectAll('input.wiki-title') + .data([0]); + + title = title.enter() + .append('input') + .attr('type', 'text') + .attr('class', 'wiki-title') + .attr('id', 'preset-input-' + field.safeid) + .call(utilNoAuto) + .merge(title); + + title + .on('blur', blur) + .on('change', change); + + + link = selection.selectAll('.wiki-link') + .data([0]); + + link = link.enter() + .append('button') + .attr('class', 'button-input-action wiki-link minor') + .attr('tabindex', -1) + .call(svgIcon('#iD-icon-out-link')) + .merge(link); + + link + .on('click', function() { + d3_event.preventDefault(); + if (wikiURL) window.open(wikiURL, '_blank'); + }); + } + + + function blur() { + change(); + } + + + function change() { + var syncTags = { + wikidata: utilGetSetValue(title) + }; + dispatch.call('change', this, syncTags); + } + + + wiki.tags = function(tags) { + var value = tags[field.key] || '', + matches = value.match(/^Q[0-9]*$/); + + utilGetSetValue(title, value); + + // value in correct format + if (matches) { + wikiURL = 'https://wikidata.org/wiki/' + value; + // unrecognized value format + } else { + if (value && value !== '') { + wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + value; + } else { + wikiURL = ''; + } + } + }; + + + wiki.entity = function(_) { + if (!arguments.length) return entity; + entity = _; + return wiki; + }; + + + wiki.focus = function() { + title.node().focus(); + }; + + + return utilRebind(wiki, dispatch, 'on'); +}