@genome-spy/core 0.48.2 → 0.49.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.
- package/dist/bundle/index.es.js +7226 -6923
- package/dist/bundle/index.js +121 -108
- package/dist/schema.json +838 -344
- package/dist/src/data/collector.test.d.ts +2 -0
- package/dist/src/data/collector.test.d.ts.map +1 -0
- package/dist/src/data/dataFlow.test.d.ts +2 -0
- package/dist/src/data/dataFlow.test.d.ts.map +1 -0
- package/dist/src/data/flow.test.d.ts +2 -0
- package/dist/src/data/flow.test.d.ts.map +1 -0
- package/dist/src/data/flow.test.js +19 -14
- package/dist/src/data/flowNode.test.d.ts +2 -0
- package/dist/src/data/flowNode.test.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.test.d.ts +2 -0
- package/dist/src/data/flowOptimizer.test.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.test.js +9 -10
- package/dist/src/data/formats/fasta.test.d.ts +2 -0
- package/dist/src/data/formats/fasta.test.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.test.d.ts +2 -0
- package/dist/src/data/sources/inlineSource.test.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.test.js +23 -16
- package/dist/src/data/sources/sequenceSource.test.d.ts +2 -0
- package/dist/src/data/sources/sequenceSource.test.d.ts.map +1 -0
- package/dist/src/data/sources/sequenceSource.test.js +59 -42
- package/dist/src/data/transforms/clone.test.d.ts +2 -0
- package/dist/src/data/transforms/clone.test.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.test.d.ts +2 -0
- package/dist/src/data/transforms/coverage.test.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.test.js +1 -1
- package/dist/src/data/transforms/filter.d.ts +10 -0
- package/dist/src/data/transforms/filter.d.ts.map +1 -1
- package/dist/src/data/transforms/filter.js +30 -1
- package/dist/src/data/transforms/filter.test.d.ts +2 -0
- package/dist/src/data/transforms/filter.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.test.d.ts +2 -0
- package/dist/src/data/transforms/flatten.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.test.js +10 -7
- package/dist/src/data/transforms/flattenDelimited.test.d.ts +2 -0
- package/dist/src/data/transforms/flattenDelimited.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenDelimited.test.js +16 -13
- package/dist/src/data/transforms/flattenSequence.test.d.ts +2 -0
- package/dist/src/data/transforms/flattenSequence.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenSequence.test.js +1 -1
- package/dist/src/data/transforms/formula.test.d.ts +2 -0
- package/dist/src/data/transforms/formula.test.d.ts.map +1 -0
- package/dist/src/data/transforms/formula.test.js +1 -1
- package/dist/src/data/transforms/identifier.test.d.ts +2 -0
- package/dist/src/data/transforms/identifier.test.d.ts.map +1 -0
- package/dist/src/data/transforms/pileup.test.d.ts +2 -0
- package/dist/src/data/transforms/pileup.test.d.ts.map +1 -0
- package/dist/src/data/transforms/project.test.d.ts +2 -0
- package/dist/src/data/transforms/project.test.d.ts.map +1 -0
- package/dist/src/data/transforms/project.test.js +1 -1
- package/dist/src/data/transforms/regexExtract.test.d.ts +2 -0
- package/dist/src/data/transforms/regexExtract.test.d.ts.map +1 -0
- package/dist/src/data/transforms/regexExtract.test.js +6 -3
- package/dist/src/data/transforms/regexFold.test.d.ts +2 -0
- package/dist/src/data/transforms/regexFold.test.d.ts.map +1 -0
- package/dist/src/data/transforms/sample.test.d.ts +2 -0
- package/dist/src/data/transforms/sample.test.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.test.d.ts +2 -0
- package/dist/src/data/transforms/stack.test.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.test.js +8 -8
- package/dist/src/encoder/accessor.d.ts +17 -14
- package/dist/src/encoder/accessor.d.ts.map +1 -1
- package/dist/src/encoder/accessor.js +127 -56
- package/dist/src/encoder/accessor.test.d.ts +2 -0
- package/dist/src/encoder/accessor.test.d.ts.map +1 -0
- package/dist/src/encoder/accessor.test.js +145 -31
- package/dist/src/encoder/encoder.d.ts +26 -13
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +98 -114
- package/dist/src/encoder/encoder.test.d.ts +2 -0
- package/dist/src/encoder/encoder.test.d.ts.map +1 -0
- package/dist/src/encoder/encoder.test.js +85 -82
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -1
- package/dist/src/fonts/bmFontManager.js +10 -4
- package/dist/src/genome/genome.test.d.ts +2 -0
- package/dist/src/genome/genome.test.d.ts.map +1 -0
- package/dist/src/genome/scaleIndex.test.d.ts +2 -0
- package/dist/src/genome/scaleIndex.test.d.ts.map +1 -0
- package/dist/src/genome/scaleLocus.test.d.ts +2 -0
- package/dist/src/genome/scaleLocus.test.d.ts.map +1 -0
- package/dist/src/genomeSpy.d.ts +3 -2
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +15 -6
- package/dist/src/gl/dataToVertices.d.ts +6 -8
- package/dist/src/gl/dataToVertices.d.ts.map +1 -1
- package/dist/src/gl/dataToVertices.js +42 -33
- package/dist/src/gl/glslScaleGenerator.d.ts +84 -15
- package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
- package/dist/src/gl/glslScaleGenerator.js +260 -73
- package/dist/src/marks/link.common.glsl.js +1 -1
- package/dist/src/marks/link.d.ts.map +1 -1
- package/dist/src/marks/link.js +10 -0
- package/dist/src/marks/link.vertex.glsl.js +1 -1
- package/dist/src/marks/mark.d.ts +6 -9
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +212 -95
- package/dist/src/marks/point.d.ts.map +1 -1
- package/dist/src/marks/point.js +5 -1
- package/dist/src/marks/rect.d.ts.map +1 -1
- package/dist/src/marks/rect.js +9 -4
- package/dist/src/marks/rule.d.ts.map +1 -1
- package/dist/src/marks/rule.js +4 -0
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.js +5 -1
- package/dist/src/scale/scale.test.d.ts +2 -0
- package/dist/src/scale/scale.test.d.ts.map +1 -0
- package/dist/src/scale/scale.test.js +2 -0
- package/dist/src/scale/ticks.test.d.ts +2 -0
- package/dist/src/scale/ticks.test.d.ts.map +1 -0
- package/dist/src/scale/ticks.test.js +6 -0
- package/dist/src/selection/selection.d.ts +39 -0
- package/dist/src/selection/selection.d.ts.map +1 -0
- package/dist/src/selection/selection.js +78 -0
- package/dist/src/spec/channel.d.ts +137 -83
- package/dist/src/spec/mark.d.ts +9 -0
- package/dist/src/spec/parameter.d.ts +112 -3
- package/dist/src/spec/root.d.ts +0 -1
- package/dist/src/spec/transform.d.ts +19 -1
- package/dist/src/spec/view.d.ts +3 -3
- package/dist/src/tooltip/dataTooltipHandler.js +1 -1
- package/dist/src/types/encoder.d.ts +80 -26
- package/dist/src/types/rendering.d.ts +1 -0
- package/dist/src/types/selectionTypes.d.ts +44 -0
- package/dist/src/types/viewContext.d.ts +1 -4
- package/dist/src/utils/addBaseUrl.test.d.ts +2 -0
- package/dist/src/utils/addBaseUrl.test.d.ts.map +1 -0
- package/dist/src/utils/binnedIndex.test.d.ts +2 -0
- package/dist/src/utils/binnedIndex.test.d.ts.map +1 -0
- package/dist/src/utils/cloner.test.d.ts +2 -0
- package/dist/src/utils/cloner.test.d.ts.map +1 -0
- package/dist/src/utils/coalesce.test.d.ts +2 -0
- package/dist/src/utils/coalesce.test.d.ts.map +1 -0
- package/dist/src/utils/concatIterables.test.d.ts +2 -0
- package/dist/src/utils/concatIterables.test.d.ts.map +1 -0
- package/dist/src/utils/domainArray.test.d.ts +2 -0
- package/dist/src/utils/domainArray.test.d.ts.map +1 -0
- package/dist/src/utils/expression.d.ts +2 -2
- package/dist/src/utils/expression.d.ts.map +1 -1
- package/dist/src/utils/expression.js +11 -2
- package/dist/src/utils/indexer.test.d.ts +2 -0
- package/dist/src/utils/indexer.test.d.ts.map +1 -0
- package/dist/src/utils/inputBinding.d.ts.map +1 -1
- package/dist/src/utils/inputBinding.js +4 -0
- package/dist/src/utils/iterateNestedMaps.test.d.ts +2 -0
- package/dist/src/utils/iterateNestedMaps.test.d.ts.map +1 -0
- package/dist/src/utils/kWayMerge.test.d.ts +2 -0
- package/dist/src/utils/kWayMerge.test.d.ts.map +1 -0
- package/dist/src/utils/mergeObjects.test.d.ts +2 -0
- package/dist/src/utils/mergeObjects.test.d.ts.map +1 -0
- package/dist/src/utils/numberExtractor.test.d.ts +2 -0
- package/dist/src/utils/numberExtractor.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCacher.test.d.ts +2 -0
- package/dist/src/utils/propertyCacher.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.test.d.ts +2 -0
- package/dist/src/utils/propertyCoalescer.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.test.js +3 -0
- package/dist/src/utils/radixSort.test.d.ts +2 -0
- package/dist/src/utils/radixSort.test.d.ts.map +1 -0
- package/dist/src/utils/reservationMap.test.d.ts +2 -0
- package/dist/src/utils/reservationMap.test.d.ts.map +1 -0
- package/dist/src/utils/ringBuffer.test.d.ts +2 -0
- package/dist/src/utils/ringBuffer.test.d.ts.map +1 -0
- package/dist/src/utils/topK.test.d.ts +2 -0
- package/dist/src/utils/topK.test.d.ts.map +1 -0
- package/dist/src/utils/trees.test.d.ts +2 -0
- package/dist/src/utils/trees.test.d.ts.map +1 -0
- package/dist/src/utils/trees.test.js +8 -3
- package/dist/src/utils/variableTools.test.d.ts +2 -0
- package/dist/src/utils/variableTools.test.d.ts.map +1 -0
- package/dist/src/view/axisResolution.d.ts +19 -6
- package/dist/src/view/axisResolution.d.ts.map +1 -1
- package/dist/src/view/axisResolution.js +16 -7
- package/dist/src/view/axisResolution.test.d.ts +2 -0
- package/dist/src/view/axisResolution.test.d.ts.map +1 -0
- package/dist/src/view/axisResolution.test.js +16 -11
- package/dist/src/view/facetView.d.ts +1 -1
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.d.ts +1 -1
- package/dist/src/view/flowBuilder.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.js +34 -5
- package/dist/src/view/flowBuilder.test.d.ts +2 -0
- package/dist/src/view/flowBuilder.test.d.ts.map +1 -0
- package/dist/src/view/gridView.d.ts +0 -6
- package/dist/src/view/gridView.d.ts.map +1 -1
- package/dist/src/view/layerView.d.ts +0 -6
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layout/flexLayout.test.d.ts +2 -0
- package/dist/src/view/layout/flexLayout.test.d.ts.map +1 -0
- package/dist/src/view/layout/grid.test.d.ts +2 -0
- package/dist/src/view/layout/grid.test.d.ts.map +1 -0
- package/dist/src/view/layout/rectangle.test.d.ts +2 -0
- package/dist/src/view/layout/rectangle.test.d.ts.map +1 -0
- package/dist/src/view/paramMediator.d.ts +32 -5
- package/dist/src/view/paramMediator.d.ts.map +1 -1
- package/dist/src/view/paramMediator.js +97 -9
- package/dist/src/view/paramMediator.test.d.ts +2 -0
- package/dist/src/view/paramMediator.test.d.ts.map +1 -0
- package/dist/src/view/paramMediator.test.js +17 -1
- package/dist/src/view/scaleResolution.d.ts +17 -9
- package/dist/src/view/scaleResolution.d.ts.map +1 -1
- package/dist/src/view/scaleResolution.js +51 -34
- package/dist/src/view/scaleResolution.test.d.ts +2 -0
- package/dist/src/view/scaleResolution.test.d.ts.map +1 -0
- package/dist/src/view/scaleResolution.test.js +2 -0
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +15 -3
- package/dist/src/view/unitView.d.ts +5 -15
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +81 -101
- package/dist/src/view/view.d.ts +1 -1
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.test.d.ts +2 -0
- package/dist/src/view/view.test.d.ts.map +1 -0
- package/dist/src/view/view.test.js +73 -55
- package/dist/src/view/viewFactory.test.d.ts +2 -0
- package/dist/src/view/viewFactory.test.d.ts.map +1 -0
- package/dist/src/view/viewFactory.test.js +2 -2
- package/dist/src/view/zoom.js +2 -2
- package/package.json +5 -2
|
@@ -17,8 +17,12 @@ export const LOCUS: "locus";
|
|
|
17
17
|
export const INDEX: "index";
|
|
18
18
|
/**
|
|
19
19
|
* @template {ChannelWithScale}[T=ChannelWithScale]
|
|
20
|
-
* @typedef {{view: import("./unitView.js").default, channel: T}} ResolutionMember
|
|
21
20
|
*
|
|
21
|
+
* @typedef {object} ScaleResolutionMember
|
|
22
|
+
* @prop {import("./unitView.js").default} view TODO: Get rid of the view reference
|
|
23
|
+
* @prop {T} channel
|
|
24
|
+
* @prop {import("../spec/channel.js").ChannelDefWithScale} channelDef
|
|
25
|
+
* @prop {(channel: ChannelWithScale, type: import("../spec/channel.js").Type) => DomainArray} dataDomainSource
|
|
22
26
|
*/
|
|
23
27
|
/**
|
|
24
28
|
* Resolution takes care of merging domains and scales from multiple views.
|
|
@@ -34,10 +38,10 @@ export default class ScaleResolution implements ScaleResolutionApi {
|
|
|
34
38
|
*/
|
|
35
39
|
constructor(channel: import("../spec/channel.js").Channel);
|
|
36
40
|
channel: import("../spec/channel.js").Channel;
|
|
37
|
-
/** @type {
|
|
38
|
-
members:
|
|
39
|
-
/** @type {
|
|
40
|
-
type:
|
|
41
|
+
/** @type {ScaleResolutionMember[]} The involved views */
|
|
42
|
+
members: ScaleResolutionMember[];
|
|
43
|
+
/** @type {import("../spec/channel.js").Type} Data type (quantitative, nominal, etc...) */
|
|
44
|
+
type: import("../spec/channel.js").Type;
|
|
41
45
|
/** @type {string} An optional unique identifier for the scale */
|
|
42
46
|
name: string;
|
|
43
47
|
/**
|
|
@@ -58,10 +62,9 @@ export default class ScaleResolution implements ScaleResolutionApi {
|
|
|
58
62
|
* Add a view to this resolution.
|
|
59
63
|
* N.B. This is expected to be called in depth-first order
|
|
60
64
|
*
|
|
61
|
-
* @param {
|
|
62
|
-
* @param {ChannelWithScale} channel
|
|
65
|
+
* @param {ScaleResolutionMember} newMember
|
|
63
66
|
*/
|
|
64
|
-
pushUnitView(
|
|
67
|
+
pushUnitView(newMember: ScaleResolutionMember): void;
|
|
65
68
|
/**
|
|
66
69
|
* Unions the configured domains of all participating views.
|
|
67
70
|
*
|
|
@@ -157,8 +160,13 @@ export default class ScaleResolution implements ScaleResolutionApi {
|
|
|
157
160
|
fromComplexInterval(interval: import("../spec/scale.js").ScalarDomain | import("../spec/scale.js").ComplexDomain): number[];
|
|
158
161
|
#private;
|
|
159
162
|
}
|
|
160
|
-
export type
|
|
163
|
+
export type ScaleResolutionMember<T extends import("../spec/channel.js").ChannelWithScale = import("../spec/channel.js").ChannelWithScale> = {
|
|
164
|
+
/**
|
|
165
|
+
* TODO: Get rid of the view reference
|
|
166
|
+
*/
|
|
161
167
|
view: import("./unitView.js").default;
|
|
162
168
|
channel: T;
|
|
169
|
+
channelDef: import("../spec/channel.js").ChannelDefWithScale;
|
|
170
|
+
dataDomainSource: (channel: import("../spec/channel.js").ChannelWithScale, type: import("../spec/channel.js").Type) => import("../utils/domainArray.js").DomainArray;
|
|
163
171
|
};
|
|
164
172
|
//# sourceMappingURL=scaleResolution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaleResolution.d.ts","sourceRoot":"","sources":["../../../src/view/scaleResolution.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scaleResolution.d.ts","sourceRoot":"","sources":["../../../src/view/scaleResolution.js"],"names":[],"mappings":"AA+7BA;;;;;;;;;;GAUG;AACH,6CAFW,OAAO,WAAW,EAAE,OAAO,GAAG,OAAO,WAAW,EAAE,OAAO,EAAE,QA4BrE;AAv7BD,0CAA2C;AAC3C,gCAAiC;AACjC,gCAAiC;AACjC,4BAA6B;AAC7B,4BAA6B;AAE7B;;;;;;;;GAQG;AACH;;;;;;;GAOG;AACH;IAyCI;;OAEG;IACH,2DASC;IARG,8CAAsB;IACtB,yDAAyD;IACzD,SADW,qBAAqB,EAAE,CACjB;IACjB,0FAA0F;IAC1F,MADW,OAAO,oBAAoB,EAAE,IAAI,CAC5B;IAEhB,iEAAiE;IACjE,MADW,MAAM,CACI;IAWzB;;;;;;;OAOG;IACH,4KAEC;IAED;;;OAGG;IACH,+KAEC;IAcD;;;;;OAKG;IACH,wBAFW,qBAAqB,QA4B/B;IAuLD;;;;OAIG;IACH,qEAgBC;IAED;;;;OAIG;IACH,+DAMC;IAED;;OAEG;IACH,oBAyCC;IAED;;OAEG;IACH;eA3XkC,OAAO,kBAAkB,EAAE,KAAK;MAuajE;IAED,mBAEC;IAED;;OAEG;IACH,oBAFa,mFAA6B,CAOzC;IAED;;;;OAIG;IACH,oBAKC;IAED;;OAEG;IACH,sBAGC;IAUD;;;;;;;OAOG;IACH,kBALW,MAAM,eACN,MAAM,OACN,MAAM,GACJ,OAAO,CAwEnB;IAED;;;;;;OAMG;IACH,eAJW,mFAA6B,aAC7B,OAAO,GAAG,MAAM,iBAgD1B;IAED;;;;OAIG;IACH,qBAcC;IAED;;;;;OAKG;IACH,uBAOC;IA8DD;;;OAGG;IACH,aAFa,OAAO,qBAAqB,EAAE,OAAO,CAajD;IAID;;;;;OAKG;IACH,uBAFW,MAAM,yDAUhB;IAED;;OAEG;IACH,iBAFW,MAAM,yDAKhB;IAED;;;OAGG;IACH,6EAFa,MAAM,CAQlB;IAED;;;OAGG;IACH,mHAFa,MAAM,EAAE,CAOpB;;CA2BJ;;;;;UAjzBS,OAAO,eAAe,EAAE,OAAO;aAC/B,CAAC;gBACD,OAAO,oBAAoB,EAAE,mBAAmB;qFACd,OAAO,oBAAoB,EAAE,IAAI"}
|
|
@@ -21,7 +21,6 @@ import mergeObjects from "../utils/mergeObjects.js";
|
|
|
21
21
|
import createScale, { configureScale } from "../scale/scale.js";
|
|
22
22
|
|
|
23
23
|
import {
|
|
24
|
-
getChannelDefWithScale,
|
|
25
24
|
isColorChannel,
|
|
26
25
|
isDiscreteChannel,
|
|
27
26
|
isPositionalChannel,
|
|
@@ -32,7 +31,7 @@ import {
|
|
|
32
31
|
isChromosomalLocus,
|
|
33
32
|
isChromosomalLocusInterval,
|
|
34
33
|
} from "../genome/genome.js";
|
|
35
|
-
import { NominalDomain } from "../utils/domainArray.js";
|
|
34
|
+
import createDomain, { NominalDomain } from "../utils/domainArray.js";
|
|
36
35
|
import { easeCubicInOut } from "d3-ease";
|
|
37
36
|
import { asArray, shallowArrayEquals } from "../utils/arrayUtils.js";
|
|
38
37
|
import eerp from "../utils/eerp.js";
|
|
@@ -52,8 +51,12 @@ export const INDEX = "index";
|
|
|
52
51
|
|
|
53
52
|
/**
|
|
54
53
|
* @template {ChannelWithScale}[T=ChannelWithScale]
|
|
55
|
-
* @typedef {{view: import("./unitView.js").default, channel: T}} ResolutionMember
|
|
56
54
|
*
|
|
55
|
+
* @typedef {object} ScaleResolutionMember
|
|
56
|
+
* @prop {import("./unitView.js").default} view TODO: Get rid of the view reference
|
|
57
|
+
* @prop {T} channel
|
|
58
|
+
* @prop {import("../spec/channel.js").ChannelDefWithScale} channelDef
|
|
59
|
+
* @prop {(channel: ChannelWithScale, type: import("../spec/channel.js").Type) => DomainArray} dataDomainSource
|
|
57
60
|
*/
|
|
58
61
|
/**
|
|
59
62
|
* Resolution takes care of merging domains and scales from multiple views.
|
|
@@ -109,9 +112,9 @@ export default class ScaleResolution {
|
|
|
109
112
|
*/
|
|
110
113
|
constructor(channel) {
|
|
111
114
|
this.channel = channel;
|
|
112
|
-
/** @type {
|
|
115
|
+
/** @type {ScaleResolutionMember[]} The involved views */
|
|
113
116
|
this.members = [];
|
|
114
|
-
/** @type {
|
|
117
|
+
/** @type {import("../spec/channel.js").Type} Data type (quantitative, nominal, etc...) */
|
|
115
118
|
this.type = null;
|
|
116
119
|
|
|
117
120
|
/** @type {string} An optional unique identifier for the scale */
|
|
@@ -162,11 +165,10 @@ export default class ScaleResolution {
|
|
|
162
165
|
* Add a view to this resolution.
|
|
163
166
|
* N.B. This is expected to be called in depth-first order
|
|
164
167
|
*
|
|
165
|
-
* @param {
|
|
166
|
-
* @param {ChannelWithScale} channel
|
|
168
|
+
* @param {ScaleResolutionMember} newMember
|
|
167
169
|
*/
|
|
168
|
-
pushUnitView(
|
|
169
|
-
const channelDef =
|
|
170
|
+
pushUnitView(newMember) {
|
|
171
|
+
const { channel, channelDef } = newMember;
|
|
170
172
|
const type = channelDef.type;
|
|
171
173
|
const name = channelDef?.scale?.name;
|
|
172
174
|
|
|
@@ -190,7 +192,7 @@ export default class ScaleResolution {
|
|
|
190
192
|
// TODO: Use the same merging logic as in: https://github.com/vega/vega-lite/blob/master/src/scale.ts
|
|
191
193
|
}
|
|
192
194
|
|
|
193
|
-
this.members.push(
|
|
195
|
+
this.members.push(newMember);
|
|
194
196
|
}
|
|
195
197
|
|
|
196
198
|
/**
|
|
@@ -227,10 +229,7 @@ export default class ScaleResolution {
|
|
|
227
229
|
*/
|
|
228
230
|
#getMergedScaleProps() {
|
|
229
231
|
const propArray = this.members
|
|
230
|
-
.map(
|
|
231
|
-
(member) =>
|
|
232
|
-
getChannelDefWithScale(member.view, member.channel).scale
|
|
233
|
-
)
|
|
232
|
+
.map((member) => member.channelDef.scale)
|
|
234
233
|
.filter((props) => props !== undefined);
|
|
235
234
|
|
|
236
235
|
// TODO: Disabled scale: https://vega.github.io/vega-lite/docs/scale.html#disable
|
|
@@ -241,9 +240,10 @@ export default class ScaleResolution {
|
|
|
241
240
|
* Returns the merged scale properties supplemented with inferred properties
|
|
242
241
|
* and domain.
|
|
243
242
|
*
|
|
243
|
+
* @param {boolean} [extractDataDomain]
|
|
244
244
|
* @returns {import("../spec/scale.js").Scale}
|
|
245
245
|
*/
|
|
246
|
-
#getScaleProps() {
|
|
246
|
+
#getScaleProps(extractDataDomain = false) {
|
|
247
247
|
const mergedProps = this.#getMergedScaleProps();
|
|
248
248
|
if (mergedProps === null || mergedProps.type == "null") {
|
|
249
249
|
// No scale (pass-thru)
|
|
@@ -260,7 +260,7 @@ export default class ScaleResolution {
|
|
|
260
260
|
props.type = getDefaultScaleType(this.channel, this.type);
|
|
261
261
|
}
|
|
262
262
|
|
|
263
|
-
const domain = this.#getInitialDomain();
|
|
263
|
+
const domain = this.#getInitialDomain(extractDataDomain);
|
|
264
264
|
|
|
265
265
|
if (domain && domain.length > 0) {
|
|
266
266
|
props.domain = domain;
|
|
@@ -360,13 +360,19 @@ export default class ScaleResolution {
|
|
|
360
360
|
}
|
|
361
361
|
}
|
|
362
362
|
|
|
363
|
-
|
|
363
|
+
/**
|
|
364
|
+
*
|
|
365
|
+
* @param {boolean} extractDataDomain
|
|
366
|
+
*/
|
|
367
|
+
#getInitialDomain(extractDataDomain = false) {
|
|
364
368
|
// TODO: intersect the domain with zoom extent (if it's defined)
|
|
365
369
|
return (
|
|
366
370
|
this.getConfiguredDomain() ??
|
|
367
371
|
(this.type == LOCUS
|
|
368
372
|
? this.getGenome().getExtent()
|
|
369
|
-
:
|
|
373
|
+
: extractDataDomain
|
|
374
|
+
? this.getDataDomain()
|
|
375
|
+
: [])
|
|
370
376
|
);
|
|
371
377
|
}
|
|
372
378
|
|
|
@@ -376,11 +382,21 @@ export default class ScaleResolution {
|
|
|
376
382
|
* @return { DomainArray }
|
|
377
383
|
*/
|
|
378
384
|
getConfiguredDomain() {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
385
|
+
const domains = this.members
|
|
386
|
+
.map((member) => member.channelDef)
|
|
387
|
+
.filter((channelDef) => channelDef.scale?.domain)
|
|
388
|
+
.map((channelDef) =>
|
|
389
|
+
// TODO: Handle ExprRefs and Param in domain
|
|
390
|
+
createDomain(
|
|
391
|
+
channelDef.type,
|
|
392
|
+
// Chrom/pos must be linearized first
|
|
393
|
+
this.fromComplexInterval(channelDef.scale.domain)
|
|
394
|
+
)
|
|
395
|
+
);
|
|
396
|
+
|
|
397
|
+
if (domains.length > 0) {
|
|
398
|
+
return domains.reduce((acc, curr) => acc.extendAll(curr));
|
|
399
|
+
}
|
|
384
400
|
}
|
|
385
401
|
|
|
386
402
|
/**
|
|
@@ -392,9 +408,7 @@ export default class ScaleResolution {
|
|
|
392
408
|
// TODO: Optimize: extract domain only once if the views share the data.
|
|
393
409
|
// In fact, this should be a responsibility of collectors.
|
|
394
410
|
return this.#reduceDomains((member) =>
|
|
395
|
-
|
|
396
|
-
? undefined
|
|
397
|
-
: member.view.extractDataDomain(member.channel)
|
|
411
|
+
member.dataDomainSource(member.channel, this.type)
|
|
398
412
|
);
|
|
399
413
|
}
|
|
400
414
|
|
|
@@ -411,7 +425,7 @@ export default class ScaleResolution {
|
|
|
411
425
|
const domainWasInitialized = this.#isDomainInitialized();
|
|
412
426
|
const previousDomain = scale.domain();
|
|
413
427
|
|
|
414
|
-
const props = this.#getScaleProps();
|
|
428
|
+
const props = this.#getScaleProps(true);
|
|
415
429
|
configureScale({ ...props, range: undefined }, scale);
|
|
416
430
|
|
|
417
431
|
// Annotate the scale with the new props
|
|
@@ -458,6 +472,11 @@ export default class ScaleResolution {
|
|
|
458
472
|
// Annotate the scale with props
|
|
459
473
|
scale.props = props;
|
|
460
474
|
|
|
475
|
+
if ("unknown" in scale) {
|
|
476
|
+
// Never allow implicit domain construction
|
|
477
|
+
scale.unknown(null);
|
|
478
|
+
}
|
|
479
|
+
|
|
461
480
|
this.#scale = scale;
|
|
462
481
|
this.#configureRange();
|
|
463
482
|
|
|
@@ -630,7 +649,7 @@ export default class ScaleResolution {
|
|
|
630
649
|
|
|
631
650
|
// TODO: Intersect the domain with zoom extent
|
|
632
651
|
|
|
633
|
-
const animator = this.
|
|
652
|
+
const animator = this.#viewContext.animator;
|
|
634
653
|
|
|
635
654
|
const scale = this.scale;
|
|
636
655
|
const from = /** @type {number[]} */ (scale.domain());
|
|
@@ -770,7 +789,7 @@ export default class ScaleResolution {
|
|
|
770
789
|
}
|
|
771
790
|
|
|
772
791
|
// TODO: Support multiple assemblies
|
|
773
|
-
const genome = this.
|
|
792
|
+
const genome = this.#viewContext.genomeStore?.getGenome();
|
|
774
793
|
if (!genome) {
|
|
775
794
|
throw new Error("No genome has been defined!");
|
|
776
795
|
}
|
|
@@ -826,21 +845,19 @@ export default class ScaleResolution {
|
|
|
826
845
|
return /** @type {number[]} */ (interval);
|
|
827
846
|
}
|
|
828
847
|
|
|
829
|
-
#getViewPaths() {
|
|
830
|
-
return this.members.map((v) => v.view.getPathString()).join(", ");
|
|
831
|
-
}
|
|
832
|
-
|
|
833
848
|
/**
|
|
834
849
|
* Iterate all participanting views and reduce (union) their domains using an accessor.
|
|
835
850
|
* Accessor may return the an explicitly configured domain or a domain extracted from the data.
|
|
836
851
|
*
|
|
837
|
-
* @param {function(
|
|
852
|
+
* @param {function(ScaleResolutionMember):DomainArray} domainAccessor
|
|
838
853
|
* @returns {DomainArray}
|
|
839
854
|
*/
|
|
840
855
|
#reduceDomains(domainAccessor) {
|
|
841
856
|
const domains = this.members
|
|
842
857
|
.filter(
|
|
843
858
|
(member) =>
|
|
859
|
+
// View is missing if ScaleResolution is used within tests
|
|
860
|
+
!member.view ||
|
|
844
861
|
!member.view
|
|
845
862
|
.getLayoutAncestors()
|
|
846
863
|
// TODO: Should check until the resolved scale resolution
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaleResolution.test.d.ts","sourceRoot":"","sources":["../../../src/view/scaleResolution.test.js"],"names":[],"mappings":"sBAWa,OAAO,oBAAoB,EAAE,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,6CAmDvD;AAGS,oEAA8C,QAAQ,2BAA4B,GAAG,EAAE,6BAA6B,OAAO,kBAAkB,EAAE,kBAAkB,cAAe;AAgBhL,iFAA8C,QAAQ,2BAA4B,GAAG,EAAE,kBAAkB,WAAW,YAAY;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAC,cAAe;;;;;uBApFpL,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO"}
|
|
@@ -7,11 +7,13 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { checkForDuplicateScaleNames, initializeData } from "./viewUtils.js";
|
|
10
|
-
import AccessorFactory from "../encoder/accessor.js";
|
|
11
10
|
import DataFlow from "../data/dataFlow.js";
|
|
12
11
|
import { VIEW_ROOT_NAME, ViewFactory } from "./viewFactory.js";
|
|
13
12
|
import GenomeStore from "../genome/genomeStore.js";
|
|
14
13
|
import BmFontManager from "../fonts/bmFontManager.js";
|
|
14
|
+
import { reconfigureScales } from "./scaleResolution.js";
|
|
15
|
+
import UnitView from "./unitView.js";
|
|
16
|
+
import ContainerView from "./containerView.js";
|
|
15
17
|
|
|
16
18
|
/**
|
|
17
19
|
* @param {import("./viewFactory.js").ViewFactoryOptions} [viewFactoryOptions]
|
|
@@ -35,8 +37,6 @@ export function createTestViewContext(viewFactoryOptions = {}) {
|
|
|
35
37
|
|
|
36
38
|
// @ts-expect-error
|
|
37
39
|
const c = /** @type {ViewContext} */ ({
|
|
38
|
-
accessorFactory: new AccessorFactory(),
|
|
39
|
-
|
|
40
40
|
createView: function (spec, parent, defaultName) {
|
|
41
41
|
throw new Error("Not implemented: createView");
|
|
42
42
|
},
|
|
@@ -92,6 +92,18 @@ export async function createAndInitialize(spec, viewClass) {
|
|
|
92
92
|
const view = await create(spec, viewClass);
|
|
93
93
|
|
|
94
94
|
checkForDuplicateScaleNames(view);
|
|
95
|
+
|
|
96
|
+
if (view instanceof UnitView) {
|
|
97
|
+
view.mark.initializeEncoders();
|
|
98
|
+
} else if (view instanceof ContainerView) {
|
|
99
|
+
view.visit((v) => {
|
|
100
|
+
if (v instanceof UnitView) {
|
|
101
|
+
v.mark.initializeEncoders();
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
95
106
|
await initializeData(view, view.context.dataFlow);
|
|
107
|
+
reconfigureScales(view);
|
|
96
108
|
return view;
|
|
97
109
|
}
|
|
@@ -20,12 +20,6 @@ export default class UnitView extends View {
|
|
|
20
20
|
spec: import("../spec/view.js").UnitSpec;
|
|
21
21
|
/** @type {import("../marks/mark.js").default} */
|
|
22
22
|
mark: import("../marks/mark.js").default;
|
|
23
|
-
/**
|
|
24
|
-
* @param {import("./renderingContext/viewRenderingContext.js").default} context
|
|
25
|
-
* @param {import("./layout/rectangle.js").default} coords
|
|
26
|
-
* @param {import("../types/rendering.js").RenderingOptions} [options]
|
|
27
|
-
*/
|
|
28
|
-
render(context: import("./renderingContext/viewRenderingContext.js").default, coords: import("./layout/rectangle.js").default, options?: import("../types/rendering.js").RenderingOptions): void;
|
|
29
23
|
getMarkType(): import("../spec/mark.js").MarkType;
|
|
30
24
|
/**
|
|
31
25
|
* Pulls scales and axes up in the view hierarcy according to the resolution rules, using dataParents.
|
|
@@ -35,21 +29,16 @@ export default class UnitView extends View {
|
|
|
35
29
|
*/
|
|
36
30
|
resolve(type?: import("../spec/view.js").ResolutionTarget): void;
|
|
37
31
|
/**
|
|
32
|
+
* Returns an accessor that accesses a field or an evaluated expression,
|
|
33
|
+
* if there is one.
|
|
38
34
|
*
|
|
39
35
|
* @param {Channel} channel
|
|
40
36
|
*/
|
|
41
|
-
|
|
37
|
+
getDataAccessor(channel: import("../spec/channel.js").Channel): import("../types/encoder.js").Accessor<import("../spec/channel.js").Scalar>;
|
|
42
38
|
/**
|
|
43
39
|
* Returns a collector that is associated with this view.
|
|
44
40
|
*/
|
|
45
41
|
getCollector(): import("../data/collector.js").default;
|
|
46
|
-
/**
|
|
47
|
-
* Returns the domain of the specified channel of this domain/mark.
|
|
48
|
-
*
|
|
49
|
-
* @param {import("../spec/channel.js").ChannelWithScale} channel A primary channel
|
|
50
|
-
* @returns {DomainArray}
|
|
51
|
-
*/
|
|
52
|
-
getConfiguredDomain(channel: import("../spec/channel.js").ChannelWithScale): import("../utils/domainArray.js").DomainArray;
|
|
53
42
|
/**
|
|
54
43
|
* Extracts the domain from the data.
|
|
55
44
|
*
|
|
@@ -61,9 +50,10 @@ export default class UnitView extends View {
|
|
|
61
50
|
* (with aggregate and extent).
|
|
62
51
|
*
|
|
63
52
|
* @param {Channel} channel
|
|
53
|
+
* @param {import("../spec/channel.js").Type} type
|
|
64
54
|
* @returns {DomainArray}
|
|
65
55
|
*/
|
|
66
|
-
extractDataDomain(channel: import("../spec/channel.js").Channel): import("../utils/domainArray.js").DomainArray;
|
|
56
|
+
extractDataDomain(channel: import("../spec/channel.js").Channel, type: import("../spec/channel.js").Type): import("../utils/domainArray.js").DomainArray;
|
|
67
57
|
getZoomLevel(): number;
|
|
68
58
|
/**
|
|
69
59
|
* @param {string} channel
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AAsBA;;;;GAIG;AACH;QAHkB,MAAM,GAAE,cAAc,kBAAkB,EAAE,OAAO;EASjE;AAEF;IAeI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,QAAQ,WAClC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAiCzC;IA5BG,yCAAgB;IAIZ,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAsFlC,kDAIC;IAED;;;;;OAKG;IACH,iEAmFC;IAED;;;;;OAKG;IACH,4IAEC;IAkBD;;OAEG;IACH,uDAEC;IAED;;;;;;;;;;;;;OAaG;IACH,uEAHW,OAAO,oBAAoB,EAAE,IAAI,iDAqB3C;IAED,uBAQC;IAgBD;;;;OAIG;IACH,8BAJW,MAAM,+DAEJ,OAAO,iBAAiB,EAAE,kBAAkB,CAKxD;;CACJ;iBA7UgB,WAAW"}
|
|
@@ -6,8 +6,6 @@ import TextMark from "../marks/text.js";
|
|
|
6
6
|
|
|
7
7
|
import ScaleResolution from "./scaleResolution.js";
|
|
8
8
|
import {
|
|
9
|
-
isSecondaryChannel,
|
|
10
|
-
secondaryChannels,
|
|
11
9
|
isPositionalChannel,
|
|
12
10
|
isChannelDefWithScale,
|
|
13
11
|
primaryPositionalChannels,
|
|
@@ -18,6 +16,9 @@ import {
|
|
|
18
16
|
import createDomain from "../utils/domainArray.js";
|
|
19
17
|
import AxisResolution from "./axisResolution.js";
|
|
20
18
|
import View from "./view.js";
|
|
19
|
+
import { createSinglePointSelection } from "../selection/selection.js";
|
|
20
|
+
import { isString } from "vega-util";
|
|
21
|
+
import { UNIQUE_ID_KEY } from "../data/transforms/identifier.js";
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
*
|
|
@@ -37,6 +38,7 @@ export default class UnitView extends View {
|
|
|
37
38
|
* @typedef {import("../spec/channel.js").Channel} Channel
|
|
38
39
|
* @typedef {import("../utils/domainArray.js").DomainArray} DomainArray
|
|
39
40
|
* @typedef {import("../spec/view.js").ResolutionTarget} ResolutionTarget
|
|
41
|
+
* @typedef {((datum: import("../data/flowNode.js").Datum) => import("../spec/channel.js").Scalar) & { fieldDef: import("../spec/channel.js").FieldDef}} FieldAccessor
|
|
40
42
|
*
|
|
41
43
|
*/
|
|
42
44
|
|
|
@@ -84,6 +86,52 @@ export default class UnitView extends View {
|
|
|
84
86
|
);
|
|
85
87
|
|
|
86
88
|
this.needsAxes = { x: true, y: true };
|
|
89
|
+
|
|
90
|
+
this.#setupPointSelection();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
#setupPointSelection() {
|
|
94
|
+
for (const [name, param] of this.paramMediator.paramConfigs) {
|
|
95
|
+
if (!("select" in param)) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const select = param.select;
|
|
100
|
+
const type = isString(select) ? select : select.type;
|
|
101
|
+
if (type === "point") {
|
|
102
|
+
// Handle projection-free point selections
|
|
103
|
+
|
|
104
|
+
const none = -1;
|
|
105
|
+
let lastId = none;
|
|
106
|
+
|
|
107
|
+
const setter = this.paramMediator.getSetter(name);
|
|
108
|
+
|
|
109
|
+
const getHoveredDatum = () => {
|
|
110
|
+
const h = this.context.getCurrentHover();
|
|
111
|
+
return h?.mark?.unitView === this ? h.datum : null;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
const on =
|
|
115
|
+
!isString(select) && "on" in select ? select.on : "click";
|
|
116
|
+
|
|
117
|
+
this.addInteractionEventListener(
|
|
118
|
+
["mouseover", "pointerover"].includes(on)
|
|
119
|
+
? "mousemove"
|
|
120
|
+
: "click",
|
|
121
|
+
(rect, event) => {
|
|
122
|
+
const datum = getHoveredDatum();
|
|
123
|
+
const id = datum ? datum[UNIQUE_ID_KEY] : none;
|
|
124
|
+
if (id != lastId) {
|
|
125
|
+
lastId = id;
|
|
126
|
+
const selection = createSinglePointSelection(
|
|
127
|
+
getHoveredDatum()
|
|
128
|
+
);
|
|
129
|
+
setter(selection);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
87
135
|
}
|
|
88
136
|
|
|
89
137
|
/**
|
|
@@ -172,10 +220,11 @@ export default class UnitView extends View {
|
|
|
172
220
|
targetChannel
|
|
173
221
|
);
|
|
174
222
|
}
|
|
175
|
-
view.resolutions[type][targetChannel].pushUnitView(
|
|
176
|
-
this,
|
|
177
|
-
channel
|
|
178
|
-
|
|
223
|
+
view.resolutions[type][targetChannel].pushUnitView({
|
|
224
|
+
view: this,
|
|
225
|
+
channel,
|
|
226
|
+
channelDef,
|
|
227
|
+
});
|
|
179
228
|
} else if (type == "scale" && isChannelWithScale(channel)) {
|
|
180
229
|
if (!view.resolutions[type][targetChannel]) {
|
|
181
230
|
const resolution = new ScaleResolution(targetChannel);
|
|
@@ -189,27 +238,24 @@ export default class UnitView extends View {
|
|
|
189
238
|
);
|
|
190
239
|
});
|
|
191
240
|
}
|
|
192
|
-
view.resolutions[type][targetChannel].pushUnitView(
|
|
193
|
-
this,
|
|
194
|
-
channel
|
|
195
|
-
|
|
241
|
+
view.resolutions[type][targetChannel].pushUnitView({
|
|
242
|
+
view: this,
|
|
243
|
+
channel,
|
|
244
|
+
channelDef,
|
|
245
|
+
dataDomainSource: this.extractDataDomain.bind(this),
|
|
246
|
+
});
|
|
196
247
|
}
|
|
197
248
|
}
|
|
198
249
|
}
|
|
199
250
|
|
|
200
251
|
/**
|
|
252
|
+
* Returns an accessor that accesses a field or an evaluated expression,
|
|
253
|
+
* if there is one.
|
|
201
254
|
*
|
|
202
255
|
* @param {Channel} channel
|
|
203
256
|
*/
|
|
204
|
-
|
|
205
|
-
return this.
|
|
206
|
-
const encoding = this.mark.encoding; // Mark provides encodings with defaults and possible modifications
|
|
207
|
-
if (encoding && encoding[channel]) {
|
|
208
|
-
return this.context.accessorFactory.createAccessor(
|
|
209
|
-
encoding[channel]
|
|
210
|
-
);
|
|
211
|
-
}
|
|
212
|
-
});
|
|
257
|
+
getDataAccessor(channel) {
|
|
258
|
+
return this.mark.encoders[channel]?.dataAccessor;
|
|
213
259
|
}
|
|
214
260
|
|
|
215
261
|
/**
|
|
@@ -220,7 +266,7 @@ export default class UnitView extends View {
|
|
|
220
266
|
*/
|
|
221
267
|
getFacetAccessor(whoIsAsking) {
|
|
222
268
|
// TODO: Rewrite, call getFacetFields
|
|
223
|
-
const sampleAccessor = this.
|
|
269
|
+
const sampleAccessor = this.getDataAccessor("sample");
|
|
224
270
|
if (sampleAccessor) {
|
|
225
271
|
return sampleAccessor;
|
|
226
272
|
}
|
|
@@ -235,48 +281,6 @@ export default class UnitView extends View {
|
|
|
235
281
|
return this.context.dataFlow.findCollectorByKey(this);
|
|
236
282
|
}
|
|
237
283
|
|
|
238
|
-
/**
|
|
239
|
-
* @param {Channel} channel A primary channel
|
|
240
|
-
*/
|
|
241
|
-
#validateDomainQuery(channel) {
|
|
242
|
-
if (isSecondaryChannel(channel)) {
|
|
243
|
-
throw new Error(
|
|
244
|
-
`getDomain(${channel}), must only be called for primary channels!`
|
|
245
|
-
);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
const channelDef = this.mark.encoding[channel];
|
|
249
|
-
// TODO: Broken. Fix.
|
|
250
|
-
if (!isChannelDefWithScale(channelDef)) {
|
|
251
|
-
throw new Error("The channel has no scale, cannot get domain!");
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return channelDef;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/**
|
|
258
|
-
* Returns the domain of the specified channel of this domain/mark.
|
|
259
|
-
*
|
|
260
|
-
* @param {import("../spec/channel.js").ChannelWithScale} channel A primary channel
|
|
261
|
-
* @returns {DomainArray}
|
|
262
|
-
*/
|
|
263
|
-
getConfiguredDomain(channel) {
|
|
264
|
-
const channelDef = this.#validateDomainQuery(channel);
|
|
265
|
-
|
|
266
|
-
const specDomain =
|
|
267
|
-
channelDef && channelDef.scale && channelDef.scale.domain;
|
|
268
|
-
if (specDomain) {
|
|
269
|
-
const scaleResolution = this.getScaleResolution(
|
|
270
|
-
channelDef.resolutionChannel ?? channel
|
|
271
|
-
);
|
|
272
|
-
return createDomain(
|
|
273
|
-
channelDef.type ?? "nominal",
|
|
274
|
-
// Chrom/pos must be linearized first
|
|
275
|
-
scaleResolution.fromComplexInterval(specDomain)
|
|
276
|
-
);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
|
|
280
284
|
/**
|
|
281
285
|
* Extracts the domain from the data.
|
|
282
286
|
*
|
|
@@ -288,49 +292,25 @@ export default class UnitView extends View {
|
|
|
288
292
|
* (with aggregate and extent).
|
|
289
293
|
*
|
|
290
294
|
* @param {Channel} channel
|
|
295
|
+
* @param {import("../spec/channel.js").Type} type
|
|
291
296
|
* @returns {DomainArray}
|
|
292
297
|
*/
|
|
293
|
-
extractDataDomain(channel) {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
this.context.accessorFactory.createAccessor(encodingSpec);
|
|
307
|
-
if (accessor) {
|
|
308
|
-
domain = createDomain(type);
|
|
309
|
-
|
|
310
|
-
if (accessor.constant) {
|
|
311
|
-
domain.extend(accessor({}));
|
|
312
|
-
} else {
|
|
313
|
-
const collector = this.getCollector();
|
|
314
|
-
if (collector?.completed) {
|
|
315
|
-
collector.visitData((d) =>
|
|
316
|
-
domain.extend(accessor(d))
|
|
317
|
-
);
|
|
318
|
-
}
|
|
298
|
+
extractDataDomain(channel, type) {
|
|
299
|
+
/** @type {DomainArray} */
|
|
300
|
+
let domain = createDomain(type);
|
|
301
|
+
|
|
302
|
+
(this.mark.encoders[channel]?.accessors ?? [])
|
|
303
|
+
.filter((a) => a.scaleChannel)
|
|
304
|
+
.forEach((accessor) => {
|
|
305
|
+
if (accessor.constant) {
|
|
306
|
+
domain.extend(accessor({}));
|
|
307
|
+
} else {
|
|
308
|
+
const collector = this.getCollector();
|
|
309
|
+
if (collector?.completed) {
|
|
310
|
+
collector.visitData((d) => domain.extend(accessor(d)));
|
|
319
311
|
}
|
|
320
312
|
}
|
|
321
|
-
}
|
|
322
|
-
return domain;
|
|
323
|
-
};
|
|
324
|
-
|
|
325
|
-
let domain = extract(channel);
|
|
326
|
-
|
|
327
|
-
const secondaryChannel = secondaryChannels[channel];
|
|
328
|
-
if (secondaryChannel) {
|
|
329
|
-
const secondaryDomain = extract(secondaryChannel);
|
|
330
|
-
if (secondaryDomain) {
|
|
331
|
-
domain.extendAll(secondaryDomain);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
313
|
+
});
|
|
334
314
|
|
|
335
315
|
return domain;
|
|
336
316
|
}
|
package/dist/src/view/view.d.ts
CHANGED
|
@@ -205,7 +205,7 @@ export default class View {
|
|
|
205
205
|
* pass. The order is depth first, pre order.
|
|
206
206
|
*/
|
|
207
207
|
onBeforeRender(): void;
|
|
208
|
-
render(context:
|
|
208
|
+
render(context: import("./renderingContext/viewRenderingContext.js").default, coords: import("./layout/rectangle.js").default, options?: import("../types/rendering.js").RenderingOptions): void;
|
|
209
209
|
/**
|
|
210
210
|
* Returns the encodings specified in this view combined with the inherited
|
|
211
211
|
* encodings. However, this does not contain any defaults or inferred/adjusted/fixed
|