Commit 6e5aacd5 by Яков

try fix

parent 0f503d93
{
"name": "react-ag-qeditor",
"version": "1.0.76",
"version": "1.0.77",
"description": "WYSIWYG html editor",
"author": "atma",
"license": "MIT",
......
......@@ -75,6 +75,73 @@ const upload = async (file) => {
// }
// });
// const DragAndDrop = Extension.create({
// name: 'customDragAndDrop',
// addProseMirrorPlugins() {
// return [
// new Plugin({
// key: new PluginKey('customDragAndDropPlugin'),
// props: {
// handleDOMEvents: {
// async paste(view, event) {
// const items = (event.clipboardData || event.originalEvent.clipboardData).items;
// let hasImages = false;
//
// // Проверяем, есть ли изображения в буфере
// for (let i = 0; i < items.length; i++) {
// if (items[i].type.indexOf('image') !== -1) {
// hasImages = true;
// break;
// }
// }
//
// // Если нет изображений - пропускаем обработку
// if (!hasImages) return false;
//
// // Обрабатываем только изображения
// for (let i = 0; i < items.length; i++) {
// const image = items[i].getAsFile();
// if (!image || !image.type.match('image.*')) continue;
//
// event.preventDefault();
// const imageSrc = await upload(image);
// const node = view.state.schema.nodes.image.create({
// src: imageSrc,
// });
// const transaction = view.state.tr.replaceSelectionWith(node);
// view.dispatch(transaction);
// }
// return true;
// },
// async drop(view, event) {
// const hasFiles = event.dataTransfer.files.length > 0;
// if (!hasFiles) return false;
//
// event.preventDefault();
// const images = event.dataTransfer.files;
// const { schema } = view.state;
// const coordinates = view.posAtCoords({ left: event.clientX, top: event.clientY });
//
// for (let i = 0; i < images.length; i++) {
// if (!images[i].type.match('image.*')) continue;
// const imageSrc = await upload(images[i]);
// if (imageSrc) {
// const node = schema.nodes.image.create({
// src: imageSrc
// });
// const transaction = view.state.tr.insert(coordinates.pos, node);
// view.dispatch(transaction);
// }
// }
// return true;
// }
// }
// }
// })
// ]
// }
// });
const DragAndDrop = Extension.create({
name: 'customDragAndDrop',
addProseMirrorPlugins() {
......@@ -83,57 +150,70 @@ const DragAndDrop = Extension.create({
key: new PluginKey('customDragAndDropPlugin'),
props: {
handleDOMEvents: {
async paste(view, event) {
const items = (event.clipboardData || event.originalEvent.clipboardData).items;
let hasImages = false;
// Проверяем, есть ли изображения в буфере
for (let i = 0; i < items.length; i++) {
if (items[i].type.indexOf('image') !== -1) {
hasImages = true;
break;
}
}
paste: async (view, event) => {
const items = Array.from(
(event.clipboardData || event.originalEvent.clipboardData).items
);
// Ищем изображения среди вставленных элементов
const imageItems = items.filter(item =>
item.type.startsWith('image/') && item.getAsFile()
);
// Если нет изображений - пропускаем обработку
if (!hasImages) return false;
if (imageItems.length === 0) return false;
// Обрабатываем только изображения
for (let i = 0; i < items.length; i++) {
const image = items[i].getAsFile();
if (!image || !image.type.match('image.*')) continue;
// Отменяем событие только если нашли изображения
event.preventDefault();
event.preventDefault();
const imageSrc = await upload(image);
const node = view.state.schema.nodes.image.create({
src: imageSrc,
});
const transaction = view.state.tr.replaceSelectionWith(node);
view.dispatch(transaction);
try {
const { schema } = view.state;
if (!schema.nodes.image) return false;
// Обрабатываем все найденные изображения
for (const item of imageItems) {
const file = item.getAsFile();
if (!file) continue;
const imageSrc = await upload(file);
const node = schema.nodes.image.create({ src: imageSrc });
const transaction = view.state.tr.replaceSelectionWith(node);
view.dispatch(transaction);
}
return true;
} catch (error) {
console.error('Image upload failed:', error);
return false;
}
return true;
},
async drop(view, event) {
const hasFiles = event.dataTransfer.files.length > 0;
if (!hasFiles) return false;
drop: async (view, event) => {
const files = Array.from(event.dataTransfer?.files || []);
const imageFiles = files.filter(file => file.type.startsWith('image/'));
if (imageFiles.length === 0) return false;
event.preventDefault();
const images = event.dataTransfer.files;
const { schema } = view.state;
const coordinates = view.posAtCoords({ left: event.clientX, top: event.clientY });
for (let i = 0; i < images.length; i++) {
if (!images[i].type.match('image.*')) continue;
const imageSrc = await upload(images[i]);
if (imageSrc) {
const node = schema.nodes.image.create({
src: imageSrc
});
try {
const { schema } = view.state;
if (!schema.nodes.image) return false;
const coordinates = view.posAtCoords({
left: event.clientX,
top: event.clientY
});
for (const file of imageFiles) {
const imageSrc = await upload(file);
const node = schema.nodes.image.create({ src: imageSrc });
const transaction = view.state.tr.insert(coordinates.pos, node);
view.dispatch(transaction);
}
return true;
} catch (error) {
console.error('Image drop failed:', error);
return false;
}
return true;
}
}
}
......@@ -142,3 +222,4 @@ const DragAndDrop = Extension.create({
}
});
export default DragAndDrop;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment