diff --git a/app/src/protyle/render/av/action.ts b/app/src/protyle/render/av/action.ts index 1358da631..2960ab15b 100644 --- a/app/src/protyle/render/av/action.ts +++ b/app/src/protyle/render/av/action.ts @@ -6,6 +6,101 @@ import {openEditorTab} from "../../../menus/util"; import {copySubMenu} from "../../../menus/commonMenuItem"; import {popTextCell} from "./cell"; +const showHeaderCellMenu = (protyle: IProtyle, blockElement: HTMLElement, cellElement: HTMLElement) => { + const type = cellElement.getAttribute("data-dtype") as TAVCol + const menu = new Menu("av-header-cell"); + menu.addItem({ + icon: getIconByType(type), + label: ``, + bind() { + + } + }); + if (type !== "block") { + menu.addItem({ + icon: "iconEdit", + label: window.siyuan.languages.edit, + click() { + + } + }); + } + menu.addSeparator(); + menu.addItem({ + icon: "iconUp", + label: window.siyuan.languages.fileNameNatASC, + click() { + + } + }); + menu.addItem({ + icon: "iconDown", + label: window.siyuan.languages.fileNameNatDESC, + click() { + + } + }); + menu.addItem({ + icon: "iconFilter", + label: window.siyuan.languages.filter, + click() { + + } + }); + menu.addSeparator(); + if (type !== "block") { + menu.addItem({ + icon: "iconEyeoff", + label: window.siyuan.languages.hide, + click() { + + } + }); + menu.addItem({ + icon: "iconCopy", + label: window.siyuan.languages.duplicate, + click() { + + } + }); + menu.addItem({ + icon: "iconTrashcan", + label: window.siyuan.languages.delete, + click() { + const id = cellElement.getAttribute("data-id") + transaction(protyle, [{ + action: "removeAttrViewCol", + id, + parentID: blockElement.getAttribute("data-av-id"), + }], [{ + action: "addAttrViewCol", + name: cellElement.textContent.trim(), + parentID: blockElement.getAttribute("data-av-id"), + type: type, + id + }]); + removeCol(cellElement) + } + }); + menu.addSeparator(); + } + menu.addItem({ + label: `
${window.siyuan.languages.wrap} +
`, + click() { + + } + }); + const cellRect = cellElement.getBoundingClientRect(); + menu.open({ + x: cellRect.left, + y: cellRect.bottom, + h: cellRect.height + }); + (window.siyuan.menus.menu.element.querySelector(".b3-text-field") as HTMLInputElement)?.select(); + +}; + export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLElement }) => { const blockElement = hasClosestBlock(event.target); const addElement = hasClosestByAttribute(event.target, "data-type", "av-header-add"); @@ -16,17 +111,19 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle label: window.siyuan.languages.text, click() { const id = Lute.NewNodeID(); + const type = "text"; transaction(protyle, [{ action: "addAttrViewCol", name: "Text", parentID: blockElement.getAttribute("data-av-id"), - type: "text", + type, id }], [{ action: "removeAttrViewCol", id, parentID: blockElement.getAttribute("data-av-id"), }]); + addCol(protyle, blockElement, id, type) } }); const addRect = addElement.getBoundingClientRect(); @@ -43,96 +140,7 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle const cellElement = hasClosestByClassName(event.target, "av__cell"); if (cellElement && blockElement) { if (cellElement.parentElement.classList.contains("av__row--header")) { - const type = cellElement.getAttribute("data-dtype") as TAVCol; - const menu = new Menu("av-header-cell"); - menu.addItem({ - icon: getIconByType(type), - label: ``, - bind() { - - } - }); - if (type !== "block") { - menu.addItem({ - icon: "iconEdit", - label: window.siyuan.languages.edit, - click() { - - } - }); - } - menu.addSeparator(); - menu.addItem({ - icon: "iconUp", - label: window.siyuan.languages.fileNameNatASC, - click() { - - } - }); - menu.addItem({ - icon: "iconDown", - label: window.siyuan.languages.fileNameNatDESC, - click() { - - } - }); - menu.addItem({ - icon: "iconFilter", - label: window.siyuan.languages.filter, - click() { - - } - }); - menu.addSeparator(); - if (type !== "block") { - menu.addItem({ - icon: "iconEyeoff", - label: window.siyuan.languages.hide, - click() { - - } - }); - menu.addItem({ - icon: "iconCopy", - label: window.siyuan.languages.duplicate, - click() { - - } - }); - menu.addItem({ - icon: "iconTrashcan", - label: window.siyuan.languages.delete, - click() { - const id = cellElement.getAttribute("data-id") - transaction(protyle, [{ - action: "removeAttrViewCol", - id, - parentID: blockElement.getAttribute("data-av-id"), - }], [{ - action: "addAttrViewCol", - name: cellElement.textContent.trim(), - parentID: blockElement.getAttribute("data-av-id"), - type: type, - id - }]); - } - }); - menu.addSeparator(); - } - menu.addItem({ - label: `
${window.siyuan.languages.wrap} -
`, - click() { - - } - }); - const cellRect = cellElement.getBoundingClientRect(); - menu.open({ - x: cellRect.left, - y: cellRect.bottom, - h: cellRect.height - }); - (window.siyuan.menus.menu.element.querySelector(".b3-text-field") as HTMLInputElement)?.select(); + showHeaderCellMenu(protyle, blockElement, cellElement) event.preventDefault(); event.stopPropagation(); } else { @@ -176,6 +184,7 @@ export const avContextmenu = (protyle: IProtyle, event: MouseEvent & { detail: a previousID: rowElement.previousElementSibling?.getAttribute("data-id") || "", srcIDs: [rowId], }]); + rowElement.remove(); } }); menu.addSeparator(); @@ -218,24 +227,53 @@ export const avContextmenu = (protyle: IProtyle, event: MouseEvent & { detail: a return true; } - -const addRow = () => { - +const addCol = (protyle: IProtyle, blockElement: HTMLElement, id: string, type: TAVCol) => { + let index = "0" + blockElement.querySelectorAll(".av__row--header .av__cell").forEach((item) => { + const dataIndex = item.getAttribute("data-index") + if (dataIndex > index) { + index = dataIndex + } + }) + blockElement.querySelectorAll(".av__row").forEach((item, index) => { + let html = '' + if (index === 0) { + html = `
+ + Text +
` + } else { + html = `
` + } + item.lastElementChild.insertAdjacentHTML("beforebegin", html) + }) + showHeaderCellMenu(protyle, blockElement, blockElement.querySelector(".av__row--header").lastElementChild.previousElementSibling as HTMLElement) } -const addCol = () => { - -} - -const removeRow = () => { - -} - -const removeCol = () => { - +const removeCol = (cellElement: HTMLElement) => { + const index = cellElement.getAttribute("data-index") + const blockElement = hasClosestBlock(cellElement); + if (!blockElement) { + return false; + } + blockElement.querySelectorAll(".av__row").forEach((item) => { + item.querySelector(`[data-index="${index}"]`).remove; + }) } -const updateCel = () => { - +export const addAVRow = (blockElement: HTMLElement, ids: string[], previousID: string) => { + const rowElement = previousID ? blockElement.querySelector(`[data-id=${previousID}]`) : blockElement.querySelector(".av__row--header") + let html = '' + ids.forEach((id) => { + html += `
`; + Array.from(rowElement.children).forEach((item: HTMLElement, index) => { + if (index === 0 || index === rowElement.childElementCount - 1) { + return + } + html += `
"; + }) + rowElement.insertAdjacentHTML("afterend", html); } diff --git a/app/src/protyle/render/av/cell.ts b/app/src/protyle/render/av/cell.ts index 83153d09a..45dce8b7a 100644 --- a/app/src/protyle/render/av/cell.ts +++ b/app/src/protyle/render/av/cell.ts @@ -57,6 +57,7 @@ const updateCellValue = (protyle: IProtyle, cellElement: HTMLElement, type: TAVC type, data: cellElement.textContent.trim(), }]); + cellElement.textContent = inputElement.value; setTimeout(() => { avMaskElement.remove(); }) diff --git a/app/src/protyle/util/editorCommonEvent.ts b/app/src/protyle/util/editorCommonEvent.ts index 6168cb112..83dbb0509 100644 --- a/app/src/protyle/util/editorCommonEvent.ts +++ b/app/src/protyle/util/editorCommonEvent.ts @@ -19,6 +19,7 @@ import {uploadLocalFiles} from "../upload"; import {insertHTML} from "./insertHTML"; import {isBrowser} from "../../util/functions"; import {hideElements} from "../ui/hideElements"; +import {addAVRow} from "../render/av/action"; const moveToNew = (protyle: IProtyle, sourceElements: Element[], targetElement: Element, newSourceElement: Element, isSameDoc: boolean, isBottom: boolean, isCopy: boolean) => { @@ -813,6 +814,7 @@ export const dropEvent = (protyle: IProtyle, editorElement: HTMLElement) => { id: targetElement.getAttribute("data-node-id"), parentID: targetElement.getAttribute("data-av-id"), }]); + addAVRow(blockElement, sourceIds, previousID) } return; }