@atlaskit/dropdown-menu 10.1.8 → 11.0.2

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 (211) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/__perf__/default.tsx +1 -1
  3. package/__perf__/dropdown-menu.tsx +216 -0
  4. package/codemods/11.0.0-lite-mode.tsx +39 -0
  5. package/codemods/__tests__/11.0.0-lite-mode.test.tsx +48 -0
  6. package/codemods/__tests__/convert-position.test.tsx +88 -0
  7. package/codemods/__tests__/convert-triggerType.test.tsx +100 -0
  8. package/codemods/__tests__/deprecate-items.test.tsx +108 -0
  9. package/codemods/__tests__/deprecate-onItemActivated.test.tsx +108 -0
  10. package/codemods/__tests__/deprecate-onPositioned.test.tsx +108 -0
  11. package/codemods/__tests__/deprecate-shouldFitContainer.tsx +108 -0
  12. package/codemods/__tests__/rename-imports.tsx +136 -0
  13. package/codemods/__tests__/replace-position-to-placement.test.tsx +84 -0
  14. package/codemods/__tests__/replace-shouldAllowMultipleLine.test.tsx +122 -0
  15. package/codemods/__tests__/update-component-callsites.tsx +66 -0
  16. package/codemods/migrates/convert-trigger-type.tsx +57 -0
  17. package/codemods/migrates/deprecate-items.tsx +9 -0
  18. package/codemods/migrates/deprecate-onItemActivated.tsx +9 -0
  19. package/codemods/migrates/deprecate-onPositioned.tsx +9 -0
  20. package/codemods/migrates/deprecate-shouldFitContainer.tsx +9 -0
  21. package/codemods/migrates/rename-imports.tsx +22 -0
  22. package/codemods/migrates/replace-position-to-placement.tsx +38 -0
  23. package/codemods/migrates/replace-shouldAllowMultiline.tsx +47 -0
  24. package/codemods/migrates/update-component-callsites.tsx +13 -0
  25. package/codemods/utils/convert-position.tsx +24 -0
  26. package/codemods/utils/create-rename-import.tsx +41 -0
  27. package/codemods/utils/create-update-callsite.tsx +32 -0
  28. package/dist/cjs/checkbox/dropdown-item-checkbox-group.js +31 -0
  29. package/dist/cjs/checkbox/dropdown-item-checkbox.js +108 -0
  30. package/dist/cjs/dropdown-menu-item-group.js +22 -0
  31. package/dist/cjs/dropdown-menu-item.js +67 -0
  32. package/dist/cjs/dropdown-menu.js +194 -0
  33. package/dist/cjs/index.js +21 -29
  34. package/dist/cjs/{components/item/DropdownItemRadio.js → internal/components/focus-manager.js} +40 -9
  35. package/dist/cjs/internal/components/menu-wrapper.js +68 -0
  36. package/dist/cjs/internal/context/checkbox-group-context.js +14 -0
  37. package/dist/cjs/internal/context/selection-store.js +76 -0
  38. package/dist/cjs/internal/hooks/use-checkbox-state.js +68 -0
  39. package/dist/cjs/internal/hooks/use-radio-state.js +84 -0
  40. package/dist/cjs/internal/hooks/use-register-item-with-focus-manager.js +29 -0
  41. package/dist/cjs/internal/utils/get-icon-colors.js +25 -0
  42. package/dist/cjs/internal/utils/handle-focus.js +58 -0
  43. package/dist/cjs/internal/utils/is-checkbox-item.js +11 -0
  44. package/dist/cjs/internal/utils/is-radio-item.js +11 -0
  45. package/dist/cjs/internal/utils/is-voice-over-supported.js +23 -0
  46. package/dist/cjs/internal/utils/reset-options-in-group.js +23 -0
  47. package/dist/cjs/radio/dropdown-item-radio-group.js +89 -0
  48. package/dist/cjs/radio/dropdown-item-radio.js +108 -0
  49. package/dist/cjs/version.json +1 -1
  50. package/dist/es2019/checkbox/dropdown-item-checkbox-group.js +21 -0
  51. package/dist/es2019/checkbox/dropdown-item-checkbox.js +67 -0
  52. package/dist/es2019/dropdown-menu-item-group.js +11 -0
  53. package/dist/es2019/dropdown-menu-item.js +49 -0
  54. package/dist/es2019/dropdown-menu.js +151 -0
  55. package/dist/es2019/index.js +7 -11
  56. package/dist/es2019/internal/components/focus-manager.js +40 -0
  57. package/dist/es2019/internal/components/menu-wrapper.js +44 -0
  58. package/dist/es2019/internal/context/checkbox-group-context.js +6 -0
  59. package/dist/es2019/internal/context/selection-store.js +54 -0
  60. package/dist/es2019/internal/hooks/use-checkbox-state.js +45 -0
  61. package/dist/es2019/internal/hooks/use-radio-state.js +56 -0
  62. package/dist/es2019/internal/hooks/use-register-item-with-focus-manager.js +19 -0
  63. package/dist/es2019/internal/utils/get-icon-colors.js +17 -0
  64. package/dist/es2019/internal/utils/handle-focus.js +48 -0
  65. package/dist/es2019/internal/utils/is-checkbox-item.js +4 -0
  66. package/dist/es2019/internal/utils/is-radio-item.js +4 -0
  67. package/dist/es2019/internal/utils/is-voice-over-supported.js +11 -0
  68. package/dist/es2019/internal/utils/reset-options-in-group.js +7 -0
  69. package/dist/es2019/radio/dropdown-item-radio-group.js +56 -0
  70. package/dist/es2019/radio/dropdown-item-radio.js +67 -0
  71. package/dist/es2019/version.json +1 -1
  72. package/dist/esm/checkbox/dropdown-item-checkbox-group.js +19 -0
  73. package/dist/esm/checkbox/dropdown-item-checkbox.js +81 -0
  74. package/dist/esm/dropdown-menu-item-group.js +11 -0
  75. package/dist/esm/dropdown-menu-item.js +52 -0
  76. package/dist/esm/dropdown-menu.js +168 -0
  77. package/dist/esm/index.js +7 -11
  78. package/dist/esm/internal/components/focus-manager.js +39 -0
  79. package/dist/esm/internal/components/menu-wrapper.js +45 -0
  80. package/dist/esm/internal/context/checkbox-group-context.js +6 -0
  81. package/dist/esm/internal/context/selection-store.js +58 -0
  82. package/dist/esm/internal/hooks/use-checkbox-state.js +55 -0
  83. package/dist/esm/internal/hooks/use-radio-state.js +70 -0
  84. package/dist/esm/internal/hooks/use-register-item-with-focus-manager.js +19 -0
  85. package/dist/esm/internal/utils/get-icon-colors.js +17 -0
  86. package/dist/esm/internal/utils/handle-focus.js +47 -0
  87. package/dist/esm/internal/utils/is-checkbox-item.js +4 -0
  88. package/dist/esm/internal/utils/is-radio-item.js +4 -0
  89. package/dist/esm/internal/utils/is-voice-over-supported.js +15 -0
  90. package/dist/esm/internal/utils/reset-options-in-group.js +13 -0
  91. package/dist/esm/radio/dropdown-item-radio-group.js +66 -0
  92. package/dist/esm/radio/dropdown-item-radio.js +81 -0
  93. package/dist/esm/version.json +1 -1
  94. package/dist/types/checkbox/dropdown-item-checkbox-group.d.ts +16 -0
  95. package/dist/types/checkbox/dropdown-item-checkbox.d.ts +13 -0
  96. package/dist/types/dropdown-menu-item-group.d.ts +11 -0
  97. package/dist/types/dropdown-menu-item.d.ts +13 -0
  98. package/dist/types/dropdown-menu.d.ts +13 -0
  99. package/dist/types/index.d.ts +8 -10
  100. package/dist/types/internal/components/focus-manager.d.ts +19 -0
  101. package/dist/types/internal/components/menu-wrapper.d.ts +11 -0
  102. package/dist/types/internal/context/checkbox-group-context.d.ts +5 -0
  103. package/dist/types/internal/context/selection-store.d.ts +27 -0
  104. package/dist/types/internal/hooks/use-checkbox-state.d.ts +14 -0
  105. package/dist/types/internal/hooks/use-radio-state.d.ts +9 -0
  106. package/dist/types/internal/hooks/use-register-item-with-focus-manager.d.ts +4 -0
  107. package/dist/types/internal/utils/get-icon-colors.d.ts +8 -0
  108. package/dist/types/internal/utils/handle-focus.d.ts +2 -0
  109. package/dist/types/internal/utils/is-checkbox-item.d.ts +1 -0
  110. package/dist/types/internal/utils/is-radio-item.d.ts +1 -0
  111. package/dist/types/internal/utils/is-voice-over-supported.d.ts +2 -0
  112. package/dist/types/internal/utils/reset-options-in-group.d.ts +4 -0
  113. package/dist/types/radio/dropdown-item-radio-group.d.ts +25 -0
  114. package/dist/types/radio/dropdown-item-radio.d.ts +13 -0
  115. package/dist/types/types.d.ts +254 -79
  116. package/package.json +39 -23
  117. package/dist/cjs/components/DropdownMenu.js +0 -230
  118. package/dist/cjs/components/DropdownMenuStateless.js +0 -523
  119. package/dist/cjs/components/context/DropdownItemClickManager.js +0 -72
  120. package/dist/cjs/components/context/DropdownItemFocusManager.js +0 -178
  121. package/dist/cjs/components/context/DropdownItemSelectionCache.js +0 -131
  122. package/dist/cjs/components/context/DropdownItemSelectionManager.js +0 -185
  123. package/dist/cjs/components/group/DropdownItemGroup.js +0 -61
  124. package/dist/cjs/components/group/DropdownItemGroupCheckbox.js +0 -16
  125. package/dist/cjs/components/group/DropdownItemGroupRadio.js +0 -16
  126. package/dist/cjs/components/group/ert-group-selection.js +0 -8
  127. package/dist/cjs/components/hoc/withItemSelectionManager.js +0 -66
  128. package/dist/cjs/components/hoc/withToggleInteraction.js +0 -175
  129. package/dist/cjs/components/item/DropdownItem.js +0 -19
  130. package/dist/cjs/components/item/DropdownItemCheckbox.js +0 -28
  131. package/dist/cjs/components/item/ert-item-checkbox.js +0 -8
  132. package/dist/cjs/components/item/ert-item-radio.js +0 -8
  133. package/dist/cjs/components/item/ert-item.js +0 -8
  134. package/dist/cjs/styled/WidthConstrainer.js +0 -21
  135. package/dist/cjs/util/contextNamespace.js +0 -19
  136. package/dist/cjs/util/getDisplayName.js +0 -14
  137. package/dist/cjs/util/keys.js +0 -18
  138. package/dist/cjs/util/safeContextCall.js +0 -27
  139. package/dist/cjs/util/supportsVoiceover.js +0 -17
  140. package/dist/es2019/components/DropdownMenu.js +0 -156
  141. package/dist/es2019/components/DropdownMenuStateless.js +0 -459
  142. package/dist/es2019/components/context/DropdownItemClickManager.js +0 -31
  143. package/dist/es2019/components/context/DropdownItemFocusManager.js +0 -134
  144. package/dist/es2019/components/context/DropdownItemSelectionCache.js +0 -68
  145. package/dist/es2019/components/context/DropdownItemSelectionManager.js +0 -140
  146. package/dist/es2019/components/group/DropdownItemGroup.js +0 -17
  147. package/dist/es2019/components/group/DropdownItemGroupCheckbox.js +0 -3
  148. package/dist/es2019/components/group/DropdownItemGroupRadio.js +0 -3
  149. package/dist/es2019/components/group/ert-group-selection.js +0 -1
  150. package/dist/es2019/components/hoc/withItemSelectionManager.js +0 -20
  151. package/dist/es2019/components/hoc/withToggleInteraction.js +0 -119
  152. package/dist/es2019/components/item/DropdownItem.js +0 -3
  153. package/dist/es2019/components/item/DropdownItemCheckbox.js +0 -5
  154. package/dist/es2019/components/item/DropdownItemRadio.js +0 -5
  155. package/dist/es2019/components/item/ert-item-checkbox.js +0 -1
  156. package/dist/es2019/components/item/ert-item-radio.js +0 -1
  157. package/dist/es2019/components/item/ert-item.js +0 -1
  158. package/dist/es2019/styled/WidthConstrainer.js +0 -6
  159. package/dist/es2019/util/contextNamespace.js +0 -6
  160. package/dist/es2019/util/getDisplayName.js +0 -4
  161. package/dist/es2019/util/keys.js +0 -6
  162. package/dist/es2019/util/safeContextCall.js +0 -10
  163. package/dist/es2019/util/supportsVoiceover.js +0 -5
  164. package/dist/esm/components/DropdownMenu.js +0 -215
  165. package/dist/esm/components/DropdownMenuStateless.js +0 -516
  166. package/dist/esm/components/context/DropdownItemClickManager.js +0 -59
  167. package/dist/esm/components/context/DropdownItemFocusManager.js +0 -164
  168. package/dist/esm/components/context/DropdownItemSelectionCache.js +0 -113
  169. package/dist/esm/components/context/DropdownItemSelectionManager.js +0 -174
  170. package/dist/esm/components/group/DropdownItemGroup.js +0 -43
  171. package/dist/esm/components/group/DropdownItemGroupCheckbox.js +0 -3
  172. package/dist/esm/components/group/DropdownItemGroupRadio.js +0 -3
  173. package/dist/esm/components/group/ert-group-selection.js +0 -1
  174. package/dist/esm/components/hoc/withItemSelectionManager.js +0 -47
  175. package/dist/esm/components/hoc/withToggleInteraction.js +0 -155
  176. package/dist/esm/components/item/DropdownItem.js +0 -3
  177. package/dist/esm/components/item/DropdownItemCheckbox.js +0 -7
  178. package/dist/esm/components/item/DropdownItemRadio.js +0 -7
  179. package/dist/esm/components/item/ert-item-checkbox.js +0 -1
  180. package/dist/esm/components/item/ert-item-radio.js +0 -1
  181. package/dist/esm/components/item/ert-item.js +0 -1
  182. package/dist/esm/styled/WidthConstrainer.js +0 -9
  183. package/dist/esm/util/contextNamespace.js +0 -8
  184. package/dist/esm/util/getDisplayName.js +0 -6
  185. package/dist/esm/util/keys.js +0 -6
  186. package/dist/esm/util/safeContextCall.js +0 -18
  187. package/dist/esm/util/supportsVoiceover.js +0 -9
  188. package/dist/types/components/DropdownMenu.d.ts +0 -36
  189. package/dist/types/components/DropdownMenuStateless.d.ts +0 -82
  190. package/dist/types/components/context/DropdownItemClickManager.d.ts +0 -19
  191. package/dist/types/components/context/DropdownItemFocusManager.d.ts +0 -35
  192. package/dist/types/components/context/DropdownItemSelectionCache.d.ts +0 -31
  193. package/dist/types/components/context/DropdownItemSelectionManager.d.ts +0 -34
  194. package/dist/types/components/group/DropdownItemGroup.d.ts +0 -12
  195. package/dist/types/components/group/DropdownItemGroupCheckbox.d.ts +0 -55
  196. package/dist/types/components/group/DropdownItemGroupRadio.d.ts +0 -55
  197. package/dist/types/components/group/ert-group-selection.d.ts +0 -6
  198. package/dist/types/components/hoc/withItemSelectionManager.d.ts +0 -63
  199. package/dist/types/components/hoc/withToggleInteraction.d.ts +0 -98
  200. package/dist/types/components/item/DropdownItem.d.ts +0 -65
  201. package/dist/types/components/item/DropdownItemCheckbox.d.ts +0 -80
  202. package/dist/types/components/item/DropdownItemRadio.d.ts +0 -80
  203. package/dist/types/components/item/ert-item-checkbox.d.ts +0 -2
  204. package/dist/types/components/item/ert-item-radio.d.ts +0 -2
  205. package/dist/types/components/item/ert-item.d.ts +0 -2
  206. package/dist/types/styled/WidthConstrainer.d.ts +0 -7
  207. package/dist/types/util/contextNamespace.d.ts +0 -4
  208. package/dist/types/util/getDisplayName.d.ts +0 -3
  209. package/dist/types/util/keys.d.ts +0 -6
  210. package/dist/types/util/safeContextCall.d.ts +0 -6
  211. package/dist/types/util/supportsVoiceover.d.ts +0 -2
@@ -1,459 +0,0 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
-
4
- /* eslint-disable react/no-array-index-key */
5
- import React, { Component, Fragment } from 'react';
6
- import { findDOMNode } from 'react-dom';
7
- import { createAndFireEvent, withAnalyticsContext, withAnalyticsEvents } from '@atlaskit/analytics-next';
8
- import Button from '@atlaskit/button/custom-theme-button';
9
- import Droplist, { Group, Item } from '@atlaskit/droplist';
10
- import ExpandIcon from '@atlaskit/icon/glyph/chevron-down';
11
- import WidthConstrainer from '../styled/WidthConstrainer';
12
- import { KEY_DOWN, KEY_ENTER, KEY_SPACE } from '../util/keys';
13
- import DropdownItemClickManager from './context/DropdownItemClickManager';
14
- import DropdownItemFocusManager from './context/DropdownItemFocusManager';
15
- import DropdownItemSelectionCache from './context/DropdownItemSelectionCache';
16
- const packageName = "@atlaskit/dropdown-menu";
17
- const packageVersion = "10.1.8";
18
- export class DropdownMenuStateless extends Component {
19
- constructor(..._args) {
20
- super(..._args);
21
-
22
- _defineProperty(this, "dropdownListPositioned", false);
23
-
24
- _defineProperty(this, "state", {
25
- autoFocusDropdownItems: false
26
- });
27
-
28
- _defineProperty(this, "componentDidMount", () => {
29
- if (this.isUsingDeprecatedAPI()) {
30
- if (process.env.NODE_ENV !== 'test' && process.env.NODE_ENV !== 'production' && !process.env.CI) {
31
- // eslint-disable-next-line no-console
32
- console.log('DropdownMenu.items is deprecated. Please switch to the declarative API.');
33
- }
34
-
35
- if (this.domItemsList) {
36
- this.focusFirstItem();
37
- }
38
- }
39
- });
40
-
41
- _defineProperty(this, "componentDidUpdate", prevProp => {
42
- if (this.isUsingDeprecatedAPI() && this.props.isOpen && !prevProp.isOpen) {
43
- this.focusFirstItem();
44
- }
45
- });
46
-
47
- _defineProperty(this, "getNextFocusable", (indexItem, available) => {
48
- if (!this.domItemsList) {
49
- return null;
50
- }
51
-
52
- let currentItem = typeof indexItem !== 'number' ? -1 : indexItem;
53
- const latestAvailable = typeof available !== 'number' ? currentItem : available;
54
-
55
- if (currentItem < this.domItemsList.length - 1) {
56
- currentItem++;
57
-
58
- if (this.domItemsList[currentItem].getAttribute('aria-hidden') !== 'true') {
59
- return currentItem;
60
- }
61
-
62
- return this.getNextFocusable(currentItem, latestAvailable);
63
- }
64
-
65
- return latestAvailable;
66
- });
67
-
68
- _defineProperty(this, "getPrevFocusable", (indexItem, available) => {
69
- if (!this.domItemsList) {
70
- return null;
71
- }
72
-
73
- let currentItem = typeof indexItem !== 'number' ? -1 : indexItem;
74
- const latestAvailable = typeof available !== 'number' ? currentItem : available;
75
-
76
- if (currentItem && currentItem > 0) {
77
- currentItem--;
78
-
79
- if (this.domItemsList[currentItem].getAttribute('aria-hidden') !== 'true') {
80
- return currentItem;
81
- }
82
-
83
- return this.getPrevFocusable(currentItem, latestAvailable);
84
- }
85
-
86
- return latestAvailable || currentItem;
87
- });
88
-
89
- _defineProperty(this, "focusFirstItem", () => {
90
- if (this.sourceOfIsOpen === 'keydown') {
91
- this.focusItem(this.getNextFocusable());
92
- }
93
- });
94
-
95
- _defineProperty(this, "focusNextItem", () => {
96
- this.focusItem(this.getNextFocusable(this.focusedItem));
97
- });
98
-
99
- _defineProperty(this, "focusPreviousItem", () => {
100
- this.focusItem(this.getPrevFocusable(this.focusedItem));
101
- });
102
-
103
- _defineProperty(this, "focusItem", index => {
104
- if (!this.domItemsList || !index) {
105
- return;
106
- }
107
-
108
- this.focusedItem = index;
109
- this.domItemsList[this.focusedItem].focus();
110
- });
111
-
112
- _defineProperty(this, "isTargetChildItem", target => {
113
- if (!target) {
114
- return false;
115
- }
116
-
117
- const isDroplistItem = target.getAttribute('data-role') === 'droplistItem'; // eslint-disable-next-line react/no-find-dom-node
118
-
119
- const thisDom = findDOMNode(this);
120
- return isDroplistItem && thisDom ? thisDom.contains(target) : false;
121
- });
122
-
123
- _defineProperty(this, "handleKeyboardInteractionForClosed", event => {
124
- if (this.props.isOpen) {
125
- return;
126
- }
127
-
128
- switch (event.key) {
129
- case KEY_DOWN:
130
- case KEY_SPACE:
131
- case KEY_ENTER:
132
- event.preventDefault();
133
- this.open({
134
- event,
135
- source: 'keydown'
136
- });
137
- break;
138
-
139
- default:
140
- break;
141
- }
142
- });
143
-
144
- _defineProperty(this, "handleKeyboardInteractionsDeprecated", event => {
145
- if (this.props.isOpen) {
146
- if (this.isTargetChildItem(event.target)) {
147
- switch (event.key) {
148
- case 'ArrowUp':
149
- event.preventDefault();
150
- this.focusPreviousItem();
151
- break;
152
-
153
- case 'ArrowDown':
154
- event.preventDefault();
155
- this.focusNextItem();
156
- break;
157
-
158
- case 'Tab':
159
- event.preventDefault();
160
- this.close({
161
- event
162
- });
163
- break;
164
-
165
- default:
166
- break;
167
- }
168
- } else if (event.key === 'ArrowDown') {
169
- this.sourceOfIsOpen = 'keydown';
170
- this.focusFirstItem();
171
- } else if (event.key === 'Tab') {
172
- this.close({
173
- event
174
- });
175
- }
176
- } else {
177
- switch (event.key) {
178
- case KEY_DOWN:
179
- case KEY_SPACE:
180
- case KEY_ENTER:
181
- event.preventDefault();
182
- this.open({
183
- event,
184
- source: 'keydown'
185
- });
186
- break;
187
-
188
- default:
189
- break;
190
- }
191
- }
192
- });
193
-
194
- _defineProperty(this, "domMenuContainer", null);
195
-
196
- _defineProperty(this, "isUsingDeprecatedAPI", () => Boolean(this.props.items.length));
197
-
198
- _defineProperty(this, "handleOpenChange", args => {
199
- this.props.onOpenChange(args);
200
- });
201
-
202
- _defineProperty(this, "triggerContent", () => {
203
- const {
204
- children,
205
- trigger,
206
- isOpen,
207
- triggerButtonProps,
208
- triggerType,
209
- testId
210
- } = this.props;
211
- const insideTriggerContent = this.isUsingDeprecatedAPI() ? children : trigger;
212
-
213
- if (triggerType !== 'button') {
214
- return insideTriggerContent;
215
- } // we probably don't need to object copying
216
- // ts doesn't like destructuring copy - so converting to object.assign
217
-
218
-
219
- const triggerProps = Object.assign({}, triggerButtonProps);
220
- const defaultButtonProps = {
221
- 'aria-expanded': isOpen,
222
- 'aria-haspopup': true,
223
- isSelected: isOpen
224
- };
225
-
226
- if (!triggerProps.iconAfter && !triggerProps.iconBefore) {
227
- triggerProps.iconAfter = /*#__PURE__*/React.createElement(ExpandIcon, {
228
- size: "medium",
229
- label: ""
230
- });
231
- }
232
-
233
- return /*#__PURE__*/React.createElement(Button, _extends({}, defaultButtonProps, triggerProps, {
234
- testId: testId && `${testId}--trigger`
235
- }), insideTriggerContent);
236
- });
237
-
238
- _defineProperty(this, "open", attrs => {
239
- this.sourceOfIsOpen = attrs.source;
240
- this.props.onOpenChange({
241
- isOpen: true,
242
- event: attrs.event
243
- }); // Dropdown opened via keyboard gets auto focussed
244
-
245
- this.setState({
246
- autoFocusDropdownItems: this.sourceOfIsOpen === 'keydown'
247
- });
248
- });
249
-
250
- _defineProperty(this, "close", attrs => {
251
- this.sourceOfIsOpen = null;
252
- this.props.onOpenChange({
253
- isOpen: false,
254
- event: attrs.event
255
- });
256
- });
257
-
258
- _defineProperty(this, "toggle", attrs => {
259
- if (attrs.source === 'keydown') {
260
- return;
261
- }
262
-
263
- if (this.props.isOpen) {
264
- this.close(attrs);
265
- } else {
266
- this.open(attrs);
267
- }
268
- });
269
-
270
- _defineProperty(this, "renderTrigger", () => {
271
- const triggerContent = this.triggerContent();
272
- return this.isUsingDeprecatedAPI() ? triggerContent : /*#__PURE__*/React.createElement("div", {
273
- ref: ref => {
274
- this.triggerContainer = ref;
275
- }
276
- }, triggerContent);
277
- });
278
-
279
- _defineProperty(this, "renderItems", items => items.map((item, itemIndex) => /*#__PURE__*/React.createElement(Item, _extends({}, item, {
280
- key: itemIndex,
281
- onActivate: ({
282
- event
283
- }) => {
284
- this.props.onItemActivated({
285
- item,
286
- event
287
- });
288
- }
289
- }), item.content)));
290
-
291
- _defineProperty(this, "renderGroups", groups => groups.map((group, groupIndex) => /*#__PURE__*/React.createElement(Group, {
292
- heading: group.heading,
293
- elemAfter: group.elemAfter,
294
- key: groupIndex
295
- }, this.renderItems(group.items))));
296
-
297
- _defineProperty(this, "renderDeprecated", () => {
298
- const {
299
- items,
300
- shouldFitContainer
301
- } = this.props;
302
- return /*#__PURE__*/React.createElement("div", {
303
- ref: ref => {
304
- this.domMenuContainer = ref;
305
- this.domItemsList = ref ? ref.querySelectorAll('[data-role="droplistItem"]') : null;
306
- },
307
- role: "menu",
308
- style: shouldFitContainer ? undefined : {
309
- maxWidth: 300
310
- }
311
- }, this.renderGroups(items));
312
- });
313
-
314
- _defineProperty(this, "onDroplistPositioned", () => {
315
- this.dropdownListPositioned = true; // Trigger render so item focus manager can auto focus for keyboard trigger
316
-
317
- this.setState({
318
- autoFocusDropdownItems: this.sourceOfIsOpen === 'keydown'
319
- });
320
-
321
- if (this.props.onPositioned) {
322
- this.props.onPositioned();
323
- }
324
- });
325
-
326
- _defineProperty(this, "renderDropdownItems", () => {
327
- if (this.sourceOfIsOpen === 'keydown' && this.dropdownListPositioned) {
328
- return /*#__PURE__*/React.createElement(DropdownItemFocusManager, {
329
- autoFocus: this.state.autoFocusDropdownItems,
330
- close: this.close
331
- }, this.props.children);
332
- }
333
-
334
- return /*#__PURE__*/React.createElement(Fragment, null, this.props.children);
335
- });
336
- }
337
-
338
- handleClickDeprecated(event) {
339
- const menuContainer = this.domMenuContainer;
340
-
341
- if (!menuContainer || menuContainer && !menuContainer.contains(event.target)) {
342
- this.toggle({
343
- source: 'click',
344
- event
345
- });
346
- }
347
- }
348
-
349
- handleClick(event) {
350
- // For any clicks we don't want autofocus
351
- this.setState({
352
- autoFocusDropdownItems: false
353
- });
354
-
355
- if (this.isUsingDeprecatedAPI()) {
356
- this.handleClickDeprecated(event);
357
- return;
358
- }
359
-
360
- if (this.triggerContainer && this.triggerContainer.contains(event.target) && event.target.disabled !== true) {
361
- const {
362
- isOpen
363
- } = this.props;
364
- this.sourceOfIsOpen = 'mouse';
365
- this.props.onOpenChange({
366
- isOpen: !isOpen,
367
- event
368
- });
369
- }
370
- }
371
-
372
- render() {
373
- const {
374
- appearance,
375
- boundariesElement,
376
- isLoading,
377
- isOpen,
378
- onOpenChange,
379
- position,
380
- isMenuFixed,
381
- shouldAllowMultilineItems,
382
- shouldFitContainer,
383
- shouldFlip,
384
- testId
385
- } = this.props;
386
- const isDeprecated = this.isUsingDeprecatedAPI();
387
- const deprecatedProps = isDeprecated ? {
388
- onKeyDown: this.handleKeyboardInteractionsDeprecated,
389
- shouldAllowMultilineItems
390
- } : {
391
- onKeyDown: this.handleKeyboardInteractionForClosed
392
- };
393
- return /*#__PURE__*/React.createElement(DropdownItemSelectionCache, null, /*#__PURE__*/React.createElement(Droplist, _extends({
394
- appearance: appearance,
395
- boundariesElement: boundariesElement,
396
- isLoading: isLoading,
397
- isOpen: isOpen,
398
- onClick: e => this.handleClick(e),
399
- onOpenChange: this.handleOpenChange,
400
- position: position,
401
- isMenuFixed: isMenuFixed,
402
- shouldFitContainer: shouldFitContainer,
403
- shouldFlip: shouldFlip,
404
- trigger: this.renderTrigger(),
405
- onPositioned: this.onDroplistPositioned
406
- }, deprecatedProps, {
407
- analyticsContext: {
408
- componentName: 'dropdownMenu',
409
- packageName,
410
- packageVersion
411
- },
412
- testId: testId
413
- }), isDeprecated ? this.renderDeprecated() : /*#__PURE__*/React.createElement(WidthConstrainer, {
414
- role: "menu",
415
- shouldFitContainer: shouldFitContainer
416
- }, /*#__PURE__*/React.createElement(DropdownItemClickManager, {
417
- onItemClicked: event => onOpenChange({
418
- isOpen: false,
419
- event
420
- })
421
- }, this.renderDropdownItems()))));
422
- }
423
-
424
- }
425
-
426
- _defineProperty(DropdownMenuStateless, "defaultProps", {
427
- appearance: 'default',
428
- boundariesElement: 'viewport',
429
- isLoading: false,
430
- isOpen: false,
431
- items: [],
432
- onItemActivated: () => {},
433
- onOpenChange: () => {},
434
- position: 'bottom left',
435
- isMenuFixed: false,
436
- shouldAllowMultilineItems: false,
437
- shouldFitContainer: false,
438
- shouldFlip: true,
439
- triggerType: 'default',
440
- onPositioned: () => {}
441
- });
442
-
443
- export { DropdownMenuStateless as DropdownMenuStatelessWithoutAnalytics };
444
- const createAndFireEventOnAtlaskit = createAndFireEvent('atlaskit');
445
- export default withAnalyticsContext({
446
- componentName: 'dropdownMenu',
447
- packageName,
448
- packageVersion
449
- })(withAnalyticsEvents({
450
- onOpenChange: createAndFireEventOnAtlaskit({
451
- action: 'toggled',
452
- actionSubject: 'dropdownMenu',
453
- attributes: {
454
- componentName: 'dropdownMenu',
455
- packageName,
456
- packageVersion
457
- }
458
- })
459
- })(DropdownMenuStateless));
@@ -1,31 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import { Component } from 'react';
3
- import PropTypes from 'prop-types';
4
- import { clickManagerContext } from '../../util/contextNamespace';
5
- export default class DropdownItemClickManager extends Component {
6
- constructor(...args) {
7
- super(...args);
8
-
9
- _defineProperty(this, "handleItemClicked", event => {
10
- this.props.onItemClicked(event);
11
- });
12
- }
13
-
14
- getChildContext() {
15
- return {
16
- [clickManagerContext]: {
17
- itemClicked: this.handleItemClicked
18
- }
19
- };
20
- }
21
-
22
- render() {
23
- return this.props.children;
24
- }
25
-
26
- }
27
-
28
- _defineProperty(DropdownItemClickManager, "childContextTypes", {
29
- // eslint-disable-next-line react/forbid-prop-types
30
- [clickManagerContext]: PropTypes.object
31
- });
@@ -1,134 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import React, { Component } from 'react';
3
- import PropTypes from 'prop-types';
4
- import { focusManagerContext } from '../../util/contextNamespace';
5
- import { KEY_DOWN, KEY_TAB, KEY_UP } from '../../util/keys';
6
- export default class DropdownItemFocusManager extends Component {
7
- constructor(...args) {
8
- super(...args);
9
-
10
- _defineProperty(this, "registeredItems", []);
11
-
12
- _defineProperty(this, "handleItemRegistered", (itemId, itemNode) => {
13
- this.registeredItems.push({
14
- itemId,
15
- itemNode
16
- });
17
-
18
- if (this.props.autoFocus && this.registeredItems.length === 1) {
19
- this.focusedItemId = itemId;
20
- itemNode.focus();
21
- }
22
- });
23
-
24
- _defineProperty(this, "handleItemDeregistered", itemId => {
25
- this.registeredItems = this.registeredItems.filter(item => item.itemId !== itemId);
26
- });
27
-
28
- _defineProperty(this, "handleItemFocused", itemId => {
29
- this.focusedItemId = itemId;
30
- });
31
-
32
- _defineProperty(this, "handleItemUpdated", (itemId, itemNode) => {
33
- let matchingIndex = -1;
34
-
35
- for (let i = 0; i < this.registeredItems.length; i++) {
36
- if (this.registeredItems[i].itemId === itemId) {
37
- matchingIndex = i;
38
- break;
39
- }
40
- }
41
-
42
- if (matchingIndex === -1) {
43
- this.handleItemRegistered(itemId, itemNode);
44
- return;
45
- }
46
-
47
- this.registeredItems[matchingIndex].itemNode = itemNode;
48
-
49
- if (this.focusedItemIndex() === matchingIndex) {
50
- itemNode.focus();
51
- }
52
- });
53
-
54
- _defineProperty(this, "focusedItemIndex", () => {
55
- const {
56
- focusedItemId,
57
- registeredItems
58
- } = this;
59
-
60
- for (let i = 0; i < registeredItems.length; i++) {
61
- if (registeredItems[i].itemId === focusedItemId) {
62
- return i;
63
- }
64
- }
65
-
66
- return -1;
67
- });
68
-
69
- _defineProperty(this, "handleKeyboard", event => {
70
- const {
71
- key,
72
- shiftKey
73
- } = event;
74
- const focusedItemIndex = this.focusedItemIndex();
75
-
76
- if (key === KEY_UP || key === KEY_DOWN) {
77
- // We prevent default here to avoid page scrolling when up/down
78
- // pressed while dropdown is focused.
79
- event.preventDefault();
80
-
81
- if (focusedItemIndex < 0) {
82
- return;
83
- }
84
-
85
- const nextItemIndex = key === KEY_UP ? Math.max(0, focusedItemIndex - 1) : Math.min(this.registeredItems.length - 1, focusedItemIndex + 1);
86
- this.registeredItems[nextItemIndex].itemNode.focus();
87
- }
88
-
89
- if (key === KEY_TAB) {
90
- if (!shiftKey && focusedItemIndex === this.registeredItems.length - 1) {
91
- if (this.props.close) {
92
- this.props.close({
93
- event,
94
- source: 'keydown'
95
- });
96
- }
97
- }
98
-
99
- if (shiftKey && focusedItemIndex === 0) {
100
- if (this.props.close) {
101
- this.props.close({
102
- event,
103
- source: 'keydown'
104
- });
105
- }
106
- }
107
- }
108
- });
109
- }
110
-
111
- getChildContext() {
112
- return {
113
- [focusManagerContext]: {
114
- itemFocused: this.handleItemFocused,
115
- registerItem: this.handleItemRegistered,
116
- deregisterItem: this.handleItemDeregistered,
117
- updateItem: this.handleItemUpdated
118
- }
119
- };
120
- }
121
-
122
- render() {
123
- // eslint-disable-next-line jsx-a11y/no-static-element-interactions
124
- return /*#__PURE__*/React.createElement("div", {
125
- onKeyDown: this.handleKeyboard
126
- }, this.props.children);
127
- }
128
-
129
- }
130
-
131
- _defineProperty(DropdownItemFocusManager, "childContextTypes", {
132
- // eslint-disable-next-line react/forbid-prop-types
133
- [focusManagerContext]: PropTypes.object
134
- });
@@ -1,68 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import React, { Component } from 'react';
3
- import find from 'array-find';
4
- import PropTypes from 'prop-types';
5
- import { selectionCacheContext } from '../../util/contextNamespace';
6
-
7
- const isItemInList = (itemList, itemId, groupId) => Boolean(find(itemList, item => item.id === itemId && item.groupId === groupId));
8
-
9
- export default class DropdownItemSelectionCache extends Component {
10
- constructor(...args) {
11
- super(...args);
12
-
13
- _defineProperty(this, "state", {
14
- lastCacheUpdate: 0
15
- });
16
-
17
- _defineProperty(this, "selectedItems", []);
18
-
19
- _defineProperty(this, "alreadyDefaultedItems", []);
20
-
21
- _defineProperty(this, "handleItemSelectionsChanged", (groupId, newGroupSelections) => {
22
- const newSelectedItems = [...this.selectedItems.filter(item => item.groupId !== groupId), ...newGroupSelections];
23
- this.selectedItems = newSelectedItems; // We store selectedItems in an instance variable (this.selectedItems) instead of state,
24
- // because if multiple children update the cache at the same time it causes unexpected
25
- // behaviour due to the asynchronous behaviour of setState. So we need to trigger setState
26
- // with a different value to cause the children to be updated with their new selection values.
27
-
28
- this.setState({
29
- lastCacheUpdate: Date.now()
30
- });
31
- });
32
- }
33
-
34
- // eslint-disable-line react/sort-comp
35
- getChildContext() {
36
- return {
37
- [selectionCacheContext]: {
38
- // This function returns true/false describing whether the supplied navigation item
39
- // (which must have a unique item and group ID) is currently selected - this is used
40
- // by radio and checkbox dropdown items to retreive their 'selected' state when they
41
- // re-mount, which happens when the dropdown is closed and then re-opened.
42
- isItemSelected: (groupId, itemId) => isItemInList(this.selectedItems, itemId, groupId),
43
- itemsInGroup: groupId => this.selectedItems.filter(item => item.groupId === groupId),
44
- itemSelectionsChanged: this.handleItemSelectionsChanged,
45
- hasItemAlreadyHadDefaultSelectedApplied: (groupId, itemId) => isItemInList(this.alreadyDefaultedItems, itemId, groupId),
46
- markItemAsDefaultApplied: (groupId, itemId) => {
47
- this.alreadyDefaultedItems.push({
48
- id: itemId,
49
- groupId
50
- });
51
- }
52
- }
53
- };
54
- }
55
-
56
- render() {
57
- return /*#__PURE__*/React.createElement("div", null, this.props.children);
58
- }
59
-
60
- }
61
-
62
- _defineProperty(DropdownItemSelectionCache, "childContextTypes", {
63
- [selectionCacheContext]: PropTypes.shape({
64
- isItemSelected: PropTypes.func,
65
- itemsInGroup: PropTypes.func,
66
- itemSelectionsChanged: PropTypes.func
67
- })
68
- });