diff --git a/Makefile b/Makefile
index 691a1a860..fc3df7b44 100644
--- a/Makefile
+++ b/Makefile
@@ -126,4 +126,4 @@ js/lib/d3.v3.js: $(D3_FILES)
@echo 'd3 rebuilt. Please reapply 7e2485d, 4da529f, and 223974d'
js/lib/lodash.js:
- node_modules/.bin/lodash --debug --output $@ include="any,assign,bind,clone,compact,contains,debounce,difference,each,every,extend,filter,find,first,forEach,groupBy,indexOf,intersection,isEmpty,isEqual,isFunction,keys,last,map,omit,pairs,pluck,reject,some,throttle,union,uniq,unique,values,without,flatten,value,chain,cloneDeep,merge,pick" exports="global,node"
+ node_modules/.bin/lodash --debug --output $@ include="any,assign,bind,clone,compact,contains,debounce,difference,each,every,extend,filter,find,first,forEach,groupBy,indexOf,intersection,isEmpty,isEqual,isFunction,keys,last,map,omit,pairs,pluck,reject,some,throttle,union,uniq,unique,values,without,flatten,value,chain,cloneDeep,merge,pick,reduce" exports="global,node"
diff --git a/css/app.css b/css/app.css
index 8ddefddf3..70a5eace3 100644
--- a/css/app.css
+++ b/css/app.css
@@ -1522,26 +1522,6 @@ input[type=number] {
border-radius: 0 0 4px 0;
}
-.form-field .addr-housename {
- width: 100%;
-}
-
-.form-field .addr-housenumber {
- width: 33.3333%;
-}
-
-.form-field .addr-street {
- width: 66.6666%;
-}
-
-.form-field .addr-city {
- width: 66.6666%;
-}
-
-.form-field .addr-postcode {
- width: 33.3333%;
-}
-
/* Restrictions editor */
.form-field-restrictions .preset-input-wrap {
diff --git a/js/id/ui/preset/address.js b/js/id/ui/preset/address.js
index 455c8b0de..0d6f8fae2 100644
--- a/js/id/ui/preset/address.js
+++ b/js/id/ui/preset/address.js
@@ -4,6 +4,13 @@ iD.ui.preset.address = function(field, context) {
entity,
isInitialized;
+ var widths = {
+ housenumber: 1/3,
+ street: 2/3,
+ city: 2/3,
+ postcode: 1/3
+ };
+
function getStreets() {
var extent = entity.extent(context.graph()),
l = extent.center(),
@@ -103,18 +110,33 @@ iD.ui.preset.address = function(field, context) {
return a && a.countryCodes && _.contains(a.countryCodes, countryCode);
}) || _.first(iD.data.addressFormats);
+ function row(row) {
+ // Normalize widths.
+ var total = _.reduce(row, function(sum, field) {
+ return sum + (widths[field] || .5);
+ }, 0);
+
+ return row.map(function (field) {
+ return {
+ id: field,
+ width: (widths[field] || .5) / total
+ };
+ })
+ }
+
enter.selectAll('div')
.data(addressFormat.format)
.enter()
.append('div')
.attr('class', 'addr-row')
.selectAll('input')
- .data(function (d) { return d; })
+ .data(row)
.enter()
.append('input')
.property('type', 'text')
- .attr('placeholder', function (d) { return field.t('placeholders.' + d); })
- .attr('class', function (d) { return 'addr-' + d; });
+ .attr('placeholder', function (d) { return field.t('placeholders.' + d.id); })
+ .attr('class', function (d) { return 'addr-' + d.id; })
+ .style('width', function (d) { return d.width * 100 + '%'; });
// Update
@@ -150,7 +172,7 @@ iD.ui.preset.address = function(field, context) {
wrap.selectAll('input')
.each(function (field) {
- tags['addr:' + field] = this.value || undefined;
+ tags['addr:' + field.id] = this.value || undefined;
});
event.change(tags);
@@ -159,7 +181,7 @@ iD.ui.preset.address = function(field, context) {
function updateTags(tags) {
wrap.selectAll('input')
.value(function (field) {
- return tags['addr:' + field] || '';
+ return tags['addr:' + field.id] || '';
});
}
diff --git a/js/lib/lodash.js b/js/lib/lodash.js
index 4c8cb489e..c9d0b1c0c 100644
--- a/js/lib/lodash.js
+++ b/js/lib/lodash.js
@@ -1,7 +1,7 @@
/**
* @license
* Lo-Dash 2.3.0 (Custom Build)
- * Build: `lodash --debug --output js/lib/lodash.js include="any,assign,bind,clone,compact,contains,debounce,difference,each,every,extend,filter,find,first,forEach,groupBy,indexOf,intersection,isEmpty,isEqual,isFunction,keys,last,map,omit,pairs,pluck,reject,some,throttle,union,uniq,unique,values,without,flatten,value,chain,cloneDeep,merge,pick" exports="global,node"`
+ * Build: `lodash --debug --output js/lib/lodash.js include="any,assign,bind,clone,compact,contains,debounce,difference,each,every,extend,filter,find,first,forEach,groupBy,indexOf,intersection,isEmpty,isEqual,isFunction,keys,last,map,omit,pairs,pluck,reject,some,throttle,union,uniq,unique,values,without,flatten,value,chain,cloneDeep,merge,pick,reduce" exports="global,node"`
* Copyright 2012-2013 The Dojo Foundation
* Based on Underscore.js 1.5.2
* Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
@@ -2784,6 +2784,60 @@
*/
var pluck = map;
+ /**
+ * Reduces a collection to a value which is the accumulated result of running
+ * each element in the collection through the callback, where each successive
+ * callback execution consumes the return value of the previous execution. If
+ * `accumulator` is not provided the first element of the collection will be
+ * used as the initial `accumulator` value. The callback is bound to `thisArg`
+ * and invoked with four arguments; (accumulator, value, index|key, collection).
+ *
+ * @static
+ * @memberOf _
+ * @alias foldl, inject
+ * @category Collections
+ * @param {Array|Object|string} collection The collection to iterate over.
+ * @param {Function} [callback=identity] The function called per iteration.
+ * @param {*} [accumulator] Initial value of the accumulator.
+ * @param {*} [thisArg] The `this` binding of `callback`.
+ * @returns {*} Returns the accumulated value.
+ * @example
+ *
+ * var sum = _.reduce([1, 2, 3], function(sum, num) {
+ * return sum + num;
+ * });
+ * // => 6
+ *
+ * var mapped = _.reduce({ 'a': 1, 'b': 2, 'c': 3 }, function(result, num, key) {
+ * result[key] = num * 3;
+ * return result;
+ * }, {});
+ * // => { 'a': 3, 'b': 6, 'c': 9 }
+ */
+ function reduce(collection, callback, accumulator, thisArg) {
+ var noaccum = arguments.length < 3;
+ callback = lodash.createCallback(callback, thisArg, 4);
+
+ if (isArray(collection)) {
+ var index = -1,
+ length = collection.length;
+
+ if (noaccum) {
+ accumulator = collection[++index];
+ }
+ while (++index < length) {
+ accumulator = callback(accumulator, collection[index], index, collection);
+ }
+ } else {
+ baseEach(collection, function(value, index, collection) {
+ accumulator = noaccum
+ ? (noaccum = false, value)
+ : callback(accumulator, value, index, collection)
+ });
+ }
+ return accumulator;
+ }
+
/**
* The opposite of `_.filter` this method returns the elements of a
* collection that the callback does **not** return truey for.
@@ -3921,6 +3975,7 @@
lodash.isString = isString;
lodash.mixin = mixin;
lodash.noop = noop;
+ lodash.reduce = reduce;
lodash.some = some;
lodash.sortedIndex = sortedIndex;
@@ -3929,7 +3984,9 @@
lodash.any = some;
lodash.detect = find;
lodash.findWhere = find;
+ lodash.foldl = reduce;
lodash.include = contains;
+ lodash.inject = reduce;
forOwn(lodash, function(func, methodName) {
if (!lodash.prototype[methodName]) {