@headless-tree/core 1.3.0 → 1.5.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/dist/index.js CHANGED
@@ -485,6 +485,7 @@ var createTree = (initialConfig) => {
485
485
  );
486
486
  let treeElement;
487
487
  const treeDataRef = { current: {} };
488
+ let rebuildScheduled = false;
488
489
  const itemInstancesMap = {};
489
490
  let itemInstances = [];
490
491
  const itemElementsMap = {};
@@ -528,6 +529,7 @@ var createTree = (initialConfig) => {
528
529
  itemInstances.push(itemInstancesMap[item.itemId]);
529
530
  }
530
531
  }
532
+ rebuildScheduled = false;
531
533
  };
532
534
  const eachFeature = (fn) => {
533
535
  for (const feature of additionalFeatures) {
@@ -542,16 +544,48 @@ var createTree = (initialConfig) => {
542
544
  var _a2;
543
545
  (_a2 = config.setState) == null ? void 0 : _a2.call(config, state);
544
546
  },
547
+ setMounted: ({}, isMounted) => {
548
+ var _a2;
549
+ const ref = treeDataRef.current;
550
+ ref.isMounted = isMounted;
551
+ if (isMounted) {
552
+ (_a2 = ref.waitingForMount) == null ? void 0 : _a2.forEach((cb) => cb());
553
+ ref.waitingForMount = [];
554
+ }
555
+ },
545
556
  applySubStateUpdate: ({}, stateName, updater) => {
546
- state[stateName] = typeof updater === "function" ? updater(state[stateName]) : updater;
547
- const externalStateSetter = config[stateHandlerNames[stateName]];
548
- externalStateSetter == null ? void 0 : externalStateSetter(state[stateName]);
557
+ var _a2;
558
+ const apply = () => {
559
+ state[stateName] = typeof updater === "function" ? updater(state[stateName]) : updater;
560
+ const externalStateSetter = config[stateHandlerNames[stateName]];
561
+ externalStateSetter == null ? void 0 : externalStateSetter(state[stateName]);
562
+ };
563
+ const ref = treeDataRef.current;
564
+ if (ref.isMounted) {
565
+ apply();
566
+ } else {
567
+ (_a2 = ref.waitingForMount) != null ? _a2 : ref.waitingForMount = [];
568
+ ref.waitingForMount.push(apply);
569
+ }
549
570
  },
550
571
  // TODO rebuildSubTree: (itemId: string) => void;
551
572
  rebuildTree: () => {
552
- var _a2;
553
- rebuildItemMeta();
554
- (_a2 = config.setState) == null ? void 0 : _a2.call(config, state);
573
+ var _a2, _b2;
574
+ const ref = treeDataRef.current;
575
+ if (ref.isMounted) {
576
+ rebuildItemMeta();
577
+ (_a2 = config.setState) == null ? void 0 : _a2.call(config, state);
578
+ } else {
579
+ (_b2 = ref.waitingForMount) != null ? _b2 : ref.waitingForMount = [];
580
+ ref.waitingForMount.push(() => {
581
+ var _a3;
582
+ rebuildItemMeta();
583
+ (_a3 = config.setState) == null ? void 0 : _a3.call(config, state);
584
+ });
585
+ }
586
+ },
587
+ scheduleRebuildTree: () => {
588
+ rebuildScheduled = true;
555
589
  },
556
590
  getConfig: () => config,
557
591
  setConfig: (_, updater) => {
@@ -584,7 +618,10 @@ var createTree = (initialConfig) => {
584
618
  }
585
619
  return existingInstance;
586
620
  },
587
- getItems: () => itemInstances,
621
+ getItems: () => {
622
+ if (rebuildScheduled) rebuildItemMeta();
623
+ return itemInstances;
624
+ },
588
625
  registerElement: ({}, element) => {
589
626
  if (treeElement === element) {
590
627
  return;
@@ -817,33 +854,60 @@ var getAllLoadedDescendants = (tree, itemId, includeFolders = false) => {
817
854
  if (!tree.getConfig().isItemFolder(tree.getItemInstance(itemId))) {
818
855
  return [itemId];
819
856
  }
820
- const descendants = tree.retrieveChildrenIds(itemId).map((child) => getAllLoadedDescendants(tree, child, includeFolders)).flat();
857
+ const descendants = tree.retrieveChildrenIds(itemId, true).map((child) => getAllLoadedDescendants(tree, child, includeFolders)).flat();
821
858
  return includeFolders ? [itemId, ...descendants] : descendants;
822
859
  };
860
+ var getAllDescendants = (tree, itemId, includeFolders = false) => __async(null, null, function* () {
861
+ yield tree.loadItemData(itemId);
862
+ if (!tree.getConfig().isItemFolder(tree.getItemInstance(itemId))) {
863
+ return [itemId];
864
+ }
865
+ const childrenIds = yield tree.loadChildrenIds(itemId);
866
+ const descendants = (yield Promise.all(
867
+ childrenIds.map(
868
+ (child) => getAllDescendants(tree, child, includeFolders)
869
+ )
870
+ )).flat();
871
+ return includeFolders ? [itemId, ...descendants] : descendants;
872
+ });
873
+ var withLoadingState = (tree, itemId, callback) => __async(null, null, function* () {
874
+ tree.applySubStateUpdate("loadingCheckPropagationItems", (items) => [
875
+ ...items,
876
+ itemId
877
+ ]);
878
+ try {
879
+ yield callback();
880
+ } finally {
881
+ tree.applySubStateUpdate(
882
+ "loadingCheckPropagationItems",
883
+ (items) => items.filter((id) => id !== itemId)
884
+ );
885
+ }
886
+ });
823
887
  var checkboxesFeature = {
824
888
  key: "checkboxes",
825
889
  overwrites: ["selection"],
826
890
  getInitialState: (initialState) => __spreadValues({
827
- checkedItems: []
891
+ checkedItems: [],
892
+ loadingCheckPropagationItems: []
828
893
  }, initialState),
829
894
  getDefaultConfig: (defaultConfig, tree) => {
830
- var _a, _b, _c;
831
- const hasAsyncLoader = (_a = defaultConfig.features) == null ? void 0 : _a.some(
832
- (f) => f.key === "async-data-loader"
833
- );
834
- if (hasAsyncLoader && defaultConfig.propagateCheckedState) {
835
- throwError(`propagateCheckedState not supported with async trees`);
836
- }
837
- const propagateCheckedState = (_b = defaultConfig.propagateCheckedState) != null ? _b : !hasAsyncLoader;
838
- const canCheckFolders = (_c = defaultConfig.canCheckFolders) != null ? _c : !propagateCheckedState;
895
+ var _a, _b;
896
+ const propagateCheckedState = (_a = defaultConfig.propagateCheckedState) != null ? _a : true;
897
+ const canCheckFolders = (_b = defaultConfig.canCheckFolders) != null ? _b : !propagateCheckedState;
839
898
  return __spreadValues({
840
899
  setCheckedItems: makeStateUpdater("checkedItems", tree),
900
+ setLoadingCheckPropagationItems: makeStateUpdater(
901
+ "loadingCheckPropagationItems",
902
+ tree
903
+ ),
841
904
  propagateCheckedState,
842
905
  canCheckFolders
843
906
  }, defaultConfig);
844
907
  },
845
908
  stateHandlerNames: {
846
- checkedItems: "setCheckedItems"
909
+ checkedItems: "setCheckedItems",
910
+ loadingCheckPropagationItems: "setLoadingCheckPropagationItems"
847
911
  },
848
912
  treeInstance: {
849
913
  setCheckedItems: ({ tree }, checkedItems) => {
@@ -863,13 +927,13 @@ var checkboxesFeature = {
863
927
  }
864
928
  };
865
929
  },
866
- toggleCheckedState: ({ item }) => {
930
+ toggleCheckedState: (_0) => __async(null, [_0], function* ({ item }) {
867
931
  if (item.getCheckedState() === "checked" /* Checked */) {
868
- item.setUnchecked();
932
+ yield item.setUnchecked();
869
933
  } else {
870
- item.setChecked();
934
+ yield item.setChecked();
871
935
  }
872
- },
936
+ }),
873
937
  getCheckedState: ({ item, tree }) => {
874
938
  const { checkedItems } = tree.getState();
875
939
  const { propagateCheckedState } = tree.getConfig();
@@ -879,6 +943,7 @@ var checkboxesFeature = {
879
943
  }
880
944
  if (item.isFolder() && propagateCheckedState) {
881
945
  const descendants = getAllLoadedDescendants(tree, itemId);
946
+ if (descendants.length === 0) return "unchecked" /* Unchecked */;
882
947
  if (descendants.every((d) => checkedItems.includes(d))) {
883
948
  return "checked" /* Checked */;
884
949
  }
@@ -888,36 +953,48 @@ var checkboxesFeature = {
888
953
  }
889
954
  return "unchecked" /* Unchecked */;
890
955
  },
891
- setChecked: ({ item, tree, itemId }) => {
892
- const { propagateCheckedState, canCheckFolders } = tree.getConfig();
893
- if (item.isFolder() && propagateCheckedState) {
894
- tree.applySubStateUpdate("checkedItems", (items) => [
895
- ...items,
896
- ...getAllLoadedDescendants(tree, itemId, canCheckFolders)
897
- ]);
898
- } else if (!item.isFolder() || canCheckFolders) {
899
- tree.applySubStateUpdate("checkedItems", (items) => [...items, itemId]);
900
- }
901
- },
902
- setUnchecked: ({ item, tree, itemId }) => {
903
- const { propagateCheckedState, canCheckFolders } = tree.getConfig();
904
- if (item.isFolder() && propagateCheckedState) {
905
- const descendants = getAllLoadedDescendants(
906
- tree,
907
- itemId,
908
- canCheckFolders
909
- );
910
- tree.applySubStateUpdate(
911
- "checkedItems",
912
- (items) => items.filter((id) => !descendants.includes(id) && id !== itemId)
913
- );
914
- } else {
915
- tree.applySubStateUpdate(
916
- "checkedItems",
917
- (items) => items.filter((id) => id !== itemId)
918
- );
919
- }
920
- }
956
+ setChecked: (_0) => __async(null, [_0], function* ({ item, tree, itemId }) {
957
+ yield withLoadingState(tree, itemId, () => __async(null, null, function* () {
958
+ const { propagateCheckedState, canCheckFolders } = tree.getConfig();
959
+ if (item.isFolder() && propagateCheckedState) {
960
+ const descendants = yield getAllDescendants(
961
+ tree,
962
+ itemId,
963
+ canCheckFolders
964
+ );
965
+ tree.applySubStateUpdate("checkedItems", (items) => [
966
+ ...items,
967
+ ...descendants
968
+ ]);
969
+ } else if (!item.isFolder() || canCheckFolders) {
970
+ tree.applySubStateUpdate("checkedItems", (items) => [
971
+ ...items,
972
+ itemId
973
+ ]);
974
+ }
975
+ }));
976
+ }),
977
+ setUnchecked: (_0) => __async(null, [_0], function* ({ item, tree, itemId }) {
978
+ yield withLoadingState(tree, itemId, () => __async(null, null, function* () {
979
+ const { propagateCheckedState, canCheckFolders } = tree.getConfig();
980
+ if (item.isFolder() && propagateCheckedState) {
981
+ const descendants = yield getAllDescendants(
982
+ tree,
983
+ itemId,
984
+ canCheckFolders
985
+ );
986
+ tree.applySubStateUpdate(
987
+ "checkedItems",
988
+ (items) => items.filter((id) => !descendants.includes(id) && id !== itemId)
989
+ );
990
+ } else {
991
+ tree.applySubStateUpdate(
992
+ "checkedItems",
993
+ (items) => items.filter((id) => id !== itemId)
994
+ );
995
+ }
996
+ }));
997
+ })
921
998
  }
922
999
  };
923
1000
 
@@ -929,7 +1006,8 @@ var specialKeys = {
929
1006
  plus: /^(NumpadAdd|Plus)$/,
930
1007
  minus: /^(NumpadSubtract|Minus)$/,
931
1008
  control: /^(ControlLeft|ControlRight)$/,
932
- shift: /^(ShiftLeft|ShiftRight)$/
1009
+ shift: /^(ShiftLeft|ShiftRight)$/,
1010
+ metaorcontrol: /^(MetaLeft|MetaRight|ControlLeft|ControlRight)$/
933
1011
  };
934
1012
  var testHotkeyMatch = (pressedKeys, tree, hotkey) => {
935
1013
  const supposedKeys = hotkey.hotkey.toLowerCase().split("+");
@@ -1034,6 +1112,12 @@ var loadItemData = (tree, itemId) => __async(null, null, function* () {
1034
1112
  var _a;
1035
1113
  const config = tree.getConfig();
1036
1114
  const dataRef = getDataRef(tree);
1115
+ if (!dataRef.current.itemData[itemId]) {
1116
+ tree.applySubStateUpdate("loadingItemData", (loadingItemData) => [
1117
+ ...loadingItemData,
1118
+ itemId
1119
+ ]);
1120
+ }
1037
1121
  const item = yield config.dataLoader.getItem(itemId);
1038
1122
  dataRef.current.itemData[itemId] = item;
1039
1123
  (_a = config.onLoadedItem) == null ? void 0 : _a.call(config, itemId, item);
@@ -1048,6 +1132,12 @@ var loadChildrenIds = (tree, itemId) => __async(null, null, function* () {
1048
1132
  const config = tree.getConfig();
1049
1133
  const dataRef = getDataRef(tree);
1050
1134
  let childrenIds;
1135
+ if (!dataRef.current.childrenIds[itemId]) {
1136
+ tree.applySubStateUpdate("loadingItemChildrens", (loadingItemChildrens) => [
1137
+ ...loadingItemChildrens,
1138
+ itemId
1139
+ ]);
1140
+ }
1051
1141
  if ("getChildrenWithData" in config.dataLoader) {
1052
1142
  const children = yield config.dataLoader.getChildrenWithData(itemId);
1053
1143
  childrenIds = children.map((c) => c.id);
@@ -1108,11 +1198,7 @@ var asyncDataLoaderFeature = {
1108
1198
  return dataRef.current.itemData[itemId];
1109
1199
  }
1110
1200
  if (!tree.getState().loadingItemData.includes(itemId) && !skipFetch) {
1111
- tree.applySubStateUpdate("loadingItemData", (loadingItemData) => [
1112
- ...loadingItemData,
1113
- itemId
1114
- ]);
1115
- loadItemData(tree, itemId);
1201
+ setTimeout(() => loadItemData(tree, itemId));
1116
1202
  }
1117
1203
  return (_b = (_a = config.createLoadingItemData) == null ? void 0 : _a.call(config)) != null ? _b : null;
1118
1204
  },
@@ -1124,11 +1210,7 @@ var asyncDataLoaderFeature = {
1124
1210
  if (tree.getState().loadingItemChildrens.includes(itemId) || skipFetch) {
1125
1211
  return [];
1126
1212
  }
1127
- tree.applySubStateUpdate(
1128
- "loadingItemChildrens",
1129
- (loadingItemChildrens) => [...loadingItemChildrens, itemId]
1130
- );
1131
- loadChildrenIds(tree, itemId);
1213
+ setTimeout(() => loadChildrenIds(tree, itemId));
1132
1214
  return [];
1133
1215
  }
1134
1216
  },
@@ -1138,10 +1220,6 @@ var asyncDataLoaderFeature = {
1138
1220
  var _a;
1139
1221
  if (!optimistic) {
1140
1222
  (_a = getDataRef(tree).current.itemData) == null ? true : delete _a[itemId];
1141
- tree.applySubStateUpdate("loadingItemData", (loadingItemData) => [
1142
- ...loadingItemData,
1143
- itemId
1144
- ]);
1145
1223
  }
1146
1224
  yield loadItemData(tree, itemId);
1147
1225
  }),
@@ -1149,10 +1227,6 @@ var asyncDataLoaderFeature = {
1149
1227
  var _a;
1150
1228
  if (!optimistic) {
1151
1229
  (_a = getDataRef(tree).current.childrenIds) == null ? true : delete _a[itemId];
1152
- tree.applySubStateUpdate(
1153
- "loadingItemChildrens",
1154
- (loadingItemChildrens) => [...loadingItemChildrens, itemId]
1155
- );
1156
1230
  }
1157
1231
  yield loadChildrenIds(tree, itemId);
1158
1232
  }),
@@ -1296,8 +1370,7 @@ var getTargetPlacement = (e, item, tree, canMakeChild) => {
1296
1370
  }
1297
1371
  return { type: makeChildType };
1298
1372
  };
1299
- var getDragCode = (e, item, tree) => {
1300
- const placement = getTargetPlacement(e, item, tree, true);
1373
+ var getDragCode = (item, placement) => {
1301
1374
  return [
1302
1375
  item.getId(),
1303
1376
  placement.type,
@@ -1338,6 +1411,9 @@ var getDragTarget = (e, item, tree, canReorder = tree.getConfig().canReorder) =>
1338
1411
  const canMakeChild = canDrop(e.dataTransfer, itemTarget, tree);
1339
1412
  const placement = getTargetPlacement(e, item, tree, canMakeChild);
1340
1413
  if (!canReorder && parent && canBecomeSibling && placement.type !== 2 /* MakeChild */) {
1414
+ if (draggedItems == null ? void 0 : draggedItems.some((item2) => item2.isDescendentOf(parent.getId()))) {
1415
+ return itemTarget;
1416
+ }
1341
1417
  return parentTarget;
1342
1418
  }
1343
1419
  if (!canReorder && parent && !canBecomeSibling) {
@@ -1372,16 +1448,29 @@ var getDragTarget = (e, item, tree, canReorder = tree.getConfig().canReorder) =>
1372
1448
  };
1373
1449
 
1374
1450
  // src/features/drag-and-drop/feature.ts
1451
+ var handleAutoOpenFolder = (dataRef, tree, item, placement) => {
1452
+ const { openOnDropDelay } = tree.getConfig();
1453
+ const dragCode = dataRef.current.lastDragCode;
1454
+ if (!openOnDropDelay || !item.isFolder() || item.isExpanded() || placement.type !== 2 /* MakeChild */) {
1455
+ return;
1456
+ }
1457
+ clearTimeout(dataRef.current.autoExpandTimeout);
1458
+ dataRef.current.autoExpandTimeout = setTimeout(() => {
1459
+ if (dragCode !== dataRef.current.lastDragCode || !dataRef.current.lastAllowDrop)
1460
+ return;
1461
+ item.expand();
1462
+ }, openOnDropDelay);
1463
+ };
1375
1464
  var defaultCanDropForeignDragObject = () => false;
1376
1465
  var dragAndDropFeature = {
1377
1466
  key: "drag-and-drop",
1378
- deps: ["selection"],
1379
1467
  getDefaultConfig: (defaultConfig, tree) => __spreadValues({
1380
1468
  canDrop: (_, target) => target.item.isFolder(),
1381
1469
  canDropForeignDragObject: defaultCanDropForeignDragObject,
1382
1470
  canDragForeignDragObjectOver: defaultConfig.canDropForeignDragObject !== defaultCanDropForeignDragObject ? (dataTransfer) => dataTransfer.effectAllowed !== "none" : () => false,
1383
1471
  setDndState: makeStateUpdater("dnd", tree),
1384
- canReorder: true
1472
+ canReorder: true,
1473
+ openOnDropDelay: 800
1385
1474
  }, defaultConfig),
1386
1475
  stateHandlerNames: {
1387
1476
  dnd: "setDndState"
@@ -1422,7 +1511,7 @@ var dragAndDropFeature = {
1422
1511
  };
1423
1512
  }
1424
1513
  }
1425
- const bb = (_f = targetItem.getElement()) == null ? void 0 : _f.getBoundingClientRect();
1514
+ const bb = (_f = targetItem == null ? void 0 : targetItem.getElement()) == null ? void 0 : _f.getBoundingClientRect();
1426
1515
  if (bb) {
1427
1516
  return {
1428
1517
  indent,
@@ -1478,20 +1567,20 @@ var dragAndDropFeature = {
1478
1567
  draggable: true,
1479
1568
  onDragEnter: (e) => e.preventDefault(),
1480
1569
  onDragStart: (e) => {
1481
- var _a, _b, _c;
1482
- const selectedItems = tree.getSelectedItems();
1570
+ var _a, _b, _c, _d;
1571
+ const selectedItems = tree.getSelectedItems ? tree.getSelectedItems() : [tree.getFocusedItem()];
1483
1572
  const items = selectedItems.includes(item) ? selectedItems : [item];
1484
1573
  const config = tree.getConfig();
1485
1574
  if (!selectedItems.includes(item)) {
1486
- tree.setSelectedItems([item.getItemMeta().itemId]);
1575
+ (_a = tree.setSelectedItems) == null ? void 0 : _a.call(tree, [item.getItemMeta().itemId]);
1487
1576
  }
1488
- if (!((_b = (_a = config.canDrag) == null ? void 0 : _a.call(config, items)) != null ? _b : true)) {
1577
+ if (!((_c = (_b = config.canDrag) == null ? void 0 : _b.call(config, items)) != null ? _c : true)) {
1489
1578
  e.preventDefault();
1490
1579
  return;
1491
1580
  }
1492
1581
  if (config.setDragImage) {
1493
1582
  const { imgElement, xOffset, yOffset } = config.setDragImage(items);
1494
- (_c = e.dataTransfer) == null ? void 0 : _c.setDragImage(imgElement, xOffset != null ? xOffset : 0, yOffset != null ? yOffset : 0);
1583
+ (_d = e.dataTransfer) == null ? void 0 : _d.setDragImage(imgElement, xOffset != null ? xOffset : 0, yOffset != null ? yOffset : 0);
1495
1584
  }
1496
1585
  if (config.createForeignDragObject && e.dataTransfer) {
1497
1586
  const { format, data, dropEffect, effectAllowed } = config.createForeignDragObject(items);
@@ -1508,7 +1597,8 @@ var dragAndDropFeature = {
1508
1597
  var _a, _b, _c;
1509
1598
  e.stopPropagation();
1510
1599
  const dataRef = tree.getDataRef();
1511
- const nextDragCode = getDragCode(e, item, tree);
1600
+ const placement = getTargetPlacement(e, item, tree, true);
1601
+ const nextDragCode = getDragCode(item, placement);
1512
1602
  if (nextDragCode === dataRef.current.lastDragCode) {
1513
1603
  if (dataRef.current.lastAllowDrop) {
1514
1604
  e.preventDefault();
@@ -1517,6 +1607,7 @@ var dragAndDropFeature = {
1517
1607
  }
1518
1608
  dataRef.current.lastDragCode = nextDragCode;
1519
1609
  dataRef.current.lastDragEnter = Date.now();
1610
+ handleAutoOpenFolder(dataRef, tree, item, placement);
1520
1611
  const target = getDragTarget(e, item, tree);
1521
1612
  if (!((_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems) && (!e.dataTransfer || !((_c = (_b = tree.getConfig()).canDragForeignDragObjectOver) == null ? void 0 : _c.call(_b, e.dataTransfer, target)))) {
1522
1613
  dataRef.current.lastAllowDrop = false;
@@ -1563,12 +1654,18 @@ var dragAndDropFeature = {
1563
1654
  e.stopPropagation();
1564
1655
  const dataRef = tree.getDataRef();
1565
1656
  const target = getDragTarget(e, item, tree);
1566
- if (!canDrop(e.dataTransfer, target, tree)) {
1657
+ const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1658
+ const isValidDrop = canDrop(e.dataTransfer, target, tree);
1659
+ tree.applySubStateUpdate("dnd", {
1660
+ draggedItems: void 0,
1661
+ draggingOverItem: void 0,
1662
+ dragTarget: void 0
1663
+ });
1664
+ if (!isValidDrop) {
1567
1665
  return;
1568
1666
  }
1569
1667
  e.preventDefault();
1570
1668
  const config = tree.getConfig();
1571
- const draggedItems = (_a = tree.getState().dnd) == null ? void 0 : _a.draggedItems;
1572
1669
  dataRef.current.lastDragCode = void 0;
1573
1670
  if (draggedItems) {
1574
1671
  yield (_b = config.onDrop) == null ? void 0 : _b.call(config, draggedItems, target);
@@ -1581,6 +1678,10 @@ var dragAndDropFeature = {
1581
1678
  const target = tree.getDragTarget();
1582
1679
  return target ? target.item.getId() === item.getId() : false;
1583
1680
  },
1681
+ isUnorderedDragTarget: ({ tree, item }) => {
1682
+ const target = tree.getDragTarget();
1683
+ return target ? !isOrderedDragTarget(target) && target.item.getId() === item.getId() : false;
1684
+ },
1584
1685
  isDragTargetAbove: ({ tree, item }) => {
1585
1686
  const target = tree.getDragTarget();
1586
1687
  if (!target || !isOrderedDragTarget(target) || target.item !== item.getParent())
@@ -1740,7 +1841,10 @@ var keyboardDragAndDropFeature = {
1740
1841
  preventDefault: true,
1741
1842
  isEnabled: (tree) => !tree.getState().dnd,
1742
1843
  handler: (_, tree) => {
1743
- const selectedItems = tree.getSelectedItems();
1844
+ var _a, _b;
1845
+ const selectedItems = (_b = (_a = tree.getSelectedItems) == null ? void 0 : _a.call(tree)) != null ? _b : [
1846
+ tree.getFocusedItem()
1847
+ ];
1744
1848
  const focusedItem = tree.getFocusedItem();
1745
1849
  tree.startKeyboardDrag(
1746
1850
  selectedItems.includes(focusedItem) ? selectedItems : selectedItems.concat(focusedItem)