diff --git a/app/src/protyle/render/av/asset.ts b/app/src/protyle/render/av/asset.ts index 646a57650..66537dcd6 100644 --- a/app/src/protyle/render/av/asset.ts +++ b/app/src/protyle/render/av/asset.ts @@ -53,7 +53,7 @@ export const bindAssetEvent = (options: { export const getAssetHTML = (cellElements: HTMLElement[]) => { let html = ""; - genCellValueByElement(getTypeByCellElement(cellElements[0]), cellElements[0]).mAsset.forEach(item => { + genCellValueByElement("mAsset", cellElements[0]).mAsset.forEach(item => { if (!item.content) { return; } diff --git a/app/src/protyle/render/av/blockAttr.ts b/app/src/protyle/render/av/blockAttr.ts index 14b4d1a83..3c3313a62 100644 --- a/app/src/protyle/render/av/blockAttr.ts +++ b/app/src/protyle/render/av/blockAttr.ts @@ -106,24 +106,25 @@ export const genAVValueHTML = (value: IAVCellValue) => { break; case "relation": value.relation?.blockIDs?.forEach((item, index) => { - html += `${value.relation?.contents[index]}`; + html += `${value.relation?.contents[index] || "Untitled"}`; }); break; case "rollup": - value?.rollup?.contents?.forEach((item, index) => { + value?.rollup?.contents?.forEach((item) => { const rollupText = ["select", "mSelect", "mAsset", "checkbox", "relation"].includes(item.type) ? genAVValueHTML(item) : genAVRollupHTML(item); - if (!rollupText && html) { - html = html.substring(0, html.length - 2); - } else { - html += rollupText + ((index === value.rollup.contents.length - 1 || !rollupText) ? "" : ", "); + if (rollupText) { + html += rollupText + ", "; } }); + if (html && html.endsWith(", ")) { + html = html.substring(0, html.length - 2); + } break; } return html; }; -export const renderAVAttribute = (element: HTMLElement, id: string, protyle?: IProtyle) => { +export const renderAVAttribute = (element: HTMLElement, id: string, protyle: IProtyle) => { fetchPost("/api/av/getAttributeViewKeys", {id}, (response) => { let html = ""; response.data.forEach((table: { @@ -167,40 +168,42 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone"].includes }); html += ""; }); - element.innerHTML = html; - element.addEventListener("click", (event) => { - let target = event.target as HTMLElement; - while (target && !element.isSameNode(target)) { - const type = target.getAttribute("data-type"); - if (type === "date") { - popTextCell(protyle, [target], "date"); - event.stopPropagation(); - event.preventDefault(); - break; - } else if (type === "select" || type === "mSelect") { - popTextCell(protyle, [target], target.getAttribute("data-type") as TAVCol); - event.stopPropagation(); - event.preventDefault(); - break; - } else if (type === "mAsset") { - popTextCell(protyle, [target], "mAsset"); - event.stopPropagation(); - event.preventDefault(); - break; - } else if (type === "checkbox") { - popTextCell(protyle, [target], "checkbox"); - event.stopPropagation(); - event.preventDefault(); - break; - } else if (type === "relation") { - popTextCell(protyle, [target], "relation"); - event.stopPropagation(); - event.preventDefault(); - break; + if (element.innerHTML === "") { + element.addEventListener("click", (event) => { + let target = event.target as HTMLElement; + while (target && !element.isSameNode(target)) { + const type = target.getAttribute("data-type"); + if (type === "date") { + popTextCell(protyle, [target], "date"); + event.stopPropagation(); + event.preventDefault(); + break; + } else if (type === "select" || type === "mSelect") { + popTextCell(protyle, [target], target.getAttribute("data-type") as TAVCol); + event.stopPropagation(); + event.preventDefault(); + break; + } else if (type === "mAsset") { + popTextCell(protyle, [target], "mAsset"); + event.stopPropagation(); + event.preventDefault(); + break; + } else if (type === "checkbox") { + popTextCell(protyle, [target], "checkbox"); + event.stopPropagation(); + event.preventDefault(); + break; + } else if (type === "relation") { + popTextCell(protyle, [target], "relation"); + event.stopPropagation(); + event.preventDefault(); + break; + } + target = target.parentElement; } - target = target.parentElement; - } - }); + }); + } + element.innerHTML = html; element.querySelectorAll(".b3-text-field--text").forEach((item: HTMLInputElement) => { item.addEventListener("change", () => { let value; diff --git a/app/src/protyle/render/av/render.ts b/app/src/protyle/render/av/render.ts index ab26f7ce2..87c8f0cdf 100644 --- a/app/src/protyle/render/av/render.ts +++ b/app/src/protyle/render/av/render.ts @@ -8,6 +8,7 @@ import {hasClosestBlock, hasClosestByClassName} from "../../util/hasClosest"; import {stickyRow} from "./row"; import {getCalcValue} from "./calc"; import {openMenuPanel} from "./openMenuPanel"; +import {renderAVAttribute} from "./blockAttr"; export const avRender = (element: Element, protyle: IProtyle, cb?: () => void, viewID?: string) => { let avElements: Element[] = []; @@ -295,6 +296,13 @@ export const refreshAV = (protyle: IProtyle, operation: IOperation) => { if (operation.action === "addAttrViewCol" && isPulse) { openMenuPanel({protyle, blockElement: item, type: "edit", colId: operation.id}); } + if (operation.action === "updateAttrViewCell") { + const attrElement = document.querySelector(`.b3-dialog--open[data-key="${Constants.DIALOG_ATTR}"] div[data-av-id="${operation.avID}"]`) as HTMLElement + if (attrElement) { + // 更新属性面板 + renderAVAttribute(attrElement.parentElement, attrElement.dataset.nodeId, protyle); + } + } }, ["addAttrViewView", "duplicateAttrViewView"].includes(operation.action) ? operation.id : (operation.action === "removeAttrViewView" ? null : undefined)); });