const assert = require("assert"); Feature("Nested choices"); Scenario("Switching states at nested choices", async ({ I, LabelStudio }) => { const params = { config: ` `, data: { text: "Some text", }, annotations: [ { id: "test", result: [], }, ], }; I.amOnPage("/"); LabelStudio.init(params); { // Select one choice I.click("Option 1.1"); const result = await LabelStudio.serialize(); // Should be checked only one item assert.deepStrictEqual(result[0].value.choices.length, 1); assert.deepStrictEqual(result[0].value.choices, [["Header 1", "Option 1.1"]]); // There might be checkbox with indeterminate state I.seeElement(".ant-checkbox-indeterminate [name='Header 1']"); } { // Select a couple of choices by selecting the parent choice I.click("Header 1"); const result = await LabelStudio.serialize(); // Should be checked three items assert.deepStrictEqual(result[0].value.choices.length, 3); assert.deepStrictEqual(result[0].value.choices, [ ["Header 1"], ["Header 1", "Option 1.1"], ["Header 1", "Option 1.2"], ]); I.dontSeeElement(".ant-checkbox-indeterminate [name='Header 1']"); } { // Unselect a couple of choices by unselecting the parent choice I.click("Header 1"); const result = await LabelStudio.serialize(); // Should be checked three items assert.deepStrictEqual(result.length, 0); } }); Scenario("Nested choices states from the annotation", async ({ I, LabelStudio }) => { const params = { config: ` `, data: { text: "Some text", }, }; I.amOnPage("/"); // Load annotation with each type of selection for branches (fully checked, fully unchecked, partly checked) LabelStudio.init({ ...params, annotations: [ { id: "test", result: [ { id: "choices_test", from_name: "choices", to_name: "text", type: "choices", value: { choices: [ ["Header 1"], ["Header 1", "Option 1.1"], ["Header 1", "Option 1.2"], ["Header 3", "Option 3.1"], ], }, }, ], }, ], }); // Check loaded results: // Fully checked branch of choices I.dontSeeElement(".ant-checkbox-indeterminate [name='Header 1']"); I.seeElement(".ant-checkbox-checked [name='Header 1']"); I.seeElement(".ant-checkbox-checked [name='Option 1.1']"); I.seeElement(".ant-checkbox-checked [name='Option 1.2']"); // Fully unchecked branch of choices I.dontSeeElement(".ant-checkbox-indeterminate [name='Header 2']"); I.dontSeeElement(".ant-checkbox-checked [name='Header 2']"); I.dontSeeElement(".ant-checkbox-checked [name='Option 2.1']"); I.dontSeeElement(".ant-checkbox-checked [name='Option 2.2']"); // Partly checked branch of choices I.seeElement(".ant-checkbox-indeterminate [name='Header 3']"); I.dontSeeElement(".ant-checkbox-checked [name='Header 3']"); I.seeElement(".ant-checkbox-checked [name='Option 3.1']"); I.dontSeeElement(".ant-checkbox-checked [name='Option 3.2']"); const result = await LabelStudio.serialize(); // Should be checked only one item assert.deepStrictEqual(result[0].value.choices.length, 4); assert.deepStrictEqual(result[0].value.choices, [ ["Header 1"], ["Header 1", "Option 1.1"], ["Header 1", "Option 1.2"], ["Header 3", "Option 3.1"], ]); });