import {Protyle} from "../protyle"; import {fetchPost} from "../util/fetch"; import {Dialog} from "../dialog"; import {isMobile} from "../util/functions"; import {escapeHtml} from "../util/escape"; import {getDisplayName, getNotebookName} from "../util/pathName"; import {getIconByType} from "../editor/getIcon"; import {unicode2Emoji} from "../emoji"; import {addLoading} from "../protyle/ui/initUI"; import {Constants} from "../constants"; import {disabledProtyle, onGet} from "../protyle/util/onGet"; export const viewCards = (deckID: string, title: string, deckType: "Tree" | "" | "Notebook", cb?: (response: IWebSocketData) => void) => { let pageIndex = 1; let edit: Protyle; fetchPost(`/api/riff/get${deckType}RiffCards`, { id: deckID, page: pageIndex }, (response) => { const dialog = new Dialog({ content: `
${title}
${pageIndex}/${response.data.pageCount || 1}
${window.siyuan.languages.emptyContent}
`, width: isMobile() ? "98vw" : "80vw", height: isMobile() ? "80vh" : "70vh", destroyCallback() { if (edit) { edit.destroy(); } } }); if (response.data.blocks.length === 0) { return; } edit = new Protyle(dialog.element.querySelector("#cardPreview") as HTMLElement, { blockId: "", render: { gutter: true, breadcrumbDocName: true }, }); if (window.siyuan.config.editor.readOnly) { disabledProtyle(edit.protyle); } getArticle(edit, dialog.element.querySelector(".b3-list-item--focus")?.getAttribute("data-id")); const previousElement = dialog.element.querySelector('[data-type="previous"]'); const nextElement = dialog.element.querySelector('[data-type="next"]'); const listElement = dialog.element.querySelector(".b3-list--background"); if (response.data.pageCount > 1) { nextElement.removeAttribute("disabled"); } dialog.element.style.zIndex = "200"; dialog.element.addEventListener("click", (event) => { let target = event.target as HTMLElement; while (target && !dialog.element.isSameNode(target)) { const type = target.getAttribute("data-type"); if (type === "previous") { if (pageIndex <= 1) { return; } pageIndex--; if (pageIndex <= 1) { previousElement.setAttribute("disabled", "disabled"); } fetchPost("/api/riff/getRiffCards", {id: deckID, page: pageIndex}, (cardsResponse) => { if (pageIndex === cardsResponse.data.pageCount) { nextElement.setAttribute("disabled", "disabled"); } else if (cardsResponse.data.pageCount > 1) { nextElement.removeAttribute("disabled"); } nextElement.nextElementSibling.nextElementSibling.textContent = `${pageIndex}/${cardsResponse.data.pageCount || 1}`; listElement.innerHTML = renderViewItem(cardsResponse.data.blocks); getArticle(edit, dialog.element.querySelector(".b3-list-item--focus")?.getAttribute("data-id")); }); event.stopPropagation(); event.preventDefault(); break; } else if (type === "next") { if (pageIndex >= response.data.pageCount) { return; } pageIndex++; previousElement.removeAttribute("disabled"); fetchPost("/api/riff/getRiffCards", {id: deckID, page: pageIndex}, (cardsResponse) => { if (pageIndex === cardsResponse.data.pageCount) { nextElement.setAttribute("disabled", "disabled"); } else if (cardsResponse.data.pageCount > 1) { nextElement.removeAttribute("disabled"); } nextElement.nextElementSibling.nextElementSibling.textContent = `${pageIndex}/${cardsResponse.data.pageCount || 1}`; listElement.innerHTML = renderViewItem(cardsResponse.data.blocks); getArticle(edit, dialog.element.querySelector(".b3-list-item--focus")?.getAttribute("data-id")); }); event.stopPropagation(); event.preventDefault(); break; } else if (type === "card-item") { getArticle(edit, target.getAttribute("data-id")); listElement.querySelector(".b3-list-item--focus")?.classList.remove("b3-list-item--focus"); target.classList.add("b3-list-item--focus"); event.stopPropagation(); event.preventDefault(); break; } else if (type === "remove") { fetchPost("/api/riff/removeRiffCards", { deckID: deckType === "" ? deckID : Constants.QUICK_DECK_ID, blockIDs: [target.getAttribute("data-id")] }, (removeResponse) => { let nextElment = target.parentElement.nextElementSibling; if (!nextElment) { nextElment = target.parentElement.previousElementSibling; } if (!nextElment && target.parentElement.parentElement.childElementCount > 1) { nextElment = target.parentElement.parentElement.firstElementChild; } if (!nextElment) { getArticle(edit, ""); listElement.innerHTML = `
${window.siyuan.languages.emptyContent}
`; } else { getArticle(edit, nextElment.getAttribute("data-id")); listElement.querySelector(".b3-list-item--focus")?.classList.remove("b3-list-item--focus"); nextElment.classList.add("b3-list-item--focus"); target.parentElement.remove(); } if (cb) { cb(removeResponse); } }); event.stopPropagation(); event.preventDefault(); break; } target = target.parentElement; } }); }); }; const renderViewItem = (blocks: IBlock[]) => { let listHTML = ""; let isFirst = true; blocks.forEach((item: IBlock) => { if (item.type) { const hPath = escapeHtml(getNotebookName(item.box)) + getDisplayName(item.hPath, false); listHTML += `
${unicode2Emoji(item.ial.icon, false, "b3-list-item__graphic", true)} ${item.content} ${hPath}
`; isFirst = false; } else { listHTML += `
${item.content}
`; } }); if (blocks.length === 0) { listHTML = `
${window.siyuan.languages.emptyContent}
`; } return listHTML; }; const getArticle = (edit: Protyle, id: string) => { if (!id) { edit.protyle.element.classList.add("fn__none"); edit.protyle.element.nextElementSibling.classList.remove("fn__none"); return; } edit.protyle.element.classList.remove("fn__none"); edit.protyle.element.nextElementSibling.classList.add("fn__none"); edit.protyle.scroll.lastScrollTop = 0; addLoading(edit.protyle); fetchPost("/api/filetree/getDoc", { id, mode: 0, size: Constants.SIZE_GET_MAX, }, getResponse => { onGet(getResponse, edit.protyle, [Constants.CB_GET_ALL, Constants.CB_GET_HTML]); }); };