|
1 | 1 | /*!
|
2 |
| - * autocomplete.js 0.17.3 |
| 2 | + * autocomplete.js 0.18.0 |
3 | 3 | * https://github.com/algolia/autocomplete.js
|
4 | 4 | * Copyright 2016 Algolia, Inc. and other contributors; Licensed MIT
|
5 | 5 | */
|
|
131 | 131 | openOnFocus: scope.options.openOnFocus,
|
132 | 132 | templates: scope.options.templates,
|
133 | 133 | debug: scope.options.debug,
|
| 134 | + cssClasses: scope.options.cssClasses, |
134 | 135 | datasets: scope.datasets
|
135 | 136 | });
|
136 | 137 | }
|
|
269 | 270 |
|
270 | 271 | defer: function(fn) { setTimeout(fn, 0); },
|
271 | 272 |
|
272 |
| - noop: function() {} |
| 273 | + noop: function() {}, |
| 274 | + |
| 275 | + className: function(prefix, clazz, skipDot) { |
| 276 | + return (skipDot ? '' : '.') + prefix + '-' + clazz; |
| 277 | + } |
273 | 278 | };
|
274 | 279 |
|
275 | 280 |
|
|
348 | 353 | this.autoselect = !!o.autoselect;
|
349 | 354 | this.openOnFocus = !!o.openOnFocus;
|
350 | 355 | this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;
|
| 356 | + this.cssClasses = o.cssClasses = _.mixin({}, css.defaultClasses, o.cssClasses || {}); |
351 | 357 | this.$node = buildDom(o);
|
352 | 358 |
|
353 |
| - $menu = this.$node.find('.aa-dropdown-menu'); |
354 |
| - $input = this.$node.find('.aa-input'); |
355 |
| - $hint = this.$node.find('.aa-hint'); |
| 359 | + $menu = this.$node.find(_.className(this.cssClasses.prefix, this.cssClasses.dropdownMenu)); |
| 360 | + $input = this.$node.find(_.className(this.cssClasses.prefix, this.cssClasses.input)); |
| 361 | + $hint = this.$node.find(_.className(this.cssClasses.prefix, this.cssClasses.hint)); |
356 | 362 |
|
357 | 363 | if (o.dropdownMenuContainer) {
|
358 | 364 | DOM.element(o.dropdownMenuContainer)
|
|
380 | 386 |
|
381 | 387 | this.eventBus = o.eventBus || new EventBus({el: $input});
|
382 | 388 |
|
383 |
| - this.dropdown = new Typeahead.Dropdown({menu: $menu, datasets: o.datasets, templates: o.templates}) |
| 389 | + this.dropdown = new Typeahead.Dropdown({menu: $menu, datasets: o.datasets, templates: o.templates, cssClasses: this.cssClasses}) |
384 | 390 | .onSync('suggestionClicked', this._onSuggestionClicked, this)
|
385 | 391 | .onSync('cursorMoved', this._onCursorMoved, this)
|
386 | 392 | .onSync('cursorRemoved', this._onCursorRemoved, this)
|
|
683 | 689 | this.input.destroy();
|
684 | 690 | this.dropdown.destroy();
|
685 | 691 |
|
686 |
| - destroyDomStructure(this.$node); |
| 692 | + destroyDomStructure(this.$node, this.cssClasses); |
687 | 693 |
|
688 | 694 | this.$node = null;
|
689 | 695 | }
|
|
696 | 702 | var $hint;
|
697 | 703 |
|
698 | 704 | $input = DOM.element(options.input);
|
699 |
| - $wrapper = DOM.element(html.wrapper).css(css.wrapper); |
| 705 | + $wrapper = DOM.element(html.wrapper.replace('%ROOT%', options.cssClasses.root)).css(css.wrapper); |
700 | 706 | // override the display property with the table-cell value
|
701 | 707 | // if the parent element is a table and the original input was a block
|
702 | 708 | // -> https://github.com/algolia/autocomplete.js/issues/16
|
703 | 709 | if ($input.css('display') === 'block' && $input.parent().css('display') === 'table') {
|
704 | 710 | $wrapper.css('display', 'table-cell');
|
705 | 711 | }
|
706 |
| - $dropdown = DOM.element(html.dropdown).css(css.dropdown); |
| 712 | + var dropdownHtml = html.dropdown. |
| 713 | + replace('%PREFIX%', options.cssClasses.prefix). |
| 714 | + replace('%DROPDOWN_MENU%', options.cssClasses.dropdownMenu); |
| 715 | + $dropdown = DOM.element(dropdownHtml).css(css.dropdown); |
707 | 716 | if (options.templates && options.templates.dropdownMenu) {
|
708 | 717 | $dropdown.html(_.templatify(options.templates.dropdownMenu)());
|
709 | 718 | }
|
710 | 719 | $hint = $input.clone().css(css.hint).css(getBackgroundStyles($input));
|
711 | 720 |
|
712 | 721 | $hint
|
713 | 722 | .val('')
|
714 |
| - .addClass('aa-hint') |
| 723 | + .addClass(_.className(options.cssClasses.prefix, options.cssClasses.hint, true)) |
715 | 724 | .removeAttr('id name placeholder required')
|
716 | 725 | .prop('readonly', true)
|
717 | 726 | .attr({autocomplete: 'off', spellcheck: 'false', tabindex: -1});
|
|
729 | 738 | });
|
730 | 739 |
|
731 | 740 | $input
|
732 |
| - .addClass('aa-input') |
| 741 | + .addClass(_.className(options.cssClasses.prefix, options.cssClasses.input, true)) |
733 | 742 | .attr({autocomplete: 'off', spellcheck: false})
|
734 | 743 | .css(options.hint ? css.input : css.inputWithNoHint);
|
735 | 744 |
|
|
762 | 771 | };
|
763 | 772 | }
|
764 | 773 |
|
765 |
| - function destroyDomStructure($node) { |
766 |
| - var $input = $node.find('.aa-input'); |
| 774 | + function destroyDomStructure($node, cssClasses) { |
| 775 | + var $input = $node.find(_.className(cssClasses.prefix, cssClasses.input)); |
767 | 776 |
|
768 | 777 | // need to remove attrs that weren't previously defined and
|
769 | 778 | // revert attrs that originally had a value
|
|
777 | 786 |
|
778 | 787 | $input
|
779 | 788 | .detach()
|
780 |
| - .removeClass('aa-input') |
| 789 | + .removeClass(_.className(cssClasses.prefix, cssClasses.input, true)) |
781 | 790 | .insertAfter($node);
|
782 | 791 | if ($input.removeData) {
|
783 | 792 | $input.removeData(attrsKey);
|
|
1463 | 1472 |
|
1464 | 1473 | this.isOpen = false;
|
1465 | 1474 | this.isEmpty = true;
|
| 1475 | + this.cssClasses = _.mixin({}, css.defaultClasses, o.cssClasses || {}); |
1466 | 1476 |
|
1467 | 1477 | // bound functions
|
1468 | 1478 | onSuggestionClick = _.bind(this._onSuggestionClick, this);
|
1469 | 1479 | onSuggestionMouseEnter = _.bind(this._onSuggestionMouseEnter, this);
|
1470 | 1480 | onSuggestionMouseLeave = _.bind(this._onSuggestionMouseLeave, this);
|
1471 | 1481 |
|
| 1482 | + var cssClass = _.className(this.cssClasses.prefix, this.cssClasses.suggestion); |
1472 | 1483 | this.$menu = DOM.element(o.menu)
|
1473 |
| - .on('click.aa', '.aa-suggestion', onSuggestionClick) |
1474 |
| - .on('mouseenter.aa', '.aa-suggestion', onSuggestionMouseEnter) |
1475 |
| - .on('mouseleave.aa', '.aa-suggestion', onSuggestionMouseLeave); |
| 1484 | + .on('click.aa', cssClass, onSuggestionClick) |
| 1485 | + .on('mouseenter.aa', cssClass, onSuggestionMouseEnter) |
| 1486 | + .on('mouseleave.aa', cssClass, onSuggestionMouseLeave); |
1476 | 1487 |
|
1477 | 1488 | if (o.templates && o.templates.header) {
|
1478 | 1489 | this.$menu.prepend(_.templatify(o.templates.header)());
|
1479 | 1490 | }
|
1480 | 1491 |
|
1481 |
| - this.datasets = _.map(o.datasets, function(oDataset) { return initializeDataset(that.$menu, oDataset); }); |
| 1492 | + this.datasets = _.map(o.datasets, function(oDataset) { return initializeDataset(that.$menu, oDataset, o.cssClasses); }); |
1482 | 1493 | _.each(this.datasets, function(dataset) {
|
1483 | 1494 | var root = dataset.getRoot();
|
1484 | 1495 | if (root && root.parent().length === 0) {
|
|
1541 | 1552 | },
|
1542 | 1553 |
|
1543 | 1554 | _getSuggestions: function getSuggestions() {
|
1544 |
| - return this.$menu.find('.aa-suggestion'); |
| 1555 | + return this.$menu.find(_.className(this.cssClasses.prefix, this.cssClasses.suggestion)); |
1545 | 1556 | },
|
1546 | 1557 |
|
1547 | 1558 | _getCursor: function getCursor() {
|
1548 |
| - return this.$menu.find('.aa-cursor').first(); |
| 1559 | + return this.$menu.find(_.className(this.cssClasses.prefix, this.cssClasses.cursor)).first(); |
1549 | 1560 | },
|
1550 | 1561 |
|
1551 | 1562 | _setCursor: function setCursor($el) {
|
1552 |
| - $el.first().addClass('aa-cursor'); |
1553 |
| - console.log('cursorMoved'); |
| 1563 | + $el.first().addClass(_.className(this.cssClasses.prefix, this.cssClasses.cursor, true)); |
1554 | 1564 | this.trigger('cursorMoved');
|
1555 | 1565 | },
|
1556 | 1566 |
|
1557 | 1567 | _removeCursor: function removeCursor() {
|
1558 |
| - this._getCursor().removeClass('aa-cursor'); |
| 1568 | + this._getCursor().removeClass(_.className(this.cssClasses.prefix, this.cssClasses.cursor, true)); |
1559 | 1569 | },
|
1560 | 1570 |
|
1561 | 1571 | _moveCursor: function moveCursor(increment) {
|
|
1711 | 1721 | // ----------------
|
1712 | 1722 | Dropdown.Dataset = Dataset;
|
1713 | 1723 |
|
1714 |
| - function initializeDataset($menu, oDataset) { |
1715 |
| - return new Dropdown.Dataset(_.mixin({$menu: $menu}, oDataset)); |
| 1724 | + function initializeDataset($menu, oDataset, cssClasses) { |
| 1725 | + return new Dropdown.Dataset(_.mixin({$menu: $menu, cssClasses: cssClasses}, oDataset)); |
1716 | 1726 | }
|
1717 | 1727 |
|
1718 | 1728 | module.exports = Dropdown;
|
|
1760 | 1770 |
|
1761 | 1771 | this.templates = getTemplates(o.templates, this.displayFn);
|
1762 | 1772 |
|
1763 |
| - this.$el = o.$menu && o.$menu.find('.aa-dataset-' + this.name).length > 0 ? |
1764 |
| - DOM.element(o.$menu.find('.aa-dataset-' + this.name)[0]) : |
1765 |
| - DOM.element(html.dataset.replace('%CLASS%', this.name)); |
| 1773 | + this.cssClasses = _.mixin({}, css.defaultClasses, o.cssClasses || {}); |
| 1774 | + |
| 1775 | + var clazz = _.className(this.cssClasses.prefix, this.cssClasses.dataset); |
| 1776 | + this.$el = o.$menu && o.$menu.find(clazz + '-' + this.name).length > 0 ? |
| 1777 | + DOM.element(o.$menu.find(clazz + '-' + this.name)[0]) : |
| 1778 | + DOM.element( |
| 1779 | + html.dataset.replace('%CLASS%', this.name) |
| 1780 | + .replace('%PREFIX%', this.cssClasses.prefix) |
| 1781 | + .replace('%DATASET%', this.cssClasses.dataset) |
| 1782 | + ); |
1766 | 1783 |
|
1767 | 1784 | this.$menu = o.$menu;
|
1768 | 1785 | }
|
|
1820 | 1837 | }
|
1821 | 1838 |
|
1822 | 1839 | if (this.$menu) {
|
1823 |
| - this.$menu.addClass('aa-' + (hasSuggestions ? 'with' : 'without') + '-' + this.name) |
1824 |
| - .removeClass('aa-' + (hasSuggestions ? 'without' : 'with') + '-' + this.name); |
| 1840 | + this.$menu.addClass(this.cssClasses.prefix + '-' + (hasSuggestions ? 'with' : 'without') + '-' + this.name) |
| 1841 | + .removeClass(this.cssClasses.prefix + '-' + (hasSuggestions ? 'without' : 'with') + '-' + this.name); |
1825 | 1842 | }
|
1826 | 1843 |
|
1827 | 1844 | this.trigger('rendered');
|
|
1836 | 1853 | var args = [].slice.call(arguments, 0);
|
1837 | 1854 | var $suggestions;
|
1838 | 1855 | var nodes;
|
| 1856 | + var self = this; |
1839 | 1857 |
|
1840 |
| - $suggestions = DOM.element(html.suggestions).css(css.suggestions); |
| 1858 | + var suggestionsHtml = html.suggestions. |
| 1859 | + replace('%PREFIX%', this.cssClasses.prefix). |
| 1860 | + replace('%SUGGESTIONS%', this.cssClasses.suggestions); |
| 1861 | + $suggestions = DOM.element(suggestionsHtml).css(css.suggestions); |
1841 | 1862 |
|
1842 | 1863 | // jQuery#append doesn't support arrays as the first argument
|
1843 | 1864 | // until version 1.8, see http://bugs.jquery.com/ticket/11231
|
|
1849 | 1870 | function getSuggestionNode(suggestion) {
|
1850 | 1871 | var $el;
|
1851 | 1872 |
|
1852 |
| - $el = DOM.element(html.suggestion) |
| 1873 | + var suggestionHtml = html.suggestion. |
| 1874 | + replace('%PREFIX%', self.cssClasses.prefix). |
| 1875 | + replace('%SUGGESTION%', self.cssClasses.suggestion); |
| 1876 | + $el = DOM.element(suggestionHtml) |
1853 | 1877 | .append(that.templates.suggestion.apply(this, [suggestion].concat(args)));
|
1854 | 1878 |
|
1855 | 1879 | $el.data(datasetKey, that.name);
|
|
1960 | 1984 | 'use strict';
|
1961 | 1985 |
|
1962 | 1986 | module.exports = {
|
1963 |
| - wrapper: '<span class="algolia-autocomplete"></span>', |
1964 |
| - dropdown: '<span class="aa-dropdown-menu"></span>', |
1965 |
| - dataset: '<div class="aa-dataset-%CLASS%"></div>', |
1966 |
| - suggestions: '<span class="aa-suggestions"></span>', |
1967 |
| - suggestion: '<div class="aa-suggestion"></div>' |
| 1987 | + wrapper: '<span class="%ROOT%"></span>', |
| 1988 | + dropdown: '<span class="%PREFIX%-%DROPDOWN_MENU%"></span>', |
| 1989 | + dataset: '<div class="%PREFIX%-%DATASET%-%CLASS%"></div>', |
| 1990 | + suggestions: '<span class="%PREFIX%-%SUGGESTIONS%"></span>', |
| 1991 | + suggestion: '<div class="%PREFIX%-%SUGGESTION%"></div>' |
1968 | 1992 | };
|
1969 | 1993 |
|
1970 | 1994 |
|
|
2023 | 2047 | rtl: {
|
2024 | 2048 | left: 'auto',
|
2025 | 2049 | right: '0'
|
| 2050 | + }, |
| 2051 | + defaultClasses: { |
| 2052 | + root: 'algolia-autocomplete', |
| 2053 | + prefix: 'aa', |
| 2054 | + dropdownMenu: 'dropdown-menu', |
| 2055 | + input: 'input', |
| 2056 | + hint: 'hint', |
| 2057 | + suggestions: 'suggestions', |
| 2058 | + suggestion: 'suggestion', |
| 2059 | + cursor: 'cursor', |
| 2060 | + dataset: 'dataset' |
2026 | 2061 | }
|
2027 | 2062 | };
|
2028 | 2063 |
|
|
0 commit comments