d5-testing-library 1.8.0-alpha.4 → 1.8.0-alpha.6

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-I57KZIU6.mjs";
4
+ import "./chunk-SPTTRJJ4.mjs";
5
+ export {
6
+ FormEdit as default
7
+ };
@@ -0,0 +1,7 @@
1
+ import {
2
+ ListForm
3
+ } from "./chunk-COFCOE45.mjs";
4
+ import "./chunk-SPTTRJJ4.mjs";
5
+ export {
6
+ ListForm as default
7
+ };
@@ -0,0 +1,8 @@
1
+ import {
2
+ TreeView
3
+ } from "./chunk-TCNJHKZT.mjs";
4
+ import "./chunk-COFCOE45.mjs";
5
+ import "./chunk-SPTTRJJ4.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-JGX24TXO.mjs";
19
+ } from "./chunk-SPTTRJJ4.mjs";
20
20
 
21
21
  // src/pageObjects/elements/Table/Table.ts
22
22
  import { By as By5 } from "selenium-webdriver";
@@ -586,8 +586,15 @@ var FormFilterField = class extends AbstractEditor {
586
586
  * @example
587
587
  * await form.formFilter('NumberFld').setValue(123);
588
588
  * await form.formFilter('TextFld').setValue('TestValue');
589
+ * await form.formFilter('TextFld').setValue('TestValue', '=', true);
589
590
  */
590
- async setValue(value) {
591
+ async setValue(value, operation, isBlank) {
592
+ if (typeof operation === "string") {
593
+ await this.setOperation(operation);
594
+ }
595
+ if (typeof isBlank === "boolean") {
596
+ await this.setIsBlank(isBlank);
597
+ }
591
598
  return super.setValue(value);
592
599
  }
593
600
  /**
@@ -679,8 +686,15 @@ var PanelFilterField = class extends AbstractEditor {
679
686
  * @example
680
687
  * await form.filterPanel.filterField('NumberFld').setValue(123);
681
688
  * await form.filterPanel.filterField('TextFld').setValue('TestValue');
689
+ * await form.filterPanel.filterField('TextFld').setValue('TestValue', '=', true);
682
690
  */
683
- async setValue(value) {
691
+ async setValue(value, operation, isBlank) {
692
+ if (typeof operation === "string") {
693
+ await this.setOperation(operation);
694
+ }
695
+ if (typeof isBlank === "boolean") {
696
+ await this.setIsBlank(isBlank);
697
+ }
684
698
  return super.setValue(value);
685
699
  }
686
700
  /**
@@ -901,9 +915,22 @@ var ColumnFilter = class extends AbstractElement {
901
915
  * @example
902
916
  * await form.columnFilter('NumberFld').setValue(123);
903
917
  * await form.columnFilter('TextFld').setValue('TestValue');
918
+ * await form.columnFilter('TextFld').setValue('TestValue', '=', true);
904
919
  */
905
- async setValue(value) {
920
+ async setValue(value, operation, isBlank) {
906
921
  const filter = await this.initFilter();
922
+ const inputEl = await filter.getElement();
923
+ await inputEl.click();
924
+ const filterOperation = new FilterOperation({
925
+ parentCssSelector: HEADER_FILTER_CONTAINER,
926
+ filterTestID: createHeaderFilterTestId(this._formName, this._name)
927
+ });
928
+ if (typeof operation === "string") {
929
+ await filterOperation.setOperation(operation);
930
+ }
931
+ if (typeof isBlank === "boolean") {
932
+ await filterOperation.setIsBlank(isBlank);
933
+ }
907
934
  await filter.setValue(value);
908
935
  return this.apply();
909
936
  }
@@ -927,32 +954,52 @@ var ColumnFilter = class extends AbstractElement {
927
954
  await filter.remove(itemText);
928
955
  return this.apply();
929
956
  }
930
- // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
957
+ /**
958
+ * Инициализация операции фильтра
959
+ */
931
960
  async initOperation() {
932
- await this.initFilter();
961
+ const filter = await this.initFilter();
962
+ const inputEl = await filter.getElement();
963
+ await inputEl.click();
933
964
  return new FilterOperation({
934
965
  parentCssSelector: HEADER_FILTER_CONTAINER,
935
966
  filterTestID: createHeaderFilterTestId(this._formName, this._name)
936
967
  });
937
968
  }
938
- // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
969
+ /**
970
+ * Устанавливает операцию для фильтра
971
+ * @example
972
+ * await form.columnFilter('TagBox').setOperation("=");
973
+ */
939
974
  async setOperation(operationName) {
940
975
  const filterOperation = await this.initOperation();
941
976
  await filterOperation.setOperation(operationName);
942
977
  await this.apply();
943
978
  }
944
- // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
979
+ /**
980
+ * Возвращает операцию фильтра
981
+ * @example
982
+ * expect(await form.columnFilter('NumberFld').getOperation()).toBe("=");
983
+ */
945
984
  async getOperation() {
946
985
  const filterOperation = await this.initOperation();
947
986
  return await filterOperation.getOperation();
948
987
  }
949
- // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
988
+ /**
989
+ * Устанавливает операцию 'isblank' для фильтра
990
+ * @example
991
+ * await form.columnFilter('TagBox').setIsBlank(true);
992
+ */
950
993
  async setIsBlank(value) {
951
994
  const filterOperation = await this.initOperation();
952
995
  await filterOperation.setIsBlank(value);
953
996
  await this.apply();
954
997
  }
955
- // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
998
+ /**
999
+ * Возвращает true|false, если операция 'isblank' установлена для фильтра
1000
+ * @example
1001
+ * expect(await form.columnFilter('NumberFld').getIsBlank()).toBe(false);
1002
+ */
956
1003
  async getIsBlank() {
957
1004
  const filterOperation = await this.initOperation();
958
1005
  return await filterOperation.getIsBlank();
@@ -3,7 +3,7 @@ import {
3
3
  FormField,
4
4
  click,
5
5
  wait
6
- } from "./chunk-JGX24TXO.mjs";
6
+ } from "./chunk-SPTTRJJ4.mjs";
7
7
 
8
8
  // src/pageObjects/elements/Forms/FormEdit.ts
9
9
  import { By } from "selenium-webdriver";
@@ -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
 
@@ -860,7 +954,7 @@ var FormField = class extends AbstractEditor {
860
954
  };
861
955
 
862
956
  // src/pageObjects/elements/Forms/Form.ts
863
- import { By as By14 } from "selenium-webdriver";
957
+ import { By as By15 } from "selenium-webdriver";
864
958
 
865
959
  // src/pageObjects/elements/TableToolbar/AbstractButton.ts
866
960
  var AbstractButton = class extends AbstractElementWithParent {
@@ -883,7 +977,7 @@ var AbstractButton = class extends AbstractElementWithParent {
883
977
  };
884
978
 
885
979
  // src/pageObjects/elements/DXComponents/DXButton.ts
886
- import { By as By11 } from "selenium-webdriver";
980
+ import { By as By12 } from "selenium-webdriver";
887
981
  var DXButton = class extends AbstractButton {
888
982
  async getText() {
889
983
  const classes = await this.getClasses();
@@ -891,7 +985,7 @@ var DXButton = class extends AbstractButton {
891
985
  return null;
892
986
  }
893
987
  const el = await this.getElement();
894
- const textEl = el.findElement(By11.className("dx-button-text"));
988
+ const textEl = el.findElement(By12.className("dx-button-text"));
895
989
  return await textEl.getText();
896
990
  }
897
991
  };
@@ -921,7 +1015,7 @@ var Panel = class extends AbstractGroup {
921
1015
  };
922
1016
 
923
1017
  // src/pageObjects/elements/Groups/TabPanel.ts
924
- import { By as By12 } from "selenium-webdriver";
1018
+ import { By as By13 } from "selenium-webdriver";
925
1019
  var TabPanelItem = class extends AbstractGroup {
926
1020
  constructor(parentCssSelector, elementCssSelector, driver) {
927
1021
  super(parentCssSelector, elementCssSelector, driver);
@@ -931,7 +1025,7 @@ var TabPanelItem = class extends AbstractGroup {
931
1025
  }
932
1026
  async isActive() {
933
1027
  const tabPanelItemElement = await this.getElement();
934
- 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]'));
935
1029
  return await grandparentTab.getAttribute("aria-selected") === "true";
936
1030
  }
937
1031
  async getTitle() {
@@ -948,7 +1042,7 @@ var TabPanel = class extends AbstractGroup {
948
1042
  };
949
1043
 
950
1044
  // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
951
- import { By as By13 } from "selenium-webdriver";
1045
+ import { By as By14 } from "selenium-webdriver";
952
1046
  var ACCORDION_TITLE_CONTAINER = "accordion-title-container";
953
1047
  var AccordionItem = class extends AbstractGroup {
954
1048
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -960,7 +1054,7 @@ var AccordionItem = class extends AbstractGroup {
960
1054
  }
961
1055
  async clickAccordionItemTitle() {
962
1056
  const accordionElement = await this.getElement();
963
- const accordTitleElement = await accordionElement.findElement(By13.className(ACCORDION_TITLE_CONTAINER));
1057
+ const accordTitleElement = await accordionElement.findElement(By14.className(ACCORDION_TITLE_CONTAINER));
964
1058
  await accordTitleElement.click();
965
1059
  }
966
1060
  async click() {
@@ -1148,15 +1242,15 @@ async function classDependencyInjector(formType) {
1148
1242
  let SubFormFactoryClass;
1149
1243
  switch (formType) {
1150
1244
  case "1" /* LIST */:
1151
- SubFormFactoryClass = (await import("./ListForm-FHAD7GLJ.mjs")).default;
1245
+ SubFormFactoryClass = (await import("./ListForm-A2IT4Z65.mjs")).default;
1152
1246
  break;
1153
1247
  case "3" /* TREE */:
1154
- SubFormFactoryClass = (await import("./TreeView-QDCXAJZ2.mjs")).default;
1248
+ SubFormFactoryClass = (await import("./TreeView-XM4SNZSJ.mjs")).default;
1155
1249
  break;
1156
1250
  case "2" /* EDIT */:
1157
1251
  case "99" /* FREE_FORM */:
1158
1252
  case "4" /* REPORT */:
1159
- SubFormFactoryClass = (await import("./FormEdit-VOA5OIJ2.mjs")).default;
1253
+ SubFormFactoryClass = (await import("./FormEdit-YRHBBSY3.mjs")).default;
1160
1254
  break;
1161
1255
  default:
1162
1256
  throw new Error(`Unsupported form type ${formType}`);
@@ -1186,10 +1280,10 @@ var Form = class extends AbstractForm {
1186
1280
  */
1187
1281
  async getTitleText() {
1188
1282
  if (await this.isModal()) {
1189
- 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`));
1190
1284
  return titleEl2.getText();
1191
1285
  }
1192
- 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"));
1193
1287
  return titleEl.getText();
1194
1288
  }
1195
1289
  setSubFormMode() {
@@ -1207,7 +1301,7 @@ var Form = class extends AbstractForm {
1207
1301
  */
1208
1302
  async subForm(name) {
1209
1303
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
1210
- const byCssSelector = By14.css(cssSelector);
1304
+ const byCssSelector = By15.css(cssSelector);
1211
1305
  const subFormEl = await this.driver.findElement(byCssSelector);
1212
1306
  await waitElementIsVisible({
1213
1307
  element: subFormEl,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ListForm
3
- } from "./chunk-TFKTH7JY.mjs";
3
+ } from "./chunk-COFCOE45.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)";
@@ -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
  }
@@ -1063,12 +1169,12 @@ var init_AbstractButton = __esm({
1063
1169
  });
1064
1170
 
1065
1171
  // src/pageObjects/elements/DXComponents/DXButton.ts
1066
- var import_selenium_webdriver16, DXButton;
1172
+ var import_selenium_webdriver17, DXButton;
1067
1173
  var init_DXButton = __esm({
1068
1174
  "src/pageObjects/elements/DXComponents/DXButton.ts"() {
1069
1175
  "use strict";
1070
1176
  init_AbstractButton();
1071
- import_selenium_webdriver16 = require("selenium-webdriver");
1177
+ import_selenium_webdriver17 = require("selenium-webdriver");
1072
1178
  DXButton = class extends AbstractButton {
1073
1179
  async getText() {
1074
1180
  const classes = await this.getClasses();
@@ -1076,7 +1182,7 @@ var init_DXButton = __esm({
1076
1182
  return null;
1077
1183
  }
1078
1184
  const el = await this.getElement();
1079
- 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"));
1080
1186
  return await textEl.getText();
1081
1187
  }
1082
1188
  };
@@ -1131,12 +1237,12 @@ var init_Panel = __esm({
1131
1237
  });
1132
1238
 
1133
1239
  // src/pageObjects/elements/Groups/TabPanel.ts
1134
- var import_selenium_webdriver17, TabPanelItem, TabPanel;
1240
+ var import_selenium_webdriver18, TabPanelItem, TabPanel;
1135
1241
  var init_TabPanel = __esm({
1136
1242
  "src/pageObjects/elements/Groups/TabPanel.ts"() {
1137
1243
  "use strict";
1138
1244
  init_AbstractGroup();
1139
- import_selenium_webdriver17 = require("selenium-webdriver");
1245
+ import_selenium_webdriver18 = require("selenium-webdriver");
1140
1246
  init_actions();
1141
1247
  TabPanelItem = class extends AbstractGroup {
1142
1248
  constructor(parentCssSelector, elementCssSelector, driver) {
@@ -1147,7 +1253,7 @@ var init_TabPanel = __esm({
1147
1253
  }
1148
1254
  async isActive() {
1149
1255
  const tabPanelItemElement = await this.getElement();
1150
- 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]'));
1151
1257
  return await grandparentTab.getAttribute("aria-selected") === "true";
1152
1258
  }
1153
1259
  async getTitle() {
@@ -1166,12 +1272,12 @@ var init_TabPanel = __esm({
1166
1272
  });
1167
1273
 
1168
1274
  // src/pageObjects/elements/Groups/Accordion/AccordionItem.ts
1169
- var import_selenium_webdriver18, ACCORDION_TITLE_CONTAINER, AccordionItem;
1275
+ var import_selenium_webdriver19, ACCORDION_TITLE_CONTAINER, AccordionItem;
1170
1276
  var init_AccordionItem = __esm({
1171
1277
  "src/pageObjects/elements/Groups/Accordion/AccordionItem.ts"() {
1172
1278
  "use strict";
1173
1279
  init_AbstractGroup();
1174
- import_selenium_webdriver18 = require("selenium-webdriver");
1280
+ import_selenium_webdriver19 = require("selenium-webdriver");
1175
1281
  init_actions();
1176
1282
  ACCORDION_TITLE_CONTAINER = "accordion-title-container";
1177
1283
  AccordionItem = class extends AbstractGroup {
@@ -1184,7 +1290,7 @@ var init_AccordionItem = __esm({
1184
1290
  }
1185
1291
  async clickAccordionItemTitle() {
1186
1292
  const accordionElement = await this.getElement();
1187
- 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));
1188
1294
  await accordTitleElement.click();
1189
1295
  }
1190
1296
  async click() {
@@ -1419,11 +1525,11 @@ function getCssRowByIndexSelector(index) {
1419
1525
  function getCssCellByIndexSelector(index) {
1420
1526
  return `td[role="gridcell"][aria-colindex="${transformInputIndex(index)}"]`;
1421
1527
  }
1422
- var import_selenium_webdriver19, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1528
+ var import_selenium_webdriver20, getColumnByIndexCssSelector, getColumnByCaptionCssSelector, getColumnByNameCssSelector, transformInputIndex, transformOutputIndex;
1423
1529
  var init_utils2 = __esm({
1424
1530
  "src/pageObjects/elements/Table/utils.ts"() {
1425
1531
  "use strict";
1426
- import_selenium_webdriver19 = require("selenium-webdriver");
1532
+ import_selenium_webdriver20 = require("selenium-webdriver");
1427
1533
  getColumnByIndexCssSelector = (columnIndex) => `td[aria-colindex="${transformInputIndex(columnIndex)}"]`;
1428
1534
  getColumnByCaptionCssSelector = (caption) => `td[role="columnheader"][aria-label="Column ${caption}"]`;
1429
1535
  getColumnByNameCssSelector = (name) => `td[role="columnheader"][data-fieldname="${name}"]`;
@@ -1440,11 +1546,11 @@ var init_types3 = __esm({
1440
1546
  });
1441
1547
 
1442
1548
  // src/pageObjects/elements/Table/elements/Cell.ts
1443
- var import_selenium_webdriver20, Cell;
1549
+ var import_selenium_webdriver21, Cell;
1444
1550
  var init_Cell = __esm({
1445
1551
  "src/pageObjects/elements/Table/elements/Cell.ts"() {
1446
1552
  "use strict";
1447
- import_selenium_webdriver20 = require("selenium-webdriver");
1553
+ import_selenium_webdriver21 = require("selenium-webdriver");
1448
1554
  init_AbstractElementWithParent();
1449
1555
  init_utils2();
1450
1556
  init_types3();
@@ -1461,12 +1567,12 @@ var init_Cell = __esm({
1461
1567
  this.elementCssSelector = getCssCellByIndexSelector(index);
1462
1568
  }
1463
1569
  async getBooleanValue(cellEl) {
1464
- 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"));
1465
1571
  return await booleanEl.getAttribute("aria-checked") === "true" ? 1 : 0;
1466
1572
  }
1467
1573
  async getTagsValue(cellEl) {
1468
1574
  const tagsCssSelector = ".multiselect-container .multiselect-cell";
1469
- const tags = await cellEl.findElements(import_selenium_webdriver20.By.css(tagsCssSelector));
1575
+ const tags = await cellEl.findElements(import_selenium_webdriver21.By.css(tagsCssSelector));
1470
1576
  const values = [];
1471
1577
  for (const tag of tags) {
1472
1578
  values.push(await tag.getAttribute("textContent"));
@@ -1496,11 +1602,11 @@ var init_Cell = __esm({
1496
1602
  });
1497
1603
 
1498
1604
  // src/pageObjects/elements/Table/elements/Row.ts
1499
- 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;
1500
1606
  var init_Row = __esm({
1501
1607
  "src/pageObjects/elements/Table/elements/Row.ts"() {
1502
1608
  "use strict";
1503
- import_selenium_webdriver21 = require("selenium-webdriver");
1609
+ import_selenium_webdriver22 = require("selenium-webdriver");
1504
1610
  init_Cell();
1505
1611
  init_utils2();
1506
1612
  init_AbstractElementWithParent();
@@ -1559,7 +1665,7 @@ var init_Row = __esm({
1559
1665
  return this.index;
1560
1666
  }
1561
1667
  async getCells() {
1562
- 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"]`));
1563
1669
  const result = [];
1564
1670
  cells.forEach((_, index) => {
1565
1671
  const newCell = this.getCellByIndex(index);
@@ -1572,7 +1678,7 @@ var init_Row = __esm({
1572
1678
  this.index
1573
1679
  )}"] .${buttonClass}`;
1574
1680
  const button = await fixElementStaleError(
1575
- import_selenium_webdriver21.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`),
1681
+ import_selenium_webdriver22.By.css(`${this.parentCssSelector} ${this.fixedTableContentCssSelector} ${buttonCssSelector}`),
1576
1682
  this.driver
1577
1683
  );
1578
1684
  return click(button, this.driver);
@@ -1603,11 +1709,11 @@ var init_Row = __esm({
1603
1709
  });
1604
1710
 
1605
1711
  // src/pageObjects/elements/Table/elements/Column.ts
1606
- var import_selenium_webdriver22, Column;
1712
+ var import_selenium_webdriver23, Column;
1607
1713
  var init_Column = __esm({
1608
1714
  "src/pageObjects/elements/Table/elements/Column.ts"() {
1609
1715
  "use strict";
1610
- import_selenium_webdriver22 = require("selenium-webdriver");
1716
+ import_selenium_webdriver23 = require("selenium-webdriver");
1611
1717
  init_utils2();
1612
1718
  init_AbstractElementWithParent();
1613
1719
  init_fixElementStaleError();
@@ -1635,7 +1741,7 @@ var init_Column = __esm({
1635
1741
  return super.getElement();
1636
1742
  }
1637
1743
  async getColumnHeaderIndexBy(cssSelector) {
1638
- 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);
1639
1745
  return transformOutputIndex(await column.getAttribute("aria-colindex"));
1640
1746
  }
1641
1747
  async getIndexByCaption() {
@@ -1801,11 +1907,11 @@ var init_FormField = __esm({
1801
1907
  });
1802
1908
 
1803
1909
  // src/pageObjects/elements/Table/Table.ts
1804
- var import_selenium_webdriver23, Table;
1910
+ var import_selenium_webdriver24, Table;
1805
1911
  var init_Table = __esm({
1806
1912
  "src/pageObjects/elements/Table/Table.ts"() {
1807
1913
  "use strict";
1808
- import_selenium_webdriver23 = require("selenium-webdriver");
1914
+ import_selenium_webdriver24 = require("selenium-webdriver");
1809
1915
  init_createDataTestId();
1810
1916
  init_AbstractElementWithParent();
1811
1917
  init_Row();
@@ -1857,7 +1963,7 @@ var init_Table = __esm({
1857
1963
  return this.getRowByIndex(index).select();
1858
1964
  }
1859
1965
  async getRows() {
1860
- 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`));
1861
1967
  const result = [];
1862
1968
  rows.forEach((_, index) => {
1863
1969
  const newRow = new Row(
@@ -1873,7 +1979,7 @@ var init_Table = __esm({
1873
1979
  }
1874
1980
  async getColumns() {
1875
1981
  const columns = await this.driver.findElements(
1876
- 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"]`)
1877
1983
  );
1878
1984
  const result = [];
1879
1985
  columns.forEach((_, index) => {
@@ -1968,11 +2074,11 @@ var init_typesUtil = __esm({
1968
2074
  });
1969
2075
 
1970
2076
  // src/pageObjects/elements/TableToolbar/ToolbarMenu.ts
1971
- var import_selenium_webdriver24, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
2077
+ var import_selenium_webdriver25, SPINDOWN_CLASS, buttonGroupItemSelector, getFullCssSelector, buttonByTextXpath, ToolbarMenu;
1972
2078
  var init_ToolbarMenu = __esm({
1973
2079
  "src/pageObjects/elements/TableToolbar/ToolbarMenu.ts"() {
1974
2080
  "use strict";
1975
- import_selenium_webdriver24 = require("selenium-webdriver");
2081
+ import_selenium_webdriver25 = require("selenium-webdriver");
1976
2082
  init_typesUtil();
1977
2083
  init_AbstractElementWithParent();
1978
2084
  init_locators();
@@ -2023,7 +2129,7 @@ var init_ToolbarMenu = __esm({
2023
2129
  throw new Error(`"title" must be a string or array of string`);
2024
2130
  let lTitle = isString(title) ? [title] : title;
2025
2131
  for (let t of lTitle) {
2026
- await this.goToButton(t, import_selenium_webdriver24.By.xpath(buttonByTextXpath(t)));
2132
+ await this.goToButton(t, import_selenium_webdriver25.By.xpath(buttonByTextXpath(t)));
2027
2133
  }
2028
2134
  }
2029
2135
  };
@@ -2098,11 +2204,11 @@ var init_FormToolbar = __esm({
2098
2204
  });
2099
2205
 
2100
2206
  // src/pageObjects/elements/Filters/FilterOperation.ts
2101
- 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;
2102
2208
  var init_FilterOperation = __esm({
2103
2209
  "src/pageObjects/elements/Filters/FilterOperation.ts"() {
2104
2210
  "use strict";
2105
- import_selenium_webdriver25 = require("selenium-webdriver");
2211
+ import_selenium_webdriver26 = require("selenium-webdriver");
2106
2212
  init_fixElementStaleError();
2107
2213
  init_AbstractElementWithParent();
2108
2214
  init_locators();
@@ -2142,10 +2248,10 @@ var init_FilterOperation = __esm({
2142
2248
  errorMessage: "Widget operation is not clickable",
2143
2249
  driver: this.driver
2144
2250
  });
2145
- 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"));
2146
2252
  await click(clickableElement, this.driver);
2147
2253
  try {
2148
- 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}`)}`));
2149
2255
  await waitElementIsVisible({
2150
2256
  element: widgetPopupEl,
2151
2257
  errorMessage: `Operation widget popup is not visible`,
@@ -2160,7 +2266,7 @@ var init_FilterOperation = __esm({
2160
2266
  throw new Error(`Operation with name "${operationName}" is not correct.`);
2161
2267
  }
2162
2268
  await this.initOperationWidget();
2163
- 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);
2164
2270
  await click(operationEl, this.driver);
2165
2271
  await wait(
2166
2272
  async () => {
@@ -2232,8 +2338,15 @@ var init_FormFilterField = __esm({
2232
2338
  * @example
2233
2339
  * await form.formFilter('NumberFld').setValue(123);
2234
2340
  * await form.formFilter('TextFld').setValue('TestValue');
2341
+ * await form.formFilter('TextFld').setValue('TestValue', '=', true);
2235
2342
  */
2236
- async setValue(value) {
2343
+ async setValue(value, operation, isBlank) {
2344
+ if (typeof operation === "string") {
2345
+ await this.setOperation(operation);
2346
+ }
2347
+ if (typeof isBlank === "boolean") {
2348
+ await this.setIsBlank(isBlank);
2349
+ }
2237
2350
  return super.setValue(value);
2238
2351
  }
2239
2352
  /**
@@ -2332,8 +2445,15 @@ var init_PanelFilterField = __esm({
2332
2445
  * @example
2333
2446
  * await form.filterPanel.filterField('NumberFld').setValue(123);
2334
2447
  * await form.filterPanel.filterField('TextFld').setValue('TestValue');
2448
+ * await form.filterPanel.filterField('TextFld').setValue('TestValue', '=', true);
2335
2449
  */
2336
- async setValue(value) {
2450
+ async setValue(value, operation, isBlank) {
2451
+ if (typeof operation === "string") {
2452
+ await this.setOperation(operation);
2453
+ }
2454
+ if (typeof isBlank === "boolean") {
2455
+ await this.setIsBlank(isBlank);
2456
+ }
2337
2457
  return super.setValue(value);
2338
2458
  }
2339
2459
  /**
@@ -2402,11 +2522,11 @@ var init_PanelFilterField = __esm({
2402
2522
  });
2403
2523
 
2404
2524
  // src/pageObjects/elements/Filters/FilterPanel.ts
2405
- var import_selenium_webdriver26, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2525
+ var import_selenium_webdriver27, drawerSelector, FILTER_PANEL_SELECTOR, CLOSE_SELECTOR, FilterPanel;
2406
2526
  var init_FilterPanel = __esm({
2407
2527
  "src/pageObjects/elements/Filters/FilterPanel.ts"() {
2408
2528
  "use strict";
2409
- import_selenium_webdriver26 = require("selenium-webdriver");
2529
+ import_selenium_webdriver27 = require("selenium-webdriver");
2410
2530
  init_AbstractElement();
2411
2531
  init_PanelFilterField();
2412
2532
  init_actions();
@@ -2421,7 +2541,7 @@ var init_FilterPanel = __esm({
2421
2541
  async filterPanelButtons() {
2422
2542
  const selector = `${this.elementCssSelector} ${FILTER_PANEL_SELECTOR} .filter-panel__buttons-panel .dx-button-text`;
2423
2543
  const el = await this.getElement();
2424
- return el.findElements(import_selenium_webdriver26.By.css(selector));
2544
+ return el.findElements(import_selenium_webdriver27.By.css(selector));
2425
2545
  }
2426
2546
  constructor(formName, driver) {
2427
2547
  super(driver, drawerSelector(formName));
@@ -2454,7 +2574,7 @@ var init_FilterPanel = __esm({
2454
2574
  await this.driver.sleep(300);
2455
2575
  }
2456
2576
  async close() {
2457
- const btn = await this.driver.findElement(import_selenium_webdriver26.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2577
+ const btn = await this.driver.findElement(import_selenium_webdriver27.By.css(`${this.elementCssSelector} ${CLOSE_SELECTOR}`));
2458
2578
  await click(btn, this.driver);
2459
2579
  }
2460
2580
  };
@@ -2490,12 +2610,12 @@ var init_HeaderFilterField = __esm({
2490
2610
  });
2491
2611
 
2492
2612
  // src/pageObjects/elements/Filters/ColumnFilter.ts
2493
- var import_selenium_webdriver27, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
2613
+ var import_selenium_webdriver28, APPLY_SELECTOR, CANCEL_SELECTOR, HEADER_FILTER_ICON, HEADER_FILTER_CONTAINER, HEADER_FILTER_BUTTONS, ColumnFilter;
2494
2614
  var init_ColumnFilter = __esm({
2495
2615
  "src/pageObjects/elements/Filters/ColumnFilter.ts"() {
2496
2616
  "use strict";
2497
2617
  init_actions();
2498
- import_selenium_webdriver27 = require("selenium-webdriver");
2618
+ import_selenium_webdriver28 = require("selenium-webdriver");
2499
2619
  init_HeaderFilterField();
2500
2620
  init_waitElementIsVisible();
2501
2621
  init_AbstractElement();
@@ -2520,11 +2640,11 @@ var init_ColumnFilter = __esm({
2520
2640
  }
2521
2641
  async getApplyButton() {
2522
2642
  const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${APPLY_SELECTOR}`;
2523
- return this.driver.findElement(import_selenium_webdriver27.By.css(selector));
2643
+ return this.driver.findElement(import_selenium_webdriver28.By.css(selector));
2524
2644
  }
2525
2645
  async getCancelButton() {
2526
2646
  const selector = `${HEADER_FILTER_CONTAINER} ${HEADER_FILTER_BUTTONS} ${CANCEL_SELECTOR}`;
2527
- return this.driver.findElement(import_selenium_webdriver27.By.css(selector));
2647
+ return this.driver.findElement(import_selenium_webdriver28.By.css(selector));
2528
2648
  }
2529
2649
  async apply() {
2530
2650
  const btn = await this.getApplyButton();
@@ -2538,7 +2658,7 @@ var init_ColumnFilter = __esm({
2538
2658
  const columnEl = await this._column.getElement();
2539
2659
  const actions = this.driver.actions({ async: true });
2540
2660
  await actions.move({ origin: columnEl }).perform();
2541
- const elements = await columnEl.findElements(import_selenium_webdriver27.By.css(HEADER_FILTER_ICON));
2661
+ const elements = await columnEl.findElements(import_selenium_webdriver28.By.css(HEADER_FILTER_ICON));
2542
2662
  let headerFilterIcon = null;
2543
2663
  await wait(
2544
2664
  async () => {
@@ -2584,9 +2704,22 @@ var init_ColumnFilter = __esm({
2584
2704
  * @example
2585
2705
  * await form.columnFilter('NumberFld').setValue(123);
2586
2706
  * await form.columnFilter('TextFld').setValue('TestValue');
2707
+ * await form.columnFilter('TextFld').setValue('TestValue', '=', true);
2587
2708
  */
2588
- async setValue(value) {
2709
+ async setValue(value, operation, isBlank) {
2589
2710
  const filter = await this.initFilter();
2711
+ const inputEl = await filter.getElement();
2712
+ await inputEl.click();
2713
+ const filterOperation = new FilterOperation({
2714
+ parentCssSelector: HEADER_FILTER_CONTAINER,
2715
+ filterTestID: createHeaderFilterTestId(this._formName, this._name)
2716
+ });
2717
+ if (typeof operation === "string") {
2718
+ await filterOperation.setOperation(operation);
2719
+ }
2720
+ if (typeof isBlank === "boolean") {
2721
+ await filterOperation.setIsBlank(isBlank);
2722
+ }
2590
2723
  await filter.setValue(value);
2591
2724
  return this.apply();
2592
2725
  }
@@ -2610,32 +2743,52 @@ var init_ColumnFilter = __esm({
2610
2743
  await filter.remove(itemText);
2611
2744
  return this.apply();
2612
2745
  }
2613
- // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
2746
+ /**
2747
+ * Инициализация операции фильтра
2748
+ */
2614
2749
  async initOperation() {
2615
- await this.initFilter();
2750
+ const filter = await this.initFilter();
2751
+ const inputEl = await filter.getElement();
2752
+ await inputEl.click();
2616
2753
  return new FilterOperation({
2617
2754
  parentCssSelector: HEADER_FILTER_CONTAINER,
2618
2755
  filterTestID: createHeaderFilterTestId(this._formName, this._name)
2619
2756
  });
2620
2757
  }
2621
- // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
2758
+ /**
2759
+ * Устанавливает операцию для фильтра
2760
+ * @example
2761
+ * await form.columnFilter('TagBox').setOperation("=");
2762
+ */
2622
2763
  async setOperation(operationName) {
2623
2764
  const filterOperation = await this.initOperation();
2624
2765
  await filterOperation.setOperation(operationName);
2625
2766
  await this.apply();
2626
2767
  }
2627
- // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
2768
+ /**
2769
+ * Возвращает операцию фильтра
2770
+ * @example
2771
+ * expect(await form.columnFilter('NumberFld').getOperation()).toBe("=");
2772
+ */
2628
2773
  async getOperation() {
2629
2774
  const filterOperation = await this.initOperation();
2630
2775
  return await filterOperation.getOperation();
2631
2776
  }
2632
- // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
2777
+ /**
2778
+ * Устанавливает операцию 'isblank' для фильтра
2779
+ * @example
2780
+ * await form.columnFilter('TagBox').setIsBlank(true);
2781
+ */
2633
2782
  async setIsBlank(value) {
2634
2783
  const filterOperation = await this.initOperation();
2635
2784
  await filterOperation.setIsBlank(value);
2636
2785
  await this.apply();
2637
2786
  }
2638
- // ToDo: Треба доробити після того, як буде реалізована логіка з editor buttons
2787
+ /**
2788
+ * Возвращает true|false, если операция 'isblank' установлена для фильтра
2789
+ * @example
2790
+ * expect(await form.columnFilter('NumberFld').getIsBlank()).toBe(false);
2791
+ */
2639
2792
  async getIsBlank() {
2640
2793
  const filterOperation = await this.initOperation();
2641
2794
  return await filterOperation.getIsBlank();
@@ -2783,12 +2936,12 @@ var init_createSubFormInstance = __esm({
2783
2936
  });
2784
2937
 
2785
2938
  // src/pageObjects/elements/Forms/Form.ts
2786
- var import_selenium_webdriver28, formTestId, Form;
2939
+ var import_selenium_webdriver29, formTestId, Form;
2787
2940
  var init_Form = __esm({
2788
2941
  "src/pageObjects/elements/Forms/Form.ts"() {
2789
2942
  "use strict";
2790
2943
  init_locators();
2791
- import_selenium_webdriver28 = require("selenium-webdriver");
2944
+ import_selenium_webdriver29 = require("selenium-webdriver");
2792
2945
  init_AbstractForm();
2793
2946
  init_waitElementIsVisible();
2794
2947
  init_createSubFormInstance();
@@ -2813,10 +2966,10 @@ var init_Form = __esm({
2813
2966
  */
2814
2967
  async getTitleText() {
2815
2968
  if (await this.isModal()) {
2816
- const titleEl2 = await this.driver.findElement(import_selenium_webdriver28.By.css(`${this.popupContainerCssSelector} .popup-title`));
2969
+ const titleEl2 = await this.driver.findElement(import_selenium_webdriver29.By.css(`${this.popupContainerCssSelector} .popup-title`));
2817
2970
  return titleEl2.getText();
2818
2971
  }
2819
- let titleEl = await this.driver.findElement(import_selenium_webdriver28.By.className("main-toolbar-form-title"));
2972
+ let titleEl = await this.driver.findElement(import_selenium_webdriver29.By.className("main-toolbar-form-title"));
2820
2973
  return titleEl.getText();
2821
2974
  }
2822
2975
  setSubFormMode() {
@@ -2834,7 +2987,7 @@ var init_Form = __esm({
2834
2987
  */
2835
2988
  async subForm(name) {
2836
2989
  const cssSelector = subformCssSelector(this.containerCssSelector, subFormTestId(name));
2837
- const byCssSelector = import_selenium_webdriver28.By.css(cssSelector);
2990
+ const byCssSelector = import_selenium_webdriver29.By.css(cssSelector);
2838
2991
  const subFormEl = await this.driver.findElement(byCssSelector);
2839
2992
  await waitElementIsVisible({
2840
2993
  element: subFormEl,
@@ -2864,18 +3017,18 @@ var FormEdit_exports = {};
2864
3017
  __export(FormEdit_exports, {
2865
3018
  default: () => FormEdit
2866
3019
  });
2867
- var import_selenium_webdriver29, FormEdit;
3020
+ var import_selenium_webdriver30, FormEdit;
2868
3021
  var init_FormEdit = __esm({
2869
3022
  "src/pageObjects/elements/Forms/FormEdit.ts"() {
2870
3023
  "use strict";
2871
3024
  init_Form();
2872
- import_selenium_webdriver29 = require("selenium-webdriver");
3025
+ import_selenium_webdriver30 = require("selenium-webdriver");
2873
3026
  init_FormField();
2874
3027
  init_actions();
2875
3028
  init_wait();
2876
3029
  FormEdit = class extends Form {
2877
- saveButtonBy = import_selenium_webdriver29.By.id("button-save");
2878
- closeButtonBy = import_selenium_webdriver29.By.id("button-cancel");
3030
+ saveButtonBy = import_selenium_webdriver30.By.id("button-save");
3031
+ closeButtonBy = import_selenium_webdriver30.By.id("button-cancel");
2879
3032
  constructor(driver) {
2880
3033
  super(driver);
2881
3034
  this.popupContainerCssSelector = `.popup .form-edit-${this.formName}`;
@@ -3058,7 +3211,7 @@ var SubsystemsPanelHeader = class extends AbstractElementWithParent {
3058
3211
  };
3059
3212
 
3060
3213
  // src/pageObjects/elements/SubsystemsPanel/SubsystemsPanel.ts
3061
- var import_selenium_webdriver15 = require("selenium-webdriver");
3214
+ var import_selenium_webdriver16 = require("selenium-webdriver");
3062
3215
  init_wait();
3063
3216
  init_locators();
3064
3217
  init_Editors();
@@ -3140,7 +3293,7 @@ var SubsystemsPanel = class extends AbstractElement {
3140
3293
  */
3141
3294
  async searchClear() {
3142
3295
  const clearBtnSelector = `#aside ${byTestIdCssSelector(SEARCH_INPUT_SELECTOR)} .${DX_CLEAR_BUTTON_AREA}`;
3143
- const clearBtn = await this.driver.findElement(import_selenium_webdriver15.By.css(clearBtnSelector));
3296
+ const clearBtn = await this.driver.findElement(import_selenium_webdriver16.By.css(clearBtnSelector));
3144
3297
  if (await clearBtn.isDisplayed()) {
3145
3298
  await click(clearBtn, this.driver);
3146
3299
  }
@@ -3154,7 +3307,7 @@ var SubsystemsPanel = class extends AbstractElement {
3154
3307
  */
3155
3308
  item(name) {
3156
3309
  const elementCSS = createSubSystemTestId(name);
3157
- return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
3310
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver16.By.css(`${byTestIdCssSelector(elementCSS, "span")}`) });
3158
3311
  }
3159
3312
  /**
3160
3313
  * Возвращает сабсистему по заголовку
@@ -3164,7 +3317,7 @@ var SubsystemsPanel = class extends AbstractElement {
3164
3317
  * const subsystem = subsystemsPanel.itemByTitle('SubSystemTitle');
3165
3318
  */
3166
3319
  itemByTitle(title) {
3167
- return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver15.By.css(byTitleCssSelector(title)) });
3320
+ return new SubsystemItem({ driver: this.driver, bySelector: import_selenium_webdriver16.By.css(byTitleCssSelector(title)) });
3168
3321
  }
3169
3322
  /**
3170
3323
  * Возвращается на уровень выше по сабсистемам
@@ -3174,7 +3327,7 @@ var SubsystemsPanel = class extends AbstractElement {
3174
3327
  * wait subsystemsPanel.back();
3175
3328
  */
3176
3329
  async back() {
3177
- const backButton = this.driver.findElement(import_selenium_webdriver15.By.css(`#aside .${BACK_BUTTON_SELECTOR}`));
3330
+ const backButton = this.driver.findElement(import_selenium_webdriver16.By.css(`#aside .${BACK_BUTTON_SELECTOR}`));
3178
3331
  await waitElementIsVisible(
3179
3332
  {
3180
3333
  element: backButton,
@@ -3191,13 +3344,13 @@ init_ListForm();
3191
3344
  init_TreeView();
3192
3345
 
3193
3346
  // src/pageObjects/elements/Forms/ReportForm.ts
3194
- var import_selenium_webdriver30 = require("selenium-webdriver");
3347
+ var import_selenium_webdriver31 = require("selenium-webdriver");
3195
3348
  init_FormEdit();
3196
3349
  var ReportForm = class extends FormEdit {
3197
3350
  constructor(driver) {
3198
3351
  super(driver);
3199
3352
  this.popupContainerCssSelector = `.popup .form-report-${this.formName}`;
3200
- this.saveButtonBy = import_selenium_webdriver30.By.id("button-apply");
3353
+ this.saveButtonBy = import_selenium_webdriver31.By.id("button-apply");
3201
3354
  }
3202
3355
  /**
3203
3356
  * Знаходить поле/фільтр у формі репорту за ім'ям
@@ -3220,7 +3373,7 @@ init_FilterPanel();
3220
3373
 
3221
3374
  // src/pageObjects/elements/Dialog.ts
3222
3375
  init_AbstractElement();
3223
- var import_selenium_webdriver31 = require("selenium-webdriver");
3376
+ var import_selenium_webdriver32 = require("selenium-webdriver");
3224
3377
  init_AbstractButton();
3225
3378
  var DIALOG_CLASS = ".d5-dialog";
3226
3379
  var DIALOG_TITLE_CLASS = ".dialog__title";
@@ -3235,7 +3388,7 @@ var DialogButton = class extends AbstractButton {
3235
3388
  }
3236
3389
  async getElement() {
3237
3390
  const panel = await super.getElement();
3238
- return panel.findElement(import_selenium_webdriver31.By.xpath(buttonByTextXpath2(this.text)));
3391
+ return panel.findElement(import_selenium_webdriver32.By.xpath(buttonByTextXpath2(this.text)));
3239
3392
  }
3240
3393
  buttonNotDisplayedError() {
3241
3394
  return `Dialog button ${this.text} cannot be clicked. It is not displayed or it is disabled`;
@@ -3255,11 +3408,11 @@ var Dialog = class extends AbstractElement {
3255
3408
  return this.joinRelativeCssSelectors([DIALOG_CLASS, DIALOG_BUTTONS_PANEL_CLASS]);
3256
3409
  }
3257
3410
  async title() {
3258
- const el = await this.driver.findElement(import_selenium_webdriver31.By.css(this.titleSelector));
3411
+ const el = await this.driver.findElement(import_selenium_webdriver32.By.css(this.titleSelector));
3259
3412
  return await el.getText();
3260
3413
  }
3261
3414
  async text() {
3262
- const el = await this.driver.findElement(import_selenium_webdriver31.By.css(this.textSelector));
3415
+ const el = await this.driver.findElement(import_selenium_webdriver32.By.css(this.textSelector));
3263
3416
  return await el.getText();
3264
3417
  }
3265
3418
  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 {
@@ -570,8 +571,9 @@ declare class FormFilterField extends AbstractEditor {
570
571
  * @example
571
572
  * await form.formFilter('NumberFld').setValue(123);
572
573
  * await form.formFilter('TextFld').setValue('TestValue');
574
+ * await form.formFilter('TextFld').setValue('TestValue', '=', true);
573
575
  */
574
- setValue(value: any): Promise<void>;
576
+ setValue(value: any, operation?: string, isBlank?: boolean): Promise<void>;
575
577
  /**
576
578
  * Очищает значение в поле
577
579
  * @example
@@ -630,8 +632,9 @@ declare class PanelFilterField extends AbstractEditor {
630
632
  * @example
631
633
  * await form.filterPanel.filterField('NumberFld').setValue(123);
632
634
  * await form.filterPanel.filterField('TextFld').setValue('TestValue');
635
+ * await form.filterPanel.filterField('TextFld').setValue('TestValue', '=', true);
633
636
  */
634
- setValue(value: any): Promise<void>;
637
+ setValue(value: any, operation?: string, isBlank?: boolean): Promise<void>;
635
638
  /**
636
639
  * Очищает значение в поле
637
640
  * @example
@@ -737,8 +740,9 @@ declare class ColumnFilter extends AbstractElement {
737
740
  * @example
738
741
  * await form.columnFilter('NumberFld').setValue(123);
739
742
  * await form.columnFilter('TextFld').setValue('TestValue');
743
+ * await form.columnFilter('TextFld').setValue('TestValue', '=', true);
740
744
  */
741
- setValue(value: any): Promise<void>;
745
+ setValue(value: any, operation?: string, isBlank?: boolean): Promise<void>;
742
746
  /**
743
747
  * Очищает значение в поле
744
748
  * @example
@@ -751,10 +755,33 @@ declare class ColumnFilter extends AbstractElement {
751
755
  * await form.columnFilter('TagBox').remove('test');
752
756
  */
753
757
  remove(itemText: string): Promise<void>;
758
+ /**
759
+ * Инициализация операции фильтра
760
+ */
754
761
  initOperation(): Promise<FilterOperation>;
762
+ /**
763
+ * Устанавливает операцию для фильтра
764
+ * @example
765
+ * await form.columnFilter('TagBox').setOperation("=");
766
+ */
755
767
  setOperation(operationName: string): Promise<void>;
768
+ /**
769
+ * Возвращает операцию фильтра
770
+ * @example
771
+ * expect(await form.columnFilter('NumberFld').getOperation()).toBe("=");
772
+ */
756
773
  getOperation(): Promise<any>;
774
+ /**
775
+ * Устанавливает операцию 'isblank' для фильтра
776
+ * @example
777
+ * await form.columnFilter('TagBox').setIsBlank(true);
778
+ */
757
779
  setIsBlank(value: boolean): Promise<void>;
780
+ /**
781
+ * Возвращает true|false, если операция 'isblank' установлена для фильтра
782
+ * @example
783
+ * expect(await form.columnFilter('NumberFld').getIsBlank()).toBe(false);
784
+ */
758
785
  getIsBlank(): Promise<boolean>;
759
786
  }
760
787
 
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  TreeView
3
- } from "./chunk-HXXWTKEP.mjs";
3
+ } from "./chunk-TCNJHKZT.mjs";
4
4
  import {
5
5
  FilterPanel,
6
6
  FormFilterField,
7
7
  ListForm,
8
8
  PanelFilterField
9
- } from "./chunk-TFKTH7JY.mjs";
9
+ } from "./chunk-COFCOE45.mjs";
10
10
  import {
11
11
  FormEdit
12
- } from "./chunk-LLH235HI.mjs";
12
+ } from "./chunk-I57KZIU6.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-JGX24TXO.mjs";
33
+ } from "./chunk-SPTTRJJ4.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-HXXWTKEP.mjs";
3
+ } from "./chunk-TCNJHKZT.mjs";
4
4
  import {
5
5
  FilterPanel,
6
6
  FormFilterField,
7
7
  ListForm,
8
8
  PanelFilterField
9
- } from "./chunk-TFKTH7JY.mjs";
9
+ } from "./chunk-COFCOE45.mjs";
10
10
  import {
11
11
  FormEdit
12
- } from "./chunk-LLH235HI.mjs";
12
+ } from "./chunk-I57KZIU6.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-JGX24TXO.mjs";
33
+ } from "./chunk-SPTTRJJ4.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.4",
3
+ "version": "1.8.0-alpha.6",
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-LLH235HI.mjs";
4
- import "./chunk-JGX24TXO.mjs";
5
- export {
6
- FormEdit as default
7
- };
@@ -1,7 +0,0 @@
1
- import {
2
- ListForm
3
- } from "./chunk-TFKTH7JY.mjs";
4
- import "./chunk-JGX24TXO.mjs";
5
- export {
6
- ListForm as default
7
- };
@@ -1,8 +0,0 @@
1
- import {
2
- TreeView
3
- } from "./chunk-HXXWTKEP.mjs";
4
- import "./chunk-TFKTH7JY.mjs";
5
- import "./chunk-JGX24TXO.mjs";
6
- export {
7
- TreeView as default
8
- };