├── README.md ├── css └── multisuggest-plugin.css ├── demo.html └── js └── multisuggest-plugin.js /README.md: -------------------------------------------------------------------------------- 1 | Bootstrap Multi-Suggest Typeahead 2 | ================================= 3 | 4 | Extends the default [Bootstrap Typeahead](http://twitter.github.com/bootstrap/javascript.html#typeahead) component to support: 5 | 6 | * __multiple datasources__ 7 | * data from __Backbone.js Collections__, __RESTful services__ (AJAX/JSON), and __static arrays__ 8 | * __dynamic filtering__ 9 | * custom, per-datasource __list formatters__ 10 | * separate __visible & hidden select values__ 11 | * __minimum number of characters__ before a search is performed 12 | 13 | _Brought to you by the friendly folks at [ACT.md](http://act.md)_ 14 | 15 | Live Demo 16 | --------- 17 | 18 | [View the live demo](http://htmlpreview.github.com/?https://github.com/rroppolo/bootstrap-multisuggestplugin/blob/master/demo.html) 19 | 20 | 21 | Installation 22 | ------------ 23 | 24 | 1. Include `multisuggest-plugin.js` 25 | 1. Include `multisuggest-plugin.css` 26 | 1. Enable the multi-suggest typeahead on any text input: 27 | 28 | ```javscript 29 | $('input.foo').multisuggest(options); 30 | ``` 31 | 32 | Options 33 | ------- 34 | 35 | The plugin accepts options as single object argument. Supported options are: 36 | 37 | * __sources__: an array of data sources 38 | * __type__: one of 'backbone.collection', 'url', or 'array' 39 | * __data__: either the Backbone Collection object, URL string, or Array object 40 | * __filter__: function to filter the data by a search query term and return the filtered data (for Collections and Arrays) 41 | * __listFormatter__: function to format the items into HTML as they will appear in the dropdown, e.g. `function(item, term) { ... }` 42 | * __inputFormatter__: function to format the items into text as they will appear in the input field when selected, e.g. `function(item) { ... }` 43 | * __valueAttribute__: function which takes an item from the data set and returns the 'value' to be submitted (stored in a hidden input field), e.g. `function(item) { ... }` 44 | * __headher__: String of text to appear as the heading of the data source in the menu of results 45 | * __queryParam__: When using the `url` type, this field indicates the query parameter used to pass the search string 46 | * __resultsProcessor__: When using the `url` type, a function to process the JSON results returned by the AJAX request, e.g. `function(data) { ... }` 47 | * __maxEntries__: optional maximum number of results to show for this data source 48 | * __link__: optional link HTML to show at the bottom of the menu, e.g. `Enter new item...` 49 | * __linkHandler__: listner function that is invoked when the link is selected 50 | * __loadingIconClass__: CSS class for the loading icon, which is displayed during `url`-type AJAX requests 51 | * __noResultsText__: custom text to display when no search results are found 52 | * __enableDropdownMode__: boolean parameter indicating whether the input can be expanded as a standard dropdown in addition to the typeahead functionality. Dropdown mode will render only static data sources. 53 | * __delay__: optional number of milliseconds to delay typeahead searches 54 | * __minLength__: optional minimum number of characters needed before performing a typeahead search 55 | 56 | See the [live demo](http://htmlpreview.github.com/?https://github.com/rroppolo/bootstrap-multisuggestplugin/blob/master/demo.html) for fully qualified examples. 57 | 58 | Default Value 59 | -------------- 60 | 61 | The plugin accepts a default value from the text input through the value and data-value attributes. 62 | * __value__: the display value, displayed as the selected item in the input field 63 | * __data-value__: the real value to be submitted 64 | 65 | ```html 66 | 67 | ``` 68 | 69 | Contributing 70 | ------------ 71 | 72 | 1. Fork the repository 73 | 1. Create your feature branch, `git checkout -b my-feature` 74 | 1. Commit your changes, `git commit -am 'Description of my new feature'` 75 | 1. Push to the branch, `git push origin my-feature` 76 | 1. Create a new pull request 77 | -------------------------------------------------------------------------------- /css/multisuggest-plugin.css: -------------------------------------------------------------------------------- 1 | input.msuggest-input-dropdown { 2 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAFCAQAAADiFHT/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAAANElEQVR42mJk+M+ABv4zooswoQthKmFgYEIVxqaEgYEJWQq7EqgiiDQuJQwMAAAAAP//AwD8wwoJyWPgpgAAAABJRU5ErkJggg==); 3 | background-repeat: no-repeat; 4 | background-position: right center; 5 | padding-right: 23px; 6 | } 7 | 8 | .msuggest-loading { 9 | height: 60px; 10 | background-image: url(data:image/gif;base64,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); 11 | background-repeat: no-repeat; 12 | background-position: 50% 50%; 13 | } 14 | 15 | input.msuggest-selected { 16 | text-decoration: underline; 17 | } 18 | 19 | .msuggest-header, 20 | .msuggest-link a, 21 | .msuggest-ellip span { 22 | color: #666; 23 | padding:5px 20px; 24 | } 25 | 26 | .msuggest-header { 27 | text-transform: uppercase; 28 | font-size: 12px; 29 | } 30 | 31 | .msuggest-link { 32 | padding-bottom:10px; 33 | } 34 | 35 | .msuggest-link a { 36 | text-decoration: underline; 37 | } 38 | 39 | .input-append .disabled.active, 40 | .input-prepend .disabled.active, 41 | .input-append .msuggest-header.active, 42 | .input-prepend .msuggest-header.active { 43 | background-color: #FFFFFF; 44 | border-color: inherit; 45 | background: none; 46 | } 47 | 48 | .dropdown-menu > li.disabled > a:hover, 49 | .dropdown-menu > li.disabled > a:focus, 50 | .dropdown-menu > .disabled.active > a, 51 | .dropdown-menu > .disabled.active > a:hover, 52 | .dropdown-menu > .disabled.active > a:focus { 53 | background-color: #ffffff; 54 | background: none; 55 | } 56 | 57 | .msuggest-menu img { 58 | margin-right: 3px; 59 | width: 25px; 60 | height: 25px; 61 | } 62 | -------------------------------------------------------------------------------- /demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 |The multiple-datasource typeahead plugin for Twitter Bootstrap.
29 | 30 | 31 | 32 | 33 |Sorry, not a live example. But it works, trust us.
51 |52 | $('input[name="ofYourChoice"]').multisuggest({ 53 | sources: [ 54 | { 55 | data: "/api/users", 56 | queryParam: "text", 57 | type: "url", 58 | listFormatter: function(item, term) { 59 | var compiled = _.template("<% if (thumb) { print('<img src="../' + thumb + '">') } %><% print(hl(name.first)) %> <% print(hl(name.last)) %><% if (name.suffix) { print(', ' + name.suffix)} %><br /><small><% print(hl(organization.name)) %></small>"); 60 | return compiled({ 61 | hl: $.proxy($.fn.usersuggest.highlighter, this, term), 62 | organization: item.profile.organization, 63 | name: item.profile.name, 64 | thumb: item.profile.thumbnail 65 | }); 66 | }, 67 | inputFormatter: function(item) { 68 | var compiled = _.template("<%= first %> <%= last %>"); 69 | return compiled(item.profile.name); 70 | }, 71 | valueAttribute: function(item) { 72 | return item.profile.id; 73 | }, 74 | resultsProcessor: function(data) { 75 | return data.users; 76 | }, 77 | header: "Users", 78 | maxEntries: 5 79 | } 80 | ], 81 | link: '<a tabFocus="0" href="#">Invite a new user</a>', 82 | linkHandler: function() { 83 | // show invitation form 84 | }, 85 | loadingIconClass: "usuggest-loading", 86 | noResultsText: "No matching users.", 87 | enableDropdownMode: true, 88 | delay: 300, 89 | minLength: 2 90 | }); 91 |92 | 93 |