@genome-spy/core 0.67.0 → 0.69.0

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 (290) hide show
  1. package/dist/bundle/index.es.js +15884 -13130
  2. package/dist/bundle/index.js +130 -149
  3. package/dist/schema.json +6498 -6191
  4. package/dist/src/data/collector.d.ts +20 -0
  5. package/dist/src/data/collector.d.ts.map +1 -1
  6. package/dist/src/data/collector.js +148 -0
  7. package/dist/src/data/dataFlow.d.ts +6 -0
  8. package/dist/src/data/dataFlow.d.ts.map +1 -1
  9. package/dist/src/data/dataFlow.js +20 -0
  10. package/dist/src/data/flowInit.d.ts.map +1 -1
  11. package/dist/src/data/flowInit.js +2 -3
  12. package/dist/src/data/flowNode.d.ts +33 -10
  13. package/dist/src/data/flowNode.d.ts.map +1 -1
  14. package/dist/src/data/flowNode.js +84 -13
  15. package/dist/src/data/flowTestUtils.d.ts +2 -2
  16. package/dist/src/data/flowTestUtils.d.ts.map +1 -1
  17. package/dist/src/data/flowTestUtils.js +5 -4
  18. package/dist/src/data/keyIndex.d.ts +18 -0
  19. package/dist/src/data/keyIndex.d.ts.map +1 -0
  20. package/dist/src/data/keyIndex.js +241 -0
  21. package/dist/src/data/keyIndex.test.d.ts +2 -0
  22. package/dist/src/data/keyIndex.test.d.ts.map +1 -0
  23. package/dist/src/data/sources/dataSource.d.ts.map +1 -1
  24. package/dist/src/data/sources/dataSource.js +7 -3
  25. package/dist/src/data/sources/dataSourceFactory.d.ts +14 -12
  26. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
  27. package/dist/src/data/sources/dataSourceFactory.js +52 -16
  28. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  29. package/dist/src/data/sources/lazy/bigBedSource.js +11 -10
  30. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  31. package/dist/src/data/sources/lazy/bigWigSource.js +11 -10
  32. package/dist/src/data/sources/lazy/mockLazySource.d.ts +29 -0
  33. package/dist/src/data/sources/lazy/mockLazySource.d.ts.map +1 -0
  34. package/dist/src/data/sources/lazy/mockLazySource.js +44 -0
  35. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +22 -1
  36. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  37. package/dist/src/data/sources/lazy/singleAxisLazySource.js +34 -2
  38. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  39. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +16 -1
  40. package/dist/src/data/sources/lazy/tabixSource.d.ts +0 -1
  41. package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
  42. package/dist/src/data/sources/lazy/tabixSource.js +56 -16
  43. package/dist/src/data/sources/sequenceSource.d.ts.map +1 -1
  44. package/dist/src/data/sources/sequenceSource.js +5 -3
  45. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  46. package/dist/src/data/sources/urlSource.js +7 -3
  47. package/dist/src/data/transforms/filter.d.ts +4 -4
  48. package/dist/src/data/transforms/filter.d.ts.map +1 -1
  49. package/dist/src/data/transforms/filter.js +13 -7
  50. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  51. package/dist/src/data/transforms/filterScoredLabels.js +11 -6
  52. package/dist/src/data/transforms/filterScoredLabels.test.d.ts +2 -0
  53. package/dist/src/data/transforms/filterScoredLabels.test.d.ts.map +1 -0
  54. package/dist/src/data/transforms/formula.d.ts +4 -4
  55. package/dist/src/data/transforms/formula.d.ts.map +1 -1
  56. package/dist/src/data/transforms/formula.js +12 -6
  57. package/dist/src/data/transforms/measureText.d.ts +2 -2
  58. package/dist/src/data/transforms/measureText.d.ts.map +1 -1
  59. package/dist/src/data/transforms/measureText.js +16 -12
  60. package/dist/src/data/transforms/stack.d.ts.map +1 -1
  61. package/dist/src/data/transforms/stack.js +1 -0
  62. package/dist/src/data/transforms/transform.d.ts +2 -2
  63. package/dist/src/data/transforms/transform.d.ts.map +1 -1
  64. package/dist/src/data/transforms/transform.js +3 -3
  65. package/dist/src/encoder/accessor.d.ts +51 -4
  66. package/dist/src/encoder/accessor.d.ts.map +1 -1
  67. package/dist/src/encoder/accessor.js +174 -10
  68. package/dist/src/encoder/encoder.d.ts +11 -2
  69. package/dist/src/encoder/encoder.d.ts.map +1 -1
  70. package/dist/src/encoder/encoder.js +29 -9
  71. package/dist/src/encoder/metadataChannels.d.ts +15 -0
  72. package/dist/src/encoder/metadataChannels.d.ts.map +1 -0
  73. package/dist/src/encoder/metadataChannels.js +65 -0
  74. package/dist/src/encoder/metadataChannels.test.d.ts +2 -0
  75. package/dist/src/encoder/metadataChannels.test.d.ts.map +1 -0
  76. package/dist/src/genome/genome.d.ts +8 -0
  77. package/dist/src/genome/genome.d.ts.map +1 -1
  78. package/dist/src/genome/genome.js +16 -1
  79. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  80. package/dist/src/genome/scaleLocus.js +14 -1
  81. package/dist/src/genomeSpy/containerUi.d.ts +0 -1
  82. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -1
  83. package/dist/src/genomeSpy/containerUi.js +0 -14
  84. package/dist/src/genomeSpy/inputBindingManager.js +1 -1
  85. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  86. package/dist/src/genomeSpy/interactionController.js +7 -1
  87. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +3 -7
  88. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -1
  89. package/dist/src/genomeSpy/loadingIndicatorManager.js +68 -20
  90. package/dist/src/genomeSpy/loadingStatusRegistry.d.ts +52 -0
  91. package/dist/src/genomeSpy/loadingStatusRegistry.d.ts.map +1 -0
  92. package/dist/src/genomeSpy/loadingStatusRegistry.js +86 -0
  93. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
  94. package/dist/src/genomeSpy/viewContextFactory.js +0 -1
  95. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  96. package/dist/src/genomeSpy/viewDataInit.js +56 -11
  97. package/dist/src/genomeSpy.d.ts +0 -2
  98. package/dist/src/genomeSpy.d.ts.map +1 -1
  99. package/dist/src/genomeSpy.js +47 -27
  100. package/dist/src/gl/glslScaleGenerator.js +1 -1
  101. package/dist/src/marks/mark.d.ts.map +1 -1
  102. package/dist/src/marks/mark.js +40 -41
  103. package/dist/src/marks/markUtils.js +1 -1
  104. package/dist/src/marks/point.d.ts.map +1 -1
  105. package/dist/src/marks/point.js +4 -6
  106. package/dist/src/paramRuntime/expressionCompiler.d.ts +7 -0
  107. package/dist/src/paramRuntime/expressionCompiler.d.ts.map +1 -0
  108. package/dist/src/paramRuntime/expressionCompiler.js +10 -0
  109. package/dist/src/paramRuntime/expressionRef.d.ts +20 -0
  110. package/dist/src/paramRuntime/expressionRef.d.ts.map +1 -0
  111. package/dist/src/paramRuntime/expressionRef.js +95 -0
  112. package/dist/src/paramRuntime/expressionRef.test.d.ts +2 -0
  113. package/dist/src/paramRuntime/expressionRef.test.d.ts.map +1 -0
  114. package/dist/src/paramRuntime/graphRuntime.d.ts +176 -0
  115. package/dist/src/paramRuntime/graphRuntime.d.ts.map +1 -0
  116. package/dist/src/paramRuntime/graphRuntime.js +628 -0
  117. package/dist/src/paramRuntime/graphRuntime.test.d.ts +2 -0
  118. package/dist/src/paramRuntime/graphRuntime.test.d.ts.map +1 -0
  119. package/dist/src/paramRuntime/index.d.ts +9 -0
  120. package/dist/src/paramRuntime/index.d.ts.map +1 -0
  121. package/dist/src/paramRuntime/index.js +8 -0
  122. package/dist/src/paramRuntime/lifecycleRegistry.d.ts +27 -0
  123. package/dist/src/paramRuntime/lifecycleRegistry.d.ts.map +1 -0
  124. package/dist/src/paramRuntime/lifecycleRegistry.js +54 -0
  125. package/dist/src/paramRuntime/paramRuntime.d.ts +165 -0
  126. package/dist/src/paramRuntime/paramRuntime.d.ts.map +1 -0
  127. package/dist/src/paramRuntime/paramRuntime.js +222 -0
  128. package/dist/src/paramRuntime/paramRuntime.test.d.ts +2 -0
  129. package/dist/src/paramRuntime/paramRuntime.test.d.ts.map +1 -0
  130. package/dist/src/paramRuntime/paramStore.d.ts +68 -0
  131. package/dist/src/paramRuntime/paramStore.d.ts.map +1 -0
  132. package/dist/src/paramRuntime/paramStore.js +148 -0
  133. package/dist/src/paramRuntime/paramStore.test.d.ts +2 -0
  134. package/dist/src/paramRuntime/paramStore.test.d.ts.map +1 -0
  135. package/dist/src/paramRuntime/paramUtils.d.ts +86 -0
  136. package/dist/src/paramRuntime/paramUtils.d.ts.map +1 -0
  137. package/dist/src/paramRuntime/paramUtils.js +272 -0
  138. package/dist/src/paramRuntime/selectionStore.d.ts +6 -0
  139. package/dist/src/paramRuntime/selectionStore.d.ts.map +1 -0
  140. package/dist/src/paramRuntime/selectionStore.js +13 -0
  141. package/dist/src/paramRuntime/types.d.ts +16 -0
  142. package/dist/src/paramRuntime/types.d.ts.map +1 -0
  143. package/dist/src/paramRuntime/types.js +25 -0
  144. package/dist/src/paramRuntime/viewParamRuntime.d.ts +164 -0
  145. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -0
  146. package/dist/src/paramRuntime/viewParamRuntime.js +443 -0
  147. package/dist/src/scale/scale.d.ts +6 -1
  148. package/dist/src/scale/scale.d.ts.map +1 -1
  149. package/dist/src/scale/scale.js +83 -23
  150. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  151. package/dist/src/scales/axisResolution.js +10 -0
  152. package/dist/src/scales/{scaleDomainAggregator.d.ts → domainPlanner.d.ts} +6 -3
  153. package/dist/src/scales/domainPlanner.d.ts.map +1 -0
  154. package/dist/src/scales/{scaleDomainAggregator.js → domainPlanner.js} +128 -10
  155. package/dist/src/scales/domainPlanner.test.d.ts +2 -0
  156. package/dist/src/scales/domainPlanner.test.d.ts.map +1 -0
  157. package/dist/src/scales/scaleInstanceManager.d.ts +6 -3
  158. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
  159. package/dist/src/scales/scaleInstanceManager.js +17 -11
  160. package/dist/src/scales/scaleInteractionController.d.ts +6 -0
  161. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  162. package/dist/src/scales/scaleInteractionController.js +41 -3
  163. package/dist/src/scales/scaleResolution.d.ts +20 -17
  164. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  165. package/dist/src/scales/scaleResolution.js +188 -71
  166. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -1
  167. package/dist/src/selection/selection.d.ts +21 -0
  168. package/dist/src/selection/selection.d.ts.map +1 -1
  169. package/dist/src/selection/selection.js +83 -1
  170. package/dist/src/spec/channel.d.ts +52 -15
  171. package/dist/src/spec/coreSchemaRoot.d.ts +53 -0
  172. package/dist/src/spec/data.d.ts +4 -0
  173. package/dist/src/spec/parameter.d.ts +16 -11
  174. package/dist/src/spec/root.d.ts +1 -1
  175. package/dist/src/spec/testing.d.ts +12 -0
  176. package/dist/src/spec/testing.d.ts.map +1 -0
  177. package/dist/src/spec/testing.js +20 -0
  178. package/dist/src/spec/view.d.ts +157 -41
  179. package/dist/src/styles/genome-spy.css +3 -31
  180. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  181. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  182. package/dist/src/styles/genome-spy.css.js +0 -29
  183. package/dist/src/tooltip/dataTooltipHandler.d.ts +1 -1
  184. package/dist/src/tooltip/dataTooltipHandler.js +23 -32
  185. package/dist/src/tooltip/dataTooltipHandler.test.d.ts +2 -0
  186. package/dist/src/tooltip/dataTooltipHandler.test.d.ts.map +1 -0
  187. package/dist/src/tooltip/flattenDatumRows.d.ts +13 -0
  188. package/dist/src/tooltip/flattenDatumRows.d.ts.map +1 -0
  189. package/dist/src/tooltip/flattenDatumRows.js +47 -0
  190. package/dist/src/tooltip/flattenDatumRows.test.d.ts +2 -0
  191. package/dist/src/tooltip/flattenDatumRows.test.d.ts.map +1 -0
  192. package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +1 -1
  193. package/dist/src/tooltip/refseqGeneTooltipHandler.js +7 -1
  194. package/dist/src/tooltip/tooltipContext.d.ts +13 -0
  195. package/dist/src/tooltip/tooltipContext.d.ts.map +1 -0
  196. package/dist/src/tooltip/tooltipContext.js +543 -0
  197. package/dist/src/tooltip/tooltipContext.test.d.ts +2 -0
  198. package/dist/src/tooltip/tooltipContext.test.d.ts.map +1 -0
  199. package/dist/src/tooltip/tooltipHandler.d.ts +40 -1
  200. package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -1
  201. package/dist/src/tooltip/tooltipHandler.ts +62 -1
  202. package/dist/src/types/encoder.d.ts +38 -3
  203. package/dist/src/types/rendering.d.ts +4 -3
  204. package/dist/src/types/viewContext.d.ts +0 -14
  205. package/dist/src/utils/inputBinding.d.ts +10 -2
  206. package/dist/src/utils/inputBinding.d.ts.map +1 -1
  207. package/dist/src/utils/inputBinding.js +12 -3
  208. package/dist/src/utils/throttle.d.ts +4 -1
  209. package/dist/src/utils/throttle.d.ts.map +1 -1
  210. package/dist/src/utils/throttle.js +54 -23
  211. package/dist/src/utils/throttle.test.d.ts +2 -0
  212. package/dist/src/utils/throttle.test.d.ts.map +1 -0
  213. package/dist/src/utils/transition.d.ts +21 -0
  214. package/dist/src/utils/transition.d.ts.map +1 -1
  215. package/dist/src/utils/transition.js +28 -0
  216. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  217. package/dist/src/utils/ui/tooltip.js +7 -1
  218. package/dist/src/utils/ui/tooltip.test.d.ts +2 -0
  219. package/dist/src/utils/ui/tooltip.test.d.ts.map +1 -0
  220. package/dist/src/view/axisGridView.d.ts.map +1 -1
  221. package/dist/src/view/axisGridView.js +22 -5
  222. package/dist/src/view/axisView.d.ts.map +1 -1
  223. package/dist/src/view/axisView.js +20 -5
  224. package/dist/src/view/concatView.js +3 -3
  225. package/dist/src/view/containerMutationHelper.js +1 -1
  226. package/dist/src/view/containerView.d.ts +9 -5
  227. package/dist/src/view/containerView.d.ts.map +1 -1
  228. package/dist/src/view/containerView.js +34 -9
  229. package/dist/src/view/dataReadiness.d.ts +46 -0
  230. package/dist/src/view/dataReadiness.d.ts.map +1 -0
  231. package/dist/src/view/dataReadiness.js +267 -0
  232. package/dist/src/view/dataReadiness.test.d.ts +2 -0
  233. package/dist/src/view/dataReadiness.test.d.ts.map +1 -0
  234. package/dist/src/view/facetView.d.ts.map +1 -1
  235. package/dist/src/view/facetView.js +7 -5
  236. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  237. package/dist/src/view/flowBuilder.js +17 -4
  238. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  239. package/dist/src/view/gridView/gridChild.js +16 -3
  240. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  241. package/dist/src/view/gridView/gridView.js +119 -2
  242. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  243. package/dist/src/view/gridView/scrollbar.js +3 -0
  244. package/dist/src/view/gridView/selectionRect.d.ts +6 -10
  245. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  246. package/dist/src/view/gridView/selectionRect.js +22 -24
  247. package/dist/src/view/gridView/separatorView.d.ts +51 -0
  248. package/dist/src/view/gridView/separatorView.d.ts.map +1 -0
  249. package/dist/src/view/gridView/separatorView.js +275 -0
  250. package/dist/src/view/layerView.d.ts.map +1 -1
  251. package/dist/src/view/layerView.js +7 -5
  252. package/dist/src/view/layout/flexLayout.d.ts +0 -30
  253. package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
  254. package/dist/src/view/layout/flexLayout.js +0 -86
  255. package/dist/src/view/multiscale.d.ts +35 -0
  256. package/dist/src/view/multiscale.d.ts.map +1 -0
  257. package/dist/src/view/multiscale.js +233 -0
  258. package/dist/src/view/multiscale.test.d.ts +2 -0
  259. package/dist/src/view/multiscale.test.d.ts.map +1 -0
  260. package/dist/src/view/testUtils.d.ts.map +1 -1
  261. package/dist/src/view/testUtils.js +6 -1
  262. package/dist/src/view/unitView.d.ts +8 -13
  263. package/dist/src/view/unitView.d.ts.map +1 -1
  264. package/dist/src/view/unitView.js +120 -45
  265. package/dist/src/view/view.d.ts +27 -18
  266. package/dist/src/view/view.d.ts.map +1 -1
  267. package/dist/src/view/view.js +298 -37
  268. package/dist/src/view/viewFactory.d.ts +0 -12
  269. package/dist/src/view/viewFactory.d.ts.map +1 -1
  270. package/dist/src/view/viewFactory.js +55 -25
  271. package/dist/src/view/viewParamRuntime.test.d.ts +2 -0
  272. package/dist/src/view/viewParamRuntime.test.d.ts.map +1 -0
  273. package/dist/src/view/viewSelectors.d.ts +148 -0
  274. package/dist/src/view/viewSelectors.d.ts.map +1 -0
  275. package/dist/src/view/viewSelectors.js +776 -0
  276. package/dist/src/view/viewSelectors.test.d.ts +2 -0
  277. package/dist/src/view/viewSelectors.test.d.ts.map +1 -0
  278. package/dist/src/view/viewUtils.d.ts +0 -8
  279. package/dist/src/view/viewUtils.d.ts.map +1 -1
  280. package/dist/src/view/viewUtils.js +1 -21
  281. package/package.json +4 -4
  282. package/dist/src/scales/scaleDomainAggregator.d.ts.map +0 -1
  283. package/dist/src/scales/scaleDomainAggregator.test.d.ts +0 -2
  284. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +0 -1
  285. package/dist/src/spec/sampleView.d.ts +0 -197
  286. package/dist/src/view/paramMediator.d.ts +0 -149
  287. package/dist/src/view/paramMediator.d.ts.map +0 -1
  288. package/dist/src/view/paramMediator.js +0 -478
  289. package/dist/src/view/paramMediator.test.d.ts +0 -2
  290. package/dist/src/view/paramMediator.test.d.ts.map +0 -1
@@ -90,7 +90,20 @@ export default function scaleLocus() {
90
90
 
91
91
  const originalCopy = scale.copy;
92
92
 
93
- scale.copy = () => originalCopy().genome(genome);
93
+ scale.copy = () => {
94
+ const copied = originalCopy();
95
+ let copiedGenome = genome;
96
+ // @ts-expect-error
97
+ copied.genome = function (_) {
98
+ if (arguments.length) {
99
+ copiedGenome = _;
100
+ return copied;
101
+ } else {
102
+ return copiedGenome;
103
+ }
104
+ };
105
+ return copied.genome(genome);
106
+ };
94
107
 
95
108
  return scale;
96
109
  }
@@ -3,7 +3,6 @@
3
3
  */
4
4
  export function createContainerUi(container: HTMLElement): {
5
5
  canvasWrapper: HTMLElement;
6
- loadingMessageElement: HTMLElement;
7
6
  loadingIndicatorsElement: HTMLElement;
8
7
  tooltip: Tooltip;
9
8
  styleElement: HTMLStyleElement;
@@ -1 +1 @@
1
- {"version":3,"file":"containerUi.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/containerUi.js"],"names":[],"mappings":"AAGA;;GAEG;AACH,6CAFW,WAAW;;;;;;EA2CrB;AAED;;;GAGG;AACH,4CAHW,WAAW,WACX,MAAM,QAUhB;oBA5DmB,wBAAwB"}
1
+ {"version":3,"file":"containerUi.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/containerUi.js"],"names":[],"mappings":"AAGA;;GAEG;AACH,6CAFW,WAAW;;;;;EA6BrB;AAED;;;GAGG;AACH,4CAHW,WAAW,WACX,MAAM,QAUhB;oBA9CmB,wBAAwB"}
@@ -18,12 +18,6 @@ export function createContainerUi(container) {
18
18
 
19
19
  canvasWrapper.classList.add("loading");
20
20
 
21
- const loadingMessageElement = element("div", {
22
- class: "loading-message",
23
- innerHTML: `<div class="message">Loading<span class="ellipsis">...</span></div>`,
24
- });
25
- canvasWrapper.appendChild(loadingMessageElement);
26
-
27
21
  const loadingIndicatorsElement = element("div", {
28
22
  class: "loading-indicators",
29
23
  });
@@ -31,16 +25,8 @@ export function createContainerUi(container) {
31
25
 
32
26
  const tooltip = new Tooltip(container);
33
27
 
34
- loadingMessageElement
35
- .querySelector(".message")
36
- .addEventListener("transitionend", () => {
37
- /** @type {HTMLElement} */ (loadingMessageElement).style.display =
38
- "none";
39
- });
40
-
41
28
  return {
42
29
  canvasWrapper,
43
- loadingMessageElement,
44
30
  loadingIndicatorsElement,
45
31
  tooltip,
46
32
  styleElement,
@@ -29,7 +29,7 @@ export default class InputBindingManager {
29
29
  const inputs = [];
30
30
 
31
31
  viewRoot.visit((view) => {
32
- const mediator = view.paramMediator;
32
+ const mediator = view.paramRuntime;
33
33
  inputs.push(...createBindingInputs(mediator));
34
34
  });
35
35
  const ibc = this.#options.inputBindingContainer;
@@ -1 +1 @@
1
- {"version":3,"file":"interactionController.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/interactionController.js"],"names":[],"mappings":"AAQA;IA2BI;;;;;;;;;;OAUG;IACH,mIATG;QAAmD,QAAQ,EAAnD,OAAO,iBAAiB,EAAE,OAAO;QACe,QAAQ,EAAxD,OAAO,sBAAsB,EAAE,OAAO;QACY,OAAO,EAAzD,OAAO,wBAAwB,EAAE,OAAO;QACQ,QAAQ,EAAxD,OAAO,sBAAsB,EAAE,OAAO;QACM,SAAS,EAArD,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI;QAC6C,eAAe,EAA9F,MAAM,CAAC,MAAM,EAAE,OAAO,8BAA8B,EAAE,cAAc,CAAC;QACjD,wBAAwB,EAA5C,MAAM,IAAI;QACY,mBAAmB,EAAzC,MAAM,MAAM;KACtB,EAgCA;IAED;cArDkB,OAAO,kBAAkB,EAAE,OAAO;eAAS,OAAO,qBAAqB,EAAE,KAAK;kBAAY,MAAM;MAuDjH;IAED,4BAgMC;IA6ED;;;;;;;OAOG;IACH,cAFa,CAAC,SAFH,CAAC,cACD,CAAS,IAAC,EAAD,CAAC,KAAE,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAYlF;;CACJ"}
1
+ {"version":3,"file":"interactionController.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/interactionController.js"],"names":[],"mappings":"AASA;IA2BI;;;;;;;;;;OAUG;IACH,mIATG;QAAmD,QAAQ,EAAnD,OAAO,iBAAiB,EAAE,OAAO;QACe,QAAQ,EAAxD,OAAO,sBAAsB,EAAE,OAAO;QACY,OAAO,EAAzD,OAAO,wBAAwB,EAAE,OAAO;QACQ,QAAQ,EAAxD,OAAO,sBAAsB,EAAE,OAAO;QACM,SAAS,EAArD,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI;QAC6C,eAAe,EAA9F,MAAM,CAAC,MAAM,EAAE,OAAO,8BAA8B,EAAE,cAAc,CAAC;QACjD,wBAAwB,EAA5C,MAAM,IAAI;QACY,mBAAmB,EAAzC,MAAM,MAAM;KACtB,EAgCA;IAED;cArDkB,OAAO,kBAAkB,EAAE,OAAO;eAAS,OAAO,qBAAqB,EAAE,KAAK;kBAAY,MAAM;MAuDjH;IAED,4BAgMC;IAkFD;;;;;;;OAOG;IACH,cAFa,CAAC,SAFH,CAAC,cACD,CAAS,IAAC,EAAD,CAAC,KAAE,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAYlF;;CACJ"}
@@ -5,6 +5,7 @@ import InteractionEvent from "../utils/interactionEvent.js";
5
5
  import Inertia, { makeEventTemplate } from "../utils/inertia.js";
6
6
  import Point from "../view/layout/point.js";
7
7
  import { isStillZooming } from "../view/zoom.js";
8
+ import createTooltipContext from "../tooltip/tooltipContext.js";
8
9
 
9
10
  export default class InteractionController {
10
11
  /** @type {import("../view/view.js").default} */
@@ -344,7 +345,12 @@ export default class InteractionController {
344
345
  );
345
346
  }
346
347
 
347
- return handler(datum, mark, tooltipProps?.params);
348
+ const context = createTooltipContext(
349
+ datum,
350
+ mark,
351
+ tooltipProps?.params
352
+ );
353
+ return handler(datum, mark, tooltipProps?.params, context);
348
354
  }
349
355
  });
350
356
  }
@@ -1,14 +1,10 @@
1
1
  export default class LoadingIndicatorManager {
2
2
  /**
3
3
  * @param {HTMLElement} loadingIndicatorsElement
4
+ * @param {import("./loadingStatusRegistry.js").default} loadingStatusRegistry
4
5
  */
5
- constructor(loadingIndicatorsElement: HTMLElement);
6
- /**
7
- * @param {import("../view/view.js").default} view
8
- * @param {import("../types/viewContext.js").DataLoadingStatus} status
9
- * @param {string} [detail]
10
- */
11
- setDataLoadingStatus(view: import("../view/view.js").default, status: import("../types/viewContext.js").DataLoadingStatus, detail?: string): void;
6
+ constructor(loadingIndicatorsElement: HTMLElement, loadingStatusRegistry: import("./loadingStatusRegistry.js").default);
7
+ destroy(): void;
12
8
  updateLayout(): void;
13
9
  #private;
14
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loadingIndicatorManager.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/loadingIndicatorManager.js"],"names":[],"mappings":"AAIA;IAQI;;OAEG;IACH,sCAFW,WAAW,EASrB;IAED;;;;OAIG;IACH,2BAJW,OAAO,iBAAiB,EAAE,OAAO,UACjC,OAAO,yBAAyB,EAAE,iBAAiB,WACnD,MAAM,QAKhB;IAED,qBAwDC;;CACJ"}
1
+ {"version":3,"file":"loadingIndicatorManager.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/loadingIndicatorManager.js"],"names":[],"mappings":"AAIA;IAYI;;;OAGG;IACH,sCAHW,WAAW,yBACX,OAAO,4BAA4B,EAAE,OAAO,EAWtD;IAED,gBAKC;IAED,qBAoGC;;CACJ"}
@@ -5,45 +5,67 @@ import SPINNER from "../img/90-ring-with-bg.svg";
5
5
  export default class LoadingIndicatorManager {
6
6
  /** @type {HTMLElement} */
7
7
  #loadingIndicatorsElement;
8
+
8
9
  /**
9
- * @type {Map<import("../view/view.js").default, { status: import("../types/viewContext.js").DataLoadingStatus, detail?: string }>}
10
+ * @type {import("./loadingStatusRegistry.js").default}
10
11
  */
11
- #loadingViews;
12
+ #loadingStatusRegistry;
13
+
14
+ /** @type {(() => void) | null} */
15
+ #unsubscribe = null;
12
16
 
13
17
  /**
14
18
  * @param {HTMLElement} loadingIndicatorsElement
19
+ * @param {import("./loadingStatusRegistry.js").default} loadingStatusRegistry
15
20
  */
16
- constructor(loadingIndicatorsElement) {
21
+ constructor(loadingIndicatorsElement, loadingStatusRegistry) {
17
22
  this.#loadingIndicatorsElement = loadingIndicatorsElement;
18
23
 
19
- /**
20
- * @type {Map<import("../view/view.js").default, { status: import("../types/viewContext.js").DataLoadingStatus, detail?: string }>}
21
- */
22
- this.#loadingViews = new Map();
23
- }
24
+ this.#loadingStatusRegistry = loadingStatusRegistry;
24
25
 
25
- /**
26
- * @param {import("../view/view.js").default} view
27
- * @param {import("../types/viewContext.js").DataLoadingStatus} status
28
- * @param {string} [detail]
29
- */
30
- setDataLoadingStatus(view, status, detail) {
31
- this.#loadingViews.set(view, { status, detail });
26
+ this.#unsubscribe = this.#loadingStatusRegistry.subscribe(() =>
27
+ this.updateLayout()
28
+ );
32
29
  this.updateLayout();
33
30
  }
34
31
 
32
+ destroy() {
33
+ if (this.#unsubscribe) {
34
+ this.#unsubscribe();
35
+ this.#unsubscribe = null;
36
+ }
37
+ }
38
+
35
39
  updateLayout() {
36
40
  /** @type {import("lit").TemplateResult[]} */
37
41
  const indicators = [];
38
42
 
39
- const isSomethingVisible = () =>
40
- [...this.#loadingViews.values()].some(
41
- (v) => v.status == "loading" || v.status == "error"
42
- );
43
+ const isSomethingVisible = () => {
44
+ for (const [, status] of this.#loadingStatusRegistry.entries()) {
45
+ if (status.status == "loading" || status.status == "error") {
46
+ return true;
47
+ }
48
+ }
49
+ return false;
50
+ };
51
+
52
+ /** @type {{ status: import("../types/viewContext.js").DataLoadingStatus, detail?: string } | undefined} */
53
+ let fallbackStatus;
54
+ let hasVisibleWithCoords = false;
55
+
56
+ for (const [view, status] of this.#loadingStatusRegistry.entries()) {
57
+ const isVisible =
58
+ status.status == "loading" || status.status == "error";
43
59
 
44
- for (const [view, status] of this.#loadingViews) {
45
60
  const c = view.coords;
61
+ if (!c && isVisible && !fallbackStatus) {
62
+ fallbackStatus = status;
63
+ }
46
64
  if (c) {
65
+ if (isVisible) {
66
+ hasVisibleWithCoords = true;
67
+ }
68
+
47
69
  const style = {
48
70
  left: `${c.x}px`,
49
71
  top: `${c.y}px`,
@@ -70,6 +92,32 @@ export default class LoadingIndicatorManager {
70
92
  }
71
93
  }
72
94
 
95
+ if (fallbackStatus && !hasVisibleWithCoords) {
96
+ const style = {
97
+ left: "0px",
98
+ top: "0px",
99
+ width: "100%",
100
+ height: "100%",
101
+ };
102
+ indicators.push(
103
+ html`<div style=${styleMap(style)}>
104
+ <div class=${fallbackStatus.status}>
105
+ ${fallbackStatus.status == "error"
106
+ ? html`<span
107
+ >Loading
108
+ failed${fallbackStatus.detail
109
+ ? html`: ${fallbackStatus.detail}`
110
+ : nothing}</span
111
+ >`
112
+ : html`
113
+ <img src="${SPINNER}" alt="" />
114
+ <span>Loading...</span>
115
+ `}
116
+ </div>
117
+ </div>`
118
+ );
119
+ }
120
+
73
121
  // Do some hacks to stop css animations of the loading indicators.
74
122
  // Otherwise they fire animation frames even when their opacity is zero.
75
123
  // TODO: Instead of this, replace the animated spinners with static images.
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @typedef {import("../view/view.js").default} View
3
+ * @typedef {import("../types/viewContext.js").DataLoadingStatus} DataLoadingStatus
4
+ * @typedef {{ status: DataLoadingStatus, detail?: string }} LoadingStatus
5
+ * @typedef {{ view: View, status: DataLoadingStatus, detail?: string }} LoadingStatusChange
6
+ */
7
+ /**
8
+ * Central registry for per-view loading status that decouples data sources
9
+ * from UI rendering. Consumers can subscribe to changes and query the current
10
+ * status map when needed (e.g., for overlay rendering).
11
+ */
12
+ export default class LoadingStatusRegistry {
13
+ /**
14
+ * @param {View} view
15
+ * @param {DataLoadingStatus} status
16
+ * @param {string} [detail]
17
+ */
18
+ set(view: View, status: DataLoadingStatus, detail?: string): void;
19
+ /**
20
+ * @param {View} view
21
+ */
22
+ delete(view: View): void;
23
+ /**
24
+ * @param {View} view
25
+ * @returns {LoadingStatus | undefined}
26
+ */
27
+ get(view: View): LoadingStatus | undefined;
28
+ /**
29
+ * @returns {IterableIterator<[View, LoadingStatus]>}
30
+ */
31
+ entries(): IterableIterator<[View, LoadingStatus]>;
32
+ /**
33
+ * Subscribe to status changes.
34
+ *
35
+ * @param {(change: LoadingStatusChange) => void} listener
36
+ * @returns {() => void} Unsubscribe callback
37
+ */
38
+ subscribe(listener: (change: LoadingStatusChange) => void): () => void;
39
+ #private;
40
+ }
41
+ export type View = import("../view/view.js").default;
42
+ export type DataLoadingStatus = import("../types/viewContext.js").DataLoadingStatus;
43
+ export type LoadingStatus = {
44
+ status: DataLoadingStatus;
45
+ detail?: string;
46
+ };
47
+ export type LoadingStatusChange = {
48
+ view: View;
49
+ status: DataLoadingStatus;
50
+ detail?: string;
51
+ };
52
+ //# sourceMappingURL=loadingStatusRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadingStatusRegistry.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/loadingStatusRegistry.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH;IAOI;;;;OAIG;IACH,UAJW,IAAI,UACJ,iBAAiB,WACjB,MAAM,QAahB;IAED;;OAEG;IACH,aAFW,IAAI,QAkBd;IAED;;;OAGG;IACH,UAHW,IAAI,GACF,aAAa,GAAG,SAAS,CAIrC;IAED;;OAEG;IACH,WAFa,gBAAgB,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAInD;IAED;;;;;OAKG;IACH,oBAHW,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,GACnC,MAAM,IAAI,CAOtB;;CACJ;mBApFY,OAAO,iBAAiB,EAAE,OAAO;gCACjC,OAAO,yBAAyB,EAAE,iBAAiB;4BACnD;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;kCAC9C;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * @typedef {import("../view/view.js").default} View
3
+ * @typedef {import("../types/viewContext.js").DataLoadingStatus} DataLoadingStatus
4
+ * @typedef {{ status: DataLoadingStatus, detail?: string }} LoadingStatus
5
+ * @typedef {{ view: View, status: DataLoadingStatus, detail?: string }} LoadingStatusChange
6
+ */
7
+
8
+ /**
9
+ * Central registry for per-view loading status that decouples data sources
10
+ * from UI rendering. Consumers can subscribe to changes and query the current
11
+ * status map when needed (e.g., for overlay rendering).
12
+ */
13
+ export default class LoadingStatusRegistry {
14
+ /** @type {Map<View, LoadingStatus>} */
15
+ #statuses = new Map();
16
+
17
+ /** @type {Set<(change: LoadingStatusChange) => void>} */
18
+ #listeners = new Set();
19
+
20
+ /**
21
+ * @param {View} view
22
+ * @param {DataLoadingStatus} status
23
+ * @param {string} [detail]
24
+ */
25
+ set(view, status, detail) {
26
+ if (!view) {
27
+ throw new Error("LoadingStatusRegistry.set requires a view.");
28
+ }
29
+
30
+ this.#statuses.set(view, { status, detail });
31
+
32
+ const change = { view, status, detail };
33
+ for (const listener of this.#listeners) {
34
+ listener(change);
35
+ }
36
+ }
37
+
38
+ /**
39
+ * @param {View} view
40
+ */
41
+ delete(view) {
42
+ const previous = this.#statuses.get(view);
43
+ if (!previous) {
44
+ return;
45
+ }
46
+
47
+ this.#statuses.delete(view);
48
+
49
+ const change = {
50
+ view,
51
+ status: previous.status,
52
+ detail: previous.detail,
53
+ };
54
+ for (const listener of this.#listeners) {
55
+ listener(change);
56
+ }
57
+ }
58
+
59
+ /**
60
+ * @param {View} view
61
+ * @returns {LoadingStatus | undefined}
62
+ */
63
+ get(view) {
64
+ return this.#statuses.get(view);
65
+ }
66
+
67
+ /**
68
+ * @returns {IterableIterator<[View, LoadingStatus]>}
69
+ */
70
+ entries() {
71
+ return this.#statuses.entries();
72
+ }
73
+
74
+ /**
75
+ * Subscribe to status changes.
76
+ *
77
+ * @param {(change: LoadingStatusChange) => void} listener
78
+ * @returns {() => void} Unsubscribe callback
79
+ */
80
+ subscribe(listener) {
81
+ this.#listeners.add(listener);
82
+ return () => {
83
+ this.#listeners.delete(listener);
84
+ };
85
+ }
86
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"viewContextFactory.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/viewContextFactory.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;GASG;AACH,2CALW,OAAO,CAAC,WAAW,CAAC,GAAG;IAC7B,6BAA6B,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,iBAAiB,EAAE,QAAQ,GAAG,OAAO,iBAAiB,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,0BAA0B,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,iBAAiB,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,QAAQ,KAAK,IAAI,KAAK,OAAO,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC,CAAA;CACvX,GACS,WAAW,CAkEvB;0BA7EY,OAAO,yBAAyB,EAAE,OAAO"}
1
+ {"version":3,"file":"viewContextFactory.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/viewContextFactory.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;GASG;AACH,2CALW,OAAO,CAAC,WAAW,CAAC,GAAG;IAC7B,6BAA6B,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,iBAAiB,EAAE,QAAQ,GAAG,OAAO,iBAAiB,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,0BAA0B,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,iBAAiB,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,QAAQ,KAAK,IAAI,KAAK,OAAO,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC,CAAA;CACvX,GACS,WAAW,CAiEvB;0BA5EY,OAAO,yBAAyB,EAAE,OAAO"}
@@ -58,7 +58,6 @@ export function createViewContext(options) {
58
58
  "updateTooltip",
59
59
  "getNamedDataFromProvider",
60
60
  "getCurrentHover",
61
- "setDataLoadingStatus",
62
61
  "addKeyboardListener",
63
62
  "addBroadcastListener",
64
63
  "removeBroadcastListener",
@@ -1 +1 @@
1
- {"version":3,"file":"viewDataInit.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/viewDataInit.js"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AACH,6CANW,OAAO,iBAAiB,EAAE,OAAO,YACjC,OAAO,qBAAqB,EAAE,OAAO,eACrC,OAAO,2BAA2B,EAAE,OAAO,mBAC3C,CAAC,QAAQ,EAAE,OAAO,qBAAqB,EAAE,OAAO,KAAK,IAAI,GACvD,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAkC1D;AAED;;;;;;;;GAQG;AACH,oDALW,OAAO,iBAAiB,EAAE,OAAO,YACjC,OAAO,qBAAqB,EAAE,OAAO,eACrC,OAAO,2BAA2B,EAAE,OAAO,GACzC,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAgD1D"}
1
+ {"version":3,"file":"viewDataInit.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/viewDataInit.js"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AACH,6CANW,OAAO,iBAAiB,EAAE,OAAO,YACjC,OAAO,qBAAqB,EAAE,OAAO,eACrC,OAAO,2BAA2B,EAAE,OAAO,mBAC3C,CAAC,QAAQ,EAAE,OAAO,qBAAqB,EAAE,OAAO,KAAK,IAAI,GACvD,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAkC1D;AAED;;;;;;;;GAQG;AACH,oDALW,OAAO,iBAAiB,EAAE,OAAO,YACjC,OAAO,qBAAqB,EAAE,OAAO,eACrC,OAAO,2BAA2B,EAAE,OAAO,GACzC,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,CAAC,CA2E1D"}
@@ -63,6 +63,10 @@ export async function initializeVisibleViewData(
63
63
  dataFlow,
64
64
  fontManager
65
65
  ) {
66
+ // Initialize dataflow/graphics for views that have become visible since the
67
+ // initial load, while avoiding unnecessary data source reloads. If a view
68
+ // attaches downstream of an already completed collector, repropagate that
69
+ // collector instead of reloading the source.
66
70
  const visibilityPredicate = (
67
71
  /** @type {import("../view/view.js").default} */ view
68
72
  ) => view.isConfiguredVisible();
@@ -80,6 +84,23 @@ export async function initializeVisibleViewData(
80
84
  /** @type {import("../view/view.js").default} */ view
81
85
  ) => viewsToInitializeSet.has(view);
82
86
 
87
+ /** @type {Set<import("../data/collector.js").default>} */
88
+ const collectorsToRepropagate = new Set();
89
+ /** @type {import("../view/view.js").default[]} */
90
+ const viewsNeedingLoad = [];
91
+ for (const view of viewsToInitialize) {
92
+ if (view.spec.data) {
93
+ viewsNeedingLoad.push(view);
94
+ continue;
95
+ }
96
+ const collector = findCompletedAncestorCollector(view);
97
+ if (collector) {
98
+ collectorsToRepropagate.add(collector);
99
+ } else {
100
+ viewsNeedingLoad.push(view);
101
+ }
102
+ }
103
+
83
104
  const { dataFlow: builtDataFlow, graphicsPromises } = initializeViewSubtree(
84
105
  viewRoot,
85
106
  dataFlow,
@@ -89,17 +110,23 @@ export async function initializeVisibleViewData(
89
110
 
90
111
  await fontManager.waitUntilReady();
91
112
 
92
- const dataSourceRoots = collectDataSourceRoots(viewsToInitialize);
93
- await Promise.all(
94
- Array.from(dataSourceRoots.entries()).map(
95
- ([subtreeRoot, dataSources]) =>
96
- loadViewSubtreeData(subtreeRoot, dataSources, undefined, {
97
- // If a source is already loading, schedule a reload so new branches
98
- // added during lazy init receive a complete data propagation.
99
- queueReload: true,
100
- })
101
- )
102
- );
113
+ for (const collector of collectorsToRepropagate) {
114
+ collector.repropagate();
115
+ }
116
+
117
+ if (viewsNeedingLoad.length) {
118
+ const dataSourceRoots = collectDataSourceRoots(viewsNeedingLoad);
119
+ await Promise.all(
120
+ Array.from(dataSourceRoots.entries()).map(
121
+ ([subtreeRoot, dataSources]) =>
122
+ loadViewSubtreeData(subtreeRoot, dataSources, undefined, {
123
+ // If a source is already loading, schedule a reload so new branches
124
+ // added during lazy init receive a complete data propagation.
125
+ queueReload: true,
126
+ })
127
+ )
128
+ );
129
+ }
103
130
 
104
131
  await finalizeSubtreeGraphics(graphicsPromises);
105
132
 
@@ -158,3 +185,21 @@ function collectDataSourceRoots(views) {
158
185
 
159
186
  return roots;
160
187
  }
188
+
189
+ /**
190
+ * Finds the nearest completed collector in the dataParent chain.
191
+ *
192
+ * @param {import("../view/view.js").default} view
193
+ * @returns {import("../data/collector.js").default | undefined}
194
+ */
195
+ function findCompletedAncestorCollector(view) {
196
+ let current = view.dataParent;
197
+ while (current) {
198
+ const collector = current.flowHandle?.collector;
199
+ if (collector) {
200
+ return collector.completed ? collector : undefined;
201
+ }
202
+ current = current.dataParent;
203
+ }
204
+ return undefined;
205
+ }
@@ -66,8 +66,6 @@ export default class GenomeSpy {
66
66
  * @param {any} [payload]
67
67
  */
68
68
  broadcast(type: BroadcastEventType, payload?: any): void;
69
- loadingMessageElement: HTMLElement;
70
- loadingIndicatorsElement: HTMLElement;
71
69
  tooltip: import("./utils/ui/tooltip.js").default;
72
70
  /**
73
71
  * Unregisters all listeners, removes all created dom elements, removes all css classes from the container
@@ -1 +1 @@
1
- {"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"AA6CA;IAkBI;;;;;OAKG;IAEH;;;;;OAKG;IACH,uBAJW,WAAW,qDAEX,OAAO,qBAAqB,EAAE,YAAY,EA0CpD;IAvCG,uBAA0B;IAC1B,oDAAsB;IAItB,sCAAsC;IACtC,wCAAgB;IAEhB,yBAAoC;IAEpC,4CAA4C;IAC5C,oBADW,CAAC,CAAS,IAAM,EAAN,MAAM,KAAE,MAAM,EAAE,CAAC,EAAE,CACZ;IAE5B,mBAAoD;IAEpD,0BAA0B;IAC1B,aADW,WAAW,CACM;IAE5B;;;;;OAKG;IACH,yBAFU,CAAC,IAAI,kCAAM,KAAK,OAAO,CAE8B;IAE/D,oFAAoF;IACpF,iBADW,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC,CAK9E;IAED,mBAAmB;IACnB,2CAAyB;IAIzB,YAAkC;IAatC;;;OAGG;IACH,oCAFW,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,EAAE,QAIjC;IAED;;OAEG;IACH,+BAFW,MAAM,YAShB;IAED;;;;OAIG;IACH,sBAHW,MAAM,QACN,GAAG,EAAE,QAYf;IAED;;;OAGG;IACH,uBAHW,MAAM,YACN,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,QAI9B;IAED;;;OAGG;IACH,0BAHW,MAAM,YACN,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,QAI9B;IAED;;;;;OAKG;IACH,gBAHW,kBAAkB,YAClB,GAAG,QAMb;IAiEG,mCAAkD;IAKlD,sCAAwD;IACxD,iDAAsB;IAM1B;;OAEG;IACH,gBAmBC;IA8ID;;;OAGG;IACH,UAFa,OAAO,CAAC,OAAO,CAAC,CAgC5B;IAED,2CAiBC;IAED,4BAEC;IAED;;;;;;;OAOG;IACH,cAFa,CAAC,SAFH,CAAC,cACD,CAAS,IAAC,EAAD,CAAC,KAAE,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAKlF;IAED;;;;;;;;OAQG;IACH,4BANW,MAAM,kBACN,MAAM,qBACN,MAAM,eACN,MAAM,UAuBhB;IAED;;;MAEC;IAED,sBAEC;IAED,kBAEC;IAED,iCAEC;IAED,iCASC;IAED,uFAWC;;CACJ;;;;iCArhBY,eAAe,GAAG,QAAQ,GAAG,gBAAgB,GAAG,kBAAkB;4BAZnC,uBAAuB;qBAR9C,qBAAqB;wBAElB,yBAAyB;qBAL5B,oBAAoB"}
1
+ {"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"AA+CA;IAoBI;;;;;OAKG;IAEH;;;;;OAKG;IACH,uBAJW,WAAW,qDAEX,OAAO,qBAAqB,EAAE,YAAY,EA0CpD;IAvCG,uBAA0B;IAC1B,oDAAsB;IAItB,sCAAsC;IACtC,wCAAgB;IAEhB,yBAAoC;IAEpC,4CAA4C;IAC5C,oBADW,CAAC,CAAS,IAAM,EAAN,MAAM,KAAE,MAAM,EAAE,CAAC,EAAE,CACZ;IAE5B,mBAAoD;IAEpD,0BAA0B;IAC1B,aADW,WAAW,CACM;IAE5B;;;;;OAKG;IACH,yBAFU,CAAC,IAAI,kCAAM,KAAK,OAAO,CAE8B;IAE/D,oFAAoF;IACpF,iBADW,MAAM,CAAC,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC,CAK9E;IAED,mBAAmB;IACnB,2CAAyB;IAIzB,YAAkC;IAatC;;;OAGG;IACH,oCAFW,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,EAAE,QAIjC;IAED;;OAEG;IACH,+BAFW,MAAM,YAShB;IAED;;;;OAIG;IACH,sBAHW,MAAM,QACN,GAAG,EAAE,QAYf;IAED;;;OAGG;IACH,uBAHW,MAAM,YACN,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,QAI9B;IAED;;;OAGG;IACH,0BAHW,MAAM,YACN,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,QAI9B;IAED;;;;;OAKG;IACH,gBAHW,kBAAkB,YAClB,GAAG,QAMb;IA4DG,iDAAsB;IAQ1B;;OAEG;IACH,gBAqBC;IAyJD;;;OAGG;IACH,UAFa,OAAO,CAAC,OAAO,CAAC,CAyC5B;IAED,2CAiBC;IAED,4BAEC;IAED;;;;;;;OAOG;IACH,cAFa,CAAC,SAFH,CAAC,cACD,CAAS,IAAC,EAAD,CAAC,KAAE,OAAO,CAAC,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAKlF;IAED;;;;;;;;OAQG;IACH,4BANW,MAAM,kBACN,MAAM,qBACN,MAAM,eACN,MAAM,UAuBhB;IAED;;;MAEC;IAED,sBAEC;IAED,kBAEC;IAED,iCAEC;IAED,iCAYC;IAED,uFAWC;;CACJ;;;;iCAviBY,eAAe,GAAG,QAAQ,GAAG,gBAAgB,GAAG,kBAAkB;4BAbnC,uBAAuB;qBAR9C,qBAAqB;wBAElB,yBAAyB;qBAL5B,oBAAoB"}