diff --git a/data/presets/fields.json b/data/presets/fields.json index 18daa4606..44b5ace6d 100644 --- a/data/presets/fields.json +++ b/data/presets/fields.json @@ -137,6 +137,7 @@ "admin_level": { "key": "admin_level", "type": "number", + "minValue": 1, "label": "Admin Level" }, "aerialway": { @@ -164,12 +165,14 @@ "aerialway/capacity": { "key": "aerialway:capacity", "type": "number", + "minValue": 0, "label": "Capacity (per hour)", "placeholder": "500, 2500, 5000..." }, "aerialway/duration": { "key": "aerialway:duration", "type": "number", + "minValue": 0, "label": "Duration (minutes)", "placeholder": "1, 2, 3..." }, @@ -181,6 +184,7 @@ "aerialway/occupancy": { "key": "aerialway:occupancy", "type": "number", + "minValue": 0, "label": "Occupancy", "placeholder": "2, 4, 8..." }, @@ -362,6 +366,7 @@ "cables": { "key": "cables", "type": "number", + "minValue": 1, "label": "Cables", "placeholder": "1, 2, 3..." }, @@ -391,6 +396,7 @@ "capacity": { "key": "capacity", "type": "number", + "minValue": 0, "label": "Capacity", "placeholder": "50, 100, 200..." }, @@ -582,6 +588,7 @@ "devices": { "key": "devices", "type": "number", + "minValue": 0, "label": "Devices", "placeholder": "1, 2, 3..." }, @@ -744,6 +751,7 @@ "faces": { "key": "faces", "type": "number", + "minValue": 0, "label": "Faces" }, "fax": { @@ -906,6 +914,7 @@ }, "height": { "key": "height", + "minValue": 0, "type": "number", "label": "Height (Meters)" }, @@ -927,6 +936,7 @@ "hoops": { "key": "hoops", "type": "number", + "minValue": 0, "label": "Hoops", "placeholder": "1, 2, 4..." }, @@ -1089,6 +1099,7 @@ "lanes": { "key": "lanes", "type": "number", + "minValue": 0, "label": "Lanes", "placeholder": "1, 2, 3..." }, @@ -1158,6 +1169,7 @@ "length": { "key": "length", "type": "number", + "minValue": 0, "label": "Length (Meters)" }, "level": { @@ -1169,6 +1181,7 @@ "levels": { "key": "building:levels", "type": "number", + "minValue": 0, "label": "Levels", "placeholder": "2, 4, 6..." }, @@ -1427,6 +1440,7 @@ "par": { "key": "par", "type": "number", + "minValue": 1, "label": "Par", "placeholder": "3, 4, 5..." }, @@ -1460,6 +1474,7 @@ "phases": { "key": "phases", "type": "number", + "minValue": 1, "label": "Phases", "placeholder": "1, 2, 3..." }, @@ -1545,11 +1560,13 @@ "playground/max_age": { "key": "max_age", "type": "number", + "minValue": 0, "label": "Maximum Age" }, "playground/min_age": { "key": "min_age", "type": "number", + "minValue": 0, "label": "Minimum Age" }, "population": { @@ -1696,6 +1713,7 @@ "rooms": { "key": "rooms", "type": "number", + "minValue": 0, "label": "Rooms" }, "route_master": { @@ -1909,6 +1927,7 @@ "stars": { "key": "stars", "type": "number", + "minValue": 0, "label": "Stars" }, "start_date": { @@ -1920,6 +1939,7 @@ "step_count": { "key": "step_count", "type": "number", + "minValue": 0, "label": "Number of Steps" }, "stop": { @@ -2312,6 +2332,7 @@ "width": { "key": "width", "type": "number", + "minValue": 0, "label": "Width (Meters)" }, "wikipedia": { @@ -2328,6 +2349,7 @@ "windings": { "key": "windings", "type": "number", + "minValue": 1, "label": "Windings", "placeholder": "1, 2, 3..." }, diff --git a/data/presets/fields/admin_level.json b/data/presets/fields/admin_level.json index 67785f0e1..0f7d318a5 100644 --- a/data/presets/fields/admin_level.json +++ b/data/presets/fields/admin_level.json @@ -1,5 +1,6 @@ { "key": "admin_level", "type": "number", + "minValue": 1, "label": "Admin Level" -} \ No newline at end of file +} diff --git a/data/presets/fields/aerialway/capacity.json b/data/presets/fields/aerialway/capacity.json index 0e3b757c3..e52f7f233 100644 --- a/data/presets/fields/aerialway/capacity.json +++ b/data/presets/fields/aerialway/capacity.json @@ -1,6 +1,7 @@ { "key": "aerialway:capacity", "type": "number", + "minValue": 0, "label": "Capacity (per hour)", "placeholder": "500, 2500, 5000..." -} \ No newline at end of file +} diff --git a/data/presets/fields/aerialway/duration.json b/data/presets/fields/aerialway/duration.json index 9754a58f7..356ad1c51 100644 --- a/data/presets/fields/aerialway/duration.json +++ b/data/presets/fields/aerialway/duration.json @@ -1,6 +1,7 @@ { "key": "aerialway:duration", "type": "number", + "minValue": 0, "label": "Duration (minutes)", "placeholder": "1, 2, 3..." -} \ No newline at end of file +} diff --git a/data/presets/fields/aerialway/occupancy.json b/data/presets/fields/aerialway/occupancy.json index 8e34a8a04..dbb702314 100644 --- a/data/presets/fields/aerialway/occupancy.json +++ b/data/presets/fields/aerialway/occupancy.json @@ -1,6 +1,7 @@ { "key": "aerialway:occupancy", "type": "number", + "minValue": 0, "label": "Occupancy", "placeholder": "2, 4, 8..." -} \ No newline at end of file +} diff --git a/data/presets/fields/cables.json b/data/presets/fields/cables.json index f6b18eb8a..623133582 100644 --- a/data/presets/fields/cables.json +++ b/data/presets/fields/cables.json @@ -1,6 +1,7 @@ { "key": "cables", "type": "number", + "minValue": 1, "label": "Cables", "placeholder": "1, 2, 3..." } diff --git a/data/presets/fields/capacity.json b/data/presets/fields/capacity.json index d91c5d294..54d242027 100644 --- a/data/presets/fields/capacity.json +++ b/data/presets/fields/capacity.json @@ -1,6 +1,7 @@ { "key": "capacity", "type": "number", + "minValue": 0, "label": "Capacity", "placeholder": "50, 100, 200..." -} \ No newline at end of file +} diff --git a/data/presets/fields/devices.json b/data/presets/fields/devices.json index 55d36db74..37971c00a 100644 --- a/data/presets/fields/devices.json +++ b/data/presets/fields/devices.json @@ -1,6 +1,7 @@ { "key": "devices", "type": "number", + "minValue": 0, "label": "Devices", "placeholder": "1, 2, 3..." } diff --git a/data/presets/fields/faces.json b/data/presets/fields/faces.json index 972b051e5..91087ccc5 100644 --- a/data/presets/fields/faces.json +++ b/data/presets/fields/faces.json @@ -1,5 +1,6 @@ { "key": "faces", "type": "number", + "minValue": 0, "label": "Faces" } diff --git a/data/presets/fields/handicap.json b/data/presets/fields/handicap.json index 68164209f..29022eb40 100644 --- a/data/presets/fields/handicap.json +++ b/data/presets/fields/handicap.json @@ -3,4 +3,4 @@ "type": "number", "label": "Handicap", "placeholder": "1-18" -} \ No newline at end of file +} diff --git a/data/presets/fields/height.json b/data/presets/fields/height.json index 8a113efe8..fd548fa6c 100644 --- a/data/presets/fields/height.json +++ b/data/presets/fields/height.json @@ -1,5 +1,6 @@ { "key": "height", + "minValue": 0, "type": "number", "label": "Height (Meters)" } diff --git a/data/presets/fields/hoops.json b/data/presets/fields/hoops.json index 4b7fe169a..e5d98688f 100644 --- a/data/presets/fields/hoops.json +++ b/data/presets/fields/hoops.json @@ -1,6 +1,7 @@ { "key": "hoops", "type": "number", + "minValue": 0, "label": "Hoops", "placeholder": "1, 2, 4..." } diff --git a/data/presets/fields/lanes.json b/data/presets/fields/lanes.json index 8b4a10628..250d3a6af 100644 --- a/data/presets/fields/lanes.json +++ b/data/presets/fields/lanes.json @@ -1,6 +1,7 @@ { "key": "lanes", "type": "number", + "minValue": 0, "label": "Lanes", - "placeholder":"1, 2, 3..." + "placeholder": "1, 2, 3..." } diff --git a/data/presets/fields/length.json b/data/presets/fields/length.json index a235ea37f..b4930c08d 100644 --- a/data/presets/fields/length.json +++ b/data/presets/fields/length.json @@ -1,5 +1,6 @@ { "key": "length", "type": "number", + "minValue": 0, "label": "Length (Meters)" } diff --git a/data/presets/fields/levels.json b/data/presets/fields/levels.json index 6b7701c53..3faebbadb 100644 --- a/data/presets/fields/levels.json +++ b/data/presets/fields/levels.json @@ -1,6 +1,7 @@ { "key": "building:levels", "type": "number", + "minValue": 0, "label": "Levels", "placeholder": "2, 4, 6..." -} \ No newline at end of file +} diff --git a/data/presets/fields/par.json b/data/presets/fields/par.json index 26462cd5c..4dc30f99e 100644 --- a/data/presets/fields/par.json +++ b/data/presets/fields/par.json @@ -1,6 +1,7 @@ { "key": "par", "type": "number", + "minValue": 1, "label": "Par", "placeholder": "3, 4, 5..." -} \ No newline at end of file +} diff --git a/data/presets/fields/phases.json b/data/presets/fields/phases.json index 5fa9aac95..b365794d6 100644 --- a/data/presets/fields/phases.json +++ b/data/presets/fields/phases.json @@ -1,6 +1,7 @@ { "key": "phases", "type": "number", + "minValue": 1, "label": "Phases", "placeholder": "1, 2, 3..." } diff --git a/data/presets/fields/playground/max_age.json b/data/presets/fields/playground/max_age.json index 53b0e9fe0..c251d9324 100644 --- a/data/presets/fields/playground/max_age.json +++ b/data/presets/fields/playground/max_age.json @@ -1,5 +1,6 @@ { "key": "max_age", "type": "number", + "minValue": 0, "label": "Maximum Age" } diff --git a/data/presets/fields/playground/min_age.json b/data/presets/fields/playground/min_age.json index 762005e62..490ba112c 100644 --- a/data/presets/fields/playground/min_age.json +++ b/data/presets/fields/playground/min_age.json @@ -1,5 +1,6 @@ { "key": "min_age", "type": "number", + "minValue": 0, "label": "Minimum Age" } diff --git a/data/presets/fields/rooms.json b/data/presets/fields/rooms.json index 29a376219..729382304 100644 --- a/data/presets/fields/rooms.json +++ b/data/presets/fields/rooms.json @@ -1,5 +1,6 @@ { "key": "rooms", "type": "number", + "minValue": 0, "label": "Rooms" } diff --git a/data/presets/fields/stars.json b/data/presets/fields/stars.json index 93e0e8e30..2e38d232d 100644 --- a/data/presets/fields/stars.json +++ b/data/presets/fields/stars.json @@ -1,5 +1,6 @@ { "key": "stars", "type": "number", + "minValue": 0, "label": "Stars" } diff --git a/data/presets/fields/step_count.json b/data/presets/fields/step_count.json index 23eebe7ff..a34582647 100644 --- a/data/presets/fields/step_count.json +++ b/data/presets/fields/step_count.json @@ -1,5 +1,6 @@ { "key": "step_count", "type": "number", + "minValue": 0, "label": "Number of Steps" } diff --git a/data/presets/fields/width.json b/data/presets/fields/width.json index 381462d8c..442a67d61 100644 --- a/data/presets/fields/width.json +++ b/data/presets/fields/width.json @@ -1,5 +1,6 @@ { "key": "width", "type": "number", + "minValue": 0, "label": "Width (Meters)" } diff --git a/data/presets/fields/windings.json b/data/presets/fields/windings.json index 106e67857..81e43ea42 100644 --- a/data/presets/fields/windings.json +++ b/data/presets/fields/windings.json @@ -1,6 +1,7 @@ { "key": "windings", "type": "number", + "minValue": 1, "label": "Windings", "placeholder": "1, 2, 3..." } diff --git a/data/presets/schema/field.json b/data/presets/schema/field.json index df4ef642d..0683361b1 100644 --- a/data/presets/schema/field.json +++ b/data/presets/schema/field.json @@ -89,7 +89,7 @@ "type": "string" }, "options": { - "description": "List of untranslatable string suggestions (combo type fields)", + "description": "List of untranslatable string suggestions (combo fields)", "type": "array", "items": { "type": "string" @@ -108,18 +108,26 @@ "type": "string" }, "strings": { - "description": "Translatable strings options (combo type fields)", + "description": "Translatable strings options (combo fields)", "type": "object" }, "snake_case": { - "description": "If true, replace spaces with underscores in the tag value (combo type fields)", + "description": "If true, replace spaces with underscores in the tag value (combo fields only)", "type": "boolean", "default": true }, "caseSensitive": { - "description": "If true, allow case sensitive field values (combo type fields)", + "description": "If true, allow case sensitive field values (combo fields only)", "type": "boolean", "default": false + }, + "minValue": { + "description": "Minimum field value (number fields only)", + "type": "integer" + }, + "maxValue": { + "description": "Maximum field value (number fields only)", + "type": "integer" } }, "additionalProperties": false diff --git a/modules/ui/fields/input.js b/modules/ui/fields/input.js index 7a33d7071..8bac53446 100644 --- a/modules/ui/fields/input.js +++ b/modules/ui/fields/input.js @@ -20,10 +20,10 @@ export { export function uiFieldText(field, context) { - var dispatch = d3_dispatch('change'), - nominatim = services.geocoder, - input, - entity; + var dispatch = d3_dispatch('change'); + var nominatim = services.geocoder; + var input; + var entity; function i(selection) { @@ -84,7 +84,20 @@ export function uiFieldText(field, context) { .on('click', function(d) { d3_event.preventDefault(); var num = parseInt(input.node().value || 0, 10); - if (!isNaN(num)) input.node().value = num + d; + if (isNaN(num)) { + num = 0; + } + + num = num + d; + + if (field.minValue !== undefined) { + num = Math.max(num, field.minValue); + } + if (field.maxValue !== undefined) { + num = Math.min(num, field.maxValue); + } + + input.node().value = num; change()(); }); }