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