diff --git a/tuskar_ui/infrastructure/overview/forms.py b/tuskar_ui/infrastructure/overview/forms.py index 8336028ae..110d94945 100644 --- a/tuskar_ui/infrastructure/overview/forms.py +++ b/tuskar_ui/infrastructure/overview/forms.py @@ -136,7 +136,10 @@ class EditPlan(horizon.forms.SelfHandlingForm): for role in plan.role_list: field = django.forms.IntegerField( label=role.name, - widget=tuskar_ui.forms.NumberPickerInput, + widget=tuskar_ui.forms.NumberPickerInput(attrs={ + 'min': 1 if role.name in ('controller', 'compute') else 0, + 'step': 2 if role.name == 'controller' else 1, + }), initial=plan.get_role_node_count(role), required=False ) diff --git a/tuskar_ui/infrastructure/static/infrastructure/js/tuskar.number_picker.js b/tuskar_ui/infrastructure/static/infrastructure/js/tuskar.number_picker.js index 498081567..dee7bc4a0 100644 --- a/tuskar_ui/infrastructure/static/infrastructure/js/tuskar.number_picker.js +++ b/tuskar_ui/infrastructure/static/infrastructure/js/tuskar.number_picker.js @@ -16,13 +16,23 @@ tuskar.number_picker = (function () { if ($this.attr('readonly')) { $this.parent().addClass('readonly'); } - $this.next('a.arrow-right').click(function () { - $this.val((+$this.val()) + 1); + function change(step) { + var value = +$this.val(); + var maximum = +$this.attr('max'); + var minimum = +$this.attr('min'); + value += step; + if (!isNaN(maximum)) { value = Math.min(maximum, value); } + if (!isNaN(minimum)) { value = Math.max(minimum, value); } + $this.val(value); $this.trigger('change'); + } + $this.next('a.arrow-right').click(function () { + var step = +($this.attr('step') || 1); + change(step); }); $this.prev('a.arrow-left').click(function () { - $this.val(Math.max(0, (+$this.val()) - 1)); - $this.trigger('change'); + var step = -($this.attr('step') || 1); + change(step); }); }); };