@genome-spy/core 0.65.0 → 0.66.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/browser-BRemItdO.js +138 -0
- package/dist/bundle/{index-CD7FLu9x.js → index-BatuyGAI.js} +23 -21
- package/dist/bundle/{index-C0llXMqm.js → index-ByuE8dvu.js} +140 -88
- package/dist/bundle/index-Cq3QFUxX.js +1781 -0
- package/dist/bundle/index-D28m8tSW.js +1607 -0
- package/dist/bundle/index-DbJ0oeYM.js +631 -0
- package/dist/bundle/index.es.js +17587 -16593
- package/dist/bundle/index.js +214 -212
- package/dist/bundle/{inflate-DRgHi_KK.js → inflate-GtwLkvSP.js} +222 -224
- package/dist/bundle/unzip-NywezaRR.js +1492 -0
- package/dist/schema.json +13 -3
- package/dist/src/config/scaleDefaults.d.ts +8 -0
- package/dist/src/config/scaleDefaults.d.ts.map +1 -0
- package/dist/src/config/scaleDefaults.js +45 -0
- package/dist/src/data/flowInit.js +2 -2
- package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
- package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
- package/dist/src/data/transforms/filterScoredLabels.js +1 -1
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
- package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
- package/dist/src/encoder/encoder.d.ts +1 -1
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +1 -1
- package/dist/src/genome/scaleLocus.d.ts +39 -0
- package/dist/src/genome/scaleLocus.d.ts.map +1 -1
- package/dist/src/genome/scaleLocus.js +76 -0
- package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
- package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
- package/dist/src/genomeSpy/canvasExport.js +66 -0
- package/dist/src/genomeSpy/containerUi.d.ts +17 -0
- package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
- package/dist/src/genomeSpy/containerUi.js +78 -0
- package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
- package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
- package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
- package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
- package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/inputBindingManager.js +63 -0
- package/dist/src/genomeSpy/interactionController.d.ts +40 -0
- package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
- package/dist/src/genomeSpy/interactionController.js +371 -0
- package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
- package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
- package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
- package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
- package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
- package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
- package/dist/src/genomeSpy/renderCoordinator.js +118 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewContextFactory.js +79 -0
- package/dist/src/genomeSpy/viewDataInit.d.ts +12 -0
- package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewDataInit.js +41 -0
- package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
- package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
- package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
- package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewHighlight.js +30 -0
- package/dist/src/genomeSpy.d.ts +16 -71
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +179 -745
- package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
- package/dist/src/gl/webGLHelper.d.ts +2 -2
- package/dist/src/gl/webGLHelper.d.ts.map +1 -1
- package/dist/src/gl/webGLHelper.js +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -12
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +4 -2
- package/dist/src/{view → scales}/axisResolution.d.ts +9 -16
- package/dist/src/scales/axisResolution.d.ts.map +1 -0
- package/dist/src/{view → scales}/axisResolution.js +29 -18
- package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
- package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
- package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
- package/dist/src/scales/scaleDomainAggregator.js +162 -0
- package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
- package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
- package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
- package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
- package/dist/src/scales/scaleInstanceManager.js +313 -0
- package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
- package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
- package/dist/src/scales/scaleInteractionController.d.ts +73 -0
- package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
- package/dist/src/scales/scaleInteractionController.js +336 -0
- package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
- package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
- package/dist/src/scales/scalePropsResolver.d.ts +23 -0
- package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
- package/dist/src/scales/scalePropsResolver.js +74 -0
- package/dist/src/{view → scales}/scaleResolution.d.ts +52 -35
- package/dist/src/scales/scaleResolution.d.ts.map +1 -0
- package/dist/src/scales/scaleResolution.js +658 -0
- package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
- package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
- package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
- package/dist/src/scales/scaleResolutionConstants.js +5 -0
- package/dist/src/scales/scaleRules.d.ts +16 -0
- package/dist/src/scales/scaleRules.d.ts.map +1 -0
- package/dist/src/scales/scaleRules.js +103 -0
- package/dist/src/scales/scaleRules.test.d.ts +2 -0
- package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
- package/dist/src/spec/channel.d.ts +13 -18
- package/dist/src/spec/scale.d.ts +6 -0
- package/dist/src/types/embedApi.d.ts +5 -0
- package/dist/src/types/scaleResolutionApi.d.ts +1 -1
- package/dist/src/view/concatView.d.ts +18 -0
- package/dist/src/view/concatView.d.ts.map +1 -1
- package/dist/src/view/concatView.js +73 -0
- package/dist/src/view/concatView.test.d.ts +2 -0
- package/dist/src/view/concatView.test.d.ts.map +1 -0
- package/dist/src/view/containerMutationHelper.d.ts +74 -0
- package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
- package/dist/src/view/containerMutationHelper.js +114 -0
- package/dist/src/view/containerView.d.ts +0 -7
- package/dist/src/view/containerView.d.ts.map +1 -1
- package/dist/src/view/containerView.js +0 -10
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/facetView.js +0 -15
- package/dist/src/view/gridView/gridChild.d.ts +11 -0
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +32 -6
- package/dist/src/view/gridView/gridView.d.ts +39 -1
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +106 -48
- package/dist/src/view/gridView/gridView.test.d.ts +2 -0
- package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
- package/dist/src/view/gridView/scrollbar.d.ts +39 -8
- package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
- package/dist/src/view/gridView/scrollbar.js +184 -69
- package/dist/src/view/layerView.d.ts +14 -0
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layerView.js +66 -0
- package/dist/src/view/layerView.test.d.ts +2 -0
- package/dist/src/view/layerView.test.d.ts.map +1 -0
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +2 -1
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +24 -34
- package/dist/src/view/view.d.ts +6 -6
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +4 -4
- package/package.json +2 -2
- package/dist/bundle/browser-txUcLy2H.js +0 -123
- package/dist/bundle/index-BQpbYrv4.js +0 -1712
- package/dist/bundle/index-BhtHKLUo.js +0 -73
- package/dist/bundle/index-CCe8rnZz.js +0 -716
- package/dist/bundle/index-DhcU-Gk-.js +0 -1487
- package/dist/src/data/collector.test.js +0 -138
- package/dist/src/data/dataFlow.test.js +0 -38
- package/dist/src/data/flow.test.js +0 -81
- package/dist/src/data/flowInit.test.js +0 -413
- package/dist/src/data/flowNode.test.js +0 -50
- package/dist/src/data/flowOptimizer.test.js +0 -209
- package/dist/src/data/formats/fasta.test.js +0 -27
- package/dist/src/data/sources/inlineSource.test.js +0 -63
- package/dist/src/data/sources/sequenceSource.test.js +0 -81
- package/dist/src/data/transforms/aggregate.test.js +0 -134
- package/dist/src/data/transforms/clone.test.js +0 -11
- package/dist/src/data/transforms/coverage.test.js +0 -238
- package/dist/src/data/transforms/filter.test.js +0 -20
- package/dist/src/data/transforms/flatten.test.js +0 -96
- package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
- package/dist/src/data/transforms/flattenSequence.test.js +0 -34
- package/dist/src/data/transforms/formula.test.js +0 -25
- package/dist/src/data/transforms/identifier.test.js +0 -92
- package/dist/src/data/transforms/pileup.test.js +0 -70
- package/dist/src/data/transforms/project.test.js +0 -32
- package/dist/src/data/transforms/regexExtract.test.js +0 -70
- package/dist/src/data/transforms/regexFold.test.js +0 -201
- package/dist/src/data/transforms/sample.test.js +0 -38
- package/dist/src/data/transforms/stack.test.js +0 -91
- package/dist/src/encoder/accessor.test.js +0 -162
- package/dist/src/encoder/encoder.test.js +0 -105
- package/dist/src/genome/genome.test.js +0 -268
- package/dist/src/genome/genomes.test.js +0 -8
- package/dist/src/genome/scaleIndex.test.js +0 -78
- package/dist/src/genome/scaleLocus.test.js +0 -4
- package/dist/src/scale/scale.test.js +0 -326
- package/dist/src/scale/ticks.test.js +0 -46
- package/dist/src/selection/selection.test.js +0 -14
- package/dist/src/utils/addBaseUrl.test.js +0 -30
- package/dist/src/utils/binnedIndex.test.js +0 -201
- package/dist/src/utils/cloner.test.js +0 -35
- package/dist/src/utils/coalesce.test.js +0 -16
- package/dist/src/utils/concatIterables.test.js +0 -8
- package/dist/src/utils/domainArray.test.js +0 -130
- package/dist/src/utils/indexer.test.js +0 -49
- package/dist/src/utils/interactionEvent.test.js +0 -35
- package/dist/src/utils/iterateNestedMaps.test.js +0 -33
- package/dist/src/utils/kWayMerge.test.js +0 -30
- package/dist/src/utils/mergeObjects.test.js +0 -42
- package/dist/src/utils/numberExtractor.test.js +0 -6
- package/dist/src/utils/propertyCacher.test.js +0 -89
- package/dist/src/utils/propertyCoalescer.test.js +0 -25
- package/dist/src/utils/radixSort.test.js +0 -51
- package/dist/src/utils/reservationMap.test.js +0 -20
- package/dist/src/utils/ringBuffer.test.js +0 -39
- package/dist/src/utils/topK.test.js +0 -54
- package/dist/src/utils/trees.test.js +0 -135
- package/dist/src/utils/url.test.js +0 -28
- package/dist/src/utils/variableTools.test.js +0 -13
- package/dist/src/view/axisResolution.d.ts.map +0 -1
- package/dist/src/view/axisResolution.test.d.ts.map +0 -1
- package/dist/src/view/axisResolution.test.js +0 -206
- package/dist/src/view/flowBuilder.test.js +0 -125
- package/dist/src/view/gridView/selectionRect.test.js +0 -87
- package/dist/src/view/layout/flexLayout.test.js +0 -323
- package/dist/src/view/layout/grid.test.js +0 -71
- package/dist/src/view/layout/rectangle.test.js +0 -192
- package/dist/src/view/paramMediator.test.js +0 -282
- package/dist/src/view/scaleResolution.d.ts.map +0 -1
- package/dist/src/view/scaleResolution.js +0 -1059
- package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
- package/dist/src/view/scaleResolution.test.js +0 -645
- package/dist/src/view/view.test.js +0 -245
- package/dist/src/view/viewDispose.test.js +0 -110
- package/dist/src/view/viewFactory.test.js +0 -25
- package/dist/src/view/viewUtils.test.js +0 -87
- /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
- /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
|
@@ -18,6 +18,14 @@ import Scrollbar from "./scrollbar.js";
|
|
|
18
18
|
import SelectionRect from "./selectionRect.js";
|
|
19
19
|
|
|
20
20
|
export default class GridChild {
|
|
21
|
+
/**
|
|
22
|
+
* Users guide:
|
|
23
|
+
* - GridChild is owned by GridView and is not meant to be instantiated or
|
|
24
|
+
* managed directly by callers.
|
|
25
|
+
* - Use GridView/ConcatView APIs for insertion/removal so decorations and
|
|
26
|
+
* dataflow are kept in sync.
|
|
27
|
+
*/
|
|
28
|
+
|
|
21
29
|
/**
|
|
22
30
|
* @param {import("../view.js").default} view
|
|
23
31
|
* @param {import("../containerView.js").default} layoutParent
|
|
@@ -137,7 +145,7 @@ export default class GridChild {
|
|
|
137
145
|
const scaleResolutions = Object.fromEntries(
|
|
138
146
|
channels.map((channel) => {
|
|
139
147
|
const resolution = this.view.getScaleResolution(channel);
|
|
140
|
-
const scale = resolution?.
|
|
148
|
+
const scale = resolution?.getScale();
|
|
141
149
|
|
|
142
150
|
if (!scale || !isContinuous(scale.type)) {
|
|
143
151
|
throw new Error(
|
|
@@ -214,7 +222,7 @@ export default class GridChild {
|
|
|
214
222
|
const np = view.coords.normalizePoint(point.x, point.y, true);
|
|
215
223
|
|
|
216
224
|
for (const channel of channels) {
|
|
217
|
-
const scale = scaleResolutions[channel].
|
|
225
|
+
const scale = scaleResolutions[channel].getScale();
|
|
218
226
|
// @ts-ignore
|
|
219
227
|
const val = scale.invert(channel == "x" ? np.x : np.y);
|
|
220
228
|
inverted[channel] =
|
|
@@ -243,7 +251,7 @@ export default class GridChild {
|
|
|
243
251
|
/** @type {number} */ val
|
|
244
252
|
) => {
|
|
245
253
|
if (val == null) return null;
|
|
246
|
-
return scaleResolutions[channel].
|
|
254
|
+
return scaleResolutions[channel].getScale()(val);
|
|
247
255
|
};
|
|
248
256
|
const px = getCoord("x", xVal) ?? i;
|
|
249
257
|
const py = getCoord("y", yVal) ?? i;
|
|
@@ -477,10 +485,12 @@ export default class GridChild {
|
|
|
477
485
|
* Create view decorations, grid lines, axes, etc.
|
|
478
486
|
*/
|
|
479
487
|
async createAxes() {
|
|
488
|
+
this.disposeAxisViews();
|
|
489
|
+
|
|
480
490
|
const { view, axes, gridLines } = this;
|
|
481
491
|
|
|
482
492
|
/**
|
|
483
|
-
* @param {import("
|
|
493
|
+
* @param {import("../../scales/axisResolution.js").default} r
|
|
484
494
|
* @param {import("../../spec/channel.js").PrimaryPositionalChannel} channel
|
|
485
495
|
*/
|
|
486
496
|
const getAxisPropsWithDefaults = (r, channel) => {
|
|
@@ -521,7 +531,7 @@ export default class GridChild {
|
|
|
521
531
|
};
|
|
522
532
|
|
|
523
533
|
/**
|
|
524
|
-
* @param {import("
|
|
534
|
+
* @param {import("../../scales/axisResolution.js").default} r
|
|
525
535
|
* @param {import("../../spec/channel.js").PrimaryPositionalChannel} channel
|
|
526
536
|
* @param {import("../view.js").default} axisParent
|
|
527
537
|
*/
|
|
@@ -548,7 +558,7 @@ export default class GridChild {
|
|
|
548
558
|
};
|
|
549
559
|
|
|
550
560
|
/**
|
|
551
|
-
* @param {import("
|
|
561
|
+
* @param {import("../../scales/axisResolution.js").default} r
|
|
552
562
|
* @param {import("../../spec/channel.js").PrimaryPositionalChannel} channel
|
|
553
563
|
* @param {import("../view.js").default} axisParent
|
|
554
564
|
*/
|
|
@@ -644,6 +654,22 @@ export default class GridChild {
|
|
|
644
654
|
);
|
|
645
655
|
}
|
|
646
656
|
|
|
657
|
+
/**
|
|
658
|
+
* Disposes axis and gridline views so axes can be recreated safely.
|
|
659
|
+
*/
|
|
660
|
+
disposeAxisViews() {
|
|
661
|
+
for (const axisView of Object.values(this.axes)) {
|
|
662
|
+
axisView.disposeSubtree();
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
for (const gridView of Object.values(this.gridLines)) {
|
|
666
|
+
gridView.disposeSubtree();
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
this.axes = {};
|
|
670
|
+
this.gridLines = {};
|
|
671
|
+
}
|
|
672
|
+
|
|
647
673
|
getOverhang() {
|
|
648
674
|
const calculate = (
|
|
649
675
|
/** @type {import("../../spec/axis.js").AxisOrient} */ orient
|
|
@@ -43,6 +43,37 @@ export default class GridView extends ContainerView {
|
|
|
43
43
|
* @param {View} view
|
|
44
44
|
*/
|
|
45
45
|
appendChild(view: import("../view.js").default): void;
|
|
46
|
+
/**
|
|
47
|
+
* Appends a child view without initializing dataflow or axes.
|
|
48
|
+
* Intended for ConcatView when building the initial hierarchy.
|
|
49
|
+
*
|
|
50
|
+
* @param {View} view
|
|
51
|
+
* @returns {GridChild}
|
|
52
|
+
*/
|
|
53
|
+
appendChildView(view: import("../view.js").default): GridChild;
|
|
54
|
+
/**
|
|
55
|
+
* Inserts a child view without initializing dataflow or axes.
|
|
56
|
+
* Callers should create axes, initialize subtree data, and request layout.
|
|
57
|
+
*
|
|
58
|
+
* @param {View} view
|
|
59
|
+
* @param {number} index
|
|
60
|
+
* @returns {GridChild}
|
|
61
|
+
*/
|
|
62
|
+
insertChildViewAt(view: import("../view.js").default, index: number): GridChild;
|
|
63
|
+
/**
|
|
64
|
+
* Removes a child by instance and disposes its subtree.
|
|
65
|
+
* Callers should sync shared axes and request layout.
|
|
66
|
+
*
|
|
67
|
+
* @param {View} view
|
|
68
|
+
*/
|
|
69
|
+
removeChildView(view: import("../view.js").default): void;
|
|
70
|
+
/**
|
|
71
|
+
* Removes a child by index and disposes its subtree.
|
|
72
|
+
* Callers should sync shared axes and request layout.
|
|
73
|
+
*
|
|
74
|
+
* @param {number} index
|
|
75
|
+
*/
|
|
76
|
+
removeChildAt(index: number): void;
|
|
46
77
|
/**
|
|
47
78
|
* @param {View[]} views
|
|
48
79
|
*/
|
|
@@ -55,10 +86,17 @@ export default class GridView extends ContainerView {
|
|
|
55
86
|
/**
|
|
56
87
|
* @protected
|
|
57
88
|
*/
|
|
58
|
-
protected createAxes(): Promise<void
|
|
89
|
+
protected createAxes(): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Recreates shared axes based on current axis resolutions.
|
|
92
|
+
*
|
|
93
|
+
* This is used after dynamic child insert/remove to keep shared axes in sync.
|
|
94
|
+
*/
|
|
95
|
+
syncSharedAxes(): Promise<void>;
|
|
59
96
|
#private;
|
|
60
97
|
}
|
|
61
98
|
import AxisView from "../axisView.js";
|
|
62
99
|
import Rectangle from "../layout/rectangle.js";
|
|
63
100
|
import ContainerView from "../containerView.js";
|
|
101
|
+
import GridChild from "./gridChild.js";
|
|
64
102
|
//# sourceMappingURL=gridView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gridView.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.js"],"names":[],"mappings":"AA42BA;;GAEG;AACH,+EAUC;AAED;;;;;GAKG;AACH,4CAJW,OAAO,wBAAwB,EAAE,OAAO,UACxC,OAAO,oBAAoB,EAAE,UAAU,YACvC,QAAQ,aAmBlB;AA/3BD;;;;;;;;;;;;;;;GAeG;AACH;IAoCI;;;;;;;;;OASG;IACH,kBARW,OAAO,oBAAoB,EAAE,aAAa,WAC1C,OAAO,4BAA4B,EAAE,OAAO,gBAC5C,aAAa,kDAEb,MAAM,WACN,MAAM,YACN,OAAO,YAAY,EAAE,WAAW,EAoB1C;IARG,iDAAgB;IAOhB,uBAA0B;IAG9B;;OAEG;IACH,sDAEC;IAED;;;;;;OAMG;IACH,qDAFa,SAAS,CAIrB;IAED;;;;;;;OAOG;IACH,6DAHW,MAAM,GACJ,SAAS,CAQrB;IAED;;;;;OAKG;IACH,0DAQC;IAED;;;;;OAKG;IACH,qBAFW,MAAM,QAShB;IAeD;;OAEG;IACH,mBAFW,8BAAM,QAUhB;IAYD;;OAEG;IACH,+CAEC;IAED,yBAEC;IAED;;OAEG;IACH,sCAKC;IAED;;;;OAIG;IACH,gCAqCC;;CAwkBJ;qBAr0B0D,gBAAgB;sBADrD,wBAAwB;0BAEpB,qBAAqB;sBAIzB,gBAAgB"}
|
|
@@ -34,6 +34,13 @@ import GridChild from "./gridChild.js";
|
|
|
34
34
|
* - And later on, brushing, legend(?)
|
|
35
35
|
*/
|
|
36
36
|
export default class GridView extends ContainerView {
|
|
37
|
+
/**
|
|
38
|
+
* Users guide:
|
|
39
|
+
* - GridView owns GridChild instances and manages decorations and shared axes.
|
|
40
|
+
* - Use ConcatView helpers for dynamic insertion/removal so dataflow and axes
|
|
41
|
+
* lifecycle stays consistent.
|
|
42
|
+
*/
|
|
43
|
+
|
|
37
44
|
/**
|
|
38
45
|
* @typedef {"row" | "column"} Direction
|
|
39
46
|
* @typedef {"horizontal" | "vertical"} ScrollDirection
|
|
@@ -96,9 +103,65 @@ export default class GridView extends ContainerView {
|
|
|
96
103
|
* @param {View} view
|
|
97
104
|
*/
|
|
98
105
|
appendChild(view) {
|
|
106
|
+
this.appendChildView(view);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Appends a child view without initializing dataflow or axes.
|
|
111
|
+
* Intended for ConcatView when building the initial hierarchy.
|
|
112
|
+
*
|
|
113
|
+
* @param {View} view
|
|
114
|
+
* @returns {GridChild}
|
|
115
|
+
*/
|
|
116
|
+
appendChildView(view) {
|
|
117
|
+
return this.insertChildViewAt(view, this.#children.length);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Inserts a child view without initializing dataflow or axes.
|
|
122
|
+
* Callers should create axes, initialize subtree data, and request layout.
|
|
123
|
+
*
|
|
124
|
+
* @param {View} view
|
|
125
|
+
* @param {number} index
|
|
126
|
+
* @returns {GridChild}
|
|
127
|
+
*/
|
|
128
|
+
insertChildViewAt(view, index) {
|
|
99
129
|
view.layoutParent ??= this;
|
|
100
|
-
|
|
130
|
+
const gridChild = new GridChild(view, this, this.#childSerial);
|
|
101
131
|
this.#childSerial++;
|
|
132
|
+
this.#children.splice(index, 0, gridChild);
|
|
133
|
+
return gridChild;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Removes a child by instance and disposes its subtree.
|
|
138
|
+
* Callers should sync shared axes and request layout.
|
|
139
|
+
*
|
|
140
|
+
* @param {View} view
|
|
141
|
+
*/
|
|
142
|
+
removeChildView(view) {
|
|
143
|
+
const index = this.#children.findIndex(
|
|
144
|
+
(gridChild) => gridChild.view === view
|
|
145
|
+
);
|
|
146
|
+
if (index < 0) {
|
|
147
|
+
throw new Error("Not my child view!");
|
|
148
|
+
}
|
|
149
|
+
this.removeChildAt(index);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Removes a child by index and disposes its subtree.
|
|
154
|
+
* Callers should sync shared axes and request layout.
|
|
155
|
+
*
|
|
156
|
+
* @param {number} index
|
|
157
|
+
*/
|
|
158
|
+
removeChildAt(index) {
|
|
159
|
+
const gridChild = this.#children[index];
|
|
160
|
+
if (!gridChild) {
|
|
161
|
+
throw new Error("Child index out of range!");
|
|
162
|
+
}
|
|
163
|
+
this.#disposeGridChild(gridChild);
|
|
164
|
+
this.#children.splice(index, 1);
|
|
102
165
|
}
|
|
103
166
|
|
|
104
167
|
get #visibleChildren() {
|
|
@@ -127,30 +190,11 @@ export default class GridView extends ContainerView {
|
|
|
127
190
|
}
|
|
128
191
|
}
|
|
129
192
|
|
|
130
|
-
/**
|
|
131
|
-
* @param {View} child
|
|
132
|
-
* @param {View} replacement
|
|
133
|
-
*/
|
|
134
|
-
replaceChild(child, replacement) {
|
|
135
|
-
const i = this.#children.findIndex(
|
|
136
|
-
(gridChild) => gridChild.view == child
|
|
137
|
-
);
|
|
138
|
-
if (i >= 0) {
|
|
139
|
-
this.#disposeGridChild(this.#children[i]);
|
|
140
|
-
this.#children[i] = new GridChild(
|
|
141
|
-
replacement,
|
|
142
|
-
this,
|
|
143
|
-
this.#childSerial
|
|
144
|
-
);
|
|
145
|
-
} else {
|
|
146
|
-
throw new Error("Not my child view!");
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
193
|
/**
|
|
151
194
|
* @param {GridChild} gridChild
|
|
152
195
|
*/
|
|
153
196
|
#disposeGridChild(gridChild) {
|
|
197
|
+
gridChild.disposeAxisViews();
|
|
154
198
|
for (const view of gridChild.getChildren()) {
|
|
155
199
|
view.disposeSubtree();
|
|
156
200
|
}
|
|
@@ -171,40 +215,54 @@ export default class GridView extends ContainerView {
|
|
|
171
215
|
* @protected
|
|
172
216
|
*/
|
|
173
217
|
async createAxes() {
|
|
218
|
+
await this.syncSharedAxes();
|
|
219
|
+
await Promise.all(
|
|
220
|
+
this.#children.map((gridChild) => gridChild.createAxes())
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Recreates shared axes based on current axis resolutions.
|
|
226
|
+
*
|
|
227
|
+
* This is used after dynamic child insert/remove to keep shared axes in sync.
|
|
228
|
+
*/
|
|
229
|
+
async syncSharedAxes() {
|
|
230
|
+
for (const axisView of Object.values(this.#sharedAxes)) {
|
|
231
|
+
axisView.disposeSubtree();
|
|
232
|
+
}
|
|
233
|
+
this.#sharedAxes = {};
|
|
234
|
+
|
|
174
235
|
/** @type {Promise<void>[]} */
|
|
175
236
|
const promises = [];
|
|
176
237
|
|
|
177
|
-
// Axis ticks, labels, etc. They should be created only if this view has caught
|
|
178
|
-
// the scale resolution for the channel.
|
|
179
238
|
for (const channel of primaryPositionalChannels) {
|
|
180
239
|
const r = this.resolutions.axis[channel];
|
|
181
|
-
if (r) {
|
|
182
|
-
|
|
183
|
-
if (props) {
|
|
184
|
-
const propsWithDefaults = {
|
|
185
|
-
title: r.getTitle(),
|
|
186
|
-
orient: CHANNEL_ORIENTS[channel][0],
|
|
187
|
-
...props,
|
|
188
|
-
};
|
|
189
|
-
// TODO: Validate that channel and orient are compatible
|
|
190
|
-
const v = new AxisView(
|
|
191
|
-
propsWithDefaults,
|
|
192
|
-
r.scaleResolution.type,
|
|
193
|
-
this.context,
|
|
194
|
-
this,
|
|
195
|
-
this
|
|
196
|
-
);
|
|
197
|
-
promises.push(v.initializeChildren());
|
|
198
|
-
this.#sharedAxes[channel] = v;
|
|
199
|
-
}
|
|
240
|
+
if (!r) {
|
|
241
|
+
continue;
|
|
200
242
|
}
|
|
243
|
+
|
|
244
|
+
const props = r.getAxisProps();
|
|
245
|
+
if (!props) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const propsWithDefaults = {
|
|
250
|
+
title: r.getTitle(),
|
|
251
|
+
orient: CHANNEL_ORIENTS[channel][0],
|
|
252
|
+
...props,
|
|
253
|
+
};
|
|
254
|
+
const axisView = new AxisView(
|
|
255
|
+
propsWithDefaults,
|
|
256
|
+
r.scaleResolution.type,
|
|
257
|
+
this.context,
|
|
258
|
+
this,
|
|
259
|
+
this
|
|
260
|
+
);
|
|
261
|
+
promises.push(axisView.initializeChildren());
|
|
262
|
+
this.#sharedAxes[channel] = axisView;
|
|
201
263
|
}
|
|
202
264
|
|
|
203
|
-
|
|
204
|
-
return Promise.all([
|
|
205
|
-
...promises,
|
|
206
|
-
...this.#children.map((gridChild) => gridChild.createAxes()),
|
|
207
|
-
]);
|
|
265
|
+
await Promise.all(promises);
|
|
208
266
|
}
|
|
209
267
|
|
|
210
268
|
/**
|
|
@@ -797,7 +855,7 @@ export default class GridView extends ContainerView {
|
|
|
797
855
|
* @returns
|
|
798
856
|
*/
|
|
799
857
|
function getZoomableResolutions(view) {
|
|
800
|
-
/** @type {Record<import("../../spec/channel.js").PrimaryPositionalChannel, Set<import("
|
|
858
|
+
/** @type {Record<import("../../spec/channel.js").PrimaryPositionalChannel, Set<import("../../scales/scaleResolution.js").default>>} */
|
|
801
859
|
const resolutions = {
|
|
802
860
|
x: new Set(),
|
|
803
861
|
y: new Set(),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gridView.test.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/gridView.test.js"],"names":[],"mappings":""}
|
|
@@ -1,31 +1,62 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* This class represents a scrollbar thumb that can be used within a grid view
|
|
3
|
+
* to provide scrolling functionality for overflowing content.
|
|
4
|
+
*
|
|
2
5
|
* @typedef {"horizontal" | "vertical"} ScrollDirection
|
|
3
6
|
*/
|
|
4
7
|
export default class Scrollbar extends UnitView {
|
|
5
8
|
/**
|
|
6
9
|
* @param {import("./gridChild.js").default} gridChild
|
|
7
10
|
* @param {ScrollDirection} scrollDirection
|
|
11
|
+
* @param {{ onViewportOffsetChange?: (offset: number) => void }} [options]
|
|
12
|
+
*/
|
|
13
|
+
constructor(gridChild: import("./gridChild.js").default, scrollDirection: ScrollDirection, options?: {
|
|
14
|
+
onViewportOffsetChange?: (offset: number) => void;
|
|
15
|
+
});
|
|
16
|
+
/**
|
|
17
|
+
* The actual state of the scrollbar.
|
|
18
|
+
*
|
|
19
|
+
* It's better to keep track of the viewport offset rather than the
|
|
20
|
+
* scrollbar offset because the former is more stable when the
|
|
21
|
+
* viewport size changes.
|
|
8
22
|
*/
|
|
9
|
-
constructor(gridChild: import("./gridChild.js").default, scrollDirection: ScrollDirection);
|
|
10
23
|
viewportOffset: number;
|
|
11
24
|
config: {
|
|
12
25
|
scrollbarSize: number;
|
|
13
26
|
scrollbarPadding: number;
|
|
14
|
-
|
|
15
|
-
interpolateViewportOffset: ((target: {
|
|
16
|
-
x: number;
|
|
17
|
-
}) => void) & {
|
|
18
|
-
stop: () => void;
|
|
27
|
+
scrollbarMinLength: number;
|
|
19
28
|
};
|
|
20
29
|
get scrollOffset(): number;
|
|
21
30
|
/**
|
|
31
|
+
* @param {number} value
|
|
32
|
+
* @param {{ notify?: boolean, syncSmoother?: boolean }} [options]
|
|
33
|
+
*/
|
|
34
|
+
setViewportOffset(value: number, { notify, syncSmoother }?: {
|
|
35
|
+
notify?: boolean;
|
|
36
|
+
syncSmoother?: boolean;
|
|
37
|
+
}): void;
|
|
38
|
+
/**
|
|
39
|
+
* Updates the scrollbar with the latest viewport and content rectangles.
|
|
40
|
+
*
|
|
41
|
+
* Viewport coords are flattened to stay stable between layout passes, while
|
|
42
|
+
* content coords may be dynamic (e.g., peek transitions) and are evaluated
|
|
43
|
+
* on demand via accessors.
|
|
22
44
|
*
|
|
23
45
|
* @param {Rectangle} viewportCoords
|
|
24
|
-
* @param {Rectangle}
|
|
46
|
+
* @param {Rectangle} contentCoords
|
|
25
47
|
*/
|
|
26
|
-
updateScrollbar(viewportCoords: Rectangle,
|
|
48
|
+
updateScrollbar(viewportCoords: Rectangle, contentCoords: Rectangle): void;
|
|
49
|
+
interpolateViewportOffset: ((target: {
|
|
50
|
+
x: number;
|
|
51
|
+
}) => void) & {
|
|
52
|
+
stop: () => void;
|
|
53
|
+
};
|
|
27
54
|
#private;
|
|
28
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* This class represents a scrollbar thumb that can be used within a grid view
|
|
58
|
+
* to provide scrolling functionality for overflowing content.
|
|
59
|
+
*/
|
|
29
60
|
export type ScrollDirection = "horizontal" | "vertical";
|
|
30
61
|
import UnitView from "../unitView.js";
|
|
31
62
|
import Rectangle from "../layout/rectangle.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrollbar.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/scrollbar.js"],"names":[],"mappings":"AAKA
|
|
1
|
+
{"version":3,"file":"scrollbar.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/scrollbar.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH;IAwBI;;;;OAIG;IACH,uBAJW,OAAO,gBAAgB,EAAE,OAAO,mBAChC,eAAe,YACf;QAAE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,EAwH/D;IAvID;;;;;;OAMG;IACH,uBAAmB;IAiDf;;;;MAAoB;IAiFxB,2BAEC;IAED;;;OAGG;IACH,yBAHW,MAAM,6BACN;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,QAYtD;IAqFD;;;;;;;;;OASG;IACH,gCAHW,SAAS,iBACT,SAAS,QASnB;IAMG;;;;MAWC;;CAER;;;;;8BAlSY,YAAY,GAAG,UAAU;qBANjB,gBAAgB;sBADf,wBAAwB"}
|