UNPKG

summernote-webpack

Version:
125 lines (105 loc) 4.11 kB
define([ 'summernote/base/core/key' ], function (key) { var ImageDialog = function (context) { var self = this; var ui = $.summernote.ui; var $editor = context.layoutInfo.editor; var options = context.options; var lang = options.langInfo; this.initialize = function () { var $container = options.dialogsInBody ? $(document.body) : $editor; var imageLimitation = ''; if (options.maximumImageFileSize) { var unit = Math.floor(Math.log(options.maximumImageFileSize) / Math.log(1024)); var readableSize = (options.maximumImageFileSize / Math.pow(1024, unit)).toFixed(2) * 1 + ' ' + ' KMGTP'[unit] + 'B'; imageLimitation = '<small>' + lang.image.maximumFileSize + ' : ' + readableSize + '</small>'; } var body = '<div class="form-group note-group-select-from-files">' + '<label>' + lang.image.selectFromFiles + '</label>' + '<input class="note-image-input form-control" type="file" name="files" accept="image/*" multiple="multiple" />' + imageLimitation + '</div>' + '<div class="form-group" style="overflow:auto;">' + '<label>' + lang.image.url + '</label>' + '<input class="note-image-url form-control col-md-12" type="text" />' + '</div>'; var footer = '<button href="#" class="btn btn-primary note-image-btn disabled" disabled>' + lang.image.insert + '</button>'; this.$dialog = ui.dialog({ title: lang.image.insert, fade: options.dialogsFade, body: body, footer: footer }).render().appendTo($container); }; this.destroy = function () { ui.hideDialog(this.$dialog); this.$dialog.remove(); }; this.bindEnterKey = function ($input, $btn) { $input.on('keypress', function (event) { if (event.keyCode === key.code.ENTER) { $btn.trigger('click'); } }); }; this.show = function () { context.invoke('editor.saveRange'); this.showImageDialog().then(function (data) { // [workaround] hide dialog before restore range for IE range focus ui.hideDialog(self.$dialog); context.invoke('editor.restoreRange'); if (typeof data === 'string') { // image url context.invoke('editor.insertImage', data); } else { // array of files context.invoke('editor.insertImagesOrCallback', data); } }).fail(function () { context.invoke('editor.restoreRange'); }); }; /** * show image dialog * * @param {jQuery} $dialog * @return {Promise} */ this.showImageDialog = function () { return $.Deferred(function (deferred) { var $imageInput = self.$dialog.find('.note-image-input'), $imageUrl = self.$dialog.find('.note-image-url'), $imageBtn = self.$dialog.find('.note-image-btn'); ui.onDialogShown(self.$dialog, function () { context.triggerEvent('dialog.shown'); // Cloning imageInput to clear element. $imageInput.replaceWith($imageInput.clone() .on('change', function () { deferred.resolve(this.files || this.value); }) .val('') ); $imageBtn.click(function (event) { event.preventDefault(); deferred.resolve($imageUrl.val()); }); $imageUrl.on('keyup paste', function () { var url = $imageUrl.val(); ui.toggleBtn($imageBtn, url); }).val('').trigger('focus'); self.bindEnterKey($imageUrl, $imageBtn); }); ui.onDialogHidden(self.$dialog, function () { $imageInput.off('change'); $imageUrl.off('keyup paste keypress'); $imageBtn.off('click'); if (deferred.state() === 'pending') { deferred.reject(); } }); ui.showDialog(self.$dialog); }); }; }; return ImageDialog; });