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
118 lines (99 loc) • 3.46 kB
JavaScript
define([
'summernote/base/core/dom'
], function (dom) {
var Handle = function (context) {
var self = this;
var $document = $(document);
var $editingArea = context.layoutInfo.editingArea;
var options = context.options;
this.events = {
'summernote.mousedown': function (we, e) {
if (self.update(e.target)) {
e.preventDefault();
}
},
'summernote.keyup summernote.scroll summernote.change summernote.dialog.shown': function () {
self.update();
}
};
this.initialize = function () {
this.$handle = $([
'<div class="note-handle">',
'<div class="note-control-selection">',
'<div class="note-control-selection-bg"></div>',
'<div class="note-control-holder note-control-nw"></div>',
'<div class="note-control-holder note-control-ne"></div>',
'<div class="note-control-holder note-control-sw"></div>',
'<div class="',
(options.disableResizeImage ? 'note-control-holder' : 'note-control-sizing'),
' note-control-se"></div>',
(options.disableResizeImage ? '' : '<div class="note-control-selection-info"></div>'),
'</div>',
'</div>'
].join('')).prependTo($editingArea);
this.$handle.on('mousedown', function (event) {
if (dom.isControlSizing(event.target)) {
event.preventDefault();
event.stopPropagation();
var $target = self.$handle.find('.note-control-selection').data('target'),
posStart = $target.offset(),
scrollTop = $document.scrollTop();
$document.on('mousemove', function (event) {
context.invoke('editor.resizeTo', {
x: event.clientX - posStart.left,
y: event.clientY - (posStart.top - scrollTop)
}, $target, !event.shiftKey);
self.update($target[0]);
}).one('mouseup', function (e) {
e.preventDefault();
$document.off('mousemove');
context.invoke('editor.afterCommand');
});
if (!$target.data('ratio')) { // original ratio.
$target.data('ratio', $target.height() / $target.width());
}
}
});
};
this.destroy = function () {
this.$handle.remove();
};
this.update = function (target) {
var isImage = dom.isImg(target);
var $selection = this.$handle.find('.note-control-selection');
context.invoke('imagePopover.update', target);
if (isImage) {
var $image = $(target);
var pos = $image.position();
// include margin
var imageSize = {
w: $image.outerWidth(true),
h: $image.outerHeight(true)
};
$selection.css({
display: 'block',
left: pos.left,
top: pos.top,
width: imageSize.w,
height: imageSize.h
}).data('target', $image); // save current image element.
var sizingText = imageSize.w + 'x' + imageSize.h;
$selection.find('.note-control-selection-info').text(sizingText);
context.invoke('editor.saveTarget', target);
} else {
this.hide();
}
return isImage;
};
/**
* hide
*
* @param {jQuery} $handle
*/
this.hide = function () {
context.invoke('editor.clearTarget');
this.$handle.children().hide();
};
};
return Handle;
});