d5-testing-library 1.6.0 → 1.7.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -275,126 +275,120 @@ var init_AbstractElementWithParent = __esm({
275
275
  }
276
276
  });
277
277
 
278
- // src/utils/createDataTestId.ts
279
- function createDataTestId(formName, itemType, itemName) {
280
- return `${formName}-${itemType}-${itemName}`;
281
- }
282
- function createFieldTestId(formName, itemName) {
283
- return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
284
- }
285
- function createGroupTestId(formName, itemName) {
286
- return createDataTestId(formName, "group" /* GROUP */, itemName);
287
- }
288
- function createFilterTestId(formName, itemName, layout) {
289
- return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
290
- }
291
- function createDocFilterTestId(formName, itemName) {
292
- return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
293
- }
294
- function createLayoutFilterTestId(formName, itemName) {
295
- return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
296
- }
297
- function createTableId(formName) {
298
- return `${"table" /* TABLE */}-${formName}`;
299
- }
300
- function createFormButtonTestId(formName, itemName) {
301
- return createDataTestId(formName, "button" /* BUTTON */, itemName);
302
- }
303
- var init_createDataTestId = __esm({
304
- "src/utils/createDataTestId.ts"() {
278
+ // src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
279
+ var InputClearStrategy;
280
+ var init_InputClearStrategy = __esm({
281
+ "src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts"() {
305
282
  "use strict";
283
+ InputClearStrategy = class {
284
+ async clear(editor) {
285
+ const inputEl = await editor.getInputElement();
286
+ await inputEl.clear();
287
+ }
288
+ };
306
289
  }
307
290
  });
308
291
 
309
- // src/utils/waitElementIsClickable.ts
310
- async function waitElementIsClickable({
311
- element,
312
- timeout,
313
- errorMessage,
314
- driver
315
- }) {
316
- driver = driver ?? config().driver;
317
- await wait(async () => {
318
- const isDisabled = await element.getCssValue("pointer-events") === "none";
319
- return await element.isDisplayed() && !isDisabled;
320
- }, driver, errorMessage, timeout ?? config().timeout);
321
- }
322
- var init_waitElementIsClickable = __esm({
323
- "src/utils/waitElementIsClickable.ts"() {
292
+ // src/pageObjects/elements/Editors/AbstractEditor.ts
293
+ var import_selenium_webdriver7, AbstractDXEditorWithInput;
294
+ var init_AbstractEditor = __esm({
295
+ "src/pageObjects/elements/Editors/AbstractEditor.ts"() {
324
296
  "use strict";
325
- init_config();
326
- init_wait();
297
+ import_selenium_webdriver7 = require("selenium-webdriver");
298
+ init_actions();
299
+ init_InputClearStrategy();
300
+ init_AbstractElementWithParent();
301
+ AbstractDXEditorWithInput = class extends AbstractElementWithParent {
302
+ clearStrategy = new InputClearStrategy();
303
+ setClearStrategy(strategy) {
304
+ this.clearStrategy = strategy;
305
+ }
306
+ getInputCssSelector() {
307
+ return `${this.getFullCssSelector()} .dx-texteditor-input`;
308
+ }
309
+ async getInputElement() {
310
+ return this.driver.findElement(import_selenium_webdriver7.By.css(this.getInputCssSelector()));
311
+ }
312
+ async getInputValue() {
313
+ const inputEl = await this.getInputElement();
314
+ return inputEl.getAttribute("value");
315
+ }
316
+ async setInputValue(value) {
317
+ const inputEl = await this.getInputElement();
318
+ await click(inputEl, this.driver);
319
+ await inputEl.sendKeys(value, import_selenium_webdriver7.Key.ENTER);
320
+ }
321
+ async clear() {
322
+ await this.clearStrategy.clear(this);
323
+ }
324
+ };
327
325
  }
328
326
  });
329
327
 
330
- // src/pageObjects/elements/TableToolbar/AbstractButton.ts
331
- var AbstractButton;
332
- var init_AbstractButton = __esm({
333
- "src/pageObjects/elements/TableToolbar/AbstractButton.ts"() {
328
+ // src/pageObjects/elements/Editors/TextEditor.ts
329
+ var TextEditor;
330
+ var init_TextEditor = __esm({
331
+ "src/pageObjects/elements/Editors/TextEditor.ts"() {
334
332
  "use strict";
335
- init_AbstractElementWithParent();
336
- init_actions();
337
- init_waitElementIsClickable();
338
- AbstractButton = class extends AbstractElementWithParent {
333
+ init_AbstractEditor();
334
+ init_InputClearStrategy();
335
+ TextEditor = class extends AbstractDXEditorWithInput {
339
336
  constructor(parentCssSelector, elementCssSelector, driver) {
340
337
  super(parentCssSelector, elementCssSelector, driver);
338
+ this.setClearStrategy(new InputClearStrategy());
341
339
  }
342
- async click() {
343
- const button = await this.getElement();
344
- await waitElementIsClickable({
345
- element: button,
346
- errorMessage: this.buttonNotDisplayedError(),
347
- driver: this.driver
348
- });
349
- await click(button, this.driver);
340
+ getValue() {
341
+ return this.getInputValue();
350
342
  }
351
- async isDisabled() {
352
- const button = await this.getElement();
353
- return await button.getCssValue("pointer-events") === "none";
343
+ setValue(value) {
344
+ return this.setInputValue(value);
354
345
  }
355
346
  };
356
347
  }
357
348
  });
358
349
 
359
- // src/pageObjects/elements/DXComponents/DXButton.ts
360
- var import_selenium_webdriver7, DXButton;
361
- var init_DXButton = __esm({
362
- "src/pageObjects/elements/DXComponents/DXButton.ts"() {
350
+ // src/pageObjects/elements/Editors/NumberEditor.ts
351
+ var NumberEditor;
352
+ var init_NumberEditor = __esm({
353
+ "src/pageObjects/elements/Editors/NumberEditor.ts"() {
363
354
  "use strict";
364
- init_AbstractButton();
365
- import_selenium_webdriver7 = require("selenium-webdriver");
366
- DXButton = class extends AbstractButton {
367
- async getText() {
368
- const classes = await this.getClasses();
369
- if (!classes.includes("dx-button-has-text")) {
370
- return null;
371
- }
372
- const el = await this.getElement();
373
- const textEl = el.findElement(import_selenium_webdriver7.By.className("dx-button-text"));
374
- return await textEl.getText();
355
+ init_AbstractEditor();
356
+ init_InputClearStrategy();
357
+ NumberEditor = class extends AbstractDXEditorWithInput {
358
+ constructor(parentCssSelector, elementCssSelector, driver) {
359
+ super(parentCssSelector, elementCssSelector, driver);
360
+ this.setClearStrategy(new InputClearStrategy());
361
+ }
362
+ async getValue() {
363
+ const value = await super.getInputValue();
364
+ return value == "" ? null : Number.parseFloat(value);
365
+ }
366
+ setValue(value) {
367
+ return this.setInputValue(value);
375
368
  }
376
369
  };
377
370
  }
378
371
  });
379
372
 
380
- // src/pageObjects/elements/FormButton.ts
381
- var FormButton;
382
- var init_FormButton = __esm({
383
- "src/pageObjects/elements/FormButton.ts"() {
373
+ // src/pageObjects/elements/Editors/types.ts
374
+ var ControlClass;
375
+ var init_types = __esm({
376
+ "src/pageObjects/elements/Editors/types.ts"() {
384
377
  "use strict";
385
- init_locators();
386
- init_createDataTestId();
387
- init_DXButton();
388
- FormButton = class extends DXButton {
389
- name;
390
- constructor(parentCssSelector, formName, name, driver) {
391
- super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
392
- this.name = name;
393
- }
394
- buttonNotDisplayedError() {
395
- return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
396
- }
397
- };
378
+ ControlClass = /* @__PURE__ */ ((ControlClass2) => {
379
+ ControlClass2["Text"] = "text-control";
380
+ ControlClass2["TextArea"] = "text-area-control";
381
+ ControlClass2["Number"] = "number-control";
382
+ ControlClass2["CheckBox"] = "check-box";
383
+ ControlClass2["Multiselect"] = "multi-select-control";
384
+ ControlClass2["Select"] = "select-control";
385
+ ControlClass2["Switch"] = "switch-control";
386
+ ControlClass2["Date"] = "date-control";
387
+ ControlClass2["SingleDateRange"] = "single-date-range-control";
388
+ ControlClass2["BooleanSelector"] = "buttons-group";
389
+ ControlClass2["ButtonGroup"] = "button-group-field";
390
+ return ControlClass2;
391
+ })(ControlClass || {});
398
392
  }
399
393
  });
400
394
 
@@ -412,1234 +406,1262 @@ var init_AbstractFormElement = __esm({
412
406
  }
413
407
  });
414
408
 
415
- // src/pageObjects/elements/Groups/AbstractGroup.ts
416
- var AbstractGroup;
417
- var init_AbstractGroup = __esm({
418
- "src/pageObjects/elements/Groups/AbstractGroup.ts"() {
409
+ // src/pageObjects/elements/Editors/CheckBox.ts
410
+ var CheckBox;
411
+ var init_CheckBox = __esm({
412
+ "src/pageObjects/elements/Editors/CheckBox.ts"() {
419
413
  "use strict";
414
+ init_actions();
420
415
  init_AbstractElementWithParent();
421
- AbstractGroup = class extends AbstractElementWithParent {
422
- async isDisplayed() {
423
- const groupElement = await this.getElement();
424
- return await groupElement.isDisplayed();
416
+ CheckBox = class extends AbstractElementWithParent {
417
+ async getValue() {
418
+ const result = await this.getAttribute("aria-checked");
419
+ if (result === "true")
420
+ return 1;
421
+ if (result === "false")
422
+ return 0;
423
+ return null;
424
+ }
425
+ async setValue(value) {
426
+ const inputEl = await this.getElement();
427
+ const currentValue = await this.getValue();
428
+ if (currentValue !== value) {
429
+ await click(inputEl, this.driver);
430
+ }
425
431
  }
426
432
  };
427
433
  }
428
434
  });
429
435
 
430
- // src/pageObjects/elements/Groups/Panel.ts
431
- var Panel;
432
- var init_Panel = __esm({
433
- "src/pageObjects/elements/Groups/Panel.ts"() {
436
+ // src/utils/xpathHelper.ts
437
+ var XPathHelper;
438
+ var init_xpathHelper = __esm({
439
+ "src/utils/xpathHelper.ts"() {
434
440
  "use strict";
435
- init_AbstractGroup();
436
- Panel = class extends AbstractGroup {
441
+ XPathHelper = class {
442
+ static getClassAndValueXpath(cssClass, value) {
443
+ return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
444
+ }
437
445
  };
438
446
  }
439
447
  });
440
448
 
441
- // src/pageObjects/elements/Groups/TabPanel.ts
442
- var TabPanelItem, TabPanel;
443
- var init_TabPanel = __esm({
444
- "src/pageObjects/elements/Groups/TabPanel.ts"() {
449
+ // src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
450
+ var import_selenium_webdriver8, DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
451
+ var init_ClearButtonStrategy = __esm({
452
+ "src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
445
453
  "use strict";
446
- init_AbstractGroup();
454
+ import_selenium_webdriver8 = require("selenium-webdriver");
447
455
  init_actions();
448
- TabPanelItem = class extends AbstractGroup {
449
- constructor(parentCssSelector, elementCssSelector, driver) {
450
- super(parentCssSelector, elementCssSelector, driver);
456
+ DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
457
+ DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
458
+ ClearButtonStrategy = class {
459
+ editorContainerClass;
460
+ _driver;
461
+ constructor(editorContainerClass, driver) {
462
+ this.editorContainerClass = editorContainerClass;
463
+ this._driver = driver;
451
464
  }
452
- async click() {
453
- await click(await this.getElement(), this.driver);
465
+ async isEmptyEditorField() {
466
+ const editorContainer = await this._driver.findElement(import_selenium_webdriver8.By.css(this.editorContainerClass));
467
+ const classAttribute = await editorContainer.getAttribute("class");
468
+ return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
454
469
  }
455
- async getTitle() {
456
- return "";
457
- }
458
- };
459
- TabPanel = class extends AbstractGroup {
460
- item(name) {
461
- return new TabPanelItem(this.getFullCssSelector(), `.tab-panel-item[data-groupname="${name}"]`, this.driver);
462
- }
463
- async getTitle() {
464
- return "";
470
+ async clear() {
471
+ if (await this.isEmptyEditorField()) {
472
+ throw new Error("This field is already empty");
473
+ }
474
+ const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
475
+ const clearBtn = await this._driver.findElement(import_selenium_webdriver8.By.css(clearBtnSelector));
476
+ await click(clearBtn, this._driver);
465
477
  }
466
478
  };
467
479
  }
468
480
  });
469
481
 
470
- // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
471
- var import_selenium_webdriver8, ACCORDION_TITLE_CONTAINER, AccordionItem;
472
- var init_AccordionItem = __esm({
473
- "src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
482
+ // src/pageObjects/elements/Editors/SelectBoxEditor.ts
483
+ var import_selenium_webdriver9, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
484
+ var init_SelectBoxEditor = __esm({
485
+ "src/pageObjects/elements/Editors/SelectBoxEditor.ts"() {
474
486
  "use strict";
475
- init_AbstractGroup();
476
- import_selenium_webdriver8 = require("selenium-webdriver");
487
+ init_AbstractEditor();
488
+ import_selenium_webdriver9 = require("selenium-webdriver");
489
+ init_xpathHelper();
477
490
  init_actions();
478
- ACCORDION_TITLE_CONTAINER = "accordion-title-container";
479
- AccordionItem = class extends AbstractGroup {
491
+ init_ClearButtonStrategy();
492
+ SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
493
+ combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
494
+ dropDownOptionClick = async (optionValue, driver, delay = true) => {
495
+ const { implicit } = await driver.manage().getTimeouts();
496
+ let optElement = null;
497
+ const timeout = delay ? implicit : 200;
498
+ let err = null;
499
+ try {
500
+ await driver.manage().setTimeouts({ implicit: timeout });
501
+ optElement = await driver.findElement(import_selenium_webdriver9.By.xpath(combinedValueXpath(optionValue)));
502
+ await click(optElement, driver);
503
+ } catch (e) {
504
+ err = new Error(`Item not found: "${optionValue}"`);
505
+ } finally {
506
+ await driver.manage().setTimeouts({ implicit });
507
+ }
508
+ if (err)
509
+ throw err;
510
+ };
511
+ SelectBoxEditor = class extends AbstractDXEditorWithInput {
480
512
  constructor(parentCssSelector, elementCssSelector, driver) {
481
513
  super(parentCssSelector, elementCssSelector, driver);
514
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
482
515
  }
483
- async getDataOpenedAccordItemAttr() {
484
- const accordionElement = await this.getElement();
485
- return await accordionElement.getAttribute("data-opened");
486
- }
487
- async clickAccordionItemTitle() {
488
- const accordionElement = await this.getElement();
489
- const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver8.By.className(ACCORDION_TITLE_CONTAINER));
490
- await accordTitleElement.click();
491
- }
492
- async click() {
493
- await click(await this.getElement(), this.driver);
494
- }
495
- async isExpanded() {
496
- const dataOpened = await this.getDataOpenedAccordItemAttr();
497
- return dataOpened === "true";
498
- }
499
- async isCollapsed() {
500
- const dataOpened = await this.getDataOpenedAccordItemAttr();
501
- return dataOpened === "false" || !dataOpened;
502
- }
503
- async expand() {
504
- if (!await this.isExpanded()) {
505
- await this.clickAccordionItemTitle();
516
+ async setSelectInputValue(value) {
517
+ const inputEl = await this.getInputElement();
518
+ await click(inputEl, this.driver);
519
+ try {
520
+ await dropDownOptionClick(value, this.driver, false);
521
+ } catch {
522
+ await inputEl.sendKeys(value, import_selenium_webdriver9.Key.ENTER);
523
+ await dropDownOptionClick(value, this.driver);
506
524
  }
507
525
  }
508
- async collapse() {
509
- if (await this.isExpanded()) {
510
- await this.clickAccordionItemTitle();
511
- }
526
+ async getValue() {
527
+ const value = await super.getInputValue();
528
+ return value == "" ? null : value;
529
+ }
530
+ setValue(value) {
531
+ return this.setSelectInputValue(value);
512
532
  }
513
533
  };
514
534
  }
515
535
  });
516
536
 
517
- // src/pageObjects/elements/Groups/Accordion/Accordion.ts
518
- var Accordion;
519
- var init_Accordion = __esm({
520
- "src/pageObjects/elements/Groups/Accordion/Accordion.ts"() {
537
+ // src/pageObjects/elements/Editors/SwitchEditor.ts
538
+ var SwitchEditor;
539
+ var init_SwitchEditor = __esm({
540
+ "src/pageObjects/elements/Editors/SwitchEditor.ts"() {
521
541
  "use strict";
522
- init_AbstractGroup();
523
- init_AccordionItem();
524
- Accordion = class extends AbstractGroup {
525
- constructor(parentCssSelector, elementCssSelector, driver) {
526
- super(parentCssSelector, elementCssSelector, driver);
542
+ init_actions();
543
+ init_AbstractElementWithParent();
544
+ init_wait();
545
+ SwitchEditor = class extends AbstractElementWithParent {
546
+ async getValue() {
547
+ const result = await this.getAttribute("aria-label");
548
+ if (result === "ON")
549
+ return 1;
550
+ if (result === "OFF")
551
+ return 0;
552
+ return null;
527
553
  }
528
- item(name) {
529
- return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.driver);
554
+ async setValue(value) {
555
+ if (value !== 0 && value !== 1) {
556
+ value = value ? 1 : 0;
557
+ }
558
+ const inputEl = await this.getElement();
559
+ const currentValue = await this.getValue();
560
+ if (currentValue === value) {
561
+ return;
562
+ }
563
+ await click(inputEl, this.driver);
564
+ await wait(async () => {
565
+ const updatedValue = await this.getValue();
566
+ return updatedValue !== currentValue;
567
+ }, this.driver);
530
568
  }
531
569
  };
532
570
  }
533
571
  });
534
572
 
535
- // src/pageObjects/elements/Groups/groupFactory.ts
536
- var groupFactory;
537
- var init_groupFactory = __esm({
538
- "src/pageObjects/elements/Groups/groupFactory.ts"() {
539
- "use strict";
540
- init_AbstractFormElement();
541
- init_Panel();
542
- init_TabPanel();
543
- init_Accordion();
544
- init_AccordionItem();
545
- groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
546
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
547
- const classSting = await elementInstance.getClasses();
548
- if (classSting.includes("tab-panel-group"))
549
- return new TabPanel(parentCssSelector, elementCssSelector, driver);
550
- if (classSting.includes("tab-panel-item"))
551
- return new TabPanelItem(parentCssSelector, elementCssSelector, driver);
552
- if (classSting.includes("panel-group"))
553
- return new Panel(parentCssSelector, elementCssSelector, driver);
554
- if (classSting.includes("accordion-group"))
555
- return new Accordion(parentCssSelector, elementCssSelector, driver);
556
- if (classSting.includes("d5-accordion-item"))
557
- return new AccordionItem(parentCssSelector, elementCssSelector, driver);
558
- throw new Error("Unknown type of group. Please write ticket to the support");
559
- };
560
- }
561
- });
562
-
563
- // src/pageObjects/elements/FormGroup.ts
564
- var FormGroup;
565
- var init_FormGroup = __esm({
566
- "src/pageObjects/elements/FormGroup.ts"() {
573
+ // src/pageObjects/elements/Editors/TagBox.ts
574
+ var import_selenium_webdriver10, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TAG_BOX_LIST_ITEM_SELECTOR, TagBox;
575
+ var init_TagBox = __esm({
576
+ "src/pageObjects/elements/Editors/TagBox.ts"() {
567
577
  "use strict";
568
- init_AbstractElementWithParent();
578
+ init_AbstractEditor();
579
+ import_selenium_webdriver10 = require("selenium-webdriver");
580
+ init_actions();
569
581
  init_locators();
570
- init_createDataTestId();
571
- init_groupFactory();
572
- init_AccordionItem();
573
- FormGroup = class extends AbstractElementWithParent {
574
- groupInstance;
575
- constructor(parentCssSelector, formName, name, driver) {
576
- super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
582
+ init_SelectBoxEditor();
583
+ init_ClearButtonStrategy();
584
+ init_fixElementStaleError();
585
+ TAGS_SELECTOR = ".dx-tag .tag-text";
586
+ DX_TAG_CONTAINER = "dx-tag-container";
587
+ DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
588
+ BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
589
+ TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
590
+ TagBox = class extends AbstractDXEditorWithInput {
591
+ constructor(parentCssSelector, elementCssSelector, driver) {
592
+ super(parentCssSelector, elementCssSelector, driver);
593
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
577
594
  }
578
- async initInstance() {
579
- if (!this.groupInstance) {
580
- this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
595
+ async setTagBoxInputValue(values) {
596
+ const lastElement = values[values.length - 1];
597
+ const inputEl = await this.getInputElement();
598
+ await inputEl.click();
599
+ for (const value of values) {
600
+ await this.selectOption(inputEl, value, lastElement);
581
601
  }
602
+ await this.confirmSelection();
582
603
  }
583
- /**
584
- * Возвращает булевое значение доступна ли группа
585
- * @example
586
- * expect(await tableList.group('MainSuperPanel').isDisplayed();
587
- */
588
- async isDisplayed() {
604
+ async waitOptionSelection() {
605
+ await fixElementStaleError(import_selenium_webdriver10.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
606
+ }
607
+ async selectOption(inputEl, value, lastElement) {
589
608
  try {
590
- await this.initInstance();
591
- return this.groupInstance.isDisplayed();
609
+ await dropDownOptionClick(value, this.driver, false);
592
610
  } catch {
593
- return false;
611
+ await inputEl.sendKeys(value);
612
+ await dropDownOptionClick(value, this.driver);
613
+ }
614
+ await this.waitOptionSelection();
615
+ if (value !== lastElement) {
616
+ await inputEl.clear();
594
617
  }
595
618
  }
596
- /**
597
- * Клик по элементам группы.
598
- * Метод работает если у группы есть дочерние элементы, например элементы аккордеона или вкладки таб панели.
599
- * @example
600
- * expect(await tableList.group('TabPanel').itemClick('Tab');
601
- * expect(await tableList.group('Accordion').itemClick('AccordionItem');
602
- */
603
- async itemClick(name) {
604
- await this.initInstance();
605
- const item = this.groupInstance.item?.(name);
606
- await item?.click();
607
- }
608
- /**
609
- * Метод работает если группа - это элемент аккордеона или вкладка таб панели
610
- * @example
611
- * expect(await tableList.group('Tab').click();
612
- * expect(await tableList.group('AccordionItem').click();
613
- */
614
- async click() {
615
- await this.initInstance();
616
- await this.groupInstance.click?.();
619
+ async confirmSelection() {
620
+ const btnOk = await fixElementStaleError(import_selenium_webdriver10.By.css(BTN_OK_SELECTOR), this.driver);
621
+ await click(btnOk, this.driver);
617
622
  }
618
- async collapse() {
619
- await this.initInstance();
620
- if (this.groupInstance instanceof AccordionItem) {
621
- await this.groupInstance.collapse();
623
+ async getTagBoxInputValue() {
624
+ if (await this.isTagBoxEmpty()) {
625
+ return [];
622
626
  }
623
- }
624
- async expand() {
625
- await this.initInstance();
626
- if (this.groupInstance instanceof AccordionItem) {
627
- await this.groupInstance.expand();
627
+ const tags = await this.driver.findElements(
628
+ import_selenium_webdriver10.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
629
+ );
630
+ const values = [];
631
+ for (const tag of tags) {
632
+ values.push(await tag.getAttribute("textContent"));
628
633
  }
634
+ return values;
629
635
  }
630
- async isExpanded() {
631
- await this.initInstance();
632
- if (this.groupInstance instanceof AccordionItem) {
633
- return await this.groupInstance.isExpanded();
634
- }
635
- return false;
636
+ async isTagBoxEmpty() {
637
+ const classAttribute = await this.getClasses();
638
+ return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
636
639
  }
637
- async isCollapsed() {
638
- await this.initInstance();
639
- if (this.groupInstance instanceof AccordionItem) {
640
- return await this.groupInstance.isCollapsed();
640
+ async getValue() {
641
+ const value = await this.getTagBoxInputValue();
642
+ return value.length ? value : null;
643
+ }
644
+ async setValue(values) {
645
+ if (!Array.isArray(values)) {
646
+ throw new Error("The provided value is not an array");
641
647
  }
642
- return false;
648
+ await this.setTagBoxInputValue(values);
649
+ }
650
+ async remove(itemText) {
651
+ const tagValues = await this.getValue();
652
+ const tagExists = tagValues.includes(itemText);
653
+ if (!tagExists) {
654
+ throw new Error(`The tag with the text: ${itemText} was not found`);
655
+ }
656
+ const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
657
+ const clearBtn = await this.driver.findElement(
658
+ import_selenium_webdriver10.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
659
+ );
660
+ await click(clearBtn, this.driver);
643
661
  }
644
662
  };
645
663
  }
646
664
  });
647
665
 
648
- // src/pageObjects/elements/Forms/AbstractForm.ts
649
- var AbstractForm;
650
- var init_AbstractForm = __esm({
651
- "src/pageObjects/elements/Forms/AbstractForm.ts"() {
666
+ // src/pageObjects/elements/Editors/ButtonGroup.ts
667
+ var import_selenium_webdriver11, ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
668
+ var init_ButtonGroup = __esm({
669
+ "src/pageObjects/elements/Editors/ButtonGroup.ts"() {
652
670
  "use strict";
653
- init_AbstractPage();
654
- init_FormButton();
655
- init_FormGroup();
656
- AbstractForm = class extends AbstractPage {
657
- containerCssSelector = "";
658
- _formName = "";
659
- containerBy;
660
- getContainerElement = () => {
661
- return this.driver.findElement(this.containerBy);
662
- };
663
- set formName(name) {
664
- this._formName = name;
665
- }
666
- get formName() {
667
- return this._formName;
671
+ init_actions();
672
+ import_selenium_webdriver11 = require("selenium-webdriver");
673
+ init_AbstractElementWithParent();
674
+ ITEM_CLASS = "dx-buttongroup-item";
675
+ SELECTED_CLASS = "dx-state-selected";
676
+ ButtonGroup = class extends AbstractElementWithParent {
677
+ getItems() {
678
+ return this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
668
679
  }
669
- /**
670
- * Возвращает true если форма есть в DOM
671
- * @example
672
- * class MyForm extends FormEdit {}
673
- * //...
674
- * const formEdit = new MyForm();
675
- * expect(await formEdit.exists()).toBe(true);
676
- */
677
- async exists() {
678
- try {
679
- let elements = await this.driver.findElements(this.containerBy);
680
- return elements.length > 0;
681
- } catch (error) {
682
- return false;
683
- }
680
+ getDataValue(el) {
681
+ return el.getAttribute("data-value");
684
682
  }
685
- button(name) {
686
- return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
683
+ async getValue() {
684
+ const selectedEl = await this.driver.findElement(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
685
+ return this.getDataValue(selectedEl);
687
686
  }
688
- /**
689
- * Находит группу на форме по имени
690
- * @example
691
- * const formEdit = new MyForm();
692
- * //...
693
- * expect(await formEdit.group('Name');
694
- */
695
- group(name) {
696
- return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
687
+ async setValue(value) {
688
+ const items = await this.getItems();
689
+ let buttonEl = void 0;
690
+ for (const item of items) {
691
+ const text = await this.getDataValue(item);
692
+ if (text == value) {
693
+ buttonEl = item;
694
+ break;
695
+ }
696
+ }
697
+ if (!buttonEl)
698
+ throw new Error(`Cannot find item in button group with text: ${value}`);
699
+ await click(buttonEl, this.driver);
697
700
  }
698
701
  };
699
702
  }
700
703
  });
701
704
 
702
- // src/pageObjects/elements/Forms/types.ts
703
- var init_types = __esm({
704
- "src/pageObjects/elements/Forms/types.ts"() {
705
+ // src/pageObjects/elements/Editors/BooleanSelector.ts
706
+ var BooleanSelector;
707
+ var init_BooleanSelector = __esm({
708
+ "src/pageObjects/elements/Editors/BooleanSelector.ts"() {
705
709
  "use strict";
710
+ init_ButtonGroup();
711
+ BooleanSelector = class extends ButtonGroup {
712
+ // @ts-ignore
713
+ async getValue() {
714
+ const value = await super.getValue();
715
+ return value === "null" ? null : value === "1" ? 1 : 0;
716
+ }
717
+ // @ts-ignore
718
+ async setValue(value) {
719
+ const val = value == null ? "null" : value ? "1" : "0";
720
+ await super.setValue(val);
721
+ }
722
+ };
706
723
  }
707
724
  });
708
725
 
709
- // src/pageObjects/elements/Table/utils.ts
710
- function getCssRowByIndexSelector(index) {
711
- return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
712
- }
713
- function getCssCellByIndexSelector(index) {
714
- return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
715
- }
716
- var import_selenium_webdriver9, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
726
+ // src/pageObjects/elements/Editors/Date/utils.ts
727
+ var formatDMYDate;
717
728
  var init_utils = __esm({
718
- "src/pageObjects/elements/Table/utils.ts"() {
729
+ "src/pageObjects/elements/Editors/Date/utils.ts"() {
719
730
  "use strict";
720
- import_selenium_webdriver9 = require("selenium-webdriver");
721
- getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
722
- getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
723
- getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
724
- transformInputIndex = (index) => index + 1;
725
- transformOutputIndex = (index) => +index - 1;
731
+ formatDMYDate = (date) => {
732
+ const [year, month, day] = date.toJSON().split("T")[0].split("-");
733
+ return `${day}${month}${year}`;
734
+ };
726
735
  }
727
736
  });
728
737
 
729
- // src/pageObjects/elements/Table/types.ts
730
- var init_types2 = __esm({
731
- "src/pageObjects/elements/Table/types.ts"() {
738
+ // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
739
+ var import_selenium_webdriver12, BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, BaseDateEditor;
740
+ var init_BaseDateEditor = __esm({
741
+ "src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
732
742
  "use strict";
743
+ init_AbstractEditor();
744
+ init_InputClearStrategy();
745
+ import_selenium_webdriver12 = require("selenium-webdriver");
746
+ init_locators();
747
+ init_actions();
748
+ init_utils();
749
+ BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
750
+ BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
751
+ BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
752
+ BTN_SAVE_SELECTOR = "DateRange__button-save";
753
+ BaseDateEditor = class extends AbstractDXEditorWithInput {
754
+ constructor(parentCssSelector, elementCssSelector, driver) {
755
+ super(parentCssSelector, elementCssSelector, driver);
756
+ this.setClearStrategy(new InputClearStrategy());
757
+ }
758
+ async setDateValue(value) {
759
+ const actions = this.driver.actions({ async: true });
760
+ const dateField = await this.driver.findElement(import_selenium_webdriver12.By.css(`${this.getFullCssSelector()}`));
761
+ const dateFieldDataTestID = await this.getDataTestId();
762
+ const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
763
+ const dateInputEl = await this.getInputElement();
764
+ await dateInputEl.clear();
765
+ if (Array.isArray(value)) {
766
+ const formattedDates = value.map(formatDMYDate);
767
+ const button = await dateField.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
768
+ await button.click();
769
+ const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver12.By.css(calendarPopoverSelector));
770
+ const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
771
+ const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver12.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
772
+ await dateFromInput.click();
773
+ await dateFromInput.sendKeys(formattedDates[0]);
774
+ await dateToInput.click();
775
+ await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
776
+ await dateToInput.sendKeys(formattedDates[1]);
777
+ await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.ENTER).perform();
778
+ const btnOk = await this.driver.findElement(import_selenium_webdriver12.By.css(`.${BTN_SAVE_SELECTOR}`));
779
+ await btnOk.click();
780
+ } else {
781
+ const formattedDate = formatDMYDate(value);
782
+ await click(dateInputEl, this.driver);
783
+ await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver12.Key.HOME).perform();
784
+ await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver12.Key.ENTER).perform();
785
+ }
786
+ }
787
+ };
733
788
  }
734
789
  });
735
790
 
736
- // src/pageObjects/elements/Table/elements/Cell.ts
737
- var import_selenium_webdriver10, Cell;
738
- var init_Cell = __esm({
739
- "src/pageObjects/elements/Table/elements/Cell.ts"() {
791
+ // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
792
+ var import_selenium_webdriver13, SingleDateEditor;
793
+ var init_SingleDateEditor = __esm({
794
+ "src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
740
795
  "use strict";
741
- import_selenium_webdriver10 = require("selenium-webdriver");
742
- init_AbstractElementWithParent();
743
- init_utils();
744
- init_types2();
745
- Cell = class extends AbstractElementWithParent {
746
- _index;
747
- getCellIndex;
748
- constructor(parentCssSelector, getCellIndex, index, driver) {
749
- super(parentCssSelector, getCssCellByIndexSelector(index), driver);
750
- this.getCellIndex = getCellIndex;
751
- this._index = index;
752
- }
753
- set index(index) {
754
- this._index = index;
755
- this.elementCssSelector = getCssCellByIndexSelector(index);
756
- }
757
- async getBooleanValue(cellEl) {
758
- const booleanEl = await cellEl.findElement(import_selenium_webdriver10.By.className("boolean-widget"));
759
- return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
796
+ import_selenium_webdriver13 = require("selenium-webdriver");
797
+ init_InputClearStrategy();
798
+ init_BaseDateEditor();
799
+ SingleDateEditor = class extends BaseDateEditor {
800
+ constructor(parentCssSelector, elementCssSelector, driver) {
801
+ super(parentCssSelector, elementCssSelector, driver);
802
+ this.setClearStrategy(new InputClearStrategy());
760
803
  }
761
- async getTagsValue(cellEl) {
762
- const tagsCssSelector = ".multiselect-container .multiselect-cell";
763
- const tags = await cellEl.findElements(import_selenium_webdriver10.By.css(tagsCssSelector));
764
- const values = [];
765
- for (const tag of tags) {
766
- values.push(await tag.getAttribute("textContent"));
767
- }
768
- return values;
804
+ async getDateElement() {
805
+ return this.driver.findElement(import_selenium_webdriver13.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
769
806
  }
770
- async getElement() {
771
- if (this._index == null) {
772
- this.index = await this.getCellIndex();
773
- }
774
- return super.getElement();
807
+ async getDateValue() {
808
+ const inputEl = await this.getDateElement();
809
+ return inputEl.getAttribute("value");
775
810
  }
776
811
  async getValue() {
777
- const cellEl = await this.getElement();
778
- const cellElClass = await cellEl.getAttribute("class");
779
- if (cellElClass.includes("boolean-column" /* Boolean */))
780
- return this.getBooleanValue(cellEl);
781
- if (cellElClass.includes("tags-column" /* Tags */))
782
- return this.getTagsValue(cellEl);
783
- return cellEl.getText();
812
+ const value = await this.getDateValue();
813
+ return value == "" ? null : new Date(value);
784
814
  }
785
- getIndex() {
786
- return this._index;
815
+ setValue(value) {
816
+ if (typeof value === "object") {
817
+ return this.setDateValue(value);
818
+ }
819
+ throw new Error(`Value is incorrect. It should be Object`);
787
820
  }
788
821
  };
789
822
  }
790
823
  });
791
824
 
792
- // src/pageObjects/elements/Table/elements/Row.ts
793
- var import_selenium_webdriver11, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
794
- var init_Row = __esm({
795
- "src/pageObjects/elements/Table/elements/Row.ts"() {
825
+ // src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
826
+ var import_selenium_webdriver14, DateRangeEditor;
827
+ var init_DateRangeEditor = __esm({
828
+ "src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
796
829
  "use strict";
797
- import_selenium_webdriver11 = require("selenium-webdriver");
798
- init_Cell();
799
- init_utils();
800
- init_AbstractElementWithParent();
801
- init_actions();
802
- init_wait();
803
- DX_SELECTION_CLASS = "dx-selection";
804
- DX_ROW_EDIT_CLASS = "dx-edit-row";
805
- DX_DATA_ROW_CLASS = "dx-data-row";
806
- Row = class extends AbstractElementWithParent {
807
- index;
808
- getColumnBy;
809
- constructor(parentCssSelector, index, driver, getColumnBy) {
810
- super(parentCssSelector, getCssRowByIndexSelector(index), driver);
811
- this.index = index;
812
- this.getColumnBy = getColumnBy;
813
- }
814
- _getCell({ index, name, title }) {
815
- return new Cell(
816
- this.getFullCssSelector(),
817
- () => {
818
- return this.getColumnBy({ title, name }).getIndex();
819
- },
820
- index,
821
- this.driver
822
- );
823
- }
824
- getCellByIndex(index) {
825
- return this._getCell({ index });
826
- }
827
- getCell(name) {
828
- return this._getCell({ name });
829
- }
830
- getCellByTitle(title) {
831
- return this._getCell({ title });
832
- }
833
- async select() {
834
- const rowEl = await this.getElement();
835
- await click(rowEl, this.driver);
836
- await wait(
837
- async () => {
838
- const classes = await this.getClasses();
839
- return classes.includes(DX_SELECTION_CLASS);
840
- },
841
- this.driver,
842
- "Cannot select row"
843
- );
844
- }
845
- async isSelected() {
846
- const result = await this.getAttribute("aria-selected");
847
- return result === "true";
848
- }
849
- getIndex() {
850
- return this.index;
851
- }
852
- async getCells() {
853
- const cells = await this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
854
- const result = [];
855
- cells.forEach((_, index) => {
856
- const newCell = this.getCellByIndex(index);
857
- result.push(newCell);
858
- });
859
- return result;
860
- }
861
- async clickInlineButton(buttonClass) {
862
- const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
863
- const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
864
- this.index
865
- )}"] .${buttonClass}`;
866
- const button = await this.driver.findElement(
867
- import_selenium_webdriver11.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
868
- );
869
- return click(button, this.driver);
830
+ import_selenium_webdriver14 = require("selenium-webdriver");
831
+ init_InputClearStrategy();
832
+ init_BaseDateEditor();
833
+ DateRangeEditor = class extends BaseDateEditor {
834
+ constructor(parentCssSelector, elementCssSelector, driver) {
835
+ super(parentCssSelector, elementCssSelector, driver);
836
+ this.setClearStrategy(new InputClearStrategy());
870
837
  }
871
- async checkEditingMode(isEditing, msg) {
872
- await wait(
873
- async () => {
874
- return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
875
- },
876
- this.driver,
877
- msg
878
- );
838
+ async getDateElement() {
839
+ return this.driver.findElement(import_selenium_webdriver14.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
879
840
  }
880
- async edit() {
881
- await this.clickInlineButton("edit");
882
- await this.checkEditingMode(true, "Row did not switch to edit mode");
841
+ async getDateValue() {
842
+ const inputEl = await this.getDateElement();
843
+ const dateFromStr = await inputEl.getAttribute("datefrom");
844
+ const dateToStr = await inputEl.getAttribute("dateto");
845
+ const dateFrom = new Date(dateFromStr);
846
+ const dateTo = new Date(dateToStr);
847
+ return [dateFrom, dateTo];
883
848
  }
884
- async save() {
885
- await this.clickInlineButton("save");
886
- await this.checkEditingMode(false, "Row did not saved");
849
+ async getValue() {
850
+ const values = await this.getDateValue();
851
+ return !values.length ? null : values;
887
852
  }
888
- async cancel() {
889
- await this.clickInlineButton("cancel");
890
- await this.checkEditingMode(false, "Row did not switch to normal mode");
853
+ setValue(value) {
854
+ if (typeof value === "object") {
855
+ return this.setDateValue(value);
856
+ }
857
+ throw new Error(`Value is incorrect. It should be Object`);
891
858
  }
892
859
  };
893
860
  }
894
861
  });
895
862
 
896
- // src/pageObjects/elements/Table/elements/Column.ts
897
- var import_selenium_webdriver12, Column;
898
- var init_Column = __esm({
899
- "src/pageObjects/elements/Table/elements/Column.ts"() {
863
+ // src/pageObjects/elements/Editors/Date/DateEditor.ts
864
+ var DateEditor;
865
+ var init_DateEditor = __esm({
866
+ "src/pageObjects/elements/Editors/Date/DateEditor.ts"() {
900
867
  "use strict";
901
- import_selenium_webdriver12 = require("selenium-webdriver");
902
- init_utils();
903
- init_AbstractElementWithParent();
904
- init_fixElementStaleError();
905
- Column = class extends AbstractElementWithParent {
906
- _index;
907
- _caption;
908
- _name;
909
- headerCssSelector;
910
- constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
911
- super(parentCssSelector, "", driver);
912
- this._name = name;
913
- this.index = index;
914
- this._caption = caption;
915
- this.headerCssSelector = headerCssSelector;
916
- }
917
- set index(index) {
918
- this._index = index;
919
- this.elementCssSelector = getColumnByIndexCssSelector(index);
920
- }
921
- get index() {
922
- return this._index;
923
- }
924
- async getElement() {
925
- await this.getIndex();
926
- return super.getElement();
927
- }
928
- async getColumnHeaderIndexBy(cssSelector) {
929
- const column = await fixElementStaleError(import_selenium_webdriver12.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
930
- return transformOutputIndex(await column.getAttribute("aria-colindex"));
931
- }
932
- async getIndexByCaption() {
933
- return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
868
+ init_SingleDateEditor();
869
+ init_DateRangeEditor();
870
+ init_AbstractFormElement();
871
+ init_AbstractEditor();
872
+ init_types();
873
+ DateEditor = class extends AbstractDXEditorWithInput {
874
+ editorInstance = null;
875
+ initPromise;
876
+ constructor(parentCssSelector, elementCssSelector, driver) {
877
+ super(parentCssSelector, elementCssSelector, driver);
878
+ this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
934
879
  }
935
- async getIndexByName() {
936
- return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
880
+ async init(parentCssSelector, elementCssSelector, driver) {
881
+ await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
937
882
  }
938
- async caption() {
939
- const el = await this.getElement();
940
- return el.getText();
883
+ async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
884
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
885
+ const classString = await elementInstance.getClasses();
886
+ switch (true) {
887
+ case classString.includes("date-control" /* Date */):
888
+ this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
889
+ break;
890
+ case classString.includes("single-date-range-control" /* SingleDateRange */):
891
+ this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
892
+ break;
893
+ default:
894
+ this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
895
+ }
941
896
  }
942
- async getIndex() {
943
- if (this.index != null) {
944
- return this.index;
897
+ async ensureInitialized() {
898
+ if (!this.editorInstance) {
899
+ await this.initPromise;
945
900
  }
946
- if (this._caption != null) {
947
- this.index = await this.getIndexByCaption();
948
- return this.index;
901
+ }
902
+ async setValue(value) {
903
+ await this.ensureInitialized();
904
+ if (this.editorInstance) {
905
+ await this.editorInstance.setValue(value);
906
+ return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
949
907
  }
950
- if (this._name != null) {
951
- this.index = await this.getIndexByName();
952
- return this.index;
908
+ throw new Error("Editor instance is not initialized.");
909
+ }
910
+ async getValue() {
911
+ await this.ensureInitialized();
912
+ if (this.editorInstance) {
913
+ return this.editorInstance.getValue();
953
914
  }
954
- throw new Error("Cant get the index in the column");
915
+ throw new Error("Editor instance is not initialized.");
955
916
  }
956
917
  };
957
918
  }
958
919
  });
959
920
 
960
- // src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
961
- var InputClearStrategy;
962
- var init_InputClearStrategy = __esm({
963
- "src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts"() {
921
+ // src/pageObjects/elements/Editors/editorFactory.ts
922
+ var editorFactory;
923
+ var init_editorFactory = __esm({
924
+ "src/pageObjects/elements/Editors/editorFactory.ts"() {
964
925
  "use strict";
965
- InputClearStrategy = class {
966
- async clear(editor) {
967
- const inputEl = await editor.getInputElement();
968
- await inputEl.clear();
926
+ init_types();
927
+ init_AbstractFormElement();
928
+ init_TextEditor();
929
+ init_NumberEditor();
930
+ init_CheckBox();
931
+ init_SelectBoxEditor();
932
+ init_SwitchEditor();
933
+ init_TagBox();
934
+ init_BooleanSelector();
935
+ init_ButtonGroup();
936
+ init_DateEditor();
937
+ editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
938
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
939
+ const classSting = await elementInstance.getClasses();
940
+ if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
941
+ return new TextEditor(parentCssSelector, elementCssSelector, driver);
942
+ if (classSting.includes("number-control" /* Number */))
943
+ return new NumberEditor(parentCssSelector, elementCssSelector, driver);
944
+ if (classSting.includes("check-box" /* CheckBox */))
945
+ return new CheckBox(parentCssSelector, elementCssSelector, driver);
946
+ if (classSting.includes("multi-select-control" /* Multiselect */))
947
+ return new TagBox(parentCssSelector, elementCssSelector, driver);
948
+ if (classSting.includes("select-control" /* Select */))
949
+ return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
950
+ if (classSting.includes("switch-control" /* Switch */))
951
+ return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
952
+ if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
953
+ return new DateEditor(parentCssSelector, elementCssSelector, driver);
969
954
  }
955
+ if (classSting.includes("buttons-group" /* BooleanSelector */))
956
+ return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
957
+ if (classSting.includes("button-group-field" /* ButtonGroup */))
958
+ return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
959
+ throw new Error("Unknown type of editor. Please write ticket to the support");
970
960
  };
971
961
  }
972
962
  });
973
963
 
974
- // src/pageObjects/elements/Editors/AbstractEditor.ts
975
- var import_selenium_webdriver13, AbstractDXEditorWithInput;
976
- var init_AbstractEditor = __esm({
977
- "src/pageObjects/elements/Editors/AbstractEditor.ts"() {
964
+ // src/pageObjects/elements/Editors/index.ts
965
+ var init_Editors = __esm({
966
+ "src/pageObjects/elements/Editors/index.ts"() {
967
+ "use strict";
968
+ init_TextEditor();
969
+ init_NumberEditor();
970
+ init_editorFactory();
971
+ init_types();
972
+ }
973
+ });
974
+
975
+ // src/utils/createDataTestId.ts
976
+ function createDataTestId(formName, itemType, itemName) {
977
+ return `${formName}-${itemType}-${itemName}`;
978
+ }
979
+ function createFieldTestId(formName, itemName) {
980
+ return createDataTestId(formName, "form_field" /* FORM_FIELD */, itemName);
981
+ }
982
+ function createGroupTestId(formName, itemName) {
983
+ return createDataTestId(formName, "group" /* GROUP */, itemName);
984
+ }
985
+ function createFilterTestId(formName, itemName, layout) {
986
+ return createDataTestId(formName, "filter" /* FILTER */, itemName) + `-${layout}`;
987
+ }
988
+ function createDocFilterTestId(formName, itemName) {
989
+ return createFilterTestId(formName, itemName, "dock-panel-filter" /* DOCK_PANEL */);
990
+ }
991
+ function createHeaderFilterTestId(formName, itemName) {
992
+ return createFilterTestId(formName, itemName, "header-filter" /* HEADER_FILTER */);
993
+ }
994
+ function createLayoutFilterTestId(formName, itemName) {
995
+ return createFilterTestId(formName, itemName, "layout-filter" /* LAYOUT */);
996
+ }
997
+ function createTableId(formName) {
998
+ return `${"table" /* TABLE */}-${formName}`;
999
+ }
1000
+ function createFormButtonTestId(formName, itemName) {
1001
+ return createDataTestId(formName, "button" /* BUTTON */, itemName);
1002
+ }
1003
+ function createSubSystemTestId(itemName) {
1004
+ return `${"subsystem-item" /* SUBSYSTEM_ITEM */}-${itemName}`;
1005
+ }
1006
+ var init_createDataTestId = __esm({
1007
+ "src/utils/createDataTestId.ts"() {
1008
+ "use strict";
1009
+ }
1010
+ });
1011
+
1012
+ // src/utils/waitElementIsClickable.ts
1013
+ async function waitElementIsClickable({
1014
+ element,
1015
+ timeout,
1016
+ errorMessage,
1017
+ driver
1018
+ }) {
1019
+ driver = driver ?? config().driver;
1020
+ await wait(async () => {
1021
+ const isDisabled = await element.getCssValue("pointer-events") === "none";
1022
+ return await element.isDisplayed() && !isDisabled;
1023
+ }, driver, errorMessage, timeout ?? config().timeout);
1024
+ }
1025
+ var init_waitElementIsClickable = __esm({
1026
+ "src/utils/waitElementIsClickable.ts"() {
1027
+ "use strict";
1028
+ init_config();
1029
+ init_wait();
1030
+ }
1031
+ });
1032
+
1033
+ // src/pageObjects/elements/TableToolbar/AbstractButton.ts
1034
+ var AbstractButton;
1035
+ var init_AbstractButton = __esm({
1036
+ "src/pageObjects/elements/TableToolbar/AbstractButton.ts"() {
978
1037
  "use strict";
979
- import_selenium_webdriver13 = require("selenium-webdriver");
980
- init_actions();
981
- init_InputClearStrategy();
982
1038
  init_AbstractElementWithParent();
983
- AbstractDXEditorWithInput = class extends AbstractElementWithParent {
984
- clearStrategy = new InputClearStrategy();
985
- setClearStrategy(strategy) {
986
- this.clearStrategy = strategy;
987
- }
988
- getInputCssSelector() {
989
- return `${this.getFullCssSelector()} .dx-texteditor-input`;
990
- }
991
- async getInputElement() {
992
- return this.driver.findElement(import_selenium_webdriver13.By.css(this.getInputCssSelector()));
993
- }
994
- async getInputValue() {
995
- const inputEl = await this.getInputElement();
996
- return inputEl.getAttribute("value");
1039
+ init_actions();
1040
+ init_waitElementIsClickable();
1041
+ AbstractButton = class extends AbstractElementWithParent {
1042
+ constructor(parentCssSelector, elementCssSelector, driver) {
1043
+ super(parentCssSelector, elementCssSelector, driver);
997
1044
  }
998
- async setInputValue(value) {
999
- const inputEl = await this.getInputElement();
1000
- await click(inputEl, this.driver);
1001
- await inputEl.sendKeys(value, import_selenium_webdriver13.Key.ENTER);
1045
+ async click() {
1046
+ const button = await this.getElement();
1047
+ await waitElementIsClickable({
1048
+ element: button,
1049
+ errorMessage: this.buttonNotDisplayedError(),
1050
+ driver: this.driver
1051
+ });
1052
+ await click(button, this.driver);
1002
1053
  }
1003
- async clear() {
1004
- await this.clearStrategy.clear(this);
1054
+ async isDisabled() {
1055
+ const button = await this.getElement();
1056
+ return await button.getCssValue("pointer-events") === "none";
1005
1057
  }
1006
1058
  };
1007
1059
  }
1008
1060
  });
1009
1061
 
1010
- // src/pageObjects/elements/Editors/TextEditor.ts
1011
- var TextEditor;
1012
- var init_TextEditor = __esm({
1013
- "src/pageObjects/elements/Editors/TextEditor.ts"() {
1062
+ // src/pageObjects/elements/DXComponents/DXButton.ts
1063
+ var import_selenium_webdriver16, DXButton;
1064
+ var init_DXButton = __esm({
1065
+ "src/pageObjects/elements/DXComponents/DXButton.ts"() {
1014
1066
  "use strict";
1015
- init_AbstractEditor();
1016
- init_InputClearStrategy();
1017
- TextEditor = class extends AbstractDXEditorWithInput {
1018
- constructor(parentCssSelector, elementCssSelector, driver) {
1019
- super(parentCssSelector, elementCssSelector, driver);
1020
- this.setClearStrategy(new InputClearStrategy());
1067
+ init_AbstractButton();
1068
+ import_selenium_webdriver16 = require("selenium-webdriver");
1069
+ DXButton = class extends AbstractButton {
1070
+ async getText() {
1071
+ const classes = await this.getClasses();
1072
+ if (!classes.includes("dx-button-has-text")) {
1073
+ return null;
1074
+ }
1075
+ const el = await this.getElement();
1076
+ const textEl = el.findElement(import_selenium_webdriver16.By.className("dx-button-text"));
1077
+ return await textEl.getText();
1021
1078
  }
1022
- getValue() {
1023
- return this.getInputValue();
1079
+ };
1080
+ }
1081
+ });
1082
+
1083
+ // src/pageObjects/elements/FormButton.ts
1084
+ var FormButton;
1085
+ var init_FormButton = __esm({
1086
+ "src/pageObjects/elements/FormButton.ts"() {
1087
+ "use strict";
1088
+ init_locators();
1089
+ init_createDataTestId();
1090
+ init_DXButton();
1091
+ FormButton = class extends DXButton {
1092
+ name;
1093
+ constructor(parentCssSelector, formName, name, driver) {
1094
+ super(parentCssSelector, byTestIdCssSelector(createFormButtonTestId(formName, name)), driver);
1095
+ this.name = name;
1024
1096
  }
1025
- setValue(value) {
1026
- return this.setInputValue(value);
1097
+ buttonNotDisplayedError() {
1098
+ return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
1027
1099
  }
1028
1100
  };
1029
1101
  }
1030
1102
  });
1031
1103
 
1032
- // src/pageObjects/elements/Editors/NumberEditor.ts
1033
- var NumberEditor;
1034
- var init_NumberEditor = __esm({
1035
- "src/pageObjects/elements/Editors/NumberEditor.ts"() {
1104
+ // src/pageObjects/elements/Groups/AbstractGroup.ts
1105
+ var AbstractGroup;
1106
+ var init_AbstractGroup = __esm({
1107
+ "src/pageObjects/elements/Groups/AbstractGroup.ts"() {
1036
1108
  "use strict";
1037
- init_AbstractEditor();
1038
- init_InputClearStrategy();
1039
- NumberEditor = class extends AbstractDXEditorWithInput {
1040
- constructor(parentCssSelector, elementCssSelector, driver) {
1041
- super(parentCssSelector, elementCssSelector, driver);
1042
- this.setClearStrategy(new InputClearStrategy());
1043
- }
1044
- async getValue() {
1045
- const value = await super.getInputValue();
1046
- return value == "" ? null : Number.parseFloat(value);
1047
- }
1048
- setValue(value) {
1049
- return this.setInputValue(value);
1109
+ init_AbstractElementWithParent();
1110
+ AbstractGroup = class extends AbstractElementWithParent {
1111
+ async isDisplayed() {
1112
+ const groupElement = await this.getElement();
1113
+ return await groupElement.isDisplayed();
1050
1114
  }
1051
1115
  };
1052
1116
  }
1053
1117
  });
1054
1118
 
1055
- // src/pageObjects/elements/Editors/types.ts
1056
- var ControlClass;
1057
- var init_types3 = __esm({
1058
- "src/pageObjects/elements/Editors/types.ts"() {
1119
+ // src/pageObjects/elements/Groups/Panel.ts
1120
+ var Panel;
1121
+ var init_Panel = __esm({
1122
+ "src/pageObjects/elements/Groups/Panel.ts"() {
1059
1123
  "use strict";
1060
- ControlClass = /* @__PURE__ */ ((ControlClass2) => {
1061
- ControlClass2["Text"] = "text-control";
1062
- ControlClass2["TextArea"] = "text-area-control";
1063
- ControlClass2["Number"] = "number-control";
1064
- ControlClass2["CheckBox"] = "check-box";
1065
- ControlClass2["Multiselect"] = "multi-select-control";
1066
- ControlClass2["Select"] = "select-control";
1067
- ControlClass2["Switch"] = "switch-control";
1068
- ControlClass2["Date"] = "date-control";
1069
- ControlClass2["SingleDateRange"] = "single-date-range-control";
1070
- ControlClass2["BooleanSelector"] = "buttons-group";
1071
- ControlClass2["ButtonGroup"] = "button-group-field";
1072
- return ControlClass2;
1073
- })(ControlClass || {});
1124
+ init_AbstractGroup();
1125
+ Panel = class extends AbstractGroup {
1126
+ };
1074
1127
  }
1075
1128
  });
1076
1129
 
1077
- // src/pageObjects/elements/Editors/CheckBox.ts
1078
- var CheckBox;
1079
- var init_CheckBox = __esm({
1080
- "src/pageObjects/elements/Editors/CheckBox.ts"() {
1130
+ // src/pageObjects/elements/Groups/TabPanel.ts
1131
+ var import_selenium_webdriver17, TabPanelItem, TabPanel;
1132
+ var init_TabPanel = __esm({
1133
+ "src/pageObjects/elements/Groups/TabPanel.ts"() {
1081
1134
  "use strict";
1135
+ init_AbstractGroup();
1136
+ import_selenium_webdriver17 = require("selenium-webdriver");
1082
1137
  init_actions();
1083
- init_AbstractElementWithParent();
1084
- CheckBox = class extends AbstractElementWithParent {
1085
- async getValue() {
1086
- const result = await this.getAttribute("aria-checked");
1087
- if (result === "true")
1088
- return 1;
1089
- if (result === "false")
1090
- return 0;
1091
- return null;
1138
+ TabPanelItem = class extends AbstractGroup {
1139
+ constructor(parentCssSelector, elementCssSelector, driver) {
1140
+ super(parentCssSelector, elementCssSelector, driver);
1092
1141
  }
1093
- async setValue(value) {
1094
- const inputEl = await this.getElement();
1095
- const currentValue = await this.getValue();
1096
- if (currentValue !== value) {
1097
- await click(inputEl, this.driver);
1098
- }
1142
+ async click() {
1143
+ await click(await this.getElement(), this.driver);
1144
+ }
1145
+ async isActive() {
1146
+ const tabPanelItemElement = await this.getElement();
1147
+ const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver17.By.xpath('ancestor::div[@role="tab"][1]'));
1148
+ return await grandparentTab.getAttribute("aria-selected") === "true";
1149
+ }
1150
+ async getTitle() {
1151
+ return "";
1099
1152
  }
1100
1153
  };
1101
- }
1102
- });
1103
-
1104
- // src/utils/xpathHelper.ts
1105
- var XPathHelper;
1106
- var init_xpathHelper = __esm({
1107
- "src/utils/xpathHelper.ts"() {
1108
- "use strict";
1109
- XPathHelper = class {
1110
- static getClassAndValueXpath(cssClass, value) {
1111
- return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
1154
+ TabPanel = class extends AbstractGroup {
1155
+ item(name) {
1156
+ return new TabPanelItem(this.getFullCssSelector(), `.tab-panel-item[data-groupname="${name}"]`, this.driver);
1157
+ }
1158
+ async getTitle() {
1159
+ return "";
1112
1160
  }
1113
1161
  };
1114
1162
  }
1115
1163
  });
1116
1164
 
1117
- // src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
1118
- var import_selenium_webdriver14, DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
1119
- var init_ClearButtonStrategy = __esm({
1120
- "src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
1165
+ // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
1166
+ var import_selenium_webdriver18, ACCORDION_TITLE_CONTAINER, AccordionItem;
1167
+ var init_AccordionItem = __esm({
1168
+ "src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
1121
1169
  "use strict";
1122
- import_selenium_webdriver14 = require("selenium-webdriver");
1170
+ init_AbstractGroup();
1171
+ import_selenium_webdriver18 = require("selenium-webdriver");
1123
1172
  init_actions();
1124
- DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
1125
- DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
1126
- ClearButtonStrategy = class {
1127
- editorContainerClass;
1128
- _driver;
1129
- constructor(editorContainerClass, driver) {
1130
- this.editorContainerClass = editorContainerClass;
1131
- this._driver = driver;
1173
+ ACCORDION_TITLE_CONTAINER = "accordion-title-container";
1174
+ AccordionItem = class extends AbstractGroup {
1175
+ constructor(parentCssSelector, elementCssSelector, driver) {
1176
+ super(parentCssSelector, elementCssSelector, driver);
1132
1177
  }
1133
- async isEmptyEditorField() {
1134
- const editorContainer = await this._driver.findElement(import_selenium_webdriver14.By.css(this.editorContainerClass));
1135
- const classAttribute = await editorContainer.getAttribute("class");
1136
- return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
1178
+ async getDataOpenedAccordItemAttr() {
1179
+ const accordionElement = await this.getElement();
1180
+ return await accordionElement.getAttribute("data-opened");
1137
1181
  }
1138
- async clear() {
1139
- if (await this.isEmptyEditorField()) {
1140
- throw new Error("This field is already empty");
1182
+ async clickAccordionItemTitle() {
1183
+ const accordionElement = await this.getElement();
1184
+ const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver18.By.className(ACCORDION_TITLE_CONTAINER));
1185
+ await accordTitleElement.click();
1186
+ }
1187
+ async click() {
1188
+ await click(await this.getElement(), this.driver);
1189
+ }
1190
+ async isExpanded() {
1191
+ const dataOpened = await this.getDataOpenedAccordItemAttr();
1192
+ return dataOpened === "true";
1193
+ }
1194
+ async isCollapsed() {
1195
+ const dataOpened = await this.getDataOpenedAccordItemAttr();
1196
+ return dataOpened === "false" || !dataOpened;
1197
+ }
1198
+ async expand() {
1199
+ if (!await this.isExpanded()) {
1200
+ await this.clickAccordionItemTitle();
1201
+ }
1202
+ }
1203
+ async collapse() {
1204
+ if (await this.isExpanded()) {
1205
+ await this.clickAccordionItemTitle();
1141
1206
  }
1142
- const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
1143
- const clearBtn = await this._driver.findElement(import_selenium_webdriver14.By.css(clearBtnSelector));
1144
- await click(clearBtn, this._driver);
1145
1207
  }
1146
1208
  };
1147
1209
  }
1148
1210
  });
1149
1211
 
1150
- // src/pageObjects/elements/Editors/SelectBoxEditor.ts
1151
- var import_selenium_webdriver15, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
1152
- var init_SelectBoxEditor = __esm({
1153
- "src/pageObjects/elements/Editors/SelectBoxEditor.ts"() {
1212
+ // src/pageObjects/elements/Groups/Accordion/Accordion.ts
1213
+ var Accordion;
1214
+ var init_Accordion = __esm({
1215
+ "src/pageObjects/elements/Groups/Accordion/Accordion.ts"() {
1154
1216
  "use strict";
1155
- init_AbstractEditor();
1156
- import_selenium_webdriver15 = require("selenium-webdriver");
1157
- init_xpathHelper();
1158
- init_actions();
1159
- init_ClearButtonStrategy();
1160
- SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
1161
- combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
1162
- dropDownOptionClick = async (optionValue, driver, delay = true) => {
1163
- const { implicit } = await driver.manage().getTimeouts();
1164
- let optElement = null;
1165
- const timeout = delay ? implicit : 200;
1166
- let err = null;
1167
- try {
1168
- await driver.manage().setTimeouts({ implicit: timeout });
1169
- optElement = await driver.findElement(import_selenium_webdriver15.By.xpath(combinedValueXpath(optionValue)));
1170
- await click(optElement, driver);
1171
- } catch (e) {
1172
- err = new Error(`Item not found: "${optionValue}"`);
1173
- } finally {
1174
- await driver.manage().setTimeouts({ implicit });
1175
- }
1176
- if (err)
1177
- throw err;
1178
- };
1179
- SelectBoxEditor = class extends AbstractDXEditorWithInput {
1217
+ init_AbstractGroup();
1218
+ init_AccordionItem();
1219
+ Accordion = class extends AbstractGroup {
1180
1220
  constructor(parentCssSelector, elementCssSelector, driver) {
1181
1221
  super(parentCssSelector, elementCssSelector, driver);
1182
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
1183
- }
1184
- async setSelectInputValue(value) {
1185
- const inputEl = await this.getInputElement();
1186
- await click(inputEl, this.driver);
1187
- try {
1188
- await dropDownOptionClick(value, this.driver, false);
1189
- } catch {
1190
- await inputEl.sendKeys(value, import_selenium_webdriver15.Key.ENTER);
1191
- await dropDownOptionClick(value, this.driver);
1192
- }
1193
- }
1194
- async getValue() {
1195
- const value = await super.getInputValue();
1196
- return value == "" ? null : value;
1197
1222
  }
1198
- setValue(value) {
1199
- return this.setSelectInputValue(value);
1223
+ item(name) {
1224
+ return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.driver);
1200
1225
  }
1201
1226
  };
1202
1227
  }
1203
1228
  });
1204
1229
 
1205
- // src/pageObjects/elements/Editors/SwitchEditor.ts
1206
- var SwitchEditor;
1207
- var init_SwitchEditor = __esm({
1208
- "src/pageObjects/elements/Editors/SwitchEditor.ts"() {
1230
+ // src/pageObjects/elements/Groups/groupFactory.ts
1231
+ var groupFactory;
1232
+ var init_groupFactory = __esm({
1233
+ "src/pageObjects/elements/Groups/groupFactory.ts"() {
1209
1234
  "use strict";
1210
- init_actions();
1211
- init_AbstractElementWithParent();
1212
- init_wait();
1213
- SwitchEditor = class extends AbstractElementWithParent {
1214
- async getValue() {
1215
- const result = await this.getAttribute("aria-label");
1216
- if (result === "ON")
1217
- return 1;
1218
- if (result === "OFF")
1219
- return 0;
1220
- return null;
1221
- }
1222
- async setValue(value) {
1223
- if (value !== 0 && value !== 1) {
1224
- value = value ? 1 : 0;
1225
- }
1226
- const inputEl = await this.getElement();
1227
- const currentValue = await this.getValue();
1228
- if (currentValue === value) {
1229
- return;
1230
- }
1231
- await click(inputEl, this.driver);
1232
- await wait(async () => {
1233
- const updatedValue = await this.getValue();
1234
- return updatedValue !== currentValue;
1235
- }, this.driver);
1236
- }
1235
+ init_AbstractFormElement();
1236
+ init_Panel();
1237
+ init_TabPanel();
1238
+ init_Accordion();
1239
+ init_AccordionItem();
1240
+ groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
1241
+ const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1242
+ const classSting = await elementInstance.getClasses();
1243
+ if (classSting.includes("tab-panel-group"))
1244
+ return new TabPanel(parentCssSelector, elementCssSelector, driver);
1245
+ if (classSting.includes("tab-panel-item"))
1246
+ return new TabPanelItem(parentCssSelector, elementCssSelector, driver);
1247
+ if (classSting.includes("panel-group"))
1248
+ return new Panel(parentCssSelector, elementCssSelector, driver);
1249
+ if (classSting.includes("accordion-group"))
1250
+ return new Accordion(parentCssSelector, elementCssSelector, driver);
1251
+ if (classSting.includes("d5-accordion-item"))
1252
+ return new AccordionItem(parentCssSelector, elementCssSelector, driver);
1253
+ throw new Error("Unknown type of group. Please write ticket to the support");
1237
1254
  };
1238
1255
  }
1239
1256
  });
1240
1257
 
1241
- // src/pageObjects/elements/Editors/TagBox.ts
1242
- var import_selenium_webdriver16, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TAG_BOX_LIST_ITEM_SELECTOR, TagBox;
1243
- var init_TagBox = __esm({
1244
- "src/pageObjects/elements/Editors/TagBox.ts"() {
1258
+ // src/pageObjects/elements/FormGroup.ts
1259
+ var FormGroup;
1260
+ var init_FormGroup = __esm({
1261
+ "src/pageObjects/elements/FormGroup.ts"() {
1245
1262
  "use strict";
1246
- init_AbstractEditor();
1247
- import_selenium_webdriver16 = require("selenium-webdriver");
1248
- init_actions();
1263
+ init_AbstractElementWithParent();
1249
1264
  init_locators();
1250
- init_SelectBoxEditor();
1251
- init_ClearButtonStrategy();
1252
- init_fixElementStaleError();
1253
- TAGS_SELECTOR = ".dx-tag .tag-text";
1254
- DX_TAG_CONTAINER = "dx-tag-container";
1255
- DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
1256
- BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
1257
- TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
1258
- TagBox = class extends AbstractDXEditorWithInput {
1259
- constructor(parentCssSelector, elementCssSelector, driver) {
1260
- super(parentCssSelector, elementCssSelector, driver);
1261
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
1265
+ init_createDataTestId();
1266
+ init_groupFactory();
1267
+ init_AccordionItem();
1268
+ init_TabPanel();
1269
+ FormGroup = class extends AbstractElementWithParent {
1270
+ groupInstance;
1271
+ constructor(parentCssSelector, formName, name, driver) {
1272
+ super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
1262
1273
  }
1263
- async setTagBoxInputValue(values) {
1264
- const lastElement = values[values.length - 1];
1265
- const inputEl = await this.getInputElement();
1266
- await inputEl.click();
1267
- for (const value of values) {
1268
- await this.selectOption(inputEl, value, lastElement);
1274
+ async initInstance() {
1275
+ if (!this.groupInstance) {
1276
+ this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
1269
1277
  }
1270
- await this.confirmSelection();
1271
1278
  }
1272
- async waitOptionSelection() {
1273
- await fixElementStaleError(import_selenium_webdriver16.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
1274
- }
1275
- async selectOption(inputEl, value, lastElement) {
1279
+ /**
1280
+ * Возвращает булевое значение доступна ли группа
1281
+ * @example
1282
+ * expect(await tableList.group('MainSuperPanel').isDisplayed();
1283
+ */
1284
+ async isDisplayed() {
1276
1285
  try {
1277
- await dropDownOptionClick(value, this.driver, false);
1286
+ await this.initInstance();
1287
+ return this.groupInstance.isDisplayed();
1278
1288
  } catch {
1279
- await inputEl.sendKeys(value);
1280
- await dropDownOptionClick(value, this.driver);
1281
- }
1282
- await this.waitOptionSelection();
1283
- if (value !== lastElement) {
1284
- await inputEl.clear();
1289
+ return false;
1285
1290
  }
1286
1291
  }
1287
- async confirmSelection() {
1288
- const btnOk = await fixElementStaleError(import_selenium_webdriver16.By.css(BTN_OK_SELECTOR), this.driver);
1289
- await click(btnOk, this.driver);
1292
+ /**
1293
+ * Клик по элементам группы.
1294
+ * Метод работает если у группы есть дочерние элементы, например элементы аккордеона или вкладки таб панели.
1295
+ * @example
1296
+ * expect(await tableList.group('TabPanel').itemClick('Tab');
1297
+ * expect(await tableList.group('Accordion').itemClick('AccordionItem');
1298
+ */
1299
+ async itemClick(name) {
1300
+ await this.initInstance();
1301
+ const item = this.groupInstance.item?.(name);
1302
+ await item?.click();
1290
1303
  }
1291
- async getTagBoxInputValue() {
1292
- if (await this.isTagBoxEmpty()) {
1293
- return [];
1294
- }
1295
- const tags = await this.driver.findElements(
1296
- import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
1297
- );
1298
- const values = [];
1299
- for (const tag of tags) {
1300
- values.push(await tag.getAttribute("textContent"));
1304
+ /**
1305
+ * Метод работает если группа - это элемент аккордеона или вкладка таб панели
1306
+ * @example
1307
+ * expect(await tableList.group('Tab').click();
1308
+ * expect(await tableList.group('AccordionItem').click();
1309
+ */
1310
+ async click() {
1311
+ await this.initInstance();
1312
+ await this.groupInstance.click?.();
1313
+ }
1314
+ async collapse() {
1315
+ await this.initInstance();
1316
+ if (this.groupInstance instanceof AccordionItem) {
1317
+ await this.groupInstance.collapse();
1301
1318
  }
1302
- return values;
1303
1319
  }
1304
- async isTagBoxEmpty() {
1305
- const classAttribute = await this.getClasses();
1306
- return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
1320
+ async expand() {
1321
+ await this.initInstance();
1322
+ if (this.groupInstance instanceof AccordionItem) {
1323
+ await this.groupInstance.expand();
1324
+ }
1307
1325
  }
1308
- async getValue() {
1309
- const value = await this.getTagBoxInputValue();
1310
- return value.length ? value : null;
1326
+ async isExpanded() {
1327
+ await this.initInstance();
1328
+ if (this.groupInstance instanceof AccordionItem) {
1329
+ return await this.groupInstance.isExpanded();
1330
+ }
1331
+ return false;
1311
1332
  }
1312
- async setValue(values) {
1313
- if (!Array.isArray(values)) {
1314
- throw new Error("The provided value is not an array");
1333
+ async isCollapsed() {
1334
+ await this.initInstance();
1335
+ if (this.groupInstance instanceof AccordionItem) {
1336
+ return await this.groupInstance.isCollapsed();
1315
1337
  }
1316
- await this.setTagBoxInputValue(values);
1338
+ return false;
1317
1339
  }
1318
- async remove(itemText) {
1319
- const tagValues = await this.getValue();
1320
- const tagExists = tagValues.includes(itemText);
1321
- if (!tagExists) {
1322
- throw new Error(`The tag with the text: ${itemText} was not found`);
1340
+ async isActive() {
1341
+ await this.initInstance();
1342
+ if (this.groupInstance instanceof TabPanelItem) {
1343
+ return await this.groupInstance.isActive();
1323
1344
  }
1324
- const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
1325
- const clearBtn = await this.driver.findElement(
1326
- import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
1327
- );
1328
- await click(clearBtn, this.driver);
1345
+ return false;
1329
1346
  }
1330
1347
  };
1331
1348
  }
1332
1349
  });
1333
1350
 
1334
- // src/pageObjects/elements/Editors/ButtonGroup.ts
1335
- var import_selenium_webdriver17, ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
1336
- var init_ButtonGroup = __esm({
1337
- "src/pageObjects/elements/Editors/ButtonGroup.ts"() {
1351
+ // src/pageObjects/elements/Forms/AbstractForm.ts
1352
+ var AbstractForm;
1353
+ var init_AbstractForm = __esm({
1354
+ "src/pageObjects/elements/Forms/AbstractForm.ts"() {
1338
1355
  "use strict";
1339
- init_actions();
1340
- import_selenium_webdriver17 = require("selenium-webdriver");
1341
- init_AbstractElementWithParent();
1342
- ITEM_CLASS = "dx-buttongroup-item";
1343
- SELECTED_CLASS = "dx-state-selected";
1344
- ButtonGroup = class extends AbstractElementWithParent {
1345
- getItems() {
1346
- return this.driver.findElements(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
1347
- }
1348
- getDataValue(el) {
1349
- return el.getAttribute("data-value");
1356
+ init_AbstractPage();
1357
+ init_FormButton();
1358
+ init_FormGroup();
1359
+ AbstractForm = class extends AbstractPage {
1360
+ containerCssSelector = "";
1361
+ _formName = "";
1362
+ containerBy;
1363
+ getContainerElement = () => {
1364
+ return this.driver.findElement(this.containerBy);
1365
+ };
1366
+ set formName(name) {
1367
+ this._formName = name;
1350
1368
  }
1351
- async getValue() {
1352
- const selectedEl = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
1353
- return this.getDataValue(selectedEl);
1369
+ get formName() {
1370
+ return this._formName;
1354
1371
  }
1355
- async setValue(value) {
1356
- const items = await this.getItems();
1357
- let buttonEl = void 0;
1358
- for (const item of items) {
1359
- const text = await this.getDataValue(item);
1360
- if (text == value) {
1361
- buttonEl = item;
1362
- break;
1363
- }
1372
+ /**
1373
+ * Возвращает true если форма есть в DOM
1374
+ * @example
1375
+ * class MyForm extends FormEdit {}
1376
+ * //...
1377
+ * const formEdit = new MyForm();
1378
+ * expect(await formEdit.exists()).toBe(true);
1379
+ */
1380
+ async exists() {
1381
+ try {
1382
+ let elements = await this.driver.findElements(this.containerBy);
1383
+ return elements.length > 0;
1384
+ } catch (error) {
1385
+ return false;
1364
1386
  }
1365
- if (!buttonEl)
1366
- throw new Error(`Cannot find item in button group with text: ${value}`);
1367
- await click(buttonEl, this.driver);
1387
+ }
1388
+ button(name) {
1389
+ return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
1390
+ }
1391
+ /**
1392
+ * Находит группу на форме по имени
1393
+ * @example
1394
+ * const formEdit = new MyForm();
1395
+ * //...
1396
+ * expect(await formEdit.group('Name');
1397
+ */
1398
+ group(name) {
1399
+ return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
1368
1400
  }
1369
1401
  };
1370
1402
  }
1371
1403
  });
1372
1404
 
1373
- // src/pageObjects/elements/Editors/BooleanSelector.ts
1374
- var BooleanSelector;
1375
- var init_BooleanSelector = __esm({
1376
- "src/pageObjects/elements/Editors/BooleanSelector.ts"() {
1405
+ // src/pageObjects/elements/Forms/types.ts
1406
+ var init_types2 = __esm({
1407
+ "src/pageObjects/elements/Forms/types.ts"() {
1377
1408
  "use strict";
1378
- init_ButtonGroup();
1379
- BooleanSelector = class extends ButtonGroup {
1380
- // @ts-ignore
1381
- async getValue() {
1382
- const value = await super.getValue();
1383
- return value === "null" ? null : value === "1" ? 1 : 0;
1384
- }
1385
- // @ts-ignore
1386
- async setValue(value) {
1387
- const val = value == null ? "null" : value ? "1" : "0";
1388
- await super.setValue(val);
1389
- }
1390
- };
1391
1409
  }
1392
1410
  });
1393
1411
 
1394
- // src/pageObjects/elements/Editors/Date/utils.ts
1395
- var formatDMYDate;
1396
- var init_utils2 = __esm({
1397
- "src/pageObjects/elements/Editors/Date/utils.ts"() {
1412
+ // src/pageObjects/elements/Table/utils.ts
1413
+ function getCssRowByIndexSelector(index) {
1414
+ return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
1415
+ }
1416
+ function getCssCellByIndexSelector(index) {
1417
+ return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
1418
+ }
1419
+ var import_selenium_webdriver19, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1420
+ var init_utils2 = __esm({
1421
+ "src/pageObjects/elements/Table/utils.ts"() {
1422
+ "use strict";
1423
+ import_selenium_webdriver19 = require("selenium-webdriver");
1424
+ getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
1425
+ getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
1426
+ getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
1427
+ transformInputIndex = (index) => index + 1;
1428
+ transformOutputIndex = (index) => +index - 1;
1429
+ }
1430
+ });
1431
+
1432
+ // src/pageObjects/elements/Table/types.ts
1433
+ var init_types3 = __esm({
1434
+ "src/pageObjects/elements/Table/types.ts"() {
1398
1435
  "use strict";
1399
- formatDMYDate = (date) => {
1400
- const [year, month, day] = date.toJSON().split("T")[0].split("-");
1401
- return `${day}${month}${year}`;
1402
- };
1403
1436
  }
1404
1437
  });
1405
1438
 
1406
- // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
1407
- var import_selenium_webdriver18, BTN_CALENDAR_POPOVER_OPEN_SELECTOR, BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR, BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR, BTN_SAVE_SELECTOR, BaseDateEditor;
1408
- var init_BaseDateEditor = __esm({
1409
- "src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
1439
+ // src/pageObjects/elements/Table/elements/Cell.ts
1440
+ var import_selenium_webdriver20, Cell;
1441
+ var init_Cell = __esm({
1442
+ "src/pageObjects/elements/Table/elements/Cell.ts"() {
1410
1443
  "use strict";
1411
- init_AbstractEditor();
1412
- init_InputClearStrategy();
1413
- import_selenium_webdriver18 = require("selenium-webdriver");
1414
- init_locators();
1415
- init_actions();
1444
+ import_selenium_webdriver20 = require("selenium-webdriver");
1445
+ init_AbstractElementWithParent();
1416
1446
  init_utils2();
1417
- BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
1418
- BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
1419
- BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
1420
- BTN_SAVE_SELECTOR = "DateRange__button-save";
1421
- BaseDateEditor = class extends AbstractDXEditorWithInput {
1422
- constructor(parentCssSelector, elementCssSelector, driver) {
1423
- super(parentCssSelector, elementCssSelector, driver);
1424
- this.setClearStrategy(new InputClearStrategy());
1447
+ init_types3();
1448
+ Cell = class extends AbstractElementWithParent {
1449
+ _index;
1450
+ getCellIndex;
1451
+ constructor(parentCssSelector, getCellIndex, index, driver) {
1452
+ super(parentCssSelector, getCssCellByIndexSelector(index), driver);
1453
+ this.getCellIndex = getCellIndex;
1454
+ this._index = index;
1425
1455
  }
1426
- async setDateValue(value) {
1427
- const actions = this.driver.actions({ async: true });
1428
- const dateField = await this.driver.findElement(import_selenium_webdriver18.By.css(`${this.getFullCssSelector()}`));
1429
- const dateFieldDataTestID = await this.getDataTestId();
1430
- const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
1431
- const dateInputEl = await this.getInputElement();
1432
- await dateInputEl.clear();
1433
- if (Array.isArray(value)) {
1434
- const formattedDates = value.map(formatDMYDate);
1435
- const button = await dateField.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
1436
- await button.click();
1437
- const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver18.By.css(calendarPopoverSelector));
1438
- const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
1439
- const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
1440
- await dateFromInput.click();
1441
- await dateFromInput.sendKeys(formattedDates[0]);
1442
- await dateToInput.click();
1443
- await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
1444
- await dateToInput.sendKeys(formattedDates[1]);
1445
- await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.ENTER).perform();
1446
- const btnOk = await this.driver.findElement(import_selenium_webdriver18.By.css(`.${BTN_SAVE_SELECTOR}`));
1447
- await btnOk.click();
1448
- } else {
1449
- const formattedDate = formatDMYDate(value);
1450
- await click(dateInputEl, this.driver);
1451
- await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
1452
- await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver18.Key.ENTER).perform();
1453
- }
1456
+ set index(index) {
1457
+ this._index = index;
1458
+ this.elementCssSelector = getCssCellByIndexSelector(index);
1454
1459
  }
1455
- };
1456
- }
1457
- });
1458
-
1459
- // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
1460
- var import_selenium_webdriver19, SingleDateEditor;
1461
- var init_SingleDateEditor = __esm({
1462
- "src/pageObjects/elements/Editors/Date/SingleDateEditor.ts"() {
1463
- "use strict";
1464
- import_selenium_webdriver19 = require("selenium-webdriver");
1465
- init_InputClearStrategy();
1466
- init_BaseDateEditor();
1467
- SingleDateEditor = class extends BaseDateEditor {
1468
- constructor(parentCssSelector, elementCssSelector, driver) {
1469
- super(parentCssSelector, elementCssSelector, driver);
1470
- this.setClearStrategy(new InputClearStrategy());
1460
+ async getBooleanValue(cellEl) {
1461
+ const booleanEl = await cellEl.findElement(import_selenium_webdriver20.By.className("boolean-widget"));
1462
+ return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
1471
1463
  }
1472
- async getDateElement() {
1473
- return this.driver.findElement(import_selenium_webdriver19.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
1464
+ async getTagsValue(cellEl) {
1465
+ const tagsCssSelector = ".multiselect-container .multiselect-cell";
1466
+ const tags = await cellEl.findElements(import_selenium_webdriver20.By.css(tagsCssSelector));
1467
+ const values = [];
1468
+ for (const tag of tags) {
1469
+ values.push(await tag.getAttribute("textContent"));
1470
+ }
1471
+ return values;
1474
1472
  }
1475
- async getDateValue() {
1476
- const inputEl = await this.getDateElement();
1477
- return inputEl.getAttribute("value");
1473
+ async getElement() {
1474
+ if (this._index == null) {
1475
+ this.index = await this.getCellIndex();
1476
+ }
1477
+ return super.getElement();
1478
1478
  }
1479
1479
  async getValue() {
1480
- const value = await this.getDateValue();
1481
- return value == "" ? null : new Date(value);
1480
+ const cellEl = await this.getElement();
1481
+ const cellElClass = await cellEl.getAttribute("class");
1482
+ if (cellElClass.includes("boolean-column" /* Boolean */))
1483
+ return this.getBooleanValue(cellEl);
1484
+ if (cellElClass.includes("tags-column" /* Tags */))
1485
+ return this.getTagsValue(cellEl);
1486
+ return cellEl.getText();
1482
1487
  }
1483
- setValue(value) {
1484
- if (typeof value === "object") {
1485
- return this.setDateValue(value);
1486
- }
1487
- throw new Error(`Value is incorrect. It should be Object`);
1488
+ getIndex() {
1489
+ return this._index;
1488
1490
  }
1489
1491
  };
1490
1492
  }
1491
1493
  });
1492
1494
 
1493
- // src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
1494
- var import_selenium_webdriver20, DateRangeEditor;
1495
- var init_DateRangeEditor = __esm({
1496
- "src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
1495
+ // src/pageObjects/elements/Table/elements/Row.ts
1496
+ var import_selenium_webdriver21, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
1497
+ var init_Row = __esm({
1498
+ "src/pageObjects/elements/Table/elements/Row.ts"() {
1497
1499
  "use strict";
1498
- import_selenium_webdriver20 = require("selenium-webdriver");
1499
- init_InputClearStrategy();
1500
- init_BaseDateEditor();
1501
- DateRangeEditor = class extends BaseDateEditor {
1502
- constructor(parentCssSelector, elementCssSelector, driver) {
1503
- super(parentCssSelector, elementCssSelector, driver);
1504
- this.setClearStrategy(new InputClearStrategy());
1500
+ import_selenium_webdriver21 = require("selenium-webdriver");
1501
+ init_Cell();
1502
+ init_utils2();
1503
+ init_AbstractElementWithParent();
1504
+ init_actions();
1505
+ init_wait();
1506
+ init_fixElementStaleError();
1507
+ DX_SELECTION_CLASS = "dx-selection";
1508
+ DX_ROW_EDIT_CLASS = "dx-edit-row";
1509
+ DX_DATA_ROW_CLASS = "dx-data-row";
1510
+ Row = class extends AbstractElementWithParent {
1511
+ index;
1512
+ getColumnBy;
1513
+ constructor(parentCssSelector, index, driver, getColumnBy) {
1514
+ super(parentCssSelector, getCssRowByIndexSelector(index), driver);
1515
+ this.index = index;
1516
+ this.getColumnBy = getColumnBy;
1505
1517
  }
1506
- async getDateElement() {
1507
- return this.driver.findElement(import_selenium_webdriver20.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
1518
+ _getCell({ index, name, title }) {
1519
+ return new Cell(
1520
+ this.getFullCssSelector(),
1521
+ () => {
1522
+ return this.getColumnBy({ title, name }).getIndex();
1523
+ },
1524
+ index,
1525
+ this.driver
1526
+ );
1508
1527
  }
1509
- async getDateValue() {
1510
- const inputEl = await this.getDateElement();
1511
- const dateFromStr = await inputEl.getAttribute("datefrom");
1512
- const dateToStr = await inputEl.getAttribute("dateto");
1513
- const dateFrom = new Date(dateFromStr);
1514
- const dateTo = new Date(dateToStr);
1515
- return [dateFrom, dateTo];
1528
+ getCellByIndex(index) {
1529
+ return this._getCell({ index });
1516
1530
  }
1517
- async getValue() {
1518
- const values = await this.getDateValue();
1519
- return !values.length ? null : values;
1531
+ getCell(name) {
1532
+ return this._getCell({ name });
1520
1533
  }
1521
- setValue(value) {
1522
- if (typeof value === "object") {
1523
- return this.setDateValue(value);
1524
- }
1525
- throw new Error(`Value is incorrect. It should be Object`);
1534
+ getCellByTitle(title) {
1535
+ return this._getCell({ title });
1526
1536
  }
1527
- };
1528
- }
1529
- });
1530
-
1531
- // src/pageObjects/elements/Editors/Date/DateEditor.ts
1532
- var DateEditor;
1533
- var init_DateEditor = __esm({
1534
- "src/pageObjects/elements/Editors/Date/DateEditor.ts"() {
1535
- "use strict";
1536
- init_SingleDateEditor();
1537
- init_DateRangeEditor();
1538
- init_AbstractFormElement();
1539
- init_AbstractEditor();
1540
- init_types3();
1541
- DateEditor = class extends AbstractDXEditorWithInput {
1542
- editorInstance = null;
1543
- initPromise;
1544
- constructor(parentCssSelector, elementCssSelector, driver) {
1545
- super(parentCssSelector, elementCssSelector, driver);
1546
- this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
1537
+ async select() {
1538
+ const rowEl = await this.getElement();
1539
+ await click(rowEl, this.driver);
1540
+ await wait(
1541
+ async () => {
1542
+ const classes = await this.getClasses();
1543
+ return classes.includes(DX_SELECTION_CLASS);
1544
+ },
1545
+ this.driver,
1546
+ "Cannot select row"
1547
+ );
1547
1548
  }
1548
- async init(parentCssSelector, elementCssSelector, driver) {
1549
- await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
1549
+ async isSelected() {
1550
+ const result = await this.getAttribute("aria-selected");
1551
+ return result === "true";
1550
1552
  }
1551
- async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
1552
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1553
- const classString = await elementInstance.getClasses();
1554
- switch (true) {
1555
- case classString.includes("date-control" /* Date */):
1556
- this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
1557
- break;
1558
- case classString.includes("single-date-range-control" /* SingleDateRange */):
1559
- this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
1560
- break;
1561
- default:
1562
- this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
1563
- }
1553
+ getIndex() {
1554
+ return this.index;
1555
+ }
1556
+ async getCells() {
1557
+ const cells = await this.driver.findElements(import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1558
+ const result = [];
1559
+ cells.forEach((_, index) => {
1560
+ const newCell = this.getCellByIndex(index);
1561
+ result.push(newCell);
1562
+ });
1563
+ return result;
1564
+ }
1565
+ async clickInlineButton(buttonClass) {
1566
+ const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
1567
+ const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
1568
+ this.index
1569
+ )}"] .${buttonClass}`;
1570
+ const button = await fixElementStaleError(
1571
+ import_selenium_webdriver21.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`),
1572
+ this.driver
1573
+ );
1574
+ return click(button, this.driver);
1575
+ }
1576
+ async checkEditingMode(isEditing, msg) {
1577
+ await wait(
1578
+ async () => {
1579
+ return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
1580
+ },
1581
+ this.driver,
1582
+ msg
1583
+ );
1564
1584
  }
1565
- async ensureInitialized() {
1566
- if (!this.editorInstance) {
1567
- await this.initPromise;
1568
- }
1585
+ async edit() {
1586
+ await this.clickInlineButton("edit");
1587
+ await this.checkEditingMode(true, "Row did not switch to edit mode");
1569
1588
  }
1570
- async setValue(value) {
1571
- await this.ensureInitialized();
1572
- if (this.editorInstance) {
1573
- await this.editorInstance.setValue(value);
1574
- return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
1575
- }
1576
- throw new Error("Editor instance is not initialized.");
1589
+ async save() {
1590
+ await this.clickInlineButton("save");
1591
+ await this.checkEditingMode(false, "Row did not saved");
1577
1592
  }
1578
- async getValue() {
1579
- await this.ensureInitialized();
1580
- if (this.editorInstance) {
1581
- return this.editorInstance.getValue();
1582
- }
1583
- throw new Error("Editor instance is not initialized.");
1593
+ async cancel() {
1594
+ await this.clickInlineButton("cancel");
1595
+ await this.checkEditingMode(false, "Row did not switch to normal mode");
1584
1596
  }
1585
1597
  };
1586
1598
  }
1587
1599
  });
1588
1600
 
1589
- // src/pageObjects/elements/Editors/editorFactory.ts
1590
- var editorFactory;
1591
- var init_editorFactory = __esm({
1592
- "src/pageObjects/elements/Editors/editorFactory.ts"() {
1601
+ // src/pageObjects/elements/Table/elements/Column.ts
1602
+ var import_selenium_webdriver22, Column;
1603
+ var init_Column = __esm({
1604
+ "src/pageObjects/elements/Table/elements/Column.ts"() {
1593
1605
  "use strict";
1594
- init_types3();
1595
- init_AbstractFormElement();
1596
- init_TextEditor();
1597
- init_NumberEditor();
1598
- init_CheckBox();
1599
- init_SelectBoxEditor();
1600
- init_SwitchEditor();
1601
- init_TagBox();
1602
- init_BooleanSelector();
1603
- init_ButtonGroup();
1604
- init_DateEditor();
1605
- editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
1606
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1607
- const classSting = await elementInstance.getClasses();
1608
- if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
1609
- return new TextEditor(parentCssSelector, elementCssSelector, driver);
1610
- if (classSting.includes("number-control" /* Number */))
1611
- return new NumberEditor(parentCssSelector, elementCssSelector, driver);
1612
- if (classSting.includes("check-box" /* CheckBox */))
1613
- return new CheckBox(parentCssSelector, elementCssSelector, driver);
1614
- if (classSting.includes("multi-select-control" /* Multiselect */))
1615
- return new TagBox(parentCssSelector, elementCssSelector, driver);
1616
- if (classSting.includes("select-control" /* Select */))
1617
- return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
1618
- if (classSting.includes("switch-control" /* Switch */))
1619
- return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
1620
- if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
1621
- return new DateEditor(parentCssSelector, elementCssSelector, driver);
1606
+ import_selenium_webdriver22 = require("selenium-webdriver");
1607
+ init_utils2();
1608
+ init_AbstractElementWithParent();
1609
+ init_fixElementStaleError();
1610
+ Column = class extends AbstractElementWithParent {
1611
+ _index;
1612
+ _caption;
1613
+ _name;
1614
+ headerCssSelector;
1615
+ constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
1616
+ super(parentCssSelector, "", driver);
1617
+ this._name = name;
1618
+ this.index = index;
1619
+ this._caption = caption;
1620
+ this.headerCssSelector = headerCssSelector;
1621
+ }
1622
+ set index(index) {
1623
+ this._index = index;
1624
+ this.elementCssSelector = getColumnByIndexCssSelector(index);
1625
+ }
1626
+ get index() {
1627
+ return this._index;
1628
+ }
1629
+ async getElement() {
1630
+ await this.getIndex();
1631
+ return super.getElement();
1632
+ }
1633
+ async getColumnHeaderIndexBy(cssSelector) {
1634
+ const column = await fixElementStaleError(import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
1635
+ return transformOutputIndex(await column.getAttribute("aria-colindex"));
1636
+ }
1637
+ async getIndexByCaption() {
1638
+ return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
1639
+ }
1640
+ async getIndexByName() {
1641
+ return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
1642
+ }
1643
+ async caption() {
1644
+ const el = await this.getElement();
1645
+ return el.getText();
1646
+ }
1647
+ async getIndex() {
1648
+ if (this.index != null) {
1649
+ return this.index;
1650
+ }
1651
+ if (this._caption != null) {
1652
+ this.index = await this.getIndexByCaption();
1653
+ return this.index;
1654
+ }
1655
+ if (this._name != null) {
1656
+ this.index = await this.getIndexByName();
1657
+ return this.index;
1658
+ }
1659
+ throw new Error("Cant get the index in the column");
1622
1660
  }
1623
- if (classSting.includes("buttons-group" /* BooleanSelector */))
1624
- return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
1625
- if (classSting.includes("button-group-field" /* ButtonGroup */))
1626
- return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
1627
- throw new Error("Unknown type of editor. Please write ticket to the support");
1628
1661
  };
1629
1662
  }
1630
1663
  });
1631
1664
 
1632
- // src/pageObjects/elements/Editors/index.ts
1633
- var init_Editors = __esm({
1634
- "src/pageObjects/elements/Editors/index.ts"() {
1635
- "use strict";
1636
- init_TextEditor();
1637
- init_NumberEditor();
1638
- init_editorFactory();
1639
- init_types3();
1640
- }
1641
- });
1642
-
1643
1665
  // src/pageObjects/elements/AbstractEditor.ts
1644
1666
  var AbstractEditor;
1645
1667
  var init_AbstractEditor2 = __esm({
@@ -1732,11 +1754,11 @@ var init_FormField = __esm({
1732
1754
  });
1733
1755
 
1734
1756
  // src/pageObjects/elements/Table/Table.ts
1735
- var import_selenium_webdriver21, Table;
1757
+ var import_selenium_webdriver23, Table;
1736
1758
  var init_Table = __esm({
1737
1759
  "src/pageObjects/elements/Table/Table.ts"() {
1738
1760
  "use strict";
1739
- import_selenium_webdriver21 = require("selenium-webdriver");
1761
+ import_selenium_webdriver23 = require("selenium-webdriver");
1740
1762
  init_createDataTestId();
1741
1763
  init_AbstractElementWithParent();
1742
1764
  init_Row();
@@ -1786,7 +1808,7 @@ var init_Table = __esm({
1786
1808
  return this.getRowByIndex(index).select();
1787
1809
  }
1788
1810
  async getRows() {
1789
- const rows = await this.driver.findElements(import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1811
+ const rows = await this.driver.findElements(import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1790
1812
  const result = [];
1791
1813
  rows.forEach((_, index) => {
1792
1814
  const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
@@ -1796,7 +1818,7 @@ var init_Table = __esm({
1796
1818
  }
1797
1819
  async getColumns() {
1798
1820
  const columns = await this.driver.findElements(
1799
- import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1821
+ import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1800
1822
  );
1801
1823
  const result = [];
1802
1824
  columns.forEach((_, index) => {
@@ -1891,11 +1913,11 @@ var init_typesUtil = __esm({
1891
1913
  });
1892
1914
 
1893
1915
  // src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
1894
- var import_selenium_webdriver22, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
1916
+ var import_selenium_webdriver24, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
1895
1917
  var init_ToolbarMenu = __esm({
1896
1918
  "src/pageObjects/elements/TableToolbar/ToolbarMenu.ts"() {
1897
1919
  "use strict";
1898
- import_selenium_webdriver22 = require("selenium-webdriver");
1920
+ import_selenium_webdriver24 = require("selenium-webdriver");
1899
1921
  init_typesUtil();
1900
1922
  init_AbstractElementWithParent();
1901
1923
  init_locators();
@@ -1946,7 +1968,7 @@ var init_ToolbarMenu = __esm({
1946
1968
  throw new Error(`"title" must be a string or array of string`);
1947
1969
  let lTitle = isString(title) ? [title] : title;
1948
1970
  for (let t of lTitle) {
1949
- await this.goToButton(t, import_selenium_webdriver22.By.xpath(buttonByTextXpath(t)));
1971
+ await this.goToButton(t, import_selenium_webdriver24.By.xpath(buttonByTextXpath(t)));
1950
1972
  }
1951
1973
  }
1952
1974
  };
@@ -2121,11 +2143,11 @@ var init_PanelFilterField = __esm({
2121
2143
  });
2122
2144
 
2123
2145
  // src/pageObjects/elements/Filters/FilterPanel.ts
2124
- var import_selenium_webdriver23, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2146
+ var import_selenium_webdriver25, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2125
2147
  var init_FilterPanel = __esm({
2126
2148
  "src/pageObjects/elements/Filters/FilterPanel.ts"() {
2127
2149
  "use strict";
2128
- import_selenium_webdriver23 = require("selenium-webdriver");
2150
+ import_selenium_webdriver25 = require("selenium-webdriver");
2129
2151
  init_AbstractElement();
2130
2152
  init_PanelFilterField();
2131
2153
  init_actions();
@@ -2140,7 +2162,7 @@ var init_FilterPanel = __esm({
2140
2162
  async filterPanelButtons() {
2141
2163
  const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
2142
2164
  const el = await this.getElement();
2143
- return el.findElements(import_selenium_webdriver23.By.css(selector));
2165
+ return el.findElements(import_selenium_webdriver25.By.css(selector));
2144
2166
  }
2145
2167
  constructor(formName, driver) {
2146
2168
  super(driver, drawerSelector(formName));
@@ -2173,9 +2195,142 @@ var init_FilterPanel = __esm({
2173
2195
  await this.driver.sleep(300);
2174
2196
  }
2175
2197
  async close() {
2176
- const btn = await this.driver.findElement(import_selenium_webdriver23.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2198
+ const btn = await this.driver.findElement(import_selenium_webdriver25.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2199
+ await click(btn, this.driver);
2200
+ }
2201
+ };
2202
+ }
2203
+ });
2204
+
2205
+ // src/pageObjects/elements/Filters/HeaderFilterField.ts
2206
+ var HeaderFilterField;
2207
+ var init_HeaderFilterField = __esm({
2208
+ "src/pageObjects/elements/Filters/HeaderFilterField.ts"() {
2209
+ "use strict";
2210
+ init_locators();
2211
+ init_createDataTestId();
2212
+ init_AbstractEditor2();
2213
+ HeaderFilterField = class extends AbstractEditor {
2214
+ constructor(parentCssSelector, formName, name, driver) {
2215
+ super(parentCssSelector, byTestIdCssSelector(createHeaderFilterTestId(formName, name)), driver);
2216
+ }
2217
+ async getValue() {
2218
+ return super.getValue();
2219
+ }
2220
+ async setValue(value) {
2221
+ return super.setValue(value);
2222
+ }
2223
+ async clear() {
2224
+ return super.clear();
2225
+ }
2226
+ async remove(itemText) {
2227
+ return super.remove(itemText);
2228
+ }
2229
+ };
2230
+ }
2231
+ });
2232
+
2233
+ // src/pageObjects/elements/Filters/ColumnFilter.ts
2234
+ var import_selenium_webdriver26, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
2235
+ var init_ColumnFilter = __esm({
2236
+ "src/pageObjects/elements/Filters/ColumnFilter.ts"() {
2237
+ "use strict";
2238
+ init_actions();
2239
+ import_selenium_webdriver26 = require("selenium-webdriver");
2240
+ init_HeaderFilterField();
2241
+ init_waitElementIsVisible();
2242
+ init_AbstractElement();
2243
+ APPLY_SELECTOR = ".apply-button";
2244
+ CANCEL_SELECTOR = ".cancel-button";
2245
+ HEADER_FILTER_ICON = ".dx-column-indicators .dx-header-filter";
2246
+ HEADER_FILTER_CONTAINER = ".header-filter";
2247
+ HEADER_FILTER_BUTTONS = ".header-filter-buttons";
2248
+ ColumnFilter = class extends AbstractElement {
2249
+ _formName;
2250
+ _name;
2251
+ _column;
2252
+ constructor(formName, name, column, driver) {
2253
+ super(driver, HEADER_FILTER_CONTAINER);
2254
+ this._formName = formName;
2255
+ this._name = name;
2256
+ this._column = column;
2257
+ this.driver = driver;
2258
+ }
2259
+ async getApplyButton() {
2260
+ const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
2261
+ return this.driver.findElement(import_selenium_webdriver26.By.css(selector));
2262
+ }
2263
+ async getCancelButton() {
2264
+ const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
2265
+ return this.driver.findElement(import_selenium_webdriver26.By.css(selector));
2266
+ }
2267
+ async apply() {
2268
+ const btn = await this.getApplyButton();
2177
2269
  await click(btn, this.driver);
2178
2270
  }
2271
+ async cancel() {
2272
+ const btn = await this.getCancelButton();
2273
+ await click(btn, this.driver);
2274
+ }
2275
+ async initFilter() {
2276
+ const columnEl = await this._column.getElement();
2277
+ const actions = this.driver.actions({ async: true });
2278
+ await actions.move({ origin: columnEl }).perform();
2279
+ const elements = await columnEl.findElements(import_selenium_webdriver26.By.css(HEADER_FILTER_ICON));
2280
+ const headerFilterIcon = elements[1];
2281
+ await waitElementIsVisible({
2282
+ element: headerFilterIcon,
2283
+ driver: this.driver,
2284
+ errorMessage: `HeaderFilter "${this._name}" is not visible`
2285
+ });
2286
+ if (!headerFilterIcon)
2287
+ throw new Error(`HeaderFilter "${this._name}" is not visible`);
2288
+ await headerFilterIcon.click();
2289
+ return new HeaderFilterField("", this._formName, this._name, this.driver);
2290
+ }
2291
+ /**
2292
+ * Возвращает значение в поле
2293
+ * @example
2294
+ * expect(await form.columnFilter('NumberFld').getValue()).toBe(10);
2295
+ * expect(await form.columnFilter('TextFld').getValue()).toBe('TestValue');
2296
+ */
2297
+ async getValue() {
2298
+ const filter = await this.initFilter();
2299
+ const result = await filter.getValue();
2300
+ await this.cancel();
2301
+ return result;
2302
+ }
2303
+ /**
2304
+ * Устанавливает значение в поле
2305
+ * @example
2306
+ * await form.columnFilter('NumberFld').setValue(123);
2307
+ * await form.columnFilter('TextFld').setValue('TestValue');
2308
+ */
2309
+ async setValue(value) {
2310
+ const filter = await this.initFilter();
2311
+ await filter.setValue(value);
2312
+ return this.apply();
2313
+ }
2314
+ /**
2315
+ * Очищает значение в поле
2316
+ * @example
2317
+ * await form.columnFilter('NumberFld').clear();
2318
+ */
2319
+ async clear() {
2320
+ const filter = await this.initFilter();
2321
+ await filter.clear();
2322
+ return this.apply();
2323
+ }
2324
+ /**
2325
+ * Удаляет тег по переданному тексту
2326
+ * @example
2327
+ * await form.columnFilter('TagBox').remove('test');
2328
+ */
2329
+ async remove(itemText) {
2330
+ const filter = await this.initFilter();
2331
+ await filter.remove(itemText);
2332
+ return this.apply();
2333
+ }
2179
2334
  };
2180
2335
  }
2181
2336
  });
@@ -2194,6 +2349,7 @@ var init_ListForm = __esm({
2194
2349
  init_FormToolbar();
2195
2350
  init_FormFilterField();
2196
2351
  init_FilterPanel();
2352
+ init_ColumnFilter();
2197
2353
  DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
2198
2354
  ListForm = class extends Form {
2199
2355
  headerCssSelector;
@@ -2233,6 +2389,10 @@ var init_ListForm = __esm({
2233
2389
  formFilter(name) {
2234
2390
  return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
2235
2391
  }
2392
+ columnFilter(name) {
2393
+ const column = this.table().getColumnByName(name);
2394
+ return new ColumnFilter(this.formName, name, column, this.driver);
2395
+ }
2236
2396
  /**
2237
2397
  * Модель панели фильтрации
2238
2398
  * @returns {FilterPanel}
@@ -2297,18 +2457,18 @@ var init_createSubFormInstance = __esm({
2297
2457
  "src/pageObjects/elements/Forms/createSubFormInstance.ts"() {
2298
2458
  "use strict";
2299
2459
  init_locators();
2300
- init_types();
2460
+ init_types2();
2301
2461
  subFormTestId = (name) => `subform-${name}`;
2302
2462
  }
2303
2463
  });
2304
2464
 
2305
2465
  // src/pageObjects/elements/Forms/Form.ts
2306
- var import_selenium_webdriver24, formTestId, Form;
2466
+ var import_selenium_webdriver27, formTestId, Form;
2307
2467
  var init_Form = __esm({
2308
2468
  "src/pageObjects/elements/Forms/Form.ts"() {
2309
2469
  "use strict";
2310
2470
  init_locators();
2311
- import_selenium_webdriver24 = require("selenium-webdriver");
2471
+ import_selenium_webdriver27 = require("selenium-webdriver");
2312
2472
  init_AbstractForm();
2313
2473
  init_waitElementIsVisible();
2314
2474
  init_createSubFormInstance();
@@ -2333,10 +2493,10 @@ var init_Form = __esm({
2333
2493
  */
2334
2494
  async getTitleText() {
2335
2495
  if (await this.isModal()) {
2336
- const titleEl2 = await this.driver.findElement(import_selenium_webdriver24.By.css(`${this.popupContainerCssSelector} .popup-title`));
2496
+ const titleEl2 = await this.driver.findElement(import_selenium_webdriver27.By.css(`${this.popupContainerCssSelector} .popup-title`));
2337
2497
  return titleEl2.getText();
2338
2498
  }
2339
- let titleEl = await this.driver.findElement(import_selenium_webdriver24.By.className("main-toolbar-form-title"));
2499
+ let titleEl = await this.driver.findElement(import_selenium_webdriver27.By.className("main-toolbar-form-title"));
2340
2500
  return titleEl.getText();
2341
2501
  }
2342
2502
  setSubFormMode() {
@@ -2354,7 +2514,7 @@ var init_Form = __esm({
2354
2514
  */
2355
2515
  async subForm(name) {
2356
2516
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
2357
- const byCssSelector = import_selenium_webdriver24.By.css(cssSelector);
2517
+ const byCssSelector = import_selenium_webdriver27.By.css(cssSelector);
2358
2518
  const subFormEl = await this.driver.findElement(byCssSelector);
2359
2519
  await waitElementIsVisible({
2360
2520
  element: subFormEl,
@@ -2384,18 +2544,18 @@ var FormEdit_exports = {};
2384
2544
  __export(FormEdit_exports, {
2385
2545
  default: () => FormEdit
2386
2546
  });
2387
- var import_selenium_webdriver25, FormEdit;
2547
+ var import_selenium_webdriver28, FormEdit;
2388
2548
  var init_FormEdit = __esm({
2389
2549
  "src/pageObjects/elements/Forms/FormEdit.ts"() {
2390
2550
  "use strict";
2391
2551
  init_Form();
2392
- import_selenium_webdriver25 = require("selenium-webdriver");
2552
+ import_selenium_webdriver28 = require("selenium-webdriver");
2393
2553
  init_FormField();
2394
2554
  init_actions();
2395
2555
  init_wait();
2396
2556
  FormEdit = class extends Form {
2397
- saveButtonBy = import_selenium_webdriver25.By.id("button-save");
2398
- closeButtonBy = import_selenium_webdriver25.By.id("button-cancel");
2557
+ saveButtonBy = import_selenium_webdriver28.By.id("button-save");
2558
+ closeButtonBy = import_selenium_webdriver28.By.id("button-cancel");
2399
2559
  constructor(driver) {
2400
2560
  super(driver);
2401
2561
  this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
@@ -2578,8 +2738,45 @@ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
2578
2738
  };
2579
2739
 
2580
2740
  // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
2741
+ var import_selenium_webdriver15 = require("selenium-webdriver");
2581
2742
  init_wait();
2582
2743
  init_locators();
2744
+ init_Editors();
2745
+
2746
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
2747
+ init_actions();
2748
+ init_fixElementStaleError();
2749
+ var SubsystemItem = class {
2750
+ bySelector;
2751
+ driver;
2752
+ constructor({ driver, bySelector }) {
2753
+ this.bySelector = bySelector;
2754
+ this.driver = driver;
2755
+ }
2756
+ async getElement() {
2757
+ return fixElementStaleError(this.bySelector, this.driver);
2758
+ }
2759
+ async getTitle() {
2760
+ const el = await this.getElement();
2761
+ return await el.getAttribute("data-title");
2762
+ }
2763
+ async click() {
2764
+ const el = await this.getElement();
2765
+ await click(el, this.driver);
2766
+ }
2767
+ };
2768
+
2769
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
2770
+ init_createDataTestId();
2771
+ init_actions();
2772
+ init_ClearButtonStrategy();
2773
+ init_waitElementIsVisible();
2774
+ var SEARCH_ITEM_SELECTOR = "search-item";
2775
+ var BACK_BUTTON_SELECTOR = "subsystem-back-item";
2776
+ var SEARCH_INPUT_SELECTOR = "search-subsystem-input";
2777
+ var byTitleCssSelector = (title) => {
2778
+ return `span[data-title="${title}"]`;
2779
+ };
2583
2780
  var SubsystemsPanel = class extends AbstractElement {
2584
2781
  header;
2585
2782
  constructor(driver) {
@@ -2591,6 +2788,81 @@ var SubsystemsPanel = class extends AbstractElement {
2591
2788
  await wait(async () => await title.getText() != "", this.driver);
2592
2789
  return title.getText();
2593
2790
  }
2791
+ getSearchComponent() {
2792
+ return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR));
2793
+ }
2794
+ /**
2795
+ * Находит сабсистему по заголовку
2796
+ * @example
2797
+ * const subsystemsPanel= new SubsystemsPanel();
2798
+ * //...
2799
+ * await subsystemsPanel.search('SubSystemTitle');
2800
+ */
2801
+ async search(title) {
2802
+ const searchComponent = this.getSearchComponent();
2803
+ await searchComponent.setValue(title);
2804
+ await wait(
2805
+ async () => {
2806
+ const findElement = await this.itemByTitle(title).getElement();
2807
+ const classes = await findElement.getAttribute("class");
2808
+ return classes.includes(SEARCH_ITEM_SELECTOR);
2809
+ },
2810
+ this.driver,
2811
+ `Cannot find element: ${title}`
2812
+ );
2813
+ }
2814
+ /**
2815
+ * Очищает поиск сабсистем
2816
+ * @example
2817
+ * const subsystemsPanel= new SubsystemsPanel();
2818
+ * //...
2819
+ * await subsystemsPanel.searchClear();
2820
+ */
2821
+ async searchClear() {
2822
+ const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
2823
+ const clearBtn = await this.driver.findElement(import_selenium_webdriver15.By.css(clearBtnSelector));
2824
+ if (await clearBtn.isDisplayed()) {
2825
+ await click(clearBtn, this.driver);
2826
+ }
2827
+ }
2828
+ /**
2829
+ * Возвращает сабсистему по имени
2830
+ * @example
2831
+ * const subsystemsPanel= new SubsystemsPanel();
2832
+ * //...
2833
+ * const subsystem = subsystemsPanel.item('SubSystemName');
2834
+ */
2835
+ item(name) {
2836
+ const elementCSS = createSubSystemTestId(name);
2837
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
2838
+ }
2839
+ /**
2840
+ * Возвращает сабсистему по заголовку
2841
+ * @example
2842
+ * const subsystemsPanel= new SubsystemsPanel();
2843
+ * //...
2844
+ * const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
2845
+ */
2846
+ itemByTitle(title) {
2847
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(byTitleCssSelector(title)) });
2848
+ }
2849
+ /**
2850
+ * Возвращается на уровень выше по сабсистемам
2851
+ * @example
2852
+ * const subsystemsPanel= new SubsystemsPanel();
2853
+ * //...
2854
+ * wait subsystemsPanel.back();
2855
+ */
2856
+ async back() {
2857
+ const backButton = this.driver.findElement(import_selenium_webdriver15.By.css(`#aside .${BACK_BUTTON_SELECTOR}`));
2858
+ await waitElementIsVisible(
2859
+ {
2860
+ element: backButton,
2861
+ driver: this.driver
2862
+ }
2863
+ );
2864
+ await click(backButton, this.driver);
2865
+ }
2594
2866
  };
2595
2867
 
2596
2868
  // src/index.ts
@@ -2599,13 +2871,13 @@ init_ListForm();
2599
2871
  init_TreeView();
2600
2872
 
2601
2873
  // src/pageObjects/elements/Forms/ReportForm.ts
2602
- var import_selenium_webdriver26 = require("selenium-webdriver");
2874
+ var import_selenium_webdriver29 = require("selenium-webdriver");
2603
2875
  init_FormEdit();
2604
2876
  var ReportForm = class extends FormEdit {
2605
2877
  constructor(driver) {
2606
2878
  super(driver);
2607
2879
  this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
2608
- this.saveButtonBy = import_selenium_webdriver26.By.id("button-apply");
2880
+ this.saveButtonBy = import_selenium_webdriver29.By.id("button-apply");
2609
2881
  }
2610
2882
  /**
2611
2883
  * Знаходить поле/фільтр у формі репорту за ім'ям
@@ -2628,7 +2900,7 @@ init_FilterPanel();
2628
2900
 
2629
2901
  // src/pageObjects/elements/Dialog.ts
2630
2902
  init_AbstractElement();
2631
- var import_selenium_webdriver27 = require("selenium-webdriver");
2903
+ var import_selenium_webdriver30 = require("selenium-webdriver");
2632
2904
  init_AbstractButton();
2633
2905
  var DIALOG_CLASS = ".d5-dialog";
2634
2906
  var DIALOG_TITLE_CLASS = ".dialog__title";
@@ -2643,7 +2915,7 @@ var DialogButton = class extends AbstractButton {
2643
2915
  }
2644
2916
  async getElement() {
2645
2917
  const panel = await super.getElement();
2646
- return panel.findElement(import_selenium_webdriver27.By.xpath(buttonByTextXpath2(this.text)));
2918
+ return panel.findElement(import_selenium_webdriver30.By.xpath(buttonByTextXpath2(this.text)));
2647
2919
  }
2648
2920
  buttonNotDisplayedError() {
2649
2921
  return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
@@ -2663,11 +2935,11 @@ var Dialog = class extends AbstractElement {
2663
2935
  return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
2664
2936
  }
2665
2937
  async title() {
2666
- const el = await this.driver.findElement(import_selenium_webdriver27.By.css(this.titleSelector));
2938
+ const el = await this.driver.findElement(import_selenium_webdriver30.By.css(this.titleSelector));
2667
2939
  return await el.getText();
2668
2940
  }
2669
2941
  async text() {
2670
- const el = await this.driver.findElement(import_selenium_webdriver27.By.css(this.textSelector));
2942
+ const el = await this.driver.findElement(import_selenium_webdriver30.By.css(this.textSelector));
2671
2943
  return await el.getText();
2672
2944
  }
2673
2945
  button(text) {