diff options
| author | David Monjoie <dmo@odoo.com> | 2019-03-01 15:50:51 +0100 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2019-03-06 19:49:01 +0100 |
| commit | 154c3dcda48e62b0af65c601bae0258d1ef58536 (patch) | |
| tree | cf1a4c4e96b214b78794853b6247b36f053d972e /addons/web/static/lib/select2 | |
| parent | c8bab2ddb322dab4f0281ad269c7001cf5b59367 (diff) | |
[REF] web: update select2 to v3.5.4
Diffstat (limited to 'addons/web/static/lib/select2')
| -rw-r--r-- | addons/web/static/lib/select2/LICENSE | 4 | ||||
| -rw-r--r-- | addons/web/static/lib/select2/README.md | 36 | ||||
| -rwxr-xr-x | addons/web/static/lib/select2/release.sh | 14 | ||||
| -rw-r--r-- | addons/web/static/lib/select2/select2.css | 20 | ||||
| -rw-r--r-- | addons/web/static/lib/select2/select2.js | 429 |
5 files changed, 364 insertions, 139 deletions
diff --git a/addons/web/static/lib/select2/LICENSE b/addons/web/static/lib/select2/LICENSE index 3f5ab7e2cd2..49f61fcf343 100644 --- a/addons/web/static/lib/select2/LICENSE +++ b/addons/web/static/lib/select2/LICENSE @@ -13,6 +13,6 @@ http://www.apache.org/licenses/LICENSE-2.0 http://www.gnu.org/licenses/gpl-2.0.html Unless required by applicable law or agreed to in writing, software distributed under the Apache License -or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for the specific language governing -permissions and limitations under the Apache License and the GPL License.
\ No newline at end of file +permissions and limitations under the Apache License and the GPL License. diff --git a/addons/web/static/lib/select2/README.md b/addons/web/static/lib/select2/README.md index 13081820d73..cb64dee9d02 100644 --- a/addons/web/static/lib/select2/README.md +++ b/addons/web/static/lib/select2/README.md @@ -3,7 +3,7 @@ Select2 Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results. -To get started, checkout examples and documentation at http://ivaynberg.github.com/select2 +To get started, checkout examples and documentation at http://select2.github.io/select2/ Use cases --------- @@ -24,17 +24,17 @@ Browser compatibility * Firefox 10+ * Safari 3+ * Opera 10.6+ - + Usage ----- -You can source Select2 directly from a [CDN like JSDliver](http://www.jsdelivr.com/#!select2), [download it from this GitHub repo](https://github.com/ivaynberg/select2/tags), or use one of the integrations below. +You can source Select2 directly from a CDN like [jsDelivr](http://www.jsdelivr.com/#!select2) or [CDNJS](http://www.cdnjs.com/libraries/select2), [download it from this GitHub repo](https://github.com/select2/select2/tags), or use one of the integrations below. Integrations ------------ * [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org)) * [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails) -* [AngularUI](http://angular-ui.github.com/#directives-select2) ([AngularJS](angularjs.org)) +* [AngularUI](http://angular-ui.github.io/#ui-select) ([AngularJS](https://angularjs.org/)) * [Django](https://github.com/applegrew/django-select2) * [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin) * [Symfony2](https://github.com/avocode/FormExtensions) @@ -44,6 +44,7 @@ Integrations * [Yii 2.x](http://demos.krajee.com/widgets#select2) * [Yii 1.x](https://github.com/tonybolzan/yii-select2) * [AtmosphereJS](https://atmospherejs.com/package/jquery-select2) +* [EmberJS](https://github.com/iStefo/ember-select-2) ### Example Integrations @@ -61,15 +62,21 @@ file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.) after `select2.js`. Missing a language? Just copy `select2_locale_en.js.template`, translate it, and make a pull request back to Select2 here on GitHub. -Bug tracker ------------ +Documentation +------------- + +The documentation for Select2 is available [through GitHub Pages](http://select2.github.io/select2/) and is located within this repository in the [`gh-pages` branch](https://github.com/ivaynberg/select2/tree/gh-pages). + +Community +--------- + +### Bug tracker Have a bug? Please create an issue here on GitHub! https://github.com/ivaynberg/select2/issues -Mailing list ------------- +### Mailing list Have a question? Ask on our mailing list! @@ -77,11 +84,20 @@ select2@googlegroups.com https://groups.google.com/d/forum/select2 +### IRC channel + +Need help implementing Select2 in your project? Ask in our IRC channel! + +**Network:** [Freenode](https://freenode.net/) (`chat.freenode.net`) + +**Channel:** `#select2` + +**Web access:** https://webchat.freenode.net/?channels=select2 Copyright and license --------------------- -Copyright 2012 Igor Vaynberg +Copyright 2015 Igor Vaynberg This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU General Public License version 2 (the "GPL License"). You may choose either license to govern your @@ -96,4 +112,4 @@ http://www.gnu.org/licenses/gpl-2.0.html Unless required by applicable law or agreed to in writing, software distributed under the Apache License or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for the specific language governing -permissions and limitations under the Apache License and the GPL License.
\ No newline at end of file +permissions and limitations under the Apache License and the GPL License. diff --git a/addons/web/static/lib/select2/release.sh b/addons/web/static/lib/select2/release.sh index b25a31dd49d..3b63f96621e 100755 --- a/addons/web/static/lib/select2/release.sh +++ b/addons/web/static/lib/select2/release.sh @@ -6,8 +6,8 @@ echo -n "Enter the version for this release: " read ver if [ ! $ver ]; then - echo "Invalid version." - exit + echo "Invalid version." + exit fi name="select2" @@ -20,7 +20,7 @@ branch="build-$ver" curbranch=`git branch | grep "*" | sed "s/* //"` timestamp=$(date) tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g" -remote="github" +remote="origin" echo "Pulling from origin" @@ -59,9 +59,9 @@ cat LICENSE | sed "$tokens" >> "$mini" echo "*/" >> "$mini" curl -s \ - --data-urlencode "js_code@$js" \ - http://marijnhaverbeke.nl/uglifyjs \ - >> "$mini" + --data-urlencode "js_code@$js" \ + http://marijnhaverbeke.nl/uglifyjs \ + >> "$mini" git add "$mini" @@ -76,4 +76,4 @@ echo "Cleaning Up..." git checkout "$curbranch" git branch -D "$branch" -echo "Done"
\ No newline at end of file +echo "Done" diff --git a/addons/web/static/lib/select2/select2.css b/addons/web/static/lib/select2/select2.css index 5b9e67fa934..915347037e0 100644 --- a/addons/web/static/lib/select2/select2.css +++ b/addons/web/static/lib/select2/select2.css @@ -1,13 +1,10 @@ /* -Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014 +Version: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015 */ .select2-container { margin: 0; position: relative; display: inline-block; - /* inline-block for ie7 */ - zoom: 1; - *display: inline; vertical-align: middle; } @@ -180,10 +177,6 @@ html[dir="rtl"] .select2-container .select2-choice > .select2-chosen { width: auto; } -.select2-drop-auto-width .select2-search { - padding-top: 4px; -} - .select2-container .select2-choice .select2-arrow { display: inline-block; width: 18px; @@ -230,8 +223,7 @@ html[dir="rtl"] .select2-container .select2-choice .select2-arrow b { width: 100%; min-height: 26px; margin: 0; - padding-left: 4px; - padding-right: 4px; + padding: 4px 4px 0 4px; position: relative; z-index: 10000; @@ -273,10 +265,6 @@ html[dir="rtl"] .select2-search input { background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; } -.select2-drop.select2-drop-above .select2-search input { - margin-top: 4px; -} - .select2-search input.select2-active { background: #fff url('select2-spinner.gif') no-repeat 100%; background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); @@ -586,7 +574,7 @@ html[dir="rtl"] .select2-container-multi .select2-choices li background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee)); background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); - background-image: linear-gradient(to top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); + background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); } html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice { @@ -701,4 +689,4 @@ html[dir="rtl"] .select2-container-multi .select2-search-choice-close { .select2-search input { background-position: 100% -21px !important; } -}
\ No newline at end of file +} diff --git a/addons/web/static/lib/select2/select2.js b/addons/web/static/lib/select2/select2.js index 2556185b022..195ccee5bb0 100644 --- a/addons/web/static/lib/select2/select2.js +++ b/addons/web/static/lib/select2/select2.js @@ -1,7 +1,7 @@ /* Copyright 2012 Igor Vaynberg -Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014 +Version: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015 This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU General Public License version 2 (the "GPL License"). You may choose either license to govern your @@ -46,7 +46,7 @@ the specific language governing permissions and limitations under the Apache Lic return; } - var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer, + var AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer, lastMousePosition={x:0,y:0}, $document, scrollBarDimensions, KEY = { @@ -132,7 +132,7 @@ the specific language governing permissions and limitations under the Apache Lic function measureScrollbar () { var $template = $( MEASURE_SCROLLBAR_TEMPLATE ); - $template.appendTo('body'); + $template.appendTo(document.body); var dim = { width: $template.width() - $template[0].clientWidth, @@ -160,16 +160,16 @@ the specific language governing permissions and limitations under the Apache Lic } /** - * Splits the string into an array of values, trimming each value. An empty array is returned for nulls or empty + * Splits the string into an array of values, transforming each value. An empty array is returned for nulls or empty * strings * @param string * @param separator */ - function splitVal(string, separator) { + function splitVal(string, separator, transform) { var val, i, l; if (string === null || string.length < 1) return []; val = string.split(separator); - for (i = 0, l = val.length; i < l; i = i + 1) val[i] = $.trim(val[i]); + for (i = 0, l = val.length; i < l; i = i + 1) val[i] = transform(val[i]); return val; } @@ -311,7 +311,7 @@ the specific language governing permissions and limitations under the Apache Lic whiteSpace: "nowrap" }); sizer.attr("class","select2-sizer"); - $("body").append(sizer); + $(document.body).append(sizer); } sizer.text(e.val()); return sizer.width(); @@ -450,7 +450,7 @@ the specific language governing permissions and limitations under the Apache Lic hasError: true, jqXHR: jqXHR, textStatus: textStatus, - errorThrown: errorThrown, + errorThrown: errorThrown }; query.callback(results); @@ -699,12 +699,15 @@ the specific language governing permissions and limitations under the Apache Lic this.container = this.createContainer(); - this.liveRegion = $("<span>", { - role: "status", - "aria-live": "polite" - }) - .addClass("select2-hidden-accessible") - .appendTo(document.body); + this.liveRegion = $('.select2-hidden-accessible'); + if (this.liveRegion.length == 0) { + this.liveRegion = $("<span>", { + role: "status", + "aria-live": "polite" + }) + .addClass("select2-hidden-accessible") + .appendTo(document.body); + } this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid()); this.containerEventName= this.containerId @@ -714,7 +717,7 @@ the specific language governing permissions and limitations under the Apache Lic this.container.attr("title", opts.element.attr("title")); - this.body = $("body"); + this.body = $(document.body); syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); @@ -811,7 +814,7 @@ the specific language governing permissions and limitations under the Apache Lic // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal. this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); }); - this.nextSearchTerm = undefined; + this.lastSearchTerm = undefined; if ($.isFunction(this.opts.initSelection)) { // initialize selection based on the current value of the source element @@ -850,9 +853,11 @@ the specific language governing permissions and limitations under the Apache Lic this.close(); - if (element.length && element[0].detachEvent) { + if (element.length && element[0].detachEvent && self._sync) { element.each(function () { - this.detachEvent("onpropertychange", self._sync); + if (self._sync) { + this.detachEvent("onpropertychange", self._sync); + } }); } if (this.propertyObserver) { @@ -865,17 +870,21 @@ the specific language governing permissions and limitations under the Apache Lic select2.container.remove(); select2.liveRegion.remove(); select2.dropdown.remove(); - element - .removeClass("select2-offscreen") - .removeData("select2") - .off(".select2") - .prop("autofocus", this.autofocus || false); - if (this.elementTabIndex) { - element.attr({tabindex: this.elementTabIndex}); + element.removeData("select2") + .off(".select2"); + if (!element.is("input[type='hidden']")) { + element + .show() + .prop("autofocus", this.autofocus || false); + if (this.elementTabIndex) { + element.attr({tabindex: this.elementTabIndex}); + } else { + element.removeAttr("tabindex"); + } + element.show(); } else { - element.removeAttr("tabindex"); + element.css("display", ""); } - element.show(); } cleanupJQueryElements.call(this, @@ -927,6 +936,155 @@ the specific language governing permissions and limitations under the Apache Lic }); } + opts.debug = opts.debug || $.fn.select2.defaults.debug; + + // Warnings for options renamed/removed in Select2 4.0.0 + // Only when it's enabled through debug mode + if (opts.debug && console && console.warn) { + // id was removed + if (opts.id != null) { + console.warn( + 'Select2: The `id` option has been removed in Select2 4.0.0, ' + + 'consider renaming your `id` property or mapping the property before your data makes it to Select2. ' + + 'You can read more at https://select2.github.io/announcements-4.0.html#changed-id' + ); + } + + // text was removed + if (opts.text != null) { + console.warn( + 'Select2: The `text` option has been removed in Select2 4.0.0, ' + + 'consider renaming your `text` property or mapping the property before your data makes it to Select2. ' + + 'You can read more at https://select2.github.io/announcements-4.0.html#changed-id' + ); + } + + // sortResults was renamed to results + if (opts.sortResults != null) { + console.warn( + 'Select2: the `sortResults` option has been renamed to `sorter` in Select2 4.0.0. ' + ); + } + + // selectOnBlur was renamed to selectOnClose + if (opts.selectOnBlur != null) { + console.warn( + 'Select2: The `selectOnBlur` option has been renamed to `selectOnClose` in Select2 4.0.0.' + ); + } + + // ajax.results was renamed to ajax.processResults + if (opts.ajax != null && opts.ajax.results != null) { + console.warn( + 'Select2: The `ajax.results` option has been renamed to `ajax.processResults` in Select2 4.0.0.' + ); + } + + // format* options were renamed to language.* + if (opts.formatNoResults != null) { + console.warn( + 'Select2: The `formatNoResults` option has been renamed to `language.noResults` in Select2 4.0.0.' + ); + } + if (opts.formatSearching != null) { + console.warn( + 'Select2: The `formatSearching` option has been renamed to `language.searching` in Select2 4.0.0.' + ); + } + if (opts.formatInputTooShort != null) { + console.warn( + 'Select2: The `formatInputTooShort` option has been renamed to `language.inputTooShort` in Select2 4.0.0.' + ); + } + if (opts.formatInputTooLong != null) { + console.warn( + 'Select2: The `formatInputTooLong` option has been renamed to `language.inputTooLong` in Select2 4.0.0.' + ); + } + if (opts.formatLoading != null) { + console.warn( + 'Select2: The `formatLoading` option has been renamed to `language.loadingMore` in Select2 4.0.0.' + ); + } + if (opts.formatSelectionTooBig != null) { + console.warn( + 'Select2: The `formatSelectionTooBig` option has been renamed to `language.maximumSelected` in Select2 4.0.0.' + ); + } + + if (opts.element.data('select2Tags')) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been renamed to `data-tags` in Select2 4.0.0.' + ); + } + } + + // Aliasing options renamed in Select2 4.0.0 + + // data-select2-tags -> data-tags + if (opts.element.data('tags') != null) { + var elemTags = opts.element.data('tags'); + + // data-tags should actually be a boolean + if (!$.isArray(elemTags)) { + elemTags = []; + } + + opts.element.data('select2Tags', elemTags); + } + + // sortResults -> sorter + if (opts.sorter != null) { + opts.sortResults = opts.sorter; + } + + // selectOnBlur -> selectOnClose + if (opts.selectOnClose != null) { + opts.selectOnBlur = opts.selectOnClose; + } + + // ajax.results -> ajax.processResults + if (opts.ajax != null) { + if ($.isFunction(opts.ajax.processResults)) { + opts.ajax.results = opts.ajax.processResults; + } + } + + // Formatters/language options + if (opts.language != null) { + var lang = opts.language; + + // formatNoMatches -> language.noMatches + if ($.isFunction(lang.noMatches)) { + opts.formatNoMatches = lang.noMatches; + } + + // formatSearching -> language.searching + if ($.isFunction(lang.searching)) { + opts.formatSearching = lang.searching; + } + + // formatInputTooShort -> language.inputTooShort + if ($.isFunction(lang.inputTooShort)) { + opts.formatInputTooShort = lang.inputTooShort; + } + + // formatInputTooLong -> language.inputTooLong + if ($.isFunction(lang.inputTooLong)) { + opts.formatInputTooLong = lang.inputTooLong; + } + + // formatLoading -> language.loadingMore + if ($.isFunction(lang.loadingMore)) { + opts.formatLoading = lang.loadingMore; + } + + // formatSelectionTooBig -> language.maximumSelected + if ($.isFunction(lang.maximumSelected)) { + opts.formatSelectionTooBig = lang.maximumSelected; + } + } + opts = $.extend({}, { populateResults: function(container, results, query) { var populate, id=this.opts.id, liveRegion=this.liveRegion; @@ -970,7 +1128,6 @@ the specific language governing permissions and limitations under the Apache Lic if (compound) { - innerContainer=$("<ul></ul>"); innerContainer.addClass("select2-result-sub"); populate(result.children, innerContainer, depth+1); @@ -1041,7 +1198,6 @@ the specific language governing permissions and limitations under the Apache Lic opts.id=function(e) { return e.id; }; } else { if (!("query" in opts)) { - if ("ajax" in opts) { ajaxUrl = opts.element.data("ajax-url"); if (ajaxUrl && ajaxUrl.length > 0) { @@ -1058,7 +1214,7 @@ the specific language governing permissions and limitations under the Apache Lic if (opts.initSelection === undefined) { opts.initSelection = function (element, callback) { var data = []; - $(splitVal(element.val(), opts.separator)).each(function () { + $(splitVal(element.val(), opts.separator, opts.transformVal)).each(function () { var obj = { id: this, text: this }, tags = opts.tags; if ($.isFunction(tags)) tags=tags(); @@ -1113,11 +1269,15 @@ the specific language governing permissions and limitations under the Apache Lic if (readonly === undefined) readonly = false; this.readonly(readonly); - syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); - this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element)); + if (this.container) { + syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); + this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element)); + } - syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass); - this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element)); + if (this.dropdown) { + syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass); + this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element)); + } }); @@ -1222,9 +1382,10 @@ the specific language governing permissions and limitations under the Apache Lic // abstract positionDropdown: function() { var $dropdown = this.dropdown, - offset = this.container.offset(), - height = this.container.outerHeight(false), - width = this.container.outerWidth(false), + container = this.container, + offset = container.offset(), + height = container.outerHeight(false), + width = container.outerWidth(false), dropHeight = $dropdown.outerHeight(false), $window = $(window), windowWidth = $window.width(), @@ -1236,7 +1397,12 @@ the specific language governing permissions and limitations under the Apache Lic enoughRoomBelow = dropTop + dropHeight <= viewportBottom, enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(), dropWidth = $dropdown.outerWidth(false), - enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight, + enoughRoomOnRight = function() { + return dropLeft + dropWidth <= viewPortRight; + }, + enoughRoomOnLeft = function() { + return offset.left + viewPortRight + container.outerWidth(false) > dropWidth; + }, aboveNow = $dropdown.hasClass("select2-drop-above"), bodyOffset, above, @@ -1271,7 +1437,6 @@ the specific language governing permissions and limitations under the Apache Lic dropTop = offset.top + height; dropLeft = offset.left; dropWidth = $dropdown.outerWidth(false); - enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight; $dropdown.show(); // fix so the cursor does not move to the left within the search-textbox in IE @@ -1286,7 +1451,6 @@ the specific language governing permissions and limitations under the Apache Lic dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width); dropWidth > width ? width = dropWidth : dropWidth = width; dropHeight = $dropdown.outerHeight(false); - enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight; } else { this.container.removeClass('select2-drop-auto-width'); @@ -1302,7 +1466,7 @@ the specific language governing permissions and limitations under the Apache Lic dropLeft -= bodyOffset.left; } - if (!enoughRoomOnRight) { + if (!enoughRoomOnRight() && enoughRoomOnLeft()) { dropLeft = offset.left + this.container.outerWidth(false) - dropWidth; } @@ -1312,10 +1476,11 @@ the specific language governing permissions and limitations under the Apache Lic }; if (above) { - css.top = offset.top - dropHeight; - css.bottom = 'auto'; this.container.addClass("select2-drop-above"); $dropdown.addClass("select2-drop-above"); + dropHeight = $dropdown.outerHeight(false); + css.top = offset.top - dropHeight; + css.bottom = 'auto'; } else { css.top = dropTop; @@ -1391,7 +1556,7 @@ the specific language governing permissions and limitations under the Apache Lic // create the dropdown mask if doesn't already exist mask = $("#select2-drop-mask"); - if (mask.length == 0) { + if (mask.length === 0) { mask = $(document.createElement("div")); mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask"); mask.hide(); @@ -1468,6 +1633,9 @@ the specific language governing permissions and limitations under the Apache Lic this.clearSearch(); this.search.removeClass("select2-active"); + + // Remove the aria active descendant for highlighted element + this.search.removeAttr("aria-activedescendant"); this.opts.element.trigger($.Event("select2-close")); }, @@ -1486,6 +1654,27 @@ the specific language governing permissions and limitations under the Apache Lic }, + /** + * @return {Boolean} Whether or not search value was changed. + * @private + */ + prefillNextSearchTerm: function () { + // initializes search's value with nextSearchTerm (if defined by user) + // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter + if(this.search.val() !== "") { + return false; + } + + var nextSearchTerm = this.opts.nextSearchTerm(this.data(), this.lastSearchTerm); + if(nextSearchTerm !== undefined){ + this.search.val(nextSearchTerm); + this.search.select(); + return true; + } + + return false; + }, + //abstract getMaximumSelectionSize: function() { return evaluate(this.opts.maximumSelectionSize, this.opts.element); @@ -1525,7 +1714,7 @@ the specific language governing permissions and limitations under the Apache Lic } } - rb = results.offset().top + results.outerHeight(true); + rb = results.offset().top + results.outerHeight(false); if (hb > rb) { results.scrollTop(results.scrollTop() + (hb - rb)); } @@ -1648,7 +1837,7 @@ the specific language governing permissions and limitations under the Apache Lic self.postprocessResults(data, false, false); if (data.more===true) { - more.detach().appendTo(results).text(evaluate(self.opts.formatLoadMore, self.opts.element, page+1)); + more.detach().appendTo(results).html(self.opts.escapeMarkup(evaluate(self.opts.formatLoadMore, self.opts.element, page+1))); window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10); } else { more.remove(); @@ -1701,7 +1890,7 @@ the specific language governing permissions and limitations under the Apache Lic self.liveRegion.text(results.text()); } else { - self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable').length)); + self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable:not(".select2-selected")').length)); } } @@ -1799,6 +1988,9 @@ the specific language governing permissions and limitations under the Apache Lic if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) { render("<li class='select2-no-results'>" + evaluate(opts.formatNoMatches, opts.element, search.val()) + "</li>"); + if(this.showSearch){ + this.showSearch(search.val()); + } return; } @@ -1903,7 +2095,7 @@ the specific language governing permissions and limitations under the Apache Lic } else if (this.opts.width === "copy" || this.opts.width === "resolve") { // check if there is inline style on the element that contains width style = this.opts.element.attr('style'); - if (style !== undefined) { + if (typeof(style) === "string") { attrs = style.split(';'); for (i = 0, l = attrs.length; i < l; i = i + 1) { attr = attrs[i].replace(/\s/g, ''); @@ -2002,14 +2194,7 @@ the specific language governing permissions and limitations under the Apache Lic } } - // initializes search's value with nextSearchTerm (if defined by user) - // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter - if(this.search.val() === "") { - if(this.nextSearchTerm != undefined){ - this.search.val(this.nextSearchTerm); - this.search.select(); - } - } + this.prefillNextSearchTerm(); this.focusser.prop("disabled", true).val(""); this.updateResults(true); @@ -2096,6 +2281,7 @@ the specific language governing permissions and limitations under the Apache Lic this.focusser.attr("id", "s2id_autogen"+idSuffix); elementLabel = $("label[for='" + this.opts.element.attr("id") + "']"); + this.opts.element.on('focus.select2', this.bind(function () { this.focus(); })); this.focusser.prev() .text(elementLabel.text()) @@ -2151,7 +2337,7 @@ the specific language governing permissions and limitations under the Apache Lic // without this the search field loses focus which is annoying if (document.activeElement === this.body.get(0)) { window.setTimeout(this.bind(function() { - if (this.opened()) { + if (this.opened() && this.results && this.results.length > 1) { this.search.focus(); } }), 0); @@ -2200,11 +2386,17 @@ the specific language governing permissions and limitations under the Apache Lic })); selection.on("mousedown touchstart", "abbr", this.bind(function (e) { - if (!this.isInterfaceEnabled()) return; + if (!this.isInterfaceEnabled()) { + return; + } + this.clear(); killEventImmediately(e); this.close(); - this.selection.focus(); + + if (this.selection) { + this.selection.focus(); + } })); selection.on("mousedown touchstart", this.bind(function (e) { @@ -2253,7 +2445,7 @@ the specific language governing permissions and limitations under the Apache Lic })); this.initContainerWidth(); - this.opts.element.addClass("select2-offscreen"); + this.opts.element.hide(); this.setPlaceholder(); }, @@ -2297,7 +2489,7 @@ the specific language governing permissions and limitations under the Apache Lic self.updateSelection(selected); self.close(); self.setPlaceholder(); - self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val()); + self.lastSearchTerm = self.search.val(); } }); } @@ -2434,7 +2626,7 @@ the specific language governing permissions and limitations under the Apache Lic this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data }); - this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val()); + this.lastSearchTerm = this.search.val(); this.close(); if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) { @@ -2488,9 +2680,23 @@ the specific language governing permissions and limitations under the Apache Lic if (arguments.length > 1) { triggerChange = arguments[1]; + + if (this.opts.debug && console && console.warn) { + console.warn( + 'Select2: The second option to `select2("val")` is not supported in Select2 4.0.0. ' + + 'The `change` event will always be triggered in 4.0.0.' + ); + } } if (this.select) { + if (this.opts.debug && console && console.warn) { + console.warn( + 'Select2: Setting the value on a <select> using `select2("val")` is no longer supported in 4.0.0. ' + + 'You can use the `.val(newValue).trigger("change")` method provided by jQuery instead.' + ); + } + this.select .val(val) .find("option").filter(function() { return this.selected }).each2(function (i, elm) { @@ -2539,6 +2745,13 @@ the specific language governing permissions and limitations under the Apache Lic if (data == undefined) data = null; return data; } else { + if (this.opts.debug && console && console.warn) { + console.warn( + 'Select2: The `select2("data")` method can no longer set selected values in 4.0.0, ' + + 'consider using the `.val()` method instead.' + ); + } + if (arguments.length > 1) { triggerChange = arguments[1]; } @@ -2582,7 +2795,6 @@ the specific language governing permissions and limitations under the Apache Lic self=this; // TODO validate placeholder is a string if specified - if (opts.element.get(0).tagName.toLowerCase() === "select") { // install the selection initializer opts.initSelection = function (element, callback) { @@ -2597,7 +2809,7 @@ the specific language governing permissions and limitations under the Apache Lic } else if ("data" in opts) { // install default initSelection when applied to hidden input and data is local opts.initSelection = opts.initSelection || function (element, callback) { - var ids = splitVal(element.val(), opts.separator); + var ids = splitVal(element.val(), opts.separator, opts.transformVal); //search in data by array of ids, storing matching items in a list var matches = []; opts.query({ @@ -2674,8 +2886,7 @@ the specific language governing permissions and limitations under the Apache Lic this.selection = selection = this.container.find(selector); var _this = this; - this.selection.on("click", ".select2-search-choice:not(.select2-locked)", function (e) { - //killEvent(e); + this.selection.on("click", ".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)", function (e) { _this.search[0].focus(); _this.selectChoice($(this)); }); @@ -2686,6 +2897,7 @@ the specific language governing permissions and limitations under the Apache Lic this.search.prev() .text($("label[for='" + this.opts.element.attr("id") + "']").text()) .attr('for', this.search.attr('id')); + this.opts.element.on('focus.select2', this.bind(function () { this.focus(); })); this.search.on("input paste", this.bind(function() { if (this.search.attr('placeholder') && this.search.val().length == 0) return; @@ -2837,7 +3049,7 @@ the specific language governing permissions and limitations under the Apache Lic })); this.initContainerWidth(); - this.opts.element.addClass("select2-offscreen"); + this.opts.element.hide(); // set the placeholder if necessary this.clearSearch(); @@ -2903,16 +3115,9 @@ the specific language governing permissions and limitations under the Apache Lic this.focusSearch(); - // initializes search's value with nextSearchTerm (if defined by user) - // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter - if(this.search.val() === "") { - if(this.nextSearchTerm != undefined){ - this.search.val(this.nextSearchTerm); - this.search.select(); - } - } - + this.prefillNextSearchTerm(); this.updateResults(true); + if (this.opts.shouldFocusInput(this)) { this.search.focus(); } @@ -2938,21 +3143,18 @@ the specific language governing permissions and limitations under the Apache Lic // multi updateSelection: function (data) { - var ids = [], filtered = [], self = this; + var ids = {}, filtered = [], self = this; // filter out duplicates $(data).each(function () { - if (indexOf(self.id(this), ids) < 0) { - ids.push(self.id(this)); + if (!(self.id(this) in ids)) { + ids[self.id(this)] = 0; filtered.push(this); } }); - data = filtered; this.selection.find(".select2-search-choice").remove(); - $(data).each(function () { - self.addSelectedChoice(this); - }); + this.addSelectedChoice(filtered); self.postprocessResults(); }, @@ -2979,7 +3181,7 @@ the specific language governing permissions and limitations under the Apache Lic this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data }); // keep track of the search's value before it gets cleared - this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val()); + this.lastSearchTerm = this.search.val(); this.clearSearch(); this.updateResults(); @@ -2999,10 +3201,8 @@ the specific language governing permissions and limitations under the Apache Lic this.updateResults(true); } else { // initializes search's value with nextSearchTerm and update search result - if(this.nextSearchTerm != undefined){ - this.search.val(this.nextSearchTerm); + if (this.prefillNextSearchTerm()) { this.updateResults(); - this.search.select(); } } this.positionDropdown(); @@ -3028,6 +3228,14 @@ the specific language governing permissions and limitations under the Apache Lic }, addSelectedChoice: function (data) { + var val = this.getVal(), self = this; + $(data).each(function () { + val.push(self.createChoice(this)); + }); + this.setVal(val); + }, + + createChoice: function (data) { var enableChoice = !data.locked, enabledItem = $( "<li class='select2-search-choice'>" + @@ -3040,13 +3248,12 @@ the specific language governing permissions and limitations under the Apache Lic "</li>"); var choice = enableChoice ? enabledItem : disabledItem, id = this.id(data), - val = this.getVal(), formatted, cssClass; formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup); if (formatted != undefined) { - choice.find("div").replaceWith("<div>"+formatted+"</div>"); + choice.find("div").replaceWith($("<div></div>").html(formatted)); } cssClass=this.opts.formatSelectionCssClass(data, choice.find("div")); if (cssClass != undefined) { @@ -3074,8 +3281,7 @@ the specific language governing permissions and limitations under the Apache Lic choice.data("select2-data", data); choice.insertBefore(this.searchContainer); - val.push(id); - this.setVal(val); + return id; }, // multi @@ -3144,7 +3350,7 @@ the specific language governing permissions and limitations under the Apache Lic } }); - if (this.highlight() == -1 && noHighlightUpdate !== false){ + if (this.highlight() == -1 && noHighlightUpdate !== false && this.opts.closeOnSelect === true){ self.highlight(0); } @@ -3201,20 +3407,22 @@ the specific language governing permissions and limitations under the Apache Lic return val === null ? [] : val; } else { val = this.opts.element.val(); - return splitVal(val, this.opts.separator); + return splitVal(val, this.opts.separator, this.opts.transformVal); } }, // multi setVal: function (val) { - var unique; if (this.select) { this.select.val(val); } else { - unique = []; + var unique = [], valMap = {}; // filter out duplicates $(val).each(function () { - if (indexOf(this, unique) < 0) unique.push(this); + if (!(this in valMap)) { + unique.push(this); + valMap[this] = 0; + } }); this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator)); } @@ -3230,11 +3438,9 @@ the specific language governing permissions and limitations under the Apache Lic for (var j = 0; j < old.length; j++) { if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) { current.splice(i, 1); - if(i>0){ - i--; - } + i--; old.splice(j, 1); - j--; + break; } } } @@ -3404,6 +3610,7 @@ the specific language governing permissions and limitations under the Apache Lic // plugin defaults, accessible to users $.fn.select2.defaults = { + debug: false, width: "copy", loadMorePadding: 0, closeOnSelect: true, @@ -3414,11 +3621,14 @@ the specific language governing permissions and limitations under the Apache Lic dropdownCssClass: "", formatResult: function(result, container, query, escapeMarkup) { var markup=[]; - markMatch(result.text, query.term, markup, escapeMarkup); + markMatch(this.text(result), query.term, markup, escapeMarkup); return markup.join(""); }, + transformVal: function(val) { + return $.trim(val); + }, formatSelection: function (data, container, escapeMarkup) { - return data ? escapeMarkup(data.text) : undefined; + return data ? escapeMarkup(this.text(data)) : undefined; }, sortResults: function (results, container, query) { return results; @@ -3430,6 +3640,17 @@ the specific language governing permissions and limitations under the Apache Lic maximumInputLength: null, maximumSelectionSize: 0, id: function (e) { return e == undefined ? null : e.id; }, + text: function (e) { + if (e && this.data && this.data.text) { + if ($.isFunction(this.data.text)) { + return this.data.text(e); + } else { + return e[this.data.text]; + } + } else { + return e.text; + } + }, matcher: function(term, text) { return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0; }, @@ -3473,7 +3694,7 @@ the specific language governing permissions and limitations under the Apache Lic formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); }, formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); }, formatLoadMore: function (pageNumber) { return "Loading more results…"; }, - formatSearching: function () { return "Searching…"; }, + formatSearching: function () { return "Searching…"; } }; $.extend($.fn.select2.defaults, $.fn.select2.locales['en']); @@ -3505,4 +3726,4 @@ the specific language governing permissions and limitations under the Apache Lic } }; -}(jQuery));
\ No newline at end of file +}(jQuery)); |
