Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
lib
react-ag-qeditor
Commits
94fe6020
Commit
94fe6020
authored
May 14, 2025
by
Яков
Browse files
try fix
parent
a5d39205
Changes
2
Show whitespace changes
Inline
Side-by-side
package.json
View file @
94fe6020
{
{
"name"
:
"react-ag-qeditor"
,
"name"
:
"react-ag-qeditor"
,
"version"
:
"1.0.
79
"
,
"version"
:
"1.0.
80
"
,
"description"
:
"WYSIWYG html editor"
,
"description"
:
"WYSIWYG html editor"
,
"author"
:
"atma"
,
"author"
:
"atma"
,
"license"
:
"
MIT
"
,
"license"
:
"
MIT
"
,
...
...
src/extensions/DragAndDrop.js
View file @
94fe6020
...
@@ -12,214 +12,67 @@ const upload = async (file) => {
...
@@ -12,214 +12,67 @@ const upload = async (file) => {
return
response
.
data
.
file_path
;
return
response
.
data
.
file_path
;
};
};
// const DragAndDrop = Extension.create({
// name: 'customDragAndDrop',
// addProseMirrorPlugins() {
// return [
// new Plugin({
// key: new PluginKey('customDragAndDrop'),
// props: {
// handleDOMEvents: {
// async paste (view, event) {
// let items = (event.clipboardData || event.originalEvent.clipboardData).items;
//
// for (let i = 0; i < items.length; i++){
// const { schema } = view.state;
// const image = items[i].getAsFile();
//
// if (!image) {
// return
// }
//
// event.preventDefault();
// const imageSrc = await upload(image);
//
// const node = schema.nodes.image.create({
// src: imageSrc,
// });
// const transaction = view.state.tr.replaceSelectionWith(node);
// view.dispatch(transaction)
// }
// },
// async drop (view, event) {
// const hasFiles = event.dataTransfer.files.length > 0;
//
// // Другой способ достать текст
// // console.log(event.dataTransfer.items[0].getAsString( (i) => {
// // console.log(i)
// // }));
// // console.log(hasFiles)
//
// if (hasFiles) {
// 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++) {
// 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)
// }
// }
// }
// }
// }
// }
// })
// ]
// }
// });
// 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
({
const
DragAndDrop
=
Extension
.
create
({
name
:
'
smartImageUpload
'
,
name
:
'
customDragAndDrop
'
,
addProseMirrorPlugins
()
{
addProseMirrorPlugins
()
{
return
[
return
[
new
Plugin
({
new
Plugin
({
key
:
new
PluginKey
(
'
smartImageUpload
'
),
key
:
new
PluginKey
(
'
customDragAndDrop
'
),
props
:
{
props
:
{
handleDOMEvents
:
{
handleDOMEvents
:
{
paste
:
(
view
,
event
)
=>
{
async
paste
(
view
,
event
)
{
const
clipboard
=
event
.
clipboardData
||
event
.
originalEvent
.
clipboardData
let
items
=
(
event
.
clipboardData
||
event
.
originalEvent
.
clipboardData
).
items
;
// Проверяем наличие изображений
for
(
let
i
=
0
;
i
<
items
.
length
;
i
++
){
const
hasImages
=
Array
.
from
(
clipboard
.
items
).
some
(
const
{
schema
}
=
view
.
state
;
item
=>
item
.
type
.
startsWith
(
'
image/
'
)
const
image
=
items
[
i
].
getAsFile
();
)
// Если есть изображения - обрабатываем только их
if
(
!
image
)
{
if
(
hasImages
)
{
return
event
.
preventDefault
()
}
// Получаем все изображения из буфера
// event.preventDefault();
const
images
=
Array
.
from
(
clipboard
.
items
)
const
imageSrc
=
await
upload
(
image
);
.
filter
(
item
=>
item
.
type
.
startsWith
(
'
image/
'
))
.
map
(
item
=>
item
.
getAsFile
())
.
filter
(
Boolean
)
// Загружаем и вставляем каждое изображение
const
node
=
schema
.
nodes
.
image
.
create
({
images
.
forEach
(
async
(
file
)
=>
{
src
:
imageSrc
,
const
imageUrl
=
await
upload
(
file
)
// Ваша функция загрузки
});
view
.
state
.
schema
.
nodes
.
image
.
createAndFill
(
const
transaction
=
view
.
state
.
tr
.
replaceSelectionWith
(
node
);
{
src
:
imageUrl
}
)?.
forEach
(
node
=>
{
const
transaction
=
view
.
state
.
tr
.
replaceSelectionWith
(
node
)
view
.
dispatch
(
transaction
)
view
.
dispatch
(
transaction
)
})
})
return
true
}
}
// Для всего остального позволяем Tiptap обрабатывать самостоятельно
return
false
},
},
drop
:
(
view
,
event
)
=>
{
async
drop
(
view
,
event
)
{
const
files
=
event
.
dataTransfer
?.
files
const
hasFiles
=
event
.
dataTransfer
.
files
.
length
>
0
;
if
(
files
&&
files
.
length
>
0
)
{
const
imageFiles
=
Array
.
from
(
files
).
filter
(
// Другой способ достать текст
file
=>
file
.
type
.
startsWith
(
'
image/
'
)
// console.log(event.dataTransfer.items[0].getAsString( (i) => {
)
// console.log(i)
// }));
if
(
imageFiles
.
length
>
0
)
{
// console.log(hasFiles)
event
.
preventDefault
()
if
(
hasFiles
)
{
// Получаем позицию для вставки
// event.preventDefault();
const
coordinates
=
view
.
posAtCoords
({
const
images
=
event
.
dataTransfer
.
files
;
left
:
event
.
clientX
,
const
{
schema
}
=
view
.
state
;
top
:
event
.
clientY
const
coordinates
=
view
.
posAtCoords
({
left
:
event
.
clientX
,
top
:
event
.
clientY
});
})
for
(
let
i
=
0
;
i
<
images
.
length
;
i
++
)
{
// Загружаем и вставляем изображения
const
imageSrc
=
await
upload
(
images
[
i
]);
imageFiles
.
forEach
(
async
(
file
)
=>
{
if
(
imageSrc
)
{
const
imageUrl
=
await
upload
(
file
)
// Ваша функция загрузки
const
node
=
schema
.
nodes
.
image
.
create
({
const
node
=
view
.
state
.
schema
.
nodes
.
image
.
create
(
src
:
imageSrc
{
src
:
imageUrl
}
});
)
const
transaction
=
view
.
state
.
tr
.
insert
(
coordinates
.
pos
,
node
);
const
transaction
=
view
.
state
.
tr
.
insert
(
coordinates
.
pos
,
node
)
view
.
dispatch
(
transaction
)
view
.
dispatch
(
transaction
)
})
return
true
}
}
}
}
return
false
}
}
}
}
}
}
}
})
})
]
]
}
}
})
});
export
default
DragAndDrop
;
export
default
DragAndDrop
;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment