import {focusByRange, getEditorRange} from "../protyle/util/selection"; import {fetchPost} from "../util/fetch"; import {Dialog} from "../dialog"; import {isMobile} from "../util/functions"; import {hideMessage, showMessage} from "../dialog/message"; import {confirmDialog} from "../dialog/confirmDialog"; import {Protyle} from "../protyle"; import {getIconByType} from "../editor/getIcon"; import {unicode2Emoji} from "../emoji"; import {Constants} from "../constants"; import {onGet} from "../protyle/util/onGet"; import {addLoading} from "../protyle/ui/initUI"; import {escapeHtml} from "../util/escape"; import {getDisplayName, getNotebookName} from "../util/pathName"; import {hideElements} from "../protyle/ui/hideElements"; const genCardItem = (item: ICard) => { return `
  • ${item.name} ${item.size} ${item.size} ${item.updated}
  • `; }; export const makeCard = (nodeElement: Element[]) => { window.siyuan.dialogs.find(item => { if (item.element.getAttribute("data-key") === "makeCard") { hideElements(["dialog"]); return true; } }); const range = getEditorRange(nodeElement[0]); fetchPost("/api/riff/getRiffDecks", {}, (response) => { let html = ""; const ids: string[] = []; nodeElement.forEach(item => { if (item.getAttribute("data-type") === "NodeThematicBreak") { return; } ids.push(item.getAttribute("data-node-id")); }); response.data.forEach((item: ICard) => { html += genCardItem(item); }); const dialog = new Dialog({ width: isMobile() ? "90vw" : "50vw", height: "70vh", title: window.siyuan.languages.riffCard, content: `
    `, destroyCallback() { focusByRange(range); } }); dialog.element.setAttribute("data-key", "makeCard"); dialog.element.style.zIndex = "199"; dialog.element.addEventListener("click", (event) => { let target = event.target as HTMLElement; while (target && !target.isSameNode(dialog.element)) { const type = target.getAttribute("data-type"); if (type === "create") { let msgId = ""; const inputElement = dialog.element.querySelector(".b3-text-field") as HTMLInputElement; if (inputElement.value) { if (msgId) { hideMessage(msgId); } fetchPost("/api/riff/createRiffDeck", {name: inputElement.value}, (response) => { dialog.element.querySelector(".b3-list").insertAdjacentHTML("afterbegin", genCardItem(response.data)); inputElement.value = ""; }); } else { msgId = showMessage(window.siyuan.languages._kernel[142]); } event.stopPropagation(); event.preventDefault(); break; } else if (type === "add") { fetchPost("/api/riff/addRiffCards", { deckID: target.parentElement.getAttribute("data-id"), blockIDs: ids }, (addResponse) => { target.parentElement.outerHTML = genCardItem(addResponse.data); }); event.stopPropagation(); event.preventDefault(); break; } else if (type === "remove") { fetchPost("/api/riff/removeRiffCards", { deckID: target.parentElement.getAttribute("data-id"), blockIDs: ids }, (removeResponse) => { target.parentElement.outerHTML = genCardItem(removeResponse.data); }); event.stopPropagation(); event.preventDefault(); break; } else if (type === "delete") { confirmDialog(window.siyuan.languages.confirm, `${window.siyuan.languages.confirmDelete} ${target.parentElement.querySelector(".b3-list-item__text").textContent}?`, () => { fetchPost("/api/riff/removeRiffDeck", { deckID: target.parentElement.getAttribute("data-id"), }, () => { target.parentElement.remove(); }); }); event.stopPropagation(); event.preventDefault(); break; } else if (type === "view") { viewCards(target.parentElement.getAttribute("data-id"), target.parentElement.querySelector(".b3-list-item__text").textContent, target.parentElement); event.stopPropagation(); event.preventDefault(); break; } else if (type === "rename") { const renameDialog = new Dialog({ title: window.siyuan.languages.rename, content: `
    `, width: isMobile() ? "80vw" : "520px", }); const inputElement = renameDialog.element.querySelector("input") as HTMLInputElement; const btnsElement = renameDialog.element.querySelectorAll(".b3-button"); renameDialog.bindInput(inputElement, () => { (btnsElement[1] as HTMLButtonElement).click(); }); inputElement.value = target.parentElement.querySelector(".b3-list-item__text").textContent; inputElement.focus(); inputElement.select(); btnsElement[0].addEventListener("click", () => { renameDialog.destroy(); }); btnsElement[1].addEventListener("click", () => { fetchPost("/api/riff/renameRiffDeck", { name: inputElement.value, deckID: target.parentElement.getAttribute("data-id"), }, () => { target.parentElement.querySelector(".b3-list-item__text").textContent = inputElement.value; }); renameDialog.destroy(); }); event.stopPropagation(); event.preventDefault(); break; } target = target.parentElement; } }); }); }; const viewCards = (deckID: string, title: string, sourceElement: HTMLElement) => { let pageIndex = 1; let edit:Protyle; fetchPost("/api/riff/getRiffCards", {deckID, page: pageIndex}, (response) => { const dialog = new Dialog({ title, content: `
    ${pageIndex}/${response.data.pageCount || 1}
    ${window.siyuan.languages.emptyContent}
    `, width: isMobile() ? "90vw" : "80vw", height: "80vh", 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 }, }); 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", {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", {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, 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, ""); } 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(); sourceElement.outerHTML = genCardItem(removeResponse.data); }); event.stopPropagation(); event.preventDefault(); break; } target = target.parentElement; } }); }); }; 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]); }); }; 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; };