From 36df3d5ea13f5d5dbe59f078f0130c1e3f6bc9b9 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Wed, 20 Nov 2024 16:55:34 +0800 Subject: [PATCH] :art: https://github.com/siyuan-note/siyuan/issues/11561 --- app/src/menus/bookmark.ts | 2 +- app/src/menus/commonMenuItem.ts | 97 ++++++++++++++++++++----- app/src/menus/navigation.ts | 20 ++++- app/src/menus/search.ts | 2 +- app/src/menus/tab.ts | 2 +- app/src/protyle/gutter/index.ts | 2 +- app/src/protyle/header/openTitleMenu.ts | 2 +- 7 files changed, 100 insertions(+), 27 deletions(-) diff --git a/app/src/menus/bookmark.ts b/app/src/menus/bookmark.ts index 9178ad7ca49..ebc5597d237 100644 --- a/app/src/menus/bookmark.ts +++ b/app/src/menus/bookmark.ts @@ -60,7 +60,7 @@ export const openBookmarkMenu = (element: HTMLElement, event: MouseEvent, bookma label: window.siyuan.languages.copy, type: "submenu", icon: "iconCopy", - submenu: copySubMenu(element.getAttribute("data-node-id"), false) + submenu: copySubMenu([element.getAttribute("data-node-id")], false) }).element); } diff --git a/app/src/menus/commonMenuItem.ts b/app/src/menus/commonMenuItem.ts index 68aa6e58e27..2f59504def3 100644 --- a/app/src/menus/commonMenuItem.ts +++ b/app/src/menus/commonMenuItem.ts @@ -371,16 +371,27 @@ export const openAttr = (nodeElement: Element, focusName = "bookmark", protyle?: }); }; -export const copySubMenu = (id: string, accelerator = true, focusElement?: Element) => { +export const copySubMenu = (ids: string[], accelerator = true, focusElement?: Element) => { return [{ id: "copyBlockRef", iconHTML: "", accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyBlockRef.custom : undefined, label: window.siyuan.languages.copyBlockRef, - click: () => { - fetchPost("/api/block/getRefText", {id}, (response) => { - writeText(`((${id} '${response.data}'))`); - }); + click: async () => { + let text = ""; + for (let i = 0; i < ids.length; i++) { + const id = ids[i]; + const response = await fetchSyncPost("/api/block/getRefText", {id}); + const content = `((${id} '${response.data}'))`; + if (ids.length > 1) { + text += "* "; + } + text += content; + if (ids.length > 1 && i !== ids.length - 1) { + text += "\n"; + } + } + writeText(text); if (focusElement) { focusBlock(focusElement); } @@ -391,7 +402,17 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme label: window.siyuan.languages.copyBlockEmbed, accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyBlockEmbed.custom : undefined, click: () => { - writeText(`{{select * from blocks where id='${id}'}}`); + let text = ""; + ids.forEach((id, index) => { + if (ids.length > 1) { + text += "* "; + } + text += `{{select * from blocks where id='${id}'}}`; + if (ids.length > 1 && index !== ids.length - 1) { + text += "\n"; + } + }); + writeText(text); if (focusElement) { focusBlock(focusElement); } @@ -402,7 +423,17 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme label: window.siyuan.languages.copyProtocol, accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyProtocol.custom : undefined, click: () => { - writeText(`siyuan://blocks/${id}`); + let text = ""; + ids.forEach((id, index) => { + if (ids.length > 1) { + text += "* "; + } + text += `siyuan://blocks/${id}`; + if (ids.length > 1 && index !== ids.length - 1) { + text += "\n"; + } + }); + writeText(text); if (focusElement) { focusBlock(focusElement); } @@ -412,10 +443,21 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme iconHTML: "", label: window.siyuan.languages.copyProtocolInMd, accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyProtocolInMd.custom : undefined, - click: () => { - fetchPost("/api/block/getRefText", {id}, (response) => { - writeText(`[${response.data}](siyuan://blocks/${id})`); - }); + click: async () => { + let text = ""; + for (let i = 0; i < ids.length; i++) { + const id = ids[i]; + const response = await fetchSyncPost("/api/block/getRefText", {id}); + const content = `[${response.data}](siyuan://blocks/${id})`; + if (ids.length > 1) { + text += "* "; + } + text += content; + if (ids.length > 1 && i !== ids.length - 1) { + text += "\n"; + } + } + writeText(text); if (focusElement) { focusBlock(focusElement); } @@ -425,12 +467,21 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme iconHTML: "", label: window.siyuan.languages.copyHPath, accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyHPath.custom : undefined, - click: () => { - fetchPost("/api/filetree/getHPathByID", { - id - }, (response) => { - writeText(response.data); - }); + click: async () => { + let text = ""; + for (let i = 0; i < ids.length; i++) { + const id = ids[i]; + const response = await fetchSyncPost("/api/filetree/getHPathByID", {id}); + const content = response.data; + if (ids.length > 1) { + text += "* "; + } + text += content; + if (ids.length > 1 && i !== ids.length - 1) { + text += "\n"; + } + } + writeText(text); } }, { id: "copyID", @@ -438,7 +489,17 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme label: window.siyuan.languages.copyID, accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyID.custom : undefined, click: () => { - writeText(id); + let text = ""; + ids.forEach((id, index) => { + if (ids.length > 1) { + text += "* "; + } + text += id; + if (ids.length > 1 && index !== ids.length - 1) { + text += "\n"; + } + }); + writeText(text); if (focusElement) { focusBlock(focusElement); } diff --git a/app/src/menus/navigation.ts b/app/src/menus/navigation.ts index be579974492..013812fb6b7 100644 --- a/app/src/menus/navigation.ts +++ b/app/src/menus/navigation.ts @@ -40,9 +40,6 @@ const initMultiMenu = (selectItemElements: NodeListOf, app: App) => { if (!fileItemElement) { return window.siyuan.menus.menu; } - window.siyuan.menus.menu.append(movePathToMenu(getTopPaths( - Array.from(selectItemElements) - ))); const blockIDs: string[] = []; selectItemElements.forEach(item => { const id = item.getAttribute("data-node-id"); @@ -50,6 +47,21 @@ const initMultiMenu = (selectItemElements: NodeListOf, app: App) => { blockIDs.push(id); } }); + + if (blockIDs.length > 0) { + window.siyuan.menus.menu.append(new MenuItem({ + id: "copy", + label: window.siyuan.languages.copy, + type: "submenu", + icon: "iconCopy", + submenu: copySubMenu(blockIDs, false) + }).element); + } + + window.siyuan.menus.menu.append(movePathToMenu(getTopPaths( + Array.from(selectItemElements) + ))); + if (blockIDs.length > 0) { window.siyuan.menus.menu.append(new MenuItem({ id: "addToDatabase", @@ -469,7 +481,7 @@ export const initFileMenu = (app: App, notebookId: string, pathString: string, l label: window.siyuan.languages.copy, type: "submenu", icon: "iconCopy", - submenu: (copySubMenu(id, false) as IMenu[]).concat([{ + submenu: (copySubMenu([id], false) as IMenu[]).concat([{ id: "duplicate", iconHTML: "", label: window.siyuan.languages.duplicate, diff --git a/app/src/menus/search.ts b/app/src/menus/search.ts index 1f0eab4b55e..3d6c53e8710 100644 --- a/app/src/menus/search.ts +++ b/app/src/menus/search.ts @@ -6,7 +6,7 @@ export const initSearchMenu = (id: string) => { window.siyuan.menus.menu.append(new MenuItem({ label: window.siyuan.languages.copy, type: "submenu", - submenu: copySubMenu(id) + submenu: copySubMenu([id]) }).element); return window.siyuan.menus.menu; }; diff --git a/app/src/menus/tab.ts b/app/src/menus/tab.ts index 58e63aea46f..d41ad435bdf 100644 --- a/app/src/menus/tab.ts +++ b/app/src/menus/tab.ts @@ -206,7 +206,7 @@ export const initTabMenu = (app: App, tab: Tab) => { label: window.siyuan.languages.copy, icon: "iconCopy", type: "submenu", - submenu: copySubMenu(rootId, false) + submenu: copySubMenu([rootId], false) }).element); } else if (model && model instanceof Asset) { window.siyuan.menus.menu.append(new MenuItem({ diff --git a/app/src/protyle/gutter/index.ts b/app/src/protyle/gutter/index.ts index 858501d3ab3..6c196001acb 100644 --- a/app/src/protyle/gutter/index.ts +++ b/app/src/protyle/gutter/index.ts @@ -1260,7 +1260,7 @@ export class Gutter { }).element); } - const copyMenu = (copySubMenu(id, true, nodeElement) as IMenu[]).concat([{ + const copyMenu = (copySubMenu([id], true, nodeElement) as IMenu[]).concat([{ id: "copyPlainText", iconHTML: "", label: window.siyuan.languages.copyPlainText, diff --git a/app/src/protyle/header/openTitleMenu.ts b/app/src/protyle/header/openTitleMenu.ts index 18acb346a5a..37a48ec4728 100644 --- a/app/src/protyle/header/openTitleMenu.ts +++ b/app/src/protyle/header/openTitleMenu.ts @@ -42,7 +42,7 @@ export const openTitleMenu = (protyle: IProtyle, position: IPosition) => { label: window.siyuan.languages.copy, icon: "iconCopy", type: "submenu", - submenu: copySubMenu(protyle.block.rootID) + submenu: copySubMenu([protyle.block.rootID]) }).element); if (!protyle.disabled) { window.siyuan.menus.menu.append(movePathToMenu([protyle.path]));