UNPKG

alpaca

Version:

Alpaca provides the easiest and fastest way to generate interactive forms for the web and mobile devices. It runs simply as HTML5 or more elaborately using Bootstrap, jQuery Mobile or jQuery UI. Alpaca uses Handlebars to process JSON schema and provide

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; });