From 1569435890605e5def49c495726813ff1fa448ce Mon Sep 17 00:00:00 2001 From: Vanessa Date: Sun, 29 Oct 2023 19:06:01 +0800 Subject: [PATCH] :art: fix https://github.com/siyuan-note/siyuan/issues/9543 --- app/src/protyle/render/av/asset.ts | 42 +++++++++++++++++++++++ app/src/protyle/util/editorCommonEvent.ts | 31 +++++++++++++---- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/app/src/protyle/render/av/asset.ts b/app/src/protyle/render/av/asset.ts index c8eb6f470..1b29c0a2e 100644 --- a/app/src/protyle/render/av/asset.ts +++ b/app/src/protyle/render/av/asset.ts @@ -11,6 +11,8 @@ import {exportAsset} from "../../../menus/util"; import {setPosition} from "../../../util/setPosition"; import {previewImage} from "../../preview/image"; import {genAVValueHTML} from "./blockAttr"; +import {hideMessage, showMessage} from "../../../dialog/message"; +import {fetchPost} from "../../../util/fetch"; export const bindAssetEvent = (options: { protyle: IProtyle, @@ -323,3 +325,43 @@ export const addAssetLink = (protyle: IProtyle, data: IAV, cellElements: HTMLEle h: rect.height, }); }; + +export const dragUpload = (files: string[], protyle: IProtyle, cellElement: HTMLElement, avID: string) => { + const msgId = showMessage(window.siyuan.languages.uploading, 0); + fetchPost("/api/asset/insertLocalAssets", { + assetPaths: files, + isUpload: true, + id: protyle.block.rootID + }, (response) => { + hideMessage(msgId); + const addUpdateValue: IAVCellAssetValue[] = [] + Object.keys(response.data.succMap).forEach(key => { + const type = pathPosix().extname(key).toLowerCase(); + const name = key.substring(0, key.length - type.length) + if (Constants.SIYUAN_ASSETS_IMAGE.includes(type)) { + addUpdateValue.push({ + type: "image", + name, + content: response.data.succMap[key], + }) + } else { + addUpdateValue.push({ + type: "file", + name, + content: response.data.succMap[key], + }) + } + }) + fetchPost("/api/av/renderAttributeView", { + id: avID, + }, (response) => { + updateAssetCell({ + protyle, + data: response.data as IAV, + cellElements: [cellElement], + type: "addUpdate", + addUpdateValue + }); + }) + }); +} diff --git a/app/src/protyle/util/editorCommonEvent.ts b/app/src/protyle/util/editorCommonEvent.ts index dd4b3a890..141db1382 100644 --- a/app/src/protyle/util/editorCommonEvent.ts +++ b/app/src/protyle/util/editorCommonEvent.ts @@ -26,6 +26,7 @@ import {insertHTML} from "./insertHTML"; import {isBrowser} from "../../util/functions"; import {hideElements} from "../ui/hideElements"; import {insertAttrViewBlockAnimation} from "../render/av/row"; +import {dragUpload} from "../render/av/asset"; const moveToNew = (protyle: IProtyle, sourceElements: Element[], targetElement: Element, newSourceElement: Element, isSameDoc: boolean, isBottom: boolean, isCopy: boolean) => { @@ -988,15 +989,31 @@ export const dropEvent = (protyle: IProtyle, editorElement: HTMLElement) => { targetElement.classList.remove("dragover__bottom", "dragover__top", "dragover__left", "dragover__right"); } else if (!window.siyuan.dragElement && (event.dataTransfer.types[0] === "Files" || event.dataTransfer.types.includes("text/html"))) { // 外部文件拖入编辑器中或者编辑器内选中文字拖拽 - focusByRange(getRangeByPoint(event.clientX, event.clientY)); - if (event.dataTransfer.types[0] === "Files" && !isBrowser()) { - const files: string[] = []; - for (let i = 0; i < event.dataTransfer.files.length; i++) { - files.push(event.dataTransfer.files[i].path); + // https://github.com/siyuan-note/siyuan/issues/9544 + const avElement = hasClosestByClassName(event.target, 'av') + if (!avElement) { + focusByRange(getRangeByPoint(event.clientX, event.clientY)); + if (event.dataTransfer.types[0] === "Files" && !isBrowser()) { + const files: string[] = []; + for (let i = 0; i < event.dataTransfer.files.length; i++) { + files.push(event.dataTransfer.files[i].path); + } + uploadLocalFiles(files, protyle, !event.altKey); + } else { + paste(protyle, event); } - uploadLocalFiles(files, protyle, !event.altKey); } else { - paste(protyle, event); + const cellElement = hasClosestByClassName(event.target, 'av__cell') + if (cellElement) { + const cellType = avElement.querySelector(`.av__row--header [data-col-id="${cellElement.dataset.colId}"]`)?.getAttribute("data-dtype") + if (cellType === "mAsset" && event.dataTransfer.types[0] === "Files" && !isBrowser()) { + const files: string[] = []; + for (let i = 0; i < event.dataTransfer.files.length; i++) { + files.push(event.dataTransfer.files[i].path); + } + dragUpload(files, protyle, cellElement, avElement.dataset.avId); + } + } } } if (window.siyuan.dragElement) {