diff options
Diffstat (limited to 'addons/web/static/src')
| -rw-r--r-- | addons/web/static/src/js/control_panel/custom_filter_item.js | 32 | ||||
| -rw-r--r-- | addons/web/static/src/xml/base.xml | 6 |
2 files changed, 25 insertions, 13 deletions
diff --git a/addons/web/static/src/js/control_panel/custom_filter_item.js b/addons/web/static/src/js/control_panel/custom_filter_item.js index 98080f6a418..0b9b1ccb8f4 100644 --- a/addons/web/static/src/js/control_panel/custom_filter_item.js +++ b/addons/web/static/src/js/control_panel/custom_filter_item.js @@ -105,6 +105,7 @@ odoo.define('web.CustomFilterItem', function (require) { const fieldType = this.fields[condition.field].type; const genericType = FIELD_TYPES[fieldType]; const operator = FIELD_OPERATORS[genericType][condition.operator]; + // Logical value switch (genericType) { case 'id': case 'number': @@ -129,6 +130,12 @@ odoo.define('web.CustomFilterItem', function (require) { default: condition.value = ""; } + // Displayed value + if (["float", "monetary"].includes(fieldType)) { + condition.displayedValue = `0${this.DECIMAL_POINT}0`; + } else { + condition.displayedValue = String(condition.value); + } } //--------------------------------------------------------------------- @@ -235,20 +242,25 @@ odoo.define('web.CustomFilterItem', function (require) { * @param {Event} ev */ _onValueInput(condition, ev) { - const type = this.fields[condition.field].type; - if (['float', 'integer', 'id'].includes(type)) { - const previousValue = condition.value; - const parser = field_utils.parse[type === 'float' ? 'float' : 'integer']; + if (!ev.target.value) { + return this._setDefaultValue(condition); + } + let { type } = this.fields[condition.field]; + if (type === "id") { + type = "integer"; + } + if (FIELD_TYPES[type] === "number") { try { - const parsed = parser(ev.target.value || 0); - // Force parsed value in the input. - ev.target.value = condition.value = (parsed || 0); + // Write logical value into the 'value' property + condition.value = field_utils.parse[type](ev.target.value); + // Write displayed value in the input and 'displayedValue' property + condition.displayedValue = ev.target.value; } catch (err) { - // Force previous value if non-parseable. - ev.target.value = previousValue || 0; + // Parsing error: reverts to previous value + ev.target.value = condition.displayedValue; } } else { - condition.value = ev.target.value || ""; + condition.value = condition.displayedValue = ev.target.value; } } } diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 949c6926ebf..36b63c852ad 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -390,20 +390,20 @@ t-att-type="DECIMAL_POINT === '.' ? 'number' : 'text'" t-attf-title="Number using {{ DECIMAL_POINT }} as decimal separator." t-attf-pattern="[0-9]+([\\{{ DECIMAL_POINT }}][0-9]+)?" - t-att-value="condition.value or (0 + DECIMAL_POINT + 0)" + t-att-value="condition.displayedValue" t-on-input="_onValueInput(condition)" /> <input t-elif="['integer', 'id'].includes(fieldType)" class="o_input" step="1" type="number" - t-att-value="condition.value or 0" + t-att-value="condition.displayedValue" t-on-input="_onValueInput(condition)" /> <input t-else="" type="text" class="o_input" - t-att-value="condition.value or ''" + t-att-value="condition.displayedValue" t-on-input="_onValueInput(condition)" /> </span> |
