const assert = require("assert");
Feature("Shortcuts functional").config({ waitForAction: 16 });
const createConfig = ({ rows = "1" }) => {
return `
`;
};
const configParams = new DataTable(["inline"]);
[true, false].forEach((inline) => {
configParams.add([inline]);
});
const AUDIO_URL = "/public/files/barradeen-emotional.mp3";
const TEXT_SELECTOR = "[name='text']";
Data(configParams).Scenario(
"Should keep the focus and cursor position.",
async ({ I, LabelStudio, AtOutliner, current }) => {
const { inline } = current;
const config = createConfig({
rows: inline ? "1" : "3",
});
const params = {
config,
data: { audio: AUDIO_URL },
};
I.amOnPage("/");
LabelStudio.init(params);
AtOutliner.seeRegions(0);
// Check if there is right input element
I.seeElement((inline ? "input" : "textarea") + TEXT_SELECTOR);
// Input something there
I.fillField(TEXT_SELECTOR, "A B");
// Try to use shortcuts
// A B
I.click(TEXT_SELECTOR);
// A B|
// Shortcut by pressing hotkey (the cursor is at the end)
I.pressKey("3");
// A B!|
I.pressKey("ArrowLeft");
// A B|!
I.pressKey("ArrowLeft");
// A |B!
// Select space
I.pressKeyDown("Shift");
I.pressKey("ArrowLeft");
I.pressKeyUp("Shift");
// A| |B!
// Shortcut by clicking button (the cursor is in the middle)
I.click(`${locate(".ant-tag").toXPath()}[contains(text(), '[ + ]')]`);
// A + |B!
I.pressKey("ArrowLeft");
// A +| B!
I.pressKey("ArrowLeft");
// A |+ B!
I.pressKey("ArrowLeft");
// A| + B!
I.pressKey("ArrowLeft");
// |A + B!
// Shortcut by pressing hotkey (the cursor is at the begin)
I.pressKey("1");
// -|A + B!
// Commit
I.pressKey(["Shift", "Enter"]);
// If we got an expected result then we didn't lost focus.
const result = await LabelStudio.serialize();
assert.equal(result.length, 1);
assert.equal(result[0].value.text[0], "-A + B!");
},
);
Data(configParams).Scenario("Should work with emoji.", async ({ I, LabelStudio, AtOutliner, current }) => {
const { inline } = current;
const config = createConfig({
rows: inline ? "1" : "3",
});
const params = {
config,
data: { audio: AUDIO_URL },
};
I.amOnPage("/");
LabelStudio.init(params);
AtOutliner.seeRegions(0);
// Check if there is right input element
I.seeElement((inline ? "input" : "textarea") + TEXT_SELECTOR);
// Try to use shortcuts with emoji
// Input some cats
I.fillField(TEXT_SELECTOR, "🐱🐱🐱");
// 🐱🐱🐱
I.click(TEXT_SELECTOR);
// 🐱🐱🐱|
// Move cursor to the end of the second cat emoji
I.pressKey("ArrowLeft");
// 🐱🐱|🐱
// Make the cat a ninja cat
I.pressKey("4");
// 🐱🐱👤|🐱
// Commit
I.pressKey(["Shift", "Enter"]);
// If we got an expected result then we didn't lost focus.
const result = await LabelStudio.serialize();
assert.equal(result.length, 1);
assert.equal(result[0].value.text[0], "🐱🐱👤🐱");
});
Data(configParams).Scenario("Should work with existent regions.", async ({ I, LabelStudio, AtOutliner, current }) => {
const { inline } = current;
const config = createConfig({
rows: inline ? "1" : "3",
});
const params = {
config,
data: { audio: AUDIO_URL },
annotations: [
{
id: "Test",
result: [
{
value: { text: ["A B"] },
id: "floE-bRC8E",
from_name: "text",
to_name: "audio",
type: "textarea",
},
],
},
],
};
I.amOnPage("/");
LabelStudio.init(params);
// Text regions will not be displayed at outliner
AtOutliner.seeRegions(0);
LabelStudio.waitForObjectsReady();
const initialResult = await LabelStudio.serialize();
assert.equal(initialResult.length, 1);
// Start editing
I.click('[aria-label="Edit Region"]');
// Try to use shortcuts
// A B|
// Shortcut by pressing hotkey (the cursor is at the end)
I.pressKey("3");
// A B!|
I.pressKey("ArrowLeft");
// A B|!
I.pressKey("ArrowLeft");
// A |B!
// Select space
I.pressKeyDown("Shift");
I.pressKey("ArrowLeft");
I.pressKeyUp("Shift");
// A| |B!
// Shortcut by clicking button (the cursor is in the middle)
I.click(`${locate(".ant-tag").toXPath()}[contains(text(), '[ + ]')]`);
// A + |B!
I.pressKey("ArrowLeft");
// A +| B!
I.pressKey("ArrowLeft");
// A |+ B!
I.pressKey("ArrowLeft");
// A| + B!
I.pressKey("ArrowLeft");
// |A + B!
// Shortcut by pressing hotkey (the cursor is at the begin)
I.pressKey("1");
// -|A + B!
// Commit
I.pressKey(["Shift", "Enter"]);
// If we got an expected result then we didn't lost focus.
const result = await LabelStudio.serialize();
assert.equal(result.length, 1);
assert.equal(result[0].value.text[0], "-A + B!");
});
{
const paramsTable = new DataTable(["isInline", "isPerRegion"]);
for (const isPerRegion of [true, false]) {
for (const isInline of [true, false]) {
paramsTable.add([isInline, isPerRegion]);
}
}
const createConfig = ({ rows = "1" }) => {
return `
`;
};
const createPerRegionConfig = ({ rows = "1" }) => {
return `
`;
};
Data(paramsTable).Scenario("Initial focus", async ({ I, LabelStudio, AtOutliner, current }) => {
const { isInline, isPerRegion } = current;
const config = (isPerRegion ? createPerRegionConfig : createConfig)({
rows: isInline ? "1" : "3",
});
I.amOnPage("/");
LabelStudio.init({
config,
data: { text: "A simple text" },
annotations: [
{
id: "Test",
result: isPerRegion
? [
{
value: {
start: 9,
end: 13,
text: "text",
labels: ["region"],
},
id: "Yk0XNP_zRJ",
from_name: "label",
to_name: "text",
type: "labels",
origin: "manual",
},
]
: [],
},
],
});
if (isPerRegion) {
I.say("Select region");
AtOutliner.clickRegion(1);
}
I.say("Try to use shortcut at the start");
I.click(locate(".ant-tag").withText("Shortcut"));
// eslint-disable-next-line
// pause();
I.waitForValue('[name="comment"]', "Shortcut");
I.say("Commit text");
I.pressKey(["Shift", "Enter"]);
I.say("Check that shortcuts still work in the edit mode");
I.click('[aria-label="Edit Region"]');
I.click(locate(".ant-tag").withText("Shortcut"));
I.waitForValue('[name^="comment:"]', "ShortcutShortcut");
I.say("Commit changes");
I.pressKey(["Shift", "Enter"]);
I.say("Check that shortcuts work with textarea again");
I.click(locate(".ant-tag").withText("Shortcut"));
I.waitForValue('[name="comment"]', "Shortcut");
});
}