@jbrowse/core 2.5.0 → 2.6.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 (140) hide show
  1. package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +1 -1
  2. package/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +0 -1
  3. package/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +1 -1
  4. package/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +8 -25
  5. package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +2 -1
  6. package/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +2 -1
  7. package/BaseFeatureWidget/BaseFeatureDetail/{DataGrid.d.ts → DataGridDetails.d.ts} +2 -1
  8. package/BaseFeatureWidget/BaseFeatureDetail/FieldName.d.ts +1 -1
  9. package/BaseFeatureWidget/BaseFeatureDetail/{BasicField.d.ts → SimpleField.d.ts} +2 -2
  10. package/BaseFeatureWidget/BaseFeatureDetail/{BasicField.js → SimpleField.js} +3 -3
  11. package/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +2 -1
  12. package/BaseFeatureWidget/BaseFeatureDetail/UriLink.d.ts +2 -1
  13. package/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +9 -38
  14. package/BaseFeatureWidget/BaseFeatureDetail/index.js +14 -225
  15. package/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +1 -0
  16. package/BaseFeatureWidget/BaseFeatureDetail/util.js +24 -1
  17. package/BaseFeatureWidget/SequenceFeatureDetails/CDNASequence.d.ts +2 -1
  18. package/BaseFeatureWidget/SequenceFeatureDetails/CDSSequence.d.ts +2 -1
  19. package/BaseFeatureWidget/SequenceFeatureDetails/GenomicSequence.d.ts +2 -1
  20. package/BaseFeatureWidget/SequenceFeatureDetails/ProteinSequence.d.ts +2 -1
  21. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +2 -1
  22. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +10 -13
  23. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureSettingsDialog.d.ts +2 -1
  24. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceHelpDialog.d.ts +2 -1
  25. package/BaseFeatureWidget/SequenceFeatureDetails/SequenceHelpDialog.js +1 -1
  26. package/BaseFeatureWidget/SequenceFeatureDetails/hooks.d.ts +2 -2
  27. package/BaseFeatureWidget/SequenceFeatureDetails/index.d.ts +2 -1
  28. package/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +17 -17
  29. package/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +16 -16
  30. package/BaseFeatureWidget/util.js +15 -5
  31. package/PluginManager.d.ts +3 -3
  32. package/README.md +0 -2
  33. package/ReExports/modules.d.ts +3 -3
  34. package/ReExports/modules.js +0 -3
  35. package/assemblyManager/assemblyConfigSchema.d.ts +2 -0
  36. package/assemblyManager/assemblyConfigSchema.js +1 -0
  37. package/assemblyManager/assemblyManager.d.ts +112 -0
  38. package/assemblyManager/assemblyManager.js +12 -1
  39. package/assemblyManager/index.d.ts +1 -0
  40. package/configuration/index.d.ts +1 -1
  41. package/configuration/types.d.ts +3 -1
  42. package/data_adapters/BaseAdapter/BaseAdapter.js +1 -1
  43. package/data_adapters/BaseAdapter/index.d.ts +1 -1
  44. package/package.json +2 -2
  45. package/pluggableElementTypes/RpcMethodType.d.ts +9 -7
  46. package/pluggableElementTypes/RpcMethodType.js +9 -7
  47. package/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +18 -0
  48. package/pluggableElementTypes/models/BaseConnectionModelFactory.js +9 -0
  49. package/pluggableElementTypes/models/BaseDisplayModel.d.ts +10 -1
  50. package/pluggableElementTypes/models/BaseDisplayModel.js +9 -1
  51. package/pluggableElementTypes/models/BaseTrackModel.d.ts +1 -0
  52. package/pluggableElementTypes/models/BaseTrackModel.js +1 -0
  53. package/pluggableElementTypes/models/BaseViewModel.d.ts +46 -2
  54. package/pluggableElementTypes/models/BaseViewModel.js +6 -0
  55. package/pluggableElementTypes/models/InternetAccountModel.d.ts +6 -2
  56. package/pluggableElementTypes/models/InternetAccountModel.js +27 -20
  57. package/pluggableElementTypes/models/baseConnectionConfig.d.ts +5 -2
  58. package/pluggableElementTypes/models/baseConnectionConfig.js +2 -1
  59. package/pluggableElementTypes/models/baseInternetAccountConfig.js +1 -1
  60. package/pluggableElementTypes/models/baseTrackConfig.d.ts +2 -2
  61. package/pluggableElementTypes/models/baseTrackConfig.js +7 -5
  62. package/pluggableElementTypes/models/index.d.ts +1 -1
  63. package/pluggableElementTypes/renderers/BoxRendererType.js +1 -2
  64. package/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +2 -1
  65. package/pluggableElementTypes/renderers/FeatureRendererType.d.ts +3 -1
  66. package/pluggableElementTypes/renderers/FeatureRendererType.js +4 -6
  67. package/pluggableElementTypes/renderers/RpcRenderedSvgGroup.d.ts +2 -1
  68. package/pluggableElementTypes/renderers/ServerSideRenderedContent.d.ts +1 -1
  69. package/rpc/BaseRpcDriver.js +1 -7
  70. package/tsconfig.build.tsbuildinfo +1 -1
  71. package/ui/AppLogo.d.ts +2 -1
  72. package/ui/AssemblySelector.d.ts +2 -1
  73. package/ui/AssemblySelector.js +1 -1
  74. package/ui/CascadingMenu.d.ts +2 -1
  75. package/ui/CascadingMenuButton.d.ts +8 -0
  76. package/ui/CascadingMenuButton.js +20 -0
  77. package/ui/ColorPicker.d.ts +4 -3
  78. package/ui/Dialog.d.ts +5 -4
  79. package/ui/Dialog.js +5 -6
  80. package/ui/DropDownMenu.d.ts +2 -1
  81. package/ui/EditableTypography.js +1 -1
  82. package/ui/ErrorMessage.d.ts +2 -1
  83. package/ui/ErrorMessage.js +6 -2
  84. package/ui/FactoryResetDialog.d.ts +2 -1
  85. package/ui/FatalErrorDialog.d.ts +6 -6
  86. package/ui/FatalErrorDialog.js +7 -7
  87. package/ui/FileSelector/FileSelector.d.ts +2 -1
  88. package/ui/FileSelector/FileSelector.js +3 -2
  89. package/ui/FileSelector/LocalFileChooser.d.ts +2 -1
  90. package/ui/FileSelector/UrlChooser.d.ts +3 -3
  91. package/ui/FileSelector/UrlChooser.js +8 -10
  92. package/ui/Icons.d.ts +10 -9
  93. package/ui/LoadingEllipses.d.ts +2 -1
  94. package/ui/Logo.d.ts +3 -2
  95. package/ui/Menu.d.ts +2 -2
  96. package/ui/PrerenderedCanvas.d.ts +2 -1
  97. package/ui/ResizeBar.d.ts +1 -1
  98. package/ui/ResizeHandle.d.ts +2 -1
  99. package/ui/ReturnToImportFormDialog.d.ts +2 -1
  100. package/ui/SanitizedHTML.d.ts +2 -1
  101. package/ui/Snackbar.d.ts +7 -8
  102. package/ui/Snackbar.js +12 -17
  103. package/ui/SnackbarModel.d.ts +9 -3
  104. package/ui/SnackbarModel.js +3 -3
  105. package/ui/Tooltip.d.ts +2 -1
  106. package/ui/index.d.ts +0 -1
  107. package/ui/index.js +1 -3
  108. package/util/Base1DUtils.js +2 -1
  109. package/util/QuickLRU.d.ts +1 -1
  110. package/util/blockTypes.js +1 -1
  111. package/util/formatFastaStrings.js +1 -1
  112. package/util/index.d.ts +14 -0
  113. package/util/index.js +65 -8
  114. package/util/io/index.js +1 -1
  115. package/util/mst-reflection.js +1 -2
  116. package/util/offscreenCanvasUtils.d.ts +2 -2
  117. package/util/types/index.d.ts +6 -2
  118. package/util/types/index.js +6 -2
  119. package/util/types/util.d.ts +0 -3
  120. package/ui/AboutDialog.d.ts +0 -11
  121. package/ui/AboutDialog.js +0 -125
  122. package/ui/App.d.ts +0 -18
  123. package/ui/App.js +0 -114
  124. package/ui/AppToolbar.d.ts +0 -19
  125. package/ui/AppToolbar.js +0 -56
  126. package/ui/Drawer.d.ts +0 -8
  127. package/ui/Drawer.js +0 -34
  128. package/ui/DrawerWidget.d.ts +0 -5
  129. package/ui/DrawerWidget.js +0 -132
  130. package/ui/ViewContainer.d.ts +0 -9
  131. package/ui/ViewContainer.js +0 -76
  132. package/ui/ViewContainerTitle.d.ts +0 -5
  133. package/ui/ViewContainerTitle.js +0 -42
  134. package/ui/ViewLauncher.d.ts +0 -17
  135. package/ui/ViewLauncher.js +0 -50
  136. package/ui/ViewMenu.d.ts +0 -8
  137. package/ui/ViewMenu.js +0 -69
  138. package/ui/ViewPanel.d.ts +0 -18
  139. package/ui/ViewPanel.js +0 -49
  140. /package/BaseFeatureWidget/BaseFeatureDetail/{DataGrid.js → DataGridDetails.js} +0 -0
@@ -13,4 +13,4 @@ export default function ArrayValue({ name, value, description, prefix, }: {
13
13
  name: string;
14
14
  value: unknown[];
15
15
  prefix?: string[];
16
- }): JSX.Element;
16
+ }): React.JSX.Element;
@@ -20,7 +20,6 @@ exports.useStyles = (0, mui_1.makeStyles)()(theme => ({
20
20
  wordBreak: 'break-word',
21
21
  maxHeight: 300,
22
22
  padding: theme.spacing(0.5),
23
- background: theme.palette.action.hover,
24
23
  border: `1px solid ${theme.palette.action.selected}`,
25
24
  boxSizing: 'border-box',
26
25
  overflow: 'auto',
@@ -12,4 +12,4 @@ export default function Attributes(props: {
12
12
  descriptions?: Record<string, React.ReactNode>;
13
13
  prefix?: string[];
14
14
  hideUris?: boolean;
15
- }): JSX.Element;
15
+ }): React.JSX.Element;
@@ -4,13 +4,14 @@ 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 util_1 = require("./util");
8
- const DataGrid_1 = __importDefault(require("./DataGrid"));
9
- const ArrayValue_1 = __importDefault(require("./ArrayValue"));
10
7
  const is_object_1 = __importDefault(require("is-object"));
8
+ // locals
9
+ const util_1 = require("./util");
11
10
  const util_2 = require("../../util");
11
+ const DataGridDetails_1 = __importDefault(require("./DataGridDetails"));
12
+ const ArrayValue_1 = __importDefault(require("./ArrayValue"));
12
13
  const UriField_1 = __importDefault(require("./UriField"));
13
- const BasicField_1 = __importDefault(require("./BasicField"));
14
+ const SimpleField_1 = __importDefault(require("./SimpleField"));
14
15
  const MAX_FIELD_NAME_WIDTH = 170;
15
16
  // these are always omitted as too detailed
16
17
  const globalOmit = [
@@ -24,24 +25,6 @@ const globalOmit = [
24
25
  'thickStart',
25
26
  'thickEnd',
26
27
  ];
27
- // pick using a path from an object, similar to _.get from lodash with special
28
- // logic for Descriptions from e.g. VCF headers
29
- //
30
- // @param arr example ['a','b'], obj = {a:{b:'hello}}
31
- // @returns hello (with special addition to grab description also)
32
- function accessNested(arr, obj = {}) {
33
- let obj2 = obj;
34
- arr.forEach(elt => {
35
- if (obj2) {
36
- obj2 = obj[elt];
37
- }
38
- });
39
- return typeof obj === 'string'
40
- ? obj
41
- : typeof (obj === null || obj === void 0 ? void 0 : obj.Description) === 'string'
42
- ? obj.Description
43
- : undefined;
44
- }
45
28
  function Attributes(props) {
46
29
  const { attributes, omit = [], omitSingleLevel = [], descriptions, formatter = val => val, hideUris, prefix = [], } = props;
47
30
  const omits = new Set([...omit, ...globalOmit, ...omitSingleLevel]);
@@ -51,18 +34,18 @@ function Attributes(props) {
51
34
  return (react_1.default.createElement(react_1.default.Fragment, null, Object.entries(formattedAttributes)
52
35
  .filter(([k, v]) => v !== undefined && !omits.has(k))
53
36
  .map(([key, value]) => {
54
- const description = accessNested([...prefix, key], descriptions);
37
+ const description = (0, util_1.accessNested)([...prefix, key], descriptions);
55
38
  if (Array.isArray(value)) {
56
39
  // check if it looks like an array of objects, which could be used
57
40
  // in data grid
58
- return value.length > 1 && value.every(val => (0, is_object_1.default)(val)) ? (react_1.default.createElement(DataGrid_1.default, { key: key, name: key, prefix: prefix, value: value })) : (react_1.default.createElement(ArrayValue_1.default, { key: key, name: key, value: value, description: description, prefix: prefix }));
41
+ return value.length > 1 && value.every(val => (0, is_object_1.default)(val)) ? (react_1.default.createElement(DataGridDetails_1.default, { key: key, name: key, prefix: prefix, value: value })) : (react_1.default.createElement(ArrayValue_1.default, { key: key, name: key, value: value, description: description, prefix: prefix }));
59
42
  }
60
43
  else if ((0, is_object_1.default)(value)) {
61
44
  const { omitSingleLevel, ...rest } = props;
62
45
  return (0, util_2.isUriLocation)(value) ? (hideUris ? null : (react_1.default.createElement(UriField_1.default, { key: key, name: key, prefix: prefix, value: value }))) : (react_1.default.createElement(Attributes, { ...rest, key: key, attributes: value, descriptions: descriptions, prefix: [...prefix, key] }));
63
46
  }
64
47
  else {
65
- return (react_1.default.createElement(BasicField_1.default, { key: key, name: key, value: formatter(value, key), description: description, prefix: prefix, width: Math.min(maxLabelWidth, MAX_FIELD_NAME_WIDTH) }));
48
+ return (react_1.default.createElement(SimpleField_1.default, { key: key, name: key, value: formatter(value, key), description: description, prefix: prefix, width: Math.min(maxLabelWidth, MAX_FIELD_NAME_WIDTH) }));
66
49
  }
67
50
  })));
68
51
  }
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  export declare const useStyles: (params: void, styleOverrides?: {
2
3
  props: any;
3
4
  ownerState?: Record<string, unknown> | undefined;
@@ -9,4 +10,4 @@ export declare const useStyles: (params: void, styleOverrides?: {
9
10
  };
10
11
  export default function BasicValue({ value }: {
11
12
  value: unknown;
12
- }): JSX.Element;
13
+ }): React.JSX.Element;
@@ -6,9 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.useStyles = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const mui_1 = require("tss-react/mui");
9
- const ui_1 = require("../../ui");
10
9
  const is_object_1 = __importDefault(require("is-object"));
11
10
  const material_1 = require("@mui/material");
11
+ // locals
12
+ const ui_1 = require("../../ui");
12
13
  exports.useStyles = (0, mui_1.makeStyles)()(theme => ({
13
14
  fieldValue: {
14
15
  wordBreak: 'break-word',
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  export declare const useStyles: (params: void, styleOverrides?: {
2
3
  props: any;
3
4
  ownerState?: Record<string, unknown> | undefined;
@@ -11,4 +12,4 @@ export default function DataGridDetails({ value, prefix, name, }: {
11
12
  name: string;
12
13
  prefix?: string[];
13
14
  value: Record<string, unknown>[];
14
- }): JSX.Element | null;
15
+ }): React.JSX.Element | null;
@@ -13,4 +13,4 @@ export default function FieldName({ description, name, width, prefix, }: {
13
13
  name: string;
14
14
  prefix?: string[];
15
15
  width?: number;
16
- }): JSX.Element;
16
+ }): React.JSX.Element;
@@ -8,10 +8,10 @@ export declare const useStyles: (params: void, styleOverrides?: {
8
8
  css: import("tss-react").Css;
9
9
  cx: import("tss-react").Cx;
10
10
  };
11
- export default function BasicField({ name, value, description, prefix, width, }: {
11
+ export default function SimpleField({ name, value, description, prefix, width, }: {
12
12
  description?: React.ReactNode;
13
13
  name: string;
14
14
  value: unknown;
15
15
  prefix?: string[];
16
16
  width?: number;
17
- }): JSX.Element | null;
17
+ }): React.JSX.Element | null;
@@ -6,18 +6,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.useStyles = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const mui_1 = require("tss-react/mui");
9
- const BasicValue_1 = __importDefault(require("./BasicValue"));
10
9
  const FieldName_1 = __importDefault(require("./FieldName"));
10
+ const BasicValue_1 = __importDefault(require("./BasicValue"));
11
11
  exports.useStyles = (0, mui_1.makeStyles)()({
12
12
  field: {
13
13
  display: 'flex',
14
14
  flexWrap: 'wrap',
15
15
  },
16
16
  });
17
- function BasicField({ name, value, description, prefix, width, }) {
17
+ function SimpleField({ name, value, description, prefix, width, }) {
18
18
  const { classes } = (0, exports.useStyles)();
19
19
  return value !== null && value !== undefined ? (react_1.default.createElement("div", { className: classes.field },
20
20
  react_1.default.createElement(FieldName_1.default, { prefix: prefix, description: description, name: name, width: width }),
21
21
  react_1.default.createElement(BasicValue_1.default, { value: value }))) : null;
22
22
  }
23
- exports.default = BasicField;
23
+ exports.default = SimpleField;
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  export declare const useStyles: (params: void, styleOverrides?: {
2
3
  props: any;
3
4
  ownerState?: Record<string, unknown> | undefined;
@@ -14,4 +15,4 @@ export default function UriField({ value, prefix, name, }: {
14
15
  };
15
16
  name: string;
16
17
  prefix: string[];
17
- }): JSX.Element;
18
+ }): React.JSX.Element;
@@ -1,6 +1,7 @@
1
+ import React from 'react';
1
2
  export default function UriLink({ value, }: {
2
3
  value: {
3
4
  uri: string;
4
5
  baseUri?: string;
5
6
  };
6
- }): JSX.Element;
7
+ }): React.JSX.Element;
@@ -1,50 +1,19 @@
1
1
  import React from 'react';
2
2
  import { IAnyStateTreeNode } from 'mobx-state-tree';
3
3
  import { BaseCardProps, BaseProps } from '../types';
4
- import { SimpleFeatureSerialized } from '../../util/simpleFeature';
4
+ import { SimpleFeatureSerialized } from '../../util';
5
5
  export declare const useStyles: (params: void, styleOverrides?: {
6
6
  props: any;
7
7
  ownerState?: Record<string, unknown> | undefined;
8
8
  } | undefined) => {
9
- classes: Record<"expandIcon" | "expansionPanelDetails" | "field" | "fieldDescription" | "fieldName" | "fieldValue" | "fieldSubvalue", string>;
9
+ classes: Record<"expandIcon" | "expansionPanelDetails", string>;
10
10
  theme: import("@mui/material").Theme;
11
11
  css: import("tss-react").Css;
12
12
  cx: import("tss-react").Cx;
13
13
  };
14
- export declare function BaseCard({ children, title, defaultExpanded, }: BaseCardProps): JSX.Element;
15
- export declare const FieldName: ({ description, name, width, prefix, }: {
16
- description?: React.ReactNode;
17
- name: string;
18
- prefix?: string[] | undefined;
19
- width?: number | undefined;
20
- }) => JSX.Element;
21
- export declare const BasicValue: ({ value }: {
22
- value: string | React.ReactNode;
23
- }) => JSX.Element;
24
- export declare function SimpleValue({ name, value, description, prefix, width, }: {
25
- description?: React.ReactNode;
26
- name: string;
27
- value: any;
28
- prefix?: string[];
29
- width?: number;
30
- }): JSX.Element | null;
31
- export declare const BaseCoreDetails: (props: BaseProps) => JSX.Element;
32
- export declare function UriLink({ value, }: {
33
- value: {
34
- uri: string;
35
- baseUri?: string;
36
- };
37
- }): JSX.Element;
38
- export declare function Attributes(props: {
39
- attributes: Record<string, any>;
40
- omit?: string[];
41
- omitSingleLevel?: string[];
42
- formatter?: (val: unknown, key: string) => React.ReactNode;
43
- descriptions?: Record<string, React.ReactNode>;
44
- prefix?: string[];
45
- hideUris?: boolean;
46
- }): JSX.Element;
47
- export declare const BaseAttributes: (props: BaseProps) => JSX.Element;
14
+ export declare function BaseCard({ children, title, defaultExpanded, }: BaseCardProps): React.JSX.Element;
15
+ export declare const BaseCoreDetails: (props: BaseProps) => React.JSX.Element;
16
+ export declare const BaseAttributes: (props: BaseProps) => React.JSX.Element;
48
17
  export interface BaseInputProps extends BaseCardProps {
49
18
  omit?: string[];
50
19
  model: any;
@@ -56,7 +25,9 @@ export declare function FeatureDetails(props: {
56
25
  feature: SimpleFeatureSerialized;
57
26
  depth?: number;
58
27
  omit?: string[];
28
+ descriptions?: Record<string, React.ReactNode>;
59
29
  formatter?: (val: unknown, key: string) => React.ReactNode;
60
- }): JSX.Element;
61
- declare const _default: ({ model }: BaseInputProps) => JSX.Element | null;
30
+ }): React.JSX.Element;
31
+ declare const _default: ({ model }: BaseInputProps) => React.JSX.Element | null;
62
32
  export default _default;
33
+ export { default as Attributes } from './Attributes';
@@ -26,35 +26,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
26
26
  return (mod && mod.__esModule) ? mod : { "default": mod };
27
27
  };
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.FeatureDetails = exports.BaseAttributes = exports.Attributes = exports.UriLink = exports.BaseCoreDetails = exports.SimpleValue = exports.BasicValue = exports.FieldName = exports.BaseCard = exports.useStyles = void 0;
29
+ exports.Attributes = exports.FeatureDetails = exports.BaseAttributes = exports.BaseCoreDetails = exports.BaseCard = exports.useStyles = void 0;
30
30
  /* eslint-disable @typescript-eslint/no-explicit-any */
31
31
  const react_1 = __importStar(require("react"));
32
32
  const react_error_boundary_1 = require("react-error-boundary");
33
33
  const material_1 = require("@mui/material");
34
34
  const mui_1 = require("tss-react/mui");
35
- const x_data_grid_1 = require("@mui/x-data-grid");
36
35
  const mobx_react_1 = require("mobx-react");
37
- const is_object_1 = __importDefault(require("is-object"));
38
36
  // icons
39
37
  const ExpandMore_1 = __importDefault(require("@mui/icons-material/ExpandMore"));
40
38
  // locals
41
39
  const util_1 = require("../../util");
42
40
  const ui_1 = require("../../ui");
43
41
  const SequenceFeatureDetails_1 = __importDefault(require("../SequenceFeatureDetails"));
44
- const util_2 = require("../util");
45
- const MAX_FIELD_NAME_WIDTH = 170;
46
- // these are always omitted as too detailed
47
- const globalOmit = [
48
- '__jbrowsefmt',
49
- 'length',
50
- 'position',
51
- 'subfeatures',
52
- 'uniqueId',
53
- 'exonFrames',
54
- 'parentId',
55
- 'thickStart',
56
- 'thickEnd',
57
- ];
42
+ const SimpleField_1 = __importDefault(require("./SimpleField"));
43
+ const Attributes_1 = __importDefault(require("./Attributes"));
44
+ const util_2 = require("./util");
58
45
  // coreDetails are omitted in some circumstances
59
46
  const coreDetails = [
60
47
  'name',
@@ -75,40 +62,6 @@ exports.useStyles = (0, mui_1.makeStyles)()(theme => {
75
62
  expandIcon: {
76
63
  color: ((_a = theme.palette.tertiary) === null || _a === void 0 ? void 0 : _a.contrastText) || '#fff',
77
64
  },
78
- field: {
79
- display: 'flex',
80
- flexWrap: 'wrap',
81
- },
82
- fieldDescription: {
83
- '&:hover': {
84
- background: theme.palette.mode === 'dark' ? '#e65100' : 'yellow',
85
- },
86
- },
87
- fieldName: {
88
- wordBreak: 'break-all',
89
- minWidth: 90,
90
- borderBottom: '1px solid #0003',
91
- fontSize: 12,
92
- background: theme.palette.action.disabledBackground,
93
- marginRight: theme.spacing(1),
94
- padding: theme.spacing(0.5),
95
- },
96
- fieldValue: {
97
- wordBreak: 'break-word',
98
- maxHeight: 300,
99
- fontSize: 12,
100
- padding: theme.spacing(0.5),
101
- overflow: 'auto',
102
- },
103
- fieldSubvalue: {
104
- wordBreak: 'break-word',
105
- maxHeight: 300,
106
- padding: theme.spacing(0.5),
107
- background: theme.palette.action.disabledBackground,
108
- border: `1px solid ${theme.palette.action.disabledBackground}`,
109
- boxSizing: 'border-box',
110
- overflow: 'auto',
111
- },
112
65
  });
113
66
  });
114
67
  function BaseCard({ children, title, defaultExpanded = true, }) {
@@ -122,44 +75,6 @@ function BaseCard({ children, title, defaultExpanded = true, }) {
122
75
  react_1.default.createElement(material_1.AccordionDetails, { className: classes.expansionPanelDetails }, children)));
123
76
  }
124
77
  exports.BaseCard = BaseCard;
125
- const FieldName = ({ description, name, width, prefix = [], }) => {
126
- const { classes, cx } = (0, exports.useStyles)();
127
- const val = [...prefix, name].join('.');
128
- return description ? (react_1.default.createElement(material_1.Tooltip, { title: description, placement: "left" },
129
- react_1.default.createElement("div", { className: cx(classes.fieldDescription, classes.fieldName) }, val))) : (react_1.default.createElement("div", { className: classes.fieldName, style: { width: width } }, val));
130
- };
131
- exports.FieldName = FieldName;
132
- const BasicValue = ({ value }) => {
133
- const { classes } = (0, exports.useStyles)();
134
- const isLink = `${value}`.match(/^https?:\/\//);
135
- return (react_1.default.createElement("div", { className: classes.fieldValue }, react_1.default.isValidElement(value) ? (value) : isLink ? (react_1.default.createElement(material_1.Link, { href: `${value}` }, `${value}`)) : (react_1.default.createElement(ui_1.SanitizedHTML, { html: (0, is_object_1.default)(value) ? JSON.stringify(value) : String(value) }))));
136
- };
137
- exports.BasicValue = BasicValue;
138
- function SimpleValue({ name, value, description, prefix, width, }) {
139
- const { classes } = (0, exports.useStyles)();
140
- return value !== null && value !== undefined ? (react_1.default.createElement("div", { className: classes.field },
141
- react_1.default.createElement(exports.FieldName, { prefix: prefix, description: description, name: name, width: width }),
142
- react_1.default.createElement(exports.BasicValue, { value: value }))) : null;
143
- }
144
- exports.SimpleValue = SimpleValue;
145
- function ArrayValue({ name, value, description, prefix = [], }) {
146
- const { classes } = (0, exports.useStyles)();
147
- if (value.length === 1) {
148
- return (0, is_object_1.default)(value[0]) ? (react_1.default.createElement(Attributes, { attributes: value[0], prefix: [...prefix, name] })) : (react_1.default.createElement("div", { className: classes.field },
149
- react_1.default.createElement(exports.FieldName, { prefix: prefix, description: description, name: name }),
150
- react_1.default.createElement(exports.BasicValue, { value: value[0] })));
151
- }
152
- else if (value.every(val => (0, is_object_1.default)(val))) {
153
- return (react_1.default.createElement(react_1.default.Fragment, null, value.map((val, i) => (react_1.default.createElement(Attributes, { key: JSON.stringify(val) + '-' + i, attributes: val, prefix: [...prefix, name + '-' + i] })))));
154
- }
155
- else {
156
- return (react_1.default.createElement("div", { className: classes.field },
157
- react_1.default.createElement(exports.FieldName, { prefix: prefix, description: description, name: name }),
158
- value.map((val, i) => (react_1.default.createElement("div", { key: JSON.stringify(val) + '-' + i, className: classes.fieldSubvalue },
159
- react_1.default.createElement(exports.BasicValue, { value: val }))))));
160
- }
161
- }
162
- const toLocale = (n) => n.toLocaleString('en-US');
163
78
  function Position(props) {
164
79
  const { feature } = props;
165
80
  const strand = feature.strand;
@@ -181,7 +96,7 @@ function CoreDetails(props) {
181
96
  const { start, end } = formattedFeat;
182
97
  const displayedDetails = {
183
98
  ...formattedFeat,
184
- length: toLocale(end - start),
99
+ length: (0, util_2.toLocale)(end - start),
185
100
  };
186
101
  const coreRenderedDetails = {
187
102
  description: 'Description',
@@ -190,151 +105,23 @@ function CoreDetails(props) {
190
105
  type: 'Type',
191
106
  };
192
107
  return (react_1.default.createElement(react_1.default.Fragment, null,
193
- react_1.default.createElement(SimpleValue, { name: "Position", value: react_1.default.createElement(Position, { ...props, feature: formattedFeat }) }),
108
+ react_1.default.createElement(SimpleField_1.default, { name: "Position", value: react_1.default.createElement(Position, { ...props, feature: formattedFeat }) }),
194
109
  Object.entries(coreRenderedDetails)
195
110
  .map(([key, name]) => [name, displayedDetails[key]])
196
111
  .filter(([, value]) => value != null)
197
- .map(([name, value]) => (react_1.default.createElement(SimpleValue, { key: name, name: name, value: value })))));
112
+ .map(([name, value]) => (react_1.default.createElement(SimpleField_1.default, { key: name, name: name, value: value })))));
198
113
  }
199
114
  const BaseCoreDetails = (props) => {
200
115
  return (react_1.default.createElement(BaseCard, { ...props, title: "Primary data" },
201
116
  react_1.default.createElement(CoreDetails, { ...props })));
202
117
  };
203
118
  exports.BaseCoreDetails = BaseCoreDetails;
204
- function UriLink({ value, }) {
205
- const href = (0, util_1.getUriLink)(value);
206
- return react_1.default.createElement(ui_1.SanitizedHTML, { html: `<a href="${href}">${href}</a>` });
207
- }
208
- exports.UriLink = UriLink;
209
- function DataGridDetails({ value, prefix, name, }) {
210
- const keys = Object.keys(value[0]).sort();
211
- const unionKeys = new Set(keys);
212
- for (const val of value) {
213
- for (const k of Object.keys(val)) {
214
- unionKeys.add(k);
215
- }
216
- }
217
- if (unionKeys.size < keys.length + 5) {
218
- // avoids key 'id' from being used in row data
219
- const rows = Object.entries(value).map(([k, val]) => {
220
- const { id, ...rest } = val;
221
- return {
222
- id: k,
223
- identifier: id,
224
- ...rest,
225
- };
226
- });
227
- // avoids key 'id' from being used in column names, and tries
228
- // to make it at the start of the colNames array
229
- let colNames;
230
- if (unionKeys.has('id')) {
231
- unionKeys.delete('id');
232
- colNames = ['identifier', ...unionKeys];
233
- }
234
- else {
235
- colNames = [...unionKeys];
236
- }
237
- const columns = colNames.map(val => ({
238
- field: val,
239
- renderCell: (params) => {
240
- const { value } = params;
241
- return (0, util_1.isUriLocation)(value) ? react_1.default.createElement(UriLink, { value: value }) : (0, util_1.getStr)(value);
242
- },
243
- width: (0, util_1.measureGridWidth)(rows.map(r => r[val])),
244
- }));
245
- const rowHeight = 25;
246
- const hideFoot = rows.length < 100;
247
- const headHeight = 80;
248
- const height = Math.min(rows.length, 100) * rowHeight + headHeight + (hideFoot ? 0 : 50);
249
- // disableSelection on click helps avoid
250
- // https://github.com/mui-org/material-ui-x/issues/1197
251
- return (react_1.default.createElement(react_1.default.Fragment, null,
252
- react_1.default.createElement(exports.FieldName, { prefix: prefix, name: name }),
253
- react_1.default.createElement("div", { style: {
254
- height,
255
- width: '100%',
256
- } },
257
- react_1.default.createElement(x_data_grid_1.DataGrid, { disableRowSelectionOnClick: true, rowHeight: rowHeight, rows: rows, hideFooterSelectedRowCount: true, columns: columns, hideFooter: hideFoot }))));
258
- }
259
- return null;
260
- }
261
- // pick using a path from an object, similar to _.get from lodash with special logic
262
- // for Descriptions from e.g. VCF headers
263
- // @param arr example ['a','b'], obj = {a:{b:'hello}}
264
- // @returns hello (with special addition to grab description also)
265
- function accessNested(arr, obj = {}) {
266
- arr.forEach(elt => {
267
- if (obj) {
268
- obj = obj[elt];
269
- }
270
- });
271
- return typeof obj === 'string'
272
- ? obj
273
- : typeof (obj === null || obj === void 0 ? void 0 : obj.Description) === 'string'
274
- ? obj.Description
275
- : undefined;
276
- }
277
- function generateMaxWidth(array, prefix) {
278
- const arr = [];
279
- array.forEach(key => {
280
- const val = [...prefix, key[0]].join('.');
281
- arr.push((0, util_1.measureText)(val, 12));
282
- });
283
- return Math.ceil(Math.max(...arr)) + 10;
284
- }
285
- function UriAttribute({ value, prefix, name, }) {
286
- const { classes } = (0, exports.useStyles)();
287
- const { uri, baseUri = '' } = value;
288
- let href;
289
- try {
290
- href = new URL(uri, baseUri).href;
291
- }
292
- catch (e) {
293
- href = uri;
294
- }
295
- return (react_1.default.createElement("div", { className: classes.field },
296
- react_1.default.createElement(exports.FieldName, { prefix: prefix, name: name }),
297
- react_1.default.createElement(exports.BasicValue, { value: href })));
298
- }
299
- function Attributes(props) {
300
- const { attributes, omit = [], omitSingleLevel = [], descriptions, formatter = val => val, hideUris, prefix = [], } = props;
301
- const omits = new Set([...omit, ...globalOmit, ...omitSingleLevel]);
302
- const { __jbrowsefmt, ...rest } = attributes;
303
- const formattedAttributes = { ...rest, ...__jbrowsefmt };
304
- const maxLabelWidth = generateMaxWidth(Object.entries(formattedAttributes).filter(([k, v]) => v !== undefined && !omits.has(k)), prefix);
305
- return (react_1.default.createElement(react_1.default.Fragment, null, Object.entries(formattedAttributes)
306
- .filter(([k, v]) => v !== undefined && !omits.has(k))
307
- .map(([key, value]) => {
308
- const description = accessNested([...prefix, key], descriptions);
309
- if (Array.isArray(value)) {
310
- // check if it looks like an array of objects, which could be used
311
- // in data grid
312
- return value.length > 1 && value.every(val => (0, is_object_1.default)(val)) ? (react_1.default.createElement(DataGridDetails, { key: key, name: key, prefix: prefix, value: value })) : (react_1.default.createElement(ArrayValue, { key: key, name: key, value: value, description: description, prefix: prefix }));
313
- }
314
- else if ((0, is_object_1.default)(value)) {
315
- const { omitSingleLevel, ...rest } = props;
316
- return (0, util_1.isUriLocation)(value) ? (hideUris ? null : (react_1.default.createElement(UriAttribute, { key: key, name: key, prefix: prefix, value: value }))) : (react_1.default.createElement(Attributes, { ...rest, key: key, attributes: value, descriptions: descriptions, prefix: [...prefix, key] }));
317
- }
318
- else {
319
- return (react_1.default.createElement(SimpleValue, { key: key, name: key, value: formatter(value, key), description: description, prefix: prefix, width: Math.min(maxLabelWidth, MAX_FIELD_NAME_WIDTH) }));
320
- }
321
- })));
322
- }
323
- exports.Attributes = Attributes;
324
119
  const BaseAttributes = (props) => {
325
120
  const { feature } = props;
326
121
  return (react_1.default.createElement(BaseCard, { ...props, title: "Attributes" },
327
- react_1.default.createElement(Attributes, { ...props, attributes: feature })));
122
+ react_1.default.createElement(Attributes_1.default, { ...props, attributes: feature })));
328
123
  };
329
124
  exports.BaseAttributes = BaseAttributes;
330
- function isEmpty(obj) {
331
- return Object.keys(obj).length === 0;
332
- }
333
- function generateTitle(name, id, type) {
334
- return [(0, util_2.ellipses)(`${name}` || `${id}`), `${type}`]
335
- .filter(f => !!f)
336
- .join(' - ');
337
- }
338
125
  function FeatureDetails(props) {
339
126
  const { omit = [], model, feature, depth = 0 } = props;
340
127
  const { mate, name = '', id = '', type = '', subfeatures, uniqueId } = feature;
@@ -345,7 +132,7 @@ function FeatureDetails(props) {
345
132
  feature,
346
133
  model,
347
134
  });
348
- return (react_1.default.createElement(BaseCard, { title: generateTitle(name, id, type) },
135
+ return (react_1.default.createElement(BaseCard, { title: (0, util_2.generateTitle)(name, id, type) },
349
136
  react_1.default.createElement(material_1.Typography, null, "Core details"),
350
137
  react_1.default.createElement(CoreDetails, { ...props }),
351
138
  mate ? (react_1.default.createElement(react_1.default.Fragment, null,
@@ -354,8 +141,8 @@ function FeatureDetails(props) {
354
141
  react_1.default.createElement(CoreDetails, { ...props, feature: { ...mate, uniqueId: uniqueId + '-mate' } }))) : null,
355
142
  react_1.default.createElement(material_1.Divider, null),
356
143
  react_1.default.createElement(material_1.Typography, null, "Attributes"),
357
- react_1.default.createElement(Attributes, { attributes: feature, ...props, omit: omit, omitSingleLevel: coreDetails }),
358
- react_1.default.createElement(react_error_boundary_1.ErrorBoundary, { FallbackComponent: ({ error }) => react_1.default.createElement(ui_1.ErrorMessage, { error: error }) },
144
+ react_1.default.createElement(Attributes_1.default, { attributes: feature, ...props, omit: omit, omitSingleLevel: coreDetails }),
145
+ react_1.default.createElement(react_error_boundary_1.ErrorBoundary, { FallbackComponent: e => react_1.default.createElement(ui_1.ErrorMessage, { error: e.error }) },
359
146
  react_1.default.createElement(SequenceFeatureDetails_1.default, { ...props })),
360
147
  ExtraPanel ? (react_1.default.createElement(react_1.default.Fragment, null,
361
148
  react_1.default.createElement(material_1.Divider, null),
@@ -377,5 +164,7 @@ exports.default = (0, mobx_react_1.observer)(function ({ model }) {
377
164
  // config guide. this replacement happens both here and when snapshotting the
378
165
  // featureData
379
166
  const g = JSON.parse(JSON.stringify(featureData, (_, v) => (v === undefined ? null : v)));
380
- return isEmpty(g) ? null : react_1.default.createElement(FeatureDetails, { model: model, feature: g });
167
+ return (0, util_2.isEmpty)(g) ? null : react_1.default.createElement(FeatureDetails, { model: model, feature: g });
381
168
  });
169
+ var Attributes_2 = require("./Attributes");
170
+ Object.defineProperty(exports, "Attributes", { enumerable: true, get: function () { return __importDefault(Attributes_2).default; } });
@@ -2,3 +2,4 @@ export declare function isEmpty(obj: Record<string, unknown>): boolean;
2
2
  export declare function generateTitle(name: unknown, id: unknown, type: unknown): string;
3
3
  export declare function generateMaxWidth(array: unknown[][], prefix: string[]): number;
4
4
  export declare function toLocale(n: number): string;
5
+ export declare function accessNested(arr: string[], obj?: Record<string, unknown>): string | undefined;
@@ -1,6 +1,10 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toLocale = exports.generateMaxWidth = exports.generateTitle = exports.isEmpty = void 0;
6
+ exports.accessNested = exports.toLocale = exports.generateMaxWidth = exports.generateTitle = exports.isEmpty = void 0;
7
+ const is_object_1 = __importDefault(require("is-object"));
4
8
  const util_1 = require("../../util");
5
9
  const util_2 = require("../util");
6
10
  function isEmpty(obj) {
@@ -21,3 +25,22 @@ function toLocale(n) {
21
25
  return n.toLocaleString('en-US');
22
26
  }
23
27
  exports.toLocale = toLocale;
28
+ // pick using a path from an object, similar to _.get from lodash with special
29
+ // logic for Descriptions from e.g. VCF headers
30
+ //
31
+ // @param arr example ['a','b'], obj = {a:{b:'hello}}
32
+ // @returns hello (with special addition to grab description also)
33
+ function accessNested(arr, obj = {}) {
34
+ let obj2 = obj;
35
+ arr.forEach(elt => {
36
+ if ((0, is_object_1.default)(obj2)) {
37
+ obj2 = obj2[elt];
38
+ }
39
+ });
40
+ return typeof obj2 === 'string'
41
+ ? obj2
42
+ : (0, is_object_1.default)(obj2) && typeof (obj2 === null || obj2 === void 0 ? void 0 : obj2.Description) === 'string'
43
+ ? obj2.Description
44
+ : undefined;
45
+ }
46
+ exports.accessNested = accessNested;
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  import { Feat } from '../util';
2
3
  export default function CDNASequence({ utr, cds, exons, sequence, upstream, downstream, includeIntrons, collapseIntron, intronBp, }: {
3
4
  utr: Feat[];
@@ -9,4 +10,4 @@ export default function CDNASequence({ utr, cds, exons, sequence, upstream, down
9
10
  includeIntrons?: boolean;
10
11
  collapseIntron?: boolean;
11
12
  intronBp: number;
12
- }): JSX.Element;
13
+ }): React.JSX.Element;
@@ -1,5 +1,6 @@
1
+ import React from 'react';
1
2
  import { Feat } from '../util';
2
3
  export default function CDSSequence({ cds, sequence, }: {
3
4
  cds: Feat[];
4
5
  sequence: string;
5
- }): JSX.Element;
6
+ }): React.JSX.Element;
@@ -1,5 +1,6 @@
1
+ import React from 'react';
1
2
  export default function GenomicSequence({ sequence, upstream, downstream, }: {
2
3
  sequence: string;
3
4
  upstream?: string;
4
5
  downstream?: string;
5
- }): JSX.Element;
6
+ }): React.JSX.Element;