import {transaction} from "../../wysiwyg/transaction"; import {Constants} from "../../../constants"; import {fetchSyncPost} from "../../../util/fetch"; import {getCardAspectRatio} from "./gallery/util"; import {getFieldsByData} from "./view"; export const getLayoutHTML = (data: IAV) => { let html = ""; const view = data.view as IAVKanban; if (data.viewType === "gallery" || data.viewType === "kanban") { let coverFromTitle = ""; if (view.coverFrom === 0) { coverFromTitle = window.siyuan.languages.calcOperatorNone; } else if (view.coverFrom === 1) { coverFromTitle = window.siyuan.languages.contentImage; } else if (view.coverFrom === 3) { coverFromTitle = window.siyuan.languages.contentBlock; } else { view.fields.find(item => { if (item.type === "mAsset" && item.id === view.coverFromAssetKeyID) { coverFromTitle = item.name; return true; } }); } html = ` `; } html = `
${html} `; if (data.viewType === "kanban") { html += ``; } return html + `
`; }; export const bindLayoutEvent = (options: { protyle: IProtyle, data: IAV, menuElement: HTMLElement blockElement: Element }) => { const toggleTitleElement = options.menuElement.querySelector('.b3-switch[data-type="toggle-view-title"]') as HTMLInputElement; toggleTitleElement.addEventListener("change", () => { const avID = options.blockElement.getAttribute("data-av-id"); const blockID = options.blockElement.getAttribute("data-node-id"); const checked = toggleTitleElement.checked; transaction(options.protyle, [{ action: "hideAttrViewName", avID, blockID, data: !checked }], [{ action: "hideAttrViewName", avID, blockID, data: checked }]); options.data.view.hideAttrViewName = !checked; }); const toggleIconElement = options.menuElement.querySelector('.b3-switch[data-type="toggle-entries-icons"]') as HTMLInputElement; toggleIconElement.addEventListener("change", () => { const avID = options.blockElement.getAttribute("data-av-id"); const blockID = options.blockElement.getAttribute("data-node-id"); const checked = toggleIconElement.checked; transaction(options.protyle, [{ action: "setAttrViewShowIcon", avID, blockID, data: checked }], [{ action: "setAttrViewShowIcon", avID, blockID, data: !checked }]); options.data.view.showIcon = checked; }); const toggleWrapElement = options.menuElement.querySelector('.b3-switch[data-type="toggle-entries-wrap"]') as HTMLInputElement; toggleWrapElement.addEventListener("change", () => { const avID = options.blockElement.getAttribute("data-av-id"); const blockID = options.blockElement.getAttribute("data-node-id"); const checked = toggleWrapElement.checked; transaction(options.protyle, [{ action: "setAttrViewWrapField", avID, blockID, data: checked }], [{ action: "setAttrViewWrapField", avID, blockID, data: !checked }]); getFieldsByData(options.data).forEach(item => { item.wrap = checked; }); options.data.view.wrapField = checked; }); if (options.data.viewType === "table") { return; } const toggleBgElement = options.menuElement.querySelector('.b3-switch[data-type="toggle-kanban-bg"]') as HTMLInputElement; toggleBgElement.addEventListener("change", () => { const avID = options.blockElement.getAttribute("data-av-id"); const blockID = options.blockElement.getAttribute("data-node-id"); const checked = toggleBgElement.checked; transaction(options.protyle, [{ action: "setAttrViewFillColBackgroundColor", avID, blockID, data: checked }], [{ action: "setAttrViewFillColBackgroundColor", avID, blockID, data: !checked }]); (options.data.view as IAVKanban).fillColBackgroundColor = checked; }) const toggleFitElement = options.menuElement.querySelector('.b3-switch[data-type="toggle-gallery-fit"]') as HTMLInputElement; toggleFitElement.addEventListener("change", () => { const avID = options.blockElement.getAttribute("data-av-id"); const blockID = options.blockElement.getAttribute("data-node-id"); const checked = toggleFitElement.checked; transaction(options.protyle, [{ action: "setAttrViewFitImage", avID, blockID, data: checked }], [{ action: "setAttrViewFitImage", avID, blockID, data: !checked }]); (options.data.view as IAVGallery).fitImage = checked; }); const toggleNameElement = options.menuElement.querySelector('.b3-switch[data-type="toggle-gallery-name"]') as HTMLInputElement; toggleNameElement.addEventListener("change", () => { const avID = options.blockElement.getAttribute("data-av-id"); const blockID = options.blockElement.getAttribute("data-node-id"); const checked = toggleNameElement.checked; transaction(options.protyle, [{ action: "setAttrViewDisplayFieldName", avID, blockID, data: checked }], [{ action: "setAttrViewDisplayFieldName", avID, blockID, data: !checked }]); (options.data.view as IAVGallery).displayFieldName = checked; }); }; export const updateLayout = async (options: { data: IAV nodeElement: Element, protyle: IProtyle, target: HTMLElement }) => { if (options.target.classList.contains("av__layout-item--select") || options.target.dataset.load === "true") { return; } options.target.dataset.load = "true"; options.target.parentElement.querySelector(".av__layout-item--select").classList.remove("av__layout-item--select"); options.target.classList.add("av__layout-item--select"); const response = await fetchSyncPost("/api/av/changeAttrViewLayout", { blockID: options.nodeElement.getAttribute("data-node-id"), avID: options.nodeElement.getAttribute("data-av-id"), layoutType: options.target.getAttribute("data-view-type") }); const menuElement = document.querySelector(".av__panel").lastElementChild as HTMLElement; menuElement.innerHTML = getLayoutHTML(response.data); bindLayoutEvent({ protyle: options.protyle, data: response.data, menuElement, blockElement: options.nodeElement }); options.target.removeAttribute("data-load"); return response.data; };