@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.10
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 +1476 -265
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
- 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 +16 -9
- 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 +50 -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/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 +2 -2
- 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 +528 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +488 -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 +527 -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 +24 -11
- package/esm/configuration/index.js +15 -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/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 +46 -16
- package/esm/pluggableElementTypes/DisplayType.js +22 -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/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 +1 -1
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
- package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
- 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 -49
- 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/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/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 +1 -1
- package/esm/util/cachedSetup.js +2 -2
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -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/{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 +80 -0
- package/esm/util/featureTransforms.js +1579 -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/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/groupKeys.d.ts +77 -0
- package/esm/util/groupKeys.js +155 -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/io/index.js +19 -14
- 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 +20 -27
- package/esm/util/jexlFilters.js +23 -11
- 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/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +845 -0
- package/esm/util/markEncodingTypes.d.ts +588 -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/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +82 -0
- package/esm/util/stepTables.js +243 -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 +13 -8
- package/esm/util/tabix.js +17 -12
- 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 +121 -40
- package/esm/util/tracks.js +497 -112
- 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 +51 -0
- package/esm/util/unknownSnapshotKeys.js +82 -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/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- 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/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +70 -20
- 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
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { isAlive } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
import { installFetch } from './installFetch.js';
|
|
3
|
+
import { isDataCurrent } from './isDataCurrent.js';
|
|
4
|
+
/**
|
|
5
|
+
* `read`'s value while it answers the adapter config `host` holds; undefined
|
|
6
|
+
* until a read of that config commits, which a failed read never does.
|
|
7
|
+
*
|
|
8
|
+
* Equal by value, as the fetch key is: an undo rebuilds the track's config,
|
|
9
|
+
* handing back an equal adapter config the fetch declines to read again.
|
|
10
|
+
*/
|
|
11
|
+
export function readFor(host, read) {
|
|
12
|
+
return read !== undefined &&
|
|
13
|
+
isDataCurrent(read.adapterConfig, host.adapterConfig)
|
|
14
|
+
? read.value
|
|
15
|
+
: undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A **prerequisite read**: one RPC about the adapter itself, beside the
|
|
19
|
+
* display's primary fetch. Four in the tree — HiC's `CoreGetInfo` header read,
|
|
20
|
+
* whose `resolutions` every contacts fetch waits on; the multi-sample sample
|
|
21
|
+
* list, which `fetchNeeded` declines until; the tiered alignment file's
|
|
22
|
+
* `CoreGetInfo` header, which decides the LOD tier a synteny fetch asks for;
|
|
23
|
+
* and the mark display's source list, which gives each listed source a row —
|
|
24
|
+
* and they sit on three different fetch foundations, which is why this sits in
|
|
25
|
+
* core beside the skeleton and not beside any of them.
|
|
26
|
+
*
|
|
27
|
+
* They had the shape below hand-copied, comment for comment, and each term is a
|
|
28
|
+
* rule rather than a preference:
|
|
29
|
+
*
|
|
30
|
+
* - **the adapter config is the whole trigger and the whole key.** Tracked in
|
|
31
|
+
* `prepare` so a config-editor edit re-reads; keyed on the same value so an
|
|
32
|
+
* un-minimize over the same file re-reads nothing. Getting one without the
|
|
33
|
+
* other gives either a stale header or a walk of a `.hic` norm-vector index on
|
|
34
|
+
* every expand.
|
|
35
|
+
* - **the answer carries the same key** (`AdapterRead`), and a display reads
|
|
36
|
+
* it through `readFor`, so an answer to a previous adapter config is never
|
|
37
|
+
* read as the current one, and a failed read leaves nothing to clear.
|
|
38
|
+
* - **an answer to a config the display no longer holds is dropped**, and so is
|
|
39
|
+
* its error. An undo that brings back the config already answered makes the
|
|
40
|
+
* skeleton decline a re-read, while the read of the abandoned config runs
|
|
41
|
+
* on, still current; landing, it would stamp its key, force a second read of
|
|
42
|
+
* the held one and hand the display a list for another file, on which the
|
|
43
|
+
* variant display resets its arrangement.
|
|
44
|
+
* - **minimized is the gate**, and a display with a second condition of its own
|
|
45
|
+
* passes `gate` — the sample-list read waits for the LGV to be measured as
|
|
46
|
+
* well, so a full-file scan does not start ahead of the display's own first
|
|
47
|
+
* fetch, and the tier read waits on the track declaring a tier threshold at
|
|
48
|
+
* all.
|
|
49
|
+
* - **no `contract`.** This is the second fetch on a display whose foundation
|
|
50
|
+
* installed both checks already: `assertDisplayContract` would report the
|
|
51
|
+
* double-attach it exists to catch, and a second retry check would consume the
|
|
52
|
+
* same `reloadCounter` bumps as the first.
|
|
53
|
+
* - **where the status goes is the caller's** (`report`). The two LGV reads
|
|
54
|
+
* lend the display's own status window, so the read takes a slot beside the
|
|
55
|
+
* primary fetch rather than opening a second writer over the one status field
|
|
56
|
+
* (ADR-081) — and it matters more here than for most fetches: a prerequisite
|
|
57
|
+
* runs inside the pre-first-paint window, where the scrim is up because
|
|
58
|
+
* nothing is drawn rather than because `isLoading` is, so `statusMessage` is
|
|
59
|
+
* the only thing that can say what is happening. The tier read narrates
|
|
60
|
+
* nothing; a header is not a load.
|
|
61
|
+
*
|
|
62
|
+
* `createAdapterMetadataFetch` keys on the same adapter config and is
|
|
63
|
+
* deliberately NOT one of these: no trigger, no signal and no status,
|
|
64
|
+
* because it is fetched lazily when a details widget opens and the widget opens
|
|
65
|
+
* on the result. A prerequisite read is the one a display's own fetch waits on.
|
|
66
|
+
*
|
|
67
|
+
* **A declaration, not the skeleton this name used to be.** There was an
|
|
68
|
+
* `installPrerequisiteFetch` until 2026-08-23, and `3c5aa7fce2` deleted it for
|
|
69
|
+
* a good reason: it carried a `runOne` of its own — a fifth copy of begin →
|
|
70
|
+
* clear → run → commit-if-current → `handleFetchError` → end — and once
|
|
71
|
+
* `installFetch` owned that sequence, a second one was pure drift surface. This
|
|
72
|
+
* one adds no sequence, no rotation and no error rule; it is terms handed to
|
|
73
|
+
* `installFetch`, the same shape `installGlobalFetchAutorun` and
|
|
74
|
+
* `installComparativeFetchAutorun` are. Add nothing here that a family could
|
|
75
|
+
* not state as an option to the skeleton.
|
|
76
|
+
*
|
|
77
|
+
* Everything the skeleton gives it is the point of going through the skeleton:
|
|
78
|
+
* the latest-wins rotation (so a superseding read aborts the one it replaced,
|
|
79
|
+
* and only a superseding read does — a user cancel of the primary fetch cannot
|
|
80
|
+
* strand the display the way sharing its signal would), the clear at the start,
|
|
81
|
+
* the currency-guarded error rule, the unconditional `reloadCounter` read that
|
|
82
|
+
* makes the chrome's Retry re-run this, and the retired status slot that keeps a
|
|
83
|
+
* failed read from leaving a progress chip up for good.
|
|
84
|
+
*/
|
|
85
|
+
export function installPrerequisiteFetch(self, { name, delay, report, gate = () => true, run, commit, setError, }) {
|
|
86
|
+
installFetch(self, {
|
|
87
|
+
name,
|
|
88
|
+
delay,
|
|
89
|
+
report,
|
|
90
|
+
gate: () => !self.isMinimized && gate(),
|
|
91
|
+
prepare: () => ({ adapterConfig: self.adapterConfig }),
|
|
92
|
+
fetchKey: ({ adapterConfig }) => adapterConfig,
|
|
93
|
+
run: async ({ adapterConfig }, ctx) => {
|
|
94
|
+
const held = () => isAlive(self) && isDataCurrent(adapterConfig, self.adapterConfig);
|
|
95
|
+
try {
|
|
96
|
+
const value = await run(adapterConfig, ctx);
|
|
97
|
+
return held() ? value : undefined;
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
if (held()) {
|
|
101
|
+
throw e;
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
commit: (value, { adapterConfig }) => {
|
|
107
|
+
commit({ adapterConfig, value });
|
|
108
|
+
},
|
|
109
|
+
setError,
|
|
110
|
+
});
|
|
111
|
+
}
|
package/esm/util/io/index.js
CHANGED
|
@@ -19,18 +19,26 @@ export function resolveUriLocation(location) {
|
|
|
19
19
|
: location;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
* The local path a `file:` URI names, or undefined for
|
|
23
|
-
* Windows URL parses as `/C:/data/x.bam`, whose leading slash
|
|
24
|
-
* grammar rather than the path
|
|
22
|
+
* The local path a `file:` URI or a bare absolute path names, or undefined for
|
|
23
|
+
* anything else. A Windows URL parses as `/C:/data/x.bam`, whose leading slash
|
|
24
|
+
* is part of the URL grammar rather than the path, and a host is a network
|
|
25
|
+
* share: `\\server\share\x.bam` is `file://server/share/x.bam`.
|
|
25
26
|
*/
|
|
26
|
-
function
|
|
27
|
+
function uriToLocalPath(uri) {
|
|
28
|
+
if (uri.startsWith('/') || /^[a-z]:[\\/]/i.test(uri)) {
|
|
29
|
+
return uri;
|
|
30
|
+
}
|
|
27
31
|
if (!uri.startsWith('file:')) {
|
|
28
32
|
return undefined;
|
|
29
33
|
}
|
|
30
34
|
try {
|
|
31
|
-
const { pathname } = new URL(uri);
|
|
35
|
+
const { host, pathname } = new URL(uri);
|
|
32
36
|
const decoded = decodeURIComponent(pathname);
|
|
33
|
-
return
|
|
37
|
+
return host && host !== 'localhost'
|
|
38
|
+
? `//${host}${decoded}`
|
|
39
|
+
: /^\/[a-z]:/i.test(decoded)
|
|
40
|
+
? decoded.slice(1)
|
|
41
|
+
: decoded;
|
|
34
42
|
}
|
|
35
43
|
catch {
|
|
36
44
|
return undefined;
|
|
@@ -82,14 +90,11 @@ export function openLocation(location, pluginManager) {
|
|
|
82
90
|
// a config that names its files relative to itself found no account at all
|
|
83
91
|
// and read every one of them unauthenticated.
|
|
84
92
|
const absoluteLocation = resolveUriLocation(location);
|
|
85
|
-
// A file: URI
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
// 'reads.bam'
|
|
89
|
-
|
|
90
|
-
// localPath keeps that whole chain on the one code path that can open a
|
|
91
|
-
// local file, instead of a fetch that no range request survives.
|
|
92
|
-
const localPath = fileUrlToLocalPath(absoluteLocation.uri);
|
|
93
|
+
// A file: URI or a bare absolute path names a file on this machine. A
|
|
94
|
+
// config.json opened from disk resolves `uri: 'reads.bam'` against its own
|
|
95
|
+
// directory to file:///dir/reads.bam, and a session built over MCP writes
|
|
96
|
+
// `uri: '/dir/reads.bam'` with no baseUri at all; fetched, either is a 404.
|
|
97
|
+
const localPath = uriToLocalPath(absoluteLocation.uri);
|
|
93
98
|
if (localPath !== undefined && (isNode || isElectron)) {
|
|
94
99
|
return openLocation({ localPath, locationType: 'LocalPathLocation' });
|
|
95
100
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* is
|
|
2
|
+
* Whether the key held data was committed under still equals the key a fetch
|
|
3
|
+
* issued now would carry. Keys are values compared structurally, so a stamp
|
|
4
|
+
* that kept its identity short-circuits on `===`, and an `undefined`-valued
|
|
5
|
+
* field or a fieldless class instance is still a distinct state — the two
|
|
6
|
+
* shapes `JSON.stringify` flattened. An `undefined` loaded key is nothing
|
|
7
|
+
* fetched yet, so never current.
|
|
6
8
|
*/
|
|
7
|
-
export declare function isDataCurrent(
|
|
9
|
+
export declare function isDataCurrent(loaded: unknown, current: unknown): boolean;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { compareStructural } from 'mobx';
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* is
|
|
3
|
+
* Whether the key held data was committed under still equals the key a fetch
|
|
4
|
+
* issued now would carry. Keys are values compared structurally, so a stamp
|
|
5
|
+
* that kept its identity short-circuits on `===`, and an `undefined`-valued
|
|
6
|
+
* field or a fieldless class instance is still a distinct state — the two
|
|
7
|
+
* shapes `JSON.stringify` flattened. An `undefined` loaded key is nothing
|
|
8
|
+
* fetched yet, so never current.
|
|
6
9
|
*/
|
|
7
|
-
export function isDataCurrent(
|
|
8
|
-
return
|
|
10
|
+
export function isDataCurrent(loaded, current) {
|
|
11
|
+
return loaded !== undefined && compareStructural(loaded, current);
|
|
9
12
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the user is typing into a text field, for a document-level shortcut
|
|
3
|
+
* that must leave that field's own keys alone: ctrl+z undoing typing rather
|
|
4
|
+
* than the session, ctrl+arrow moving the caret rather than the view. A
|
|
5
|
+
* `<textarea>` counts, which the multiline config and JSON editors render.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isTextEntryFocused(): boolean;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the user is typing into a text field, for a document-level shortcut
|
|
3
|
+
* that must leave that field's own keys alone: ctrl+z undoing typing rather
|
|
4
|
+
* than the session, ctrl+arrow moving the caret rather than the view. A
|
|
5
|
+
* `<textarea>` counts, which the multiline config and JSON editors render.
|
|
6
|
+
*/
|
|
7
|
+
export function isTextEntryFocused() {
|
|
8
|
+
const el = document.activeElement;
|
|
9
|
+
if (!(el instanceof HTMLElement)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const tag = el.tagName.toUpperCase();
|
|
13
|
+
// coerced: isContentEditable is declared boolean but is undefined in jsdom,
|
|
14
|
+
// so the raw expression returns undefined for an ordinary focused element
|
|
15
|
+
return tag === 'INPUT' || tag === 'TEXTAREA' || !!el.isContentEditable;
|
|
16
|
+
}
|
package/esm/util/jexl.js
CHANGED
|
@@ -1,23 +1,10 @@
|
|
|
1
1
|
import { Jexl } from '@jbrowse/jexl';
|
|
2
|
+
import { categoricalColor } from '../ui/colors.js';
|
|
2
3
|
import { randomColor } from './color/index.js';
|
|
3
4
|
import { colord } from './colord.js';
|
|
4
5
|
import { jexlFeatureProxy, unwrapFeature } from './simpleFeature.js';
|
|
5
6
|
export default function JexlF( /* config?: any*/) {
|
|
6
7
|
const j = new Jexl();
|
|
7
|
-
// Memoize compilation on the instance itself. A compiled Expression closes
|
|
8
|
-
// over this instance's grammar (its registered functions), so the cache
|
|
9
|
-
// belongs here and is naturally per-instance — there is no shared cache that
|
|
10
|
-
// could bind an expression to the wrong instance's functions.
|
|
11
|
-
const rawCompile = j.compile.bind(j);
|
|
12
|
-
const cache = new Map();
|
|
13
|
-
j.compile = (code) => {
|
|
14
|
-
let expr = cache.get(code);
|
|
15
|
-
if (expr === undefined) {
|
|
16
|
-
expr = rawCompile(code);
|
|
17
|
-
cache.set(code, expr);
|
|
18
|
-
}
|
|
19
|
-
return expr;
|
|
20
|
-
};
|
|
21
8
|
// someday will make sure all of configs callbacks are added in, including
|
|
22
9
|
// ones passed in
|
|
23
10
|
// below are core functions
|
|
@@ -31,15 +18,29 @@ export default function JexlF( /* config?: any*/) {
|
|
|
31
18
|
return p ? jexlFeatureProxy(p) : undefined;
|
|
32
19
|
});
|
|
33
20
|
j.addFunction('id', (feature) => unwrapFeature(feature).id());
|
|
21
|
+
/**
|
|
22
|
+
* #jexlFunction Feature operations - getInherited | getInherited(feature, 'gene_biotype') | the attribute from the feature, or from its nearest ancestor that has it, so a CDS reads its gene's value
|
|
23
|
+
*/
|
|
24
|
+
j.addFunction('getInherited', (feature, name) => {
|
|
25
|
+
let cur = unwrapFeature(feature);
|
|
26
|
+
while (cur !== undefined) {
|
|
27
|
+
const value = cur.get(name);
|
|
28
|
+
if (value !== undefined) {
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
cur = cur.parent?.();
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
});
|
|
34
35
|
// let user cast a jexl type into a javascript type
|
|
35
36
|
j.addFunction('cast', (arg) => arg);
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
// jexl's own list-aware min and max take varargs too; a Math.min
|
|
38
|
+
// registration would replace them
|
|
39
|
+
/**
|
|
40
|
+
* #jexlFunction Math functions | max(0, 2)
|
|
41
|
+
* #jexlFunction Math functions | min(feature.INFO.AF)
|
|
42
|
+
* #jexlFunction Math functions | sqrt(4)
|
|
43
|
+
*/
|
|
43
44
|
j.addFunction('sqrt', Math.sqrt);
|
|
44
45
|
/** #jexlFunction Math functions | ceil(0.5) */
|
|
45
46
|
j.addFunction('ceil', Math.ceil);
|
|
@@ -148,6 +149,8 @@ export default function JexlF( /* config?: any*/) {
|
|
|
148
149
|
// color helpers
|
|
149
150
|
/** #jexlFunction Color functions | randomColor(feature.type) | deterministic color from a string (e.g. a feature type) */
|
|
150
151
|
j.addFunction('randomColor', randomColor);
|
|
152
|
+
/** #jexlFunction Color functions | categoricalColor(getInherited(feature, 'biotype'), ['protein_coding']) | a palette color per value: the values listed take the palette (an optional third argument) in order, any other value a stable color no listed value paints, a missing one grey */
|
|
153
|
+
j.addFunction('categoricalColor', categoricalColor);
|
|
151
154
|
// These take and return CSS color *strings*, not Colord objects: a config
|
|
152
155
|
// `jexl:` expression has no way to construct a Colord, and a color slot
|
|
153
156
|
// holding one resolves to the invalid-color sentinel rather than a color. So
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { AstNode, Subject } from '@jbrowse/jexl';
|
|
2
|
+
export type JexlFilterFieldType = 'number' | 'text' | 'flag';
|
|
3
|
+
export type JexlFilterField = {
|
|
4
|
+
label: string;
|
|
5
|
+
/** unset for a field whose values may be numbers or text */
|
|
6
|
+
type?: JexlFilterFieldType;
|
|
7
|
+
group?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
/** holds several values per feature, so a comparison asks whether any does */
|
|
10
|
+
multi?: boolean;
|
|
11
|
+
values?: string[];
|
|
12
|
+
} & ({
|
|
13
|
+
path: string[];
|
|
14
|
+
} | {
|
|
15
|
+
call: string;
|
|
16
|
+
});
|
|
17
|
+
export interface FieldChoice {
|
|
18
|
+
key: string;
|
|
19
|
+
label: string;
|
|
20
|
+
type?: JexlFilterFieldType;
|
|
21
|
+
subject: Subject;
|
|
22
|
+
group?: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
multi?: boolean;
|
|
25
|
+
values?: string[];
|
|
26
|
+
}
|
|
27
|
+
export type RowOp = '>' | '>=' | '<' | '<=' | '==' | '!=' | 'in' | '~' | 'set' | '!set';
|
|
28
|
+
export declare const OPERATORS: Record<JexlFilterFieldType | 'any', {
|
|
29
|
+
op: RowOp;
|
|
30
|
+
label: string;
|
|
31
|
+
}[]>;
|
|
32
|
+
export interface ConditionRow {
|
|
33
|
+
kind: 'condition';
|
|
34
|
+
id: number;
|
|
35
|
+
line?: number;
|
|
36
|
+
field?: FieldChoice;
|
|
37
|
+
op: RowOp;
|
|
38
|
+
value: string | string[];
|
|
39
|
+
}
|
|
40
|
+
export interface TextRow {
|
|
41
|
+
kind: 'text';
|
|
42
|
+
id: number;
|
|
43
|
+
line?: number;
|
|
44
|
+
text: string;
|
|
45
|
+
}
|
|
46
|
+
export type FilterRow = ConditionRow | TextRow;
|
|
47
|
+
/**
|
|
48
|
+
* Rows keep the index of the stored line they came from until one of that
|
|
49
|
+
* line's rows changes, so an untouched line is written back byte-identical.
|
|
50
|
+
*/
|
|
51
|
+
export interface FilterRows {
|
|
52
|
+
lines: readonly string[];
|
|
53
|
+
rows: FilterRow[];
|
|
54
|
+
}
|
|
55
|
+
interface Parser {
|
|
56
|
+
parse: (text: string) => AstNode | null;
|
|
57
|
+
}
|
|
58
|
+
export declare function resolveFields(fields: readonly JexlFilterField[]): {
|
|
59
|
+
key: string;
|
|
60
|
+
label: string;
|
|
61
|
+
type: JexlFilterFieldType | undefined;
|
|
62
|
+
group: string | undefined;
|
|
63
|
+
description: string | undefined;
|
|
64
|
+
multi: boolean | undefined;
|
|
65
|
+
values: string[] | undefined;
|
|
66
|
+
subject: Subject;
|
|
67
|
+
}[];
|
|
68
|
+
/**
|
|
69
|
+
* The columns an adapter's metadata describes as `{column: description}`, as
|
|
70
|
+
* a BigBed's autoSql does, less those `fields` already lists. Any other
|
|
71
|
+
* metadata describes none.
|
|
72
|
+
*/
|
|
73
|
+
export declare function describedColumns(metadata: unknown, fields: readonly JexlFilterField[]): JexlFilterField[];
|
|
74
|
+
/** A field typed into the picker rather than chosen, read as a dotted path. */
|
|
75
|
+
export declare function typedField(text: string): FieldChoice;
|
|
76
|
+
export declare function stripJexlPrefix(line: string): string;
|
|
77
|
+
export declare function readFilterRows(lines: readonly string[], parser: Parser, choices: readonly FieldChoice[]): FilterRows;
|
|
78
|
+
export declare function addRow(state: FilterRows): FilterRows;
|
|
79
|
+
export declare function replaceRow(state: FilterRows, row: FilterRow): FilterRows;
|
|
80
|
+
export declare function removeRow(state: FilterRows, id: number): FilterRows;
|
|
81
|
+
export declare function withField(row: ConditionRow, field: FieldChoice): ConditionRow;
|
|
82
|
+
export declare function withOp(row: ConditionRow, op: RowOp): ConditionRow;
|
|
83
|
+
/**
|
|
84
|
+
* The stored filters: an untouched line as it was, and every row of an edited
|
|
85
|
+
* line as a line of its own, which is equivalent because lines AND together.
|
|
86
|
+
* Rows left incomplete are dropped.
|
|
87
|
+
*/
|
|
88
|
+
export declare function writeFilterRows({ lines, rows }: FilterRows): string[];
|
|
89
|
+
export {};
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { callSubject, conditions, pathSubject, print, printCondition, } from '@jbrowse/jexl';
|
|
2
|
+
import { JEXL_PREFIX, ensureJexlPrefix, isJexl } from './jexlStrings.js';
|
|
3
|
+
export const OPERATORS = {
|
|
4
|
+
number: [
|
|
5
|
+
{ op: '>', label: '>' },
|
|
6
|
+
{ op: '>=', label: '≥' },
|
|
7
|
+
{ op: '<', label: '<' },
|
|
8
|
+
{ op: '<=', label: '≤' },
|
|
9
|
+
{ op: '==', label: '=' },
|
|
10
|
+
{ op: '!=', label: '≠' },
|
|
11
|
+
],
|
|
12
|
+
text: [
|
|
13
|
+
{ op: '==', label: 'is' },
|
|
14
|
+
{ op: '!=', label: 'is not' },
|
|
15
|
+
{ op: 'in', label: 'is one of' },
|
|
16
|
+
{ op: '~', label: 'matches' },
|
|
17
|
+
],
|
|
18
|
+
flag: [
|
|
19
|
+
{ op: 'set', label: 'is set' },
|
|
20
|
+
{ op: '!set', label: 'is not set' },
|
|
21
|
+
],
|
|
22
|
+
any: [
|
|
23
|
+
{ op: '==', label: 'is' },
|
|
24
|
+
{ op: '!=', label: 'is not' },
|
|
25
|
+
{ op: '>', label: '>' },
|
|
26
|
+
{ op: '>=', label: '≥' },
|
|
27
|
+
{ op: '<', label: '<' },
|
|
28
|
+
{ op: '<=', label: '≤' },
|
|
29
|
+
{ op: 'in', label: 'is one of' },
|
|
30
|
+
{ op: '~', label: 'matches' },
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
const ROW = 'feature';
|
|
34
|
+
function subjectKey(subject) {
|
|
35
|
+
return JSON.stringify(subject.kind === 'path'
|
|
36
|
+
? ['path', ...subject.path]
|
|
37
|
+
: ['call', subject.name, ...subject.args]);
|
|
38
|
+
}
|
|
39
|
+
export function resolveFields(fields) {
|
|
40
|
+
return fields.map(({ label, type, group, description, multi, values, ...source }) => {
|
|
41
|
+
const subject = 'call' in source
|
|
42
|
+
? callSubject(ROW, source.call)
|
|
43
|
+
: pathSubject(ROW, source.path);
|
|
44
|
+
return {
|
|
45
|
+
key: subjectKey(subject),
|
|
46
|
+
label,
|
|
47
|
+
type,
|
|
48
|
+
group,
|
|
49
|
+
description,
|
|
50
|
+
multi,
|
|
51
|
+
values,
|
|
52
|
+
subject,
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
// a feature carries these as refName, start and end
|
|
57
|
+
const BED_LOCUS_COLUMNS = new Set(['chrom', 'chromStart', 'chromEnd']);
|
|
58
|
+
/**
|
|
59
|
+
* The columns an adapter's metadata describes as `{column: description}`, as
|
|
60
|
+
* a BigBed's autoSql does, less those `fields` already lists. Any other
|
|
61
|
+
* metadata describes none.
|
|
62
|
+
*/
|
|
63
|
+
export function describedColumns(metadata, fields) {
|
|
64
|
+
const entries = metadata && typeof metadata === 'object' ? Object.entries(metadata) : [];
|
|
65
|
+
const listed = new Set(fields.map(field => field.label));
|
|
66
|
+
return entries.every((entry) => typeof entry[1] === 'string')
|
|
67
|
+
? entries
|
|
68
|
+
.filter(([name]) => !listed.has(name) && !BED_LOCUS_COLUMNS.has(name))
|
|
69
|
+
.map(([name, description]) => ({
|
|
70
|
+
label: name,
|
|
71
|
+
path: [name],
|
|
72
|
+
description: description || undefined,
|
|
73
|
+
}))
|
|
74
|
+
: [];
|
|
75
|
+
}
|
|
76
|
+
/** A field typed into the picker rather than chosen, read as a dotted path. */
|
|
77
|
+
export function typedField(text) {
|
|
78
|
+
const subject = pathSubject(ROW, text.split('.'));
|
|
79
|
+
return { key: subjectKey(subject), label: text, subject };
|
|
80
|
+
}
|
|
81
|
+
export function stripJexlPrefix(line) {
|
|
82
|
+
return isJexl(line) ? line.slice(JEXL_PREFIX.length) : line;
|
|
83
|
+
}
|
|
84
|
+
/** A field of no known type writes a value that reads as a number as one. */
|
|
85
|
+
function scalar(type, text) {
|
|
86
|
+
const number = Number(text);
|
|
87
|
+
return type === 'number' ||
|
|
88
|
+
(!type && text.trim() !== '' && Number.isFinite(number))
|
|
89
|
+
? number
|
|
90
|
+
: text;
|
|
91
|
+
}
|
|
92
|
+
function subjectLabel(subject) {
|
|
93
|
+
return subject.kind === 'path'
|
|
94
|
+
? subject.path
|
|
95
|
+
.map((key, i) => typeof key === 'number' ? `[${key}]` : i === 0 ? key : `.${key}`)
|
|
96
|
+
.join('')
|
|
97
|
+
: print(subject.node);
|
|
98
|
+
}
|
|
99
|
+
function conditionRow(c, choices, id, line) {
|
|
100
|
+
const value = 'value' in c ? c.value : undefined;
|
|
101
|
+
const key = subjectKey(c.subject);
|
|
102
|
+
const field = choices.find(f => f.key === key) ?? {
|
|
103
|
+
key,
|
|
104
|
+
label: subjectLabel(c.subject),
|
|
105
|
+
type: value === undefined ? 'flag' : undefined,
|
|
106
|
+
subject: c.subject,
|
|
107
|
+
};
|
|
108
|
+
const op = c.op;
|
|
109
|
+
const values = value === undefined ? [] : [value].flat();
|
|
110
|
+
const writesBack = (v) => op === '~' ? typeof v === 'string' : scalar(field.type, String(v)) === v;
|
|
111
|
+
return OPERATORS[field.type ?? 'any'].some(o => o.op === op) &&
|
|
112
|
+
values.every(writesBack)
|
|
113
|
+
? {
|
|
114
|
+
kind: 'condition',
|
|
115
|
+
id,
|
|
116
|
+
line,
|
|
117
|
+
field,
|
|
118
|
+
op,
|
|
119
|
+
value: Array.isArray(value) ? value.map(String) : String(value ?? ''),
|
|
120
|
+
}
|
|
121
|
+
: undefined;
|
|
122
|
+
}
|
|
123
|
+
function parseConditions(text, parser, calls) {
|
|
124
|
+
try {
|
|
125
|
+
return conditions(parser.parse(text), {
|
|
126
|
+
row: ROW,
|
|
127
|
+
accessors: { get: [] },
|
|
128
|
+
calls,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return undefined;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export function readFilterRows(lines, parser, choices) {
|
|
136
|
+
const calls = choices.flatMap(f => f.subject.kind === 'call' ? [f.subject.name] : []);
|
|
137
|
+
const rows = [];
|
|
138
|
+
for (const [line, stored] of lines.entries()) {
|
|
139
|
+
const text = stripJexlPrefix(stored);
|
|
140
|
+
const id = rows.length;
|
|
141
|
+
const read = parseConditions(text, parser, calls)?.map((c, i) => conditionRow(c, choices, id + i, line));
|
|
142
|
+
rows.push(...(read?.every(row => row !== undefined)
|
|
143
|
+
? read
|
|
144
|
+
: [{ kind: 'text', id, line, text: text.trim() }]));
|
|
145
|
+
}
|
|
146
|
+
return { lines, rows };
|
|
147
|
+
}
|
|
148
|
+
function nextId(rows) {
|
|
149
|
+
return rows.reduce((max, row) => Math.max(max, row.id + 1), 0);
|
|
150
|
+
}
|
|
151
|
+
function emptyRow(id) {
|
|
152
|
+
return { kind: 'condition', id, op: '==', value: '' };
|
|
153
|
+
}
|
|
154
|
+
export function addRow(state) {
|
|
155
|
+
return { ...state, rows: [...state.rows, emptyRow(nextId(state.rows))] };
|
|
156
|
+
}
|
|
157
|
+
function detach(rows, id) {
|
|
158
|
+
const line = rows.find(row => row.id === id)?.line;
|
|
159
|
+
return line === undefined
|
|
160
|
+
? rows
|
|
161
|
+
: rows.map(row => (row.line === line ? { ...row, line: undefined } : row));
|
|
162
|
+
}
|
|
163
|
+
export function replaceRow(state, row) {
|
|
164
|
+
return {
|
|
165
|
+
...state,
|
|
166
|
+
rows: detach(state.rows, row.id).map(r => r.id === row.id ? { ...row, line: undefined } : r),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
export function removeRow(state, id) {
|
|
170
|
+
return {
|
|
171
|
+
...state,
|
|
172
|
+
rows: detach(state.rows, id).filter(row => row.id !== id),
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export function withField(row, field) {
|
|
176
|
+
const sameType = row.field?.type === field.type;
|
|
177
|
+
const ops = OPERATORS[field.type ?? 'any'];
|
|
178
|
+
return {
|
|
179
|
+
...row,
|
|
180
|
+
field,
|
|
181
|
+
op: sameType ? row.op : ops[0].op,
|
|
182
|
+
value: sameType ? row.value : '',
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
export function withOp(row, op) {
|
|
186
|
+
const { value } = row;
|
|
187
|
+
return {
|
|
188
|
+
...row,
|
|
189
|
+
op,
|
|
190
|
+
value: op === 'in'
|
|
191
|
+
? Array.isArray(value)
|
|
192
|
+
? value
|
|
193
|
+
: value
|
|
194
|
+
? [value]
|
|
195
|
+
: []
|
|
196
|
+
: Array.isArray(value)
|
|
197
|
+
? (value[0] ?? '')
|
|
198
|
+
: value,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function writeCondition({ field, op, value }) {
|
|
202
|
+
if (!field) {
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
const { subject, type } = field;
|
|
206
|
+
const usable = (v) => v.trim() !== '' && (type !== 'number' || Number.isFinite(Number(v)));
|
|
207
|
+
if (op === 'set' || op === '!set') {
|
|
208
|
+
return printCondition({ subject, op });
|
|
209
|
+
}
|
|
210
|
+
if (op === 'in') {
|
|
211
|
+
const list = [value].flat().filter(usable);
|
|
212
|
+
return list.length > 0
|
|
213
|
+
? printCondition({
|
|
214
|
+
subject,
|
|
215
|
+
op,
|
|
216
|
+
value: list.map(v => scalar(type, v)),
|
|
217
|
+
})
|
|
218
|
+
: undefined;
|
|
219
|
+
}
|
|
220
|
+
const text = [value].flat()[0] ?? '';
|
|
221
|
+
return !usable(text)
|
|
222
|
+
? undefined
|
|
223
|
+
: op === '~'
|
|
224
|
+
? printCondition({ subject, op, value: text })
|
|
225
|
+
: printCondition({ subject, op, value: scalar(type, text) });
|
|
226
|
+
}
|
|
227
|
+
function writeRow(row) {
|
|
228
|
+
const text = row.kind === 'text' ? row.text.trim() || undefined : writeCondition(row);
|
|
229
|
+
return text === undefined ? undefined : ensureJexlPrefix(text);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* The stored filters: an untouched line as it was, and every row of an edited
|
|
233
|
+
* line as a line of its own, which is equivalent because lines AND together.
|
|
234
|
+
* Rows left incomplete are dropped.
|
|
235
|
+
*/
|
|
236
|
+
export function writeFilterRows({ lines, rows }) {
|
|
237
|
+
const out = [];
|
|
238
|
+
let previous;
|
|
239
|
+
for (const row of rows) {
|
|
240
|
+
if (row.line === undefined) {
|
|
241
|
+
const text = writeRow(row);
|
|
242
|
+
if (text !== undefined) {
|
|
243
|
+
out.push(text);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else if (row.line !== previous) {
|
|
247
|
+
out.push(lines[row.line]);
|
|
248
|
+
}
|
|
249
|
+
previous = row.line;
|
|
250
|
+
}
|
|
251
|
+
return out;
|
|
252
|
+
}
|