@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,30 +1,19 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { observer } from 'mobx-react';
|
|
3
|
-
import { ErrorBanner } from '../../ui/index.js';
|
|
4
3
|
import FeatureDetails from './FeatureDetails.js';
|
|
5
|
-
import
|
|
6
|
-
import
|
|
4
|
+
import FeatureDetailsFrame from './FeatureDetailsFrame.js';
|
|
5
|
+
import ParentFeatureLine from './ParentFeatureLine.js';
|
|
7
6
|
const BaseFeatureDetail = observer(function BaseFeatureDetail({ model, }) {
|
|
8
|
-
const {
|
|
7
|
+
const { featureData, unformattedFeatureData, parentFeature } = model;
|
|
9
8
|
// annotated to shed the MST node brand types.frozen() carries on the instance
|
|
10
9
|
const descriptions = model.descriptions;
|
|
11
|
-
|
|
12
|
-
// can't produce null); every detail component filters with `!= null`, so a
|
|
13
|
-
// field set to undefined (live) or null (round-tripped through a snapshot) is
|
|
14
|
-
// dropped identically.
|
|
15
|
-
if (error) {
|
|
16
|
-
return _jsx(ErrorBanner, { error: error });
|
|
17
|
-
}
|
|
18
|
-
else if (!featureData || isEmpty(featureData)) {
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
return (_jsx(FeatureWash, { uniqueId: featureData.uniqueId, children: _jsx(FeatureDetails, { model: model, feature: featureData, descriptions: descriptions }) }));
|
|
23
|
-
}
|
|
10
|
+
return (_jsx(FeatureDetailsFrame, { model: model, children: featureData ? (_jsxs(_Fragment, { children: [parentFeature ? (_jsx(ParentFeatureLine, { parentFeature: parentFeature })) : null, _jsx(FeatureDetails, { model: model, feature: featureData, unformatted: unformattedFeatureData, descriptions: descriptions })] })) : null }));
|
|
24
11
|
});
|
|
25
12
|
export default BaseFeatureDetail;
|
|
26
13
|
export { default as BaseCard } from './BaseCard.js';
|
|
27
14
|
export { default as BaseAttributes } from './BaseAttributes.js';
|
|
28
15
|
export { default as BaseCoreDetails } from './BaseCoreDetails.js';
|
|
29
16
|
export { default as FeatureDetails } from './FeatureDetails.js';
|
|
17
|
+
export { default as FeatureDetailsFrame } from './FeatureDetailsFrame.js';
|
|
30
18
|
export { default as FeatureWash } from './FeatureWash.js';
|
|
19
|
+
export { filterByValueItems, jexlFilterDisplay } from './jexlFilterActions.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { MenuItem } from '../../ui/MenuTypes.ts';
|
|
2
|
+
import type { JexlFilterModel } from '../../util/jexlFilters.ts';
|
|
3
|
+
import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
4
|
+
export interface JexlFilterDisplay extends JexlFilterModel, IStateTreeNode {
|
|
5
|
+
}
|
|
6
|
+
export declare function isJexlFilterDisplay(thing: unknown): thing is JexlFilterDisplay;
|
|
7
|
+
/** The first of a track's displays that takes jexl filters. */
|
|
8
|
+
export declare function jexlFilterDisplay(track?: {
|
|
9
|
+
displays: readonly unknown[];
|
|
10
|
+
}): JexlFilterDisplay | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* "Show only" and "Hide" items for one feature attribute's value, and "Show
|
|
13
|
+
* only ≥" for a number. Each appends a filter line to the display and offers
|
|
14
|
+
* an undo.
|
|
15
|
+
*/
|
|
16
|
+
export declare function filterByValueItems(display: JexlFilterDisplay, path: string[], value: unknown): MenuItem[];
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { pathSubject, printCondition } from '@jbrowse/jexl';
|
|
2
|
+
import { ensureJexlPrefix } from '../../util/jexlStrings.js';
|
|
3
|
+
import { getNotificationSink } from '../../util/sessionServices.js';
|
|
4
|
+
const MAX_LABEL_VALUE = 30;
|
|
5
|
+
export function isJexlFilterDisplay(thing) {
|
|
6
|
+
return (typeof thing === 'object' &&
|
|
7
|
+
thing !== null &&
|
|
8
|
+
'setFilter' in thing &&
|
|
9
|
+
'configuredFilters' in thing);
|
|
10
|
+
}
|
|
11
|
+
/** The first of a track's displays that takes jexl filters. */
|
|
12
|
+
export function jexlFilterDisplay(track) {
|
|
13
|
+
return track?.displays.find(isJexlFilterDisplay);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* "Show only" and "Hide" items for one feature attribute's value, and "Show
|
|
17
|
+
* only ≥" for a number. Each appends a filter line to the display and offers
|
|
18
|
+
* an undo.
|
|
19
|
+
*/
|
|
20
|
+
export function filterByValueItems(display, path, value) {
|
|
21
|
+
if (typeof value !== 'string' && typeof value !== 'number') {
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
const field = path.join('.');
|
|
25
|
+
const text = String(value);
|
|
26
|
+
const shown = text.length > MAX_LABEL_VALUE ? `${text.slice(0, MAX_LABEL_VALUE)}…` : text;
|
|
27
|
+
const add = (op) => () => {
|
|
28
|
+
const previous = display.configuredFilters();
|
|
29
|
+
const line = printCondition({
|
|
30
|
+
subject: pathSubject('feature', path),
|
|
31
|
+
op,
|
|
32
|
+
value,
|
|
33
|
+
});
|
|
34
|
+
display.setFilter([...previous, ensureJexlPrefix(line)]);
|
|
35
|
+
getNotificationSink(display).notify('Filter added', 'info', {
|
|
36
|
+
name: 'Undo',
|
|
37
|
+
onClick: () => {
|
|
38
|
+
display.setFilter(previous);
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
return [
|
|
43
|
+
{ label: `Show only ${field} = ${shown}`, onClick: add('==') },
|
|
44
|
+
{ label: `Hide ${field} = ${shown}`, onClick: add('!=') },
|
|
45
|
+
...(typeof value === 'number'
|
|
46
|
+
? [{ label: `Show only ${field} ≥ ${shown}`, onClick: add('>=') }]
|
|
47
|
+
: []),
|
|
48
|
+
];
|
|
49
|
+
}
|
|
@@ -1,11 +1,3 @@
|
|
|
1
1
|
export declare function isEmpty(obj: Record<string, unknown>): boolean;
|
|
2
|
-
export declare function applyFeatureFormatting<T extends {
|
|
3
|
-
__jbrowsefmt?: Record<string, unknown>;
|
|
4
|
-
}>(feature: T): T & {
|
|
5
|
-
[x: string]: unknown;
|
|
6
|
-
};
|
|
7
|
-
export declare function isFormattedField(feature: {
|
|
8
|
-
__jbrowsefmt?: Record<string, unknown>;
|
|
9
|
-
}, key: string): boolean;
|
|
10
2
|
export declare function generateTitle(name: unknown, id: unknown, type: unknown): string;
|
|
11
3
|
export declare function accessNested(arr: string[], obj?: Record<string, unknown>): string | undefined;
|
|
@@ -1,40 +1,17 @@
|
|
|
1
|
-
import { isObject } from '../../util/index.js';
|
|
1
|
+
import { coarseStripHTML, isObject } from '../../util/index.js';
|
|
2
2
|
import { ellipses } from '../util.js';
|
|
3
3
|
export function isEmpty(obj) {
|
|
4
4
|
return Object.keys(obj).length === 0;
|
|
5
5
|
}
|
|
6
|
-
// The view the details panel renders: raw feature fields with the
|
|
7
|
-
// formatDetails-callback output (`__jbrowsefmt`) merged on top, so a callback
|
|
8
|
-
// value overrides the raw one. A field the callback sets to null/undefined then
|
|
9
|
-
// drops out of the panel's `!= null` filters — this is how callbacks hide
|
|
10
|
-
// fields. `__jbrowsefmt` itself is in Attributes' globalOmit, so it never
|
|
11
|
-
// renders.
|
|
12
|
-
export function applyFeatureFormatting(feature) {
|
|
13
|
-
return { ...feature, ...feature.__jbrowsefmt };
|
|
14
|
-
}
|
|
15
|
-
// Whether a formatDetails callback named `key` at all -- including setting it
|
|
16
|
-
// to null/undefined, which is how a callback hides a field. Lets a derived row
|
|
17
|
-
// (e.g. Length) defer to the callback without treating "hidden" as "absent".
|
|
18
|
-
export function isFormattedField(feature, key) {
|
|
19
|
-
const fmt = feature.__jbrowsefmt;
|
|
20
|
-
return fmt !== undefined && key in fmt;
|
|
21
|
-
}
|
|
22
6
|
export function generateTitle(name, id, type) {
|
|
23
|
-
const label = name || id;
|
|
24
|
-
return [label ? ellipses(
|
|
7
|
+
const label = coarseStripHTML(`${name || id || ''}`);
|
|
8
|
+
return [label ? ellipses(label) : '', type ? `${type}` : '']
|
|
25
9
|
.filter(Boolean)
|
|
26
10
|
.join(' - ');
|
|
27
11
|
}
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
// @param arr example ['a','b'], obj = {a:{b:'hello}}
|
|
32
|
-
// @returns hello (with special addition to grab description also)
|
|
33
|
-
//
|
|
34
|
-
// A path that runs out of objects before it runs out of elements has no
|
|
35
|
-
// description: walking ['INFO','ANN'] into `{INFO: 'a string'}` used to stop at
|
|
36
|
-
// the string and hand it back, so every subfield of an object-valued attribute
|
|
37
|
-
// inherited its parent's description.
|
|
12
|
+
// the description at `arr` in a descriptions tree: a string there, or the
|
|
13
|
+
// `Description` of the object there, as a VCF header entry carries. A path
|
|
14
|
+
// that runs out of objects early has none
|
|
38
15
|
export function accessNested(arr, obj = {}) {
|
|
39
16
|
let obj2 = obj;
|
|
40
17
|
for (const elt of arr) {
|
|
@@ -1,42 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { observer } from 'mobx-react';
|
|
3
|
-
import { getGeneticCode
|
|
3
|
+
import { getGeneticCode } from '../../util/geneticCodes.js';
|
|
4
|
+
import SimpleFeature from '../../util/simpleFeature.js';
|
|
5
|
+
import { transcriptGeneticCodeId, transcriptTranslExcept, } from '../../util/translateTranscript.js';
|
|
4
6
|
import { modeHasUpDownstream, modeSupportsRevcomp, resolveShowCoordinates, } from './featureTypeUtil.js';
|
|
5
7
|
import CDNASequence from './seqtypes/CDNASequence.js';
|
|
6
8
|
import CDSSequence from './seqtypes/CDSSequence.js';
|
|
7
9
|
import GenomicSequence from './seqtypes/GenomicSequence.js';
|
|
8
10
|
import ProteinSequence from './seqtypes/ProteinSequence.js';
|
|
9
11
|
import { getSequenceData } from './useSequenceData.js';
|
|
10
|
-
function findCdsSubfeature(feature) {
|
|
11
|
-
return feature.subfeatures?.find(f => f.type?.toLowerCase() === 'cds');
|
|
12
|
-
}
|
|
13
|
-
// CDS-bound translation reads `transl_table` off the CDS subfeature (or the
|
|
14
|
-
// feature itself), so e.g. a mitochondrial gene translates with table 2 rather
|
|
15
|
-
// than the standard code. When the feature carries no transl_table (e.g. UCSC
|
|
16
|
-
// genePred-derived GFFs), fall back to the assembly-configured code for the
|
|
17
|
-
// contig. Undefined falls back to the standard code.
|
|
18
|
-
function proteinGeneticCode(feature, assemblyGeneticCodeId) {
|
|
19
|
-
const cds = findCdsSubfeature(feature);
|
|
20
|
-
const id = parseTranslTable(feature.transl_table) ??
|
|
21
|
-
parseTranslTable(cds?.transl_table) ??
|
|
22
|
-
assemblyGeneticCodeId;
|
|
23
|
-
return getGeneticCode(id);
|
|
24
|
-
}
|
|
25
|
-
// Parses transl_except from the feature or its CDS subfeature into the coordinate
|
|
26
|
-
// system used by convertCodingSequenceToPeptides (feature-relative, reversed for
|
|
27
|
-
// minus-strand genes).
|
|
28
|
-
function featureTranslExcept(feature) {
|
|
29
|
-
const cds = findCdsSubfeature(feature);
|
|
30
|
-
const raw = feature.transl_except ?? cds?.transl_except;
|
|
31
|
-
return raw
|
|
32
|
-
? relativizeTranslExcept({
|
|
33
|
-
raw,
|
|
34
|
-
featureStart: feature.start,
|
|
35
|
-
featureLength: feature.end - feature.start,
|
|
36
|
-
strand: feature.strand,
|
|
37
|
-
})
|
|
38
|
-
: [];
|
|
39
|
-
}
|
|
40
12
|
// Dispatches to the renderer for the current sequence type. An observer because
|
|
41
13
|
// it reads showCoordinatesSetting: that setting moving relative<->genomic
|
|
42
14
|
// leaves the coarse showCoordinates boolean every other observer here reads
|
|
@@ -60,9 +32,10 @@ const SequenceContents = observer(function SequenceContents({ mode, feature, seq
|
|
|
60
32
|
case 'cds':
|
|
61
33
|
return _jsx(CDSSequence, { model: model, cds: cds, sequence: seq });
|
|
62
34
|
case 'protein': {
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
|
|
35
|
+
const transcript = new SimpleFeature(feature);
|
|
36
|
+
const translExcept = transcriptTranslExcept(transcript);
|
|
37
|
+
const code = getGeneticCode(transcriptGeneticCodeId(transcript, assemblyGeneticCodeId));
|
|
38
|
+
return (_jsx(ProteinSequence, { model: model, cds: cds, sequence: seq, codonTable: code.codonTable, starts: code.starts, translExcept: translExcept?.length ? translExcept : undefined }));
|
|
66
39
|
}
|
|
67
40
|
// cdna and the gene_* variants all render the spliced transcript; introns
|
|
68
41
|
// and up/downstream flanks are toggled by the mode name
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { SimpleFeatureSerialized } from '../../util/index.ts';
|
|
2
|
-
import type {
|
|
2
|
+
import type { FeatureDetailsModel } from '../types.tsx';
|
|
3
3
|
declare const SequenceFeaturePanel: ({ model, feature, }: {
|
|
4
|
-
model:
|
|
4
|
+
model: FeatureDetailsModel;
|
|
5
5
|
feature: SimpleFeatureSerialized;
|
|
6
6
|
}) => import("react").JSX.Element;
|
|
7
7
|
export default SequenceFeaturePanel;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { observer } from 'mobx-react';
|
|
3
|
-
import { toLocale } from '../../util/index.js';
|
|
3
|
+
import { coarseStripHTML, toLocale } from '../../util/index.js';
|
|
4
4
|
import { getStrandStr } from '../util.js';
|
|
5
5
|
import { modeHasUpDownstream, modeSupportsRevcomp } from './featureTypeUtil.js';
|
|
6
6
|
const SequenceName = observer(function SequenceName({ mode, model, revcomp, feature, }) {
|
|
7
7
|
return (_jsx("div", { children: `>${[
|
|
8
8
|
[
|
|
9
|
-
feature.name || feature.id,
|
|
9
|
+
coarseStripHTML(`${feature.name || feature.id || ''}`),
|
|
10
10
|
mode,
|
|
11
11
|
revcomp && modeSupportsRevcomp(mode) ? 'revcomp' : '',
|
|
12
12
|
]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { FormControl, MenuItem, Select } from '@mui/material';
|
|
3
|
+
import { coarseStripHTML } from '../../../util/index.js';
|
|
3
4
|
import { makeStyles } from '../../../util/tss-react/index.js';
|
|
4
5
|
const useStyles = makeStyles()({
|
|
5
6
|
formControl: {
|
|
@@ -14,5 +15,6 @@ export default function TranscriptSelector({ transcripts, transcriptIndex, setTr
|
|
|
14
15
|
const { classes } = useStyles();
|
|
15
16
|
return (_jsx(FormControl, { className: classes.formControl, children: _jsx(Select, { size: "small", value: transcriptIndex, onChange: event => {
|
|
16
17
|
setTranscriptIndex(Number(event.target.value));
|
|
17
|
-
}, "aria-label": "Transcript", children: transcripts.map((transcript, idx) => (_jsx(MenuItem, { value: idx, "data-testid": `transcript_${idx}`, children: transcript.name || transcript.id ||
|
|
18
|
+
}, "aria-label": "Transcript", children: transcripts.map((transcript, idx) => (_jsx(MenuItem, { value: idx, "data-testid": `transcript_${idx}`, children: coarseStripHTML(`${transcript.name || transcript.id || ''}`) ||
|
|
19
|
+
`Transcript ${idx + 1}` }, transcript.uniqueId))) }) }));
|
|
18
20
|
}
|
|
@@ -10,6 +10,18 @@ export interface SequenceHoverTarget {
|
|
|
10
10
|
setSequenceHoverPosition: (pos: SequenceHoverPosition | undefined) => void;
|
|
11
11
|
}
|
|
12
12
|
export type SequenceDisplayMode = 'gene' | 'gene_collapsed_intron' | 'gene_updownstream' | 'gene_updownstream_collapsed_intron' | 'cdna' | 'cds' | 'genomic' | 'genomic_sequence_updownstream' | 'protein';
|
|
13
|
+
/**
|
|
14
|
+
* #stateModel SequenceFeatureDetails
|
|
15
|
+
* #category Widget
|
|
16
|
+
* User preferences for the sequence readout under a feature's details, seeded
|
|
17
|
+
* from and written straight back to localStorage. Nothing here is snapshotted
|
|
18
|
+
* or reads the tree, so an instance is cheap and needs no lifecycle: a holder
|
|
19
|
+
* that only sometimes shows a panel (e.g. a track's right-click dialog) creates
|
|
20
|
+
* one when it opens rather than carrying it around.
|
|
21
|
+
*
|
|
22
|
+
* `BaseFeatureWidget` holds one as `sequenceFeatureDetails`, which is where a
|
|
23
|
+
* caller changing the readout reaches these actions.
|
|
24
|
+
*/
|
|
13
25
|
export declare function SequenceFeatureDetailsF(): import("@jbrowse/mobx-state-tree").IModelType<{}, {
|
|
14
26
|
/**
|
|
15
27
|
* #volatile
|
|
@@ -9,11 +9,18 @@ const p = 'sequenceFeatureDetails';
|
|
|
9
9
|
function clampCharactersPerRow(n) {
|
|
10
10
|
return Math.max(1, Math.floor(n));
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
/**
|
|
13
|
+
* #stateModel SequenceFeatureDetails
|
|
14
|
+
* #category Widget
|
|
15
|
+
* User preferences for the sequence readout under a feature's details, seeded
|
|
16
|
+
* from and written straight back to localStorage. Nothing here is snapshotted
|
|
17
|
+
* or reads the tree, so an instance is cheap and needs no lifecycle: a holder
|
|
18
|
+
* that only sometimes shows a panel (e.g. a track's right-click dialog) creates
|
|
19
|
+
* one when it opens rather than carrying it around.
|
|
20
|
+
*
|
|
21
|
+
* `BaseFeatureWidget` holds one as `sequenceFeatureDetails`, which is where a
|
|
22
|
+
* caller changing the readout reaches these actions.
|
|
23
|
+
*/
|
|
17
24
|
export function SequenceFeatureDetailsF() {
|
|
18
25
|
return types
|
|
19
26
|
.model('SequenceFeatureDetails')
|
|
@@ -18,13 +18,16 @@ function processFeatureData(children, feature) {
|
|
|
18
18
|
// translations if included)
|
|
19
19
|
const featureType = feature.type?.toLowerCase();
|
|
20
20
|
const isMatureProteinRegion = featureType === 'mature_protein_region_of_cds';
|
|
21
|
+
const ofType = (type) => children.filter(sub => sub.type?.toLowerCase() === type);
|
|
22
|
+
// A frameshift polyprotein's CDS carries its reading frames as CDS rows beside
|
|
23
|
+
// its cleavage products; a single-frame one has only the products.
|
|
24
|
+
const codingRows = ofType('cds');
|
|
21
25
|
const cds = isMatureProteinRegion
|
|
22
26
|
? [{ start: 0, end: feature.end - feature.start, type: 'CDS' }]
|
|
23
|
-
: filterSuccessiveElementsWithSameStartAndEndCoord(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const exons = filterSuccessiveElementsWithSameStartAndEndCoord(children.filter(sub => sub.type?.toLowerCase() === 'exon'));
|
|
27
|
+
: filterSuccessiveElementsWithSameStartAndEndCoord(codingRows.length > 0
|
|
28
|
+
? codingRows
|
|
29
|
+
: ofType('mature_protein_region_of_cds'));
|
|
30
|
+
const exons = filterSuccessiveElementsWithSameStartAndEndCoord(ofType('exon'));
|
|
28
31
|
// annotated UTRs are deliberately not read: a UTR is just the exonic sequence
|
|
29
32
|
// outside the CDS, so the renderer derives the split from cds+exons. Trusting
|
|
30
33
|
// the annotation meant a transcript that named only one of its UTRs lost the
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const configSchema: import("../configuration/configurationSchema.ts").ConfigurationSchemaType<{}, import("../configuration/configurationSchema.ts").ConfigurationSchemaOptions<undefined, undefined>>;
|
|
1
|
+
declare const configSchema: import("../configuration/configurationSchema.ts").ConfigurationSchemaType<{}, import("../configuration/configurationSchema.ts").ConfigurationSchemaOptions<undefined, undefined, undefined, import("../configuration/requirements.ts").ConfigurationSchemaRequirement<Partial<Record<string, string[]>>, string>, any>>;
|
|
2
2
|
export { configSchema };
|
|
@@ -1,38 +1,22 @@
|
|
|
1
1
|
import type { AnyConfigurationModel } from '../configuration/index.ts';
|
|
2
2
|
import type { SimpleFeatureSerialized } from '../util/index.ts';
|
|
3
|
-
import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
4
3
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* tier still has to run in that case.
|
|
4
|
+
* The two config nodes carrying a `formatDetails` sub-schema. The session's
|
|
5
|
+
* applies to every track; the track's is absent when the widget was opened
|
|
6
|
+
* without one. The track's object spreads over the session's, and its numbers
|
|
7
|
+
* win.
|
|
10
8
|
*/
|
|
11
|
-
export interface FormatDetailsHolder extends IStateTreeNode {
|
|
12
|
-
configuration: AnyConfigurationModel;
|
|
13
|
-
}
|
|
14
9
|
export interface FormatDetailsTiers {
|
|
15
|
-
session:
|
|
16
|
-
track?:
|
|
10
|
+
session: AnyConfigurationModel;
|
|
11
|
+
track?: AnyConfigurationModel;
|
|
17
12
|
}
|
|
18
|
-
/**
|
|
19
|
-
* `depth` or `maxDepth`: the track's value when the track sets one, else the
|
|
20
|
-
* session's, else unset.
|
|
21
|
-
*
|
|
22
|
-
* These override rather than merge, unlike the callback objects. That is only
|
|
23
|
-
* expressible because both are `maybeNumber` slots with no `defaultValue` --
|
|
24
|
-
* given a schema default the track reported a value whether or not anyone set
|
|
25
|
-
* one, so the session-wide tier could never apply to a track, and every real
|
|
26
|
-
* config has a track.
|
|
27
|
-
*/
|
|
13
|
+
/** `depth` or `maxDepth`: the track's value when set, else the session's. */
|
|
28
14
|
export declare function formatDetailsNumber(tiers: FormatDetailsTiers, slot: string): number | undefined;
|
|
29
15
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* config with no `formatDetails` at all leaves the feature exactly as it came
|
|
36
|
-
* in rather than stamping empty objects through the persisted snapshot.
|
|
16
|
+
* The feature as the details panel shows it: each tier's `feature` callback
|
|
17
|
+
* output spread over the clicked feature, and `subfeatures` output over each
|
|
18
|
+
* subfeature down to `depth`. A key set to null or undefined hides that row,
|
|
19
|
+
* since every detail component filters with `!= null`. A config declaring no
|
|
20
|
+
* callback gets the input back untouched.
|
|
37
21
|
*/
|
|
38
|
-
export declare function applyFormatDetails(tiers: FormatDetailsTiers,
|
|
22
|
+
export declare function applyFormatDetails(tiers: FormatDetailsTiers, feature: SimpleFeatureSerialized): SimpleFeatureSerialized;
|
|
@@ -1,63 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import { DEFAULT_FORMAT_DETAILS_DEPTH, mergeFormatCallbacks, readConfObject, } from '../configuration/index.js';
|
|
2
|
+
import { isPlainObject } from '../util/objectUtils.js';
|
|
3
|
+
function readCallback(conf, where, slot, args) {
|
|
4
|
+
try {
|
|
5
|
+
const fields = mergeFormatCallbacks(readConfObject(conf, ['formatDetails', slot], args));
|
|
6
|
+
if (fields.subfeatures != null) {
|
|
7
|
+
throw new Error('a callback can hide subfeatures but not replace them; reshape each one with the subfeatures callback');
|
|
8
|
+
}
|
|
9
|
+
return fields;
|
|
10
|
+
}
|
|
11
|
+
catch (e) {
|
|
12
|
+
throw new Error(`formatDetails.${slot} of ${where}: ${e}`, { cause: e });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function readCallbacks({ session, track }, slot, args) {
|
|
16
|
+
return mergeFormatCallbacks(readCallback(session, 'the session configuration', slot, args), track
|
|
17
|
+
? readCallback(track, `track "${readConfObject(track, 'trackId')}"`, slot, args)
|
|
18
|
+
: undefined);
|
|
18
19
|
}
|
|
19
20
|
/**
|
|
20
|
-
* Whether either tier
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* of a `jexl:` slot answers the second one badly — it evaluates the user's
|
|
26
|
-
* expression against a context where `feature` is undefined (see
|
|
27
|
-
* `configuration/CLAUDE.md`), which is a throw or a junk value, per tier, just
|
|
28
|
-
* to find out the slot exists.
|
|
29
|
-
*
|
|
30
|
-
* Both callback slots default to `{}`, so a config that never mentions
|
|
31
|
-
* `formatDetails` answers false for both and `applyFormatDetails` can hand the
|
|
32
|
-
* feature straight back. That is the whole point of asking: the walk it skips
|
|
33
|
-
* is proportional to the subfeature tree, and the tree can be very large (a
|
|
34
|
-
* RefSeq BRCA1 is 368 transcripts, ~16k nodes) while the config that formats
|
|
35
|
-
* none of it is the overwhelmingly common one.
|
|
21
|
+
* Whether either tier sets `slot`, read raw off the node: an arg-less read of
|
|
22
|
+
* a `jexl:` slot evaluates it against an empty context just to find out it
|
|
23
|
+
* exists. Both callback slots default to `{}`, so a config that never mentions
|
|
24
|
+
* `formatDetails` answers false and the walk below is skipped entirely, which
|
|
25
|
+
* matters on a RefSeq gene with 16k nested nodes.
|
|
36
26
|
*/
|
|
37
27
|
function declaresCallback({ session, track }, slot) {
|
|
38
|
-
return [session, track].some(
|
|
39
|
-
|
|
40
|
-
const sub = holder?.configuration.formatDetails;
|
|
41
|
-
const value = sub?.[slot];
|
|
42
|
-
// a `jexl:` slot is a string; a plain-object slot counts only when it has
|
|
43
|
-
// keys, since `{}` is the schema default and merges to nothing
|
|
28
|
+
return [session, track].some(conf => {
|
|
29
|
+
const value = conf?.formatDetails?.[slot];
|
|
44
30
|
return typeof value === 'string'
|
|
45
31
|
? value !== ''
|
|
46
|
-
:
|
|
32
|
+
: isPlainObject(value) && Object.keys(value).length > 0;
|
|
47
33
|
});
|
|
48
34
|
}
|
|
49
|
-
/**
|
|
50
|
-
* `depth` or `maxDepth`: the track's value when the track sets one, else the
|
|
51
|
-
* session's, else unset.
|
|
52
|
-
*
|
|
53
|
-
* These override rather than merge, unlike the callback objects. That is only
|
|
54
|
-
* expressible because both are `maybeNumber` slots with no `defaultValue` --
|
|
55
|
-
* given a schema default the track reported a value whether or not anyone set
|
|
56
|
-
* one, so the session-wide tier could never apply to a track, and every real
|
|
57
|
-
* config has a track.
|
|
58
|
-
*/
|
|
35
|
+
/** `depth` or `maxDepth`: the track's value when set, else the session's. */
|
|
59
36
|
export function formatDetailsNumber(tiers, slot) {
|
|
60
|
-
const
|
|
37
|
+
const fromSession = readConfObject(tiers.session, ['formatDetails', slot]);
|
|
38
|
+
const fromTrack = tiers.track
|
|
39
|
+
? readConfObject(tiers.track, ['formatDetails', slot])
|
|
40
|
+
: undefined;
|
|
61
41
|
return typeof fromTrack === 'number'
|
|
62
42
|
? fromTrack
|
|
63
43
|
: typeof fromSession === 'number'
|
|
@@ -65,39 +45,38 @@ export function formatDetailsNumber(tiers, slot) {
|
|
|
65
45
|
: undefined;
|
|
66
46
|
}
|
|
67
47
|
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
* config with no `formatDetails` at all leaves the feature exactly as it came
|
|
74
|
-
* in rather than stamping empty objects through the persisted snapshot.
|
|
48
|
+
* The feature as the details panel shows it: each tier's `feature` callback
|
|
49
|
+
* output spread over the clicked feature, and `subfeatures` output over each
|
|
50
|
+
* subfeature down to `depth`. A key set to null or undefined hides that row,
|
|
51
|
+
* since every detail component filters with `!= null`. A config declaring no
|
|
52
|
+
* callback gets the input back untouched.
|
|
75
53
|
*/
|
|
76
|
-
export function applyFormatDetails(tiers,
|
|
77
|
-
const
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
// subfeature tree and both produce nothing here, and this is the default
|
|
82
|
-
// config -- most tracks never set `formatDetails` at all.
|
|
83
|
-
if (!hasFeature && !hasSubfeatures) {
|
|
84
|
-
return featureData;
|
|
85
|
-
}
|
|
86
|
-
const feature = structuredClone(featureData);
|
|
87
|
-
if (hasFeature) {
|
|
88
|
-
const fmt = mergeFormatCallbacks(...readTiers(tiers, 'feature', { feature }));
|
|
89
|
-
if (!isEmpty(fmt)) {
|
|
90
|
-
feature.__jbrowsefmt = fmt;
|
|
91
|
-
}
|
|
54
|
+
export function applyFormatDetails(tiers, feature) {
|
|
55
|
+
const formatsFeature = declaresCallback(tiers, 'feature');
|
|
56
|
+
const formatsSubfeatures = declaresCallback(tiers, 'subfeatures');
|
|
57
|
+
if (!formatsFeature && !formatsSubfeatures) {
|
|
58
|
+
return feature;
|
|
92
59
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
60
|
+
const depth = formatsSubfeatures
|
|
61
|
+
? (formatDetailsNumber(tiers, 'depth') ?? DEFAULT_FORMAT_DETAILS_DEPTH)
|
|
62
|
+
: 0;
|
|
63
|
+
const track = tiers.track ? readConfObject(tiers.track) : undefined;
|
|
64
|
+
function format(node, level, fmt) {
|
|
65
|
+
const { subfeatures } = node;
|
|
66
|
+
return {
|
|
67
|
+
...node,
|
|
68
|
+
...(subfeatures && level < depth
|
|
69
|
+
? {
|
|
70
|
+
subfeatures: subfeatures.map(sub => format(sub, level + 1, readCallbacks(tiers, 'subfeatures', {
|
|
71
|
+
feature: sub,
|
|
72
|
+
parent: node,
|
|
73
|
+
depth: level + 1,
|
|
74
|
+
track,
|
|
75
|
+
}))),
|
|
76
|
+
}
|
|
77
|
+
: {}),
|
|
78
|
+
...fmt,
|
|
79
|
+
};
|
|
101
80
|
}
|
|
102
|
-
return feature;
|
|
81
|
+
return format(feature, 0, formatsFeature ? readCallbacks(tiers, 'feature', { feature, track }) : {});
|
|
103
82
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { configSchema } from './configSchema.ts';
|
|
2
|
-
export type { Descriptors, MaybeSerializedFeat } from './types.tsx';
|
|
2
|
+
export type { Descriptors, FeatureDetailsModel, MaybeSerializedFeat, } from './types.tsx';
|
|
3
3
|
export type { SequenceHoverPosition, ShowCoordinatesMode, } from './SequenceFeatureDetails/model.ts';
|
|
4
|
+
export type { FormatDetailsTiers } from './formatDetails.ts';
|
|
4
5
|
export { stateModelFactory } from './stateModelFactory.ts';
|
|
5
6
|
export type { BaseFeatureWidgetModel, BaseFeatureWidgetStateModel, } from './stateModelFactory.ts';
|