Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit bf1fa01

Browse files
committed
Fix deleting image when backspace/del is pressed (#302)
* fix #228 - delete image even if it's not selected but backspace/del is pressed in text * delete images in a selection on backspase/del
1 parent 4dd2294 commit bf1fa01

File tree

2 files changed

+85
-17
lines changed

2 files changed

+85
-17
lines changed

spec/images.spec.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,40 @@ describe('Images addon', function () {
300300
expect($('.medium-insert-images-toolbar').length).toEqual(0);
301301
});
302302

303+
it('fires deleteFile function even when images isn\'t selected but backspace is pressed in text', function () {
304+
var $p = this.$el.find('p'),
305+
$event = $.Event('keydown');
306+
307+
$event.which = 8;
308+
309+
spyOn(jQuery, 'ajax');
310+
311+
$p.before('<div class="medium-insert-images"><figure><img src="delete-image1.jpg" alt=""></figure></div>');
312+
$p.html('test');
313+
314+
placeCaret($p.get(0), 0);
315+
this.$el.trigger($event);
316+
317+
expect(jQuery.ajax.calls.count()).toEqual(1);
318+
});
319+
320+
it('fires deleteFile function even when images isn\'t selected but delete is pressed in text', function () {
321+
var $p = this.$el.find('p'),
322+
$event = $.Event('keydown');
323+
324+
$event.which = 46;
325+
326+
spyOn(jQuery, 'ajax');
327+
328+
$p.after('<div class="medium-insert-images"><figure><img src="delete-image1.jpg" alt=""></figure></div>');
329+
$p.html('test');
330+
331+
placeCaret($p.get(0), $p.text().length);
332+
this.$el.trigger($event);
333+
334+
expect(jQuery.ajax.calls.count()).toEqual(1);
335+
});
336+
303337
it('triggers input event after removing image', function (done) {
304338
var $event = $.Event('keydown');
305339

src/js/images.js

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -493,35 +493,69 @@
493493
*/
494494

495495
Images.prototype.removeImage = function (e) {
496-
var $image, $parent, $empty;
496+
var images = [],
497+
$selectedImage = this.$el.find('.medium-insert-image-active'),
498+
$parent, $empty, selection, range, current, caretPosition, $current, $sibling, selectedHtml, i;
497499

498500
if (e.which === 8 || e.which === 46) {
499-
$image = this.$el.find('.medium-insert-image-active');
501+
if ($selectedImage.length) {
502+
images.push($selectedImage);
503+
}
500504

501-
if ($image.length) {
502-
e.preventDefault();
505+
// Remove image even if it's not selected, but backspace/del is pressed in text
506+
selection = window.getSelection();
507+
if (selection && selection.rangeCount) {
508+
range = selection.getRangeAt(0);
509+
current = range.commonAncestorContainer;
510+
$current = current.nodeName === '#text' ? $(current).parent() : $(current);
511+
caretPosition = MediumEditor.selection.getCaretOffsets(current).left;
512+
513+
// Is backspace pressed and caret is at the beginning of a paragraph, get previous element
514+
if (e.which === 8 && caretPosition === 0) {
515+
$sibling = $current.prev();
516+
// Is del pressed and caret is at the end of a paragraph, get next element
517+
} else if (e.which === 46 && caretPosition === $current.text().length) {
518+
$sibling = $current.next();
519+
}
503520

504-
this.deleteFile($image.attr('src'));
521+
if ($sibling && $sibling.hasClass('medium-insert-images')) {
522+
images.push($sibling.find('img'));
523+
}
505524

506-
$parent = $image.closest('.medium-insert-images');
507-
$image.closest('figure').remove();
525+
// If text is selected, find images in the selection
526+
selectedHtml = MediumEditor.selection.getSelectionHtml(document);
527+
if (selectedHtml) {
528+
$('<div></div>').html(selectedHtml).find('.medium-insert-images img').each(function () {
529+
images.push($(this));
530+
});
531+
}
532+
}
508533

509-
$('.medium-insert-images-toolbar, .medium-insert-images-toolbar2').remove();
534+
if (images.length) {
535+
for (i = 0; i < images.length; i++) {
536+
this.deleteFile(images[i].attr('src'));
510537

511-
if ($parent.find('figure').length === 0) {
512-
$empty = $parent.next();
513-
if ($empty.is('p') === false || $empty.text() !== '') {
514-
$empty = $(this.templates['src/js/templates/core-empty-line.hbs']().trim());
515-
$parent.before($empty);
516-
}
517-
$parent.remove();
538+
$parent = images[i].closest('.medium-insert-images');
539+
images[i].closest('figure').remove();
518540

519-
// Hide addons
520-
this.core.hideAddons();
541+
if ($parent.find('figure').length === 0) {
542+
$empty = $parent.next();
543+
if ($empty.is('p') === false || $empty.text() !== '') {
544+
$empty = $(this.templates['src/js/templates/core-empty-line.hbs']().trim());
545+
$parent.before($empty);
546+
}
547+
$parent.remove();
548+
}
549+
}
521550

551+
// Hide addons
552+
this.core.hideAddons();
553+
if (!selectedHtml && $empty) {
554+
e.preventDefault();
522555
this.core.moveCaret($empty);
523556
}
524557

558+
$('.medium-insert-images-toolbar, .medium-insert-images-toolbar2').remove();
525559
this.core.triggerInput();
526560
}
527561
}

0 commit comments

Comments
 (0)