UNPKG

summernote-webpack

Version:
144 lines (121 loc) 4.67 kB
define([ 'summernote/base/core/key' ], function (key) { var LinkDialog = 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 body = '<div class="form-group">' + '<label>' + lang.link.textToDisplay + '</label>' + '<input class="note-link-text form-control" type="text" />' + '</div>' + '<div class="form-group">' + '<label>' + lang.link.url + '</label>' + '<input class="note-link-url form-control" type="text" value="http://" />' + '</div>' + (!options.disableLinkTarget ? '<div class="checkbox">' + '<label>' + '<input type="checkbox" checked> ' + lang.link.openInNewWindow + '</label>' + '</div>' : '' ); var footer = '<button href="#" class="btn btn-primary note-link-btn disabled" disabled>' + lang.link.insert + '</button>'; this.$dialog = ui.dialog({ className: 'link-dialog', title: lang.link.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'); } }); }; /** * Show link dialog and set event handlers on dialog controls. * * @param {Object} linkInfo * @return {Promise} */ this.showLinkDialog = function (linkInfo) { return $.Deferred(function (deferred) { var $linkText = self.$dialog.find('.note-link-text'), $linkUrl = self.$dialog.find('.note-link-url'), $linkBtn = self.$dialog.find('.note-link-btn'), $openInNewWindow = self.$dialog.find('input[type=checkbox]'); ui.onDialogShown(self.$dialog, function () { context.triggerEvent('dialog.shown'); $linkText.val(linkInfo.text); $linkText.on('input', function () { ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val()); // if linktext was modified by keyup, // stop cloning text from linkUrl linkInfo.text = $linkText.val(); }); // if no url was given, copy text to url if (!linkInfo.url) { linkInfo.url = linkInfo.text || 'http://'; ui.toggleBtn($linkBtn, linkInfo.text); } $linkUrl.on('input', function () { ui.toggleBtn($linkBtn, $linkText.val() && $linkUrl.val()); // display same link on `Text to display` input // when create a new link if (!linkInfo.text) { $linkText.val($linkUrl.val()); } }).val(linkInfo.url).trigger('focus'); self.bindEnterKey($linkUrl, $linkBtn); self.bindEnterKey($linkText, $linkBtn); $openInNewWindow.prop('checked', linkInfo.isNewWindow); $linkBtn.one('click', function (event) { event.preventDefault(); deferred.resolve({ range: linkInfo.range, url: $linkUrl.val(), text: $linkText.val(), isNewWindow: $openInNewWindow.is(':checked') }); self.$dialog.modal('hide'); }); }); ui.onDialogHidden(self.$dialog, function () { // detach events $linkText.off('input keypress'); $linkUrl.off('input keypress'); $linkBtn.off('click'); if (deferred.state() === 'pending') { deferred.reject(); } }); ui.showDialog(self.$dialog); }).promise(); }; /** * @param {Object} layoutInfo */ this.show = function () { var linkInfo = context.invoke('editor.getLinkInfo'); context.invoke('editor.saveRange'); this.showLinkDialog(linkInfo).then(function (linkInfo) { context.invoke('editor.restoreRange'); context.invoke('editor.createLink', linkInfo); }).fail(function () { context.invoke('editor.restoreRange'); }); }; context.memo('help.linkDialog.show', options.langInfo.help['linkDialog.show']); }; return LinkDialog; });