@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,95 +1,61 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useEffect, useMemo, useRef } from 'react';
|
|
2
2
|
import { createFrameCoalescer } from './frameCoalescer.js';
|
|
3
3
|
import { trackPointerPresence } from './pointerPresence.js';
|
|
4
4
|
import { createScrollLatch } from './scrollLatch.js';
|
|
5
5
|
import { useEventCallback } from './useEventCallback.js';
|
|
6
6
|
import { normalizeWheelDelta } from './wheelZoom.js';
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// now, and a few of those are controls rather than content: the display's own
|
|
11
|
-
// `VerticalScrollbar` (which scrolls the panel itself, from its own listener),
|
|
12
|
-
// the pileup's band resize handles, a floating legend. Those keep the gesture
|
|
13
|
-
// they already had instead of being absorbed the moment the panel grew to cover
|
|
14
|
-
// them.
|
|
15
|
-
//
|
|
16
|
-
// The marker element ITSELF is a panel at the one call site that is one — the
|
|
17
|
-
// scrollbar binds this hook to its own marked track — so an owner that IS the
|
|
18
|
-
// panel does not count. Nor does one ABOVE it: `TrackContainer` stamps the
|
|
19
|
-
// marker once for its whole overlay layer, and `closest` walking out of the
|
|
20
|
-
// panel into that would otherwise disown every wheel a display gets.
|
|
7
|
+
// An owner that IS the panel (the scrollbar binds this hook to its own marked
|
|
8
|
+
// track) or sits ABOVE it (`TrackContainer` marks its whole overlay layer) does
|
|
9
|
+
// not count.
|
|
21
10
|
function claimedInside(panel, target) {
|
|
22
11
|
const owner = target instanceof Element ? target.closest('[data-gesture-owner]') : null;
|
|
23
12
|
return owner !== null && owner !== panel && panel.contains(owner);
|
|
24
13
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
// wheel event over them targets. That event bubbles past the canvas entirely, so
|
|
38
|
-
// a listener bound to the canvas never sees it and the gesture falls through to
|
|
39
|
-
// the page mid-scroll. Bound to the element containing both, the wheel is the
|
|
40
|
-
// panel's wherever inside it the cursor happens to be. `trackPointerPresence`
|
|
41
|
-
// below keys off the same element, and `mouseenter`/`mouseleave` ignore
|
|
42
|
-
// descendant transitions — so crossing onto an overlay no longer reads as
|
|
43
|
-
// leaving the panel either.
|
|
44
|
-
//
|
|
45
|
-
// What keeps a panel safe to widen is `claimedInside` above: it covers its
|
|
46
|
-
// overlays, and yields the ones that run gestures of their own.
|
|
47
|
-
export function useVirtualScrollWheel(panel,
|
|
48
|
-
// `el` is the element the listener is bound to, handed back non-null: a
|
|
49
|
-
// gesture measuring against its own box (the row-resize pin) would otherwise
|
|
50
|
-
// re-assert the nullable it was passed, at the one call site that cannot be
|
|
51
|
-
// reached with a null.
|
|
52
|
-
onWheel) {
|
|
14
|
+
/**
|
|
15
|
+
* Non-passive wheel wiring for a canvas-backed virtual scroll. Owns the scroll
|
|
16
|
+
* latch (and so `preventDefault`), per-frame coalescing of `setScrollTop`, and
|
|
17
|
+
* the listener lifecycle. `onWheel` decides what the gesture means and calls
|
|
18
|
+
* `scroll` when it means scrolling `model`.
|
|
19
|
+
*
|
|
20
|
+
* **Bind this to the panel, not to the `<canvas>`.** A canvas holds no DOM
|
|
21
|
+
* children, so the clickable overlays drawn over it are siblings, and a wheel
|
|
22
|
+
* over one never reaches a listener on the canvas. Overlays that run their own
|
|
23
|
+
* gestures opt out with `[data-gesture-owner]`.
|
|
24
|
+
*/
|
|
25
|
+
export function useVirtualScrollWheel(panel, model, onWheel) {
|
|
53
26
|
const latch = useMemo(() => createScrollLatch(), []);
|
|
54
27
|
const frame = useMemo(() => createFrameCoalescer(), []);
|
|
55
|
-
// The
|
|
56
|
-
//
|
|
57
|
-
// sees monotonically advancing offsets and no delta is lost to a
|
|
58
|
-
// not-yet-committed model read.
|
|
28
|
+
// The offset as it advances across one frame's events, so the latch sees
|
|
29
|
+
// every delta before the model has committed any of them.
|
|
59
30
|
const runningRef = useRef(0);
|
|
60
|
-
const applyScroll = useCallback((e, { scrollTop, viewportHeight, scrollableHeight }, commit) => {
|
|
61
|
-
if (scrollableHeight <= 0) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
// A fresh frame (nothing pending) re-syncs to the model's live scrollTop;
|
|
65
|
-
// within a frame `running` keeps advancing from the last latched offset.
|
|
66
|
-
if (!frame.pending) {
|
|
67
|
-
runningRef.current = scrollTop;
|
|
68
|
-
}
|
|
69
|
-
const dy = normalizeWheelDelta(e.deltaY, e.deltaMode, viewportHeight);
|
|
70
|
-
const next = latch.scroll(e, runningRef.current, dy, scrollableHeight);
|
|
71
|
-
if (next !== null) {
|
|
72
|
-
runningRef.current = next;
|
|
73
|
-
// The first move of a frame schedules the commit; later moves only
|
|
74
|
-
// advance `running`, so the frame ends with a single setScrollTop (one
|
|
75
|
-
// repaint) carrying the accumulated offset.
|
|
76
|
-
frame.schedule(() => {
|
|
77
|
-
commit(runningRef.current);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}, [latch, frame]);
|
|
81
31
|
const handleWheel = useEventCallback((e, el) => {
|
|
82
|
-
onWheel(e,
|
|
32
|
+
onWheel(e, () => {
|
|
33
|
+
// A sideways-dominant gesture is the view's pan unless this panel has
|
|
34
|
+
// already latched it; ties go vertical, as in the view.
|
|
35
|
+
const sideways = Math.abs(e.deltaX) > Math.abs(e.deltaY);
|
|
36
|
+
const { scrollableHeight, scrollViewportHeight } = model;
|
|
37
|
+
if (scrollableHeight <= 0 || (sideways && !latch.holds(e))) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!frame.pending) {
|
|
41
|
+
runningRef.current = model.scrollTop;
|
|
42
|
+
}
|
|
43
|
+
const dy = normalizeWheelDelta(e.deltaY, e.deltaMode, scrollViewportHeight);
|
|
44
|
+
const next = latch.scroll(e, runningRef.current, dy, scrollableHeight);
|
|
45
|
+
if (next !== null) {
|
|
46
|
+
runningRef.current = next;
|
|
47
|
+
frame.schedule(() => {
|
|
48
|
+
model.setScrollTop(runningRef.current);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}, el);
|
|
83
52
|
});
|
|
84
53
|
useEffect(() => {
|
|
85
54
|
if (!panel) {
|
|
86
55
|
return undefined;
|
|
87
56
|
}
|
|
88
|
-
//
|
|
89
|
-
// pointer
|
|
90
|
-
// and reset the latch so the next in-panel gesture starts clean. Without
|
|
91
|
-
// this the panel stays stuck to per-track scroll after the mouse has left —
|
|
92
|
-
// worst in embedded, where the outer page is the thing that should scroll.
|
|
57
|
+
// The browser keeps targeting a gesture at the element it began on after
|
|
58
|
+
// the pointer leaves; release those to the page.
|
|
93
59
|
const presence = trackPointerPresence(panel, () => {
|
|
94
60
|
latch.reset();
|
|
95
61
|
});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { HighlightType } from './highlights.ts';
|
|
2
|
+
import type { AssemblyNameResolver } from './tracks.ts';
|
|
3
|
+
export declare function highlightsOnAssemblies(highlights: readonly HighlightType[], assemblyNames: Iterable<string>, assemblyManager: AssemblyNameResolver): HighlightType[];
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { isSameAssemblyName } from './tracks.js';
|
|
2
|
+
export function highlightsOnAssemblies(highlights, assemblyNames, assemblyManager) {
|
|
3
|
+
const names = [...assemblyNames];
|
|
4
|
+
return highlights.filter(h => names.some(a => isSameAssemblyName(a, h.assemblyName, assemblyManager)));
|
|
5
|
+
}
|
package/esm/util/viewStatus.d.ts
CHANGED
|
@@ -1,13 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a view's loading screen says: the label, the determinate fraction when
|
|
3
|
+
* the load reports one, and the URL being fetched when the phase named one.
|
|
4
|
+
*/
|
|
5
|
+
export interface ViewLoading {
|
|
6
|
+
message: string;
|
|
7
|
+
progress: number | undefined;
|
|
8
|
+
source?: string;
|
|
9
|
+
}
|
|
10
|
+
interface LoadingAssembly {
|
|
11
|
+
statusMessage?: string;
|
|
12
|
+
statusProgress?: number;
|
|
13
|
+
statusSource?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A view's `loading` getter: undefined unless `showLoading`, and otherwise read
|
|
17
|
+
* off the assembly whose load is the wait. The assembly is a thunk because its
|
|
18
|
+
* status ticks while a file is in flight, and a view that is not loading should
|
|
19
|
+
* not subscribe to it.
|
|
20
|
+
*/
|
|
21
|
+
export declare function viewLoading(showLoading: boolean, assembly: () => LoadingAssembly | undefined): ViewLoading | undefined;
|
|
1
22
|
/**
|
|
2
23
|
* The mutually-exclusive lifecycle state of a view, as one value.
|
|
3
24
|
*
|
|
4
|
-
* A view answers this question through nine getters today — `ready`, `error`,
|
|
5
|
-
* `initialized`, `showLoading`, `showImportForm`, `hasSomethingToShow`,
|
|
6
|
-
* `loadingMessage`, `loadingProgress`, `assemblyErrors` — and a host reading
|
|
7
|
-
* them has to re-derive the precedence by subtraction, which is the mistake
|
|
8
|
-
* `computeDisplayPhase` was written to stop one level down. `view.ready` **is**
|
|
9
|
-
* that subtraction: `!showLoading && !this.error`.
|
|
10
|
-
*
|
|
11
25
|
* The payload travels with the branch, so a caller cannot read a loading
|
|
12
26
|
* message out of a failed view or an error out of a healthy one.
|
|
13
27
|
*/
|
|
@@ -16,11 +30,9 @@ export type ViewStatus = {
|
|
|
16
30
|
} | {
|
|
17
31
|
type: 'error';
|
|
18
32
|
error: unknown;
|
|
19
|
-
} | {
|
|
33
|
+
} | ({
|
|
20
34
|
type: 'loading';
|
|
21
|
-
|
|
22
|
-
progress: number | undefined;
|
|
23
|
-
} | {
|
|
35
|
+
} & ViewLoading) | {
|
|
24
36
|
type: 'noRegions';
|
|
25
37
|
};
|
|
26
38
|
export interface ViewStatusInputs {
|
|
@@ -40,10 +52,7 @@ export interface ViewStatusInputs {
|
|
|
40
52
|
* would make every reader of a *ready* view subscribe to a churning
|
|
41
53
|
* observable it never displays.
|
|
42
54
|
*/
|
|
43
|
-
loading: () =>
|
|
44
|
-
message: string;
|
|
45
|
-
progress: number | undefined;
|
|
46
|
-
} | undefined;
|
|
55
|
+
loading: () => ViewLoading | undefined;
|
|
47
56
|
}
|
|
48
57
|
/**
|
|
49
58
|
* Precedence is `error` > `noRegions` > `loading` > `ready`, in one place,
|
|
@@ -56,3 +65,26 @@ export interface ViewStatusInputs {
|
|
|
56
65
|
* with nothing anywhere saying why. `noRegions` is that state, named.
|
|
57
66
|
*/
|
|
58
67
|
export declare function computeViewStatus({ error, hasSomethingToShow, loading, }: ViewStatusInputs): ViewStatus;
|
|
68
|
+
/**
|
|
69
|
+
* The slice of `AssemblyManager` this needs, spelled out rather than imported:
|
|
70
|
+
* the real type is an MST model a `PluginManager` built, so naming it here
|
|
71
|
+
* would cost this leaf the whole application's type graph (`util/CLAUDE.md`).
|
|
72
|
+
*/
|
|
73
|
+
interface AssemblyErrorSource {
|
|
74
|
+
get: (name: string) => {
|
|
75
|
+
error?: unknown;
|
|
76
|
+
} | undefined;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The assembly failures behind a view's `assemblyNames`, joined, or `undefined`
|
|
80
|
+
* when there are none.
|
|
81
|
+
*
|
|
82
|
+
* **Undefined and not `''`**, which is the whole reason this is shared. Three
|
|
83
|
+
* views spelled it as a bare `.join(', ')`, and a getter that answers the empty
|
|
84
|
+
* string for "nothing failed" reads as an error to every `!== undefined` test —
|
|
85
|
+
* `DotplotView.error` folded it in with `??`, so the view reported a terminal
|
|
86
|
+
* error permanently and jbrowse-img refused to render any dotplot. The in-app
|
|
87
|
+
* readers all happened to be truthiness tests, which is why it stayed invisible.
|
|
88
|
+
*/
|
|
89
|
+
export declare function assemblyErrorMessage(assemblyManager: AssemblyErrorSource, assemblyNames: string[]): string | undefined;
|
|
90
|
+
export {};
|
package/esm/util/viewStatus.js
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A view's `loading` getter: undefined unless `showLoading`, and otherwise read
|
|
3
|
+
* off the assembly whose load is the wait. The assembly is a thunk because its
|
|
4
|
+
* status ticks while a file is in flight, and a view that is not loading should
|
|
5
|
+
* not subscribe to it.
|
|
6
|
+
*/
|
|
7
|
+
export function viewLoading(showLoading, assembly) {
|
|
8
|
+
if (!showLoading) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
const asm = assembly();
|
|
12
|
+
return {
|
|
13
|
+
message: asm?.statusMessage || 'Loading',
|
|
14
|
+
progress: asm?.statusProgress,
|
|
15
|
+
source: asm?.statusSource,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
1
18
|
/**
|
|
2
19
|
* Precedence is `error` > `noRegions` > `loading` > `ready`, in one place,
|
|
3
20
|
* rather than re-encoded by subtraction in each view and again in each host.
|
|
@@ -18,3 +35,20 @@ export function computeViewStatus({ error, hasSomethingToShow, loading, }) {
|
|
|
18
35
|
const pending = loading();
|
|
19
36
|
return pending ? { type: 'loading', ...pending } : { type: 'ready' };
|
|
20
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* The assembly failures behind a view's `assemblyNames`, joined, or `undefined`
|
|
40
|
+
* when there are none.
|
|
41
|
+
*
|
|
42
|
+
* **Undefined and not `''`**, which is the whole reason this is shared. Three
|
|
43
|
+
* views spelled it as a bare `.join(', ')`, and a getter that answers the empty
|
|
44
|
+
* string for "nothing failed" reads as an error to every `!== undefined` test —
|
|
45
|
+
* `DotplotView.error` folded it in with `??`, so the view reported a terminal
|
|
46
|
+
* error permanently and jbrowse-img refused to render any dotplot. The in-app
|
|
47
|
+
* readers all happened to be truthiness tests, which is why it stayed invisible.
|
|
48
|
+
*/
|
|
49
|
+
export function assemblyErrorMessage(assemblyManager, assemblyNames) {
|
|
50
|
+
const errors = assemblyNames
|
|
51
|
+
.map(name => assemblyManager.get(name)?.error)
|
|
52
|
+
.filter(e => !!e);
|
|
53
|
+
return errors.length > 0 ? errors.join(', ') : undefined;
|
|
54
|
+
}
|
package/esm/util/wheelZoom.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface WheelZoomTarget {
|
|
|
17
17
|
views: WheelZoomView[];
|
|
18
18
|
scrollZoom: boolean;
|
|
19
19
|
originElement: () => HTMLElement | undefined;
|
|
20
|
+
hold?: <T>(fn: () => T) => T;
|
|
20
21
|
}
|
|
21
22
|
export interface WheelZoomControllerOptions {
|
|
22
23
|
element: HTMLElement;
|
|
@@ -37,9 +38,10 @@ export interface WheelZoomControllerOptions {
|
|
|
37
38
|
/**
|
|
38
39
|
* The one wheel gesture handler for linear views. Its decision matrix:
|
|
39
40
|
*
|
|
41
|
+
* - a wheel a nested scroller already consumed → declined, it owns the gesture
|
|
40
42
|
* - ctrl/meta+wheel, or (scrollZoom && |dy| >= |dx|) → zoom about the cursor
|
|
41
43
|
* - shift+wheel while scrollZoom is on → declined, we pass
|
|
42
|
-
* - a
|
|
44
|
+
* - a sideways delta, unless one arrives mid-zoom → pan by dx
|
|
43
45
|
*
|
|
44
46
|
* Declining shift is what leaves a nested panel its own scroll
|
|
45
47
|
* (`usePanelVirtualScroll`) — it is not a way back to the page. Browsers turn
|
|
@@ -54,6 +56,10 @@ export interface WheelZoomControllerOptions {
|
|
|
54
56
|
* inertial scroll) collapses to a single update per frame instead of thrashing
|
|
55
57
|
* the views once per event.
|
|
56
58
|
*
|
|
59
|
+
* A zoom lands eased over the frames after its event (`easeZoomBacklog`), and
|
|
60
|
+
* all of it lands: how far a gesture zooms depends on the wheel alone, never on
|
|
61
|
+
* the frame rate or how the events happened to fall into frames.
|
|
62
|
+
*
|
|
57
63
|
* Returns its disposer.
|
|
58
64
|
*/
|
|
59
65
|
export declare function createWheelZoomController({ element, resolveTarget, swallowUnhandled, releaseOnPointerLeave, onEvent, }: WheelZoomControllerOptions): () => void;
|
package/esm/util/wheelZoom.js
CHANGED
|
@@ -86,12 +86,33 @@ export function applyZoomAccum(bpPerPx, zoomAccum, elapsedMs) {
|
|
|
86
86
|
const d = Math.max(-max, Math.min(max, zoomAccum));
|
|
87
87
|
return d > 0 ? bpPerPx * (1 + d) : bpPerPx / (1 - d);
|
|
88
88
|
}
|
|
89
|
+
// A mouse notch lands as ~80ms of eased motion instead of one frame's jump, and
|
|
90
|
+
// a trackpad whose events fall two or three to a frame zooms at an even pace
|
|
91
|
+
const ZOOM_EASE_MS = 24;
|
|
92
|
+
// in log(bpPerPx): a free-spinning wheel can't bank a zoom that runs on after
|
|
93
|
+
// the hand stops
|
|
94
|
+
const MAX_ZOOM_BACKLOG = Math.log(16);
|
|
95
|
+
const ZOOM_SETTLE = 1e-3;
|
|
96
|
+
function zoomAccumToLog(zoomAccum) {
|
|
97
|
+
return zoomAccum > 0 ? Math.log1p(zoomAccum) : -Math.log1p(-zoomAccum);
|
|
98
|
+
}
|
|
99
|
+
function addToZoomBacklog(backlog, zoomAccum) {
|
|
100
|
+
return Math.max(-MAX_ZOOM_BACKLOG, Math.min(MAX_ZOOM_BACKLOG, backlog + zoomAccumToLog(zoomAccum)));
|
|
101
|
+
}
|
|
102
|
+
// the rate limit bounds how fast the owed zoom lands, never how much of it
|
|
103
|
+
function easeZoomBacklog(backlog, elapsedMs) {
|
|
104
|
+
const rest = backlog * Math.exp(-elapsedMs / ZOOM_EASE_MS);
|
|
105
|
+
const step = Math.abs(rest) < ZOOM_SETTLE ? backlog : backlog - rest;
|
|
106
|
+
const max = Math.log1p(MAX_ZOOM_RATE_PER_MS * elapsedMs);
|
|
107
|
+
return Math.max(-max, Math.min(max, step));
|
|
108
|
+
}
|
|
89
109
|
/**
|
|
90
110
|
* The one wheel gesture handler for linear views. Its decision matrix:
|
|
91
111
|
*
|
|
112
|
+
* - a wheel a nested scroller already consumed → declined, it owns the gesture
|
|
92
113
|
* - ctrl/meta+wheel, or (scrollZoom && |dy| >= |dx|) → zoom about the cursor
|
|
93
114
|
* - shift+wheel while scrollZoom is on → declined, we pass
|
|
94
|
-
* - a
|
|
115
|
+
* - a sideways delta, unless one arrives mid-zoom → pan by dx
|
|
95
116
|
*
|
|
96
117
|
* Declining shift is what leaves a nested panel its own scroll
|
|
97
118
|
* (`usePanelVirtualScroll`) — it is not a way back to the page. Browsers turn
|
|
@@ -106,13 +127,17 @@ export function applyZoomAccum(bpPerPx, zoomAccum, elapsedMs) {
|
|
|
106
127
|
* inertial scroll) collapses to a single update per frame instead of thrashing
|
|
107
128
|
* the views once per event.
|
|
108
129
|
*
|
|
130
|
+
* A zoom lands eased over the frames after its event (`easeZoomBacklog`), and
|
|
131
|
+
* all of it lands: how far a gesture zooms depends on the wheel alone, never on
|
|
132
|
+
* the frame rate or how the events happened to fall into frames.
|
|
133
|
+
*
|
|
109
134
|
* Returns its disposer.
|
|
110
135
|
*/
|
|
111
136
|
export function createWheelZoomController({ element, resolveTarget, swallowUnhandled = false, releaseOnPointerLeave = false, onEvent, }) {
|
|
112
137
|
const frame = createFrameCoalescer();
|
|
113
138
|
const s = {
|
|
114
139
|
scrollDelta: 0,
|
|
115
|
-
|
|
140
|
+
zoomBacklog: 0,
|
|
116
141
|
target: undefined,
|
|
117
142
|
lastClientX: 0,
|
|
118
143
|
originLeft: undefined,
|
|
@@ -127,7 +152,7 @@ export function createWheelZoomController({ element, resolveTarget, swallowUnhan
|
|
|
127
152
|
const presence = releaseOnPointerLeave
|
|
128
153
|
? trackPointerPresence(element, () => {
|
|
129
154
|
s.scrollDelta = 0;
|
|
130
|
-
s.
|
|
155
|
+
s.zoomBacklog = 0;
|
|
131
156
|
s.originLeft = undefined;
|
|
132
157
|
})
|
|
133
158
|
: undefined;
|
|
@@ -137,30 +162,62 @@ export function createWheelZoomController({ element, resolveTarget, swallowUnhan
|
|
|
137
162
|
const { target } = s;
|
|
138
163
|
if (target) {
|
|
139
164
|
const origin = target.originElement();
|
|
140
|
-
if (s.
|
|
165
|
+
if (s.zoomBacklog !== 0 && origin && s.originLeft === undefined) {
|
|
141
166
|
s.originLeft = origin.getBoundingClientRect().left;
|
|
142
167
|
}
|
|
143
168
|
const originLeft = s.originLeft;
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
169
|
+
if (originLeft === undefined) {
|
|
170
|
+
s.zoomBacklog = 0;
|
|
171
|
+
}
|
|
172
|
+
const step = easeZoomBacklog(s.zoomBacklog, elapsed);
|
|
173
|
+
const apply = () => {
|
|
174
|
+
transaction(() => {
|
|
175
|
+
if (step !== 0 && originLeft !== undefined) {
|
|
176
|
+
const offset = s.lastClientX - originLeft;
|
|
177
|
+
let moved = false;
|
|
178
|
+
for (const view of target.views) {
|
|
179
|
+
const before = view.bpPerPx;
|
|
180
|
+
view.zoomTo(before * Math.exp(step), offset);
|
|
181
|
+
moved ||= view.bpPerPx !== before;
|
|
182
|
+
}
|
|
183
|
+
// pinned at a zoom limit, the rest can never land
|
|
184
|
+
s.zoomBacklog = moved ? s.zoomBacklog - step : 0;
|
|
149
185
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
186
|
+
if (s.scrollDelta !== 0) {
|
|
187
|
+
for (const view of target.views) {
|
|
188
|
+
view.horizontalScroll(s.scrollDelta);
|
|
189
|
+
}
|
|
154
190
|
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
if (target.hold) {
|
|
194
|
+
target.hold(apply);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
apply();
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
s.zoomBacklog = 0;
|
|
157
202
|
}
|
|
158
|
-
s.zoomAccum = 0;
|
|
159
203
|
s.scrollDelta = 0;
|
|
204
|
+
if (s.zoomBacklog !== 0) {
|
|
205
|
+
frame.schedule(flush);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
s.lastRafTime = null;
|
|
209
|
+
}
|
|
160
210
|
}
|
|
161
211
|
function onWheel(event) {
|
|
162
212
|
onEvent?.(event);
|
|
163
|
-
|
|
213
|
+
// A nested vertical scroller preventDefaults exactly what it consumed, and
|
|
214
|
+
// that flag is still readable on the way up, so the view declines what a
|
|
215
|
+
// panel is already scrolling: a trackpad emits a small deltaX alongside
|
|
216
|
+
// every vertical swipe, which used to pan the genome sideways under someone
|
|
217
|
+
// who was only scrolling reads. No timer of our own — the scroll latch
|
|
218
|
+
// holds the whole continuous gesture, boundary included, and releasing it
|
|
219
|
+
// is the pause that ends the gesture.
|
|
220
|
+
const gated = event.defaultPrevented || (presence !== undefined && !presence.isOver);
|
|
164
221
|
const target = gated ? undefined : resolveTarget(event);
|
|
165
222
|
if (target && !(event.shiftKey && target.scrollZoom)) {
|
|
166
223
|
// a gap longer than the frame-elapsed clamp means this event starts a new
|
|
@@ -189,7 +246,7 @@ export function createWheelZoomController({ element, resolveTarget, swallowUnhan
|
|
|
189
246
|
console.warn('[wheelZoom] wheel event not cancelable — scroll sequence already in progress');
|
|
190
247
|
}
|
|
191
248
|
event.preventDefault();
|
|
192
|
-
s.
|
|
249
|
+
s.zoomBacklog = addToZoomBacklog(s.zoomBacklog, wheelZoomAccum(deltaY, isCtrlZoom));
|
|
193
250
|
s.lastClientX = event.clientX;
|
|
194
251
|
s.lastZoomTime = event.timeStamp;
|
|
195
252
|
// drop any side-scroll accumulated earlier this frame — we're zooming,
|
|
@@ -216,7 +273,16 @@ export function createWheelZoomController({ element, resolveTarget, swallowUnhan
|
|
|
216
273
|
Math.abs(deltaX) > Math.abs(2 * deltaY)) {
|
|
217
274
|
event.preventDefault();
|
|
218
275
|
}
|
|
219
|
-
|
|
276
|
+
// Pan on a gesture that is actually sideways. A trackpad puts a small
|
|
277
|
+
// deltaX on every vertical swipe, and panning on it drifted the genome
|
|
278
|
+
// under anyone scrolling a track — including where no panel handler
|
|
279
|
+
// reports the scroll for us to decline, as with the natively-scrolling
|
|
280
|
+
// pinned-tracks block. Ties go vertical, the same way the zoom test
|
|
281
|
+
// above resolves them. With scrollZoom on this changes nothing: a
|
|
282
|
+
// vertical-dominant wheel was already taken as a zoom.
|
|
283
|
+
if (Math.abs(deltaX) > Math.abs(deltaY)) {
|
|
284
|
+
s.scrollDelta = accumulateScroll(s.scrollDelta, deltaX);
|
|
285
|
+
}
|
|
220
286
|
}
|
|
221
287
|
frame.schedule(flush);
|
|
222
288
|
}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
|
+
export interface SettleableView {
|
|
2
|
+
initialized: boolean;
|
|
3
|
+
error: unknown;
|
|
4
|
+
pendingLaunch?: unknown;
|
|
5
|
+
}
|
|
1
6
|
/**
|
|
2
|
-
*
|
|
7
|
+
* A view that is up AND has finished applying whatever launched it.
|
|
8
|
+
*
|
|
9
|
+
* Both terms, for the reason spelled out on {@link whenViewSettled} below.
|
|
10
|
+
* Exported because AppReadyMarker decides the same thing from the same model
|
|
11
|
+
* for the whole app, the two drifted on exactly this second term, and
|
|
12
|
+
* `readinessTerms.test.tsx` in app-core now holds them together.
|
|
13
|
+
*/
|
|
14
|
+
export declare const viewSettled: (view: SettleableView) => boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Wait until a view has either initialized — launch blob consumed and all — or
|
|
17
|
+
* failed, and report which.
|
|
3
18
|
*
|
|
4
19
|
* `initialized` folds in a view's assemblies, so an assembly that fails to load
|
|
5
20
|
* leaves it false **forever**. A bare `when(() => view.initialized)` therefore
|
|
@@ -9,6 +24,15 @@
|
|
|
9
24
|
* export hung behind its dialog's spinner, and a launched breakpoint split view
|
|
10
25
|
* that opened but was never navigated or zoomed.
|
|
11
26
|
*
|
|
27
|
+
* `pendingLaunch` is the other half, and it matters because `initialized` can
|
|
28
|
+
* go true MID-launch: LGV's flips the moment displayedRegions land, while the
|
|
29
|
+
* same apply pass still has tracks to attach — so a caller acting there reads a
|
|
30
|
+
* positioned view with its tracks missing (an SVG export saves it that way).
|
|
31
|
+
* A launch failure cannot hang this: the state machine either clears the blob
|
|
32
|
+
* (materialized, reported as a snackbar) or sets the view's `error`
|
|
33
|
+
* (installInitAutorun's failure policy). A view with no launch machinery has no
|
|
34
|
+
* `pendingLaunch` and the term is vacuously satisfied.
|
|
35
|
+
*
|
|
12
36
|
* Every view exposes a resolved `error` beside `initialized`, so waiting on the
|
|
13
37
|
* pair turns the hang into something reportable. What to report is the caller's,
|
|
14
38
|
* because the vocabularies genuinely differ — an export says "cannot export"
|
|
@@ -16,12 +40,35 @@
|
|
|
16
40
|
* says the launch failed — which is why this returns the answer instead of
|
|
17
41
|
* throwing one wording at both.
|
|
18
42
|
*
|
|
19
|
-
* No time bound, deliberately: `initialized || error` is a
|
|
20
|
-
* slow-but-healthy remote assembly is waited out rather than
|
|
43
|
+
* No time bound, deliberately: `(initialized && launch consumed) || error` is a
|
|
44
|
+
* terminal set, so a slow-but-healthy remote assembly is waited out rather than
|
|
45
|
+
* guessed at. `escape` is how a caller adds the one term that is not the view's
|
|
46
|
+
* own — a session-level render failure for an export, `superseded` for a view
|
|
47
|
+
* an `installInitAutorun` apply is waiting on — which is what keeps a caller
|
|
48
|
+
* from re-spelling the whole predicate around it.
|
|
49
|
+
*
|
|
50
|
+
* **Not for the view whose `apply` you are inside.** `applyInitOnce` clears the
|
|
51
|
+
* launch blob only after awaiting `apply`, so `pendingLaunch` is held for the
|
|
52
|
+
* whole of it and this can end only on `escape` or `error`, never on success.
|
|
53
|
+
* A wait on `self` stays hand-rolled; `reference/VIEW_INIT.md` has the shape.
|
|
21
54
|
*
|
|
22
|
-
* @returns true if the view initialized, false if it
|
|
55
|
+
* @returns true if the view initialized (and consumed any launch), false if it
|
|
56
|
+
* settled on an error
|
|
23
57
|
*/
|
|
24
|
-
export declare function whenViewSettled(view:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
58
|
+
export declare function whenViewSettled(view: SettleableView, escape?: () => boolean): Promise<boolean>;
|
|
59
|
+
/**
|
|
60
|
+
* The same wait over several views at once — a synteny view's genome rows. An
|
|
61
|
+
* SVG export of a split view keeps its own per-panel loop instead: the split
|
|
62
|
+
* view's `initialized` folds in `views.every(v => v.initialized)` but not each
|
|
63
|
+
* panel's own `pendingLaunch`, so that loop is waiting on a different question
|
|
64
|
+
* by the time it runs.
|
|
65
|
+
*
|
|
66
|
+
* One predicate over `every`, never `Promise.all` of the single form: `when`
|
|
67
|
+
* returns a cancellable promise, so racing N of them against an escape leaves
|
|
68
|
+
* N-1 live reactions behind on the path that escapes. This is one reaction with
|
|
69
|
+
* nothing to cancel.
|
|
70
|
+
*
|
|
71
|
+
* @returns true if every view initialized, false if any settled on an error or
|
|
72
|
+
* the escape fired
|
|
73
|
+
*/
|
|
74
|
+
export declare function whenViewsSettled(views: SettleableView[], escape?: () => boolean): Promise<boolean>;
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import { when } from 'mobx';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* A view that is up AND has finished applying whatever launched it.
|
|
4
|
+
*
|
|
5
|
+
* Both terms, for the reason spelled out on {@link whenViewSettled} below.
|
|
6
|
+
* Exported because AppReadyMarker decides the same thing from the same model
|
|
7
|
+
* for the whole app, the two drifted on exactly this second term, and
|
|
8
|
+
* `readinessTerms.test.tsx` in app-core now holds them together.
|
|
9
|
+
*/
|
|
10
|
+
export const viewSettled = (view) => view.initialized && view.pendingLaunch === undefined;
|
|
11
|
+
const done = (view) => viewSettled(view) || !!view.error;
|
|
12
|
+
/**
|
|
13
|
+
* Wait until a view has either initialized — launch blob consumed and all — or
|
|
14
|
+
* failed, and report which.
|
|
4
15
|
*
|
|
5
16
|
* `initialized` folds in a view's assemblies, so an assembly that fails to load
|
|
6
17
|
* leaves it false **forever**. A bare `when(() => view.initialized)` therefore
|
|
@@ -10,6 +21,15 @@ import { when } from 'mobx';
|
|
|
10
21
|
* export hung behind its dialog's spinner, and a launched breakpoint split view
|
|
11
22
|
* that opened but was never navigated or zoomed.
|
|
12
23
|
*
|
|
24
|
+
* `pendingLaunch` is the other half, and it matters because `initialized` can
|
|
25
|
+
* go true MID-launch: LGV's flips the moment displayedRegions land, while the
|
|
26
|
+
* same apply pass still has tracks to attach — so a caller acting there reads a
|
|
27
|
+
* positioned view with its tracks missing (an SVG export saves it that way).
|
|
28
|
+
* A launch failure cannot hang this: the state machine either clears the blob
|
|
29
|
+
* (materialized, reported as a snackbar) or sets the view's `error`
|
|
30
|
+
* (installInitAutorun's failure policy). A view with no launch machinery has no
|
|
31
|
+
* `pendingLaunch` and the term is vacuously satisfied.
|
|
32
|
+
*
|
|
13
33
|
* Every view exposes a resolved `error` beside `initialized`, so waiting on the
|
|
14
34
|
* pair turns the hang into something reportable. What to report is the caller's,
|
|
15
35
|
* because the vocabularies genuinely differ — an export says "cannot export"
|
|
@@ -17,12 +37,41 @@ import { when } from 'mobx';
|
|
|
17
37
|
* says the launch failed — which is why this returns the answer instead of
|
|
18
38
|
* throwing one wording at both.
|
|
19
39
|
*
|
|
20
|
-
* No time bound, deliberately: `initialized || error` is a
|
|
21
|
-
* slow-but-healthy remote assembly is waited out rather than
|
|
40
|
+
* No time bound, deliberately: `(initialized && launch consumed) || error` is a
|
|
41
|
+
* terminal set, so a slow-but-healthy remote assembly is waited out rather than
|
|
42
|
+
* guessed at. `escape` is how a caller adds the one term that is not the view's
|
|
43
|
+
* own — a session-level render failure for an export, `superseded` for a view
|
|
44
|
+
* an `installInitAutorun` apply is waiting on — which is what keeps a caller
|
|
45
|
+
* from re-spelling the whole predicate around it.
|
|
46
|
+
*
|
|
47
|
+
* **Not for the view whose `apply` you are inside.** `applyInitOnce` clears the
|
|
48
|
+
* launch blob only after awaiting `apply`, so `pendingLaunch` is held for the
|
|
49
|
+
* whole of it and this can end only on `escape` or `error`, never on success.
|
|
50
|
+
* A wait on `self` stays hand-rolled; `reference/VIEW_INIT.md` has the shape.
|
|
51
|
+
*
|
|
52
|
+
* @returns true if the view initialized (and consumed any launch), false if it
|
|
53
|
+
* settled on an error
|
|
54
|
+
*/
|
|
55
|
+
export async function whenViewSettled(view, escape = () => false) {
|
|
56
|
+
await when(() => escape() || done(view));
|
|
57
|
+
return viewSettled(view);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The same wait over several views at once — a synteny view's genome rows. An
|
|
61
|
+
* SVG export of a split view keeps its own per-panel loop instead: the split
|
|
62
|
+
* view's `initialized` folds in `views.every(v => v.initialized)` but not each
|
|
63
|
+
* panel's own `pendingLaunch`, so that loop is waiting on a different question
|
|
64
|
+
* by the time it runs.
|
|
65
|
+
*
|
|
66
|
+
* One predicate over `every`, never `Promise.all` of the single form: `when`
|
|
67
|
+
* returns a cancellable promise, so racing N of them against an escape leaves
|
|
68
|
+
* N-1 live reactions behind on the path that escapes. This is one reaction with
|
|
69
|
+
* nothing to cancel.
|
|
22
70
|
*
|
|
23
|
-
* @returns true if
|
|
71
|
+
* @returns true if every view initialized, false if any settled on an error or
|
|
72
|
+
* the escape fired
|
|
24
73
|
*/
|
|
25
|
-
export async function
|
|
26
|
-
await when(() =>
|
|
27
|
-
return
|
|
74
|
+
export async function whenViewsSettled(views, escape = () => false) {
|
|
75
|
+
await when(() => escape() || views.every(done));
|
|
76
|
+
return views.every(viewSettled);
|
|
28
77
|
}
|