diff --git a/admin/thirdparty/chosen/Cakefile b/admin/thirdparty/chosen/Cakefile index ff76b9da6..11509f742 100644 --- a/admin/thirdparty/chosen/Cakefile +++ b/admin/thirdparty/chosen/Cakefile @@ -56,8 +56,7 @@ write_chosen_javascript = (filename, body, trailing='') -> // Copyright (c) 2011 Harvest http://getharvest.com // MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md - -// based on version 0.9.8, applied a very simple patch that fix percentaage width support on select tag +// based on version 0.9.8, applied a very simple patch that fixes percentage width support on select tag, and enables rise-up functionality // This file is generated by `cake build`, do not edit it by hand. #{body}#{trailing} """ @@ -175,4 +174,4 @@ task 'release', 'build, tag the current release, and push', -> , untag_release , untag_release - , untag_release \ No newline at end of file + , untag_release diff --git a/admin/thirdparty/chosen/chosen/chosen.jquery.js b/admin/thirdparty/chosen/chosen/chosen.jquery.js index 901d5c75a..e5f598383 100644 --- a/admin/thirdparty/chosen/chosen/chosen.jquery.js +++ b/admin/thirdparty/chosen/chosen/chosen.jquery.js @@ -6,21 +6,22 @@ // Copyright (c) 2011 Harvest http://getharvest.com // MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md - -// based on version 0.9.8, applied a very simple patch that fix percentaage width support on select tag +// based on version 0.9.8, applied a very simple patch that fixes percentage width support on select tag, and enables rise-up functionality // This file is generated by `cake build`, do not edit it by hand. (function() { var SelectParser; SelectParser = (function() { + SelectParser.name = 'SelectParser'; + function SelectParser() { this.options_index = 0; this.parsed = []; } SelectParser.prototype.add_node = function(child) { - if (child.nodeName === "OPTGROUP") { + if (child.nodeName.toUpperCase() === "OPTGROUP") { return this.add_group(child); } else { return this.add_option(child); @@ -47,7 +48,7 @@ }; SelectParser.prototype.add_option = function(option, group_position, group_disabled) { - if (option.nodeName === "OPTION") { + if (option.nodeName.toUpperCase() === "OPTION") { if (option.text !== "") { if (group_position != null) { this.parsed[group_position].children += 1; @@ -107,12 +108,14 @@ Copyright (c) 2011 by Harvest AbstractChosen = (function() { + AbstractChosen.name = 'AbstractChosen'; + function AbstractChosen(form_field, options) { this.form_field = form_field; this.options = options != null ? options : {}; this.set_default_values(); this.is_multiple = this.form_field.multiple; - this.default_text_default = this.is_multiple ? "Select Some Options" : "Select an Option"; + this.set_default_text(); this.setup(); this.set_up_html(); this.register_observers(); @@ -134,9 +137,22 @@ Copyright (c) 2011 by Harvest this.result_single_selected = null; this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; this.disable_search_threshold = this.options.disable_search_threshold || 0; + this.disable_search = this.options.disable_search || false; this.search_contains = this.options.search_contains || false; this.choices = 0; - return this.results_none_found = this.options.no_results_text || "No results match"; + this.single_backstroke_delete = this.options.single_backstroke_delete || false; + return this.max_selected_options = this.options.max_selected_options || Infinity; + }; + + AbstractChosen.prototype.set_default_text = function() { + if (this.form_field.getAttribute("data-placeholder")) { + this.default_text = this.form_field.getAttribute("data-placeholder"); + } else if (this.is_multiple) { + this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || "Select Some Options"; + } else { + this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || "Select an Option"; + } + return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || "No results match"; }; AbstractChosen.prototype.mouse_enter = function() { @@ -149,10 +165,16 @@ Copyright (c) 2011 by Harvest AbstractChosen.prototype.input_focus = function(evt) { var _this = this; - if (!this.active_field) { - return setTimeout((function() { - return _this.container_mousedown(); - }), 50); + if (this.is_multiple) { + if (!this.active_field) { + return setTimeout((function() { + return _this.container_mousedown(); + }), 50); + } + } else { + if (!this.active_field) { + return this.activate_field(); + } } }; @@ -188,6 +210,9 @@ Copyright (c) 2011 by Harvest }; AbstractChosen.prototype.results_update_field = function() { + if (!this.is_multiple) { + this.results_reset_cleanup(); + } this.result_clear_highlight(); this.result_single_selected = null; return this.results_build(); @@ -254,7 +279,7 @@ Copyright (c) 2011 by Harvest AbstractChosen.prototype.generate_random_char = function() { var chars, newchar, rand; - chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"; + chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; rand = Math.floor(Math.random() * chars.length); return newchar = chars.substring(rand, rand + 1); }; @@ -276,7 +301,7 @@ Copyright (c) 2011 by Harvest (function() { var $, Chosen, get_side_border_padding, root, __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }; root = this; @@ -284,7 +309,7 @@ Copyright (c) 2011 by Harvest $.fn.extend({ chosen: function(options) { - if ($.browser.msie && ($.browser.version === "6.0" || $.browser.version === "7.0")) { + if ($.browser.msie && ($.browser.version === "6.0" || ($.browser.version === "7.0" && document.documentMode === 7))) { return this; } return this.each(function(input_field) { @@ -301,12 +326,15 @@ Copyright (c) 2011 by Harvest __extends(Chosen, _super); + Chosen.name = 'Chosen'; + function Chosen() { return Chosen.__super__.constructor.apply(this, arguments); } Chosen.prototype.setup = function() { this.form_field_jq = $(this.form_field); + this.current_value = this.form_field_jq.val(); return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl"); }; @@ -328,7 +356,7 @@ Copyright (c) 2011 by Harvest if (this.is_multiple) { container_div.html('
=0||c.html.indexOf("[")===0){e=c.html.replace(/\[|\]/g,"").split(" ");if(e.length)for(p=0,r=e.length;p"+c.html.substr(l+k.length),m=m.substr(0,l)+""+m.substr(l)):m=c.html,h.html(m),this.result_activate(h),c.group_array_index!=null&&a("#"+this.results_data[c.group_array_index].dom_id).css("display","list-item")):(this.result_highlight&&i===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(h))}}return j<1&&k.length?this.no_results(k):this.winnow_results_set_highlight()},e.prototype.winnow_results_clear=function(){var b,c,d,e,f;this.search_field.val(""),c=this.search_results.find("li"),f=[];for(d=0,e=c.length;d '+this.results_none_found+' ""'),c.find("span").first().html(b),this.search_results.append(c)},e.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},e.prototype.keydown_arrow=function(){var b,c;this.result_highlight?this.results_showing&&(c=this.result_highlight.nextAll("li.active-result").first(),c&&this.result_do_highlight(c)):(b=this.search_results.find("li.active-result").first(),b&&this.result_do_highlight(a(b)));if(!this.results_showing)return this.results_show()},e.prototype.keyup_arrow=function(){var a;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight)return a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices>0&&this.results_hide(),this.result_clear_highlight())},e.prototype.keydown_backstroke=function(){var a;if(this.pending_backstroke)return this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke();a=this.search_container.siblings("li.search-choice").last();if(a.length&&!a.hasClass("search-choice-disabled"))return this.pending_backstroke=a,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")},e.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},e.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},e.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j,k;if(this.is_multiple){d=0,i=0,g="position:absolute; left: -1000px; top: -1000px; display:none;",h=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(j=0,k=h.length;j ",{style:g}),c.text(this.search_field.val()),a("body").append(c),i=c.width()+25,c.remove(),i>this.f_width-10&&(i=this.f_width-10),this.search_field.css({width:i+"px"}),e=this.rise_up(this.container,this.dropdown),b=e?-this.container.find(".chzn-drop").height():this.container.height(),this.dropdown.css({top:b+"px"})}},e.prototype.generate_random_id=function(){var b;b="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(a("#"+b).length>0)b+=this.generate_random_char();return b},e.prototype.rise_up=function(b,c){var d,e,f,g;return g=b.find("a.chzn-single"),g.length>0?(f=a(window).height()+a(document).scrollTop()-b.find("a").innerHeight(),e=g.offset().top,d=c.innerHeight(),e+d>f&&e-d>0?(b.addClass("chzn-with-rise"),!0):(b.removeClass("chzn-with-rise"),!1)):!1},e}(AbstractChosen),c=function(a){var b;return b=a.outerWidth()-a.width()},d.get_side_border_padding=c}.call(this); \ No newline at end of file diff --git a/admin/thirdparty/chosen/chosen/chosen.proto.js b/admin/thirdparty/chosen/chosen/chosen.proto.js index aa83f8540..d20504e61 100644 --- a/admin/thirdparty/chosen/chosen/chosen.proto.js +++ b/admin/thirdparty/chosen/chosen/chosen.proto.js @@ -6,21 +6,22 @@ // Copyright (c) 2011 Harvest http://getharvest.com // MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md - -// based on version 0.9.8, applied a very simple patch that fix percentaage width support on select tag +// based on version 0.9.8, applied a very simple patch that fixes percentage width support on select tag, and enables rise-up functionality // This file is generated by `cake build`, do not edit it by hand. (function() { var SelectParser; SelectParser = (function() { + SelectParser.name = 'SelectParser'; + function SelectParser() { this.options_index = 0; this.parsed = []; } SelectParser.prototype.add_node = function(child) { - if (child.nodeName === "OPTGROUP") { + if (child.nodeName.toUpperCase() === "OPTGROUP") { return this.add_group(child); } else { return this.add_option(child); @@ -47,7 +48,7 @@ }; SelectParser.prototype.add_option = function(option, group_position, group_disabled) { - if (option.nodeName === "OPTION") { + if (option.nodeName.toUpperCase() === "OPTION") { if (option.text !== "") { if (group_position != null) { this.parsed[group_position].children += 1; @@ -107,12 +108,14 @@ Copyright (c) 2011 by Harvest AbstractChosen = (function() { + AbstractChosen.name = 'AbstractChosen'; + function AbstractChosen(form_field, options) { this.form_field = form_field; this.options = options != null ? options : {}; this.set_default_values(); this.is_multiple = this.form_field.multiple; - this.default_text_default = this.is_multiple ? "Select Some Options" : "Select an Option"; + this.set_default_text(); this.setup(); this.set_up_html(); this.register_observers(); @@ -134,9 +137,22 @@ Copyright (c) 2011 by Harvest this.result_single_selected = null; this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; this.disable_search_threshold = this.options.disable_search_threshold || 0; + this.disable_search = this.options.disable_search || false; this.search_contains = this.options.search_contains || false; this.choices = 0; - return this.results_none_found = this.options.no_results_text || "No results match"; + this.single_backstroke_delete = this.options.single_backstroke_delete || false; + return this.max_selected_options = this.options.max_selected_options || Infinity; + }; + + AbstractChosen.prototype.set_default_text = function() { + if (this.form_field.getAttribute("data-placeholder")) { + this.default_text = this.form_field.getAttribute("data-placeholder"); + } else if (this.is_multiple) { + this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || "Select Some Options"; + } else { + this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || "Select an Option"; + } + return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || "No results match"; }; AbstractChosen.prototype.mouse_enter = function() { @@ -149,10 +165,16 @@ Copyright (c) 2011 by Harvest AbstractChosen.prototype.input_focus = function(evt) { var _this = this; - if (!this.active_field) { - return setTimeout((function() { - return _this.container_mousedown(); - }), 50); + if (this.is_multiple) { + if (!this.active_field) { + return setTimeout((function() { + return _this.container_mousedown(); + }), 50); + } + } else { + if (!this.active_field) { + return this.activate_field(); + } } }; @@ -188,6 +210,9 @@ Copyright (c) 2011 by Harvest }; AbstractChosen.prototype.results_update_field = function() { + if (!this.is_multiple) { + this.results_reset_cleanup(); + } this.result_clear_highlight(); this.result_single_selected = null; return this.results_build(); @@ -254,7 +279,7 @@ Copyright (c) 2011 by Harvest AbstractChosen.prototype.generate_random_char = function() { var chars, newchar, rand; - chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"; + chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; rand = Math.floor(Math.random() * chars.length); return newchar = chars.substring(rand, rand + 1); }; @@ -276,7 +301,7 @@ Copyright (c) 2011 by Harvest (function() { var Chosen, get_side_border_padding, root, __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }; root = this; @@ -284,11 +309,14 @@ Copyright (c) 2011 by Harvest __extends(Chosen, _super); + Chosen.name = 'Chosen'; + function Chosen() { return Chosen.__super__.constructor.apply(this, arguments); } Chosen.prototype.setup = function() { + this.current_value = this.form_field.value; return this.is_rtl = this.form_field.hasClassName("chzn-rtl"); }; @@ -298,22 +326,22 @@ Copyright (c) 2011 by Harvest Chosen.prototype.set_default_values = function() { Chosen.__super__.set_default_values.call(this); - this.single_temp = new Template('#{default} '); + this.single_temp = new Template('#{default}'); this.multi_temp = new Template(''); this.choice_temp = new Template('#{choice} '); + this.choice_noclose_temp = new Template('#{choice} '); return this.no_results_temp = new Template('' + this.results_none_found + ' "#{terms}" '); }; Chosen.prototype.set_up_html = function() { var base_template, container_props, dd_top, dd_width, sf_width; - this.container_id = this.form_field.identify().replace(/(:|\.)/g, '_') + "_chzn"; + this.container_id = this.form_field.identify().replace(/[^\w]/g, '_') + "_chzn"; this.f_width = this.form_field.getStyle("width") ? parseInt(this.form_field.getStyle("width"), 10) : this.form_field.getWidth(); container_props = { 'id': this.container_id, 'class': "chzn-container" + (this.is_rtl ? ' chzn-rtl' : ''), 'style': 'width: ' + this.f_width + 'px' }; - this.default_text = this.form_field.readAttribute('data-placeholder') ? this.form_field.readAttribute('data-placeholder') : this.default_text_default; base_template = this.is_multiple ? new Element('div', container_props).update(this.multi_temp.evaluate({ "default": this.default_text })) : new Element('div', container_props).update(this.single_temp.evaluate({ @@ -379,6 +407,12 @@ Copyright (c) 2011 by Harvest this.form_field.observe("liszt:updated", function(evt) { return _this.results_update_field(evt); }); + this.form_field.observe("liszt:activate", function(evt) { + return _this.activate_field(evt); + }); + this.form_field.observe("liszt:open", function(evt) { + return _this.container_mousedown(evt); + }); this.search_field.observe("blur", function(evt) { return _this.input_blur(evt); }); @@ -388,13 +422,13 @@ Copyright (c) 2011 by Harvest this.search_field.observe("keydown", function(evt) { return _this.keydown_checker(evt); }); + this.search_field.observe("focus", function(evt) { + return _this.input_focus(evt); + }); if (this.is_multiple) { - this.search_choices.observe("click", function(evt) { + return this.search_choices.observe("click", function(evt) { return _this.choices_click(evt); }); - return this.search_field.observe("focus", function(evt) { - return _this.input_focus(evt); - }); } else { return this.container.observe("click", function(evt) { return evt.preventDefault(); @@ -445,7 +479,7 @@ Copyright (c) 2011 by Harvest }; Chosen.prototype.container_mouseup = function(evt) { - if (evt.target.nodeName === "ABBR") { + if (evt.target.nodeName === "ABBR" && !this.is_disabled) { return this.results_reset(evt); } }; @@ -458,10 +492,6 @@ Copyright (c) 2011 by Harvest Chosen.prototype.close_field = function() { document.stopObserving("click", this.click_test_action); - if (!this.is_multiple) { - this.selected_item.tabIndex = this.search_field.tabIndex; - this.search_field.tabIndex = -1; - } this.active_field = false; this.results_hide(); this.container.removeClassName("chzn-container-active"); @@ -472,10 +502,6 @@ Copyright (c) 2011 by Harvest }; Chosen.prototype.activate_field = function() { - if (!this.is_multiple && !this.active_field) { - this.search_field.tabIndex = this.selected_item.tabIndex; - this.selected_item.tabIndex = -1; - } this.container.addClassName("chzn-container-active"); this.active_field = true; this.search_field.value = this.search_field.value; @@ -498,8 +524,8 @@ Copyright (c) 2011 by Harvest this.search_choices.select("li.search-choice").invoke("remove"); this.choices = 0; } else if (!this.is_multiple) { - this.selected_item.down("span").update(this.default_text); - if (this.form_field.options.length <= this.disable_search_threshold) { + this.selected_item.addClassName("chzn-default").down("span").update(this.default_text); + if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { this.container.addClassName("chzn-container-single-nosearch"); } else { this.container.removeClassName("chzn-container-single-nosearch"); @@ -570,8 +596,16 @@ Copyright (c) 2011 by Harvest if (this.result_single_selected) { this.result_do_highlight(this.result_single_selected); } + } else if (this.max_selected_options <= this.choices) { + this.form_field.fire("liszt:maxselected", { + chosen: this + }); + return false; } dd_top = this.is_multiple ? this.container.getHeight() : this.container.getHeight() - 1; + this.form_field.fire("liszt:showing_dropdown", { + chosen: this + }); this.dropdown.setStyle({ "top": dd_top + "px", "left": 0 @@ -587,6 +621,9 @@ Copyright (c) 2011 by Harvest this.selected_item.removeClassName('chzn-single-with-drop'); } this.result_clear_highlight(); + this.form_field.fire("liszt:hiding_dropdown", { + chosen: this + }); this.dropdown.setStyle({ "left": "-9000px" }); @@ -598,12 +635,7 @@ Copyright (c) 2011 by Harvest if (this.form_field.tabIndex) { ti = this.form_field.tabIndex; this.form_field.tabIndex = -1; - if (this.is_multiple) { - return this.search_field.tabIndex = ti; - } else { - this.selected_item.tabIndex = ti; - return this.search_field.tabIndex = -1; - } + return this.search_field.tabIndex = ti; } }; @@ -622,7 +654,8 @@ Copyright (c) 2011 by Harvest target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result"); if (target) { this.result_highlight = target; - return this.result_select(evt); + this.result_select(evt); + return this.search_field.focus(); } }; @@ -650,19 +683,27 @@ Copyright (c) 2011 by Harvest Chosen.prototype.choice_build = function(item) { var choice_id, link, _this = this; + if (this.is_multiple && this.max_selected_options <= this.choices) { + this.form_field.fire("liszt:maxselected", { + chosen: this + }); + return false; + } choice_id = this.container_id + "_c_" + item.array_index; this.choices += 1; this.search_container.insert({ - before: this.choice_temp.evaluate({ + before: (item.disabled ? this.choice_noclose_temp : this.choice_temp).evaluate({ id: choice_id, choice: item.html, position: item.array_index }) }); - link = $(choice_id).down('a'); - return link.observe("click", function(evt) { - return _this.choice_destroy_link_click(evt); - }); + if (!item.disabled) { + link = $(choice_id).down('a'); + return link.observe("click", function(evt) { + return _this.choice_destroy_link_click(evt); + }); + } }; Chosen.prototype.choice_destroy_link_click = function(evt) { @@ -674,23 +715,24 @@ Copyright (c) 2011 by Harvest }; Chosen.prototype.choice_destroy = function(link) { - this.choices -= 1; - this.show_search_field_default(); - if (this.is_multiple && this.choices > 0 && this.search_field.value.length < 1) { - this.results_hide(); + if (this.result_deselect(link.readAttribute("rel"))) { + this.choices -= 1; + this.show_search_field_default(); + if (this.is_multiple && this.choices > 0 && this.search_field.value.length < 1) { + this.results_hide(); + } + return link.up('li').remove(); } - this.result_deselect(link.readAttribute("rel")); - return link.up('li').remove(); }; - Chosen.prototype.results_reset = function(evt) { + Chosen.prototype.results_reset = function() { this.form_field.options[0].selected = true; this.selected_item.down("span").update(this.default_text); if (!this.is_multiple) { this.selected_item.addClassName("chzn-default"); } this.show_search_field_default(); - evt.target.remove(); + this.results_reset_cleanup(); if (typeof Event.simulate === 'function') { this.form_field.simulate("change"); } @@ -699,6 +741,15 @@ Copyright (c) 2011 by Harvest } }; + Chosen.prototype.results_reset_cleanup = function() { + var deselect_trigger; + this.current_value = this.form_field.value; + deselect_trigger = this.selected_item.down("abbr"); + if (deselect_trigger) { + return deselect_trigger.remove(); + } + }; + Chosen.prototype.result_select = function(evt) { var high, item, position; if (this.result_highlight) { @@ -728,9 +779,10 @@ Copyright (c) 2011 by Harvest this.results_hide(); } this.search_field.value = ""; - if (typeof Event.simulate === 'function') { + if (typeof Event.simulate === 'function' && (this.is_multiple || this.form_field.value !== this.current_value)) { this.form_field.simulate("change"); } + this.current_value = this.form_field.value; return this.search_field_scale(); } }; @@ -746,16 +798,21 @@ Copyright (c) 2011 by Harvest Chosen.prototype.result_deselect = function(pos) { var result, result_data; result_data = this.results_data[pos]; - result_data.selected = false; - this.form_field.options[result_data.options_index].selected = false; - result = $(this.container_id + "_o_" + pos); - result.removeClassName("result-selected").addClassName("active-result").show(); - this.result_clear_highlight(); - this.winnow_results(); - if (typeof Event.simulate === 'function') { - this.form_field.simulate("change"); + if (!this.form_field.options[result_data.options_index].disabled) { + result_data.selected = false; + this.form_field.options[result_data.options_index].selected = false; + result = $(this.container_id + "_o_" + pos); + result.removeClassName("result-selected").addClassName("active-result").show(); + this.result_clear_highlight(); + this.winnow_results(); + if (typeof Event.simulate === 'function') { + this.form_field.simulate("change"); + } + this.search_field_scale(); + return true; + } else { + return false; } - return this.search_field_scale(); }; Chosen.prototype.single_deselect_control_build = function() { @@ -919,12 +976,23 @@ Copyright (c) 2011 by Harvest }; Chosen.prototype.keydown_backstroke = function() { + var next_available_destroy; if (this.pending_backstroke) { this.choice_destroy(this.pending_backstroke.down("a")); return this.clear_backstroke(); } else { - this.pending_backstroke = this.search_container.siblings("li.search-choice").last(); - return this.pending_backstroke.addClassName("search-choice-focus"); + next_available_destroy = this.search_container.siblings().last(); + if (next_available_destroy && next_available_destroy.hasClassName("search-choice") && !next_available_destroy.hasClassName("search-choice-disabled")) { + this.pending_backstroke = next_available_destroy; + if (this.pending_backstroke) { + this.pending_backstroke.addClassName("search-choice-focus"); + } + if (this.single_backstroke_delete) { + return this.keydown_backstroke(); + } else { + return this.pending_backstroke.addClassName("search-choice-focus"); + } + } } }; diff --git a/admin/thirdparty/chosen/chosen/chosen.proto.min.js b/admin/thirdparty/chosen/chosen/chosen.proto.min.js index 34967e396..c244f165a 100644 --- a/admin/thirdparty/chosen/chosen/chosen.proto.min.js +++ b/admin/thirdparty/chosen/chosen/chosen.proto.min.js @@ -6,7 +6,6 @@ // Copyright (c) 2011 Harvest http://getharvest.com // MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md - -// based on version 0.9.8, applied a very simple patch that fix percentaage width support on select tag +// based on version 0.9.8, applied a very simple patch that fixes percentage width support on select tag, and enables rise-up functionality // This file is generated by `cake build`, do not edit it by hand. -(function(){var e;e=function(){function e(){this.options_index=0,this.parsed=[]}return e.prototype.add_node=function(e){return e.nodeName==="OPTGROUP"?this.add_group(e):this.add_option(e)},e.prototype.add_group=function(e){var t,n,r,i,s,o;t=this.parsed.length,this.parsed.push({array_index:t,group:!0,label:e.label,children:0,disabled:e.disabled}),s=e.childNodes,o=[];for(r=0,i=s.length;r"+e.html+"")},e.prototype.results_update_field=function(){return this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},e.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},e.prototype.results_search=function(e){return this.results_showing?this.winnow_results():this.results_show()},e.prototype.keyup_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale();switch(t){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:e.preventDefault();if(this.results_showing)return this.result_select(e);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},e.prototype.generate_field_id=function(){var e;return e=this.generate_random_id(),this.form_field.id=e,e},e.prototype.generate_random_char=function(){var e,t,n;return e="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ",n=Math.floor(Math.random()*e.length),t=e.substring(n,n+1)},e}(),t.AbstractChosen=e}.call(this),function(){var e,t,n,r={}.hasOwnProperty,i=function(e,t){function i(){this.constructor=e}for(var n in t)r.call(t,n)&&(e[n]=t[n]);return i.prototype=t.prototype,e.prototype=new i,e.__super__=t.prototype,e};n=this,e=function(e){function r(){return r.__super__.constructor.apply(this,arguments)}return i(r,e),r.prototype.setup=function(){return this.is_rtl=this.form_field.hasClassName("chzn-rtl")},r.prototype.finish_setup=function(){return this.form_field.addClassName("chzn-done")},r.prototype.set_default_values=function(){return r.__super__.set_default_values.call(this),this.single_temp=new Template('#{default}'),this.multi_temp=new Template(''),this.choice_temp=new Template('#{choice} '),this.no_results_temp=new Template(''+this.results_none_found+' "#{terms}" ')},r.prototype.set_up_html=function(){var e,n,r,i,s;return this.container_id=this.form_field.identify().replace(/(:|\.)/g,"_")+"_chzn",this.f_width=this.form_field.getStyle("width")?parseInt(this.form_field.getStyle("width"),10):this.form_field.getWidth(),n={id:this.container_id,"class":"chzn-container"+(this.is_rtl?" chzn-rtl":""),style:"width: "+this.f_width+"px"},this.default_text=this.form_field.readAttribute("data-placeholder")?this.form_field.readAttribute("data-placeholder"):this.default_text_default,e=this.is_multiple?(new Element("div",n)).update(this.multi_temp.evaluate({"default":this.default_text})):(new Element("div",n)).update(this.single_temp.evaluate({"default":this.default_text})),this.form_field.hide().insert({after:e}),this.container=$(this.container_id),this.container.addClassName("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.down("div.chzn-drop"),r=this.container.getHeight(),i=this.f_width-t(this.dropdown),this.dropdown.setStyle({width:i+"px",top:r+"px"}),this.search_field=this.container.down("input"),this.search_results=this.container.down("ul.chzn-results"),this.search_field_scale(),this.search_no_results=this.container.down("li.no-results"),this.is_multiple?(this.search_choices=this.container.down("ul.chzn-choices"),this.search_container=this.container.down("li.search-field")):(this.search_container=this.container.down("div.chzn-search"),this.selected_item=this.container.down(".chzn-single"),s=i-t(this.search_container)-t(this.search_field),this.search_field.setStyle({width:s+"px"})),this.results_build(),this.set_tab_index(),this.form_field.fire("liszt:ready",{chosen:this})},r.prototype.register_observers=function(){var e=this;return this.container.observe("mousedown",function(t){return e.container_mousedown(t)}),this.container.observe("mouseup",function(t){return e.container_mouseup(t)}),this.container.observe("mouseenter",function(t){return e.mouse_enter(t)}),this.container.observe("mouseleave",function(t){return e.mouse_leave(t)}),this.search_results.observe("mouseup",function(t){return e.search_results_mouseup(t)}),this.search_results.observe("mouseover",function(t){return e.search_results_mouseover(t)}),this.search_results.observe("mouseout",function(t){return e.search_results_mouseout(t)}),this.form_field.observe("liszt:updated",function(t){return e.results_update_field(t)}),this.search_field.observe("blur",function(t){return e.input_blur(t)}),this.search_field.observe("keyup",function(t){return e.keyup_checker(t)}),this.search_field.observe("keydown",function(t){return e.keydown_checker(t)}),this.is_multiple?(this.search_choices.observe("click",function(t){return e.choices_click(t)}),this.search_field.observe("focus",function(t){return e.input_focus(t)})):this.container.observe("click",function(e){return e.preventDefault()})},r.prototype.search_field_disabled=function(){this.is_disabled=this.form_field.disabled;if(this.is_disabled)return this.container.addClassName("chzn-disabled"),this.search_field.disabled=!0,this.is_multiple||this.selected_item.stopObserving("focus",this.activate_action),this.close_field();this.container.removeClassName("chzn-disabled"),this.search_field.disabled=!1;if(!this.is_multiple)return this.selected_item.observe("focus",this.activate_action)},r.prototype.container_mousedown=function(e){var t;if(!this.is_disabled)return t=e!=null?e.target.hasClassName("search-choice-close"):!1,e&&e.type==="mousedown"&&!this.results_showing&&e.stop(),!this.pending_destroy_click&&!t?(this.active_field?!this.is_multiple&&e&&(e.target===this.selected_item||e.target.up("a.chzn-single"))&&this.results_toggle():(this.is_multiple&&this.search_field.clear(),document.observe("click",this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},r.prototype.container_mouseup=function(e){if(e.target.nodeName==="ABBR")return this.results_reset(e)},r.prototype.blur_test=function(e){if(!this.active_field&&this.container.hasClassName("chzn-container-active"))return this.close_field()},r.prototype.close_field=function(){return document.stopObserving("click",this.click_test_action),this.is_multiple||(this.selected_item.tabIndex=this.search_field.tabIndex,this.search_field.tabIndex=-1),this.active_field=!1,this.results_hide(),this.container.removeClassName("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},r.prototype.activate_field=function(){return!this.is_multiple&&!this.active_field&&(this.search_field.tabIndex=this.selected_item.tabIndex,this.selected_item.tabIndex=-1),this.container.addClassName("chzn-container-active"),this.active_field=!0,this.search_field.value=this.search_field.value,this.search_field.focus()},r.prototype.test_active_click=function(e){return e.target.up("#"+this.container_id)?this.active_field=!0:this.close_field()},r.prototype.results_build=function(){var e,t,r,i,s;this.parsing=!0,this.results_data=n.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.select("li.search-choice").invoke("remove"),this.choices=0):this.is_multiple||(this.selected_item.down("span").update(this.default_text),this.form_field.options.length<=this.disable_search_threshold?this.container.addClassName("chzn-container-single-nosearch"):this.container.removeClassName("chzn-container-single-nosearch")),e="",s=this.results_data;for(r=0,i=s.length;r'+e.label.escapeHTML()+"")},r.prototype.result_do_highlight=function(e){var t,n,r,i,s;this.result_clear_highlight(),this.result_highlight=e,this.result_highlight.addClassName("highlighted"),r=parseInt(this.search_results.getStyle("maxHeight"),10),s=this.search_results.scrollTop,i=r+s,n=this.result_highlight.positionedOffset().top,t=n+this.result_highlight.getHeight();if(t>=i)return this.search_results.scrollTop=t-r>0?t-r:0;if(n0&&this.search_field.value.length<1&&this.results_hide(),this.result_deselect(e.readAttribute("rel")),e.up("li").remove()},r.prototype.results_reset=function(e){this.form_field.options[0].selected=!0,this.selected_item.down("span").update(this.default_text),this.is_multiple||this.selected_item.addClassName("chzn-default"),this.show_search_field_default(),e.target.remove(),typeof Event.simulate=="function"&&this.form_field.simulate("change");if(this.active_field)return this.results_hide()},r.prototype.result_select=function(e){var t,n,r;if(this.result_highlight)return t=this.result_highlight,this.result_clear_highlight(),this.is_multiple?this.result_deactivate(t):(this.search_results.descendants(".result-selected").invoke("removeClassName","result-selected"),this.selected_item.removeClassName("chzn-default"),this.result_single_selected=t),t.addClassName("result-selected"),r=t.id.substr(t.id.lastIndexOf("_")+1),n=this.results_data[r],n.selected=!0,this.form_field.options[n.options_index].selected=!0,this.is_multiple?this.choice_build(n):(this.selected_item.down("span").update(n.html),this.allow_single_deselect&&this.single_deselect_control_build()),(!e.metaKey||!this.is_multiple)&&this.results_hide(),this.search_field.value="",typeof Event.simulate=="function"&&this.form_field.simulate("change"),this.search_field_scale()},r.prototype.result_activate=function(e){return e.addClassName("active-result")},r.prototype.result_deactivate=function(e){return e.removeClassName("active-result")},r.prototype.result_deselect=function(e){var t,n;return n=this.results_data[e],n.selected=!1,this.form_field.options[n.options_index].selected=!1,t=$(this.container_id+"_o_"+e),t.removeClassName("result-selected").addClassName("active-result").show(),this.result_clear_highlight(),this.winnow_results(),typeof Event.simulate=="function"&&this.form_field.simulate("change"),this.search_field_scale()},r.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&!this.selected_item.down("abbr"))return this.selected_item.down("span").insert({after:''})},r.prototype.winnow_results=function(){var e,t,n,r,i,s,o,u,a,f,l,c,h,p,d,v,m;this.no_results_clear(),u=0,a=this.search_field.value===this.default_text?"":this.search_field.value.strip().escapeHTML(),s=this.search_contains?"":"^",i=new RegExp(s+a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),c=new RegExp(a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),m=this.results_data;for(h=0,d=m.length;h=0||t.html.indexOf("[")===0){r=t.html.replace(/\[|\]/g,"").split(" ");if(r.length)for(p=0,v=r.length;p "+t.html.substr(f+a.length),l=l.substr(0,f)+""+l.substr(f)):l=t.html,$(o).innerHTML!==l&&$(o).update(l),this.result_activate($(o)),t.group_array_index!=null&&$(this.results_data[t.group_array_index].dom_id).setStyle({display:"list-item"})):($(o)===this.result_highlight&&this.result_clear_highlight(),this.result_deactivate($(o)))}}return u<1&&a.length?this.no_results(a):this.winnow_results_set_highlight()},r.prototype.winnow_results_clear=function(){var e,t,n,r,i;this.search_field.clear(),t=this.search_results.select("li"),i=[];for(n=0,r=t.length;n 0&&this.results_hide(),this.result_clear_highlight())},r.prototype.keydown_backstroke=function(){return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.down("a")),this.clear_backstroke()):(this.pending_backstroke=this.search_container.siblings("li.search-choice").last(),this.pending_backstroke.addClassName("search-choice-focus"))},r.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClassName("search-choice-focus"),this.pending_backstroke=null},r.prototype.keydown_checker=function(e){var t,n;t=(n=e.which)!=null?n:e.keyCode,this.search_field_scale(),t!==8&&this.pending_backstroke&&this.clear_backstroke();switch(t){case 8:this.backstroke_length=this.search_field.value.length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(e),this.mouse_on_container=!1;break;case 13:e.preventDefault();break;case 38:e.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},r.prototype.search_field_scale=function(){var e,t,n,r,i,s,o,u,a;if(this.is_multiple){n=0,o=0,i="position:absolute; left: -1000px; top: -1000px; display:none;",s=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(u=0,a=s.length;uthis.f_width-10&&(o=this.f_width-10),this.search_field.setStyle({width:o+"px"}),e=this.container.getHeight(),this.dropdown.setStyle({top:e+"px"})}},r}(AbstractChosen),n.Chosen=e,Prototype.Browser.IE&&/MSIE (\d+\.\d+);/.test(navigator.userAgent)&&(Prototype.BrowserFeatures.Version=new Number(RegExp.$1)),t=function(e){var t,n;return t=new Element.Layout(e),n=t.get("border-left")+t.get("border-right")+t.get("padding-left")+t.get("padding-right")},n.get_side_border_padding=t}.call(this); \ No newline at end of file +(function(){var a;a=function(){function a(){this.options_index=0,this.parsed=[]}return a.name="SelectParser",a.prototype.add_node=function(a){return a.nodeName.toUpperCase()==="OPTGROUP"?this.add_group(a):this.add_option(a)},a.prototype.add_group=function(a){var b,c,d,e,f,g;b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:a.label,children:0,disabled:a.disabled}),f=a.childNodes,g=[];for(d=0,e=f.length;d "+a.html+"")},a.prototype.results_update_field=function(){return this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},a.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},a.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},a.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:a.preventDefault();if(this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},a.prototype.generate_field_id=function(){var a;return a=this.generate_random_id(),this.form_field.id=a,a},a.prototype.generate_random_char=function(){var a,b,c;return a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",c=Math.floor(Math.random()*a.length),b=a.substring(c,c+1)},a}(),b.AbstractChosen=a}.call(this),function(){var a,b,c,d={}.hasOwnProperty,e=function(a,b){function e(){this.constructor=a}for(var c in b)d.call(b,c)&&(a[c]=b[c]);return e.prototype=b.prototype,a.prototype=new e,a.__super__=b.prototype,a};c=this,a=function(a){function d(){return d.__super__.constructor.apply(this,arguments)}return e(d,a),d.name="Chosen",d.prototype.setup=function(){return this.current_value=this.form_field.value,this.is_rtl=this.form_field.hasClassName("chzn-rtl")},d.prototype.finish_setup=function(){return this.form_field.addClassName("chzn-done")},d.prototype.set_default_values=function(){return d.__super__.set_default_values.call(this),this.single_temp=new Template('#{default} '),this.multi_temp=new Template(''),this.choice_temp=new Template('#{choice} '),this.choice_noclose_temp=new Template('#{choice} '),this.no_results_temp=new Template(''+this.results_none_found+' "#{terms}" ')},d.prototype.set_up_html=function(){var a,c,d,e,f;return this.container_id=this.form_field.identify().replace(/[^\w]/g,"_")+"_chzn",this.f_width=this.form_field.getStyle("width")?parseInt(this.form_field.getStyle("width"),10):this.form_field.getWidth(),c={id:this.container_id,"class":"chzn-container"+(this.is_rtl?" chzn-rtl":""),style:"width: "+this.f_width+"px"},a=this.is_multiple?(new Element("div",c)).update(this.multi_temp.evaluate({"default":this.default_text})):(new Element("div",c)).update(this.single_temp.evaluate({"default":this.default_text})),this.form_field.hide().insert({after:a}),this.container=$(this.container_id),this.container.addClassName("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.down("div.chzn-drop"),d=this.container.getHeight(),e=this.f_width-b(this.dropdown),this.dropdown.setStyle({width:e+"px",top:d+"px"}),this.search_field=this.container.down("input"),this.search_results=this.container.down("ul.chzn-results"),this.search_field_scale(),this.search_no_results=this.container.down("li.no-results"),this.is_multiple?(this.search_choices=this.container.down("ul.chzn-choices"),this.search_container=this.container.down("li.search-field")):(this.search_container=this.container.down("div.chzn-search"),this.selected_item=this.container.down(".chzn-single"),f=e-b(this.search_container)-b(this.search_field),this.search_field.setStyle({width:f+"px"})),this.results_build(),this.set_tab_index(),this.form_field.fire("liszt:ready",{chosen:this})},d.prototype.register_observers=function(){var a=this;return this.container.observe("mousedown",function(b){return a.container_mousedown(b)}),this.container.observe("mouseup",function(b){return a.container_mouseup(b)}),this.container.observe("mouseenter",function(b){return a.mouse_enter(b)}),this.container.observe("mouseleave",function(b){return a.mouse_leave(b)}),this.search_results.observe("mouseup",function(b){return a.search_results_mouseup(b)}),this.search_results.observe("mouseover",function(b){return a.search_results_mouseover(b)}),this.search_results.observe("mouseout",function(b){return a.search_results_mouseout(b)}),this.form_field.observe("liszt:updated",function(b){return a.results_update_field(b)}),this.form_field.observe("liszt:activate",function(b){return a.activate_field(b)}),this.form_field.observe("liszt:open",function(b){return a.container_mousedown(b)}),this.search_field.observe("blur",function(b){return a.input_blur(b)}),this.search_field.observe("keyup",function(b){return a.keyup_checker(b)}),this.search_field.observe("keydown",function(b){return a.keydown_checker(b)}),this.search_field.observe("focus",function(b){return a.input_focus(b)}),this.is_multiple?this.search_choices.observe("click",function(b){return a.choices_click(b)}):this.container.observe("click",function(a){return a.preventDefault()})},d.prototype.search_field_disabled=function(){this.is_disabled=this.form_field.disabled;if(this.is_disabled)return this.container.addClassName("chzn-disabled"),this.search_field.disabled=!0,this.is_multiple||this.selected_item.stopObserving("focus",this.activate_action),this.close_field();this.container.removeClassName("chzn-disabled"),this.search_field.disabled=!1;if(!this.is_multiple)return this.selected_item.observe("focus",this.activate_action)},d.prototype.container_mousedown=function(a){var b;if(!this.is_disabled)return b=a!=null?a.target.hasClassName("search-choice-close"):!1,a&&a.type==="mousedown"&&!this.results_showing&&a.stop(),!this.pending_destroy_click&&!b?(this.active_field?!this.is_multiple&&a&&(a.target===this.selected_item||a.target.up("a.chzn-single"))&&this.results_toggle():(this.is_multiple&&this.search_field.clear(),document.observe("click",this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},d.prototype.container_mouseup=function(a){if(a.target.nodeName==="ABBR"&&!this.is_disabled)return this.results_reset(a)},d.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClassName("chzn-container-active"))return this.close_field()},d.prototype.close_field=function(){return document.stopObserving("click",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClassName("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},d.prototype.activate_field=function(){return this.container.addClassName("chzn-container-active"),this.active_field=!0,this.search_field.value=this.search_field.value,this.search_field.focus()},d.prototype.test_active_click=function(a){return a.target.up("#"+this.container_id)?this.active_field=!0:this.close_field()},d.prototype.results_build=function(){var a,b,d,e,f;this.parsing=!0,this.results_data=c.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.select("li.search-choice").invoke("remove"),this.choices=0):this.is_multiple||(this.selected_item.addClassName("chzn-default").down("span").update(this.default_text),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?this.container.addClassName("chzn-container-single-nosearch"):this.container.removeClassName("chzn-container-single-nosearch")),a="",f=this.results_data;for(d=0,e=f.length;d'+a.label.escapeHTML()+"")},d.prototype.result_do_highlight=function(a){var b,c,d,e,f;this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClassName("highlighted"),d=parseInt(this.search_results.getStyle("maxHeight"),10),f=this.search_results.scrollTop,e=d+f,c=this.result_highlight.positionedOffset().top,b=c+this.result_highlight.getHeight();if(b>=e)return this.search_results.scrollTop=b-d>0?b-d:0;if(c 0&&this.search_field.value.length<1&&this.results_hide(),a.up("li").remove()},d.prototype.results_reset=function(){this.form_field.options[0].selected=!0,this.selected_item.down("span").update(this.default_text),this.is_multiple||this.selected_item.addClassName("chzn-default"),this.show_search_field_default(),this.results_reset_cleanup(),typeof Event.simulate=="function"&&this.form_field.simulate("change");if(this.active_field)return this.results_hide()},d.prototype.results_reset_cleanup=function(){var a;this.current_value=this.form_field.value,a=this.selected_item.down("abbr");if(a)return a.remove()},d.prototype.result_select=function(a){var b,c,d;if(this.result_highlight)return b=this.result_highlight,this.result_clear_highlight(),this.is_multiple?this.result_deactivate(b):(this.search_results.descendants(".result-selected").invoke("removeClassName","result-selected"),this.selected_item.removeClassName("chzn-default"),this.result_single_selected=b),b.addClassName("result-selected"),d=b.id.substr(b.id.lastIndexOf("_")+1),c=this.results_data[d],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.is_multiple?this.choice_build(c):(this.selected_item.down("span").update(c.html),this.allow_single_deselect&&this.single_deselect_control_build()),(!a.metaKey||!this.is_multiple)&&this.results_hide(),this.search_field.value="",typeof Event.simulate=="function"&&(this.is_multiple||this.form_field.value!==this.current_value)&&this.form_field.simulate("change"),this.current_value=this.form_field.value,this.search_field_scale()},d.prototype.result_activate=function(a){return a.addClassName("active-result")},d.prototype.result_deactivate=function(a){return a.removeClassName("active-result")},d.prototype.result_deselect=function(a){var b,c;return c=this.results_data[a],this.form_field.options[c.options_index].disabled?!1:(c.selected=!1,this.form_field.options[c.options_index].selected=!1,b=$(this.container_id+"_o_"+a),b.removeClassName("result-selected").addClassName("active-result").show(),this.result_clear_highlight(),this.winnow_results(),typeof Event.simulate=="function"&&this.form_field.simulate("change"),this.search_field_scale(),!0)},d.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&!this.selected_item.down("abbr"))return this.selected_item.down("span").insert({after:''})},d.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;this.no_results_clear(),h=0,i=this.search_field.value===this.default_text?"":this.search_field.value.strip().escapeHTML(),f=this.search_contains?"":"^",e=new RegExp(f+i.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),l=new RegExp(i.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),q=this.results_data;for(m=0,o=q.length;m =0||b.html.indexOf("[")===0){d=b.html.replace(/\[|\]/g,"").split(" ");if(d.length)for(n=0,p=d.length;n "+b.html.substr(j+i.length),k=k.substr(0,j)+""+k.substr(j)):k=b.html,$(g).innerHTML!==k&&$(g).update(k),this.result_activate($(g)),b.group_array_index!=null&&$(this.results_data[b.group_array_index].dom_id).setStyle({display:"list-item"})):($(g)===this.result_highlight&&this.result_clear_highlight(),this.result_deactivate($(g)))}}return h<1&&i.length?this.no_results(i):this.winnow_results_set_highlight()},d.prototype.winnow_results_clear=function(){var a,b,c,d,e;this.search_field.clear(),b=this.search_results.select("li"),e=[];for(c=0,d=b.length;c
0&&this.results_hide(),this.result_clear_highlight())},d.prototype.keydown_backstroke=function(){var a;if(this.pending_backstroke)return this.choice_destroy(this.pending_backstroke.down("a")),this.clear_backstroke();a=this.search_container.siblings().last();if(a&&a.hasClassName("search-choice")&&!a.hasClassName("search-choice-disabled"))return this.pending_backstroke=a,this.pending_backstroke&&this.pending_backstroke.addClassName("search-choice-focus"),this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClassName("search-choice-focus")},d.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClassName("search-choice-focus"),this.pending_backstroke=null},d.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:this.backstroke_length=this.search_field.value.length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},d.prototype.search_field_scale=function(){var a,b,c,d,e,f,g,h,i;if(this.is_multiple){c=0,g=0,e="position:absolute; left: -1000px; top: -1000px; display:none;",f=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(h=0,i=f.length;hthis.f_width-10&&(g=this.f_width-10),this.search_field.setStyle({width:g+"px"}),a=this.container.getHeight(),this.dropdown.setStyle({top:a+"px"})}},d}(AbstractChosen),c.Chosen=a,Prototype.Browser.IE&&/MSIE (\d+\.\d+);/.test(navigator.userAgent)&&(Prototype.BrowserFeatures.Version=new Number(RegExp.$1)),b=function(a){var b,c;return b=new Element.Layout(a),c=b.get("border-left")+b.get("border-right")+b.get("padding-left")+b.get("padding-right")},c.get_side_border_padding=b}.call(this); \ No newline at end of file diff --git a/admin/thirdparty/chosen/coffee/chosen.jquery.coffee b/admin/thirdparty/chosen/coffee/chosen.jquery.coffee index 7f89539c4..264da6cdb 100644 --- a/admin/thirdparty/chosen/coffee/chosen.jquery.coffee +++ b/admin/thirdparty/chosen/coffee/chosen.jquery.coffee @@ -9,7 +9,8 @@ $.fn.extend({ chosen: (options) -> # Do no harm and return as soon as possible for unsupported browsers, namely IE6 and IE7 - return this if $.browser.msie and ($.browser.version is "6.0" or $.browser.version is "7.0") + # Continue on if running IE document type but in compatibility mode + return this if $.browser.msie and ($.browser.version is "6.0" or ($.browser.version is "7.0" and document.documentMode is 7 )) this.each((input_field) -> $this = $ this $this.data('chosen', new Chosen(this, options)) unless $this.hasClass "chzn-done" @@ -20,6 +21,7 @@ class Chosen extends AbstractChosen setup: -> @form_field_jq = $ @form_field + @current_value = @form_field_jq.val() @is_rtl = @form_field_jq.hasClass "chzn-rtl" finish_setup: -> @@ -45,7 +47,7 @@ class Chosen extends AbstractChosen if @is_multiple container_div.html ' ' else - container_div.html '' + this.default_text + '' + container_div.html '' + @default_text + '' @form_field_jq.hide().after container_div @container = ($ '#' + @container_id) @@ -94,16 +96,19 @@ class Chosen extends AbstractChosen @search_results.mouseout (evt) => this.search_results_mouseout(evt) @form_field_jq.bind "liszt:updated", (evt) => this.results_update_field(evt) + @form_field_jq.bind "liszt:activate", (evt) => this.activate_field(evt) + @form_field_jq.bind "liszt:open", (evt) => this.container_mousedown(evt) @search_field.blur (evt) => this.input_blur(evt) @search_field.keyup (evt) => this.keyup_checker(evt) @search_field.keydown (evt) => this.keydown_checker(evt) + @search_field.focus (evt) => this.input_focus(evt) if @is_multiple @search_choices.click (evt) => this.choices_click(evt) - @search_field.focus (evt) => this.input_focus(evt) else @container.click (evt) => evt.preventDefault() # gobble click of anchor + search_field_disabled: -> @is_disabled = @form_field_jq[0].disabled @@ -136,7 +141,7 @@ class Chosen extends AbstractChosen @pending_destroy_click = false container_mouseup: (evt) -> - this.results_reset(evt) if evt.target.nodeName is "ABBR" + this.results_reset(evt) if evt.target.nodeName is "ABBR" and not @is_disabled blur_test: (evt) -> this.close_field() if not @active_field and @container.hasClass "chzn-container-active" @@ -159,10 +164,6 @@ class Chosen extends AbstractChosen this.search_field_scale() activate_field: -> - if not @is_multiple and not @active_field - @search_field.attr "tabindex", (@selected_item.attr "tabindex") - @selected_item.attr "tabindex", -1 - @container.addClass "chzn-container-active" @active_field = true @@ -185,8 +186,8 @@ class Chosen extends AbstractChosen @search_choices.find("li.search-choice").remove() @choices = 0 else if not @is_multiple - @selected_item.find("span").text @default_text - if @form_field.options.length <= @disable_search_threshold + @selected_item.addClass("chzn-default").find("span").text(@default_text) + if @disable_search or @form_field.options.length <= @disable_search_threshold @container.addClass "chzn-container-single-nosearch" else @container.removeClass "chzn-container-single-nosearch" @@ -246,15 +247,18 @@ class Chosen extends AbstractChosen if @result_single_selected this.result_do_highlight( @result_single_selected ) + #patch applied: https://github.com/harvesthq/chosen/issues/300, add variable assignment dd_width + dd_width = this.container.width() - get_side_border_padding(@dropdown); + + ### CALL CUSTOM FUNCTION: rise_up # if rise-up true, reverse drop-up direction ### rise = @rise_up(@container, @dropdown) dd_top = if rise then -this.container.find('.chzn-drop').height() else if @is_multiple then @container.height() else (@container.height() - 1) - - #patch applied: https://github.com/harvesthq/chosen/issues/300, add variable assignment dd_width - dd_width = this.container.width() - get_side_border_padding(@dropdown); + + @form_field_jq.trigger("liszt:showing_dropdown", {chosen: this}) @dropdown.css {"top": dd_top + "px", "left":0} @results_showing = true @@ -270,6 +274,7 @@ class Chosen extends AbstractChosen results_hide: -> @selected_item.removeClass "chzn-single-with-drop" unless @is_multiple this.result_clear_highlight() + @form_field_jq.trigger("liszt:hiding_dropdown", {chosen: this}) @dropdown.css {"left":"-9000px"} @results_showing = false @@ -278,12 +283,7 @@ class Chosen extends AbstractChosen if @form_field_jq.attr "tabindex" ti = @form_field_jq.attr "tabindex" @form_field_jq.attr "tabindex", -1 - - if @is_multiple - @search_field.attr "tabindex", ti - else - @selected_item.attr "tabindex", ti - @search_field.attr "tabindex", -1 + @search_field.attr "tabindex", ti show_search_field_default: -> if @is_multiple and @choices < 1 and not @active_field @@ -298,6 +298,7 @@ class Chosen extends AbstractChosen if target.length @result_highlight = target this.result_select(evt) + @search_field.focus() search_results_mouseover: (evt) -> target = if $(evt.target).hasClass "active-result" then $(evt.target) else $(evt.target).parents(".active-result").first() @@ -315,7 +316,11 @@ class Chosen extends AbstractChosen choice_build: (item) -> choice_id = @container_id + "_c_" + item.array_index @choices += 1 - @search_container.before '' + item.html + ' ' + if item.disabled + html = '' + item.html + ' ' + else + html = '' + item.html + ' ' + @search_container.before html link = $('#' + choice_id).find("a").first() link.click (evt) => this.choice_destroy_link_click(evt) @@ -328,22 +333,26 @@ class Chosen extends AbstractChosen evt.stopPropagation choice_destroy: (link) -> - @choices -= 1 - this.show_search_field_default() + if this.result_deselect (link.attr "rel") + @choices -= 1 + this.show_search_field_default() - this.results_hide() if @is_multiple and @choices > 0 and @search_field.val().length < 1 + this.results_hide() if @is_multiple and @choices > 0 and @search_field.val().length < 1 - this.result_deselect (link.attr "rel") - link.parents('li').first().remove() + link.parents('li').first().remove() - results_reset: (evt) -> + results_reset: -> @form_field.options[0].selected = true @selected_item.find("span").text @default_text @selected_item.addClass("chzn-default") if not @is_multiple this.show_search_field_default() - $(evt.target).remove(); + this.results_reset_cleanup() @form_field_jq.trigger "change" this.results_hide() if @active_field + + results_reset_cleanup: -> + @current_value = @form_field_jq.val() + @selected_item.find("abbr").remove() result_select: (evt) -> if @result_highlight @@ -377,7 +386,8 @@ class Chosen extends AbstractChosen @search_field.val "" - @form_field_jq.trigger "change" + @form_field_jq.trigger "change", {'selected': @form_field.options[item.options_index].value} if @is_multiple || @form_field_jq.val() != @current_value + @current_value = @form_field_jq.val() this.search_field_scale() result_activate: (el) -> @@ -388,17 +398,23 @@ class Chosen extends AbstractChosen result_deselect: (pos) -> result_data = @results_data[pos] - result_data.selected = false - @form_field.options[result_data.options_index].selected = false - result = $("#" + @container_id + "_o_" + pos) - result.removeClass("result-selected").addClass("active-result").show() + if not @form_field.options[result_data.options_index].disabled + result_data.selected = false + + @form_field.options[result_data.options_index].selected = false + result = $("#" + @container_id + "_o_" + pos) + result.removeClass("result-selected").addClass("active-result").show() - this.result_clear_highlight() - this.winnow_results() + this.result_clear_highlight() + this.winnow_results() - @form_field_jq.trigger "change" - this.search_field_scale() + @form_field_jq.trigger "change", {deselected: @form_field.options[result_data.options_index].value} + this.search_field_scale() + + return true + else + return false single_deselect_control_build: -> @selected_item.find("span").first().after "" if @allow_single_deselect and @selected_item.find("abbr").length < 1 @@ -509,8 +525,13 @@ class Chosen extends AbstractChosen this.choice_destroy @pending_backstroke.find("a").first() this.clear_backstroke() else - @pending_backstroke = @search_container.siblings("li.search-choice").last() - @pending_backstroke.addClass "search-choice-focus" + next_available_destroy = @search_container.siblings("li.search-choice").last() + if next_available_destroy.length and not next_available_destroy.hasClass("search-choice-disabled") + @pending_backstroke = next_available_destroy + if @single_backstroke_delete + @keydown_backstroke() + else + @pending_backstroke.addClass "search-choice-focus" clear_backstroke: -> @pending_backstroke.removeClass "search-choice-focus" if @pending_backstroke @@ -570,7 +591,7 @@ class Chosen extends AbstractChosen ### rise = @rise_up(@container, @dropdown) dd_top = if rise then -this.container.find('.chzn-drop').height() else @container.height() - + @dropdown.css({"top": dd_top + "px"}) generate_random_id: -> diff --git a/admin/thirdparty/chosen/coffee/chosen.proto.coffee b/admin/thirdparty/chosen/coffee/chosen.proto.coffee index d63d64047..2cfe0fd5e 100644 --- a/admin/thirdparty/chosen/coffee/chosen.proto.coffee +++ b/admin/thirdparty/chosen/coffee/chosen.proto.coffee @@ -7,6 +7,7 @@ root = this class Chosen extends AbstractChosen setup: -> + @current_value = @form_field.value @is_rtl = @form_field.hasClassName "chzn-rtl" finish_setup: -> @@ -16,13 +17,14 @@ class Chosen extends AbstractChosen super() # HTML Templates - @single_temp = new Template('#{default}') + @single_temp = new Template('#{default}') @multi_temp = new Template('') @choice_temp = new Template('#{choice} ') + @choice_noclose_temp = new Template('#{choice} ') @no_results_temp = new Template('' + @results_none_found + ' "#{terms}" ') set_up_html: -> - @container_id = @form_field.identify().replace(/(:|\.)/g, '_') + "_chzn" + @container_id = @form_field.identify().replace(/[^\w]/g, '_') + "_chzn" @f_width = if @form_field.getStyle("width") then parseInt @form_field.getStyle("width"), 10 else @form_field.getWidth() @@ -31,8 +33,6 @@ class Chosen extends AbstractChosen 'class': "chzn-container#{ if @is_rtl then ' chzn-rtl' else '' }" 'style': 'width: ' + (@f_width) + 'px' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter - @default_text = if @form_field.readAttribute 'data-placeholder' then @form_field.readAttribute 'data-placeholder' else @default_text_default - base_template = if @is_multiple then new Element('div', container_props).update( @multi_temp.evaluate({ "default": @default_text}) ) else new Element('div', container_props).update( @single_temp.evaluate({ "default":@default_text }) ) @form_field.hide().insert({ after: base_template }) @@ -75,14 +75,16 @@ class Chosen extends AbstractChosen @search_results.observe "mouseout", (evt) => this.search_results_mouseout(evt) @form_field.observe "liszt:updated", (evt) => this.results_update_field(evt) + @form_field.observe "liszt:activate", (evt) => this.activate_field(evt) + @form_field.observe "liszt:open", (evt) => this.container_mousedown(evt) @search_field.observe "blur", (evt) => this.input_blur(evt) @search_field.observe "keyup", (evt) => this.keyup_checker(evt) @search_field.observe "keydown", (evt) => this.keydown_checker(evt) + @search_field.observe "focus", (evt) => this.input_focus(evt) if @is_multiple @search_choices.observe "click", (evt) => this.choices_click(evt) - @search_field.observe "focus", (evt) => this.input_focus(evt) else @container.observe "click", (evt) => evt.preventDefault() # gobble click of anchor @@ -116,7 +118,7 @@ class Chosen extends AbstractChosen @pending_destroy_click = false container_mouseup: (evt) -> - this.results_reset(evt) if evt.target.nodeName is "ABBR" + this.results_reset(evt) if evt.target.nodeName is "ABBR" and not @is_disabled blur_test: (evt) -> this.close_field() if not @active_field and @container.hasClassName("chzn-container-active") @@ -124,10 +126,6 @@ class Chosen extends AbstractChosen close_field: -> document.stopObserving "click", @click_test_action - if not @is_multiple - @selected_item.tabIndex = @search_field.tabIndex - @search_field.tabIndex = -1 - @active_field = false this.results_hide() @@ -139,17 +137,12 @@ class Chosen extends AbstractChosen this.search_field_scale() activate_field: -> - if not @is_multiple and not @active_field - @search_field.tabIndex = @selected_item.tabIndex - @selected_item.tabIndex = -1 - @container.addClassName "chzn-container-active" @active_field = true @search_field.value = @search_field.value @search_field.focus() - test_active_click: (evt) -> if evt.target.up('#' + @container_id) @active_field = true @@ -164,8 +157,8 @@ class Chosen extends AbstractChosen @search_choices.select("li.search-choice").invoke("remove") @choices = 0 else if not @is_multiple - @selected_item.down("span").update(@default_text) - if @form_field.options.length <= @disable_search_threshold + @selected_item.addClassName("chzn-default").down("span").update(@default_text) + if @disable_search or @form_field.options.length <= @disable_search_threshold @container.addClassName "chzn-container-single-nosearch" else @container.removeClassName "chzn-container-single-nosearch" @@ -224,8 +217,12 @@ class Chosen extends AbstractChosen @selected_item.addClassName('chzn-single-with-drop') if @result_single_selected this.result_do_highlight( @result_single_selected ) + else if @max_selected_options <= @choices + @form_field.fire("liszt:maxselected", {chosen: this}) + return false dd_top = if @is_multiple then @container.getHeight() else (@container.getHeight() - 1) + @form_field.fire("liszt:showing_dropdown", {chosen: this}) @dropdown.setStyle {"top": dd_top + "px", "left":0} @results_showing = true @@ -237,6 +234,7 @@ class Chosen extends AbstractChosen results_hide: -> @selected_item.removeClassName('chzn-single-with-drop') unless @is_multiple this.result_clear_highlight() + @form_field.fire("liszt:hiding_dropdown", {chosen: this}) @dropdown.setStyle({"left":"-9000px"}) @results_showing = false @@ -245,12 +243,7 @@ class Chosen extends AbstractChosen if @form_field.tabIndex ti = @form_field.tabIndex @form_field.tabIndex = -1 - - if @is_multiple - @search_field.tabIndex = ti - else - @selected_item.tabIndex = ti - @search_field.tabIndex = -1 + @search_field.tabIndex = ti show_search_field_default: -> if @is_multiple and @choices < 1 and not @active_field @@ -265,6 +258,7 @@ class Chosen extends AbstractChosen if target @result_highlight = target this.result_select(evt) + @search_field.focus() search_results_mouseover: (evt) -> target = if evt.target.hasClassName("active-result") then evt.target else evt.target.up(".active-result") @@ -280,15 +274,19 @@ class Chosen extends AbstractChosen this.results_show() choice_build: (item) -> + if @is_multiple and @max_selected_options <= @choices + @form_field.fire("liszt:maxselected", {chosen: this}) + return false choice_id = @container_id + "_c_" + item.array_index @choices += 1 @search_container.insert - before: @choice_temp.evaluate + before: (if item.disabled then @choice_noclose_temp else @choice_temp).evaluate id: choice_id choice: item.html position: item.array_index - link = $(choice_id).down('a') - link.observe "click", (evt) => this.choice_destroy_link_click(evt) + if not item.disabled + link = $(choice_id).down('a') + link.observe "click", (evt) => this.choice_destroy_link_click(evt) choice_destroy_link_click: (evt) -> evt.preventDefault() @@ -297,22 +295,27 @@ class Chosen extends AbstractChosen this.choice_destroy evt.target choice_destroy: (link) -> - @choices -= 1 - this.show_search_field_default() + if this.result_deselect link.readAttribute("rel") + @choices -= 1 + this.show_search_field_default() - this.results_hide() if @is_multiple and @choices > 0 and @search_field.value.length < 1 + this.results_hide() if @is_multiple and @choices > 0 and @search_field.value.length < 1 - this.result_deselect link.readAttribute("rel") - link.up('li').remove() + link.up('li').remove() - results_reset: (evt) -> + results_reset: -> @form_field.options[0].selected = true @selected_item.down("span").update(@default_text) @selected_item.addClassName("chzn-default") if not @is_multiple this.show_search_field_default() - evt.target.remove() + this.results_reset_cleanup() @form_field.simulate("change") if typeof Event.simulate is 'function' this.results_hide() if @active_field + + results_reset_cleanup: -> + @current_value = @form_field.value + deselect_trigger = @selected_item.down("abbr") + deselect_trigger.remove() if(deselect_trigger) result_select: (evt) -> if @result_highlight @@ -343,8 +346,10 @@ class Chosen extends AbstractChosen this.results_hide() unless evt.metaKey and @is_multiple @search_field.value = "" - - @form_field.simulate("change") if typeof Event.simulate is 'function' + + @form_field.simulate("change") if typeof Event.simulate is 'function' && (@is_multiple || @form_field.value != @current_value) + @current_value = @form_field.value + this.search_field_scale() result_activate: (el) -> @@ -355,17 +360,22 @@ class Chosen extends AbstractChosen result_deselect: (pos) -> result_data = @results_data[pos] - result_data.selected = false + + if not @form_field.options[result_data.options_index].disabled + result_data.selected = false - @form_field.options[result_data.options_index].selected = false - result = $(@container_id + "_o_" + pos) - result.removeClassName("result-selected").addClassName("active-result").show() + @form_field.options[result_data.options_index].selected = false + result = $(@container_id + "_o_" + pos) + result.removeClassName("result-selected").addClassName("active-result").show() - this.result_clear_highlight() - this.winnow_results() + this.result_clear_highlight() + this.winnow_results() - @form_field.simulate("change") if typeof Event.simulate is 'function' - this.search_field_scale() + @form_field.simulate("change") if typeof Event.simulate is 'function' + this.search_field_scale() + return true + else + return false single_deselect_control_build: -> @selected_item.down("span").insert { after: "" } if @allow_single_deselect and not @selected_item.down("abbr") @@ -481,8 +491,14 @@ class Chosen extends AbstractChosen this.choice_destroy @pending_backstroke.down("a") this.clear_backstroke() else - @pending_backstroke = @search_container.siblings("li.search-choice").last() - @pending_backstroke.addClassName("search-choice-focus") + next_available_destroy = @search_container.siblings().last() + if next_available_destroy and next_available_destroy.hasClassName("search-choice") and not next_available_destroy.hasClassName("search-choice-disabled") + @pending_backstroke = next_available_destroy + @pending_backstroke.addClassName("search-choice-focus") if @pending_backstroke + if @single_backstroke_delete + @keydown_backstroke() + else + @pending_backstroke.addClassName("search-choice-focus") clear_backstroke: -> @pending_backstroke.removeClassName("search-choice-focus") if @pending_backstroke diff --git a/admin/thirdparty/chosen/coffee/lib/abstract-chosen.coffee b/admin/thirdparty/chosen/coffee/lib/abstract-chosen.coffee index dc68b7da9..c05ca541b 100644 --- a/admin/thirdparty/chosen/coffee/lib/abstract-chosen.coffee +++ b/admin/thirdparty/chosen/coffee/lib/abstract-chosen.coffee @@ -10,7 +10,7 @@ class AbstractChosen this.set_default_values() @is_multiple = @form_field.multiple - @default_text_default = if @is_multiple then "Select Some Options" else "Select an Option" + this.set_default_text() this.setup() @@ -29,15 +29,30 @@ class AbstractChosen @result_single_selected = null @allow_single_deselect = if @options.allow_single_deselect? and @form_field.options[0]? and @form_field.options[0].text is "" then @options.allow_single_deselect else false @disable_search_threshold = @options.disable_search_threshold || 0 + @disable_search = @options.disable_search || false @search_contains = @options.search_contains || false @choices = 0 - @results_none_found = @options.no_results_text or "No results match" + @single_backstroke_delete = @options.single_backstroke_delete || false + @max_selected_options = @options.max_selected_options || Infinity + + set_default_text: -> + if @form_field.getAttribute("data-placeholder") + @default_text = @form_field.getAttribute("data-placeholder") + else if @is_multiple + @default_text = @options.placeholder_text_multiple || @options.placeholder_text || "Select Some Options" + else + @default_text = @options.placeholder_text_single || @options.placeholder_text || "Select an Option" + + @results_none_found = @form_field.getAttribute("data-no_results_text") || @options.no_results_text || "No results match" mouse_enter: -> @mouse_on_container = true mouse_leave: -> @mouse_on_container = false input_focus: (evt) -> - setTimeout (=> this.container_mousedown()), 50 unless @active_field + if @is_multiple + setTimeout (=> this.container_mousedown()), 50 unless @active_field + else + @activate_field() unless @active_field input_blur: (evt) -> if not @mouse_on_container @@ -60,6 +75,7 @@ class AbstractChosen "" results_update_field: -> + this.results_reset_cleanup() if not @is_multiple this.result_clear_highlight() @result_single_selected = null this.results_build() @@ -103,7 +119,7 @@ class AbstractChosen new_id generate_random_char: -> - chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ" + chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" rand = Math.floor(Math.random() * chars.length) newchar = chars.substring rand, rand+1 diff --git a/admin/thirdparty/chosen/coffee/lib/select-parser.coffee b/admin/thirdparty/chosen/coffee/lib/select-parser.coffee index 82b6ce1cc..799b58b98 100644 --- a/admin/thirdparty/chosen/coffee/lib/select-parser.coffee +++ b/admin/thirdparty/chosen/coffee/lib/select-parser.coffee @@ -5,7 +5,7 @@ class SelectParser @parsed = [] add_node: (child) -> - if child.nodeName is "OPTGROUP" + if child.nodeName.toUpperCase() is "OPTGROUP" this.add_group child else this.add_option child @@ -21,7 +21,7 @@ class SelectParser this.add_option( option, group_position, group.disabled ) for option in group.childNodes add_option: (option, group_position, group_disabled) -> - if option.nodeName is "OPTION" + if option.nodeName.toUpperCase() is "OPTION" if option.text != "" if group_position? @parsed[group_position].children += 1 diff --git a/admin/thirdparty/chosen/example.jquery.html b/admin/thirdparty/chosen/example.jquery.html index 7d36dcbc2..5ec7c477c 100644 --- a/admin/thirdparty/chosen/example.jquery.html +++ b/admin/thirdparty/chosen/example.jquery.html @@ -1189,7 +1189,7 @@Multiple Select -+++It is also possible to prevent selected options being deselected by also making them disabled.
++++ + + + + + + + + + + +Default Text Support
+ +Chosen automatically sets the default field text ("Choose a country...") by reading the select element's data-placeholder value. If no data-placeholder value is present, it will default to "Select Some Option" or "Select Some Options" depending on whether the select is single or multiple. You can change these elements in the plugin js file as you see fit.
@@ -1217,6 +1235,18 @@ $(".chzn-select").chosen({no_results_text: "No results matched"});Limit Selected Options in Multiselect
++You can easily limit how many options can user select:
++ $(".chzn-select").chosen({max_selected_options: 5}); +
+If you try to select another option with limit reached
+liszt:maxselected
event is triggered:+ $(".chzn-select").bind("liszt:maxselected", function () { ... }); +
+Allow Deselect on Single Selects
@@ -1300,3 +1330,4 @@