1
0
mirror of synced 2025-02-03 21:59:24 +03:00

Working on searching results

This commit is contained in:
Kevin Brown 2014-10-15 20:51:29 -04:00
parent fa3495de24
commit 6375e2ee09
17 changed files with 436 additions and 161 deletions

View File

@ -41,6 +41,13 @@
left: -100000px;
width: 100%;
z-index: 100; }
.select2-container .dropdown .search {
display: block;
padding: 4px; }
.select2-container .dropdown .search input {
outline: 0;
padding: 4px;
width: 100%; }
.select2-container .dropdown .results {
display: block; }
.select2-container .dropdown .results .options {
@ -85,6 +92,8 @@
.select2-container.select2-theme-default.open .selection .single-select, .select2-container.select2-theme-default.open .selection .multiple-select {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0; }
.select2-container.select2-theme-default .dropdown .search input {
border: 1px solid #aaa; }
.select2-container.select2-theme-default .dropdown .results {
max-height: 200px;
overflow-y: scroll; }

View File

@ -1 +1 @@
.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;}.select2-container .selection .single-select{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none;}.select2-container .selection .single-select .rendered-selection{display:block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;}.select2-container .selection .multiple-select{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none;}.select2-container .selection .multiple-select .rendered-selection{display:block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;}.select2-container .dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:100;}.select2-container .dropdown .results{display:block;}.select2-container .dropdown .results .options{list-style:none;margin:0;padding:0;}.select2-container .dropdown .results .options .option{cursor:pointer;padding:6px;user-select:none;-webkit-user-select:none;}.select2-container.open .dropdown{border-top:none;border-top-left-radius:0;border-top-right-radius:0;left:0;}.select2-container.select2-theme-default .selection .single-select{background-color:#eee;border:1px solid #aaa;border-radius:4px;}.select2-container.select2-theme-default .selection .single-select .rendered-selection{color:#444;line-height:28px;}.select2-container.select2-theme-default .selection .multiple-select{background-color:white;border:1px solid #aaa;border-radius:4px;}.select2-container.select2-theme-default .selection .multiple-select .rendered-selection{list-style:none;margin:0;padding:5px;padding-bottom:0;}.select2-container.select2-theme-default .selection .multiple-select .rendered-selection .choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;float:left;margin-right:5px;margin-bottom:5px;padding:0 5px;}.select2-container.select2-theme-default.open .selection .single-select,.select2-container.select2-theme-default.open .selection .multiple-select{border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container.select2-theme-default .dropdown .results{max-height:200px;overflow-y:scroll;}.select2-container.select2-theme-default .dropdown .results .options .option.group{padding:0;}.select2-container.select2-theme-default .dropdown .results .options .option.group .group-label{cursor:default;display:block;padding:6px;}.select2-container.select2-theme-default .dropdown .results .options .option.disabled{color:#666;}.select2-container.select2-theme-default .dropdown .results .options .option.selected{background-color:#ddd;}.select2-container.select2-theme-default .dropdown .results .options .option.highlightable.highlighted{background-color:#5897fb;color:white;}.s2-container{margin:0;position:relative;zoom:1;vertical-align:middle;}.s2-container.s2-active{border:1px solid #5897fb;border-top:bottom;}.s2-container .s2-single-select{display:block;height:26px;padding:0 0 0 8px;overflow:hidden;position:relative;border:1px solid #aaa;white-space:nowrap;line-height:26px;color:#444;text-decoration:none;border-radius:4px;background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));background-image:-webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);background-image:-moz-linear-gradient(center bottom, #eee 0%, #fff 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);background-image:linear-gradient(to top, #eee 0%, #fff 50%);}.s2-container .s2-single-select .s2-selection{margin-right:26px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.s2-container .s2-open .select2-container-active .select2-choice,.s2-container .s2-open .select2-container-active .select2-choices{border:1px solid #5897fb;outline:none;-webkit-box-shadow:0 0 5px rgba(0, 0, 0, 0.3);box-shadow:0 0 5px rgba(0, 0, 0, 0.3);}.s2-search input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.s2-dropdown{width:100%;margin-top:-1px;position:absolute;z-index:9999;overflow:scroll;background:#fff;color:#000;border:1px solid #5897fb;border-top:none;border-radius:0 0 4px 4px;-webkit-box-shadow:0 4px 5px rgba(0, 0, 0, 0.15);box-shadow:0 4px 5px rgba(0, 0, 0, 0.15);}.s2-hidden{display:none;}
.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;}.select2-container .selection .single-select{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none;}.select2-container .selection .single-select .rendered-selection{display:block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;}.select2-container .selection .multiple-select{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none;}.select2-container .selection .multiple-select .rendered-selection{display:block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;}.select2-container .dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:100;}.select2-container .dropdown .search{display:block;padding:4px;}.select2-container .dropdown .search input{outline:0;padding:4px;width:100%;}.select2-container .dropdown .results{display:block;}.select2-container .dropdown .results .options{list-style:none;margin:0;padding:0;}.select2-container .dropdown .results .options .option{cursor:pointer;padding:6px;user-select:none;-webkit-user-select:none;}.select2-container.open .dropdown{border-top:none;border-top-left-radius:0;border-top-right-radius:0;left:0;}.select2-container.select2-theme-default .selection .single-select{background-color:#eee;border:1px solid #aaa;border-radius:4px;}.select2-container.select2-theme-default .selection .single-select .rendered-selection{color:#444;line-height:28px;}.select2-container.select2-theme-default .selection .multiple-select{background-color:white;border:1px solid #aaa;border-radius:4px;}.select2-container.select2-theme-default .selection .multiple-select .rendered-selection{list-style:none;margin:0;padding:5px;padding-bottom:0;}.select2-container.select2-theme-default .selection .multiple-select .rendered-selection .choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;float:left;margin-right:5px;margin-bottom:5px;padding:0 5px;}.select2-container.select2-theme-default.open .selection .single-select,.select2-container.select2-theme-default.open .selection .multiple-select{border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container.select2-theme-default .dropdown .search input{border:1px solid #aaa;}.select2-container.select2-theme-default .dropdown .results{max-height:200px;overflow-y:scroll;}.select2-container.select2-theme-default .dropdown .results .options .option.group{padding:0;}.select2-container.select2-theme-default .dropdown .results .options .option.group .group-label{cursor:default;display:block;padding:6px;}.select2-container.select2-theme-default .dropdown .results .options .option.disabled{color:#666;}.select2-container.select2-theme-default .dropdown .results .options .option.selected{background-color:#ddd;}.select2-container.select2-theme-default .dropdown .results .options .option.highlightable.highlighted{background-color:#5897fb;color:white;}.s2-container{margin:0;position:relative;zoom:1;vertical-align:middle;}.s2-container.s2-active{border:1px solid #5897fb;border-top:bottom;}.s2-container .s2-single-select{display:block;height:26px;padding:0 0 0 8px;overflow:hidden;position:relative;border:1px solid #aaa;white-space:nowrap;line-height:26px;color:#444;text-decoration:none;border-radius:4px;background-clip:padding-box;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;background-image:-webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));background-image:-webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);background-image:-moz-linear-gradient(center bottom, #eee 0%, #fff 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);background-image:linear-gradient(to top, #eee 0%, #fff 50%);}.s2-container .s2-single-select .s2-selection{margin-right:26px;display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}.s2-container .s2-open .select2-container-active .select2-choice,.s2-container .s2-open .select2-container-active .select2-choices{border:1px solid #5897fb;outline:none;-webkit-box-shadow:0 0 5px rgba(0, 0, 0, 0.3);box-shadow:0 0 5px rgba(0, 0, 0, 0.3);}.s2-search input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}.s2-dropdown{width:100%;margin-top:-1px;position:absolute;z-index:9999;overflow:scroll;background:#fff;color:#000;border:1px solid #5897fb;border-top:none;border-radius:0 0 4px 4px;-webkit-box-shadow:0 4px 5px rgba(0, 0, 0, 0.15);box-shadow:0 4px 5px rgba(0, 0, 0, 0.15);}.s2-hidden{display:none;}

View File

@ -193,7 +193,7 @@ define('select2/results',[
var $option = $(this);
var item = $option.data('data');
if (selectedIds.indexOf(item.id.toString()) > -1) {
if (item.id != null && selectedIds.indexOf(item.id.toString()) > -1) {
$option.addClass('selected');
}
});
@ -205,7 +205,7 @@ define('select2/results',[
'<li class="option highlightable selectable"></li>'
);
if (data.children && data.children.length > 0) {
if (data.children) {
$option.addClass('group').removeClass('highlightable selectable');
var $label = $('<strong class="group-label"></strong>');
@ -235,6 +235,10 @@ define('select2/results',[
$option.removeClass('selectable highlightable').addClass('disabled');
}
if (data.id == null) {
$option.removeClass('selectable highlightable');
}
$option.data('data', data);
return $option;
@ -292,28 +296,6 @@ define('select2/results',[
return Results;
});
define('select2/dropdown',[
'./utils'
], function (Utils) {
function Dropdown ($element, options) {
this.$element = $element;
}
Utils.Extend(Dropdown, Utils.Observable);
Dropdown.prototype.render = function () {
var $dropdown = $(
'<span class="dropdown">' +
'<span class="results"></span>' +
'</span>'
);
return $dropdown;
};
return Dropdown;
});
define('select2/selection/single',[
'../utils'
], function (Utils) {
@ -605,7 +587,6 @@ define('select2/data/select',[
};
} else if ($option.is('optgroup')) {
data = {
id: -1,
text: $option.attr('label'),
children: []
};
@ -654,7 +635,7 @@ define('select2/data/select',[
return match;
}
if (data.text.indexOf(params.term) > -1) {
if (data.text.toUpperCase().indexOf(params.term.toUpperCase()) > -1) {
return match;
}
@ -769,19 +750,83 @@ define('select2/data/ajax',[
return AjaxAdapter;
});
define('select2/dropdown',[
'./utils'
], function (Utils) {
function Dropdown ($element, options) {
this.$element = $element;
}
Utils.Extend(Dropdown, Utils.Observable);
Dropdown.prototype.render = function () {
var $dropdown = $(
'<span class="dropdown">' +
'<span class="results"></span>' +
'</span>'
);
return $dropdown;
};
Dropdown.prototype.bind = function (container, $container) {
// Can be implemented in subclasses
};
return Dropdown;
});
define('select2/dropdown/search',[
], function () {
function Search () { }
Search.prototype.render = function (decorated) {
var $rendered = decorated.call(this);
var $search = $(
'<span class="search">' +
'<input type="search" name="search" />' +
'</span>'
);
this.$search = $search.find('input');
$rendered.prepend($search);
return $rendered;
};
Search.prototype.bind = function (decorated, container, $container) {
decorated.call(this, container, $container);
this.$search.on('keyup', function () {
container.trigger('query', {
term: $(this).val()
});
});
};
return Search;
});
define('select2/options',[
'./results',
'./dropdown',
'./selection/single',
'./selection/multiple',
'./utils',
'./data/select',
'./data/array',
'./data/ajax'
], function (ResultsList, Dropdown, SingleSelection, MultipleSelection,
SelectData, ArrayData, AjaxData) {
'./data/ajax',
'./dropdown',
'./dropdown/search'
], function (ResultsList, SingleSelection, MultipleSelection, Utils,
SelectData, ArrayData, AjaxData,
Dropdown, Search) {
function Options (options) {
this.options = options;
@ -793,8 +838,10 @@ define('select2/options',[
this.dataAdapter = this.dataAdapter || SelectData;
}
var SearchableDropdown = Utils.Decorate(Dropdown, Search);
this.resultsAdapter = ResultsList;
this.dropdownAdapter = options.dropdownAdapter || Dropdown;
this.dropdownAdapter = options.dropdownAdapter || SearchableDropdown;
this.selectionAdapter = options.selectionAdapter;
if (this.selectionAdapter == null) {
@ -864,6 +911,8 @@ define('select2/core',[
this.data.bind(this, $container);
this.selection.bind(this, $container);
this.dropdown.bind(this, $container);
this.results.bind(this, $container);
this.$element.on('change', function () {
@ -906,10 +955,14 @@ define('select2/core',[
});
});
this.data.query({}, function (data) {
self.results.trigger('results:all', data);
this.on('query', function (params) {
this.data.query(params, function (data) {
self.results.trigger('results:all', data);
});
});
this.trigger('query', {});
// Hide the original select
$element.hide();

121
dist/js/select2.amd.js vendored
View File

@ -193,7 +193,7 @@ define('select2/results',[
var $option = $(this);
var item = $option.data('data');
if (selectedIds.indexOf(item.id.toString()) > -1) {
if (item.id != null && selectedIds.indexOf(item.id.toString()) > -1) {
$option.addClass('selected');
}
});
@ -205,7 +205,7 @@ define('select2/results',[
'<li class="option highlightable selectable"></li>'
);
if (data.children && data.children.length > 0) {
if (data.children) {
$option.addClass('group').removeClass('highlightable selectable');
var $label = $('<strong class="group-label"></strong>');
@ -235,6 +235,10 @@ define('select2/results',[
$option.removeClass('selectable highlightable').addClass('disabled');
}
if (data.id == null) {
$option.removeClass('selectable highlightable');
}
$option.data('data', data);
return $option;
@ -292,28 +296,6 @@ define('select2/results',[
return Results;
});
define('select2/dropdown',[
'./utils'
], function (Utils) {
function Dropdown ($element, options) {
this.$element = $element;
}
Utils.Extend(Dropdown, Utils.Observable);
Dropdown.prototype.render = function () {
var $dropdown = $(
'<span class="dropdown">' +
'<span class="results"></span>' +
'</span>'
);
return $dropdown;
};
return Dropdown;
});
define('select2/selection/single',[
'../utils'
], function (Utils) {
@ -605,7 +587,6 @@ define('select2/data/select',[
};
} else if ($option.is('optgroup')) {
data = {
id: -1,
text: $option.attr('label'),
children: []
};
@ -654,7 +635,7 @@ define('select2/data/select',[
return match;
}
if (data.text.indexOf(params.term) > -1) {
if (data.text.toUpperCase().indexOf(params.term.toUpperCase()) > -1) {
return match;
}
@ -769,19 +750,83 @@ define('select2/data/ajax',[
return AjaxAdapter;
});
define('select2/dropdown',[
'./utils'
], function (Utils) {
function Dropdown ($element, options) {
this.$element = $element;
}
Utils.Extend(Dropdown, Utils.Observable);
Dropdown.prototype.render = function () {
var $dropdown = $(
'<span class="dropdown">' +
'<span class="results"></span>' +
'</span>'
);
return $dropdown;
};
Dropdown.prototype.bind = function (container, $container) {
// Can be implemented in subclasses
};
return Dropdown;
});
define('select2/dropdown/search',[
], function () {
function Search () { }
Search.prototype.render = function (decorated) {
var $rendered = decorated.call(this);
var $search = $(
'<span class="search">' +
'<input type="search" name="search" />' +
'</span>'
);
this.$search = $search.find('input');
$rendered.prepend($search);
return $rendered;
};
Search.prototype.bind = function (decorated, container, $container) {
decorated.call(this, container, $container);
this.$search.on('keyup', function () {
container.trigger('query', {
term: $(this).val()
});
});
};
return Search;
});
define('select2/options',[
'./results',
'./dropdown',
'./selection/single',
'./selection/multiple',
'./utils',
'./data/select',
'./data/array',
'./data/ajax'
], function (ResultsList, Dropdown, SingleSelection, MultipleSelection,
SelectData, ArrayData, AjaxData) {
'./data/ajax',
'./dropdown',
'./dropdown/search'
], function (ResultsList, SingleSelection, MultipleSelection, Utils,
SelectData, ArrayData, AjaxData,
Dropdown, Search) {
function Options (options) {
this.options = options;
@ -793,8 +838,10 @@ define('select2/options',[
this.dataAdapter = this.dataAdapter || SelectData;
}
var SearchableDropdown = Utils.Decorate(Dropdown, Search);
this.resultsAdapter = ResultsList;
this.dropdownAdapter = options.dropdownAdapter || Dropdown;
this.dropdownAdapter = options.dropdownAdapter || SearchableDropdown;
this.selectionAdapter = options.selectionAdapter;
if (this.selectionAdapter == null) {
@ -864,6 +911,8 @@ define('select2/core',[
this.data.bind(this, $container);
this.selection.bind(this, $container);
this.dropdown.bind(this, $container);
this.results.bind(this, $container);
this.$element.on('change', function () {
@ -906,10 +955,14 @@ define('select2/core',[
});
});
this.data.query({}, function (data) {
self.results.trigger('results:all', data);
this.on('query', function (params) {
this.data.query(params, function (data) {
self.results.trigger('results:all', data);
});
});
this.trigger('query', {});
// Hide the original select
$element.hide();

View File

@ -9731,7 +9731,7 @@ define('select2/results',[
var $option = $(this);
var item = $option.data('data');
if (selectedIds.indexOf(item.id.toString()) > -1) {
if (item.id != null && selectedIds.indexOf(item.id.toString()) > -1) {
$option.addClass('selected');
}
});
@ -9743,7 +9743,7 @@ define('select2/results',[
'<li class="option highlightable selectable"></li>'
);
if (data.children && data.children.length > 0) {
if (data.children) {
$option.addClass('group').removeClass('highlightable selectable');
var $label = $('<strong class="group-label"></strong>');
@ -9773,6 +9773,10 @@ define('select2/results',[
$option.removeClass('selectable highlightable').addClass('disabled');
}
if (data.id == null) {
$option.removeClass('selectable highlightable');
}
$option.data('data', data);
return $option;
@ -9830,28 +9834,6 @@ define('select2/results',[
return Results;
});
define('select2/dropdown',[
'./utils'
], function (Utils) {
function Dropdown ($element, options) {
this.$element = $element;
}
Utils.Extend(Dropdown, Utils.Observable);
Dropdown.prototype.render = function () {
var $dropdown = $(
'<span class="dropdown">' +
'<span class="results"></span>' +
'</span>'
);
return $dropdown;
};
return Dropdown;
});
define('select2/selection/single',[
'../utils'
], function (Utils) {
@ -10143,7 +10125,6 @@ define('select2/data/select',[
};
} else if ($option.is('optgroup')) {
data = {
id: -1,
text: $option.attr('label'),
children: []
};
@ -10192,7 +10173,7 @@ define('select2/data/select',[
return match;
}
if (data.text.indexOf(params.term) > -1) {
if (data.text.toUpperCase().indexOf(params.term.toUpperCase()) > -1) {
return match;
}
@ -10307,19 +10288,83 @@ define('select2/data/ajax',[
return AjaxAdapter;
});
define('select2/dropdown',[
'./utils'
], function (Utils) {
function Dropdown ($element, options) {
this.$element = $element;
}
Utils.Extend(Dropdown, Utils.Observable);
Dropdown.prototype.render = function () {
var $dropdown = $(
'<span class="dropdown">' +
'<span class="results"></span>' +
'</span>'
);
return $dropdown;
};
Dropdown.prototype.bind = function (container, $container) {
// Can be implemented in subclasses
};
return Dropdown;
});
define('select2/dropdown/search',[
], function () {
function Search () { }
Search.prototype.render = function (decorated) {
var $rendered = decorated.call(this);
var $search = $(
'<span class="search">' +
'<input type="search" name="search" />' +
'</span>'
);
this.$search = $search.find('input');
$rendered.prepend($search);
return $rendered;
};
Search.prototype.bind = function (decorated, container, $container) {
decorated.call(this, container, $container);
this.$search.on('keyup', function () {
container.trigger('query', {
term: $(this).val()
});
});
};
return Search;
});
define('select2/options',[
'./results',
'./dropdown',
'./selection/single',
'./selection/multiple',
'./utils',
'./data/select',
'./data/array',
'./data/ajax'
], function (ResultsList, Dropdown, SingleSelection, MultipleSelection,
SelectData, ArrayData, AjaxData) {
'./data/ajax',
'./dropdown',
'./dropdown/search'
], function (ResultsList, SingleSelection, MultipleSelection, Utils,
SelectData, ArrayData, AjaxData,
Dropdown, Search) {
function Options (options) {
this.options = options;
@ -10331,8 +10376,10 @@ define('select2/options',[
this.dataAdapter = this.dataAdapter || SelectData;
}
var SearchableDropdown = Utils.Decorate(Dropdown, Search);
this.resultsAdapter = ResultsList;
this.dropdownAdapter = options.dropdownAdapter || Dropdown;
this.dropdownAdapter = options.dropdownAdapter || SearchableDropdown;
this.selectionAdapter = options.selectionAdapter;
if (this.selectionAdapter == null) {
@ -10402,6 +10449,8 @@ define('select2/core',[
this.data.bind(this, $container);
this.selection.bind(this, $container);
this.dropdown.bind(this, $container);
this.results.bind(this, $container);
this.$element.on('change', function () {
@ -10444,10 +10493,14 @@ define('select2/core',[
});
});
this.data.query({}, function (data) {
self.results.trigger('results:all', data);
this.on('query', function (params) {
this.data.query(params, function (data) {
self.results.trigger('results:all', data);
});
});
this.trigger('query', {});
// Hide the original select
$element.hide();

File diff suppressed because one or more lines are too long

121
dist/js/select2.js vendored
View File

@ -622,7 +622,7 @@ define('select2/results',[
var $option = $(this);
var item = $option.data('data');
if (selectedIds.indexOf(item.id.toString()) > -1) {
if (item.id != null && selectedIds.indexOf(item.id.toString()) > -1) {
$option.addClass('selected');
}
});
@ -634,7 +634,7 @@ define('select2/results',[
'<li class="option highlightable selectable"></li>'
);
if (data.children && data.children.length > 0) {
if (data.children) {
$option.addClass('group').removeClass('highlightable selectable');
var $label = $('<strong class="group-label"></strong>');
@ -664,6 +664,10 @@ define('select2/results',[
$option.removeClass('selectable highlightable').addClass('disabled');
}
if (data.id == null) {
$option.removeClass('selectable highlightable');
}
$option.data('data', data);
return $option;
@ -721,28 +725,6 @@ define('select2/results',[
return Results;
});
define('select2/dropdown',[
'./utils'
], function (Utils) {
function Dropdown ($element, options) {
this.$element = $element;
}
Utils.Extend(Dropdown, Utils.Observable);
Dropdown.prototype.render = function () {
var $dropdown = $(
'<span class="dropdown">' +
'<span class="results"></span>' +
'</span>'
);
return $dropdown;
};
return Dropdown;
});
define('select2/selection/single',[
'../utils'
], function (Utils) {
@ -1034,7 +1016,6 @@ define('select2/data/select',[
};
} else if ($option.is('optgroup')) {
data = {
id: -1,
text: $option.attr('label'),
children: []
};
@ -1083,7 +1064,7 @@ define('select2/data/select',[
return match;
}
if (data.text.indexOf(params.term) > -1) {
if (data.text.toUpperCase().indexOf(params.term.toUpperCase()) > -1) {
return match;
}
@ -1198,19 +1179,83 @@ define('select2/data/ajax',[
return AjaxAdapter;
});
define('select2/dropdown',[
'./utils'
], function (Utils) {
function Dropdown ($element, options) {
this.$element = $element;
}
Utils.Extend(Dropdown, Utils.Observable);
Dropdown.prototype.render = function () {
var $dropdown = $(
'<span class="dropdown">' +
'<span class="results"></span>' +
'</span>'
);
return $dropdown;
};
Dropdown.prototype.bind = function (container, $container) {
// Can be implemented in subclasses
};
return Dropdown;
});
define('select2/dropdown/search',[
], function () {
function Search () { }
Search.prototype.render = function (decorated) {
var $rendered = decorated.call(this);
var $search = $(
'<span class="search">' +
'<input type="search" name="search" />' +
'</span>'
);
this.$search = $search.find('input');
$rendered.prepend($search);
return $rendered;
};
Search.prototype.bind = function (decorated, container, $container) {
decorated.call(this, container, $container);
this.$search.on('keyup', function () {
container.trigger('query', {
term: $(this).val()
});
});
};
return Search;
});
define('select2/options',[
'./results',
'./dropdown',
'./selection/single',
'./selection/multiple',
'./utils',
'./data/select',
'./data/array',
'./data/ajax'
], function (ResultsList, Dropdown, SingleSelection, MultipleSelection,
SelectData, ArrayData, AjaxData) {
'./data/ajax',
'./dropdown',
'./dropdown/search'
], function (ResultsList, SingleSelection, MultipleSelection, Utils,
SelectData, ArrayData, AjaxData,
Dropdown, Search) {
function Options (options) {
this.options = options;
@ -1222,8 +1267,10 @@ define('select2/options',[
this.dataAdapter = this.dataAdapter || SelectData;
}
var SearchableDropdown = Utils.Decorate(Dropdown, Search);
this.resultsAdapter = ResultsList;
this.dropdownAdapter = options.dropdownAdapter || Dropdown;
this.dropdownAdapter = options.dropdownAdapter || SearchableDropdown;
this.selectionAdapter = options.selectionAdapter;
if (this.selectionAdapter == null) {
@ -1293,6 +1340,8 @@ define('select2/core',[
this.data.bind(this, $container);
this.selection.bind(this, $container);
this.dropdown.bind(this, $container);
this.results.bind(this, $container);
this.$element.on('change', function () {
@ -1335,10 +1384,14 @@ define('select2/core',[
});
});
this.data.query({}, function (data) {
self.results.trigger('results:all', data);
this.on('query', function (params) {
this.data.query(params, function (data) {
self.results.trigger('results:all', data);
});
});
this.trigger('query', {});
// Hide the original select
$element.hide();

File diff suppressed because one or more lines are too long

View File

@ -289,7 +289,7 @@ $("[data-fill-from]").each(function () {
prettyPrint();
require(["select2/core", "select2/dropdown", "select2/utils"], function (Select2, Dropdown, Utils) {
require(["select2/core", "select2/utils"], function (Select2, Utils) {
var $basicSingle = $(".js-example-basic-single");
var $basicMultiple = $(".js-example-basic-multiple");

View File

@ -53,6 +53,8 @@ define([
this.data.bind(this, $container);
this.selection.bind(this, $container);
this.dropdown.bind(this, $container);
this.results.bind(this, $container);
this.$element.on('change', function () {
@ -95,10 +97,14 @@ define([
});
});
this.data.query({}, function (data) {
self.results.trigger('results:all', data);
this.on('query', function (params) {
this.data.query(params, function (data) {
self.results.trigger('results:all', data);
});
});
this.trigger('query', {});
// Hide the original select
$element.hide();

View File

@ -128,7 +128,6 @@ define([
};
} else if ($option.is('optgroup')) {
data = {
id: -1,
text: $option.attr('label'),
children: []
};
@ -177,7 +176,7 @@ define([
return match;
}
if (data.text.indexOf(params.term) > -1) {
if (data.text.toUpperCase().indexOf(params.term.toUpperCase()) > -1) {
return match;
}

View File

@ -17,5 +17,9 @@ define([
return $dropdown;
};
Dropdown.prototype.bind = function (container, $container) {
// Can be implemented in subclasses
};
return Dropdown;
});

View File

@ -1,14 +1,32 @@
define([
'../utils'
], function (Utils) {
function Search (decorated, args) {
decorated.call(this, args);
}
Utils.Extend(Search, Utils.Observable);
], function () {
function Search () { }
Search.prototype.bind = function (decorated, args) {
this.$container = $container;
Search.prototype.render = function (decorated) {
var $rendered = decorated.call(this);
var $search = $(
'<span class="search">' +
'<input type="search" name="search" />' +
'</span>'
);
this.$search = $search.find('input');
$rendered.prepend($search);
return $rendered;
};
Search.prototype.bind = function (decorated, container, $container) {
decorated.call(this, container, $container);
this.$search.on('keyup', function () {
container.trigger('query', {
term: $(this).val()
});
});
};
return Search;

View File

@ -1,16 +1,20 @@
define([
'./results',
'./dropdown',
'./selection/single',
'./selection/multiple',
'./utils',
'./data/select',
'./data/array',
'./data/ajax'
], function (ResultsList, Dropdown, SingleSelection, MultipleSelection,
SelectData, ArrayData, AjaxData) {
'./data/ajax',
'./dropdown',
'./dropdown/search'
], function (ResultsList, SingleSelection, MultipleSelection, Utils,
SelectData, ArrayData, AjaxData,
Dropdown, Search) {
function Options (options) {
this.options = options;
@ -22,8 +26,10 @@ define([
this.dataAdapter = this.dataAdapter || SelectData;
}
var SearchableDropdown = Utils.Decorate(Dropdown, Search);
this.resultsAdapter = ResultsList;
this.dropdownAdapter = options.dropdownAdapter || Dropdown;
this.dropdownAdapter = options.dropdownAdapter || SearchableDropdown;
this.selectionAdapter = options.selectionAdapter;
if (this.selectionAdapter == null) {

View File

@ -54,7 +54,7 @@ define([
var $option = $(this);
var item = $option.data('data');
if (selectedIds.indexOf(item.id.toString()) > -1) {
if (item.id != null && selectedIds.indexOf(item.id.toString()) > -1) {
$option.addClass('selected');
}
});
@ -66,7 +66,7 @@ define([
'<li class="option highlightable selectable"></li>'
);
if (data.children && data.children.length > 0) {
if (data.children) {
$option.addClass('group').removeClass('highlightable selectable');
var $label = $('<strong class="group-label"></strong>');
@ -96,6 +96,10 @@ define([
$option.removeClass('selectable highlightable').addClass('disabled');
}
if (data.id == null) {
$option.removeClass('selectable highlightable');
}
$option.data('data', data);
return $option;

View File

@ -16,6 +16,17 @@
z-index: 100;
.search {
display: block;
padding: 4px;
input {
outline: 0;
padding: 4px;
width: 100%;
}
}
.results {
display: block;

View File

@ -49,6 +49,12 @@
}
.dropdown {
.search {
input {
border: 1px solid #aaa;
}
}
.results {
max-height: 200px;
overflow-y: scroll;