@jbrowse/core 1.7.11 → 2.1.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/BaseFeatureWidget/BaseFeatureDetail.d.ts +20 -4
  2. package/BaseFeatureWidget/BaseFeatureDetail.js +313 -558
  3. package/BaseFeatureWidget/SequenceFeatureDetails.js +213 -473
  4. package/BaseFeatureWidget/index.d.ts +2 -2
  5. package/BaseFeatureWidget/index.js +88 -124
  6. package/BaseFeatureWidget/types.d.ts +1 -0
  7. package/BaseFeatureWidget/types.js +1 -4
  8. package/BaseFeatureWidget/util.js +40 -75
  9. package/CorePlugin.js +55 -94
  10. package/Plugin.js +9 -34
  11. package/PluginLoader.js +153 -422
  12. package/PluginManager.d.ts +84 -117
  13. package/PluginManager.js +377 -666
  14. package/ReExports/Attributes.d.ts +2 -0
  15. package/ReExports/Attributes.js +5 -0
  16. package/ReExports/BaseCard.d.ts +2 -0
  17. package/ReExports/BaseCard.js +5 -0
  18. package/ReExports/DataGrid.d.ts +2 -0
  19. package/ReExports/DataGrid.js +6 -0
  20. package/ReExports/FeatureDetails.d.ts +2 -0
  21. package/ReExports/FeatureDetails.js +5 -0
  22. package/ReExports/index.js +6 -12
  23. package/ReExports/list.d.ts +5 -0
  24. package/ReExports/list.js +271 -7
  25. package/ReExports/material-ui-colors.d.ts +1 -19
  26. package/ReExports/material-ui-colors.js +16 -158
  27. package/ReExports/modules.d.ts +68 -109
  28. package/ReExports/modules.js +455 -244
  29. package/TextSearch/BaseResults.js +51 -123
  30. package/TextSearch/TextSearchManager.d.ts +3 -1
  31. package/TextSearch/TextSearchManager.js +66 -144
  32. package/assemblyManager/assembly.js +280 -554
  33. package/assemblyManager/assemblyConfigSchema.js +47 -64
  34. package/assemblyManager/assemblyManager.d.ts +12 -10
  35. package/assemblyManager/assemblyManager.js +126 -270
  36. package/assemblyManager/index.js +9 -22
  37. package/configuration/configurationSchema.js +167 -203
  38. package/configuration/configurationSlot.js +248 -326
  39. package/configuration/index.js +19 -35
  40. package/configuration/util.d.ts +1 -1
  41. package/configuration/util.js +131 -173
  42. package/data_adapters/BaseAdapter.d.ts +2 -2
  43. package/data_adapters/BaseAdapter.js +132 -521
  44. package/data_adapters/CytobandAdapter.js +40 -126
  45. package/data_adapters/dataAdapterCache.js +77 -158
  46. package/package.json +16 -18
  47. package/pluggableElementTypes/AdapterType.js +24 -79
  48. package/pluggableElementTypes/AddTrackWorkflowType.d.ts +17 -0
  49. package/pluggableElementTypes/AddTrackWorkflowType.js +20 -0
  50. package/pluggableElementTypes/ConnectionType.js +22 -65
  51. package/pluggableElementTypes/DisplayType.js +35 -82
  52. package/pluggableElementTypes/InternetAccountType.js +23 -64
  53. package/pluggableElementTypes/PluggableElementBase.js +8 -20
  54. package/pluggableElementTypes/RpcMethodType.js +85 -427
  55. package/pluggableElementTypes/TextSearchAdapterType.js +16 -55
  56. package/pluggableElementTypes/TrackType.js +26 -70
  57. package/pluggableElementTypes/ViewType.js +21 -63
  58. package/pluggableElementTypes/WidgetType.js +21 -64
  59. package/pluggableElementTypes/index.d.ts +4 -3
  60. package/pluggableElementTypes/index.js +42 -125
  61. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +28 -43
  62. package/pluggableElementTypes/models/BaseDisplayModel.d.ts +10 -10
  63. package/pluggableElementTypes/models/BaseDisplayModel.js +58 -95
  64. package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -1
  65. package/pluggableElementTypes/models/BaseTrackModel.js +139 -200
  66. package/pluggableElementTypes/models/BaseViewModel.js +24 -40
  67. package/pluggableElementTypes/models/InternetAccountModel.js +116 -263
  68. package/pluggableElementTypes/models/baseConnectionConfig.js +14 -25
  69. package/pluggableElementTypes/models/baseInternetAccountConfig.js +29 -38
  70. package/pluggableElementTypes/models/baseTrackConfig.js +106 -133
  71. package/pluggableElementTypes/models/index.js +21 -70
  72. package/pluggableElementTypes/renderers/BoxRendererType.js +132 -291
  73. package/pluggableElementTypes/renderers/CircularChordRendererType.js +8 -38
  74. package/pluggableElementTypes/renderers/ComparativeServerSideRendererType.js +60 -192
  75. package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +0 -2
  76. package/pluggableElementTypes/renderers/FeatureRendererType.js +89 -255
  77. package/pluggableElementTypes/renderers/RendererType.js +31 -105
  78. package/pluggableElementTypes/renderers/ServerSideRenderedContent.js +61 -72
  79. package/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +2 -2
  80. package/pluggableElementTypes/renderers/ServerSideRendererType.js +112 -265
  81. package/pluggableElementTypes/renderers/index.js +19 -62
  82. package/pluggableElementTypes/renderers/util/serializableFilterChain.js +27 -65
  83. package/rpc/BaseRpcDriver.js +169 -405
  84. package/rpc/MainThreadRpcDriver.js +27 -150
  85. package/rpc/RpcManager.js +58 -159
  86. package/rpc/WebWorkerRpcDriver.js +54 -171
  87. package/rpc/configSchema.js +25 -49
  88. package/rpc/coreRpcMethods.d.ts +1 -3
  89. package/rpc/coreRpcMethods.js +221 -959
  90. package/rpc/remoteAbortSignals.js +46 -70
  91. package/tsconfig.build.tsbuildinfo +1 -1
  92. package/ui/AboutDialog.js +107 -158
  93. package/ui/App.js +157 -261
  94. package/ui/AssemblySelector.d.ts +1 -1
  95. package/ui/AssemblySelector.js +59 -115
  96. package/ui/CascadingMenu.js +100 -199
  97. package/ui/ColorPicker.d.ts +16 -0
  98. package/ui/ColorPicker.js +97 -0
  99. package/ui/Drawer.js +28 -58
  100. package/ui/DrawerWidget.js +109 -209
  101. package/ui/DropDownMenu.d.ts +0 -8
  102. package/ui/DropDownMenu.js +60 -97
  103. package/ui/EditableTypography.d.ts +1 -1
  104. package/ui/EditableTypography.js +87 -155
  105. package/ui/ErrorMessage.js +41 -66
  106. package/ui/FactoryResetDialog.js +24 -57
  107. package/ui/FatalErrorDialog.js +59 -91
  108. package/ui/FileSelector/FileSelector.js +123 -189
  109. package/ui/FileSelector/LocalFileChooser.js +44 -71
  110. package/ui/FileSelector/UrlChooser.js +17 -38
  111. package/ui/FileSelector/index.js +6 -12
  112. package/ui/Icons.d.ts +1 -1
  113. package/ui/Icons.js +45 -69
  114. package/ui/Logo.js +57 -110
  115. package/ui/Menu.d.ts +1 -1
  116. package/ui/Menu.js +232 -355
  117. package/ui/PrerenderedCanvas.js +63 -78
  118. package/ui/ResizeHandle.js +87 -114
  119. package/ui/ReturnToImportFormDialog.js +32 -59
  120. package/ui/SanitizedHTML.js +63 -52
  121. package/ui/Snackbar.js +74 -99
  122. package/ui/SnackbarModel.js +37 -51
  123. package/ui/Tooltip.d.ts +3 -1
  124. package/ui/Tooltip.js +49 -74
  125. package/ui/ViewContainer.js +113 -183
  126. package/ui/colors.d.ts +10 -0
  127. package/ui/colors.js +78 -0
  128. package/ui/index.js +51 -181
  129. package/ui/react-colorful.d.ts +17 -0
  130. package/ui/react-colorful.js +455 -0
  131. package/ui/theme.d.ts +279 -131
  132. package/ui/theme.js +197 -225
  133. package/util/Base1DUtils.d.ts +32 -0
  134. package/util/Base1DUtils.js +174 -0
  135. package/util/Base1DViewModel.d.ts +16 -37
  136. package/util/Base1DViewModel.js +116 -295
  137. package/util/QuickLRU.js +84 -332
  138. package/util/TimeTraveller.d.ts +19 -0
  139. package/util/TimeTraveller.js +86 -0
  140. package/util/aborting.js +49 -127
  141. package/util/analytics.js +91 -154
  142. package/util/blockTypes.js +106 -240
  143. package/util/calculateDynamicBlocks.js +98 -128
  144. package/util/calculateStaticBlocks.js +105 -125
  145. package/util/color/cssColorsLevel4.js +156 -160
  146. package/util/color/index.js +33 -55
  147. package/util/compositeMap.js +49 -333
  148. package/util/formatFastaStrings.js +9 -14
  149. package/util/idMaker.js +18 -31
  150. package/util/index.d.ts +18 -39
  151. package/util/index.js +743 -1236
  152. package/util/io/RemoteFileWithRangeCache.js +88 -257
  153. package/util/io/index.js +95 -169
  154. package/util/jexl.js +60 -115
  155. package/util/jexlStrings.js +24 -29
  156. package/util/layouts/BaseLayout.js +1 -4
  157. package/util/layouts/GranularRectLayout.js +388 -557
  158. package/util/layouts/MultiLayout.js +41 -109
  159. package/util/layouts/PrecomputedLayout.js +56 -114
  160. package/util/layouts/PrecomputedMultiLayout.js +22 -59
  161. package/util/layouts/SceneGraph.js +127 -197
  162. package/util/layouts/index.js +29 -66
  163. package/util/mst-reflection.js +55 -71
  164. package/util/offscreenCanvasPonyfill.js +66 -134
  165. package/util/offscreenCanvasUtils.d.ts +2 -7
  166. package/util/offscreenCanvasUtils.js +49 -146
  167. package/util/range.js +29 -40
  168. package/util/rxjs.js +20 -27
  169. package/util/simpleFeature.js +88 -152
  170. package/util/stats.js +91 -151
  171. package/util/tracks.js +130 -171
  172. package/util/types/index.d.ts +3 -3
  173. package/util/types/index.js +110 -179
  174. package/util/types/mst.d.ts +3 -3
  175. package/util/types/mst.js +91 -142
  176. package/util/types/util.js +1 -4
  177. package/util/when.js +54 -101
  178. package/BaseFeatureWidget/SequenceFeatureDetails.test.js +0 -122
  179. package/BaseFeatureWidget/index.test.js +0 -51
  180. package/TextSearch/BaseResults.test.js +0 -42
  181. package/configuration/configurationSchema.test.js +0 -266
  182. package/configuration/configurationSlot.test.js +0 -69
  183. package/configuration/util.test.js +0 -39
  184. package/data_adapters/BaseAdapter.test.js +0 -200
  185. package/declare.d.js +0 -1
  186. package/pluggableElementTypes/RpcMethodType.test.js +0 -118
  187. package/pluggableElementTypes/renderers/declare.d.js +0 -1
  188. package/pluggableElementTypes/renderers/util/serializableFilterChain.test.js +0 -20
  189. package/rpc/BaseRpcDriver.test.js +0 -540
  190. package/rpc/declaration.d.js +0 -1
  191. package/ui/FatalErrorDialog.test.js +0 -82
  192. package/ui/SanitizedHTML.test.js +0 -36
  193. package/ui/theme.test.js +0 -111
  194. package/util/Base1DViewModel.test.js +0 -130
  195. package/util/calculateDynamicBlocks.test.js +0 -74
  196. package/util/calculateStaticBlocks.test.js +0 -297
  197. package/util/declare.d.js +0 -1
  198. package/util/formatFastaStrings.test.js +0 -40
  199. package/util/index.test.js +0 -213
  200. package/util/jexlStrings.test.js +0 -48
  201. package/util/layouts/GranularRectLayout.test.js +0 -99
  202. package/util/range.test.js +0 -64
  203. package/util/simpleFeature.test.js +0 -34
  204. package/util/stats.test.js +0 -172
package/ui/Menu.js CHANGED
@@ -1,374 +1,251 @@
1
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
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
9
17
  });
10
- exports.MenuItemEndDecoration = MenuItemEndDecoration;
11
- exports.default = void 0;
12
-
13
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
14
-
15
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
16
-
17
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
18
-
19
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
20
-
21
- var _react = _interopRequireWildcard(require("react"));
22
-
23
- var _core = require("@material-ui/core");
24
-
25
- var _ArrowRight = _interopRequireDefault(require("@material-ui/icons/ArrowRight"));
26
-
27
- var _CheckBox = _interopRequireDefault(require("@material-ui/icons/CheckBox"));
28
-
29
- var _CheckBoxOutlineBlank = _interopRequireDefault(require("@material-ui/icons/CheckBoxOutlineBlank"));
30
-
31
- var _RadioButtonChecked = _interopRequireDefault(require("@material-ui/icons/RadioButtonChecked"));
32
-
33
- var _RadioButtonUnchecked = _interopRequireDefault(require("@material-ui/icons/RadioButtonUnchecked"));
34
-
35
- var _util = require("../util");
36
-
37
- var _excluded = ["open", "onClose", "menuItems", "onMenuItemClick"];
38
-
39
- 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); }
40
-
41
- 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; }
42
-
43
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
44
-
45
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
46
-
47
- var useStyles = (0, _core.makeStyles)({
48
- paper: {
49
- position: 'fixed',
50
- overflowY: 'auto',
51
- overflowX: 'hidden',
52
- // So we see the popover when it's empty.
53
- minWidth: 16,
54
- minHeight: 16,
55
- maxWidth: 'calc(100% - 32px)',
56
- maxHeight: 'calc(100% - 32px)',
57
- top: 0,
58
- left: 0,
59
- // We disable the focus ring for mouse, touch and keyboard users.
60
- outline: 0
61
- },
62
- menuItemEndDecoration: {
63
- padding: 0,
64
- margin: 0,
65
- height: 16
66
- }
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.MenuItemEndDecoration = void 0;
30
+ const react_1 = __importStar(require("react"));
31
+ const material_1 = require("@mui/material");
32
+ const mui_1 = require("tss-react/mui");
33
+ // icons
34
+ const ArrowRight_1 = __importDefault(require("@mui/icons-material/ArrowRight"));
35
+ const CheckBox_1 = __importDefault(require("@mui/icons-material/CheckBox"));
36
+ const CheckBoxOutlineBlank_1 = __importDefault(require("@mui/icons-material/CheckBoxOutlineBlank"));
37
+ const RadioButtonChecked_1 = __importDefault(require("@mui/icons-material/RadioButtonChecked"));
38
+ const RadioButtonUnchecked_1 = __importDefault(require("@mui/icons-material/RadioButtonUnchecked"));
39
+ // other
40
+ const util_1 = require("../util");
41
+ const useStyles = (0, mui_1.makeStyles)()({
42
+ paper: {
43
+ position: 'fixed',
44
+ overflowY: 'auto',
45
+ overflowX: 'hidden',
46
+ // So we see the popover when it's empty.
47
+ minWidth: 16,
48
+ minHeight: 16,
49
+ maxWidth: 'calc(100% - 32px)',
50
+ maxHeight: 'calc(100% - 32px)',
51
+ top: 0,
52
+ left: 0,
53
+ // We disable the focus ring for mouse, touch and keyboard users.
54
+ outline: 0,
55
+ },
56
+ menuItemEndDecoration: {
57
+ padding: 0,
58
+ margin: 0,
59
+ height: 16,
60
+ },
67
61
  });
68
-
69
62
  function MenuItemEndDecoration(props) {
70
- var classes = useStyles();
71
- var type = props.type;
72
- var checked;
73
- var disabled;
74
-
75
- if ('checked' in props) {
76
- ;
77
- checked = props.checked;
78
- disabled = props.disabled;
79
- }
80
-
81
- var icon;
82
-
83
- if (type === 'subMenu') {
84
- icon = /*#__PURE__*/_react.default.createElement(_ArrowRight.default, {
85
- color: "action"
86
- });
87
- } else if (type === 'checkbox') {
88
- if (checked) {
89
- var color = disabled ? 'inherit' : 'secondary';
90
- icon = /*#__PURE__*/_react.default.createElement(_CheckBox.default, {
91
- color: color
92
- });
93
- } else {
94
- icon = /*#__PURE__*/_react.default.createElement(_CheckBoxOutlineBlank.default, {
95
- color: "action"
96
- });
63
+ const { classes } = useStyles();
64
+ const { type } = props;
65
+ let checked;
66
+ let disabled;
67
+ if ('checked' in props) {
68
+ ;
69
+ ({ checked, disabled } = props);
97
70
  }
98
- } else if (type === 'radio') {
99
- if (checked) {
100
- var _color = disabled ? 'inherit' : 'secondary';
101
-
102
- icon = /*#__PURE__*/_react.default.createElement(_RadioButtonChecked.default, {
103
- color: _color
104
- });
105
- } else {
106
- icon = /*#__PURE__*/_react.default.createElement(_RadioButtonUnchecked.default, {
107
- color: "action"
108
- });
71
+ let icon;
72
+ if (type === 'subMenu') {
73
+ icon = react_1.default.createElement(ArrowRight_1.default, { color: "action" });
109
74
  }
110
- }
111
-
112
- return /*#__PURE__*/_react.default.createElement("div", {
113
- className: classes.menuItemEndDecoration
114
- }, icon);
75
+ else if (type === 'checkbox') {
76
+ if (checked) {
77
+ const color = disabled ? 'inherit' : 'secondary';
78
+ icon = react_1.default.createElement(CheckBox_1.default, { color: color });
79
+ }
80
+ else {
81
+ icon = react_1.default.createElement(CheckBoxOutlineBlank_1.default, { color: "action" });
82
+ }
83
+ }
84
+ else if (type === 'radio') {
85
+ if (checked) {
86
+ const color = disabled ? 'inherit' : 'secondary';
87
+ icon = react_1.default.createElement(RadioButtonChecked_1.default, { color: color });
88
+ }
89
+ else {
90
+ icon = react_1.default.createElement(RadioButtonUnchecked_1.default, { color: "action" });
91
+ }
92
+ }
93
+ return react_1.default.createElement("div", { className: classes.menuItemEndDecoration }, icon);
115
94
  }
116
-
95
+ exports.MenuItemEndDecoration = MenuItemEndDecoration;
117
96
  function findNextValidIdx(menuItems, currentIdx) {
118
- var idx = menuItems.slice(currentIdx + 1).findIndex(function (menuItem) {
119
- return menuItem.type !== 'divider' && menuItem.type !== 'subHeader' && !menuItem.disabled;
120
- });
121
-
122
- if (idx === -1) {
123
- return idx;
124
- }
125
-
126
- return currentIdx + 1 + idx;
97
+ const idx = menuItems
98
+ .slice(currentIdx + 1)
99
+ .findIndex(menuItem => menuItem.type !== 'divider' &&
100
+ menuItem.type !== 'subHeader' &&
101
+ !menuItem.disabled);
102
+ if (idx === -1) {
103
+ return idx;
104
+ }
105
+ return currentIdx + 1 + idx;
127
106
  }
128
-
129
107
  function findPreviousValidIdx(menuItems, currentIdx) {
130
- return (0, _util.findLastIndex)(menuItems.slice(0, currentIdx), function (menuItem) {
131
- return menuItem.type !== 'divider' && menuItem.type !== 'subHeader' && !menuItem.disabled;
132
- });
108
+ return (0, util_1.findLastIndex)(menuItems.slice(0, currentIdx), menuItem => menuItem.type !== 'divider' &&
109
+ menuItem.type !== 'subHeader' &&
110
+ !menuItem.disabled);
133
111
  }
134
-
135
- var MenuPage = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
136
- var _useState = (0, _react.useState)(),
137
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
138
- subMenuAnchorEl = _useState2[0],
139
- setSubMenuAnchorEl = _useState2[1];
140
-
141
- var _useState3 = (0, _react.useState)(),
142
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
143
- openSubMenuIdx = _useState4[0],
144
- setOpenSubMenuIdx = _useState4[1];
145
-
146
- var _useState5 = (0, _react.useState)(false),
147
- _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
148
- isSubMenuOpen = _useState6[0],
149
- setIsSubMenuOpen = _useState6[1];
150
-
151
- var _useState7 = (0, _react.useState)(),
152
- _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
153
- selectedMenuItemIdx = _useState8[0],
154
- setSelectedMenuItemIdx = _useState8[1];
155
-
156
- var _useState9 = (0, _react.useState)(),
157
- _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
158
- position = _useState10[0],
159
- setPosition = _useState10[1];
160
-
161
- var paperRef = (0, _react.useRef)();
162
- var classes = useStyles();
163
- var menuItems = props.menuItems,
164
- onMenuItemClick = props.onMenuItemClick,
165
- open = props.open,
166
- onClose = props.onClose,
167
- anchorEl = props.anchorEl,
168
- _props$top = props.top,
169
- top = _props$top === void 0 ? false : _props$top;
170
- (0, _react.useEffect)(function () {
171
- if (!open) {
172
- setSubMenuAnchorEl(undefined);
173
- setOpenSubMenuIdx(undefined);
174
- }
175
- }, [open]);
176
- (0, _react.useEffect)(function () {
177
- var shouldSubMenuBeOpen = open && Boolean(subMenuAnchorEl);
178
- var timer;
179
-
180
- if (shouldSubMenuBeOpen && !isSubMenuOpen) {
181
- timer = setTimeout(function () {
182
- setIsSubMenuOpen(true);
183
- }, 300);
184
- } else if (!shouldSubMenuBeOpen && isSubMenuOpen) {
185
- timer = setTimeout(function () {
186
- setIsSubMenuOpen(false);
187
- }, 300);
188
- }
189
-
190
- return function () {
191
- clearTimeout(timer);
192
- };
193
- }, [isSubMenuOpen, open, subMenuAnchorEl]);
194
- (0, _react.useEffect)(function () {
195
- if (anchorEl) {
196
- var rect = anchorEl.getBoundingClientRect();
197
-
198
- if (position) {
199
- if (rect.top !== position.top || rect.left + rect.width !== position.left) {
200
- setPosition({
201
- top: rect.top,
202
- left: rect.left + rect.width
203
- });
112
+ const MenuPage = react_1.default.forwardRef((props, ref) => {
113
+ const [subMenuAnchorEl, setSubMenuAnchorEl] = (0, react_1.useState)();
114
+ const [openSubMenuIdx, setOpenSubMenuIdx] = (0, react_1.useState)();
115
+ const [isSubMenuOpen, setIsSubMenuOpen] = (0, react_1.useState)(false);
116
+ const [selectedMenuItemIdx, setSelectedMenuItemIdx] = (0, react_1.useState)();
117
+ const [position, setPosition] = (0, react_1.useState)();
118
+ const paperRef = (0, react_1.useRef)(null);
119
+ const { classes } = useStyles();
120
+ const { menuItems, onMenuItemClick, open, onClose, anchorEl, top = false, } = props;
121
+ (0, react_1.useEffect)(() => {
122
+ if (!open) {
123
+ setSubMenuAnchorEl(undefined);
124
+ setOpenSubMenuIdx(undefined);
204
125
  }
205
- } else {
206
- setPosition({
207
- top: rect.top,
208
- left: rect.left + rect.width
209
- });
210
- }
211
- } else if (!position) {
212
- setPosition({});
213
- }
214
- }, [position, anchorEl]);
215
- var hasIcon = menuItems.some(function (menuItem) {
216
- return 'icon' in menuItem && menuItem.icon;
217
- });
218
- var menuItemStyle = {};
219
-
220
- function handleClick(callback) {
221
- return function (event) {
222
- onMenuItemClick(event, callback);
223
- };
224
- }
225
-
226
- var ListContents = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_core.MenuList, {
227
- autoFocusItem: open && !isSubMenuOpen
228
- }, menuItems.sort(function (a, b) {
229
- return (b.priority || 0) - (a.priority || 0);
230
- }).map(function (menuItem, idx) {
231
- if (menuItem.type === 'divider') {
232
- return /*#__PURE__*/_react.default.createElement(_core.Divider, {
233
- key: "divider-".concat(idx),
234
- component: "li"
235
- });
236
- }
237
-
238
- if (menuItem.type === 'subHeader') {
239
- return /*#__PURE__*/_react.default.createElement(_core.ListSubheader, {
240
- key: "subHeader-".concat(menuItem.label, "-").concat(idx)
241
- }, menuItem.label);
242
- }
243
-
244
- var icon = null;
245
- var endDecoration = null;
246
-
247
- if (menuItem.icon) {
248
- var Icon = menuItem.icon;
249
- icon = /*#__PURE__*/_react.default.createElement(_core.ListItemIcon, null, /*#__PURE__*/_react.default.createElement(Icon, null));
250
- }
251
-
252
- if ('subMenu' in menuItem) {
253
- endDecoration = /*#__PURE__*/_react.default.createElement(MenuItemEndDecoration, {
254
- type: "subMenu"
255
- });
256
- } else if (menuItem.type === 'checkbox' || menuItem.type === 'radio') {
257
- endDecoration = /*#__PURE__*/_react.default.createElement(MenuItemEndDecoration, {
258
- type: menuItem.type,
259
- checked: menuItem.checked,
260
- disabled: menuItem.disabled
261
- });
262
- }
263
-
264
- var onClick = 'onClick' in menuItem ? handleClick(menuItem.onClick) : undefined;
265
- return /*#__PURE__*/_react.default.createElement(_core.MenuItem, {
266
- key: menuItem.label,
267
- style: menuItemStyle,
268
- selected: idx === selectedMenuItemIdx,
269
- onClick: onClick,
270
- onMouseMove: function onMouseMove(e) {
271
- if (e.currentTarget !== document.activeElement) {
272
- e.currentTarget.focus();
273
- setSelectedMenuItemIdx(idx);
126
+ }, [open]);
127
+ (0, react_1.useEffect)(() => {
128
+ const shouldSubMenuBeOpen = open && Boolean(subMenuAnchorEl);
129
+ let timer;
130
+ if (shouldSubMenuBeOpen && !isSubMenuOpen) {
131
+ timer = setTimeout(() => {
132
+ setIsSubMenuOpen(true);
133
+ }, 300);
134
+ }
135
+ else if (!shouldSubMenuBeOpen && isSubMenuOpen) {
136
+ timer = setTimeout(() => {
137
+ setIsSubMenuOpen(false);
138
+ }, 300);
274
139
  }
275
-
276
- if ('subMenu' in menuItem) {
277
- if (openSubMenuIdx !== idx) {
278
- setSubMenuAnchorEl(e.currentTarget);
279
- setOpenSubMenuIdx(idx);
280
- }
281
- } else {
282
- setSubMenuAnchorEl(undefined);
283
- setOpenSubMenuIdx(undefined);
140
+ return () => {
141
+ clearTimeout(timer);
142
+ };
143
+ }, [isSubMenuOpen, open, subMenuAnchorEl]);
144
+ (0, react_1.useEffect)(() => {
145
+ if (anchorEl) {
146
+ const rect = anchorEl.getBoundingClientRect();
147
+ if (position) {
148
+ if (rect.top !== position.top ||
149
+ rect.left + rect.width !== position.left) {
150
+ setPosition({ top: rect.top, left: rect.left + rect.width });
151
+ }
152
+ }
153
+ else {
154
+ setPosition({ top: rect.top, left: rect.left + rect.width });
155
+ }
284
156
  }
285
- },
286
- onKeyDown: function onKeyDown(e) {
287
- if (e.key === 'ArrowLeft' || e.key === 'Escape') {
288
- onClose && onClose(e, 'escapeKeyDown');
289
- } else if (e.key === 'ArrowUp') {
290
- setSelectedMenuItemIdx(findPreviousValidIdx(menuItems, idx));
291
- } else if (e.key === 'ArrowDown') {
292
- var a = findNextValidIdx(menuItems, idx);
293
- setSelectedMenuItemIdx(a);
294
- } else if ('subMenu' in menuItem) {
295
- if (e.key === 'ArrowRight' || e.key === 'Enter') {
296
- setSubMenuAnchorEl(e.currentTarget);
297
- setOpenSubMenuIdx(idx);
298
- setIsSubMenuOpen(true);
299
- }
157
+ else if (!position) {
158
+ setPosition({});
300
159
  }
301
- },
302
- disabled: Boolean(menuItem.disabled)
303
- }, icon, /*#__PURE__*/_react.default.createElement(_core.ListItemText, {
304
- primary: menuItem.label,
305
- secondary: menuItem.subLabel,
306
- inset: hasIcon && !menuItem.icon
307
- }), /*#__PURE__*/_react.default.createElement("div", {
308
- style: {
309
- flexGrow: 1,
310
- minWidth: 10
311
- }
312
- }), endDecoration);
313
- })), menuItems.map(function (menuItem, idx) {
314
- var subMenu = null;
315
-
316
- if ('subMenu' in menuItem) {
317
- subMenu = /*#__PURE__*/_react.default.createElement(MenuPage, {
318
- key: menuItem.label,
319
- anchorEl: subMenuAnchorEl,
320
- open: isSubMenuOpen && openSubMenuIdx === idx,
321
- onClose: function onClose() {
322
- setIsSubMenuOpen(false);
323
- setSubMenuAnchorEl(undefined);
324
- },
325
- onMenuItemClick: onMenuItemClick,
326
- menuItems: menuItem.subMenu
327
- });
160
+ }, [position, anchorEl]);
161
+ const hasIcon = menuItems.some(menuItem => 'icon' in menuItem && menuItem.icon);
162
+ const menuItemStyle = {};
163
+ function handleClick(callback) {
164
+ return (event) => {
165
+ onMenuItemClick(event, callback);
166
+ };
328
167
  }
329
-
330
- return subMenu;
331
- }));
332
-
333
- if (top) {
334
- return ListContents;
335
- }
336
-
337
- return /*#__PURE__*/_react.default.createElement(_core.Grow, {
338
- in: open,
339
- style: {
340
- transformOrigin: "0 0 0"
341
- },
342
- ref: ref
343
- }, /*#__PURE__*/_react.default.createElement(_core.Paper, {
344
- elevation: 8,
345
- ref: paperRef,
346
- className: classes.paper,
347
- style: _objectSpread({}, position)
348
- }, ListContents));
168
+ const ListContents = (react_1.default.createElement(react_1.default.Fragment, null,
169
+ react_1.default.createElement(material_1.MenuList, { autoFocusItem: open && !isSubMenuOpen, dense: true }, menuItems
170
+ .sort((a, b) => (b.priority || 0) - (a.priority || 0))
171
+ .map((menuItem, idx) => {
172
+ if (menuItem.type === 'divider') {
173
+ return react_1.default.createElement(material_1.Divider, { key: `divider-${idx}`, component: "li" });
174
+ }
175
+ if (menuItem.type === 'subHeader') {
176
+ return (react_1.default.createElement(material_1.ListSubheader, { key: `subHeader-${menuItem.label}-${idx}` }, menuItem.label));
177
+ }
178
+ let icon = null;
179
+ let endDecoration = null;
180
+ if (menuItem.icon) {
181
+ const Icon = menuItem.icon;
182
+ icon = (react_1.default.createElement(material_1.ListItemIcon, null,
183
+ react_1.default.createElement(Icon, null)));
184
+ }
185
+ if ('subMenu' in menuItem) {
186
+ endDecoration = react_1.default.createElement(MenuItemEndDecoration, { type: "subMenu" });
187
+ }
188
+ else if (menuItem.type === 'checkbox' ||
189
+ menuItem.type === 'radio') {
190
+ endDecoration = (react_1.default.createElement(MenuItemEndDecoration, { type: menuItem.type, checked: menuItem.checked, disabled: menuItem.disabled }));
191
+ }
192
+ const onClick = 'onClick' in menuItem
193
+ ? handleClick(menuItem.onClick)
194
+ : undefined;
195
+ return (react_1.default.createElement(material_1.MenuItem, { key: menuItem.label, style: menuItemStyle, selected: idx === selectedMenuItemIdx, onClick: onClick, onMouseMove: e => {
196
+ if (e.currentTarget !== document.activeElement) {
197
+ e.currentTarget.focus();
198
+ setSelectedMenuItemIdx(idx);
199
+ }
200
+ if ('subMenu' in menuItem) {
201
+ if (openSubMenuIdx !== idx) {
202
+ setSubMenuAnchorEl(e.currentTarget);
203
+ setOpenSubMenuIdx(idx);
204
+ }
205
+ }
206
+ else {
207
+ setSubMenuAnchorEl(undefined);
208
+ setOpenSubMenuIdx(undefined);
209
+ }
210
+ }, onKeyDown: e => {
211
+ if (e.key === 'ArrowLeft' || e.key === 'Escape') {
212
+ onClose && onClose(e, 'escapeKeyDown');
213
+ }
214
+ else if (e.key === 'ArrowUp') {
215
+ setSelectedMenuItemIdx(findPreviousValidIdx(menuItems, idx));
216
+ }
217
+ else if (e.key === 'ArrowDown') {
218
+ const a = findNextValidIdx(menuItems, idx);
219
+ setSelectedMenuItemIdx(a);
220
+ }
221
+ else if ('subMenu' in menuItem) {
222
+ if (e.key === 'ArrowRight' || e.key === 'Enter') {
223
+ setSubMenuAnchorEl(e.currentTarget);
224
+ setOpenSubMenuIdx(idx);
225
+ setIsSubMenuOpen(true);
226
+ }
227
+ }
228
+ }, disabled: Boolean(menuItem.disabled) },
229
+ icon,
230
+ react_1.default.createElement(material_1.ListItemText, { primary: menuItem.label, secondary: menuItem.subLabel, inset: hasIcon && !menuItem.icon }),
231
+ endDecoration));
232
+ })),
233
+ menuItems.map((menuItem, idx) => {
234
+ let subMenu = null;
235
+ if ('subMenu' in menuItem) {
236
+ subMenu = (react_1.default.createElement(MenuPage, { key: menuItem.label, anchorEl: subMenuAnchorEl, open: isSubMenuOpen && openSubMenuIdx === idx, onClose: () => {
237
+ setIsSubMenuOpen(false);
238
+ setSubMenuAnchorEl(undefined);
239
+ }, onMenuItemClick: onMenuItemClick, menuItems: menuItem.subMenu }));
240
+ }
241
+ return subMenu;
242
+ })));
243
+ return top ? (ListContents) : (react_1.default.createElement(material_1.Grow, { in: open, style: { transformOrigin: `0 0 0` }, ref: ref },
244
+ react_1.default.createElement(material_1.Paper, { elevation: 8, ref: paperRef, className: classes.paper, style: { ...position } }, ListContents)));
349
245
  });
350
-
351
246
  function Menu(props) {
352
- var open = props.open,
353
- onClose = props.onClose,
354
- menuItems = props.menuItems,
355
- onMenuItemClick = props.onMenuItemClick,
356
- other = (0, _objectWithoutProperties2.default)(props, _excluded);
357
- return /*#__PURE__*/_react.default.createElement(_core.Popover, (0, _extends2.default)({
358
- transitionDuration: 0,
359
- open: open,
360
- onClose: onClose,
361
- BackdropProps: {
362
- invisible: true
363
- }
364
- }, other), /*#__PURE__*/_react.default.createElement(MenuPage, {
365
- open: open,
366
- onClose: onClose,
367
- menuItems: menuItems,
368
- onMenuItemClick: onMenuItemClick,
369
- top: true
370
- }));
247
+ const { open, onClose, menuItems, onMenuItemClick, ...other } = props;
248
+ return (react_1.default.createElement(material_1.Popover, { transitionDuration: 0, open: open, onClose: onClose, BackdropProps: { invisible: true }, ...other },
249
+ react_1.default.createElement(MenuPage, { open: open, onClose: onClose, menuItems: menuItems, onMenuItemClick: onMenuItemClick, top: true })));
371
250
  }
372
-
373
- var _default = Menu;
374
- exports.default = _default;
251
+ exports.default = Menu;