@jbrowse/app-core 2.9.0 → 2.10.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.
@@ -9,5 +9,8 @@ export declare function AppFocusMixin(): import("mobx-state-tree").IModelType<{
9
9
  */
10
10
  focusedViewId: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
11
11
  }, {
12
+ /**
13
+ * #action
14
+ */
12
15
  setFocusedViewId(viewId: string): void;
13
16
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
@@ -16,6 +16,9 @@ function AppFocusMixin() {
16
16
  focusedViewId: mobx_state_tree_1.types.maybe(mobx_state_tree_1.types.string),
17
17
  })
18
18
  .actions(self => ({
19
+ /**
20
+ * #action
21
+ */
19
22
  setFocusedViewId(viewId) {
20
23
  self.focusedViewId = viewId;
21
24
  },
@@ -4,7 +4,22 @@ import PluginManager from '@jbrowse/core/PluginManager';
4
4
  /**
5
5
  * #config JBrowseRootConfig
6
6
  * #category root
7
- * configuration in a config.json/file.jbrowse
7
+ *
8
+ * this is a config model representing a config.json (for jbrowse-web) or
9
+ * somefile.jbrowse (for jbrowse-desktop, where configs have the .jbrowse
10
+ * extension)
11
+ *
12
+ * includes
13
+ * - [FormatDetails](../formatdetails) for global (instead of per-track)
14
+ * feature detail formatters
15
+ * - [FormatAbout](../formatabout) for global (instead of per-track) about
16
+ * track formatters
17
+ * - [HierarchicalConfigSchema](../hierarchicalconfigschema) for track selector
18
+ * configs
19
+ *
20
+ * also includes any pluginManager.pluginConfigurationSchemas(), so plugins
21
+ * that have a configurationSchema field on their class are mixed into this
22
+ * object
8
23
  */
9
24
  export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }: {
10
25
  pluginManager: PluginManager;
@@ -90,9 +105,7 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
90
105
  defaultCollapsed: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
91
106
  categoryNames: {
92
107
  type: string;
93
- defaultValue: never[]; /**
94
- * #slot configuration.highResolutionScaling
95
- */
108
+ defaultValue: never[];
96
109
  };
97
110
  topLevelCategories: {
98
111
  type: string;
@@ -161,10 +174,13 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
161
174
  internetAccounts: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyModelType>;
162
175
  /**
163
176
  * #slot
177
+ * configuration for aggregate text search adapters (created by e.g.
178
+ * jbrowse text-index, but can be a pluggable TextSearchAdapter type)
164
179
  */
165
180
  aggregateTextSearchAdapters: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyModelType>;
166
181
  /**
167
182
  * #slot
183
+ * configuration for connections
168
184
  */
169
185
  connections: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyModelType>;
170
186
  /**
@@ -11,7 +11,22 @@ const mobx_state_tree_1 = require("mobx-state-tree");
11
11
  /**
12
12
  * #config JBrowseRootConfig
13
13
  * #category root
14
- * configuration in a config.json/file.jbrowse
14
+ *
15
+ * this is a config model representing a config.json (for jbrowse-web) or
16
+ * somefile.jbrowse (for jbrowse-desktop, where configs have the .jbrowse
17
+ * extension)
18
+ *
19
+ * includes
20
+ * - [FormatDetails](../formatdetails) for global (instead of per-track)
21
+ * feature detail formatters
22
+ * - [FormatAbout](../formatabout) for global (instead of per-track) about
23
+ * track formatters
24
+ * - [HierarchicalConfigSchema](../hierarchicalconfigschema) for track selector
25
+ * configs
26
+ *
27
+ * also includes any pluginManager.pluginConfigurationSchemas(), so plugins
28
+ * that have a configurationSchema field on their class are mixed into this
29
+ * object
15
30
  */
16
31
  function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }) {
17
32
  return mobx_state_tree_1.types.model('JBrowseConfig', {
@@ -99,10 +114,13 @@ function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }) {
99
114
  internetAccounts: mobx_state_tree_1.types.array(pluginManager.pluggableConfigSchemaType('internet account')),
100
115
  /**
101
116
  * #slot
117
+ * configuration for aggregate text search adapters (created by e.g.
118
+ * jbrowse text-index, but can be a pluggable TextSearchAdapter type)
102
119
  */
103
120
  aggregateTextSearchAdapters: mobx_state_tree_1.types.array(pluginManager.pluggableConfigSchemaType('text search adapter')),
104
121
  /**
105
122
  * #slot
123
+ * configuration for connections
106
124
  */
107
125
  connections: mobx_state_tree_1.types.array(pluginManager.pluggableConfigSchemaType('connection')),
108
126
  /**
@@ -3,6 +3,17 @@ import { BaseAssemblyConfigSchema } from '@jbrowse/core/assemblyManager';
3
3
  import RpcManager from '@jbrowse/core/rpc/RpcManager';
4
4
  import { AnyConfigurationModel } from '@jbrowse/core/configuration';
5
5
  import { PluginDefinition } from '@jbrowse/core/PluginLoader';
6
+ /**
7
+ * #stateModel AppCoreJBrowseModel
8
+ * note that JBrowseRootConfig is a config model, but config models are MST
9
+ * trees themselves, which is why this stateModel is allowed to extend it
10
+ *
11
+ * the AppCoreJBrowseModel is generally on a property named rootModel.jbrowse
12
+ *
13
+ * extends
14
+ * - [JBrowseRootConfig](/docs/config/jbrowserootconfig)
15
+
16
+ */
6
17
  export declare function JBrowseModelF({ pluginManager, assemblyConfigSchema, }: {
7
18
  pluginManager: PluginManager;
8
19
  assemblyConfigSchema: BaseAssemblyConfigSchema;
@@ -15,9 +26,7 @@ export declare function JBrowseModelF({ pluginManager, assemblyConfigSchema, }:
15
26
  defaultValue: string;
16
27
  };
17
28
  drivers: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IMapType<import("mobx-state-tree").ITypeUnion<import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<Record<string, any>>> | undefined, import("mobx-state-tree").ModelSnapshotType<Record<string, any>>, (Partial<import("mobx-state-tree/dist/internal").ExtractCFromProps<Record<string, any>>> & import("mobx-state-tree/dist/internal").NonEmptyObject) | undefined>>, [undefined]>;
18
- }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>; /**
19
- * #getter
20
- */
29
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
21
30
  highResolutionScaling: {
22
31
  type: string;
23
32
  defaultValue: number;
@@ -87,7 +96,9 @@ export declare function JBrowseModelF({ pluginManager, assemblyConfigSchema, }:
87
96
  defaultValue: boolean;
88
97
  };
89
98
  subCategories: {
90
- type: string;
99
+ type: string; /**
100
+ * #getter
101
+ */
91
102
  defaultValue: boolean;
92
103
  };
93
104
  }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
@@ -6,6 +6,17 @@ const configuration_1 = require("@jbrowse/core/configuration");
6
6
  const mobx_1 = require("mobx");
7
7
  // locals
8
8
  const JBrowseConfig_1 = require("../JBrowseConfig");
9
+ /**
10
+ * #stateModel AppCoreJBrowseModel
11
+ * note that JBrowseRootConfig is a config model, but config models are MST
12
+ * trees themselves, which is why this stateModel is allowed to extend it
13
+ *
14
+ * the AppCoreJBrowseModel is generally on a property named rootModel.jbrowse
15
+ *
16
+ * extends
17
+ * - [JBrowseRootConfig](/docs/config/jbrowserootconfig)
18
+
19
+ */
9
20
  function JBrowseModelF({ pluginManager, assemblyConfigSchema, }) {
10
21
  return (0, JBrowseConfig_1.JBrowseConfigF)({ pluginManager, assemblyConfigSchema })
11
22
  .views(self => ({
@@ -3,6 +3,9 @@ export interface Menu {
3
3
  label: string;
4
4
  menuItems: MenuItem[];
5
5
  }
6
+ /**
7
+ * #stateModel RootAppMenuMixin
8
+ */
6
9
  export declare function RootAppMenuMixin(): import("mobx-state-tree").IModelType<{}, {
7
10
  /**
8
11
  * #action
@@ -11,57 +14,76 @@ export declare function RootAppMenuMixin(): import("mobx-state-tree").IModelType
11
14
  /**
12
15
  * #action
13
16
  * Add a top-level menu
17
+ *
14
18
  * @param menuName - Name of the menu to insert.
19
+ *
15
20
  * @returns The new length of the top-level menus array
16
21
  */
17
22
  appendMenu(menuName: string): number;
18
23
  /**
19
24
  * #action
20
25
  * Insert a top-level menu
26
+ *
21
27
  * @param menuName - Name of the menu to insert.
28
+ *
22
29
  * @param position - Position to insert menu. If negative, counts from th
23
30
  * end, e.g. `insertMenu('My Menu', -1)` will insert the menu as the
24
31
  * second-to-last one.
32
+ *
25
33
  * @returns The new length of the top-level menus array
26
34
  */
27
35
  insertMenu(menuName: string, position: number): number;
28
36
  /**
29
37
  * #action
30
38
  * Add a menu item to a top-level menu
39
+ *
31
40
  * @param menuName - Name of the top-level menu to append to.
41
+ *
32
42
  * @param menuItem - Menu item to append.
43
+ *
33
44
  * @returns The new length of the menu
34
45
  */
35
46
  appendToMenu(menuName: string, menuItem: MenuItem): number;
36
47
  /**
37
48
  * #action
38
49
  * Insert a menu item into a top-level menu
50
+ *
39
51
  * @param menuName - Name of the top-level menu to insert into
52
+ *
40
53
  * @param menuItem - Menu item to insert
54
+ *
41
55
  * @param position - Position to insert menu item. If negative, counts
42
56
  * from the end, e.g. `insertMenu('My Menu', -1)` will insert the menu as
43
57
  * the second-to-last one.
58
+ *
44
59
  * @returns The new length of the menu
45
60
  */
46
61
  insertInMenu(menuName: string, menuItem: MenuItem, position: number): number;
47
62
  /**
48
63
  * #action
49
64
  * Add a menu item to a sub-menu
65
+ *
50
66
  * @param menuPath - Path to the sub-menu to add to, starting with the
51
67
  * top-level menu (e.g. `['File', 'Insert']`).
68
+ *
52
69
  * @param menuItem - Menu item to append.
70
+ *
53
71
  * @returns The new length of the sub-menu
54
72
  */
55
73
  appendToSubMenu(menuPath: string[], menuItem: MenuItem): number;
56
74
  /**
57
75
  * #action
58
76
  * Insert a menu item into a sub-menu
77
+ *
59
78
  * @param menuPath - Path to the sub-menu to add to, starting with the
60
79
  * top-level menu (e.g. `['File', 'Insert']`).
80
+ *
61
81
  * @param menuItem - Menu item to insert.
82
+ *
62
83
  * @param position - Position to insert menu item. If negative, counts
63
84
  * from the end, e.g. `insertMenu('My Menu', -1)` will insert the menu as
64
85
  * the second-to-last one.
86
+ *
65
87
  * @returns The new length of the sub-menu
66
88
  */
67
89
  insertInSubMenu(menuPath: string[], menuItem: MenuItem, position: number): number;
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RootAppMenuMixin = void 0;
4
4
  const mobx_state_tree_1 = require("mobx-state-tree");
5
+ /**
6
+ * #stateModel RootAppMenuMixin
7
+ */
5
8
  function RootAppMenuMixin() {
6
9
  return mobx_state_tree_1.types.model({}).actions(s => {
7
10
  const self = s;
@@ -15,7 +18,9 @@ function RootAppMenuMixin() {
15
18
  /**
16
19
  * #action
17
20
  * Add a top-level menu
21
+ *
18
22
  * @param menuName - Name of the menu to insert.
23
+ *
19
24
  * @returns The new length of the top-level menus array
20
25
  */
21
26
  appendMenu(menuName) {
@@ -24,10 +29,13 @@ function RootAppMenuMixin() {
24
29
  /**
25
30
  * #action
26
31
  * Insert a top-level menu
32
+ *
27
33
  * @param menuName - Name of the menu to insert.
34
+ *
28
35
  * @param position - Position to insert menu. If negative, counts from th
29
36
  * end, e.g. `insertMenu('My Menu', -1)` will insert the menu as the
30
37
  * second-to-last one.
38
+ *
31
39
  * @returns The new length of the top-level menus array
32
40
  */
33
41
  insertMenu(menuName, position) {
@@ -40,8 +48,11 @@ function RootAppMenuMixin() {
40
48
  /**
41
49
  * #action
42
50
  * Add a menu item to a top-level menu
51
+ *
43
52
  * @param menuName - Name of the top-level menu to append to.
53
+ *
44
54
  * @param menuItem - Menu item to append.
55
+ *
45
56
  * @returns The new length of the menu
46
57
  */
47
58
  appendToMenu(menuName, menuItem) {
@@ -55,11 +66,15 @@ function RootAppMenuMixin() {
55
66
  /**
56
67
  * #action
57
68
  * Insert a menu item into a top-level menu
69
+ *
58
70
  * @param menuName - Name of the top-level menu to insert into
71
+ *
59
72
  * @param menuItem - Menu item to insert
73
+ *
60
74
  * @param position - Position to insert menu item. If negative, counts
61
75
  * from the end, e.g. `insertMenu('My Menu', -1)` will insert the menu as
62
76
  * the second-to-last one.
77
+ *
63
78
  * @returns The new length of the menu
64
79
  */
65
80
  insertInMenu(menuName, menuItem, position) {
@@ -75,9 +90,12 @@ function RootAppMenuMixin() {
75
90
  /**
76
91
  * #action
77
92
  * Add a menu item to a sub-menu
93
+ *
78
94
  * @param menuPath - Path to the sub-menu to add to, starting with the
79
95
  * top-level menu (e.g. `['File', 'Insert']`).
96
+ *
80
97
  * @param menuItem - Menu item to append.
98
+ *
81
99
  * @returns The new length of the sub-menu
82
100
  */
83
101
  appendToSubMenu(menuPath, menuItem) {
@@ -105,12 +123,16 @@ function RootAppMenuMixin() {
105
123
  /**
106
124
  * #action
107
125
  * Insert a menu item into a sub-menu
126
+ *
108
127
  * @param menuPath - Path to the sub-menu to add to, starting with the
109
128
  * top-level menu (e.g. `['File', 'Insert']`).
129
+ *
110
130
  * @param menuItem - Menu item to insert.
131
+ *
111
132
  * @param position - Position to insert menu item. If negative, counts
112
133
  * from the end, e.g. `insertMenu('My Menu', -1)` will insert the menu as
113
134
  * the second-to-last one.
135
+ *
114
136
  * @returns The new length of the sub-menu
115
137
  */
116
138
  insertInSubMenu(menuPath, menuItem, position) {
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
2
  import { SvgIconProps, IconButtonProps as IconButtonPropsType } from '@mui/material';
3
3
  import { IBaseViewModel } from '@jbrowse/core/pluggableElementTypes/models';
4
- declare const ViewMenu: ({ model, IconProps, }: {
4
+ declare const ViewMenu: ({ model, IconButtonProps, IconProps, }: {
5
5
  model: IBaseViewModel;
6
6
  IconButtonProps?: IconButtonPropsType | undefined;
7
7
  IconProps: SvgIconProps;
8
- }) => React.JSX.Element | null;
8
+ }) => React.JSX.Element;
9
9
  export default ViewMenu;
@@ -4,16 +4,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const react_1 = __importDefault(require("react"));
7
+ const material_1 = require("@mui/material");
7
8
  const mobx_react_1 = require("mobx-react");
8
9
  const util_1 = require("@jbrowse/core/util");
9
- const CascadingMenuButton_1 = __importDefault(require("@jbrowse/core/ui/CascadingMenuButton"));
10
+ const hooks_1 = require("material-ui-popup-state/hooks");
11
+ const CascadingMenu_1 = __importDefault(require("@jbrowse/core/ui/CascadingMenu"));
10
12
  // icons
11
13
  const Menu_1 = __importDefault(require("@mui/icons-material/Menu"));
12
14
  const ArrowDownward_1 = __importDefault(require("@mui/icons-material/ArrowDownward"));
13
15
  const ArrowUpward_1 = __importDefault(require("@mui/icons-material/ArrowUpward"));
14
- const ViewMenu = (0, mobx_react_1.observer)(function ({ model, IconProps, }) {
16
+ const ViewMenu = (0, mobx_react_1.observer)(function ({ model, IconButtonProps, IconProps, }) {
15
17
  const { menuItems } = model;
16
18
  const session = (0, util_1.getSession)(model);
19
+ const popupState = (0, hooks_1.usePopupState)({
20
+ popupId: 'viewMenu',
21
+ variant: 'popover',
22
+ });
17
23
  const items = [
18
24
  ...(session.views.length > 1
19
25
  ? [
@@ -32,7 +38,15 @@ const ViewMenu = (0, mobx_react_1.observer)(function ({ model, IconProps, }) {
32
38
  // <=1.3.3 didn't use a function, so check as value also
33
39
  ...((typeof menuItems === 'function' ? menuItems() : menuItems) || []),
34
40
  ];
35
- return items.length ? (react_1.default.createElement(CascadingMenuButton_1.default, { menuItems: items, "data-testid": "view_menu_icon" },
36
- react_1.default.createElement(Menu_1.default, { ...IconProps, fontSize: "small" }))) : null;
41
+ // note: This does not use CascadingMenuButton on purpose, because there was a confusing bug related to it!
42
+ // see https://github.com/GMOD/jbrowse-components/issues/4115
43
+ //
44
+ // Make sure to test the Breakpoint split view menu checkboxes if you intend to change this
45
+ return (react_1.default.createElement(react_1.default.Fragment, null,
46
+ react_1.default.createElement(material_1.IconButton, { ...IconButtonProps, ...(0, hooks_1.bindTrigger)(popupState), "data-testid": "view_menu_icon" },
47
+ react_1.default.createElement(Menu_1.default, { ...IconProps, fontSize: "small" })),
48
+ react_1.default.createElement(CascadingMenu_1.default, { ...(0, hooks_1.bindPopover)(popupState), onMenuItemClick: (_event, callback) => {
49
+ callback();
50
+ }, menuItems: items, popupState: popupState })));
37
51
  });
38
52
  exports.default = ViewMenu;
@@ -9,5 +9,8 @@ export declare function AppFocusMixin(): import("mobx-state-tree").IModelType<{
9
9
  */
10
10
  focusedViewId: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
11
11
  }, {
12
+ /**
13
+ * #action
14
+ */
12
15
  setFocusedViewId(viewId: string): void;
13
16
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
@@ -13,6 +13,9 @@ export function AppFocusMixin() {
13
13
  focusedViewId: types.maybe(types.string),
14
14
  })
15
15
  .actions(self => ({
16
+ /**
17
+ * #action
18
+ */
16
19
  setFocusedViewId(viewId) {
17
20
  self.focusedViewId = viewId;
18
21
  },
@@ -4,7 +4,22 @@ import PluginManager from '@jbrowse/core/PluginManager';
4
4
  /**
5
5
  * #config JBrowseRootConfig
6
6
  * #category root
7
- * configuration in a config.json/file.jbrowse
7
+ *
8
+ * this is a config model representing a config.json (for jbrowse-web) or
9
+ * somefile.jbrowse (for jbrowse-desktop, where configs have the .jbrowse
10
+ * extension)
11
+ *
12
+ * includes
13
+ * - [FormatDetails](../formatdetails) for global (instead of per-track)
14
+ * feature detail formatters
15
+ * - [FormatAbout](../formatabout) for global (instead of per-track) about
16
+ * track formatters
17
+ * - [HierarchicalConfigSchema](../hierarchicalconfigschema) for track selector
18
+ * configs
19
+ *
20
+ * also includes any pluginManager.pluginConfigurationSchemas(), so plugins
21
+ * that have a configurationSchema field on their class are mixed into this
22
+ * object
8
23
  */
9
24
  export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }: {
10
25
  pluginManager: PluginManager;
@@ -90,9 +105,7 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
90
105
  defaultCollapsed: import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaType<{
91
106
  categoryNames: {
92
107
  type: string;
93
- defaultValue: never[]; /**
94
- * #slot configuration.highResolutionScaling
95
- */
108
+ defaultValue: never[];
96
109
  };
97
110
  topLevelCategories: {
98
111
  type: string;
@@ -161,10 +174,13 @@ export declare function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }:
161
174
  internetAccounts: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyModelType>;
162
175
  /**
163
176
  * #slot
177
+ * configuration for aggregate text search adapters (created by e.g.
178
+ * jbrowse text-index, but can be a pluggable TextSearchAdapter type)
164
179
  */
165
180
  aggregateTextSearchAdapters: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyModelType>;
166
181
  /**
167
182
  * #slot
183
+ * configuration for connections
168
184
  */
169
185
  connections: import("mobx-state-tree").IArrayType<import("mobx-state-tree").IAnyModelType>;
170
186
  /**
@@ -5,7 +5,22 @@ import { types } from 'mobx-state-tree';
5
5
  /**
6
6
  * #config JBrowseRootConfig
7
7
  * #category root
8
- * configuration in a config.json/file.jbrowse
8
+ *
9
+ * this is a config model representing a config.json (for jbrowse-web) or
10
+ * somefile.jbrowse (for jbrowse-desktop, where configs have the .jbrowse
11
+ * extension)
12
+ *
13
+ * includes
14
+ * - [FormatDetails](../formatdetails) for global (instead of per-track)
15
+ * feature detail formatters
16
+ * - [FormatAbout](../formatabout) for global (instead of per-track) about
17
+ * track formatters
18
+ * - [HierarchicalConfigSchema](../hierarchicalconfigschema) for track selector
19
+ * configs
20
+ *
21
+ * also includes any pluginManager.pluginConfigurationSchemas(), so plugins
22
+ * that have a configurationSchema field on their class are mixed into this
23
+ * object
9
24
  */
10
25
  export function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }) {
11
26
  return types.model('JBrowseConfig', {
@@ -93,10 +108,13 @@ export function JBrowseConfigF({ pluginManager, assemblyConfigSchema, }) {
93
108
  internetAccounts: types.array(pluginManager.pluggableConfigSchemaType('internet account')),
94
109
  /**
95
110
  * #slot
111
+ * configuration for aggregate text search adapters (created by e.g.
112
+ * jbrowse text-index, but can be a pluggable TextSearchAdapter type)
96
113
  */
97
114
  aggregateTextSearchAdapters: types.array(pluginManager.pluggableConfigSchemaType('text search adapter')),
98
115
  /**
99
116
  * #slot
117
+ * configuration for connections
100
118
  */
101
119
  connections: types.array(pluginManager.pluggableConfigSchemaType('connection')),
102
120
  /**
@@ -3,6 +3,17 @@ import { BaseAssemblyConfigSchema } from '@jbrowse/core/assemblyManager';
3
3
  import RpcManager from '@jbrowse/core/rpc/RpcManager';
4
4
  import { AnyConfigurationModel } from '@jbrowse/core/configuration';
5
5
  import { PluginDefinition } from '@jbrowse/core/PluginLoader';
6
+ /**
7
+ * #stateModel AppCoreJBrowseModel
8
+ * note that JBrowseRootConfig is a config model, but config models are MST
9
+ * trees themselves, which is why this stateModel is allowed to extend it
10
+ *
11
+ * the AppCoreJBrowseModel is generally on a property named rootModel.jbrowse
12
+ *
13
+ * extends
14
+ * - [JBrowseRootConfig](/docs/config/jbrowserootconfig)
15
+
16
+ */
6
17
  export declare function JBrowseModelF({ pluginManager, assemblyConfigSchema, }: {
7
18
  pluginManager: PluginManager;
8
19
  assemblyConfigSchema: BaseAssemblyConfigSchema;
@@ -15,9 +26,7 @@ export declare function JBrowseModelF({ pluginManager, assemblyConfigSchema, }:
15
26
  defaultValue: string;
16
27
  };
17
28
  drivers: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").IMapType<import("mobx-state-tree").ITypeUnion<import("mobx-state-tree").ModelCreationType<import("mobx-state-tree/dist/internal").ExtractCFromProps<Record<string, any>>> | undefined, import("mobx-state-tree").ModelSnapshotType<Record<string, any>>, (Partial<import("mobx-state-tree/dist/internal").ExtractCFromProps<Record<string, any>>> & import("mobx-state-tree/dist/internal").NonEmptyObject) | undefined>>, [undefined]>;
18
- }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>; /**
19
- * #getter
20
- */
29
+ }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
21
30
  highResolutionScaling: {
22
31
  type: string;
23
32
  defaultValue: number;
@@ -87,7 +96,9 @@ export declare function JBrowseModelF({ pluginManager, assemblyConfigSchema, }:
87
96
  defaultValue: boolean;
88
97
  };
89
98
  subCategories: {
90
- type: string;
99
+ type: string; /**
100
+ * #getter
101
+ */
91
102
  defaultValue: boolean;
92
103
  };
93
104
  }, import("@jbrowse/core/configuration/configurationSchema").ConfigurationSchemaOptions<undefined, undefined>>;
@@ -3,6 +3,17 @@ import { readConfObject, } from '@jbrowse/core/configuration';
3
3
  import { toJS } from 'mobx';
4
4
  // locals
5
5
  import { JBrowseConfigF } from '../JBrowseConfig';
6
+ /**
7
+ * #stateModel AppCoreJBrowseModel
8
+ * note that JBrowseRootConfig is a config model, but config models are MST
9
+ * trees themselves, which is why this stateModel is allowed to extend it
10
+ *
11
+ * the AppCoreJBrowseModel is generally on a property named rootModel.jbrowse
12
+ *
13
+ * extends
14
+ * - [JBrowseRootConfig](/docs/config/jbrowserootconfig)
15
+
16
+ */
6
17
  export function JBrowseModelF({ pluginManager, assemblyConfigSchema, }) {
7
18
  return JBrowseConfigF({ pluginManager, assemblyConfigSchema })
8
19
  .views(self => ({
@@ -3,6 +3,9 @@ export interface Menu {
3
3
  label: string;
4
4
  menuItems: MenuItem[];
5
5
  }
6
+ /**
7
+ * #stateModel RootAppMenuMixin
8
+ */
6
9
  export declare function RootAppMenuMixin(): import("mobx-state-tree").IModelType<{}, {
7
10
  /**
8
11
  * #action
@@ -11,57 +14,76 @@ export declare function RootAppMenuMixin(): import("mobx-state-tree").IModelType
11
14
  /**
12
15
  * #action
13
16
  * Add a top-level menu
17
+ *
14
18
  * @param menuName - Name of the menu to insert.
19
+ *
15
20
  * @returns The new length of the top-level menus array
16
21
  */
17
22
  appendMenu(menuName: string): number;
18
23
  /**
19
24
  * #action
20
25
  * Insert a top-level menu
26
+ *
21
27
  * @param menuName - Name of the menu to insert.
28
+ *
22
29
  * @param position - Position to insert menu. If negative, counts from th
23
30
  * end, e.g. `insertMenu('My Menu', -1)` will insert the menu as the
24
31
  * second-to-last one.
32
+ *
25
33
  * @returns The new length of the top-level menus array
26
34
  */
27
35
  insertMenu(menuName: string, position: number): number;
28
36
  /**
29
37
  * #action
30
38
  * Add a menu item to a top-level menu
39
+ *
31
40
  * @param menuName - Name of the top-level menu to append to.
41
+ *
32
42
  * @param menuItem - Menu item to append.
43
+ *
33
44
  * @returns The new length of the menu
34
45
  */
35
46
  appendToMenu(menuName: string, menuItem: MenuItem): number;
36
47
  /**
37
48
  * #action
38
49
  * Insert a menu item into a top-level menu
50
+ *
39
51
  * @param menuName - Name of the top-level menu to insert into
52
+ *
40
53
  * @param menuItem - Menu item to insert
54
+ *
41
55
  * @param position - Position to insert menu item. If negative, counts
42
56
  * from the end, e.g. `insertMenu('My Menu', -1)` will insert the menu as
43
57
  * the second-to-last one.
58
+ *
44
59
  * @returns The new length of the menu
45
60
  */
46
61
  insertInMenu(menuName: string, menuItem: MenuItem, position: number): number;
47
62
  /**
48
63
  * #action
49
64
  * Add a menu item to a sub-menu
65
+ *
50
66
  * @param menuPath - Path to the sub-menu to add to, starting with the
51
67
  * top-level menu (e.g. `['File', 'Insert']`).
68
+ *
52
69
  * @param menuItem - Menu item to append.
70
+ *
53
71
  * @returns The new length of the sub-menu
54
72
  */
55
73
  appendToSubMenu(menuPath: string[], menuItem: MenuItem): number;
56
74
  /**
57
75
  * #action
58
76
  * Insert a menu item into a sub-menu
77
+ *
59
78
  * @param menuPath - Path to the sub-menu to add to, starting with the
60
79
  * top-level menu (e.g. `['File', 'Insert']`).
80
+ *
61
81
  * @param menuItem - Menu item to insert.
82
+ *
62
83
  * @param position - Position to insert menu item. If negative, counts
63
84
  * from the end, e.g. `insertMenu('My Menu', -1)` will insert the menu as
64
85
  * the second-to-last one.
86
+ *
65
87
  * @returns The new length of the sub-menu
66
88
  */
67
89
  insertInSubMenu(menuPath: string[], menuItem: MenuItem, position: number): number;
@@ -1,4 +1,7 @@
1
1
  import { types } from 'mobx-state-tree';
2
+ /**
3
+ * #stateModel RootAppMenuMixin
4
+ */
2
5
  export function RootAppMenuMixin() {
3
6
  return types.model({}).actions(s => {
4
7
  const self = s;
@@ -12,7 +15,9 @@ export function RootAppMenuMixin() {
12
15
  /**
13
16
  * #action
14
17
  * Add a top-level menu
18
+ *
15
19
  * @param menuName - Name of the menu to insert.
20
+ *
16
21
  * @returns The new length of the top-level menus array
17
22
  */
18
23
  appendMenu(menuName) {
@@ -21,10 +26,13 @@ export function RootAppMenuMixin() {
21
26
  /**
22
27
  * #action
23
28
  * Insert a top-level menu
29
+ *
24
30
  * @param menuName - Name of the menu to insert.
31
+ *
25
32
  * @param position - Position to insert menu. If negative, counts from th
26
33
  * end, e.g. `insertMenu('My Menu', -1)` will insert the menu as the
27
34
  * second-to-last one.
35
+ *
28
36
  * @returns The new length of the top-level menus array
29
37
  */
30
38
  insertMenu(menuName, position) {
@@ -37,8 +45,11 @@ export function RootAppMenuMixin() {
37
45
  /**
38
46
  * #action
39
47
  * Add a menu item to a top-level menu
48
+ *
40
49
  * @param menuName - Name of the top-level menu to append to.
50
+ *
41
51
  * @param menuItem - Menu item to append.
52
+ *
42
53
  * @returns The new length of the menu
43
54
  */
44
55
  appendToMenu(menuName, menuItem) {
@@ -52,11 +63,15 @@ export function RootAppMenuMixin() {
52
63
  /**
53
64
  * #action
54
65
  * Insert a menu item into a top-level menu
66
+ *
55
67
  * @param menuName - Name of the top-level menu to insert into
68
+ *
56
69
  * @param menuItem - Menu item to insert
70
+ *
57
71
  * @param position - Position to insert menu item. If negative, counts
58
72
  * from the end, e.g. `insertMenu('My Menu', -1)` will insert the menu as
59
73
  * the second-to-last one.
74
+ *
60
75
  * @returns The new length of the menu
61
76
  */
62
77
  insertInMenu(menuName, menuItem, position) {
@@ -72,9 +87,12 @@ export function RootAppMenuMixin() {
72
87
  /**
73
88
  * #action
74
89
  * Add a menu item to a sub-menu
90
+ *
75
91
  * @param menuPath - Path to the sub-menu to add to, starting with the
76
92
  * top-level menu (e.g. `['File', 'Insert']`).
93
+ *
77
94
  * @param menuItem - Menu item to append.
95
+ *
78
96
  * @returns The new length of the sub-menu
79
97
  */
80
98
  appendToSubMenu(menuPath, menuItem) {
@@ -102,12 +120,16 @@ export function RootAppMenuMixin() {
102
120
  /**
103
121
  * #action
104
122
  * Insert a menu item into a sub-menu
123
+ *
105
124
  * @param menuPath - Path to the sub-menu to add to, starting with the
106
125
  * top-level menu (e.g. `['File', 'Insert']`).
126
+ *
107
127
  * @param menuItem - Menu item to insert.
128
+ *
108
129
  * @param position - Position to insert menu item. If negative, counts
109
130
  * from the end, e.g. `insertMenu('My Menu', -1)` will insert the menu as
110
131
  * the second-to-last one.
132
+ *
111
133
  * @returns The new length of the sub-menu
112
134
  */
113
135
  insertInSubMenu(menuPath, menuItem, position) {
@@ -1,9 +1,9 @@
1
1
  import React from 'react';
2
2
  import { SvgIconProps, IconButtonProps as IconButtonPropsType } from '@mui/material';
3
3
  import { IBaseViewModel } from '@jbrowse/core/pluggableElementTypes/models';
4
- declare const ViewMenu: ({ model, IconProps, }: {
4
+ declare const ViewMenu: ({ model, IconButtonProps, IconProps, }: {
5
5
  model: IBaseViewModel;
6
6
  IconButtonProps?: IconButtonPropsType | undefined;
7
7
  IconProps: SvgIconProps;
8
- }) => React.JSX.Element | null;
8
+ }) => React.JSX.Element;
9
9
  export default ViewMenu;
@@ -1,14 +1,20 @@
1
1
  import React from 'react';
2
+ import { IconButton, } from '@mui/material';
2
3
  import { observer } from 'mobx-react';
3
4
  import { getSession } from '@jbrowse/core/util';
4
- import CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton';
5
+ import { bindTrigger, bindPopover, usePopupState, } from 'material-ui-popup-state/hooks';
6
+ import CascadingMenu from '@jbrowse/core/ui/CascadingMenu';
5
7
  // icons
6
8
  import MenuIcon from '@mui/icons-material/Menu';
7
9
  import ArrowDownward from '@mui/icons-material/ArrowDownward';
8
10
  import ArrowUpward from '@mui/icons-material/ArrowUpward';
9
- const ViewMenu = observer(function ({ model, IconProps, }) {
11
+ const ViewMenu = observer(function ({ model, IconButtonProps, IconProps, }) {
10
12
  const { menuItems } = model;
11
13
  const session = getSession(model);
14
+ const popupState = usePopupState({
15
+ popupId: 'viewMenu',
16
+ variant: 'popover',
17
+ });
12
18
  const items = [
13
19
  ...(session.views.length > 1
14
20
  ? [
@@ -27,7 +33,15 @@ const ViewMenu = observer(function ({ model, IconProps, }) {
27
33
  // <=1.3.3 didn't use a function, so check as value also
28
34
  ...((typeof menuItems === 'function' ? menuItems() : menuItems) || []),
29
35
  ];
30
- return items.length ? (React.createElement(CascadingMenuButton, { menuItems: items, "data-testid": "view_menu_icon" },
31
- React.createElement(MenuIcon, { ...IconProps, fontSize: "small" }))) : null;
36
+ // note: This does not use CascadingMenuButton on purpose, because there was a confusing bug related to it!
37
+ // see https://github.com/GMOD/jbrowse-components/issues/4115
38
+ //
39
+ // Make sure to test the Breakpoint split view menu checkboxes if you intend to change this
40
+ return (React.createElement(React.Fragment, null,
41
+ React.createElement(IconButton, { ...IconButtonProps, ...bindTrigger(popupState), "data-testid": "view_menu_icon" },
42
+ React.createElement(MenuIcon, { ...IconProps, fontSize: "small" })),
43
+ React.createElement(CascadingMenu, { ...bindPopover(popupState), onMenuItemClick: (_event, callback) => {
44
+ callback();
45
+ }, menuItems: items, popupState: popupState })));
32
46
  });
33
47
  export default ViewMenu;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/app-core",
3
- "version": "2.9.0",
3
+ "version": "2.10.0",
4
4
  "description": "JBrowse 2 code shared between the 'full featured' apps e.g. jbrowse-web and jbrowse-desktop",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -42,10 +42,9 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@babel/runtime": "^7.16.3",
45
- "@jbrowse/product-core": "^2.9.0",
45
+ "@jbrowse/product-core": "^2.10.0",
46
46
  "@mui/icons-material": "^5.0.0",
47
47
  "@mui/material": "^5.10.17",
48
- "clsx": "^2.0.0",
49
48
  "copy-to-clipboard": "^3.3.1",
50
49
  "react-error-boundary": "^4.0.3"
51
50
  },
@@ -61,5 +60,5 @@
61
60
  "publishConfig": {
62
61
  "access": "public"
63
62
  },
64
- "gitHead": "a50b6f67cf8c8f3c65a7b8cd858de2fcca1f2909"
63
+ "gitHead": "223d8bfb68fd1bacaf22852639ad5920f1b7f43b"
65
64
  }