1
0
mirror of synced 2024-11-26 14:56:07 +03:00

Added array adapter

This should add support for dynamically generated array data that
still works with a basic `<select>` element.
This commit is contained in:
Kevin Brown 2014-08-30 20:25:32 -04:00
parent 3e05e32eda
commit 315b1b3c12
9 changed files with 455 additions and 7 deletions

View File

@ -449,6 +449,11 @@ define('select2/selection/single',[
var self = this; var self = this;
this.$selection.on('mousedown', function (evt) { this.$selection.on('mousedown', function (evt) {
// Only respond to left clicks
if (evt.which !== 1) {
return;
}
self.trigger("toggle", { self.trigger("toggle", {
originalEvent: evt originalEvent: evt
}); });
@ -557,12 +562,74 @@ define('select2/selection/multiple',[
return MultipleSelection; return MultipleSelection;
}); });
define('select2/data/array',[
"./select",
"../utils"
], function (SelectAdapter, Utils) {
function ArrayAdapter ($element, options) {
this.data = options.options.data;
this.selection = [];
ArrayAdapter.__super__.constructor.call(this, $element, options);
}
Utils.Extend(ArrayAdapter, SelectAdapter);
ArrayAdapter.prototype.select = function (data) {
var self = this;
this.$element.find("option").each(function () {
var $option = $(this);
var option = self.item($option);
if (option.id == data.id) {
$option.remove();
}
});
var $option = this.option(data);
this.$element.append($option);
ArrayAdapter.__super__.select.call(this, data);
}
ArrayAdapter.prototype.option = function (data) {
var $option = $("<option></option>");
$option.text(data.text);
$option.val(data.id);
$option.data("data", data);
return $option;
}
ArrayAdapter.prototype.query = function (params, callback) {
var matches = [];
var self = this;
$.each(this.data, function () {
var option = this;
if (self.matches(params, option)) {
matches.push(option);
}
});
callback(matches);
}
return ArrayAdapter;
});
define('select2/options',[ define('select2/options',[
'./data/select', './data/select',
'./results', './results',
'./dropdown', './dropdown',
'./selection/single', './selection/single',
'./selection/multiple' './selection/multiple',
'./data/array'
], function (SelectData, ResultsList, Dropdown, SingleSelection, ], function (SelectData, ResultsList, Dropdown, SingleSelection,
MultipleSelection) { MultipleSelection) {
function Options (options) { function Options (options) {

View File

@ -449,6 +449,11 @@ define('select2/selection/single',[
var self = this; var self = this;
this.$selection.on('mousedown', function (evt) { this.$selection.on('mousedown', function (evt) {
// Only respond to left clicks
if (evt.which !== 1) {
return;
}
self.trigger("toggle", { self.trigger("toggle", {
originalEvent: evt originalEvent: evt
}); });
@ -557,12 +562,74 @@ define('select2/selection/multiple',[
return MultipleSelection; return MultipleSelection;
}); });
define('select2/data/array',[
"./select",
"../utils"
], function (SelectAdapter, Utils) {
function ArrayAdapter ($element, options) {
this.data = options.options.data;
this.selection = [];
ArrayAdapter.__super__.constructor.call(this, $element, options);
}
Utils.Extend(ArrayAdapter, SelectAdapter);
ArrayAdapter.prototype.select = function (data) {
var self = this;
this.$element.find("option").each(function () {
var $option = $(this);
var option = self.item($option);
if (option.id == data.id) {
$option.remove();
}
});
var $option = this.option(data);
this.$element.append($option);
ArrayAdapter.__super__.select.call(this, data);
}
ArrayAdapter.prototype.option = function (data) {
var $option = $("<option></option>");
$option.text(data.text);
$option.val(data.id);
$option.data("data", data);
return $option;
}
ArrayAdapter.prototype.query = function (params, callback) {
var matches = [];
var self = this;
$.each(this.data, function () {
var option = this;
if (self.matches(params, option)) {
matches.push(option);
}
});
callback(matches);
}
return ArrayAdapter;
});
define('select2/options',[ define('select2/options',[
'./data/select', './data/select',
'./results', './results',
'./dropdown', './dropdown',
'./selection/single', './selection/single',
'./selection/multiple' './selection/multiple',
'./data/array'
], function (SelectData, ResultsList, Dropdown, SingleSelection, ], function (SelectData, ResultsList, Dropdown, SingleSelection,
MultipleSelection) { MultipleSelection) {
function Options (options) { function Options (options) {

View File

@ -9986,6 +9986,11 @@ define('select2/selection/single',[
var self = this; var self = this;
this.$selection.on('mousedown', function (evt) { this.$selection.on('mousedown', function (evt) {
// Only respond to left clicks
if (evt.which !== 1) {
return;
}
self.trigger("toggle", { self.trigger("toggle", {
originalEvent: evt originalEvent: evt
}); });
@ -10094,12 +10099,74 @@ define('select2/selection/multiple',[
return MultipleSelection; return MultipleSelection;
}); });
define('select2/data/array',[
"./select",
"../utils"
], function (SelectAdapter, Utils) {
function ArrayAdapter ($element, options) {
this.data = options.options.data;
this.selection = [];
ArrayAdapter.__super__.constructor.call(this, $element, options);
}
Utils.Extend(ArrayAdapter, SelectAdapter);
ArrayAdapter.prototype.select = function (data) {
var self = this;
this.$element.find("option").each(function () {
var $option = $(this);
var option = self.item($option);
if (option.id == data.id) {
$option.remove();
}
});
var $option = this.option(data);
this.$element.append($option);
ArrayAdapter.__super__.select.call(this, data);
}
ArrayAdapter.prototype.option = function (data) {
var $option = $("<option></option>");
$option.text(data.text);
$option.val(data.id);
$option.data("data", data);
return $option;
}
ArrayAdapter.prototype.query = function (params, callback) {
var matches = [];
var self = this;
$.each(this.data, function () {
var option = this;
if (self.matches(params, option)) {
matches.push(option);
}
});
callback(matches);
}
return ArrayAdapter;
});
define('select2/options',[ define('select2/options',[
'./data/select', './data/select',
'./results', './results',
'./dropdown', './dropdown',
'./selection/single', './selection/single',
'./selection/multiple' './selection/multiple',
'./data/array'
], function (SelectData, ResultsList, Dropdown, SingleSelection, ], function (SelectData, ResultsList, Dropdown, SingleSelection,
MultipleSelection) { MultipleSelection) {
function Options (options) { function Options (options) {

69
dist/js/select2.js vendored
View File

@ -877,6 +877,11 @@ define('select2/selection/single',[
var self = this; var self = this;
this.$selection.on('mousedown', function (evt) { this.$selection.on('mousedown', function (evt) {
// Only respond to left clicks
if (evt.which !== 1) {
return;
}
self.trigger("toggle", { self.trigger("toggle", {
originalEvent: evt originalEvent: evt
}); });
@ -985,12 +990,74 @@ define('select2/selection/multiple',[
return MultipleSelection; return MultipleSelection;
}); });
define('select2/data/array',[
"./select",
"../utils"
], function (SelectAdapter, Utils) {
function ArrayAdapter ($element, options) {
this.data = options.options.data;
this.selection = [];
ArrayAdapter.__super__.constructor.call(this, $element, options);
}
Utils.Extend(ArrayAdapter, SelectAdapter);
ArrayAdapter.prototype.select = function (data) {
var self = this;
this.$element.find("option").each(function () {
var $option = $(this);
var option = self.item($option);
if (option.id == data.id) {
$option.remove();
}
});
var $option = this.option(data);
this.$element.append($option);
ArrayAdapter.__super__.select.call(this, data);
}
ArrayAdapter.prototype.option = function (data) {
var $option = $("<option></option>");
$option.text(data.text);
$option.val(data.id);
$option.data("data", data);
return $option;
}
ArrayAdapter.prototype.query = function (params, callback) {
var matches = [];
var self = this;
$.each(this.data, function () {
var option = this;
if (self.matches(params, option)) {
matches.push(option);
}
});
callback(matches);
}
return ArrayAdapter;
});
define('select2/options',[ define('select2/options',[
'./data/select', './data/select',
'./results', './results',
'./dropdown', './dropdown',
'./selection/single', './selection/single',
'./selection/multiple' './selection/multiple',
'./data/array'
], function (SelectData, ResultsList, Dropdown, SingleSelection, ], function (SelectData, ResultsList, Dropdown, SingleSelection,
MultipleSelection) { MultipleSelection) {
function Options (options) { function Options (options) {

View File

@ -0,0 +1,114 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>QUnit Example</title>
<link href="../../dist/css/select2.css" rel="stylesheet"/>
<script src="../../vendor/almond-0.2.9.js" type="text/javascript"></script>
<script src="../../vendor/jquery-2.1.0.js" type="text/javascript"></script>
<script src="../../dist/js/select2.js"></script>
</head>
<body>
<select style="width:300px" id="array-single"></select>
<br />
<select style="width:300px" id="array-multiple" multiple="multiple"></select>
<br />
<select style="width:300px" id="single-multiple">
<option value="AK">Alaska</option>
<option value="HI">Hawaii</option>
<option value="CA">California</option>
<option value="NV">Nevada</option>
<option value="OR">Oregon</option>
<option value="WA">Washington</option>
<option value="AZ">Arizona</option>
<option value="CO">Colorado</option>
<option value="ID">Idaho</option>
<option value="MT">Montana</option>
<option value="NE">Nebraska</option>
<option value="NM">New Mexico</option>
<option value="ND">North Dakota</option>
<option value="UT">Utah</option>
<option value="WY">Wyoming</option>
<option value="AL">Alabama</option>
<option value="AR">Arkansas</option>
<option value="IL">Illinois</option>
<option value="IA">Iowa</option>
<option value="KS">Kansas</option>
<option value="KY">Kentucky</option>
<option value="LA">Louisiana</option>
<option value="MN">Minnesota</option>
<option value="MS">Mississippi</option>
<option value="MO">Missouri</option>
<option value="OK">Oklahoma</option>
<option value="SD">South Dakota</option>
<option value="TX">Texas</option>
<option value="TN">Tennessee</option>
<option value="WI">Wisconsin</option>
<option value="CT">Connecticut</option>
<option value="DE">Delaware</option>
<option value="FL">Florida</option>
<option value="GA">Georgia</option>
<option value="IN">Indiana</option>
<option value="ME">Maine</option>
<option value="MD">Maryland</option>
<option value="MA">Massachusetts</option>
<option value="MI">Michigan</option>
<option value="NH">New Hampshire</option>
<option value="NJ">New Jersey</option>
<option value="NY">New York</option>
<option value="NC">North Carolina</option>
<option value="OH">Ohio</option>
<option value="PA">Pennsylvania</option>
<option value="RI">Rhode Island</option>
<option value="SC">South Carolina</option>
<option value="VT">Vermont</option>
<option value="VA">Virginia</option>
<option value="WV">West Virginia</option>
</select>
<script>
require(["select2/core", "select2/data/array"], function (Select2, ArrayAdapter) {
var arrayData = [
{
id: 0,
text: 'enhancement'
},
{
id: 1,
text: 'bug'
},
{
id: 2,
text: 'duplicate'
},
{
id: 3,
text: 'invalid'
},
{
id: 4,
text: 'wontfix'
}
];
var arraySingle = new Select2($("#array-single"), {
dataAdapter: ArrayAdapter,
data: arrayData
});
var arrayMultiple = new Select2($("#array-multiple"), {
dataAdapter: ArrayAdapter,
data: arrayData
});
});
</script>
</body>
</html>

View File

@ -178,11 +178,11 @@ require(["select2/core", "select2/utils", "select2/selection/single",
this.$container = $container; this.$container = $container;
this.$clear.on("click", function (evt) { this.$clear.on("mousedown", function (evt) {
evt.stopPropagation(); evt.stopPropagation();
var $first = $container.find("li").first(); var $first = $container.find("li").first();
$first.click(); $first.mouseup();
}); });
}; };

59
src/js/select2/data/array.js vendored Normal file
View File

@ -0,0 +1,59 @@
define([
"./select",
"../utils"
], function (SelectAdapter, Utils) {
function ArrayAdapter ($element, options) {
this.data = options.options.data;
this.selection = [];
ArrayAdapter.__super__.constructor.call(this, $element, options);
}
Utils.Extend(ArrayAdapter, SelectAdapter);
ArrayAdapter.prototype.select = function (data) {
var self = this;
this.$element.find("option").each(function () {
var $option = $(this);
var option = self.item($option);
if (option.id == data.id) {
$option.remove();
}
});
var $option = this.option(data);
this.$element.append($option);
ArrayAdapter.__super__.select.call(this, data);
}
ArrayAdapter.prototype.option = function (data) {
var $option = $("<option></option>");
$option.text(data.text);
$option.val(data.id);
$option.data("data", data);
return $option;
}
ArrayAdapter.prototype.query = function (params, callback) {
var matches = [];
var self = this;
$.each(this.data, function () {
var option = this;
if (self.matches(params, option)) {
matches.push(option);
}
});
callback(matches);
}
return ArrayAdapter;
});

View File

@ -3,7 +3,9 @@ define([
'./results', './results',
'./dropdown', './dropdown',
'./selection/single', './selection/single',
'./selection/multiple' './selection/multiple',
'./data/array'
], function (SelectData, ResultsList, Dropdown, SingleSelection, ], function (SelectData, ResultsList, Dropdown, SingleSelection,
MultipleSelection) { MultipleSelection) {
function Options (options) { function Options (options) {

View File

@ -26,6 +26,11 @@ define([
var self = this; var self = this;
this.$selection.on('mousedown', function (evt) { this.$selection.on('mousedown', function (evt) {
// Only respond to left clicks
if (evt.which !== 1) {
return;
}
self.trigger("toggle", { self.trigger("toggle", {
originalEvent: evt originalEvent: evt
}); });