summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/fields
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js/fields')
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js91
1 files changed, 61 insertions, 30 deletions
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 00a4532c2e1..243a28bb937 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -346,6 +346,64 @@ var InputField = DebouncedField.extend({
},
});
+var NumericField = InputField.extend({
+ tagName: 'span',
+
+ //--------------------------------------------------------------------------
+ // Public
+ //--------------------------------------------------------------------------
+
+ /**
+ * For numeric fields, 0 is a valid value.
+ *
+ * @override
+ */
+ isSet: function () {
+ return this.value === 0 || this._super.apply(this, arguments);
+ },
+
+ //--------------------------------------------------------------------------
+ // Private
+ //--------------------------------------------------------------------------
+
+ /**
+ * Format numerical value (integer or float)
+ *
+ * Note: We have to overwrite this method to skip the format if we are into
+ * edit mode on a input type number.
+ *
+ * @override
+ * @private
+ */
+ _formatValue: function (value) {
+ if (this.mode === 'edit' && this.nodeOptions.type === 'number') {
+ return value;
+ }
+ return this._super.apply(this, arguments);
+ },
+
+ /**
+ * Formats an input element for edit mode. This is in a separate function so
+ * extending widgets can use it on their input without having input as tagName.
+ *
+ * Note: We have to overwrite this method to set the input's type to number if
+ * option setted into the field.
+ *
+ * @override
+ * @private
+ */
+ _prepareInput: function ($input) {
+ var result = this._super.apply(this, arguments);
+ if (this.nodeOptions.type === 'number') {
+ this.$input.attr({type: 'number'});
+ }
+ if (this.nodeOptions.step) {
+ this.$input.attr({step: this.nodeOptions.step});
+ }
+ return result;
+ }
+});
+
var FieldChar = InputField.extend(TranslatableFieldMixin, {
className: 'o_field_char',
tagName: 'span',
@@ -811,25 +869,11 @@ var FieldBoolean = AbstractField.extend({
},
});
-var FieldInteger = InputField.extend({
+var FieldInteger = NumericField.extend({
className: 'o_field_integer o_field_number',
- tagName: 'span',
supportedFieldTypes: ['integer'],
//--------------------------------------------------------------------------
- // Public
- //--------------------------------------------------------------------------
-
- /**
- * For integer fields, 0 is a valid value.
- *
- * @override
- */
- isSet: function () {
- return this.value === 0 || this._super.apply(this, arguments);
- },
-
- //--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
@@ -858,9 +902,8 @@ var FieldInteger = InputField.extend({
},
});
-var FieldFloat = InputField.extend({
+var FieldFloat = NumericField.extend({
className: 'o_field_float o_field_number',
- tagName: 'span',
supportedFieldTypes: ['float'],
/**
@@ -875,19 +918,6 @@ var FieldFloat = InputField.extend({
this.nodeOptions.digits = JSON.parse(this.attrs.digits);
}
},
-
- //--------------------------------------------------------------------------
- // Public
- //--------------------------------------------------------------------------
-
- /**
- * For float fields, 0 is a valid value.
- *
- * @override
- */
- isSet: function () {
- return this.value === 0 || this._super.apply(this, arguments);
- },
});
var FieldFloatTime = FieldFloat.extend({
@@ -2884,6 +2914,7 @@ return {
FieldToggleBoolean: FieldToggleBoolean,
HandleWidget: HandleWidget,
InputField: InputField,
+ NumericField: NumericField,
AttachmentImage: AttachmentImage,
LabelSelection: LabelSelection,
StateSelectionWidget: StateSelectionWidget,