@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.
- package/README.md +9 -6
- package/dist/engine/rowFinder.js +153 -168
- package/dist/engine/tableIteration.js +105 -120
- package/dist/engine/tableMapper.js +88 -103
- package/dist/minimalConfigContext.d.ts +1 -1
- package/dist/minimalConfigContext.js +1 -1
- package/dist/packageVersion.d.ts +1 -1
- package/dist/packageVersion.js +1 -1
- package/dist/presets/glide/columns.js +23 -32
- package/dist/presets/glide/headers.js +18 -27
- package/dist/presets/glide/index.d.ts +9 -9
- package/dist/presets/glide/index.js +24 -33
- package/dist/presets/mui.js +197 -124
- package/dist/presets/rdg.d.ts +1 -1
- package/dist/presets/rdg.js +32 -41
- package/dist/smartRow.js +209 -101
- package/dist/strategies/columns.js +2 -11
- package/dist/strategies/dedupe.js +3 -12
- package/dist/strategies/fill.js +20 -29
- package/dist/strategies/headers.js +22 -31
- package/dist/strategies/index.d.ts +7 -0
- package/dist/strategies/index.js +3 -0
- package/dist/strategies/loading.js +24 -33
- package/dist/strategies/pagination.d.ts +10 -0
- package/dist/strategies/pagination.js +49 -30
- package/dist/strategies/sorting.js +18 -31
- package/dist/strategies/stabilization.js +28 -37
- package/dist/strategies/viewport.d.ts +52 -0
- package/dist/strategies/viewport.js +123 -0
- package/dist/typeContext.d.ts +1 -1
- package/dist/typeContext.js +160 -5
- package/dist/types.d.ts +153 -5
- package/dist/useTable.js +142 -76
- package/dist/utils/debugUtils.js +5 -16
- package/dist/utils/elementTracker.js +27 -40
- package/dist/utils/mutex.js +5 -16
- package/dist/utils/navigationBarrier.js +25 -36
- package/dist/utils/paginationPath.d.ts +4 -1
- package/dist/utils/paginationPath.js +164 -141
- package/dist/utils/smartRowArray.js +2 -11
- package/dist/utils.js +4 -13
- 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) =>
|
|
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 = () =>
|
|
13
|
+
const getVisible = async () => {
|
|
23
14
|
const headerLoc = resolve(config.headerSelector, root);
|
|
24
|
-
const texts =
|
|
15
|
+
const texts = await headerLoc.allInnerTexts();
|
|
25
16
|
return texts.map(t => t.trim());
|
|
26
|
-
}
|
|
27
|
-
let currentHeaders =
|
|
17
|
+
};
|
|
18
|
+
let currentHeaders = await getVisible();
|
|
28
19
|
currentHeaders.forEach(h => collectedHeaders.add(h));
|
|
29
|
-
const scrollerHandle =
|
|
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 =
|
|
29
|
+
const isScrollerFound = await scrollerHandle.evaluate(el => !!el);
|
|
39
30
|
if (isScrollerFound) {
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
const newHeaders =
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
const retryHeaders =
|
|
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
|
-
|
|
62
|
-
|
|
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("
|
|
7
|
-
header: (context: import("
|
|
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("
|
|
14
|
-
goDown: (context: import("
|
|
15
|
-
goLeft: (context: import("
|
|
16
|
-
goRight: (context: import("
|
|
17
|
-
goHome: (context: import("
|
|
18
|
-
snapFirstColumnIntoView: (context: import("
|
|
19
|
-
seekColumnIndex: (context: import("
|
|
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 =
|
|
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 =
|
|
12
|
+
const box = await cell.boundingBox();
|
|
22
13
|
const canvas = page.locator('canvas').first();
|
|
23
|
-
const cBox =
|
|
14
|
+
const cBox = await canvas.boundingBox();
|
|
24
15
|
if (box && cBox) {
|
|
25
|
-
|
|
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
|
-
|
|
25
|
+
await cell.focus();
|
|
35
26
|
}
|
|
36
|
-
|
|
27
|
+
await page.keyboard.press('Enter');
|
|
37
28
|
const textarea = page.locator('textarea.gdg-input');
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
const glideFillSimple =
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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 =
|
|
66
|
+
const glideGetActiveCell = async ({ page }) => {
|
|
76
67
|
const focused = page.locator('*:focus').first();
|
|
77
|
-
if (
|
|
68
|
+
if (await focused.count() === 0)
|
|
78
69
|
return null;
|
|
79
|
-
const 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: () =>
|
|
99
|
+
isHeaderLoading: async () => false
|
|
109
100
|
},
|
|
110
101
|
getCellLocator: glideGetCellLocator,
|
|
111
102
|
getActiveCell: glideGetActiveCell
|