A privacy-first, self-hosted, fully open source personal knowledge management software, written in typescript and golang. (PERSONAL FORK)
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};