@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11
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.
- package/README.md +1709 -390
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +34 -3
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +530 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +490 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +528 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +26 -11
- package/esm/configuration/index.js +16 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/plot.d.ts +61 -0
- package/esm/configuration/plot.js +142 -0
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
- package/esm/pluggableElementTypes/DisplayType.js +28 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
- package/esm/pluggableElementTypes/WidgetType.js +6 -0
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +2 -9
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
- package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -50
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/TimeTraveller.d.ts +3 -0
- package/esm/util/TimeTraveller.js +34 -2
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/baseDisplayConfig.d.ts +8 -0
- package/esm/util/baseDisplayConfig.js +27 -0
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +16 -6
- package/esm/util/cachedSetup.js +108 -38
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/cellMatches.d.ts +23 -0
- package/esm/util/cellMatches.js +264 -0
- package/esm/util/cellsStep.d.ts +29 -0
- package/esm/util/cellsStep.js +437 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/copyToClipboard.js +8 -1
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +81 -0
- package/esm/util/featureTransforms.js +1231 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/formatBytes.js +1 -1
- package/esm/util/formatGuessers.d.ts +25 -14
- package/esm/util/formatGuessers.js +42 -27
- package/esm/util/formatRelativeTime.js +1 -1
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/getLocationUri.d.ts +2 -1
- package/esm/util/getLocationUri.js +8 -2
- package/esm/util/groupKeys.d.ts +76 -0
- package/esm/util/groupKeys.js +156 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/intervals.js +9 -4
- package/esm/util/io/index.js +22 -15
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +32 -57
- package/esm/util/jexlFilters.js +31 -29
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/locString.js +5 -2
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +885 -0
- package/esm/util/markEncodingTypes.d.ts +595 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/springAnimate.js +1 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +96 -0
- package/esm/util/stepTables.js +277 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +19 -10
- package/esm/util/tabix.js +19 -14
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +120 -66
- package/esm/util/tracks.js +501 -151
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +53 -0
- package/esm/util/unknownSnapshotKeys.js +76 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanZoom.js +10 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRafCommit.js +1 -0
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withFeatureDetails.js +4 -0
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +75 -24
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FeatureFormatter } from '../types.tsx';
|
|
1
|
+
import type { FeatureFormatter, FieldActions } from '../types.tsx';
|
|
2
2
|
/**
|
|
3
3
|
* An array of objects renders each element as its own `Attributes` block and
|
|
4
4
|
* draws no label row at this level; anything else is one labelled row like any
|
|
@@ -7,11 +7,12 @@ import type { FeatureFormatter } from '../types.tsx';
|
|
|
7
7
|
* to make the same call.
|
|
8
8
|
*/
|
|
9
9
|
export declare function isObjectArray(value: unknown[]): value is Record<string, unknown>[];
|
|
10
|
-
export default function ArrayValue({ name, value, description, formatter, prefix, width, }: {
|
|
10
|
+
export default function ArrayValue({ name, value, description, formatter, fieldActions, prefix, width, }: {
|
|
11
11
|
description?: React.ReactNode;
|
|
12
12
|
name: string;
|
|
13
13
|
value: unknown[];
|
|
14
14
|
formatter?: FeatureFormatter;
|
|
15
|
+
fieldActions?: FieldActions;
|
|
15
16
|
prefix?: string[];
|
|
16
17
|
width?: number;
|
|
17
18
|
}): import("react").JSX.Element;
|
|
@@ -4,6 +4,7 @@ import { isObject } from '../../util/index.js';
|
|
|
4
4
|
import { makeStyles } from '../../util/tss-react/index.js';
|
|
5
5
|
import Attributes from './Attributes.js';
|
|
6
6
|
import BasicValue from './BasicValue.js';
|
|
7
|
+
import FieldActionsButton, { useRevealFieldActions, } from './FieldActionsButton.js';
|
|
7
8
|
import FieldName from './FieldName.js';
|
|
8
9
|
const MAX_ARRAY_LENGTH = 100;
|
|
9
10
|
// Numeric arrays (e.g. base-modification probabilities, per-base scores) are
|
|
@@ -17,11 +18,9 @@ const useStyles = makeStyles()(theme => ({
|
|
|
17
18
|
},
|
|
18
19
|
fieldSubvalue: {
|
|
19
20
|
wordBreak: 'break-word',
|
|
20
|
-
maxHeight: 300,
|
|
21
21
|
padding: theme.spacing(0.5),
|
|
22
22
|
border: `1px solid ${theme.palette.action.selected}`,
|
|
23
23
|
boxSizing: 'border-box',
|
|
24
|
-
overflow: 'auto',
|
|
25
24
|
},
|
|
26
25
|
}));
|
|
27
26
|
/**
|
|
@@ -34,8 +33,9 @@ const useStyles = makeStyles()(theme => ({
|
|
|
34
33
|
export function isObjectArray(value) {
|
|
35
34
|
return value.every(isObject);
|
|
36
35
|
}
|
|
37
|
-
export default function ArrayValue({ name, value, description, formatter, prefix = [], width, }) {
|
|
38
|
-
const { classes } = useStyles();
|
|
36
|
+
export default function ArrayValue({ name, value, description, formatter, fieldActions, prefix = [], width, }) {
|
|
37
|
+
const { classes, cx } = useStyles();
|
|
38
|
+
const reveal = useRevealFieldActions();
|
|
39
39
|
const [showAll, setShowAll] = useState(false);
|
|
40
40
|
const limit = value.every(v => typeof v === 'number')
|
|
41
41
|
? MAX_NUMERIC_ARRAY_LENGTH
|
|
@@ -44,7 +44,7 @@ export default function ArrayValue({ name, value, description, formatter, prefix
|
|
|
44
44
|
const displayedValues = needsTruncation && !showAll ? value.slice(0, limit) : value;
|
|
45
45
|
return isObjectArray(value) ? (value.length === 1 ? (_jsx(Attributes, { formatter: formatter, attributes: value[0], prefix: [...prefix, name] })) : (_jsx(_Fragment, { children: value.map((val, i) => (_jsx(Attributes
|
|
46
46
|
// eslint-disable-next-line @eslint-react/no-array-index-key -- static positional list of attribute objects, no unique field available
|
|
47
|
-
, { formatter: formatter, attributes: val, prefix: [...prefix, `${name}-${i}`] }, i))) }))) : (_jsxs("div", { className: classes.field, children: [_jsx(FieldName, { prefix: prefix, description: description, name: name, width: width }), value.length === 1 ? (_jsx(BasicValue, { value: formatter ? formatter(value[0], name, 0) : value[0] })) : (_jsxs(_Fragment, { children: [displayedValues.map((val, i) => (_jsx("div", { className: classes.fieldSubvalue, children: _jsx(BasicValue, { value: formatter ? formatter(val, name, i) : val }) }, `${String(val)}-${i}`))), needsTruncation ? (_jsx("button", { type: "button", onClick: () => {
|
|
47
|
+
, { formatter: formatter, attributes: val, prefix: [...prefix, `${name}-${i}`] }, i))) }))) : (_jsxs("div", { className: cx(classes.field, reveal), children: [_jsx(FieldName, { prefix: prefix, description: description, name: name, width: width }), value.length === 1 ? (_jsxs(_Fragment, { children: [_jsx(BasicValue, { value: formatter ? formatter(value[0], name, 0) : value[0] }), _jsx(FieldActionsButton, { path: [...prefix, name], value: value[0], fieldActions: fieldActions })] })) : (_jsxs(_Fragment, { children: [displayedValues.map((val, i) => (_jsx("div", { className: classes.fieldSubvalue, children: _jsx(BasicValue, { value: formatter ? formatter(val, name, i) : val }) }, `${String(val)}-${i}`))), needsTruncation ? (_jsx("button", { type: "button", onClick: () => {
|
|
48
48
|
setShowAll(v => !v);
|
|
49
49
|
}, children: showAll
|
|
50
50
|
? 'Show less'
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import type { Descriptors, FeatureFormatter } from '../types.tsx';
|
|
1
|
+
import type { Descriptors, FeatureFormatter, FieldActions } from '../types.tsx';
|
|
2
2
|
export default function Attributes(props: {
|
|
3
|
-
attributes:
|
|
4
|
-
[key: string]: unknown;
|
|
5
|
-
__jbrowsefmt?: Record<string, unknown>;
|
|
6
|
-
};
|
|
3
|
+
attributes: Record<string, unknown>;
|
|
7
4
|
omit?: string[];
|
|
8
5
|
omitSingleLevel?: string[];
|
|
9
6
|
formatter?: FeatureFormatter;
|
|
7
|
+
fieldActions?: FieldActions;
|
|
10
8
|
descriptions?: Descriptors;
|
|
11
9
|
prefix?: string[];
|
|
12
10
|
hideUris?: boolean;
|
|
@@ -3,8 +3,8 @@ import { Suspense, lazy } from 'react';
|
|
|
3
3
|
import { isLocalPathLocation, isObject, isUriLocation, measureText, } from '../../util/index.js';
|
|
4
4
|
import ArrayValue, { isObjectArray } from './ArrayValue.js';
|
|
5
5
|
import SimpleField from './SimpleField.js';
|
|
6
|
-
import
|
|
7
|
-
import { accessNested
|
|
6
|
+
import UriField from './UriField.js';
|
|
7
|
+
import { accessNested } from './util.js';
|
|
8
8
|
// Lazy: reaches @mui/x-data-grid, and this module sits on the eager startup
|
|
9
9
|
// path via product-core's ui barrel (AboutDialog -> AboutDialogContents).
|
|
10
10
|
// Only a homogeneous object array actually renders a grid.
|
|
@@ -27,7 +27,6 @@ function isHomogeneousObjectArray(arr) {
|
|
|
27
27
|
}
|
|
28
28
|
// these are always omitted as too detailed
|
|
29
29
|
const globalOmit = [
|
|
30
|
-
'__jbrowsefmt',
|
|
31
30
|
'length',
|
|
32
31
|
'position',
|
|
33
32
|
'subfeatures',
|
|
@@ -47,22 +46,38 @@ const globalOmit = [
|
|
|
47
46
|
'cdsStartStat',
|
|
48
47
|
'cdsEndStat',
|
|
49
48
|
];
|
|
49
|
+
function isLocation(value) {
|
|
50
|
+
return isUriLocation(value) || isLocalPathLocation(value);
|
|
51
|
+
}
|
|
52
|
+
// hideUris prunes the data rather than each render branch checking: an array
|
|
53
|
+
// of objects reaches the data grid and ArrayValue, which print locations too
|
|
54
|
+
function withoutLocations(attributes) {
|
|
55
|
+
return Object.fromEntries(Object.entries(attributes)
|
|
56
|
+
.filter(([, value]) => !isLocation(value))
|
|
57
|
+
.map(([key, value]) => [key, valueWithoutLocations(value)]));
|
|
58
|
+
}
|
|
59
|
+
function valueWithoutLocations(value) {
|
|
60
|
+
return Array.isArray(value)
|
|
61
|
+
? value.filter(v => !isLocation(v)).map(valueWithoutLocations)
|
|
62
|
+
: isObject(value)
|
|
63
|
+
? withoutLocations(value)
|
|
64
|
+
: value;
|
|
65
|
+
}
|
|
50
66
|
/**
|
|
51
67
|
* The widest label `Attributes` will actually render under `attributes`, in
|
|
52
68
|
* text units — the padding is added once by `widestLabel`, not per level.
|
|
53
69
|
*
|
|
54
70
|
* Follows the same branches the render below does: a flat array is one labelled
|
|
55
|
-
* row
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* together, and `Attributes.test.tsx` fails if they stop.
|
|
71
|
+
* row, an array of objects renders each element as its own block with no label
|
|
72
|
+
* at this level, a data grid heads its own grid rather than sharing a row, a
|
|
73
|
+
* `UriLocation` is one field, any other object recurses. `Attributes.test.tsx`
|
|
74
|
+
* fails if the two stop agreeing.
|
|
60
75
|
*/
|
|
61
76
|
function measureLabels(attributes, opts) {
|
|
62
|
-
const { omits, deepOmits,
|
|
77
|
+
const { omits, deepOmits, prefix } = opts;
|
|
63
78
|
let widest = 0;
|
|
64
79
|
const measure = (key) => measureText([...prefix, key].join('.'), FIELD_NAME_FONT_SIZE);
|
|
65
|
-
for (const [key, value] of Object.entries(
|
|
80
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
66
81
|
if (value == null || omits.has(key)) {
|
|
67
82
|
continue;
|
|
68
83
|
}
|
|
@@ -74,15 +89,11 @@ function measureLabels(attributes, opts) {
|
|
|
74
89
|
}
|
|
75
90
|
}
|
|
76
91
|
else if (isObject(value)) {
|
|
77
|
-
if (hideUris && (isUriLocation(value) || isLocalPathLocation(value))) {
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
92
|
widest = Math.max(widest, isUriLocation(value)
|
|
81
93
|
? measure(key)
|
|
82
94
|
: measureLabels(value, {
|
|
83
95
|
omits: deepOmits,
|
|
84
96
|
deepOmits,
|
|
85
|
-
hideUris,
|
|
86
97
|
prefix: [...prefix, key],
|
|
87
98
|
}));
|
|
88
99
|
}
|
|
@@ -96,9 +107,12 @@ function widestLabel(attributes, opts) {
|
|
|
96
107
|
return Math.ceil(measureLabels(attributes, opts)) + FIELD_NAME_PADDING;
|
|
97
108
|
}
|
|
98
109
|
export default function Attributes(props) {
|
|
99
|
-
const {
|
|
110
|
+
const { omit = [], omitSingleLevel = [], descriptions, formatter, fieldActions, hideUris, prefix = [], labelWidth, } = props;
|
|
111
|
+
const attributes = hideUris
|
|
112
|
+
? withoutLocations(props.attributes)
|
|
113
|
+
: props.attributes;
|
|
100
114
|
const omits = new Set([...omit, ...globalOmit, ...omitSingleLevel]);
|
|
101
|
-
const
|
|
115
|
+
const shown = Object.entries(attributes).filter(([k, v]) => v != null && !omits.has(k));
|
|
102
116
|
// Measured over the whole subtree on the outermost call, then handed down, so
|
|
103
117
|
// one card has one label column. Per-level measurement put `type`/`trackId` in
|
|
104
118
|
// a narrow column, `adapter.type` in a wider one and `adapter.craiLocation` in
|
|
@@ -112,30 +126,21 @@ export default function Attributes(props) {
|
|
|
112
126
|
deepOmits: omitSingleLevel.length
|
|
113
127
|
? new Set([...omit, ...globalOmit])
|
|
114
128
|
: omits,
|
|
115
|
-
hideUris,
|
|
116
129
|
prefix,
|
|
117
130
|
}), MAX_FIELD_NAME_WIDTH);
|
|
118
|
-
return (_jsx(_Fragment, { children:
|
|
131
|
+
return (_jsx(_Fragment, { children: shown.map(([key, value]) => {
|
|
119
132
|
const description = accessNested([...prefix, key], descriptions);
|
|
120
133
|
if (Array.isArray(value)) {
|
|
121
134
|
// Only use the data grid when schemas are homogeneous enough;
|
|
122
135
|
// heterogeneous arrays fall through to ArrayValue which renders
|
|
123
136
|
// each object as individual field sections instead of disappearing
|
|
124
|
-
return isHomogeneousObjectArray(value) ? (_jsx(Suspense, { fallback: null, children: _jsx(DataGridDetails, { name: key, prefix: prefix, value: value }) }, key)) : (_jsx(ArrayValue, { name: key, value: value, formatter: formatter, description: description, prefix: prefix, width: width }, key));
|
|
137
|
+
return isHomogeneousObjectArray(value) ? (_jsx(Suspense, { fallback: null, children: _jsx(DataGridDetails, { name: key, prefix: prefix, value: value }) }, key)) : (_jsx(ArrayValue, { name: key, value: value, formatter: formatter, fieldActions: fieldActions, description: description, prefix: prefix, width: width }, key));
|
|
125
138
|
}
|
|
126
139
|
else if (isObject(value)) {
|
|
127
|
-
|
|
128
|
-
// says that as plainly as a UriLocation does — it is what desktop and
|
|
129
|
-
// `jbrowse add-track --load copy` write — and it used to fall through
|
|
130
|
-
// to the recursive branch below and print the path in full
|
|
131
|
-
if (hideUris &&
|
|
132
|
-
(isUriLocation(value) || isLocalPathLocation(value))) {
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
return isUriLocation(value) ? (_jsx(UriAttribute, { name: key, prefix: prefix, value: value, width: width }, key)) : (_jsx(Attributes, { attributes: value, omit: omit, descriptions: descriptions, formatter: formatter, hideUris: hideUris, prefix: [...prefix, key], labelWidth: width }, key));
|
|
140
|
+
return isUriLocation(value) ? (_jsx(UriField, { name: key, prefix: prefix, value: value, width: width }, key)) : (_jsx(Attributes, { attributes: value, omit: omit, descriptions: descriptions, formatter: formatter, fieldActions: fieldActions, prefix: [...prefix, key], labelWidth: width }, key));
|
|
136
141
|
}
|
|
137
142
|
else {
|
|
138
|
-
return (_jsx(SimpleField, { name: key, formatter: formatter, value: value, description: description, prefix: prefix, width: width }, key));
|
|
143
|
+
return (_jsx(SimpleField, { name: key, formatter: formatter, fieldActions: fieldActions, value: value, description: description, prefix: prefix, width: width }, key));
|
|
139
144
|
}
|
|
140
145
|
}) }));
|
|
141
146
|
}
|
|
@@ -7,11 +7,8 @@ const useStyles = makeStyles()(theme => ({
|
|
|
7
7
|
display: 'block',
|
|
8
8
|
padding: theme.spacing(1),
|
|
9
9
|
},
|
|
10
|
-
icon: {
|
|
11
|
-
color: theme.palette.tertiary.contrastText || '#fff',
|
|
12
|
-
},
|
|
13
10
|
}));
|
|
14
11
|
export default function BaseCard({ children, title, defaultExpanded = true, }) {
|
|
15
12
|
const { classes } = useStyles();
|
|
16
|
-
return (_jsxs(Accordion, { defaultExpanded: defaultExpanded, slotProps: { transition: { unmountOnExit: true } }, "data-testid": `BaseCard-${title}`, children: [_jsx(AccordionSummary, { expandIcon: _jsx(ExpandMore, {
|
|
13
|
+
return (_jsxs(Accordion, { defaultExpanded: defaultExpanded, slotProps: { transition: { unmountOnExit: true } }, "data-testid": `BaseCard-${title}`, children: [_jsx(AccordionSummary, { expandIcon: _jsx(ExpandMore, {}), children: _jsx(Typography, { variant: "button", children: title }) }), _jsx(AccordionDetails, { className: classes.expansionPanelDetails, children: children })] }));
|
|
17
14
|
}
|
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
export declare function isBareUrl(text: string): boolean;
|
|
2
|
+
export declare function valueText(value: unknown): string;
|
|
3
|
+
/**
|
|
4
|
+
* A value that is nothing but a URL is a link; anything else goes through
|
|
5
|
+
* SanitizedHTML, which renders markup and links URLs inside longer text. Both
|
|
6
|
+
* open in a new tab: navigating in place discards the session, and in an
|
|
7
|
+
* embedded JBrowse it takes the host page with it.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ValueText({ text }: {
|
|
10
|
+
text: string;
|
|
11
|
+
}): import("react").JSX.Element;
|
|
1
12
|
export default function BasicValue({ value }: {
|
|
2
13
|
value: unknown;
|
|
3
14
|
}): import("react").JSX.Element;
|
|
@@ -1,27 +1,50 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { isValidElement } from 'react';
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { isValidElement, useState } from 'react';
|
|
3
3
|
import { Link } from '@mui/material';
|
|
4
4
|
import { SanitizedHTML } from '../../ui/index.js';
|
|
5
5
|
import { isObject } from '../../util/index.js';
|
|
6
6
|
import { makeStyles } from '../../util/tss-react/index.js';
|
|
7
|
+
import useMeasure from '../../util/useMeasure.js';
|
|
8
|
+
const CLAMP_HEIGHT = 300;
|
|
7
9
|
const useStyles = makeStyles()(theme => ({
|
|
8
10
|
fieldValue: {
|
|
9
11
|
wordBreak: 'break-word',
|
|
10
|
-
maxHeight: 300,
|
|
11
12
|
fontSize: 12,
|
|
12
13
|
padding: theme.spacing(0.5),
|
|
13
|
-
|
|
14
|
+
minWidth: 0,
|
|
15
|
+
},
|
|
16
|
+
clip: {
|
|
17
|
+
overflowX: 'auto',
|
|
18
|
+
overflowY: 'hidden',
|
|
19
|
+
},
|
|
20
|
+
clamped: {
|
|
21
|
+
maxHeight: CLAMP_HEIGHT,
|
|
22
|
+
},
|
|
23
|
+
faded: {
|
|
24
|
+
maskImage: 'linear-gradient(to bottom, black 75%, transparent)',
|
|
14
25
|
},
|
|
15
26
|
}));
|
|
27
|
+
export function isBareUrl(text) {
|
|
28
|
+
return /^https?:\/\/\S+$/.test(text);
|
|
29
|
+
}
|
|
30
|
+
export function valueText(value) {
|
|
31
|
+
return isObject(value) ? JSON.stringify(value) : String(value);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A value that is nothing but a URL is a link; anything else goes through
|
|
35
|
+
* SanitizedHTML, which renders markup and links URLs inside longer text. Both
|
|
36
|
+
* open in a new tab: navigating in place discards the session, and in an
|
|
37
|
+
* embedded JBrowse it takes the host page with it.
|
|
38
|
+
*/
|
|
39
|
+
export function ValueText({ text }) {
|
|
40
|
+
return isBareUrl(text) ? (_jsx(Link, { href: text, target: "_blank", rel: "noopener noreferrer", children: text })) : (_jsx(SanitizedHTML, { html: text }));
|
|
41
|
+
}
|
|
16
42
|
export default function BasicValue({ value }) {
|
|
17
|
-
const { classes } = useStyles();
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
// page with it.
|
|
25
|
-
const isLink = /^https?:\/\//.test(`${value}`);
|
|
26
|
-
return (_jsx("div", { className: classes.fieldValue, children: isValidElement(value) ? (value) : isLink ? (_jsx(Link, { href: `${value}`, target: "_blank", rel: "noopener noreferrer", children: `${value}` })) : (_jsx(SanitizedHTML, { html: isObject(value) ? JSON.stringify(value) : String(value) })) }));
|
|
43
|
+
const { classes, cx } = useStyles();
|
|
44
|
+
const [expanded, setExpanded] = useState(false);
|
|
45
|
+
const [ref, { height }] = useMeasure('height');
|
|
46
|
+
const overflows = height !== undefined && height > CLAMP_HEIGHT;
|
|
47
|
+
return (_jsxs("div", { className: classes.fieldValue, children: [_jsx("div", { className: cx(classes.clip, !expanded && classes.clamped, !expanded && overflows && classes.faded), children: _jsx("div", { ref: ref, children: isValidElement(value) ? (value) : (_jsx(ValueText, { text: valueText(value) })) }) }), overflows ? (_jsx(Link, { component: "button", variant: "caption", onClick: () => {
|
|
48
|
+
setExpanded(v => !v);
|
|
49
|
+
}, children: expanded ? 'Show less' : 'Show more' })) : null] }));
|
|
27
50
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { BaseProps } from '../types.tsx';
|
|
2
|
-
export default function CoreDetails(
|
|
2
|
+
export default function CoreDetails({ feature }: BaseProps): import("react").JSX.Element;
|
|
@@ -1,35 +1,19 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { toLocale } from '../../util/index.js';
|
|
3
|
-
import
|
|
2
|
+
import { assembleLocString, toLocale } from '../../util/index.js';
|
|
3
|
+
import { getStrandStr } from '../util.js';
|
|
4
4
|
import SimpleField from './SimpleField.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
// feature's own `length`, if any, stays ignored: it is in Attributes'
|
|
16
|
-
// globalOmit precisely because adapters use it as bookkeeping.
|
|
17
|
-
length: isFormattedField(feature, 'length')
|
|
18
|
-
? formattedFeat.length
|
|
19
|
-
: toLocale(end - start),
|
|
20
|
-
};
|
|
21
|
-
// array (not object) so the display order is explicit, not reliant on JS key
|
|
22
|
-
// insertion order
|
|
23
|
-
const coreRenderedDetails = [
|
|
24
|
-
['name', 'Name'],
|
|
25
|
-
['description', 'Description'],
|
|
26
|
-
['length', 'Length'],
|
|
27
|
-
['type', 'Type'],
|
|
5
|
+
export default function CoreDetails({ feature }) {
|
|
6
|
+
const { name, description, type, start, end, strand } = feature;
|
|
7
|
+
// only a formatDetails callback sets `length`, to rewrite or hide the row:
|
|
8
|
+
// an adapter's own field of that name is in Attributes' globalOmit
|
|
9
|
+
const length = 'length' in feature ? feature.length : end - start;
|
|
10
|
+
const rows = [
|
|
11
|
+
['Name', name],
|
|
12
|
+
['Description', description],
|
|
13
|
+
['Length', typeof length === 'number' ? toLocale(length) : length],
|
|
14
|
+
['Type', type],
|
|
28
15
|
];
|
|
29
|
-
return (_jsxs(_Fragment, { children: [_jsx(SimpleField, { name: "Position", value:
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const value = displayedDetails[key];
|
|
33
|
-
return (_jsx(SimpleField, { name: name, value: Array.isArray(value) ? value.join(', ') : value }, name));
|
|
34
|
-
})] }));
|
|
16
|
+
return (_jsxs(_Fragment, { children: [_jsx(SimpleField, { name: "Position", value: [assembleLocString(feature), getStrandStr(strand)]
|
|
17
|
+
.filter(Boolean)
|
|
18
|
+
.join(' ') }), rows.map(([label, value]) => (_jsx(SimpleField, { name: label, value: Array.isArray(value) ? value.join(', ') : value }, label)))] }));
|
|
35
19
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { SimpleFeatureSerialized } from '../../util/index.ts';
|
|
2
|
-
import type { Descriptors, FeatureFormatter } from '../types.tsx';
|
|
3
|
-
import type { IAnyStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
import type { Descriptors, FeatureDetailsModel, FeatureFormatter, FieldActions } from '../types.tsx';
|
|
4
3
|
interface FeatureDetailsProps {
|
|
5
|
-
model:
|
|
4
|
+
model: FeatureDetailsModel;
|
|
6
5
|
feature: SimpleFeatureSerialized;
|
|
6
|
+
unformatted?: SimpleFeatureSerialized;
|
|
7
7
|
depth?: number;
|
|
8
8
|
omit?: string[];
|
|
9
9
|
descriptions?: Descriptors;
|
|
10
10
|
formatter?: FeatureFormatter;
|
|
11
|
+
fieldActions?: FieldActions;
|
|
11
12
|
}
|
|
12
13
|
declare const FeatureDetails: (props: FeatureDetailsProps) => import("react").JSX.Element;
|
|
13
14
|
export default FeatureDetails;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Fragment } from 'react';
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
2
|
import { Divider, Typography } from '@mui/material';
|
|
4
3
|
import { observer } from 'mobx-react';
|
|
5
4
|
import { ErrorBoundary } from '../../ui/ErrorBoundary.js';
|
|
@@ -14,12 +13,7 @@ import { generateTitle } from './util.js';
|
|
|
14
13
|
function SectionHeader({ title }) {
|
|
15
14
|
return _jsx(Typography, { variant: "overline", children: title });
|
|
16
15
|
}
|
|
17
|
-
|
|
18
|
-
function joinByDivider(nodes) {
|
|
19
|
-
return nodes.map((node, i) => (_jsxs(Fragment, { children: [i > 0 ? _jsx(Divider, {}) : null, node] }, i)));
|
|
20
|
-
}
|
|
21
|
-
// coreDetails are omitted in some circumstances
|
|
22
|
-
const coreDetails = [
|
|
16
|
+
const shownByCoreDetails = [
|
|
23
17
|
'name',
|
|
24
18
|
'start',
|
|
25
19
|
'end',
|
|
@@ -29,30 +23,23 @@ const coreDetails = [
|
|
|
29
23
|
'type',
|
|
30
24
|
];
|
|
31
25
|
const FeatureDetails = observer(function FeatureDetails(props) {
|
|
32
|
-
const { omit = [], model, feature, depth = 0, descriptions, formatter, } = props;
|
|
26
|
+
const { omit = [], model, feature, unformatted = feature, depth = 0, descriptions, formatter, fieldActions, } = props;
|
|
33
27
|
const maxDepth = model.maxDepth ?? Infinity;
|
|
34
|
-
const { mate
|
|
35
|
-
//
|
|
36
|
-
// whether it is under the clicked feature (0) or a nested subfeature card, and
|
|
37
|
-
// it is only defaulted here -- passing raw props left it undefined at the top
|
|
38
|
-
// level, so a panel selecting on `depth === 0` could never match
|
|
28
|
+
const { mate, name = '', id = '', type = '', subfeatures, uniqueId } = feature;
|
|
29
|
+
// a panel selecting on `depth === 0` has to see the default, not undefined
|
|
39
30
|
const panelProps = { ...props, depth };
|
|
40
|
-
return (_jsxs(BaseCard, { title: generateTitle(name, id, type), children: [
|
|
41
|
-
_jsxs(Fragment, { children: [_jsx(SectionHeader, { title: "Core details" }), _jsx(CoreDetails, { ...props })] }, "core"),
|
|
42
|
-
m ? (_jsxs(Fragment, { children: [_jsx(SectionHeader, { title: "Mate details" }), _jsx(CoreDetails, { ...props, feature: { ...m, uniqueId: `${uniqueId}-mate` } })] }, "mate")) : null,
|
|
43
|
-
_jsxs(Fragment, { children: [_jsx(SectionHeader, { title: "Attributes" }), _jsx(Attributes, { attributes: feature, omit: omit, omitSingleLevel: coreDetails, descriptions: descriptions, formatter: formatter })] }, "attributes"),
|
|
44
|
-
].filter(Boolean)), _jsx(ErrorBoundary, { FallbackComponent: e => _jsx(ErrorBanner, { error: e.error }), children: _jsx(SequenceFeatureDetails, { ...props }) }), _jsx(PluggableComponents, { pluginManager: getEnv(model).pluginManager,
|
|
31
|
+
return (_jsxs(BaseCard, { title: generateTitle(name, id, type), children: [_jsx(SectionHeader, { title: "Core details" }), _jsx(CoreDetails, { ...props }), mate ? (_jsxs(_Fragment, { children: [_jsx(Divider, {}), _jsx(SectionHeader, { title: "Mate details" }), _jsx(CoreDetails, { ...props, feature: { ...mate, uniqueId: `${uniqueId}-mate` } }), _jsx(Attributes, { attributes: mate, prefix: ['mate'], omit: omit, omitSingleLevel: shownByCoreDetails, descriptions: descriptions, formatter: formatter, fieldActions: fieldActions })] })) : null, _jsx(Divider, {}), _jsx(SectionHeader, { title: "Attributes" }), _jsx(Attributes, { attributes: feature, omit: omit, omitSingleLevel: [...shownByCoreDetails, 'mate'], descriptions: descriptions, formatter: formatter, fieldActions: fieldActions }), _jsx(ErrorBoundary, { FallbackComponent: e => _jsx(ErrorBanner, { error: e.error }), children: _jsx(SequenceFeatureDetails, { ...props, feature: unformatted }) }), _jsx(PluggableComponents, { pluginManager: getEnv(model).pluginManager,
|
|
45
32
|
/** #extensionPoint Core-extraFeaturePanel | sync | Add extra panels to the feature details widget */
|
|
46
33
|
name: "Core-extraFeaturePanel", props: panelProps }), depth < maxDepth && subfeatures?.length ? (_jsx(BaseCard, { title: "Subfeatures", defaultExpanded: depth === 0 && subfeatures.length <= 20, children: subfeatures.map((sub, idx) => (_jsx(FeatureDetails
|
|
47
34
|
// eslint-disable-next-line @eslint-react/no-array-index-key -- subfeature list order is fixed per feature, no unique field guaranteed by type
|
|
48
35
|
, { feature: {
|
|
49
36
|
...sub,
|
|
50
37
|
uniqueId: `${uniqueId}_${idx}`,
|
|
51
|
-
},
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
38
|
+
}, unformatted: unformatted.subfeatures?.[idx]
|
|
39
|
+
? {
|
|
40
|
+
...unformatted.subfeatures[idx],
|
|
41
|
+
uniqueId: `${uniqueId}_${idx}`,
|
|
42
|
+
}
|
|
43
|
+
: undefined, model: model, depth: depth + 1, descriptions: descriptions, formatter: formatter, fieldActions: fieldActions, omit: omit }, `${uniqueId}_${idx}`))) })) : null] }));
|
|
57
44
|
});
|
|
58
45
|
export default FeatureDetails;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SimpleFeatureSerialized } from '../../util/index.ts';
|
|
2
|
+
import type React from 'react';
|
|
3
|
+
export interface FeatureDetailsFrameModel {
|
|
4
|
+
error?: unknown;
|
|
5
|
+
featureData?: SimpleFeatureSerialized;
|
|
6
|
+
}
|
|
7
|
+
declare const FeatureDetailsFrame: ({ model, children, }: {
|
|
8
|
+
model: FeatureDetailsFrameModel;
|
|
9
|
+
children: React.ReactNode;
|
|
10
|
+
}) => React.JSX.Element;
|
|
11
|
+
export default FeatureDetailsFrame;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Paper, Typography } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
4
|
+
import { ErrorBanner } from '../../ui/index.js';
|
|
5
|
+
import FeatureWash from './FeatureWash.js';
|
|
6
|
+
import { isEmpty } from './util.js';
|
|
7
|
+
const FeatureDetailsFrame = observer(function FeatureDetailsFrame({ model, children, }) {
|
|
8
|
+
const { error, featureData } = model;
|
|
9
|
+
return error ? (_jsx(ErrorBanner, { error: error })) : !featureData || isEmpty(featureData) ? (_jsx(Paper, { sx: { p: 2 }, children: _jsx(Typography, { children: "No feature loaded. It may not be available after a page refresh because it was too large to persist in localStorage." }) })) : (_jsx(FeatureWash, { uniqueId: featureData.uniqueId, children: children }));
|
|
10
|
+
});
|
|
11
|
+
export default FeatureDetailsFrame;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FieldActions } from '../types.tsx';
|
|
2
|
+
/** A class for a field row that shows its FieldActionsButton on hover or focus. */
|
|
3
|
+
export declare function useRevealFieldActions(): string;
|
|
4
|
+
export default function FieldActionsButton({ path, value, fieldActions, }: {
|
|
5
|
+
path: string[];
|
|
6
|
+
value: unknown;
|
|
7
|
+
fieldActions?: FieldActions;
|
|
8
|
+
}): import("react").JSX.Element | null;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import FilterListIcon from '@mui/icons-material/FilterList';
|
|
3
|
+
import CascadingMenuButton from '../../ui/CascadingMenuButton.js';
|
|
4
|
+
import { makeStyles } from '../../util/tss-react/index.js';
|
|
5
|
+
// on a wrapper because MUI folds an Emotion class handed to one of its
|
|
6
|
+
// components into a class of its own, which a selector naming it never matches
|
|
7
|
+
const useStyles = makeStyles()({
|
|
8
|
+
reveal: {
|
|
9
|
+
opacity: 0,
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
/** A class for a field row that shows its FieldActionsButton on hover or focus. */
|
|
13
|
+
export function useRevealFieldActions() {
|
|
14
|
+
const { classes, css } = useStyles();
|
|
15
|
+
const { reveal } = classes;
|
|
16
|
+
return css({
|
|
17
|
+
[`&:hover .${reveal}, &:focus-within .${reveal}`]: { opacity: 1 },
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export default function FieldActionsButton({ path, value, fieldActions, }) {
|
|
21
|
+
const { classes } = useStyles();
|
|
22
|
+
const items = fieldActions?.(path, value) ?? [];
|
|
23
|
+
return items.length > 0 ? (_jsx("span", { className: classes.reveal, children: _jsx(CascadingMenuButton, { menuItems: items, size: "small", tooltip: "Filter by this value", style: { padding: 0 }, children: _jsx(FilterListIcon, { fontSize: "small" }) }) })) : null;
|
|
24
|
+
}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import { useCopyToClipboard } from '../../ui/useCopyToClipboard.js';
|
|
4
|
+
import { ValueText, isBareUrl, valueText } from './BasicValue.js';
|
|
4
5
|
const TRUNCATE_LENGTH = 100;
|
|
5
6
|
// a 'show more...' toggle used as a formatter on feature details: long values
|
|
6
7
|
// (e.g. a SEQ/CRAM string, or a long read's worth of data in a single div) can
|
|
7
|
-
// slow down the rest of the app, so they are truncated until expanded
|
|
8
|
+
// slow down the rest of the app, so they are truncated until expanded. A URL
|
|
9
|
+
// is left whole, since a truncated one links nowhere
|
|
8
10
|
export default function Formatter({ value }) {
|
|
9
11
|
const [show, setShow] = useState(false);
|
|
10
12
|
const { copied, copy } = useCopyToClipboard(700);
|
|
11
|
-
const display =
|
|
12
|
-
return display.length > TRUNCATE_LENGTH ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => {
|
|
13
|
+
const display = valueText(value);
|
|
14
|
+
return display.length > TRUNCATE_LENGTH && !isBareUrl(display) ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => {
|
|
13
15
|
void copy(display);
|
|
14
16
|
}, children: copied ? 'Copied to clipboard' : 'Copy' }), _jsx("button", { type: "button", onClick: () => {
|
|
15
17
|
setShow(val => !val);
|
|
16
|
-
}, children: show ? 'Show less' : 'Show more' }), _jsx("div", { children: show ? display : `${display.slice(0, TRUNCATE_LENGTH)}...` })] })) : (_jsx(
|
|
18
|
+
}, children: show ? 'Show less' : 'Show more' }), _jsx("div", { children: show ? (_jsx(ValueText, { text: display })) : (`${display.slice(0, TRUNCATE_LENGTH)}...`) })] })) : (_jsx(ValueText, { text: display }));
|
|
17
19
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Typography } from '@mui/material';
|
|
3
|
+
import { makeStyles } from '../../util/tss-react/index.js';
|
|
4
|
+
const useStyles = makeStyles()(theme => ({
|
|
5
|
+
line: {
|
|
6
|
+
padding: theme.spacing(0.5, 1, 0),
|
|
7
|
+
},
|
|
8
|
+
}));
|
|
9
|
+
// Which gene a transcript came out of, above the card naming the transcript.
|
|
10
|
+
// The panel is opened on the exact isoform the click resolved to, and that
|
|
11
|
+
// isoform's own record is regularly the only place its accession appears --
|
|
12
|
+
// nothing in `NM_004006.2 - mRNA` says DMD.
|
|
13
|
+
export default function ParentFeatureLine({ parentFeature, }) {
|
|
14
|
+
const { classes } = useStyles();
|
|
15
|
+
const { name, type } = parentFeature;
|
|
16
|
+
return (_jsxs(Typography, { variant: "body2", color: "textSecondary", className: classes.line, "data-testid": "parent-feature-line", children: ["in ", type ? `${type} ` : '', name] }));
|
|
17
|
+
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type { FeatureFormatter } from '../types.tsx';
|
|
2
|
-
export default function SimpleField({ name, value, description, prefix, width, formatter, }: {
|
|
1
|
+
import type { FeatureFormatter, FieldActions } from '../types.tsx';
|
|
2
|
+
export default function SimpleField({ name, value, description, prefix, width, formatter, fieldActions, }: {
|
|
3
3
|
description?: React.ReactNode;
|
|
4
4
|
name: string;
|
|
5
5
|
value: unknown;
|
|
6
6
|
prefix?: string[];
|
|
7
7
|
width?: number;
|
|
8
8
|
formatter?: FeatureFormatter;
|
|
9
|
+
fieldActions?: FieldActions;
|
|
9
10
|
}): import("react").JSX.Element | null;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { makeStyles } from '../../util/tss-react/index.js';
|
|
3
3
|
import BasicValue from './BasicValue.js';
|
|
4
|
+
import FieldActionsButton, { useRevealFieldActions, } from './FieldActionsButton.js';
|
|
4
5
|
import FieldName from './FieldName.js';
|
|
5
6
|
const useStyles = makeStyles()({
|
|
6
7
|
field: {
|
|
@@ -8,7 +9,8 @@ const useStyles = makeStyles()({
|
|
|
8
9
|
flexWrap: 'wrap',
|
|
9
10
|
},
|
|
10
11
|
});
|
|
11
|
-
export default function SimpleField({ name, value, description, prefix, width, formatter, }) {
|
|
12
|
-
const { classes } = useStyles();
|
|
13
|
-
|
|
12
|
+
export default function SimpleField({ name, value, description, prefix, width, formatter, fieldActions, }) {
|
|
13
|
+
const { classes, cx } = useStyles();
|
|
14
|
+
const reveal = useRevealFieldActions();
|
|
15
|
+
return value != null ? (_jsxs("div", { className: cx(classes.field, reveal), children: [_jsx(FieldName, { prefix: prefix, description: description, name: name, width: width }), _jsx(BasicValue, { value: formatter ? formatter(value, name) : value }), _jsx(FieldActionsButton, { path: [...(prefix ?? []), name], value: value, fieldActions: fieldActions })] })) : null;
|
|
14
16
|
}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
declare const BaseFeatureDetail: ({ model, }:
|
|
1
|
+
import type { BaseFeatureWidgetModel } from '../stateModelFactory.ts';
|
|
2
|
+
declare const BaseFeatureDetail: ({ model, }: {
|
|
3
|
+
model: BaseFeatureWidgetModel;
|
|
4
|
+
}) => import("react").JSX.Element;
|
|
3
5
|
export default BaseFeatureDetail;
|
|
4
6
|
export { default as BaseCard } from './BaseCard.tsx';
|
|
5
7
|
export { default as BaseAttributes } from './BaseAttributes.tsx';
|
|
6
8
|
export { default as BaseCoreDetails } from './BaseCoreDetails.tsx';
|
|
7
9
|
export { default as FeatureDetails } from './FeatureDetails.tsx';
|
|
10
|
+
export { default as FeatureDetailsFrame } from './FeatureDetailsFrame.tsx';
|
|
8
11
|
export { default as FeatureWash } from './FeatureWash.tsx';
|
|
12
|
+
export { filterByValueItems, jexlFilterDisplay } from './jexlFilterActions.ts';
|