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

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