@jbrowse/core 5.0.0-beta.8 → 5.0.0-beta.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/README.md +427 -130
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +8 -9
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +8 -13
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +2 -1
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +3 -3
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +1 -0
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +1 -4
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +53 -0
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +0 -16
  19. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
  20. package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
  21. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  22. package/esm/BaseFeatureWidget/formatDetails.js +46 -79
  23. package/esm/BaseFeatureWidget/index.d.ts +1 -0
  24. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +35 -28
  25. package/esm/BaseFeatureWidget/stateModelFactory.js +94 -102
  26. package/esm/BaseFeatureWidget/types.d.ts +3 -0
  27. package/esm/BaseFeatureWidget/util.d.ts +0 -3
  28. package/esm/BaseFeatureWidget/util.js +0 -17
  29. package/esm/PluginLoader.d.ts +14 -9
  30. package/esm/PluginLoader.js +34 -26
  31. package/esm/PluginManager.d.ts +4 -4
  32. package/esm/PluginManager.js +1 -1
  33. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  34. package/esm/ReExports/coreModules.generated.js +492 -0
  35. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  36. package/esm/ReExports/coreWorkerModules.generated.js +453 -0
  37. package/esm/ReExports/frameworkModules.d.ts +2 -0
  38. package/esm/ReExports/frameworkModules.js +67 -0
  39. package/esm/ReExports/frameworkShared.d.ts +12 -0
  40. package/esm/ReExports/frameworkShared.js +16 -0
  41. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  42. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  43. package/esm/ReExports/list.js +493 -79
  44. package/esm/ReExports/modules.d.ts +1 -1
  45. package/esm/ReExports/modules.js +10 -87
  46. package/esm/ReExports/registry.d.ts +1 -0
  47. package/esm/ReExports/registry.js +23 -5
  48. package/esm/ReExports/uiStub.d.ts +2 -1
  49. package/esm/ReExports/uiStub.js +24 -2
  50. package/esm/ReExports/workerModules.js +8 -12
  51. package/esm/TextSearch/TextSearchManager.d.ts +3 -12
  52. package/esm/TextSearch/TextSearchManager.js +22 -10
  53. package/esm/assemblyManager/assembly.d.ts +10 -14
  54. package/esm/assemblyManager/assembly.js +10 -14
  55. package/esm/assemblyManager/assemblyConfigSchema.d.ts +23 -81
  56. package/esm/assemblyManager/assemblyManager.d.ts +10 -16
  57. package/esm/assemblyManager/assemblyManager.js +7 -10
  58. package/esm/assemblyManager/loadRefNameMap.js +3 -3
  59. package/esm/configuration/configurationSchema.d.ts +75 -31
  60. package/esm/configuration/configurationSchema.js +74 -40
  61. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  62. package/esm/configuration/configurationSchemaUnion.js +59 -0
  63. package/esm/configuration/configurationSlot.d.ts +37 -12
  64. package/esm/configuration/configurationSlot.js +83 -22
  65. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  66. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  67. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  68. package/esm/configuration/getConf.d.ts +17 -9
  69. package/esm/configuration/getConf.js +52 -7
  70. package/esm/configuration/index.d.ts +11 -4
  71. package/esm/configuration/index.js +7 -4
  72. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  73. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  74. package/esm/configuration/readConfObject.d.ts +2 -22
  75. package/esm/configuration/readConfObject.js +15 -49
  76. package/esm/configuration/requirements.d.ts +37 -0
  77. package/esm/configuration/requirements.js +88 -0
  78. package/esm/configuration/schemaRegistry.d.ts +21 -1
  79. package/esm/configuration/schemaRegistry.js +11 -0
  80. package/esm/configuration/schemaTypes.d.ts +3 -0
  81. package/esm/configuration/schemaTypes.js +10 -0
  82. package/esm/configuration/slotFacade.d.ts +35 -4
  83. package/esm/configuration/slotFacade.js +96 -9
  84. package/esm/configuration/snapshotPreprocess.d.ts +27 -0
  85. package/esm/configuration/snapshotPreprocess.js +102 -0
  86. package/esm/configuration/types.d.ts +161 -22
  87. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +2 -2
  88. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +11 -2
  89. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +12 -1
  90. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +2 -3
  91. package/esm/data_adapters/BaseAdapter/featureDensity.js +2 -3
  92. package/esm/data_adapters/BaseAdapter/index.d.ts +22 -3
  93. package/esm/data_adapters/BaseAdapter/types.d.ts +3 -4
  94. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  95. package/esm/data_adapters/BaseAdapter/zoomRange.js +1 -0
  96. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +9 -11
  97. package/esm/data_adapters/getSequenceSubAdapter.d.ts +1 -3
  98. package/esm/data_adapters/getSequenceSubAdapter.js +1 -3
  99. package/esm/pluggableElementTypes/AdapterType.d.ts +7 -7
  100. package/esm/pluggableElementTypes/RpcMethodType.d.ts +1 -1
  101. package/esm/pluggableElementTypes/RpcMethodType.js +3 -8
  102. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  103. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  104. package/esm/pluggableElementTypes/index.d.ts +1 -1
  105. package/esm/pluggableElementTypes/index.js +1 -1
  106. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +17 -7
  107. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +45 -48
  108. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +40 -36
  109. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +10 -13
  110. package/esm/pluggableElementTypes/models/BaseTrackModel.js +6 -6
  111. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +37 -17
  112. package/esm/pluggableElementTypes/models/BaseViewModel.js +25 -10
  113. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  114. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +1 -1
  115. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  116. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  117. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  118. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +57 -141
  119. package/esm/pluggableElementTypes/models/baseTrackConfig.js +22 -26
  120. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +2 -2
  121. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  122. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  123. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +15 -7
  124. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +38 -29
  125. package/esm/pluggableElementTypes/models/index.d.ts +1 -2
  126. package/esm/pluggableElementTypes/models/index.js +1 -2
  127. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +3 -3
  128. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +4 -4
  129. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  130. package/esm/rpc/BaseRpcDriver.d.ts +1 -2
  131. package/esm/rpc/BaseRpcDriver.js +23 -30
  132. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  133. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  134. package/esm/rpc/RpcClient.d.ts +17 -6
  135. package/esm/rpc/RpcClient.js +42 -12
  136. package/esm/rpc/RpcManager.d.ts +8 -10
  137. package/esm/rpc/RpcManager.js +1 -1
  138. package/esm/rpc/RpcRegistry.d.ts +8 -2
  139. package/esm/rpc/RpcServer.d.ts +3 -1
  140. package/esm/rpc/RpcServer.js +19 -12
  141. package/esm/rpc/WebWorkerRpcDriver.d.ts +3 -3
  142. package/esm/rpc/WebWorkerRpcDriver.js +9 -47
  143. package/esm/rpc/byteBudget.d.ts +3 -5
  144. package/esm/rpc/byteBudget.js +4 -4
  145. package/esm/rpc/configSchema.d.ts +7 -21
  146. package/esm/rpc/coreRpcMethods.d.ts +1 -0
  147. package/esm/rpc/coreRpcMethods.js +1 -0
  148. package/esm/rpc/methods/CoreEncodeFeatures.d.ts +6 -5
  149. package/esm/rpc/methods/CoreEncodeFeatures.js +26 -31
  150. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  151. package/esm/rpc/methods/CoreGetEncodedFeature.js +31 -0
  152. package/esm/rpc/methods/CoreGetExportData.js +2 -2
  153. package/esm/rpc/methods/CoreGetFeatureDensity.js +2 -2
  154. package/esm/rpc/methods/CoreGetFeatures.js +2 -2
  155. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  156. package/esm/rpc/methods/layerFeatures.d.ts +26 -0
  157. package/esm/rpc/methods/layerFeatures.js +40 -0
  158. package/esm/svg/SvgExport.js +3 -4
  159. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  160. package/esm/svg/SvgThemeProviders.js +15 -0
  161. package/esm/svg/exportViewSvg.d.ts +32 -0
  162. package/esm/svg/exportViewSvg.js +13 -0
  163. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  164. package/esm/svg/normalizeSvgMarkup.js +99 -0
  165. package/esm/svg/serializeSvg.d.ts +7 -0
  166. package/esm/svg/serializeSvg.js +11 -0
  167. package/esm/svg/svgReady.d.ts +8 -7
  168. package/esm/svg/svgReady.js +8 -7
  169. package/esm/svg/trackNames.d.ts +5 -5
  170. package/esm/svg/trackNames.js +6 -6
  171. package/esm/svg/wrapSvgExport.js +6 -74
  172. package/esm/ui/CascadingMenu.js +83 -86
  173. package/esm/ui/ErrorMessageStackTraceDialog.js +0 -5
  174. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  175. package/esm/ui/HoverMenu.d.ts +1 -2
  176. package/esm/ui/HoverMenu.js +6 -3
  177. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  178. package/esm/ui/JexlFilterDialog.js +122 -49
  179. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  180. package/esm/ui/JexlFilterRowEditors.js +90 -0
  181. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  182. package/esm/ui/LazyBaseTooltip.js +9 -0
  183. package/esm/ui/LoadingOverlay.js +3 -1
  184. package/esm/ui/MonospaceTextField.d.ts +2 -1
  185. package/esm/ui/MonospaceTextField.js +21 -19
  186. package/esm/ui/PaletteContext.d.ts +7 -9
  187. package/esm/ui/PaletteContext.js +24 -10
  188. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  189. package/esm/ui/RefNameAutocomplete/index.js +1 -1
  190. package/esm/ui/ScrollChrome.d.ts +6 -9
  191. package/esm/ui/ScrollChrome.js +5 -6
  192. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  193. package/esm/ui/ScrollEdgeShadow.js +9 -24
  194. package/esm/ui/SettingsChangesTable.js +3 -3
  195. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  196. package/esm/ui/VerticalScrollbar.js +29 -83
  197. package/esm/ui/ViewLoadingScreen.d.ts +2 -2
  198. package/esm/ui/ViewLoadingScreen.js +3 -3
  199. package/esm/ui/colorScale.d.ts +26 -1
  200. package/esm/ui/colorScale.js +28 -5
  201. package/esm/ui/colors.d.ts +49 -1
  202. package/esm/ui/colors.js +139 -4
  203. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  204. package/esm/ui/hoverBoxStyle.js +17 -2
  205. package/esm/ui/index.d.ts +5 -3
  206. package/esm/ui/index.js +9 -7
  207. package/esm/ui/launchViewMenu.js +3 -3
  208. package/esm/ui/legendSpec.d.ts +2 -0
  209. package/esm/ui/legendSpec.js +3 -0
  210. package/esm/ui/palette.d.ts +0 -1
  211. package/esm/ui/palette.js +3 -27
  212. package/esm/ui/replaceViewAction.d.ts +1 -1
  213. package/esm/ui/replaceViewAction.js +1 -1
  214. package/esm/ui/theme.d.ts +1 -1
  215. package/esm/ui/theme.js +6 -40
  216. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  217. package/esm/ui/viewHeaderHeight.js +1 -0
  218. package/esm/util/Base1DUtils.d.ts +1 -1
  219. package/esm/util/Base1DUtils.js +2 -2
  220. package/esm/util/SvgCanvas.d.ts +15 -13
  221. package/esm/util/SvgCanvas.js +72 -53
  222. package/esm/util/aborting.d.ts +39 -0
  223. package/esm/util/aborting.js +84 -0
  224. package/esm/util/adapterMetadata.d.ts +1 -1
  225. package/esm/util/adapterMetadata.js +6 -6
  226. package/esm/util/addAndShowTrack.d.ts +1 -4
  227. package/esm/util/addRelativeUris.d.ts +10 -2
  228. package/esm/util/addRelativeUris.js +22 -7
  229. package/esm/util/addTrackFromWidget.d.ts +2 -5
  230. package/esm/util/animationAllowed.d.ts +9 -0
  231. package/esm/util/animationAllowed.js +13 -0
  232. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  233. package/esm/util/applyRowResizeWheel.js +10 -21
  234. package/esm/util/bandLayout.d.ts +4 -4
  235. package/esm/util/bandLayout.js +4 -4
  236. package/esm/util/bezierConnector.js +5 -4
  237. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  238. package/esm/util/bgzfWorkerPool.js +20 -74
  239. package/esm/util/cachedSetup.d.ts +1 -1
  240. package/esm/util/cachedSetup.js +2 -2
  241. package/esm/util/categoricalField.d.ts +37 -0
  242. package/esm/util/categoricalField.js +52 -0
  243. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  244. package/esm/util/color/cssColorsLevel4.js +1 -0
  245. package/esm/util/color/index.d.ts +5 -3
  246. package/esm/util/color/index.js +7 -4
  247. package/esm/util/colorBits.d.ts +1 -2
  248. package/esm/util/colorBits.js +17 -39
  249. package/esm/util/colorRamp.d.ts +27 -1
  250. package/esm/util/colorRamp.js +56 -2
  251. package/esm/util/colorSchemes.d.ts +9 -0
  252. package/esm/util/colorSchemes.js +7 -0
  253. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +11 -14
  254. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +14 -26
  255. package/esm/util/cssColorParse.d.ts +15 -0
  256. package/esm/util/cssColorParse.js +53 -0
  257. package/esm/util/diagonalizeRegions.d.ts +2 -3
  258. package/esm/util/diagonalizeRegions.js +7 -12
  259. package/esm/util/expandLooseSearchIndex.d.ts +7 -0
  260. package/esm/util/expandLooseSearchIndex.js +25 -0
  261. package/esm/util/featureTransforms.d.ts +30 -3
  262. package/esm/util/featureTransforms.js +233 -36
  263. package/esm/util/fetchAndMaybeUnzip.js +5 -6
  264. package/esm/util/fetchContext.d.ts +5 -6
  265. package/esm/util/fetchContext.js +1 -1
  266. package/esm/util/fetchHub.d.ts +3 -1
  267. package/esm/util/fetchHub.js +2 -2
  268. package/esm/util/fetchSeq.d.ts +2 -3
  269. package/esm/util/fetchSeq.js +2 -2
  270. package/esm/util/fieldReader.d.ts +17 -0
  271. package/esm/util/fieldReader.js +62 -0
  272. package/esm/util/groupKeys.d.ts +75 -0
  273. package/esm/util/groupKeys.js +152 -0
  274. package/esm/util/highlights.d.ts +6 -4
  275. package/esm/util/highlights.js +12 -25
  276. package/esm/util/hooks.d.ts +1 -2
  277. package/esm/util/hooks.js +1 -2
  278. package/esm/util/index.d.ts +3 -3
  279. package/esm/util/index.js +4 -3
  280. package/esm/util/indexCandidates.js +1 -1
  281. package/esm/util/installFetch.d.ts +13 -10
  282. package/esm/util/installFetch.js +11 -10
  283. package/esm/util/installPrerequisiteFetch.d.ts +5 -3
  284. package/esm/util/installPrerequisiteFetch.js +3 -4
  285. package/esm/util/io/index.js +12 -12
  286. package/esm/util/isDataCurrent.d.ts +7 -5
  287. package/esm/util/isDataCurrent.js +9 -6
  288. package/esm/util/jexl.js +24 -21
  289. package/esm/util/jexlFilterRows.d.ts +89 -0
  290. package/esm/util/jexlFilterRows.js +252 -0
  291. package/esm/util/jexlFilters.d.ts +7 -5
  292. package/esm/util/jexlStrings.d.ts +3 -4
  293. package/esm/util/jexlStrings.js +2 -3
  294. package/esm/util/legendCandidates.d.ts +31 -27
  295. package/esm/util/legendCandidates.js +79 -53
  296. package/esm/util/localStorage.js +4 -4
  297. package/esm/util/markEncoding.d.ts +32 -16
  298. package/esm/util/markEncoding.js +177 -150
  299. package/esm/util/markEncodingTypes.d.ts +137 -66
  300. package/esm/util/mstUtils.d.ts +19 -22
  301. package/esm/util/mstUtils.js +19 -22
  302. package/esm/util/numericUtils.d.ts +7 -0
  303. package/esm/util/numericUtils.js +16 -0
  304. package/esm/util/numericValue.d.ts +14 -0
  305. package/esm/util/numericValue.js +34 -0
  306. package/esm/util/openFeatureWidget.js +1 -2
  307. package/esm/util/openViews.d.ts +1 -0
  308. package/esm/util/openViews.js +3 -3
  309. package/esm/util/parseLineByLine.d.ts +3 -4
  310. package/esm/util/parseLineByLine.js +7 -13
  311. package/esm/util/progress.d.ts +21 -21
  312. package/esm/util/progress.js +27 -26
  313. package/esm/util/renameRegions.d.ts +1 -2
  314. package/esm/util/renderToStaticMarkup.js +16 -16
  315. package/esm/util/rxjs.d.ts +7 -8
  316. package/esm/util/rxjs.js +12 -15
  317. package/esm/util/simpleFeature.d.ts +0 -1
  318. package/esm/util/svgColorProps.d.ts +11 -0
  319. package/esm/util/svgColorProps.js +28 -1
  320. package/esm/util/tabix.d.ts +3 -4
  321. package/esm/util/tabix.js +6 -7
  322. package/esm/util/thresholdScale.d.ts +54 -0
  323. package/esm/util/thresholdScale.js +112 -0
  324. package/esm/util/timeGate.d.ts +4 -5
  325. package/esm/util/timeGate.js +4 -5
  326. package/esm/util/trackConfigDelta.d.ts +22 -18
  327. package/esm/util/trackConfigDelta.js +40 -38
  328. package/esm/util/tracks.d.ts +27 -4
  329. package/esm/util/tracks.js +116 -43
  330. package/esm/util/translateTranscript.d.ts +44 -0
  331. package/esm/util/translateTranscript.js +102 -0
  332. package/esm/util/types/index.d.ts +19 -7
  333. package/esm/util/types/services.d.ts +1 -1
  334. package/esm/util/unknownSnapshotKeys.d.ts +15 -0
  335. package/esm/util/unknownSnapshotKeys.js +13 -0
  336. package/esm/util/useFeatureSequence.js +4 -4
  337. package/esm/util/useFetch.d.ts +3 -4
  338. package/esm/util/useFetch.js +5 -6
  339. package/esm/util/usePanelVirtualScroll.d.ts +7 -39
  340. package/esm/util/usePanelVirtualScroll.js +9 -40
  341. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  342. package/esm/util/useRowVirtualScroll.js +8 -49
  343. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  344. package/esm/util/useVirtualScrollWheel.js +40 -84
  345. package/esm/util/viewHighlights.d.ts +3 -0
  346. package/esm/util/viewHighlights.js +5 -0
  347. package/esm/util/viewStatus.d.ts +24 -15
  348. package/esm/util/viewStatus.js +17 -0
  349. package/esm/util/withLaunchInput.d.ts +1 -1
  350. package/esm/util/withLaunchInput.js +0 -4
  351. package/package.json +26 -12
  352. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  353. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  354. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  355. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  356. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  357. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  358. package/esm/ReExports/barrelOnlyNames.d.ts +0 -5
  359. package/esm/ReExports/barrelOnlyNames.js +0 -63
  360. package/esm/ReExports/index.d.ts +0 -1
  361. package/esm/ReExports/index.js +0 -1
  362. package/esm/ReExports/publicTracks.d.ts +0 -1
  363. package/esm/ReExports/publicTracks.js +0 -14
  364. package/esm/ReExports/publicUi.d.ts +0 -4
  365. package/esm/ReExports/publicUi.js +0 -33
  366. package/esm/ReExports/publicUtil.d.ts +0 -1
  367. package/esm/ReExports/publicUtil.js +0 -32
  368. package/esm/ReExports/sharedModules.d.ts +0 -96
  369. package/esm/ReExports/sharedModules.js +0 -66
  370. package/esm/ReExports/workerNamespaceNames.d.ts +0 -11
  371. package/esm/ReExports/workerNamespaceNames.js +0 -275
  372. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  373. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  374. package/esm/ui/highlightChipReveal.d.ts +0 -32
  375. package/esm/ui/highlightChipReveal.js +0 -39
  376. package/esm/util/adapterConfigKey.d.ts +0 -12
  377. package/esm/util/adapterConfigKey.js +0 -14
  378. package/esm/util/stopToken.d.ts +0 -212
  379. package/esm/util/stopToken.js +0 -438
@@ -1,4 +1,4 @@
1
- import type { FeatureFormatter } from '../types.tsx';
1
+ import type { FeatureFormatter, FieldActions } from '../types.tsx';
2
2
  /**
3
3
  * An array of objects renders each element as its own `Attributes` block and
4
4
  * draws no label row at this level; anything else is one labelled row like any
@@ -7,11 +7,12 @@ import type { FeatureFormatter } from '../types.tsx';
7
7
  * to make the same call.
8
8
  */
9
9
  export declare function isObjectArray(value: unknown[]): value is Record<string, unknown>[];
10
- export default function ArrayValue({ name, value, description, formatter, prefix, width, }: {
10
+ export default function ArrayValue({ name, value, description, formatter, fieldActions, prefix, width, }: {
11
11
  description?: React.ReactNode;
12
12
  name: string;
13
13
  value: unknown[];
14
14
  formatter?: FeatureFormatter;
15
+ fieldActions?: FieldActions;
15
16
  prefix?: string[];
16
17
  width?: number;
17
18
  }): import("react").JSX.Element;
@@ -4,6 +4,7 @@ import { isObject } from '../../util/index.js';
4
4
  import { makeStyles } from '../../util/tss-react/index.js';
5
5
  import Attributes from './Attributes.js';
6
6
  import BasicValue from './BasicValue.js';
7
+ import FieldActionsButton, { useRevealFieldActions, } from './FieldActionsButton.js';
7
8
  import FieldName from './FieldName.js';
8
9
  const MAX_ARRAY_LENGTH = 100;
9
10
  // Numeric arrays (e.g. base-modification probabilities, per-base scores) are
@@ -34,8 +35,9 @@ const useStyles = makeStyles()(theme => ({
34
35
  export function isObjectArray(value) {
35
36
  return value.every(isObject);
36
37
  }
37
- export default function ArrayValue({ name, value, description, formatter, prefix = [], width, }) {
38
- const { classes } = useStyles();
38
+ export default function ArrayValue({ name, value, description, formatter, fieldActions, prefix = [], width, }) {
39
+ const { classes, cx } = useStyles();
40
+ const reveal = useRevealFieldActions();
39
41
  const [showAll, setShowAll] = useState(false);
40
42
  const limit = value.every(v => typeof v === 'number')
41
43
  ? MAX_NUMERIC_ARRAY_LENGTH
@@ -44,7 +46,7 @@ export default function ArrayValue({ name, value, description, formatter, prefix
44
46
  const displayedValues = needsTruncation && !showAll ? value.slice(0, limit) : value;
45
47
  return isObjectArray(value) ? (value.length === 1 ? (_jsx(Attributes, { formatter: formatter, attributes: value[0], prefix: [...prefix, name] })) : (_jsx(_Fragment, { children: value.map((val, i) => (_jsx(Attributes
46
48
  // eslint-disable-next-line @eslint-react/no-array-index-key -- static positional list of attribute objects, no unique field available
47
- , { formatter: formatter, attributes: val, prefix: [...prefix, `${name}-${i}`] }, i))) }))) : (_jsxs("div", { className: classes.field, children: [_jsx(FieldName, { prefix: prefix, description: description, name: name, width: width }), value.length === 1 ? (_jsx(BasicValue, { value: formatter ? formatter(value[0], name, 0) : value[0] })) : (_jsxs(_Fragment, { children: [displayedValues.map((val, i) => (_jsx("div", { className: classes.fieldSubvalue, children: _jsx(BasicValue, { value: formatter ? formatter(val, name, i) : val }) }, `${String(val)}-${i}`))), needsTruncation ? (_jsx("button", { type: "button", onClick: () => {
49
+ , { formatter: formatter, attributes: val, prefix: [...prefix, `${name}-${i}`] }, i))) }))) : (_jsxs("div", { className: cx(classes.field, reveal), children: [_jsx(FieldName, { prefix: prefix, description: description, name: name, width: width }), value.length === 1 ? (_jsxs(_Fragment, { children: [_jsx(BasicValue, { value: formatter ? formatter(value[0], name, 0) : value[0] }), _jsx(FieldActionsButton, { path: [...prefix, name], value: value[0], fieldActions: fieldActions })] })) : (_jsxs(_Fragment, { children: [displayedValues.map((val, i) => (_jsx("div", { className: classes.fieldSubvalue, children: _jsx(BasicValue, { value: formatter ? formatter(val, name, i) : val }) }, `${String(val)}-${i}`))), needsTruncation ? (_jsx("button", { type: "button", onClick: () => {
48
50
  setShowAll(v => !v);
49
51
  }, children: showAll
50
52
  ? 'Show less'
@@ -1,12 +1,10 @@
1
- import type { Descriptors, FeatureFormatter } from '../types.tsx';
1
+ import type { Descriptors, FeatureFormatter, FieldActions } from '../types.tsx';
2
2
  export default function Attributes(props: {
3
- attributes: {
4
- [key: string]: unknown;
5
- __jbrowsefmt?: Record<string, unknown>;
6
- };
3
+ attributes: Record<string, unknown>;
7
4
  omit?: string[];
8
5
  omitSingleLevel?: string[];
9
6
  formatter?: FeatureFormatter;
7
+ fieldActions?: FieldActions;
10
8
  descriptions?: Descriptors;
11
9
  prefix?: string[];
12
10
  hideUris?: boolean;
@@ -4,7 +4,7 @@ import { isLocalPathLocation, isObject, isUriLocation, measureText, } from '../.
4
4
  import ArrayValue, { isObjectArray } from './ArrayValue.js';
5
5
  import SimpleField from './SimpleField.js';
6
6
  import UriAttribute from './UriField.js';
7
- import { accessNested, applyFeatureFormatting } from './util.js';
7
+ import { accessNested } from './util.js';
8
8
  // Lazy: reaches @mui/x-data-grid, and this module sits on the eager startup
9
9
  // path via product-core's ui barrel (AboutDialog -> AboutDialogContents).
10
10
  // Only a homogeneous object array actually renders a grid.
@@ -27,7 +27,6 @@ function isHomogeneousObjectArray(arr) {
27
27
  }
28
28
  // these are always omitted as too detailed
29
29
  const globalOmit = [
30
- '__jbrowsefmt',
31
30
  'length',
32
31
  'position',
33
32
  'subfeatures',
@@ -62,7 +61,7 @@ function measureLabels(attributes, opts) {
62
61
  const { omits, deepOmits, hideUris, prefix } = opts;
63
62
  let widest = 0;
64
63
  const measure = (key) => measureText([...prefix, key].join('.'), FIELD_NAME_FONT_SIZE);
65
- for (const [key, value] of Object.entries(applyFeatureFormatting(attributes))) {
64
+ for (const [key, value] of Object.entries(attributes)) {
66
65
  if (value == null || omits.has(key)) {
67
66
  continue;
68
67
  }
@@ -96,9 +95,9 @@ function widestLabel(attributes, opts) {
96
95
  return Math.ceil(measureLabels(attributes, opts)) + FIELD_NAME_PADDING;
97
96
  }
98
97
  export default function Attributes(props) {
99
- const { attributes, omit = [], omitSingleLevel = [], descriptions, formatter, hideUris, prefix = [], labelWidth, } = props;
98
+ const { attributes, omit = [], omitSingleLevel = [], descriptions, formatter, fieldActions, hideUris, prefix = [], labelWidth, } = props;
100
99
  const omits = new Set([...omit, ...globalOmit, ...omitSingleLevel]);
101
- const filteredFormattedAttributes = Object.entries(applyFeatureFormatting(attributes)).filter(([k, v]) => v != null && !omits.has(k));
100
+ const shown = Object.entries(attributes).filter(([k, v]) => v != null && !omits.has(k));
102
101
  // Measured over the whole subtree on the outermost call, then handed down, so
103
102
  // one card has one label column. Per-level measurement put `type`/`trackId` in
104
103
  // a narrow column, `adapter.type` in a wider one and `adapter.craiLocation` in
@@ -115,13 +114,13 @@ export default function Attributes(props) {
115
114
  hideUris,
116
115
  prefix,
117
116
  }), MAX_FIELD_NAME_WIDTH);
118
- return (_jsx(_Fragment, { children: filteredFormattedAttributes.map(([key, value]) => {
117
+ return (_jsx(_Fragment, { children: shown.map(([key, value]) => {
119
118
  const description = accessNested([...prefix, key], descriptions);
120
119
  if (Array.isArray(value)) {
121
120
  // Only use the data grid when schemas are homogeneous enough;
122
121
  // heterogeneous arrays fall through to ArrayValue which renders
123
122
  // each object as individual field sections instead of disappearing
124
- return isHomogeneousObjectArray(value) ? (_jsx(Suspense, { fallback: null, children: _jsx(DataGridDetails, { name: key, prefix: prefix, value: value }) }, key)) : (_jsx(ArrayValue, { name: key, value: value, formatter: formatter, description: description, prefix: prefix, width: width }, key));
123
+ return isHomogeneousObjectArray(value) ? (_jsx(Suspense, { fallback: null, children: _jsx(DataGridDetails, { name: key, prefix: prefix, value: value }) }, key)) : (_jsx(ArrayValue, { name: key, value: value, formatter: formatter, fieldActions: fieldActions, description: description, prefix: prefix, width: width }, key));
125
124
  }
126
125
  else if (isObject(value)) {
127
126
  // hideUris means "don't show where the data sits". A LocalPathLocation
@@ -132,10 +131,10 @@ export default function Attributes(props) {
132
131
  (isUriLocation(value) || isLocalPathLocation(value))) {
133
132
  return null;
134
133
  }
135
- return isUriLocation(value) ? (_jsx(UriAttribute, { name: key, prefix: prefix, value: value, width: width }, key)) : (_jsx(Attributes, { attributes: value, omit: omit, descriptions: descriptions, formatter: formatter, hideUris: hideUris, prefix: [...prefix, key], labelWidth: width }, key));
134
+ return isUriLocation(value) ? (_jsx(UriAttribute, { name: key, prefix: prefix, value: value, width: width }, key)) : (_jsx(Attributes, { attributes: value, omit: omit, descriptions: descriptions, formatter: formatter, fieldActions: fieldActions, hideUris: hideUris, prefix: [...prefix, key], labelWidth: width }, key));
136
135
  }
137
136
  else {
138
- return (_jsx(SimpleField, { name: key, formatter: formatter, value: value, description: description, prefix: prefix, width: width }, key));
137
+ return (_jsx(SimpleField, { name: key, formatter: formatter, fieldActions: fieldActions, value: value, description: description, prefix: prefix, width: width }, key));
139
138
  }
140
139
  }) }));
141
140
  }
@@ -2,21 +2,16 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
2
2
  import { toLocale } from '../../util/index.js';
3
3
  import Position from './Position.js';
4
4
  import SimpleField from './SimpleField.js';
5
- import { applyFeatureFormatting, isFormattedField } from './util.js';
6
5
  export default function CoreDetails(props) {
7
6
  const { feature } = props;
8
- const formattedFeat = applyFeatureFormatting(feature);
9
- const { start, end } = formattedFeat;
7
+ const { start, end } = feature;
8
+ // Length is derived from the coordinates unless a formatDetails callback
9
+ // named it, which is the only way a `length` key reaches the feature: an
10
+ // adapter's own bookkeeping field of that name is in Attributes' globalOmit
11
+ const length = 'length' in feature ? feature.length : end - start;
10
12
  const displayedDetails = {
11
- ...formattedFeat,
12
- // Length is derived, so it is computed rather than read off the feature --
13
- // but a formatDetails callback that names `length` still wins (and
14
- // `length: null` hides the row), like every other core field. The raw
15
- // feature's own `length`, if any, stays ignored: it is in Attributes'
16
- // globalOmit precisely because adapters use it as bookkeeping.
17
- length: isFormattedField(feature, 'length')
18
- ? formattedFeat.length
19
- : toLocale(end - start),
13
+ ...feature,
14
+ length: typeof length === 'number' ? toLocale(length) : length,
20
15
  };
21
16
  // array (not object) so the display order is explicit, not reliant on JS key
22
17
  // insertion order
@@ -26,7 +21,7 @@ export default function CoreDetails(props) {
26
21
  ['length', 'Length'],
27
22
  ['type', 'Type'],
28
23
  ];
29
- return (_jsxs(_Fragment, { children: [_jsx(SimpleField, { name: "Position", value: _jsx(Position, { ...props, feature: formattedFeat }) }), coreRenderedDetails
24
+ return (_jsxs(_Fragment, { children: [_jsx(SimpleField, { name: "Position", value: _jsx(Position, { ...props }) }), coreRenderedDetails
30
25
  .filter(([key]) => displayedDetails[key] != null)
31
26
  .map(([key, name]) => {
32
27
  const value = displayedDetails[key];
@@ -1,5 +1,5 @@
1
1
  import type { SimpleFeatureSerialized } from '../../util/index.ts';
2
- import type { Descriptors, FeatureDetailsModel, FeatureFormatter } from '../types.tsx';
2
+ import type { Descriptors, FeatureDetailsModel, FeatureFormatter, FieldActions } from '../types.tsx';
3
3
  interface FeatureDetailsProps {
4
4
  model: FeatureDetailsModel;
5
5
  feature: SimpleFeatureSerialized;
@@ -7,6 +7,7 @@ interface FeatureDetailsProps {
7
7
  omit?: string[];
8
8
  descriptions?: Descriptors;
9
9
  formatter?: FeatureFormatter;
10
+ fieldActions?: FieldActions;
10
11
  }
11
12
  declare const FeatureDetails: (props: FeatureDetailsProps) => import("react").JSX.Element;
12
13
  export default FeatureDetails;
@@ -29,7 +29,7 @@ const coreDetails = [
29
29
  'type',
30
30
  ];
31
31
  const FeatureDetails = observer(function FeatureDetails(props) {
32
- const { omit = [], model, feature, depth = 0, descriptions, formatter, } = props;
32
+ const { omit = [], model, feature, depth = 0, descriptions, formatter, fieldActions, } = props;
33
33
  const maxDepth = model.maxDepth ?? Infinity;
34
34
  const { mate: m, name = '', id = '', type = '', subfeatures, uniqueId, } = feature;
35
35
  // resolved rather than raw props: `depth` is what tells a registered panel
@@ -40,7 +40,7 @@ const FeatureDetails = observer(function FeatureDetails(props) {
40
40
  return (_jsxs(BaseCard, { title: generateTitle(name, id, type), children: [joinByDivider([
41
41
  _jsxs(Fragment, { children: [_jsx(SectionHeader, { title: "Core details" }), _jsx(CoreDetails, { ...props })] }, "core"),
42
42
  m ? (_jsxs(Fragment, { children: [_jsx(SectionHeader, { title: "Mate details" }), _jsx(CoreDetails, { ...props, feature: { ...m, uniqueId: `${uniqueId}-mate` } })] }, "mate")) : null,
43
- _jsxs(Fragment, { children: [_jsx(SectionHeader, { title: "Attributes" }), _jsx(Attributes, { attributes: feature, omit: omit, omitSingleLevel: coreDetails, descriptions: descriptions, formatter: formatter })] }, "attributes"),
43
+ _jsxs(Fragment, { children: [_jsx(SectionHeader, { title: "Attributes" }), _jsx(Attributes, { attributes: feature, omit: omit, omitSingleLevel: coreDetails, descriptions: descriptions, formatter: formatter, fieldActions: fieldActions })] }, "attributes"),
44
44
  ].filter(Boolean)), _jsx(ErrorBoundary, { FallbackComponent: e => _jsx(ErrorBanner, { error: e.error }), children: _jsx(SequenceFeatureDetails, { ...props }) }), _jsx(PluggableComponents, { pluginManager: getEnv(model).pluginManager,
45
45
  /** #extensionPoint Core-extraFeaturePanel | sync | Add extra panels to the feature details widget */
46
46
  name: "Core-extraFeaturePanel", props: panelProps }), depth < maxDepth && subfeatures?.length ? (_jsx(BaseCard, { title: "Subfeatures", defaultExpanded: depth === 0 && subfeatures.length <= 20, children: subfeatures.map((sub, idx) => (_jsx(FeatureDetails
@@ -53,6 +53,6 @@ const FeatureDetails = observer(function FeatureDetails(props) {
53
53
  // descriptions and value formatter apply here too -- omitting
54
54
  // them silently dropped e.g. VCF header descriptions and the
55
55
  // truncating <Formatter> from every nested card
56
- descriptions: descriptions, formatter: formatter, omit: omit }, `${uniqueId}_${idx}`))) })) : null] }));
56
+ descriptions: descriptions, formatter: formatter, fieldActions: fieldActions, omit: omit }, `${uniqueId}_${idx}`))) })) : null] }));
57
57
  });
58
58
  export default FeatureDetails;
@@ -0,0 +1,8 @@
1
+ import type { FieldActions } from '../types.tsx';
2
+ /** A class for a field row that shows its FieldActionsButton on hover or focus. */
3
+ export declare function useRevealFieldActions(): string;
4
+ export default function FieldActionsButton({ path, value, fieldActions, }: {
5
+ path: string[];
6
+ value: unknown;
7
+ fieldActions?: FieldActions;
8
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import FilterListIcon from '@mui/icons-material/FilterList';
3
+ import CascadingMenuButton from '../../ui/CascadingMenuButton.js';
4
+ import { makeStyles } from '../../util/tss-react/index.js';
5
+ // on a wrapper because MUI folds an Emotion class handed to one of its
6
+ // components into a class of its own, which a selector naming it never matches
7
+ const useStyles = makeStyles()({
8
+ reveal: {
9
+ opacity: 0,
10
+ },
11
+ });
12
+ /** A class for a field row that shows its FieldActionsButton on hover or focus. */
13
+ export function useRevealFieldActions() {
14
+ const { classes, css } = useStyles();
15
+ const { reveal } = classes;
16
+ return css({
17
+ [`&:hover .${reveal}, &:focus-within .${reveal}`]: { opacity: 1 },
18
+ });
19
+ }
20
+ export default function FieldActionsButton({ path, value, fieldActions, }) {
21
+ const { classes } = useStyles();
22
+ const items = fieldActions?.(path, value) ?? [];
23
+ return items.length > 0 ? (_jsx("span", { className: classes.reveal, children: _jsx(CascadingMenuButton, { menuItems: items, size: "small", tooltip: "Filter by this value", style: { padding: 0 }, children: _jsx(FilterListIcon, { fontSize: "small" }) }) })) : null;
24
+ }
@@ -1,9 +1,10 @@
1
- import type { FeatureFormatter } from '../types.tsx';
2
- export default function SimpleField({ name, value, description, prefix, width, formatter, }: {
1
+ import type { FeatureFormatter, FieldActions } from '../types.tsx';
2
+ export default function SimpleField({ name, value, description, prefix, width, formatter, fieldActions, }: {
3
3
  description?: React.ReactNode;
4
4
  name: string;
5
5
  value: unknown;
6
6
  prefix?: string[];
7
7
  width?: number;
8
8
  formatter?: FeatureFormatter;
9
+ fieldActions?: FieldActions;
9
10
  }): import("react").JSX.Element | null;
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { makeStyles } from '../../util/tss-react/index.js';
3
3
  import BasicValue from './BasicValue.js';
4
+ import FieldActionsButton, { useRevealFieldActions, } from './FieldActionsButton.js';
4
5
  import FieldName from './FieldName.js';
5
6
  const useStyles = makeStyles()({
6
7
  field: {
@@ -8,7 +9,8 @@ const useStyles = makeStyles()({
8
9
  flexWrap: 'wrap',
9
10
  },
10
11
  });
11
- export default function SimpleField({ name, value, description, prefix, width, formatter, }) {
12
- const { classes } = useStyles();
13
- return value != null ? (_jsxs("div", { className: classes.field, children: [_jsx(FieldName, { prefix: prefix, description: description, name: name, width: width }), _jsx(BasicValue, { value: formatter ? formatter(value, name) : value })] })) : null;
12
+ export default function SimpleField({ name, value, description, prefix, width, formatter, fieldActions, }) {
13
+ const { classes, cx } = useStyles();
14
+ const reveal = useRevealFieldActions();
15
+ return value != null ? (_jsxs("div", { className: cx(classes.field, reveal), children: [_jsx(FieldName, { prefix: prefix, description: description, name: name, width: width }), _jsx(BasicValue, { value: formatter ? formatter(value, name) : value }), _jsx(FieldActionsButton, { path: [...(prefix ?? []), name], value: value, fieldActions: fieldActions })] })) : null;
14
16
  }
@@ -6,3 +6,4 @@ export { default as BaseAttributes } from './BaseAttributes.tsx';
6
6
  export { default as BaseCoreDetails } from './BaseCoreDetails.tsx';
7
7
  export { default as FeatureDetails } from './FeatureDetails.tsx';
8
8
  export { default as FeatureWash } from './FeatureWash.tsx';
9
+ export { filterByValueItems, jexlFilterDisplay } from './jexlFilterActions.ts';
@@ -9,10 +9,6 @@ const BaseFeatureDetail = observer(function BaseFeatureDetail({ model, }) {
9
9
  const { error, featureData, parentFeature } = model;
10
10
  // annotated to shed the MST node brand types.frozen() carries on the instance
11
11
  const descriptions = model.descriptions;
12
- // A field is hidden by a formatDetails callback returning undefined (jexl
13
- // can't produce null); every detail component filters with `!= null`, so a
14
- // field set to undefined (live) or null (round-tripped through a snapshot) is
15
- // dropped identically.
16
12
  if (error) {
17
13
  return _jsx(ErrorBanner, { error: error });
18
14
  }
@@ -29,3 +25,4 @@ export { default as BaseAttributes } from './BaseAttributes.js';
29
25
  export { default as BaseCoreDetails } from './BaseCoreDetails.js';
30
26
  export { default as FeatureDetails } from './FeatureDetails.js';
31
27
  export { default as FeatureWash } from './FeatureWash.js';
28
+ export { filterByValueItems, jexlFilterDisplay } from './jexlFilterActions.js';
@@ -0,0 +1,16 @@
1
+ import type { MenuItem } from '../../ui/MenuTypes.ts';
2
+ import type { JexlFilterModel } from '../../util/jexlFilters.ts';
3
+ import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
4
+ export interface JexlFilterDisplay extends JexlFilterModel, IStateTreeNode {
5
+ }
6
+ export declare function isJexlFilterDisplay(thing: unknown): thing is JexlFilterDisplay;
7
+ /** The first of a track's displays that takes jexl filters. */
8
+ export declare function jexlFilterDisplay(track?: {
9
+ displays: readonly unknown[];
10
+ }): JexlFilterDisplay | undefined;
11
+ /**
12
+ * "Show only" and "Hide" items for one feature attribute's value, and "Show
13
+ * only ≥" for a number. Each appends a filter line to the display and offers
14
+ * an undo.
15
+ */
16
+ export declare function filterByValueItems(display: JexlFilterDisplay, path: string[], value: unknown): MenuItem[];
@@ -0,0 +1,53 @@
1
+ import { pathSubject, printCondition } from '@jbrowse/jexl';
2
+ import { activeJexlFilters } from '../../util/jexlFilters.js';
3
+ import { ensureJexlPrefix } from '../../util/jexlStrings.js';
4
+ import { getNotificationSink } from '../../util/sessionServices.js';
5
+ const MAX_LABEL_VALUE = 30;
6
+ export function isJexlFilterDisplay(thing) {
7
+ return (typeof thing === 'object' &&
8
+ thing !== null &&
9
+ 'setJexlFilters' in thing &&
10
+ 'configuredFilters' in thing);
11
+ }
12
+ /** The first of a track's displays that takes jexl filters. */
13
+ export function jexlFilterDisplay(track) {
14
+ return track?.displays.find(isJexlFilterDisplay);
15
+ }
16
+ /**
17
+ * "Show only" and "Hide" items for one feature attribute's value, and "Show
18
+ * only ≥" for a number. Each appends a filter line to the display and offers
19
+ * an undo.
20
+ */
21
+ export function filterByValueItems(display, path, value) {
22
+ if (typeof value !== 'string' && typeof value !== 'number') {
23
+ return [];
24
+ }
25
+ const field = path.join('.');
26
+ const text = String(value);
27
+ const shown = text.length > MAX_LABEL_VALUE ? `${text.slice(0, MAX_LABEL_VALUE)}…` : text;
28
+ const add = (op) => () => {
29
+ const previous = display.jexlFiltersSetting;
30
+ const line = printCondition({
31
+ subject: pathSubject('feature', path),
32
+ op,
33
+ value,
34
+ });
35
+ display.setJexlFilters([
36
+ ...activeJexlFilters(display),
37
+ ensureJexlPrefix(line),
38
+ ]);
39
+ getNotificationSink(display).notify('Filter added', 'info', {
40
+ name: 'Undo',
41
+ onClick: () => {
42
+ display.setJexlFilters(previous && [...previous]);
43
+ },
44
+ });
45
+ };
46
+ return [
47
+ { label: `Show only ${field} = ${shown}`, onClick: add('==') },
48
+ { label: `Hide ${field} = ${shown}`, onClick: add('!=') },
49
+ ...(typeof value === 'number'
50
+ ? [{ label: `Show only ${field} ≥ ${shown}`, onClick: add('>=') }]
51
+ : []),
52
+ ];
53
+ }
@@ -1,11 +1,3 @@
1
1
  export declare function isEmpty(obj: Record<string, unknown>): boolean;
2
- export declare function applyFeatureFormatting<T extends {
3
- __jbrowsefmt?: Record<string, unknown>;
4
- }>(feature: T): T & {
5
- [x: string]: unknown;
6
- };
7
- export declare function isFormattedField(feature: {
8
- __jbrowsefmt?: Record<string, unknown>;
9
- }, key: string): boolean;
10
2
  export declare function generateTitle(name: unknown, id: unknown, type: unknown): string;
11
3
  export declare function accessNested(arr: string[], obj?: Record<string, unknown>): string | undefined;
@@ -3,22 +3,6 @@ import { ellipses } from '../util.js';
3
3
  export function isEmpty(obj) {
4
4
  return Object.keys(obj).length === 0;
5
5
  }
6
- // The view the details panel renders: raw feature fields with the
7
- // formatDetails-callback output (`__jbrowsefmt`) merged on top, so a callback
8
- // value overrides the raw one. A field the callback sets to null/undefined then
9
- // drops out of the panel's `!= null` filters — this is how callbacks hide
10
- // fields. `__jbrowsefmt` itself is in Attributes' globalOmit, so it never
11
- // renders.
12
- export function applyFeatureFormatting(feature) {
13
- return { ...feature, ...feature.__jbrowsefmt };
14
- }
15
- // Whether a formatDetails callback named `key` at all -- including setting it
16
- // to null/undefined, which is how a callback hides a field. Lets a derived row
17
- // (e.g. Length) defer to the callback without treating "hidden" as "absent".
18
- export function isFormattedField(feature, key) {
19
- const fmt = feature.__jbrowsefmt;
20
- return fmt !== undefined && key in fmt;
21
- }
22
6
  export function generateTitle(name, id, type) {
23
7
  const label = name || id;
24
8
  return [label ? ellipses(`${label}`) : '', type ? `${type}` : '']
@@ -1,42 +1,14 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { observer } from 'mobx-react';
3
- import { getGeneticCode, parseTranslTable, relativizeTranslExcept, } from '../../util/geneticCodes.js';
3
+ import { getGeneticCode } from '../../util/geneticCodes.js';
4
+ import SimpleFeature from '../../util/simpleFeature.js';
5
+ import { transcriptGeneticCodeId, transcriptTranslExcept, } from '../../util/translateTranscript.js';
4
6
  import { modeHasUpDownstream, modeSupportsRevcomp, resolveShowCoordinates, } from './featureTypeUtil.js';
5
7
  import CDNASequence from './seqtypes/CDNASequence.js';
6
8
  import CDSSequence from './seqtypes/CDSSequence.js';
7
9
  import GenomicSequence from './seqtypes/GenomicSequence.js';
8
10
  import ProteinSequence from './seqtypes/ProteinSequence.js';
9
11
  import { getSequenceData } from './useSequenceData.js';
10
- function findCdsSubfeature(feature) {
11
- return feature.subfeatures?.find(f => f.type?.toLowerCase() === 'cds');
12
- }
13
- // CDS-bound translation reads `transl_table` off the CDS subfeature (or the
14
- // feature itself), so e.g. a mitochondrial gene translates with table 2 rather
15
- // than the standard code. When the feature carries no transl_table (e.g. UCSC
16
- // genePred-derived GFFs), fall back to the assembly-configured code for the
17
- // contig. Undefined falls back to the standard code.
18
- function proteinGeneticCode(feature, assemblyGeneticCodeId) {
19
- const cds = findCdsSubfeature(feature);
20
- const id = parseTranslTable(feature.transl_table) ??
21
- parseTranslTable(cds?.transl_table) ??
22
- assemblyGeneticCodeId;
23
- return getGeneticCode(id);
24
- }
25
- // Parses transl_except from the feature or its CDS subfeature into the coordinate
26
- // system used by convertCodingSequenceToPeptides (feature-relative, reversed for
27
- // minus-strand genes).
28
- function featureTranslExcept(feature) {
29
- const cds = findCdsSubfeature(feature);
30
- const raw = feature.transl_except ?? cds?.transl_except;
31
- return raw
32
- ? relativizeTranslExcept({
33
- raw,
34
- featureStart: feature.start,
35
- featureLength: feature.end - feature.start,
36
- strand: feature.strand,
37
- })
38
- : [];
39
- }
40
12
  // Dispatches to the renderer for the current sequence type. An observer because
41
13
  // it reads showCoordinatesSetting: that setting moving relative<->genomic
42
14
  // leaves the coarse showCoordinates boolean every other observer here reads
@@ -60,9 +32,10 @@ const SequenceContents = observer(function SequenceContents({ mode, feature, seq
60
32
  case 'cds':
61
33
  return _jsx(CDSSequence, { model: model, cds: cds, sequence: seq });
62
34
  case 'protein': {
63
- const translExcept = featureTranslExcept(feature);
64
- const code = proteinGeneticCode(feature, assemblyGeneticCodeId);
65
- return (_jsx(ProteinSequence, { model: model, cds: cds, sequence: seq, codonTable: code.codonTable, starts: code.starts, translExcept: translExcept.length ? translExcept : undefined }));
35
+ const transcript = new SimpleFeature(feature);
36
+ const translExcept = transcriptTranslExcept(transcript);
37
+ const code = getGeneticCode(transcriptGeneticCodeId(transcript, assemblyGeneticCodeId));
38
+ return (_jsx(ProteinSequence, { model: model, cds: cds, sequence: seq, codonTable: code.codonTable, starts: code.starts, translExcept: translExcept?.length ? translExcept : undefined }));
66
39
  }
67
40
  // cdna and the gene_* variants all render the spliced transcript; introns
68
41
  // and up/downstream flanks are toggled by the mode name
@@ -1,2 +1,2 @@
1
- declare const configSchema: import("../configuration/configurationSchema.ts").ConfigurationSchemaType<{}, import("../configuration/configurationSchema.ts").ConfigurationSchemaOptions<undefined, undefined>>;
1
+ declare const configSchema: import("../configuration/configurationSchema.ts").ConfigurationSchemaType<{}, import("../configuration/configurationSchema.ts").ConfigurationSchemaOptions<undefined, undefined, undefined, import("../configuration/requirements.ts").ConfigurationSchemaRequirement<Partial<Record<string, string[]>>, string>>>;
2
2
  export { configSchema };
@@ -1,38 +1,22 @@
1
1
  import type { AnyConfigurationModel } from '../configuration/index.ts';
2
2
  import type { SimpleFeatureSerialized } from '../util/index.ts';
3
- import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
4
3
  /**
5
- * Anything carrying a `formatDetails` sub-schema: the session (whose
6
- * `configuration.formatDetails` applies to every track) and the clicked
7
- * feature's track. The track is absent when the widget was opened without one,
8
- * or outlived the one it had -- it is a `safeReference` -- and the session-wide
9
- * tier still has to run in that case.
4
+ * The two config nodes carrying a `formatDetails` sub-schema. The session's
5
+ * applies to every track; the track's is absent when the widget was opened
6
+ * without one. The track's object spreads over the session's, and its numbers
7
+ * win.
10
8
  */
11
- export interface FormatDetailsHolder extends IStateTreeNode {
12
- configuration: AnyConfigurationModel;
13
- }
14
9
  export interface FormatDetailsTiers {
15
- session: FormatDetailsHolder;
16
- track?: FormatDetailsHolder;
10
+ session: AnyConfigurationModel;
11
+ track?: AnyConfigurationModel;
17
12
  }
18
- /**
19
- * `depth` or `maxDepth`: the track's value when the track sets one, else the
20
- * session's, else unset.
21
- *
22
- * These override rather than merge, unlike the callback objects. That is only
23
- * expressible because both are `maybeNumber` slots with no `defaultValue` --
24
- * given a schema default the track reported a value whether or not anyone set
25
- * one, so the session-wide tier could never apply to a track, and every real
26
- * config has a track.
27
- */
13
+ /** `depth` or `maxDepth`: the track's value when set, else the session's. */
28
14
  export declare function formatDetailsNumber(tiers: FormatDetailsTiers, slot: string): number | undefined;
29
15
  /**
30
- * A copy of the feature with each tier's callback output merged onto it (and
31
- * onto its subfeatures, down to `depth`) as `__jbrowsefmt`, which the detail
32
- * components spread over the raw fields at render.
33
- *
34
- * `__jbrowsefmt` is attached only where a callback produced something, so a
35
- * config with no `formatDetails` at all leaves the feature exactly as it came
36
- * in rather than stamping empty objects through the persisted snapshot.
16
+ * The feature as the details panel shows it: each tier's `feature` callback
17
+ * output spread over the clicked feature, and `subfeatures` output over each
18
+ * subfeature down to `depth`. A key set to null or undefined hides that row,
19
+ * since every detail component filters with `!= null`. A config declaring no
20
+ * callback gets the input back untouched.
37
21
  */
38
- export declare function applyFormatDetails(tiers: FormatDetailsTiers, featureData: SimpleFeatureSerialized): SimpleFeatureSerialized;
22
+ export declare function applyFormatDetails(tiers: FormatDetailsTiers, feature: SimpleFeatureSerialized): SimpleFeatureSerialized;