@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/README.md +1709 -390
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
  28. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
  29. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
  30. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
  31. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
  32. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
  33. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
  34. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
  35. package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
  36. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  37. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  38. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  39. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  40. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  41. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  42. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  43. package/esm/BaseFeatureWidget/util.js +0 -17
  44. package/esm/CorePlugin.js +34 -3
  45. package/esm/PluginLoader.d.ts +24 -13
  46. package/esm/PluginLoader.js +167 -51
  47. package/esm/PluginManager.d.ts +130 -24
  48. package/esm/PluginManager.js +180 -32
  49. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  50. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  51. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  52. package/esm/ReExports/coreModules.generated.js +530 -0
  53. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  54. package/esm/ReExports/coreWorkerModules.generated.js +490 -0
  55. package/esm/ReExports/frameworkModules.d.ts +2 -0
  56. package/esm/ReExports/frameworkModules.js +68 -0
  57. package/esm/ReExports/frameworkShared.d.ts +12 -0
  58. package/esm/ReExports/frameworkShared.js +16 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  60. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  61. package/esm/ReExports/list.js +528 -79
  62. package/esm/ReExports/modules.d.ts +1 -1
  63. package/esm/ReExports/modules.js +10 -165
  64. package/esm/ReExports/registry.d.ts +1 -0
  65. package/esm/ReExports/registry.js +23 -5
  66. package/esm/ReExports/uiStub.d.ts +3 -0
  67. package/esm/ReExports/uiStub.js +33 -0
  68. package/esm/ReExports/workerModules.d.ts +2 -0
  69. package/esm/ReExports/workerModules.js +11 -0
  70. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  71. package/esm/TextSearch/TextSearchManager.js +77 -36
  72. package/esm/TextSearch/places.d.ts +12 -0
  73. package/esm/TextSearch/places.js +94 -0
  74. package/esm/assemblyManager/assembly.d.ts +21 -19
  75. package/esm/assemblyManager/assembly.js +28 -26
  76. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  77. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  78. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  79. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  80. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  81. package/esm/assemblyManager/assemblyManager.js +47 -51
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  83. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  84. package/esm/assemblyManager/geneticCodes.js +2 -5
  85. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  86. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  87. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  88. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  89. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  90. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  91. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  92. package/esm/assemblyManager/refNameMapKey.js +12 -0
  93. package/esm/checkPlugins.d.ts +2 -0
  94. package/esm/checkPlugins.js +38 -17
  95. package/esm/configuration/bamIndexFields.d.ts +49 -0
  96. package/esm/configuration/bamIndexFields.js +41 -0
  97. package/esm/configuration/configurationSchema.d.ts +101 -71
  98. package/esm/configuration/configurationSchema.js +207 -134
  99. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  100. package/esm/configuration/configurationSchemaUnion.js +56 -0
  101. package/esm/configuration/configurationSlot.d.ts +150 -60
  102. package/esm/configuration/configurationSlot.js +103 -75
  103. package/esm/configuration/fillLocations.d.ts +14 -0
  104. package/esm/configuration/fillLocations.js +14 -0
  105. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  106. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  107. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  108. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  109. package/esm/configuration/fullConfSnapshot.js +30 -52
  110. package/esm/configuration/getConf.d.ts +45 -41
  111. package/esm/configuration/getConf.js +111 -44
  112. package/esm/configuration/index.d.ts +26 -11
  113. package/esm/configuration/index.js +16 -7
  114. package/esm/configuration/indexType.d.ts +26 -0
  115. package/esm/configuration/indexType.js +38 -0
  116. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  117. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  118. package/esm/configuration/plot.d.ts +61 -0
  119. package/esm/configuration/plot.js +142 -0
  120. package/esm/configuration/readConfObject.d.ts +2 -24
  121. package/esm/configuration/readConfObject.js +20 -63
  122. package/esm/configuration/requirements.d.ts +37 -0
  123. package/esm/configuration/requirements.js +88 -0
  124. package/esm/configuration/schemaRegistry.d.ts +32 -15
  125. package/esm/configuration/schemaRegistry.js +33 -35
  126. package/esm/configuration/schemaTypes.d.ts +21 -5
  127. package/esm/configuration/schemaTypes.js +66 -55
  128. package/esm/configuration/slotFacade.d.ts +12 -29
  129. package/esm/configuration/slotFacade.js +44 -23
  130. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  131. package/esm/configuration/snapshotPreprocess.js +161 -0
  132. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  133. package/esm/configuration/tabixIndexFields.js +21 -4
  134. package/esm/configuration/tabixShorthand.d.ts +34 -17
  135. package/esm/configuration/tabixShorthand.js +49 -22
  136. package/esm/configuration/types.d.ts +182 -43
  137. package/esm/configuration/uriShorthand.d.ts +9 -0
  138. package/esm/configuration/uriShorthand.js +16 -0
  139. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  140. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  141. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  142. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  143. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  144. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  145. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  146. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  147. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  148. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  149. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  150. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  151. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  152. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  153. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  154. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  155. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  156. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  157. package/esm/data_adapters/dataAdapterCache.js +44 -10
  158. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  159. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  160. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  161. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  162. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  163. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  164. package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
  165. package/esm/pluggableElementTypes/DisplayType.js +28 -12
  166. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  167. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  168. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  169. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  170. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  171. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  172. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  173. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  174. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  175. package/esm/pluggableElementTypes/ViewType.js +32 -4
  176. package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
  177. package/esm/pluggableElementTypes/WidgetType.js +6 -0
  178. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  179. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  180. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  181. package/esm/pluggableElementTypes/index.d.ts +2 -1
  182. package/esm/pluggableElementTypes/index.js +2 -9
  183. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  184. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
  185. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
  186. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  187. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  188. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
  189. package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
  190. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  191. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  192. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  193. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  194. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  195. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  196. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  197. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  198. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  199. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  200. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  201. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  202. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  203. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  204. package/esm/pluggableElementTypes/models/index.js +2 -3
  205. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  206. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  207. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  208. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  209. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  210. package/esm/pluginDefinitions.d.ts +34 -7
  211. package/esm/pluginDefinitions.js +54 -20
  212. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  213. package/esm/rpc/BaseRpcDriver.js +25 -30
  214. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  215. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  216. package/esm/rpc/RpcClient.d.ts +18 -6
  217. package/esm/rpc/RpcClient.js +51 -16
  218. package/esm/rpc/RpcManager.d.ts +14 -10
  219. package/esm/rpc/RpcManager.js +11 -1
  220. package/esm/rpc/RpcRegistry.d.ts +40 -7
  221. package/esm/rpc/RpcServer.d.ts +3 -1
  222. package/esm/rpc/RpcServer.js +19 -12
  223. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  224. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  225. package/esm/rpc/byteBudget.d.ts +20 -5
  226. package/esm/rpc/byteBudget.js +16 -5
  227. package/esm/rpc/configSchema.d.ts +7 -21
  228. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  229. package/esm/rpc/coreRpcMethods.js +4 -0
  230. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  231. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  232. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  233. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  234. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  235. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  236. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  237. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  238. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  239. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  240. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  241. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  242. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  243. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  244. package/esm/rpc/methods/layerFeatures.js +29 -0
  245. package/esm/svg/SvgExport.js +6 -7
  246. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  247. package/esm/svg/SvgThemeProviders.js +15 -0
  248. package/esm/svg/exportViewSvg.d.ts +28 -0
  249. package/esm/svg/exportViewSvg.js +13 -0
  250. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  251. package/esm/svg/normalizeSvgMarkup.js +99 -0
  252. package/esm/svg/serializeSvg.d.ts +7 -0
  253. package/esm/svg/serializeSvg.js +11 -0
  254. package/esm/svg/svgId.d.ts +1 -1
  255. package/esm/svg/svgId.js +1 -1
  256. package/esm/svg/svgReady.d.ts +9 -7
  257. package/esm/svg/svgReady.js +8 -7
  258. package/esm/svg/trackNames.d.ts +7 -5
  259. package/esm/svg/trackNames.js +12 -9
  260. package/esm/svg/wrapSvgExport.js +6 -74
  261. package/esm/ui/AddCustomPluginDialog.js +3 -8
  262. package/esm/ui/AppReadyMarker.d.ts +45 -0
  263. package/esm/ui/AppReadyMarker.js +89 -0
  264. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  265. package/esm/ui/CascadingMenu.js +181 -104
  266. package/esm/ui/DropDownMenu.js +2 -1
  267. package/esm/ui/ErrorBanner.js +1 -1
  268. package/esm/ui/ErrorBoundary.d.ts +2 -2
  269. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  270. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  271. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  272. package/esm/ui/FileDropZone.js +2 -1
  273. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  274. package/esm/ui/HoverMenu.d.ts +1 -2
  275. package/esm/ui/HoverMenu.js +6 -3
  276. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  277. package/esm/ui/JexlFilterDialog.js +122 -50
  278. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  279. package/esm/ui/JexlFilterRowEditors.js +90 -0
  280. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  281. package/esm/ui/LazyBaseTooltip.js +9 -0
  282. package/esm/ui/LegendSwatchGlyph.js +26 -21
  283. package/esm/ui/LoadingOverlay.d.ts +14 -0
  284. package/esm/ui/LoadingOverlay.js +4 -2
  285. package/esm/ui/MenuTypes.d.ts +23 -53
  286. package/esm/ui/MenuTypes.js +3 -0
  287. package/esm/ui/MonospaceTextField.d.ts +2 -1
  288. package/esm/ui/MonospaceTextField.js +23 -20
  289. package/esm/ui/PaletteContext.d.ts +10 -5
  290. package/esm/ui/PaletteContext.js +44 -6
  291. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  292. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  293. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  294. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  295. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  296. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  297. package/esm/ui/ResizeHandle.d.ts +3 -1
  298. package/esm/ui/ResizeHandle.js +44 -11
  299. package/esm/ui/ScrollChrome.d.ts +13 -0
  300. package/esm/ui/ScrollChrome.js +11 -0
  301. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  302. package/esm/ui/ScrollEdgeShadow.js +14 -35
  303. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  304. package/esm/ui/ScrollZoomToggle.js +34 -51
  305. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  306. package/esm/ui/SessionJsonPanel.js +14 -0
  307. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  308. package/esm/ui/SettingsChangesTable.js +49 -11
  309. package/esm/ui/ShareLinkField.d.ts +1 -3
  310. package/esm/ui/ShareLinkField.js +13 -40
  311. package/esm/ui/SizeSliderRow.d.ts +1 -3
  312. package/esm/ui/SizeSliderRow.js +4 -6
  313. package/esm/ui/SnackbarModel.js +79 -67
  314. package/esm/ui/StatusProgressBar.js +2 -2
  315. package/esm/ui/SvgColorLegend.d.ts +9 -4
  316. package/esm/ui/SvgColorLegend.js +82 -41
  317. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  318. package/esm/ui/VerticalScrollbar.js +29 -83
  319. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  320. package/esm/ui/ViewLoadingScreen.js +8 -32
  321. package/esm/ui/colorScale.d.ts +92 -0
  322. package/esm/ui/colorScale.js +72 -0
  323. package/esm/ui/colors.d.ts +64 -0
  324. package/esm/ui/colors.js +230 -1
  325. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  326. package/esm/ui/hoverBoxStyle.js +17 -2
  327. package/esm/ui/index.d.ts +12 -12
  328. package/esm/ui/index.js +14 -22
  329. package/esm/ui/launchViewMenu.js +15 -5
  330. package/esm/ui/legendMenuItem.d.ts +10 -32
  331. package/esm/ui/legendMenuItem.js +9 -36
  332. package/esm/ui/legendSpec.d.ts +15 -8
  333. package/esm/ui/legendSpec.js +14 -23
  334. package/esm/ui/makeSizeMenu.d.ts +0 -6
  335. package/esm/ui/makeSizeMenu.js +6 -30
  336. package/esm/ui/measureLegendText.js +1 -1
  337. package/esm/ui/menuItemAdornment.d.ts +9 -20
  338. package/esm/ui/menuItemAdornment.js +10 -32
  339. package/esm/ui/menuItems.d.ts +2 -7
  340. package/esm/ui/menuItems.js +1 -6
  341. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  342. package/esm/ui/palette.d.ts +118 -116
  343. package/esm/ui/palette.js +114 -75
  344. package/esm/ui/replaceViewAction.d.ts +1 -1
  345. package/esm/ui/replaceViewAction.js +1 -1
  346. package/esm/ui/theme.d.ts +43 -119
  347. package/esm/ui/theme.js +62 -78
  348. package/esm/ui/toggleMenuItems.d.ts +1 -3
  349. package/esm/ui/toggleMenuItems.js +6 -5
  350. package/esm/ui/useAssemblySelection.d.ts +4 -4
  351. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  352. package/esm/ui/viewHeaderHeight.js +1 -0
  353. package/esm/util/Base1DUtils.d.ts +5 -3
  354. package/esm/util/Base1DUtils.js +14 -6
  355. package/esm/util/Base1DViewModel.d.ts +2 -1
  356. package/esm/util/Base1DViewModel.js +3 -2
  357. package/esm/util/SvgCanvas.d.ts +15 -13
  358. package/esm/util/SvgCanvas.js +76 -56
  359. package/esm/util/TimeTraveller.d.ts +3 -0
  360. package/esm/util/TimeTraveller.js +34 -2
  361. package/esm/util/aborting.d.ts +39 -0
  362. package/esm/util/aborting.js +88 -6
  363. package/esm/util/adapterMetadata.d.ts +1 -1
  364. package/esm/util/adapterMetadata.js +6 -5
  365. package/esm/util/addAndShowTrack.d.ts +2 -5
  366. package/esm/util/addAndShowTrack.js +5 -1
  367. package/esm/util/addRelativeUris.d.ts +17 -5
  368. package/esm/util/addRelativeUris.js +46 -10
  369. package/esm/util/addTrackFromWidget.d.ts +2 -5
  370. package/esm/util/addTrackFromWidget.js +5 -4
  371. package/esm/util/aggregateFieldName.d.ts +10 -0
  372. package/esm/util/aggregateFieldName.js +8 -0
  373. package/esm/util/analytics.js +46 -13
  374. package/esm/util/animationAllowed.d.ts +9 -0
  375. package/esm/util/animationAllowed.js +13 -0
  376. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  377. package/esm/util/applyRowResizeWheel.js +10 -21
  378. package/esm/util/bandHeight.d.ts +10 -0
  379. package/esm/util/bandHeight.js +29 -0
  380. package/esm/util/bandLayout.d.ts +4 -4
  381. package/esm/util/bandLayout.js +4 -4
  382. package/esm/util/baseDisplayConfig.d.ts +8 -0
  383. package/esm/util/baseDisplayConfig.js +27 -0
  384. package/esm/util/bezierConnector.d.ts +4 -3
  385. package/esm/util/bezierConnector.js +38 -45
  386. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  387. package/esm/util/bgzfWorkerPool.js +20 -74
  388. package/esm/util/binnedAggregate.d.ts +17 -0
  389. package/esm/util/binnedAggregate.js +275 -0
  390. package/esm/util/cacheBudgets.d.ts +22 -19
  391. package/esm/util/cacheBudgets.js +22 -19
  392. package/esm/util/cachedSetup.d.ts +16 -6
  393. package/esm/util/cachedSetup.js +108 -38
  394. package/esm/util/categoricalField.d.ts +56 -0
  395. package/esm/util/categoricalField.js +73 -0
  396. package/esm/util/cellMatches.d.ts +23 -0
  397. package/esm/util/cellMatches.js +264 -0
  398. package/esm/util/cellsStep.d.ts +29 -0
  399. package/esm/util/cellsStep.js +437 -0
  400. package/esm/util/clampToContig.d.ts +17 -0
  401. package/esm/util/clampToContig.js +19 -0
  402. package/esm/util/coarseStripHTML.js +1 -2
  403. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  404. package/esm/util/color/cssColorsLevel4.js +1 -0
  405. package/esm/util/color/index.d.ts +5 -3
  406. package/esm/util/color/index.js +7 -4
  407. package/esm/util/colorBits.d.ts +3 -3
  408. package/esm/util/colorBits.js +19 -44
  409. package/esm/util/colorRamp.d.ts +49 -5
  410. package/esm/util/colorRamp.js +169 -18
  411. package/esm/util/colorScale.d.ts +156 -0
  412. package/esm/util/colorScale.js +243 -0
  413. package/esm/util/colorSchemes.d.ts +21 -0
  414. package/esm/util/colorSchemes.js +30 -0
  415. package/esm/util/copyToClipboard.js +8 -1
  416. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  417. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  418. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  419. package/esm/util/cssColorParse.d.ts +15 -0
  420. package/esm/util/cssColorParse.js +53 -0
  421. package/esm/util/diagonalizeRegions.d.ts +2 -3
  422. package/esm/util/diagonalizeRegions.js +8 -13
  423. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  424. package/esm/util/expandLooseSearchIndex.js +29 -0
  425. package/esm/util/featureTable.d.ts +224 -0
  426. package/esm/util/featureTable.js +366 -0
  427. package/esm/util/featureTransforms.d.ts +81 -0
  428. package/esm/util/featureTransforms.js +1231 -0
  429. package/esm/util/featureTypes.d.ts +24 -0
  430. package/esm/util/featureTypes.js +35 -0
  431. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  432. package/esm/util/fetchContext.d.ts +7 -8
  433. package/esm/util/fetchContext.js +3 -3
  434. package/esm/util/fetchHub.d.ts +4 -2
  435. package/esm/util/fetchHub.js +2 -2
  436. package/esm/util/fetchPhases.d.ts +10 -10
  437. package/esm/util/fetchSeq.d.ts +2 -3
  438. package/esm/util/fetchSeq.js +2 -2
  439. package/esm/util/fieldReader.d.ts +17 -0
  440. package/esm/util/fieldReader.js +62 -0
  441. package/esm/util/formatBytes.js +1 -1
  442. package/esm/util/formatGuessers.d.ts +25 -14
  443. package/esm/util/formatGuessers.js +42 -27
  444. package/esm/util/formatRelativeTime.js +1 -1
  445. package/esm/util/freezeDeep.d.ts +8 -10
  446. package/esm/util/freezeDeep.js +8 -10
  447. package/esm/util/getLocationUri.d.ts +2 -1
  448. package/esm/util/getLocationUri.js +8 -2
  449. package/esm/util/groupKeys.d.ts +76 -0
  450. package/esm/util/groupKeys.js +156 -0
  451. package/esm/util/highlights.d.ts +10 -6
  452. package/esm/util/highlights.js +12 -25
  453. package/esm/util/hooks.d.ts +31 -2
  454. package/esm/util/hooks.js +72 -3
  455. package/esm/util/index.d.ts +11 -11
  456. package/esm/util/index.js +11 -10
  457. package/esm/util/indexCandidates.d.ts +1 -31
  458. package/esm/util/indexCandidates.js +5 -63
  459. package/esm/util/installFetch.d.ts +77 -37
  460. package/esm/util/installFetch.js +65 -38
  461. package/esm/util/installInitAutorun.d.ts +14 -13
  462. package/esm/util/installInitAutorun.js +17 -17
  463. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  464. package/esm/util/installPrerequisiteFetch.js +111 -0
  465. package/esm/util/intervals.js +9 -4
  466. package/esm/util/io/index.js +22 -15
  467. package/esm/util/isDataCurrent.d.ts +7 -5
  468. package/esm/util/isDataCurrent.js +9 -6
  469. package/esm/util/isTextEntryFocused.d.ts +7 -0
  470. package/esm/util/isTextEntryFocused.js +16 -0
  471. package/esm/util/jexl.js +24 -21
  472. package/esm/util/jexlFilterRows.d.ts +89 -0
  473. package/esm/util/jexlFilterRows.js +252 -0
  474. package/esm/util/jexlFilters.d.ts +32 -57
  475. package/esm/util/jexlFilters.js +31 -29
  476. package/esm/util/jexlStrings.d.ts +3 -4
  477. package/esm/util/jexlStrings.js +2 -3
  478. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  479. package/esm/util/layouts/GranularRectLayout.js +25 -8
  480. package/esm/util/lazyAfterAttach.d.ts +13 -0
  481. package/esm/util/lazyAfterAttach.js +31 -0
  482. package/esm/util/lazyWithPreload.d.ts +19 -0
  483. package/esm/util/lazyWithPreload.js +27 -0
  484. package/esm/util/legendCandidates.d.ts +72 -0
  485. package/esm/util/legendCandidates.js +138 -0
  486. package/esm/util/locString.js +5 -2
  487. package/esm/util/localStorage.js +4 -4
  488. package/esm/util/markEncoding.d.ts +150 -0
  489. package/esm/util/markEncoding.js +885 -0
  490. package/esm/util/markEncodingTypes.d.ts +595 -0
  491. package/esm/util/markEncodingTypes.js +8 -0
  492. package/esm/util/mst-reflection.d.ts +2 -20
  493. package/esm/util/mst-reflection.js +3 -53
  494. package/esm/util/mstUtils.d.ts +31 -23
  495. package/esm/util/mstUtils.js +39 -24
  496. package/esm/util/numericUtils.d.ts +7 -0
  497. package/esm/util/numericUtils.js +16 -0
  498. package/esm/util/numericValue.d.ts +14 -0
  499. package/esm/util/numericValue.js +34 -0
  500. package/esm/util/openFeatureWidget.d.ts +5 -0
  501. package/esm/util/openFeatureWidget.js +2 -2
  502. package/esm/util/openViews.d.ts +17 -0
  503. package/esm/util/openViews.js +22 -0
  504. package/esm/util/parentWalk.d.ts +1 -1
  505. package/esm/util/parentWalk.js +1 -1
  506. package/esm/util/parseLineByLine.d.ts +4 -5
  507. package/esm/util/parseLineByLine.js +8 -14
  508. package/esm/util/pluginStore.d.ts +6 -8
  509. package/esm/util/pluginStore.js +17 -16
  510. package/esm/util/preloadComponent.d.ts +5 -0
  511. package/esm/util/preloadComponent.js +11 -0
  512. package/esm/util/progress.d.ts +22 -22
  513. package/esm/util/progress.js +27 -26
  514. package/esm/util/quantileExtent.d.ts +49 -0
  515. package/esm/util/quantileExtent.js +162 -0
  516. package/esm/util/range.d.ts +13 -9
  517. package/esm/util/range.js +17 -8
  518. package/esm/util/renameRegions.d.ts +26 -6
  519. package/esm/util/renameRegions.js +68 -54
  520. package/esm/util/renderToStaticMarkup.js +24 -14
  521. package/esm/util/rxjs.d.ts +23 -8
  522. package/esm/util/rxjs.js +61 -15
  523. package/esm/util/samplesTsv.d.ts +49 -0
  524. package/esm/util/samplesTsv.js +86 -0
  525. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  526. package/esm/util/scheduleDetachedDestroy.js +24 -0
  527. package/esm/util/scrollLatch.d.ts +1 -0
  528. package/esm/util/scrollLatch.js +8 -0
  529. package/esm/util/selectEncodedFeature.d.ts +16 -0
  530. package/esm/util/selectEncodedFeature.js +34 -0
  531. package/esm/util/sessionSharing.d.ts +7 -5
  532. package/esm/util/sessionSharing.js +23 -23
  533. package/esm/util/shapeNameList.d.ts +2 -0
  534. package/esm/util/shapeNameList.js +6 -0
  535. package/esm/util/shapeNames.d.ts +7 -0
  536. package/esm/util/shapeNames.js +11 -0
  537. package/esm/util/simpleFeature.d.ts +0 -1
  538. package/esm/util/springAnimate.js +1 -1
  539. package/esm/util/starFusion.d.ts +26 -0
  540. package/esm/util/starFusion.js +37 -0
  541. package/esm/util/stepTables.d.ts +96 -0
  542. package/esm/util/stepTables.js +277 -0
  543. package/esm/util/svAlt.d.ts +145 -0
  544. package/esm/util/svAlt.js +364 -0
  545. package/esm/util/svgColorProps.d.ts +11 -0
  546. package/esm/util/svgColorProps.js +28 -1
  547. package/esm/util/systemColorScheme.d.ts +12 -0
  548. package/esm/util/systemColorScheme.js +27 -0
  549. package/esm/util/tabix.d.ts +19 -10
  550. package/esm/util/tabix.js +19 -14
  551. package/esm/util/thresholdScale.d.ts +91 -0
  552. package/esm/util/thresholdScale.js +166 -0
  553. package/esm/util/timeGate.d.ts +4 -5
  554. package/esm/util/timeGate.js +4 -5
  555. package/esm/util/trackConfigDelta.d.ts +26 -26
  556. package/esm/util/trackConfigDelta.js +63 -47
  557. package/esm/util/tracks.d.ts +120 -66
  558. package/esm/util/tracks.js +501 -151
  559. package/esm/util/translateTranscript.d.ts +44 -0
  560. package/esm/util/translateTranscript.js +102 -0
  561. package/esm/util/types/data.d.ts +0 -2
  562. package/esm/util/types/index.d.ts +121 -22
  563. package/esm/util/types/index.js +9 -0
  564. package/esm/util/types/mst.d.ts +3 -0
  565. package/esm/util/types/mst.js +4 -0
  566. package/esm/util/types/renameIds.d.ts +1 -0
  567. package/esm/util/types/renameIds.js +29 -0
  568. package/esm/util/types/services.d.ts +1 -1
  569. package/esm/util/unknownSnapshotKeys.d.ts +53 -0
  570. package/esm/util/unknownSnapshotKeys.js +76 -0
  571. package/esm/util/useFeatureSequence.js +5 -5
  572. package/esm/util/useFetch.d.ts +3 -4
  573. package/esm/util/useFetch.js +19 -10
  574. package/esm/util/useFetchPlugins.d.ts +6 -2
  575. package/esm/util/useFetchPlugins.js +7 -3
  576. package/esm/util/usePanZoom.js +10 -3
  577. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  578. package/esm/util/usePanelVirtualScroll.js +9 -36
  579. package/esm/util/useRafCommit.js +1 -0
  580. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  581. package/esm/util/useRowVirtualScroll.js +8 -49
  582. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  583. package/esm/util/useVirtualScrollWheel.js +40 -74
  584. package/esm/util/viewHighlights.d.ts +3 -0
  585. package/esm/util/viewHighlights.js +5 -0
  586. package/esm/util/viewStatus.d.ts +47 -15
  587. package/esm/util/viewStatus.js +34 -0
  588. package/esm/util/wheelZoom.d.ts +7 -1
  589. package/esm/util/wheelZoom.js +85 -19
  590. package/esm/util/whenViewSettled.d.ts +55 -8
  591. package/esm/util/whenViewSettled.js +56 -7
  592. package/esm/util/withFeatureDetails.js +4 -0
  593. package/esm/util/withLaunchInput.d.ts +174 -0
  594. package/esm/util/withLaunchInput.js +274 -0
  595. package/package.json +75 -24
  596. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  597. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  598. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  599. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  600. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  601. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  602. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  603. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  604. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  605. package/esm/ReExports/index.d.ts +0 -1
  606. package/esm/ReExports/index.js +0 -1
  607. package/esm/ReExports/publicUtil.d.ts +0 -1
  608. package/esm/ReExports/publicUtil.js +0 -28
  609. package/esm/configuration/promotableDefaults.d.ts +0 -199
  610. package/esm/configuration/promotableDefaults.js +0 -326
  611. package/esm/configuration/promotablePin.d.ts +0 -55
  612. package/esm/configuration/promotablePin.js +0 -1
  613. package/esm/configuration/promotableResolve.d.ts +0 -108
  614. package/esm/configuration/promotableResolve.js +0 -117
  615. package/esm/configuration/promotableSlots.d.ts +0 -12
  616. package/esm/configuration/promotableSlots.js +0 -45
  617. package/esm/configuration/slotShape.d.ts +0 -12
  618. package/esm/configuration/slotShape.js +0 -84
  619. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  620. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  621. package/esm/ui/PinAdornment.d.ts +0 -5
  622. package/esm/ui/PinAdornment.js +0 -79
  623. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  624. package/esm/ui/SvgGradientLegend.js +0 -26
  625. package/esm/ui/highlightChipReveal.d.ts +0 -32
  626. package/esm/ui/highlightChipReveal.js +0 -39
  627. package/esm/ui/promotableMenuItems.d.ts +0 -19
  628. package/esm/ui/promotableMenuItems.js +0 -89
  629. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  630. package/esm/ui/promotablePinCoverage.js +0 -87
  631. package/esm/util/applyInitSettings.d.ts +0 -79
  632. package/esm/util/applyInitSettings.js +0 -91
  633. package/esm/util/openDisplays.d.ts +0 -23
  634. package/esm/util/openDisplays.js +0 -79
  635. package/esm/util/stopToken.d.ts +0 -211
  636. package/esm/util/stopToken.js +0 -438
  637. /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
@@ -1,4 +1,4 @@
1
- import type { FeatureFormatter } from '../types.tsx';
1
+ import type { FeatureFormatter, FieldActions } from '../types.tsx';
2
2
  /**
3
3
  * An array of objects renders each element as its own `Attributes` block and
4
4
  * draws no label row at this level; anything else is one labelled row like any
@@ -7,11 +7,12 @@ import type { FeatureFormatter } from '../types.tsx';
7
7
  * to make the same call.
8
8
  */
9
9
  export declare function isObjectArray(value: unknown[]): value is Record<string, unknown>[];
10
- export default function ArrayValue({ name, value, description, formatter, prefix, width, }: {
10
+ export default function ArrayValue({ name, value, description, formatter, fieldActions, prefix, width, }: {
11
11
  description?: React.ReactNode;
12
12
  name: string;
13
13
  value: unknown[];
14
14
  formatter?: FeatureFormatter;
15
+ fieldActions?: FieldActions;
15
16
  prefix?: string[];
16
17
  width?: number;
17
18
  }): import("react").JSX.Element;
@@ -4,6 +4,7 @@ import { isObject } from '../../util/index.js';
4
4
  import { makeStyles } from '../../util/tss-react/index.js';
5
5
  import Attributes from './Attributes.js';
6
6
  import BasicValue from './BasicValue.js';
7
+ import FieldActionsButton, { useRevealFieldActions, } from './FieldActionsButton.js';
7
8
  import FieldName from './FieldName.js';
8
9
  const MAX_ARRAY_LENGTH = 100;
9
10
  // Numeric arrays (e.g. base-modification probabilities, per-base scores) are
@@ -17,11 +18,9 @@ const useStyles = makeStyles()(theme => ({
17
18
  },
18
19
  fieldSubvalue: {
19
20
  wordBreak: 'break-word',
20
- maxHeight: 300,
21
21
  padding: theme.spacing(0.5),
22
22
  border: `1px solid ${theme.palette.action.selected}`,
23
23
  boxSizing: 'border-box',
24
- overflow: 'auto',
25
24
  },
26
25
  }));
27
26
  /**
@@ -34,8 +33,9 @@ const useStyles = makeStyles()(theme => ({
34
33
  export function isObjectArray(value) {
35
34
  return value.every(isObject);
36
35
  }
37
- export default function ArrayValue({ name, value, description, formatter, prefix = [], width, }) {
38
- const { classes } = useStyles();
36
+ export default function ArrayValue({ name, value, description, formatter, fieldActions, prefix = [], width, }) {
37
+ const { classes, cx } = useStyles();
38
+ const reveal = useRevealFieldActions();
39
39
  const [showAll, setShowAll] = useState(false);
40
40
  const limit = value.every(v => typeof v === 'number')
41
41
  ? MAX_NUMERIC_ARRAY_LENGTH
@@ -44,7 +44,7 @@ export default function ArrayValue({ name, value, description, formatter, prefix
44
44
  const displayedValues = needsTruncation && !showAll ? value.slice(0, limit) : value;
45
45
  return isObjectArray(value) ? (value.length === 1 ? (_jsx(Attributes, { formatter: formatter, attributes: value[0], prefix: [...prefix, name] })) : (_jsx(_Fragment, { children: value.map((val, i) => (_jsx(Attributes
46
46
  // eslint-disable-next-line @eslint-react/no-array-index-key -- static positional list of attribute objects, no unique field available
47
- , { formatter: formatter, attributes: val, prefix: [...prefix, `${name}-${i}`] }, i))) }))) : (_jsxs("div", { className: classes.field, children: [_jsx(FieldName, { prefix: prefix, description: description, name: name, width: width }), value.length === 1 ? (_jsx(BasicValue, { value: formatter ? formatter(value[0], name, 0) : value[0] })) : (_jsxs(_Fragment, { children: [displayedValues.map((val, i) => (_jsx("div", { className: classes.fieldSubvalue, children: _jsx(BasicValue, { value: formatter ? formatter(val, name, i) : val }) }, `${String(val)}-${i}`))), needsTruncation ? (_jsx("button", { type: "button", onClick: () => {
47
+ , { formatter: formatter, attributes: val, prefix: [...prefix, `${name}-${i}`] }, i))) }))) : (_jsxs("div", { className: cx(classes.field, reveal), children: [_jsx(FieldName, { prefix: prefix, description: description, name: name, width: width }), value.length === 1 ? (_jsxs(_Fragment, { children: [_jsx(BasicValue, { value: formatter ? formatter(value[0], name, 0) : value[0] }), _jsx(FieldActionsButton, { path: [...prefix, name], value: value[0], fieldActions: fieldActions })] })) : (_jsxs(_Fragment, { children: [displayedValues.map((val, i) => (_jsx("div", { className: classes.fieldSubvalue, children: _jsx(BasicValue, { value: formatter ? formatter(val, name, i) : val }) }, `${String(val)}-${i}`))), needsTruncation ? (_jsx("button", { type: "button", onClick: () => {
48
48
  setShowAll(v => !v);
49
49
  }, children: showAll
50
50
  ? 'Show less'
@@ -1,12 +1,10 @@
1
- import type { Descriptors, FeatureFormatter } from '../types.tsx';
1
+ import type { Descriptors, FeatureFormatter, FieldActions } from '../types.tsx';
2
2
  export default function Attributes(props: {
3
- attributes: {
4
- [key: string]: unknown;
5
- __jbrowsefmt?: Record<string, unknown>;
6
- };
3
+ attributes: Record<string, unknown>;
7
4
  omit?: string[];
8
5
  omitSingleLevel?: string[];
9
6
  formatter?: FeatureFormatter;
7
+ fieldActions?: FieldActions;
10
8
  descriptions?: Descriptors;
11
9
  prefix?: string[];
12
10
  hideUris?: boolean;
@@ -3,8 +3,8 @@ import { Suspense, lazy } from 'react';
3
3
  import { isLocalPathLocation, isObject, isUriLocation, measureText, } from '../../util/index.js';
4
4
  import ArrayValue, { isObjectArray } from './ArrayValue.js';
5
5
  import SimpleField from './SimpleField.js';
6
- import UriAttribute from './UriField.js';
7
- import { accessNested, applyFeatureFormatting } from './util.js';
6
+ import UriField from './UriField.js';
7
+ import { accessNested } from './util.js';
8
8
  // Lazy: reaches @mui/x-data-grid, and this module sits on the eager startup
9
9
  // path via product-core's ui barrel (AboutDialog -> AboutDialogContents).
10
10
  // Only a homogeneous object array actually renders a grid.
@@ -27,7 +27,6 @@ function isHomogeneousObjectArray(arr) {
27
27
  }
28
28
  // these are always omitted as too detailed
29
29
  const globalOmit = [
30
- '__jbrowsefmt',
31
30
  'length',
32
31
  'position',
33
32
  'subfeatures',
@@ -47,22 +46,38 @@ const globalOmit = [
47
46
  'cdsStartStat',
48
47
  'cdsEndStat',
49
48
  ];
49
+ function isLocation(value) {
50
+ return isUriLocation(value) || isLocalPathLocation(value);
51
+ }
52
+ // hideUris prunes the data rather than each render branch checking: an array
53
+ // of objects reaches the data grid and ArrayValue, which print locations too
54
+ function withoutLocations(attributes) {
55
+ return Object.fromEntries(Object.entries(attributes)
56
+ .filter(([, value]) => !isLocation(value))
57
+ .map(([key, value]) => [key, valueWithoutLocations(value)]));
58
+ }
59
+ function valueWithoutLocations(value) {
60
+ return Array.isArray(value)
61
+ ? value.filter(v => !isLocation(v)).map(valueWithoutLocations)
62
+ : isObject(value)
63
+ ? withoutLocations(value)
64
+ : value;
65
+ }
50
66
  /**
51
67
  * The widest label `Attributes` will actually render under `attributes`, in
52
68
  * text units — the padding is added once by `widestLabel`, not per level.
53
69
  *
54
70
  * Follows the same branches the render below does: a flat array is one labelled
55
- * row (`rendersOwnFieldRow`), an array of objects renders each element as its
56
- * own block with no label at this level, a data grid heads its own grid rather
57
- * than sharing a row, a `UriLocation` is one field, any other object recurses.
58
- * Kept next to the render for that reason — the two agree by being read
59
- * together, and `Attributes.test.tsx` fails if they stop.
71
+ * row, an array of objects renders each element as its own block with no label
72
+ * at this level, a data grid heads its own grid rather than sharing a row, a
73
+ * `UriLocation` is one field, any other object recurses. `Attributes.test.tsx`
74
+ * fails if the two stop agreeing.
60
75
  */
61
76
  function measureLabels(attributes, opts) {
62
- const { omits, deepOmits, hideUris, prefix } = opts;
77
+ const { omits, deepOmits, prefix } = opts;
63
78
  let widest = 0;
64
79
  const measure = (key) => measureText([...prefix, key].join('.'), FIELD_NAME_FONT_SIZE);
65
- for (const [key, value] of Object.entries(applyFeatureFormatting(attributes))) {
80
+ for (const [key, value] of Object.entries(attributes)) {
66
81
  if (value == null || omits.has(key)) {
67
82
  continue;
68
83
  }
@@ -74,15 +89,11 @@ function measureLabels(attributes, opts) {
74
89
  }
75
90
  }
76
91
  else if (isObject(value)) {
77
- if (hideUris && (isUriLocation(value) || isLocalPathLocation(value))) {
78
- continue;
79
- }
80
92
  widest = Math.max(widest, isUriLocation(value)
81
93
  ? measure(key)
82
94
  : measureLabels(value, {
83
95
  omits: deepOmits,
84
96
  deepOmits,
85
- hideUris,
86
97
  prefix: [...prefix, key],
87
98
  }));
88
99
  }
@@ -96,9 +107,12 @@ function widestLabel(attributes, opts) {
96
107
  return Math.ceil(measureLabels(attributes, opts)) + FIELD_NAME_PADDING;
97
108
  }
98
109
  export default function Attributes(props) {
99
- const { attributes, omit = [], omitSingleLevel = [], descriptions, formatter, hideUris, prefix = [], labelWidth, } = props;
110
+ const { omit = [], omitSingleLevel = [], descriptions, formatter, fieldActions, hideUris, prefix = [], labelWidth, } = props;
111
+ const attributes = hideUris
112
+ ? withoutLocations(props.attributes)
113
+ : props.attributes;
100
114
  const omits = new Set([...omit, ...globalOmit, ...omitSingleLevel]);
101
- const filteredFormattedAttributes = Object.entries(applyFeatureFormatting(attributes)).filter(([k, v]) => v != null && !omits.has(k));
115
+ const shown = Object.entries(attributes).filter(([k, v]) => v != null && !omits.has(k));
102
116
  // Measured over the whole subtree on the outermost call, then handed down, so
103
117
  // one card has one label column. Per-level measurement put `type`/`trackId` in
104
118
  // a narrow column, `adapter.type` in a wider one and `adapter.craiLocation` in
@@ -112,30 +126,21 @@ export default function Attributes(props) {
112
126
  deepOmits: omitSingleLevel.length
113
127
  ? new Set([...omit, ...globalOmit])
114
128
  : omits,
115
- hideUris,
116
129
  prefix,
117
130
  }), MAX_FIELD_NAME_WIDTH);
118
- return (_jsx(_Fragment, { children: filteredFormattedAttributes.map(([key, value]) => {
131
+ return (_jsx(_Fragment, { children: shown.map(([key, value]) => {
119
132
  const description = accessNested([...prefix, key], descriptions);
120
133
  if (Array.isArray(value)) {
121
134
  // Only use the data grid when schemas are homogeneous enough;
122
135
  // heterogeneous arrays fall through to ArrayValue which renders
123
136
  // each object as individual field sections instead of disappearing
124
- return isHomogeneousObjectArray(value) ? (_jsx(Suspense, { fallback: null, children: _jsx(DataGridDetails, { name: key, prefix: prefix, value: value }) }, key)) : (_jsx(ArrayValue, { name: key, value: value, formatter: formatter, description: description, prefix: prefix, width: width }, key));
137
+ return isHomogeneousObjectArray(value) ? (_jsx(Suspense, { fallback: null, children: _jsx(DataGridDetails, { name: key, prefix: prefix, value: value }) }, key)) : (_jsx(ArrayValue, { name: key, value: value, formatter: formatter, fieldActions: fieldActions, description: description, prefix: prefix, width: width }, key));
125
138
  }
126
139
  else if (isObject(value)) {
127
- // hideUris means "don't show where the data sits". A LocalPathLocation
128
- // says that as plainly as a UriLocation does — it is what desktop and
129
- // `jbrowse add-track --load copy` write — and it used to fall through
130
- // to the recursive branch below and print the path in full
131
- if (hideUris &&
132
- (isUriLocation(value) || isLocalPathLocation(value))) {
133
- return null;
134
- }
135
- return isUriLocation(value) ? (_jsx(UriAttribute, { name: key, prefix: prefix, value: value, width: width }, key)) : (_jsx(Attributes, { attributes: value, omit: omit, descriptions: descriptions, formatter: formatter, hideUris: hideUris, prefix: [...prefix, key], labelWidth: width }, key));
140
+ return isUriLocation(value) ? (_jsx(UriField, { name: key, prefix: prefix, value: value, width: width }, key)) : (_jsx(Attributes, { attributes: value, omit: omit, descriptions: descriptions, formatter: formatter, fieldActions: fieldActions, prefix: [...prefix, key], labelWidth: width }, key));
136
141
  }
137
142
  else {
138
- return (_jsx(SimpleField, { name: key, formatter: formatter, value: value, description: description, prefix: prefix, width: width }, key));
143
+ return (_jsx(SimpleField, { name: key, formatter: formatter, fieldActions: fieldActions, value: value, description: description, prefix: prefix, width: width }, key));
139
144
  }
140
145
  }) }));
141
146
  }
@@ -7,11 +7,8 @@ const useStyles = makeStyles()(theme => ({
7
7
  display: 'block',
8
8
  padding: theme.spacing(1),
9
9
  },
10
- icon: {
11
- color: theme.palette.tertiary.contrastText || '#fff',
12
- },
13
10
  }));
14
11
  export default function BaseCard({ children, title, defaultExpanded = true, }) {
15
12
  const { classes } = useStyles();
16
- return (_jsxs(Accordion, { defaultExpanded: defaultExpanded, slotProps: { transition: { unmountOnExit: true } }, "data-testid": `BaseCard-${title}`, children: [_jsx(AccordionSummary, { expandIcon: _jsx(ExpandMore, { className: classes.icon }), children: _jsx(Typography, { variant: "button", children: title }) }), _jsx(AccordionDetails, { className: classes.expansionPanelDetails, children: children })] }));
13
+ return (_jsxs(Accordion, { defaultExpanded: defaultExpanded, slotProps: { transition: { unmountOnExit: true } }, "data-testid": `BaseCard-${title}`, children: [_jsx(AccordionSummary, { expandIcon: _jsx(ExpandMore, {}), children: _jsx(Typography, { variant: "button", children: title }) }), _jsx(AccordionDetails, { className: classes.expansionPanelDetails, children: children })] }));
17
14
  }
@@ -1,3 +1,14 @@
1
+ export declare function isBareUrl(text: string): boolean;
2
+ export declare function valueText(value: unknown): string;
3
+ /**
4
+ * A value that is nothing but a URL is a link; anything else goes through
5
+ * SanitizedHTML, which renders markup and links URLs inside longer text. Both
6
+ * open in a new tab: navigating in place discards the session, and in an
7
+ * embedded JBrowse it takes the host page with it.
8
+ */
9
+ export declare function ValueText({ text }: {
10
+ text: string;
11
+ }): import("react").JSX.Element;
1
12
  export default function BasicValue({ value }: {
2
13
  value: unknown;
3
14
  }): import("react").JSX.Element;
@@ -1,27 +1,50 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { isValidElement } from 'react';
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { isValidElement, useState } from 'react';
3
3
  import { Link } from '@mui/material';
4
4
  import { SanitizedHTML } from '../../ui/index.js';
5
5
  import { isObject } from '../../util/index.js';
6
6
  import { makeStyles } from '../../util/tss-react/index.js';
7
+ import useMeasure from '../../util/useMeasure.js';
8
+ const CLAMP_HEIGHT = 300;
7
9
  const useStyles = makeStyles()(theme => ({
8
10
  fieldValue: {
9
11
  wordBreak: 'break-word',
10
- maxHeight: 300,
11
12
  fontSize: 12,
12
13
  padding: theme.spacing(0.5),
13
- overflow: 'auto',
14
+ minWidth: 0,
15
+ },
16
+ clip: {
17
+ overflowX: 'auto',
18
+ overflowY: 'hidden',
19
+ },
20
+ clamped: {
21
+ maxHeight: CLAMP_HEIGHT,
22
+ },
23
+ faded: {
24
+ maskImage: 'linear-gradient(to bottom, black 75%, transparent)',
14
25
  },
15
26
  }));
27
+ export function isBareUrl(text) {
28
+ return /^https?:\/\/\S+$/.test(text);
29
+ }
30
+ export function valueText(value) {
31
+ return isObject(value) ? JSON.stringify(value) : String(value);
32
+ }
33
+ /**
34
+ * A value that is nothing but a URL is a link; anything else goes through
35
+ * SanitizedHTML, which renders markup and links URLs inside longer text. Both
36
+ * open in a new tab: navigating in place discards the session, and in an
37
+ * embedded JBrowse it takes the host page with it.
38
+ */
39
+ export function ValueText({ text }) {
40
+ return isBareUrl(text) ? (_jsx(Link, { href: text, target: "_blank", rel: "noopener noreferrer", children: text })) : (_jsx(SanitizedHTML, { html: text }));
41
+ }
16
42
  export default function BasicValue({ value }) {
17
- const { classes } = useStyles();
18
- // a value that is nothing but a URL is a link, whether it came from the file
19
- // or from a formatDetails callback -- the same courtesy `linkify` does for a
20
- // URL sitting inside a longer string, one layer down in SanitizedHTML.
21
- //
22
- // New tab, matching `rewriteExternalAnchors` on that other path. Navigating
23
- // in place discards the session, and in an embedded JBrowse it takes the host
24
- // page with it.
25
- const isLink = /^https?:\/\//.test(`${value}`);
26
- return (_jsx("div", { className: classes.fieldValue, children: isValidElement(value) ? (value) : isLink ? (_jsx(Link, { href: `${value}`, target: "_blank", rel: "noopener noreferrer", children: `${value}` })) : (_jsx(SanitizedHTML, { html: isObject(value) ? JSON.stringify(value) : String(value) })) }));
43
+ const { classes, cx } = useStyles();
44
+ const [expanded, setExpanded] = useState(false);
45
+ const [ref, { height }] = useMeasure('height');
46
+ const overflows = height !== undefined && height > CLAMP_HEIGHT;
47
+ return (_jsxs("div", { className: classes.fieldValue, children: [_jsx("div", { className: cx(classes.clip, !expanded && classes.clamped, !expanded && overflows && classes.faded), children: _jsx("div", { ref: ref, children: isValidElement(value) ? (value) : (_jsx(ValueText, { text: valueText(value) })) }) }), overflows ? (_jsx(Link, { component: "button", variant: "caption", onClick: () => {
48
+ setExpanded(v => !v);
49
+ }, children: expanded ? 'Show less' : 'Show more' })) : null] }));
27
50
  }
@@ -1,2 +1,2 @@
1
1
  import type { BaseProps } from '../types.tsx';
2
- export default function CoreDetails(props: BaseProps): import("react").JSX.Element;
2
+ export default function CoreDetails({ feature }: BaseProps): import("react").JSX.Element;
@@ -1,35 +1,19 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { toLocale } from '../../util/index.js';
3
- import Position from './Position.js';
2
+ import { assembleLocString, toLocale } from '../../util/index.js';
3
+ import { getStrandStr } from '../util.js';
4
4
  import SimpleField from './SimpleField.js';
5
- import { applyFeatureFormatting, isFormattedField } from './util.js';
6
- export default function CoreDetails(props) {
7
- const { feature } = props;
8
- const formattedFeat = applyFeatureFormatting(feature);
9
- const { start, end } = formattedFeat;
10
- 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),
20
- };
21
- // array (not object) so the display order is explicit, not reliant on JS key
22
- // insertion order
23
- const coreRenderedDetails = [
24
- ['name', 'Name'],
25
- ['description', 'Description'],
26
- ['length', 'Length'],
27
- ['type', 'Type'],
5
+ export default function CoreDetails({ feature }) {
6
+ const { name, description, type, start, end, strand } = feature;
7
+ // only a formatDetails callback sets `length`, to rewrite or hide the row:
8
+ // an adapter's own field of that name is in Attributes' globalOmit
9
+ const length = 'length' in feature ? feature.length : end - start;
10
+ const rows = [
11
+ ['Name', name],
12
+ ['Description', description],
13
+ ['Length', typeof length === 'number' ? toLocale(length) : length],
14
+ ['Type', type],
28
15
  ];
29
- return (_jsxs(_Fragment, { children: [_jsx(SimpleField, { name: "Position", value: _jsx(Position, { ...props, feature: formattedFeat }) }), coreRenderedDetails
30
- .filter(([key]) => displayedDetails[key] != null)
31
- .map(([key, name]) => {
32
- const value = displayedDetails[key];
33
- return (_jsx(SimpleField, { name: name, value: Array.isArray(value) ? value.join(', ') : value }, name));
34
- })] }));
16
+ return (_jsxs(_Fragment, { children: [_jsx(SimpleField, { name: "Position", value: [assembleLocString(feature), getStrandStr(strand)]
17
+ .filter(Boolean)
18
+ .join(' ') }), rows.map(([label, value]) => (_jsx(SimpleField, { name: label, value: Array.isArray(value) ? value.join(', ') : value }, label)))] }));
35
19
  }
@@ -1,13 +1,14 @@
1
1
  import type { SimpleFeatureSerialized } from '../../util/index.ts';
2
- import type { Descriptors, FeatureFormatter } from '../types.tsx';
3
- import type { IAnyStateTreeNode } from '@jbrowse/mobx-state-tree';
2
+ import type { Descriptors, FeatureDetailsModel, FeatureFormatter, FieldActions } from '../types.tsx';
4
3
  interface FeatureDetailsProps {
5
- model: IAnyStateTreeNode;
4
+ model: FeatureDetailsModel;
6
5
  feature: SimpleFeatureSerialized;
6
+ unformatted?: SimpleFeatureSerialized;
7
7
  depth?: number;
8
8
  omit?: string[];
9
9
  descriptions?: Descriptors;
10
10
  formatter?: FeatureFormatter;
11
+ fieldActions?: FieldActions;
11
12
  }
12
13
  declare const FeatureDetails: (props: FeatureDetailsProps) => import("react").JSX.Element;
13
14
  export default FeatureDetails;
@@ -1,5 +1,4 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Fragment } from 'react';
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
2
  import { Divider, Typography } from '@mui/material';
4
3
  import { observer } from 'mobx-react';
5
4
  import { ErrorBoundary } from '../../ui/ErrorBoundary.js';
@@ -14,12 +13,7 @@ import { generateTitle } from './util.js';
14
13
  function SectionHeader({ title }) {
15
14
  return _jsx(Typography, { variant: "overline", children: title });
16
15
  }
17
- // interleave a <Divider/> between each node, e.g. [a,b,c] -> a | b | c
18
- function joinByDivider(nodes) {
19
- return nodes.map((node, i) => (_jsxs(Fragment, { children: [i > 0 ? _jsx(Divider, {}) : null, node] }, i)));
20
- }
21
- // coreDetails are omitted in some circumstances
22
- const coreDetails = [
16
+ const shownByCoreDetails = [
23
17
  'name',
24
18
  'start',
25
19
  'end',
@@ -29,30 +23,23 @@ const coreDetails = [
29
23
  'type',
30
24
  ];
31
25
  const FeatureDetails = observer(function FeatureDetails(props) {
32
- const { omit = [], model, feature, depth = 0, descriptions, formatter, } = props;
26
+ const { omit = [], model, feature, unformatted = feature, depth = 0, descriptions, formatter, fieldActions, } = props;
33
27
  const maxDepth = model.maxDepth ?? Infinity;
34
- const { mate: m, name = '', id = '', type = '', subfeatures, uniqueId, } = feature;
35
- // resolved rather than raw props: `depth` is what tells a registered panel
36
- // whether it is under the clicked feature (0) or a nested subfeature card, and
37
- // it is only defaulted here -- passing raw props left it undefined at the top
38
- // level, so a panel selecting on `depth === 0` could never match
28
+ const { mate, name = '', id = '', type = '', subfeatures, uniqueId } = feature;
29
+ // a panel selecting on `depth === 0` has to see the default, not undefined
39
30
  const panelProps = { ...props, depth };
40
- return (_jsxs(BaseCard, { title: generateTitle(name, id, type), children: [joinByDivider([
41
- _jsxs(Fragment, { children: [_jsx(SectionHeader, { title: "Core details" }), _jsx(CoreDetails, { ...props })] }, "core"),
42
- m ? (_jsxs(Fragment, { children: [_jsx(SectionHeader, { title: "Mate details" }), _jsx(CoreDetails, { ...props, feature: { ...m, uniqueId: `${uniqueId}-mate` } })] }, "mate")) : null,
43
- _jsxs(Fragment, { children: [_jsx(SectionHeader, { title: "Attributes" }), _jsx(Attributes, { attributes: feature, omit: omit, omitSingleLevel: coreDetails, descriptions: descriptions, formatter: formatter })] }, "attributes"),
44
- ].filter(Boolean)), _jsx(ErrorBoundary, { FallbackComponent: e => _jsx(ErrorBanner, { error: e.error }), children: _jsx(SequenceFeatureDetails, { ...props }) }), _jsx(PluggableComponents, { pluginManager: getEnv(model).pluginManager,
31
+ return (_jsxs(BaseCard, { title: generateTitle(name, id, type), children: [_jsx(SectionHeader, { title: "Core details" }), _jsx(CoreDetails, { ...props }), mate ? (_jsxs(_Fragment, { children: [_jsx(Divider, {}), _jsx(SectionHeader, { title: "Mate details" }), _jsx(CoreDetails, { ...props, feature: { ...mate, uniqueId: `${uniqueId}-mate` } }), _jsx(Attributes, { attributes: mate, prefix: ['mate'], omit: omit, omitSingleLevel: shownByCoreDetails, descriptions: descriptions, formatter: formatter, fieldActions: fieldActions })] })) : null, _jsx(Divider, {}), _jsx(SectionHeader, { title: "Attributes" }), _jsx(Attributes, { attributes: feature, omit: omit, omitSingleLevel: [...shownByCoreDetails, 'mate'], descriptions: descriptions, formatter: formatter, fieldActions: fieldActions }), _jsx(ErrorBoundary, { FallbackComponent: e => _jsx(ErrorBanner, { error: e.error }), children: _jsx(SequenceFeatureDetails, { ...props, feature: unformatted }) }), _jsx(PluggableComponents, { pluginManager: getEnv(model).pluginManager,
45
32
  /** #extensionPoint Core-extraFeaturePanel | sync | Add extra panels to the feature details widget */
46
33
  name: "Core-extraFeaturePanel", props: panelProps }), depth < maxDepth && subfeatures?.length ? (_jsx(BaseCard, { title: "Subfeatures", defaultExpanded: depth === 0 && subfeatures.length <= 20, children: subfeatures.map((sub, idx) => (_jsx(FeatureDetails
47
34
  // eslint-disable-next-line @eslint-react/no-array-index-key -- subfeature list order is fixed per feature, no unique field guaranteed by type
48
35
  , { feature: {
49
36
  ...sub,
50
37
  uniqueId: `${uniqueId}_${idx}`,
51
- }, model: model, depth: depth + 1,
52
- // a subfeature's fields are the same fields, so the caller's
53
- // descriptions and value formatter apply here too -- omitting
54
- // them silently dropped e.g. VCF header descriptions and the
55
- // truncating <Formatter> from every nested card
56
- descriptions: descriptions, formatter: formatter, omit: omit }, `${uniqueId}_${idx}`))) })) : null] }));
38
+ }, unformatted: unformatted.subfeatures?.[idx]
39
+ ? {
40
+ ...unformatted.subfeatures[idx],
41
+ uniqueId: `${uniqueId}_${idx}`,
42
+ }
43
+ : undefined, model: model, depth: depth + 1, descriptions: descriptions, formatter: formatter, fieldActions: fieldActions, omit: omit }, `${uniqueId}_${idx}`))) })) : null] }));
57
44
  });
58
45
  export default FeatureDetails;
@@ -0,0 +1,11 @@
1
+ import type { SimpleFeatureSerialized } from '../../util/index.ts';
2
+ import type React from 'react';
3
+ export interface FeatureDetailsFrameModel {
4
+ error?: unknown;
5
+ featureData?: SimpleFeatureSerialized;
6
+ }
7
+ declare const FeatureDetailsFrame: ({ model, children, }: {
8
+ model: FeatureDetailsFrameModel;
9
+ children: React.ReactNode;
10
+ }) => React.JSX.Element;
11
+ export default FeatureDetailsFrame;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Paper, Typography } from '@mui/material';
3
+ import { observer } from 'mobx-react';
4
+ import { ErrorBanner } from '../../ui/index.js';
5
+ import FeatureWash from './FeatureWash.js';
6
+ import { isEmpty } from './util.js';
7
+ const FeatureDetailsFrame = observer(function FeatureDetailsFrame({ model, children, }) {
8
+ const { error, featureData } = model;
9
+ return error ? (_jsx(ErrorBanner, { error: error })) : !featureData || isEmpty(featureData) ? (_jsx(Paper, { sx: { p: 2 }, children: _jsx(Typography, { children: "No feature loaded. It may not be available after a page refresh because it was too large to persist in localStorage." }) })) : (_jsx(FeatureWash, { uniqueId: featureData.uniqueId, children: children }));
10
+ });
11
+ export default FeatureDetailsFrame;
@@ -0,0 +1,8 @@
1
+ import type { FieldActions } from '../types.tsx';
2
+ /** A class for a field row that shows its FieldActionsButton on hover or focus. */
3
+ export declare function useRevealFieldActions(): string;
4
+ export default function FieldActionsButton({ path, value, fieldActions, }: {
5
+ path: string[];
6
+ value: unknown;
7
+ fieldActions?: FieldActions;
8
+ }): import("react").JSX.Element | null;
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import FilterListIcon from '@mui/icons-material/FilterList';
3
+ import CascadingMenuButton from '../../ui/CascadingMenuButton.js';
4
+ import { makeStyles } from '../../util/tss-react/index.js';
5
+ // on a wrapper because MUI folds an Emotion class handed to one of its
6
+ // components into a class of its own, which a selector naming it never matches
7
+ const useStyles = makeStyles()({
8
+ reveal: {
9
+ opacity: 0,
10
+ },
11
+ });
12
+ /** A class for a field row that shows its FieldActionsButton on hover or focus. */
13
+ export function useRevealFieldActions() {
14
+ const { classes, css } = useStyles();
15
+ const { reveal } = classes;
16
+ return css({
17
+ [`&:hover .${reveal}, &:focus-within .${reveal}`]: { opacity: 1 },
18
+ });
19
+ }
20
+ export default function FieldActionsButton({ path, value, fieldActions, }) {
21
+ const { classes } = useStyles();
22
+ const items = fieldActions?.(path, value) ?? [];
23
+ return items.length > 0 ? (_jsx("span", { className: classes.reveal, children: _jsx(CascadingMenuButton, { menuItems: items, size: "small", tooltip: "Filter by this value", style: { padding: 0 }, children: _jsx(FilterListIcon, { fontSize: "small" }) }) })) : null;
24
+ }
@@ -1,17 +1,19 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import { useCopyToClipboard } from '../../ui/useCopyToClipboard.js';
4
+ import { ValueText, isBareUrl, valueText } from './BasicValue.js';
4
5
  const TRUNCATE_LENGTH = 100;
5
6
  // a 'show more...' toggle used as a formatter on feature details: long values
6
7
  // (e.g. a SEQ/CRAM string, or a long read's worth of data in a single div) can
7
- // slow down the rest of the app, so they are truncated until expanded
8
+ // slow down the rest of the app, so they are truncated until expanded. A URL
9
+ // is left whole, since a truncated one links nowhere
8
10
  export default function Formatter({ value }) {
9
11
  const [show, setShow] = useState(false);
10
12
  const { copied, copy } = useCopyToClipboard(700);
11
- const display = String(value);
12
- return display.length > TRUNCATE_LENGTH ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => {
13
+ const display = valueText(value);
14
+ return display.length > TRUNCATE_LENGTH && !isBareUrl(display) ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: () => {
13
15
  void copy(display);
14
16
  }, children: copied ? 'Copied to clipboard' : 'Copy' }), _jsx("button", { type: "button", onClick: () => {
15
17
  setShow(val => !val);
16
- }, children: show ? 'Show less' : 'Show more' }), _jsx("div", { children: show ? display : `${display.slice(0, TRUNCATE_LENGTH)}...` })] })) : (_jsx("div", { children: display }));
18
+ }, children: show ? 'Show less' : 'Show more' }), _jsx("div", { children: show ? (_jsx(ValueText, { text: display })) : (`${display.slice(0, TRUNCATE_LENGTH)}...`) })] })) : (_jsx(ValueText, { text: display }));
17
19
  }
@@ -0,0 +1,4 @@
1
+ import type { ParentFeatureSummary } from '../../util/index.ts';
2
+ export default function ParentFeatureLine({ parentFeature, }: {
3
+ parentFeature: ParentFeatureSummary;
4
+ }): import("react").JSX.Element;
@@ -0,0 +1,17 @@
1
+ import { jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Typography } from '@mui/material';
3
+ import { makeStyles } from '../../util/tss-react/index.js';
4
+ const useStyles = makeStyles()(theme => ({
5
+ line: {
6
+ padding: theme.spacing(0.5, 1, 0),
7
+ },
8
+ }));
9
+ // Which gene a transcript came out of, above the card naming the transcript.
10
+ // The panel is opened on the exact isoform the click resolved to, and that
11
+ // isoform's own record is regularly the only place its accession appears --
12
+ // nothing in `NM_004006.2 - mRNA` says DMD.
13
+ export default function ParentFeatureLine({ parentFeature, }) {
14
+ const { classes } = useStyles();
15
+ const { name, type } = parentFeature;
16
+ return (_jsxs(Typography, { variant: "body2", color: "textSecondary", className: classes.line, "data-testid": "parent-feature-line", children: ["in ", type ? `${type} ` : '', name] }));
17
+ }
@@ -1,9 +1,10 @@
1
- import type { FeatureFormatter } from '../types.tsx';
2
- export default function SimpleField({ name, value, description, prefix, width, formatter, }: {
1
+ import type { FeatureFormatter, FieldActions } from '../types.tsx';
2
+ export default function SimpleField({ name, value, description, prefix, width, formatter, fieldActions, }: {
3
3
  description?: React.ReactNode;
4
4
  name: string;
5
5
  value: unknown;
6
6
  prefix?: string[];
7
7
  width?: number;
8
8
  formatter?: FeatureFormatter;
9
+ fieldActions?: FieldActions;
9
10
  }): import("react").JSX.Element | null;
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { makeStyles } from '../../util/tss-react/index.js';
3
3
  import BasicValue from './BasicValue.js';
4
+ import FieldActionsButton, { useRevealFieldActions, } from './FieldActionsButton.js';
4
5
  import FieldName from './FieldName.js';
5
6
  const useStyles = makeStyles()({
6
7
  field: {
@@ -8,7 +9,8 @@ const useStyles = makeStyles()({
8
9
  flexWrap: 'wrap',
9
10
  },
10
11
  });
11
- export default function SimpleField({ name, value, description, prefix, width, formatter, }) {
12
- const { classes } = useStyles();
13
- 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
  }
@@ -1,8 +1,12 @@
1
- import type { BaseInputProps } from './types.ts';
2
- declare const BaseFeatureDetail: ({ model, }: BaseInputProps) => import("react").JSX.Element | null;
1
+ import type { BaseFeatureWidgetModel } from '../stateModelFactory.ts';
2
+ declare const BaseFeatureDetail: ({ model, }: {
3
+ model: BaseFeatureWidgetModel;
4
+ }) => import("react").JSX.Element;
3
5
  export default BaseFeatureDetail;
4
6
  export { default as BaseCard } from './BaseCard.tsx';
5
7
  export { default as BaseAttributes } from './BaseAttributes.tsx';
6
8
  export { default as BaseCoreDetails } from './BaseCoreDetails.tsx';
7
9
  export { default as FeatureDetails } from './FeatureDetails.tsx';
10
+ export { default as FeatureDetailsFrame } from './FeatureDetailsFrame.tsx';
8
11
  export { default as FeatureWash } from './FeatureWash.tsx';
12
+ export { filterByValueItems, jexlFilterDisplay } from './jexlFilterActions.ts';