summaryrefslogtreecommitdiff
path: root/addons/web/static/tests
diff options
context:
space:
mode:
authorAaron Bohy <aab@odoo.com>2021-03-05 08:25:52 +0000
committerAaron Bohy <aab@odoo.com>2021-03-05 14:04:42 +0000
commit45ae3311fa3f244f9b54349686cb0da8c7fa6a9a (patch)
treeef1cb236afcce62662a5ad1586a042f5c5dcec0a /addons/web/static/tests
parentc813655074b3b83bdf9345ef12399b0b96feaf71 (diff)
[FIX] web: can edit many2many_checkboxes with 40+ values
Before this commit, if the widget "many2many_checkboxes" was set on a field with more than 40 values in the comodel (i.e. more than 40 checkboxes displayed), (un)selecting a checkbox that wasn't in the first 40 checkboxes crashed. This was due to the default x2many limit of 40: we only created a datapoint for the first 40 values, whereas we could have up to 100 values to process (name_search server-side limit). Note that this limit of 40 had no other impact than limitating the number of records processed by the BasicModel, the maximum number of checkboxes displayed being ruled by the name_search server-side limit. This commit ensures that all values returned by the server (at most 100 when this message is written) are processed and can be edited as expected. opw~2439041 X-original-commit: be5e5bc49cb9744c26ca75dcee74caf11447f250
Diffstat (limited to 'addons/web/static/tests')
-rw-r--r--addons/web/static/tests/fields/relational_fields_tests.js50
1 files changed, 50 insertions, 0 deletions
diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js
index f93e7c35ace..1c0b3a6d33b 100644
--- a/addons/web/static/tests/fields/relational_fields_tests.js
+++ b/addons/web/static/tests/fields/relational_fields_tests.js
@@ -2422,6 +2422,56 @@ QUnit.module('relational_fields', {
form.destroy();
});
+ QUnit.test('widget many2many_checkboxes with 40+ values', async function (assert) {
+ // 40 is the default limit for x2many fields. However, the many2many_checkboxes is a
+ // special field that fetches its data through the fetchSpecialData mechanism, and it
+ // uses the name_search server-side limit of 100. This test comes with a fix for a bug
+ // that occurred when the user (un)selected a checkbox that wasn't in the 40 first checkboxes,
+ // because the piece of data corresponding to that checkbox hadn't been processed by the
+ // BasicModel, whereas the code handling the change assumed it had.
+ assert.expect(3);
+
+ const records = [];
+ for (let id = 1; id <= 90; id++) {
+ records.push({
+ id,
+ display_name: `type ${id}`,
+ color: id % 7,
+ });
+ }
+ this.data.partner_type.records = records;
+ this.data.partner.records[0].timmy = records.map((r) => r.id);
+
+ const form = await createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form><field name="timmy" widget="many2many_checkboxes"/></form>',
+ res_id: 1,
+ async mockRPC(route, args) {
+ if (args.method === 'write') {
+ const expectedIds = records.map((r) => r.id);
+ expectedIds.pop();
+ assert.deepEqual(args.args[1].timmy, [[6, false, expectedIds]]);
+ }
+ return this._super(...arguments);
+ },
+ viewOptions: {
+ mode: 'edit',
+ },
+ });
+
+ assert.containsN(form, '.o_field_widget[name=timmy] input[type=checkbox]:checked', 90);
+
+ // toggle the last value
+ await testUtils.dom.click(form.$('.o_field_widget[name=timmy] input[type=checkbox]:last'));
+ assert.notOk(form.$('.o_field_widget[name=timmy] input[type=checkbox]:last').is(':checked'));
+
+ await testUtils.form.clickSave(form);
+
+ form.destroy();
+ });
+
QUnit.module('FieldMany2ManyBinaryMultiFiles');
QUnit.test('widget many2many_binary', async function (assert) {