From 2e7a47d0f29f227195f11ed424adc626da36c475 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Sun, 31 Mar 2019 15:49:35 -0400 Subject: [PATCH] Update the wikipedia tag when setting the wikidata tag via the field (close #5543) --- data/presets.yaml | 2 +- data/presets/fields.json | 2 +- data/presets/fields/wikidata.json | 1 + data/taginfo.json | 2 +- modules/ui/fields/wikidata.js | 77 +++++++++++++++++++++++++++++-- 5 files changed, 78 insertions(+), 6 deletions(-) diff --git a/data/presets.yaml b/data/presets.yaml index 6d97788e9..595ecdc82 100644 --- a/data/presets.yaml +++ b/data/presets.yaml @@ -2167,7 +2167,7 @@ en: # width=* label: Width (Meters) wikidata: - # wikidata=* + # 'wikidata=*, wikipedia=*' label: Wikidata wikipedia: # 'wikipedia=*, wikidata=*' diff --git a/data/presets/fields.json b/data/presets/fields.json index 393892f7e..2421fe36a 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -383,7 +383,7 @@ "wheelchair": {"key": "wheelchair", "type": "radio", "options": ["yes", "limited", "no"], "icon": "maki-wheelchair", "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"}, + "wikidata": {"key": "wikidata", "keys": ["wikidata", "wikipedia"], "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 index d1c5f478a..f5d5af4a6 100644 --- a/data/presets/fields/wikidata.json +++ b/data/presets/fields/wikidata.json @@ -1,5 +1,6 @@ { "key": "wikidata", + "keys": ["wikidata", "wikipedia"], "type": "wikidata", "icon": "wikipedia", "universal": true, diff --git a/data/taginfo.json b/data/taginfo.json index 80692f5f4..bf40a4831 100644 --- a/data/taginfo.json +++ b/data/taginfo.json @@ -1642,7 +1642,7 @@ {"key": "wholesale", "description": "🄵 Wholesale"}, {"key": "width", "description": "🄵 Width (Meters)"}, {"key": "wikidata", "description": "🄵 Wikidata, 🄵 Wikipedia"}, - {"key": "wikipedia", "description": "🄵 Wikipedia"}, + {"key": "wikipedia", "description": "🄵 Wikidata, 🄵 Wikipedia"}, {"key": "windings", "description": "🄵 Windings"}, {"key": "windings:configuration", "value": "star", "description": "🄵 Windings Configuration"}, {"key": "windings:configuration", "value": "delta", "description": "🄵 Windings Configuration"}, diff --git a/modules/ui/fields/wikidata.js b/modules/ui/fields/wikidata.js index 37e775fbe..d38e687d4 100644 --- a/modules/ui/fields/wikidata.js +++ b/modules/ui/fields/wikidata.js @@ -7,6 +7,7 @@ import { import { uiCombobox } from '../index'; +import { actionChangeTags } from '../../actions/index'; import { services } from '../../services/index'; import { svgIcon } from '../../svg/index'; @@ -153,10 +154,80 @@ export function uiFieldWikidata(field, context) { function change() { - var syncTags = { - wikidata: _qid - }; + var syncTags = {}; + syncTags[field.key] = _qid; dispatch.call('change', this, syncTags); + + // attempt asynchronous update of wikidata tag.. + var initGraph = context.graph(); + var initEntityID = _entity.id; + + wikidata.entityByQID(_qid, function(err, entity) { + if (err) return; + + // If graph has changed, we can't apply this update. + if (context.graph() !== initGraph) return; + + if (!entity.sitelinks) return; + + var langs = wikidata.languagesToQuery(); + // use the label and description languages as fallbacks + ['labels', 'descriptions'].forEach(function(key) { + if (!entity[key]) return; + + var valueLangs = Object.keys(entity[key]); + if (valueLangs.length === 0) return; + var valueLang = valueLangs[0]; + + if (langs.indexOf(valueLang) === -1) { + langs.push(valueLang); + } + }); + + var currTags = Object.assign({}, context.entity(initEntityID).tags); // shallow copy + + var foundPreferred; + for (var i in langs) { + var lang = langs[i]; + var siteID = lang.replace('-', '_') + 'wiki'; + if (entity.sitelinks[siteID]) { + foundPreferred = true; + currTags.wikipedia = lang + ':' + entity.sitelinks[siteID].title; + // use the first match + break; + } + } + + if (!foundPreferred) { + // No wikipedia sites available in the user's language or the fallback languages, + // default to any wikipedia sitelink + + var wikiSiteKeys = Object.keys(entity.sitelinks).filter(function(site) { + return site.endsWith('wiki'); + }); + + if (wikiSiteKeys.length === 0) { + // if no wikipedia pages are linked to this wikidata entity, delete that tag + if (currTags.wikipedia) { + delete currTags.wikipedia; + } + } else { + var wikiLang = wikiSiteKeys[0].slice(0, -4).replace('_', '-'); + var wikiTitle = entity.sitelinks[wikiSiteKeys[0]].title; + currTags.wikipedia = wikiLang + ':' + wikiTitle; + } + } + + // Coalesce the update of wikidata tag into the previous tag change + context.overwrite( + actionChangeTags(initEntityID, currTags), + context.history().undoAnnotation() + ); + + // do not dispatch.call('change') here, because entity_editor + // changeTags() is not intended to be called asynchronously + + }); } function setLabelForEntity() {