import {fetchPost} from "../../../util/fetch"; import {getColIconByType, showColMenu} from "./col"; import {Constants} from "../../../constants"; import {getCalcValue} from "./cell"; import * as dayjs from "dayjs"; export const avRender = (element: Element, cb?: () => void) => { let avElements: Element[] = []; if (element.getAttribute("data-type") === "NodeAttributeView") { // 编辑器内代码块编辑渲染 avElements = [element]; } else { avElements = Array.from(element.querySelectorAll('[data-type="NodeAttributeView"]')); } if (avElements.length === 0) { return; } if (avElements.length > 0) { avElements.forEach((e: HTMLElement) => { if (e.getAttribute("data-render") === "true") { return; } fetchPost("/api/av/renderAttributeView", { id: e.getAttribute("data-av-id"), nodeID: e.getAttribute("data-node-id") }, (response) => { const data = response.data.view as IAVTable; // header let tableHTML = '
'; let calcHTML = ""; data.columns.forEach((column: IAVColumn) => { if (column.hidden) { return; } tableHTML += `
${column.name}
`; calcHTML += `
${getCalcValue(column) || '' + window.siyuan.languages.calc}
`; }); tableHTML += `
`; // body data.rows.forEach((row: IAVRow) => { tableHTML += `
`; row.cells.forEach((cell, index) => { if (data.columns[index].hidden) { return; } let text = ""; if (cell.valueType === "text") { text = `${cell.value?.text.content || ""}`; } else if (cell.valueType === "url") { text = `${cell.value?.url.content || ""}`; if (cell.value?.url.content) { text += `${window.siyuan.languages.openBy}`; } } else if (cell.valueType === "block") { text = `${cell.value?.block.content || ""}`; if (cell.value?.block.id) { text += `${window.siyuan.languages.openBy}`; } } else if (cell.valueType === "number") { text = `${cell.value?.number.content || ""}`; } else if (cell.valueType === "mSelect" || cell.valueType === "select") { cell.value?.mSelect?.forEach((item: { content: string, color: string }) => { text += `${item.content}`; }); if (!text) { text = ''; } else { text = `${text}`; } } else if (cell.valueType === "date") { text = ''; if (cell.value?.date.content) { text += dayjs(cell.value.date.content).format("YYYY-MM-DD HH:mm"); } if (cell.value?.date.hasEndDate) { text += `${dayjs(cell.value.date.content2).format("YYYY-MM-DD HH:mm")}`; } text += ""; } tableHTML += `
${text}
`; }); tableHTML += "
"; }); let tabHTML = ""; response.data.views.forEach((item: IAVView) => { tabHTML += `
${item.name}
`; }); const paddingLeft = e.parentElement.style.paddingLeft; const paddingRight = e.parentElement.style.paddingRight; e.style.width = e.parentElement.clientWidth + "px"; e.style.alignSelf = "center"; e.firstElementChild.outerHTML = `
${tabHTML}
${response.data.name || ""}
${tableHTML}
${window.siyuan.languages.addAttr}
`; e.setAttribute("data-render", "true"); if (cb) { cb(); } }); }); } }; let lastParentID: string; let lastElement: HTMLElement; export const refreshAV = (protyle: IProtyle, operation: IOperation) => { if (lastParentID === operation.parentID && protyle.contentElement.isSameNode(lastElement)) { return; } lastElement = protyle.contentElement; lastParentID = operation.parentID; const avId = operation.avID; if (operation.action === "addAttrViewCol") { Array.from(protyle.wysiwyg.element.querySelectorAll(`[data-av-id="${avId}"]`)).forEach((item: HTMLElement) => { item.removeAttribute("data-render"); avRender(item, () => { showColMenu(protyle, item, item.querySelector(`.av__row--header .av__cell[data-col-id="${operation.id}"]`)); }); }); } else if (operation.action === "setAttrViewColWidth") { Array.from(protyle.wysiwyg.element.querySelectorAll(`[data-av-id="${avId}"]`)).forEach((item: HTMLElement) => { const cellElement = item.querySelector(`.av__cell[data-col-id="${operation.id}"]`) as HTMLElement; if (!cellElement || cellElement.style.width === operation.data) { return; } item.querySelectorAll(".av__row").forEach(rowItem => { (rowItem.querySelector(`[data-col-id="${operation.id}"]`) as HTMLElement).style.width = operation.data; }); }); } else if (operation.action === "setAttrViewName") { Array.from(protyle.wysiwyg.element.querySelectorAll(`[data-av-id="${avId}"]`)).forEach((item: HTMLElement) => { const titleElement = item.querySelector(".av__title") as HTMLElement; if (!titleElement || titleElement.textContent.trim() === operation.data) { return; } titleElement.textContent = operation.data; titleElement.dataset.title = operation.data; }); } else { Array.from(protyle.wysiwyg.element.querySelectorAll(`[data-av-id="${avId}"]`)).forEach((item: HTMLElement) => { item.removeAttribute("data-render"); avRender(item); }); } setTimeout(() => { lastParentID = null; }, Constants.TIMEOUT_TRANSITION); }; const genAVValueHTML = (value: IAVCellValue) => { let html = ""; switch (value.type) { case "text": html = ``; break; case "number": html = ``; break; case "mSelect": case "select": value.mSelect?.forEach(item => { html += `${item.content}`; }); break; case "date": html = `${dayjs(value.date.content).format("YYYY-MM-DD HH:mm")}`; if (value.date.hasEndDate) { html += `${dayjs(value.date.content2).format("YYYY-MM-DD HH:mm")}`; } break; case "url": html = ``; break; } return html; }; export const renderAVAttribute = (element: HTMLElement, id: string) => { fetchPost("/api/av/getAttributeViewKeys", {id}, (response) => { let html = ""; response.data.forEach((table: { keyValues: { key: { type: TAVCol, name: string }, values: { keyID: string, id: string, blockID: string, type?: TAVCol & IAVCellValue } [] }[], avID: string avName: string }) => { html += ``; table.keyValues?.forEach(item => { html += `
${genAVValueHTML(item.values[0])}
`; }); }); element.innerHTML = html; element.querySelectorAll(".b3-text-field--text").forEach((item: HTMLInputElement) => { item.addEventListener("change", () => { let value; if (item.parentElement.dataset.type === "url") { value = { url: { content: item.value } }; } else if (item.parentElement.dataset.type === "text") { value = { text: { content: item.value } }; } else if (item.parentElement.dataset.type === "number") { value = { number: { content: parseFloat(item.value) } }; } fetchPost("/api/av/setAttributeViewBlockAttr", { avID: item.parentElement.dataset.avId, keyID: item.parentElement.dataset.keyId, rowID: item.parentElement.dataset.blockId, cellID: id, value }); }); }); }); };