diff --git a/app/src/menus/Menu.ts b/app/src/menus/Menu.ts index bac30012f39..4a66455830d 100644 --- a/app/src/menus/Menu.ts +++ b/app/src/menus/Menu.ts @@ -181,6 +181,9 @@ export class MenuItem { if (options.disabled) { this.element.setAttribute("disabled", "disabled"); } + if (options.id) { + this.element.setAttribute("data-id", options.id); + } if (options.type === "separator") { this.element.classList.add("b3-menu__separator"); return; @@ -207,9 +210,6 @@ export class MenuItem { } }); } - if (options.id) { - this.element.setAttribute("data-id", options.id); - } if (options.type === "readonly") { this.element.classList.add("b3-menu__item--readonly"); } diff --git a/app/src/menus/block.ts b/app/src/menus/block.ts index e8dd19ec876..f590099b46a 100644 --- a/app/src/menus/block.ts +++ b/app/src/menus/block.ts @@ -6,6 +6,7 @@ import {Constants} from "../constants"; export const transferBlockRef = (id: string) => { window.siyuan.menus.menu.append(new MenuItem({ + id: "transferBlockRef", label: window.siyuan.languages.transferBlockRef, icon: "iconScrollHoriz", click() { diff --git a/app/src/menus/commonMenuItem.ts b/app/src/menus/commonMenuItem.ts index 0c45f02721f..678ea3e4c7f 100644 --- a/app/src/menus/commonMenuItem.ts +++ b/app/src/menus/commonMenuItem.ts @@ -372,6 +372,7 @@ export const openAttr = (nodeElement: Element, focusName = "bookmark", protyle?: export const copySubMenu = (id: 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, @@ -384,6 +385,7 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme } } }, { + id: "copyBlockEmbed", iconHTML: "", label: window.siyuan.languages.copyBlockEmbed, accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyBlockEmbed.custom : undefined, @@ -394,6 +396,7 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme } } }, { + id: "copyProtocol", iconHTML: "", label: window.siyuan.languages.copyProtocol, accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyProtocol.custom : undefined, @@ -404,6 +407,7 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme } } }, { + id: "copyProtocolInMd", iconHTML: "", label: window.siyuan.languages.copyProtocolInMd, accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyProtocolInMd.custom : undefined, @@ -416,6 +420,7 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme } } }, { + id: "copyHPath", iconHTML: "", label: window.siyuan.languages.copyHPath, accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyHPath.custom : undefined, @@ -427,6 +432,7 @@ export const copySubMenu = (id: string, accelerator = true, focusElement?: Eleme }); } }, { + id: "copyID", iconHTML: "", label: window.siyuan.languages.copyID, accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyID.custom : undefined, diff --git a/app/src/menus/protyle.ts b/app/src/menus/protyle.ts index de7330f739f..ab385f68fbb 100644 --- a/app/src/menus/protyle.ts +++ b/app/src/menus/protyle.ts @@ -1771,6 +1771,7 @@ export const iframeMenu = (protyle: IProtyle, nodeElement: Element) => { const iframeElement = nodeElement.querySelector("iframe"); let html = nodeElement.outerHTML; const subMenus: IMenu[] = [{ + id: "asset", iconHTML: "", type: "readonly", label: ``, @@ -1841,6 +1842,7 @@ export const videoMenu = (protyle: IProtyle, nodeElement: Element, type: string) const videoElement = nodeElement.querySelector(type === "NodeVideo" ? "video" : "audio"); let html = nodeElement.outerHTML; const subMenus: IMenu[] = [{ + id: "asset", iconHTML: "", type: "readonly", label: ``, @@ -1860,6 +1862,7 @@ export const videoMenu = (protyle: IProtyle, nodeElement: Element, type: string) type: "separator" }); subMenus.push({ + id: "rename", label: window.siyuan.languages.rename, icon: "iconEdit", click() { @@ -1870,6 +1873,7 @@ export const videoMenu = (protyle: IProtyle, nodeElement: Element, type: string) const VideoSrc = videoElement.getAttribute("src"); if (VideoSrc) { subMenus.push({ + id: "openBy", label: window.siyuan.languages.openBy, icon: "iconOpen", submenu: openMenu(protyle.app, VideoSrc, true, false) as IMenu[] diff --git a/app/src/protyle/gutter/index.ts b/app/src/protyle/gutter/index.ts index cb33414af35..325d89067fe 100644 --- a/app/src/protyle/gutter/index.ts +++ b/app/src/protyle/gutter/index.ts @@ -451,12 +451,12 @@ export class Gutter { } private turnsOneInto(options: { + id: string, icon: string, label: string, protyle: IProtyle, nodeElement: Element, accelerator?: string - id: string, type: string, level?: number }) { @@ -651,6 +651,7 @@ export class Gutter { isContinue })); window.siyuan.menus.menu.append(new MenuItem({ + id: "turnInto", icon: "iconRefresh", label: window.siyuan.languages.turnInto, type: "submenu", @@ -658,6 +659,7 @@ export class Gutter { }).element); if (isContinue) { window.siyuan.menus.menu.append(new MenuItem({ + id: "mergeSuperBlock", icon: "iconSuper", label: window.siyuan.languages.merge + " " + window.siyuan.languages.superBlock, type: "submenu", @@ -683,6 +685,7 @@ export class Gutter { } if (!protyle.disabled) { window.siyuan.menus.menu.append(new MenuItem({ + id: "ai", icon: "iconSparkles", label: window.siyuan.languages.ai, accelerator: window.siyuan.config.keymap.editor.general.ai.custom, @@ -692,6 +695,7 @@ export class Gutter { }).element); } const copyMenu: IMenu[] = [{ + id: "copy", iconHTML: "", label: window.siyuan.languages.copy, accelerator: "⌘C", @@ -704,6 +708,7 @@ export class Gutter { document.execCommand("copy"); } }, { + id: "copyPlainText", iconHTML: "", label: window.siyuan.languages.copyPlainText, accelerator: window.siyuan.config.keymap.editor.general.copyPlainText.custom, @@ -716,6 +721,7 @@ export class Gutter { focusBlock(selectsElement[0]); } }, { + id: "duplicate", iconHTML: "", label: window.siyuan.languages.duplicate, accelerator: window.siyuan.config.keymap.editor.general.duplicate.custom, @@ -729,6 +735,7 @@ export class Gutter { copyMenu.splice(2, 0, copyTextRefMenu); } window.siyuan.menus.menu.append(new MenuItem({ + id: "copy", label: window.siyuan.languages.copy, icon: "iconCopy", type: "submenu", @@ -738,6 +745,7 @@ export class Gutter { return; } window.siyuan.menus.menu.append(new MenuItem({ + id: "cut", label: window.siyuan.languages.cut, accelerator: "⌘X", icon: "iconCut", @@ -747,6 +755,7 @@ export class Gutter { } }).element); window.siyuan.menus.menu.append(new MenuItem({ + id: "move", label: window.siyuan.languages.move, accelerator: window.siyuan.config.keymap.general.move.custom, icon: "iconMove", @@ -758,6 +767,7 @@ export class Gutter { }).element); const range = getSelection().rangeCount > 0 ? getSelection().getRangeAt(0) : undefined; window.siyuan.menus.menu.append(new MenuItem({ + id: "addToDatabase", label: window.siyuan.languages.addToDatabase, accelerator: window.siyuan.config.keymap.general.addToDatabase.custom, icon: "iconDatabase", @@ -766,6 +776,7 @@ export class Gutter { } }).element); window.siyuan.menus.menu.append(new MenuItem({ + id: "delete", label: window.siyuan.languages.delete, icon: "iconTrashcan", accelerator: "⌫", @@ -775,8 +786,9 @@ export class Gutter { } }).element); - window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element); + window.siyuan.menus.menu.append(new MenuItem({id: "separator_appearance", type: "separator"}).element); const appearanceElement = new MenuItem({ + id: "appearance", label: window.siyuan.languages.appearance, icon: "iconFont", accelerator: window.siyuan.config.keymap.editor.insert.appearance.custom, @@ -805,8 +817,9 @@ export class Gutter { this.genWidths(selectsElement, protyle); // this.genHeights(selectsElement, protyle); if (!window.siyuan.config.readonly) { - window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element); + window.siyuan.menus.menu.append(new MenuItem({id: "separator_quickMakeCard", type: "separator"}).element); window.siyuan.menus.menu.append(new MenuItem({ + id: "quickMakeCard", label: window.siyuan.languages.quickMakeCard, accelerator: window.siyuan.config.keymap.editor.general.quickMakeCard.custom, iconHTML: '', @@ -816,6 +829,7 @@ export class Gutter { } }).element); window.siyuan.menus.menu.append(new MenuItem({ + id: "addToDeck", label: window.siyuan.languages.addToDeck, icon: "iconRiffCard", ignore: !window.siyuan.config.flashcard.deck, @@ -920,8 +934,8 @@ export class Gutter { })); turnIntoSubmenu.push(this.turnsIntoOne({ icon: "iconQuote", - accelerator: window.siyuan.config.keymap.editor.insert.quote.custom, label: window.siyuan.languages.quote, + accelerator: window.siyuan.config.keymap.editor.insert.quote.custom, protyle, selectsElement: [nodeElement], type: "Blocks2Blockquote" @@ -991,8 +1005,8 @@ export class Gutter { })); turnIntoSubmenu.push(this.turnsIntoOne({ icon: "iconQuote", - accelerator: window.siyuan.config.keymap.editor.insert.quote.custom, label: window.siyuan.languages.quote, + accelerator: window.siyuan.config.keymap.editor.insert.quote.custom, protyle, selectsElement: [nodeElement], type: "Blocks2Blockquote" @@ -1065,93 +1079,94 @@ export class Gutter { } } else if (type === "NodeList" && !protyle.disabled) { turnIntoSubmenu.push(this.turnsOneInto({ + id, icon: "iconParagraph", label: window.siyuan.languages.paragraph, accelerator: window.siyuan.config.keymap.editor.heading.paragraph.custom, protyle, nodeElement, - id, type: "CancelList" })); turnIntoSubmenu.push(this.turnsIntoOne({ icon: "iconQuote", - accelerator: window.siyuan.config.keymap.editor.insert.quote.custom, label: window.siyuan.languages.quote, + accelerator: window.siyuan.config.keymap.editor.insert.quote.custom, protyle, selectsElement: [nodeElement], type: "Blocks2Blockquote" })); if (nodeElement.getAttribute("data-subtype") === "o") { turnIntoSubmenu.push(this.turnsOneInto({ + id, icon: "iconList", label: window.siyuan.languages.list, accelerator: window.siyuan.config.keymap.editor.insert.list.custom, protyle, nodeElement, - id, type: "OL2UL" })); turnIntoSubmenu.push(this.turnsOneInto({ + id, icon: "iconCheck", label: window.siyuan.languages.check, accelerator: window.siyuan.config.keymap.editor.insert.check.custom, protyle, nodeElement, - id, type: "UL2TL" })); } else if (nodeElement.getAttribute("data-subtype") === "t") { turnIntoSubmenu.push(this.turnsOneInto({ + id, icon: "iconList", label: window.siyuan.languages.list, accelerator: window.siyuan.config.keymap.editor.insert.list.custom, protyle, nodeElement, - id, type: "TL2UL" })); turnIntoSubmenu.push(this.turnsOneInto({ + id, icon: "iconOrderedList", label: window.siyuan.languages["ordered-list"], accelerator: window.siyuan.config.keymap.editor.insert["ordered-list"].custom, protyle, nodeElement, - id, type: "TL2OL" })); } else { turnIntoSubmenu.push(this.turnsOneInto({ + id, icon: "iconOrderedList", label: window.siyuan.languages["ordered-list"], accelerator: window.siyuan.config.keymap.editor.insert["ordered-list"].custom, protyle, nodeElement, - id, type: "UL2OL" })); turnIntoSubmenu.push(this.turnsOneInto({ + id, icon: "iconCheck", label: window.siyuan.languages.check, accelerator: window.siyuan.config.keymap.editor.insert.check.custom, protyle, nodeElement, - id, type: "OL2TL" })); } } else if (type === "NodeBlockquote" && !protyle.disabled) { turnIntoSubmenu.push(this.turnsOneInto({ + id, icon: "iconParagraph", label: window.siyuan.languages.paragraph, accelerator: window.siyuan.config.keymap.editor.heading.paragraph.custom, protyle, nodeElement, - id, type: "CancelBlockquote" })); } if (turnIntoSubmenu.length > 0 && !protyle.disabled) { window.siyuan.menus.menu.append(new MenuItem({ + id: "turnInto", icon: "iconRefresh", label: window.siyuan.languages.turnInto, type: "submenu", @@ -1160,6 +1175,7 @@ export class Gutter { } if (!protyle.disabled && !nodeElement.classList.contains("hr")) { window.siyuan.menus.menu.append(new MenuItem({ + id: "ai", icon: "iconSparkles", label: window.siyuan.languages.ai, accelerator: window.siyuan.config.keymap.editor.general.ai.custom, @@ -1170,6 +1186,7 @@ export class Gutter { } const copyMenu = (copySubMenu(id, true, nodeElement) as IMenu[]).concat([{ + id: "copyPlainText", iconHTML: "", label: window.siyuan.languages.copyPlainText, accelerator: window.siyuan.config.keymap.editor.general.copyPlainText.custom, @@ -1178,6 +1195,7 @@ export class Gutter { focusBlock(nodeElement); } }, { + id: type === "NodeAttributeView" ? "copyMirror" : "copy", iconHTML: "", label: type === "NodeAttributeView" ? window.siyuan.languages.copyMirror : window.siyuan.languages.copy, accelerator: "⌘C", @@ -1190,6 +1208,7 @@ export class Gutter { document.execCommand("copy"); } }, { + id: type === "NodeAttributeView" ? "duplicateMirror" : "duplicate", iconHTML: "", label: type === "NodeAttributeView" ? window.siyuan.languages.duplicateMirror : window.siyuan.languages.duplicate, accelerator: window.siyuan.config.keymap.editor.general.duplicate.custom, @@ -1200,6 +1219,7 @@ export class Gutter { }]); if (type === "NodeAttributeView") { copyMenu.push({ + id: "duplicateCompletely", iconHTML: "", label: window.siyuan.languages.duplicateCompletely, accelerator: window.siyuan.config.keymap.editor.general.duplicateCompletely.custom, @@ -1214,25 +1234,28 @@ export class Gutter { copyMenu.splice(7, 0, copyTextRefMenu); } window.siyuan.menus.menu.append(new MenuItem({ - label: window.siyuan.languages.copy, + id: "copy", icon: "iconCopy", + label: window.siyuan.languages.copy, type: "submenu", submenu: copyMenu }).element); if (!protyle.disabled) { window.siyuan.menus.menu.append(new MenuItem({ + id: "cut", + icon: "iconCut", label: window.siyuan.languages.cut, accelerator: "⌘X", - icon: "iconCut", click: () => { focusBlock(nodeElement); document.execCommand("cut"); } }).element); window.siyuan.menus.menu.append(new MenuItem({ + id: "move", + icon: "iconMove", label: window.siyuan.languages.move, accelerator: window.siyuan.config.keymap.general.move.custom, - icon: "iconMove", click: () => { movePathTo((toPath) => { hintMoveBlock(toPath[0], [nodeElement], protyle); @@ -1241,16 +1264,18 @@ export class Gutter { }).element); const range = getSelection().rangeCount > 0 ? getSelection().getRangeAt(0) : undefined; window.siyuan.menus.menu.append(new MenuItem({ + id: "addToDatabase", + icon: "iconDatabase", label: window.siyuan.languages.addToDatabase, accelerator: window.siyuan.config.keymap.general.addToDatabase.custom, - icon: "iconDatabase", click: () => { addEditorToDatabase(protyle, range); } }).element); window.siyuan.menus.menu.append(new MenuItem({ - label: window.siyuan.languages.delete, + id: "delete", icon: "iconTrashcan", + label: window.siyuan.languages.delete, accelerator: "⌫", click: () => { protyle.breadcrumb?.hide(); @@ -1259,8 +1284,9 @@ export class Gutter { }).element); } if (type === "NodeSuperBlock" && !protyle.disabled) { - window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element); + window.siyuan.menus.menu.append(new MenuItem({id: "separator_cancelSuperBlock", type: "separator"}).element); window.siyuan.menus.menu.append(new MenuItem({ + id: "cancelSuperBlock", label: window.siyuan.languages.cancel + " " + window.siyuan.languages.superBlock, click() { const sbData = cancelSB(protyle, nodeElement); @@ -1270,16 +1296,18 @@ export class Gutter { } }).element); } else if (type === "NodeCodeBlock" && !protyle.disabled && !nodeElement.getAttribute("data-subtype")) { - window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element); + window.siyuan.menus.menu.append(new MenuItem({id: "separator_code", type: "separator"}).element); const linewrap = nodeElement.getAttribute("linewrap"); const ligatures = nodeElement.getAttribute("ligatures"); const linenumber = nodeElement.getAttribute("linenumber"); window.siyuan.menus.menu.append(new MenuItem({ + id: "code", type: "submenu", icon: "iconCode", label: window.siyuan.languages.code, submenu: [{ + id: "md31", iconHTML: "", label: `