@angular/material 21.0.0-next.8 → 21.0.0-rc.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 (204) hide show
  1. package/core/tokens/_classes.scss +1 -1
  2. package/core/tokens/m2/_md-sys-color.scss +17 -17
  3. package/fesm2022/_animation-chunk.mjs +10 -16
  4. package/fesm2022/_animation-chunk.mjs.map +1 -1
  5. package/fesm2022/_date-formats-chunk.mjs +68 -164
  6. package/fesm2022/_date-formats-chunk.mjs.map +1 -1
  7. package/fesm2022/_date-range-input-harness-chunk.mjs +284 -463
  8. package/fesm2022/_date-range-input-harness-chunk.mjs.map +1 -1
  9. package/fesm2022/_error-options-chunk.mjs +56 -19
  10. package/fesm2022/_error-options-chunk.mjs.map +1 -1
  11. package/fesm2022/_error-state-chunk.mjs +24 -31
  12. package/fesm2022/_error-state-chunk.mjs.map +1 -1
  13. package/fesm2022/_form-field-chunk.mjs +1224 -1017
  14. package/fesm2022/_form-field-chunk.mjs.map +1 -1
  15. package/fesm2022/_icon-button-chunk.mjs +243 -187
  16. package/fesm2022/_icon-button-chunk.mjs.map +1 -1
  17. package/fesm2022/_icon-registry-chunk.mjs +350 -575
  18. package/fesm2022/_icon-registry-chunk.mjs.map +1 -1
  19. package/fesm2022/_input-harness-chunk.mjs +56 -107
  20. package/fesm2022/_input-harness-chunk.mjs.map +1 -1
  21. package/fesm2022/_input-value-accessor-chunk.mjs +0 -6
  22. package/fesm2022/_input-value-accessor-chunk.mjs.map +1 -1
  23. package/fesm2022/_internal-form-field-chunk.mjs +59 -19
  24. package/fesm2022/_internal-form-field-chunk.mjs.map +1 -1
  25. package/fesm2022/_line-chunk.mjs +83 -43
  26. package/fesm2022/_line-chunk.mjs.map +1 -1
  27. package/fesm2022/_option-chunk.mjs +348 -311
  28. package/fesm2022/_option-chunk.mjs.map +1 -1
  29. package/fesm2022/_option-harness-chunk.mjs +23 -39
  30. package/fesm2022/_option-harness-chunk.mjs.map +1 -1
  31. package/fesm2022/_option-module-chunk.mjs +36 -10
  32. package/fesm2022/_option-module-chunk.mjs.map +1 -1
  33. package/fesm2022/_pseudo-checkbox-chunk.mjs +79 -44
  34. package/fesm2022/_pseudo-checkbox-chunk.mjs.map +1 -1
  35. package/fesm2022/_pseudo-checkbox-module-chunk.mjs +36 -10
  36. package/fesm2022/_pseudo-checkbox-module-chunk.mjs.map +1 -1
  37. package/fesm2022/_public-api-chunk.mjs +71 -134
  38. package/fesm2022/_public-api-chunk.mjs.map +1 -1
  39. package/fesm2022/_ripple-chunk.mjs +504 -600
  40. package/fesm2022/_ripple-chunk.mjs.map +1 -1
  41. package/fesm2022/_ripple-loader-chunk.mjs +120 -138
  42. package/fesm2022/_ripple-loader-chunk.mjs.map +1 -1
  43. package/fesm2022/_ripple-module-chunk.mjs +36 -10
  44. package/fesm2022/_ripple-module-chunk.mjs.map +1 -1
  45. package/fesm2022/_structural-styles-chunk.mjs +37 -10
  46. package/fesm2022/_structural-styles-chunk.mjs.map +1 -1
  47. package/fesm2022/_tooltip-chunk.mjs +810 -888
  48. package/fesm2022/_tooltip-chunk.mjs.map +1 -1
  49. package/fesm2022/autocomplete-testing.mjs +62 -86
  50. package/fesm2022/autocomplete-testing.mjs.map +1 -1
  51. package/fesm2022/autocomplete.mjs +965 -1126
  52. package/fesm2022/autocomplete.mjs.map +1 -1
  53. package/fesm2022/badge-testing.mjs +38 -54
  54. package/fesm2022/badge-testing.mjs.map +1 -1
  55. package/fesm2022/badge.mjs +321 -272
  56. package/fesm2022/badge.mjs.map +1 -1
  57. package/fesm2022/bottom-sheet-testing.mjs +10 -24
  58. package/fesm2022/bottom-sheet-testing.mjs.map +1 -1
  59. package/fesm2022/bottom-sheet.mjs +349 -344
  60. package/fesm2022/bottom-sheet.mjs.map +1 -1
  61. package/fesm2022/button-testing.mjs +60 -94
  62. package/fesm2022/button-testing.mjs.map +1 -1
  63. package/fesm2022/button-toggle-testing.mjs +76 -125
  64. package/fesm2022/button-toggle-testing.mjs.map +1 -1
  65. package/fesm2022/button-toggle.mjs +752 -662
  66. package/fesm2022/button-toggle.mjs.map +1 -1
  67. package/fesm2022/button.mjs +263 -158
  68. package/fesm2022/button.mjs.map +1 -1
  69. package/fesm2022/card-testing.mjs +19 -33
  70. package/fesm2022/card-testing.mjs.map +1 -1
  71. package/fesm2022/card.mjs +576 -272
  72. package/fesm2022/card.mjs.map +1 -1
  73. package/fesm2022/checkbox-testing.mjs +71 -123
  74. package/fesm2022/checkbox-testing.mjs.map +1 -1
  75. package/fesm2022/checkbox.mjs +515 -477
  76. package/fesm2022/checkbox.mjs.map +1 -1
  77. package/fesm2022/chips-testing.mjs +201 -350
  78. package/fesm2022/chips-testing.mjs.map +1 -1
  79. package/fesm2022/chips.mjs +2552 -2289
  80. package/fesm2022/chips.mjs.map +1 -1
  81. package/fesm2022/core-testing.mjs +14 -28
  82. package/fesm2022/core-testing.mjs.map +1 -1
  83. package/fesm2022/core.mjs +357 -328
  84. package/fesm2022/core.mjs.map +1 -1
  85. package/fesm2022/datepicker-testing.mjs +15 -25
  86. package/fesm2022/datepicker-testing.mjs.map +1 -1
  87. package/fesm2022/datepicker.mjs +4826 -4563
  88. package/fesm2022/datepicker.mjs.map +1 -1
  89. package/fesm2022/dialog-testing.mjs +93 -129
  90. package/fesm2022/dialog-testing.mjs.map +1 -1
  91. package/fesm2022/dialog.mjs +810 -829
  92. package/fesm2022/dialog.mjs.map +1 -1
  93. package/fesm2022/divider-testing.mjs +10 -11
  94. package/fesm2022/divider-testing.mjs.map +1 -1
  95. package/fesm2022/divider.mjs +119 -43
  96. package/fesm2022/divider.mjs.map +1 -1
  97. package/fesm2022/expansion-testing.mjs +74 -130
  98. package/fesm2022/expansion-testing.mjs.map +1 -1
  99. package/fesm2022/expansion.mjs +703 -515
  100. package/fesm2022/expansion.mjs.map +1 -1
  101. package/fesm2022/form-field-testing-control.mjs +16 -33
  102. package/fesm2022/form-field-testing-control.mjs.map +1 -1
  103. package/fesm2022/form-field-testing.mjs +118 -179
  104. package/fesm2022/form-field-testing.mjs.map +1 -1
  105. package/fesm2022/form-field.mjs +36 -10
  106. package/fesm2022/form-field.mjs.map +1 -1
  107. package/fesm2022/grid-list-testing.mjs +65 -113
  108. package/fesm2022/grid-list-testing.mjs.map +1 -1
  109. package/fesm2022/grid-list.mjs +559 -494
  110. package/fesm2022/grid-list.mjs.map +1 -1
  111. package/fesm2022/icon-testing.mjs +148 -127
  112. package/fesm2022/icon-testing.mjs.map +1 -1
  113. package/fesm2022/icon.mjs +325 -351
  114. package/fesm2022/icon.mjs.map +1 -1
  115. package/fesm2022/input-testing.mjs +59 -99
  116. package/fesm2022/input-testing.mjs.map +1 -1
  117. package/fesm2022/input.mjs +457 -520
  118. package/fesm2022/input.mjs.map +1 -1
  119. package/fesm2022/list-testing.mjs +251 -434
  120. package/fesm2022/list-testing.mjs.map +1 -1
  121. package/fesm2022/list.mjs +1522 -1204
  122. package/fesm2022/list.mjs.map +1 -1
  123. package/fesm2022/material.mjs +0 -5
  124. package/fesm2022/material.mjs.map +1 -1
  125. package/fesm2022/menu-testing.mjs +159 -228
  126. package/fesm2022/menu-testing.mjs.map +1 -1
  127. package/fesm2022/menu.mjs +1338 -1343
  128. package/fesm2022/menu.mjs.map +1 -1
  129. package/fesm2022/paginator-testing.mjs +55 -79
  130. package/fesm2022/paginator-testing.mjs.map +1 -1
  131. package/fesm2022/paginator.mjs +381 -309
  132. package/fesm2022/paginator.mjs.map +1 -1
  133. package/fesm2022/progress-bar-testing.mjs +12 -21
  134. package/fesm2022/progress-bar-testing.mjs.map +1 -1
  135. package/fesm2022/progress-bar.mjs +224 -169
  136. package/fesm2022/progress-bar.mjs.map +1 -1
  137. package/fesm2022/progress-spinner-testing.mjs +13 -23
  138. package/fesm2022/progress-spinner-testing.mjs.map +1 -1
  139. package/fesm2022/progress-spinner.mjs +235 -160
  140. package/fesm2022/progress-spinner.mjs.map +1 -1
  141. package/fesm2022/radio-testing.mjs +133 -208
  142. package/fesm2022/radio-testing.mjs.map +1 -1
  143. package/fesm2022/radio.mjs +712 -679
  144. package/fesm2022/radio.mjs.map +1 -1
  145. package/fesm2022/select-testing.mjs +83 -117
  146. package/fesm2022/select-testing.mjs.map +1 -1
  147. package/fesm2022/select.mjs +1116 -1246
  148. package/fesm2022/select.mjs.map +1 -1
  149. package/fesm2022/sidenav-testing.mjs +54 -120
  150. package/fesm2022/sidenav-testing.mjs.map +1 -1
  151. package/fesm2022/sidenav.mjs +1078 -995
  152. package/fesm2022/sidenav.mjs.map +1 -1
  153. package/fesm2022/slide-toggle-testing.mjs +57 -92
  154. package/fesm2022/slide-toggle-testing.mjs.map +1 -1
  155. package/fesm2022/slide-toggle.mjs +369 -279
  156. package/fesm2022/slide-toggle.mjs.map +1 -1
  157. package/fesm2022/slider-testing.mjs +90 -138
  158. package/fesm2022/slider-testing.mjs.map +1 -1
  159. package/fesm2022/slider.mjs +1651 -1716
  160. package/fesm2022/slider.mjs.map +1 -1
  161. package/fesm2022/snack-bar-testing.mjs +40 -87
  162. package/fesm2022/snack-bar-testing.mjs.map +1 -1
  163. package/fesm2022/snack-bar.mjs +763 -714
  164. package/fesm2022/snack-bar.mjs.map +1 -1
  165. package/fesm2022/sort-testing.mjs +45 -66
  166. package/fesm2022/sort-testing.mjs.map +1 -1
  167. package/fesm2022/sort.mjs +419 -344
  168. package/fesm2022/sort.mjs.map +1 -1
  169. package/fesm2022/stepper-testing.mjs +78 -154
  170. package/fesm2022/stepper-testing.mjs.map +1 -1
  171. package/fesm2022/stepper.mjs +790 -498
  172. package/fesm2022/stepper.mjs.map +1 -1
  173. package/fesm2022/table-testing.mjs +125 -186
  174. package/fesm2022/table-testing.mjs.map +1 -1
  175. package/fesm2022/table.mjs +1026 -684
  176. package/fesm2022/table.mjs.map +1 -1
  177. package/fesm2022/tabs-testing.mjs +125 -197
  178. package/fesm2022/tabs-testing.mjs.map +1 -1
  179. package/fesm2022/tabs.mjs +2351 -2028
  180. package/fesm2022/tabs.mjs.map +1 -1
  181. package/fesm2022/timepicker-testing.mjs +113 -172
  182. package/fesm2022/timepicker-testing.mjs.map +1 -1
  183. package/fesm2022/timepicker.mjs +1019 -826
  184. package/fesm2022/timepicker.mjs.map +1 -1
  185. package/fesm2022/toolbar-testing.mjs +16 -27
  186. package/fesm2022/toolbar-testing.mjs.map +1 -1
  187. package/fesm2022/toolbar.mjs +163 -78
  188. package/fesm2022/toolbar.mjs.map +1 -1
  189. package/fesm2022/tooltip-testing.mjs +41 -52
  190. package/fesm2022/tooltip-testing.mjs.map +1 -1
  191. package/fesm2022/tooltip.mjs +36 -10
  192. package/fesm2022/tooltip.mjs.map +1 -1
  193. package/fesm2022/tree-testing.mjs +86 -162
  194. package/fesm2022/tree-testing.mjs.map +1 -1
  195. package/fesm2022/tree.mjs +638 -466
  196. package/fesm2022/tree.mjs.map +1 -1
  197. package/package.json +2 -2
  198. package/schematics/ng-add/index.js +1 -1
  199. package/types/expansion.d.ts +4 -2
  200. package/types/menu-testing.d.ts +2 -0
  201. package/types/select.d.ts +1 -1
  202. package/types/sort.d.ts +1 -1
  203. package/types/table-testing.d.ts +27 -1
  204. package/types/timepicker.d.ts +148 -128
@@ -1,242 +1,173 @@
1
1
  import { ContentContainerComponentHarness, HarnessPredicate } from '@angular/cdk/testing';
2
2
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
3
+ import { MatIconHarness } from '@angular/material/icon/testing';
3
4
 
4
- /** Harness for interacting with a mat-menu in tests. */
5
5
  class MatMenuHarness extends ContentContainerComponentHarness {
6
- _documentRootLocator = this.documentRootLocatorFactory();
7
- /** The selector for the host element of a `MatMenu` instance. */
8
- static hostSelector = '.mat-mdc-menu-trigger';
9
- /**
10
- * Gets a `HarnessPredicate` that can be used to search for a menu with specific attributes.
11
- * @param options Options for filtering which menu instances are considered a match.
12
- * @return a `HarnessPredicate` configured with the given options.
13
- */
14
- static with(options = {}) {
15
- return new HarnessPredicate(this, options).addOption('triggerText', options.triggerText, (harness, text) => HarnessPredicate.stringMatches(harness.getTriggerText(), text));
16
- }
17
- /** Whether the menu is disabled. */
18
- async isDisabled() {
19
- const disabled = (await this.host()).getAttribute('disabled');
20
- return coerceBooleanProperty(await disabled);
21
- }
22
- /** Whether the menu is open. */
23
- async isOpen() {
24
- return !!(await this._getMenuPanel());
25
- }
26
- /** Gets the text of the menu's trigger element. */
27
- async getTriggerText() {
28
- return (await this.host()).text();
29
- }
30
- /** Focuses the menu. */
31
- async focus() {
32
- return (await this.host()).focus();
33
- }
34
- /** Blurs the menu. */
35
- async blur() {
36
- return (await this.host()).blur();
37
- }
38
- /** Whether the menu is focused. */
39
- async isFocused() {
40
- return (await this.host()).isFocused();
41
- }
42
- /** Opens the menu. */
43
- async open() {
44
- if (!(await this.isOpen())) {
45
- return (await this.host()).click();
46
- }
47
- }
48
- /** Closes the menu. */
49
- async close() {
50
- const panel = await this._getMenuPanel();
51
- if (panel) {
52
- return panel.click();
53
- }
54
- }
55
- /**
56
- * Gets a list of `MatMenuItemHarness` representing the items in the menu.
57
- * @param filters Optionally filters which menu items are included.
58
- */
59
- async getItems(filters) {
60
- const panelId = await this._getPanelId();
61
- if (panelId) {
62
- return this._documentRootLocator.locatorForAll(MatMenuItemHarness.with({
63
- ...(filters || {}),
64
- ancestor: `#${panelId}`,
65
- }))();
66
- }
67
- return [];
68
- }
69
- /**
70
- * Clicks an item in the menu, and optionally continues clicking items in subsequent sub-menus.
71
- * @param itemFilter A filter used to represent which item in the menu should be clicked. The
72
- * first matching menu item will be clicked.
73
- * @param subItemFilters A list of filters representing the items to click in any subsequent
74
- * sub-menus. The first item in the sub-menu matching the corresponding filter in
75
- * `subItemFilters` will be clicked.
76
- */
77
- async clickItem(itemFilter, ...subItemFilters) {
78
- await this.open();
79
- return clickItemImplementation(await this.getItems(itemFilter), itemFilter, subItemFilters);
80
- }
81
- async getRootHarnessLoader() {
82
- const panelId = await this._getPanelId();
83
- return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);
84
- }
85
- /** Gets the menu panel associated with this menu. */
86
- async _getMenuPanel() {
87
- const panelId = await this._getPanelId();
88
- return panelId ? this._documentRootLocator.locatorForOptional(`#${panelId}`)() : null;
89
- }
90
- /** Gets the id of the menu panel associated with this menu. */
91
- async _getPanelId() {
92
- const panelId = await (await this.host()).getAttribute('aria-controls');
93
- return panelId || null;
94
- }
6
+ _documentRootLocator = this.documentRootLocatorFactory();
7
+ static hostSelector = '.mat-mdc-menu-trigger';
8
+ static with(options = {}) {
9
+ return new HarnessPredicate(this, options).addOption('triggerText', options.triggerText, (harness, text) => HarnessPredicate.stringMatches(harness.getTriggerText(), text)).addOption('triggerIconName', options.triggerIconName, async (harness, triggerIconName) => {
10
+ const result = await harness.locatorForOptional(MatIconHarness.with({
11
+ name: triggerIconName
12
+ }))();
13
+ return result !== null;
14
+ });
15
+ }
16
+ async isDisabled() {
17
+ const disabled = (await this.host()).getAttribute('disabled');
18
+ return coerceBooleanProperty(await disabled);
19
+ }
20
+ async isOpen() {
21
+ return !!(await this._getMenuPanel());
22
+ }
23
+ async getTriggerText() {
24
+ return (await this.host()).text();
25
+ }
26
+ async focus() {
27
+ return (await this.host()).focus();
28
+ }
29
+ async blur() {
30
+ return (await this.host()).blur();
31
+ }
32
+ async isFocused() {
33
+ return (await this.host()).isFocused();
34
+ }
35
+ async open() {
36
+ if (!(await this.isOpen())) {
37
+ return (await this.host()).click();
38
+ }
39
+ }
40
+ async close() {
41
+ const panel = await this._getMenuPanel();
42
+ if (panel) {
43
+ return panel.click();
44
+ }
45
+ }
46
+ async getItems(filters) {
47
+ const panelId = await this._getPanelId();
48
+ if (panelId) {
49
+ return this._documentRootLocator.locatorForAll(MatMenuItemHarness.with({
50
+ ...(filters || {}),
51
+ ancestor: `#${panelId}`
52
+ }))();
53
+ }
54
+ return [];
55
+ }
56
+ async clickItem(itemFilter, ...subItemFilters) {
57
+ await this.open();
58
+ return clickItemImplementation(await this.getItems(itemFilter), itemFilter, subItemFilters);
59
+ }
60
+ async getRootHarnessLoader() {
61
+ const panelId = await this._getPanelId();
62
+ return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);
63
+ }
64
+ async _getMenuPanel() {
65
+ const panelId = await this._getPanelId();
66
+ return panelId ? this._documentRootLocator.locatorForOptional(`#${panelId}`)() : null;
67
+ }
68
+ async _getPanelId() {
69
+ const panelId = await (await this.host()).getAttribute('aria-controls');
70
+ return panelId || null;
71
+ }
95
72
  }
96
73
  class MatMenuItemHarness extends ContentContainerComponentHarness {
97
- /** The selector for the host element of a `MatMenuItem` instance. */
98
- static hostSelector = '.mat-mdc-menu-item';
99
- /**
100
- * Gets a `HarnessPredicate` that can be used to search for a menu item with specific attributes.
101
- * @param options Options for filtering which menu item instances are considered a match.
102
- * @return a `HarnessPredicate` configured with the given options.
103
- */
104
- static with(options = {}) {
105
- return new HarnessPredicate(this, options)
106
- .addOption('text', options.text, (harness, text) => HarnessPredicate.stringMatches(harness.getText(), text))
107
- .addOption('hasSubmenu', options.hasSubmenu, async (harness, hasSubmenu) => (await harness.hasSubmenu()) === hasSubmenu);
108
- }
109
- /** Whether the menu is disabled. */
110
- async isDisabled() {
111
- const disabled = (await this.host()).getAttribute('disabled');
112
- return coerceBooleanProperty(await disabled);
113
- }
114
- /** Gets the text of the menu item. */
115
- async getText() {
116
- return (await this.host()).text();
117
- }
118
- /** Focuses the menu item. */
119
- async focus() {
120
- return (await this.host()).focus();
121
- }
122
- /** Blurs the menu item. */
123
- async blur() {
124
- return (await this.host()).blur();
125
- }
126
- /** Whether the menu item is focused. */
127
- async isFocused() {
128
- return (await this.host()).isFocused();
129
- }
130
- /** Clicks the menu item. */
131
- async click() {
132
- return (await this.host()).click();
133
- }
134
- /** Whether this item has a submenu. */
135
- async hasSubmenu() {
136
- return (await this.host()).matchesSelector(MatMenuHarness.hostSelector);
137
- }
138
- /** Gets the submenu associated with this menu item, or null if none. */
139
- async getSubmenu() {
140
- if (await this.hasSubmenu()) {
141
- return new MatMenuHarness(this.locatorFactory);
142
- }
143
- return null;
144
- }
74
+ static hostSelector = '.mat-mdc-menu-item';
75
+ static with(options = {}) {
76
+ return new HarnessPredicate(this, options).addOption('text', options.text, (harness, text) => HarnessPredicate.stringMatches(harness.getText(), text)).addOption('hasSubmenu', options.hasSubmenu, async (harness, hasSubmenu) => (await harness.hasSubmenu()) === hasSubmenu);
77
+ }
78
+ async isDisabled() {
79
+ const disabled = (await this.host()).getAttribute('disabled');
80
+ return coerceBooleanProperty(await disabled);
81
+ }
82
+ async getText() {
83
+ return (await this.host()).text();
84
+ }
85
+ async focus() {
86
+ return (await this.host()).focus();
87
+ }
88
+ async blur() {
89
+ return (await this.host()).blur();
90
+ }
91
+ async isFocused() {
92
+ return (await this.host()).isFocused();
93
+ }
94
+ async click() {
95
+ return (await this.host()).click();
96
+ }
97
+ async hasSubmenu() {
98
+ return (await this.host()).matchesSelector(MatMenuHarness.hostSelector);
99
+ }
100
+ async getSubmenu() {
101
+ if (await this.hasSubmenu()) {
102
+ return new MatMenuHarness(this.locatorFactory);
103
+ }
104
+ return null;
105
+ }
145
106
  }
146
107
  async function clickItemImplementation(items, itemFilter, subItemFilters) {
147
- if (!items.length) {
148
- throw Error(`Could not find item matching ${JSON.stringify(itemFilter)}`);
149
- }
150
- if (!subItemFilters.length) {
151
- return await items[0].click();
152
- }
153
- const menu = await items[0].getSubmenu();
154
- if (!menu) {
155
- throw Error(`Item matching ${JSON.stringify(itemFilter)} does not have a submenu`);
156
- }
157
- return menu.clickItem(...subItemFilters);
108
+ if (!items.length) {
109
+ throw Error(`Could not find item matching ${JSON.stringify(itemFilter)}`);
110
+ }
111
+ if (!subItemFilters.length) {
112
+ return await items[0].click();
113
+ }
114
+ const menu = await items[0].getSubmenu();
115
+ if (!menu) {
116
+ throw Error(`Item matching ${JSON.stringify(itemFilter)} does not have a submenu`);
117
+ }
118
+ return menu.clickItem(...subItemFilters);
158
119
  }
159
120
 
160
- /** Harness for interacting with context menus in tests. */
161
121
  class MatContextMenuHarness extends ContentContainerComponentHarness {
162
- _documentRootLocator = this.documentRootLocatorFactory();
163
- /** The selector for the host element of a `MatContextMenu` instance. */
164
- static hostSelector = '.mat-context-menu-trigger';
165
- /**
166
- * Gets a `HarnessPredicate` that can be used to search for a context menu with specific
167
- * attributes.
168
- * @param options Options for filtering which menu instances are considered a match.
169
- * @return a `HarnessPredicate` configured with the given options.
170
- */
171
- static with(options = {}) {
172
- return new HarnessPredicate(this, options);
173
- }
174
- /** Whether the menu is open. */
175
- async isOpen() {
176
- return !!(await this._getMenuPanel());
177
- }
178
- /**
179
- * Opens the menu.
180
- * @param relativeX X coordinate, relative to the element, to dispatch the opening click at.
181
- * @param relativeY Y coordinate, relative to the element, to dispatch the opening click at.
182
- */
183
- async open(relativeX = 0, relativeY = 0) {
184
- if (!(await this.isOpen())) {
185
- return (await this.host()).rightClick(relativeX, relativeY);
186
- }
187
- }
188
- /** Closes the menu. */
189
- async close() {
190
- const panel = await this._getMenuPanel();
191
- if (panel) {
192
- return panel.click();
193
- }
194
- }
195
- /** Gets whether the context menu trigger is disabled. */
196
- async isDisabled() {
197
- const host = await this.host();
198
- return host.hasClass('mat-context-menu-trigger-disabled');
199
- }
200
- /**
201
- * Gets a list of `MatMenuItemHarness` representing the items in the menu.
202
- * @param filters Optionally filters which menu items are included.
203
- */
204
- async getItems(filters) {
205
- const panelId = await this._getPanelId();
206
- if (panelId) {
207
- return this._documentRootLocator.locatorForAll(MatMenuItemHarness.with({
208
- ...(filters || {}),
209
- ancestor: `#${panelId}`,
210
- }))();
211
- }
212
- return [];
213
- }
214
- /**
215
- * Clicks an item in the menu, and optionally continues clicking items in subsequent sub-menus.
216
- * @param itemFilter A filter used to represent which item in the menu should be clicked. The
217
- * first matching menu item will be clicked.
218
- * @param subItemFilters A list of filters representing the items to click in any subsequent
219
- * sub-menus. The first item in the sub-menu matching the corresponding filter in
220
- * `subItemFilters` will be clicked.
221
- */
222
- async clickItem(itemFilter, ...subItemFilters) {
223
- await this.open();
224
- return clickItemImplementation(await this.getItems(itemFilter), itemFilter, subItemFilters);
225
- }
226
- async getRootHarnessLoader() {
227
- const panelId = await this._getPanelId();
228
- return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);
229
- }
230
- /** Gets the menu panel associated with this menu. */
231
- async _getMenuPanel() {
232
- const panelId = await this._getPanelId();
233
- return panelId ? this._documentRootLocator.locatorForOptional(`#${panelId}`)() : null;
234
- }
235
- /** Gets the id of the menu panel associated with this menu. */
236
- async _getPanelId() {
237
- const panelId = await (await this.host()).getAttribute('aria-controls');
238
- return panelId || null;
239
- }
122
+ _documentRootLocator = this.documentRootLocatorFactory();
123
+ static hostSelector = '.mat-context-menu-trigger';
124
+ static with(options = {}) {
125
+ return new HarnessPredicate(this, options);
126
+ }
127
+ async isOpen() {
128
+ return !!(await this._getMenuPanel());
129
+ }
130
+ async open(relativeX = 0, relativeY = 0) {
131
+ if (!(await this.isOpen())) {
132
+ return (await this.host()).rightClick(relativeX, relativeY);
133
+ }
134
+ }
135
+ async close() {
136
+ const panel = await this._getMenuPanel();
137
+ if (panel) {
138
+ return panel.click();
139
+ }
140
+ }
141
+ async isDisabled() {
142
+ const host = await this.host();
143
+ return host.hasClass('mat-context-menu-trigger-disabled');
144
+ }
145
+ async getItems(filters) {
146
+ const panelId = await this._getPanelId();
147
+ if (panelId) {
148
+ return this._documentRootLocator.locatorForAll(MatMenuItemHarness.with({
149
+ ...(filters || {}),
150
+ ancestor: `#${panelId}`
151
+ }))();
152
+ }
153
+ return [];
154
+ }
155
+ async clickItem(itemFilter, ...subItemFilters) {
156
+ await this.open();
157
+ return clickItemImplementation(await this.getItems(itemFilter), itemFilter, subItemFilters);
158
+ }
159
+ async getRootHarnessLoader() {
160
+ const panelId = await this._getPanelId();
161
+ return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);
162
+ }
163
+ async _getMenuPanel() {
164
+ const panelId = await this._getPanelId();
165
+ return panelId ? this._documentRootLocator.locatorForOptional(`#${panelId}`)() : null;
166
+ }
167
+ async _getPanelId() {
168
+ const panelId = await (await this.host()).getAttribute('aria-controls');
169
+ return panelId || null;
170
+ }
240
171
  }
241
172
 
242
173
  export { MatContextMenuHarness, MatMenuHarness, MatMenuItemHarness };
@@ -1 +1 @@
1
- {"version":3,"file":"menu-testing.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/src/material/menu/testing/menu-harness.ts","../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/src/material/menu/testing/context-menu-harness.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n ComponentHarnessConstructor,\n ContentContainerComponentHarness,\n HarnessLoader,\n HarnessPredicate,\n TestElement,\n} from '@angular/cdk/testing';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {MenuHarnessFilters, MenuItemHarnessFilters} from './menu-harness-filters';\n\n/** Harness for interacting with a mat-menu in tests. */\nexport class MatMenuHarness extends ContentContainerComponentHarness<string> {\n private _documentRootLocator = this.documentRootLocatorFactory();\n\n /** The selector for the host element of a `MatMenu` instance. */\n static hostSelector = '.mat-mdc-menu-trigger';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a menu with specific attributes.\n * @param options Options for filtering which menu instances are considered a match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with<T extends MatMenuHarness>(\n this: ComponentHarnessConstructor<T>,\n options: MenuHarnessFilters = {},\n ): HarnessPredicate<T> {\n return new HarnessPredicate(this, options).addOption(\n 'triggerText',\n options.triggerText,\n (harness, text) => HarnessPredicate.stringMatches(harness.getTriggerText(), text),\n );\n }\n\n /** Whether the menu is disabled. */\n async isDisabled(): Promise<boolean> {\n const disabled = (await this.host()).getAttribute('disabled');\n return coerceBooleanProperty(await disabled);\n }\n\n /** Whether the menu is open. */\n async isOpen(): Promise<boolean> {\n return !!(await this._getMenuPanel());\n }\n\n /** Gets the text of the menu's trigger element. */\n async getTriggerText(): Promise<string> {\n return (await this.host()).text();\n }\n\n /** Focuses the menu. */\n async focus(): Promise<void> {\n return (await this.host()).focus();\n }\n\n /** Blurs the menu. */\n async blur(): Promise<void> {\n return (await this.host()).blur();\n }\n\n /** Whether the menu is focused. */\n async isFocused(): Promise<boolean> {\n return (await this.host()).isFocused();\n }\n\n /** Opens the menu. */\n async open(): Promise<void> {\n if (!(await this.isOpen())) {\n return (await this.host()).click();\n }\n }\n\n /** Closes the menu. */\n async close(): Promise<void> {\n const panel = await this._getMenuPanel();\n if (panel) {\n return panel.click();\n }\n }\n\n /**\n * Gets a list of `MatMenuItemHarness` representing the items in the menu.\n * @param filters Optionally filters which menu items are included.\n */\n async getItems(\n filters?: Omit<MenuItemHarnessFilters, 'ancestor'>,\n ): Promise<MatMenuItemHarness[]> {\n const panelId = await this._getPanelId();\n if (panelId) {\n return this._documentRootLocator.locatorForAll(\n MatMenuItemHarness.with({\n ...(filters || {}),\n ancestor: `#${panelId}`,\n } as MenuItemHarnessFilters),\n )();\n }\n return [];\n }\n\n /**\n * Clicks an item in the menu, and optionally continues clicking items in subsequent sub-menus.\n * @param itemFilter A filter used to represent which item in the menu should be clicked. The\n * first matching menu item will be clicked.\n * @param subItemFilters A list of filters representing the items to click in any subsequent\n * sub-menus. The first item in the sub-menu matching the corresponding filter in\n * `subItemFilters` will be clicked.\n */\n async clickItem(\n itemFilter: Omit<MenuItemHarnessFilters, 'ancestor'>,\n ...subItemFilters: Omit<MenuItemHarnessFilters, 'ancestor'>[]\n ): Promise<void> {\n await this.open();\n return clickItemImplementation(await this.getItems(itemFilter), itemFilter, subItemFilters);\n }\n\n protected override async getRootHarnessLoader(): Promise<HarnessLoader> {\n const panelId = await this._getPanelId();\n return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);\n }\n\n /** Gets the menu panel associated with this menu. */\n private async _getMenuPanel(): Promise<TestElement | null> {\n const panelId = await this._getPanelId();\n return panelId ? this._documentRootLocator.locatorForOptional(`#${panelId}`)() : null;\n }\n\n /** Gets the id of the menu panel associated with this menu. */\n private async _getPanelId(): Promise<string | null> {\n const panelId = await (await this.host()).getAttribute('aria-controls');\n return panelId || null;\n }\n}\n\nexport class MatMenuItemHarness extends ContentContainerComponentHarness<string> {\n /** The selector for the host element of a `MatMenuItem` instance. */\n static hostSelector = '.mat-mdc-menu-item';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a menu item with specific attributes.\n * @param options Options for filtering which menu item instances are considered a match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with<T extends MatMenuItemHarness>(\n this: ComponentHarnessConstructor<T>,\n options: MenuItemHarnessFilters = {},\n ): HarnessPredicate<T> {\n return new HarnessPredicate(this, options)\n .addOption('text', options.text, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getText(), text),\n )\n .addOption(\n 'hasSubmenu',\n options.hasSubmenu,\n async (harness, hasSubmenu) => (await harness.hasSubmenu()) === hasSubmenu,\n );\n }\n\n /** Whether the menu is disabled. */\n async isDisabled(): Promise<boolean> {\n const disabled = (await this.host()).getAttribute('disabled');\n return coerceBooleanProperty(await disabled);\n }\n\n /** Gets the text of the menu item. */\n async getText(): Promise<string> {\n return (await this.host()).text();\n }\n\n /** Focuses the menu item. */\n async focus(): Promise<void> {\n return (await this.host()).focus();\n }\n\n /** Blurs the menu item. */\n async blur(): Promise<void> {\n return (await this.host()).blur();\n }\n\n /** Whether the menu item is focused. */\n async isFocused(): Promise<boolean> {\n return (await this.host()).isFocused();\n }\n\n /** Clicks the menu item. */\n async click(): Promise<void> {\n return (await this.host()).click();\n }\n\n /** Whether this item has a submenu. */\n async hasSubmenu(): Promise<boolean> {\n return (await this.host()).matchesSelector(MatMenuHarness.hostSelector);\n }\n\n /** Gets the submenu associated with this menu item, or null if none. */\n async getSubmenu(): Promise<MatMenuHarness | null> {\n if (await this.hasSubmenu()) {\n return new MatMenuHarness(this.locatorFactory);\n }\n return null;\n }\n}\n\nexport async function clickItemImplementation(\n items: MatMenuItemHarness[],\n itemFilter: Omit<MenuItemHarnessFilters, 'ancestor'>,\n subItemFilters: Omit<MenuItemHarnessFilters, 'ancestor'>[],\n): Promise<void> {\n if (!items.length) {\n throw Error(`Could not find item matching ${JSON.stringify(itemFilter)}`);\n }\n\n if (!subItemFilters.length) {\n return await items[0].click();\n }\n\n const menu = await items[0].getSubmenu();\n if (!menu) {\n throw Error(`Item matching ${JSON.stringify(itemFilter)} does not have a submenu`);\n }\n return menu.clickItem(...(subItemFilters as [Omit<MenuItemHarnessFilters, 'ancestor'>]));\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n ComponentHarnessConstructor,\n ContentContainerComponentHarness,\n HarnessLoader,\n HarnessPredicate,\n TestElement,\n} from '@angular/cdk/testing';\nimport {ContextMenuHarnessFilters, MenuItemHarnessFilters} from './menu-harness-filters';\nimport {clickItemImplementation, MatMenuItemHarness} from './menu-harness';\n\n/** Harness for interacting with context menus in tests. */\nexport class MatContextMenuHarness extends ContentContainerComponentHarness<string> {\n private _documentRootLocator = this.documentRootLocatorFactory();\n\n /** The selector for the host element of a `MatContextMenu` instance. */\n static hostSelector = '.mat-context-menu-trigger';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a context menu with specific\n * attributes.\n * @param options Options for filtering which menu instances are considered a match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with<T extends MatContextMenuHarness>(\n this: ComponentHarnessConstructor<T>,\n options: ContextMenuHarnessFilters = {},\n ): HarnessPredicate<T> {\n return new HarnessPredicate(this, options);\n }\n\n /** Whether the menu is open. */\n async isOpen(): Promise<boolean> {\n return !!(await this._getMenuPanel());\n }\n\n /**\n * Opens the menu.\n * @param relativeX X coordinate, relative to the element, to dispatch the opening click at.\n * @param relativeY Y coordinate, relative to the element, to dispatch the opening click at.\n */\n async open(relativeX = 0, relativeY = 0): Promise<void> {\n if (!(await this.isOpen())) {\n return (await this.host()).rightClick(relativeX, relativeY);\n }\n }\n\n /** Closes the menu. */\n async close(): Promise<void> {\n const panel = await this._getMenuPanel();\n if (panel) {\n return panel.click();\n }\n }\n\n /** Gets whether the context menu trigger is disabled. */\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n return host.hasClass('mat-context-menu-trigger-disabled');\n }\n\n /**\n * Gets a list of `MatMenuItemHarness` representing the items in the menu.\n * @param filters Optionally filters which menu items are included.\n */\n async getItems(\n filters?: Omit<MenuItemHarnessFilters, 'ancestor'>,\n ): Promise<MatMenuItemHarness[]> {\n const panelId = await this._getPanelId();\n if (panelId) {\n return this._documentRootLocator.locatorForAll(\n MatMenuItemHarness.with({\n ...(filters || {}),\n ancestor: `#${panelId}`,\n } as MenuItemHarnessFilters),\n )();\n }\n return [];\n }\n\n /**\n * Clicks an item in the menu, and optionally continues clicking items in subsequent sub-menus.\n * @param itemFilter A filter used to represent which item in the menu should be clicked. The\n * first matching menu item will be clicked.\n * @param subItemFilters A list of filters representing the items to click in any subsequent\n * sub-menus. The first item in the sub-menu matching the corresponding filter in\n * `subItemFilters` will be clicked.\n */\n async clickItem(\n itemFilter: Omit<MenuItemHarnessFilters, 'ancestor'>,\n ...subItemFilters: Omit<MenuItemHarnessFilters, 'ancestor'>[]\n ): Promise<void> {\n await this.open();\n return clickItemImplementation(await this.getItems(itemFilter), itemFilter, subItemFilters);\n }\n\n protected override async getRootHarnessLoader(): Promise<HarnessLoader> {\n const panelId = await this._getPanelId();\n return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);\n }\n\n /** Gets the menu panel associated with this menu. */\n private async _getMenuPanel(): Promise<TestElement | null> {\n const panelId = await this._getPanelId();\n return panelId ? this._documentRootLocator.locatorForOptional(`#${panelId}`)() : null;\n }\n\n /** Gets the id of the menu panel associated with this menu. */\n private async _getPanelId(): Promise<string | null> {\n const panelId = await (await this.host()).getAttribute('aria-controls');\n return panelId || null;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"menu-testing.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/src/material/menu/testing/menu-harness.ts","../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/src/material/menu/testing/context-menu-harness.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n ComponentHarnessConstructor,\n ContentContainerComponentHarness,\n HarnessLoader,\n HarnessPredicate,\n TestElement,\n} from '@angular/cdk/testing';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {MatIconHarness} from '@angular/material/icon/testing';\nimport {MenuHarnessFilters, MenuItemHarnessFilters} from './menu-harness-filters';\n\n/** Harness for interacting with a mat-menu in tests. */\nexport class MatMenuHarness extends ContentContainerComponentHarness<string> {\n private _documentRootLocator = this.documentRootLocatorFactory();\n\n /** The selector for the host element of a `MatMenu` instance. */\n static hostSelector = '.mat-mdc-menu-trigger';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a menu with specific attributes.\n * @param options Options for filtering which menu instances are considered a match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with<T extends MatMenuHarness>(\n this: ComponentHarnessConstructor<T>,\n options: MenuHarnessFilters = {},\n ): HarnessPredicate<T> {\n return new HarnessPredicate(this, options)\n .addOption('triggerText', options.triggerText, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getTriggerText(), text),\n )\n .addOption('triggerIconName', options.triggerIconName, async (harness, triggerIconName) => {\n const result = await harness.locatorForOptional(\n MatIconHarness.with({name: triggerIconName}),\n )();\n return result !== null;\n });\n }\n\n /** Whether the menu is disabled. */\n async isDisabled(): Promise<boolean> {\n const disabled = (await this.host()).getAttribute('disabled');\n return coerceBooleanProperty(await disabled);\n }\n\n /** Whether the menu is open. */\n async isOpen(): Promise<boolean> {\n return !!(await this._getMenuPanel());\n }\n\n /** Gets the text of the menu's trigger element. */\n async getTriggerText(): Promise<string> {\n return (await this.host()).text();\n }\n\n /** Focuses the menu. */\n async focus(): Promise<void> {\n return (await this.host()).focus();\n }\n\n /** Blurs the menu. */\n async blur(): Promise<void> {\n return (await this.host()).blur();\n }\n\n /** Whether the menu is focused. */\n async isFocused(): Promise<boolean> {\n return (await this.host()).isFocused();\n }\n\n /** Opens the menu. */\n async open(): Promise<void> {\n if (!(await this.isOpen())) {\n return (await this.host()).click();\n }\n }\n\n /** Closes the menu. */\n async close(): Promise<void> {\n const panel = await this._getMenuPanel();\n if (panel) {\n return panel.click();\n }\n }\n\n /**\n * Gets a list of `MatMenuItemHarness` representing the items in the menu.\n * @param filters Optionally filters which menu items are included.\n */\n async getItems(\n filters?: Omit<MenuItemHarnessFilters, 'ancestor'>,\n ): Promise<MatMenuItemHarness[]> {\n const panelId = await this._getPanelId();\n if (panelId) {\n return this._documentRootLocator.locatorForAll(\n MatMenuItemHarness.with({\n ...(filters || {}),\n ancestor: `#${panelId}`,\n } as MenuItemHarnessFilters),\n )();\n }\n return [];\n }\n\n /**\n * Clicks an item in the menu, and optionally continues clicking items in subsequent sub-menus.\n * @param itemFilter A filter used to represent which item in the menu should be clicked. The\n * first matching menu item will be clicked.\n * @param subItemFilters A list of filters representing the items to click in any subsequent\n * sub-menus. The first item in the sub-menu matching the corresponding filter in\n * `subItemFilters` will be clicked.\n */\n async clickItem(\n itemFilter: Omit<MenuItemHarnessFilters, 'ancestor'>,\n ...subItemFilters: Omit<MenuItemHarnessFilters, 'ancestor'>[]\n ): Promise<void> {\n await this.open();\n return clickItemImplementation(await this.getItems(itemFilter), itemFilter, subItemFilters);\n }\n\n protected override async getRootHarnessLoader(): Promise<HarnessLoader> {\n const panelId = await this._getPanelId();\n return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);\n }\n\n /** Gets the menu panel associated with this menu. */\n private async _getMenuPanel(): Promise<TestElement | null> {\n const panelId = await this._getPanelId();\n return panelId ? this._documentRootLocator.locatorForOptional(`#${panelId}`)() : null;\n }\n\n /** Gets the id of the menu panel associated with this menu. */\n private async _getPanelId(): Promise<string | null> {\n const panelId = await (await this.host()).getAttribute('aria-controls');\n return panelId || null;\n }\n}\n\nexport class MatMenuItemHarness extends ContentContainerComponentHarness<string> {\n /** The selector for the host element of a `MatMenuItem` instance. */\n static hostSelector = '.mat-mdc-menu-item';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a menu item with specific attributes.\n * @param options Options for filtering which menu item instances are considered a match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with<T extends MatMenuItemHarness>(\n this: ComponentHarnessConstructor<T>,\n options: MenuItemHarnessFilters = {},\n ): HarnessPredicate<T> {\n return new HarnessPredicate(this, options)\n .addOption('text', options.text, (harness, text) =>\n HarnessPredicate.stringMatches(harness.getText(), text),\n )\n .addOption(\n 'hasSubmenu',\n options.hasSubmenu,\n async (harness, hasSubmenu) => (await harness.hasSubmenu()) === hasSubmenu,\n );\n }\n\n /** Whether the menu is disabled. */\n async isDisabled(): Promise<boolean> {\n const disabled = (await this.host()).getAttribute('disabled');\n return coerceBooleanProperty(await disabled);\n }\n\n /** Gets the text of the menu item. */\n async getText(): Promise<string> {\n return (await this.host()).text();\n }\n\n /** Focuses the menu item. */\n async focus(): Promise<void> {\n return (await this.host()).focus();\n }\n\n /** Blurs the menu item. */\n async blur(): Promise<void> {\n return (await this.host()).blur();\n }\n\n /** Whether the menu item is focused. */\n async isFocused(): Promise<boolean> {\n return (await this.host()).isFocused();\n }\n\n /** Clicks the menu item. */\n async click(): Promise<void> {\n return (await this.host()).click();\n }\n\n /** Whether this item has a submenu. */\n async hasSubmenu(): Promise<boolean> {\n return (await this.host()).matchesSelector(MatMenuHarness.hostSelector);\n }\n\n /** Gets the submenu associated with this menu item, or null if none. */\n async getSubmenu(): Promise<MatMenuHarness | null> {\n if (await this.hasSubmenu()) {\n return new MatMenuHarness(this.locatorFactory);\n }\n return null;\n }\n}\n\nexport async function clickItemImplementation(\n items: MatMenuItemHarness[],\n itemFilter: Omit<MenuItemHarnessFilters, 'ancestor'>,\n subItemFilters: Omit<MenuItemHarnessFilters, 'ancestor'>[],\n): Promise<void> {\n if (!items.length) {\n throw Error(`Could not find item matching ${JSON.stringify(itemFilter)}`);\n }\n\n if (!subItemFilters.length) {\n return await items[0].click();\n }\n\n const menu = await items[0].getSubmenu();\n if (!menu) {\n throw Error(`Item matching ${JSON.stringify(itemFilter)} does not have a submenu`);\n }\n return menu.clickItem(...(subItemFilters as [Omit<MenuItemHarnessFilters, 'ancestor'>]));\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {\n ComponentHarnessConstructor,\n ContentContainerComponentHarness,\n HarnessLoader,\n HarnessPredicate,\n TestElement,\n} from '@angular/cdk/testing';\nimport {ContextMenuHarnessFilters, MenuItemHarnessFilters} from './menu-harness-filters';\nimport {clickItemImplementation, MatMenuItemHarness} from './menu-harness';\n\n/** Harness for interacting with context menus in tests. */\nexport class MatContextMenuHarness extends ContentContainerComponentHarness<string> {\n private _documentRootLocator = this.documentRootLocatorFactory();\n\n /** The selector for the host element of a `MatContextMenu` instance. */\n static hostSelector = '.mat-context-menu-trigger';\n\n /**\n * Gets a `HarnessPredicate` that can be used to search for a context menu with specific\n * attributes.\n * @param options Options for filtering which menu instances are considered a match.\n * @return a `HarnessPredicate` configured with the given options.\n */\n static with<T extends MatContextMenuHarness>(\n this: ComponentHarnessConstructor<T>,\n options: ContextMenuHarnessFilters = {},\n ): HarnessPredicate<T> {\n return new HarnessPredicate(this, options);\n }\n\n /** Whether the menu is open. */\n async isOpen(): Promise<boolean> {\n return !!(await this._getMenuPanel());\n }\n\n /**\n * Opens the menu.\n * @param relativeX X coordinate, relative to the element, to dispatch the opening click at.\n * @param relativeY Y coordinate, relative to the element, to dispatch the opening click at.\n */\n async open(relativeX = 0, relativeY = 0): Promise<void> {\n if (!(await this.isOpen())) {\n return (await this.host()).rightClick(relativeX, relativeY);\n }\n }\n\n /** Closes the menu. */\n async close(): Promise<void> {\n const panel = await this._getMenuPanel();\n if (panel) {\n return panel.click();\n }\n }\n\n /** Gets whether the context menu trigger is disabled. */\n async isDisabled(): Promise<boolean> {\n const host = await this.host();\n return host.hasClass('mat-context-menu-trigger-disabled');\n }\n\n /**\n * Gets a list of `MatMenuItemHarness` representing the items in the menu.\n * @param filters Optionally filters which menu items are included.\n */\n async getItems(\n filters?: Omit<MenuItemHarnessFilters, 'ancestor'>,\n ): Promise<MatMenuItemHarness[]> {\n const panelId = await this._getPanelId();\n if (panelId) {\n return this._documentRootLocator.locatorForAll(\n MatMenuItemHarness.with({\n ...(filters || {}),\n ancestor: `#${panelId}`,\n } as MenuItemHarnessFilters),\n )();\n }\n return [];\n }\n\n /**\n * Clicks an item in the menu, and optionally continues clicking items in subsequent sub-menus.\n * @param itemFilter A filter used to represent which item in the menu should be clicked. The\n * first matching menu item will be clicked.\n * @param subItemFilters A list of filters representing the items to click in any subsequent\n * sub-menus. The first item in the sub-menu matching the corresponding filter in\n * `subItemFilters` will be clicked.\n */\n async clickItem(\n itemFilter: Omit<MenuItemHarnessFilters, 'ancestor'>,\n ...subItemFilters: Omit<MenuItemHarnessFilters, 'ancestor'>[]\n ): Promise<void> {\n await this.open();\n return clickItemImplementation(await this.getItems(itemFilter), itemFilter, subItemFilters);\n }\n\n protected override async getRootHarnessLoader(): Promise<HarnessLoader> {\n const panelId = await this._getPanelId();\n return this.documentRootLocatorFactory().harnessLoaderFor(`#${panelId}`);\n }\n\n /** Gets the menu panel associated with this menu. */\n private async _getMenuPanel(): Promise<TestElement | null> {\n const panelId = await this._getPanelId();\n return panelId ? this._documentRootLocator.locatorForOptional(`#${panelId}`)() : null;\n }\n\n /** Gets the id of the menu panel associated with this menu. */\n private async _getPanelId(): Promise<string | null> {\n const panelId = await (await this.host()).getAttribute('aria-controls');\n return panelId || null;\n }\n}\n"],"names":["with","options","HarnessPredicate","disabled","host","getAttribute","coerceBooleanProperty","_getMenuPanel","getTriggerText","focus","isFocused","isOpen","click","panel","getItems","filters","panelId","_getPanelId","documentRootLocatorFactory","harnessLoaderFor","_documentRootLocator","locatorForOptional","hostSelector","addOption","text","harness","stringMatches","getText","isDisabled","open","relativeX","relativeY","close","locatorForAll","MatMenuItemHarness"],"mappings":"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"}