From 965fb476803c0886ee88c4d413c473df8f0894a1 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 9 Oct 2013 15:36:28 -0700 Subject: [PATCH] Preserve existing Wikipedia language (fixes #1868) --- js/id/ui/preset/wikipedia.js | 26 ++++++++---------- test/index.html | 4 +++ test/index_packaged.html | 3 ++ test/spec/ui/preset/wikipedia.js | 47 ++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 15 deletions(-) create mode 100644 test/spec/ui/preset/wikipedia.js diff --git a/js/id/ui/preset/wikipedia.js b/js/id/ui/preset/wikipedia.js index 13a241293..0236a384a 100644 --- a/js/id/ui/preset/wikipedia.js +++ b/js/id/ui/preset/wikipedia.js @@ -2,7 +2,6 @@ iD.ui.preset.wikipedia = function(field, context) { var event = d3.dispatch('change'), wikipedia = iD.wikipedia(), - language = iD.data.wikipedia[0], link, entity, lang, title; function i(selection) { @@ -26,7 +25,7 @@ iD.ui.preset.wikipedia = function(field, context) { if (!value) value = context.entity(entity.id).tags.name || ''; var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions; - searchfn(language && language[2], value, function(query, data) { + searchfn(language()[2], value, function(query, data) { cb(data.map(function(d) { return { value: d }; })); @@ -38,7 +37,8 @@ iD.ui.preset.wikipedia = function(field, context) { lang.enter().append('input') .attr('type', 'text') - .attr('class', 'wiki-lang'); + .attr('class', 'wiki-lang') + .value('English'); lang .on('blur', changeLang) @@ -68,18 +68,17 @@ iD.ui.preset.wikipedia = function(field, context) { .attr('class', 'icon out-link'); } - function changeLang() { + function language() { var value = lang.value().toLowerCase(); - language = _.find(iD.data.wikipedia, function(d) { + return _.find(iD.data.wikipedia, function(d) { return d[0].toLowerCase() === value || d[1].toLowerCase() === value || d[2].toLowerCase() === value; }) || iD.data.wikipedia[0]; + } - if (value !== language[0]) { - lang.value(language[1]); - } - + function changeLang() { + lang.value(language()[1]); change(); } @@ -97,13 +96,12 @@ iD.ui.preset.wikipedia = function(field, context) { // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization value = m[2].replace(/_/g, ' '); value = value.slice(0, 1).toUpperCase() + value.slice(1); - language = newlanguage; - lang.value(language[0]); + lang.value(newlanguage[0]); } - t[field.key] = value ? language[2] + ':' + value : undefined; + t[field.key] = value ? language()[2] + ':' + value : undefined; event.change(t); - link.attr('href', 'http://' + language[2] + '.wikipedia.org/wiki/' + (value || '')); + link.attr('href', 'http://' + language()[2] + '.wikipedia.org/wiki/' + (value || '')); } i.tags = function(tags) { @@ -121,9 +119,7 @@ iD.ui.preset.wikipedia = function(field, context) { // unrecognized value format } else { - lang.value('English'); title.value(tags[field.key] || ''); - language = iD.data.wikipedia[0]; link.attr('href', 'http://en.wikipedia.org/wiki/Special:Search?search=' + tags[field.key]); } }; diff --git a/test/index.html b/test/index.html index 7836b34b2..4632e1760 100644 --- a/test/index.html +++ b/test/index.html @@ -37,7 +37,9 @@ + + @@ -103,6 +105,7 @@ + @@ -258,6 +261,7 @@ + diff --git a/test/index_packaged.html b/test/index_packaged.html index 2270d872c..9fe8137b2 100644 --- a/test/index_packaged.html +++ b/test/index_packaged.html @@ -82,6 +82,9 @@ + + + diff --git a/test/spec/ui/preset/wikipedia.js b/test/spec/ui/preset/wikipedia.js new file mode 100644 index 000000000..6deea675b --- /dev/null +++ b/test/spec/ui/preset/wikipedia.js @@ -0,0 +1,47 @@ +describe('iD.ui.preset.wikipedia', function() { + var selection, field; + + beforeEach(function() { + selection = d3.select(document.createElement('div')); + field = iD().presets().field('wikipedia'); + }); + + it('recognizes lang:title format', function() { + var wikipedia = iD.ui.preset.wikipedia(field, {}); + selection.call(wikipedia); + wikipedia.tags({wikipedia: 'en:Title'}); + expect(selection.selectAll('.wiki-lang').value()).to.equal('English'); + expect(selection.selectAll('.wiki-title').value()).to.equal('Title'); + expect(selection.selectAll('.wiki-link').attr('href')).to.equal('http://en.wikipedia.org/wiki/Title'); + }); + + it('sets a new value', function() { + var wikipedia = iD.ui.preset.wikipedia(field, {}); + selection.call(wikipedia); + + wikipedia.on('change', function(tags) { + expect(tags).to.eql({wikipedia: undefined}); + }); + + selection.selectAll('.wiki-lang').value('Deutsch'); + happen.once(selection.selectAll('.wiki-lang').node(), {type: 'change'}); + + wikipedia.on('change', function(tags) { + expect(tags).to.eql({wikipedia: 'de:Title'}); + }); + + selection.selectAll('.wiki-title').value('Title'); + happen.once(selection.selectAll('.wiki-title').node(), {type: 'change'}); + }); + + it('preserves existing language', function() { + selection.call(iD.ui.preset.wikipedia(field, {})); + selection.selectAll('.wiki-lang').value('Deutsch'); + + var wikipedia = iD.ui.preset.wikipedia(field, {}); + selection.call(wikipedia); + wikipedia.tags({}); + + expect(selection.selectAll('.wiki-lang').value()).to.equal('Deutsch'); + }); +});