@elastic/eui-test-helpers 2.1.0 → 2.2.0

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 (84) hide show
  1. package/README.md +6 -0
  2. package/lib/cjs/components/call_out/selectors.d.ts +22 -0
  3. package/lib/cjs/components/call_out/selectors.js +36 -0
  4. package/lib/cjs/components/form/field_search/selectors.d.ts +11 -0
  5. package/lib/cjs/components/form/field_search/selectors.js +25 -0
  6. package/lib/cjs/components/pagination/selectors.d.ts +21 -0
  7. package/lib/cjs/components/pagination/selectors.js +35 -0
  8. package/lib/cjs/components/search_bar/selectors.d.ts +11 -0
  9. package/lib/cjs/components/search_bar/selectors.js +25 -0
  10. package/lib/cjs/components/side_nav/selectors.d.ts +21 -0
  11. package/lib/cjs/components/side_nav/selectors.js +35 -0
  12. package/lib/cjs/components/table/selectors.d.ts +15 -0
  13. package/lib/cjs/components/table/selectors.js +29 -0
  14. package/lib/cjs/index.d.ts +6 -0
  15. package/lib/cjs/index.js +66 -24
  16. package/lib/cjs/playwright/components/basic_table/object.d.ts +7 -12
  17. package/lib/cjs/playwright/components/basic_table/object.js +7 -13
  18. package/lib/cjs/playwright/components/call_out/object.d.ts +36 -0
  19. package/lib/cjs/playwright/components/call_out/object.js +84 -0
  20. package/lib/cjs/playwright/components/form/field_search/object.d.ts +21 -0
  21. package/lib/cjs/playwright/components/form/field_search/object.js +51 -0
  22. package/lib/cjs/playwright/components/pagination/object.d.ts +37 -0
  23. package/lib/cjs/playwright/components/pagination/object.js +121 -0
  24. package/lib/cjs/playwright/components/search_bar/object.d.ts +12 -0
  25. package/lib/cjs/playwright/components/search_bar/object.js +26 -0
  26. package/lib/cjs/playwright/components/side_nav/object.d.ts +34 -0
  27. package/lib/cjs/playwright/components/side_nav/object.js +84 -0
  28. package/lib/cjs/playwright/components/table/object.d.ts +28 -0
  29. package/lib/cjs/playwright/components/table/object.js +57 -0
  30. package/lib/cjs/selectors.d.ts +42 -0
  31. package/lib/cjs/selectors.js +42 -30
  32. package/lib/esm/components/call_out/selectors.d.ts +22 -0
  33. package/lib/esm/components/call_out/selectors.js +30 -0
  34. package/lib/esm/components/call_out/selectors.js.map +1 -0
  35. package/lib/esm/components/form/field_search/selectors.d.ts +11 -0
  36. package/lib/esm/components/form/field_search/selectors.js +19 -0
  37. package/lib/esm/components/form/field_search/selectors.js.map +1 -0
  38. package/lib/esm/components/pagination/selectors.d.ts +21 -0
  39. package/lib/esm/components/pagination/selectors.js +29 -0
  40. package/lib/esm/components/pagination/selectors.js.map +1 -0
  41. package/lib/esm/components/search_bar/selectors.d.ts +11 -0
  42. package/lib/esm/components/search_bar/selectors.js +19 -0
  43. package/lib/esm/components/search_bar/selectors.js.map +1 -0
  44. package/lib/esm/components/side_nav/selectors.d.ts +21 -0
  45. package/lib/esm/components/side_nav/selectors.js +29 -0
  46. package/lib/esm/components/side_nav/selectors.js.map +1 -0
  47. package/lib/esm/components/table/selectors.d.ts +15 -0
  48. package/lib/esm/components/table/selectors.js +23 -0
  49. package/lib/esm/components/table/selectors.js.map +1 -0
  50. package/lib/esm/index.d.ts +6 -0
  51. package/lib/esm/index.js +6 -0
  52. package/lib/esm/index.js.map +1 -1
  53. package/lib/esm/playwright/components/basic_table/object.d.ts +7 -12
  54. package/lib/esm/playwright/components/basic_table/object.js +7 -15
  55. package/lib/esm/playwright/components/basic_table/object.js.map +1 -1
  56. package/lib/esm/playwright/components/call_out/object.d.ts +36 -0
  57. package/lib/esm/playwright/components/call_out/object.js +72 -0
  58. package/lib/esm/playwright/components/call_out/object.js.map +1 -0
  59. package/lib/esm/playwright/components/form/field_search/object.d.ts +21 -0
  60. package/lib/esm/playwright/components/form/field_search/object.js +41 -0
  61. package/lib/esm/playwright/components/form/field_search/object.js.map +1 -0
  62. package/lib/esm/playwright/components/pagination/object.d.ts +37 -0
  63. package/lib/esm/playwright/components/pagination/object.js +118 -0
  64. package/lib/esm/playwright/components/pagination/object.js.map +1 -0
  65. package/lib/esm/playwright/components/search_bar/object.d.ts +12 -0
  66. package/lib/esm/playwright/components/search_bar/object.js +20 -0
  67. package/lib/esm/playwright/components/search_bar/object.js.map +1 -0
  68. package/lib/esm/playwright/components/side_nav/object.d.ts +34 -0
  69. package/lib/esm/playwright/components/side_nav/object.js +76 -0
  70. package/lib/esm/playwright/components/side_nav/object.js.map +1 -0
  71. package/lib/esm/playwright/components/table/object.d.ts +28 -0
  72. package/lib/esm/playwright/components/table/object.js +46 -0
  73. package/lib/esm/playwright/components/table/object.js.map +1 -0
  74. package/lib/esm/selectors.d.ts +42 -0
  75. package/lib/esm/selectors.js +12 -0
  76. package/lib/esm/selectors.js.map +1 -1
  77. package/package.json +1 -1
  78. package/src/components/basic_table/README.md +1 -0
  79. package/src/components/call_out/README.md +29 -0
  80. package/src/components/form/field_search/README.md +29 -0
  81. package/src/components/pagination/README.md +31 -0
  82. package/src/components/search_bar/README.md +18 -0
  83. package/src/components/side_nav/README.md +31 -0
  84. package/src/components/table/README.md +31 -0
@@ -0,0 +1,72 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
5
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
6
+ * Side Public License, v 1.
7
+ */
8
+ import { BaseObject } from '../../base_object';
9
+ import { EuiCallOutSelectors } from '../../../components/call_out/selectors';
10
+ /**
11
+ * Playwright Component Object for {@link
12
+ * https://eui.elastic.co/docs/components/display/callout/ EuiCallOut}.
13
+ *
14
+ * `testSubj` must be set on `EuiCallOut` itself. EUI puts it on the panel
15
+ * root and derives `<subj>__message`, `<subj>__content` and
16
+ * `<subj>__actions` for the inner blocks, which the token based root lookup
17
+ * does not confuse with the root.
18
+ */
19
+ export class EuiCallOutObject extends BaseObject {
20
+ constructor(scope, testSubj) {
21
+ super(scope, testSubj, EuiCallOutSelectors.ROOT_SELECTOR);
22
+ }
23
+ /** The call out element itself, see {@link panel}. */
24
+ get locator() {
25
+ return this.panel;
26
+ }
27
+ /** The title text, or an empty string when the call out has no title. */
28
+ async getTitle() {
29
+ return this.textOf(this.panel.locator(EuiCallOutSelectors.TITLE_SELECTOR));
30
+ }
31
+ /** The `text` block, or an empty string when the call out has none. */
32
+ async getText() {
33
+ return this.textOf(this.panel.locator(EuiCallOutSelectors.TEXT_SELECTOR));
34
+ }
35
+ /** The color variant: `primary`, `success`, `warning` or `danger`. */
36
+ async getColor() {
37
+ const className = (await this.panel.getAttribute('class')) ?? '';
38
+ const match = className.match(new RegExp(`\\b${EuiCallOutSelectors.COLOR_CLASS_PREFIX}([a-z]+)`));
39
+ if (!match) {
40
+ throw new Error(`EuiCallOut "${this.testSubj}" has no color class, is it an EuiCallOut?`);
41
+ }
42
+ return match[1];
43
+ }
44
+ /** The dismiss button. Resolves to zero elements without `onDismiss`. */
45
+ get dismissButton() {
46
+ return this.panel
47
+ .locator(EuiCallOutSelectors.DISMISS_BUTTON_SELECTOR)
48
+ .first();
49
+ }
50
+ /**
51
+ * The root narrowed to the call out element. A multi token subj such as
52
+ * `notice shared` also matches the derived `notice shared__message` block
53
+ * by token, so the class keeps lookups on the panel itself.
54
+ */
55
+ get panel() {
56
+ return this.root.and(this.scope.locator(EuiCallOutSelectors.ROOT_SELECTOR));
57
+ }
58
+ /**
59
+ * Click the dismiss button. What happens next is up to the consumer's
60
+ * `onDismiss`, usually unmounting the call out, so nothing is asserted.
61
+ */
62
+ async dismiss() {
63
+ await this.dismissButton.click();
64
+ }
65
+ async textOf(element) {
66
+ if ((await element.count()) === 0) {
67
+ return '';
68
+ }
69
+ return element.first().innerText();
70
+ }
71
+ }
72
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../../../../src/playwright/components/call_out/object.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAE7E;;;;;;;;GAQG;AACH,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,KAAkB,EAAE,QAAgB;QAC9C,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,sDAAsD;IACtD,IAAa,OAAO;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,QAAQ;QACZ,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAC3B,IAAI,MAAM,CAAC,MAAM,mBAAmB,CAAC,kBAAkB,UAAU,CAAC,CACnE,CAAC;QACF,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,CAAC,QAAQ,4CAA4C,CACzE,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,yEAAyE;IACzE,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,KAAK;aACd,OAAO,CAAC,mBAAmB,CAAC,uBAAuB,CAAC;aACpD,KAAK,EAAE,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,IAAY,KAAK;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,OAAgB;QACnC,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;IACrC,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import { BaseObject, type ObjectScope } from '../../../base_object';
2
+ /**
3
+ * Playwright Component Object for {@link
4
+ * https://eui.elastic.co/docs/components/forms/search-and-filter/search/ EuiFieldSearch}.
5
+ *
6
+ * `testSubj` must be set on `EuiFieldSearch` itself, EUI spreads it onto
7
+ * the `<input>`. `EuiSearchBar` renders this input for its box, see
8
+ * `EuiSearchBarObject`.
9
+ */
10
+ export declare class EuiFieldSearchObject extends BaseObject {
11
+ constructor(scope: ObjectScope, testSubj: string, componentSelector?: string);
12
+ /**
13
+ * Replace the text and submit it with Enter, which triggers `onSearch` for
14
+ * both the incremental and the plain variant.
15
+ */
16
+ setQuery(text: string): Promise<void>;
17
+ /** The current text of the input. */
18
+ getQuery(): Promise<string>;
19
+ /** Empty the input and submit, so `onSearch` receives an empty query. */
20
+ clear(): Promise<void>;
21
+ }
@@ -0,0 +1,41 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
5
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
6
+ * Side Public License, v 1.
7
+ */
8
+ import { expect } from '@playwright/test';
9
+ import { BaseObject } from '../../../base_object';
10
+ import { EuiFieldSearchSelectors } from '../../../../components/form/field_search/selectors';
11
+ /**
12
+ * Playwright Component Object for {@link
13
+ * https://eui.elastic.co/docs/components/forms/search-and-filter/search/ EuiFieldSearch}.
14
+ *
15
+ * `testSubj` must be set on `EuiFieldSearch` itself, EUI spreads it onto
16
+ * the `<input>`. `EuiSearchBar` renders this input for its box, see
17
+ * `EuiSearchBarObject`.
18
+ */
19
+ export class EuiFieldSearchObject extends BaseObject {
20
+ constructor(scope, testSubj, componentSelector = EuiFieldSearchSelectors.ROOT_SELECTOR) {
21
+ super(scope, testSubj, componentSelector);
22
+ }
23
+ /**
24
+ * Replace the text and submit it with Enter, which triggers `onSearch` for
25
+ * both the incremental and the plain variant.
26
+ */
27
+ async setQuery(text) {
28
+ await this.root.fill(text);
29
+ await expect(this.root).toHaveValue(text);
30
+ await this.root.press('Enter');
31
+ }
32
+ /** The current text of the input. */
33
+ async getQuery() {
34
+ return this.root.inputValue();
35
+ }
36
+ /** Empty the input and submit, so `onSearch` receives an empty query. */
37
+ async clear() {
38
+ await this.setQuery('');
39
+ }
40
+ }
41
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../../../../../src/playwright/components/form/field_search/object.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAoB,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oDAAoD,CAAC;AAE7F;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YACE,KAAkB,EAClB,QAAgB,EAChB,iBAAiB,GAAG,uBAAuB,CAAC,aAAa;QAEzD,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC5C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ import { BaseObject, type ObjectScope } from '../../base_object';
2
+ /**
3
+ * Playwright Component Object for {@link
4
+ * https://eui.elastic.co/docs/components/navigation/pagination/ EuiPagination}.
5
+ *
6
+ * `testSubj` must be set on `EuiPagination` itself, EUI spreads it onto the
7
+ * `<nav>`. Page indexes are 0-based, matching EUI's `activePage` and the
8
+ * `pagination-button-<index>` test subjs. Covers the numbered and the
9
+ * compressed variant.
10
+ */
11
+ export declare class EuiPaginationObject extends BaseObject {
12
+ constructor(scope: ObjectScope, testSubj: string);
13
+ /** The 0-based index of the active page. */
14
+ getActivePage(): Promise<number>;
15
+ /** The total number of pages. */
16
+ getPageCount(): Promise<number>;
17
+ /**
18
+ * Go to the page at the 0-based `index` and wait for it to become active.
19
+ * Clicks the page button when EUI renders it, otherwise steps through
20
+ * next or previous until it does. A no-op if already active. Throws if
21
+ * `index` is not a page, or the page never becomes active.
22
+ */
23
+ goToPage(index: number): Promise<void>;
24
+ /** Click the next arrow and wait for the active page to advance. */
25
+ next(): Promise<void>;
26
+ /** Click the previous arrow and wait for the active page to go back. */
27
+ previous(): Promise<void>;
28
+ private pageButton;
29
+ private arrow;
30
+ private isCompressed;
31
+ /**
32
+ * The compressed "page of total" numbers as [page, total]. Translations may
33
+ * order the two the other way round, and the page is never above the total,
34
+ * so the smaller one is the page.
35
+ */
36
+ private compressedNumbers;
37
+ }
@@ -0,0 +1,118 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
5
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
6
+ * Side Public License, v 1.
7
+ */
8
+ import { expect } from '@playwright/test';
9
+ import { BaseObject } from '../../base_object';
10
+ import { EuiPaginationSelectors } from '../../../components/pagination/selectors';
11
+ /**
12
+ * Playwright Component Object for {@link
13
+ * https://eui.elastic.co/docs/components/navigation/pagination/ EuiPagination}.
14
+ *
15
+ * `testSubj` must be set on `EuiPagination` itself, EUI spreads it onto the
16
+ * `<nav>`. Page indexes are 0-based, matching EUI's `activePage` and the
17
+ * `pagination-button-<index>` test subjs. Covers the numbered and the
18
+ * compressed variant.
19
+ */
20
+ export class EuiPaginationObject extends BaseObject {
21
+ constructor(scope, testSubj) {
22
+ super(scope, testSubj, EuiPaginationSelectors.ROOT_SELECTOR);
23
+ }
24
+ /** The 0-based index of the active page. */
25
+ async getActivePage() {
26
+ if (await this.isCompressed()) {
27
+ const [page] = await this.compressedNumbers();
28
+ return page - 1;
29
+ }
30
+ const text = await this.root
31
+ .locator(EuiPaginationSelectors.ACTIVE_PAGE_BUTTON_SELECTOR)
32
+ .innerText();
33
+ return Number(text) - 1;
34
+ }
35
+ /** The total number of pages. */
36
+ async getPageCount() {
37
+ if (await this.isCompressed()) {
38
+ const [, total] = await this.compressedNumbers();
39
+ return total;
40
+ }
41
+ // EUI always renders the last page's button, so its label is the count.
42
+ return Number(await this.root
43
+ .locator(EuiPaginationSelectors.PAGE_BUTTON_SELECTOR)
44
+ .last()
45
+ .innerText());
46
+ }
47
+ /**
48
+ * Go to the page at the 0-based `index` and wait for it to become active.
49
+ * Clicks the page button when EUI renders it, otherwise steps through
50
+ * next or previous until it does. A no-op if already active. Throws if
51
+ * `index` is not a page, or the page never becomes active.
52
+ */
53
+ async goToPage(index) {
54
+ const pageCount = await this.getPageCount();
55
+ if (!Number.isInteger(index) || index < 0 || index >= pageCount) {
56
+ throw new Error(`EuiPagination "${this.testSubj}" has ${pageCount} pages, page index ${index} is out of range.`);
57
+ }
58
+ for (let step = 0; step < pageCount; step++) {
59
+ const active = await this.getActivePage();
60
+ if (active === index) {
61
+ return;
62
+ }
63
+ const button = this.pageButton(index);
64
+ if ((await button.count()) > 0) {
65
+ await button.click();
66
+ }
67
+ else if (index > active) {
68
+ await this.arrow(EuiPaginationSelectors.NEXT_BUTTON_TEST_SUBJ).click();
69
+ }
70
+ else {
71
+ await this.arrow(EuiPaginationSelectors.PREVIOUS_BUTTON_TEST_SUBJ).click();
72
+ }
73
+ await expect.poll(() => this.getActivePage()).not.toBe(active);
74
+ }
75
+ if ((await this.getActivePage()) !== index) {
76
+ throw new Error(`EuiPagination "${this.testSubj}" did not reach page index ${index} after ${pageCount} steps.`);
77
+ }
78
+ }
79
+ /** Click the next arrow and wait for the active page to advance. */
80
+ async next() {
81
+ const active = await this.getActivePage();
82
+ await this.arrow(EuiPaginationSelectors.NEXT_BUTTON_TEST_SUBJ).click();
83
+ await expect.poll(() => this.getActivePage()).toBe(active + 1);
84
+ }
85
+ /** Click the previous arrow and wait for the active page to go back. */
86
+ async previous() {
87
+ const active = await this.getActivePage();
88
+ await this.arrow(EuiPaginationSelectors.PREVIOUS_BUTTON_TEST_SUBJ).click();
89
+ await expect.poll(() => this.getActivePage()).toBe(active - 1);
90
+ }
91
+ pageButton(index) {
92
+ return this.root.getByTestId(`${EuiPaginationSelectors.PAGE_BUTTON_TEST_SUBJ_PREFIX}${index}`);
93
+ }
94
+ arrow(testSubj) {
95
+ return this.root.getByTestId(testSubj);
96
+ }
97
+ async isCompressed() {
98
+ // count() does not wait, so make sure the nav has rendered first.
99
+ await this.root.waitFor({ state: 'visible' });
100
+ return ((await this.root
101
+ .locator(EuiPaginationSelectors.COMPRESSED_TEXT_SELECTOR)
102
+ .count()) > 0);
103
+ }
104
+ /**
105
+ * The compressed "page of total" numbers as [page, total]. Translations may
106
+ * order the two the other way round, and the page is never above the total,
107
+ * so the smaller one is the page.
108
+ */
109
+ async compressedNumbers() {
110
+ const texts = await this.root
111
+ .locator(EuiPaginationSelectors.COMPRESSED_TEXT_SELECTOR)
112
+ .locator('span')
113
+ .allInnerTexts();
114
+ const numbers = texts.map(Number);
115
+ return [Math.min(...numbers), Math.max(...numbers)];
116
+ }
117
+ }
118
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../../../../src/playwright/components/pagination/object.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,MAAM,EAAgB,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAElF;;;;;;;;GAQG;AACH,MAAM,OAAO,mBAAoB,SAAQ,UAAU;IACjD,YAAY,KAAkB,EAAE,QAAgB;QAC9C,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAC/D,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,aAAa;QACjB,IAAI,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC9C,OAAO,IAAI,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI;aACzB,OAAO,CAAC,sBAAsB,CAAC,2BAA2B,CAAC;aAC3D,SAAS,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,iCAAiC;IACjC,KAAK,CAAC,YAAY;QAChB,IAAI,MAAM,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,wEAAwE;QACxE,OAAO,MAAM,CACX,MAAM,IAAI,CAAC,IAAI;aACZ,OAAO,CAAC,sBAAsB,CAAC,oBAAoB,CAAC;aACpD,IAAI,EAAE;aACN,SAAS,EAAE,CACf,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;YAChE,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,CAAC,QAAQ,SAAS,SAAS,sBAAsB,KAAK,mBAAmB,CAChG,CAAC;QACJ,CAAC;QAED,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;iBAAM,IAAI,KAAK,GAAG,MAAM,EAAE,CAAC;gBAC1B,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,KAAK,CACd,sBAAsB,CAAC,yBAAyB,CACjD,CAAC,KAAK,EAAE,CAAC;YACZ,CAAC;YACD,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,kBAAkB,IAAI,CAAC,QAAQ,8BAA8B,KAAK,UAAU,SAAS,SAAS,CAC/F,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;QACvE,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,QAAQ;QACZ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3E,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC;IAEO,UAAU,CAAC,KAAa;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAC1B,GAAG,sBAAsB,CAAC,4BAA4B,GAAG,KAAK,EAAE,CACjE,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,QAAgB;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,kEAAkE;QAClE,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9C,OAAO,CACL,CAAC,MAAM,IAAI,CAAC,IAAI;aACb,OAAO,CAAC,sBAAsB,CAAC,wBAAwB,CAAC;aACxD,KAAK,EAAE,CAAC,GAAG,CAAC,CAChB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,iBAAiB;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI;aAC1B,OAAO,CAAC,sBAAsB,CAAC,wBAAwB,CAAC;aACxD,OAAO,CAAC,MAAM,CAAC;aACf,aAAa,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import { EuiFieldSearchObject } from '../form/field_search/object';
2
+ /**
3
+ * Playwright Component Object for {@link
4
+ * https://eui.elastic.co/docs/components/forms/search-and-filter/search-bar/ EuiSearchBar}.
5
+ *
6
+ * The search bar has no root of its own, the consumer's `data-test-subj` is
7
+ * passed through the `box` prop onto the `EuiFieldSearch` input. So this is
8
+ * the field search object under the component's own name. Set
9
+ * `box={{ 'data-test-subj': 'mySearchBar' }}` and construct with that subj.
10
+ */
11
+ export declare class EuiSearchBarObject extends EuiFieldSearchObject {
12
+ }
@@ -0,0 +1,20 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
5
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
6
+ * Side Public License, v 1.
7
+ */
8
+ import { EuiFieldSearchObject } from '../form/field_search/object';
9
+ /**
10
+ * Playwright Component Object for {@link
11
+ * https://eui.elastic.co/docs/components/forms/search-and-filter/search-bar/ EuiSearchBar}.
12
+ *
13
+ * The search bar has no root of its own, the consumer's `data-test-subj` is
14
+ * passed through the `box` prop onto the `EuiFieldSearch` input. So this is
15
+ * the field search object under the component's own name. Set
16
+ * `box={{ 'data-test-subj': 'mySearchBar' }}` and construct with that subj.
17
+ */
18
+ export class EuiSearchBarObject extends EuiFieldSearchObject {
19
+ }
20
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../../../../src/playwright/components/search_bar/object.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;;;;;;;GAQG;AACH,MAAM,OAAO,kBAAmB,SAAQ,oBAAoB;CAAG"}
@@ -0,0 +1,34 @@
1
+ import { type Locator } from '@playwright/test';
2
+ import { BaseObject, type ObjectScope } from '../../base_object';
3
+ /**
4
+ * Playwright Component Object for {@link
5
+ * https://eui.elastic.co/docs/components/navigation/side-nav/ EuiSideNav}.
6
+ *
7
+ * `testSubj` must be set on `EuiSideNav` itself, EUI spreads it onto the
8
+ * `<nav>`. Items are addressed by their exact label. Closed branches are
9
+ * not in the DOM, expand their parent first.
10
+ */
11
+ export declare class EuiSideNavObject extends BaseObject {
12
+ constructor(scope: ObjectScope, testSubj: string);
13
+ /** The labels of every rendered item, in document order. */
14
+ getItems(): Promise<string[]>;
15
+ /**
16
+ * The clickable element of the item with exactly this label. Matches the
17
+ * label span, so icon text does not interfere, then climbs to its button.
18
+ * Chained from `root`, so it stays in the root's frame.
19
+ */
20
+ item(label: string): Locator;
21
+ /**
22
+ * Click the item with this label. Selection is owned by the consumer
23
+ * (usually a route change), so nothing is asserted afterwards.
24
+ */
25
+ select(label: string): Promise<void>;
26
+ /** The label of the selected item, or null when none is selected. */
27
+ getSelected(): Promise<string | null>;
28
+ /**
29
+ * Expand an accordion item (one with children and no link or click
30
+ * handler) and wait for its children to render. A no-op if already open.
31
+ */
32
+ expand(label: string): Promise<void>;
33
+ private isOpen;
34
+ }
@@ -0,0 +1,76 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
5
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
6
+ * Side Public License, v 1.
7
+ */
8
+ import { expect } from '@playwright/test';
9
+ import { BaseObject } from '../../base_object';
10
+ import { EuiSideNavSelectors } from '../../../components/side_nav/selectors';
11
+ /**
12
+ * Playwright Component Object for {@link
13
+ * https://eui.elastic.co/docs/components/navigation/side-nav/ EuiSideNav}.
14
+ *
15
+ * `testSubj` must be set on `EuiSideNav` itself, EUI spreads it onto the
16
+ * `<nav>`. Items are addressed by their exact label. Closed branches are
17
+ * not in the DOM, expand their parent first.
18
+ */
19
+ export class EuiSideNavObject extends BaseObject {
20
+ constructor(scope, testSubj) {
21
+ super(scope, testSubj, EuiSideNavSelectors.ROOT_SELECTOR);
22
+ }
23
+ /** The labels of every rendered item, in document order. */
24
+ async getItems() {
25
+ return this.root
26
+ .locator(EuiSideNavSelectors.ITEM_LABEL_SELECTOR)
27
+ .allInnerTexts();
28
+ }
29
+ /**
30
+ * The clickable element of the item with exactly this label. Matches the
31
+ * label span, so icon text does not interfere, then climbs to its button.
32
+ * Chained from `root`, so it stays in the root's frame.
33
+ */
34
+ item(label) {
35
+ return this.root
36
+ .locator(EuiSideNavSelectors.ITEM_LABEL_SELECTOR)
37
+ .filter({ hasText: new RegExp(`^${escapeRegExp(label)}$`) })
38
+ .locator(ITEM_BUTTON_ANCESTOR_XPATH);
39
+ }
40
+ /**
41
+ * Click the item with this label. Selection is owned by the consumer
42
+ * (usually a route change), so nothing is asserted afterwards.
43
+ */
44
+ async select(label) {
45
+ await this.item(label).click();
46
+ }
47
+ /** The label of the selected item, or null when none is selected. */
48
+ async getSelected() {
49
+ const selected = this.root
50
+ .locator(EuiSideNavSelectors.SELECTED_ITEM_BUTTON_SELECTOR)
51
+ .locator(EuiSideNavSelectors.ITEM_LABEL_SELECTOR);
52
+ if ((await selected.count()) === 0) {
53
+ return null;
54
+ }
55
+ return selected.first().innerText();
56
+ }
57
+ /**
58
+ * Expand an accordion item (one with children and no link or click
59
+ * handler) and wait for its children to render. A no-op if already open.
60
+ */
61
+ async expand(label) {
62
+ const button = this.item(label);
63
+ if (await this.isOpen(button)) {
64
+ return;
65
+ }
66
+ await button.click();
67
+ await expect.poll(() => this.isOpen(button)).toBe(true);
68
+ }
69
+ isOpen(button) {
70
+ return button.evaluate((el, openClass) => el.matches(openClass), EuiSideNavSelectors.OPEN_ITEM_BUTTON_SELECTOR);
71
+ }
72
+ }
73
+ /** Nearest ancestor carrying the exact `euiSideNavItemButton` class token. */
74
+ const ITEM_BUTTON_ANCESTOR_XPATH = "xpath=ancestor::*[contains(concat(' ', normalize-space(@class), ' '), ' euiSideNavItemButton ')][1]";
75
+ const escapeRegExp = (text) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
76
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../../../../src/playwright/components/side_nav/object.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAgB,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAE7E;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,KAAkB,EAAE,QAAgB;QAC9C,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,4DAA4D;IAC5D,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,IAAI;aACb,OAAO,CAAC,mBAAmB,CAAC,mBAAmB,CAAC;aAChD,aAAa,EAAE,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,KAAa;QAChB,OAAO,IAAI,CAAC,IAAI;aACb,OAAO,CAAC,mBAAmB,CAAC,mBAAmB,CAAC;aAChD,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;aAC3D,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,WAAW;QACf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI;aACvB,OAAO,CAAC,mBAAmB,CAAC,6BAA6B,CAAC;aAC1D,OAAO,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;IACtC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IAEO,MAAM,CAAC,MAAe;QAC5B,OAAO,MAAM,CAAC,QAAQ,CACpB,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EACxC,mBAAmB,CAAC,yBAAyB,CAC9C,CAAC;IACJ,CAAC;CACF;AAED,8EAA8E;AAC9E,MAAM,0BAA0B,GAC9B,qGAAqG,CAAC;AAExG,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE,CAC5C,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { Locator } from '@playwright/test';
2
+ import { BaseObject, type ObjectScope } from '../../base_object';
3
+ /**
4
+ * Playwright Component Object for {@link
5
+ * https://eui.elastic.co/docs/components/tabular-content/tables/ EuiTable},
6
+ * the low level table built from `EuiTableHeader`, `EuiTableRow` and
7
+ * `EuiTableRowCell`. `EuiBasicTableObject` extends this for the
8
+ * `EuiBasicTable` and `EuiInMemoryTable` wrappers.
9
+ *
10
+ * `testSubj` must be set on `EuiTable` itself, EUI spreads it onto the
11
+ * `<table>`. Columns are addressed by position since a plain table has no
12
+ * field names.
13
+ */
14
+ export declare class EuiTableObject extends BaseObject {
15
+ constructor(scope: ObjectScope, testSubj: string, componentSelector?: string);
16
+ /** The body rows. */
17
+ get rows(): Locator;
18
+ /** The header cells, in column order. */
19
+ get headerCells(): Locator;
20
+ /**
21
+ * The cells of one column across all body rows, by 0-based position.
22
+ * Direct children only, so a table nested in a cell is not matched. Matches
23
+ * both `<td>` and `<th>`, EUI renders a row header cell as `<th scope="row">`.
24
+ */
25
+ column(index: number): Locator;
26
+ /** One body cell by 0-based row and column position. */
27
+ cell(row: number, column: number): Locator;
28
+ }
@@ -0,0 +1,46 @@
1
+ /*
2
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3
+ * or more contributor license agreements. Licensed under the Elastic License
4
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
5
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
6
+ * Side Public License, v 1.
7
+ */
8
+ import { BaseObject } from '../../base_object';
9
+ import { EuiTableSelectors } from '../../../components/table/selectors';
10
+ /**
11
+ * Playwright Component Object for {@link
12
+ * https://eui.elastic.co/docs/components/tabular-content/tables/ EuiTable},
13
+ * the low level table built from `EuiTableHeader`, `EuiTableRow` and
14
+ * `EuiTableRowCell`. `EuiBasicTableObject` extends this for the
15
+ * `EuiBasicTable` and `EuiInMemoryTable` wrappers.
16
+ *
17
+ * `testSubj` must be set on `EuiTable` itself, EUI spreads it onto the
18
+ * `<table>`. Columns are addressed by position since a plain table has no
19
+ * field names.
20
+ */
21
+ export class EuiTableObject extends BaseObject {
22
+ constructor(scope, testSubj, componentSelector = EuiTableSelectors.ROOT_SELECTOR) {
23
+ super(scope, testSubj, componentSelector);
24
+ }
25
+ /** The body rows. */
26
+ get rows() {
27
+ return this.root.locator(EuiTableSelectors.ROW_SELECTOR);
28
+ }
29
+ /** The header cells, in column order. */
30
+ get headerCells() {
31
+ return this.root.locator(EuiTableSelectors.HEADER_CELL_SELECTOR);
32
+ }
33
+ /**
34
+ * The cells of one column across all body rows, by 0-based position.
35
+ * Direct children only, so a table nested in a cell is not matched. Matches
36
+ * both `<td>` and `<th>`, EUI renders a row header cell as `<th scope="row">`.
37
+ */
38
+ column(index) {
39
+ return this.rows.locator(`> :is(td, th):nth-child(${index + 1})`);
40
+ }
41
+ /** One body cell by 0-based row and column position. */
42
+ cell(row, column) {
43
+ return this.rows.nth(row).locator(`> :is(td, th):nth-child(${column + 1})`);
44
+ }
45
+ }
46
+ //# sourceMappingURL=object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object.js","sourceRoot":"","sources":["../../../../../src/playwright/components/table/object.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAExE;;;;;;;;;;GAUG;AACH,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,YACE,KAAkB,EAClB,QAAgB,EAChB,iBAAiB,GAAG,iBAAiB,CAAC,aAAa;QAEnD,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC;IAC5C,CAAC;IAED,qBAAqB;IACrB,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC3D,CAAC;IAED,yCAAyC;IACzC,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,wDAAwD;IACjD,IAAI,CAAC,GAAW,EAAE,MAAc;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,2BAA2B,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9E,CAAC;CACF"}
@@ -15,6 +15,14 @@ export declare const selectors: {
15
15
  ROW_SELECTOR: string;
16
16
  HEADER_CELL_SELECTOR_PREFIX: string;
17
17
  };
18
+ readonly callOut: {
19
+ ROOT_SELECTOR: string;
20
+ TITLE_SELECTOR: string;
21
+ TEXT_SELECTOR: string;
22
+ COLOR_CLASS_PREFIX: string;
23
+ DISMISS_BUTTON_TEST_SUBJ: string;
24
+ DISMISS_BUTTON_SELECTOR: string;
25
+ };
18
26
  readonly colorPicker: {
19
27
  ANCHOR_TEST_SUBJ: string;
20
28
  ANCHOR_SELECTOR: string;
@@ -57,6 +65,10 @@ export declare const selectors: {
57
65
  HANDLE_SELECTOR: string;
58
66
  ITEM_SELECTOR: string;
59
67
  };
68
+ readonly fieldSearch: {
69
+ ROOT_SELECTOR: string;
70
+ CLEAR_BUTTON_TEST_SUBJ: string;
71
+ };
60
72
  readonly filterButton: {
61
73
  ROOT_SELECTOR: string;
62
74
  NOTIFICATION_SELECTOR: string;
@@ -71,6 +83,17 @@ export declare const selectors: {
71
83
  ROOT_SELECTOR: string;
72
84
  CLOSE_BUTTON_SELECTOR: string;
73
85
  };
86
+ readonly pagination: {
87
+ ROOT_SELECTOR: string;
88
+ PAGE_BUTTON_SELECTOR: string;
89
+ ACTIVE_PAGE_BUTTON_SELECTOR: string;
90
+ COMPRESSED_TEXT_SELECTOR: string;
91
+ PAGE_BUTTON_TEST_SUBJ_PREFIX: string;
92
+ FIRST_BUTTON_TEST_SUBJ: string;
93
+ PREVIOUS_BUTTON_TEST_SUBJ: string;
94
+ NEXT_BUTTON_TEST_SUBJ: string;
95
+ LAST_BUTTON_TEST_SUBJ: string;
96
+ };
74
97
  readonly popover: {
75
98
  TOGGLE_SELECTOR: string;
76
99
  panelFor: (id: string) => string;
@@ -79,10 +102,23 @@ export declare const selectors: {
79
102
  SLIDER_SELECTOR: string;
80
103
  NUMBER_INPUT_SELECTOR: string;
81
104
  };
105
+ readonly searchBar: {
106
+ SEARCH_HOLDER_SELECTOR: string;
107
+ FILTERS_HOLDER_SELECTOR: string;
108
+ };
82
109
  readonly selectable: {
83
110
  ROOT_SELECTOR: string;
84
111
  SEARCH_SELECTOR: string;
85
112
  };
113
+ readonly sideNav: {
114
+ ROOT_SELECTOR: string;
115
+ ITEM_SELECTOR: string;
116
+ ITEM_BUTTON_SELECTOR: string;
117
+ SELECTED_ITEM_BUTTON_SELECTOR: string;
118
+ OPEN_ITEM_BUTTON_SELECTOR: string;
119
+ ITEM_LABEL_SELECTOR: string;
120
+ CHILD_ITEMS_SELECTOR: string;
121
+ };
86
122
  readonly superSelect: {
87
123
  ROOT_SELECTOR: string;
88
124
  WRAPPER_SELECTOR: string;
@@ -90,6 +126,12 @@ export declare const selectors: {
90
126
  HIDDEN_INPUT_SELECTOR: string;
91
127
  optionByValue: (value: string) => string;
92
128
  };
129
+ readonly table: {
130
+ ROOT_SELECTOR: string;
131
+ ROW_SELECTOR: string;
132
+ ROW_CELL_SELECTOR: string;
133
+ HEADER_CELL_SELECTOR: string;
134
+ };
93
135
  readonly globalToastList: {
94
136
  ROOT_SELECTOR: string;
95
137
  TOAST_SELECTOR: string;