'use strict';
;require.register("views/common/form/spinner_input_view", function (exports, require, module) {
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var App = require('app');
App.SpinnerInputView = Em.View.extend({
templateName: require('templates/common/form/spinner_input'),
classNames: ['spinner-input'],
/**
* Bind content directly from Handlebars template or any another way.
* For example:
* {{view App.SpinnerInputView contentBinding="someContent"}}
*
* @property content
* @type {Object}
*/
content: {
/**
* Minimal value that can be set. (not required)
*
* @property [minValue]
* @type {Number}
*/
minValue: null,
/**
* Maximum value that can be set. (not required)
*
* @property [maxValue]
* @type {Number}
*/
maxValue: null,
/**
* Input value. (required)
*
* @property value
* @type {String|Number}
*/
value: null,
/**
* Config display name. Will be shown beneath the input. (not required)
*
* @type {String}
* @property [label]
*/
label: null,
/**
* If set to true value will toggle with max|min on property exceed value.
*
* @property [invertOnOverflow]
* @type {Boolean}
*/
invertOnOverflow: false,
/**
* Determines if this control should be enabled or disabled
* It's based on increment_step value
*
* @property [enabled]
* @type {Boolean}
*/
enabled: true,
/**
* Increment value
*
* @property [incrementStep]
* @type {Number}
*/
incrementStep: 1
},
/**
* Input should be disabled, if whole widget is disabled or if its unit is less than step_increment value
* @type {boolean}
*/
computedDisabled: Em.computed.or('!content.enabled', 'disabled'),
incrementValue: function incrementValue() {
this.setValue(true);
},
decrementValue: function decrementValue() {
this.setValue(false);
},
setValue: function setValue(increment) {
var incrementStep = this.get('content.incrementStep');
var value = parseInt(this.get('content.value')) + (increment ? incrementStep : -incrementStep);
// if minimal required value is specified and decremented property value is less than minimal
if (!Em.isEmpty(this.get('content.minValue')) && !increment && value < this.get('content.minValue')) {
// set maximum value if value invert accepted
value = this.get('content.invertOnOverflow') ? this.get('content.maxValue') + 1 - incrementStep : this.get('content.minValue');
}
// if maximum require value is specified and incremented value is more than maximum
else if (!Em.isEmpty(this.get('content.maxValue')) && increment && value > this.get('content.maxValue')) {
// set minimum if value invert accepted
value = this.get('content.invertOnOverflow') ? this.get('content.minValue') : this.get('content.maxValue');
}
this.set('content.value', value);
},
/**
* Handle keyboard event. Allow digits only and some key maps.
*/
keyDown: function keyDown(e) {
var charCode = e.charCode ? e.charCode : e.which;
if ([46, 8, 9, 27, 13, 110].contains(charCode) || charCode == 65 && e.ctrlKey === true || charCode == 67 && e.ctrlKey === true || charCode == 88 && e.ctrlKey === true || charCode >= 35 && charCode <= 39) {
return;
}
Eif (charCode == 190 || (e.shiftKey || charCode < 48 || charCode > 57) && (charCode < 96 || charCode > 105)) {
e.preventDefault();
}
},
/**
* Change value to maximum if exceeded.
*/
keyUp: function keyUp(e) {
if (!Em.isEmpty(this.get('content.maxValue')) && this.get('content.value') > this.get('content.maxValue')) {
this.set('content.value', this.get('content.maxValue'));
}
},
/**
* Set value to 0 if user removed it and changed focus to another element.
*/
focusOut: function focusOut(e) {
if (Em.isEmpty(this.get('content.value'))) {
this.set('content.value', 0);
}
}
});
}); |