Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/quill.imageCompressor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ class imageCompressor {
this.fileHolder = document.createElement("input");
this.fileHolder.setAttribute("type", "file");
this.fileHolder.setAttribute("accept", "image/*");
this.fileHolder.setAttribute("multiple", "");
this.fileHolder.setAttribute("style", "visibility:hidden");

this.fileHolder.onchange = () => this.fileChanged().then(() => onFileChanged && onFileChanged());
Expand All @@ -73,7 +74,10 @@ class imageCompressor {
if (!files || !files.length) {
return;
}
const file = files[0];

const filesArray = Array.from(files)

filesArray.forEach(async file => {
this.Logger.log("fileChanged", { file });
if (!file) {
return;
Expand All @@ -83,6 +87,7 @@ class imageCompressor {
base64ImageSrc
);
this.insertToEditor(base64ImageSmallSrc, imageCompressor.b64toBlob(base64ImageSmallSrc));
})
}

async downscaleImageFromUrl(dataUrl: string) {
Expand Down
54 changes: 33 additions & 21 deletions src/quill.imageDrop.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,25 +37,34 @@ export class ImageDrop {
}
const files = await getFilesFromDragEvent(evt);
const filesFiltered = Array.from(files || []).filter(f => IsMatch(f.type));
const firstImage = filesFiltered?.[0];
if (firstImage) {
const base64ImageSrc = await file2b64(firstImage);
this.logger.log("handleNewImageFiles", { evt, files, filesFiltered, firstImage, base64ImageSrc });
this.onNewDataUrl(base64ImageSrc);
return;
}
const blob = await getBlobFromDragEvent(evt);
if (!!blob) {
const base64ImageSrc = await file2b64(blob);
this.logger.log("handleNewImageFiles", { evt, blob, base64ImageSrc });
this.onNewDataUrl(base64ImageSrc);
return;
}

filesFiltered.forEach(async image => {
if (image) {
const base64ImageSrc = await file2b64(image);
this.logger.log("handleNewImageFiles", { evt, files, filesFiltered, image, base64ImageSrc });
this.onNewDataUrl(base64ImageSrc);
return;
}

const blob = await getBlobFromDragEvent(evt);
if (!!blob) {
const base64ImageSrc = await file2b64(blob);
this.logger.log("handleNewImageFiles", { evt, blob, base64ImageSrc });
this.onNewDataUrl(base64ImageSrc);
return;
}
})
}

private async handlePaste(evt: ClipboardEvent) {
const files = Array.from(evt?.clipboardData?.items || []);
this.logger.log("handlePaste", { files, evt });

// Text pasted from word will contain text/rtf
const isRichTextPaste = files.find(f => f.type === 'text/rtf')
if (isRichTextPaste) {
return;
}
const images = files.filter(f => IsMatch(f.type));
this.logger.log("handlePaste", { images, evt });
if (!images.length) {
Expand All @@ -68,13 +77,16 @@ export class ImageDrop {
return;
}
evt.preventDefault();
const blob = images.pop()?.getAsFile();
if (!blob) {
return;
}
const base64ImageSrc = await file2b64(blob);
this.logger.log("handleNewImageFiles", { base64ImageSrc });
this.onNewDataUrl(base64ImageSrc);

imagesNoHtml.forEach(async image => {
const blob = image?.getAsFile()
if (!blob) {
return;
}
const base64ImageSrc = await file2b64(blob);
this.logger.log("handleNewImageFiles", { base64ImageSrc });
this.onNewDataUrl(base64ImageSrc);
})
}
}

Expand Down