summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/fields
diff options
context:
space:
mode:
authorsvs-odoo <svs@odoo.com>2018-09-04 13:44:46 +0200
committerGéry Debongnie <ged@odoo.com>2018-09-07 16:18:45 +0200
commit74fcd3ac3b0445c5fc0d9239900a9a41bfd04de8 (patch)
tree041014b3bceaa5433108bcce74ad83557a19fad8 /addons/web/static/src/js/fields
parent16aeecc73d4cf95e55f447315c983fae4ca471f7 (diff)
[IMP] web: FieldInteger and FieldFloat can use input of type number
This allow the browser/device to handle the experience of handling number in a more native way. FieldInteger and FieldFloat now inherits from NumericField because we want to format it or not dependent of the view (readonly or edit) and the NumericField will manage it. We do that because input type number can't take a value with comma on Chrome (FireFox is more permissive but not perfect because comma is the separator for decimal in this case). Task #1880376
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,