mirror of
https://github.com/jquery/jquery-ui.git
synced 2024-11-21 11:04:24 +00:00
dc67d2c5d2
For instance, this is useful for the jquery-ui-rails gem, which does not
use jQuery UI's own minification, but relies on Rails to minify the
files where necessary. Rails in turn uses UglifyJS for JS and YUI for
CSS, both of which respect the /*! ... */ convention.
(cherry picked from commit 37dcc3e21d
, dropped menu, spinner and tooltip)
268 lines
6.8 KiB
JavaScript
268 lines
6.8 KiB
JavaScript
/*!
|
|
* jQuery UI Selectable @VERSION
|
|
*
|
|
* Copyright 2012, AUTHORS.txt (http://jqueryui.com/about)
|
|
* Dual licensed under the MIT or GPL Version 2 licenses.
|
|
* http://jquery.org/license
|
|
*
|
|
* http://docs.jquery.com/UI/Selectables
|
|
*
|
|
* Depends:
|
|
* jquery.ui.core.js
|
|
* jquery.ui.mouse.js
|
|
* jquery.ui.widget.js
|
|
*/
|
|
(function( $, undefined ) {
|
|
|
|
$.widget("ui.selectable", $.ui.mouse, {
|
|
options: {
|
|
appendTo: 'body',
|
|
autoRefresh: true,
|
|
distance: 0,
|
|
filter: '*',
|
|
tolerance: 'touch'
|
|
},
|
|
_create: function() {
|
|
var self = this;
|
|
|
|
this.element.addClass("ui-selectable");
|
|
|
|
this.dragged = false;
|
|
|
|
// cache selectee children based on filter
|
|
var selectees;
|
|
this.refresh = function() {
|
|
selectees = $(self.options.filter, self.element[0]);
|
|
selectees.addClass("ui-selectee");
|
|
selectees.each(function() {
|
|
var $this = $(this);
|
|
var pos = $this.offset();
|
|
$.data(this, "selectable-item", {
|
|
element: this,
|
|
$element: $this,
|
|
left: pos.left,
|
|
top: pos.top,
|
|
right: pos.left + $this.outerWidth(),
|
|
bottom: pos.top + $this.outerHeight(),
|
|
startselected: false,
|
|
selected: $this.hasClass('ui-selected'),
|
|
selecting: $this.hasClass('ui-selecting'),
|
|
unselecting: $this.hasClass('ui-unselecting')
|
|
});
|
|
});
|
|
};
|
|
this.refresh();
|
|
|
|
this.selectees = selectees.addClass("ui-selectee");
|
|
|
|
this._mouseInit();
|
|
|
|
this.helper = $("<div class='ui-selectable-helper'></div>");
|
|
},
|
|
|
|
destroy: function() {
|
|
this.selectees
|
|
.removeClass("ui-selectee")
|
|
.removeData("selectable-item");
|
|
this.element
|
|
.removeClass("ui-selectable ui-selectable-disabled")
|
|
.removeData("selectable")
|
|
.unbind(".selectable");
|
|
this._mouseDestroy();
|
|
|
|
return this;
|
|
},
|
|
|
|
_mouseStart: function(event) {
|
|
var self = this;
|
|
|
|
this.opos = [event.pageX, event.pageY];
|
|
|
|
if (this.options.disabled)
|
|
return;
|
|
|
|
var options = this.options;
|
|
|
|
this.selectees = $(options.filter, this.element[0]);
|
|
|
|
this._trigger("start", event);
|
|
|
|
$(options.appendTo).append(this.helper);
|
|
// position helper (lasso)
|
|
this.helper.css({
|
|
"left": event.clientX,
|
|
"top": event.clientY,
|
|
"width": 0,
|
|
"height": 0
|
|
});
|
|
|
|
if (options.autoRefresh) {
|
|
this.refresh();
|
|
}
|
|
|
|
this.selectees.filter('.ui-selected').each(function() {
|
|
var selectee = $.data(this, "selectable-item");
|
|
selectee.startselected = true;
|
|
if (!event.metaKey && !event.ctrlKey) {
|
|
selectee.$element.removeClass('ui-selected');
|
|
selectee.selected = false;
|
|
selectee.$element.addClass('ui-unselecting');
|
|
selectee.unselecting = true;
|
|
// selectable UNSELECTING callback
|
|
self._trigger("unselecting", event, {
|
|
unselecting: selectee.element
|
|
});
|
|
}
|
|
});
|
|
|
|
$(event.target).parents().andSelf().each(function() {
|
|
var selectee = $.data(this, "selectable-item");
|
|
if (selectee) {
|
|
var doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected');
|
|
selectee.$element
|
|
.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
|
|
.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
|
|
selectee.unselecting = !doSelect;
|
|
selectee.selecting = doSelect;
|
|
selectee.selected = doSelect;
|
|
// selectable (UN)SELECTING callback
|
|
if (doSelect) {
|
|
self._trigger("selecting", event, {
|
|
selecting: selectee.element
|
|
});
|
|
} else {
|
|
self._trigger("unselecting", event, {
|
|
unselecting: selectee.element
|
|
});
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
|
|
},
|
|
|
|
_mouseDrag: function(event) {
|
|
var self = this;
|
|
this.dragged = true;
|
|
|
|
if (this.options.disabled)
|
|
return;
|
|
|
|
var options = this.options;
|
|
|
|
var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
|
|
if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
|
|
if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
|
|
this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
|
|
|
|
this.selectees.each(function() {
|
|
var selectee = $.data(this, "selectable-item");
|
|
//prevent helper from being selected if appendTo: selectable
|
|
if (!selectee || selectee.element == self.element[0])
|
|
return;
|
|
var hit = false;
|
|
if (options.tolerance == 'touch') {
|
|
hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
|
|
} else if (options.tolerance == 'fit') {
|
|
hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
|
|
}
|
|
|
|
if (hit) {
|
|
// SELECT
|
|
if (selectee.selected) {
|
|
selectee.$element.removeClass('ui-selected');
|
|
selectee.selected = false;
|
|
}
|
|
if (selectee.unselecting) {
|
|
selectee.$element.removeClass('ui-unselecting');
|
|
selectee.unselecting = false;
|
|
}
|
|
if (!selectee.selecting) {
|
|
selectee.$element.addClass('ui-selecting');
|
|
selectee.selecting = true;
|
|
// selectable SELECTING callback
|
|
self._trigger("selecting", event, {
|
|
selecting: selectee.element
|
|
});
|
|
}
|
|
} else {
|
|
// UNSELECT
|
|
if (selectee.selecting) {
|
|
if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
|
|
selectee.$element.removeClass('ui-selecting');
|
|
selectee.selecting = false;
|
|
selectee.$element.addClass('ui-selected');
|
|
selectee.selected = true;
|
|
} else {
|
|
selectee.$element.removeClass('ui-selecting');
|
|
selectee.selecting = false;
|
|
if (selectee.startselected) {
|
|
selectee.$element.addClass('ui-unselecting');
|
|
selectee.unselecting = true;
|
|
}
|
|
// selectable UNSELECTING callback
|
|
self._trigger("unselecting", event, {
|
|
unselecting: selectee.element
|
|
});
|
|
}
|
|
}
|
|
if (selectee.selected) {
|
|
if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
|
|
selectee.$element.removeClass('ui-selected');
|
|
selectee.selected = false;
|
|
|
|
selectee.$element.addClass('ui-unselecting');
|
|
selectee.unselecting = true;
|
|
// selectable UNSELECTING callback
|
|
self._trigger("unselecting", event, {
|
|
unselecting: selectee.element
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
return false;
|
|
},
|
|
|
|
_mouseStop: function(event) {
|
|
var self = this;
|
|
|
|
this.dragged = false;
|
|
|
|
var options = this.options;
|
|
|
|
$('.ui-unselecting', this.element[0]).each(function() {
|
|
var selectee = $.data(this, "selectable-item");
|
|
selectee.$element.removeClass('ui-unselecting');
|
|
selectee.unselecting = false;
|
|
selectee.startselected = false;
|
|
self._trigger("unselected", event, {
|
|
unselected: selectee.element
|
|
});
|
|
});
|
|
$('.ui-selecting', this.element[0]).each(function() {
|
|
var selectee = $.data(this, "selectable-item");
|
|
selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
|
|
selectee.selecting = false;
|
|
selectee.selected = true;
|
|
selectee.startselected = true;
|
|
self._trigger("selected", event, {
|
|
selected: selectee.element
|
|
});
|
|
});
|
|
this._trigger("stop", event);
|
|
|
|
this.helper.remove();
|
|
|
|
return false;
|
|
}
|
|
|
|
});
|
|
|
|
$.extend($.ui.selectable, {
|
|
version: "@VERSION"
|
|
});
|
|
|
|
})(jQuery);
|