[FIX] web: 'toggle_button' widget in edit mode
The 'toggle_button' widget is one of special field widgets that can trigger changes in readonly mode (in this case, toggle the boolean value when clicked). It was working fine in form views in 'readonly' mode, as in this case, the new value is saved directly, and the form view is re-rendered (a new widget is created with the new value). However, in 'edit' mode, the value isn't saved directly (the user has to click on 'Save' to save the changes), the widget is reset with its new value, and the reset wasn't correctly handled in this particular widget. Fixes #23400
This commit is contained in:
@@ -1993,8 +1993,9 @@ var FieldToggleBoolean = AbstractField.extend({
|
||||
* @private
|
||||
*/
|
||||
_render: function () {
|
||||
var className = this.value ? 'o_toggle_button_success' : 'text-muted';
|
||||
this.$('i').addClass('fa fa-circle ' + className);
|
||||
this.$('i')
|
||||
.toggleClass('o_toggle_button_success', !!this.value)
|
||||
.toggleClass('text-muted', !this.value);
|
||||
var title = this.value ? this.attrs.options.active : this.attrs.options.inactive;
|
||||
this.$el.attr('title', title);
|
||||
},
|
||||
|
||||
@@ -1272,7 +1272,7 @@
|
||||
</t>
|
||||
<t t-name="toggle_button">
|
||||
<button type="button" class="o_icon_button" t-att-title="widget.string">
|
||||
<i t-attf-class="fa #{widget.icon}" t-att-title="widget.string"/>
|
||||
<i class="fa fa-circle" t-att-title="widget.string"/>
|
||||
</button>
|
||||
</t>
|
||||
|
||||
|
||||
@@ -386,7 +386,6 @@ QUnit.module('basic_fields', {
|
||||
'<field name="bar" widget="toggle_button" ' +
|
||||
'options="{"active": "Reported in last payslips", "inactive": "To Report in Payslip"}"/>' +
|
||||
'</tree>',
|
||||
res_id: 2,
|
||||
});
|
||||
|
||||
assert.strictEqual(list.$('button i.fa.fa-circle.o_toggle_button_success').length, 4,
|
||||
@@ -410,6 +409,81 @@ QUnit.module('basic_fields', {
|
||||
list.destroy();
|
||||
});
|
||||
|
||||
QUnit.test('toggle_button in form view (edit mode)', function (assert) {
|
||||
assert.expect(6);
|
||||
|
||||
var form = createView({
|
||||
View: FormView,
|
||||
model: 'partner',
|
||||
data: this.data,
|
||||
arch: '<form>' +
|
||||
'<field name="bar" widget="toggle_button" ' +
|
||||
'options="{\'active\': \'Active value\', \'inactive\': \'Inactive value\'}"/>' +
|
||||
'</form>',
|
||||
mockRPC: function (route, args) {
|
||||
if (args.method === 'write') {
|
||||
assert.step('write');
|
||||
}
|
||||
return this._super.apply(this, arguments);
|
||||
},
|
||||
res_id: 2,
|
||||
viewOptions: {
|
||||
mode: 'edit',
|
||||
},
|
||||
});
|
||||
|
||||
assert.strictEqual(form.$('.o_field_widget[name=bar] i.o_toggle_button_success:not(.text-muted)').length,
|
||||
1, "should be green");
|
||||
|
||||
// click on the button to toggle the value
|
||||
form.$('.o_field_widget[name=bar]').click();
|
||||
|
||||
assert.strictEqual(form.$('.o_field_widget[name=bar] i.text-muted:not(.o_toggle_button_success)').length,
|
||||
1, "should be gray");
|
||||
assert.verifySteps([]);
|
||||
|
||||
// save
|
||||
form.$buttons.find('.o_form_button_save').click();
|
||||
|
||||
assert.strictEqual(form.$('.o_field_widget[name=bar] i.text-muted:not(.o_toggle_button_success)').length,
|
||||
1, "should still be gray");
|
||||
assert.verifySteps(['write']);
|
||||
|
||||
form.destroy();
|
||||
});
|
||||
|
||||
QUnit.test('toggle_button in form view (readonly mode)', function (assert) {
|
||||
assert.expect(4);
|
||||
|
||||
var form = createView({
|
||||
View: FormView,
|
||||
model: 'partner',
|
||||
data: this.data,
|
||||
arch: '<form>' +
|
||||
'<field name="bar" widget="toggle_button" ' +
|
||||
'options="{\'active\': \'Active value\', \'inactive\': \'Inactive value\'}"/>' +
|
||||
'</form>',
|
||||
mockRPC: function (route, args) {
|
||||
if (args.method === 'write') {
|
||||
assert.step('write');
|
||||
}
|
||||
return this._super.apply(this, arguments);
|
||||
},
|
||||
res_id: 2,
|
||||
});
|
||||
|
||||
assert.strictEqual(form.$('.o_field_widget[name=bar] i.o_toggle_button_success:not(.text-muted)').length,
|
||||
1, "should be green");
|
||||
|
||||
// click on the button to toggle the value
|
||||
form.$('.o_field_widget[name=bar]').click();
|
||||
|
||||
assert.strictEqual(form.$('.o_field_widget[name=bar] i.text-muted:not(.o_toggle_button_success)').length,
|
||||
1, "should be gray");
|
||||
assert.verifySteps(['write']);
|
||||
|
||||
form.destroy();
|
||||
});
|
||||
|
||||
QUnit.module('FieldFloat');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user