A privacy-first, self-hosted, fully open source personal knowledge management software, written in typescript and golang. (PERSONAL FORK)
at lambda-fork/main 97 lines 4.7 kB view raw
1import {MenuItem} from "./Menu"; 2import {Dialog} from "../dialog"; 3import {fetchPost} from "../util/fetch"; 4import {confirmDialog} from "../dialog/confirmDialog"; 5import {escapeHtml} from "../util/escape"; 6import {copySubMenu} from "./commonMenuItem"; 7import {Bookmark} from "../layout/dock/Bookmark"; 8import {isMobile} from "../util/functions"; 9import {MobileBookmarks} from "../mobile/dock/MobileBookmarks"; 10import {Constants} from "../constants"; 11 12export const openBookmarkMenu = (element: HTMLElement, event: MouseEvent, bookmarkObj: Bookmark | MobileBookmarks) => { 13 if (!window.siyuan.menus.menu.element.classList.contains("fn__none") && 14 window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_BOOKMARK) { 15 window.siyuan.menus.menu.remove(); 16 return; 17 } 18 window.siyuan.menus.menu.remove(); 19 const id = element.getAttribute("data-node-id"); 20 if (!id && !window.siyuan.config.readonly) { 21 window.siyuan.menus.menu.append(new MenuItem({ 22 id: "rename", 23 icon: "iconEdit", 24 label: window.siyuan.languages.rename, 25 click: () => { 26 const oldBookmark = element.querySelector(".b3-list-item__text").textContent; 27 const dialog = new Dialog({ 28 title: window.siyuan.languages.rename, 29 content: `<div class="b3-dialog__content"><input class="b3-text-field fn__block"></div> 30<div class="b3-dialog__action"> 31 <button class="b3-button b3-button--cancel">${window.siyuan.languages.cancel}</button><div class="fn__space"></div> 32 <button class="b3-button b3-button--text">${window.siyuan.languages.confirm}</button> 33</div>`, 34 width: isMobile() ? "92vw" : "520px", 35 }); 36 dialog.element.setAttribute("data-key", Constants.DIALOG_RENAMEBOOKMARK); 37 const btnsElement = dialog.element.querySelectorAll(".b3-button"); 38 btnsElement[0].addEventListener("click", () => { 39 dialog.destroy(); 40 }); 41 const inputElement = dialog.element.querySelector("input"); 42 dialog.bindInput(inputElement, () => { 43 (btnsElement[1] as HTMLButtonElement).click(); 44 }); 45 inputElement.value = oldBookmark; 46 inputElement.focus(); 47 inputElement.select(); 48 btnsElement[1].addEventListener("click", () => { 49 fetchPost("/api/bookmark/renameBookmark", { 50 oldBookmark, 51 newBookmark: inputElement.value 52 }, () => { 53 dialog.destroy(); 54 }); 55 }); 56 } 57 }).element); 58 } 59 if (id) { 60 window.siyuan.menus.menu.append(new MenuItem({ 61 id: "copy", 62 label: window.siyuan.languages.copy, 63 type: "submenu", 64 icon: "iconCopy", 65 submenu: copySubMenu([element.getAttribute("data-node-id")], false) 66 }).element); 67 } 68 69 if (!window.siyuan.config.readonly) { 70 window.siyuan.menus.menu.append(new MenuItem({ 71 id: "remove", 72 icon: "iconTrashcan", 73 label: window.siyuan.languages.remove, 74 click: () => { 75 const bookmarkText = element.querySelector(".b3-list-item__text").textContent; 76 confirmDialog(window.siyuan.languages.deleteOpConfirm, window.siyuan.languages.removeBookmark.replace("${x}", `<b>${escapeHtml(bookmarkText)}</b>`), () => { 77 if (id) { 78 fetchPost("/api/attr/setBlockAttrs", {id, attrs: {bookmark: ""}}, () => { 79 bookmarkObj.update(); 80 }); 81 document.querySelectorAll(`.protyle-wysiwyg [data-node-id="${id}"]`).forEach((item) => { 82 item.setAttribute("bookmark", ""); 83 const bookmarkElement = item.querySelector(".protyle-attr--bookmark"); 84 if (bookmarkElement) { 85 bookmarkElement.remove(); 86 } 87 }); 88 } else { 89 fetchPost("/api/bookmark/removeBookmark", {bookmark: bookmarkText}); 90 } 91 }, undefined, true); 92 } 93 }).element); 94 } 95 window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_BOOKMARK); 96 window.siyuan.menus.menu.popup({x: event.clientX - 11, y: event.clientY + 11, h: 22, w: 12}); 97};