silex-website-builder-goodevent
Version:
Free and easy website builder for everyone.
118 lines (110 loc) • 3.5 kB
JavaScript
(function( $, undefined ) {
$.widget('silexlabs.editable', {
version: '1.0.0',
options: {
isContainer: false,
isResizable: true,
isDroppable: true,
isDraggable: true
},
// _setOption is called for each individual option that is changing
_setOption: function( key, value ) {
switch(key){
case 'isContainer':
this.options[key] = value;
this.disableEditable();
this.enableEditable();
break;
case 'disabled':
this.options[key] = value;
if (value==true){
this.disableEditable();
}
else{
this.enableEditable();
}
break;
case 'isDroppable':
case 'isDraggable':
case 'isResizable':
if (this.options.disabled==false){
this.disableEditable();
this.options[key] = value;
this.enableEditable();
}
break;
}
},
_create: function() {
this.enableEditable();
},
_destroy: function() {
if (this.options.isDraggable != false)
this.element.draggable('destroy');
if (this.options.isResizable != false)
this.element.resizable('destroy');
if (this.options.isContainer && this.options.isDroppable != false){
this.element.droppable('destroy');
}
},
disableEditable: function(){
if (this.options.isDraggable != false)
this.element.draggable({revert:undefined});
if (this.options.isContainer && this.options.isDroppable != false){
this.element.droppable('disable');
}
if (this.options.isDraggable != false)
this.element.draggable('disable');
if (this.options.isResizable != false)
this.element.resizable('disable');
},
enableEditable: function(){
if (this.options.isResizable != false)
this.element.resizable({
handles : 'all'
});
//this.element.draggable({ revert: 'invalid', snap: true });
//this.element.draggable({ revert: 'invalid', grid: [ 20, 20 ] });
if (this.options.isDraggable != false)
this.element.draggable({ revert: 'invalid' });
if (this.options.isResizable != false)
this.element.resizable('enable').draggable('enable');
if (this.options.isContainer && this.options.isDroppable != false){
this.element.droppable({
// prevent propagation
greedy: true,
drop: function( event, ui ) {
// reference to the elements
var dropped = ui.draggable[0];
var droppedFrom = $(dropped).parent()[0];
var droppedTo = this;
// compute new position in the container
// keep initial position
var initialOffset = $(dropped).offset();
// move to the new container
$(dropped).detach().appendTo($(droppedTo));
// compute new position
var newOffset = $(dropped).offset();
var deltaTop = initialOffset.top - newOffset.top;
var deltaLeft = initialOffset.left - newOffset.left;
var newPosTop = $(dropped).position().top + deltaTop;
var newPosLeft = $(dropped).position().left + deltaLeft;
// put back at the same position
$(dropped).css({top: newPosTop+'px',left: newPosLeft+'px'});
// dispatch event to notify that the element changed container
if (droppedTo !== droppedFrom){
// trigger an event the old fashion way because it has to be catched by old fashioned addEventListener
//$(dropped).trigger('newContainer', [dropped, droppedTo, droppedFrom]);
var event = document.createEvent('Event');
event.initEvent('newContainer', true, true);
dropped.dispatchEvent(event);
}
else{
}
}
});
this.element.droppable('enable');
}
},
});
})(jQuery);