diff --git a/app/src/protyle/render/av/action.ts b/app/src/protyle/render/av/action.ts index 06e26c043..2bc17fe5c 100644 --- a/app/src/protyle/render/av/action.ts +++ b/app/src/protyle/render/av/action.ts @@ -5,7 +5,7 @@ import {openEditorTab} from "../../../menus/util"; import {copySubMenu} from "../../../menus/commonMenuItem"; import {getCellText, getTypeByCellElement, popTextCell} from "./cell"; import {getColIconByType, showColMenu} from "./col"; -import {insertAttrViewBlockAnimation, setPageSize, stickyRow, updateHeader} from "./row"; +import {deleteRow, insertAttrViewBlockAnimation, setPageSize, stickyRow, updateHeader} from "./row"; import {emitOpenMenu} from "../../../plugin/EventBus"; import {addCol} from "./col"; import {openMenuPanel} from "./openMenuPanel"; @@ -304,49 +304,23 @@ export const avContextmenu = (protyle: IProtyle, rowElement: HTMLElement, positi } rowElement.classList.add("av__row--select"); rowElement.querySelector(".av__firstcol use").setAttribute("xlink:href", "#iconCheck"); - const rowIds: string[] = []; - const blockIds: string[] = []; const rowElements = blockElement.querySelectorAll(".av__row--select:not(.av__row--header)"); - rowElements.forEach(item => { - rowIds.push(item.getAttribute("data-id")); - blockIds.push(item.querySelector(".av__cell[data-block-id]").getAttribute("data-block-id")); - }); updateHeader(rowElement); menu.addItem({ icon: "iconTrashcan", label: window.siyuan.languages.delete, click() { - const avID = blockElement.getAttribute("data-av-id"); - const undoOperations: IOperation[] = []; - rowElements.forEach(item => { - undoOperations.push({ - action: "insertAttrViewBlock", - avID, - previousID: item.previousElementSibling?.getAttribute("data-id") || "", - srcIDs: [item.getAttribute("data-id")], - isDetached: item.querySelector('.av__cell[data-detached="true"]') ? true : false, - }); - }); - transaction(protyle, [{ - action: "removeAttrViewBlock", - srcIDs: blockIds, - avID, - }], undoOperations); - rowElements.forEach(item => { - item.remove(); - }); - stickyRow(blockElement, protyle.contentElement.getBoundingClientRect(), "all"); - updateHeader(blockElement.querySelector(".av__row")); + deleteRow(blockElement, protyle); } }); - if (rowIds.length === 1 && !rowElements[0].querySelector('[data-detached="true"]')) { + if (rowElements.length === 1 && !rowElements[0].querySelector('[data-detached="true"]')) { menu.addSeparator(); - openEditorTab(protyle.app, rowIds[0]); + openEditorTab(protyle.app, rowElements[0].getAttribute("data-id")); menu.addItem({ label: window.siyuan.languages.copy, icon: "iconCopy", type: "submenu", - submenu: copySubMenu(rowIds[0]) + submenu: copySubMenu(rowElements[0].getAttribute("data-id")) }); } menu.addSeparator(); diff --git a/app/src/protyle/render/av/keydown.ts b/app/src/protyle/render/av/keydown.ts index bcc5d79f0..3388e87a4 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} from "./row"; +import {deleteRow, selectRow} from "./row"; import {cellScrollIntoView, popTextCell, updateCellsValue} from "./cell"; import {avContextmenu} from "./action"; import {hasClosestByClassName} from "../../util/hasClosest"; @@ -132,6 +132,11 @@ export const avKeydown = (event: KeyboardEvent, nodeElement: HTMLElement, protyl selectRow(selectRowElements[0].querySelector(".av__firstcol"), "unselectAll"); return true; } + if (event.key === "Backspace") { + event.preventDefault(); + deleteRow(nodeElement, protyle); + return true; + } if (event.key === "Enter") { selectRow(selectRowElements[0].querySelector(".av__firstcol"), "unselectAll"); popTextCell(protyle, [selectRowElements[0].querySelector(".av__cell")]); diff --git a/app/src/protyle/render/av/row.ts b/app/src/protyle/render/av/row.ts index a3c07b13a..e160617a3 100644 --- a/app/src/protyle/render/av/row.ts +++ b/app/src/protyle/render/av/row.ts @@ -225,3 +225,32 @@ export const setPageSize = (options: { y: rect.bottom }); }; + +export const deleteRow = (blockElement: HTMLElement, protyle: IProtyle) => { + const avID = blockElement.getAttribute("data-av-id"); + const undoOperations: IOperation[] = []; + const rowElements = blockElement.querySelectorAll(".av__row--select:not(.av__row--header)"); + const blockIds:string[] = []; + rowElements.forEach(item => { + blockIds.push(item.querySelector(".av__cell[data-block-id]").getAttribute("data-block-id")); + }); + rowElements.forEach(item => { + undoOperations.push({ + action: "insertAttrViewBlock", + avID, + previousID: item.previousElementSibling?.getAttribute("data-id") || "", + srcIDs: [item.getAttribute("data-id")], + isDetached: item.querySelector('.av__cell[data-detached="true"]') ? true : false, + }); + }); + transaction(protyle, [{ + action: "removeAttrViewBlock", + srcIDs: blockIds, + avID, + }], undoOperations); + rowElements.forEach(item => { + item.remove(); + }); + stickyRow(blockElement, protyle.contentElement.getBoundingClientRect(), "all"); + updateHeader(blockElement.querySelector(".av__row")); +}