d5-testing-library 1.9.0-alpha.2 → 1.9.0-alpha.22

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.
package/README.md CHANGED
@@ -0,0 +1 @@
1
+ //
@@ -0,0 +1,7 @@
1
+ import {
2
+ FormEdit
3
+ } from "./chunk-GQKGCUVL.mjs";
4
+ import "./chunk-FRCMUAAY.mjs";
5
+ export {
6
+ FormEdit as default
7
+ };
@@ -0,0 +1,7 @@
1
+ import {
2
+ ListForm
3
+ } from "./chunk-27XBX275.mjs";
4
+ import "./chunk-FRCMUAAY.mjs";
5
+ export {
6
+ ListForm as default
7
+ };
@@ -0,0 +1,8 @@
1
+ import {
2
+ TreeView
3
+ } from "./chunk-ZWHGIJ3K.mjs";
4
+ import "./chunk-27XBX275.mjs";
5
+ import "./chunk-FRCMUAAY.mjs";
6
+ export {
7
+ TreeView as default
8
+ };
@@ -17,14 +17,15 @@ import {
17
17
  safeWait,
18
18
  staleElementAction,
19
19
  waitElementIsClickable_default,
20
- waitElementIsVisible_default
21
- } from "./chunk-32KSAOFJ.mjs";
20
+ waitElementIsVisible_default,
21
+ withCustomTimeouts_default
22
+ } from "./chunk-FRCMUAAY.mjs";
22
23
 
23
24
  // src/pageObjects/elements/Table/Table.ts
24
25
  import { By as By6 } from "selenium-webdriver";
25
26
 
26
27
  // src/pageObjects/elements/Table/elements/Row.ts
27
- import { By as By3 } from "selenium-webdriver";
28
+ import { By as By3, Key } from "selenium-webdriver";
28
29
 
29
30
  // src/pageObjects/elements/Table/elements/Cell.ts
30
31
  import { By as By2 } from "selenium-webdriver";
@@ -82,7 +83,7 @@ var Cell = class extends AbstractElementWithParent {
82
83
  const [datePart, timePart] = value.split(", ");
83
84
  const [day, month, year] = datePart.split(".").map(Number);
84
85
  const [hours, minutes] = timePart.split(":").map(Number);
85
- return new Date(Date.UTC(year, month - 1, day, hours, minutes));
86
+ return new Date(year, month - 1, day, hours, minutes, 0, 0);
86
87
  } else {
87
88
  const [day, month, year] = value.split(".").map(Number);
88
89
  return new Date(Date.UTC(year, month - 1, day));
@@ -153,9 +154,18 @@ var Row = class extends AbstractElementWithParent {
153
154
  getCellByTitle(title) {
154
155
  return this._getCell({ title });
155
156
  }
156
- async select() {
157
+ async select(preserve = false) {
157
158
  await staleElementAction(async () => {
158
159
  const rowEl = await this.getElement();
160
+ const isSelected = (await this.getClasses()).includes(DX_SELECTION_CLASS);
161
+ if (isSelected && !preserve) {
162
+ await this.driver.actions({ async: true }).keyUp(Key.CONTROL).perform();
163
+ }
164
+ if (preserve && !isSelected) {
165
+ await this.driver.actions({ async: true }).keyDown(Key.CONTROL).perform();
166
+ await click(rowEl, this.driver);
167
+ return;
168
+ }
159
169
  await click(rowEl, this.driver);
160
170
  });
161
171
  await safeWait(
@@ -366,7 +376,7 @@ var DXContextMenuList = class extends AbstractDropDownMenuList {
366
376
  async isVisible() {
367
377
  try {
368
378
  await waitElementIsVisible_default({
369
- element: await this.driver.findElement(By5.css(`.dx-overlay-wrapper .dx-contextmenu`)),
379
+ element: await this.driver.findElement(By5.css(`.dx-overlay-wrapper .dx-context-menu`)),
370
380
  driver: this.driver,
371
381
  errorMessage: "Cannot find dropdown element"
372
382
  });
@@ -467,13 +477,32 @@ var Table = class extends AbstractElementWithParent {
467
477
  /**
468
478
  * Вибрати рядок по індексу.
469
479
  * @param index починається з 0
480
+ * @param preserve boolean який изначає, чи повинні раніше вибрані рядки залишатися вибраними
470
481
  */
471
- selectRowByIndex(index) {
472
- return this.getRowByIndex(index).select();
482
+ selectRowByIndex(index, preserve = false) {
483
+ return this.getRowByIndex(index).select(preserve);
473
484
  }
474
- async getRows() {
485
+ /**
486
+ * Вибрати масив рядків по індексу.
487
+ * @param indexes починається з 0
488
+ */
489
+ async selectRowsByIndexes(indexes) {
490
+ for (const index of indexes) {
491
+ await this.selectRowByIndex(index, true);
492
+ }
493
+ }
494
+ getRowElements(timeout) {
475
495
  const rowsFullCssSelector = `${this.getFullCssSelector()} ${this.tableContentCssSelector} .dx-row.dx-data-row`;
476
- const rows = await this.driver.findElements(By6.css(rowsFullCssSelector));
496
+ return withCustomTimeouts_default({
497
+ driver: this.driver,
498
+ timeout,
499
+ callback: () => {
500
+ return this.driver.findElements(By6.css(rowsFullCssSelector));
501
+ }
502
+ });
503
+ }
504
+ async getRows() {
505
+ const rows = await this.getRowElements();
477
506
  const result = [];
478
507
  rows.forEach((_, index) => {
479
508
  const newRow = new Row(
@@ -559,6 +588,72 @@ var Table = class extends AbstractElementWithParent {
559
588
  await contextMenu(cellElement, this.driver);
560
589
  });
561
590
  }
591
+ /**
592
+ * Отримує значення комірки таблиці за ім'ям комірки та індексом рядка.
593
+ *
594
+ * @param {string} cellName - Ім'я комірки (поля) в таблиці
595
+ * @param {number} rowIndex - Індекс рядка (починається з 0)
596
+ * @throws {Error} Викидає помилку, якщо rowIndex не вказано
597
+ * @returns {Promise<string>} Повертає значення комірки
598
+ *
599
+ * @example
600
+ * const table = new Table(driver);
601
+ *
602
+ * // Отримання значення комірки 'Name' в першому рядку (індекс 0)
603
+ * const cellValue = await table.getCellValueByCellName('Name', 0);
604
+ * expect(cellValue).toBe('Очікуване значення');
605
+ */
606
+ getCellValueByCellName(cellName, rowIndex) {
607
+ if (rowIndex == null) {
608
+ throw new Error("Error: getCellValue(): rowIndex is required");
609
+ }
610
+ const row = this.getRowByIndex(rowIndex);
611
+ return row.getCell(cellName).getValue();
612
+ }
613
+ /**
614
+ * Перевіряє, чи є таблиця порожньою (не містить жодного рядка з даними).
615
+ *
616
+ * @returns {Promise<boolean>} Повертає true, якщо таблиця порожня, false - якщо містить рядки
617
+ *
618
+ * @example
619
+ * const table = new Table(driver);
620
+ *
621
+ * // Перевірка чи порожня таблиця
622
+ * const empty = await table.isEmpty();
623
+ * expect(empty).toBe(true);
624
+ */
625
+ async isEmpty() {
626
+ try {
627
+ await this.waitRowsCount(0);
628
+ return true;
629
+ } catch {
630
+ return false;
631
+ }
632
+ }
633
+ /**
634
+ * Очікує, поки кількість рядків у таблиці не стане рівною заданому значенню.
635
+ * Використовується для синхронізації тестів з динамічним завантаженням даних.
636
+ *
637
+ * @param {number} count - Очікувана кількість рядків у таблиці
638
+ * @returns {Promise<void>} Повертає Promise, який виконується, коли кількість рядків відповідає очікуваній
639
+ * @throws {Error} Викидає помилку, якщо очікування перевищує тайм-аут
640
+ *
641
+ * @example
642
+ * const table = new Table(driver);
643
+ *
644
+ * // Очікування, поки таблиця не стане порожньою
645
+ * await table.waitRowsCount(0);
646
+ *
647
+ * // Очікування, поки в таблиці не з'явиться 5 рядків
648
+ * await table.waitRowsCount(5);
649
+ * console.log('Таблиця містить 5 рядків');
650
+ */
651
+ async waitRowsCount(count) {
652
+ await safeWait(async () => {
653
+ const rows = await this.getRowElements(1e3);
654
+ return rows.length === count;
655
+ }, this.driver, `Rows count not equal: ${count}`);
656
+ }
562
657
  };
563
658
 
564
659
  // src/pageObjects/elements/TableToolbar/ToolbarGroupButton.ts
@@ -776,6 +871,14 @@ var ToolbarItem = class extends AbstractElementWithParent {
776
871
  return false;
777
872
  }
778
873
  }
874
+ async isPressed() {
875
+ try {
876
+ await this.init();
877
+ return this._button.isPressed();
878
+ } catch (error) {
879
+ return false;
880
+ }
881
+ }
779
882
  async getTitle() {
780
883
  await this.init();
781
884
  return await this._button.getTitle();
@@ -1161,7 +1264,7 @@ var HeaderFilterField = class extends AbstractEditor {
1161
1264
  // src/pageObjects/elements/Filters/ColumnFilter.ts
1162
1265
  var APPLY_SELECTOR = ".apply-button";
1163
1266
  var CANCEL_SELECTOR = ".cancel-button";
1164
- var HEADER_FILTER_ICON = ".dx-column-indicators .dx-header-filter";
1267
+ var HEADER_FILTER_ICON = ".indicators-container .filter-icon";
1165
1268
  var HEADER_FILTER_CONTAINER = ".header-filter";
1166
1269
  var HEADER_FILTER_BUTTONS = ".header-filter-buttons";
1167
1270
  var ColumnFilter = class extends AbstractElement {
@@ -1195,24 +1298,15 @@ var ColumnFilter = class extends AbstractElement {
1195
1298
  const columnEl = await this._column.getElement();
1196
1299
  const actions = this.driver.actions({ async: true });
1197
1300
  await actions.move({ origin: columnEl }).perform();
1198
- const elements = await columnEl.findElements(By11.css(HEADER_FILTER_ICON));
1199
- let headerFilterIcon = null;
1301
+ const headerFilterIconBy = By11.css(HEADER_FILTER_ICON);
1302
+ let headerFilterIcon = await columnEl.findElement(headerFilterIconBy);
1200
1303
  await safeWait(
1201
- async () => {
1202
- let result = false;
1203
- for (let element of elements) {
1204
- if (await element.isDisplayed()) {
1205
- headerFilterIcon = element;
1206
- result = true;
1207
- break;
1208
- }
1209
- }
1210
- return result;
1304
+ () => {
1305
+ return headerFilterIcon.isDisplayed();
1211
1306
  },
1212
1307
  this.driver,
1213
1308
  `HeaderFilter "${this._name}" is not visible`
1214
1309
  );
1215
- if (!headerFilterIcon) throw new Error(`HeaderFilter "${this._name}" is not visible`);
1216
1310
  await click(headerFilterIcon, this.driver);
1217
1311
  const filter = new HeaderFilterField("", this._formName, this._name, this.driver);
1218
1312
  const filterEl = await filter.getElement();
@@ -1335,9 +1429,9 @@ var ColumnFilter = class extends AbstractElement {
1335
1429
  };
1336
1430
 
1337
1431
  // src/pageObjects/elements/Forms/ListForm.ts
1338
- var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content:not(.dx-datagrid-content-fixed)";
1339
- var DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content:not(.dx-datagrid-content-fixed)";
1340
- var FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-fixed-columns .dx-datagrid-content.dx-datagrid-content-fixed";
1432
+ var DATAGRID_HEADER_CSS_SELECTOR = ".dx-datagrid-headers .dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
1433
+ var DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
1434
+ var FIXED_DATAGRID_CONTENT_CSS_SELECTOR = ".dx-datagrid-sticky-columns .dx-datagrid-content .dx-datagrid-table.dx-datagrid-table-fixed";
1341
1435
  var CONTEXT_MENU_CSS_SELECTOR = ".dx-datagrid";
1342
1436
  var ListForm = class extends Form {
1343
1437
  headerCssSelector;