Skip to content

Commit f803e2a

Browse files
committed
fix navigation
1 parent 6d0e0ea commit f803e2a

File tree

1 file changed

+45
-59
lines changed
  • packages/svelte-file-tree/src/lib/components

1 file changed

+45
-59
lines changed

packages/svelte-file-tree/src/lib/components/Tree.svelte

Lines changed: 45 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
type ExternalDropTargetGetFeedbackArgs,
1212
} from "@atlaskit/pragmatic-drag-and-drop/external/adapter";
1313
import { DEV } from "esm-env";
14-
import { getContext, hasContext, setContext, tick } from "svelte";
14+
import { getContext, hasContext, setContext } from "svelte";
1515
import { SvelteSet } from "svelte/reactivity";
1616
import { falsePredicate, isControlOrMeta, noop, truePredicate } from "$lib/internal/helpers.js";
1717
import {
@@ -196,47 +196,54 @@
196196
return document.getElementById(elementId);
197197
}
198198
199-
function getFirstVisibleItem(item: TreeItemState<TFile, TFolder>) {
200-
let current: TreeItemState<TFile, TFolder> | undefined = item;
201-
while (!current.visible) {
202-
if (current.node.type === "folder") {
203-
current = items[current.order + current.node.count + 1];
204-
} else {
205-
current = items[current.order + 1];
206-
}
207-
208-
if (current === undefined) {
209-
return;
210-
}
211-
}
212-
return current;
213-
}
214-
215199
function getNextVisibleItem(
216200
item: TreeItemState<TFile, TFolder>,
217201
options: { skipChildren?: boolean } = {},
218202
) {
219203
const { skipChildren = false } = options;
220204
221-
let current: TreeItemState<TFile, TFolder> | undefined = item;
222-
if (current.node.type === "folder" && (skipChildren || !current.expanded)) {
223-
current = items[current.order + current.node.count + 1];
205+
let current: TreeItemState<TFile, TFolder> | undefined;
206+
if (item.node.type === "folder" && (skipChildren || !item.expanded)) {
207+
current = items[item.order + item.node.count + 1];
224208
} else {
225-
current = items[current.order + 1];
209+
current = items[item.order + 1];
226210
}
227211
228-
if (current === undefined) {
229-
return;
212+
while (current !== undefined && !current.visible) {
213+
if (current.node.type === "folder") {
214+
current = items[current.order + current.node.count + 1];
215+
} else {
216+
current = items[current.order + 1];
217+
}
230218
}
231219
232-
return getFirstVisibleItem(current);
220+
return current;
233221
}
234222
235223
function getPreviousVisibleItem(item: TreeItemState<TFile, TFolder>) {
236-
let current: TreeItemState<TFile, TFolder> | undefined = item;
237-
do {
224+
let current = items[item.order - 1];
225+
while (current !== undefined && !current.visible) {
238226
current = items[current.order - 1];
239-
} while (current !== undefined && !current.visible);
227+
}
228+
return current;
229+
}
230+
231+
function getFirstVisibleItem() {
232+
let current = items[0];
233+
if (current !== undefined && !current.visible) {
234+
current = getNextVisibleItem(current);
235+
}
236+
return current;
237+
}
238+
239+
function getLastVisibleItem() {
240+
let current = items[items.length - 1];
241+
if (current !== undefined && !current.visible) {
242+
while (current.parent !== undefined && !current.parent.visible) {
243+
current = current.parent;
244+
}
245+
current = getPreviousVisibleItem(current);
246+
}
240247
return current;
241248
}
242249
@@ -281,8 +288,8 @@
281288
}
282289
}
283290
284-
if (lastSelected === undefined) {
285-
let current: TreeItemState<TFile, TFolder> | undefined = items[0]!;
291+
if (lastSelected === undefined || !lastSelected.visible) {
292+
let current: TreeItemState<TFile, TFolder> | undefined = getFirstVisibleItem()!;
286293
do {
287294
selectedIds.add(current.node.id);
288295
if (current.node === item.node) {
@@ -293,12 +300,10 @@
293300
return;
294301
}
295302
296-
const following = lastSelected.order < item.order;
297-
const navigate = following ? getNextVisibleItem : getPreviousVisibleItem;
298-
303+
const down = lastSelected.order < item.order;
299304
let current: TreeItemState<TFile, TFolder> | undefined = lastSelected;
300305
while (current.node !== item.node) {
301-
current = navigate(current);
306+
current = down ? getNextVisibleItem(current) : getPreviousVisibleItem(current);
302307
if (current === undefined) {
303308
break;
304309
}
@@ -742,7 +747,6 @@
742747
case "PageDown":
743748
case "PageUp": {
744749
const down = event.key === "PageDown";
745-
const navigate = down ? getNextVisibleItem : getPreviousVisibleItem;
746750
const shouldSelectMultiple = event.shiftKey && isControlOrMeta(event);
747751
748752
const maxScrollDistance = Math.min(
@@ -754,7 +758,7 @@
754758
let current = item;
755759
let currentElement: HTMLElement = event.currentTarget;
756760
while (true) {
757-
const next = navigate(current);
761+
const next = down ? getNextVisibleItem(current) : getPreviousVisibleItem(current);
758762
if (next === undefined) {
759763
break;
760764
}
@@ -790,37 +794,19 @@
790794
currentElement.focus();
791795
break;
792796
}
793-
case "Home": {
794-
const first = getFirstVisibleItem(items[0]!)!;
795-
if (first === item) {
796-
break;
797-
}
798-
799-
if (event.shiftKey && isControlOrMeta(event)) {
800-
let current: TreeItemState<TFile, TFolder> | undefined = item;
801-
do {
802-
selectedIds.add(current.node.id);
803-
current = getPreviousVisibleItem(current);
804-
} while (current !== undefined);
805-
} else {
806-
selectedIds.clear();
807-
selectedIds.add(first.node.id);
808-
}
809-
810-
focusItem(first);
811-
break;
812-
}
797+
case "Home":
813798
case "End": {
814-
const last = getPreviousVisibleItem(items[items.length - 1]!)!;
815-
if (last === item) {
799+
const down = event.key === "End";
800+
const last = down ? getLastVisibleItem()! : getFirstVisibleItem()!;
801+
if (item === last) {
816802
break;
817803
}
818804
819805
if (event.shiftKey && isControlOrMeta(event)) {
820806
let current: TreeItemState<TFile, TFolder> | undefined = item;
821807
do {
822808
selectedIds.add(current.node.id);
823-
current = getNextVisibleItem(current);
809+
current = down ? getNextVisibleItem(current) : getPreviousVisibleItem(current);
824810
} while (current !== undefined);
825811
} else {
826812
selectedIds.clear();
@@ -862,7 +848,7 @@
862848
break;
863849
}
864850
865-
let current: TreeItemState<TFile, TFolder> | undefined = getFirstVisibleItem(items[0]!)!;
851+
let current: TreeItemState<TFile, TFolder> | undefined = getFirstVisibleItem()!;
866852
do {
867853
selectedIds.add(current.node.id);
868854
current = getNextVisibleItem(current);

0 commit comments

Comments
 (0)