const assert = require("assert"); Feature("Richtext regions displaying"); Scenario("Display correct colors", async ({ I, LabelStudio, AtLabels, AtRichText }) => { I.amOnPage("/"); LabelStudio.init({ config: ` `, data: { text: "Red. Green. Blue. Yellow.", }, annotations: [ { id: "test", result: [ { id: "Red", from_name: "label", to_name: "text", type: "labels", value: { start: 0, end: 3, labels: ["Red"] }, }, { id: "Green", from_name: "label", to_name: "text", type: "labels", value: { start: 5, end: 10, labels: ["Green"] }, }, ], }, ], settings: { selectAfterCreate: true, }, }); LabelStudio.waitForObjectsReady(); { I.pressKey("u"); const elementLocator = locate(".htx-highlight").withText("Red"); I.say("Red is red"); const color = await I.grabCssPropertyFrom(elementLocator, "background-color"); I.say(`The color of it is ${color}`); assert(color.includes("(255, 0, 0"), "Oh no! Red is not red!"); I.say("even if it's selected"); I.click(elementLocator); const selectedColor = await I.grabCssPropertyFrom(elementLocator, "background-color"); I.say(`The color of it is ${selectedColor}`); assert(selectedColor.includes("(255, 0, 0"), "Oh no! Red is not red!"); } { I.pressKey("u"); const elementLocator = locate(".htx-highlight").withText("Green"); I.say("Green is green"); const color = await I.grabCssPropertyFrom(elementLocator, "background-color"); I.say(`The color of it is ${color}`); assert(color.includes("(0, 255, 0"), "Oh no! Green is not green!"); I.say("even if it's selected"); I.click(elementLocator); const selectedColor = await I.grabCssPropertyFrom(elementLocator, "background-color"); I.say(`The color of it is ${selectedColor}`); assert(selectedColor.includes("(0, 255, 0"), "Oh no! Green is not green!"); } { I.pressKey("u"); I.say('Let\'s label "Blue" as `Blue`.'); AtLabels.clickLabel("Blue"); AtRichText.selectTextByGlobalOffset(12, 16); const elementLocator = locate(".htx-highlight").withText("Blue"); I.say("Now Blue is blue"); const color = await I.grabCssPropertyFrom(elementLocator, "background-color"); I.say(`The color of it is ${color}`); assert(color.includes("(0, 0, 255"), "Oh no! Blue is not blue!"); I.say("even if it's unselected"); I.pressKey("u"); const unselectedColor = await I.grabCssPropertyFrom(elementLocator, "background-color"); I.say(`The color of it is ${unselectedColor}`); assert(unselectedColor.includes("(0, 0, 255"), "Oh no! Blue is not blue!"); } { I.pressKey("u"); I.say('Let\'s label "Yellow" as `Red`.'); AtLabels.clickLabel("Red"); AtRichText.selectTextByGlobalOffset(18, 24); I.say("Change it to Green"); AtLabels.clickLabel("Green"); I.say("and finally to Yellow"); AtLabels.clickLabel("Yellow"); const elementLocator = locate(".htx-highlight").withText("Yellow"); I.say("It's really yellow now"); const color = await I.grabCssPropertyFrom(elementLocator, "background-color"); I.say(`The color of it is ${color}`); assert(color.includes("(255, 255, 0"), "Oh no! Yellow is not yellow!"); I.say("even if it's unselected"); I.pressKey("u"); const unselectedColor = await I.grabCssPropertyFrom(elementLocator, "background-color"); I.say(`The color of it is ${unselectedColor}`); assert(unselectedColor.includes("(255, 255, 0"), "Oh no! Yellow is not yellow!"); } }); Scenario("Displaying selected and highlighted regions", async ({ I, LabelStudio, AtOutliner, AtDetails }) => { I.amOnPage("/"); LabelStudio.init({ config: ` `, data: { text: "Region. Blank.", }, annotations: [ { id: "test", result: [ { id: "Region", from_name: "label", to_name: "text", type: "labels", value: { start: 0, end: 6, labels: ["Region"] }, }, { id: "Blank", from_name: "label", to_name: "text", type: "labels", value: { start: 8, end: 13, labels: [] }, }, ], }, ], }); LabelStudio.waitForObjectsReady(); AtOutliner.seeRegions(2); { I.say("Highlighted regions should have a different border"); const originalBorder = await I.grabCssPropertyFrom(".htx-highlight", "border"); { I.say("The different border should appears on hovering region"); AtOutliner.hoverRegion(1); const hoveredBorder = await I.grabCssPropertyFrom(".htx-highlight", "border"); assert.notEqual( originalBorder, hoveredBorder, "The border of the region hovered in outliner tree should be different from the normal state's value", ); } { I.say("Unhover the region"); I.moveCursorTo("#logo"); const unhoveredBorder = await I.grabCssPropertyFrom(".htx-highlight", "border"); assert.equal( originalBorder, unhoveredBorder, "The border of the region that was unhovered should be equal to the original state's value", ); } { I.say('The other way to get hovered state id using the "Create relation" tool...'); AtOutliner.clickRegion(2); AtDetails.clickCreateRelation(); I.say("...and hover it inside the editor."); I.moveCursorTo(".htx-highlight"); const hoveredBorder = await I.grabCssPropertyFrom(".htx-highlight", "border"); assert.notEqual( originalBorder, hoveredBorder, "The border of the region hovered inside the editor tree should be different from the normal state's value", ); } } I.say("Exit relation mode"); I.pressKey("Escape"); // Exit linking mode I.say("Region should be still selected"); I.seeElement(".htx-highlight.__active"); I.pressKey("Escape"); // Unselect region { I.say("The background of the element should be visually different on selection"); const originalBackground = await I.grabCssPropertyFrom(".htx-highlight", "background"); AtOutliner.clickRegion(1); const selectedBackground = await I.grabCssPropertyFrom(".htx-highlight", "background"); assert.notEqual( originalBackground, selectedBackground, "The background of the element should be visually different on selection", ); } }); Scenario("Displaying label in the region", async ({ I, LabelStudio, AtOutliner, AtSettings }) => { async function checkLabelVisibility(locator, content, shouldBeVisible = true) { const text = await I.grabCssPropertyFromPseudo(locator, "content", "after"); const display = await I.grabCssPropertyFromPseudo(locator, "display", "after"); assert.strictEqual(text, content, `Label name should be "${content}" but "${text}" was seen.`); if (shouldBeVisible) { assert.strictEqual(display, "inline", "Label should be visible."); } else { assert.strictEqual(display, "none", "Label should be hidden."); } } I.amOnPage("/"); LabelStudio.init({ config: ` `, data: { text: "Region. Blank.", }, annotations: [ { id: "test", result: [ { id: "Region", from_name: "label", to_name: "text", type: "labels", value: { start: 0, end: 6, labels: ["Region"] }, }, { id: "Blank", from_name: "label", to_name: "text", type: "labels", value: { start: 8, end: 13, labels: [] }, }, ], }, ], settings: { showLabels: true, }, }); LabelStudio.waitForObjectsReady(); AtOutliner.seeRegions(2); await checkLabelVisibility(locate(".htx-highlight").at(1), '"1:Region"', true); await checkLabelVisibility(locate(".htx-highlight").at(2), '"2"', true); I.say("Hide labels in settings"); AtSettings.open(); AtSettings.setGeneralSettings({ [AtSettings.GENERAL_SETTINGS.SHOW_LABELS]: false, }); AtSettings.close(); I.say("Make sure that label is hidden"); await checkLabelVisibility(locate(".htx-highlight").at(1), '"1:Region"', false); await checkLabelVisibility(locate(".htx-highlight").at(2), '"2"', false); });