@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
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+
12
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
+
14
+ var _react = _interopRequireDefault(require("react"));
15
+
16
+ var _buttonItem = _interopRequireDefault(require("@atlaskit/menu/button-item"));
17
+
18
+ var _linkItem = _interopRequireDefault(require("@atlaskit/menu/link-item"));
19
+
20
+ var _useRegisterItemWithFocusManager = _interopRequireDefault(require("./internal/hooks/use-register-item-with-focus-manager"));
21
+
22
+ var _excluded = ["elemBefore", "elemAfter", "href", "shouldTitleWrap", "shouldDescriptionWrap"];
23
+
24
+ /**
25
+ * __Dropdown menu item__
26
+ *
27
+ * A dropdown item populates the dropdown menu with items. Every item should be inside a dropdown item group.
28
+ *
29
+ * - [Examples](https://atlassian.design/components/dropdown-item/examples)
30
+ * - [Code](https://atlassian.design/components/dropdown-item/code)
31
+ * - [Usage](https://atlassian.design/components/dropdown-item/usage)
32
+ */
33
+ var DropdownMenuItem = function DropdownMenuItem(props) {
34
+ var elemBefore = props.elemBefore,
35
+ elemAfter = props.elemAfter,
36
+ href = props.href,
37
+ _props$shouldTitleWra = props.shouldTitleWrap,
38
+ shouldTitleWrap = _props$shouldTitleWra === void 0 ? true : _props$shouldTitleWra,
39
+ _props$shouldDescript = props.shouldDescriptionWrap,
40
+ shouldDescriptionWrap = _props$shouldDescript === void 0 ? true : _props$shouldDescript,
41
+ rest = (0, _objectWithoutProperties2.default)(props, _excluded);
42
+ var itemRef = (0, _useRegisterItemWithFocusManager.default)();
43
+
44
+ if (href) {
45
+ return /*#__PURE__*/_react.default.createElement(_linkItem.default, (0, _extends2.default)({
46
+ href: href,
47
+ iconBefore: elemBefore,
48
+ iconAfter: elemAfter,
49
+ role: "menuitem",
50
+ ref: itemRef,
51
+ shouldTitleWrap: shouldTitleWrap,
52
+ shouldDescriptionWrap: shouldDescriptionWrap
53
+ }, rest));
54
+ } else {
55
+ return /*#__PURE__*/_react.default.createElement(_buttonItem.default, (0, _extends2.default)({
56
+ role: "menuitem",
57
+ iconBefore: elemBefore,
58
+ iconAfter: elemAfter,
59
+ ref: itemRef,
60
+ shouldTitleWrap: shouldTitleWrap,
61
+ shouldDescriptionWrap: shouldDescriptionWrap
62
+ }, rest));
63
+ }
64
+ };
65
+
66
+ var _default = DropdownMenuItem;
67
+ exports.default = _default;
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+
12
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var _react = require("react");
17
+
18
+ var _core = require("@emotion/core");
19
+
20
+ var _standardButton = _interopRequireDefault(require("@atlaskit/button/standard-button"));
21
+
22
+ var _keycodes = require("@atlaskit/ds-lib/keycodes");
23
+
24
+ var _noop = _interopRequireDefault(require("@atlaskit/ds-lib/noop"));
25
+
26
+ var _useControlled = _interopRequireDefault(require("@atlaskit/ds-lib/use-controlled"));
27
+
28
+ var _useFocusEvent = _interopRequireDefault(require("@atlaskit/ds-lib/use-focus-event"));
29
+
30
+ var _useKeydownEvent = _interopRequireDefault(require("@atlaskit/ds-lib/use-keydown-event"));
31
+
32
+ var _chevronDown = _interopRequireDefault(require("@atlaskit/icon/glyph/chevron-down"));
33
+
34
+ var _popup = _interopRequireDefault(require("@atlaskit/popup"));
35
+
36
+ var _spinner = _interopRequireDefault(require("@atlaskit/spinner"));
37
+
38
+ var _constants = require("@atlaskit/theme/constants");
39
+
40
+ var _visuallyHidden = _interopRequireDefault(require("@atlaskit/visually-hidden"));
41
+
42
+ var _focusManager = _interopRequireDefault(require("./internal/components/focus-manager"));
43
+
44
+ var _menuWrapper = _interopRequireDefault(require("./internal/components/menu-wrapper"));
45
+
46
+ var _selectionStore = _interopRequireDefault(require("./internal/context/selection-store"));
47
+
48
+ var _excluded = ["ref"];
49
+ var gridSize = (0, _constants.gridSize)();
50
+ var spinnerContainerStyles = (0, _core.css)({
51
+ display: 'flex',
52
+ minWidth: "".concat(gridSize * 20, "px"),
53
+ padding: "".concat(gridSize * 2.5, "px"),
54
+ justifyContent: 'center'
55
+ });
56
+ var MAX_HEIGHT = "calc(100vh - ".concat(gridSize * 2, "px)");
57
+ /**
58
+ * __Dropdown menu__
59
+ *
60
+ * A dropdown menu displays a list of actions or options to a user.
61
+ *
62
+ * - [Examples](https://atlassian.design/components/dropdown-menu/examples)
63
+ * - [Code](https://atlassian.design/components/dropdown-menu/code)
64
+ * - [Usage](https://atlassian.design/components/dropdown-menu/usage)
65
+ */
66
+
67
+ var DropdownMenu = function DropdownMenu(props) {
68
+ var _props$defaultOpen = props.defaultOpen,
69
+ defaultOpen = _props$defaultOpen === void 0 ? false : _props$defaultOpen,
70
+ isOpen = props.isOpen,
71
+ _props$onOpenChange = props.onOpenChange,
72
+ onOpenChange = _props$onOpenChange === void 0 ? _noop.default : _props$onOpenChange,
73
+ children = props.children,
74
+ _props$placement = props.placement,
75
+ placement = _props$placement === void 0 ? 'bottom-start' : _props$placement,
76
+ Trigger = props.trigger,
77
+ _props$shouldFlip = props.shouldFlip,
78
+ shouldFlip = _props$shouldFlip === void 0 ? true : _props$shouldFlip,
79
+ _props$isLoading = props.isLoading,
80
+ isLoading = _props$isLoading === void 0 ? false : _props$isLoading,
81
+ _props$autoFocus = props.autoFocus,
82
+ autoFocus = _props$autoFocus === void 0 ? false : _props$autoFocus,
83
+ testId = props.testId,
84
+ _props$statusLabel = props.statusLabel,
85
+ statusLabel = _props$statusLabel === void 0 ? 'Loading' : _props$statusLabel;
86
+
87
+ var _useControlledState = (0, _useControlled.default)(isOpen, function () {
88
+ return defaultOpen;
89
+ }),
90
+ _useControlledState2 = (0, _slicedToArray2.default)(_useControlledState, 2),
91
+ isLocalOpen = _useControlledState2[0],
92
+ setLocalIsOpen = _useControlledState2[1];
93
+
94
+ var _useState = (0, _react.useState)(false),
95
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
96
+ isTriggeredUsingKeyboard = _useState2[0],
97
+ setTriggeredUsingKeyboard = _useState2[1];
98
+
99
+ var handleTriggerClicked = (0, _react.useCallback)(function (event) {
100
+ var newValue = !isLocalOpen;
101
+ var clientX = event.clientX,
102
+ clientY = event.clientY,
103
+ type = event.type;
104
+
105
+ if (type === 'keydown') {
106
+ setTriggeredUsingKeyboard(true);
107
+ } else if (clientX === 0 || clientY === 0) {
108
+ // Hitting enter/space is registered as a click
109
+ // with both clientX and clientY === 0
110
+ setTriggeredUsingKeyboard(true);
111
+ }
112
+
113
+ setLocalIsOpen(newValue);
114
+ onOpenChange({
115
+ isOpen: newValue,
116
+ event: event
117
+ });
118
+ }, [onOpenChange, isLocalOpen, setLocalIsOpen]);
119
+ var handleOnClose = (0, _react.useCallback)(function () {
120
+ var newValue = false;
121
+ setLocalIsOpen(newValue);
122
+ onOpenChange({
123
+ isOpen: newValue
124
+ });
125
+ }, [onOpenChange, setLocalIsOpen]);
126
+
127
+ var _useFocus = (0, _useFocusEvent.default)(),
128
+ isFocused = _useFocus.isFocused,
129
+ bindFocus = _useFocus.bindFocus;
130
+
131
+ var handleDownArrow = function handleDownArrow(e) {
132
+ if (e.key === _keycodes.KEY_DOWN) {
133
+ // prevent page scroll
134
+ e.preventDefault();
135
+ handleTriggerClicked(e);
136
+ }
137
+ };
138
+
139
+ (0, _useKeydownEvent.default)(handleDownArrow, isFocused);
140
+
141
+ var renderTrigger = function renderTrigger(triggerProps) {
142
+ if (typeof Trigger === 'function') {
143
+ var ref = triggerProps.ref,
144
+ providedProps = (0, _objectWithoutProperties2.default)(triggerProps, _excluded);
145
+ return (0, _core.jsx)(Trigger, (0, _extends2.default)({}, providedProps, bindFocus, {
146
+ triggerRef: ref,
147
+ isSelected: isLocalOpen,
148
+ onClick: handleTriggerClicked,
149
+ testId: testId && "".concat(testId, "--trigger")
150
+ }));
151
+ }
152
+
153
+ return (0, _core.jsx)(_standardButton.default, (0, _extends2.default)({}, triggerProps, bindFocus, {
154
+ isSelected: isLocalOpen,
155
+ iconAfter: (0, _core.jsx)(_chevronDown.default, {
156
+ size: "medium",
157
+ label: "expand"
158
+ }),
159
+ onClick: handleTriggerClicked,
160
+ testId: testId && "".concat(testId, "--trigger")
161
+ }), Trigger);
162
+ };
163
+
164
+ var fallbackPlacements = ['bottom', 'bottom-end', 'right-start', 'left-start', 'auto'];
165
+ return (0, _core.jsx)(_selectionStore.default, null, (0, _core.jsx)(_popup.default, {
166
+ shouldFlip: shouldFlip,
167
+ isOpen: isLocalOpen,
168
+ onClose: handleOnClose,
169
+ zIndex: _constants.layers.modal(),
170
+ placement: placement,
171
+ fallbackPlacements: fallbackPlacements,
172
+ testId: testId && "".concat(testId, "--content"),
173
+ trigger: renderTrigger,
174
+ shouldUseCaptureOnOutsideClick: true,
175
+ content: function content(_ref) {
176
+ var setInitialFocusRef = _ref.setInitialFocusRef;
177
+ return (0, _core.jsx)(_focusManager.default, null, (0, _core.jsx)(_menuWrapper.default, {
178
+ maxHeight: MAX_HEIGHT,
179
+ maxWidth: 800,
180
+ onClose: handleOnClose,
181
+ setInitialFocusRef: isTriggeredUsingKeyboard || autoFocus ? setInitialFocusRef : undefined
182
+ }, isLoading ? (0, _core.jsx)("div", {
183
+ css: spinnerContainerStyles
184
+ }, (0, _core.jsx)(_spinner.default, {
185
+ size: "small"
186
+ }), (0, _core.jsx)(_visuallyHidden.default, {
187
+ role: "status"
188
+ }, statusLabel)) : children));
189
+ }
190
+ }));
191
+ };
192
+
193
+ var _default = DropdownMenu;
194
+ exports.default = _default;
package/dist/cjs/index.js CHANGED
@@ -5,67 +5,59 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- Object.defineProperty(exports, "default", {
8
+ Object.defineProperty(exports, "DropdownItem", {
9
9
  enumerable: true,
10
10
  get: function get() {
11
- return _DropdownMenu.default;
11
+ return _dropdownMenuItem.default;
12
12
  }
13
13
  });
14
- Object.defineProperty(exports, "DropdownMenuStateless", {
14
+ Object.defineProperty(exports, "DropdownItemCheckbox", {
15
15
  enumerable: true,
16
16
  get: function get() {
17
- return _DropdownMenuStateless.default;
17
+ return _dropdownItemCheckbox.default;
18
18
  }
19
19
  });
20
- Object.defineProperty(exports, "DropdownItem", {
20
+ Object.defineProperty(exports, "DropdownItemCheckboxGroup", {
21
21
  enumerable: true,
22
22
  get: function get() {
23
- return _DropdownItem.default;
23
+ return _dropdownItemCheckboxGroup.default;
24
24
  }
25
25
  });
26
- Object.defineProperty(exports, "DropdownItemRadio", {
27
- enumerable: true,
28
- get: function get() {
29
- return _DropdownItemRadio.default;
30
- }
31
- });
32
- Object.defineProperty(exports, "DropdownItemCheckbox", {
26
+ Object.defineProperty(exports, "DropdownItemGroup", {
33
27
  enumerable: true,
34
28
  get: function get() {
35
- return _DropdownItemCheckbox.default;
29
+ return _dropdownMenuItemGroup.default;
36
30
  }
37
31
  });
38
- Object.defineProperty(exports, "DropdownItemGroup", {
32
+ Object.defineProperty(exports, "DropdownItemRadio", {
39
33
  enumerable: true,
40
34
  get: function get() {
41
- return _DropdownItemGroup.default;
35
+ return _dropdownItemRadio.default;
42
36
  }
43
37
  });
44
- Object.defineProperty(exports, "DropdownItemGroupRadio", {
38
+ Object.defineProperty(exports, "DropdownItemRadioGroup", {
45
39
  enumerable: true,
46
40
  get: function get() {
47
- return _DropdownItemGroupRadio.default;
41
+ return _dropdownItemRadioGroup.default;
48
42
  }
49
43
  });
50
- Object.defineProperty(exports, "DropdownItemGroupCheckbox", {
44
+ Object.defineProperty(exports, "default", {
51
45
  enumerable: true,
52
46
  get: function get() {
53
- return _DropdownItemGroupCheckbox.default;
47
+ return _dropdownMenu.default;
54
48
  }
55
49
  });
56
50
 
57
- var _DropdownMenu = _interopRequireDefault(require("./components/DropdownMenu"));
58
-
59
- var _DropdownMenuStateless = _interopRequireDefault(require("./components/DropdownMenuStateless"));
51
+ var _dropdownMenu = _interopRequireDefault(require("./dropdown-menu"));
60
52
 
61
- var _DropdownItem = _interopRequireDefault(require("./components/item/DropdownItem"));
53
+ var _dropdownMenuItemGroup = _interopRequireDefault(require("./dropdown-menu-item-group"));
62
54
 
63
- var _DropdownItemRadio = _interopRequireDefault(require("./components/item/DropdownItemRadio"));
55
+ var _dropdownMenuItem = _interopRequireDefault(require("./dropdown-menu-item"));
64
56
 
65
- var _DropdownItemCheckbox = _interopRequireDefault(require("./components/item/DropdownItemCheckbox"));
57
+ var _dropdownItemCheckbox = _interopRequireDefault(require("./checkbox/dropdown-item-checkbox"));
66
58
 
67
- var _DropdownItemGroup = _interopRequireDefault(require("./components/group/DropdownItemGroup"));
59
+ var _dropdownItemCheckboxGroup = _interopRequireDefault(require("./checkbox/dropdown-item-checkbox-group"));
68
60
 
69
- var _DropdownItemGroupRadio = _interopRequireDefault(require("./components/group/DropdownItemGroupRadio"));
61
+ var _dropdownItemRadio = _interopRequireDefault(require("./radio/dropdown-item-radio"));
70
62
 
71
- var _DropdownItemGroupCheckbox = _interopRequireDefault(require("./components/group/DropdownItemGroupCheckbox"));
63
+ var _dropdownItemRadioGroup = _interopRequireDefault(require("./radio/dropdown-item-radio-group"));
@@ -7,22 +7,53 @@ var _typeof = require("@babel/runtime/helpers/typeof");
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
- exports.default = void 0;
10
+ exports.default = exports.FocusManagerContext = void 0;
11
11
 
12
- var _radio = _interopRequireDefault(require("@atlaskit/icon/glyph/radio"));
12
+ var _react = _interopRequireWildcard(require("react"));
13
13
 
14
- var _item = _interopRequireWildcard(require("@atlaskit/item"));
14
+ var _useKeydownEvent = _interopRequireDefault(require("@atlaskit/ds-lib/use-keydown-event"));
15
15
 
16
- var _supportsVoiceover = _interopRequireDefault(require("../../util/supportsVoiceover"));
17
-
18
- var _withToggleInteraction = _interopRequireDefault(require("../hoc/withToggleInteraction"));
16
+ var _handleFocus = _interopRequireDefault(require("../utils/handle-focus"));
19
17
 
20
18
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
21
19
 
22
20
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
23
21
 
24
- var _default = (0, _withToggleInteraction.default)((0, _item.withItemFocus)(_item.default), _radio.default, function () {
25
- return (0, _supportsVoiceover.default)() ? 'radio' : 'menuitemradio';
22
+ /**
23
+ *
24
+ *
25
+ * Context provider which maintains the list of focusable elements and a method to
26
+ * register new menu items.
27
+ * This list drives the keyboard navgation of the menu.
28
+ *
29
+ */
30
+ var FocusManagerContext = /*#__PURE__*/(0, _react.createContext)({
31
+ menuItemRefs: [],
32
+ registerRef: function registerRef(ref) {}
26
33
  });
27
-
34
+ /**
35
+ * Focus manager logic
36
+ */
37
+
38
+ exports.FocusManagerContext = FocusManagerContext;
39
+
40
+ var FocusManager = function FocusManager(_ref) {
41
+ var children = _ref.children;
42
+ var menuItemRefs = (0, _react.useRef)([]);
43
+ var registerRef = (0, _react.useCallback)(function (ref) {
44
+ if (ref && !menuItemRefs.current.includes(ref)) {
45
+ menuItemRefs.current.push(ref);
46
+ }
47
+ }, []);
48
+ (0, _useKeydownEvent.default)((0, _handleFocus.default)(menuItemRefs.current));
49
+ var contextValue = {
50
+ menuItemRefs: menuItemRefs.current,
51
+ registerRef: registerRef
52
+ };
53
+ return /*#__PURE__*/_react.default.createElement(FocusManagerContext.Provider, {
54
+ value: contextValue
55
+ }, children);
56
+ };
57
+
58
+ var _default = FocusManager;
28
59
  exports.default = _default;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = void 0;
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
17
+
18
+ var _menuGroup = _interopRequireDefault(require("@atlaskit/menu/menu-group"));
19
+
20
+ var _focusManager = require("../components/focus-manager");
21
+
22
+ var _isCheckboxItem = _interopRequireDefault(require("../utils/is-checkbox-item"));
23
+
24
+ var _isRadioItem = _interopRequireDefault(require("../utils/is-radio-item"));
25
+
26
+ var _excluded = ["onClose", "setInitialFocusRef"];
27
+
28
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
+
30
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
+
32
+ /**
33
+ *
34
+ * MenuWrapper wraps all the menu items.
35
+ * It handles the logic to close the menu when a MenuItem is clicked, but leaves it open
36
+ * if a CheckboxItem or RadioItem is clicked.
37
+ * It also sets focus to the first menu item when opened.
38
+ */
39
+ var MenuWrapper = function MenuWrapper(_ref) {
40
+ var onClose = _ref.onClose,
41
+ setInitialFocusRef = _ref.setInitialFocusRef,
42
+ props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
43
+
44
+ var _useContext = (0, _react.useContext)(_focusManager.FocusManagerContext),
45
+ menuItemRefs = _useContext.menuItemRefs;
46
+
47
+ var closeOnMenuItemClick = function closeOnMenuItemClick(e) {
48
+ var isTargetMenuItemOrDecendant = menuItemRefs.some(function (menuItem) {
49
+ var isCheckboxOrRadio = (0, _isCheckboxItem.default)(menuItem) || (0, _isRadioItem.default)(menuItem);
50
+ return menuItem.contains(e.target) && !isCheckboxOrRadio;
51
+ }); // Close menu if the click is triggered from a MenuItem or
52
+ // its decendant. Don't close the menu if the click is triggered
53
+ // from a MenuItemRadio or MenuItemCheckbox so that the user can
54
+ // select multiple items.
55
+
56
+ if (isTargetMenuItemOrDecendant && onClose) {
57
+ onClose();
58
+ }
59
+ };
60
+
61
+ setInitialFocusRef && setInitialFocusRef(menuItemRefs[0]);
62
+ return /*#__PURE__*/_react.default.createElement(_menuGroup.default, (0, _extends2.default)({
63
+ onClick: closeOnMenuItemClick
64
+ }, props));
65
+ };
66
+
67
+ var _default = MenuWrapper;
68
+ exports.default = _default;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CheckboxGroupContext = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ /**
11
+ * Holds the unique identifier for the checkbox group.
12
+ */
13
+ var CheckboxGroupContext = /*#__PURE__*/(0, _react.createContext)('');
14
+ exports.CheckboxGroupContext = CheckboxGroupContext;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = exports.SelectionStoreContext = void 0;
11
+
12
+ var _react = _interopRequireWildcard(require("react"));
13
+
14
+ var _noop = _interopRequireDefault(require("@atlaskit/ds-lib/noop"));
15
+
16
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
+
18
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
19
+
20
+ /**
21
+ *
22
+ * SelectionStoreContext maintains the state of the selected items
23
+ * and getter setters.
24
+ *
25
+ */
26
+ var SelectionStoreContext = /*#__PURE__*/(0, _react.createContext)({
27
+ setItemState: _noop.default,
28
+ getItemState: function getItemState() {
29
+ return undefined;
30
+ },
31
+ setGroupState: _noop.default,
32
+ getGroupState: function getGroupState() {
33
+ return {};
34
+ }
35
+ });
36
+ exports.SelectionStoreContext = SelectionStoreContext;
37
+
38
+ /**
39
+ * Selection store will persist data as long as it remains mounted.
40
+ * It handles the uncontrolled story for dropdown menu when the menu
41
+ * items can be mounted/unmounted depending if the menu is open or closed.
42
+ */
43
+ var SelectionStore = function SelectionStore(props) {
44
+ var children = props.children;
45
+ var store = (0, _react.useRef)({});
46
+ var context = (0, _react.useMemo)(function () {
47
+ return {
48
+ setItemState: function setItemState(group, id, value) {
49
+ if (!store.current[group]) {
50
+ store.current[group] = {};
51
+ }
52
+
53
+ store.current[group][id] = value;
54
+ },
55
+ getItemState: function getItemState(group, id) {
56
+ if (!store.current[group]) {
57
+ return undefined;
58
+ }
59
+
60
+ return store.current[group][id];
61
+ },
62
+ setGroupState: function setGroupState(group, value) {
63
+ store.current[group] = value;
64
+ },
65
+ getGroupState: function getGroupState(group) {
66
+ return store.current[group] || {};
67
+ }
68
+ };
69
+ }, []);
70
+ return /*#__PURE__*/_react.default.createElement(SelectionStoreContext.Provider, {
71
+ value: context
72
+ }, children);
73
+ };
74
+
75
+ var _default = SelectionStore;
76
+ exports.default = _default;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var _react = require("react");
13
+
14
+ var _checkboxGroupContext = require("../context/checkbox-group-context");
15
+
16
+ var _selectionStore = require("../context/selection-store");
17
+
18
+ /**
19
+ * Custom hook to handle checkbox state for dropdown menu.
20
+ * It works in tandem with the selection store context when the
21
+ * component is uncontrolled.
22
+ */
23
+ var useCheckboxState = function useCheckboxState(_ref) {
24
+ var isSelected = _ref.isSelected,
25
+ id = _ref.id,
26
+ defaultSelected = _ref.defaultSelected;
27
+
28
+ var _useContext = (0, _react.useContext)(_selectionStore.SelectionStoreContext),
29
+ setItemState = _useContext.setItemState,
30
+ getItemState = _useContext.getItemState;
31
+
32
+ var groupId = (0, _react.useContext)(_checkboxGroupContext.CheckboxGroupContext);
33
+ var persistedIsSelected = getItemState(groupId, id);
34
+
35
+ var _useState = (0, _react.useState)( // Initial state is set depending on value being defined or not.
36
+ // This state is only utilised if the checkbox is uncontrolled.
37
+ function () {
38
+ return persistedIsSelected !== undefined ? persistedIsSelected : defaultSelected || false;
39
+ }),
40
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
41
+ localIsSelected = _useState2[0],
42
+ setLocalIsSelected = _useState2[1];
43
+
44
+ var setLocalState = (0, _react.useCallback)(function (newValue) {
45
+ var nextValue = newValue(persistedIsSelected);
46
+ setLocalIsSelected(nextValue);
47
+ setItemState(groupId, id, nextValue);
48
+ }, [setItemState, persistedIsSelected, groupId, id]); // Checkbox is controlled - do nothing!
49
+
50
+ if (typeof isSelected === 'boolean') {
51
+ return [isSelected, function () {
52
+ return false;
53
+ }];
54
+ } // Checkbox is going through its first render pass!
55
+
56
+
57
+ if (persistedIsSelected === undefined) {
58
+ // Set the item so we have this state to access next time the checkbox renders (either by mounting or re-rendering!)
59
+ setItemState(groupId, id, defaultSelected || false);
60
+ } // Return the value and setter!
61
+ // Remember this flow is only returned if the checkbox is uncontrolled.
62
+
63
+
64
+ return [localIsSelected, setLocalState];
65
+ };
66
+
67
+ var _default = useCheckboxState;
68
+ exports.default = _default;