plotly.js 2.13.1 → 2.14.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/CHANGELOG.md CHANGED
@@ -9,6 +9,32 @@ To see all merged commits on the master branch that will be part of the next plo
9
9
 
10
10
  where X.Y.Z is the semver of most recent plotly.js release.
11
11
 
12
+ ## [2.14.0] -- 2022-08-10
13
+
14
+ ### Added
15
+ - Add support for sankey links with arrows [[#6276](https://github.com/plotly/plotly.js/pull/6276)],
16
+ with thanks to @Andy2003 for the contribution!
17
+ - Add `editSelection` option to config [[#6285](https://github.com/plotly/plotly.js/pull/6285)]
18
+
19
+ ### Changed
20
+ - Update dutch translations and fix dateMonth format for `nl` locale to confirm with expected nl format [[#6261](https://github.com/plotly/plotly.js/pull/6261)],
21
+ with thanks to @eirvandelden for the contribution!
22
+
23
+
24
+ ## [2.13.3] -- 2022-07-25
25
+
26
+ ### Fixed
27
+ - Emit plotly_selected event on plot API calls and GUI edits [[#6277](https://github.com/plotly/plotly.js/pull/6277)]
28
+
29
+
30
+ ## [2.13.2] -- 2022-07-21
31
+
32
+ ### Fixed
33
+ - Fix `sankey` select error (regression introduced in 2.13.0) [[#6265](https://github.com/plotly/plotly.js/pull/6265)]
34
+ - Handle missing drag layer of invisible `sankey` traces to fix select error [[#6267](https://github.com/plotly/plotly.js/pull/6267)]
35
+ - Emit selection event in shape drawing `dragmode`s when an existing selection is modified [[#6262](https://github.com/plotly/plotly.js/pull/6262)]
36
+
37
+
12
38
  ## [2.13.1] -- 2022-07-14
13
39
 
14
40
  ### Fixed
package/README.md CHANGED
@@ -55,7 +55,7 @@ You may also consider using [`plotly.js-dist`](https://www.npmjs.com/package/plo
55
55
 
56
56
  ```html
57
57
  <head>
58
- <script src="https://cdn.plot.ly/plotly-2.13.1.min.js"></script>
58
+ <script src="https://cdn.plot.ly/plotly-2.14.0.min.js"></script>
59
59
  </head>
60
60
  <body>
61
61
  <div id="gd"></div>
@@ -72,7 +72,7 @@ You may also consider using [`plotly.js-dist`](https://www.npmjs.com/package/plo
72
72
  Alternatively you may consider using [native ES6 import](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules) in the script tag.
73
73
  ```html
74
74
  <script type="module">
75
- import "https://cdn.plot.ly/plotly-2.13.1.min.js"
75
+ import "https://cdn.plot.ly/plotly-2.14.0.min.js"
76
76
  Plotly.newPlot("gd", [{ y: [1, 2, 3] }])
77
77
  </script>
78
78
  ```
@@ -82,7 +82,7 @@ Fastly supports Plotly.js with free CDN service. Read more at <https://www.fastl
82
82
  ### Un-minified versions are also available on CDN
83
83
  While non-minified source files may contain characters outside UTF-8, it is recommended that you specify the `charset` when loading those bundles.
84
84
  ```html
85
- <script src="https://cdn.plot.ly/plotly-2.13.1.js" charset="utf-8"></script>
85
+ <script src="https://cdn.plot.ly/plotly-2.14.0.js" charset="utf-8"></script>
86
86
  ```
87
87
 
88
88
  > Please note that as of v2 the "plotly-latest" outputs (e.g. https://cdn.plot.ly/plotly-latest.min.js) will no longer be updated on the CDN, and will stay at the last v1 patch v1.58.5. Therefore, to use the CDN with plotly.js v2 and higher, you must specify an exact plotly.js version.
package/dist/README.md CHANGED
@@ -46,9 +46,9 @@ The main plotly.js bundles weight in at:
46
46
  | 8.4 MB | 3.5 MB | 1 MB | 8.7 MB |
47
47
 
48
48
  #### CDN links
49
- > https://cdn.plot.ly/plotly-2.13.1.js
49
+ > https://cdn.plot.ly/plotly-2.14.0.js
50
50
 
51
- > https://cdn.plot.ly/plotly-2.13.1.min.js
51
+ > https://cdn.plot.ly/plotly-2.14.0.min.js
52
52
 
53
53
 
54
54
  #### npm packages
@@ -91,12 +91,12 @@ The `basic` partial bundle contains trace modules `bar`, `pie` and `scatter`.
91
91
 
92
92
  | Raw size | Minified size | Minified + gzip size |
93
93
  |------|-----------------|------------------------|
94
- | 2.7 MB | 997.9 kB | 324.5 kB |
94
+ | 2.7 MB | 998.4 kB | 324.6 kB |
95
95
 
96
96
  #### CDN links
97
- > https://cdn.plot.ly/plotly-basic-2.13.1.js
97
+ > https://cdn.plot.ly/plotly-basic-2.14.0.js
98
98
 
99
- > https://cdn.plot.ly/plotly-basic-2.13.1.min.js
99
+ > https://cdn.plot.ly/plotly-basic-2.14.0.min.js
100
100
 
101
101
 
102
102
  #### npm packages
@@ -114,12 +114,12 @@ The `cartesian` partial bundle contains trace modules `bar`, `box`, `contour`, `
114
114
 
115
115
  | Raw size | Minified size | Minified + gzip size |
116
116
  |------|-----------------|------------------------|
117
- | 3.4 MB | 1.2 MB | 397.6 kB |
117
+ | 3.4 MB | 1.2 MB | 397.7 kB |
118
118
 
119
119
  #### CDN links
120
- > https://cdn.plot.ly/plotly-cartesian-2.13.1.js
120
+ > https://cdn.plot.ly/plotly-cartesian-2.14.0.js
121
121
 
122
- > https://cdn.plot.ly/plotly-cartesian-2.13.1.min.js
122
+ > https://cdn.plot.ly/plotly-cartesian-2.14.0.min.js
123
123
 
124
124
 
125
125
  #### npm packages
@@ -137,12 +137,12 @@ The `geo` partial bundle contains trace modules `choropleth`, `scatter` and `sca
137
137
 
138
138
  | Raw size | Minified size | Minified + gzip size |
139
139
  |------|-----------------|------------------------|
140
- | 3.1 MB | 1.1 MB | 367.2 kB |
140
+ | 3.1 MB | 1.1 MB | 367.3 kB |
141
141
 
142
142
  #### CDN links
143
- > https://cdn.plot.ly/plotly-geo-2.13.1.js
143
+ > https://cdn.plot.ly/plotly-geo-2.14.0.js
144
144
 
145
- > https://cdn.plot.ly/plotly-geo-2.13.1.min.js
145
+ > https://cdn.plot.ly/plotly-geo-2.14.0.min.js
146
146
 
147
147
 
148
148
  #### npm packages
@@ -160,12 +160,12 @@ The `gl3d` partial bundle contains trace modules `cone`, `isosurface`, `mesh3d`,
160
160
 
161
161
  | Raw size | Minified size | Minified + gzip size |
162
162
  |------|-----------------|------------------------|
163
- | 3.9 MB | 1.5 MB | 488.2 kB |
163
+ | 3.9 MB | 1.5 MB | 488.4 kB |
164
164
 
165
165
  #### CDN links
166
- > https://cdn.plot.ly/plotly-gl3d-2.13.1.js
166
+ > https://cdn.plot.ly/plotly-gl3d-2.14.0.js
167
167
 
168
- > https://cdn.plot.ly/plotly-gl3d-2.13.1.min.js
168
+ > https://cdn.plot.ly/plotly-gl3d-2.14.0.min.js
169
169
 
170
170
 
171
171
  #### npm packages
@@ -183,12 +183,12 @@ The `gl2d` partial bundle contains trace modules `heatmapgl`, `parcoords`, `poin
183
183
 
184
184
  | Raw size | Minified size | Minified + gzip size |
185
185
  |------|-----------------|------------------------|
186
- | 4.4 MB | 1.8 MB | 580.5 kB |
186
+ | 4.4 MB | 1.8 MB | 580.6 kB |
187
187
 
188
188
  #### CDN links
189
- > https://cdn.plot.ly/plotly-gl2d-2.13.1.js
189
+ > https://cdn.plot.ly/plotly-gl2d-2.14.0.js
190
190
 
191
- > https://cdn.plot.ly/plotly-gl2d-2.13.1.min.js
191
+ > https://cdn.plot.ly/plotly-gl2d-2.14.0.min.js
192
192
 
193
193
 
194
194
  #### npm packages
@@ -206,12 +206,12 @@ The `mapbox` partial bundle contains trace modules `choroplethmapbox`, `densitym
206
206
 
207
207
  | Raw size | Minified size | Minified + gzip size |
208
208
  |------|-----------------|------------------------|
209
- | 4.4 MB | 1.7 MB | 521.4 kB |
209
+ | 4.4 MB | 1.7 MB | 521.5 kB |
210
210
 
211
211
  #### CDN links
212
- > https://cdn.plot.ly/plotly-mapbox-2.13.1.js
212
+ > https://cdn.plot.ly/plotly-mapbox-2.14.0.js
213
213
 
214
- > https://cdn.plot.ly/plotly-mapbox-2.13.1.min.js
214
+ > https://cdn.plot.ly/plotly-mapbox-2.14.0.min.js
215
215
 
216
216
 
217
217
  #### npm packages
@@ -229,12 +229,12 @@ The `finance` partial bundle contains trace modules `bar`, `candlestick`, `funne
229
229
 
230
230
  | Raw size | Minified size | Minified + gzip size |
231
231
  |------|-----------------|------------------------|
232
- | 3 MB | 1.1 MB | 357.2 kB |
232
+ | 3 MB | 1.1 MB | 357.3 kB |
233
233
 
234
234
  #### CDN links
235
- > https://cdn.plot.ly/plotly-finance-2.13.1.js
235
+ > https://cdn.plot.ly/plotly-finance-2.14.0.js
236
236
 
237
- > https://cdn.plot.ly/plotly-finance-2.13.1.min.js
237
+ > https://cdn.plot.ly/plotly-finance-2.14.0.min.js
238
238
 
239
239
 
240
240
  #### npm packages
@@ -252,12 +252,12 @@ The `strict` partial bundle contains trace modules `bar`, `barpolar`, `box`, `ca
252
252
 
253
253
  | Raw size | Minified size | Minified + gzip size |
254
254
  |------|-----------------|------------------------|
255
- | 8.8 MB | 3.8 MB | 1.1 MB |
255
+ | 8.8 MB | 3.9 MB | 1.1 MB |
256
256
 
257
257
  #### CDN links
258
- > https://cdn.plot.ly/plotly-strict-2.13.1.js
258
+ > https://cdn.plot.ly/plotly-strict-2.14.0.js
259
259
 
260
- > https://cdn.plot.ly/plotly-strict-2.13.1.min.js
260
+ > https://cdn.plot.ly/plotly-strict-2.14.0.min.js
261
261
 
262
262
 
263
263
  #### npm packages
@@ -199,6 +199,11 @@
199
199
  "valType": "boolean"
200
200
  }
201
201
  },
202
+ "editSelection": {
203
+ "description": "Enables moving selections.",
204
+ "dflt": true,
205
+ "valType": "boolean"
206
+ },
202
207
  "fillFrame": {
203
208
  "description": "When `layout.autosize` is turned on, determines whether the graph fills the container (the default) or the screen (if set to *true*).",
204
209
  "dflt": false,
@@ -42051,6 +42056,13 @@
42051
42056
  "valType": "number"
42052
42057
  },
42053
42058
  "link": {
42059
+ "arrowlen": {
42060
+ "description": "Sets the length (in px) of the links arrow, if 0 no arrow will be drawn.",
42061
+ "dflt": 0,
42062
+ "editType": "calc",
42063
+ "min": 0,
42064
+ "valType": "number"
42065
+ },
42054
42066
  "color": {
42055
42067
  "arrayOk": true,
42056
42068
  "description": "Sets the `link` color. It can be a single value, or an array for specifying color for each `link`. If `link.color` is omitted, then by default, a translucent grey link will be used.",
@@ -1,5 +1,5 @@
1
1
  /**
2
- * plotly.js (basic) v2.13.1
2
+ * plotly.js (basic) v2.14.0
3
3
  * Copyright 2012-2022, Plotly, Inc.
4
4
  * All rights reserved.
5
5
  * Licensed under the MIT license
@@ -36135,6 +36135,10 @@ function draw(gd) {
36135
36135
  }
36136
36136
  }
36137
36137
 
36138
+ function couldHaveActiveSelection(gd) {
36139
+ return gd._context.editSelection;
36140
+ }
36141
+
36138
36142
  function drawOne(gd, index) {
36139
36143
  // remove the existing selection if there is one.
36140
36144
  // because indices can change, we need to look in all selection layers
@@ -36171,7 +36175,7 @@ function drawOne(gd, index) {
36171
36175
  lineDash = 'solid';
36172
36176
  }
36173
36177
 
36174
- var isActiveSelection =
36178
+ var isActiveSelection = couldHaveActiveSelection(gd) &&
36175
36179
  gd._fullLayout._activeSelectionIndex === index;
36176
36180
 
36177
36181
  if(isActiveSelection) {
@@ -36238,6 +36242,8 @@ function setClipPath(selectionPath, gd, selectionOptions) {
36238
36242
 
36239
36243
 
36240
36244
  function activateSelection(gd, path) {
36245
+ if(!couldHaveActiveSelection(gd)) return;
36246
+
36241
36247
  var element = path.node();
36242
36248
  var id = +element.getAttribute('data-index');
36243
36249
  if(id >= 0) {
@@ -36254,6 +36260,8 @@ function activateSelection(gd, path) {
36254
36260
  }
36255
36261
 
36256
36262
  function activateLastSelection(gd) {
36263
+ if(!couldHaveActiveSelection(gd)) return;
36264
+
36257
36265
  var id = gd._fullLayout.selections.length - 1;
36258
36266
  gd._fullLayout._activeSelectionIndex = id;
36259
36267
  gd._fullLayout._deactivateSelection = deactivateSelection;
@@ -36261,6 +36269,8 @@ function activateLastSelection(gd) {
36261
36269
  }
36262
36270
 
36263
36271
  function deactivateSelection(gd) {
36272
+ if(!couldHaveActiveSelection(gd)) return;
36273
+
36264
36274
  var id = gd._fullLayout._activeSelectionIndex;
36265
36275
  if(id >= 0) {
36266
36276
  clearOutlineControllers(gd);
@@ -36592,7 +36602,14 @@ var p2r = helpers.p2r;
36592
36602
  var axValue = helpers.axValue;
36593
36603
  var getTransform = helpers.getTransform;
36594
36604
 
36605
+ function hasSubplot(dragOptions) {
36606
+ // N.B. subplot may be falsy e.g zero sankey index!
36607
+ return dragOptions.subplot !== undefined;
36608
+ }
36609
+
36595
36610
  function prepSelect(evt, startX, startY, dragOptions, mode) {
36611
+ var isCartesian = !hasSubplot(dragOptions);
36612
+
36596
36613
  var isFreeMode = freeMode(mode);
36597
36614
  var isRectMode = rectMode(mode);
36598
36615
  var isOpenMode = openMode(mode);
@@ -36606,7 +36623,7 @@ function prepSelect(evt, startX, startY, dragOptions, mode) {
36606
36623
  var gd = dragOptions.gd;
36607
36624
  var fullLayout = gd._fullLayout;
36608
36625
  var immediateSelect = isSelectMode && fullLayout.newselection.mode === 'immediate' &&
36609
- !dragOptions.subplot; // N.B. only cartesian subplots have persistent selection
36626
+ isCartesian; // N.B. only cartesian subplots have persistent selection
36610
36627
 
36611
36628
  var zoomLayer = fullLayout._zoomlayer;
36612
36629
  var dragBBox = dragOptions.element.getBoundingClientRect();
@@ -36654,9 +36671,9 @@ function prepSelect(evt, startX, startY, dragOptions, mode) {
36654
36671
  opacity: isDrawMode ? newStyle.opacity / 2 : 1,
36655
36672
  fill: (isDrawMode && !isOpenMode) ? newStyle.fillcolor : 'none',
36656
36673
  stroke: newStyle.line.color || (
36657
- dragOptions.subplot !== undefined ?
36658
- '#7f7f7f' : // non-cartesian subplot
36659
- Color.contrast(gd._fullLayout.plot_bgcolor) // cartesian subplot
36674
+ isCartesian ?
36675
+ Color.contrast(gd._fullLayout.plot_bgcolor) :
36676
+ '#7f7f7f' // non-cartesian subplot
36660
36677
  ),
36661
36678
  'stroke-dasharray': dashStyle(newStyle.line.dash, newStyle.line.width),
36662
36679
  'stroke-width': newStyle.line.width + 'px',
@@ -36687,6 +36704,8 @@ function prepSelect(evt, startX, startY, dragOptions, mode) {
36687
36704
 
36688
36705
  if(immediateSelect && !evt.shiftKey) {
36689
36706
  dragOptions._clearSubplotSelections = function() {
36707
+ if(!isCartesian) return;
36708
+
36690
36709
  var xRef = xAxis._id;
36691
36710
  var yRef = yAxis._id;
36692
36711
  deselectSubplot(gd, xRef, yRef, searchTraces);
@@ -36707,6 +36726,8 @@ function prepSelect(evt, startX, startY, dragOptions, mode) {
36707
36726
  }
36708
36727
 
36709
36728
  if(selectionErased) {
36729
+ gd._fullLayout._noEmitSelectedAtStart = true;
36730
+
36710
36731
  Registry.call('_guiRelayout', gd, {
36711
36732
  selections: list
36712
36733
  });
@@ -36848,10 +36869,10 @@ function prepSelect(evt, startX, startY, dragOptions, mode) {
36848
36869
  displayOutlines(convertPoly(mergedPolygons, isOpenMode), outlines, dragOptions);
36849
36870
 
36850
36871
  if(isSelectMode) {
36851
- var _res = reselect(gd);
36872
+ var _res = reselect(gd, false);
36852
36873
  var extraPoints = _res.eventData ? _res.eventData.points.slice() : [];
36853
36874
 
36854
- _res = reselect(gd, selectionTesters, searchTraces, dragOptions);
36875
+ _res = reselect(gd, false, selectionTesters, searchTraces, dragOptions);
36855
36876
  selectionTesters = _res.selectionTesters;
36856
36877
  eventData = _res.eventData;
36857
36878
 
@@ -36945,9 +36966,13 @@ function prepSelect(evt, startX, startY, dragOptions, mode) {
36945
36966
  }
36946
36967
  }
36947
36968
 
36948
- Registry.call('_guiRelayout', gd, {
36949
- selections: subSelections
36950
- });
36969
+ if(subSelections.length < allSelections.length) {
36970
+ gd._fullLayout._noEmitSelectedAtStart = true;
36971
+
36972
+ Registry.call('_guiRelayout', gd, {
36973
+ selections: subSelections
36974
+ });
36975
+ }
36951
36976
  }
36952
36977
  }
36953
36978
  } else {
@@ -36993,7 +37018,9 @@ function prepSelect(evt, startX, startY, dragOptions, mode) {
36993
37018
  dragOptions.doneFnCompleted(selection);
36994
37019
  }
36995
37020
 
36996
- emitSelected(gd, eventData);
37021
+ if(isSelectMode) {
37022
+ emitSelected(gd, eventData);
37023
+ }
36997
37024
  }).catch(Lib.error);
36998
37025
  };
36999
37026
  }
@@ -37215,15 +37242,23 @@ function coerceSelectionsCache(evt, gd, dragOptions) {
37215
37242
  }
37216
37243
  }
37217
37244
 
37245
+ function hasActiveShape(gd) {
37246
+ return gd._fullLayout._activeShapeIndex >= 0;
37247
+ }
37248
+
37249
+ function hasActiveSelection(gd) {
37250
+ return gd._fullLayout._activeSelectionIndex >= 0;
37251
+ }
37252
+
37218
37253
  function clearSelectionsCache(dragOptions, immediateSelect) {
37219
37254
  var dragmode = dragOptions.dragmode;
37220
37255
  var plotinfo = dragOptions.plotinfo;
37221
37256
 
37222
37257
  var gd = dragOptions.gd;
37223
- if(gd._fullLayout._activeShapeIndex >= 0) {
37258
+ if(hasActiveShape(gd)) {
37224
37259
  gd._fullLayout._deactivateShape(gd);
37225
37260
  }
37226
- if(gd._fullLayout._activeSelectionIndex >= 0) {
37261
+ if(hasActiveSelection(gd)) {
37227
37262
  gd._fullLayout._deactivateSelection(gd);
37228
37263
  }
37229
37264
 
@@ -37251,11 +37286,13 @@ function clearSelectionsCache(dragOptions, immediateSelect) {
37251
37286
  var selections;
37252
37287
  if(
37253
37288
  isSelectMode &&
37254
- !dragOptions.subplot // only allow cartesian - no mapbox for now
37289
+ !hasSubplot(dragOptions) // only allow cartesian - no mapbox for now
37255
37290
  ) {
37256
37291
  selections = newSelections(outlines, dragOptions);
37257
37292
  }
37258
37293
  if(selections) {
37294
+ gd._fullLayout._noEmitSelectedAtStart = true;
37295
+
37259
37296
  Registry.call('_guiRelayout', gd, {
37260
37297
  selections: selections
37261
37298
  }).then(function() {
@@ -37290,7 +37327,10 @@ function determineSearchTraces(gd, xAxes, yAxes, subplot) {
37290
37327
 
37291
37328
  if(trace.visible !== true || !trace._module || !trace._module.selectPoints) continue;
37292
37329
 
37293
- if(subplot && (trace.subplot === subplot || trace.geo === subplot)) {
37330
+ if(
37331
+ hasSubplot({subplot: subplot}) &&
37332
+ (trace.subplot === subplot || trace.geo === subplot)
37333
+ ) {
37294
37334
  searchTraces.push(createSearchInfo(trace._module, cd, xAxes[0], yAxes[0]));
37295
37335
  } else if(trace.type === 'splom') {
37296
37336
  // FIXME: make sure we don't have more than single axis for splom
@@ -37590,7 +37630,7 @@ function _doSelect(selectionTesters, searchTraces) {
37590
37630
  return allSelections;
37591
37631
  }
37592
37632
 
37593
- function reselect(gd, selectionTesters, searchTraces, dragOptions) {
37633
+ function reselect(gd, mayEmitSelected, selectionTesters, searchTraces, dragOptions) {
37594
37634
  var hadSearchTraces = !!searchTraces;
37595
37635
  var plotinfo, xRef, yRef;
37596
37636
  if(dragOptions) {
@@ -37713,15 +37753,15 @@ function reselect(gd, selectionTesters, searchTraces, dragOptions) {
37713
37753
  updateSelectedState(gd, allSearchTraces, eventData);
37714
37754
 
37715
37755
  var clickmode = fullLayout.clickmode;
37716
- var sendEvents = clickmode.indexOf('event') > -1;
37756
+ var sendEvents = clickmode.indexOf('event') > -1 && mayEmitSelected;
37717
37757
 
37718
37758
  if(
37719
37759
  !plotinfo && // get called from plot_api & plots
37720
- fullLayout._reselect
37760
+ mayEmitSelected
37721
37761
  ) {
37722
- if(sendEvents) {
37723
- var activePolygons = getLayoutPolygons(gd, true);
37762
+ var activePolygons = getLayoutPolygons(gd, true);
37724
37763
 
37764
+ if(activePolygons.length) {
37725
37765
  var xref = activePolygons[0].xref;
37726
37766
  var yref = activePolygons[0].yref;
37727
37767
  if(xref && yref) {
@@ -37734,8 +37774,12 @@ function reselect(gd, selectionTesters, searchTraces, dragOptions) {
37734
37774
 
37735
37775
  fillRangeItems(eventData, poly);
37736
37776
  }
37777
+ }
37737
37778
 
37738
- emitSelected(gd, eventData);
37779
+ if(gd._fullLayout._noEmitSelectedAtStart) {
37780
+ gd._fullLayout._noEmitSelectedAtStart = false;
37781
+ } else {
37782
+ if(sendEvents) emitSelected(gd, eventData);
37739
37783
  }
37740
37784
 
37741
37785
  fullLayout._reselect = false;
@@ -37757,7 +37801,7 @@ function reselect(gd, selectionTesters, searchTraces, dragOptions) {
37757
37801
  if(eventData.points.length) {
37758
37802
  emitSelected(gd, eventData);
37759
37803
  } else {
37760
- gd.emit('plotly_deselect', null);
37804
+ emitDeselect(gd);
37761
37805
  }
37762
37806
  }
37763
37807
 
@@ -38045,13 +38089,10 @@ function getFillRangeItems(dragOptions) {
38045
38089
  }
38046
38090
 
38047
38091
  function emitSelecting(gd, eventData) {
38048
- if(drawMode(gd._fullLayout.dragmode)) return;
38049
38092
  gd.emit('plotly_selecting', eventData);
38050
38093
  }
38051
38094
 
38052
38095
  function emitSelected(gd, eventData) {
38053
- if(drawMode(gd._fullLayout.dragmode)) return;
38054
-
38055
38096
  if(eventData) {
38056
38097
  eventData.selections = (gd.layout || {}).selections || [];
38057
38098
  }
@@ -38060,7 +38101,6 @@ function emitSelected(gd, eventData) {
38060
38101
  }
38061
38102
 
38062
38103
  function emitDeselect(gd) {
38063
- if(drawMode(gd._fullLayout.dragmode)) return;
38064
38104
  gd.emit('plotly_deselect', null);
38065
38105
  }
38066
38106
 
@@ -55505,6 +55545,11 @@ var configAttributes = {
55505
55545
  }
55506
55546
  },
55507
55547
 
55548
+ editSelection: {
55549
+ valType: 'boolean',
55550
+ dflt: true,
55551
+ },
55552
+
55508
55553
  autosizable: {
55509
55554
  valType: 'boolean',
55510
55555
  dflt: false,
@@ -74508,7 +74553,16 @@ plots.redrag = function(gd) {
74508
74553
  };
74509
74554
 
74510
74555
  plots.reselect = function(gd) {
74511
- Registry.getComponentMethod('selections', 'reselect')(gd);
74556
+ var fullLayout = gd._fullLayout;
74557
+
74558
+ var A = (gd.layout || {}).selections;
74559
+ var B = fullLayout._previousSelections;
74560
+ fullLayout._previousSelections = A;
74561
+
74562
+ var mayEmitSelected = fullLayout._reselect ||
74563
+ JSON.stringify(A) !== JSON.stringify(B);
74564
+
74565
+ Registry.getComponentMethod('selections', 'reselect')(gd, mayEmitSelected);
74512
74566
  };
74513
74567
 
74514
74568
  plots.generalUpdatePerTraceModule = function(gd, subplot, subplotCalcData, subplotLayout) {
@@ -84670,7 +84724,7 @@ function getSortFunc(opts, d2c) {
84670
84724
  'use strict';
84671
84725
 
84672
84726
  // package version injected by `npm run preprocess`
84673
- exports.version = '2.13.1';
84727
+ exports.version = '2.14.0';
84674
84728
 
84675
84729
  },{}]},{},[8])(8)
84676
84730
  });