@rickcedwhat/playwright-smart-table 6.9.0 → 6.10.1

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.
Files changed (42) hide show
  1. package/README.md +9 -6
  2. package/dist/engine/rowFinder.js +153 -168
  3. package/dist/engine/tableIteration.js +105 -120
  4. package/dist/engine/tableMapper.js +88 -103
  5. package/dist/minimalConfigContext.d.ts +1 -1
  6. package/dist/minimalConfigContext.js +1 -1
  7. package/dist/packageVersion.d.ts +1 -1
  8. package/dist/packageVersion.js +1 -1
  9. package/dist/presets/glide/columns.js +23 -32
  10. package/dist/presets/glide/headers.js +18 -27
  11. package/dist/presets/glide/index.d.ts +9 -9
  12. package/dist/presets/glide/index.js +24 -33
  13. package/dist/presets/mui.js +197 -124
  14. package/dist/presets/rdg.d.ts +1 -1
  15. package/dist/presets/rdg.js +32 -41
  16. package/dist/smartRow.js +209 -101
  17. package/dist/strategies/columns.js +2 -11
  18. package/dist/strategies/dedupe.js +3 -12
  19. package/dist/strategies/fill.js +20 -29
  20. package/dist/strategies/headers.js +22 -31
  21. package/dist/strategies/index.d.ts +7 -0
  22. package/dist/strategies/index.js +3 -0
  23. package/dist/strategies/loading.js +24 -33
  24. package/dist/strategies/pagination.d.ts +10 -0
  25. package/dist/strategies/pagination.js +49 -30
  26. package/dist/strategies/sorting.js +18 -31
  27. package/dist/strategies/stabilization.js +28 -37
  28. package/dist/strategies/viewport.d.ts +52 -0
  29. package/dist/strategies/viewport.js +123 -0
  30. package/dist/typeContext.d.ts +1 -1
  31. package/dist/typeContext.js +160 -5
  32. package/dist/types.d.ts +153 -5
  33. package/dist/useTable.js +142 -76
  34. package/dist/utils/debugUtils.js +5 -16
  35. package/dist/utils/elementTracker.js +27 -40
  36. package/dist/utils/mutex.js +5 -16
  37. package/dist/utils/navigationBarrier.js +25 -36
  38. package/dist/utils/paginationPath.d.ts +4 -1
  39. package/dist/utils/paginationPath.js +164 -141
  40. package/dist/utils/smartRowArray.js +2 -11
  41. package/dist/utils.js +4 -13
  42. package/package.json +13 -8
@@ -1,32 +1,23 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.scrollRightHeader = void 0;
13
4
  /**
14
5
  * Scans for headers by finding a scrollable container and setting scrollLeft.
15
6
  */
16
- const scrollRightHeader = (context, options) => __awaiter(void 0, void 0, void 0, function* () {
7
+ const scrollRightHeader = async (context, options) => {
17
8
  var _a, _b;
18
9
  const { resolve, config, root, page } = context;
19
10
  const limit = (_a = options === null || options === void 0 ? void 0 : options.limit) !== null && _a !== void 0 ? _a : 20;
20
11
  const scrollAmount = (_b = options === null || options === void 0 ? void 0 : options.scrollAmount) !== null && _b !== void 0 ? _b : 300;
21
12
  const collectedHeaders = new Set();
22
- const getVisible = () => __awaiter(void 0, void 0, void 0, function* () {
13
+ const getVisible = async () => {
23
14
  const headerLoc = resolve(config.headerSelector, root);
24
- const texts = yield headerLoc.allInnerTexts();
15
+ const texts = await headerLoc.allInnerTexts();
25
16
  return texts.map(t => t.trim());
26
- });
27
- let currentHeaders = yield getVisible();
17
+ };
18
+ let currentHeaders = await getVisible();
28
19
  currentHeaders.forEach(h => collectedHeaders.add(h));
29
- const scrollerHandle = yield root.evaluateHandle((el, selector) => {
20
+ const scrollerHandle = await root.evaluateHandle((el, selector) => {
30
21
  if (selector && el.matches(selector))
31
22
  return el;
32
23
  const effectiveSelector = selector || '.dvn-scroller';
@@ -35,20 +26,20 @@ const scrollRightHeader = (context, options) => __awaiter(void 0, void 0, void 0
35
26
  return ancestor;
36
27
  return document.querySelector(effectiveSelector);
37
28
  }, options === null || options === void 0 ? void 0 : options.selector);
38
- const isScrollerFound = yield scrollerHandle.evaluate(el => !!el);
29
+ const isScrollerFound = await scrollerHandle.evaluate(el => !!el);
39
30
  if (isScrollerFound) {
40
- yield scrollerHandle.evaluate(el => el.scrollLeft = 0);
41
- yield page.waitForTimeout(200);
31
+ await scrollerHandle.evaluate(el => el.scrollLeft = 0);
32
+ await page.waitForTimeout(200);
42
33
  for (let i = 0; i < limit; i++) {
43
34
  const sizeBefore = collectedHeaders.size;
44
- yield scrollerHandle.evaluate((el, amount) => el.scrollLeft += amount, scrollAmount);
45
- yield page.waitForTimeout(300);
46
- const newHeaders = yield getVisible();
35
+ await scrollerHandle.evaluate((el, amount) => el.scrollLeft += amount, scrollAmount);
36
+ await page.waitForTimeout(300);
37
+ const newHeaders = await getVisible();
47
38
  newHeaders.forEach(h => collectedHeaders.add(h));
48
39
  if (collectedHeaders.size === sizeBefore) {
49
- yield scrollerHandle.evaluate((el, amount) => el.scrollLeft += amount, scrollAmount);
50
- yield page.waitForTimeout(300);
51
- const retryHeaders = yield getVisible();
40
+ await scrollerHandle.evaluate((el, amount) => el.scrollLeft += amount, scrollAmount);
41
+ await page.waitForTimeout(300);
42
+ const retryHeaders = await getVisible();
52
43
  retryHeaders.forEach(h => collectedHeaders.add(h));
53
44
  if (collectedHeaders.size === sizeBefore)
54
45
  break;
@@ -58,8 +49,8 @@ const scrollRightHeader = (context, options) => __awaiter(void 0, void 0, void 0
58
49
  else {
59
50
  console.warn("HeaderStrategies.scrollRight: Could not find scroller. Returning visible headers.");
60
51
  }
61
- yield scrollerHandle.evaluate(el => el.scrollLeft = 0);
62
- yield page.waitForTimeout(200);
52
+ await scrollerHandle.evaluate(el => el.scrollLeft = 0);
53
+ await page.waitForTimeout(200);
63
54
  return Array.from(collectedHeaders);
64
- });
55
+ };
65
56
  exports.scrollRightHeader = scrollRightHeader;
@@ -3,20 +3,20 @@ import { FillStrategy, TableConfig } from '../../types';
3
3
  export declare const GlideStrategies: {
4
4
  fillSimple: FillStrategy;
5
5
  fill: FillStrategy;
6
- pagination: import("../../types").PaginationPrimitives;
7
- header: (context: import("../../types").StrategyContext, options?: {
6
+ pagination: import("../..").PaginationPrimitives;
7
+ header: (context: import("../..").StrategyContext, options?: {
8
8
  limit?: number;
9
9
  selector?: string;
10
10
  scrollAmount?: number;
11
11
  }) => Promise<string[]>;
12
12
  navigation: {
13
- goUp: (context: import("../../types").StrategyContext) => Promise<void>;
14
- goDown: (context: import("../../types").StrategyContext) => Promise<void>;
15
- goLeft: (context: import("../../types").StrategyContext) => Promise<void>;
16
- goRight: (context: import("../../types").StrategyContext) => Promise<void>;
17
- goHome: (context: import("../../types").StrategyContext) => Promise<void>;
18
- snapFirstColumnIntoView: (context: import("../../types").StrategyContext) => Promise<void>;
19
- seekColumnIndex: (context: import("../../types").StrategyContext, columnIndex: number) => Promise<void>;
13
+ goUp: (context: import("../..").StrategyContext) => Promise<void>;
14
+ goDown: (context: import("../..").StrategyContext) => Promise<void>;
15
+ goLeft: (context: import("../..").StrategyContext) => Promise<void>;
16
+ goRight: (context: import("../..").StrategyContext) => Promise<void>;
17
+ goHome: (context: import("../..").StrategyContext) => Promise<void>;
18
+ snapFirstColumnIntoView: (context: import("../..").StrategyContext) => Promise<void>;
19
+ seekColumnIndex: (context: import("../..").StrategyContext, columnIndex: number) => Promise<void>;
20
20
  };
21
21
  loading: {
22
22
  isHeaderLoading: () => Promise<boolean>;
@@ -1,28 +1,19 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.Glide = exports.GlideStrategies = void 0;
13
4
  const columns_1 = require("./columns");
14
5
  const headers_1 = require("./headers");
15
6
  const pagination_1 = require("../../strategies/pagination");
16
7
  const stabilization_1 = require("../../strategies/stabilization");
17
- const glideFillStrategy = (_a) => __awaiter(void 0, [_a], void 0, function* ({ row, columnName, value, page }) {
8
+ const glideFillStrategy = async ({ row, columnName, value, page }) => {
18
9
  // Canvas-aware click: Glide is a canvas grid. The accessibility 'td' elements
19
10
  // may not trigger internal focus on a simple click. We click the canvas at the cell's location.
20
11
  const cell = row.getCell(columnName);
21
- const box = yield cell.boundingBox();
12
+ const box = await cell.boundingBox();
22
13
  const canvas = page.locator('canvas').first();
23
- const cBox = yield canvas.boundingBox();
14
+ const cBox = await canvas.boundingBox();
24
15
  if (box && cBox) {
25
- yield canvas.click({
16
+ await canvas.click({
26
17
  position: {
27
18
  x: box.x - cBox.x + box.width / 2,
28
19
  y: box.y - cBox.y + box.height / 2
@@ -31,13 +22,13 @@ const glideFillStrategy = (_a) => __awaiter(void 0, [_a], void 0, function* ({ r
31
22
  }
32
23
  else {
33
24
  // Fallback
34
- yield cell.focus();
25
+ await cell.focus();
35
26
  }
36
- yield page.keyboard.press('Enter');
27
+ await page.keyboard.press('Enter');
37
28
  const textarea = page.locator('textarea.gdg-input');
38
- yield textarea.waitFor({ state: 'visible', timeout: 2000 });
39
- yield page.keyboard.type(String(value));
40
- yield textarea.evaluate((el, expectedValue) => {
29
+ await textarea.waitFor({ state: 'visible', timeout: 2000 });
30
+ await page.keyboard.type(String(value));
31
+ await textarea.evaluate((el, expectedValue) => {
41
32
  return new Promise((resolve) => {
42
33
  const checkValue = () => {
43
34
  if (el.value === expectedValue) {
@@ -50,16 +41,16 @@ const glideFillStrategy = (_a) => __awaiter(void 0, [_a], void 0, function* ({ r
50
41
  checkValue();
51
42
  });
52
43
  }, String(value));
53
- yield page.waitForTimeout(50);
54
- yield page.keyboard.press('Enter');
55
- yield textarea.waitFor({ state: 'detached', timeout: 2000 });
56
- yield page.waitForTimeout(300);
57
- });
58
- const glideFillSimple = (_a) => __awaiter(void 0, [_a], void 0, function* ({ value, page }) {
59
- yield page.keyboard.press('Enter');
60
- yield page.keyboard.type(String(value));
61
- yield page.keyboard.press('Enter');
62
- });
44
+ await page.waitForTimeout(50);
45
+ await page.keyboard.press('Enter');
46
+ await textarea.waitFor({ state: 'detached', timeout: 2000 });
47
+ await page.waitForTimeout(300);
48
+ };
49
+ const glideFillSimple = async ({ value, page }) => {
50
+ await page.keyboard.press('Enter');
51
+ await page.keyboard.type(String(value));
52
+ await page.keyboard.press('Enter');
53
+ };
63
54
  const glidePaginationStrategy = pagination_1.PaginationStrategies.infiniteScroll({
64
55
  scrollTarget: 'xpath=//ancestor::body//div[contains(@class, "dvn-scroller")]',
65
56
  scrollAmount: 500,
@@ -72,11 +63,11 @@ const glideGetCellLocator = ({ row, columnIndex }) => {
72
63
  // Rows are virtualized: only a window of `td`s exists; navigation must scroll `.dvn-scroller`.
73
64
  return row.locator(`td[aria-colindex="${columnIndex + 1}"]`);
74
65
  };
75
- const glideGetActiveCell = (_a) => __awaiter(void 0, [_a], void 0, function* ({ page }) {
66
+ const glideGetActiveCell = async ({ page }) => {
76
67
  const focused = page.locator('*:focus').first();
77
- if ((yield focused.count()) === 0)
68
+ if (await focused.count() === 0)
78
69
  return null;
79
- const id = (yield focused.getAttribute('id')) || '';
70
+ const id = await focused.getAttribute('id') || '';
80
71
  const parts = id.split('-');
81
72
  let rowIndex = -1;
82
73
  let columnIndex = -1;
@@ -89,7 +80,7 @@ const glideGetActiveCell = (_a) => __awaiter(void 0, [_a], void 0, function* ({
89
80
  columnIndex,
90
81
  locator: focused
91
82
  };
92
- });
83
+ };
93
84
  /** Default strategies for the Glide preset (fill only; no fillSimple). */
94
85
  const GlideDefaultStrategies = {
95
86
  fill: glideFillStrategy,
@@ -105,7 +96,7 @@ const GlideDefaultStrategies = {
105
96
  seekColumnIndex: columns_1.glideSeekColumnIndex
106
97
  },
107
98
  loading: {
108
- isHeaderLoading: () => __awaiter(void 0, void 0, void 0, function* () { return false; })
99
+ isHeaderLoading: async () => false
109
100
  },
110
101
  getCellLocator: glideGetCellLocator,
111
102
  getActiveCell: glideGetActiveCell