diff --git a/app/src/protyle/render/av/render.ts b/app/src/protyle/render/av/render.ts
index a4aaff881..8179d2979 100644
--- a/app/src/protyle/render/av/render.ts
+++ b/app/src/protyle/render/av/render.ts
@@ -670,7 +670,6 @@ export const refreshAV = (protyle: IProtyle, operation: IOperation) => {
const avID = operation.action === "setAttrViewName" ? operation.id : operation.avID;
Array.from(protyle.wysiwyg.element.querySelectorAll(`[data-av-id="${avID}"]`)).forEach((item: HTMLElement) => {
item.removeAttribute("data-render");
- const updateRow = item.querySelector('[data-need-update="true"]');
if (operation.action === "sortAttrViewCol" || operation.action === "sortAttrViewRow") {
item.querySelectorAll(".av__cell--active").forEach((item: HTMLElement) => {
item.classList.remove("av__cell--active");
@@ -707,10 +706,6 @@ export const refreshAV = (protyle: IProtyle, operation: IOperation) => {
renderAVAttribute(attrElement.parentElement, attrElement.dataset.nodeId, protyle);
} else {
if (operation.action === "insertAttrViewBlock") {
- if (updateRow && !item.querySelector(`[data-id="${updateRow.getAttribute("data-id")}"]`)) {
- showMessage(window.siyuan.languages.insertRowTip);
- document.querySelector(".av__mask")?.remove();
- }
if (item.getAttribute("data-av-type") === "gallery") {
operation.srcs.forEach(srcItem => {
const filesElement = item.querySelector(`.av__gallery-item[data-id="${srcItem.id}"]`)?.querySelector(".av__gallery-fields");
diff --git a/app/src/protyle/render/av/row.ts b/app/src/protyle/render/av/row.ts
index d58e59f3f..1c22bf8cf 100644
--- a/app/src/protyle/render/av/row.ts
+++ b/app/src/protyle/render/av/row.ts
@@ -3,7 +3,7 @@ import {focusBlock} from "../../util/selection";
import {Menu} from "../../../plugin/Menu";
import {transaction} from "../../wysiwyg/transaction";
import {
- addDragFill,
+ addDragFill, genCellValue,
genCellValueByElement,
getTypeByCellElement,
popTextCell,
@@ -122,39 +122,48 @@ export const insertAttrViewBlockAnimation = (options: {
groupID?: string
}) => {
(options.blockElement.querySelector('[data-type="av-search"]') as HTMLInputElement).value = "";
- const avId = options.blockElement.getAttribute("data-av-id");
+ const hasSort = options.blockElement.querySelector('.av__views [data-type="av-sort"]').classList.contains("block__icon--active");
+ const hasMore = !options.blockElement.querySelector('[data-type="av-load-more"]').classList.contains("fn__none");
+ if (hasMore && hasSort) {
+ showMessage(window.siyuan.languages.insertRowTip);
+ }
const groupQuery = options.groupID ? `.av__body[data-group-id="${options.groupID}"] ` : "";
let previousElement = options.blockElement.querySelector(`.av__row[data-id="${options.previousId}"]`) || options.blockElement.querySelector(groupQuery + ".av__row--header");
// 有排序需要加入最后一行
- if (options.blockElement.querySelector('.av__views [data-type="av-sort"]').classList.contains("block__icon--active")) {
+ if (hasSort) {
previousElement = options.blockElement.querySelector(groupQuery + ".av__row--util").previousElementSibling;
}
- let colHTML = '
';
+
+ let cellsHTML = '';
const pinIndex = previousElement.querySelectorAll(".av__colsticky .av__cell").length - 1;
if (pinIndex > -1) {
- colHTML = '';
+ cellsHTML = '
';
}
+ const avId = options.blockElement.getAttribute("data-av-id");
previousElement.querySelectorAll(".av__cell").forEach((item: HTMLElement, index) => {
- let lineNumber = "";
- if (getTypeByCellElement(item) === "lineNumber") {
+ let lineNumber = 1;
+ const colType = getTypeByCellElement(item);
+ if (colType === "lineNumber") {
const lineNumberValue = item.querySelector(".av__celltext")?.getAttribute("data-value");
if (lineNumberValue) {
- lineNumber = (parseInt(lineNumberValue) + 1).toString();
+ lineNumber = parseInt(lineNumberValue) + 1;
}
}
- colHTML += `
${lineNumber}
`;
+${colType === "block" ? ' data-detached="true"' : ""}>${renderCell(genCellValue(colType, null), lineNumber)}
`;
if (pinIndex === index) {
- colHTML += "
";
+ cellsHTML += "";
}
});
let html = "";
options.srcIDs.forEach((id) => {
const blockCellElement = options.blockElement.querySelector(`[data-block-id="${id}"]`);
if (!blockCellElement) {
- html += `
- ${colHTML}
+ html += `
+ ${cellsHTML}
`;
} else {
clearSelect(["cell"], options.blockElement);
@@ -163,112 +172,31 @@ ${getTypeByCellElement(item) === "block" ? ' data-detached="true"' : ""}>
{
- // https://github.com/siyuan-note/siyuan/issues/10517
- let hideTextCell = false;
- response.data.filters.find((item: IAVFilter) => {
- const headerElement = options.blockElement.querySelector(`.av__cell--header[data-col-id="${item.column}"]`);
- if (!headerElement) {
- return;
+ fetchPost("/api/av/getAttributeViewAddingBlockDefaultValues", {
+ avID: avId,
+ viewID: options.blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
+ groupID: options.groupID,
+ previousID: options.previousId,
+ }, (response) => {
+ let popCellElement: HTMLElement;
+ options.blockElement.querySelectorAll('[data-type="ghost"]').forEach(rowItem => {
+ const updateIds = Object.keys(response.data.values);
+ rowItem.querySelectorAll(".av__cell").forEach((cellItem: HTMLElement) => {
+ if (!popCellElement && cellItem.getAttribute("data-detached") === "true") {
+ popCellElement = cellItem;
}
- const filterType = headerElement.getAttribute("data-dtype");
- if (item.value && filterType !== item.value.type) {
- return;
- }
- if (["relation", "rollup", "template"].includes(filterType)) {
- hideTextCell = true;
- return true;
- }
-
- // 根据后台计算出显示与否的结果进行标识,以便于在 refreshAV 中更新 UI
- if (["created", "updated"].includes(filterType)) {
- currentRow.setAttribute("data-need-update", "true");
- } else {
- response.data.sorts.find((sortItem: IAVSort) => {
- if (sortItem.column === item.column) {
- currentRow.setAttribute("data-need-update", "true");
- return true;
- }
- });
- }
- // 当空或非空外,需要根据值进行判断
- let isRenderValue = true;
- if (item.operator !== "Is empty" && item.operator !== "Is not empty") {
- switch (item.value.type) {
- case "select":
- case "mSelect":
- if (!item.value.mSelect || item.value.mSelect.length === 0) {
- isRenderValue = false;
- }
- break;
- case "block":
- if (!item.value.block || !item.value.block.content) {
- isRenderValue = false;
- }
- break;
- case "number":
- if (!item.value.number || !item.value.number.isNotEmpty) {
- isRenderValue = false;
- }
- break;
- case "date":
- case "created":
- case "updated":
- if (!item.value[item.value.type] || !item.value[item.value.type].isNotEmpty) {
- isRenderValue = false;
- }
- break;
- case "mAsset":
- if (!item.value.mAsset || item.value.mAsset.length === 0) {
- isRenderValue = false;
- }
- break;
- case "checkbox":
- if (!item.value.checkbox) {
- isRenderValue = false;
- }
- break;
- case "text":
- case "url":
- case "phone":
- case "email":
- if (!item.value[item.value.type] || !item.value[item.value.type].content) {
- isRenderValue = false;
- }
- break;
- }
- }
- if (sideRow.classList.contains("av__row") && isRenderValue) {
- const sideRowCellElement = sideRow.querySelector(`.av__cell[data-col-id="${item.column}"]`) as HTMLElement;
- const cellElement = currentRow.querySelector(`.av__cell[data-col-id="${item.column}"]`);
- const cellValue = genCellValueByElement(getTypeByCellElement(sideRowCellElement), sideRowCellElement);
- const iconElement = cellElement.querySelector(".b3-menu__avemoji");
- cellElement.innerHTML = renderCell(cellValue, 0, iconElement ? !iconElement.classList.contains("fn__none") : false);
- renderCellAttr(cellElement, cellValue);
+ if (updateIds.includes(cellItem.dataset.colId)) {
+ const cellValue = response.data.values[cellItem.dataset.colId];
+ cellItem.innerHTML = renderCell(cellValue);
+ renderCellAttr(cellItem, cellValue);
}
});
- if (hideTextCell) {
- currentRow.remove();
- showMessage(window.siyuan.languages.insertRowTip);
- } else if (options.srcIDs.length === 1) {
- popTextCell(options.protyle, [currentRow.querySelector('.av__cell[data-detached="true"]')], "block");
- }
- setPage(options.blockElement);
});
- }
- setPage(options.blockElement);
+ if (options.srcIDs.length === 1 && !(hasMore && hasSort)) {
+ popTextCell(options.protyle, [popCellElement], "block");
+ }
+ setPage(options.blockElement);
+ });
};
export const stickyRow = (blockElement: HTMLElement, elementRect: DOMRect, status: "top" | "bottom" | "all") => {