plotly.js 2.16.2 → 2.16.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "plotly.js",
3
- "version": "2.16.2",
3
+ "version": "2.16.4",
4
4
  "description": "The open source javascript graphing library that powers plotly",
5
5
  "license": "MIT",
6
6
  "main": "./lib/index.js",
@@ -17,7 +17,7 @@ module.exports = {
17
17
  calc: require('./calc'),
18
18
 
19
19
  // ./scales.js is required in lib/coerce.js ;
20
- // it needs to be a separate module to avoid circular a dependency
20
+ // it needs to be a separate module to avoid a circular dependency
21
21
  scales: scales.scales,
22
22
  defaultScale: scales.defaultScale,
23
23
  getScale: scales.get,
@@ -888,7 +888,17 @@ function createHoverText(hoverData, opts) {
888
888
  var xa = c0.xa;
889
889
  var ya = c0.ya;
890
890
  var axLetter = hovermode.charAt(0);
891
- var t0 = c0[axLetter + 'Label'];
891
+ var axLabel = axLetter + 'Label';
892
+ var t0 = c0[axLabel];
893
+
894
+ // search in array for the label
895
+ if(t0 === undefined && xa.type === 'multicategory') {
896
+ for(var q = 0; q < hoverData.length; q++) {
897
+ t0 = hoverData[q][axLabel];
898
+ if(t0 !== undefined) break;
899
+ }
900
+ }
901
+
892
902
  var outerContainerBB = getBoundingClientRect(gd, outerContainer);
893
903
  var outerTop = outerContainerBB.top;
894
904
  var outerWidth = outerContainerBB.width;
@@ -2067,7 +2077,7 @@ function getCoord(axLetter, winningPoint, fullLayout) {
2067
2077
 
2068
2078
  var cd0 = winningPoint.cd[0];
2069
2079
 
2070
- if(ax.type === 'category') val = ax._categoriesMap[val];
2080
+ if(ax.type === 'category' || ax.type === 'multicategory') val = ax._categoriesMap[val];
2071
2081
  else if(ax.type === 'date') {
2072
2082
  var periodalignment = winningPoint.trace[axLetter + 'periodalignment'];
2073
2083
  if(periodalignment) {
@@ -8,11 +8,12 @@ var ORDER = {
8
8
  nonCluster: ['fill', 'line', 'circle', 'symbol'],
9
9
  };
10
10
 
11
- function ScatterMapbox(subplot, uid, clusterEnabled) {
11
+ function ScatterMapbox(subplot, uid, clusterEnabled, isHidden) {
12
12
  this.type = 'scattermapbox';
13
13
  this.subplot = subplot;
14
14
  this.uid = uid;
15
15
  this.clusterEnabled = clusterEnabled;
16
+ this.isHidden = isHidden;
16
17
 
17
18
  this.sourceIds = {
18
19
  fill: 'source-' + uid + '-fill',
@@ -85,51 +86,96 @@ proto.update = function update(calcTrace) {
85
86
  var map = subplot.map;
86
87
  var optsAll = convert(subplot.gd, calcTrace);
87
88
  var below = subplot.belowLookup['trace-' + this.uid];
88
- var i, k, opts;
89
89
  var hasCluster = !!(trace.cluster && trace.cluster.enabled);
90
90
  var hadCluster = !!this.clusterEnabled;
91
-
92
- if(below !== this.below) {
93
- var order = ORDER.nonCluster;
94
-
95
- for(i = order.length - 1; i >= 0; i--) {
96
- k = order[i];
97
- map.removeLayer(this.layerIds[k]);
91
+ var lThis = this;
92
+
93
+ function addCluster(noSource) {
94
+ if(!noSource) lThis.addSource('circle', optsAll.circle, trace.cluster);
95
+ var order = ORDER.cluster;
96
+ for(var i = 0; i < order.length; i++) {
97
+ var k = order[i];
98
+ var opts = optsAll[k];
99
+ lThis.addLayer(k, opts, below);
98
100
  }
99
- for(i = 0; i < order.length; i++) {
100
- k = order[i];
101
- opts = optsAll[k];
102
- this.addLayer(k, opts, below);
103
- }
104
- this.below = below;
105
- } else if(hasCluster && !hadCluster) {
106
- for(i = ORDER.nonCluster.length - 1; i >= 0; i--) {
107
- k = ORDER.nonCluster[i];
108
- map.removeLayer(this.layerIds[k]);
109
- map.removeSource(this.sourceIds[k]);
101
+ }
102
+
103
+ function removeCluster(noSource) {
104
+ var order = ORDER.cluster;
105
+ for(var i = order.length - 1; i >= 0; i--) {
106
+ var k = order[i];
107
+ map.removeLayer(lThis.layerIds[k]);
110
108
  }
111
- this.addSource('circle', optsAll.circle, trace.cluster);
112
- for(i = 0; i < ORDER.cluster.length; i++) {
113
- k = ORDER.cluster[i];
114
- opts = optsAll[k];
115
- this.addLayer(k, opts, below);
109
+ if(!noSource) map.removeSource(lThis.sourceIds.circle);
110
+ }
111
+
112
+ function addNonCluster(noSource) {
113
+ var order = ORDER.nonCluster;
114
+ for(var i = 0; i < order.length; i++) {
115
+ var k = order[i];
116
+ var opts = optsAll[k];
117
+ if(!noSource) lThis.addSource(k, opts);
118
+ lThis.addLayer(k, opts, below);
116
119
  }
117
- this.clusterEnabled = hasCluster;
118
- } else if(!hasCluster && hadCluster) {
119
- for(i = 0; i < ORDER.cluster.length; i++) {
120
- k = ORDER.cluster[i];
121
- map.removeLayer(this.layerIds[k]);
120
+ }
121
+
122
+ function removeNonCluster(noSource) {
123
+ var order = ORDER.nonCluster;
124
+ for(var i = order.length - 1; i >= 0; i--) {
125
+ var k = order[i];
126
+ map.removeLayer(lThis.layerIds[k]);
127
+ if(!noSource) map.removeSource(lThis.sourceIds[k]);
122
128
  }
123
- map.removeSource(this.sourceIds.circle);
124
- for(i = 0; i < ORDER.nonCluster.length; i++) {
125
- k = ORDER.nonCluster[i];
126
- opts = optsAll[k];
127
- this.addSource(k, opts, trace.cluster);
128
- this.addLayer(k, opts, below);
129
+ }
130
+
131
+ function remove(noSource) {
132
+ if(hadCluster) removeCluster(noSource); else removeNonCluster(noSource);
133
+ }
134
+
135
+ function add(noSource) {
136
+ if(hasCluster) addCluster(noSource); else addNonCluster(noSource);
137
+ }
138
+
139
+ function repaint() {
140
+ var order = hasCluster ? ORDER.cluster : ORDER.nonCluster;
141
+ for(var i = 0; i < order.length; i++) {
142
+ var k = order[i];
143
+ var opts = optsAll[k];
144
+ if(!opts) continue;
145
+
146
+ subplot.setOptions(lThis.layerIds[k], 'setLayoutProperty', opts.layout);
147
+
148
+ if(opts.layout.visibility === 'visible') {
149
+ if(k !== 'cluster') {
150
+ lThis.setSourceData(k, opts);
151
+ }
152
+ subplot.setOptions(lThis.layerIds[k], 'setPaintProperty', opts.paint);
153
+ }
129
154
  }
130
- this.clusterEnabled = hasCluster;
131
155
  }
132
156
 
157
+ var wasHidden = this.isHidden;
158
+ var isHidden = trace.visible !== true;
159
+
160
+ if(isHidden) {
161
+ if(!wasHidden) remove();
162
+ } else if(wasHidden) {
163
+ if(!isHidden) add();
164
+ } else if(hadCluster !== hasCluster) {
165
+ remove();
166
+ add();
167
+ } else if(this.below !== below) {
168
+ remove(true);
169
+ add(true);
170
+ repaint();
171
+ } else {
172
+ repaint();
173
+ }
174
+
175
+ this.clusterEnabled = hasCluster;
176
+ this.isHidden = isHidden;
177
+ this.below = below;
178
+
133
179
  // link ref for quick update during selections
134
180
  calcTrace[0].trace._glTrace = this;
135
181
  };
@@ -147,10 +193,13 @@ proto.dispose = function dispose() {
147
193
  module.exports = function createScatterMapbox(subplot, calcTrace) {
148
194
  var trace = calcTrace[0].trace;
149
195
  var hasCluster = trace.cluster && trace.cluster.enabled;
196
+ var isHidden = trace.visible !== true;
197
+
150
198
  var scatterMapbox = new ScatterMapbox(
151
199
  subplot,
152
200
  trace.uid,
153
- hasCluster
201
+ hasCluster,
202
+ isHidden
154
203
  );
155
204
 
156
205
  var optsAll = convert(subplot.gd, calcTrace);
package/src/version.js CHANGED
@@ -1,4 +1,4 @@
1
1
  'use strict';
2
2
 
3
3
  // package version injected by `npm run preprocess`
4
- exports.version = '2.16.2';
4
+ exports.version = '2.16.4';