[7720] | 1 | /** |
---|
| 2 | * Implementação do widget de input-combobox |
---|
| 3 | */ |
---|
| 4 | |
---|
| 5 | (function( $ ) { |
---|
| 6 | $.widget( "ui.combobox", { |
---|
| 7 | _create: function() { |
---|
| 8 | var self = this, |
---|
| 9 | select = this.element.hide(), |
---|
| 10 | selected = select.children( ":selected" ), |
---|
| 11 | value = selected.val() ? selected.text() : ""; |
---|
| 12 | var input = this.input = $( "<input>" ) |
---|
| 13 | .insertAfter( select ) |
---|
| 14 | .val( value ) |
---|
| 15 | .autocomplete({ |
---|
| 16 | delay: 0, |
---|
| 17 | minLength: 0, |
---|
| 18 | source: function( request, response ) { |
---|
| 19 | var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" ); |
---|
| 20 | response( select.children( "option" ).map(function() { |
---|
| 21 | var text = $( this ).text(); |
---|
| 22 | if ( this.value && ( !request.term || matcher.test(text) ) ) |
---|
| 23 | return { |
---|
| 24 | label: text.replace( |
---|
| 25 | new RegExp( |
---|
| 26 | "(?![^&;]+;)(?!<[^<>]*)(" + |
---|
| 27 | $.ui.autocomplete.escapeRegex(request.term) + |
---|
| 28 | ")(?![^<>]*>)(?![^&;]+;)", "gi" |
---|
| 29 | ), "<strong>$1</strong>" ), |
---|
| 30 | value: text, |
---|
| 31 | option: this |
---|
| 32 | }; |
---|
| 33 | }) ); |
---|
| 34 | }, |
---|
| 35 | select: function( event, ui ) { |
---|
| 36 | ui.item.option.selected = true; |
---|
| 37 | self._trigger( "selected", event, { |
---|
| 38 | item: ui.item.option |
---|
| 39 | }); |
---|
| 40 | }, |
---|
| 41 | change: function( event, ui ) { |
---|
| 42 | if ( !ui.item ) { |
---|
| 43 | var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "$", "i" ), |
---|
| 44 | valid = false; |
---|
| 45 | select.children( "option" ).each(function() { |
---|
| 46 | if ( $( this ).text().match( matcher ) ) { |
---|
| 47 | this.selected = valid = true; |
---|
| 48 | return false; |
---|
| 49 | } |
---|
| 50 | }); |
---|
| 51 | /* |
---|
| 52 | if ( !valid ) { |
---|
| 53 | // remove invalid value, as it didn't match anything |
---|
| 54 | $( this ).val( "" ); |
---|
| 55 | select.val( "" ); |
---|
| 56 | input.data( "autocomplete" ).term = ""; |
---|
| 57 | return false; |
---|
| 58 | } |
---|
| 59 | */ |
---|
| 60 | if ( !valid ) { |
---|
| 61 | if(select.has('option[value="custom"]').length > 0) { |
---|
| 62 | select.find('option:last').val('custom').html($(this).val()).attr('selected', 'selected'); |
---|
| 63 | } else { |
---|
| 64 | select.append(select.find('option:last').clone().val('custom').html($(this).val())); |
---|
| 65 | select.find('option[value="custom"]').attr('selected', 'selected'); |
---|
| 66 | } |
---|
| 67 | } |
---|
| 68 | } |
---|
| 69 | } |
---|
| 70 | }) |
---|
| 71 | .addClass( "ui-widget ui-widget-content ui-corner-left" ); |
---|
| 72 | |
---|
| 73 | input.data( "autocomplete" )._renderItem = function( ul, item ) { |
---|
| 74 | return $( "<li></li>" ) |
---|
| 75 | .data( "item.autocomplete", item ) |
---|
| 76 | .append( "<a>" + item.label + "</a>" ) |
---|
| 77 | .appendTo( ul ); |
---|
| 78 | }; |
---|
| 79 | |
---|
| 80 | this.button = $( "<button type='button'> </button>" ) |
---|
| 81 | .attr( "tabIndex", -1 ) |
---|
| 82 | .attr( "title", "Show All Items" ) |
---|
| 83 | .insertAfter( input ) |
---|
| 84 | .button({ |
---|
| 85 | icons: { |
---|
| 86 | primary: "ui-icon-triangle-1-s" |
---|
| 87 | }, |
---|
| 88 | text: false |
---|
| 89 | }) |
---|
| 90 | .removeClass( "ui-corner-all" ) |
---|
| 91 | .addClass( "ui-corner-right ui-button-icon" ) |
---|
| 92 | .click(function() { |
---|
| 93 | // close if already visible |
---|
| 94 | if ( input.autocomplete( "widget" ).is( ":visible" ) ) { |
---|
| 95 | input.autocomplete( "close" ); |
---|
| 96 | return; |
---|
| 97 | } |
---|
| 98 | |
---|
| 99 | // work around a bug (likely same cause as #5265) |
---|
| 100 | $( this ).blur(); |
---|
| 101 | |
---|
| 102 | // pass empty string as value to search for, displaying all results |
---|
| 103 | input.autocomplete( "search", "" ); |
---|
| 104 | input.focus(); |
---|
| 105 | }); |
---|
| 106 | }, |
---|
| 107 | |
---|
| 108 | destroy: function() { |
---|
| 109 | this.input.remove(); |
---|
| 110 | this.button.remove(); |
---|
| 111 | this.element.show(); |
---|
| 112 | $.Widget.prototype.destroy.call( this ); |
---|
| 113 | } |
---|
| 114 | }); |
---|
| 115 | })( jQuery ); |
---|
| 116 | /** |
---|
| 117 | * #END: Implementação do widget de input-combobox |
---|
| 118 | */ |
---|