svelte-dnd-action 0.9.15 → 0.9.18

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/index.js CHANGED
@@ -1054,6 +1054,54 @@
1054
1054
  resetScrolling$1();
1055
1055
  }
1056
1056
 
1057
+ /**
1058
+ * Fixes svelte issue when cloning node containing (or being) <select> which will loose it's value.
1059
+ * Since svelte manages select value internally.
1060
+ * @see https://github.com/sveltejs/svelte/issues/6717
1061
+ * @see https://github.com/isaacHagoel/svelte-dnd-action/issues/306
1062
+ *
1063
+ * @param {HTMLElement} el
1064
+ * @returns
1065
+ */
1066
+ function svelteNodeClone(el) {
1067
+ var cloned = el.cloneNode(true);
1068
+ var values = [];
1069
+ var elIsSelect = el.tagName === "SELECT";
1070
+ var selects = elIsSelect ? [el] : _toConsumableArray(el.querySelectorAll('select'));
1071
+
1072
+ var _iterator = _createForOfIteratorHelper(selects),
1073
+ _step;
1074
+
1075
+ try {
1076
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
1077
+ var _select = _step.value;
1078
+ values.push(_select.value);
1079
+ }
1080
+ } catch (err) {
1081
+ _iterator.e(err);
1082
+ } finally {
1083
+ _iterator.f();
1084
+ }
1085
+
1086
+ if (selects.length <= 0) {
1087
+ return cloned;
1088
+ }
1089
+
1090
+ var clonedSelects = elIsSelect ? [cloned] : _toConsumableArray(cloned.querySelectorAll('select'));
1091
+
1092
+ for (var i = 0; i < clonedSelects.length; i++) {
1093
+ var select = clonedSelects[i];
1094
+ var value = values[i];
1095
+ var optionEl = select.querySelector("option[value=\"".concat(value, "\""));
1096
+
1097
+ if (optionEl) {
1098
+ optionEl.setAttribute('selected', true);
1099
+ }
1100
+ }
1101
+
1102
+ return cloned;
1103
+ }
1104
+
1057
1105
  var TRANSITION_DURATION_SECONDS = 0.2;
1058
1106
  /**
1059
1107
  * private helper function - creates a transition string for a property
@@ -1074,7 +1122,7 @@
1074
1122
 
1075
1123
  function createDraggedElementFrom(originalElement, positionCenterOnXY) {
1076
1124
  var rect = originalElement.getBoundingClientRect();
1077
- var draggedEl = originalElement.cloneNode(true);
1125
+ var draggedEl = svelteNodeClone(originalElement);
1078
1126
  copyStylesFromTo(originalElement, draggedEl);
1079
1127
  draggedEl.id = DRAGGED_ELEMENT_ID;
1080
1128
  draggedEl.style.position = "fixed";
@@ -1187,7 +1235,7 @@
1187
1235
  * @param {HTMLElement} dragTarget
1188
1236
  */
1189
1237
 
1190
- function hideOriginalDragTarget(dragTarget) {
1238
+ function hideElement(dragTarget) {
1191
1239
  dragTarget.style.display = "none";
1192
1240
  dragTarget.style.position = "fixed";
1193
1241
  dragTarget.style.zIndex = "-5";
@@ -1290,7 +1338,8 @@
1290
1338
  var isWorkingOnPreviousDrag = false;
1291
1339
  var finalizingPreviousDrag = false;
1292
1340
  var unlockOriginDzMinDimensions;
1293
- var isDraggedOutsideOfAnyDz = false; // a map from type to a set of drop-zones
1341
+ var isDraggedOutsideOfAnyDz = false;
1342
+ var scheduledForRemovalAfterDrop = []; // a map from type to a set of drop-zones
1294
1343
 
1295
1344
  var typeToDropZones = new Map(); // important - this is needed because otherwise the config that would be used for everyone is the config of the element that created the event listeners
1296
1345
 
@@ -1626,12 +1675,37 @@
1626
1675
  draggedEl.style.transform = "translate3d(".concat(newTransform.x, "px, ").concat(newTransform.y, "px, 0)");
1627
1676
  window.setTimeout(callback, dropAnimationDurationMs);
1628
1677
  }
1678
+
1679
+ function scheduleDZForRemovalAfterDrop(dz, destroy) {
1680
+ scheduledForRemovalAfterDrop.push({
1681
+ dz: dz,
1682
+ destroy: destroy
1683
+ });
1684
+ window.requestAnimationFrame(function () {
1685
+ hideElement(dz);
1686
+ document.body.appendChild(dz);
1687
+ });
1688
+ }
1629
1689
  /* cleanup */
1630
1690
 
1631
1691
 
1632
1692
  function cleanupPostDrop() {
1633
1693
  draggedEl.remove();
1634
1694
  originalDragTarget.remove();
1695
+
1696
+ if (scheduledForRemovalAfterDrop.length) {
1697
+ printDebug(function () {
1698
+ return ["will destroy zones that were removed during drag", scheduledForRemovalAfterDrop];
1699
+ });
1700
+ scheduledForRemovalAfterDrop.forEach(function (_ref) {
1701
+ var dz = _ref.dz,
1702
+ destroy = _ref.destroy;
1703
+ destroy();
1704
+ dz.remove();
1705
+ });
1706
+ scheduledForRemovalAfterDrop = [];
1707
+ }
1708
+
1635
1709
  draggedEl = undefined;
1636
1710
  originalDragTarget = undefined;
1637
1711
  draggedElData = undefined;
@@ -1649,6 +1723,7 @@
1649
1723
  }
1650
1724
 
1651
1725
  function dndzone(node, options) {
1726
+ var initialized = false;
1652
1727
  var config = {
1653
1728
  items: undefined,
1654
1729
  type: undefined,
@@ -1778,7 +1853,7 @@
1778
1853
 
1779
1854
  draggedEl.focus();
1780
1855
  watchDraggedElement();
1781
- hideOriginalDragTarget(originalDragTarget);
1856
+ hideElement(originalDragTarget);
1782
1857
  originDropZoneRoot.appendChild(originalDragTarget);
1783
1858
  } else {
1784
1859
  window.requestAnimationFrame(keepOriginalElementInDom);
@@ -1817,27 +1892,27 @@
1817
1892
  });
1818
1893
  }
1819
1894
 
1820
- function configure(_ref) {
1821
- var _ref$items = _ref.items,
1822
- items = _ref$items === void 0 ? undefined : _ref$items,
1823
- _ref$flipDurationMs = _ref.flipDurationMs,
1824
- dropAnimationDurationMs = _ref$flipDurationMs === void 0 ? 0 : _ref$flipDurationMs,
1825
- _ref$type = _ref.type,
1826
- newType = _ref$type === void 0 ? DEFAULT_DROP_ZONE_TYPE : _ref$type,
1827
- _ref$dragDisabled = _ref.dragDisabled,
1828
- dragDisabled = _ref$dragDisabled === void 0 ? false : _ref$dragDisabled,
1829
- _ref$morphDisabled = _ref.morphDisabled,
1830
- morphDisabled = _ref$morphDisabled === void 0 ? false : _ref$morphDisabled,
1831
- _ref$dropFromOthersDi = _ref.dropFromOthersDisabled,
1832
- dropFromOthersDisabled = _ref$dropFromOthersDi === void 0 ? false : _ref$dropFromOthersDi,
1833
- _ref$dropTargetStyle = _ref.dropTargetStyle,
1834
- dropTargetStyle = _ref$dropTargetStyle === void 0 ? DEFAULT_DROP_TARGET_STYLE : _ref$dropTargetStyle,
1835
- _ref$dropTargetClasse = _ref.dropTargetClasses,
1836
- dropTargetClasses = _ref$dropTargetClasse === void 0 ? [] : _ref$dropTargetClasse,
1837
- _ref$transformDragged = _ref.transformDraggedElement,
1838
- transformDraggedElement = _ref$transformDragged === void 0 ? function () {} : _ref$transformDragged,
1839
- _ref$centreDraggedOnC = _ref.centreDraggedOnCursor,
1840
- centreDraggedOnCursor = _ref$centreDraggedOnC === void 0 ? false : _ref$centreDraggedOnC;
1895
+ function configure(_ref2) {
1896
+ var _ref2$items = _ref2.items,
1897
+ items = _ref2$items === void 0 ? undefined : _ref2$items,
1898
+ _ref2$flipDurationMs = _ref2.flipDurationMs,
1899
+ dropAnimationDurationMs = _ref2$flipDurationMs === void 0 ? 0 : _ref2$flipDurationMs,
1900
+ _ref2$type = _ref2.type,
1901
+ newType = _ref2$type === void 0 ? DEFAULT_DROP_ZONE_TYPE : _ref2$type,
1902
+ _ref2$dragDisabled = _ref2.dragDisabled,
1903
+ dragDisabled = _ref2$dragDisabled === void 0 ? false : _ref2$dragDisabled,
1904
+ _ref2$morphDisabled = _ref2.morphDisabled,
1905
+ morphDisabled = _ref2$morphDisabled === void 0 ? false : _ref2$morphDisabled,
1906
+ _ref2$dropFromOthersD = _ref2.dropFromOthersDisabled,
1907
+ dropFromOthersDisabled = _ref2$dropFromOthersD === void 0 ? false : _ref2$dropFromOthersD,
1908
+ _ref2$dropTargetStyle = _ref2.dropTargetStyle,
1909
+ dropTargetStyle = _ref2$dropTargetStyle === void 0 ? DEFAULT_DROP_TARGET_STYLE : _ref2$dropTargetStyle,
1910
+ _ref2$dropTargetClass = _ref2.dropTargetClasses,
1911
+ dropTargetClasses = _ref2$dropTargetClass === void 0 ? [] : _ref2$dropTargetClass,
1912
+ _ref2$transformDragge = _ref2.transformDraggedElement,
1913
+ transformDraggedElement = _ref2$transformDragge === void 0 ? function () {} : _ref2$transformDragge,
1914
+ _ref2$centreDraggedOn = _ref2.centreDraggedOnCursor,
1915
+ centreDraggedOnCursor = _ref2$centreDraggedOn === void 0 ? false : _ref2$centreDraggedOn;
1841
1916
  config.dropAnimationDurationMs = dropAnimationDurationMs;
1842
1917
 
1843
1918
  if (config.type && newType !== config.type) {
@@ -1852,7 +1927,7 @@
1852
1927
  config.transformDraggedElement = transformDraggedElement;
1853
1928
  config.centreDraggedOnCursor = centreDraggedOnCursor; // realtime update for dropTargetStyle
1854
1929
 
1855
- if (isWorkingOnPreviousDrag && !finalizingPreviousDrag && (!areObjectsShallowEqual(dropTargetStyle, config.dropTargetStyle) || !areArraysShallowEqualSameOrder(dropTargetClasses, config.dropTargetClasses))) {
1930
+ if (initialized && isWorkingOnPreviousDrag && !finalizingPreviousDrag && (!areObjectsShallowEqual(dropTargetStyle, config.dropTargetStyle) || !areArraysShallowEqualSameOrder(dropTargetClasses, config.dropTargetClasses))) {
1856
1931
  styleInactiveDropZones([node], function () {
1857
1932
  return config.dropTargetStyle;
1858
1933
  }, function () {
@@ -1872,7 +1947,7 @@
1872
1947
  return dzToConfig.get(dz) ? dzToConfig.get(dz)[propName] : config[propName];
1873
1948
  }
1874
1949
 
1875
- if (isWorkingOnPreviousDrag && config.dropFromOthersDisabled !== dropFromOthersDisabled) {
1950
+ if (initialized && isWorkingOnPreviousDrag && config.dropFromOthersDisabled !== dropFromOthersDisabled) {
1876
1951
  if (dropFromOthersDisabled) {
1877
1952
  styleInactiveDropZones([node], function (dz) {
1878
1953
  return getConfigProp(dz, "dropTargetStyle");
@@ -1918,6 +1993,10 @@
1918
1993
 
1919
1994
 
1920
1995
  elToIdx.set(draggableEl, idx);
1996
+
1997
+ if (!initialized) {
1998
+ initialized = true;
1999
+ }
1921
2000
  };
1922
2001
 
1923
2002
  for (var idx = 0; idx < node.children.length; idx++) {
@@ -1936,11 +2015,22 @@
1936
2015
  configure(newOptions);
1937
2016
  },
1938
2017
  destroy: function destroy() {
1939
- printDebug(function () {
1940
- return "pointer dndzone will destroy";
1941
- });
1942
- unregisterDropZone(node, config.type);
1943
- dzToConfig["delete"](node);
2018
+ function destroyDz() {
2019
+ printDebug(function () {
2020
+ return "pointer dndzone will destroy";
2021
+ });
2022
+ unregisterDropZone(node, dzToConfig.get(node).type);
2023
+ dzToConfig["delete"](node);
2024
+ }
2025
+
2026
+ if (isWorkingOnPreviousDrag) {
2027
+ printDebug(function () {
2028
+ return "pointer dndzone will be scheduled for destruction";
2029
+ });
2030
+ scheduleDZForRemovalAfterDrop(node, destroyDz);
2031
+ } else {
2032
+ destroyDz();
2033
+ }
1944
2034
  }
1945
2035
  };
1946
2036
  }
package/dist/index.mjs CHANGED
@@ -1048,6 +1048,54 @@ function disarmWindowScroller() {
1048
1048
  resetScrolling$1();
1049
1049
  }
1050
1050
 
1051
+ /**
1052
+ * Fixes svelte issue when cloning node containing (or being) <select> which will loose it's value.
1053
+ * Since svelte manages select value internally.
1054
+ * @see https://github.com/sveltejs/svelte/issues/6717
1055
+ * @see https://github.com/isaacHagoel/svelte-dnd-action/issues/306
1056
+ *
1057
+ * @param {HTMLElement} el
1058
+ * @returns
1059
+ */
1060
+ function svelteNodeClone(el) {
1061
+ var cloned = el.cloneNode(true);
1062
+ var values = [];
1063
+ var elIsSelect = el.tagName === "SELECT";
1064
+ var selects = elIsSelect ? [el] : _toConsumableArray(el.querySelectorAll('select'));
1065
+
1066
+ var _iterator = _createForOfIteratorHelper(selects),
1067
+ _step;
1068
+
1069
+ try {
1070
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
1071
+ var _select = _step.value;
1072
+ values.push(_select.value);
1073
+ }
1074
+ } catch (err) {
1075
+ _iterator.e(err);
1076
+ } finally {
1077
+ _iterator.f();
1078
+ }
1079
+
1080
+ if (selects.length <= 0) {
1081
+ return cloned;
1082
+ }
1083
+
1084
+ var clonedSelects = elIsSelect ? [cloned] : _toConsumableArray(cloned.querySelectorAll('select'));
1085
+
1086
+ for (var i = 0; i < clonedSelects.length; i++) {
1087
+ var select = clonedSelects[i];
1088
+ var value = values[i];
1089
+ var optionEl = select.querySelector("option[value=\"".concat(value, "\""));
1090
+
1091
+ if (optionEl) {
1092
+ optionEl.setAttribute('selected', true);
1093
+ }
1094
+ }
1095
+
1096
+ return cloned;
1097
+ }
1098
+
1051
1099
  var TRANSITION_DURATION_SECONDS = 0.2;
1052
1100
  /**
1053
1101
  * private helper function - creates a transition string for a property
@@ -1068,7 +1116,7 @@ function trs(property) {
1068
1116
 
1069
1117
  function createDraggedElementFrom(originalElement, positionCenterOnXY) {
1070
1118
  var rect = originalElement.getBoundingClientRect();
1071
- var draggedEl = originalElement.cloneNode(true);
1119
+ var draggedEl = svelteNodeClone(originalElement);
1072
1120
  copyStylesFromTo(originalElement, draggedEl);
1073
1121
  draggedEl.id = DRAGGED_ELEMENT_ID;
1074
1122
  draggedEl.style.position = "fixed";
@@ -1181,7 +1229,7 @@ function styleDraggable(draggableEl, dragDisabled) {
1181
1229
  * @param {HTMLElement} dragTarget
1182
1230
  */
1183
1231
 
1184
- function hideOriginalDragTarget(dragTarget) {
1232
+ function hideElement(dragTarget) {
1185
1233
  dragTarget.style.display = "none";
1186
1234
  dragTarget.style.position = "fixed";
1187
1235
  dragTarget.style.zIndex = "-5";
@@ -1284,7 +1332,8 @@ var currentMousePosition;
1284
1332
  var isWorkingOnPreviousDrag = false;
1285
1333
  var finalizingPreviousDrag = false;
1286
1334
  var unlockOriginDzMinDimensions;
1287
- var isDraggedOutsideOfAnyDz = false; // a map from type to a set of drop-zones
1335
+ var isDraggedOutsideOfAnyDz = false;
1336
+ var scheduledForRemovalAfterDrop = []; // a map from type to a set of drop-zones
1288
1337
 
1289
1338
  var typeToDropZones = new Map(); // important - this is needed because otherwise the config that would be used for everyone is the config of the element that created the event listeners
1290
1339
 
@@ -1620,12 +1669,37 @@ function animateDraggedToFinalPosition(shadowElIdx, callback) {
1620
1669
  draggedEl.style.transform = "translate3d(".concat(newTransform.x, "px, ").concat(newTransform.y, "px, 0)");
1621
1670
  window.setTimeout(callback, dropAnimationDurationMs);
1622
1671
  }
1672
+
1673
+ function scheduleDZForRemovalAfterDrop(dz, destroy) {
1674
+ scheduledForRemovalAfterDrop.push({
1675
+ dz: dz,
1676
+ destroy: destroy
1677
+ });
1678
+ window.requestAnimationFrame(function () {
1679
+ hideElement(dz);
1680
+ document.body.appendChild(dz);
1681
+ });
1682
+ }
1623
1683
  /* cleanup */
1624
1684
 
1625
1685
 
1626
1686
  function cleanupPostDrop() {
1627
1687
  draggedEl.remove();
1628
1688
  originalDragTarget.remove();
1689
+
1690
+ if (scheduledForRemovalAfterDrop.length) {
1691
+ printDebug(function () {
1692
+ return ["will destroy zones that were removed during drag", scheduledForRemovalAfterDrop];
1693
+ });
1694
+ scheduledForRemovalAfterDrop.forEach(function (_ref) {
1695
+ var dz = _ref.dz,
1696
+ destroy = _ref.destroy;
1697
+ destroy();
1698
+ dz.remove();
1699
+ });
1700
+ scheduledForRemovalAfterDrop = [];
1701
+ }
1702
+
1629
1703
  draggedEl = undefined;
1630
1704
  originalDragTarget = undefined;
1631
1705
  draggedElData = undefined;
@@ -1643,6 +1717,7 @@ function cleanupPostDrop() {
1643
1717
  }
1644
1718
 
1645
1719
  function dndzone(node, options) {
1720
+ var initialized = false;
1646
1721
  var config = {
1647
1722
  items: undefined,
1648
1723
  type: undefined,
@@ -1772,7 +1847,7 @@ function dndzone(node, options) {
1772
1847
 
1773
1848
  draggedEl.focus();
1774
1849
  watchDraggedElement();
1775
- hideOriginalDragTarget(originalDragTarget);
1850
+ hideElement(originalDragTarget);
1776
1851
  originDropZoneRoot.appendChild(originalDragTarget);
1777
1852
  } else {
1778
1853
  window.requestAnimationFrame(keepOriginalElementInDom);
@@ -1811,27 +1886,27 @@ function dndzone(node, options) {
1811
1886
  });
1812
1887
  }
1813
1888
 
1814
- function configure(_ref) {
1815
- var _ref$items = _ref.items,
1816
- items = _ref$items === void 0 ? undefined : _ref$items,
1817
- _ref$flipDurationMs = _ref.flipDurationMs,
1818
- dropAnimationDurationMs = _ref$flipDurationMs === void 0 ? 0 : _ref$flipDurationMs,
1819
- _ref$type = _ref.type,
1820
- newType = _ref$type === void 0 ? DEFAULT_DROP_ZONE_TYPE : _ref$type,
1821
- _ref$dragDisabled = _ref.dragDisabled,
1822
- dragDisabled = _ref$dragDisabled === void 0 ? false : _ref$dragDisabled,
1823
- _ref$morphDisabled = _ref.morphDisabled,
1824
- morphDisabled = _ref$morphDisabled === void 0 ? false : _ref$morphDisabled,
1825
- _ref$dropFromOthersDi = _ref.dropFromOthersDisabled,
1826
- dropFromOthersDisabled = _ref$dropFromOthersDi === void 0 ? false : _ref$dropFromOthersDi,
1827
- _ref$dropTargetStyle = _ref.dropTargetStyle,
1828
- dropTargetStyle = _ref$dropTargetStyle === void 0 ? DEFAULT_DROP_TARGET_STYLE : _ref$dropTargetStyle,
1829
- _ref$dropTargetClasse = _ref.dropTargetClasses,
1830
- dropTargetClasses = _ref$dropTargetClasse === void 0 ? [] : _ref$dropTargetClasse,
1831
- _ref$transformDragged = _ref.transformDraggedElement,
1832
- transformDraggedElement = _ref$transformDragged === void 0 ? function () {} : _ref$transformDragged,
1833
- _ref$centreDraggedOnC = _ref.centreDraggedOnCursor,
1834
- centreDraggedOnCursor = _ref$centreDraggedOnC === void 0 ? false : _ref$centreDraggedOnC;
1889
+ function configure(_ref2) {
1890
+ var _ref2$items = _ref2.items,
1891
+ items = _ref2$items === void 0 ? undefined : _ref2$items,
1892
+ _ref2$flipDurationMs = _ref2.flipDurationMs,
1893
+ dropAnimationDurationMs = _ref2$flipDurationMs === void 0 ? 0 : _ref2$flipDurationMs,
1894
+ _ref2$type = _ref2.type,
1895
+ newType = _ref2$type === void 0 ? DEFAULT_DROP_ZONE_TYPE : _ref2$type,
1896
+ _ref2$dragDisabled = _ref2.dragDisabled,
1897
+ dragDisabled = _ref2$dragDisabled === void 0 ? false : _ref2$dragDisabled,
1898
+ _ref2$morphDisabled = _ref2.morphDisabled,
1899
+ morphDisabled = _ref2$morphDisabled === void 0 ? false : _ref2$morphDisabled,
1900
+ _ref2$dropFromOthersD = _ref2.dropFromOthersDisabled,
1901
+ dropFromOthersDisabled = _ref2$dropFromOthersD === void 0 ? false : _ref2$dropFromOthersD,
1902
+ _ref2$dropTargetStyle = _ref2.dropTargetStyle,
1903
+ dropTargetStyle = _ref2$dropTargetStyle === void 0 ? DEFAULT_DROP_TARGET_STYLE : _ref2$dropTargetStyle,
1904
+ _ref2$dropTargetClass = _ref2.dropTargetClasses,
1905
+ dropTargetClasses = _ref2$dropTargetClass === void 0 ? [] : _ref2$dropTargetClass,
1906
+ _ref2$transformDragge = _ref2.transformDraggedElement,
1907
+ transformDraggedElement = _ref2$transformDragge === void 0 ? function () {} : _ref2$transformDragge,
1908
+ _ref2$centreDraggedOn = _ref2.centreDraggedOnCursor,
1909
+ centreDraggedOnCursor = _ref2$centreDraggedOn === void 0 ? false : _ref2$centreDraggedOn;
1835
1910
  config.dropAnimationDurationMs = dropAnimationDurationMs;
1836
1911
 
1837
1912
  if (config.type && newType !== config.type) {
@@ -1846,7 +1921,7 @@ function dndzone(node, options) {
1846
1921
  config.transformDraggedElement = transformDraggedElement;
1847
1922
  config.centreDraggedOnCursor = centreDraggedOnCursor; // realtime update for dropTargetStyle
1848
1923
 
1849
- if (isWorkingOnPreviousDrag && !finalizingPreviousDrag && (!areObjectsShallowEqual(dropTargetStyle, config.dropTargetStyle) || !areArraysShallowEqualSameOrder(dropTargetClasses, config.dropTargetClasses))) {
1924
+ if (initialized && isWorkingOnPreviousDrag && !finalizingPreviousDrag && (!areObjectsShallowEqual(dropTargetStyle, config.dropTargetStyle) || !areArraysShallowEqualSameOrder(dropTargetClasses, config.dropTargetClasses))) {
1850
1925
  styleInactiveDropZones([node], function () {
1851
1926
  return config.dropTargetStyle;
1852
1927
  }, function () {
@@ -1866,7 +1941,7 @@ function dndzone(node, options) {
1866
1941
  return dzToConfig.get(dz) ? dzToConfig.get(dz)[propName] : config[propName];
1867
1942
  }
1868
1943
 
1869
- if (isWorkingOnPreviousDrag && config.dropFromOthersDisabled !== dropFromOthersDisabled) {
1944
+ if (initialized && isWorkingOnPreviousDrag && config.dropFromOthersDisabled !== dropFromOthersDisabled) {
1870
1945
  if (dropFromOthersDisabled) {
1871
1946
  styleInactiveDropZones([node], function (dz) {
1872
1947
  return getConfigProp(dz, "dropTargetStyle");
@@ -1912,6 +1987,10 @@ function dndzone(node, options) {
1912
1987
 
1913
1988
 
1914
1989
  elToIdx.set(draggableEl, idx);
1990
+
1991
+ if (!initialized) {
1992
+ initialized = true;
1993
+ }
1915
1994
  };
1916
1995
 
1917
1996
  for (var idx = 0; idx < node.children.length; idx++) {
@@ -1930,11 +2009,22 @@ function dndzone(node, options) {
1930
2009
  configure(newOptions);
1931
2010
  },
1932
2011
  destroy: function destroy() {
1933
- printDebug(function () {
1934
- return "pointer dndzone will destroy";
1935
- });
1936
- unregisterDropZone(node, config.type);
1937
- dzToConfig["delete"](node);
2012
+ function destroyDz() {
2013
+ printDebug(function () {
2014
+ return "pointer dndzone will destroy";
2015
+ });
2016
+ unregisterDropZone(node, dzToConfig.get(node).type);
2017
+ dzToConfig["delete"](node);
2018
+ }
2019
+
2020
+ if (isWorkingOnPreviousDrag) {
2021
+ printDebug(function () {
2022
+ return "pointer dndzone will be scheduled for destruction";
2023
+ });
2024
+ scheduleDZForRemovalAfterDrop(node, destroyDz);
2025
+ } else {
2026
+ destroyDz();
2027
+ }
1938
2028
  }
1939
2029
  };
1940
2030
  }
package/package.json CHANGED
@@ -40,7 +40,7 @@
40
40
  "dist"
41
41
  ],
42
42
  "description": "*An awesome drag and drop library for Svelte 3 (not using the browser's built-in dnd, thanks god): Rich animations, nested containers, touch support and more *",
43
- "version": "0.9.15",
43
+ "version": "0.9.18",
44
44
  "repository": {
45
45
  "type": "git",
46
46
  "url": "git+https://github.com/isaacHagoel/svelte-dnd-action.git"
@@ -1,5 +1,6 @@
1
1
  import {SHADOW_ELEMENT_ATTRIBUTE_NAME, DRAGGED_ELEMENT_ID} from "../constants";
2
2
  import {findCenter} from "./intersection";
3
+ import { svelteNodeClone } from "./svelteNodeClone";
3
4
 
4
5
  const TRANSITION_DURATION_SECONDS = 0.2;
5
6
 
@@ -19,7 +20,7 @@ function trs(property) {
19
20
  */
20
21
  export function createDraggedElementFrom(originalElement, positionCenterOnXY) {
21
22
  const rect = originalElement.getBoundingClientRect();
22
- const draggedEl = originalElement.cloneNode(true);
23
+ const draggedEl = svelteNodeClone(originalElement);
23
24
  copyStylesFromTo(originalElement, draggedEl);
24
25
  draggedEl.id = DRAGGED_ELEMENT_ID;
25
26
  draggedEl.style.position = "fixed";
@@ -135,7 +136,7 @@ export function styleDraggable(draggableEl, dragDisabled) {
135
136
  * Hides the provided element so that it can stay in the dom without interrupting
136
137
  * @param {HTMLElement} dragTarget
137
138
  */
138
- export function hideOriginalDragTarget(dragTarget) {
139
+ export function hideElement(dragTarget) {
139
140
  dragTarget.style.display = "none";
140
141
  dragTarget.style.position = "fixed";
141
142
  dragTarget.style.zIndex = "-5";
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Fixes svelte issue when cloning node containing (or being) <select> which will loose it's value.
3
+ * Since svelte manages select value internally.
4
+ * @see https://github.com/sveltejs/svelte/issues/6717
5
+ * @see https://github.com/isaacHagoel/svelte-dnd-action/issues/306
6
+ *
7
+ * @param {HTMLElement} el
8
+ * @returns
9
+ */
10
+ export function svelteNodeClone(el) {
11
+ const cloned = el.cloneNode(true);
12
+
13
+ const values = [];
14
+ const elIsSelect = el.tagName === "SELECT";
15
+ const selects = elIsSelect ? [el] : [...el.querySelectorAll('select')];
16
+ for (const select of selects) {
17
+ values.push(select.value);
18
+ }
19
+
20
+ if (selects.length <= 0) {
21
+ return cloned;
22
+ }
23
+
24
+ const clonedSelects = elIsSelect ? [cloned] : [...cloned.querySelectorAll('select')];
25
+ for (let i = 0; i < clonedSelects.length; i++) {
26
+ const select = clonedSelects[i];
27
+ const value = values[i];
28
+ const optionEl = select.querySelector(`option[value="${value}"`);
29
+ if (optionEl) {
30
+ optionEl.setAttribute('selected', true);
31
+ }
32
+ }
33
+
34
+ return cloned;
35
+ }
@@ -13,7 +13,7 @@ import {armWindowScroller, disarmWindowScroller} from "./helpers/windowScroller"
13
13
  import {
14
14
  createDraggedElementFrom,
15
15
  decorateShadowEl,
16
- hideOriginalDragTarget,
16
+ hideElement,
17
17
  morphDraggedElementToBeLike,
18
18
  moveDraggedElementToWasDroppedState,
19
19
  preventShrinking,
@@ -55,6 +55,7 @@ let isWorkingOnPreviousDrag = false;
55
55
  let finalizingPreviousDrag = false;
56
56
  let unlockOriginDzMinDimensions;
57
57
  let isDraggedOutsideOfAnyDz = false;
58
+ let scheduledForRemovalAfterDrop = [];
58
59
 
59
60
  // a map from type to a set of drop-zones
60
61
  const typeToDropZones = new Map();
@@ -280,10 +281,25 @@ function animateDraggedToFinalPosition(shadowElIdx, callback) {
280
281
  window.setTimeout(callback, dropAnimationDurationMs);
281
282
  }
282
283
 
284
+ function scheduleDZForRemovalAfterDrop(dz, destroy) {
285
+ scheduledForRemovalAfterDrop.push({dz, destroy});
286
+ window.requestAnimationFrame(() => {
287
+ hideElement(dz);
288
+ document.body.appendChild(dz);
289
+ });
290
+ }
283
291
  /* cleanup */
284
292
  function cleanupPostDrop() {
285
293
  draggedEl.remove();
286
294
  originalDragTarget.remove();
295
+ if (scheduledForRemovalAfterDrop.length) {
296
+ printDebug(() => ["will destroy zones that were removed during drag", scheduledForRemovalAfterDrop]);
297
+ scheduledForRemovalAfterDrop.forEach(({dz, destroy}) => {
298
+ destroy();
299
+ dz.remove();
300
+ })
301
+ scheduledForRemovalAfterDrop = [];
302
+ }
287
303
  draggedEl = undefined;
288
304
  originalDragTarget = undefined;
289
305
  draggedElData = undefined;
@@ -301,6 +317,7 @@ function cleanupPostDrop() {
301
317
  }
302
318
 
303
319
  export function dndzone(node, options) {
320
+ let initialized = false;
304
321
  const config = {
305
322
  items: undefined,
306
323
  type: undefined,
@@ -397,7 +414,7 @@ export function dndzone(node, options) {
397
414
  // to prevent the outline from disappearing
398
415
  draggedEl.focus();
399
416
  watchDraggedElement();
400
- hideOriginalDragTarget(originalDragTarget);
417
+ hideElement(originalDragTarget);
401
418
  originDropZoneRoot.appendChild(originalDragTarget);
402
419
  } else {
403
420
  window.requestAnimationFrame(keepOriginalElementInDom);
@@ -442,7 +459,6 @@ export function dndzone(node, options) {
442
459
  }
443
460
  config.type = newType;
444
461
  registerDropZone(node, newType);
445
-
446
462
  config.items = [...items];
447
463
  config.dragDisabled = dragDisabled;
448
464
  config.morphDisabled = morphDisabled;
@@ -451,6 +467,7 @@ export function dndzone(node, options) {
451
467
 
452
468
  // realtime update for dropTargetStyle
453
469
  if (
470
+ initialized &&
454
471
  isWorkingOnPreviousDrag &&
455
472
  !finalizingPreviousDrag &&
456
473
  (!areObjectsShallowEqual(dropTargetStyle, config.dropTargetStyle) ||
@@ -474,7 +491,7 @@ export function dndzone(node, options) {
474
491
  function getConfigProp(dz, propName) {
475
492
  return dzToConfig.get(dz) ? dzToConfig.get(dz)[propName] : config[propName];
476
493
  }
477
- if (isWorkingOnPreviousDrag && config.dropFromOthersDisabled !== dropFromOthersDisabled) {
494
+ if (initialized && isWorkingOnPreviousDrag && config.dropFromOthersDisabled !== dropFromOthersDisabled) {
478
495
  if (dropFromOthersDisabled) {
479
496
  styleInactiveDropZones(
480
497
  [node],
@@ -514,6 +531,10 @@ export function dndzone(node, options) {
514
531
  }
515
532
  // updating the idx
516
533
  elToIdx.set(draggableEl, idx);
534
+
535
+ if (!initialized) {
536
+ initialized = true;
537
+ }
517
538
  }
518
539
  }
519
540
  configure(options);
@@ -524,9 +545,17 @@ export function dndzone(node, options) {
524
545
  configure(newOptions);
525
546
  },
526
547
  destroy: () => {
527
- printDebug(() => "pointer dndzone will destroy");
528
- unregisterDropZone(node, config.type);
529
- dzToConfig.delete(node);
548
+ function destroyDz() {
549
+ printDebug(() => "pointer dndzone will destroy");
550
+ unregisterDropZone(node, dzToConfig.get(node).type);
551
+ dzToConfig.delete(node);
552
+ }
553
+ if (isWorkingOnPreviousDrag) {
554
+ printDebug(() => "pointer dndzone will be scheduled for destruction");
555
+ scheduleDZForRemovalAfterDrop(node, destroyDz);
556
+ } else {
557
+ destroyDz();
558
+ }
530
559
  }
531
560
  };
532
561
  }