d5-testing-library 1.8.0-alpha.3 → 1.8.0-alpha.5

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.
@@ -0,0 +1,7 @@
1
+ import {
2
+ FormEdit
3
+ } from "./chunk-AHJAA7VV.mjs";
4
+ import "./chunk-NWVB4S3G.mjs";
5
+ export {
6
+ FormEdit as default
7
+ };
@@ -0,0 +1,7 @@
1
+ import {
2
+ ListForm
3
+ } from "./chunk-35I6E2YD.mjs";
4
+ import "./chunk-NWVB4S3G.mjs";
5
+ export {
6
+ ListForm as default
7
+ };
@@ -0,0 +1,8 @@
1
+ import {
2
+ TreeView
3
+ } from "./chunk-E4DNUJAB.mjs";
4
+ import "./chunk-35I6E2YD.mjs";
5
+ import "./chunk-NWVB4S3G.mjs";
6
+ export {
7
+ TreeView as default
8
+ };
@@ -16,7 +16,7 @@ import {
16
16
  wait,
17
17
  waitElementIsClickable,
18
18
  waitElementIsVisible
19
- } from "./chunk-F57G2ZDW.mjs";
19
+ } from "./chunk-NWVB4S3G.mjs";
20
20
 
21
21
  // src/pageObjects/elements/Table/Table.ts
22
22
  import { By as By5 } from "selenium-webdriver";
@@ -3,7 +3,7 @@ import {
3
3
  FormField,
4
4
  click,
5
5
  wait
6
- } from "./chunk-F57G2ZDW.mjs";
6
+ } from "./chunk-NWVB4S3G.mjs";
7
7
 
8
8
  // src/pageObjects/elements/Forms/FormEdit.ts
9
9
  import { By } from "selenium-webdriver";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ListForm
3
- } from "./chunk-MH6NCS6F.mjs";
3
+ } from "./chunk-35I6E2YD.mjs";
4
4
 
5
5
  // src/pageObjects/elements/Forms/TreeView.ts
6
6
  var TREELIST_HEADER_CSS_SELECTOR = ".dx-treelist-headers .dx-treelist-content:not(.dx-datagrid-content-fixed)";
@@ -262,6 +262,7 @@ var ControlClass = /* @__PURE__ */ ((ControlClass2) => {
262
262
  ControlClass2["SingleDateRange"] = "single-date-range-control";
263
263
  ControlClass2["BooleanSelector"] = "buttons-group";
264
264
  ControlClass2["ButtonGroup"] = "button-group-field";
265
+ ControlClass2["HeaderFilterDictionary"] = "header-filter-dictionary";
265
266
  return ControlClass2;
266
267
  })(ControlClass || {});
267
268
 
@@ -679,6 +680,97 @@ var DateEditor = class extends AbstractDXEditorWithInput {
679
680
  }
680
681
  };
681
682
 
683
+ // src/pageObjects/elements/Editors/HeaderFilterDictionary.ts
684
+ import { By as By11, Key as Key4 } from "selenium-webdriver";
685
+ var TAGS_SELECTOR2 = ".dx-tag .tag-text";
686
+ var DX_TAG_CONTAINER2 = "dx-tag-container";
687
+ var DX_TEXTEDITOR_EMPTY3 = "dx-texteditor-empty";
688
+ var CUSTOM_OPTION_LIST_SELECTOR = "custom-list";
689
+ var SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2 = "d5-multi-select-item";
690
+ var TAG_BOX_LIST_ITEM_SELECTOR2 = '.dx-overlay-wrapper .dx-list-item[aria-selected="true"]';
691
+ var combinedOptionHeaderFilterDictValueXpath = (value) => `//div[contains(@class, '${SELECT_BOX_OPTION_TEXT_CONTAINER_CLASS2}') and contains(text(), '${value}')]`;
692
+ var dropDownHeaderFilterDictionaryOptionClick = async (optionValue, driver, dataTEST = "", delay = true) => {
693
+ const { implicit } = await driver.manage().getTimeouts();
694
+ let optElement = null;
695
+ const timeout = delay ? implicit : 600;
696
+ let err = null;
697
+ try {
698
+ const calendarPopoverSelector = byTestIdCssSelector(`${dataTEST}`);
699
+ await driver.manage().setTimeouts({ implicit: timeout });
700
+ const calendarPopoverElement = await driver.findElement(By11.css(calendarPopoverSelector));
701
+ const customOptionList = calendarPopoverElement.findElement(By11.css(`.${CUSTOM_OPTION_LIST_SELECTOR}`));
702
+ optElement = await customOptionList.findElement(By11.xpath(combinedOptionHeaderFilterDictValueXpath(optionValue)));
703
+ await click(optElement, driver);
704
+ } catch (e) {
705
+ err = new Error(`Item not found: "${optionValue}"`);
706
+ } finally {
707
+ await driver.manage().setTimeouts({ implicit });
708
+ }
709
+ if (err)
710
+ throw err;
711
+ };
712
+ var HeaderFilterDictionary = class extends AbstractDXEditorWithInput {
713
+ constructor(parentCssSelector, elementCssSelector, driver) {
714
+ super(parentCssSelector, elementCssSelector, driver);
715
+ this.setClearStrategy(new ClearButtonStrategy(this.getFullCssSelector(), this.driver));
716
+ }
717
+ async setTagBoxInputValue(values) {
718
+ const lastElement = values[values.length - 1];
719
+ const inputEl = await this.getInputElement();
720
+ await inputEl.click();
721
+ for (const value of values) {
722
+ await this.selectOption(inputEl, value, lastElement);
723
+ }
724
+ }
725
+ async waitOptionSelection() {
726
+ await fixElementStaleError(By11.css(TAG_BOX_LIST_ITEM_SELECTOR2), this.driver);
727
+ }
728
+ async selectOption(inputEl, value, lastElement) {
729
+ try {
730
+ await inputEl.sendKeys(value);
731
+ const dataTEST = await this.getDataTestId();
732
+ await dropDownHeaderFilterDictionaryOptionClick(value, this.driver, dataTEST);
733
+ const textLength = await inputEl.getAttribute("value").then((value2) => value2.length);
734
+ for (let i = 0; i < textLength; i++) {
735
+ await inputEl.sendKeys(Key4.BACK_SPACE);
736
+ }
737
+ } catch (error) {
738
+ throw error;
739
+ }
740
+ await this.waitOptionSelection();
741
+ if (value !== lastElement) {
742
+ await inputEl.clear();
743
+ }
744
+ }
745
+ async getHeaderFilterDictionaryInputValue() {
746
+ if (await this.isHeaderFilterDictionaryEmpty()) {
747
+ return [];
748
+ }
749
+ const tags = await this.driver.findElements(
750
+ By11.css(`${this.getFullCssSelector()} .${DX_TAG_CONTAINER2} ${TAGS_SELECTOR2}`)
751
+ );
752
+ const values = [];
753
+ for (const tag of tags) {
754
+ values.push(await tag.getAttribute("textContent"));
755
+ }
756
+ return values;
757
+ }
758
+ async isHeaderFilterDictionaryEmpty() {
759
+ const classAttribute = await this.getClasses();
760
+ return classAttribute.includes(DX_TEXTEDITOR_EMPTY3);
761
+ }
762
+ async getValue() {
763
+ const value = await this.getHeaderFilterDictionaryInputValue();
764
+ return value.length ? value : null;
765
+ }
766
+ async setValue(values) {
767
+ if (!Array.isArray(values)) {
768
+ values = [values];
769
+ }
770
+ await this.setTagBoxInputValue(values);
771
+ }
772
+ };
773
+
682
774
  // src/pageObjects/elements/Editors/editorFactory.ts
683
775
  var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
684
776
  const elementInstance = new AbstractFormElement(parentCssSelector, elementCssSelector, driver);
@@ -702,6 +794,8 @@ var editorFactory = async (parentCssSelector, elementCssSelector, driver) => {
702
794
  return new BooleanSelector(parentCssSelector, elementCssSelector, driver);
703
795
  if (classSting.includes("button-group-field" /* ButtonGroup */))
704
796
  return new ButtonGroup(parentCssSelector, elementCssSelector, driver);
797
+ if (classSting.includes("header-filter-dictionary" /* HeaderFilterDictionary */))
798
+ return new HeaderFilterDictionary(parentCssSelector, elementCssSelector, driver);
705
799
  throw new Error("Unknown type of editor. Please write ticket to the support");
706
800
  };
707
801
 
@@ -736,6 +830,44 @@ function createFormButtonTestId(formName, itemName) {
736
830
  function createSubSystemTestId(itemName) {
737
831
  return `${"subsystem-item" /* SUBSYSTEM_ITEM */}-${itemName}`;
738
832
  }
833
+ function createEditorButtonTestId(itemName) {
834
+ return `${"editor-button" /* EDITOR_BUTTON */}-${itemName}`;
835
+ }
836
+
837
+ // src/utils/waitElementIsClickable.ts
838
+ async function waitElementIsClickable({
839
+ element,
840
+ timeout,
841
+ errorMessage,
842
+ driver
843
+ }) {
844
+ driver = driver ?? config().driver;
845
+ await wait(async () => {
846
+ const isDisabled = await element.getCssValue("pointer-events") === "none";
847
+ return await element.isDisplayed() && !isDisabled;
848
+ }, driver, errorMessage, timeout ?? config().timeout);
849
+ }
850
+
851
+ // src/pageObjects/elements/EditorButton.ts
852
+ var EditorButton = class extends AbstractElementWithParent {
853
+ name;
854
+ constructor(parentCssSelector, name, driver) {
855
+ super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)), driver);
856
+ this.name = name;
857
+ }
858
+ buttonNotDisplayedError() {
859
+ return `Editor Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
860
+ }
861
+ async click() {
862
+ const button = await this.getElement();
863
+ await waitElementIsClickable({
864
+ element: button,
865
+ errorMessage: this.buttonNotDisplayedError(),
866
+ driver: this.driver
867
+ });
868
+ await click(button, this.driver);
869
+ }
870
+ };
739
871
 
740
872
  // src/pageObjects/elements/AbstractEditor.ts
741
873
  var AbstractEditor = class extends AbstractElementWithParent {
@@ -802,6 +934,16 @@ var AbstractEditor = class extends AbstractElementWithParent {
802
934
  await this.initEditor();
803
935
  return this.editor.isReadonly();
804
936
  }
937
+ /**
938
+ * Находит кнопку на поле по имени
939
+ * @example
940
+ * const form= new MyForm();
941
+ * //...
942
+ * await form.field('Name').button('editorButton).click()
943
+ */
944
+ button(name) {
945
+ return new EditorButton(this.getFullCssSelector(), name, this.driver);
946
+ }
805
947
  };
806
948
 
807
949
  // src/pageObjects/elements/FormField.ts
@@ -812,21 +954,7 @@ var FormField = class extends AbstractEditor {
812
954
  };
813
955
 
814
956
  // src/pageObjects/elements/Forms/Form.ts
815
- import { By as By14 } from "selenium-webdriver";
816
-
817
- // src/utils/waitElementIsClickable.ts
818
- async function waitElementIsClickable({
819
- element,
820
- timeout,
821
- errorMessage,
822
- driver
823
- }) {
824
- driver = driver ?? config().driver;
825
- await wait(async () => {
826
- const isDisabled = await element.getCssValue("pointer-events") === "none";
827
- return await element.isDisplayed() && !isDisabled;
828
- }, driver, errorMessage, timeout ?? config().timeout);
829
- }
957
+ import { By as By15 } from "selenium-webdriver";
830
958
 
831
959
  // src/pageObjects/elements/TableToolbar/AbstractButton.ts
832
960
  var AbstractButton = class extends AbstractElementWithParent {
@@ -849,7 +977,7 @@ var AbstractButton = class extends AbstractElementWithParent {
849
977
  };
850
978
 
851
979
  // src/pageObjects/elements/DXComponents/DXButton.ts
852
- import { By as By11 } from "selenium-webdriver";
980
+ import { By as By12 } from "selenium-webdriver";
853
981
  var DXButton = class extends AbstractButton {
854
982
  async getText() {
855
983
  const classes = await this.getClasses();
@@ -857,7 +985,7 @@ var DXButton = class extends AbstractButton {
857
985
  return null;
858
986
  }
859
987
  const el = await this.getElement();
860
- const textEl = el.findElement(By11.className("dx-button-text"));
988
+ const textEl = el.findElement(By12.className("dx-button-text"));
861
989
  return await textEl.getText();
862
990
  }
863
991
  };
@@ -887,7 +1015,7 @@ var Panel = class extends AbstractGroup {
887
1015
  };
888
1016
 
889
1017
  // src/pageObjects/elements/Groups/TabPanel.ts
890
- import { By as By12 } from "selenium-webdriver";
1018
+ import { By as By13 } from "selenium-webdriver";
891
1019
  var TabPanelItem = class extends AbstractGroup {
892
1020
  constructor(parentCssSelector, elementCssSelector, driver) {
893
1021
  super(parentCssSelector, elementCssSelector, driver);
@@ -897,7 +1025,7 @@ var TabPanelItem = class extends AbstractGroup {
897
1025
  }
898
1026
  async isActive() {
899
1027
  const tabPanelItemElement = await this.getElement();
900
- const grandparentTab = await tabPanelItemElement.findElement(By12.xpath('ancestor::div[@role="tab"][1]'));
1028
+ const grandparentTab = await tabPanelItemElement.findElement(By13.xpath('ancestor::div[@role="tab"][1]'));
901
1029
  return await grandparentTab.getAttribute("aria-selected") === "true";
902
1030
  }
903
1031
  async getTitle() {
@@ -914,7 +1042,7 @@ var TabPanel = class extends AbstractGroup {
914
1042
  };
915
1043
 
916
1044
  // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
917
- import { By as By13 } from "selenium-webdriver";
1045
+ import { By as By14 } from "selenium-webdriver";
918
1046
  var ACCORDION_TITLE_CONTAINER = "accordion-title-container";
919
1047
  var AccordionItem = class extends AbstractGroup {
920
1048
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -926,7 +1054,7 @@ var AccordionItem = class extends AbstractGroup {
926
1054
  }
927
1055
  async clickAccordionItemTitle() {
928
1056
  const accordionElement = await this.getElement();
929
- const accordTitleElement = await accordionElement.findElement(By13.className(ACCORDION_TITLE_CONTAINER));
1057
+ const accordTitleElement = await accordionElement.findElement(By14.className(ACCORDION_TITLE_CONTAINER));
930
1058
  await accordTitleElement.click();
931
1059
  }
932
1060
  async click() {
@@ -1114,15 +1242,15 @@ async function classDependencyInjector(formType) {
1114
1242
  let SubFormFactoryClass;
1115
1243
  switch (formType) {
1116
1244
  case "1" /* LIST */:
1117
- SubFormFactoryClass = (await import("./ListForm-KXMIP4EA.mjs")).default;
1245
+ SubFormFactoryClass = (await import("./ListForm-2ZNDPNHK.mjs")).default;
1118
1246
  break;
1119
1247
  case "3" /* TREE */:
1120
- SubFormFactoryClass = (await import("./TreeView-5QQREFJ6.mjs")).default;
1248
+ SubFormFactoryClass = (await import("./TreeView-RSM2623Z.mjs")).default;
1121
1249
  break;
1122
1250
  case "2" /* EDIT */:
1123
1251
  case "99" /* FREE_FORM */:
1124
1252
  case "4" /* REPORT */:
1125
- SubFormFactoryClass = (await import("./FormEdit-2USHOJID.mjs")).default;
1253
+ SubFormFactoryClass = (await import("./FormEdit-TOZGO3OB.mjs")).default;
1126
1254
  break;
1127
1255
  default:
1128
1256
  throw new Error(`Unsupported form type ${formType}`);
@@ -1152,10 +1280,10 @@ var Form = class extends AbstractForm {
1152
1280
  */
1153
1281
  async getTitleText() {
1154
1282
  if (await this.isModal()) {
1155
- const titleEl2 = await this.driver.findElement(By14.css(`${this.popupContainerCssSelector} .popup-title`));
1283
+ const titleEl2 = await this.driver.findElement(By15.css(`${this.popupContainerCssSelector} .popup-title`));
1156
1284
  return titleEl2.getText();
1157
1285
  }
1158
- let titleEl = await this.driver.findElement(By14.className("main-toolbar-form-title"));
1286
+ let titleEl = await this.driver.findElement(By15.className("main-toolbar-form-title"));
1159
1287
  return titleEl.getText();
1160
1288
  }
1161
1289
  setSubFormMode() {
@@ -1173,7 +1301,7 @@ var Form = class extends AbstractForm {
1173
1301
  */
1174
1302
  async subForm(name) {
1175
1303
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
1176
- const byCssSelector = By14.css(cssSelector);
1304
+ const byCssSelector = By15.css(cssSelector);
1177
1305
  const subFormEl = await this.driver.findElement(byCssSelector);
1178
1306
  await waitElementIsVisible({
1179
1307
  element: subFormEl,
@@ -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";
@@ -1060,12 +1169,12 @@ var init_AbstractButton = __esm({
1060
1169
  });
1061
1170
 
1062
1171
  // src/pageObjects/elements/DXComponents/DXButton.ts
1063
- var import_selenium_webdriver16, DXButton;
1172
+ var import_selenium_webdriver17, DXButton;
1064
1173
  var init_DXButton = __esm({
1065
1174
  "src/pageObjects/elements/DXComponents/DXButton.ts"() {
1066
1175
  "use strict";
1067
1176
  init_AbstractButton();
1068
- import_selenium_webdriver16 = require("selenium-webdriver");
1177
+ import_selenium_webdriver17 = require("selenium-webdriver");
1069
1178
  DXButton = class extends AbstractButton {
1070
1179
  async getText() {
1071
1180
  const classes = await this.getClasses();
@@ -1073,7 +1182,7 @@ var init_DXButton = __esm({
1073
1182
  return null;
1074
1183
  }
1075
1184
  const el = await this.getElement();
1076
- const textEl = el.findElement(import_selenium_webdriver16.By.className("dx-button-text"));
1185
+ const textEl = el.findElement(import_selenium_webdriver17.By.className("dx-button-text"));
1077
1186
  return await textEl.getText();
1078
1187
  }
1079
1188
  };
@@ -1128,12 +1237,12 @@ var init_Panel = __esm({
1128
1237
  });
1129
1238
 
1130
1239
  // src/pageObjects/elements/Groups/TabPanel.ts
1131
- var import_selenium_webdriver17, TabPanelItem, TabPanel;
1240
+ var import_selenium_webdriver18, TabPanelItem, TabPanel;
1132
1241
  var init_TabPanel = __esm({
1133
1242
  "src/pageObjects/elements/Groups/TabPanel.ts"() {
1134
1243
  "use strict";
1135
1244
  init_AbstractGroup();
1136
- import_selenium_webdriver17 = require("selenium-webdriver");
1245
+ import_selenium_webdriver18 = require("selenium-webdriver");
1137
1246
  init_actions();
1138
1247
  TabPanelItem = class extends AbstractGroup {
1139
1248
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -1144,7 +1253,7 @@ var init_TabPanel = __esm({
1144
1253
  }
1145
1254
  async isActive() {
1146
1255
  const tabPanelItemElement = await this.getElement();
1147
- const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver17.By.xpath('ancestor::div[@role="tab"][1]'));
1256
+ const grandparentTab = await tabPanelItemElement.findElement(import_selenium_webdriver18.By.xpath('ancestor::div[@role="tab"][1]'));
1148
1257
  return await grandparentTab.getAttribute("aria-selected") === "true";
1149
1258
  }
1150
1259
  async getTitle() {
@@ -1163,12 +1272,12 @@ var init_TabPanel = __esm({
1163
1272
  });
1164
1273
 
1165
1274
  // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
1166
- var import_selenium_webdriver18, ACCORDION_TITLE_CONTAINER, AccordionItem;
1275
+ var import_selenium_webdriver19, ACCORDION_TITLE_CONTAINER, AccordionItem;
1167
1276
  var init_AccordionItem = __esm({
1168
1277
  "src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
1169
1278
  "use strict";
1170
1279
  init_AbstractGroup();
1171
- import_selenium_webdriver18 = require("selenium-webdriver");
1280
+ import_selenium_webdriver19 = require("selenium-webdriver");
1172
1281
  init_actions();
1173
1282
  ACCORDION_TITLE_CONTAINER = "accordion-title-container";
1174
1283
  AccordionItem = class extends AbstractGroup {
@@ -1181,7 +1290,7 @@ var init_AccordionItem = __esm({
1181
1290
  }
1182
1291
  async clickAccordionItemTitle() {
1183
1292
  const accordionElement = await this.getElement();
1184
- const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver18.By.className(ACCORDION_TITLE_CONTAINER));
1293
+ const accordTitleElement = await accordionElement.findElement(import_selenium_webdriver19.By.className(ACCORDION_TITLE_CONTAINER));
1185
1294
  await accordTitleElement.click();
1186
1295
  }
1187
1296
  async click() {
@@ -1416,11 +1525,11 @@ function getCssRowByIndexSelector(index) {
1416
1525
  function getCssCellByIndexSelector(index) {
1417
1526
  return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
1418
1527
  }
1419
- var import_selenium_webdriver19, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1528
+ var import_selenium_webdriver20, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1420
1529
  var init_utils2 = __esm({
1421
1530
  "src/pageObjects/elements/Table/utils.ts"() {
1422
1531
  "use strict";
1423
- import_selenium_webdriver19 = require("selenium-webdriver");
1532
+ import_selenium_webdriver20 = require("selenium-webdriver");
1424
1533
  getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
1425
1534
  getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
1426
1535
  getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
@@ -1437,11 +1546,11 @@ var init_types3 = __esm({
1437
1546
  });
1438
1547
 
1439
1548
  // src/pageObjects/elements/Table/elements/Cell.ts
1440
- var import_selenium_webdriver20, Cell;
1549
+ var import_selenium_webdriver21, Cell;
1441
1550
  var init_Cell = __esm({
1442
1551
  "src/pageObjects/elements/Table/elements/Cell.ts"() {
1443
1552
  "use strict";
1444
- import_selenium_webdriver20 = require("selenium-webdriver");
1553
+ import_selenium_webdriver21 = require("selenium-webdriver");
1445
1554
  init_AbstractElementWithParent();
1446
1555
  init_utils2();
1447
1556
  init_types3();
@@ -1458,12 +1567,12 @@ var init_Cell = __esm({
1458
1567
  this.elementCssSelector = getCssCellByIndexSelector(index);
1459
1568
  }
1460
1569
  async getBooleanValue(cellEl) {
1461
- const booleanEl = await cellEl.findElement(import_selenium_webdriver20.By.className("boolean-widget"));
1570
+ const booleanEl = await cellEl.findElement(import_selenium_webdriver21.By.className("boolean-widget"));
1462
1571
  return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
1463
1572
  }
1464
1573
  async getTagsValue(cellEl) {
1465
1574
  const tagsCssSelector = ".multiselect-container .multiselect-cell";
1466
- const tags = await cellEl.findElements(import_selenium_webdriver20.By.css(tagsCssSelector));
1575
+ const tags = await cellEl.findElements(import_selenium_webdriver21.By.css(tagsCssSelector));
1467
1576
  const values = [];
1468
1577
  for (const tag of tags) {
1469
1578
  values.push(await tag.getAttribute("textContent"));
@@ -1493,11 +1602,11 @@ var init_Cell = __esm({
1493
1602
  });
1494
1603
 
1495
1604
  // src/pageObjects/elements/Table/elements/Row.ts
1496
- var import_selenium_webdriver21, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
1605
+ var import_selenium_webdriver22, DX_SELECTION_CLASS, DX_ROW_EDIT_CLASS, DX_DATA_ROW_CLASS, Row;
1497
1606
  var init_Row = __esm({
1498
1607
  "src/pageObjects/elements/Table/elements/Row.ts"() {
1499
1608
  "use strict";
1500
- import_selenium_webdriver21 = require("selenium-webdriver");
1609
+ import_selenium_webdriver22 = require("selenium-webdriver");
1501
1610
  init_Cell();
1502
1611
  init_utils2();
1503
1612
  init_AbstractElementWithParent();
@@ -1556,7 +1665,7 @@ var init_Row = __esm({
1556
1665
  return this.index;
1557
1666
  }
1558
1667
  async getCells() {
1559
- const cells = await this.driver.findElements(import_selenium_webdriver21.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1668
+ const cells = await this.driver.findElements(import_selenium_webdriver22.By.css(`${this.getFullCssSelector()} td[role="gridcell"]`));
1560
1669
  const result = [];
1561
1670
  cells.forEach((_, index) => {
1562
1671
  const newCell = this.getCellByIndex(index);
@@ -1569,7 +1678,7 @@ var init_Row = __esm({
1569
1678
  this.index
1570
1679
  )}"] .${buttonClass}`;
1571
1680
  const button = await fixElementStaleError(
1572
- import_selenium_webdriver21.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`),
1681
+ import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`),
1573
1682
  this.driver
1574
1683
  );
1575
1684
  return click(button, this.driver);
@@ -1600,11 +1709,11 @@ var init_Row = __esm({
1600
1709
  });
1601
1710
 
1602
1711
  // src/pageObjects/elements/Table/elements/Column.ts
1603
- var import_selenium_webdriver22, Column;
1712
+ var import_selenium_webdriver23, Column;
1604
1713
  var init_Column = __esm({
1605
1714
  "src/pageObjects/elements/Table/elements/Column.ts"() {
1606
1715
  "use strict";
1607
- import_selenium_webdriver22 = require("selenium-webdriver");
1716
+ import_selenium_webdriver23 = require("selenium-webdriver");
1608
1717
  init_utils2();
1609
1718
  init_AbstractElementWithParent();
1610
1719
  init_fixElementStaleError();
@@ -1632,7 +1741,7 @@ var init_Column = __esm({
1632
1741
  return super.getElement();
1633
1742
  }
1634
1743
  async getColumnHeaderIndexBy(cssSelector) {
1635
- const column = await fixElementStaleError(import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
1744
+ const column = await fixElementStaleError(import_selenium_webdriver23.By.css(`${this.parentCssSelector} ${this.headerCssSelector} ${cssSelector}`), this.driver);
1636
1745
  return transformOutputIndex(await column.getAttribute("aria-colindex"));
1637
1746
  }
1638
1747
  async getIndexByCaption() {
@@ -1663,6 +1772,38 @@ var init_Column = __esm({
1663
1772
  }
1664
1773
  });
1665
1774
 
1775
+ // src/pageObjects/elements/EditorButton.ts
1776
+ var EditorButton;
1777
+ var init_EditorButton = __esm({
1778
+ "src/pageObjects/elements/EditorButton.ts"() {
1779
+ "use strict";
1780
+ init_locators();
1781
+ init_createDataTestId();
1782
+ init_AbstractElementWithParent();
1783
+ init_waitElementIsClickable();
1784
+ init_actions();
1785
+ EditorButton = class extends AbstractElementWithParent {
1786
+ name;
1787
+ constructor(parentCssSelector, name, driver) {
1788
+ super(parentCssSelector, byTestIdCssSelector(createEditorButtonTestId(name)), driver);
1789
+ this.name = name;
1790
+ }
1791
+ buttonNotDisplayedError() {
1792
+ return `Editor Button ${this.name} cannot be clicked. It is not displayed or it is disabled`;
1793
+ }
1794
+ async click() {
1795
+ const button = await this.getElement();
1796
+ await waitElementIsClickable({
1797
+ element: button,
1798
+ errorMessage: this.buttonNotDisplayedError(),
1799
+ driver: this.driver
1800
+ });
1801
+ await click(button, this.driver);
1802
+ }
1803
+ };
1804
+ }
1805
+ });
1806
+
1666
1807
  // src/pageObjects/elements/AbstractEditor.ts
1667
1808
  var AbstractEditor;
1668
1809
  var init_AbstractEditor2 = __esm({
@@ -1670,6 +1811,7 @@ var init_AbstractEditor2 = __esm({
1670
1811
  "use strict";
1671
1812
  init_AbstractElementWithParent();
1672
1813
  init_Editors();
1814
+ init_EditorButton();
1673
1815
  AbstractEditor = class extends AbstractElementWithParent {
1674
1816
  editor;
1675
1817
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -1734,6 +1876,16 @@ var init_AbstractEditor2 = __esm({
1734
1876
  await this.initEditor();
1735
1877
  return this.editor.isReadonly();
1736
1878
  }
1879
+ /**
1880
+ * Находит кнопку на поле по имени
1881
+ * @example
1882
+ * const form= new MyForm();
1883
+ * //...
1884
+ * await form.field('Name').button('editorButton).click()
1885
+ */
1886
+ button(name) {
1887
+ return new EditorButton(this.getFullCssSelector(), name, this.driver);
1888
+ }
1737
1889
  };
1738
1890
  }
1739
1891
  });
@@ -1755,11 +1907,11 @@ var init_FormField = __esm({
1755
1907
  });
1756
1908
 
1757
1909
  // src/pageObjects/elements/Table/Table.ts
1758
- var import_selenium_webdriver23, Table;
1910
+ var import_selenium_webdriver24, Table;
1759
1911
  var init_Table = __esm({
1760
1912
  "src/pageObjects/elements/Table/Table.ts"() {
1761
1913
  "use strict";
1762
- import_selenium_webdriver23 = require("selenium-webdriver");
1914
+ import_selenium_webdriver24 = require("selenium-webdriver");
1763
1915
  init_createDataTestId();
1764
1916
  init_AbstractElementWithParent();
1765
1917
  init_Row();
@@ -1811,7 +1963,7 @@ var init_Table = __esm({
1811
1963
  return this.getRowByIndex(index).select();
1812
1964
  }
1813
1965
  async getRows() {
1814
- const rows = await this.driver.findElements(import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1966
+ const rows = await this.driver.findElements(import_selenium_webdriver24.By.css(`${this.getFullCssSelector()} .dx-row.dx-data-row`));
1815
1967
  const result = [];
1816
1968
  rows.forEach((_, index) => {
1817
1969
  const newRow = new Row(
@@ -1827,7 +1979,7 @@ var init_Table = __esm({
1827
1979
  }
1828
1980
  async getColumns() {
1829
1981
  const columns = await this.driver.findElements(
1830
- import_selenium_webdriver23.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1982
+ import_selenium_webdriver24.By.css(`${this.getFullCssSelector()} ${this.headerCssSelector} td[role="columnheader"]`)
1831
1983
  );
1832
1984
  const result = [];
1833
1985
  columns.forEach((_, index) => {
@@ -1922,11 +2074,11 @@ var init_typesUtil = __esm({
1922
2074
  });
1923
2075
 
1924
2076
  // src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
1925
- var import_selenium_webdriver24, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
2077
+ var import_selenium_webdriver25, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
1926
2078
  var init_ToolbarMenu = __esm({
1927
2079
  "src/pageObjects/elements/TableToolbar/ToolbarMenu.ts"() {
1928
2080
  "use strict";
1929
- import_selenium_webdriver24 = require("selenium-webdriver");
2081
+ import_selenium_webdriver25 = require("selenium-webdriver");
1930
2082
  init_typesUtil();
1931
2083
  init_AbstractElementWithParent();
1932
2084
  init_locators();
@@ -1977,7 +2129,7 @@ var init_ToolbarMenu = __esm({
1977
2129
  throw new Error(`"title" must be a string or array of string`);
1978
2130
  let lTitle = isString(title) ? [title] : title;
1979
2131
  for (let t of lTitle) {
1980
- await this.goToButton(t, import_selenium_webdriver24.By.xpath(buttonByTextXpath(t)));
2132
+ await this.goToButton(t, import_selenium_webdriver25.By.xpath(buttonByTextXpath(t)));
1981
2133
  }
1982
2134
  }
1983
2135
  };
@@ -2052,11 +2204,11 @@ var init_FormToolbar = __esm({
2052
2204
  });
2053
2205
 
2054
2206
  // src/pageObjects/elements/Filters/FilterOperation.ts
2055
- var import_selenium_webdriver25, FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
2207
+ var import_selenium_webdriver26, FILTER_OPERATIONS, BUTTON_OPERATION_WIDGET, OPERATIONS_WIDGET_POPUP, getWidgetInPopupSelector, FilterOperation;
2056
2208
  var init_FilterOperation = __esm({
2057
2209
  "src/pageObjects/elements/Filters/FilterOperation.ts"() {
2058
2210
  "use strict";
2059
- import_selenium_webdriver25 = require("selenium-webdriver");
2211
+ import_selenium_webdriver26 = require("selenium-webdriver");
2060
2212
  init_fixElementStaleError();
2061
2213
  init_AbstractElementWithParent();
2062
2214
  init_locators();
@@ -2096,10 +2248,10 @@ var init_FilterOperation = __esm({
2096
2248
  errorMessage: "Widget operation is not clickable",
2097
2249
  driver: this.driver
2098
2250
  });
2099
- const clickableElement = await widgetButtonEl.findElement(import_selenium_webdriver25.By.className("dx-icon"));
2251
+ const clickableElement = await widgetButtonEl.findElement(import_selenium_webdriver26.By.className("dx-icon"));
2100
2252
  await click(clickableElement, this.driver);
2101
2253
  try {
2102
- const widgetPopupEl = await this.driver.findElement(import_selenium_webdriver25.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
2254
+ const widgetPopupEl = await this.driver.findElement(import_selenium_webdriver26.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)}`));
2103
2255
  await waitElementIsVisible({
2104
2256
  element: widgetPopupEl,
2105
2257
  errorMessage: `Operation widget popup is not visible`,
@@ -2114,7 +2266,7 @@ var init_FilterOperation = __esm({
2114
2266
  throw new Error(`Operation with name "${operationName}" is not correct.`);
2115
2267
  }
2116
2268
  await this.initOperationWidget();
2117
- const operationEl = await fixElementStaleError(import_selenium_webdriver25.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)} ${getWidgetInPopupSelector(operationName)}`), this.driver);
2269
+ const operationEl = await fixElementStaleError(import_selenium_webdriver26.By.css(`${byTestIdCssSelector(`${OPERATIONS_WIDGET_POPUP}-${this._testId}`)} ${getWidgetInPopupSelector(operationName)}`), this.driver);
2118
2270
  await click(operationEl, this.driver);
2119
2271
  await wait(
2120
2272
  async () => {
@@ -2356,11 +2508,11 @@ var init_PanelFilterField = __esm({
2356
2508
  });
2357
2509
 
2358
2510
  // src/pageObjects/elements/Filters/FilterPanel.ts
2359
- var import_selenium_webdriver26, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2511
+ var import_selenium_webdriver27, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2360
2512
  var init_FilterPanel = __esm({
2361
2513
  "src/pageObjects/elements/Filters/FilterPanel.ts"() {
2362
2514
  "use strict";
2363
- import_selenium_webdriver26 = require("selenium-webdriver");
2515
+ import_selenium_webdriver27 = require("selenium-webdriver");
2364
2516
  init_AbstractElement();
2365
2517
  init_PanelFilterField();
2366
2518
  init_actions();
@@ -2375,7 +2527,7 @@ var init_FilterPanel = __esm({
2375
2527
  async filterPanelButtons() {
2376
2528
  const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
2377
2529
  const el = await this.getElement();
2378
- return el.findElements(import_selenium_webdriver26.By.css(selector));
2530
+ return el.findElements(import_selenium_webdriver27.By.css(selector));
2379
2531
  }
2380
2532
  constructor(formName, driver) {
2381
2533
  super(driver, drawerSelector(formName));
@@ -2408,7 +2560,7 @@ var init_FilterPanel = __esm({
2408
2560
  await this.driver.sleep(300);
2409
2561
  }
2410
2562
  async close() {
2411
- const btn = await this.driver.findElement(import_selenium_webdriver26.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2563
+ const btn = await this.driver.findElement(import_selenium_webdriver27.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2412
2564
  await click(btn, this.driver);
2413
2565
  }
2414
2566
  };
@@ -2444,12 +2596,12 @@ var init_HeaderFilterField = __esm({
2444
2596
  });
2445
2597
 
2446
2598
  // src/pageObjects/elements/Filters/ColumnFilter.ts
2447
- var import_selenium_webdriver27, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
2599
+ var import_selenium_webdriver28, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
2448
2600
  var init_ColumnFilter = __esm({
2449
2601
  "src/pageObjects/elements/Filters/ColumnFilter.ts"() {
2450
2602
  "use strict";
2451
2603
  init_actions();
2452
- import_selenium_webdriver27 = require("selenium-webdriver");
2604
+ import_selenium_webdriver28 = require("selenium-webdriver");
2453
2605
  init_HeaderFilterField();
2454
2606
  init_waitElementIsVisible();
2455
2607
  init_AbstractElement();
@@ -2474,11 +2626,11 @@ var init_ColumnFilter = __esm({
2474
2626
  }
2475
2627
  async getApplyButton() {
2476
2628
  const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
2477
- return this.driver.findElement(import_selenium_webdriver27.By.css(selector));
2629
+ return this.driver.findElement(import_selenium_webdriver28.By.css(selector));
2478
2630
  }
2479
2631
  async getCancelButton() {
2480
2632
  const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
2481
- return this.driver.findElement(import_selenium_webdriver27.By.css(selector));
2633
+ return this.driver.findElement(import_selenium_webdriver28.By.css(selector));
2482
2634
  }
2483
2635
  async apply() {
2484
2636
  const btn = await this.getApplyButton();
@@ -2492,7 +2644,7 @@ var init_ColumnFilter = __esm({
2492
2644
  const columnEl = await this._column.getElement();
2493
2645
  const actions = this.driver.actions({ async: true });
2494
2646
  await actions.move({ origin: columnEl }).perform();
2495
- const elements = await columnEl.findElements(import_selenium_webdriver27.By.css(HEADER_FILTER_ICON));
2647
+ const elements = await columnEl.findElements(import_selenium_webdriver28.By.css(HEADER_FILTER_ICON));
2496
2648
  let headerFilterIcon = null;
2497
2649
  await wait(
2498
2650
  async () => {
@@ -2737,12 +2889,12 @@ var init_createSubFormInstance = __esm({
2737
2889
  });
2738
2890
 
2739
2891
  // src/pageObjects/elements/Forms/Form.ts
2740
- var import_selenium_webdriver28, formTestId, Form;
2892
+ var import_selenium_webdriver29, formTestId, Form;
2741
2893
  var init_Form = __esm({
2742
2894
  "src/pageObjects/elements/Forms/Form.ts"() {
2743
2895
  "use strict";
2744
2896
  init_locators();
2745
- import_selenium_webdriver28 = require("selenium-webdriver");
2897
+ import_selenium_webdriver29 = require("selenium-webdriver");
2746
2898
  init_AbstractForm();
2747
2899
  init_waitElementIsVisible();
2748
2900
  init_createSubFormInstance();
@@ -2767,10 +2919,10 @@ var init_Form = __esm({
2767
2919
  */
2768
2920
  async getTitleText() {
2769
2921
  if (await this.isModal()) {
2770
- const titleEl2 = await this.driver.findElement(import_selenium_webdriver28.By.css(`${this.popupContainerCssSelector} .popup-title`));
2922
+ const titleEl2 = await this.driver.findElement(import_selenium_webdriver29.By.css(`${this.popupContainerCssSelector} .popup-title`));
2771
2923
  return titleEl2.getText();
2772
2924
  }
2773
- let titleEl = await this.driver.findElement(import_selenium_webdriver28.By.className("main-toolbar-form-title"));
2925
+ let titleEl = await this.driver.findElement(import_selenium_webdriver29.By.className("main-toolbar-form-title"));
2774
2926
  return titleEl.getText();
2775
2927
  }
2776
2928
  setSubFormMode() {
@@ -2788,7 +2940,7 @@ var init_Form = __esm({
2788
2940
  */
2789
2941
  async subForm(name) {
2790
2942
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
2791
- const byCssSelector = import_selenium_webdriver28.By.css(cssSelector);
2943
+ const byCssSelector = import_selenium_webdriver29.By.css(cssSelector);
2792
2944
  const subFormEl = await this.driver.findElement(byCssSelector);
2793
2945
  await waitElementIsVisible({
2794
2946
  element: subFormEl,
@@ -2818,18 +2970,18 @@ var FormEdit_exports = {};
2818
2970
  __export(FormEdit_exports, {
2819
2971
  default: () => FormEdit
2820
2972
  });
2821
- var import_selenium_webdriver29, FormEdit;
2973
+ var import_selenium_webdriver30, FormEdit;
2822
2974
  var init_FormEdit = __esm({
2823
2975
  "src/pageObjects/elements/Forms/FormEdit.ts"() {
2824
2976
  "use strict";
2825
2977
  init_Form();
2826
- import_selenium_webdriver29 = require("selenium-webdriver");
2978
+ import_selenium_webdriver30 = require("selenium-webdriver");
2827
2979
  init_FormField();
2828
2980
  init_actions();
2829
2981
  init_wait();
2830
2982
  FormEdit = class extends Form {
2831
- saveButtonBy = import_selenium_webdriver29.By.id("button-save");
2832
- closeButtonBy = import_selenium_webdriver29.By.id("button-cancel");
2983
+ saveButtonBy = import_selenium_webdriver30.By.id("button-save");
2984
+ closeButtonBy = import_selenium_webdriver30.By.id("button-cancel");
2833
2985
  constructor(driver) {
2834
2986
  super(driver);
2835
2987
  this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
@@ -3012,7 +3164,7 @@ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
3012
3164
  };
3013
3165
 
3014
3166
  // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
3015
- var import_selenium_webdriver15 = require("selenium-webdriver");
3167
+ var import_selenium_webdriver16 = require("selenium-webdriver");
3016
3168
  init_wait();
3017
3169
  init_locators();
3018
3170
  init_Editors();
@@ -3094,7 +3246,7 @@ var SubsystemsPanel = class extends AbstractElement {
3094
3246
  */
3095
3247
  async searchClear() {
3096
3248
  const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
3097
- const clearBtn = await this.driver.findElement(import_selenium_webdriver15.By.css(clearBtnSelector));
3249
+ const clearBtn = await this.driver.findElement(import_selenium_webdriver16.By.css(clearBtnSelector));
3098
3250
  if (await clearBtn.isDisplayed()) {
3099
3251
  await click(clearBtn, this.driver);
3100
3252
  }
@@ -3108,7 +3260,7 @@ var SubsystemsPanel = class extends AbstractElement {
3108
3260
  */
3109
3261
  item(name) {
3110
3262
  const elementCSS = createSubSystemTestId(name);
3111
- return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
3263
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver16.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
3112
3264
  }
3113
3265
  /**
3114
3266
  * Возвращает сабсистему по заголовку
@@ -3118,7 +3270,7 @@ var SubsystemsPanel = class extends AbstractElement {
3118
3270
  * const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
3119
3271
  */
3120
3272
  itemByTitle(title) {
3121
- return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(byTitleCssSelector(title)) });
3273
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver16.By.css(byTitleCssSelector(title)) });
3122
3274
  }
3123
3275
  /**
3124
3276
  * Возвращается на уровень выше по сабсистемам
@@ -3128,7 +3280,7 @@ var SubsystemsPanel = class extends AbstractElement {
3128
3280
  * wait subsystemsPanel.back();
3129
3281
  */
3130
3282
  async back() {
3131
- const backButton = this.driver.findElement(import_selenium_webdriver15.By.css(`#aside .${BACK_BUTTON_SELECTOR}`));
3283
+ const backButton = this.driver.findElement(import_selenium_webdriver16.By.css(`#aside .${BACK_BUTTON_SELECTOR}`));
3132
3284
  await waitElementIsVisible(
3133
3285
  {
3134
3286
  element: backButton,
@@ -3145,13 +3297,13 @@ init_ListForm();
3145
3297
  init_TreeView();
3146
3298
 
3147
3299
  // src/pageObjects/elements/Forms/ReportForm.ts
3148
- var import_selenium_webdriver30 = require("selenium-webdriver");
3300
+ var import_selenium_webdriver31 = require("selenium-webdriver");
3149
3301
  init_FormEdit();
3150
3302
  var ReportForm = class extends FormEdit {
3151
3303
  constructor(driver) {
3152
3304
  super(driver);
3153
3305
  this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
3154
- this.saveButtonBy = import_selenium_webdriver30.By.id("button-apply");
3306
+ this.saveButtonBy = import_selenium_webdriver31.By.id("button-apply");
3155
3307
  }
3156
3308
  /**
3157
3309
  * Знаходить поле/фільтр у формі репорту за ім'ям
@@ -3174,7 +3326,7 @@ init_FilterPanel();
3174
3326
 
3175
3327
  // src/pageObjects/elements/Dialog.ts
3176
3328
  init_AbstractElement();
3177
- var import_selenium_webdriver31 = require("selenium-webdriver");
3329
+ var import_selenium_webdriver32 = require("selenium-webdriver");
3178
3330
  init_AbstractButton();
3179
3331
  var DIALOG_CLASS = ".d5-dialog";
3180
3332
  var DIALOG_TITLE_CLASS = ".dialog__title";
@@ -3189,7 +3341,7 @@ var DialogButton = class extends AbstractButton {
3189
3341
  }
3190
3342
  async getElement() {
3191
3343
  const panel = await super.getElement();
3192
- return panel.findElement(import_selenium_webdriver31.By.xpath(buttonByTextXpath2(this.text)));
3344
+ return panel.findElement(import_selenium_webdriver32.By.xpath(buttonByTextXpath2(this.text)));
3193
3345
  }
3194
3346
  buttonNotDisplayedError() {
3195
3347
  return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
@@ -3209,11 +3361,11 @@ var Dialog = class extends AbstractElement {
3209
3361
  return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
3210
3362
  }
3211
3363
  async title() {
3212
- const el = await this.driver.findElement(import_selenium_webdriver31.By.css(this.titleSelector));
3364
+ const el = await this.driver.findElement(import_selenium_webdriver32.By.css(this.titleSelector));
3213
3365
  return await el.getText();
3214
3366
  }
3215
3367
  async text() {
3216
- const el = await this.driver.findElement(import_selenium_webdriver31.By.css(this.textSelector));
3368
+ const el = await this.driver.findElement(import_selenium_webdriver32.By.css(this.textSelector));
3217
3369
  return await el.getText();
3218
3370
  }
3219
3371
  button(text) {
@@ -138,7 +138,8 @@ declare enum ControlClass {
138
138
  Date = "date-control",
139
139
  SingleDateRange = "single-date-range-control",
140
140
  BooleanSelector = "buttons-group",
141
- ButtonGroup = "button-group-field"
141
+ ButtonGroup = "button-group-field",
142
+ HeaderFilterDictionary = "header-filter-dictionary"
142
143
  }
143
144
 
144
145
  interface ClearStrategy {
@@ -350,6 +351,13 @@ declare abstract class Form extends AbstractForm {
350
351
  subForm(name: string): Promise<unknown>;
351
352
  }
352
353
 
354
+ declare class EditorButton extends AbstractElementWithParent {
355
+ private readonly name;
356
+ constructor(parentCssSelector: string, name: string, driver?: WebDriver);
357
+ protected buttonNotDisplayedError(): string;
358
+ click(): Promise<void>;
359
+ }
360
+
353
361
  declare class AbstractEditor extends AbstractElementWithParent implements Editor {
354
362
  protected editor: Editor;
355
363
  constructor(parentCssSelector: string, elementCssSelector: string, driver?: WebDriver);
@@ -387,6 +395,14 @@ declare class AbstractEditor extends AbstractElementWithParent implements Editor
387
395
  * expect(await formEdit.field('TextFld').isReadonly()).toBe(false);
388
396
  */
389
397
  isReadonly(): Promise<boolean>;
398
+ /**
399
+ * Находит кнопку на поле по имени
400
+ * @example
401
+ * const form= new MyForm();
402
+ * //...
403
+ * await form.field('Name').button('editorButton).click()
404
+ */
405
+ button(name: string): EditorButton;
390
406
  }
391
407
 
392
408
  declare class FormField extends AbstractEditor {
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  TreeView
3
- } from "./chunk-R25O5O4T.mjs";
3
+ } from "./chunk-E4DNUJAB.mjs";
4
4
  import {
5
5
  FilterPanel,
6
6
  FormFilterField,
7
7
  ListForm,
8
8
  PanelFilterField
9
- } from "./chunk-MH6NCS6F.mjs";
9
+ } from "./chunk-35I6E2YD.mjs";
10
10
  import {
11
11
  FormEdit
12
- } from "./chunk-2DQ5YCRB.mjs";
12
+ } from "./chunk-AHJAA7VV.mjs";
13
13
  import {
14
14
  AbstractButton,
15
15
  AbstractElement,
@@ -30,7 +30,7 @@ import {
30
30
  readonlyLocator,
31
31
  wait,
32
32
  waitElementIsVisible
33
- } from "./chunk-F57G2ZDW.mjs";
33
+ } from "./chunk-NWVB4S3G.mjs";
34
34
 
35
35
  // src/pageObjects/pages/LoginPage.ts
36
36
  var LOGIN_PATH = "/login";
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  TreeView
3
- } from "./chunk-R25O5O4T.mjs";
3
+ } from "./chunk-E4DNUJAB.mjs";
4
4
  import {
5
5
  FilterPanel,
6
6
  FormFilterField,
7
7
  ListForm,
8
8
  PanelFilterField
9
- } from "./chunk-MH6NCS6F.mjs";
9
+ } from "./chunk-35I6E2YD.mjs";
10
10
  import {
11
11
  FormEdit
12
- } from "./chunk-2DQ5YCRB.mjs";
12
+ } from "./chunk-AHJAA7VV.mjs";
13
13
  import {
14
14
  AbstractButton,
15
15
  AbstractElement,
@@ -30,7 +30,7 @@ import {
30
30
  readonlyLocator,
31
31
  wait,
32
32
  waitElementIsVisible
33
- } from "./chunk-F57G2ZDW.mjs";
33
+ } from "./chunk-NWVB4S3G.mjs";
34
34
 
35
35
  // src/pageObjects/pages/LoginPage.ts
36
36
  var LOGIN_PATH = "/login";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "d5-testing-library",
3
- "version": "1.8.0-alpha.3",
3
+ "version": "1.8.0-alpha.5",
4
4
  "description": "e2e testing D5 projects",
5
5
  "main": "dist/cjs/d5-testing-library.cjs",
6
6
  "module": "dist/d5-testing-library.legacy-esm.js",
@@ -1,7 +0,0 @@
1
- import {
2
- FormEdit
3
- } from "./chunk-2DQ5YCRB.mjs";
4
- import "./chunk-F57G2ZDW.mjs";
5
- export {
6
- FormEdit as default
7
- };
@@ -1,7 +0,0 @@
1
- import {
2
- ListForm
3
- } from "./chunk-MH6NCS6F.mjs";
4
- import "./chunk-F57G2ZDW.mjs";
5
- export {
6
- ListForm as default
7
- };
@@ -1,8 +0,0 @@
1
- import {
2
- TreeView
3
- } from "./chunk-R25O5O4T.mjs";
4
- import "./chunk-MH6NCS6F.mjs";
5
- import "./chunk-F57G2ZDW.mjs";
6
- export {
7
- TreeView as default
8
- };