govuk_publishing_components 30.2.0 → 30.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (23) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/govuk_publishing_components/analytics/page-content.js +8 -0
  3. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-event-tracker.js +6 -6
  4. data/app/assets/javascripts/govuk_publishing_components/analytics-ga4/ga4-link-tracker.js +23 -5
  5. data/app/assets/javascripts/govuk_publishing_components/components/checkboxes.js +0 -22
  6. data/app/assets/stylesheets/component_guide/application.scss +4 -0
  7. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-footer.scss +7 -0
  8. data/app/assets/stylesheets/govuk_publishing_components/components/_layout-super-navigation-header.scss +1 -1
  9. data/app/models/govuk_publishing_components/component_example.rb +3 -2
  10. data/app/views/govuk_publishing_components/component_guide/show.html.erb +26 -2
  11. data/app/views/govuk_publishing_components/components/_checkboxes.html.erb +2 -3
  12. data/app/views/govuk_publishing_components/components/docs/textarea.yml +7 -0
  13. data/config/locales/en.yml +4 -0
  14. data/lib/govuk_publishing_components/presenters/checkboxes_helper.rb +2 -4
  15. data/lib/govuk_publishing_components/version.rb +1 -1
  16. data/node_modules/sortablejs/README.md +828 -815
  17. data/node_modules/sortablejs/Sortable.js +186 -113
  18. data/node_modules/sortablejs/Sortable.min.js +2 -2
  19. data/node_modules/sortablejs/modular/sortable.complete.esm.js +184 -111
  20. data/node_modules/sortablejs/modular/sortable.core.esm.js +184 -111
  21. data/node_modules/sortablejs/modular/sortable.esm.js +184 -111
  22. data/node_modules/sortablejs/package.json +3 -3
  23. metadata +17 -3
@@ -1,10 +1,50 @@
1
1
  /**!
2
- * Sortable 1.13.0
2
+ * Sortable 1.15.0
3
3
  * @author RubaXa <trash@rubaxa.org>
4
4
  * @author owenm <owen23355@gmail.com>
5
5
  * @license MIT
6
6
  */
7
+ function ownKeys(object, enumerableOnly) {
8
+ var keys = Object.keys(object);
9
+
10
+ if (Object.getOwnPropertySymbols) {
11
+ var symbols = Object.getOwnPropertySymbols(object);
12
+
13
+ if (enumerableOnly) {
14
+ symbols = symbols.filter(function (sym) {
15
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
16
+ });
17
+ }
18
+
19
+ keys.push.apply(keys, symbols);
20
+ }
21
+
22
+ return keys;
23
+ }
24
+
25
+ function _objectSpread2(target) {
26
+ for (var i = 1; i < arguments.length; i++) {
27
+ var source = arguments[i] != null ? arguments[i] : {};
28
+
29
+ if (i % 2) {
30
+ ownKeys(Object(source), true).forEach(function (key) {
31
+ _defineProperty(target, key, source[key]);
32
+ });
33
+ } else if (Object.getOwnPropertyDescriptors) {
34
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
35
+ } else {
36
+ ownKeys(Object(source)).forEach(function (key) {
37
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
38
+ });
39
+ }
40
+ }
41
+
42
+ return target;
43
+ }
44
+
7
45
  function _typeof(obj) {
46
+ "@babel/helpers - typeof";
47
+
8
48
  if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
9
49
  _typeof = function (obj) {
10
50
  return typeof obj;
@@ -51,25 +91,6 @@ function _extends() {
51
91
  return _extends.apply(this, arguments);
52
92
  }
53
93
 
54
- function _objectSpread(target) {
55
- for (var i = 1; i < arguments.length; i++) {
56
- var source = arguments[i] != null ? arguments[i] : {};
57
- var ownKeys = Object.keys(source);
58
-
59
- if (typeof Object.getOwnPropertySymbols === 'function') {
60
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
61
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
62
- }));
63
- }
64
-
65
- ownKeys.forEach(function (key) {
66
- _defineProperty(target, key, source[key]);
67
- });
68
- }
69
-
70
- return target;
71
- }
72
-
73
94
  function _objectWithoutPropertiesLoose(source, excluded) {
74
95
  if (source == null) return {};
75
96
  var target = {};
@@ -107,32 +128,43 @@ function _objectWithoutProperties(source, excluded) {
107
128
  }
108
129
 
109
130
  function _toConsumableArray(arr) {
110
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
131
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
111
132
  }
112
133
 
113
134
  function _arrayWithoutHoles(arr) {
114
- if (Array.isArray(arr)) {
115
- for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
116
-
117
- return arr2;
118
- }
135
+ if (Array.isArray(arr)) return _arrayLikeToArray(arr);
119
136
  }
120
137
 
121
138
  function _iterableToArray(iter) {
122
- if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
139
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
140
+ }
141
+
142
+ function _unsupportedIterableToArray(o, minLen) {
143
+ if (!o) return;
144
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
145
+ var n = Object.prototype.toString.call(o).slice(8, -1);
146
+ if (n === "Object" && o.constructor) n = o.constructor.name;
147
+ if (n === "Map" || n === "Set") return Array.from(o);
148
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
149
+ }
150
+
151
+ function _arrayLikeToArray(arr, len) {
152
+ if (len == null || len > arr.length) len = arr.length;
153
+
154
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
155
+
156
+ return arr2;
123
157
  }
124
158
 
125
159
  function _nonIterableSpread() {
126
- throw new TypeError("Invalid attempt to spread non-iterable instance");
160
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
127
161
  }
128
162
 
129
- var version = "1.13.0";
163
+ var version = "1.15.0";
130
164
 
131
165
  function userAgent(pattern) {
132
166
  if (typeof window !== 'undefined' && window.navigator) {
133
- return !!
134
- /*@__PURE__*/
135
- navigator.userAgent.match(pattern);
167
+ return !! /*@__PURE__*/navigator.userAgent.match(pattern);
136
168
  }
137
169
  }
138
170
 
@@ -413,13 +445,13 @@ function isScrolledPast(el, elSide, parentSide) {
413
445
  */
414
446
 
415
447
 
416
- function getChild(el, childNum, options) {
448
+ function getChild(el, childNum, options, includeDragEl) {
417
449
  var currentChild = 0,
418
450
  i = 0,
419
451
  children = el.children;
420
452
 
421
453
  while (i < children.length) {
422
- if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && children[i] !== Sortable.dragged && closest(children[i], options.draggable, el, false)) {
454
+ if (children[i].style.display !== 'none' && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) {
423
455
  if (currentChild === childNum) {
424
456
  return children[i];
425
457
  }
@@ -637,7 +669,7 @@ function AnimationStateManager() {
637
669
  rect: getRect(child)
638
670
  });
639
671
 
640
- var fromRect = _objectSpread({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation
672
+ var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); // If animating: compensate for current animation
641
673
 
642
674
 
643
675
  if (child.thisAnimationDuration) {
@@ -807,7 +839,7 @@ var PluginManager = {
807
839
  if (!sortable[plugin.pluginName]) return; // Fire global events if it exists in this sortable
808
840
 
809
841
  if (sortable[plugin.pluginName][eventNameGlobal]) {
810
- sortable[plugin.pluginName][eventNameGlobal](_objectSpread({
842
+ sortable[plugin.pluginName][eventNameGlobal](_objectSpread2({
811
843
  sortable: sortable
812
844
  }, evt));
813
845
  } // Only fire plugin event if plugin is enabled in this sortable,
@@ -815,7 +847,7 @@ var PluginManager = {
815
847
 
816
848
 
817
849
  if (sortable.options[plugin.pluginName] && sortable[plugin.pluginName][eventName]) {
818
- sortable[plugin.pluginName][eventName](_objectSpread({
850
+ sortable[plugin.pluginName][eventName](_objectSpread2({
819
851
  sortable: sortable
820
852
  }, evt));
821
853
  }
@@ -907,7 +939,7 @@ function dispatchEvent(_ref) {
907
939
  evt.originalEvent = originalEvent;
908
940
  evt.pullMode = putSortable ? putSortable.lastPutMode : undefined;
909
941
 
910
- var allEventProperties = _objectSpread({}, extraEventProperties, PluginManager.getEventProperties(name, sortable));
942
+ var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name, sortable));
911
943
 
912
944
  for (var option in allEventProperties) {
913
945
  evt[option] = allEventProperties[option];
@@ -922,12 +954,14 @@ function dispatchEvent(_ref) {
922
954
  }
923
955
  }
924
956
 
957
+ var _excluded = ["evt"];
958
+
925
959
  var pluginEvent = function pluginEvent(eventName, sortable) {
926
960
  var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
927
961
  originalEvent = _ref.evt,
928
- data = _objectWithoutProperties(_ref, ["evt"]);
962
+ data = _objectWithoutProperties(_ref, _excluded);
929
963
 
930
- PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread({
964
+ PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({
931
965
  dragEl: dragEl,
932
966
  parentEl: parentEl,
933
967
  ghostEl: ghostEl,
@@ -963,7 +997,7 @@ var pluginEvent = function pluginEvent(eventName, sortable) {
963
997
  };
964
998
 
965
999
  function _dispatchEvent(info) {
966
- dispatchEvent(_objectSpread({
1000
+ dispatchEvent(_objectSpread2({
967
1001
  putSortable: putSortable,
968
1002
  cloneEl: cloneEl,
969
1003
  targetEl: dragEl,
@@ -1063,22 +1097,22 @@ supportDraggable = documentExists && !ChromeForAndroid && !IOS && 'draggable' in
1063
1097
  return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2;
1064
1098
  },
1065
1099
 
1066
- /**
1067
- * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.
1068
- * @param {Number} x X position
1069
- * @param {Number} y Y position
1070
- * @return {HTMLElement} Element of the first found nearest Sortable
1100
+ /**
1101
+ * Detects first nearest empty sortable to X and Y position using emptyInsertThreshold.
1102
+ * @param {Number} x X position
1103
+ * @param {Number} y Y position
1104
+ * @return {HTMLElement} Element of the first found nearest Sortable
1071
1105
  */
1072
1106
  _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {
1073
1107
  var ret;
1074
1108
  sortables.some(function (sortable) {
1075
- if (lastChild(sortable)) return;
1109
+ var threshold = sortable[expando].options.emptyInsertThreshold;
1110
+ if (!threshold || lastChild(sortable)) return;
1076
1111
  var rect = getRect(sortable),
1077
- threshold = sortable[expando].options.emptyInsertThreshold,
1078
1112
  insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold,
1079
1113
  insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold;
1080
1114
 
1081
- if (threshold && insideHorizontally && insideVertically) {
1115
+ if (insideHorizontally && insideVertically) {
1082
1116
  return ret = sortable;
1083
1117
  }
1084
1118
  });
@@ -1133,7 +1167,7 @@ _detectNearestEmptySortable = function _detectNearestEmptySortable(x, y) {
1133
1167
  }; // #1184 fix - Prevent click event on fallback if dragged but item not changed position
1134
1168
 
1135
1169
 
1136
- if (documentExists) {
1170
+ if (documentExists && !ChromeForAndroid) {
1137
1171
  document.addEventListener('click', function (evt) {
1138
1172
  if (ignoreNextClick) {
1139
1173
  evt.preventDefault();
@@ -1175,10 +1209,10 @@ var _checkOutsideTargetEl = function _checkOutsideTargetEl(evt) {
1175
1209
  dragEl.parentNode[expando]._isOutsideThisEl(evt.target);
1176
1210
  }
1177
1211
  };
1178
- /**
1179
- * @class Sortable
1180
- * @param {HTMLElement} el
1181
- * @param {Object} [options]
1212
+ /**
1213
+ * @class Sortable
1214
+ * @param {HTMLElement} el
1215
+ * @param {Object} [options]
1182
1216
  */
1183
1217
 
1184
1218
 
@@ -1752,6 +1786,7 @@ Sortable.prototype =
1752
1786
 
1753
1787
  if (!Sortable.eventCanceled) {
1754
1788
  cloneEl = clone(dragEl);
1789
+ cloneEl.removeAttribute("id");
1755
1790
  cloneEl.draggable = false;
1756
1791
  cloneEl.style['will-change'] = '';
1757
1792
 
@@ -1829,7 +1864,7 @@ Sortable.prototype =
1829
1864
  if (_silent) return;
1830
1865
 
1831
1866
  function dragOverEvent(name, extra) {
1832
- pluginEvent(name, _this, _objectSpread({
1867
+ pluginEvent(name, _this, _objectSpread2({
1833
1868
  evt: evt,
1834
1869
  isOwner: isOwner,
1835
1870
  axis: vertical ? 'vertical' : 'horizontal',
@@ -1946,7 +1981,7 @@ Sortable.prototype =
1946
1981
 
1947
1982
  ignoreNextClick = false;
1948
1983
 
1949
- if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = !rootEl.contains(dragEl)) // Reverting item into the original list
1984
+ if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) // Reverting item into the original list
1950
1985
  : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) {
1951
1986
  vertical = this._getDirection(evt, target) === 'vertical';
1952
1987
  dragRect = getRect(dragEl);
@@ -1976,10 +2011,11 @@ Sortable.prototype =
1976
2011
  var elLastChild = lastChild(el, options.draggable);
1977
2012
 
1978
2013
  if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) {
2014
+ // Insert to end of list
1979
2015
  // If already at end of list: Do not insert
1980
2016
  if (elLastChild === dragEl) {
1981
2017
  return completed(false);
1982
- } // assign target only if condition is true
2018
+ } // if there is a last element, it is the target
1983
2019
 
1984
2020
 
1985
2021
  if (elLastChild && el === evt.target) {
@@ -1992,7 +2028,33 @@ Sortable.prototype =
1992
2028
 
1993
2029
  if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) {
1994
2030
  capture();
1995
- el.appendChild(dragEl);
2031
+
2032
+ if (elLastChild && elLastChild.nextSibling) {
2033
+ // the last draggable element is not the last node
2034
+ el.insertBefore(dragEl, elLastChild.nextSibling);
2035
+ } else {
2036
+ el.appendChild(dragEl);
2037
+ }
2038
+
2039
+ parentEl = el; // actualization
2040
+
2041
+ changed();
2042
+ return completed(true);
2043
+ }
2044
+ } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) {
2045
+ // Insert to start of list
2046
+ var firstChild = getChild(el, 0, options, true);
2047
+
2048
+ if (firstChild === dragEl) {
2049
+ return completed(false);
2050
+ }
2051
+
2052
+ target = firstChild;
2053
+ targetRect = getRect(target);
2054
+
2055
+ if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) {
2056
+ capture();
2057
+ el.insertBefore(dragEl, firstChild);
1996
2058
  parentEl = el; // actualization
1997
2059
 
1998
2060
  changed();
@@ -2296,9 +2358,9 @@ Sortable.prototype =
2296
2358
  }
2297
2359
  },
2298
2360
 
2299
- /**
2300
- * Serializes the item into an array of string.
2301
- * @returns {String[]}
2361
+ /**
2362
+ * Serializes the item into an array of string.
2363
+ * @returns {String[]}
2302
2364
  */
2303
2365
  toArray: function toArray() {
2304
2366
  var order = [],
@@ -2319,9 +2381,9 @@ Sortable.prototype =
2319
2381
  return order;
2320
2382
  },
2321
2383
 
2322
- /**
2323
- * Sorts the elements according to the array.
2324
- * @param {String[]} order order of the items
2384
+ /**
2385
+ * Sorts the elements according to the array.
2386
+ * @param {String[]} order order of the items
2325
2387
  */
2326
2388
  sort: function sort(order, useAnimation) {
2327
2389
  var items = {},
@@ -2343,29 +2405,29 @@ Sortable.prototype =
2343
2405
  useAnimation && this.animateAll();
2344
2406
  },
2345
2407
 
2346
- /**
2347
- * Save the current sorting
2408
+ /**
2409
+ * Save the current sorting
2348
2410
  */
2349
2411
  save: function save() {
2350
2412
  var store = this.options.store;
2351
2413
  store && store.set && store.set(this);
2352
2414
  },
2353
2415
 
2354
- /**
2355
- * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
2356
- * @param {HTMLElement} el
2357
- * @param {String} [selector] default: `options.draggable`
2358
- * @returns {HTMLElement|null}
2416
+ /**
2417
+ * For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.
2418
+ * @param {HTMLElement} el
2419
+ * @param {String} [selector] default: `options.draggable`
2420
+ * @returns {HTMLElement|null}
2359
2421
  */
2360
2422
  closest: function closest$1(el, selector) {
2361
2423
  return closest(el, selector || this.options.draggable, this.el, false);
2362
2424
  },
2363
2425
 
2364
- /**
2365
- * Set/get option
2366
- * @param {string} name
2367
- * @param {*} [value]
2368
- * @returns {*}
2426
+ /**
2427
+ * Set/get option
2428
+ * @param {string} name
2429
+ * @param {*} [value]
2430
+ * @returns {*}
2369
2431
  */
2370
2432
  option: function option(name, value) {
2371
2433
  var options = this.options;
@@ -2387,8 +2449,8 @@ Sortable.prototype =
2387
2449
  }
2388
2450
  },
2389
2451
 
2390
- /**
2391
- * Destroy
2452
+ /**
2453
+ * Destroy
2392
2454
  */
2393
2455
  destroy: function destroy() {
2394
2456
  pluginEvent('destroy', this);
@@ -2508,6 +2570,12 @@ function _unsilent() {
2508
2570
  _silent = false;
2509
2571
  }
2510
2572
 
2573
+ function _ghostIsFirst(evt, vertical, sortable) {
2574
+ var rect = getRect(getChild(sortable.el, 0, sortable.options, true));
2575
+ var spacer = 10;
2576
+ return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left;
2577
+ }
2578
+
2511
2579
  function _ghostIsLast(evt, vertical, sortable) {
2512
2580
  var rect = getRect(lastChild(sortable.el, sortable.options.draggable));
2513
2581
  var spacer = 10;
@@ -2559,11 +2627,11 @@ function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, inv
2559
2627
 
2560
2628
  return 0;
2561
2629
  }
2562
- /**
2563
- * Gets the direction dragEl must be swapped relative to target in order to make it
2564
- * seem that dragEl has been "inserted" into that element's position
2565
- * @param {HTMLElement} target The target whose position dragEl is being inserted at
2566
- * @return {Number} Direction dragEl must be swapped
2630
+ /**
2631
+ * Gets the direction dragEl must be swapped relative to target in order to make it
2632
+ * seem that dragEl has been "inserted" into that element's position
2633
+ * @param {HTMLElement} target The target whose position dragEl is being inserted at
2634
+ * @return {Number} Direction dragEl must be swapped
2567
2635
  */
2568
2636
 
2569
2637
 
@@ -2574,11 +2642,11 @@ function _getInsertDirection(target) {
2574
2642
  return -1;
2575
2643
  }
2576
2644
  }
2577
- /**
2578
- * Generate id
2579
- * @param {HTMLElement} el
2580
- * @returns {String}
2581
- * @private
2645
+ /**
2646
+ * Generate id
2647
+ * @param {HTMLElement} el
2648
+ * @returns {String}
2649
+ * @private
2582
2650
  */
2583
2651
 
2584
2652
 
@@ -2642,18 +2710,18 @@ Sortable.utils = {
2642
2710
  detectDirection: _detectDirection,
2643
2711
  getChild: getChild
2644
2712
  };
2645
- /**
2646
- * Get the Sortable instance of an element
2647
- * @param {HTMLElement} element The element
2648
- * @return {Sortable|undefined} The instance of Sortable
2713
+ /**
2714
+ * Get the Sortable instance of an element
2715
+ * @param {HTMLElement} element The element
2716
+ * @return {Sortable|undefined} The instance of Sortable
2649
2717
  */
2650
2718
 
2651
2719
  Sortable.get = function (element) {
2652
2720
  return element[expando];
2653
2721
  };
2654
- /**
2655
- * Mount a plugin to Sortable
2656
- * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted
2722
+ /**
2723
+ * Mount a plugin to Sortable
2724
+ * @param {...SortablePlugin|SortablePlugin[]} plugins Plugins being mounted
2657
2725
  */
2658
2726
 
2659
2727
 
@@ -2668,14 +2736,14 @@ Sortable.mount = function () {
2668
2736
  throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin));
2669
2737
  }
2670
2738
 
2671
- if (plugin.utils) Sortable.utils = _objectSpread({}, Sortable.utils, plugin.utils);
2739
+ if (plugin.utils) Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin.utils);
2672
2740
  PluginManager.mount(plugin);
2673
2741
  });
2674
2742
  };
2675
- /**
2676
- * Create sortable instance
2677
- * @param {HTMLElement} el
2678
- * @param {Object} [options]
2743
+ /**
2744
+ * Create sortable instance
2745
+ * @param {HTMLElement} el
2746
+ * @param {Object} [options]
2679
2747
  */
2680
2748
 
2681
2749
 
@@ -2699,6 +2767,7 @@ function AutoScrollPlugin() {
2699
2767
  function AutoScroll() {
2700
2768
  this.defaults = {
2701
2769
  scroll: true,
2770
+ forceAutoScrollFallback: false,
2702
2771
  scrollSensitivity: 30,
2703
2772
  scrollSpeed: 10,
2704
2773
  bubbleScroll: true
@@ -2766,7 +2835,7 @@ function AutoScrollPlugin() {
2766
2835
  // MACOS Safari does not have autoscroll,
2767
2836
  // Firefox and Chrome are good
2768
2837
 
2769
- if (fallback || Edge || IE11OrLess || Safari) {
2838
+ if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) {
2770
2839
  autoScroll(evt, this.options, elem, fallback); // Listener for pointer element change
2771
2840
 
2772
2841
  var ogElemScroller = getParentAutoScrollElement(elem, true);
@@ -3113,11 +3182,13 @@ function MultiDragPlugin() {
3113
3182
  }
3114
3183
  }
3115
3184
 
3116
- if (sortable.options.supportPointer) {
3117
- on(document, 'pointerup', this._deselectMultiDrag);
3118
- } else {
3119
- on(document, 'mouseup', this._deselectMultiDrag);
3120
- on(document, 'touchend', this._deselectMultiDrag);
3185
+ if (!sortable.options.avoidImplicitDeselect) {
3186
+ if (sortable.options.supportPointer) {
3187
+ on(document, 'pointerup', this._deselectMultiDrag);
3188
+ } else {
3189
+ on(document, 'mouseup', this._deselectMultiDrag);
3190
+ on(document, 'touchend', this._deselectMultiDrag);
3191
+ }
3121
3192
  }
3122
3193
 
3123
3194
  on(document, 'keydown', this._checkKeyDown);
@@ -3125,6 +3196,7 @@ function MultiDragPlugin() {
3125
3196
  this.defaults = {
3126
3197
  selectedClass: 'sortable-selected',
3127
3198
  multiDragKey: null,
3199
+ avoidImplicitDeselect: false,
3128
3200
  setData: function setData(dataTransfer, dragEl) {
3129
3201
  var data = '';
3130
3202
 
@@ -3415,7 +3487,7 @@ function MultiDragPlugin() {
3415
3487
  rootEl: rootEl,
3416
3488
  name: 'select',
3417
3489
  targetEl: dragEl$1,
3418
- originalEvt: evt
3490
+ originalEvent: evt
3419
3491
  }); // Modifier activated, select from last to dragEl
3420
3492
 
3421
3493
  if (evt.shiftKey && lastMultiDragSelect && sortable.el.contains(lastMultiDragSelect)) {
@@ -3444,7 +3516,7 @@ function MultiDragPlugin() {
3444
3516
  rootEl: rootEl,
3445
3517
  name: 'select',
3446
3518
  targetEl: children[i],
3447
- originalEvt: evt
3519
+ originalEvent: evt
3448
3520
  });
3449
3521
  }
3450
3522
  }
@@ -3461,14 +3533,15 @@ function MultiDragPlugin() {
3461
3533
  rootEl: rootEl,
3462
3534
  name: 'deselect',
3463
3535
  targetEl: dragEl$1,
3464
- originalEvt: evt
3536
+ originalEvent: evt
3465
3537
  });
3466
3538
  }
3467
3539
  } // Multi-drag drop
3468
3540
 
3469
3541
 
3470
3542
  if (dragStarted && this.isMultiDrag) {
3471
- // Do not "unfold" after around dragEl if reverted
3543
+ folding = false; // Do not "unfold" after around dragEl if reverted
3544
+
3472
3545
  if ((parentEl[expando].options.sort || parentEl !== rootEl) && multiDragElements.length > 1) {
3473
3546
  var dragRect = getRect(dragEl$1),
3474
3547
  multiDragIndex = index(dragEl$1, ':not(.' + this.options.selectedClass + ')');
@@ -3571,7 +3644,7 @@ function MultiDragPlugin() {
3571
3644
  rootEl: this.sortable.el,
3572
3645
  name: 'deselect',
3573
3646
  targetEl: el,
3574
- originalEvt: evt
3647
+ originalEvent: evt
3575
3648
  });
3576
3649
  }
3577
3650
  },