From 7a9a85ea323e79e8a122d5e19a4dfb9618a2ce41 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Fri, 13 Oct 2023 13:55:27 +0800 Subject: [PATCH] :art: https://github.com/siyuan-note/siyuan/issues/9417 --- app/src/protyle/render/av/keydown.ts | 39 +++++++++++++++++++++++----- app/src/protyle/render/av/row.ts | 6 +++-- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/app/src/protyle/render/av/keydown.ts b/app/src/protyle/render/av/keydown.ts index 5d0d5f59b..58271ef9f 100644 --- a/app/src/protyle/render/av/keydown.ts +++ b/app/src/protyle/render/av/keydown.ts @@ -1,5 +1,5 @@ import {matchHotKey} from "../../util/hotKey"; -import {selectRow, updateHeader} from "./row"; +import {selectRow} from "./row"; import {cellScrollIntoView, popTextCell} from "./cell"; export const avKeydown = (event: KeyboardEvent, nodeElement: HTMLElement, protyle: IProtyle) => { @@ -87,17 +87,42 @@ export const avKeydown = (event: KeyboardEvent, nodeElement: HTMLElement, protyl } } - const selectRowElement = nodeElement.querySelector(".av__row--select:not(.av__row--header)") as HTMLElement; - if (selectRowElement) { + const selectRowElements = nodeElement.querySelectorAll(".av__row--select:not(.av__row--header)"); + if (selectRowElements.length > 0) { if (event.key === "Escape") { - selectRowElement.querySelector(".av__firstcol use").setAttribute("xlink:href", "#iconUncheck"); - selectRowElement.classList.remove("av__row--select"); - updateHeader(selectRowElement); + selectRow(selectRowElements[0].querySelector(".av__firstcol"), "unselectAll"); + return true; + } + if (event.key === "Enter") { + selectRow(selectRowElements[0].querySelector(".av__firstcol"), "unselectAll"); + popTextCell(protyle, [selectRowElements[0].querySelector(".av__cell")]); + event.preventDefault(); return true; } // event.shiftKey if (event.key === "ArrowUp") { - return true; + const previousRowElement = selectRowElements[0].previousElementSibling + selectRow(selectRowElements[0].querySelector(".av__firstcol"), "unselectAll"); + if (previousRowElement && !previousRowElement.classList.contains("av__row--header")) { + selectRow(previousRowElement.querySelector(".av__firstcol"), "select"); + event.preventDefault(); + return true; + } else { + nodeElement.classList.add("protyle-wysiwyg--select") + return false + } + } + if (event.key === "ArrowDown") { + const nextRowElement = selectRowElements[selectRowElements.length - 1].nextElementSibling + selectRow(selectRowElements[0].querySelector(".av__firstcol"), "unselectAll"); + if (nextRowElement && !nextRowElement.classList.contains("av__row--add")) { + selectRow(nextRowElement.querySelector(".av__firstcol"), "select"); + event.preventDefault(); + return true; + } else { + nodeElement.classList.add("protyle-wysiwyg--select") + return false + } } } return false; diff --git a/app/src/protyle/render/av/row.ts b/app/src/protyle/render/av/row.ts index 6a16597c1..2d246deec 100644 --- a/app/src/protyle/render/av/row.ts +++ b/app/src/protyle/render/av/row.ts @@ -1,9 +1,10 @@ import {hasClosestBlock} from "../../util/hasClosest"; +import {focusBlock} from "../../util/selection"; -export const selectRow = (checkElement: Element, type: "toggle" | "select" | "unselect") => { +export const selectRow = (checkElement: Element, type: "toggle" | "select" | "unselect" | "unselectAll") => { const rowElement = checkElement.parentElement; const useElement = checkElement.querySelector("use"); - if (rowElement.classList.contains("av__row--header")) { + if (rowElement.classList.contains("av__row--header") || type === "unselectAll") { if ("#iconCheck" === useElement.getAttribute("xlink:href")) { rowElement.parentElement.querySelectorAll(".av__firstcol").forEach(item => { item.querySelector("use").setAttribute("xlink:href", "#iconUncheck"); @@ -24,6 +25,7 @@ export const selectRow = (checkElement: Element, type: "toggle" | "select" | "un useElement.setAttribute("xlink:href", "#iconUncheck"); } } + focusBlock(hasClosestBlock(rowElement) as HTMLElement); updateHeader(rowElement); }