From 0aeb0bfea81e4734a92e3a4b87391c5c2bf9c509 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Sun, 15 Jun 2025 11:38:51 +0800 Subject: [PATCH] :art: https://github.com/siyuan-note/siyuan/issues/10414 --- app/src/assets/scss/business/_av.scss | 12 ++++++ app/src/protyle/render/av/action.ts | 3 +- app/src/protyle/render/av/cell.ts | 42 +++++++++++++++++++-- app/src/protyle/render/av/gallery/render.ts | 6 ++- app/src/protyle/render/av/gallery/util.ts | 7 ++++ 5 files changed, 64 insertions(+), 6 deletions(-) diff --git a/app/src/assets/scss/business/_av.scss b/app/src/assets/scss/business/_av.scss index f246c2fb2..7ea896655 100644 --- a/app/src/assets/scss/business/_av.scss +++ b/app/src/assets/scss/business/_av.scss @@ -352,6 +352,18 @@ word-break: break-all; white-space: pre-wrap; } + + &--edit { + .av__cell { + min-height: 1.625em; + + &[data-empty="true"]:after { + content: attr(aria-label); + position: absolute; + color: var(--b3-theme-on-surface-light); + } + } + } } &-add { diff --git a/app/src/protyle/render/av/action.ts b/app/src/protyle/render/av/action.ts index 605b680c7..c4023fa67 100644 --- a/app/src/protyle/render/av/action.ts +++ b/app/src/protyle/render/av/action.ts @@ -34,7 +34,7 @@ import {hideElements} from "../../ui/hideElements"; import {fetchPost, fetchSyncPost} from "../../../util/fetch"; import {scrollCenter} from "../../../util/highlightById"; import {escapeHtml} from "../../../util/escape"; -import {openGalleryItemMenu} from "./gallery/util"; +import {editGalleryItem, openGalleryItemMenu} from "./gallery/util"; export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLElement }) => { if (isOnlyMeta(event)) { @@ -273,6 +273,7 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle event.stopPropagation(); return true; } else if (type === "av-gallery-edit") { + editGalleryItem(target); event.preventDefault(); event.stopPropagation(); return true; diff --git a/app/src/protyle/render/av/cell.ts b/app/src/protyle/render/av/cell.ts index bdd3da2d3..8bf81301a 100644 --- a/app/src/protyle/render/av/cell.ts +++ b/app/src/protyle/render/av/cell.ts @@ -237,7 +237,6 @@ const transformCellValue = (colType: TAVCol, value: IAVCellValue): IAVCellValue return newValue; }; - export const genCellValue = (colType: TAVCol, value: string | any) => { let cellValue: IAVCellValue = { type: colType, @@ -521,7 +520,13 @@ export const popTextCell = (protyle: IProtyle, cellElements: HTMLElement[], type } else if (type === "relation") { openMenuPanel({protyle, blockElement, type: "relation", cellElements}); } else if (type === "rollup") { - openMenuPanel({protyle, blockElement, type: "rollup", cellElements, colId: getColId(cellElements[0], viewType)}); + openMenuPanel({ + protyle, + blockElement, + type: "rollup", + cellElements, + colId: getColId(cellElements[0], viewType) + }); } if (viewType === "table" && !hasClosestByClassName(cellElements[0], "custom-attr")) { cellElements[0].classList.add("av__cell--select"); @@ -733,7 +738,7 @@ export const updateCellsValue = (protyle: IProtyle, nodeElement: HTMLElement, va return; } const cellId = item.dataset.id; // 刚创建时无 id,更新需和 oldValue 保持一致 - const colId = getColId(item, viewType) + const colId = getColId(item, viewType); text += getCellText(item) + ((cellElements[elementIndex + 1] && item.nextElementSibling && item.nextElementSibling.isSameNode(cellElements[elementIndex + 1])) ? "\t" : "\n\n"); const oldValue = genCellValueByElement(type, item); @@ -1172,3 +1177,34 @@ export const addDragFill = (cellElement: Element) => { cellElement.insertAdjacentHTML("beforeend", `
`); } }; + +export const cellValueIsEmpty = (value: IAVCellValue) => { + if (value.type === "checkbox") { + return false; + } + if (["text", "number", "block", "url", "phone", "email", "template"].includes(value.type)) { + return !value[value.type as "text"]?.content; + } + if (["mSelect", "mAsset", "select"].includes(value.type)) { + if (value[value.type as "mSelect"]?.length > 0) { + return false; + } + return true; + } + if (["date", "created", "updated"].includes(value.type)) { + return !value[value.type as "date"]?.isNotEmpty && + !value[value.type as "date"]?.isNotEmpty2; + } + if (value.type === "relation") { + if (value.relation?.blockIDs && value.relation.blockIDs.length > 0) { + return false; + } + return true; + } + if (value.type === "rollup") { + if (value.rollup?.contents && value.rollup.contents.length > 0) { + return false; + } + return true; + } +}; diff --git a/app/src/protyle/render/av/gallery/render.ts b/app/src/protyle/render/av/gallery/render.ts index a7c965a5e..398cfa9f7 100644 --- a/app/src/protyle/render/av/gallery/render.ts +++ b/app/src/protyle/render/av/gallery/render.ts @@ -3,7 +3,7 @@ import {Constants} from "../../../../constants"; import {fetchPost} from "../../../../util/fetch"; import {escapeAriaLabel, escapeAttr, escapeHtml} from "../../../../util/escape"; import {unicode2Emoji} from "../../../../emoji"; -import {renderCell} from "../cell"; +import {cellValueIsEmpty, renderCell} from "../cell"; import {focusBlock} from "../../../util/selection"; import {electronUndo} from "../../../undo"; import {addClearButton} from "../../../../util/addClearButton"; @@ -95,8 +95,10 @@ export const renderGallery = (options: { if (cell.valueType === "checkbox") { checkClass = cell.value?.checkbox?.checked ? " av__cell-check" : " av__cell-uncheck"; } + const isEmpty = cellValueIsEmpty(cell.value); galleryHTML += `
{ + const itemElement = hasClosestByClassName(taget, "av__gallery-item"); + if (itemElement) { + itemElement.querySelector(".av__gallery-fields")?.classList.toggle("av__gallery-fields--edit"); + } +};