diff --git a/app/src/protyle/render/av/view.ts b/app/src/protyle/render/av/view.ts index f36082368..c0c75d67e 100644 --- a/app/src/protyle/render/av/view.ts +++ b/app/src/protyle/render/av/view.ts @@ -4,7 +4,6 @@ import {transaction} from "../../wysiwyg/transaction"; import {openMenuPanel} from "./openMenuPanel"; import {removeBlock} from "../../wysiwyg/remove"; import {getEditorRange} from "../../util/selection"; -import {fetchPost} from "../../../util/fetch"; export const openViewMenu = (options: { protyle: IProtyle, blockElement: HTMLElement, element: HTMLElement }) => { const menu = new Menu("av-view"); @@ -29,7 +28,11 @@ export const openViewMenu = (options: { protyle: IProtyle, blockElement: HTMLEle icon: "iconSettings", label: window.siyuan.languages.config, click() { - openMenuPanel({protyle: options.protyle, blockElement: options.blockElement, type: "config"}); + openMenuPanel({ + protyle: options.protyle, + blockElement: options.blockElement, + type: "config" + }); } }) menu.addSeparator(); @@ -37,42 +40,32 @@ export const openViewMenu = (options: { protyle: IProtyle, blockElement: HTMLEle icon: "iconCopy", label: window.siyuan.languages.duplicate, click() { - fetchPost("/api/av/renderAttributeView", { - id: options.blockElement.dataset.avId, - }, (response) => { - const id = Lute.NewNodeID(); - const data = response.data as IAV; - transaction(options.protyle, [{ - action: "duplicateAttrViewView", - avID: data.id, - previousID: data.viewID, - id - }], [{ - action: "removeAttrViewView", - avID: data.id, - id - }]); - }); + const id = Lute.NewNodeID(); + transaction(options.protyle, [{ + action: "duplicateAttrViewView", + avID: options.blockElement.dataset.avId, + previousID: options.element.dataset.id, + id + }], [{ + action: "removeAttrViewView", + avID: options.blockElement.dataset.avId, + id + }]); } }) menu.addItem({ icon: "iconTrashcan", label: window.siyuan.languages.delete, click() { - fetchPost("/api/av/renderAttributeView", { - id: options.blockElement.dataset.avId, - }, (response) => { - const data = response.data as IAV; - if (data.views.length === 1) { - removeBlock(options.protyle, options.blockElement, getEditorRange(options.blockElement)) - } else { - transaction(options.protyle, [{ - action: "removeAttrViewView", - avID: data.id, - id: data.viewID - }]); - } - }); + if (options.element.parentElement.querySelectorAll("item").length === 1) { + removeBlock(options.protyle, options.blockElement, getEditorRange(options.blockElement)) + } else { + transaction(options.protyle, [{ + action: "removeAttrViewView", + avID: options.blockElement.dataset.avId, + id: options.element.dataset.id + }]); + } } }) const rect = options.element.getBoundingClientRect() diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts index e3d9fc592..5687a8be0 100644 --- a/app/src/protyle/wysiwyg/index.ts +++ b/app/src/protyle/wysiwyg/index.ts @@ -77,6 +77,9 @@ import {activeBlur, hideKeyboardToolbar} from "../../mobile/util/keyboardToolbar import {commonClick} from "./commonClick"; import {avClick, avContextmenu, updateAVName} from "../render/av/action"; import {stickyRow, updateHeader} from "../render/av/row"; +import {showColMenu} from "../render/av/col"; +import {openViewMenu} from "../render/av/view"; +import {avRender} from "../render/av/render"; export class WYSIWYG { public lastHTMLs: { [key: string]: string } = {}; @@ -1344,7 +1347,6 @@ export class WYSIWYG { }); return false; } - const nodeElement = hasClosestBlock(target); const avRowElement = hasClosestByClassName(target, "av__row"); if (avRowElement && avContextmenu(protyle, avRowElement, { @@ -1356,9 +1358,31 @@ export class WYSIWYG { event.preventDefault(); return; } + const nodeElement = hasClosestBlock(target); if (!nodeElement) { return false; } + const avCellHeaderElement = hasClosestByClassName(target, "av__cellheader") + if (avCellHeaderElement) { + showColMenu(protyle, nodeElement, target.parentElement); + event.stopPropagation(); + event.preventDefault(); + return; + } + const avTabHeaderElement = hasClosestByClassName(target, "item"); + if (nodeElement.classList.contains("av") && avTabHeaderElement) { + if (avTabHeaderElement.classList.contains("item--focus")) { + openViewMenu({protyle, blockElement:nodeElement, element:target}); + } else { + nodeElement.removeAttribute("data-render") + avRender(nodeElement, protyle, () => { + openViewMenu({protyle, blockElement:nodeElement, element:nodeElement.querySelector(".item.item--focus")}); + }, avTabHeaderElement.dataset.id); + } + event.stopPropagation(); + event.preventDefault(); + return; + } if (!isNotEditBlock(nodeElement) && !nodeElement.classList.contains("protyle-wysiwyg--select") && !hasClosestByClassName(target, "protyle-action") && // https://github.com/siyuan-note/siyuan/issues/8983 (isMobile() || event.detail.target || (beforeContextmenuRange && nodeElement.contains(beforeContextmenuRange.startContainer))) diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts index b2896b0e1..7997e9f2e 100644 --- a/app/src/types/index.d.ts +++ b/app/src/types/index.d.ts @@ -1018,15 +1018,11 @@ interface IAVView { icon: string } -interface IAVTable { +interface IAVTable extends IAVView { columns: IAVColumn[], filters: IAVFilter[], sorts: IAVSort[], - name: string, - type: "table" rows: IAVRow[], - id: string - icon: string } interface IAVFilter {