/* ------------------------------------------------------------------------------
*
* # jQuery UI interactions
*
* Demo JS code for jqueryui_interactions.html page
*
* ---------------------------------------------------------------------------- */
// Setup module
// ------------------------------
var JqueryUiInteractions = function() {
//
// Setup module components
//
// Draggable
var _componentUiDraggable = function() {
if (!$().draggable) {
console.warn('Warning - jQuery UI components are not loaded.');
return;
}
// Basic setup
$('.draggable-element').draggable({
containment: '#draggable-default-container'
});
//
// Constrain movement
//
// Both
$('#draggable-move-both').draggable({
containment: '#draggable-containment-container'
});
// Vertical
$('#draggable-move-vertical').draggable({
containment: '#draggable-containment-container',
axis: 'y'
});
// Horizontal
$('#draggable-move-horizontal').draggable({
containment: '#draggable-containment-container',
axis: 'x'
});
//
// Revert position
//
// Element
$('#draggable-revert-element').draggable({
containment: '#draggable-revert-container',
revert: true
});
// Clone helper
$('#draggable-revert-clone').draggable({
containment: '#draggable-revert-container',
revert: true,
helper: 'clone'
});
// Speed
$('#draggable-revert-speed').draggable({
containment: '#draggable-revert-container',
revert: true,
revertDuration: 1500
});
//
// Cursors
//
// Move cursor
$('#draggable-cursor-move').draggable({
containment: '#draggable-cursor-container',
cursor: 'move'
});
// Crosshair cursor
$( '#draggable-cursor-crosshair' ).draggable({
containment: '#draggable-cursor-container',
cursor: 'crosshair'
});
// Bottom cursor
$( '#draggable-cursor-bottom' ).draggable({
containment: '#draggable-cursor-container',
cursorAt: {
bottom: 0
}
});
//
// Handles
//
// Text
$( '#draggable-handle-text' ).draggable({
containment: '#draggable-handle-container',
handle: 'span'
});
// Icon
$( '#draggable-handle-icon' ).draggable({
containment: '#draggable-handle-container',
handle: '.handle-icon'
});
// Exception
$( '#draggable-handle-exception' ).draggable({
containment: '#draggable-handle-container',
cancel: 'span'
});
//
// Events
//
// Define elements
var $start_counter = $('#draggable-event-start'),
$drag_counter = $('#draggable-event-drag'),
$stop_counter = $('#draggable-event-stop'),
counts = [0, 0, 0];
// Start event
$start_counter.draggable({
containment: '#draggable-events-container',
start: function() {
counts[0]++;
updateCounterStatus( $start_counter, counts[0]);
}
});
// Drag event
$drag_counter.draggable({
containment: '#draggable-events-container',
drag: function() {
counts[1]++;
updateCounterStatus($drag_counter, counts[1]);
}
});
// Stop event
$stop_counter.draggable({
containment: '#draggable-events-container',
stop: function() {
counts[2]++;
updateCounterStatus($stop_counter, counts[2]);
}
});
// Update counter text
function updateCounterStatus( $event_counter, new_count ) {
$( '.event-count', $event_counter ).text( new_count );
}
};
// Droppable
var _componentUiDroppable = function() {
if (!$().draggable || !$().droppable) {
console.warn('Warning - jQuery UI components are not loaded.');
return;
}
//
// Basic functionality
//
// Drag
$('#droppable-basic-element').draggable({
containment: '#droppable-basic-container'
});
// Drop
$('#droppable-basic-target').droppable({
drop: function(event, ui) {
$(this).addClass('bg-success-400 border-success-400 text-white').html('Dropped!');
}
});
//
// Accept drop
//
// Drag
$('#droppable-accept-yes, #droppable-accept-no').draggable({
containment: '#droppable-accept-container'
});
// Drop
$('#droppable-accept-target').droppable({
accept: '#droppable-accept-yes',
drop: function(event, ui) {
$(this).addClass('bg-success-400 border-success-400 text-white').html('Dropped!');
}
});
//
// Revert draggable position
//
// Drag (revert on drop)
$('#droppable-revert-drop').draggable({
containment: '#droppable-revert-container',
revert: 'valid'
});
// Drag (revert always except drop)
$('#droppable-revert-except').draggable({
containment: '#droppable-revert-container',
revert: 'invalid'
});
// Drop
$('#droppable-revert-target').droppable({
drop: function(event, ui) {
$(this).addClass('bg-success-400 border-success-400 text-white').html('Dropped!');
}
});
//
// Visual feedback
//
// Drag
$('#droppable-visual-element').draggable({
containment: '#droppable-visual-container'
});
// Active drop
$('#droppable-visual-target-active').droppable({
containment: '#droppable-visual-container',
accept: '#droppable-visual-element',
activeClass: 'bg-slate border-slate text-white',
drop: function(event, ui) {
$(this).addClass('bg-success-400 border-success-400 text-white').html('Dropped!');
}
});
// Hover drop
$('#droppable-visual-target-hover').droppable({
containment: '#droppable-visual-container',
hoverClass: 'bg-blue border-blue text-white',
drop: function(event, ui) {
$(this).addClass('bg-teal-400 border-teal-400 text-white').html('Dropped!');
}
});
};
// Resizable
var _componentUiResizable = function() {
if (!$().resizable) {
console.warn('Warning - jQuery UI components are not loaded.');
return;
}
// Basic functionality
$('#resizable-basic-element').resizable({
minWidth: 50,
minHeight: 50
});
// Animated resize
$('#resizable-animate-element').resizable({
minWidth: 50,
minHeight: 50,
animate: true
});
// Preserve aspect ratio
$('#resizable-ratio-element').resizable({
minWidth: 50,
minHeight: 50,
aspectRatio: 16 / 9
});
// Synchronous resize
$('#resizable-sync-element1').resizable({
minWidth: 50,
minHeight: 50,
alsoResize: '#resizable-sync-element2'
});
$('#resizable-sync-element2').resizable({
minWidth: 50,
minHeight: 50,
alsoResize: '#resizable-sync-element1'
});
};
// Selectable
var _componentUiSelectable = function() {
if (!$().selectable) {
console.warn('Warning - jQuery UI components are not loaded.');
return;
}
// Basic functionality
$('#selectable-basic').selectable();
// Serialize
$('#selectable-serialize').selectable({
stop: function() {
var result = $('#select-result').empty();
$('.ui-selected', this).each(function() {
var index = $('#selectable-serialize li').index(this);
result.append(' #' + (index + 1));
});
}
});
};
// Sortable
var _componentUiSortable = function() {
if (!$().sortable) {
console.warn('Warning - jQuery UI components are not loaded.');
return;
}
// Basic functionality
$('#sortable-list-basic').sortable();
$('#sortable-list-basic').disableSelection();
// Placeholder
$('#sortable-list-placeholder').sortable({
placeholder: 'sortable-placeholder',
start: function(e, ui){
ui.placeholder.height(ui.item.outerHeight());
}
});
$('#sortable-list-placeholder').disableSelection();
// Connected lists
$('#sortable-list-first, #sortable-list-second').sortable({
connectWith: '.selectable-demo-connected'
}).disableSelection();
//
// Include/exclude items
//
// Specify sort items
$('#sortable-list-specify').sortable({
items: 'li:not(.ui-handle-excluded)'
});
// Exclude items
$('#sortable-list-cancel').sortable({
cancel: '.ui-handle-excluded'
});
// Disable selections
$('#sortable-list-specify li, #sortable-list-cancel li').disableSelection();
};
//
// Return objects assigned to module
//
return {
init: function() {
_componentUiDraggable();
_componentUiDroppable();
_componentUiResizable();
_componentUiSelectable();
_componentUiSortable();
}
}
}();
// Initialize module
// ------------------------------
document.addEventListener('DOMContentLoaded', function() {
JqueryUiInteractions.init();
});