Feature("Richtext basic functional"); Before(({ LabelStudio }) => { LabelStudio.setFeatureFlags({ fflag_feat_front_dev_3873_labeling_ui_improvements_short: true, }); }); Scenario("Creating, removing and restoring regions", async ({ I, LabelStudio, AtOutliner, AtRichText }) => { I.amOnPage("/"); LabelStudio.init({ config: ` `, data: { html: "
Hello world!
", }, annotations: [ { id: "test", result: [ { id: "Highlight_1", from_name: "label", to_name: "html", type: "labels", value: { start: "/div[1]", startOffset: 0, end: "/div[1]", endOffset: 5, labels: ["Highlight"], }, }, ], }, ], }); LabelStudio.waitForObjectsReady(); const regionALocator = locate(".htx-highlight").withText("Hello"); const regionAStyleLocator = locate('style[id^="highlight-Highlight_1"]'); const regionBLocator = locate(".htx-highlight").withText("world"); const regionBStyleLocator = locate( 'style[id^="highlight-"]:not([id^="highlight-Highlight_1"]):not([id="highlight-html"])', ); AtOutliner.seeRegions(1); I.say("We have 1 preset region. Let's create another one."); I.pressKey("1"); AtRichText.selectTextByGlobalOffset(6, 11); AtOutliner.seeRegions(2); within({ frame: ".lsf-richtext__iframe" }, () => { I.say("We can see all the regions inside the rich text and their styles in head."); I.seeElement(regionALocator); I.seeElementInDOM(regionAStyleLocator); I.seeElement(regionBLocator); I.seeElementInDOM(regionBStyleLocator); }); I.say("Delete all regions"); I.pressKey(["CommandOrControl", "Backspace"]); I.acceptPopup(); AtOutliner.seeRegions(0); within({ frame: ".lsf-richtext__iframe" }, () => { I.say("Spans and styles should disappear"); I.dontSeeElement(regionALocator); I.dontSeeElementInDOM(regionAStyleLocator); I.dontSeeElement(regionBLocator); I.dontSeeElementInDOM(regionBStyleLocator); }); I.say("Go back through the history and check that everything is restored"); I.pressKey(["CommandOrControl", "z"]); within({ frame: ".lsf-richtext__iframe" }, () => { I.say("We can see all the regions inside the rich text and their styles in head."); I.seeElement(regionALocator); I.seeElementInDOM(regionAStyleLocator); I.seeElement(regionBLocator); I.seeElementInDOM(regionBStyleLocator); }); }); Scenario("Region should load after change between annotation tabs", async ({ I, LabelStudio }) => { I.amOnPage("/"); LabelStudio.init({ config: ` `, data: { html: "
Hello world!
", }, annotations: [ { id: "1234", result: [ { id: "Highlight_1", from_name: "label", to_name: "html", type: "labels", value: { start: "/div[1]", startOffset: 0, end: "/div[1]", endOffset: 5, labels: ["Highlight"], }, }, ], }, { id: "1235", result: [ { id: "Highlight_2", from_name: "label", to_name: "html", type: "labels", value: { start: "/div[1]", startOffset: 6, end: "/div[1]", endOffset: 11, labels: ["Highlight"], }, }, ], }, ], }); LabelStudio.waitForObjectsReady(); // select second annotation I.click(".lsf-annotation-button:nth-child(2)"); // select first annotation I.click(".lsf-annotation-button:nth-child(1)"); // select second annotation again I.click(".lsf-annotation-button:nth-child(2)"); // check if region is visible within({ frame: ".lsf-richtext__iframe" }, () => { I.seeElement(locate(".htx-highlight").withText("Hello")); }); // select first annotation again I.click(".lsf-annotation-button:nth-child(1)"); // check if region is visible within({ frame: ".lsf-richtext__iframe" }, () => { I.seeElement(locate(".htx-highlight").withText("world")); }); }); Scenario("Rich text content consistency", async ({ I, LabelStudio, AtOutliner, AtRichText }) => { I.amOnPage("/"); LabelStudio.init({ config: ` `, data: { html: "
One two three
", }, annotations: [ { id: "test", result: [], }, ], }); LabelStudio.waitForObjectsReady(); AtOutliner.seeRegions(0); const checkThatRegionsDoNotAffectContent = async (startOffset, endOffset) => { within({ frame: ".lsf-richtext__iframe" }, async () => { I.seeElement(locate("div").withText("One two three")); }); I.say(`Create region in range [${startOffset},${endOffset}]`); I.pressKey("u"); I.pressKey("1"); AtRichText.selectTextByGlobalOffset(startOffset, endOffset); AtOutliner.seeRegions(1); within({ frame: ".lsf-richtext__iframe" }, () => { I.seeElement(locate("div").withText("One two three")); }); I.say("Remove region"); AtOutliner.clickRegion(1); I.pressKey("Backspace"); AtOutliner.seeRegions(0); within({ frame: ".lsf-richtext__iframe" }, () => { I.seeElement(locate("div").withText("One two three")); }); I.say("Go back through the history"); I.pressKey(["CommandOrControl", "z"]); within({ frame: ".lsf-richtext__iframe" }, () => { I.seeElement(locate("div").withText("One two three")); }); I.say("Go forward through the history"); I.pressKey(["CommandOrControl", "shift", "z"]); within({ frame: ".lsf-richtext__iframe" }, () => { I.seeElement(locate("div").withText("One two three")); }); }; checkThatRegionsDoNotAffectContent(0, 3); checkThatRegionsDoNotAffectContent(8, 13); checkThatRegionsDoNotAffectContent(4, 7); });