summernote-webpack
Version:
Super simple WYSIWYG editor
144 lines (121 loc) • 4.67 kB
JavaScript
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;
});