Add "Copy web URL" command to the Copy context menu. (#16415)

This command copies a web deeplink url onto clipboard, which is useful
when SiYuan is running in browser and the link will use the format
of "https://app.com/?id={id}". This link can be then easily shared
to other users who have access to the same instance.

The item is only visible in browsers.
This commit is contained in:
Juho Mäkinen 2025-11-21 17:00:23 +02:00 committed by GitHub
parent 576f60d693
commit 6d5d17ce86
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 32 additions and 2 deletions

View file

@ -918,6 +918,7 @@
"moveToRight": "تحريك لليمين",
"copyProtocol": "نسخ الرابط التشعبي للكتلة",
"copyProtocolInMd": "‫نسخ رابط Markdown للكتلة‬",
"copyWebURL": "نسخ رابط الويب",
"uploadAssets2CDN": "رفع ملفات الأصول إلى السحابة",
"uploadAssets2CDNConfirmTip": "هل أنت متأكد من رفع الأصول في هذا المستند إلى السحابة؟",
"notSupport1": "لا يمكن السحب والإسقاط عبر الدفاتر",

View file

@ -918,6 +918,7 @@
"moveToRight": "Nach rechts bewegen",
"copyProtocol": "Blockhyperlink kopieren",
"copyProtocolInMd": "Block-Markdown-Link kopieren",
"copyWebURL": "Web-URL kopieren",
"uploadAssets2CDN": "Asset-Dateien in die Cloud hochladen",
"uploadAssets2CDNConfirmTip": "Sind Sie sicher, dass Sie die Assets in diesem Dokument in die Cloud hochladen möchten?",
"notSupport1": "Unterstützt kein Drag & Drop über Notizen hinweg.",

View file

@ -918,6 +918,7 @@
"moveToRight": "Move Right",
"copyProtocol": "Copy block hyperlink",
"copyProtocolInMd": "Copy block Markdown link",
"copyWebURL": "Copy web URL",
"uploadAssets2CDN": "Upload asset files to cloud",
"uploadAssets2CDNConfirmTip": "Are you sure to upload the assets in this document to the cloud?",
"notSupport1": "Does not support drag and drop across notebooks",

View file

@ -918,6 +918,7 @@
"moveToRight": "Mover a la derecha",
"copyProtocol": "Copiar hipervínculo de bloque",
"copyProtocolInMd": "Copiar enlace de bloque de Markdown",
"copyWebURL": "Copiar URL web",
"uploadAssets2CDN": "Subir archivos de activos a la nube",
"uploadAssets2CDNConfirmTip": "¿Está seguro de cargar los recursos de este documento en la nube?",
"notSupport1": "No admite la función de arrastrar y soltar en los cuadernos",

View file

@ -918,6 +918,7 @@
"moveToRight": "vers la Droite",
"copyProtocol": "Copier bloc d'hyperliens",
"copyProtocolInMd": "Copier le lien Markdown du bloc",
"copyWebURL": "Copier l'URL web",
"uploadAssets2CDN": "Transférer les fichiers asset vers le Cloud",
"uploadAssets2CDNConfirmTip": "Êtes-vous sûr de télécharger les ressources de ce document dans le cloud ?",
"notSupport1": "Le glisser-déposer entre carnets n'est pas pris en charge",

View file

@ -918,6 +918,7 @@
"moveToRight": "העבר ימינה",
"copyProtocol": "העתק היפר-קישור בלוק",
"copyProtocolInMd": "העתק קישור Markdown של בלוק",
"copyWebURL": "העתק URL אינטרנט",
"uploadAssets2CDN": "העלה קבצי נכסים לענן",
"uploadAssets2CDNConfirmTip": "האם אתה בטוח להעלות את הנכסים במסמך זה לענן?",
"notSupport1": "לא תומך בגרירת מסמכים בין מחברות",

View file

@ -918,6 +918,7 @@
"moveToRight": "Sposta a Destra",
"copyProtocol": "Copia il collegamento del blocco",
"copyProtocolInMd": "Copia collegamento Markdown del blocco",
"copyWebURL": "Copia URL web",
"uploadAssets2CDN": "Carica file di asset su cloud",
"uploadAssets2CDNConfirmTip": "Sei sicuro di voler caricare gli asset di questo documento sul cloud?",
"notSupport1": "Non supporta il trascinamento tra taccuini",

View file

@ -918,6 +918,7 @@
"moveToRight": "右に移動",
"copyProtocol": "ハイパーリンクとしてコピー",
"copyProtocolInMd": "Markdown リンクとしてコピー",
"copyWebURL": "ウェブURLをコピー",
"uploadAssets2CDN": "アセットファイルをクラウドにアップロード",
"uploadAssets2CDNConfirmTip": "このドキュメントのアセットをクラウドにアップロードしてもよろしいですか?",
"notSupport1": "ノートブック間でのドラッグ&ドロップはサポートされていません",

View file

@ -918,6 +918,7 @@
"moveToRight": "Przenieś w prawo",
"copyProtocol": "Kopiuj hiperlink bloku",
"copyProtocolInMd": "Kopiuj link Markdown bloku",
"copyWebURL": "Kopiuj URL internetowy",
"uploadAssets2CDN": "Prześlij pliki zasobów do chmury",
"uploadAssets2CDNConfirmTip": "Czy na pewno chcesz przesłać zasoby w tym dokumencie do chmury?",
"notSupport1": "Nie wspiera przeciągania i upuszczania między notesami",

View file

@ -918,6 +918,7 @@
"moveToRight": "Mover para Direita",
"copyProtocol": "Copiar hiperlink do bloco",
"copyProtocolInMd": "Copiar link Markdown do bloco",
"copyWebURL": "Copiar URL da web",
"uploadAssets2CDN": "Enviar arquivos de ativos para a nuvem",
"uploadAssets2CDNConfirmTip": "Tem certeza que deseja enviar os ativos neste documento para a nuvem?",
"notSupport1": "Não suporta arrastar e soltar entre blocos de notas",

View file

@ -918,6 +918,7 @@
"moveToRight": "Переместить направо",
"copyProtocol": "Скопировать гиперссылку блока",
"copyProtocolInMd": "Скопировать ссылку блока в Markdown",
"copyWebURL": "Скопировать веб-ссылку",
"uploadAssets2CDN": "Загрузить файлы ресурсов в облако",
"uploadAssets2CDNConfirmTip": "Вы уверены, что хотите загрузить ресурсы в этом документе в облако?",
"notSupport1": "Не поддерживает перетаскивание между блокнотами",

View file

@ -918,6 +918,7 @@
"moveToRight": "向右移",
"copyProtocol": "複製塊超連結",
"copyProtocolInMd": "複製塊 Markdown 連結",
"copyWebURL": "複製網頁連結",
"uploadAssets2CDN": "上傳資料檔到圖床",
"uploadAssets2CDNConfirmTip": "確定將該文檔內的資源文件上傳到圖床嗎?",
"notSupport1": "不支援跨筆記本進行拖拽",

View file

@ -918,6 +918,7 @@
"moveToRight": "向右移",
"copyProtocol": "复制块超链接",
"copyProtocolInMd": "复制块 Markdown 链接",
"copyWebURL": "复制网页链接",
"uploadAssets2CDN": "上传资源文件到图床",
"uploadAssets2CDNConfirmTip": "确定将该文档内的资源文件上传到图床吗?",
"notSupport1": "不支持跨笔记本进行拖拽",

View file

@ -443,7 +443,21 @@ export const copySubMenu = (ids: string[], accelerator = true, focusElement?: El
focusBlock(focusElement);
}
}
}, {
},
/// #if BROWSER
{
id: "copyWebURL",
iconHTML: "",
label: window.siyuan.languages.copyWebURL,
click: () => {
copyTextByType(ids, "webURL");
if (focusElement) {
focusBlock(focusElement);
}
}
},
/// #endif
{
id: "copyHPath",
iconHTML: "",
label: window.siyuan.languages.copyHPath,

View file

@ -216,7 +216,7 @@ export const toolbarKeyToMenu = (toolbar: Array<string | IMenuItem>) => {
};
export const copyTextByType = async (ids: string[],
type: "ref" | "blockEmbed" | "protocol" | "protocolMd" | "hPath" | "id") => {
type: "ref" | "blockEmbed" | "protocol" | "protocolMd" | "hPath" | "id" | "webURL") => {
let text = "";
for (let i = 0; i < ids.length; i++) {
const id = ids[i];
@ -236,6 +236,9 @@ export const copyTextByType = async (ids: string[],
} else if (type === "hPath") {
const response = await fetchSyncPost("/api/filetree/getHPathByID", {id});
text += response.data;
} else if (type === "webURL") {
const origin = window.location.origin;
text += `${origin}/?id=${id}`;
} else if (type === "id") {
text += id;
}