siyuan/app/src/util/upDownHint.ts

64 lines
3 KiB
TypeScript
Raw Normal View History

export const upDownHint = (listElement: Element, event: KeyboardEvent, classActiveName = "b3-list-item--focus") => {
let currentHintElement: HTMLElement = listElement.querySelector("." + classActiveName);
if (!currentHintElement) {
2023-11-14 23:18:18 +08:00
return;
}
const className = classActiveName.split("--")[0];
if (event.key === "ArrowDown") {
event.preventDefault();
event.stopPropagation();
currentHintElement.classList.remove(classActiveName);
currentHintElement = currentHintElement.nextElementSibling as HTMLElement;
while (currentHintElement &&
(currentHintElement.classList.contains("fn__none") || !currentHintElement.classList.contains(className))) {
currentHintElement = currentHintElement.nextElementSibling as HTMLElement;
}
if (!currentHintElement) {
currentHintElement = listElement.children[0] as HTMLElement;
while (currentHintElement &&
(currentHintElement.classList.contains("fn__none") || !currentHintElement.classList.contains(className))) {
currentHintElement = currentHintElement.nextElementSibling as HTMLElement;
}
}
if (!currentHintElement) {
2023-11-10 20:02:03 +08:00
return;
}
currentHintElement.classList.add(classActiveName);
if (listElement.scrollTop < currentHintElement.offsetTop - listElement.clientHeight + currentHintElement.clientHeight ||
listElement.scrollTop > currentHintElement.offsetTop) {
2022-12-11 00:32:40 +08:00
currentHintElement.scrollIntoView(listElement.scrollTop > currentHintElement.offsetTop);
}
return currentHintElement;
} else if (event.key === "ArrowUp") {
event.preventDefault();
event.stopPropagation();
currentHintElement.classList.remove(classActiveName);
currentHintElement = currentHintElement.previousElementSibling as HTMLElement;
while (currentHintElement &&
(currentHintElement.classList.contains("fn__none") || !currentHintElement.classList.contains(className))) {
currentHintElement = currentHintElement.previousElementSibling as HTMLElement;
}
if (!currentHintElement) {
2023-11-10 20:02:03 +08:00
currentHintElement = listElement.children[listElement.children.length - 1] as HTMLElement;
while (currentHintElement &&
(currentHintElement.classList.contains("fn__none") || !currentHintElement.classList.contains(className))) {
currentHintElement = currentHintElement.previousElementSibling as HTMLElement;
}
}
if (!currentHintElement) {
2023-11-10 20:02:03 +08:00
return;
}
currentHintElement.classList.add(classActiveName);
2023-10-11 11:25:21 +08:00
const overTop = listElement.scrollTop > currentHintElement.offsetTop - (currentHintElement.previousElementSibling?.clientHeight || 0);
if (listElement.scrollTop < currentHintElement.offsetTop - listElement.clientHeight + currentHintElement.clientHeight || overTop) {
currentHintElement.scrollIntoView(overTop);
}
return currentHintElement;
}
};