d5-testing-library 1.8.0-alpha.0 → 1.8.0-alpha.10

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.
@@ -387,6 +387,7 @@ var init_types = __esm({
387
387
  ControlClass2["SingleDateRange"] = "single-date-range-control";
388
388
  ControlClass2["BooleanSelector"] = "buttons-group";
389
389
  ControlClass2["ButtonGroup"] = "button-group-field";
390
+ ControlClass2["HeaderFilterDictionary"] = "header-filter-dictionary";
390
391
  return ControlClass2;
391
392
  })(ControlClass || {});
392
393
  }
@@ -918,6 +919,108 @@ var init_DateEditor = __esm({
918
919
  }
919
920
  });
920
921
 
922
+ // src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
923
+ var import_selenium_webdriver15, TAGS_SELECTOR2, DX_TAG_CONTAINER2, DX_TEXTEDITOR_EMPTY3, CUSTOM_OPTION_LIST_SELECTOR, SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2, TAG_BOX_LIST_ITEM_SELECTOR2, combinedOptionHeaderFilterDictValueXpath, dropDownHeaderFilterDictionaryOptionClick, HeaderFilterDictionary;
924
+ var init_HeaderFilterDictionary = __esm({
925
+ "src/pageObjects/elements/Editors/HeaderFilterDictionary.ts"() {
926
+ "use strict";
927
+ init_AbstractEditor();
928
+ import_selenium_webdriver15 = require("selenium-webdriver");
929
+ init_actions();
930
+ init_locators();
931
+ init_ClearButtonStrategy();
932
+ init_fixElementStaleError();
933
+ TAGS_SELECTOR2 = ".dx-tag .tag-text";
934
+ DX_TAG_CONTAINER2 = "dx-tag-container";
935
+ DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
936
+ CUSTOM_OPTION_LIST_SELECTOR = "custom-list";
937
+ SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
938
+ TAG_BOX_LIST_ITEM_SELECTOR2 = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
939
+ combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
940
+ dropDownHeaderFilterDictionaryOptionClick = async (optionValue, driver, dataTEST = "", delay = true) => {
941
+ const { implicit } = await driver.manage().getTimeouts();
942
+ let optElement = null;
943
+ const timeout = delay ? implicit : 600;
944
+ let err = null;
945
+ try {
946
+ const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
947
+ await driver.manage().setTimeouts({ implicit: timeout });
948
+ const calendarPopoverElement = await driver.findElement(import_selenium_webdriver15.By.css(calendarPopoverSelector));
949
+ const customOptionList = calendarPopoverElement.findElement(import_selenium_webdriver15.By.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
950
+ optElement = await customOptionList.findElement(import_selenium_webdriver15.By.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
951
+ await click(optElement, driver);
952
+ } catch (e) {
953
+ err = new Error(`Item not found: "${optionValue}"`);
954
+ } finally {
955
+ await driver.manage().setTimeouts({ implicit });
956
+ }
957
+ if (err)
958
+ throw err;
959
+ };
960
+ HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
961
+ constructor(parentCssSelector, elementCssSelector, driver) {
962
+ super(parentCssSelector, elementCssSelector, driver);
963
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
964
+ }
965
+ async setTagBoxInputValue(values) {
966
+ const lastElement = values[values.length - 1];
967
+ const inputEl = await this.getInputElement();
968
+ await inputEl.click();
969
+ for (const value of values) {
970
+ await this.selectOption(inputEl, value, lastElement);
971
+ }
972
+ }
973
+ async waitOptionSelection() {
974
+ await fixElementStaleError(import_selenium_webdriver15.By.css(TAG_BOX_LIST_ITEM_SELECTOR2), this.driver);
975
+ }
976
+ async selectOption(inputEl, value, lastElement) {
977
+ try {
978
+ await inputEl.sendKeys(value);
979
+ const dataTEST = await this.getDataTestId();
980
+ await dropDownHeaderFilterDictionaryOptionClick(value, this.driver, dataTEST);
981
+ const textLength = await inputEl.getAttribute("value").then((value2) => value2.length);
982
+ for (let i = 0; i < textLength; i++) {
983
+ await inputEl.sendKeys(import_selenium_webdriver15.Key.BACK_SPACE);
984
+ }
985
+ } catch (error) {
986
+ throw error;
987
+ }
988
+ await this.waitOptionSelection();
989
+ if (value !== lastElement) {
990
+ await inputEl.clear();
991
+ }
992
+ }
993
+ async getHeaderFilterDictionaryInputValue() {
994
+ if (await this.isHeaderFilterDictionaryEmpty()) {
995
+ return [];
996
+ }
997
+ const tags = await this.driver.findElements(
998
+ import_selenium_webdriver15.By.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
999
+ );
1000
+ const values = [];
1001
+ for (const tag of tags) {
1002
+ values.push(await tag.getAttribute("textContent"));
1003
+ }
1004
+ return values;
1005
+ }
1006
+ async isHeaderFilterDictionaryEmpty() {
1007
+ const classAttribute = await this.getClasses();
1008
+ return classAttribute.includes(DX_TEXTEDITOR_EMPTY3);
1009
+ }
1010
+ async getValue() {
1011
+ const value = await this.getHeaderFilterDictionaryInputValue();
1012
+ return value.length ? value : null;
1013
+ }
1014
+ async setValue(values) {
1015
+ if (!Array.isArray(values)) {
1016
+ values = [values];
1017
+ }
1018
+ await this.setTagBoxInputValue(values);
1019
+ }
1020
+ };
1021
+ }
1022
+ });
1023
+
921
1024
  // src/pageObjects/elements/Editors/editorFactory.ts
922
1025
  var editorFactory;
923
1026
  var init_editorFactory = __esm({
@@ -934,6 +1037,7 @@ var init_editorFactory = __esm({
934
1037
  init_BooleanSelector();
935
1038
  init_ButtonGroup();
936
1039
  init_DateEditor();
1040
+ init_HeaderFilterDictionary();
937
1041
  editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
938
1042
  const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
939
1043
  const classSting = await elementInstance.getClasses();
@@ -956,6 +1060,8 @@ var init_editorFactory = __esm({
956
1060
  return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
957
1061
  if (classSting.includes("button-group-field" /* ButtonGroup */))
958
1062
  return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
1063
+ if (classSting.includes("header-filter-dictionary" /* HeaderFilterDictionary */))
1064
+ return new HeaderFilterDictionary(parentCssSelector, elementCssSelector, driver);
959
1065
  throw new Error("Unknown type of editor. Please write ticket to the support");
960
1066
  };
961
1067
  }
@@ -1003,6 +1109,9 @@ function createFormButtonTestId(formName, itemName) {
1003
1109
  function createSubSystemTestId(itemName) {
1004
1110
  return `${"subsystem-item" /* SUBSYSTEM_ITEM */}-${itemName}`;
1005
1111
  }
1112
+ function createEditorButtonTestId(itemName) {
1113
+ return `${"editor-button" /* EDITOR_BUTTON */}-${itemName}`;
1114
+ }
1006
1115
  var init_createDataTestId = __esm({
1007
1116
  "src/utils/createDataTestId.ts"() {
1008
1117
  "use strict";
@@ -1035,9 +1144,9 @@ var AbstractButton;
1035
1144
  var init_AbstractButton = __esm({
1036
1145
  "src/pageObjects/elements/TableToolbar/AbstractButton.ts"() {
1037
1146
  "use strict";
1038
- init_AbstractElementWithParent();
1039
1147
  init_actions();
1040
1148
  init_waitElementIsClickable();
1149
+ init_AbstractElementWithParent();
1041
1150
  AbstractButton = class extends AbstractElementWithParent {
1042
1151
  constructor(parentCssSelector, elementCssSelector, driver) {
1043
1152
  super(parentCssSelector, elementCssSelector, driver);
@@ -1055,17 +1164,21 @@ var init_AbstractButton = __esm({
1055
1164
  const button = await this.getElement();
1056
1165
  return await button.getCssValue("pointer-events") === "none";
1057
1166
  }
1167
+ async isDisplayed() {
1168
+ const button = await this.getElement();
1169
+ return await button.isDisplayed();
1170
+ }
1058
1171
  };
1059
1172
  }
1060
1173
  });
1061
1174
 
1062
1175
  // src/pageObjects/elements/DXComponents/DXButton.ts
1063
- var import_selenium_webdriver16, DXButton;
1176
+ var import_selenium_webdriver17, DXButton;
1064
1177
  var init_DXButton = __esm({
1065
1178
  "src/pageObjects/elements/DXComponents/DXButton.ts"() {
1066
1179
  "use strict";
1067
1180
  init_AbstractButton();
1068
- import_selenium_webdriver16 = require("selenium-webdriver");
1181
+ import_selenium_webdriver17 = require("selenium-webdriver");
1069
1182
  DXButton = class extends AbstractButton {
1070
1183
  async getText() {
1071
1184
  const classes = await this.getClasses();
@@ -1073,7 +1186,7 @@ var init_DXButton = __esm({
1073
1186
  return null;
1074
1187
  }
1075
1188
  const el = await this.getElement();
1076
- const textEl = el.findElement(import_selenium_webdriver16.By.className("dx-button-text"));
1189
+ const textEl = el.findElement(import_selenium_webdriver17.By.className("dx-button-text"));
1077
1190
  return await textEl.getText();
1078
1191
  }
1079
1192
  };
@@ -1128,12 +1241,12 @@ var init_Panel = __esm({
1128
1241
  });
1129
1242
 
1130
1243
  // src/pageObjects/elements/Groups/TabPanel.ts
1131
- var import_selenium_webdriver17, TabPanelItem, TabPanel;
1244
+ var import_selenium_webdriver18, TabPanelItem, TabPanel;
1132
1245
  var init_TabPanel = __esm({
1133
1246
  "src/pageObjects/elements/Groups/TabPanel.ts"() {
1134
1247
  "use strict";
1135
1248
  init_AbstractGroup();
1136
- import_selenium_webdriver17 = require("selenium-webdriver");
1249
+ import_selenium_webdriver18 = require("selenium-webdriver");
1137
1250
  init_actions();
1138
1251
  TabPanelItem = class extends AbstractGroup {
1139
1252
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -1144,7 +1257,7 @@ var init_TabPanel = __esm({
1144
1257
  }
1145
1258
  async isActive() {
1146
1259
  const tabPanelItemElement = await this.getElement();
1147
- const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver17.By.xpath('ancestor::div[@role="tab"][1]'));
1260
+ const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver18.By.xpath('ancestor::div[@role="tab"][1]'));
1148
1261
  return await grandparentTab.getAttribute("aria-selected") === "true";
1149
1262
  }
1150
1263
  async getTitle() {
@@ -1163,12 +1276,12 @@ var init_TabPanel = __esm({
1163
1276
  });
1164
1277
 
1165
1278
  // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
1166
- var import_selenium_webdriver18, ACCORDION_TITLE_CONTAINER, AccordionItem;
1279
+ var import_selenium_webdriver19, ACCORDION_TITLE_CONTAINER, AccordionItem;
1167
1280
  var init_AccordionItem = __esm({
1168
1281
  "src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
1169
1282
  "use strict";
1170
1283
  init_AbstractGroup();
1171
- import_selenium_webdriver18 = require("selenium-webdriver");
1284
+ import_selenium_webdriver19 = require("selenium-webdriver");
1172
1285
  init_actions();
1173
1286
  ACCORDION_TITLE_CONTAINER = "accordion-title-container";
1174
1287
  AccordionItem = class extends AbstractGroup {
@@ -1181,7 +1294,7 @@ var init_AccordionItem = __esm({
1181
1294
  }
1182
1295
  async clickAccordionItemTitle() {
1183
1296
  const accordionElement = await this.getElement();
1184
- const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver18.By.className(ACCORDION_TITLE_CONTAINER));
1297
+ const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver19.By.className(ACCORDION_TITLE_CONTAINER));
1185
1298
  await accordTitleElement.click();
1186
1299
  }
1187
1300
  async click() {
@@ -1416,11 +1529,11 @@ function getCssRowByIndexSelector(index) {
1416
1529
  function getCssCellByIndexSelector(index) {
1417
1530
  return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
1418
1531
  }
1419
- var import_selenium_webdriver19, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1532
+ var import_selenium_webdriver20, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1420
1533
  var init_utils2 = __esm({
1421
1534
  "src/pageObjects/elements/Table/utils.ts"() {
1422
1535
  "use strict";
1423
- import_selenium_webdriver19 = require("selenium-webdriver");
1536
+ import_selenium_webdriver20 = require("selenium-webdriver");
1424
1537
  getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
1425
1538
  getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
1426
1539
  getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
@@ -1437,11 +1550,11 @@ var init_types3 = __esm({
1437
1550
  });
1438
1551
 
1439
1552
  // src/pageObjects/elements/Table/elements/Cell.ts
1440
- var import_selenium_webdriver20, Cell;
1553
+ var import_selenium_webdriver21, Cell;
1441
1554
  var init_Cell = __esm({
1442
1555
  "src/pageObjects/elements/Table/elements/Cell.ts"() {
1443
1556
  "use strict";
1444
- import_selenium_webdriver20 = require("selenium-webdriver");
1557
+ import_selenium_webdriver21 = require("selenium-webdriver");
1445
1558
  init_AbstractElementWithParent();
1446
1559
  init_utils2();
1447
1560
  init_types3();
@@ -1458,12 +1571,12 @@ var init_Cell = __esm({
1458
1571
  this.elementCssSelector = getCssCellByIndexSelector(index);
1459
1572
  }
1460
1573
  async getBooleanValue(cellEl) {
1461
- const booleanEl = await cellEl.findElement(import_selenium_webdriver20.By.className("boolean-widget"));
1574
+ const booleanEl = await cellEl.findElement(import_selenium_webdriver21.By.className("boolean-widget"));
1462
1575
  return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
1463
1576
  }
1464
1577
  async getTagsValue(cellEl) {
1465
1578
  const tagsCssSelector = ".multiselect-container .multiselect-cell";
1466
- const tags = await cellEl.findElements(import_selenium_webdriver20.By.css(tagsCssSelector));
1579
+ const tags = await cellEl.findElements(import_selenium_webdriver21.By.css(tagsCssSelector));
1467
1580
  const values = [];
1468
1581
  for (const tag of tags) {
1469
1582
  values.push(await tag.getAttribute("textContent"));
@@ -1493,11 +1606,11 @@ var init_Cell = __esm({
1493
1606
  });
1494
1607
 
1495
1608
  // src/pageObjects/elements/Table/elements/Row.ts
1496
- var import_selenium_webdriver21, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
1609
+ var import_selenium_webdriver22, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
1497
1610
  var init_Row = __esm({
1498
1611
  "src/pageObjects/elements/Table/elements/Row.ts"() {
1499
1612
  "use strict";
1500
- import_selenium_webdriver21 = require("selenium-webdriver");
1613
+ import_selenium_webdriver22 = require("selenium-webdriver");
1501
1614
  init_Cell();
1502
1615
  init_utils2();
1503
1616
  init_AbstractElementWithParent();
@@ -1510,10 +1623,12 @@ var init_Row = __esm({
1510
1623
  Row = class extends AbstractElementWithParent {
1511
1624
  index;
1512
1625
  getColumnBy;
1513
- constructor(parentCssSelector, index, driver, getColumnBy) {
1626
+ fixedTableContentCssSelector;
1627
+ constructor(parentCssSelector, fixedTableContentCssSelector, index, driver, getColumnBy) {
1514
1628
  super(parentCssSelector, getCssRowByIndexSelector(index), driver);
1515
1629
  this.index = index;
1516
1630
  this.getColumnBy = getColumnBy;
1631
+ this.fixedTableContentCssSelector = fixedTableContentCssSelector;
1517
1632
  }
1518
1633
  _getCell({ index, name, title }) {
1519
1634
  return new Cell(
@@ -1554,7 +1669,7 @@ var init_Row = __esm({
1554
1669
  return this.index;
1555
1670
  }
1556
1671
  async getCells() {
1557
- const cells = await this.driver.findElements(import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1672
+ const cells = await this.driver.findElements(import_selenium_webdriver22.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1558
1673
  const result = [];
1559
1674
  cells.forEach((_, index) => {
1560
1675
  const newCell = this.getCellByIndex(index);
@@ -1563,12 +1678,11 @@ var init_Row = __esm({
1563
1678
  return result;
1564
1679
  }
1565
1680
  async clickInlineButton(buttonClass) {
1566
- const FIXED_TABLE_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
1567
1681
  const buttonCssSelector = `.${DX_DATA_ROW_CLASS}[aria-rowindex="${transformInputIndex(
1568
1682
  this.index
1569
1683
  )}"] .${buttonClass}`;
1570
1684
  const button = await fixElementStaleError(
1571
- import_selenium_webdriver21.By.css(`${this.parentCssSelector} ${FIXED_TABLE_CSS_SELECTOR} ${buttonCssSelector}`),
1685
+ import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`),
1572
1686
  this.driver
1573
1687
  );
1574
1688
  return click(button, this.driver);
@@ -1599,11 +1713,11 @@ var init_Row = __esm({
1599
1713
  });
1600
1714
 
1601
1715
  // src/pageObjects/elements/Table/elements/Column.ts
1602
- var import_selenium_webdriver22, Column;
1716
+ var import_selenium_webdriver23, Column;
1603
1717
  var init_Column = __esm({
1604
1718
  "src/pageObjects/elements/Table/elements/Column.ts"() {
1605
1719
  "use strict";
1606
- import_selenium_webdriver22 = require("selenium-webdriver");
1720
+ import_selenium_webdriver23 = require("selenium-webdriver");
1607
1721
  init_utils2();
1608
1722
  init_AbstractElementWithParent();
1609
1723
  init_fixElementStaleError();
@@ -1631,7 +1745,7 @@ var init_Column = __esm({
1631
1745
  return super.getElement();
1632
1746
  }
1633
1747
  async getColumnHeaderIndexBy(cssSelector) {
1634
- const column = await fixElementStaleError(import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
1748
+ const column = await fixElementStaleError(import_selenium_webdriver23.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
1635
1749
  return transformOutputIndex(await column.getAttribute("aria-colindex"));
1636
1750
  }
1637
1751
  async getIndexByCaption() {
@@ -1662,6 +1776,46 @@ var init_Column = __esm({
1662
1776
  }
1663
1777
  });
1664
1778
 
1779
+ // src/pageObjects/elements/EditorButton.ts
1780
+ var EditorButton;
1781
+ var init_EditorButton = __esm({
1782
+ "src/pageObjects/elements/EditorButton.ts"() {
1783
+ "use strict";
1784
+ init_locators();
1785
+ init_createDataTestId();
1786
+ init_AbstractElementWithParent();
1787
+ init_waitElementIsClickable();
1788
+ init_actions();
1789
+ EditorButton = class extends AbstractElementWithParent {
1790
+ name;
1791
+ constructor(parentCssSelector, name, driver) {
1792
+ super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)), driver);
1793
+ this.name = name;
1794
+ }
1795
+ buttonNotDisplayedError() {
1796
+ return `Editor Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
1797
+ }
1798
+ async click() {
1799
+ const button = await this.getElement();
1800
+ await waitElementIsClickable({
1801
+ element: button,
1802
+ errorMessage: this.buttonNotDisplayedError(),
1803
+ driver: this.driver
1804
+ });
1805
+ await click(button, this.driver);
1806
+ }
1807
+ async isDisplayed() {
1808
+ try {
1809
+ const button = await this.getElement();
1810
+ return await button.isDisplayed();
1811
+ } catch (error) {
1812
+ return false;
1813
+ }
1814
+ }
1815
+ };
1816
+ }
1817
+ });
1818
+
1665
1819
  // src/pageObjects/elements/AbstractEditor.ts
1666
1820
  var AbstractEditor;
1667
1821
  var init_AbstractEditor2 = __esm({
@@ -1669,6 +1823,7 @@ var init_AbstractEditor2 = __esm({
1669
1823
  "use strict";
1670
1824
  init_AbstractElementWithParent();
1671
1825
  init_Editors();
1826
+ init_EditorButton();
1672
1827
  AbstractEditor = class extends AbstractElementWithParent {
1673
1828
  editor;
1674
1829
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -1733,6 +1888,16 @@ var init_AbstractEditor2 = __esm({
1733
1888
  await this.initEditor();
1734
1889
  return this.editor.isReadonly();
1735
1890
  }
1891
+ /**
1892
+ * Находит кнопку на поле по имени
1893
+ * @example
1894
+ * const form= new MyForm();
1895
+ * //...
1896
+ * await form.field('Name').button('editorButton).click()
1897
+ */
1898
+ button(name) {
1899
+ return new EditorButton(this.getFullCssSelector(), name, this.driver);
1900
+ }
1736
1901
  };
1737
1902
  }
1738
1903
  });
@@ -1754,11 +1919,11 @@ var init_FormField = __esm({
1754
1919
  });
1755
1920
 
1756
1921
  // src/pageObjects/elements/Table/Table.ts
1757
- var import_selenium_webdriver23, Table;
1922
+ var import_selenium_webdriver24, Table;
1758
1923
  var init_Table = __esm({
1759
1924
  "src/pageObjects/elements/Table/Table.ts"() {
1760
1925
  "use strict";
1761
- import_selenium_webdriver23 = require("selenium-webdriver");
1926
+ import_selenium_webdriver24 = require("selenium-webdriver");
1762
1927
  init_createDataTestId();
1763
1928
  init_AbstractElementWithParent();
1764
1929
  init_Row();
@@ -1767,10 +1932,14 @@ var init_Table = __esm({
1767
1932
  Table = class extends AbstractElementWithParent {
1768
1933
  formName;
1769
1934
  headerCssSelector;
1770
- constructor(parentCssSelector, headerCssSelector, formName, driver) {
1935
+ fixedTableContentCssSelector;
1936
+ tableContentCssSelector;
1937
+ constructor(parentCssSelector, headerCssSelector, tableContentCssSelector, fixedTableContentCssSelector, formName, driver) {
1771
1938
  super(parentCssSelector, `#${createTableId(formName)}`, driver);
1772
1939
  this.formName = formName;
1773
1940
  this.headerCssSelector = headerCssSelector;
1941
+ this.fixedTableContentCssSelector = fixedTableContentCssSelector;
1942
+ this.tableContentCssSelector = tableContentCssSelector;
1774
1943
  }
1775
1944
  getColumnBy = (args) => {
1776
1945
  if (args.title) {
@@ -1779,7 +1948,7 @@ var init_Table = __esm({
1779
1948
  return this.getColumnByName(args.name);
1780
1949
  };
1781
1950
  getRowByIndex(index) {
1782
- return new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
1951
+ return new Row(this.getFullCssSelector(), this.fixedTableContentCssSelector, index, this.driver, this.getColumnBy);
1783
1952
  }
1784
1953
  getColumnByIndex(index) {
1785
1954
  return new Column({
@@ -1808,17 +1977,24 @@ var init_Table = __esm({
1808
1977
  return this.getRowByIndex(index).select();
1809
1978
  }
1810
1979
  async getRows() {
1811
- const rows = await this.driver.findElements(import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1980
+ const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
1981
+ const rows = await this.driver.findElements(import_selenium_webdriver24.By.css(rowsFullCssSelector));
1812
1982
  const result = [];
1813
1983
  rows.forEach((_, index) => {
1814
- const newRow = new Row(this.getFullCssSelector(), index, this.driver, this.getColumnBy);
1984
+ const newRow = new Row(
1985
+ this.getFullCssSelector(),
1986
+ this.fixedTableContentCssSelector,
1987
+ index,
1988
+ this.driver,
1989
+ this.getColumnBy
1990
+ );
1815
1991
  result.push(newRow);
1816
1992
  });
1817
1993
  return result;
1818
1994
  }
1819
1995
  async getColumns() {
1820
1996
  const columns = await this.driver.findElements(
1821
- import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1997
+ import_selenium_webdriver24.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1822
1998
  );
1823
1999
  const result = [];
1824
2000
  columns.forEach((_, index) => {
@@ -1913,11 +2089,11 @@ var init_typesUtil = __esm({
1913
2089
  });
1914
2090
 
1915
2091
  // src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
1916
- var import_selenium_webdriver24, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
2092
+ var import_selenium_webdriver25, SPINDOWN_CLASS, CONTEXT_MENU_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
1917
2093
  var init_ToolbarMenu = __esm({
1918
2094
  "src/pageObjects/elements/TableToolbar/ToolbarMenu.ts"() {
1919
2095
  "use strict";
1920
- import_selenium_webdriver24 = require("selenium-webdriver");
2096
+ import_selenium_webdriver25 = require("selenium-webdriver");
1921
2097
  init_typesUtil();
1922
2098
  init_AbstractElementWithParent();
1923
2099
  init_locators();
@@ -1925,9 +2101,10 @@ var init_ToolbarMenu = __esm({
1925
2101
  init_waitElementIsClickable();
1926
2102
  init_fixElementStaleError();
1927
2103
  SPINDOWN_CLASS = ".dx-icon-spindown";
2104
+ CONTEXT_MENU_CLASS = "dx-context-menu";
1928
2105
  buttonGroupItemSelector = (formName, name) => byTestIdCssSelector(`ftb-${formName}-${name}`);
1929
2106
  getFullCssSelector = (formName, name) => `${buttonGroupItemSelector(formName, name)} ${SPINDOWN_CLASS}`;
1930
- buttonByTextXpath = (text) => `.//span[contains(@class, "dx-menu-item-text") and contains(text(), "${text}")]`;
2107
+ buttonByTextXpath = (text) => `//div[contains(@class, '${CONTEXT_MENU_CLASS}')]//span[contains(@class, 'dx-menu-item-text') and text()='${text}']`;
1931
2108
  ToolbarMenu = class extends AbstractElementWithParent {
1932
2109
  _formName;
1933
2110
  constructor(parentCssSelector, formName, name, driver) {
@@ -1968,7 +2145,7 @@ var init_ToolbarMenu = __esm({
1968
2145
  throw new Error(`"title" must be a string or array of string`);
1969
2146
  let lTitle = isString(title) ? [title] : title;
1970
2147
  for (let t of lTitle) {
1971
- await this.goToButton(t, import_selenium_webdriver24.By.xpath(buttonByTextXpath(t)));
2148
+ await this.goToButton(t, import_selenium_webdriver25.By.xpath(buttonByTextXpath(t)));
1972
2149
  }
1973
2150
  }
1974
2151
  };
@@ -2014,6 +2191,14 @@ var init_ToolbarItem = __esm({
2014
2191
  await this.init();
2015
2192
  return await this._button.isDisabled();
2016
2193
  }
2194
+ async isDisplayed() {
2195
+ try {
2196
+ await this.init();
2197
+ return this._button.isDisplayed();
2198
+ } catch (error) {
2199
+ return false;
2200
+ }
2201
+ }
2017
2202
  get menu() {
2018
2203
  return new ToolbarMenu(this.parentCssSelector, this._formName, this._itemName, this.driver);
2019
2204
  }
@@ -2042,6 +2227,110 @@ var init_FormToolbar = __esm({
2042
2227
  }
2043
2228
  });
2044
2229
 
2230
+ // src/pageObjects/elements/Filters/FilterOperation.ts
2231
+ var import_selenium_webdriver26, FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
2232
+ var init_FilterOperation = __esm({
2233
+ "src/pageObjects/elements/Filters/FilterOperation.ts"() {
2234
+ "use strict";
2235
+ import_selenium_webdriver26 = require("selenium-webdriver");
2236
+ init_fixElementStaleError();
2237
+ init_AbstractElementWithParent();
2238
+ init_locators();
2239
+ init_actions();
2240
+ init_wait();
2241
+ init_waitElementIsClickable();
2242
+ init_waitElementIsVisible();
2243
+ FILTER_OPERATIONS = [
2244
+ "=",
2245
+ "<>",
2246
+ "<",
2247
+ ">",
2248
+ "<=",
2249
+ ">=",
2250
+ "contains",
2251
+ "between",
2252
+ "isanyof",
2253
+ "isnotanyof",
2254
+ "isblank",
2255
+ "isnotblank",
2256
+ "startwith",
2257
+ "bywords"
2258
+ ];
2259
+ BUTTON_OPERATION_WIDGET = "operation-widget";
2260
+ OPERATIONS_WIDGET_POPUP = "operation-type-widget-popup";
2261
+ getWidgetInPopupSelector = (operationName) => `.dx-list-item [data-operation="${operationName}"]`;
2262
+ FilterOperation = class extends AbstractElementWithParent {
2263
+ _testId;
2264
+ constructor({ parentCssSelector, filterTestID, driver }) {
2265
+ super(parentCssSelector, `${byTestIdCssSelector(`${BUTTON_OPERATION_WIDGET}-${filterTestID}`)}`, driver);
2266
+ this._testId = filterTestID;
2267
+ }
2268
+ async initOperationWidget() {
2269
+ const widgetButtonEl = await this.getElement();
2270
+ await waitElementIsClickable({
2271
+ element: widgetButtonEl,
2272
+ errorMessage: "Widget operation is not clickable",
2273
+ driver: this.driver
2274
+ });
2275
+ const clickableElement = await widgetButtonEl.findElement(import_selenium_webdriver26.By.className("dx-icon"));
2276
+ await click(clickableElement, this.driver);
2277
+ try {
2278
+ const widgetPopupEl = await this.driver.findElement(import_selenium_webdriver26.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
2279
+ await waitElementIsVisible({
2280
+ element: widgetPopupEl,
2281
+ errorMessage: `Operation widget popup is not visible`,
2282
+ driver: this.driver
2283
+ });
2284
+ } catch (_) {
2285
+ throw `Operation widget popup is not visible`;
2286
+ }
2287
+ }
2288
+ async setOperation(operationName) {
2289
+ if (!FILTER_OPERATIONS.includes(operationName)) {
2290
+ throw new Error(`Operation with name "${operationName}" is not correct.`);
2291
+ }
2292
+ await this.initOperationWidget();
2293
+ const operationEl = await fixElementStaleError(import_selenium_webdriver26.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)} ${getWidgetInPopupSelector(operationName)}`), this.driver);
2294
+ await click(operationEl, this.driver);
2295
+ await wait(
2296
+ async () => {
2297
+ const currOperationName = await this.getAttribute("data-operation");
2298
+ if (operationName === "isblank")
2299
+ return true;
2300
+ return currOperationName === operationName;
2301
+ },
2302
+ this.driver,
2303
+ "Operation is not changed"
2304
+ );
2305
+ }
2306
+ async getOperation() {
2307
+ const result = await this.getAttribute("data-operation");
2308
+ if (!result)
2309
+ throw new Error("Operation not found");
2310
+ return result;
2311
+ }
2312
+ async setIsBlank(value) {
2313
+ const currValue = await this.getIsBlank();
2314
+ if (currValue !== value) {
2315
+ await this.setOperation("isblank");
2316
+ await wait(
2317
+ async () => {
2318
+ const currIsBlank = await this.getIsBlank();
2319
+ return currIsBlank === value;
2320
+ },
2321
+ this.driver,
2322
+ "Operation is not changed"
2323
+ );
2324
+ }
2325
+ }
2326
+ async getIsBlank() {
2327
+ const result = await this.getAttribute("data-hasblank");
2328
+ return result === "true";
2329
+ }
2330
+ };
2331
+ }
2332
+ });
2333
+
2045
2334
  // src/pageObjects/elements/Filters/FormFilterField.ts
2046
2335
  var FormFilterField;
2047
2336
  var init_FormFilterField = __esm({
@@ -2050,9 +2339,14 @@ var init_FormFilterField = __esm({
2050
2339
  init_locators();
2051
2340
  init_createDataTestId();
2052
2341
  init_AbstractEditor2();
2342
+ init_FilterOperation();
2053
2343
  FormFilterField = class extends AbstractEditor {
2344
+ formName;
2345
+ name;
2054
2346
  constructor(parentCssSelector, formName, name, driver) {
2055
2347
  super(parentCssSelector, byTestIdCssSelector(createLayoutFilterTestId(formName, name)), driver);
2348
+ this.formName = formName;
2349
+ this.name = name;
2056
2350
  }
2057
2351
  /**
2058
2352
  * Возвращает значение в поле
@@ -2068,8 +2362,15 @@ var init_FormFilterField = __esm({
2068
2362
  * @example
2069
2363
  * await form.formFilter('NumberFld').setValue(123);
2070
2364
  * await form.formFilter('TextFld').setValue('TestValue');
2365
+ * await form.formFilter('TextFld').setValue('TestValue', '=', true);
2071
2366
  */
2072
- async setValue(value) {
2367
+ async setValue(value, operation, isBlank) {
2368
+ if (typeof operation === "string") {
2369
+ await this.setOperation(operation);
2370
+ }
2371
+ if (typeof isBlank === "boolean") {
2372
+ await this.setIsBlank(isBlank);
2373
+ }
2073
2374
  return super.setValue(value);
2074
2375
  }
2075
2376
  /**
@@ -2088,6 +2389,51 @@ var init_FormFilterField = __esm({
2088
2389
  async remove(itemText) {
2089
2390
  return super.remove(itemText);
2090
2391
  }
2392
+ /**
2393
+ * Инициализация операции фильтра
2394
+ */
2395
+ async initOperation() {
2396
+ return new FilterOperation({
2397
+ parentCssSelector: this.parentCssSelector,
2398
+ filterTestID: createLayoutFilterTestId(this.formName, this.name)
2399
+ });
2400
+ }
2401
+ /**
2402
+ * Устанавливает операцию для фильтра
2403
+ * @example
2404
+ * await form.formFilter('TagBox').setOperation("=");
2405
+ */
2406
+ async setOperation(operationName) {
2407
+ const filterOperation = await this.initOperation();
2408
+ await filterOperation.setOperation(operationName);
2409
+ }
2410
+ /**
2411
+ * Возвращает операцию фильтра
2412
+ * @example
2413
+ * expect(await form.formFilter('NumberFld').getOperation()).toBe("=");
2414
+ */
2415
+ async getOperation() {
2416
+ const filterOperation = await this.initOperation();
2417
+ return await filterOperation.getOperation();
2418
+ }
2419
+ /**
2420
+ * Устанавливает операцию 'isblank' для фильтра
2421
+ * @example
2422
+ * await form.formFilter('TagBox').setIsBlank(true);
2423
+ */
2424
+ async setIsBlank(value) {
2425
+ const filterOperation = await this.initOperation();
2426
+ await filterOperation.setIsBlank(value);
2427
+ }
2428
+ /**
2429
+ * Возвращает true|false, если операция 'isblank' установлена для фильтра
2430
+ * @example
2431
+ * expect(await form.formFilter('NumberFld').getIsBlank()).toBe(false);
2432
+ */
2433
+ async getIsBlank() {
2434
+ const filterOperation = await this.initOperation();
2435
+ return await filterOperation.getIsBlank();
2436
+ }
2091
2437
  };
2092
2438
  }
2093
2439
  });
@@ -2100,9 +2446,14 @@ var init_PanelFilterField = __esm({
2100
2446
  init_locators();
2101
2447
  init_createDataTestId();
2102
2448
  init_AbstractEditor2();
2449
+ init_FilterOperation();
2103
2450
  PanelFilterField = class extends AbstractEditor {
2451
+ formName;
2452
+ name;
2104
2453
  constructor(parentCssSelector, formName, name, driver) {
2105
2454
  super(parentCssSelector, byTestIdCssSelector(createDocFilterTestId(formName, name)), driver);
2455
+ this.formName = formName;
2456
+ this.name = name;
2106
2457
  }
2107
2458
  /**
2108
2459
  * Возвращает значение в поле
@@ -2118,8 +2469,15 @@ var init_PanelFilterField = __esm({
2118
2469
  * @example
2119
2470
  * await form.filterPanel.filterField('NumberFld').setValue(123);
2120
2471
  * await form.filterPanel.filterField('TextFld').setValue('TestValue');
2472
+ * await form.filterPanel.filterField('TextFld').setValue('TestValue', '=', true);
2121
2473
  */
2122
- async setValue(value) {
2474
+ async setValue(value, operation, isBlank) {
2475
+ if (typeof operation === "string") {
2476
+ await this.setOperation(operation);
2477
+ }
2478
+ if (typeof isBlank === "boolean") {
2479
+ await this.setIsBlank(isBlank);
2480
+ }
2123
2481
  return super.setValue(value);
2124
2482
  }
2125
2483
  /**
@@ -2138,16 +2496,61 @@ var init_PanelFilterField = __esm({
2138
2496
  async remove(itemText) {
2139
2497
  return super.remove(itemText);
2140
2498
  }
2499
+ /**
2500
+ * Инициализация операции фильтра
2501
+ */
2502
+ async initOperation() {
2503
+ return new FilterOperation({
2504
+ parentCssSelector: this.parentCssSelector,
2505
+ filterTestID: createDocFilterTestId(this.formName, this.name)
2506
+ });
2507
+ }
2508
+ /**
2509
+ * Устанавливает операцию для фильтра
2510
+ * @example
2511
+ * await form.filterPanel.filterField('TagBox').setOperation("=");
2512
+ */
2513
+ async setOperation(operationName) {
2514
+ const filterOperation = await this.initOperation();
2515
+ await filterOperation.setOperation(operationName);
2516
+ }
2517
+ /**
2518
+ * Возвращает операцию фильтра
2519
+ * @example
2520
+ * expect(await form.filterPanel.filterField('NumberFld').getOperation()).toBe("=");
2521
+ */
2522
+ async getOperation() {
2523
+ const filterOperation = await this.initOperation();
2524
+ return await filterOperation.getOperation();
2525
+ }
2526
+ /**
2527
+ * Устанавливает операцию 'isblank' для фильтра
2528
+ * @example
2529
+ * await form.filterPanel.filterField('TagBox').setIsBlank(true);
2530
+ */
2531
+ async setIsBlank(value) {
2532
+ const filterOperation = await this.initOperation();
2533
+ await filterOperation.setIsBlank(value);
2534
+ }
2535
+ /**
2536
+ * Возвращает true|false, если операция 'isblank' установлена для фильтра
2537
+ * @example
2538
+ * expect(await form.filterPanel.filterField('NumberFld').getIsBlank()).toBe(false);
2539
+ */
2540
+ async getIsBlank() {
2541
+ const filterOperation = await this.initOperation();
2542
+ return await filterOperation.getIsBlank();
2543
+ }
2141
2544
  };
2142
2545
  }
2143
2546
  });
2144
2547
 
2145
2548
  // src/pageObjects/elements/Filters/FilterPanel.ts
2146
- var import_selenium_webdriver25, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2549
+ var import_selenium_webdriver27, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2147
2550
  var init_FilterPanel = __esm({
2148
2551
  "src/pageObjects/elements/Filters/FilterPanel.ts"() {
2149
2552
  "use strict";
2150
- import_selenium_webdriver25 = require("selenium-webdriver");
2553
+ import_selenium_webdriver27 = require("selenium-webdriver");
2151
2554
  init_AbstractElement();
2152
2555
  init_PanelFilterField();
2153
2556
  init_actions();
@@ -2162,7 +2565,7 @@ var init_FilterPanel = __esm({
2162
2565
  async filterPanelButtons() {
2163
2566
  const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
2164
2567
  const el = await this.getElement();
2165
- return el.findElements(import_selenium_webdriver25.By.css(selector));
2568
+ return el.findElements(import_selenium_webdriver27.By.css(selector));
2166
2569
  }
2167
2570
  constructor(formName, driver) {
2168
2571
  super(driver, drawerSelector(formName));
@@ -2195,7 +2598,7 @@ var init_FilterPanel = __esm({
2195
2598
  await this.driver.sleep(300);
2196
2599
  }
2197
2600
  async close() {
2198
- const btn = await this.driver.findElement(import_selenium_webdriver25.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2601
+ const btn = await this.driver.findElement(import_selenium_webdriver27.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2199
2602
  await click(btn, this.driver);
2200
2603
  }
2201
2604
  };
@@ -2231,15 +2634,18 @@ var init_HeaderFilterField = __esm({
2231
2634
  });
2232
2635
 
2233
2636
  // src/pageObjects/elements/Filters/ColumnFilter.ts
2234
- var import_selenium_webdriver26, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
2637
+ var import_selenium_webdriver28, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
2235
2638
  var init_ColumnFilter = __esm({
2236
2639
  "src/pageObjects/elements/Filters/ColumnFilter.ts"() {
2237
2640
  "use strict";
2238
2641
  init_actions();
2239
- import_selenium_webdriver26 = require("selenium-webdriver");
2642
+ import_selenium_webdriver28 = require("selenium-webdriver");
2240
2643
  init_HeaderFilterField();
2241
2644
  init_waitElementIsVisible();
2242
2645
  init_AbstractElement();
2646
+ init_FilterOperation();
2647
+ init_createDataTestId();
2648
+ init_wait();
2243
2649
  APPLY_SELECTOR = ".apply-button";
2244
2650
  CANCEL_SELECTOR = ".cancel-button";
2245
2651
  HEADER_FILTER_ICON = ".dx-column-indicators .dx-header-filter";
@@ -2258,11 +2664,11 @@ var init_ColumnFilter = __esm({
2258
2664
  }
2259
2665
  async getApplyButton() {
2260
2666
  const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
2261
- return this.driver.findElement(import_selenium_webdriver26.By.css(selector));
2667
+ return this.driver.findElement(import_selenium_webdriver28.By.css(selector));
2262
2668
  }
2263
2669
  async getCancelButton() {
2264
2670
  const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
2265
- return this.driver.findElement(import_selenium_webdriver26.By.css(selector));
2671
+ return this.driver.findElement(import_selenium_webdriver28.By.css(selector));
2266
2672
  }
2267
2673
  async apply() {
2268
2674
  const btn = await this.getApplyButton();
@@ -2276,17 +2682,34 @@ var init_ColumnFilter = __esm({
2276
2682
  const columnEl = await this._column.getElement();
2277
2683
  const actions = this.driver.actions({ async: true });
2278
2684
  await actions.move({ origin: columnEl }).perform();
2279
- const elements = await columnEl.findElements(import_selenium_webdriver26.By.css(HEADER_FILTER_ICON));
2280
- const headerFilterIcon = elements[1];
2281
- await waitElementIsVisible({
2282
- element: headerFilterIcon,
2283
- driver: this.driver,
2284
- errorMessage: `HeaderFilter "${this._name}" is not visible`
2285
- });
2685
+ const elements = await columnEl.findElements(import_selenium_webdriver28.By.css(HEADER_FILTER_ICON));
2686
+ let headerFilterIcon = null;
2687
+ await wait(
2688
+ async () => {
2689
+ let result = false;
2690
+ for (let element of elements) {
2691
+ if (await element.isDisplayed()) {
2692
+ headerFilterIcon = element;
2693
+ result = true;
2694
+ break;
2695
+ }
2696
+ }
2697
+ return result;
2698
+ },
2699
+ this.driver,
2700
+ `HeaderFilter "${this._name}" is not visible`
2701
+ );
2286
2702
  if (!headerFilterIcon)
2287
2703
  throw new Error(`HeaderFilter "${this._name}" is not visible`);
2288
2704
  await headerFilterIcon.click();
2289
- return new HeaderFilterField("", this._formName, this._name, this.driver);
2705
+ const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
2706
+ const filterEl = await filter.getElement();
2707
+ await waitElementIsVisible({
2708
+ element: filterEl,
2709
+ driver: this.driver,
2710
+ errorMessage: `Header filter is not visible`
2711
+ });
2712
+ return filter;
2290
2713
  }
2291
2714
  /**
2292
2715
  * Возвращает значение в поле
@@ -2305,9 +2728,22 @@ var init_ColumnFilter = __esm({
2305
2728
  * @example
2306
2729
  * await form.columnFilter('NumberFld').setValue(123);
2307
2730
  * await form.columnFilter('TextFld').setValue('TestValue');
2731
+ * await form.columnFilter('TextFld').setValue('TestValue', '=', true);
2308
2732
  */
2309
- async setValue(value) {
2733
+ async setValue(value, operation, isBlank) {
2310
2734
  const filter = await this.initFilter();
2735
+ const inputEl = await filter.getElement();
2736
+ await inputEl.click();
2737
+ const filterOperation = new FilterOperation({
2738
+ parentCssSelector: HEADER_FILTER_CONTAINER,
2739
+ filterTestID: createHeaderFilterTestId(this._formName, this._name)
2740
+ });
2741
+ if (typeof operation === "string") {
2742
+ await filterOperation.setOperation(operation);
2743
+ }
2744
+ if (typeof isBlank === "boolean") {
2745
+ await filterOperation.setIsBlank(isBlank);
2746
+ }
2311
2747
  await filter.setValue(value);
2312
2748
  return this.apply();
2313
2749
  }
@@ -2331,6 +2767,56 @@ var init_ColumnFilter = __esm({
2331
2767
  await filter.remove(itemText);
2332
2768
  return this.apply();
2333
2769
  }
2770
+ /**
2771
+ * Инициализация операции фильтра
2772
+ */
2773
+ async initOperation() {
2774
+ const filter = await this.initFilter();
2775
+ const inputEl = await filter.getElement();
2776
+ await inputEl.click();
2777
+ return new FilterOperation({
2778
+ parentCssSelector: HEADER_FILTER_CONTAINER,
2779
+ filterTestID: createHeaderFilterTestId(this._formName, this._name)
2780
+ });
2781
+ }
2782
+ /**
2783
+ * Устанавливает операцию для фильтра
2784
+ * @example
2785
+ * await form.columnFilter('TagBox').setOperation("=");
2786
+ */
2787
+ async setOperation(operationName) {
2788
+ const filterOperation = await this.initOperation();
2789
+ await filterOperation.setOperation(operationName);
2790
+ await this.apply();
2791
+ }
2792
+ /**
2793
+ * Возвращает операцию фильтра
2794
+ * @example
2795
+ * expect(await form.columnFilter('NumberFld').getOperation()).toBe("=");
2796
+ */
2797
+ async getOperation() {
2798
+ const filterOperation = await this.initOperation();
2799
+ return await filterOperation.getOperation();
2800
+ }
2801
+ /**
2802
+ * Устанавливает операцию 'isblank' для фильтра
2803
+ * @example
2804
+ * await form.columnFilter('TagBox').setIsBlank(true);
2805
+ */
2806
+ async setIsBlank(value) {
2807
+ const filterOperation = await this.initOperation();
2808
+ await filterOperation.setIsBlank(value);
2809
+ await this.apply();
2810
+ }
2811
+ /**
2812
+ * Возвращает true|false, если операция 'isblank' установлена для фильтра
2813
+ * @example
2814
+ * expect(await form.columnFilter('NumberFld').getIsBlank()).toBe(false);
2815
+ */
2816
+ async getIsBlank() {
2817
+ const filterOperation = await this.initOperation();
2818
+ return await filterOperation.getIsBlank();
2819
+ }
2334
2820
  };
2335
2821
  }
2336
2822
  });
@@ -2340,7 +2826,7 @@ var ListForm_exports = {};
2340
2826
  __export(ListForm_exports, {
2341
2827
  default: () => ListForm
2342
2828
  });
2343
- var DATAGRID_HEADER_CSS_SELECTOR, ListForm;
2829
+ var DATAGRID_HEADER_CSS_SELECTOR, DATAGRID_CONTENT_CSS_SELECTOR, FIXED_DATAGRID_CONTENT_CSS_SELECTOR, ListForm;
2344
2830
  var init_ListForm = __esm({
2345
2831
  "src/pageObjects/elements/Forms/ListForm.ts"() {
2346
2832
  "use strict";
@@ -2351,12 +2837,18 @@ var init_ListForm = __esm({
2351
2837
  init_FilterPanel();
2352
2838
  init_ColumnFilter();
2353
2839
  DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
2840
+ DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content:not(.dx-datagrid-content-fixed)";
2841
+ FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
2354
2842
  ListForm = class extends Form {
2355
2843
  headerCssSelector;
2844
+ fixedTableContentCssSelector;
2845
+ tableContentCssSelector;
2356
2846
  constructor(driver) {
2357
2847
  super(driver);
2358
- this.popupContainerCssSelector = `.popup .form-inline-${this.formName}`;
2848
+ this.popupContainerCssSelector = `.popup.form-inline-${this.formName}`;
2359
2849
  this.headerCssSelector = DATAGRID_HEADER_CSS_SELECTOR;
2850
+ this.fixedTableContentCssSelector = FIXED_DATAGRID_CONTENT_CSS_SELECTOR;
2851
+ this.tableContentCssSelector = DATAGRID_CONTENT_CSS_SELECTOR;
2360
2852
  }
2361
2853
  /**
2362
2854
  * Находит таблицу
@@ -2366,7 +2858,14 @@ var init_ListForm = __esm({
2366
2858
  * expect(listForm.table());
2367
2859
  */
2368
2860
  table() {
2369
- return new Table(this.containerCssSelector, this.headerCssSelector, this.formName, this.driver);
2861
+ return new Table(
2862
+ this.containerCssSelector,
2863
+ this.headerCssSelector,
2864
+ this.tableContentCssSelector,
2865
+ this.fixedTableContentCssSelector,
2866
+ this.formName,
2867
+ this.driver
2868
+ );
2370
2869
  }
2371
2870
  /**
2372
2871
  * Находит таблицу
@@ -2413,17 +2912,21 @@ var TreeView_exports = {};
2413
2912
  __export(TreeView_exports, {
2414
2913
  default: () => TreeView
2415
2914
  });
2416
- var TREELIST_HEADER_CSS_SELECTOR, TreeView;
2915
+ var TREELIST_HEADER_CSS_SELECTOR, TREELIST_CONTENT_CSS_SELECTOR, FIXED_TREELIST_CONTENT_CSS_SELECTOR, TreeView;
2417
2916
  var init_TreeView = __esm({
2418
2917
  "src/pageObjects/elements/Forms/TreeView.ts"() {
2419
2918
  "use strict";
2420
2919
  init_ListForm();
2421
2920
  TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
2921
+ TREELIST_CONTENT_CSS_SELECTOR = ".dx-treelist-content:not(.dx-datagrid-content-fixed)";
2922
+ FIXED_TREELIST_CONTENT_CSS_SELECTOR = ".dx-fixed-columns .dx-treelist-content.dx-treelist-content-fixed";
2422
2923
  TreeView = class extends ListForm {
2423
2924
  constructor(driver) {
2424
2925
  super(driver);
2425
- this.popupContainerCssSelector = `.popup .wrapper-tree-view-${this.formName}`;
2926
+ this.popupContainerCssSelector = `.popup.wrapper-tree-view-${this.formName}`;
2426
2927
  this.headerCssSelector = TREELIST_HEADER_CSS_SELECTOR;
2928
+ this.fixedTableContentCssSelector = FIXED_TREELIST_CONTENT_CSS_SELECTOR;
2929
+ this.tableContentCssSelector = TREELIST_CONTENT_CSS_SELECTOR;
2427
2930
  }
2428
2931
  };
2429
2932
  }
@@ -2463,12 +2966,12 @@ var init_createSubFormInstance = __esm({
2463
2966
  });
2464
2967
 
2465
2968
  // src/pageObjects/elements/Forms/Form.ts
2466
- var import_selenium_webdriver27, formTestId, Form;
2969
+ var import_selenium_webdriver29, formTestId, Form;
2467
2970
  var init_Form = __esm({
2468
2971
  "src/pageObjects/elements/Forms/Form.ts"() {
2469
2972
  "use strict";
2470
2973
  init_locators();
2471
- import_selenium_webdriver27 = require("selenium-webdriver");
2974
+ import_selenium_webdriver29 = require("selenium-webdriver");
2472
2975
  init_AbstractForm();
2473
2976
  init_waitElementIsVisible();
2474
2977
  init_createSubFormInstance();
@@ -2493,10 +2996,10 @@ var init_Form = __esm({
2493
2996
  */
2494
2997
  async getTitleText() {
2495
2998
  if (await this.isModal()) {
2496
- const titleEl2 = await this.driver.findElement(import_selenium_webdriver27.By.css(`${this.popupContainerCssSelector} .popup-title`));
2999
+ const titleEl2 = await this.driver.findElement(import_selenium_webdriver29.By.css(`${this.popupContainerCssSelector} .popup-title`));
2497
3000
  return titleEl2.getText();
2498
3001
  }
2499
- let titleEl = await this.driver.findElement(import_selenium_webdriver27.By.className("main-toolbar-form-title"));
3002
+ let titleEl = await this.driver.findElement(import_selenium_webdriver29.By.className("main-toolbar-form-title"));
2500
3003
  return titleEl.getText();
2501
3004
  }
2502
3005
  setSubFormMode() {
@@ -2514,7 +3017,7 @@ var init_Form = __esm({
2514
3017
  */
2515
3018
  async subForm(name) {
2516
3019
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
2517
- const byCssSelector = import_selenium_webdriver27.By.css(cssSelector);
3020
+ const byCssSelector = import_selenium_webdriver29.By.css(cssSelector);
2518
3021
  const subFormEl = await this.driver.findElement(byCssSelector);
2519
3022
  await waitElementIsVisible({
2520
3023
  element: subFormEl,
@@ -2544,21 +3047,27 @@ var FormEdit_exports = {};
2544
3047
  __export(FormEdit_exports, {
2545
3048
  default: () => FormEdit
2546
3049
  });
2547
- var import_selenium_webdriver28, FormEdit;
3050
+ var import_selenium_webdriver30, FormEdit;
2548
3051
  var init_FormEdit = __esm({
2549
3052
  "src/pageObjects/elements/Forms/FormEdit.ts"() {
2550
3053
  "use strict";
2551
3054
  init_Form();
2552
- import_selenium_webdriver28 = require("selenium-webdriver");
3055
+ import_selenium_webdriver30 = require("selenium-webdriver");
2553
3056
  init_FormField();
2554
3057
  init_actions();
2555
3058
  init_wait();
2556
3059
  FormEdit = class extends Form {
2557
- saveButtonBy = import_selenium_webdriver28.By.id("button-save");
2558
- closeButtonBy = import_selenium_webdriver28.By.id("button-cancel");
3060
+ saveButtonId = "#button-save";
3061
+ closeButtonId = "#button-cancel";
2559
3062
  constructor(driver) {
2560
3063
  super(driver);
2561
- this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
3064
+ this.popupContainerCssSelector = `.popup.form-edit-${this.formName}`;
3065
+ }
3066
+ async getButtonCssSelector(buttonId) {
3067
+ if (await this.isModal()) {
3068
+ return `${this.popupContainerCssSelector} ${buttonId}`;
3069
+ }
3070
+ return buttonId;
2562
3071
  }
2563
3072
  /**
2564
3073
  * Находит поле формы редактирования по имени
@@ -2578,7 +3087,8 @@ var init_FormEdit = __esm({
2578
3087
  * await formEdit.isSaveButtonDisabled();
2579
3088
  */
2580
3089
  async isSaveButtonDisabled() {
2581
- const saveButton = await this.driver.findElement(this.saveButtonBy);
3090
+ const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
3091
+ const saveButton = await this.driver.findElement(import_selenium_webdriver30.By.css(saveButtonCssSelector));
2582
3092
  const result = await saveButton.getAttribute("aria-disabled");
2583
3093
  return result === "true";
2584
3094
  }
@@ -2590,7 +3100,8 @@ var init_FormEdit = __esm({
2590
3100
  * await formEdit.saveButtonClick();
2591
3101
  */
2592
3102
  async saveButtonClick() {
2593
- const saveButton = await this.driver.findElement(this.saveButtonBy);
3103
+ const saveButtonCssSelector = await this.getButtonCssSelector(this.saveButtonId);
3104
+ const saveButton = await this.driver.findElement(import_selenium_webdriver30.By.css(saveButtonCssSelector));
2594
3105
  await wait(async () => !await this.isSaveButtonDisabled(), this.driver, "Button is disabled");
2595
3106
  await click(saveButton, this.driver);
2596
3107
  }
@@ -2602,7 +3113,8 @@ var init_FormEdit = __esm({
2602
3113
  * await formEdit.closeButtonClick();
2603
3114
  */
2604
3115
  async closeButtonClick() {
2605
- const closeButton = await this.driver.findElement(this.closeButtonBy);
3116
+ const closeButtonCssSelector = await this.getButtonCssSelector(this.closeButtonId);
3117
+ const closeButton = await this.driver.findElement(import_selenium_webdriver30.By.css(closeButtonCssSelector));
2606
3118
  await click(closeButton, this.driver);
2607
3119
  }
2608
3120
  };
@@ -2738,7 +3250,7 @@ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
2738
3250
  };
2739
3251
 
2740
3252
  // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
2741
- var import_selenium_webdriver15 = require("selenium-webdriver");
3253
+ var import_selenium_webdriver16 = require("selenium-webdriver");
2742
3254
  init_wait();
2743
3255
  init_locators();
2744
3256
  init_Editors();
@@ -2820,7 +3332,7 @@ var SubsystemsPanel = class extends AbstractElement {
2820
3332
  */
2821
3333
  async searchClear() {
2822
3334
  const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
2823
- const clearBtn = await this.driver.findElement(import_selenium_webdriver15.By.css(clearBtnSelector));
3335
+ const clearBtn = await this.driver.findElement(import_selenium_webdriver16.By.css(clearBtnSelector));
2824
3336
  if (await clearBtn.isDisplayed()) {
2825
3337
  await click(clearBtn, this.driver);
2826
3338
  }
@@ -2834,7 +3346,7 @@ var SubsystemsPanel = class extends AbstractElement {
2834
3346
  */
2835
3347
  item(name) {
2836
3348
  const elementCSS = createSubSystemTestId(name);
2837
- return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
3349
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver16.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
2838
3350
  }
2839
3351
  /**
2840
3352
  * Возвращает сабсистему по заголовку
@@ -2844,7 +3356,7 @@ var SubsystemsPanel = class extends AbstractElement {
2844
3356
  * const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
2845
3357
  */
2846
3358
  itemByTitle(title) {
2847
- return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(byTitleCssSelector(title)) });
3359
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver16.By.css(byTitleCssSelector(title)) });
2848
3360
  }
2849
3361
  /**
2850
3362
  * Возвращается на уровень выше по сабсистемам
@@ -2854,7 +3366,7 @@ var SubsystemsPanel = class extends AbstractElement {
2854
3366
  * wait subsystemsPanel.back();
2855
3367
  */
2856
3368
  async back() {
2857
- const backButton = this.driver.findElement(import_selenium_webdriver15.By.css(`#aside .${BACK_BUTTON_SELECTOR}`));
3369
+ const backButton = this.driver.findElement(import_selenium_webdriver16.By.css(`#aside .${BACK_BUTTON_SELECTOR}`));
2858
3370
  await waitElementIsVisible(
2859
3371
  {
2860
3372
  element: backButton,
@@ -2871,13 +3383,12 @@ init_ListForm();
2871
3383
  init_TreeView();
2872
3384
 
2873
3385
  // src/pageObjects/elements/Forms/ReportForm.ts
2874
- var import_selenium_webdriver29 = require("selenium-webdriver");
2875
3386
  init_FormEdit();
2876
3387
  var ReportForm = class extends FormEdit {
2877
3388
  constructor(driver) {
2878
3389
  super(driver);
2879
- this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
2880
- this.saveButtonBy = import_selenium_webdriver29.By.id("button-apply");
3390
+ this.popupContainerCssSelector = `.popup.form-report-${this.formName}`;
3391
+ this.saveButtonId = "#button-apply";
2881
3392
  }
2882
3393
  /**
2883
3394
  * Знаходить поле/фільтр у формі репорту за ім'ям
@@ -2900,7 +3411,7 @@ init_FilterPanel();
2900
3411
 
2901
3412
  // src/pageObjects/elements/Dialog.ts
2902
3413
  init_AbstractElement();
2903
- var import_selenium_webdriver30 = require("selenium-webdriver");
3414
+ var import_selenium_webdriver31 = require("selenium-webdriver");
2904
3415
  init_AbstractButton();
2905
3416
  var DIALOG_CLASS = ".d5-dialog";
2906
3417
  var DIALOG_TITLE_CLASS = ".dialog__title";
@@ -2915,7 +3426,7 @@ var DialogButton = class extends AbstractButton {
2915
3426
  }
2916
3427
  async getElement() {
2917
3428
  const panel = await super.getElement();
2918
- return panel.findElement(import_selenium_webdriver30.By.xpath(buttonByTextXpath2(this.text)));
3429
+ return panel.findElement(import_selenium_webdriver31.By.xpath(buttonByTextXpath2(this.text)));
2919
3430
  }
2920
3431
  buttonNotDisplayedError() {
2921
3432
  return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
@@ -2935,11 +3446,11 @@ var Dialog = class extends AbstractElement {
2935
3446
  return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
2936
3447
  }
2937
3448
  async title() {
2938
- const el = await this.driver.findElement(import_selenium_webdriver30.By.css(this.titleSelector));
3449
+ const el = await this.driver.findElement(import_selenium_webdriver31.By.css(this.titleSelector));
2939
3450
  return await el.getText();
2940
3451
  }
2941
3452
  async text() {
2942
- const el = await this.driver.findElement(import_selenium_webdriver30.By.css(this.textSelector));
3453
+ const el = await this.driver.findElement(import_selenium_webdriver31.By.css(this.textSelector));
2943
3454
  return await el.getText();
2944
3455
  }
2945
3456
  button(text) {