@genome-spy/core 0.54.0 → 0.56.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 (120) hide show
  1. package/dist/bundle/index.es.js +3867 -3671
  2. package/dist/bundle/index.js +99 -86
  3. package/dist/schema.json +4 -0
  4. package/dist/src/data/collector.d.ts.map +1 -1
  5. package/dist/src/data/collector.js +4 -0
  6. package/dist/src/data/flowNode.d.ts +14 -5
  7. package/dist/src/data/flowNode.d.ts.map +1 -1
  8. package/dist/src/data/flowNode.js +30 -7
  9. package/dist/src/data/sources/dataSource.d.ts +1 -2
  10. package/dist/src/data/sources/dataSource.d.ts.map +1 -1
  11. package/dist/src/data/sources/dataSource.js +0 -1
  12. package/dist/src/data/sources/inlineSource.d.ts +4 -0
  13. package/dist/src/data/sources/inlineSource.d.ts.map +1 -1
  14. package/dist/src/data/sources/inlineSource.js +18 -0
  15. package/dist/src/data/sources/lazy/axisGenomeSource.d.ts.map +1 -1
  16. package/dist/src/data/sources/lazy/axisGenomeSource.js +4 -0
  17. package/dist/src/data/sources/lazy/axisTickSource.d.ts.map +1 -1
  18. package/dist/src/data/sources/lazy/axisTickSource.js +4 -0
  19. package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
  20. package/dist/src/data/sources/lazy/bamSource.js +4 -0
  21. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  22. package/dist/src/data/sources/lazy/bigBedSource.js +4 -0
  23. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  24. package/dist/src/data/sources/lazy/bigWigSource.js +4 -0
  25. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  26. package/dist/src/data/sources/lazy/gff3Source.js +4 -0
  27. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  28. package/dist/src/data/sources/lazy/indexedFastaSource.js +4 -0
  29. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +2 -0
  30. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  31. package/dist/src/data/sources/lazy/singleAxisLazySource.js +2 -0
  32. package/dist/src/data/sources/namedSource.d.ts.map +1 -1
  33. package/dist/src/data/sources/namedSource.js +4 -0
  34. package/dist/src/data/sources/sequenceSource.d.ts.map +1 -1
  35. package/dist/src/data/sources/sequenceSource.js +4 -0
  36. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  37. package/dist/src/data/sources/urlSource.js +4 -0
  38. package/dist/src/data/transforms/aggregate.d.ts +2 -2
  39. package/dist/src/data/transforms/aggregate.d.ts.map +1 -1
  40. package/dist/src/data/transforms/aggregate.js +4 -3
  41. package/dist/src/data/transforms/clone.d.ts +2 -2
  42. package/dist/src/data/transforms/clone.d.ts.map +1 -1
  43. package/dist/src/data/transforms/clone.js +4 -3
  44. package/dist/src/data/transforms/coverage.d.ts +2 -2
  45. package/dist/src/data/transforms/coverage.d.ts.map +1 -1
  46. package/dist/src/data/transforms/coverage.js +4 -3
  47. package/dist/src/data/transforms/filter.d.ts +2 -2
  48. package/dist/src/data/transforms/filter.d.ts.map +1 -1
  49. package/dist/src/data/transforms/filter.js +3 -3
  50. package/dist/src/data/transforms/filterScoredLabels.d.ts +2 -2
  51. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  52. package/dist/src/data/transforms/filterScoredLabels.js +4 -3
  53. package/dist/src/data/transforms/flatten.d.ts +3 -2
  54. package/dist/src/data/transforms/flatten.d.ts.map +1 -1
  55. package/dist/src/data/transforms/flatten.js +6 -3
  56. package/dist/src/data/transforms/flattenCompressedExons.d.ts +2 -2
  57. package/dist/src/data/transforms/flattenCompressedExons.d.ts.map +1 -1
  58. package/dist/src/data/transforms/flattenCompressedExons.js +4 -3
  59. package/dist/src/data/transforms/flattenDelimited.d.ts +2 -2
  60. package/dist/src/data/transforms/flattenDelimited.d.ts.map +1 -1
  61. package/dist/src/data/transforms/flattenDelimited.js +4 -3
  62. package/dist/src/data/transforms/flattenSequence.d.ts +3 -2
  63. package/dist/src/data/transforms/flattenSequence.d.ts.map +1 -1
  64. package/dist/src/data/transforms/flattenSequence.js +6 -3
  65. package/dist/src/data/transforms/formula.d.ts +2 -2
  66. package/dist/src/data/transforms/formula.d.ts.map +1 -1
  67. package/dist/src/data/transforms/formula.js +4 -3
  68. package/dist/src/data/transforms/identifier.d.ts +2 -2
  69. package/dist/src/data/transforms/identifier.d.ts.map +1 -1
  70. package/dist/src/data/transforms/identifier.js +4 -3
  71. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts +3 -2
  72. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  73. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +11 -4
  74. package/dist/src/data/transforms/measureText.d.ts +5 -4
  75. package/dist/src/data/transforms/measureText.d.ts.map +1 -1
  76. package/dist/src/data/transforms/measureText.js +11 -8
  77. package/dist/src/data/transforms/pileup.d.ts +2 -2
  78. package/dist/src/data/transforms/pileup.d.ts.map +1 -1
  79. package/dist/src/data/transforms/pileup.js +4 -3
  80. package/dist/src/data/transforms/project.d.ts +3 -2
  81. package/dist/src/data/transforms/project.d.ts.map +1 -1
  82. package/dist/src/data/transforms/project.js +6 -3
  83. package/dist/src/data/transforms/regexExtract.d.ts +3 -2
  84. package/dist/src/data/transforms/regexExtract.d.ts.map +1 -1
  85. package/dist/src/data/transforms/regexExtract.js +6 -3
  86. package/dist/src/data/transforms/regexFold.d.ts +3 -2
  87. package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
  88. package/dist/src/data/transforms/regexFold.js +6 -3
  89. package/dist/src/data/transforms/sample.d.ts +3 -2
  90. package/dist/src/data/transforms/sample.d.ts.map +1 -1
  91. package/dist/src/data/transforms/sample.js +5 -3
  92. package/dist/src/data/transforms/stack.d.ts +2 -2
  93. package/dist/src/data/transforms/stack.d.ts.map +1 -1
  94. package/dist/src/data/transforms/stack.js +4 -3
  95. package/dist/src/data/transforms/transform.d.ts +10 -0
  96. package/dist/src/data/transforms/transform.d.ts.map +1 -0
  97. package/dist/src/data/transforms/transform.js +22 -0
  98. package/dist/src/gl/glslScaleGenerator.d.ts +1 -0
  99. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  100. package/dist/src/gl/glslScaleGenerator.js +3 -10
  101. package/dist/src/gl/includes/common.glsl.js +1 -1
  102. package/dist/src/gl/webGLHelper.d.ts +8 -0
  103. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  104. package/dist/src/gl/webGLHelper.js +40 -0
  105. package/dist/src/marks/mark.d.ts +8 -0
  106. package/dist/src/marks/mark.d.ts.map +1 -1
  107. package/dist/src/marks/mark.js +86 -19
  108. package/dist/src/marks/rule.d.ts.map +1 -1
  109. package/dist/src/marks/rule.js +23 -22
  110. package/dist/src/selection/selection.d.ts +24 -0
  111. package/dist/src/selection/selection.d.ts.map +1 -1
  112. package/dist/src/selection/selection.js +73 -2
  113. package/dist/src/spec/parameter.d.ts +3 -2
  114. package/dist/src/types/selectionTypes.d.ts +2 -2
  115. package/dist/src/view/axisView.js +2 -2
  116. package/dist/src/view/paramMediator.d.ts.map +1 -1
  117. package/dist/src/view/paramMediator.js +14 -8
  118. package/dist/src/view/unitView.d.ts.map +1 -1
  119. package/dist/src/view/unitView.js +46 -10
  120. package/package.json +2 -2
@@ -13,6 +13,53 @@ export function createSinglePointSelection(datum) {
13
13
  };
14
14
  }
15
15
 
16
+ /**
17
+ * @param {import("../data/flowNode.js").Datum[]} [data]
18
+ * @returns {import("../types/selectionTypes.js").MultiPointSelection}
19
+ */
20
+ export function createMultiPointSelection(data) {
21
+ data ??= [];
22
+ return {
23
+ type: "multi",
24
+ data: new Map(data.map((d) => [d[UNIQUE_ID_KEY], d])),
25
+ };
26
+ }
27
+
28
+ /**
29
+ * Updates the backing data and returns a new instance of the selection object.
30
+ * A new instance is required to trigger reactivity in parameters.
31
+ *
32
+ * @param {import("../types/selectionTypes.js").MultiPointSelection} selection
33
+ * @param {Partial<Record<"add" | "remove" | "toggle", Iterable<import("../data/flowNode.js").Datum>>>} update
34
+ * @returns {import("../types/selectionTypes.js").MultiPointSelection}
35
+ */
36
+ export function updateMultiPointSelection(selection, { add, remove, toggle }) {
37
+ const data = selection.data;
38
+
39
+ for (const d of add ?? []) {
40
+ data.set(d[UNIQUE_ID_KEY], d);
41
+ }
42
+
43
+ for (const d of remove ?? []) {
44
+ data.delete(d[UNIQUE_ID_KEY]);
45
+ }
46
+
47
+ for (const d of toggle ?? []) {
48
+ const id = d[UNIQUE_ID_KEY];
49
+ if (data.has(id)) {
50
+ data.delete(id);
51
+ } else {
52
+ data.set(id, d);
53
+ }
54
+ }
55
+
56
+ return {
57
+ type: "multi",
58
+ // Note, the data map is reused for performance reasons.
59
+ data,
60
+ };
61
+ }
62
+
16
63
  /**
17
64
  * @param {import("../types/selectionTypes.js").Selection} selection
18
65
  * @param {import("../data/flowNode.js").Datum} datum
@@ -28,9 +75,9 @@ export function selectionTest(selection, datum, empty = true) {
28
75
  ? empty
29
76
  : selection.uniqueId === datum[UNIQUE_ID_KEY];
30
77
  } else if (isMultiPointSelection(selection)) {
31
- return selection.uniqueIds.size == 0
78
+ return selection.data.size == 0
32
79
  ? empty
33
- : selection.uniqueIds.has(datum[UNIQUE_ID_KEY]);
80
+ : selection.data.has(datum[UNIQUE_ID_KEY]); // TODO: Binary search
34
81
  } else {
35
82
  throw new Error("Not a selection: " + JSON.stringify(selection));
36
83
  }
@@ -76,3 +123,27 @@ export function isMultiPointSelection(selection) {
76
123
  export function isProjectedSelection(selection) {
77
124
  return selection.type === "projected";
78
125
  }
126
+
127
+ /**
128
+ * @param {any} config
129
+ * @returns {config is import("../spec/parameter.js").PointSelectionConfig}
130
+ */
131
+ export function isPointSelectionConfig(config) {
132
+ return (
133
+ config != null &&
134
+ typeof config !== "string" &&
135
+ "type" in config &&
136
+ config.type === "point"
137
+ );
138
+ }
139
+
140
+ /**
141
+ * @param {string | import("../spec/parameter.js").PointSelectionConfig} config
142
+ * @returns {boolean}
143
+ */
144
+ export function isTogglingEnabledInPointSelectionConfig(config) {
145
+ if (!isPointSelectionConfig(config)) {
146
+ return false;
147
+ }
148
+ return config.toggle ?? config.on === "click";
149
+ }
@@ -196,6 +196,8 @@ export interface BaseSelectionConfig<T extends SelectionType = SelectionType> {
196
196
  }
197
197
 
198
198
  export interface PointSelectionConfig extends BaseSelectionConfig<"point"> {
199
+ type: "point";
200
+
199
201
  /**
200
202
  * Controls whether data values should be toggled (inserted or removed from a point selection)
201
203
  * when clicking with the shift key pressed.
@@ -205,8 +207,7 @@ export interface PointSelectionConfig extends BaseSelectionConfig<"point"> {
205
207
  *
206
208
  * __Default value:__ `true`
207
209
  */
208
- // TODO TODO TODO TODO TODO TODO TODO TODO
209
- //toggle?: boolean;
210
+ toggle?: boolean;
210
211
  /**
211
212
  * A set of fields that uniquely identify a tuple. Used for bookmarking point selections
212
213
  * in the GenomeSpy App. Still work in progress.
@@ -33,8 +33,8 @@ export interface SinglePointSelection extends SelectionBase {
33
33
  export interface MultiPointSelection extends SelectionBase {
34
34
  type: "multi";
35
35
 
36
- data: Datum[];
37
- uniqueIds: Set<number>;
36
+ /** Maps unique id to datum */
37
+ data: Map<number, Datum>;
38
38
  }
39
39
 
40
40
  export type Selection =
@@ -271,7 +271,7 @@ function createAxis(axisProps, type) {
271
271
  */
272
272
  const createDomain = () => ({
273
273
  name: "domain",
274
- data: { values: [0] },
274
+ data: { values: [{}] },
275
275
  mark: {
276
276
  type: "rule",
277
277
  clip: false,
@@ -334,7 +334,7 @@ function createAxis(axisProps, type) {
334
334
  */
335
335
  const createTitle = () => ({
336
336
  name: "title",
337
- data: { values: [0] },
337
+ data: { values: [{}] },
338
338
  mark: {
339
339
  type: "text",
340
340
  clip: false,
@@ -1 +1 @@
1
- {"version":3,"file":"paramMediator.d.ts","sourceRoot":"","sources":["../../../src/view/paramMediator.js"],"names":[],"mappings":"AAoUA;;;GAGG;AACH,6BAHW,GAAG,+CAKb;AAED;;;;;;;GAOG;AACH,oFASC;AAED;;;GAGG;AACH,gJAEC;AAED;;;GAGG;AACH,gMAEC;AAED;;;;;;;;;;GAUG;AACH,mFANW,aAAa,+CAEW,IAAI,KAwCtC;AAED;;;;;;GAMG;AACH,4CAHW,MAAM,GACJ,MAAM,CAUlB;AAED;;;;;;;GAOG;AACH,2CAHW,GAAG,GACD,eAAe,CAW3B;AA9bD;;;;;;;;GAQG;AACH;IA2BI;;;;;OAKG;IACH,2BALW,MAAM,aAAa,EAU7B;IA7BD;;;OAGG;IACH,0BAHU,IAAI,MAAM,EAAE,IAAI,MAAM,IAAI,CAAC,CAAC,CAGvB;IA2Bf;;;OAGG;IACH,wEAzCqB,GAAG,KAAK,IAAI,CAmGhC;IAED;;;;;;;OAOG;IACH,6BANW,MAAM,6BAEN,OAAO,iBACS,IAAI,CAgC9B;IAED;;;OAGG;IACH,qBAFW,MAAM,WAlIc,GAAG,KAAK,IAAI,CA0I1C;IAED;;;OAGG;IACH,oBAFW,MAAM,OAIhB;IAED;;;OAGG;IACH,qBAFW,MAAM,OAKhB;IAED;;OAEG;IACH,kFAIC;IAED;;;;OAIG;IACH,gCAHW,MAAM,GACJ,aAAa,CAQzB;IAID;;;;OAIG;IACH,uBAFW,MAAM,mBA4EhB;IAED;;;;OAIG;IACH,qBAFW,MAAM,OAKhB;IAED;;;;;OAKG;IACH,sBAFa,OAAO,CAiBnB;;CACJ;;;;;;;;8BAvTY,OAAO,wBAAwB,EAAE,kBAAkB,GAAG;IAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,MAAM,CAAA;CAAC"}
1
+ {"version":3,"file":"paramMediator.d.ts","sourceRoot":"","sources":["../../../src/view/paramMediator.js"],"names":[],"mappings":"AA0UA;;;GAGG;AACH,6BAHW,GAAG,+CAKb;AAED;;;;;;;GAOG;AACH,oFASC;AAED;;;GAGG;AACH,gJAEC;AAED;;;GAGG;AACH,gMAEC;AAED;;;;;;;;;;GAUG;AACH,mFANW,aAAa,+CAEW,IAAI,KAwCtC;AAED;;;;;;GAMG;AACH,4CAHW,MAAM,GACJ,MAAM,CAUlB;AAED;;;;;;;GAOG;AACH,2CAHW,GAAG,GACD,eAAe,CAW3B;AA/bD;;;;;;;;GAQG;AACH;IA2BI;;;;;OAKG;IACH,2BALW,MAAM,aAAa,EAU7B;IA7BD;;;OAGG;IACH,0BAHU,IAAI,MAAM,EAAE,IAAI,MAAM,IAAI,CAAC,CAAC,CAGvB;IA2Bf;;;OAGG;IACH,wEAzCqB,GAAG,KAAK,IAAI,CAoGhC;IAED;;;;;;;OAOG;IACH,6BANW,MAAM,6BAEN,OAAO,iBACS,IAAI,CAgC9B;IAED;;;OAGG;IACH,qBAFW,MAAM,WAnIc,GAAG,KAAK,IAAI,CA2I1C;IAED;;;OAGG;IACH,oBAFW,MAAM,OAIhB;IAED;;;OAGG;IACH,qBAFW,MAAM,OAKhB;IAED;;OAEG;IACH,kFAIC;IAED;;;;OAIG;IACH,gCAHW,MAAM,GACJ,aAAa,CAQzB;IAID;;;;OAIG;IACH,uBAFW,MAAM,mBA4EhB;IAED;;;;OAIG;IACH,qBAFW,MAAM,OAKhB;IAED;;;;;OAKG;IACH,sBAFa,OAAO,CAiBnB;;CACJ;;;;;;;;8BAxTY,OAAO,wBAAwB,EAAE,kBAAkB,GAAG;IAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,MAAM,CAAA;CAAC"}
@@ -1,6 +1,11 @@
1
1
  import { isString } from "vega-util";
2
2
  import createFunction from "../utils/expression.js";
3
- import { createSinglePointSelection } from "../selection/selection.js";
3
+ import {
4
+ createMultiPointSelection,
5
+ createSinglePointSelection,
6
+ isPointSelectionConfig,
7
+ isTogglingEnabledInPointSelectionConfig,
8
+ } from "../selection/selection.js";
4
9
 
5
10
  /**
6
11
  * A class that manages parameters and expressions.
@@ -100,13 +105,14 @@ export default class ParamMediator {
100
105
  }
101
106
 
102
107
  if ("select" in param) {
103
- const type = isString(param.select)
104
- ? param.select
105
- : param.select.type;
106
-
107
- // Set initial value so that production rules in shaders can be generated, etc.
108
- if (type == "point") {
109
- setter(createSinglePointSelection(null));
108
+ const select = param.select;
109
+ if (isPointSelectionConfig(select)) {
110
+ // Set initial value so that production rules in shaders can be generated, etc.
111
+ setter(
112
+ isTogglingEnabledInPointSelectionConfig(select)
113
+ ? createMultiPointSelection()
114
+ : createSinglePointSelection(null)
115
+ );
110
116
  }
111
117
  }
112
118
 
@@ -1 +1 @@
1
- {"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AAsBA;;;;GAIG;AACH,wBAHU,OAAO,OAAO,iBAAiB,EAAE,QAAQ,EAAE,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAc7F;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,2DAIC;IAED;;;;;OAKG;IAEH,iEA+FC;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;iBA/VgB,WAAW"}
1
+ {"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AA4BA;;;;GAIG;AACH,wBAHU,OAAO,OAAO,iBAAiB,EAAE,QAAQ,EAAE,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAc7F;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;IAoHlC,2DAIC;IAED;;;;;OAKG;IAEH,iEA+FC;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;iBAnYgB,WAAW"}
@@ -16,7 +16,13 @@ import {
16
16
  import createDomain from "../utils/domainArray.js";
17
17
  import AxisResolution from "./axisResolution.js";
18
18
  import View from "./view.js";
19
- import { createSinglePointSelection } from "../selection/selection.js";
19
+ import {
20
+ createMultiPointSelection,
21
+ createSinglePointSelection,
22
+ isPointSelectionConfig,
23
+ isTogglingEnabledInPointSelectionConfig,
24
+ updateMultiPointSelection,
25
+ } from "../selection/selection.js";
20
26
  import { isString } from "vega-util";
21
27
  import { UNIQUE_ID_KEY } from "../data/transforms/identifier.js";
22
28
 
@@ -102,8 +108,7 @@ export default class UnitView extends View {
102
108
  }
103
109
 
104
110
  const select = param.select;
105
- const type = isString(select) ? select : select.type;
106
- if (type === "point") {
111
+ if (isPointSelectionConfig(select)) {
107
112
  // Handle projection-free point selections
108
113
 
109
114
  const none = -1;
@@ -123,15 +128,46 @@ export default class UnitView extends View {
123
128
  ["mouseover", "pointerover"].includes(on)
124
129
  ? "mousemove"
125
130
  : "click",
126
- (rect, event) => {
131
+ (
132
+ rect,
133
+ /** @type {import("../utils/interactionEvent.js").default} */ event
134
+ ) => {
135
+ const mouseEvent = /** @type {MouseEvent} */ (
136
+ event.uiEvent
137
+ );
127
138
  const datum = getHoveredDatum();
128
139
  const id = datum ? datum[UNIQUE_ID_KEY] : none;
129
- if (id != lastId) {
130
- lastId = id;
131
- const selection = createSinglePointSelection(
132
- getHoveredDatum()
133
- );
134
- setter(selection);
140
+
141
+ if (isTogglingEnabledInPointSelectionConfig(select)) {
142
+ const toggle = mouseEvent.shiftKey;
143
+
144
+ if (toggle) {
145
+ if (datum) {
146
+ const previousSelection =
147
+ this.paramMediator.getValue(name);
148
+ setter(
149
+ updateMultiPointSelection(
150
+ previousSelection,
151
+ {
152
+ toggle: [datum],
153
+ }
154
+ )
155
+ );
156
+ }
157
+ } else {
158
+ setter(
159
+ createMultiPointSelection(
160
+ datum ? [datum] : null
161
+ )
162
+ );
163
+ }
164
+ } else {
165
+ if (id != lastId) {
166
+ lastId = id;
167
+ const selection =
168
+ createSinglePointSelection(datum);
169
+ setter(selection);
170
+ }
135
171
  }
136
172
  }
137
173
  );
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "contributors": [],
9
9
  "license": "MIT",
10
- "version": "0.54.0",
10
+ "version": "0.56.0",
11
11
  "jsdelivr": "dist/bundle/index.js",
12
12
  "unpkg": "dist/bundle/index.js",
13
13
  "browser": "dist/bundle/index.js",
@@ -67,5 +67,5 @@
67
67
  "devDependencies": {
68
68
  "@types/long": "^4.0.1"
69
69
  },
70
- "gitHead": "38fcc65c16a986706fc946c4aae3c5199e02a119"
70
+ "gitHead": "3b83e28aecd08d1362bb373929823dc69cf9b705"
71
71
  }