d5-testing-library 1.5.0 → 1.7.0-alpha.0

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,1117 +406,1260 @@ 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/TabPanel.ts
442
- var import_selenium_webdriver8, getTabTestIdByName, TabPanel;
443
- var init_TabPanel = __esm({
444
- "src/pageObjects/elements/Groups/TabPanel/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();
447
454
  import_selenium_webdriver8 = require("selenium-webdriver");
448
- init_locators();
449
- getTabTestIdByName = (name) => `tab-caption-${name}`;
450
- TabPanel = class extends AbstractGroup {
451
- constructor(parentCssSelector, elementCssSelector, driver) {
452
- super(parentCssSelector, elementCssSelector, driver);
455
+ init_actions();
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;
453
464
  }
454
- _getTab(name) {
455
- return this.driver.findElement(import_selenium_webdriver8.By.css(`${this.getFullCssSelector()} ${byTestIdCssSelector(getTabTestIdByName(name))}`));
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);
456
469
  }
457
- async tabClick(name) {
458
- const tabEl = this._getTab(name);
459
- await tabEl.click();
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);
460
477
  }
461
478
  };
462
479
  }
463
480
  });
464
481
 
465
- // src/pageObjects/elements/Groups/groupFactory.ts
466
- var groupFactory;
467
- var init_groupFactory = __esm({
468
- "src/pageObjects/elements/Groups/groupFactory.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"() {
469
486
  "use strict";
470
- init_AbstractFormElement();
471
- init_Panel();
472
- init_TabPanel();
473
- groupFactory = async (parentCssSelector, elementCssSelector, driver) => {
474
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
475
- const classSting = await elementInstance.getClasses();
476
- if (classSting.includes("tab-panel-group"))
477
- return new TabPanel(parentCssSelector, elementCssSelector, driver);
478
- if (classSting.includes("panel-group"))
479
- return new Panel(parentCssSelector, elementCssSelector, driver);
480
- throw new Error("Unknown type of group. Please write ticket to the support");
481
- };
482
- }
483
- });
484
-
485
- // src/pageObjects/elements/FormGroup.ts
486
- var FormGroup;
487
- var init_FormGroup = __esm({
488
- "src/pageObjects/elements/FormGroup.ts"() {
489
- "use strict";
490
- init_AbstractElementWithParent();
491
- init_locators();
492
- init_createDataTestId();
493
- init_groupFactory();
494
- FormGroup = class extends AbstractElementWithParent {
495
- editor;
496
- constructor(parentCssSelector, formName, name, driver) {
497
- super(parentCssSelector, byTestIdCssSelector(createGroupTestId(formName, name)), driver);
487
+ init_AbstractEditor();
488
+ import_selenium_webdriver9 = require("selenium-webdriver");
489
+ init_xpathHelper();
490
+ init_actions();
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 });
498
507
  }
499
- async initEditor() {
500
- if (!this.editor) {
501
- this.editor = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
502
- }
508
+ if (err)
509
+ throw err;
510
+ };
511
+ SelectBoxEditor = class extends AbstractDXEditorWithInput {
512
+ constructor(parentCssSelector, elementCssSelector, driver) {
513
+ super(parentCssSelector, elementCssSelector, driver);
514
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
503
515
  }
504
- /**
505
- * Возвращает булевое значение доступна ли группа
506
- * @example
507
- * expect(await tableList.group('MainSuperPanel').isDisplayed();
508
- */
509
- async isDisplayed() {
516
+ async setSelectInputValue(value) {
517
+ const inputEl = await this.getInputElement();
518
+ await click(inputEl, this.driver);
510
519
  try {
511
- await this.initEditor();
512
- return this.editor.isDisplayed();
520
+ await dropDownOptionClick(value, this.driver, false);
513
521
  } catch {
514
- return false;
522
+ await inputEl.sendKeys(value, import_selenium_webdriver9.Key.ENTER);
523
+ await dropDownOptionClick(value, this.driver);
515
524
  }
516
525
  }
517
- /**
518
- * Происходит клик по табе
519
- * @example
520
- * expect(await tableList.group('TabPanel').tabClick(tabName);
521
- */
522
- async tabClick(name) {
523
- await this.initEditor();
524
- await this.editor.tabClick(name);
526
+ async getValue() {
527
+ const value = await super.getInputValue();
528
+ return value == "" ? null : value;
529
+ }
530
+ setValue(value) {
531
+ return this.setSelectInputValue(value);
525
532
  }
526
533
  };
527
534
  }
528
535
  });
529
536
 
530
- // src/pageObjects/elements/Forms/AbstractForm.ts
531
- var AbstractForm;
532
- var init_AbstractForm = __esm({
533
- "src/pageObjects/elements/Forms/AbstractForm.ts"() {
537
+ // src/pageObjects/elements/Editors/SwitchEditor.ts
538
+ var SwitchEditor;
539
+ var init_SwitchEditor = __esm({
540
+ "src/pageObjects/elements/Editors/SwitchEditor.ts"() {
534
541
  "use strict";
535
- init_AbstractPage();
536
- init_FormButton();
537
- init_FormGroup();
538
- AbstractForm = class extends AbstractPage {
539
- containerCssSelector = "";
540
- _formName = "";
541
- containerBy;
542
- getContainerElement = () => {
543
- return this.driver.findElement(this.containerBy);
544
- };
545
- set formName(name) {
546
- this._formName = name;
547
- }
548
- get formName() {
549
- return this._formName;
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;
550
553
  }
551
- /**
552
- * Возвращает true если форма есть в DOM
553
- * @example
554
- * class MyForm extends FormEdit {}
555
- * //...
556
- * const formEdit = new MyForm();
557
- * expect(await formEdit.exists()).toBe(true);
558
- */
559
- async exists() {
560
- try {
561
- let elements = await this.driver.findElements(this.containerBy);
562
- return elements.length > 0;
563
- } catch (error) {
564
- return false;
554
+ async setValue(value) {
555
+ if (value !== 0 && value !== 1) {
556
+ value = value ? 1 : 0;
565
557
  }
566
- }
567
- button(name) {
568
- return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
569
- }
570
- /**
571
- * Находит группу на форме по имени
572
- * @example
573
- * const formEdit = new MyForm();
574
- * //...
575
- * expect(await formEdit.group('Name');
576
- */
577
- group(name) {
578
- return new FormGroup(this.containerCssSelector, this.formName, name, this.driver);
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);
579
568
  }
580
569
  };
581
570
  }
582
571
  });
583
572
 
584
- // src/pageObjects/elements/Forms/types.ts
585
- var init_types = __esm({
586
- "src/pageObjects/elements/Forms/types.ts"() {
587
- "use strict";
588
- }
589
- });
590
-
591
- // src/pageObjects/elements/Table/utils.ts
592
- function getCssRowByIndexSelector(index) {
593
- return `tr[aria-rowindex="${transformInputIndex(index)}"]`;
594
- }
595
- function getCssCellByIndexSelector(index) {
596
- return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
597
- }
598
- var import_selenium_webdriver9, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
599
- var init_utils = __esm({
600
- "src/pageObjects/elements/Table/utils.ts"() {
601
- "use strict";
602
- import_selenium_webdriver9 = require("selenium-webdriver");
603
- getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
604
- getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
605
- getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
606
- transformInputIndex = (index) => index + 1;
607
- transformOutputIndex = (index) => +index - 1;
608
- }
609
- });
610
-
611
- // src/pageObjects/elements/Table/types.ts
612
- var init_types2 = __esm({
613
- "src/pageObjects/elements/Table/types.ts"() {
614
- "use strict";
615
- }
616
- });
617
-
618
- // src/pageObjects/elements/Table/elements/Cell.ts
619
- var import_selenium_webdriver10, Cell;
620
- var init_Cell = __esm({
621
- "src/pageObjects/elements/Table/elements/Cell.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"() {
622
577
  "use strict";
578
+ init_AbstractEditor();
623
579
  import_selenium_webdriver10 = require("selenium-webdriver");
624
- init_AbstractElementWithParent();
625
- init_utils();
626
- init_types2();
627
- Cell = class extends AbstractElementWithParent {
628
- _index;
629
- getCellIndex;
630
- constructor(parentCssSelector, getCellIndex, index, driver) {
631
- super(parentCssSelector, getCssCellByIndexSelector(index), driver);
632
- this.getCellIndex = getCellIndex;
633
- this._index = index;
580
+ init_actions();
581
+ init_locators();
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));
634
594
  }
635
- set index(index) {
636
- this._index = index;
637
- this.elementCssSelector = getCssCellByIndexSelector(index);
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);
601
+ }
602
+ await this.confirmSelection();
638
603
  }
639
- async getBooleanValue(cellEl) {
640
- const booleanEl = await cellEl.findElement(import_selenium_webdriver10.By.className("boolean-widget"));
641
- return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
604
+ async waitOptionSelection() {
605
+ await fixElementStaleError(import_selenium_webdriver10.By.css(TAG_BOX_LIST_ITEM_SELECTOR), this.driver);
642
606
  }
643
- async getTagsValue(cellEl) {
644
- const tagsCssSelector = ".multiselect-container .multiselect-cell";
645
- const tags = await cellEl.findElements(import_selenium_webdriver10.By.css(tagsCssSelector));
607
+ async selectOption(inputEl, value, lastElement) {
608
+ try {
609
+ await dropDownOptionClick(value, this.driver, false);
610
+ } catch {
611
+ await inputEl.sendKeys(value);
612
+ await dropDownOptionClick(value, this.driver);
613
+ }
614
+ await this.waitOptionSelection();
615
+ if (value !== lastElement) {
616
+ await inputEl.clear();
617
+ }
618
+ }
619
+ async confirmSelection() {
620
+ const btnOk = await fixElementStaleError(import_selenium_webdriver10.By.css(BTN_OK_SELECTOR), this.driver);
621
+ await click(btnOk, this.driver);
622
+ }
623
+ async getTagBoxInputValue() {
624
+ if (await this.isTagBoxEmpty()) {
625
+ return [];
626
+ }
627
+ const tags = await this.driver.findElements(
628
+ import_selenium_webdriver10.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
629
+ );
646
630
  const values = [];
647
631
  for (const tag of tags) {
648
632
  values.push(await tag.getAttribute("textContent"));
649
633
  }
650
634
  return values;
651
635
  }
652
- async getElement() {
653
- if (this._index == null) {
654
- this.index = await this.getCellIndex();
655
- }
656
- return super.getElement();
636
+ async isTagBoxEmpty() {
637
+ const classAttribute = await this.getClasses();
638
+ return classAttribute.includes(DX_TEXTEDITOR_EMPTY2);
657
639
  }
658
640
  async getValue() {
659
- const cellEl = await this.getElement();
660
- const cellElClass = await cellEl.getAttribute("class");
661
- if (cellElClass.includes("boolean-column" /* Boolean */))
662
- return this.getBooleanValue(cellEl);
663
- if (cellElClass.includes("tags-column" /* Tags */))
664
- return this.getTagsValue(cellEl);
665
- return cellEl.getText();
641
+ const value = await this.getTagBoxInputValue();
642
+ return value.length ? value : null;
666
643
  }
667
- getIndex() {
668
- return this._index;
644
+ async setValue(values) {
645
+ if (!Array.isArray(values)) {
646
+ throw new Error("The provided value is not an array");
647
+ }
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);
669
661
  }
670
662
  };
671
663
  }
672
664
  });
673
665
 
674
- // src/pageObjects/elements/Table/elements/Row.ts
675
- var import_selenium_webdriver11, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
676
- var init_Row = __esm({
677
- "src/pageObjects/elements/Table/elements/Row.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"() {
678
670
  "use strict";
671
+ init_actions();
679
672
  import_selenium_webdriver11 = require("selenium-webdriver");
680
- init_Cell();
681
- init_utils();
682
673
  init_AbstractElementWithParent();
683
- init_actions();
684
- init_wait();
685
- DX_SELECTION_CLASS = "dx-selection";
686
- DX_ROW_EDIT_CLASS = "dx-edit-row";
687
- DX_DATA_ROW_CLASS = "dx-data-row";
688
- Row = class extends AbstractElementWithParent {
689
- index;
690
- getColumnBy;
691
- constructor(parentCssSelector, index, driver, getColumnBy) {
692
- super(parentCssSelector, getCssRowByIndexSelector(index), driver);
693
- this.index = index;
694
- this.getColumnBy = getColumnBy;
695
- }
696
- _getCell({ index, name, title }) {
697
- return new Cell(
698
- this.getFullCssSelector(),
699
- () => {
700
- return this.getColumnBy({ title, name }).getIndex();
701
- },
702
- index,
703
- this.driver
704
- );
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}`));
705
679
  }
706
- getCellByIndex(index) {
707
- return this._getCell({ index });
680
+ getDataValue(el) {
681
+ return el.getAttribute("data-value");
708
682
  }
709
- getCell(name) {
710
- return this._getCell({ name });
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);
711
686
  }
712
- getCellByTitle(title) {
713
- return this._getCell({ title });
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);
714
700
  }
715
- async select() {
716
- const rowEl = await this.getElement();
717
- await click(rowEl, this.driver);
718
- await wait(
719
- async () => {
720
- const classes = await this.getClasses();
721
- return classes.includes(DX_SELECTION_CLASS);
722
- },
723
- this.driver,
724
- "Cannot select row"
725
- );
701
+ };
702
+ }
703
+ });
704
+
705
+ // src/pageObjects/elements/Editors/BooleanSelector.ts
706
+ var BooleanSelector;
707
+ var init_BooleanSelector = __esm({
708
+ "src/pageObjects/elements/Editors/BooleanSelector.ts"() {
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;
726
716
  }
727
- async isSelected() {
728
- const result = await this.getAttribute("aria-selected");
729
- return result === "true";
717
+ // @ts-ignore
718
+ async setValue(value) {
719
+ const val = value == null ? "null" : value ? "1" : "0";
720
+ await super.setValue(val);
730
721
  }
731
- getIndex() {
732
- return this.index;
722
+ };
723
+ }
724
+ });
725
+
726
+ // src/pageObjects/elements/Editors/Date/utils.ts
727
+ var formatDMYDate;
728
+ var init_utils = __esm({
729
+ "src/pageObjects/elements/Editors/Date/utils.ts"() {
730
+ "use strict";
731
+ formatDMYDate = (date) => {
732
+ const [year, month, day] = date.toJSON().split("T")[0].split("-");
733
+ return `${day}${month}${year}`;
734
+ };
735
+ }
736
+ });
737
+
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"() {
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());
733
757
  }
734
- async getCells() {
735
- const cells = await this.driver.findElements(import_selenium_webdriver11.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
736
- const result = [];
737
- cells.forEach((_, index) => {
738
- const newCell = this.getCellByIndex(index);
739
- result.push(newCell);
740
- });
741
- return result;
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
+ }
742
786
  }
743
- async clickInlineButton(buttonClass) {
744
- const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
745
- const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
746
- this.index
747
- )}"] .${buttonClass}`;
748
- const button = await this.driver.findElement(
749
- import_selenium_webdriver11.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
750
- );
751
- return click(button, this.driver);
787
+ };
788
+ }
789
+ });
790
+
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"() {
795
+ "use strict";
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());
752
803
  }
753
- async checkEditingMode(isEditing, msg) {
754
- await wait(
755
- async () => {
756
- return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
757
- },
758
- this.driver,
759
- msg
760
- );
804
+ async getDateElement() {
805
+ return this.driver.findElement(import_selenium_webdriver13.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
761
806
  }
762
- async edit() {
763
- await this.clickInlineButton("edit");
764
- await this.checkEditingMode(true, "Row did not switch to edit mode");
807
+ async getDateValue() {
808
+ const inputEl = await this.getDateElement();
809
+ return inputEl.getAttribute("value");
765
810
  }
766
- async save() {
767
- await this.clickInlineButton("save");
768
- await this.checkEditingMode(false, "Row did not saved");
811
+ async getValue() {
812
+ const value = await this.getDateValue();
813
+ return value == "" ? null : new Date(value);
769
814
  }
770
- async cancel() {
771
- await this.clickInlineButton("cancel");
772
- await this.checkEditingMode(false, "Row did not switch to normal mode");
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`);
773
820
  }
774
821
  };
775
822
  }
776
823
  });
777
824
 
778
- // src/pageObjects/elements/Table/elements/Column.ts
779
- var import_selenium_webdriver12, Column;
780
- var init_Column = __esm({
781
- "src/pageObjects/elements/Table/elements/Column.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"() {
782
829
  "use strict";
783
- import_selenium_webdriver12 = require("selenium-webdriver");
784
- init_utils();
785
- init_AbstractElementWithParent();
786
- init_fixElementStaleError();
787
- Column = class extends AbstractElementWithParent {
788
- _index;
789
- _caption;
790
- _name;
791
- headerCssSelector;
792
- constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
793
- super(parentCssSelector, "", driver);
794
- this._name = name;
795
- this.index = index;
796
- this._caption = caption;
797
- this.headerCssSelector = headerCssSelector;
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());
798
837
  }
799
- set index(index) {
800
- this._index = index;
801
- this.elementCssSelector = getColumnByIndexCssSelector(index);
838
+ async getDateElement() {
839
+ return this.driver.findElement(import_selenium_webdriver14.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
802
840
  }
803
- get index() {
804
- return this._index;
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];
805
848
  }
806
- async getElement() {
807
- await this.getIndex();
808
- return super.getElement();
849
+ async getValue() {
850
+ const values = await this.getDateValue();
851
+ return !values.length ? null : values;
809
852
  }
810
- async getColumnHeaderIndexBy(cssSelector) {
811
- const column = await fixElementStaleError(import_selenium_webdriver12.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
812
- return transformOutputIndex(await column.getAttribute("aria-colindex"));
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`);
813
858
  }
814
- async getIndexByCaption() {
815
- return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
859
+ };
860
+ }
861
+ });
862
+
863
+ // src/pageObjects/elements/Editors/Date/DateEditor.ts
864
+ var DateEditor;
865
+ var init_DateEditor = __esm({
866
+ "src/pageObjects/elements/Editors/Date/DateEditor.ts"() {
867
+ "use strict";
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);
816
879
  }
817
- async getIndexByName() {
818
- return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
880
+ async init(parentCssSelector, elementCssSelector, driver) {
881
+ await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
819
882
  }
820
- async caption() {
821
- const el = await this.getElement();
822
- 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
+ }
823
896
  }
824
- async getIndex() {
825
- if (this.index != null) {
826
- return this.index;
897
+ async ensureInitialized() {
898
+ if (!this.editorInstance) {
899
+ await this.initPromise;
827
900
  }
828
- if (this._caption != null) {
829
- this.index = await this.getIndexByCaption();
830
- 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);
831
907
  }
832
- if (this._name != null) {
833
- this.index = await this.getIndexByName();
834
- 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();
835
914
  }
836
- throw new Error("Cant get the index in the column");
915
+ throw new Error("Editor instance is not initialized.");
837
916
  }
838
917
  };
839
918
  }
840
919
  });
841
920
 
842
- // src/pageObjects/elements/Editors/ClearStrategy/InputClearStrategy.ts
843
- var InputClearStrategy;
844
- var init_InputClearStrategy = __esm({
845
- "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"() {
925
+ "use strict";
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);
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");
960
+ };
961
+ }
962
+ });
963
+
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"() {
846
1008
  "use strict";
847
- InputClearStrategy = class {
848
- async clear(editor) {
849
- const inputEl = await editor.getInputElement();
850
- await inputEl.clear();
851
- }
852
- };
853
1009
  }
854
1010
  });
855
1011
 
856
- // src/pageObjects/elements/Editors/AbstractEditor.ts
857
- var import_selenium_webdriver13, AbstractDXEditorWithInput;
858
- var init_AbstractEditor = __esm({
859
- "src/pageObjects/elements/Editors/AbstractEditor.ts"() {
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"() {
860
1027
  "use strict";
861
- import_selenium_webdriver13 = require("selenium-webdriver");
862
- init_actions();
863
- init_InputClearStrategy();
864
- init_AbstractElementWithParent();
865
- AbstractDXEditorWithInput = class extends AbstractElementWithParent {
866
- clearStrategy = new InputClearStrategy();
867
- setClearStrategy(strategy) {
868
- this.clearStrategy = strategy;
869
- }
870
- getInputCssSelector() {
871
- return `${this.getFullCssSelector()} .dx-texteditor-input`;
872
- }
873
- async getInputElement() {
874
- return this.driver.findElement(import_selenium_webdriver13.By.css(this.getInputCssSelector()));
875
- }
876
- async getInputValue() {
877
- const inputEl = await this.getInputElement();
878
- return inputEl.getAttribute("value");
879
- }
880
- async setInputValue(value) {
881
- const inputEl = await this.getInputElement();
882
- await click(inputEl, this.driver);
883
- await inputEl.sendKeys(value, import_selenium_webdriver13.Key.ENTER);
884
- }
885
- async clear() {
886
- await this.clearStrategy.clear(this);
887
- }
888
- };
1028
+ init_config();
1029
+ init_wait();
889
1030
  }
890
1031
  });
891
1032
 
892
- // src/pageObjects/elements/Editors/TextEditor.ts
893
- var TextEditor;
894
- var init_TextEditor = __esm({
895
- "src/pageObjects/elements/Editors/TextEditor.ts"() {
1033
+ // src/pageObjects/elements/TableToolbar/AbstractButton.ts
1034
+ var AbstractButton;
1035
+ var init_AbstractButton = __esm({
1036
+ "src/pageObjects/elements/TableToolbar/AbstractButton.ts"() {
896
1037
  "use strict";
897
- init_AbstractEditor();
898
- init_InputClearStrategy();
899
- TextEditor = class extends AbstractDXEditorWithInput {
1038
+ init_AbstractElementWithParent();
1039
+ init_actions();
1040
+ init_waitElementIsClickable();
1041
+ AbstractButton = class extends AbstractElementWithParent {
900
1042
  constructor(parentCssSelector, elementCssSelector, driver) {
901
1043
  super(parentCssSelector, elementCssSelector, driver);
902
- this.setClearStrategy(new InputClearStrategy());
903
1044
  }
904
- getValue() {
905
- return this.getInputValue();
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);
906
1053
  }
907
- setValue(value) {
908
- return this.setInputValue(value);
1054
+ async isDisabled() {
1055
+ const button = await this.getElement();
1056
+ return await button.getCssValue("pointer-events") === "none";
909
1057
  }
910
1058
  };
911
1059
  }
912
1060
  });
913
1061
 
914
- // src/pageObjects/elements/Editors/NumberEditor.ts
915
- var NumberEditor;
916
- var init_NumberEditor = __esm({
917
- "src/pageObjects/elements/Editors/NumberEditor.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"() {
918
1066
  "use strict";
919
- init_AbstractEditor();
920
- init_InputClearStrategy();
921
- NumberEditor = class extends AbstractDXEditorWithInput {
922
- constructor(parentCssSelector, elementCssSelector, driver) {
923
- super(parentCssSelector, elementCssSelector, driver);
924
- this.setClearStrategy(new InputClearStrategy());
925
- }
926
- async getValue() {
927
- const value = await super.getInputValue();
928
- return value == "" ? null : Number.parseFloat(value);
929
- }
930
- setValue(value) {
931
- return this.setInputValue(value);
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();
932
1078
  }
933
1079
  };
934
1080
  }
935
1081
  });
936
1082
 
937
- // src/pageObjects/elements/Editors/types.ts
938
- var ControlClass;
939
- var init_types3 = __esm({
940
- "src/pageObjects/elements/Editors/types.ts"() {
941
- "use strict";
942
- ControlClass = /* @__PURE__ */ ((ControlClass2) => {
943
- ControlClass2["Text"] = "text-control";
944
- ControlClass2["TextArea"] = "text-area-control";
945
- ControlClass2["Number"] = "number-control";
946
- ControlClass2["CheckBox"] = "check-box";
947
- ControlClass2["Multiselect"] = "multi-select-control";
948
- ControlClass2["Select"] = "select-control";
949
- ControlClass2["Switch"] = "switch-control";
950
- ControlClass2["Date"] = "date-control";
951
- ControlClass2["SingleDateRange"] = "single-date-range-control";
952
- ControlClass2["BooleanSelector"] = "buttons-group";
953
- ControlClass2["ButtonGroup"] = "button-group-field";
954
- return ControlClass2;
955
- })(ControlClass || {});
956
- }
957
- });
958
-
959
- // src/pageObjects/elements/Editors/CheckBox.ts
960
- var CheckBox;
961
- var init_CheckBox = __esm({
962
- "src/pageObjects/elements/Editors/CheckBox.ts"() {
1083
+ // src/pageObjects/elements/FormButton.ts
1084
+ var FormButton;
1085
+ var init_FormButton = __esm({
1086
+ "src/pageObjects/elements/FormButton.ts"() {
963
1087
  "use strict";
964
- init_actions();
965
- init_AbstractElementWithParent();
966
- CheckBox = class extends AbstractElementWithParent {
967
- async getValue() {
968
- const result = await this.getAttribute("aria-checked");
969
- if (result === "true")
970
- return 1;
971
- if (result === "false")
972
- return 0;
973
- return null;
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;
974
1096
  }
975
- async setValue(value) {
976
- const inputEl = await this.getElement();
977
- const currentValue = await this.getValue();
978
- if (currentValue !== value) {
979
- await click(inputEl, this.driver);
980
- }
1097
+ buttonNotDisplayedError() {
1098
+ return `Form Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
981
1099
  }
982
1100
  };
983
1101
  }
984
1102
  });
985
1103
 
986
- // src/utils/xpathHelper.ts
987
- var XPathHelper;
988
- var init_xpathHelper = __esm({
989
- "src/utils/xpathHelper.ts"() {
1104
+ // src/pageObjects/elements/Groups/AbstractGroup.ts
1105
+ var AbstractGroup;
1106
+ var init_AbstractGroup = __esm({
1107
+ "src/pageObjects/elements/Groups/AbstractGroup.ts"() {
990
1108
  "use strict";
991
- XPathHelper = class {
992
- static getClassAndValueXpath(cssClass, value) {
993
- return `div[contains(@class, '${cssClass}') and contains(.,'${value}')]`;
1109
+ init_AbstractElementWithParent();
1110
+ AbstractGroup = class extends AbstractElementWithParent {
1111
+ async isDisplayed() {
1112
+ const groupElement = await this.getElement();
1113
+ return await groupElement.isDisplayed();
994
1114
  }
995
1115
  };
996
1116
  }
997
1117
  });
998
1118
 
999
- // src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts
1000
- var import_selenium_webdriver14, DX_TEXTEDITOR_EMPTY, DX_CLEAR_BUTTON_AREA, ClearButtonStrategy;
1001
- var init_ClearButtonStrategy = __esm({
1002
- "src/pageObjects/elements/Editors/ClearStrategy/ClearButtonStrategy.ts"() {
1119
+ // src/pageObjects/elements/Groups/Panel.ts
1120
+ var Panel;
1121
+ var init_Panel = __esm({
1122
+ "src/pageObjects/elements/Groups/Panel.ts"() {
1003
1123
  "use strict";
1004
- import_selenium_webdriver14 = require("selenium-webdriver");
1005
- init_actions();
1006
- DX_TEXTEDITOR_EMPTY = "dx-texteditor-empty";
1007
- DX_CLEAR_BUTTON_AREA = "dx-clear-button-area";
1008
- ClearButtonStrategy = class {
1009
- editorContainerClass;
1010
- _driver;
1011
- constructor(editorContainerClass, driver) {
1012
- this.editorContainerClass = editorContainerClass;
1013
- this._driver = driver;
1014
- }
1015
- async isEmptyEditorField() {
1016
- const editorContainer = await this._driver.findElement(import_selenium_webdriver14.By.css(this.editorContainerClass));
1017
- const classAttribute = await editorContainer.getAttribute("class");
1018
- return classAttribute.includes(DX_TEXTEDITOR_EMPTY);
1019
- }
1020
- async clear() {
1021
- if (await this.isEmptyEditorField()) {
1022
- throw new Error("This field is already empty");
1023
- }
1024
- const clearBtnSelector = `${this.editorContainerClass} .${DX_CLEAR_BUTTON_AREA}`;
1025
- const clearBtn = await this._driver.findElement(import_selenium_webdriver14.By.css(clearBtnSelector));
1026
- await click(clearBtn, this._driver);
1027
- }
1124
+ init_AbstractGroup();
1125
+ Panel = class extends AbstractGroup {
1028
1126
  };
1029
1127
  }
1030
1128
  });
1031
1129
 
1032
- // src/pageObjects/elements/Editors/SelectBoxEditor.ts
1033
- var import_selenium_webdriver15, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, combinedValueXpath, dropDownOptionClick, SelectBoxEditor;
1034
- var init_SelectBoxEditor = __esm({
1035
- "src/pageObjects/elements/Editors/SelectBoxEditor.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"() {
1036
1134
  "use strict";
1037
- init_AbstractEditor();
1038
- import_selenium_webdriver15 = require("selenium-webdriver");
1039
- init_xpathHelper();
1135
+ init_AbstractGroup();
1136
+ import_selenium_webdriver17 = require("selenium-webdriver");
1040
1137
  init_actions();
1041
- init_ClearButtonStrategy();
1042
- SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS = "d5-multi-select-item";
1043
- combinedValueXpath = (value) => `//body/div[@id="root"]/div[contains(@class, "dx-overlay-wrapper")]//${XPathHelper.getClassAndValueXpath(SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS, value)}`;
1044
- dropDownOptionClick = async (optionValue, driver, delay = true) => {
1045
- const { implicit } = await driver.manage().getTimeouts();
1046
- let optElement = null;
1047
- const timeout = delay ? implicit : 200;
1048
- let err = null;
1049
- try {
1050
- await driver.manage().setTimeouts({ implicit: timeout });
1051
- optElement = await driver.findElement(import_selenium_webdriver15.By.xpath(combinedValueXpath(optionValue)));
1052
- await click(optElement, driver);
1053
- } catch (e) {
1054
- err = new Error(`Item not found: "${optionValue}"`);
1055
- } finally {
1056
- await driver.manage().setTimeouts({ implicit });
1057
- }
1058
- if (err)
1059
- throw err;
1060
- };
1061
- SelectBoxEditor = class extends AbstractDXEditorWithInput {
1138
+ TabPanelItem = class extends AbstractGroup {
1062
1139
  constructor(parentCssSelector, elementCssSelector, driver) {
1063
1140
  super(parentCssSelector, elementCssSelector, driver);
1064
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
1065
1141
  }
1066
- async setSelectInputValue(value) {
1067
- const inputEl = await this.getInputElement();
1068
- await click(inputEl, this.driver);
1069
- try {
1070
- await dropDownOptionClick(value, this.driver, false);
1071
- } catch {
1072
- await inputEl.sendKeys(value, import_selenium_webdriver15.Key.ENTER);
1073
- await dropDownOptionClick(value, this.driver);
1074
- }
1142
+ async click() {
1143
+ await click(await this.getElement(), this.driver);
1075
1144
  }
1076
- async getValue() {
1077
- const value = await super.getInputValue();
1078
- return value == "" ? null : value;
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";
1079
1149
  }
1080
- setValue(value) {
1081
- return this.setSelectInputValue(value);
1150
+ async getTitle() {
1151
+ return "";
1152
+ }
1153
+ };
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 "";
1082
1160
  }
1083
1161
  };
1084
1162
  }
1085
1163
  });
1086
1164
 
1087
- // src/pageObjects/elements/Editors/SwitchEditor.ts
1088
- var SwitchEditor;
1089
- var init_SwitchEditor = __esm({
1090
- "src/pageObjects/elements/Editors/SwitchEditor.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"() {
1091
1169
  "use strict";
1170
+ init_AbstractGroup();
1171
+ import_selenium_webdriver18 = require("selenium-webdriver");
1092
1172
  init_actions();
1093
- init_AbstractElementWithParent();
1094
- init_wait();
1095
- SwitchEditor = class extends AbstractElementWithParent {
1096
- async getValue() {
1097
- const result = await this.getAttribute("aria-label");
1098
- if (result === "ON")
1099
- return 1;
1100
- if (result === "OFF")
1101
- return 0;
1102
- return null;
1173
+ ACCORDION_TITLE_CONTAINER = "accordion-title-container";
1174
+ AccordionItem = class extends AbstractGroup {
1175
+ constructor(parentCssSelector, elementCssSelector, driver) {
1176
+ super(parentCssSelector, elementCssSelector, driver);
1103
1177
  }
1104
- async setValue(value) {
1105
- if (value !== 0 && value !== 1) {
1106
- value = value ? 1 : 0;
1178
+ async getDataOpenedAccordItemAttr() {
1179
+ const accordionElement = await this.getElement();
1180
+ return await accordionElement.getAttribute("data-opened");
1181
+ }
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();
1107
1201
  }
1108
- const inputEl = await this.getElement();
1109
- const currentValue = await this.getValue();
1110
- if (currentValue === value) {
1111
- return;
1202
+ }
1203
+ async collapse() {
1204
+ if (await this.isExpanded()) {
1205
+ await this.clickAccordionItemTitle();
1112
1206
  }
1113
- await click(inputEl, this.driver);
1114
- await wait(async () => {
1115
- const updatedValue = await this.getValue();
1116
- return updatedValue !== currentValue;
1117
- }, this.driver);
1118
1207
  }
1119
1208
  };
1120
1209
  }
1121
1210
  });
1122
1211
 
1123
- // src/pageObjects/elements/Editors/TagBox.ts
1124
- var import_selenium_webdriver16, TAGS_SELECTOR, DX_TAG_CONTAINER, DX_TEXTEDITOR_EMPTY2, BTN_OK_SELECTOR, TAG_BOX_LIST_ITEM_SELECTOR, TagBox;
1125
- var init_TagBox = __esm({
1126
- "src/pageObjects/elements/Editors/TagBox.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"() {
1127
1216
  "use strict";
1128
- init_AbstractEditor();
1129
- import_selenium_webdriver16 = require("selenium-webdriver");
1130
- init_actions();
1131
- init_locators();
1132
- init_SelectBoxEditor();
1133
- init_ClearButtonStrategy();
1134
- init_wait();
1135
- TAGS_SELECTOR = ".dx-tag .tag-text";
1136
- DX_TAG_CONTAINER = "dx-tag-container";
1137
- DX_TEXTEDITOR_EMPTY2 = "dx-texteditor-empty";
1138
- BTN_OK_SELECTOR = ".dx-tagbox-popup-wrapper .dx-popup-bottom .dx-button.dx-popup-done";
1139
- TAG_BOX_LIST_ITEM_SELECTOR = '.dx-tagbox-popup-wrapper .dx-list-item[aria-selected="true"]';
1140
- TagBox = class extends AbstractDXEditorWithInput {
1217
+ init_AbstractGroup();
1218
+ init_AccordionItem();
1219
+ Accordion = class extends AbstractGroup {
1141
1220
  constructor(parentCssSelector, elementCssSelector, driver) {
1142
1221
  super(parentCssSelector, elementCssSelector, driver);
1143
- this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
1144
1222
  }
1145
- async setTagBoxInputValue(values) {
1146
- const lastElement = values[values.length - 1];
1147
- const inputEl = await this.getInputElement();
1148
- await inputEl.click();
1149
- for (const value of values) {
1150
- await this.selectOption(inputEl, value, lastElement);
1151
- }
1152
- await this.confirmSelection();
1223
+ item(name) {
1224
+ return new AccordionItem(this.getFullCssSelector(), `.d5-accordion-item[data-groupname="${name}"]`, this.driver);
1153
1225
  }
1154
- async waitOptionSelection() {
1155
- const option = await this.driver.findElement(import_selenium_webdriver16.By.css(TAG_BOX_LIST_ITEM_SELECTOR));
1156
- await wait(() => option.isDisplayed(), this.driver);
1226
+ };
1227
+ }
1228
+ });
1229
+
1230
+ // src/pageObjects/elements/Groups/groupFactory.ts
1231
+ var groupFactory;
1232
+ var init_groupFactory = __esm({
1233
+ "src/pageObjects/elements/Groups/groupFactory.ts"() {
1234
+ "use strict";
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");
1254
+ };
1255
+ }
1256
+ });
1257
+
1258
+ // src/pageObjects/elements/FormGroup.ts
1259
+ var FormGroup;
1260
+ var init_FormGroup = __esm({
1261
+ "src/pageObjects/elements/FormGroup.ts"() {
1262
+ "use strict";
1263
+ init_AbstractElementWithParent();
1264
+ init_locators();
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);
1157
1273
  }
1158
- async selectOption(inputEl, value, lastElement) {
1274
+ async initInstance() {
1275
+ if (!this.groupInstance) {
1276
+ this.groupInstance = await groupFactory(this.parentCssSelector, this.elementCssSelector, this.driver);
1277
+ }
1278
+ }
1279
+ /**
1280
+ * Возвращает булевое значение доступна ли группа
1281
+ * @example
1282
+ * expect(await tableList.group('MainSuperPanel').isDisplayed();
1283
+ */
1284
+ async isDisplayed() {
1159
1285
  try {
1160
- await dropDownOptionClick(value, this.driver, false);
1286
+ await this.initInstance();
1287
+ return this.groupInstance.isDisplayed();
1161
1288
  } catch {
1162
- await inputEl.sendKeys(value);
1163
- await dropDownOptionClick(value, this.driver);
1164
- }
1165
- await this.waitOptionSelection();
1166
- if (value !== lastElement) {
1167
- await inputEl.clear();
1289
+ return false;
1168
1290
  }
1169
1291
  }
1170
- async confirmSelection() {
1171
- const btnOk = await this.driver.findElement(import_selenium_webdriver16.By.css(BTN_OK_SELECTOR));
1172
- 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();
1173
1303
  }
1174
- async getTagBoxInputValue() {
1175
- if (await this.isTagBoxEmpty()) {
1176
- return [];
1177
- }
1178
- const tags = await this.driver.findElements(
1179
- import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${TAGS_SELECTOR}`)
1180
- );
1181
- const values = [];
1182
- for (const tag of tags) {
1183
- 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();
1184
1318
  }
1185
- return values;
1186
1319
  }
1187
- async isTagBoxEmpty() {
1188
- const classAttribute = await this.getClasses();
1189
- 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
+ }
1190
1325
  }
1191
- async getValue() {
1192
- const value = await this.getTagBoxInputValue();
1193
- 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;
1194
1332
  }
1195
- async setValue(values) {
1196
- if (!Array.isArray(values)) {
1197
- 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();
1198
1337
  }
1199
- await this.setTagBoxInputValue(values);
1338
+ return false;
1200
1339
  }
1201
- async remove(itemText) {
1202
- const tagValues = await this.getValue();
1203
- const tagExists = tagValues.includes(itemText);
1204
- if (!tagExists) {
1205
- 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();
1206
1344
  }
1207
- const clearBtnTestId = byTestIdCssSelector(`clear-button-${itemText}`);
1208
- const clearBtn = await this.driver.findElement(
1209
- import_selenium_webdriver16.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER} ${clearBtnTestId}`)
1210
- );
1211
- await click(clearBtn, this.driver);
1345
+ return false;
1212
1346
  }
1213
1347
  };
1214
1348
  }
1215
1349
  });
1216
1350
 
1217
- // src/pageObjects/elements/Editors/ButtonGroup.ts
1218
- var import_selenium_webdriver17, ITEM_CLASS, SELECTED_CLASS, ButtonGroup;
1219
- var init_ButtonGroup = __esm({
1220
- "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"() {
1221
1355
  "use strict";
1222
- init_actions();
1223
- import_selenium_webdriver17 = require("selenium-webdriver");
1224
- init_AbstractElementWithParent();
1225
- ITEM_CLASS = "dx-buttongroup-item";
1226
- SELECTED_CLASS = "dx-state-selected";
1227
- ButtonGroup = class extends AbstractElementWithParent {
1228
- getItems() {
1229
- return this.driver.findElements(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}`));
1230
- }
1231
- getDataValue(el) {
1232
- 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;
1233
1368
  }
1234
- async getValue() {
1235
- const selectedEl = await this.driver.findElement(import_selenium_webdriver17.By.css(`${this.getFullCssSelector()} .${ITEM_CLASS}.${SELECTED_CLASS}`));
1236
- return this.getDataValue(selectedEl);
1369
+ get formName() {
1370
+ return this._formName;
1237
1371
  }
1238
- async setValue(value) {
1239
- const items = await this.getItems();
1240
- let buttonEl = void 0;
1241
- for (const item of items) {
1242
- const text = await this.getDataValue(item);
1243
- if (text == value) {
1244
- buttonEl = item;
1245
- break;
1246
- }
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;
1247
1386
  }
1248
- if (!buttonEl)
1249
- throw new Error(`Cannot find item in button group with text: ${value}`);
1250
- await click(buttonEl, this.driver);
1251
1387
  }
1252
- };
1253
- }
1254
- });
1255
-
1256
- // src/pageObjects/elements/Editors/BooleanSelector.ts
1257
- var BooleanSelector;
1258
- var init_BooleanSelector = __esm({
1259
- "src/pageObjects/elements/Editors/BooleanSelector.ts"() {
1260
- "use strict";
1261
- init_ButtonGroup();
1262
- BooleanSelector = class extends ButtonGroup {
1263
- // @ts-ignore
1264
- async getValue() {
1265
- const value = await super.getValue();
1266
- return value === "null" ? null : value === "1" ? 1 : 0;
1388
+ button(name) {
1389
+ return new FormButton(this.containerCssSelector, this.formName, name, this.driver);
1267
1390
  }
1268
- // @ts-ignore
1269
- async setValue(value) {
1270
- const val = value == null ? "null" : value ? "1" : "0";
1271
- await super.setValue(val);
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);
1272
1400
  }
1273
1401
  };
1274
1402
  }
1275
1403
  });
1276
1404
 
1277
- // src/pageObjects/elements/Editors/Date/utils.ts
1278
- var formatDMYDate;
1405
+ // src/pageObjects/elements/Forms/types.ts
1406
+ var init_types2 = __esm({
1407
+ "src/pageObjects/elements/Forms/types.ts"() {
1408
+ "use strict";
1409
+ }
1410
+ });
1411
+
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;
1279
1420
  var init_utils2 = __esm({
1280
- "src/pageObjects/elements/Editors/Date/utils.ts"() {
1421
+ "src/pageObjects/elements/Table/utils.ts"() {
1281
1422
  "use strict";
1282
- formatDMYDate = (date) => {
1283
- const [year, month, day] = date.toJSON().split("T")[0].split("-");
1284
- return `${day}${month}${year}`;
1285
- };
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;
1286
1429
  }
1287
1430
  });
1288
1431
 
1289
- // src/pageObjects/elements/Editors/Date/BaseDateEditor.ts
1290
- 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;
1291
- var init_BaseDateEditor = __esm({
1292
- "src/pageObjects/elements/Editors/Date/BaseDateEditor.ts"() {
1432
+ // src/pageObjects/elements/Table/types.ts
1433
+ var init_types3 = __esm({
1434
+ "src/pageObjects/elements/Table/types.ts"() {
1293
1435
  "use strict";
1294
- init_AbstractEditor();
1295
- init_InputClearStrategy();
1296
- import_selenium_webdriver18 = require("selenium-webdriver");
1297
- init_locators();
1298
- init_actions();
1436
+ }
1437
+ });
1438
+
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"() {
1443
+ "use strict";
1444
+ import_selenium_webdriver20 = require("selenium-webdriver");
1445
+ init_AbstractElementWithParent();
1299
1446
  init_utils2();
1300
- BTN_CALENDAR_POPOVER_OPEN_SELECTOR = "calendar-popover-open-button";
1301
- BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR = "DateRange__inputs-item--dateFrom";
1302
- BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR = "DateRange__inputs-item--dateTo";
1303
- BTN_SAVE_SELECTOR = "DateRange__button-save";
1304
- BaseDateEditor = class extends AbstractDXEditorWithInput {
1305
- constructor(parentCssSelector, elementCssSelector, driver) {
1306
- super(parentCssSelector, elementCssSelector, driver);
1307
- 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;
1308
1455
  }
1309
- async setDateValue(value) {
1310
- const actions = this.driver.actions({ async: true });
1311
- const dateField = await this.driver.findElement(import_selenium_webdriver18.By.css(`${this.getFullCssSelector()}`));
1312
- const dateFieldDataTestID = await this.getDataTestId();
1313
- const calendarPopoverSelector = byTestIdCssSelector(`${dateFieldDataTestID}-calendar-popover`);
1314
- const dateInputEl = await this.getInputElement();
1315
- await dateInputEl.clear();
1316
- if (Array.isArray(value)) {
1317
- const formattedDates = value.map(formatDMYDate);
1318
- const button = await dateField.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_OPEN_SELECTOR}`));
1319
- await button.click();
1320
- const calendarPopoverElement = await this.driver.findElement(import_selenium_webdriver18.By.css(calendarPopoverSelector));
1321
- const dateFromInput = await calendarPopoverElement.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_DATE_FROM_INPUT_SELECTOR} .dx-texteditor-input`));
1322
- const dateToInput = await calendarPopoverElement.findElement(import_selenium_webdriver18.By.css(`.${BTN_CALENDAR_POPOVER_DATE_TO_INPUT_SELECTOR} .dx-texteditor-input`));
1323
- await dateFromInput.click();
1324
- await dateFromInput.sendKeys(formattedDates[0]);
1325
- await dateToInput.click();
1326
- await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
1327
- await dateToInput.sendKeys(formattedDates[1]);
1328
- await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.ENTER).perform();
1329
- const btnOk = await this.driver.findElement(import_selenium_webdriver18.By.css(`.${BTN_SAVE_SELECTOR}`));
1330
- await btnOk.click();
1331
- } else {
1332
- const formattedDate = formatDMYDate(value);
1333
- await click(dateInputEl, this.driver);
1334
- await actions.move({ origin: dateInputEl }).sendKeys(import_selenium_webdriver18.Key.HOME).perform();
1335
- await actions.move({ origin: dateInputEl }).sendKeys(formattedDate, import_selenium_webdriver18.Key.ENTER).perform();
1456
+ set index(index) {
1457
+ this._index = index;
1458
+ this.elementCssSelector = getCssCellByIndexSelector(index);
1459
+ }
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;
1463
+ }
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;
1472
+ }
1473
+ async getElement() {
1474
+ if (this._index == null) {
1475
+ this.index = await this.getCellIndex();
1336
1476
  }
1477
+ return super.getElement();
1478
+ }
1479
+ async getValue() {
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();
1487
+ }
1488
+ getIndex() {
1489
+ return this._index;
1337
1490
  }
1338
1491
  };
1339
1492
  }
1340
1493
  });
1341
1494
 
1342
- // src/pageObjects/elements/Editors/Date/SingleDateEditor.ts
1343
- var import_selenium_webdriver19, SingleDateEditor;
1344
- var init_SingleDateEditor = __esm({
1345
- "src/pageObjects/elements/Editors/Date/SingleDateEditor.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"() {
1346
1499
  "use strict";
1347
- import_selenium_webdriver19 = require("selenium-webdriver");
1348
- init_InputClearStrategy();
1349
- init_BaseDateEditor();
1350
- SingleDateEditor = class extends BaseDateEditor {
1351
- constructor(parentCssSelector, elementCssSelector, driver) {
1352
- super(parentCssSelector, elementCssSelector, driver);
1353
- 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
+ DX_SELECTION_CLASS = "dx-selection";
1507
+ DX_ROW_EDIT_CLASS = "dx-edit-row";
1508
+ DX_DATA_ROW_CLASS = "dx-data-row";
1509
+ Row = class extends AbstractElementWithParent {
1510
+ index;
1511
+ getColumnBy;
1512
+ constructor(parentCssSelector, index, driver, getColumnBy) {
1513
+ super(parentCssSelector, getCssRowByIndexSelector(index), driver);
1514
+ this.index = index;
1515
+ this.getColumnBy = getColumnBy;
1354
1516
  }
1355
- async getDateElement() {
1356
- return this.driver.findElement(import_selenium_webdriver19.By.css(this.getFullCssSelector() + " .dx-dropdowneditor-input-wrapper input[type=hidden]"));
1517
+ _getCell({ index, name, title }) {
1518
+ return new Cell(
1519
+ this.getFullCssSelector(),
1520
+ () => {
1521
+ return this.getColumnBy({ title, name }).getIndex();
1522
+ },
1523
+ index,
1524
+ this.driver
1525
+ );
1357
1526
  }
1358
- async getDateValue() {
1359
- const inputEl = await this.getDateElement();
1360
- return inputEl.getAttribute("value");
1527
+ getCellByIndex(index) {
1528
+ return this._getCell({ index });
1361
1529
  }
1362
- async getValue() {
1363
- const value = await this.getDateValue();
1364
- return value == "" ? null : new Date(value);
1530
+ getCell(name) {
1531
+ return this._getCell({ name });
1365
1532
  }
1366
- setValue(value) {
1367
- if (typeof value === "object") {
1368
- return this.setDateValue(value);
1369
- }
1370
- throw new Error(`Value is incorrect. It should be Object`);
1533
+ getCellByTitle(title) {
1534
+ return this._getCell({ title });
1535
+ }
1536
+ async select() {
1537
+ const rowEl = await this.getElement();
1538
+ await click(rowEl, this.driver);
1539
+ await wait(
1540
+ async () => {
1541
+ const classes = await this.getClasses();
1542
+ return classes.includes(DX_SELECTION_CLASS);
1543
+ },
1544
+ this.driver,
1545
+ "Cannot select row"
1546
+ );
1547
+ }
1548
+ async isSelected() {
1549
+ const result = await this.getAttribute("aria-selected");
1550
+ return result === "true";
1551
+ }
1552
+ getIndex() {
1553
+ return this.index;
1554
+ }
1555
+ async getCells() {
1556
+ const cells = await this.driver.findElements(import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1557
+ const result = [];
1558
+ cells.forEach((_, index) => {
1559
+ const newCell = this.getCellByIndex(index);
1560
+ result.push(newCell);
1561
+ });
1562
+ return result;
1563
+ }
1564
+ async clickInlineButton(buttonClass) {
1565
+ const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
1566
+ const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
1567
+ this.index
1568
+ )}"] .${buttonClass}`;
1569
+ const button = await this.driver.findElement(
1570
+ import_selenium_webdriver21.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`)
1571
+ );
1572
+ return click(button, this.driver);
1573
+ }
1574
+ async checkEditingMode(isEditing, msg) {
1575
+ await wait(
1576
+ async () => {
1577
+ return (await this.getClasses()).includes(DX_ROW_EDIT_CLASS) === isEditing;
1578
+ },
1579
+ this.driver,
1580
+ msg
1581
+ );
1582
+ }
1583
+ async edit() {
1584
+ await this.clickInlineButton("edit");
1585
+ await this.checkEditingMode(true, "Row did not switch to edit mode");
1586
+ }
1587
+ async save() {
1588
+ await this.clickInlineButton("save");
1589
+ await this.checkEditingMode(false, "Row did not saved");
1590
+ }
1591
+ async cancel() {
1592
+ await this.clickInlineButton("cancel");
1593
+ await this.checkEditingMode(false, "Row did not switch to normal mode");
1371
1594
  }
1372
1595
  };
1373
1596
  }
1374
1597
  });
1375
1598
 
1376
- // src/pageObjects/elements/Editors/Date/DateRangeEditor.ts
1377
- var import_selenium_webdriver20, DateRangeEditor;
1378
- var init_DateRangeEditor = __esm({
1379
- "src/pageObjects/elements/Editors/Date/DateRangeEditor.ts"() {
1599
+ // src/pageObjects/elements/Table/elements/Column.ts
1600
+ var import_selenium_webdriver22, Column;
1601
+ var init_Column = __esm({
1602
+ "src/pageObjects/elements/Table/elements/Column.ts"() {
1380
1603
  "use strict";
1381
- import_selenium_webdriver20 = require("selenium-webdriver");
1382
- init_InputClearStrategy();
1383
- init_BaseDateEditor();
1384
- DateRangeEditor = class extends BaseDateEditor {
1385
- constructor(parentCssSelector, elementCssSelector, driver) {
1386
- super(parentCssSelector, elementCssSelector, driver);
1387
- this.setClearStrategy(new InputClearStrategy());
1604
+ import_selenium_webdriver22 = require("selenium-webdriver");
1605
+ init_utils2();
1606
+ init_AbstractElementWithParent();
1607
+ init_fixElementStaleError();
1608
+ Column = class extends AbstractElementWithParent {
1609
+ _index;
1610
+ _caption;
1611
+ _name;
1612
+ headerCssSelector;
1613
+ constructor({ parentCssSelector, headerCssSelector, name, caption, index, driver }) {
1614
+ super(parentCssSelector, "", driver);
1615
+ this._name = name;
1616
+ this.index = index;
1617
+ this._caption = caption;
1618
+ this.headerCssSelector = headerCssSelector;
1388
1619
  }
1389
- async getDateElement() {
1390
- return this.driver.findElement(import_selenium_webdriver20.By.css(this.getFullCssSelector() + " .dx-texteditor-input"));
1620
+ set index(index) {
1621
+ this._index = index;
1622
+ this.elementCssSelector = getColumnByIndexCssSelector(index);
1391
1623
  }
1392
- async getDateValue() {
1393
- const inputEl = await this.getDateElement();
1394
- const dateFromStr = await inputEl.getAttribute("datefrom");
1395
- const dateToStr = await inputEl.getAttribute("dateto");
1396
- const dateFrom = new Date(dateFromStr);
1397
- const dateTo = new Date(dateToStr);
1398
- return [dateFrom, dateTo];
1624
+ get index() {
1625
+ return this._index;
1399
1626
  }
1400
- async getValue() {
1401
- const values = await this.getDateValue();
1402
- return !values.length ? null : values;
1627
+ async getElement() {
1628
+ await this.getIndex();
1629
+ return super.getElement();
1403
1630
  }
1404
- setValue(value) {
1405
- if (typeof value === "object") {
1406
- return this.setDateValue(value);
1407
- }
1408
- throw new Error(`Value is incorrect. It should be Object`);
1631
+ async getColumnHeaderIndexBy(cssSelector) {
1632
+ const column = await fixElementStaleError(import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
1633
+ return transformOutputIndex(await column.getAttribute("aria-colindex"));
1409
1634
  }
1410
- };
1411
- }
1412
- });
1413
-
1414
- // src/pageObjects/elements/Editors/Date/DateEditor.ts
1415
- var DateEditor;
1416
- var init_DateEditor = __esm({
1417
- "src/pageObjects/elements/Editors/Date/DateEditor.ts"() {
1418
- "use strict";
1419
- init_SingleDateEditor();
1420
- init_DateRangeEditor();
1421
- init_AbstractFormElement();
1422
- init_AbstractEditor();
1423
- init_types3();
1424
- DateEditor = class extends AbstractDXEditorWithInput {
1425
- editorInstance = null;
1426
- initPromise;
1427
- constructor(parentCssSelector, elementCssSelector, driver) {
1428
- super(parentCssSelector, elementCssSelector, driver);
1429
- this.initPromise = this.init(parentCssSelector, elementCssSelector, driver);
1635
+ async getIndexByCaption() {
1636
+ return this.getColumnHeaderIndexBy(getColumnByCaptionCssSelector(this._caption));
1430
1637
  }
1431
- async init(parentCssSelector, elementCssSelector, driver) {
1432
- await this.updateEditorInstance(parentCssSelector, elementCssSelector, driver);
1638
+ async getIndexByName() {
1639
+ return this.getColumnHeaderIndexBy(getColumnByNameCssSelector(this._name));
1433
1640
  }
1434
- async updateEditorInstance(parentCssSelector, elementCssSelector, driver) {
1435
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1436
- const classString = await elementInstance.getClasses();
1437
- switch (true) {
1438
- case classString.includes("date-control" /* Date */):
1439
- this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
1440
- break;
1441
- case classString.includes("single-date-range-control" /* SingleDateRange */):
1442
- this.editorInstance = new DateRangeEditor(parentCssSelector, elementCssSelector, driver);
1443
- break;
1444
- default:
1445
- this.editorInstance = new SingleDateEditor(parentCssSelector, elementCssSelector, driver);
1446
- }
1641
+ async caption() {
1642
+ const el = await this.getElement();
1643
+ return el.getText();
1447
1644
  }
1448
- async ensureInitialized() {
1449
- if (!this.editorInstance) {
1450
- await this.initPromise;
1645
+ async getIndex() {
1646
+ if (this.index != null) {
1647
+ return this.index;
1451
1648
  }
1452
- }
1453
- async setValue(value) {
1454
- await this.ensureInitialized();
1455
- if (this.editorInstance) {
1456
- await this.editorInstance.setValue(value);
1457
- return await this.updateEditorInstance(this.parentCssSelector, this.elementCssSelector, this.driver);
1649
+ if (this._caption != null) {
1650
+ this.index = await this.getIndexByCaption();
1651
+ return this.index;
1458
1652
  }
1459
- throw new Error("Editor instance is not initialized.");
1460
- }
1461
- async getValue() {
1462
- await this.ensureInitialized();
1463
- if (this.editorInstance) {
1464
- return this.editorInstance.getValue();
1653
+ if (this._name != null) {
1654
+ this.index = await this.getIndexByName();
1655
+ return this.index;
1465
1656
  }
1466
- throw new Error("Editor instance is not initialized.");
1467
- }
1468
- };
1469
- }
1470
- });
1471
-
1472
- // src/pageObjects/elements/Editors/editorFactory.ts
1473
- var editorFactory;
1474
- var init_editorFactory = __esm({
1475
- "src/pageObjects/elements/Editors/editorFactory.ts"() {
1476
- "use strict";
1477
- init_types3();
1478
- init_AbstractFormElement();
1479
- init_TextEditor();
1480
- init_NumberEditor();
1481
- init_CheckBox();
1482
- init_SelectBoxEditor();
1483
- init_SwitchEditor();
1484
- init_TagBox();
1485
- init_BooleanSelector();
1486
- init_ButtonGroup();
1487
- init_DateEditor();
1488
- editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
1489
- const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
1490
- const classSting = await elementInstance.getClasses();
1491
- if ((classSting.includes("text-control" /* Text */) || classSting.includes("text-area-control" /* TextArea */)) && !classSting.includes("single-date-range-control" /* SingleDateRange */))
1492
- return new TextEditor(parentCssSelector, elementCssSelector, driver);
1493
- if (classSting.includes("number-control" /* Number */))
1494
- return new NumberEditor(parentCssSelector, elementCssSelector, driver);
1495
- if (classSting.includes("check-box" /* CheckBox */))
1496
- return new CheckBox(parentCssSelector, elementCssSelector, driver);
1497
- if (classSting.includes("multi-select-control" /* Multiselect */))
1498
- return new TagBox(parentCssSelector, elementCssSelector, driver);
1499
- if (classSting.includes("select-control" /* Select */))
1500
- return new SelectBoxEditor(parentCssSelector, elementCssSelector, driver);
1501
- if (classSting.includes("switch-control" /* Switch */))
1502
- return new SwitchEditor(parentCssSelector, elementCssSelector, driver);
1503
- if (classSting.includes("date-control" /* Date */) || classSting.includes("single-date-range-control" /* SingleDateRange */)) {
1504
- return new DateEditor(parentCssSelector, elementCssSelector, driver);
1657
+ throw new Error("Cant get the index in the column");
1505
1658
  }
1506
- if (classSting.includes("buttons-group" /* BooleanSelector */))
1507
- return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
1508
- if (classSting.includes("button-group-field" /* ButtonGroup */))
1509
- return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
1510
- throw new Error("Unknown type of editor. Please write ticket to the support");
1511
1659
  };
1512
1660
  }
1513
1661
  });
1514
1662
 
1515
- // src/pageObjects/elements/Editors/index.ts
1516
- var init_Editors = __esm({
1517
- "src/pageObjects/elements/Editors/index.ts"() {
1518
- "use strict";
1519
- init_TextEditor();
1520
- init_NumberEditor();
1521
- init_editorFactory();
1522
- init_types3();
1523
- }
1524
- });
1525
-
1526
1663
  // src/pageObjects/elements/AbstractEditor.ts
1527
1664
  var AbstractEditor;
1528
1665
  var init_AbstractEditor2 = __esm({
@@ -1615,11 +1752,11 @@ var init_FormField = __esm({
1615
1752
  });
1616
1753
 
1617
1754
  // src/pageObjects/elements/Table/Table.ts
1618
- var import_selenium_webdriver21, Table;
1755
+ var import_selenium_webdriver23, Table;
1619
1756
  var init_Table = __esm({
1620
1757
  "src/pageObjects/elements/Table/Table.ts"() {
1621
1758
  "use strict";
1622
- import_selenium_webdriver21 = require("selenium-webdriver");
1759
+ import_selenium_webdriver23 = require("selenium-webdriver");
1623
1760
  init_createDataTestId();
1624
1761
  init_AbstractElementWithParent();
1625
1762
  init_Row();
@@ -1669,7 +1806,7 @@ var init_Table = __esm({
1669
1806
  return this.getRowByIndex(index).select();
1670
1807
  }
1671
1808
  async getRows() {
1672
- const rows = await this.driver.findElements(import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1809
+ const rows = await this.driver.findElements(import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1673
1810
  const result = [];
1674
1811
  rows.forEach((_, index) => {
1675
1812
  const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
@@ -1679,7 +1816,7 @@ var init_Table = __esm({
1679
1816
  }
1680
1817
  async getColumns() {
1681
1818
  const columns = await this.driver.findElements(
1682
- import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1819
+ import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1683
1820
  );
1684
1821
  const result = [];
1685
1822
  columns.forEach((_, index) => {
@@ -1774,11 +1911,11 @@ var init_typesUtil = __esm({
1774
1911
  });
1775
1912
 
1776
1913
  // src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
1777
- var import_selenium_webdriver22, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
1914
+ var import_selenium_webdriver24, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
1778
1915
  var init_ToolbarMenu = __esm({
1779
1916
  "src/pageObjects/elements/TableToolbar/ToolbarMenu.ts"() {
1780
1917
  "use strict";
1781
- import_selenium_webdriver22 = require("selenium-webdriver");
1918
+ import_selenium_webdriver24 = require("selenium-webdriver");
1782
1919
  init_typesUtil();
1783
1920
  init_AbstractElementWithParent();
1784
1921
  init_locators();
@@ -1829,7 +1966,7 @@ var init_ToolbarMenu = __esm({
1829
1966
  throw new Error(`"title" must be a string or array of string`);
1830
1967
  let lTitle = isString(title) ? [title] : title;
1831
1968
  for (let t of lTitle) {
1832
- await this.goToButton(t, import_selenium_webdriver22.By.xpath(buttonByTextXpath(t)));
1969
+ await this.goToButton(t, import_selenium_webdriver24.By.xpath(buttonByTextXpath(t)));
1833
1970
  }
1834
1971
  }
1835
1972
  };
@@ -2004,11 +2141,11 @@ var init_PanelFilterField = __esm({
2004
2141
  });
2005
2142
 
2006
2143
  // src/pageObjects/elements/Filters/FilterPanel.ts
2007
- var import_selenium_webdriver23, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2144
+ var import_selenium_webdriver25, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2008
2145
  var init_FilterPanel = __esm({
2009
2146
  "src/pageObjects/elements/Filters/FilterPanel.ts"() {
2010
2147
  "use strict";
2011
- import_selenium_webdriver23 = require("selenium-webdriver");
2148
+ import_selenium_webdriver25 = require("selenium-webdriver");
2012
2149
  init_AbstractElement();
2013
2150
  init_PanelFilterField();
2014
2151
  init_actions();
@@ -2023,7 +2160,7 @@ var init_FilterPanel = __esm({
2023
2160
  async filterPanelButtons() {
2024
2161
  const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
2025
2162
  const el = await this.getElement();
2026
- return el.findElements(import_selenium_webdriver23.By.css(selector));
2163
+ return el.findElements(import_selenium_webdriver25.By.css(selector));
2027
2164
  }
2028
2165
  constructor(formName, driver) {
2029
2166
  super(driver, drawerSelector(formName));
@@ -2056,9 +2193,142 @@ var init_FilterPanel = __esm({
2056
2193
  await this.driver.sleep(300);
2057
2194
  }
2058
2195
  async close() {
2059
- const btn = await this.driver.findElement(import_selenium_webdriver23.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2196
+ const btn = await this.driver.findElement(import_selenium_webdriver25.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2197
+ await click(btn, this.driver);
2198
+ }
2199
+ };
2200
+ }
2201
+ });
2202
+
2203
+ // src/pageObjects/elements/Filters/HeaderFilterField.ts
2204
+ var HeaderFilterField;
2205
+ var init_HeaderFilterField = __esm({
2206
+ "src/pageObjects/elements/Filters/HeaderFilterField.ts"() {
2207
+ "use strict";
2208
+ init_locators();
2209
+ init_createDataTestId();
2210
+ init_AbstractEditor2();
2211
+ HeaderFilterField = class extends AbstractEditor {
2212
+ constructor(parentCssSelector, formName, name, driver) {
2213
+ super(parentCssSelector, byTestIdCssSelector(createHeaderFilterTestId(formName, name)), driver);
2214
+ }
2215
+ async getValue() {
2216
+ return super.getValue();
2217
+ }
2218
+ async setValue(value) {
2219
+ return super.setValue(value);
2220
+ }
2221
+ async clear() {
2222
+ return super.clear();
2223
+ }
2224
+ async remove(itemText) {
2225
+ return super.remove(itemText);
2226
+ }
2227
+ };
2228
+ }
2229
+ });
2230
+
2231
+ // src/pageObjects/elements/Filters/ColumnFilter.ts
2232
+ var import_selenium_webdriver26, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
2233
+ var init_ColumnFilter = __esm({
2234
+ "src/pageObjects/elements/Filters/ColumnFilter.ts"() {
2235
+ "use strict";
2236
+ init_actions();
2237
+ import_selenium_webdriver26 = require("selenium-webdriver");
2238
+ init_HeaderFilterField();
2239
+ init_waitElementIsVisible();
2240
+ init_AbstractElement();
2241
+ APPLY_SELECTOR = ".apply-button";
2242
+ CANCEL_SELECTOR = ".cancel-button";
2243
+ HEADER_FILTER_ICON = ".dx-column-indicators .dx-header-filter";
2244
+ HEADER_FILTER_CONTAINER = ".header-filter";
2245
+ HEADER_FILTER_BUTTONS = ".header-filter-buttons";
2246
+ ColumnFilter = class extends AbstractElement {
2247
+ _formName;
2248
+ _name;
2249
+ _column;
2250
+ constructor(formName, name, column, driver) {
2251
+ super(driver, HEADER_FILTER_CONTAINER);
2252
+ this._formName = formName;
2253
+ this._name = name;
2254
+ this._column = column;
2255
+ this.driver = driver;
2256
+ }
2257
+ async getApplyButton() {
2258
+ const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
2259
+ return this.driver.findElement(import_selenium_webdriver26.By.css(selector));
2260
+ }
2261
+ async getCancelButton() {
2262
+ const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
2263
+ return this.driver.findElement(import_selenium_webdriver26.By.css(selector));
2264
+ }
2265
+ async apply() {
2266
+ const btn = await this.getApplyButton();
2267
+ await click(btn, this.driver);
2268
+ }
2269
+ async cancel() {
2270
+ const btn = await this.getCancelButton();
2060
2271
  await click(btn, this.driver);
2061
2272
  }
2273
+ async initFilter() {
2274
+ const columnEl = await this._column.getElement();
2275
+ const actions = this.driver.actions({ async: true });
2276
+ await actions.move({ origin: columnEl }).perform();
2277
+ const elements = await columnEl.findElements(import_selenium_webdriver26.By.css(HEADER_FILTER_ICON));
2278
+ const headerFilterIcon = elements[1];
2279
+ await waitElementIsVisible({
2280
+ element: headerFilterIcon,
2281
+ driver: this.driver,
2282
+ errorMessage: `HeaderFilter "${this._name}" is not visible`
2283
+ });
2284
+ if (!headerFilterIcon)
2285
+ throw new Error(`HeaderFilter "${this._name}" is not visible`);
2286
+ await headerFilterIcon.click();
2287
+ return new HeaderFilterField("", this._formName, this._name, this.driver);
2288
+ }
2289
+ /**
2290
+ * Возвращает значение в поле
2291
+ * @example
2292
+ * expect(await form.columnFilter('NumberFld').getValue()).toBe(10);
2293
+ * expect(await form.columnFilter('TextFld').getValue()).toBe('TestValue');
2294
+ */
2295
+ async getValue() {
2296
+ const filter = await this.initFilter();
2297
+ const result = await filter.getValue();
2298
+ await this.cancel();
2299
+ return result;
2300
+ }
2301
+ /**
2302
+ * Устанавливает значение в поле
2303
+ * @example
2304
+ * await form.columnFilter('NumberFld').setValue(123);
2305
+ * await form.columnFilter('TextFld').setValue('TestValue');
2306
+ */
2307
+ async setValue(value) {
2308
+ const filter = await this.initFilter();
2309
+ await filter.setValue(value);
2310
+ return this.apply();
2311
+ }
2312
+ /**
2313
+ * Очищает значение в поле
2314
+ * @example
2315
+ * await form.columnFilter('NumberFld').clear();
2316
+ */
2317
+ async clear() {
2318
+ const filter = await this.initFilter();
2319
+ await filter.clear();
2320
+ return this.apply();
2321
+ }
2322
+ /**
2323
+ * Удаляет тег по переданному тексту
2324
+ * @example
2325
+ * await form.columnFilter('TagBox').remove('test');
2326
+ */
2327
+ async remove(itemText) {
2328
+ const filter = await this.initFilter();
2329
+ await filter.remove(itemText);
2330
+ return this.apply();
2331
+ }
2062
2332
  };
2063
2333
  }
2064
2334
  });
@@ -2077,6 +2347,7 @@ var init_ListForm = __esm({
2077
2347
  init_FormToolbar();
2078
2348
  init_FormFilterField();
2079
2349
  init_FilterPanel();
2350
+ init_ColumnFilter();
2080
2351
  DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
2081
2352
  ListForm = class extends Form {
2082
2353
  headerCssSelector;
@@ -2116,6 +2387,10 @@ var init_ListForm = __esm({
2116
2387
  formFilter(name) {
2117
2388
  return new FormFilterField(this.containerCssSelector, this.formName, name, this.driver);
2118
2389
  }
2390
+ columnFilter(name) {
2391
+ const column = this.table().getColumnByName(name);
2392
+ return new ColumnFilter(this.formName, name, column, this.driver);
2393
+ }
2119
2394
  /**
2120
2395
  * Модель панели фильтрации
2121
2396
  * @returns {FilterPanel}
@@ -2180,18 +2455,18 @@ var init_createSubFormInstance = __esm({
2180
2455
  "src/pageObjects/elements/Forms/createSubFormInstance.ts"() {
2181
2456
  "use strict";
2182
2457
  init_locators();
2183
- init_types();
2458
+ init_types2();
2184
2459
  subFormTestId = (name) => `subform-${name}`;
2185
2460
  }
2186
2461
  });
2187
2462
 
2188
2463
  // src/pageObjects/elements/Forms/Form.ts
2189
- var import_selenium_webdriver24, formTestId, Form;
2464
+ var import_selenium_webdriver27, formTestId, Form;
2190
2465
  var init_Form = __esm({
2191
2466
  "src/pageObjects/elements/Forms/Form.ts"() {
2192
2467
  "use strict";
2193
2468
  init_locators();
2194
- import_selenium_webdriver24 = require("selenium-webdriver");
2469
+ import_selenium_webdriver27 = require("selenium-webdriver");
2195
2470
  init_AbstractForm();
2196
2471
  init_waitElementIsVisible();
2197
2472
  init_createSubFormInstance();
@@ -2216,10 +2491,10 @@ var init_Form = __esm({
2216
2491
  */
2217
2492
  async getTitleText() {
2218
2493
  if (await this.isModal()) {
2219
- const titleEl2 = await this.driver.findElement(import_selenium_webdriver24.By.css(`${this.popupContainerCssSelector} .popup-title`));
2494
+ const titleEl2 = await this.driver.findElement(import_selenium_webdriver27.By.css(`${this.popupContainerCssSelector} .popup-title`));
2220
2495
  return titleEl2.getText();
2221
2496
  }
2222
- let titleEl = await this.driver.findElement(import_selenium_webdriver24.By.className("main-toolbar-form-title"));
2497
+ let titleEl = await this.driver.findElement(import_selenium_webdriver27.By.className("main-toolbar-form-title"));
2223
2498
  return titleEl.getText();
2224
2499
  }
2225
2500
  setSubFormMode() {
@@ -2237,7 +2512,7 @@ var init_Form = __esm({
2237
2512
  */
2238
2513
  async subForm(name) {
2239
2514
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
2240
- const byCssSelector = import_selenium_webdriver24.By.css(cssSelector);
2515
+ const byCssSelector = import_selenium_webdriver27.By.css(cssSelector);
2241
2516
  const subFormEl = await this.driver.findElement(byCssSelector);
2242
2517
  await waitElementIsVisible({
2243
2518
  element: subFormEl,
@@ -2267,18 +2542,18 @@ var FormEdit_exports = {};
2267
2542
  __export(FormEdit_exports, {
2268
2543
  default: () => FormEdit
2269
2544
  });
2270
- var import_selenium_webdriver25, FormEdit;
2545
+ var import_selenium_webdriver28, FormEdit;
2271
2546
  var init_FormEdit = __esm({
2272
2547
  "src/pageObjects/elements/Forms/FormEdit.ts"() {
2273
2548
  "use strict";
2274
2549
  init_Form();
2275
- import_selenium_webdriver25 = require("selenium-webdriver");
2550
+ import_selenium_webdriver28 = require("selenium-webdriver");
2276
2551
  init_FormField();
2277
2552
  init_actions();
2278
2553
  init_wait();
2279
2554
  FormEdit = class extends Form {
2280
- saveButtonBy = import_selenium_webdriver25.By.id("button-save");
2281
- closeButtonBy = import_selenium_webdriver25.By.id("button-cancel");
2555
+ saveButtonBy = import_selenium_webdriver28.By.id("button-save");
2556
+ closeButtonBy = import_selenium_webdriver28.By.id("button-cancel");
2282
2557
  constructor(driver) {
2283
2558
  super(driver);
2284
2559
  this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
@@ -2346,6 +2621,7 @@ __export(src_exports, {
2346
2621
  LoginPage: () => LoginPage,
2347
2622
  NumberEditor: () => NumberEditor,
2348
2623
  PanelFilterField: () => PanelFilterField,
2624
+ ReportForm: () => ReportForm,
2349
2625
  SubsystemsPanel: () => SubsystemsPanel,
2350
2626
  TextEditor: () => TextEditor,
2351
2627
  TreeView: () => TreeView,
@@ -2460,8 +2736,45 @@ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
2460
2736
  };
2461
2737
 
2462
2738
  // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
2739
+ var import_selenium_webdriver15 = require("selenium-webdriver");
2463
2740
  init_wait();
2464
2741
  init_locators();
2742
+ init_Editors();
2743
+
2744
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemItem.ts
2745
+ init_actions();
2746
+ init_fixElementStaleError();
2747
+ var SubsystemItem = class {
2748
+ bySelector;
2749
+ driver;
2750
+ constructor({ driver, bySelector }) {
2751
+ this.bySelector = bySelector;
2752
+ this.driver = driver;
2753
+ }
2754
+ async getElement() {
2755
+ return fixElementStaleError(this.bySelector, this.driver);
2756
+ }
2757
+ async getTitle() {
2758
+ const el = await this.getElement();
2759
+ return await el.getAttribute("data-title");
2760
+ }
2761
+ async click() {
2762
+ const el = await this.getElement();
2763
+ await click(el, this.driver);
2764
+ }
2765
+ };
2766
+
2767
+ // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
2768
+ init_createDataTestId();
2769
+ init_actions();
2770
+ init_ClearButtonStrategy();
2771
+ init_waitElementIsVisible();
2772
+ var SEARCH_ITEM_SELECTOR = "search-item";
2773
+ var BACK_BUTTON_SELECTOR = "subsystem-back-item";
2774
+ var SEARCH_INPUT_SELECTOR = "search-subsystem-input";
2775
+ var byTitleCssSelector = (title) => {
2776
+ return `span[data-title="${title}"]`;
2777
+ };
2465
2778
  var SubsystemsPanel = class extends AbstractElement {
2466
2779
  header;
2467
2780
  constructor(driver) {
@@ -2473,12 +2786,110 @@ var SubsystemsPanel = class extends AbstractElement {
2473
2786
  await wait(async () => await title.getText() != "", this.driver);
2474
2787
  return title.getText();
2475
2788
  }
2789
+ getSearchComponent() {
2790
+ return new TextEditor("#aside", byTestIdCssSelector(SEARCH_INPUT_SELECTOR));
2791
+ }
2792
+ /**
2793
+ * Находит сабсистему по заголовку
2794
+ * @example
2795
+ * const subsystemsPanel= new SubsystemsPanel();
2796
+ * //...
2797
+ * await subsystemsPanel.search('SubSystemTitle');
2798
+ */
2799
+ async search(title) {
2800
+ const searchComponent = this.getSearchComponent();
2801
+ await searchComponent.setValue(title);
2802
+ await wait(
2803
+ async () => {
2804
+ const findElement = await this.itemByTitle(title).getElement();
2805
+ const classes = await findElement.getAttribute("class");
2806
+ return classes.includes(SEARCH_ITEM_SELECTOR);
2807
+ },
2808
+ this.driver,
2809
+ `Cannot find element: ${title}`
2810
+ );
2811
+ }
2812
+ /**
2813
+ * Очищает поиск сабсистем
2814
+ * @example
2815
+ * const subsystemsPanel= new SubsystemsPanel();
2816
+ * //...
2817
+ * await subsystemsPanel.searchClear();
2818
+ */
2819
+ async searchClear() {
2820
+ const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
2821
+ const clearBtn = await this.driver.findElement(import_selenium_webdriver15.By.css(clearBtnSelector));
2822
+ if (await clearBtn.isDisplayed()) {
2823
+ await click(clearBtn, this.driver);
2824
+ }
2825
+ }
2826
+ /**
2827
+ * Возвращает сабсистему по имени
2828
+ * @example
2829
+ * const subsystemsPanel= new SubsystemsPanel();
2830
+ * //...
2831
+ * const subsystem = subsystemsPanel.item('SubSystemName');
2832
+ */
2833
+ item(name) {
2834
+ const elementCSS = createSubSystemTestId(name);
2835
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
2836
+ }
2837
+ /**
2838
+ * Возвращает сабсистему по заголовку
2839
+ * @example
2840
+ * const subsystemsPanel= new SubsystemsPanel();
2841
+ * //...
2842
+ * const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
2843
+ */
2844
+ itemByTitle(title) {
2845
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(byTitleCssSelector(title)) });
2846
+ }
2847
+ /**
2848
+ * Возвращается на уровень выше по сабсистемам
2849
+ * @example
2850
+ * const subsystemsPanel= new SubsystemsPanel();
2851
+ * //...
2852
+ * wait subsystemsPanel.back();
2853
+ */
2854
+ async back() {
2855
+ const backButton = this.driver.findElement(import_selenium_webdriver15.By.css(`#aside .${BACK_BUTTON_SELECTOR}`));
2856
+ await waitElementIsVisible(
2857
+ {
2858
+ element: backButton,
2859
+ driver: this.driver
2860
+ }
2861
+ );
2862
+ await click(backButton, this.driver);
2863
+ }
2476
2864
  };
2477
2865
 
2478
2866
  // src/index.ts
2479
2867
  init_FormEdit();
2480
2868
  init_ListForm();
2481
2869
  init_TreeView();
2870
+
2871
+ // src/pageObjects/elements/Forms/ReportForm.ts
2872
+ var import_selenium_webdriver29 = require("selenium-webdriver");
2873
+ init_FormEdit();
2874
+ var ReportForm = class extends FormEdit {
2875
+ constructor(driver) {
2876
+ super(driver);
2877
+ this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
2878
+ this.saveButtonBy = import_selenium_webdriver29.By.id("button-apply");
2879
+ }
2880
+ /**
2881
+ * Знаходить поле/фільтр у формі репорту за ім'ям
2882
+ * @example
2883
+ * const formReport = new MyForm();
2884
+ * //...
2885
+ * expect(await formReport.filterField('Name').getValue()).toBe('test value');
2886
+ */
2887
+ filterField(name) {
2888
+ return super.field(name);
2889
+ }
2890
+ };
2891
+
2892
+ // src/index.ts
2482
2893
  init_Editors();
2483
2894
  init_FormField();
2484
2895
  init_FormFilterField();
@@ -2487,7 +2898,7 @@ init_FilterPanel();
2487
2898
 
2488
2899
  // src/pageObjects/elements/Dialog.ts
2489
2900
  init_AbstractElement();
2490
- var import_selenium_webdriver26 = require("selenium-webdriver");
2901
+ var import_selenium_webdriver30 = require("selenium-webdriver");
2491
2902
  init_AbstractButton();
2492
2903
  var DIALOG_CLASS = ".d5-dialog";
2493
2904
  var DIALOG_TITLE_CLASS = ".dialog__title";
@@ -2502,7 +2913,7 @@ var DialogButton = class extends AbstractButton {
2502
2913
  }
2503
2914
  async getElement() {
2504
2915
  const panel = await super.getElement();
2505
- return panel.findElement(import_selenium_webdriver26.By.xpath(buttonByTextXpath2(this.text)));
2916
+ return panel.findElement(import_selenium_webdriver30.By.xpath(buttonByTextXpath2(this.text)));
2506
2917
  }
2507
2918
  buttonNotDisplayedError() {
2508
2919
  return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
@@ -2522,11 +2933,11 @@ var Dialog = class extends AbstractElement {
2522
2933
  return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
2523
2934
  }
2524
2935
  async title() {
2525
- const el = await this.driver.findElement(import_selenium_webdriver26.By.css(this.titleSelector));
2936
+ const el = await this.driver.findElement(import_selenium_webdriver30.By.css(this.titleSelector));
2526
2937
  return await el.getText();
2527
2938
  }
2528
2939
  async text() {
2529
- const el = await this.driver.findElement(import_selenium_webdriver26.By.css(this.textSelector));
2940
+ const el = await this.driver.findElement(import_selenium_webdriver30.By.css(this.textSelector));
2530
2941
  return await el.getText();
2531
2942
  }
2532
2943
  button(text) {
@@ -2546,6 +2957,7 @@ var Dialog = class extends AbstractElement {
2546
2957
  LoginPage,
2547
2958
  NumberEditor,
2548
2959
  PanelFilterField,
2960
+ ReportForm,
2549
2961
  SubsystemsPanel,
2550
2962
  TextEditor,
2551
2963
  TreeView,