@powerhousedao/document-engineering 1.39.0 → 1.40.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 +12 -0
- package/dist/src/scalars/graphql/Amount.d.ts +1 -7
- package/dist/src/scalars/graphql/Amount.d.ts.map +1 -1
- package/dist/src/scalars/graphql/AmountCrypto.d.ts +1 -7
- package/dist/src/scalars/graphql/AmountCrypto.d.ts.map +1 -1
- package/dist/src/scalars/graphql/AmountCurrency.d.ts +1 -7
- package/dist/src/scalars/graphql/AmountCurrency.d.ts.map +1 -1
- package/dist/src/scalars/graphql/AmountFiat.d.ts +1 -7
- package/dist/src/scalars/graphql/AmountFiat.d.ts.map +1 -1
- package/dist/src/scalars/graphql/Date.d.ts +2 -2
- package/dist/src/scalars/graphql/Date.d.ts.map +1 -1
- package/dist/src/scalars/graphql/Date.js +2 -2
- package/dist/src/scalars/graphql/Date.js.map +1 -1
- package/dist/src/scalars/graphql/DateTime.d.ts +2 -2
- package/dist/src/scalars/graphql/DateTime.d.ts.map +1 -1
- package/dist/src/scalars/graphql/DateTime.js +2 -2
- package/dist/src/scalars/graphql/DateTime.js.map +1 -1
- package/dist/src/scalars/graphql/EmailAddress.d.ts +2 -2
- package/dist/src/scalars/graphql/EmailAddress.d.ts.map +1 -1
- package/dist/src/scalars/graphql/EmailAddress.js +2 -2
- package/dist/src/scalars/graphql/EmailAddress.js.map +1 -1
- package/dist/src/scalars/graphql/URL.d.ts +2 -2
- package/dist/src/scalars/graphql/URL.d.ts.map +1 -1
- package/dist/src/scalars/graphql/URL.js +2 -2
- package/dist/src/scalars/graphql/URL.js.map +1 -1
- package/dist/src/table/components/default-fns/default-cell-on-save.d.ts +11 -0
- package/dist/src/table/components/default-fns/default-cell-on-save.d.ts.map +1 -0
- package/dist/src/table/components/default-fns/default-cell-on-save.js +18 -0
- package/dist/src/table/components/default-fns/default-cell-on-save.js.map +1 -0
- package/dist/src/table/table/object-set-table.d.ts.map +1 -1
- package/dist/src/table/table/object-set-table.js +2 -11
- package/dist/src/table/table/object-set-table.js.map +1 -1
- package/dist/src/table/tests/basic-rendering.test.d.ts +2 -0
- package/dist/src/table/tests/basic-rendering.test.d.ts.map +1 -0
- package/dist/src/table/tests/basic-rendering.test.js +332 -0
- package/dist/src/table/tests/basic-rendering.test.js.map +1 -0
- package/dist/src/table/tests/cell-selection.test.d.ts +2 -0
- package/dist/src/table/tests/cell-selection.test.d.ts.map +1 -0
- package/dist/src/table/tests/cell-selection.test.js +346 -0
- package/dist/src/table/tests/cell-selection.test.js.map +1 -0
- package/dist/src/table/tests/helpers/test-utils.d.ts +28 -0
- package/dist/src/table/tests/helpers/test-utils.d.ts.map +1 -0
- package/dist/src/table/tests/helpers/test-utils.js +85 -0
- package/dist/src/table/tests/helpers/test-utils.js.map +1 -0
- package/dist/src/table/tests/page-objects/base-table.page.d.ts +83 -0
- package/dist/src/table/tests/page-objects/base-table.page.d.ts.map +1 -0
- package/dist/src/table/tests/page-objects/base-table.page.js +146 -0
- package/dist/src/table/tests/page-objects/base-table.page.js.map +1 -0
- package/dist/src/table/tests/page-objects/table-cell.page.d.ts +58 -0
- package/dist/src/table/tests/page-objects/table-cell.page.d.ts.map +1 -0
- package/dist/src/table/tests/page-objects/table-cell.page.js +163 -0
- package/dist/src/table/tests/page-objects/table-cell.page.js.map +1 -0
- package/dist/src/table/tests/page-objects/table-header.page.d.ts +66 -0
- package/dist/src/table/tests/page-objects/table-header.page.d.ts.map +1 -0
- package/dist/src/table/tests/page-objects/table-header.page.js +156 -0
- package/dist/src/table/tests/page-objects/table-header.page.js.map +1 -0
- package/dist/src/table/tests/page-objects/table-row.page.d.ts +98 -0
- package/dist/src/table/tests/page-objects/table-row.page.d.ts.map +1 -0
- package/dist/src/table/tests/page-objects/table-row.page.js +240 -0
- package/dist/src/table/tests/page-objects/table-row.page.js.map +1 -0
- package/dist/src/table/tests/page-objects/table.page.d.ts +36 -0
- package/dist/src/table/tests/page-objects/table.page.d.ts.map +1 -0
- package/dist/src/table/tests/page-objects/table.page.js +46 -0
- package/dist/src/table/tests/page-objects/table.page.js.map +1 -0
- package/dist/src/table/tests/row-actions.test.d.ts +2 -0
- package/dist/src/table/tests/row-actions.test.d.ts.map +1 -0
- package/dist/src/table/tests/row-actions.test.js +601 -0
- package/dist/src/table/tests/row-actions.test.js.map +1 -0
- package/dist/src/table/tests/row-selection.test.d.ts +2 -0
- package/dist/src/table/tests/row-selection.test.d.ts.map +1 -0
- package/dist/src/table/tests/row-selection.test.js +272 -0
- package/dist/src/table/tests/row-selection.test.js.map +1 -0
- package/dist/src/table/tests/sorting.test.d.ts +2 -0
- package/dist/src/table/tests/sorting.test.d.ts.map +1 -0
- package/dist/src/table/tests/sorting.test.js +793 -0
- package/dist/src/table/tests/sorting.test.js.map +1 -0
- package/dist/src/ui/components/data-entry/date-picker/date-picker.js +1 -1
- package/dist/src/ui/components/data-entry/date-picker/date-picker.js.map +1 -1
- package/dist/style.css +4 -5
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { screen } from '@testing-library/react';
|
|
2
|
+
/**
|
|
3
|
+
* Base page object class for table interactions
|
|
4
|
+
* Provides common methods to query and interact with the table component
|
|
5
|
+
*/
|
|
6
|
+
export class BaseTablePage {
|
|
7
|
+
container;
|
|
8
|
+
renderResult;
|
|
9
|
+
constructor(renderResult) {
|
|
10
|
+
this.container = renderResult.container;
|
|
11
|
+
this.renderResult = renderResult;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Gets the main table element
|
|
15
|
+
*/
|
|
16
|
+
getTable() {
|
|
17
|
+
return screen.getByRole('table');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Gets the table header element
|
|
21
|
+
*/
|
|
22
|
+
getTableHeader() {
|
|
23
|
+
return this.getTable().querySelector('thead');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Gets the table body element
|
|
27
|
+
*/
|
|
28
|
+
getTableBody() {
|
|
29
|
+
return this.getTable().querySelector('tbody');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Gets all table rows (excluding header)
|
|
33
|
+
*/
|
|
34
|
+
getTableRows() {
|
|
35
|
+
const tbody = this.getTableBody();
|
|
36
|
+
return Array.from(tbody.querySelectorAll('tr'));
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Gets all header rows
|
|
40
|
+
*/
|
|
41
|
+
getHeaderRows() {
|
|
42
|
+
const thead = this.getTableHeader();
|
|
43
|
+
return Array.from(thead.querySelectorAll('tr'));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Gets a specific row by index (0-based)
|
|
47
|
+
*/
|
|
48
|
+
getRowByIndex(index) {
|
|
49
|
+
const rows = this.getTableRows();
|
|
50
|
+
return rows[index] || null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Gets all cells in a specific row
|
|
54
|
+
*/
|
|
55
|
+
getCellsInRow(row) {
|
|
56
|
+
return Array.from(row.querySelectorAll('td, th'));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Gets a specific cell by row and column index (0-based)
|
|
60
|
+
*/
|
|
61
|
+
getCellByIndex(rowIndex, columnIndex) {
|
|
62
|
+
const row = this.getRowByIndex(rowIndex);
|
|
63
|
+
if (!row)
|
|
64
|
+
return null;
|
|
65
|
+
const cells = this.getCellsInRow(row);
|
|
66
|
+
return cells[columnIndex] || null;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Gets all header cells
|
|
70
|
+
*/
|
|
71
|
+
getHeaderCells() {
|
|
72
|
+
const headerRows = this.getHeaderRows();
|
|
73
|
+
if (headerRows.length === 0)
|
|
74
|
+
return [];
|
|
75
|
+
return this.getCellsInRow(headerRows[0]);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Gets a specific header cell by index (0-based)
|
|
79
|
+
*/
|
|
80
|
+
getHeaderCellByIndex(index) {
|
|
81
|
+
const headerCells = this.getHeaderCells();
|
|
82
|
+
return headerCells[index] || null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Gets the text content of a cell
|
|
86
|
+
*/
|
|
87
|
+
getCellText(rowIndex, columnIndex) {
|
|
88
|
+
const cell = this.getCellByIndex(rowIndex, columnIndex);
|
|
89
|
+
return cell ? (cell.textContent || '').trim() : '';
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Gets the text content of a header cell
|
|
93
|
+
*/
|
|
94
|
+
getHeaderCellText(columnIndex) {
|
|
95
|
+
const headerCell = this.getHeaderCellByIndex(columnIndex);
|
|
96
|
+
return headerCell ? (headerCell.textContent || '').trim() : '';
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Gets the number of rows in the table (excluding header)
|
|
100
|
+
*/
|
|
101
|
+
getRowCount() {
|
|
102
|
+
return this.getTableRows().length;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Gets the number of columns in the table
|
|
106
|
+
*/
|
|
107
|
+
getColumnCount() {
|
|
108
|
+
const headerCells = this.getHeaderCells();
|
|
109
|
+
return headerCells.length;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Checks if the table is present in the DOM
|
|
113
|
+
*/
|
|
114
|
+
isTablePresent() {
|
|
115
|
+
try {
|
|
116
|
+
this.getTable();
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Gets all column headers as an array of strings
|
|
125
|
+
*/
|
|
126
|
+
getColumnHeaders() {
|
|
127
|
+
return this.getHeaderCells().map((cell) => (cell.textContent || '').trim());
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Finds a row that contains specific text
|
|
131
|
+
*/
|
|
132
|
+
findRowByText(text) {
|
|
133
|
+
const rows = this.getTableRows();
|
|
134
|
+
return rows.find((row) => (row.textContent || '').includes(text)) ?? null;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Gets all text content from a specific row
|
|
138
|
+
*/
|
|
139
|
+
getRowText(rowIndex) {
|
|
140
|
+
const row = this.getRowByIndex(rowIndex);
|
|
141
|
+
if (!row)
|
|
142
|
+
return [];
|
|
143
|
+
return this.getCellsInRow(row).map((cell) => (cell.textContent || '').trim());
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=base-table.page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-table.page.js","sourceRoot":"","sources":["../../../../../src/table/tests/page-objects/base-table.page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { BaseTablePage } from './base-table.page.js';
|
|
2
|
+
import type { RenderResult } from '@testing-library/react';
|
|
3
|
+
/**
|
|
4
|
+
* Page object for cell-specific interactions
|
|
5
|
+
* Extends BaseTablePage with cell-focused methods
|
|
6
|
+
*/
|
|
7
|
+
export declare class TableCellPage extends BaseTablePage {
|
|
8
|
+
constructor(renderResult: RenderResult);
|
|
9
|
+
/**
|
|
10
|
+
* Gets the value of a specific cell
|
|
11
|
+
*/
|
|
12
|
+
getCellValue(rowIndex: number, columnIndex: number): string;
|
|
13
|
+
/**
|
|
14
|
+
* Checks if a cell is editable (has input or contenteditable)
|
|
15
|
+
*/
|
|
16
|
+
isCellEditable(rowIndex: number, columnIndex: number): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Gets the input element within a cell (if editable)
|
|
19
|
+
*/
|
|
20
|
+
getCellInput(rowIndex: number, columnIndex: number): HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null;
|
|
21
|
+
/**
|
|
22
|
+
* Checks if a cell is currently in edit mode
|
|
23
|
+
*/
|
|
24
|
+
isCellInEditMode(rowIndex: number, columnIndex: number): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Gets the data type of a cell based on its content or input type
|
|
27
|
+
*/
|
|
28
|
+
getCellDataType(rowIndex: number, columnIndex: number): string;
|
|
29
|
+
/**
|
|
30
|
+
* Checks if a cell contains a specific value
|
|
31
|
+
*/
|
|
32
|
+
cellContains(rowIndex: number, columnIndex: number, value: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Gets all cells in a specific column
|
|
35
|
+
*/
|
|
36
|
+
getColumnCells(columnIndex: number): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Checks if a cell is empty
|
|
39
|
+
*/
|
|
40
|
+
isCellEmpty(rowIndex: number, columnIndex: number): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Gets the CSS classes of a cell
|
|
43
|
+
*/
|
|
44
|
+
getCellClasses(rowIndex: number, columnIndex: number): string[];
|
|
45
|
+
/**
|
|
46
|
+
* Checks if a cell has a specific CSS class
|
|
47
|
+
*/
|
|
48
|
+
cellHasClass(rowIndex: number, columnIndex: number, className: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Checks if a cell is currently selected
|
|
51
|
+
*/
|
|
52
|
+
isCellSelected(rowIndex: number, columnIndex: number): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Gets the border color of a selected cell
|
|
55
|
+
*/
|
|
56
|
+
getCellBorderColor(rowIndex: number, columnIndex: number): string;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=table-cell.page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-cell.page.d.ts","sourceRoot":"","sources":["../../../../../src/table/tests/page-objects/table-cell.page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAE1D;;;GAGG;AACH,qBAAa,aAAc,SAAQ,aAAa;gBAClC,YAAY,EAAE,YAAY;IAItC;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAI3D;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAY9D;;OAEG;IACH,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAClB,gBAAgB,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,IAAI;IAOpE;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IA0BhE;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAoB9D;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAK3E;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE;IAW7C;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAK3D;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE;IAO/D;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAK/E;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAc9D;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAelE"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { BaseTablePage } from './base-table.page.js';
|
|
2
|
+
/**
|
|
3
|
+
* Page object for cell-specific interactions
|
|
4
|
+
* Extends BaseTablePage with cell-focused methods
|
|
5
|
+
*/
|
|
6
|
+
export class TableCellPage extends BaseTablePage {
|
|
7
|
+
constructor(renderResult) {
|
|
8
|
+
super(renderResult);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Gets the value of a specific cell
|
|
12
|
+
*/
|
|
13
|
+
getCellValue(rowIndex, columnIndex) {
|
|
14
|
+
return this.getCellText(rowIndex, columnIndex);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Checks if a cell is editable (has input or contenteditable)
|
|
18
|
+
*/
|
|
19
|
+
isCellEditable(rowIndex, columnIndex) {
|
|
20
|
+
const cell = this.getCellByIndex(rowIndex, columnIndex);
|
|
21
|
+
if (!cell)
|
|
22
|
+
return false;
|
|
23
|
+
// Check for input elements
|
|
24
|
+
const hasInput = cell.querySelector('input, textarea, select') !== null;
|
|
25
|
+
// Check for contenteditable attribute
|
|
26
|
+
const isContentEditable = cell.getAttribute('contenteditable') === 'true';
|
|
27
|
+
return hasInput || isContentEditable;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Gets the input element within a cell (if editable)
|
|
31
|
+
*/
|
|
32
|
+
getCellInput(rowIndex, columnIndex) {
|
|
33
|
+
const cell = this.getCellByIndex(rowIndex, columnIndex);
|
|
34
|
+
if (!cell)
|
|
35
|
+
return null;
|
|
36
|
+
return cell.querySelector('input, textarea, select');
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Checks if a cell is currently in edit mode
|
|
40
|
+
*/
|
|
41
|
+
isCellInEditMode(rowIndex, columnIndex) {
|
|
42
|
+
const cell = this.getCellByIndex(rowIndex, columnIndex);
|
|
43
|
+
if (!cell)
|
|
44
|
+
return false;
|
|
45
|
+
// First check if the cell is editable at all
|
|
46
|
+
if (!this.isCellEditable(rowIndex, columnIndex)) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
// Look for the form structure and check if the editor div is visible
|
|
50
|
+
const form = cell.querySelector('form');
|
|
51
|
+
if (!form)
|
|
52
|
+
return false;
|
|
53
|
+
// Find the editor div (the one that should be visible in edit mode)
|
|
54
|
+
const editorDiv = form.querySelector('div:not([class*="hidden"])');
|
|
55
|
+
if (!editorDiv)
|
|
56
|
+
return false;
|
|
57
|
+
// Check if this div contains an input and is not hidden
|
|
58
|
+
const input = editorDiv.querySelector('input, textarea, select');
|
|
59
|
+
if (!input)
|
|
60
|
+
return false;
|
|
61
|
+
// Check if the editor div is actually visible (not hidden by CSS)
|
|
62
|
+
const editorStyles = window.getComputedStyle(editorDiv);
|
|
63
|
+
return editorStyles.display !== 'none' && editorStyles.visibility !== 'hidden';
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Gets the data type of a cell based on its content or input type
|
|
67
|
+
*/
|
|
68
|
+
getCellDataType(rowIndex, columnIndex) {
|
|
69
|
+
const input = this.getCellInput(rowIndex, columnIndex);
|
|
70
|
+
if (input) {
|
|
71
|
+
return input.type || input.tagName.toLowerCase();
|
|
72
|
+
}
|
|
73
|
+
const cell = this.getCellByIndex(rowIndex, columnIndex);
|
|
74
|
+
if (!cell)
|
|
75
|
+
return 'unknown';
|
|
76
|
+
// Try to infer type from content
|
|
77
|
+
const text = (cell.textContent || '').trim();
|
|
78
|
+
if (text === 'true' || text === 'false')
|
|
79
|
+
return 'boolean';
|
|
80
|
+
if (!isNaN(Number(text)) && text !== '')
|
|
81
|
+
return 'number';
|
|
82
|
+
if (text.includes('@'))
|
|
83
|
+
return 'email';
|
|
84
|
+
if (text.startsWith('http'))
|
|
85
|
+
return 'url';
|
|
86
|
+
return 'string';
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Checks if a cell contains a specific value
|
|
90
|
+
*/
|
|
91
|
+
cellContains(rowIndex, columnIndex, value) {
|
|
92
|
+
const cellValue = this.getCellValue(rowIndex, columnIndex);
|
|
93
|
+
return cellValue.includes(value);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Gets all cells in a specific column
|
|
97
|
+
*/
|
|
98
|
+
getColumnCells(columnIndex) {
|
|
99
|
+
const rowCount = this.getRowCount();
|
|
100
|
+
const columnCells = [];
|
|
101
|
+
for (let i = 0; i < rowCount; i++) {
|
|
102
|
+
columnCells.push(this.getCellValue(i, columnIndex));
|
|
103
|
+
}
|
|
104
|
+
return columnCells;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Checks if a cell is empty
|
|
108
|
+
*/
|
|
109
|
+
isCellEmpty(rowIndex, columnIndex) {
|
|
110
|
+
const value = this.getCellValue(rowIndex, columnIndex);
|
|
111
|
+
return value === '';
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Gets the CSS classes of a cell
|
|
115
|
+
*/
|
|
116
|
+
getCellClasses(rowIndex, columnIndex) {
|
|
117
|
+
const cell = this.getCellByIndex(rowIndex, columnIndex);
|
|
118
|
+
if (!cell)
|
|
119
|
+
return [];
|
|
120
|
+
return Array.from(cell.classList);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Checks if a cell has a specific CSS class
|
|
124
|
+
*/
|
|
125
|
+
cellHasClass(rowIndex, columnIndex, className) {
|
|
126
|
+
const classes = this.getCellClasses(rowIndex, columnIndex);
|
|
127
|
+
return classes.includes(className);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Checks if a cell is currently selected
|
|
131
|
+
*/
|
|
132
|
+
isCellSelected(rowIndex, columnIndex) {
|
|
133
|
+
const cell = this.getCellByIndex(rowIndex, columnIndex);
|
|
134
|
+
if (!cell)
|
|
135
|
+
return false;
|
|
136
|
+
// Check for selection border classes in the inner div
|
|
137
|
+
const innerDiv = cell.querySelector('div[class*="border-"]');
|
|
138
|
+
if (!innerDiv)
|
|
139
|
+
return false;
|
|
140
|
+
const classes = Array.from(innerDiv.classList);
|
|
141
|
+
return classes.some((cls) => cls.includes('border-blue-900') || cls.includes('border-gray-400') || cls.includes('border-red-900'));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Gets the border color of a selected cell
|
|
145
|
+
*/
|
|
146
|
+
getCellBorderColor(rowIndex, columnIndex) {
|
|
147
|
+
const cell = this.getCellByIndex(rowIndex, columnIndex);
|
|
148
|
+
if (!cell)
|
|
149
|
+
return 'none';
|
|
150
|
+
const innerDiv = cell.querySelector('div[class*="border-"]');
|
|
151
|
+
if (!innerDiv)
|
|
152
|
+
return 'none';
|
|
153
|
+
const classes = Array.from(innerDiv.classList);
|
|
154
|
+
if (classes.some((cls) => cls.includes('border-blue-900')))
|
|
155
|
+
return 'blue';
|
|
156
|
+
if (classes.some((cls) => cls.includes('border-gray-400')))
|
|
157
|
+
return 'gray';
|
|
158
|
+
if (classes.some((cls) => cls.includes('border-red-900')))
|
|
159
|
+
return 'red';
|
|
160
|
+
return 'none';
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=table-cell.page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-cell.page.js","sourceRoot":"","sources":["../../../../../src/table/tests/page-objects/table-cell.page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { BaseTablePage } from './base-table.page.js';
|
|
2
|
+
import type { RenderResult } from '@testing-library/react';
|
|
3
|
+
/**
|
|
4
|
+
* Page object for header-specific interactions
|
|
5
|
+
* Extends BaseTablePage with header-focused methods
|
|
6
|
+
*/
|
|
7
|
+
export declare class TableHeaderPage extends BaseTablePage {
|
|
8
|
+
constructor(renderResult: RenderResult);
|
|
9
|
+
/**
|
|
10
|
+
* Gets the title of a specific column
|
|
11
|
+
*/
|
|
12
|
+
getColumnTitle(columnIndex: number): string;
|
|
13
|
+
/**
|
|
14
|
+
* Gets all column titles
|
|
15
|
+
*/
|
|
16
|
+
getColumnTitles(): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Checks if a column is sortable
|
|
19
|
+
*/
|
|
20
|
+
isColumnSortable(columnIndex: number): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Gets the sort direction of a column (if sorted)
|
|
23
|
+
*/
|
|
24
|
+
getColumnSortDirection(columnIndex: number): 'asc' | 'desc' | null;
|
|
25
|
+
/**
|
|
26
|
+
* Checks if a column is currently sorted
|
|
27
|
+
*/
|
|
28
|
+
isColumnSorted(columnIndex: number): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Gets the width of a column header
|
|
31
|
+
*/
|
|
32
|
+
getColumnWidth(columnIndex: number): number;
|
|
33
|
+
/**
|
|
34
|
+
* Gets the CSS classes of a header cell
|
|
35
|
+
*/
|
|
36
|
+
getHeaderCellClasses(columnIndex: number): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Checks if a header cell has a specific CSS class
|
|
39
|
+
*/
|
|
40
|
+
headerCellHasClass(columnIndex: number, className: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Checks if a column is hidden
|
|
43
|
+
*/
|
|
44
|
+
isColumnHidden(columnIndex: number): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Gets the alignment of a column header
|
|
47
|
+
*/
|
|
48
|
+
getColumnAlignment(columnIndex: number): 'left' | 'center' | 'right' | null;
|
|
49
|
+
/**
|
|
50
|
+
* Finds the index of a column by its title
|
|
51
|
+
*/
|
|
52
|
+
findColumnIndexByTitle(title: string): number;
|
|
53
|
+
/**
|
|
54
|
+
* Checks if a column title contains specific text
|
|
55
|
+
*/
|
|
56
|
+
columnTitleContains(columnIndex: number, text: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Gets the total width of all visible columns
|
|
59
|
+
*/
|
|
60
|
+
getTotalHeaderWidth(): number;
|
|
61
|
+
/**
|
|
62
|
+
* Checks if the header is sticky/fixed
|
|
63
|
+
*/
|
|
64
|
+
isHeaderSticky(): boolean;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=table-header.page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-header.page.d.ts","sourceRoot":"","sources":["../../../../../src/table/tests/page-objects/table-header.page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAE1D;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,YAAY,EAAE,YAAY;IAItC;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAI3C;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAY9C;;OAEG;IACH,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI;IAkBlE;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAI5C;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAO3C;;OAEG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE;IAOnD;;OAEG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAKnE;;OAEG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAe5C;;OAEG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI;IAc3E;;OAEG;IACH,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK7C;;OAEG;IACH,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAK/D;;OAEG;IACH,mBAAmB,IAAI,MAAM;IAa7B;;OAEG;IACH,cAAc,IAAI,OAAO;CAY1B"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { BaseTablePage } from './base-table.page.js';
|
|
2
|
+
/**
|
|
3
|
+
* Page object for header-specific interactions
|
|
4
|
+
* Extends BaseTablePage with header-focused methods
|
|
5
|
+
*/
|
|
6
|
+
export class TableHeaderPage extends BaseTablePage {
|
|
7
|
+
constructor(renderResult) {
|
|
8
|
+
super(renderResult);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Gets the title of a specific column
|
|
12
|
+
*/
|
|
13
|
+
getColumnTitle(columnIndex) {
|
|
14
|
+
return this.getHeaderCellText(columnIndex);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Gets all column titles
|
|
18
|
+
*/
|
|
19
|
+
getColumnTitles() {
|
|
20
|
+
return this.getColumnHeaders();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Checks if a column is sortable
|
|
24
|
+
*/
|
|
25
|
+
isColumnSortable(columnIndex) {
|
|
26
|
+
const headerCell = this.getHeaderCellByIndex(columnIndex);
|
|
27
|
+
if (!headerCell)
|
|
28
|
+
return false;
|
|
29
|
+
// Check for sort indicators (SVG elements) or clickable elements
|
|
30
|
+
const hasSortIcon = headerCell.querySelector('svg') !== null;
|
|
31
|
+
const hasClickable = headerCell.querySelector('button, [role="button"]') !== null;
|
|
32
|
+
const hasSortClass = headerCell.classList.contains('cursor-pointer');
|
|
33
|
+
return hasSortIcon || hasClickable || hasSortClass;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Gets the sort direction of a column (if sorted)
|
|
37
|
+
*/
|
|
38
|
+
getColumnSortDirection(columnIndex) {
|
|
39
|
+
const headerCell = this.getHeaderCellByIndex(columnIndex);
|
|
40
|
+
if (!headerCell)
|
|
41
|
+
return null;
|
|
42
|
+
// Look for sort direction indicators in the SVG
|
|
43
|
+
const sortIcon = headerCell.querySelector('svg');
|
|
44
|
+
if (!sortIcon)
|
|
45
|
+
return null;
|
|
46
|
+
const classString = sortIcon.className;
|
|
47
|
+
// Check for ascending indicator: [&_path:last-child]:stroke-gray-900
|
|
48
|
+
if (classString.includes('[&_path:last-child]:stroke-gray-900'))
|
|
49
|
+
return 'asc';
|
|
50
|
+
// Check for descending indicator: [&_path:first-child]:stroke-gray-900
|
|
51
|
+
if (classString.includes('[&_path:first-child]:stroke-gray-900'))
|
|
52
|
+
return 'desc';
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Checks if a column is currently sorted
|
|
57
|
+
*/
|
|
58
|
+
isColumnSorted(columnIndex) {
|
|
59
|
+
return this.getColumnSortDirection(columnIndex) !== null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Gets the width of a column header
|
|
63
|
+
*/
|
|
64
|
+
getColumnWidth(columnIndex) {
|
|
65
|
+
const headerCell = this.getHeaderCellByIndex(columnIndex);
|
|
66
|
+
if (!headerCell)
|
|
67
|
+
return 0;
|
|
68
|
+
return headerCell.getBoundingClientRect().width;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Gets the CSS classes of a header cell
|
|
72
|
+
*/
|
|
73
|
+
getHeaderCellClasses(columnIndex) {
|
|
74
|
+
const headerCell = this.getHeaderCellByIndex(columnIndex);
|
|
75
|
+
if (!headerCell)
|
|
76
|
+
return [];
|
|
77
|
+
return Array.from(headerCell.classList);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Checks if a header cell has a specific CSS class
|
|
81
|
+
*/
|
|
82
|
+
headerCellHasClass(columnIndex, className) {
|
|
83
|
+
const classes = this.getHeaderCellClasses(columnIndex);
|
|
84
|
+
return classes.includes(className);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Checks if a column is hidden
|
|
88
|
+
*/
|
|
89
|
+
isColumnHidden(columnIndex) {
|
|
90
|
+
const headerCell = this.getHeaderCellByIndex(columnIndex);
|
|
91
|
+
if (!headerCell)
|
|
92
|
+
return false;
|
|
93
|
+
const classes = this.getHeaderCellClasses(columnIndex);
|
|
94
|
+
const style = headerCell.style;
|
|
95
|
+
return (classes.includes('hidden') ||
|
|
96
|
+
style.display === 'none' ||
|
|
97
|
+
style.visibility === 'hidden' ||
|
|
98
|
+
headerCell.getAttribute('aria-hidden') === 'true');
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Gets the alignment of a column header
|
|
102
|
+
*/
|
|
103
|
+
getColumnAlignment(columnIndex) {
|
|
104
|
+
const headerCell = this.getHeaderCellByIndex(columnIndex);
|
|
105
|
+
if (!headerCell)
|
|
106
|
+
return null;
|
|
107
|
+
const classes = this.getHeaderCellClasses(columnIndex);
|
|
108
|
+
const style = headerCell.style;
|
|
109
|
+
if (classes.includes('text-center') || style.textAlign === 'center')
|
|
110
|
+
return 'center';
|
|
111
|
+
if (classes.includes('text-right') || style.textAlign === 'right')
|
|
112
|
+
return 'right';
|
|
113
|
+
if (classes.includes('text-left') || style.textAlign === 'left')
|
|
114
|
+
return 'left';
|
|
115
|
+
return 'left'; // default
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Finds the index of a column by its title
|
|
119
|
+
*/
|
|
120
|
+
findColumnIndexByTitle(title) {
|
|
121
|
+
const titles = this.getColumnTitles();
|
|
122
|
+
return titles.findIndex((t) => t.toLowerCase().includes(title.toLowerCase()));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Checks if a column title contains specific text
|
|
126
|
+
*/
|
|
127
|
+
columnTitleContains(columnIndex, text) {
|
|
128
|
+
const title = this.getColumnTitle(columnIndex);
|
|
129
|
+
return title.toLowerCase().includes(text.toLowerCase());
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Gets the total width of all visible columns
|
|
133
|
+
*/
|
|
134
|
+
getTotalHeaderWidth() {
|
|
135
|
+
const columnCount = this.getColumnCount();
|
|
136
|
+
let totalWidth = 0;
|
|
137
|
+
for (let i = 0; i < columnCount; i++) {
|
|
138
|
+
if (!this.isColumnHidden(i)) {
|
|
139
|
+
totalWidth += this.getColumnWidth(i);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return totalWidth;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Checks if the header is sticky/fixed
|
|
146
|
+
*/
|
|
147
|
+
isHeaderSticky() {
|
|
148
|
+
const header = this.getTableHeader();
|
|
149
|
+
const classes = Array.from(header.classList);
|
|
150
|
+
const style = header.style;
|
|
151
|
+
return (classes.some((cls) => cls.includes('sticky') || cls.includes('fixed')) ||
|
|
152
|
+
style.position === 'sticky' ||
|
|
153
|
+
style.position === 'fixed');
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=table-header.page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-header.page.js","sourceRoot":"","sources":["../../../../../src/table/tests/page-objects/table-header.page.ts"],"names":[],"mappings":"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"}
|