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
94 lines (84 loc) • 3.09 kB
JavaScript
define(function () {
var Dropzone = function (context) {
var $document = $(document);
var $editor = context.layoutInfo.editor;
var $editable = context.layoutInfo.editable;
var options = context.options;
var lang = options.langInfo;
var $dropzone = $([
'<div class="note-dropzone">',
' <div class="note-dropzone-message"/>',
'</div>'
].join('')).prependTo($editor);
/**
* attach Drag and Drop Events
*/
this.initialize = function () {
if (options.disableDragAndDrop) {
// prevent default drop event
$document.on('drop', function (e) {
e.preventDefault();
});
} else {
this.attachDragAndDropEvent();
}
};
/**
* attach Drag and Drop Events
*/
this.attachDragAndDropEvent = function () {
var collection = $(),
$dropzoneMessage = $dropzone.find('.note-dropzone-message');
// show dropzone on dragenter when dragging a object to document
// -but only if the editor is visible, i.e. has a positive width and height
$document.on('dragenter', function (e) {
var isCodeview = context.invoke('codeview.isActivated');
var hasEditorSize = $editor.width() > 0 && $editor.height() > 0;
if (!isCodeview && !collection.length && hasEditorSize) {
$editor.addClass('dragover');
$dropzone.width($editor.width());
$dropzone.height($editor.height());
$dropzoneMessage.text(lang.image.dragImageHere);
}
collection = collection.add(e.target);
}).on('dragleave', function (e) {
collection = collection.not(e.target);
if (!collection.length) {
$editor.removeClass('dragover');
}
}).on('drop', function () {
collection = $();
$editor.removeClass('dragover');
});
// change dropzone's message on hover.
$dropzone.on('dragenter', function () {
$dropzone.addClass('hover');
$dropzoneMessage.text(lang.image.dropImage);
}).on('dragleave', function () {
$dropzone.removeClass('hover');
$dropzoneMessage.text(lang.image.dragImageHere);
});
// attach dropImage
$dropzone.on('drop', function (event) {
var dataTransfer = event.originalEvent.dataTransfer;
if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
event.preventDefault();
$editable.focus();
context.invoke('editor.insertImagesOrCallback', dataTransfer.files);
} else {
$.each(dataTransfer.types, function (idx, type) {
var content = dataTransfer.getData(type);
if (type.toLowerCase().indexOf('text') > -1) {
context.invoke('editor.pasteHTML', content);
} else {
$(content).each(function () {
context.invoke('editor.insertNode', this);
});
}
});
}
}).on('dragover', false); // prevent default dragover event
};
};
return Dropzone;
});