├── .babelrc.js ├── .gitignore ├── Gruntfile.js ├── LICENSE ├── README.md ├── build ├── banner.js └── rollup.config.js ├── dist └── js │ ├── bootstrap-autocomplete.js │ ├── bootstrap-autocomplete.js.map │ ├── bootstrap-autocomplete.min.js │ └── bootstrap-autocomplete.min.js.map ├── docs ├── index.html ├── js │ ├── bootstrap-autocomplete.js │ ├── bootstrap-autocomplete.js.map │ ├── mock.js │ ├── source.js │ └── timezone.js └── timezone.json ├── package-lock.json ├── package.json └── src └── js ├── autocomplete.js ├── index.js └── util.js /.babelrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | [ 4 | '@babel/env', 5 | { 6 | loose: true, 7 | modules: false, 8 | exclude: ['transform-typeof-symbol'] 9 | } 10 | ] 11 | ], 12 | plugins: [ 13 | '@babel/plugin-proposal-object-rest-spread' 14 | ], 15 | env: { 16 | test: { 17 | plugins: [ 'istanbul' ] 18 | } 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | 3 | grunt.initConfig({ 4 | pkg: grunt.file.readJSON('package.json'), 5 | 6 | copy: { 7 | docs: { 8 | files: [ 9 | { 10 | expand: true, 11 | cwd: 'dist/js/', 12 | src: [ 13 | 'bootstrap-autocomplete.js', 14 | 'bootstrap-autocomplete.js.map' 15 | ], 16 | dest: 'docs/js/' 17 | } 18 | ] 19 | } 20 | }, 21 | 22 | run: { 23 | js_compile: { 24 | cmd: 'npm', args: ['run','js-compile'] 25 | }, 26 | js_minify: { 27 | cmd: 'npm', args: ['run','js-minify'] 28 | } 29 | }, 30 | 31 | watch: { 32 | js: { 33 | files: [ 34 | 'src/js/*.js' 35 | ], 36 | tasks: [ 37 | 'run:js_compile', 38 | 'copy:docs' 39 | ] 40 | } 41 | } 42 | }) 43 | 44 | grunt.loadNpmTasks('grunt-run') 45 | grunt.loadNpmTasks('grunt-contrib-copy') 46 | grunt.loadNpmTasks('grunt-contrib-watch') 47 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2019 Iqbal Fauzi 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software is furnished to do so, 8 | subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 15 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 16 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 17 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 18 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bootstrap-autocomplete 2 | 3 | Text input autocomplete from list, prefect or ajax. -------------------------------------------------------------------------------- /build/banner.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const year = new Date().getFullYear() 4 | 5 | function getBanner(pluginFilename) { 6 | return `/*! 7 | * Bootstrap Autocomplete v0.2.0 (https://iqbalfn.github.io/bootstrap-autocomplete/) 8 | * Copyright 2019 Iqbal Fauzi 9 | * Licensed under MIT (https://github.com/iqbalfn/bootstrap-autocomplete/blob/master/LICENSE) 10 | */` 11 | } 12 | 13 | module.exports = getBanner 14 | -------------------------------------------------------------------------------- /build/rollup.config.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const path = require('path') 4 | const babel = require('rollup-plugin-babel') 5 | const resolve = require('rollup-plugin-node-resolve') 6 | const banner = require('./banner.js') 7 | 8 | let fileDest = 'bootstrap-autocomplete.js' 9 | const external = ['jquery'] 10 | const plugins = [ 11 | babel({ 12 | exclude: 'node_modules/**', // Only transpile our source code 13 | externalHelpersWhitelist: [ // Include only required helpers 14 | 'defineProperties', 15 | 'createClass', 16 | 'inheritsLoose', 17 | 'defineProperty', 18 | 'objectSpread' 19 | ] 20 | }) 21 | ] 22 | const globals = { 23 | jquery: 'jQuery' 24 | } 25 | 26 | module.exports = { 27 | input: path.resolve(__dirname, '../src/js/index.js'), 28 | output: { 29 | banner, 30 | file: path.resolve(__dirname, `../dist/js/${fileDest}`), 31 | format: 'umd', 32 | globals, 33 | name: 'bootstrap-autocomplete' 34 | }, 35 | external, 36 | plugins 37 | } 38 | -------------------------------------------------------------------------------- /dist/js/bootstrap-autocomplete.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Autocomplete v0.2.0 (https://iqbalfn.github.io/bootstrap-autocomplete/) 3 | * Copyright 2019 Iqbal Fauzi 4 | * Licensed under MIT (https://github.com/iqbalfn/bootstrap-autocomplete/blob/master/LICENSE) 5 | */ 6 | (function (global, factory) { 7 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) : 8 | typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) : 9 | (global = global || self, factory(global['bootstrap-autocomplete'] = {}, global.jQuery)); 10 | }(this, (function (exports, $) { 'use strict'; 11 | 12 | $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $; 13 | 14 | function _defineProperties(target, props) { 15 | for (var i = 0; i < props.length; i++) { 16 | var descriptor = props[i]; 17 | descriptor.enumerable = descriptor.enumerable || false; 18 | descriptor.configurable = true; 19 | if ("value" in descriptor) descriptor.writable = true; 20 | Object.defineProperty(target, descriptor.key, descriptor); 21 | } 22 | } 23 | 24 | function _createClass(Constructor, protoProps, staticProps) { 25 | if (protoProps) _defineProperties(Constructor.prototype, protoProps); 26 | if (staticProps) _defineProperties(Constructor, staticProps); 27 | return Constructor; 28 | } 29 | 30 | function _defineProperty(obj, key, value) { 31 | if (key in obj) { 32 | Object.defineProperty(obj, key, { 33 | value: value, 34 | enumerable: true, 35 | configurable: true, 36 | writable: true 37 | }); 38 | } else { 39 | obj[key] = value; 40 | } 41 | 42 | return obj; 43 | } 44 | 45 | function _objectSpread(target) { 46 | for (var i = 1; i < arguments.length; i++) { 47 | var source = arguments[i] != null ? Object(arguments[i]) : {}; 48 | var ownKeys = Object.keys(source); 49 | 50 | if (typeof Object.getOwnPropertySymbols === 'function') { 51 | ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { 52 | return Object.getOwnPropertyDescriptor(source, sym).enumerable; 53 | })); 54 | } 55 | 56 | ownKeys.forEach(function (key) { 57 | _defineProperty(target, key, source[key]); 58 | }); 59 | } 60 | 61 | return target; 62 | } 63 | 64 | /** 65 | * -------------------------------------------------------------------------- 66 | * Bootstrap (v4.3.1): util.js 67 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 68 | * -------------------------------------------------------------------------- 69 | */ 70 | /** 71 | * ------------------------------------------------------------------------ 72 | * Private TransitionEnd Helpers 73 | * ------------------------------------------------------------------------ 74 | */ 75 | 76 | var TRANSITION_END = 'transitionend'; 77 | var MAX_UID = 1000000; 78 | var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) 79 | 80 | function toType(obj) { 81 | return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); 82 | } 83 | 84 | function getSpecialTransitionEndEvent() { 85 | return { 86 | bindType: TRANSITION_END, 87 | delegateType: TRANSITION_END, 88 | handle: function handle(event) { 89 | if ($(event.target).is(this)) { 90 | return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params 91 | } 92 | 93 | return undefined; // eslint-disable-line no-undefined 94 | } 95 | }; 96 | } 97 | 98 | function transitionEndEmulator(duration) { 99 | var _this = this; 100 | 101 | var called = false; 102 | $(this).one(Util.TRANSITION_END, function () { 103 | called = true; 104 | }); 105 | setTimeout(function () { 106 | if (!called) { 107 | Util.triggerTransitionEnd(_this); 108 | } 109 | }, duration); 110 | return this; 111 | } 112 | 113 | function setTransitionEndSupport() { 114 | $.fn.emulateTransitionEnd = transitionEndEmulator; 115 | $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); 116 | } 117 | /** 118 | * -------------------------------------------------------------------------- 119 | * Public Util Api 120 | * -------------------------------------------------------------------------- 121 | */ 122 | 123 | 124 | var Util = { 125 | TRANSITION_END: 'bsTransitionEnd', 126 | getUID: function getUID(prefix) { 127 | do { 128 | // eslint-disable-next-line no-bitwise 129 | prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here 130 | } while (document.getElementById(prefix)); 131 | 132 | return prefix; 133 | }, 134 | getSelectorFromElement: function getSelectorFromElement(element) { 135 | var selector = element.getAttribute('data-target'); 136 | 137 | if (!selector || selector === '#') { 138 | var hrefAttr = element.getAttribute('href'); 139 | selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; 140 | } 141 | 142 | try { 143 | return document.querySelector(selector) ? selector : null; 144 | } catch (err) { 145 | return null; 146 | } 147 | }, 148 | getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { 149 | if (!element) { 150 | return 0; 151 | } // Get transition-duration of the element 152 | 153 | 154 | var transitionDuration = $(element).css('transition-duration'); 155 | var transitionDelay = $(element).css('transition-delay'); 156 | var floatTransitionDuration = parseFloat(transitionDuration); 157 | var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found 158 | 159 | if (!floatTransitionDuration && !floatTransitionDelay) { 160 | return 0; 161 | } // If multiple durations are defined, take the first 162 | 163 | 164 | transitionDuration = transitionDuration.split(',')[0]; 165 | transitionDelay = transitionDelay.split(',')[0]; 166 | return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; 167 | }, 168 | reflow: function reflow(element) { 169 | return element.offsetHeight; 170 | }, 171 | triggerTransitionEnd: function triggerTransitionEnd(element) { 172 | $(element).trigger(TRANSITION_END); 173 | }, 174 | // TODO: Remove in v5 175 | supportsTransitionEnd: function supportsTransitionEnd() { 176 | return Boolean(TRANSITION_END); 177 | }, 178 | isElement: function isElement(obj) { 179 | return (obj[0] || obj).nodeType; 180 | }, 181 | typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { 182 | for (var property in configTypes) { 183 | if (Object.prototype.hasOwnProperty.call(configTypes, property)) { 184 | var expectedTypes = configTypes[property]; 185 | var value = config[property]; 186 | var valueType = value && Util.isElement(value) ? 'element' : toType(value); 187 | 188 | if (!new RegExp(expectedTypes).test(valueType)) { 189 | throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); 190 | } 191 | } 192 | } 193 | }, 194 | findShadowRoot: function findShadowRoot(element) { 195 | if (!document.documentElement.attachShadow) { 196 | return null; 197 | } // Can find the shadow root otherwise it'll return the document 198 | 199 | 200 | if (typeof element.getRootNode === 'function') { 201 | var root = element.getRootNode(); 202 | return root instanceof ShadowRoot ? root : null; 203 | } 204 | 205 | if (element instanceof ShadowRoot) { 206 | return element; 207 | } // when we don't find a shadow root 208 | 209 | 210 | if (!element.parentNode) { 211 | return null; 212 | } 213 | 214 | return Util.findShadowRoot(element.parentNode); 215 | } 216 | }; 217 | setTransitionEndSupport(); 218 | 219 | /** 220 | * ------------------------------------------------------------------------ 221 | * Constants 222 | * ------------------------------------------------------------------------ 223 | */ 224 | 225 | var NAME = 'autocomplete'; 226 | var VERSION = '0.2.0'; 227 | var DATA_KEY = 'bs.autocomplete'; 228 | var EVENT_KEY = "." + DATA_KEY; 229 | var DATA_API_KEY = '.data-api'; 230 | var JQUERY_NO_CONFLICT = $.fn[NAME]; 231 | var Default = { 232 | list: null, 233 | prefetch: null, 234 | filter: null, 235 | filterDelay: 300, 236 | filterMinChars: 1, 237 | filterRelation: null, 238 | maxResult: 10, 239 | onPick: null, 240 | onItemRendered: null, 241 | preProcess: null 242 | }; 243 | var DefaultType = { 244 | list: '(null|string|element)', 245 | prefetch: '(null|string)', 246 | filter: '(null|string)', 247 | filterDelay: 'number', 248 | filterMinChars: 'number', 249 | filterRelation: '(null|object)', 250 | maxResult: 'number', 251 | preProcess: '(null|function)', 252 | onPick: '(null|function)', 253 | onItemRendered: '(null|function)' 254 | }; 255 | var Event = { 256 | BLUR_DATA_API: "blur" + EVENT_KEY + DATA_API_KEY, 257 | CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY, 258 | KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY, 259 | INPUT_DATA_API: "input" + EVENT_KEY + DATA_API_KEY, 260 | PICK: "pick" + EVENT_KEY, 261 | ITEM_RENDER: "itemrender" + EVENT_KEY 262 | }; 263 | var KeyCode = { 264 | ARROW_DOWN: 40, 265 | ARROW_UP: 38, 266 | ENTER: 13, 267 | ESCAPE: 27 268 | }; 269 | /** 270 | * ------------------------------------------------------------------------ 271 | * Class Definition 272 | * ------------------------------------------------------------------------ 273 | */ 274 | 275 | var Autocomplete = /*#__PURE__*/function () { 276 | function Autocomplete(element, config) { 277 | this._config = this._getConfig(config); 278 | this._element = element; 279 | this._items = []; 280 | this._labels = {}; 281 | this._isShown = false; 282 | this._dropdown = null; 283 | this._spinner = null; 284 | this._result = []; 285 | this._query = ''; 286 | this._preventClose = false; 287 | this._timer = null; 288 | this._relations = null; 289 | 290 | if (element.hasAttribute('list')) { 291 | this._config.list = '#' + element.getAttribute('list'); 292 | element.removeAttribute('list'); 293 | } 294 | 295 | if (!this._config.list && !this._config.prefetch && !this._config.filter) throw new TypeError('No data source provided'); 296 | if (this._config.filterRelation) this._handleRelations(); 297 | element.setAttribute('autocomplete', 'off'); 298 | 299 | this._makeDropdown(); 300 | 301 | this._makeSpinner(); 302 | 303 | this._fetchPresetData(); 304 | 305 | this._addElementListener(); 306 | } // Getters 307 | 308 | 309 | var _proto = Autocomplete.prototype; 310 | 311 | // Public 312 | _proto.show = function show() { 313 | if (this._isShown) return; 314 | if (this._result.length) this._showDropdown(); 315 | }; 316 | 317 | _proto.hide = function hide() { 318 | if (!this._isShown) return; 319 | 320 | this._hideDropdown(); 321 | }; 322 | 323 | _proto.dispose = function dispose() { 324 | $(this._element).off(EVENT_KEY); 325 | $.removeData(this._element, DATA_KEY); 326 | this._config = null; 327 | this._element = null; 328 | this._items = null; 329 | this._labels = null; 330 | this._isShown = null; 331 | this._dropdown = null; 332 | this._spinner = null; 333 | this._result = null; 334 | this._query = null; 335 | this._preventClose = null; 336 | if (this._timer) clearTimeout(this._timer); 337 | this._timer = null; 338 | } // Private 339 | ; 340 | 341 | _proto._addElementListener = function _addElementListener() { 342 | var _this = this; 343 | 344 | $(this._element).on(Event.KEYDOWN_DATA_API, function (e) { 345 | var prevent = false; 346 | 347 | switch (e.keyCode) { 348 | case KeyCode.ARROW_DOWN: 349 | if (e.altKey && !_this._isShown) { 350 | _this._query = _this._element.value.trim().toLowerCase(); 351 | 352 | if (_this._query) { 353 | _this._findFromList(); 354 | 355 | prevent = true; 356 | } 357 | } else { 358 | _this._focusNext(); 359 | 360 | prevent = true; 361 | } 362 | 363 | break; 364 | 365 | case KeyCode.ARROW_UP: 366 | _this._focusPrev(); 367 | 368 | prevent = true; 369 | break; 370 | 371 | case KeyCode.ENTER: 372 | if (_this._isShown) { 373 | var item = $(_this._dropdown).children('.active').get(0); 374 | if (!item) item = $(_this._dropdown).children(':first-child').get(0); 375 | if (item) _this._selectItem(item); 376 | 377 | _this.hide(); 378 | 379 | prevent = true; 380 | } 381 | 382 | break; 383 | 384 | case KeyCode.ESCAPE: 385 | prevent = true; 386 | 387 | _this.hide(); 388 | 389 | break; 390 | } 391 | 392 | if (prevent) e.preventDefault(); 393 | }); 394 | $(this._element).on(Event.INPUT_DATA_API, function (e) { 395 | _this._query = _this._element.value.trim().toLowerCase(); 396 | 397 | if (!_this._query) { 398 | _this._truncateDropdown(); 399 | 400 | _this.hide(); 401 | } else { 402 | _this._findFromList(); 403 | } 404 | }); 405 | $(this._element).on(Event.BLUR_DATA_API, function (e) { 406 | if (_this._preventClose) return; 407 | setTimeout(function () { 408 | return _this.hide(); 409 | }, 150); 410 | }); 411 | }; 412 | 413 | _proto._fetchPresetData = function _fetchPresetData() { 414 | var _this2 = this; 415 | 416 | // from datalist 417 | if (this._config.list) { 418 | var dataList = this._config.list; 419 | if (typeof dataList === 'string') dataList = document.querySelector(this._config.list); 420 | 421 | if (dataList) { 422 | Array.from(dataList.children).forEach(function (o) { 423 | var val = o.innerHTML.toLowerCase(); 424 | if (_this2._items.includes(val)) return; 425 | 426 | _this2._items.push({"value":o.value,"text":val}); 427 | 428 | _this2._labels[val] = o.innerHTML; 429 | }); 430 | } 431 | } // from prefetch 432 | 433 | 434 | if (this._config.prefetch) { 435 | this._showSpinner(); 436 | 437 | $.get(this._config.prefetch, function (res) { 438 | _this2._hideSpinner(); 439 | 440 | if (_this2._config.preProcess) res = _this2._config.preProcess(res); 441 | res.forEach(function (i) { 442 | var val = i.toLowerCase(); 443 | if (_this2._items.includes(val)) return; 444 | 445 | _this2._items.push(val); 446 | 447 | _this2._labels[val] = i; 448 | }); 449 | }); 450 | } 451 | }; 452 | 453 | _proto._findFromAjax = function _findFromAjax() { 454 | var _this3 = this; 455 | 456 | if (!this._config.filter) return; 457 | if (this._dropdown.children.length >= this._config.maxResult) return; 458 | if (this._query.length < this._config.filterMinChars) return; 459 | if (this._timer) clearTimeout(this._timer); 460 | var vval = this._query; 461 | this._timer = setTimeout(function () { 462 | if (vval != _this3._query) return; 463 | 464 | _this3._showSpinner(); 465 | 466 | var url = _this3._config.filter.replace(/%23/g, '#').replace('#QUERY#', _this3._query); 467 | 468 | if (_this3._relations) { 469 | var sep = url.includes('?') ? '&' : '?'; 470 | 471 | for (var k in _this3._relations) { 472 | var el = _this3._relations[k]; 473 | var val = $(el).val(); 474 | if (!val) continue; 475 | url += "" + sep + k + "=" + val; 476 | sep = '&'; 477 | } 478 | } 479 | 480 | $.get(url, function (res) { 481 | _this3._hideSpinner(); 482 | 483 | if (_this3._config.preProcess) res = _this3._config.preProcess(res); 484 | var local = []; 485 | res.forEach(function (i) { 486 | var val = i.toLowerCase(); 487 | if (_this3._items.includes(val)) return; 488 | 489 | _this3._items.push(val); 490 | 491 | _this3._labels[val] = i; 492 | local.push(i); 493 | 494 | _this3._result.push(i); 495 | }); 496 | if (local.length) _this3._renderItem(local); 497 | if (_this3._result.length) _this3.show();else _this3.hide(); 498 | }); 499 | }, this._config.filterDelay); 500 | }; 501 | 502 | _proto._findFromList = function _findFromList() { 503 | var _this4 = this; 504 | 505 | this._truncateDropdown(); 506 | 507 | this._result = []; 508 | var local = []; 509 | 510 | this._items.forEach(function (i) { 511 | if (!i["text"].includes(_this4._query)) return; 512 | var label = _this4._labels[i["text"]]; 513 | if (_this4._result.includes(label)) return; 514 | local.push({"value":i["value"],"text":label}); 515 | 516 | _this4._result.push({"value":i["value"],"text":label}); 517 | }); // now render the result 518 | 519 | 520 | if (local.length) { 521 | this._renderItem(local); 522 | 523 | this.show(); 524 | } else { 525 | this.hide(); 526 | } 527 | 528 | this._findFromAjax(); 529 | }; 530 | 531 | _proto._focusNext = function _focusNext() { 532 | var next = $(this._dropdown).children(':first-child').get(0); 533 | var focused = $(this._dropdown).children('.active').get(0); 534 | 535 | if (focused) { 536 | focused.classList.remove('active'); 537 | var tmpNext = $(focused).next().get(0); 538 | if (tmpNext) next = tmpNext; 539 | } 540 | 541 | if (next) next.classList.add('active'); 542 | }; 543 | 544 | _proto._focusPrev = function _focusPrev() { 545 | var next = $(this._dropdown).children(':last-child').get(0); 546 | var focused = $(this._dropdown).children('.active').get(0); 547 | 548 | if (focused) { 549 | focused.classList.remove('active'); 550 | var tmpNext = $(focused).prev().get(0); 551 | if (tmpNext) next = tmpNext; 552 | } 553 | 554 | if (next) next.classList.add('active'); 555 | }; 556 | 557 | _proto._getConfig = function _getConfig(config) { 558 | config = _objectSpread({}, Default, config); 559 | Util.typeCheckConfig(NAME, config, DefaultType); 560 | return config; 561 | }; 562 | 563 | _proto._handleRelations = function _handleRelations() { 564 | var _this5 = this; 565 | 566 | this._relations = []; 567 | 568 | for (var name in this._config.filterRelation) { 569 | var selector = this._config.filterRelation[name]; 570 | this._relations[name] = $(selector).get(0); 571 | $(this._relations[name]).change(function (e) { 572 | _this5._element.value = ''; 573 | $(_this5._element).change(); // we need to trigger this manually 574 | 575 | _this5._items = []; 576 | }); 577 | } 578 | }; 579 | 580 | _proto._hideDropdown = function _hideDropdown() { 581 | this._isShown = false; 582 | 583 | this._dropdown.classList.remove('show'); 584 | }; 585 | 586 | _proto._hideSpinner = function _hideSpinner() { 587 | this._spinner.style.display = 'none'; 588 | }; 589 | 590 | _proto._makeDropdown = function _makeDropdown() { 591 | this._element.parentNode.style.position = 'relative'; 592 | var tmpl = ''; 593 | this._dropdown = $(tmpl).appendTo(this._element.parentNode).get(0); 594 | }; 595 | 596 | _proto._makeSpinner = function _makeSpinner() { 597 | var tmpl = '
'; 598 | this._spinner = $(tmpl).appendTo(this._element.parentNode).get(0); 599 | $(this._spinner).css({ 600 | position: 'absolute', 601 | right: $(this._element).css('padding-right'), 602 | top: this._element.offsetTop + (this._element.offsetHeight - this._spinner.offsetHeight) / 2 + 'px' 603 | }); 604 | 605 | this._hideSpinner(); 606 | }; 607 | 608 | _proto._renderItem = function _renderItem(items) { 609 | var _this6 = this; 610 | 611 | items.forEach(function (i) { 612 | if (_this6._dropdown.children.length >= _this6._config.maxResult) return; 613 | var item = $('').attr("value",i["value"]); 614 | var itemEl = item.get(0); 615 | item.text(i["text"]).appendTo(_this6._dropdown); 616 | if (_this6._config.onItemRendered) _this6._config.onItemRendered(_this6._element, itemEl); 617 | var renderEvent = $.Event(Event.ITEM_RENDER, { 618 | item: itemEl 619 | }); 620 | $(_this6._element).trigger(renderEvent); 621 | item.on(Event.CLICK_DATA_API, function (e) { 622 | _this6._selectItem(e.target); 623 | 624 | _this6._preventClose = true; 625 | 626 | _this6.hide(); 627 | 628 | e.preventDefault(); 629 | _this6._preventClose = false; 630 | }); 631 | }); 632 | }; 633 | 634 | _proto._selectItem = function _selectItem(item) { 635 | this._element.value = item.innerText; 636 | if (this._config.onPick) this._config.onPick(this._element, item); 637 | var pickEvent = $.Event(Event.PICK, { 638 | item: item 639 | }); 640 | $(this._element).trigger(pickEvent); 641 | }; 642 | 643 | _proto._showDropdown = function _showDropdown() { 644 | this._isShown = true; 645 | 646 | this._dropdown.classList.add('show'); 647 | }; 648 | 649 | _proto._showSpinner = function _showSpinner() { 650 | this._spinner.style.display = 'inline-block'; 651 | }; 652 | 653 | _proto._truncateDropdown = function _truncateDropdown() { 654 | this._dropdown.innerHTML = ''; 655 | } // Static 656 | ; 657 | 658 | Autocomplete._jQueryInterface = function _jQueryInterface(config, relatedTarget) { 659 | return this.each(function () { 660 | var data = $(this).data(DATA_KEY); 661 | 662 | var _config = _objectSpread({}, Default, $(this).data(), typeof config === 'object' && config ? config : {}); 663 | 664 | if (!data) { 665 | data = new Autocomplete(this, _config); 666 | $(this).data(DATA_KEY, data); 667 | } 668 | 669 | if (typeof config === 'string') { 670 | if (typeof data[config] === 'undefined') throw new TypeError("No method named \"" + config + "\""); 671 | data[config](relatedTarget); 672 | } 673 | }); 674 | }; 675 | 676 | _createClass(Autocomplete, null, [{ 677 | key: "VERSION", 678 | get: function get() { 679 | return VERSION; 680 | } 681 | }, { 682 | key: "Default", 683 | get: function get() { 684 | return Default; 685 | } 686 | }]); 687 | 688 | return Autocomplete; 689 | }(); 690 | /** 691 | * ------------------------------------------------------------------------ 692 | * jQuery 693 | * ------------------------------------------------------------------------ 694 | */ 695 | 696 | 697 | $.fn[NAME] = Autocomplete._jQueryInterface; 698 | $.fn[NAME].Constructor = Autocomplete; 699 | 700 | $.fn[NAME].noConflict = function () { 701 | $.fn[NAME] = JQUERY_NO_CONFLICT; 702 | return Autocomplete._jQueryInterface; 703 | }; 704 | 705 | exports.Autocomplete = Autocomplete; 706 | 707 | Object.defineProperty(exports, '__esModule', { value: true }); 708 | 709 | }))); 710 | //# sourceMappingURL=bootstrap-autocomplete.js.map 711 | -------------------------------------------------------------------------------- /dist/js/bootstrap-autocomplete.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"bootstrap-autocomplete.js","sources":["../../src/js/util.js","../../src/js/autocomplete.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle(event) {\n if ($(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n }\n return undefined // eslint-disable-line no-undefined\n }\n }\n}\n\nfunction transitionEndEmulator(duration) {\n let called = false\n\n $(this).one(Util.TRANSITION_END, () => {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap Autocomplete (v0.2.0): autocomplete.js\n * Licensed under MIT (https://github.com/iqbalfn/bootstrap-autocomplete/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'autocomplete'\nconst VERSION = '0.2.0'\nconst DATA_KEY = 'bs.autocomplete'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n list : null,\n\n prefetch : null,\n\n filter : null,\n filterDelay : 300,\n filterMinChars : 1,\n filterRelation : null,\n\n maxResult : 10,\n\n onPick : null,\n onItemRendered : null,\n\n preProcess : null\n}\n\nconst DefaultType = {\n list : '(null|string|element)',\n\n prefetch : '(null|string)',\n\n filter : '(null|string)',\n filterDelay : 'number',\n filterMinChars : 'number',\n filterRelation : '(null|object)',\n\n maxResult : 'number',\n\n preProcess : '(null|function)',\n\n onPick : '(null|function)',\n onItemRendered : '(null|function)'\n}\n\nconst Event = {\n BLUR_DATA_API : `blur${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n INPUT_DATA_API : `input${EVENT_KEY}${DATA_API_KEY}`,\n\n PICK : `pick${EVENT_KEY}`,\n ITEM_RENDER : `itemrender${EVENT_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_MENU : 'dropdown-menu',\n DROPDOWN_ITEM : 'dropdown-item'\n}\n\nconst KeyCode = {\n ARROW_DOWN : 40,\n ARROW_UP : 38,\n ENTER : 13,\n ESCAPE : 27\n}\n\nconst Selector = {}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Autocomplete {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n\n this._items = []\n this._labels = {}\n\n this._isShown = false\n this._dropdown = null\n this._spinner = null\n this._result = []\n this._query = ''\n this._preventClose = false\n this._timer = null\n this._relations = null\n\n if(element.hasAttribute('list')){\n this._config.list = '#' + element.getAttribute('list')\n element.removeAttribute('list')\n }\n\n if(!this._config.list && !this._config.prefetch && !this._config.filter)\n throw new TypeError('No data source provided')\n\n if(this._config.filterRelation)\n this._handleRelations()\n\n element.setAttribute('autocomplete', 'off')\n\n this._makeDropdown()\n this._makeSpinner()\n this._fetchPresetData()\n this._addElementListener()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n show(){\n if(this._isShown)\n return\n\n if(this._result.length)\n this._showDropdown()\n }\n\n hide(){\n if(!this._isShown)\n return\n\n this._hideDropdown()\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._items = null\n this._labels = null\n this._isShown = null\n this._dropdown = null\n this._spinner = null\n this._result = null\n this._query = null\n this._preventClose = null\n if(this._timer)\n clearTimeout(this._timer)\n this._timer = null\n }\n\n // Private\n\n _addElementListener(){\n $(this._element).on(Event.KEYDOWN_DATA_API, e => {\n let prevent = false\n\n switch(e.keyCode){\n case KeyCode.ARROW_DOWN:\n if(e.altKey && !this._isShown){\n this._query = this._element.value.trim().toLowerCase()\n\n if(this._query){\n this._findFromList()\n prevent = true\n }\n }else{\n this._focusNext()\n prevent = true\n }\n break;\n\n case KeyCode.ARROW_UP:\n this._focusPrev()\n prevent = true\n break;\n\n case KeyCode.ENTER:\n if(this._isShown){\n let item = $(this._dropdown).children('.active').get(0)\n if(!item)\n item = $(this._dropdown).children(':first-child').get(0)\n\n if(item)\n this._selectItem(item)\n\n this.hide()\n prevent = true\n }\n break;\n\n case KeyCode.ESCAPE:\n prevent = true\n this.hide()\n break;\n }\n\n if(prevent)\n e.preventDefault()\n })\n\n $(this._element).on(Event.INPUT_DATA_API, e => {\n this._query = this._element.value.trim().toLowerCase()\n\n if(!this._query){\n this._truncateDropdown()\n this.hide()\n }else{\n this._findFromList()\n }\n })\n\n $(this._element).on(Event.BLUR_DATA_API, e => {\n if(this._preventClose)\n return\n setTimeout(() => this.hide(), 150)\n })\n }\n\n _fetchPresetData(){\n // from datalist\n if(this._config.list){\n let dataList = this._config.list\n if(typeof dataList === 'string')\n dataList = document.querySelector(this._config.list)\n\n if(dataList){\n Array.from(dataList.children).forEach(o => {\n let val = o.innerHTML.toLowerCase()\n if(this._items.includes(val))\n return\n\n this._items.push(val)\n this._labels[val] = o.innerHTML\n })\n }\n }\n\n // from prefetch\n if(this._config.prefetch){\n this._showSpinner()\n $.get(this._config.prefetch, res => {\n this._hideSpinner()\n if(this._config.preProcess)\n res = this._config.preProcess(res)\n\n res.forEach(i => {\n let val = i.toLowerCase()\n if(this._items.includes(val))\n return\n this._items.push(val)\n this._labels[val] = i\n })\n })\n }\n }\n\n _findFromAjax(){\n if(!this._config.filter)\n return\n if(this._dropdown.children.length >= this._config.maxResult)\n return\n\n if(this._timer)\n clearTimeout(this._timer)\n\n let vval = this._query\n this._timer = setTimeout(() => {\n if(vval != this._query)\n return\n this._showSpinner()\n\n let url = this._config.filter\n .replace(/%23/g, '#')\n .replace('#QUERY#', this._query)\n\n if(this._relations){\n let sep = url.includes('?') ? '&' : '?'\n\n for(let k in this._relations){\n let el = this._relations[k]\n let val= $(el).val()\n if(!val)\n continue;\n\n url+= `${sep}${k}=${val}`\n sep = '&'\n }\n }\n\n $.get(url, res => {\n this._hideSpinner()\n if(this._config.preProcess)\n res = this._config.preProcess(res)\n\n let local = []\n res.forEach(i => {\n let val = i.toLowerCase()\n if(this._items.includes(val))\n return\n\n this._items.push(val)\n this._labels[val] = i\n\n local.push(i)\n this._result.push(i)\n })\n\n if(local.length)\n this._renderItem(local)\n\n if(this._result.length)\n this.show()\n else\n this.hide()\n })\n }, this._config.filterDelay)\n }\n\n _findFromList(){\n this._truncateDropdown()\n this._result = []\n\n let local = []\n this._items.forEach(i => {\n if(!i.includes(this._query))\n return\n\n let label = this._labels[i]\n\n if(this._result.includes(label))\n return\n\n local.push(label)\n this._result.push(label)\n })\n\n // now render the result\n if(local.length){\n this._renderItem(local)\n this.show()\n }else{\n this.hide()\n }\n\n this._findFromAjax()\n }\n\n _focusNext(){\n let next = $(this._dropdown).children(':first-child').get(0)\n let focused = $(this._dropdown).children('.active').get(0)\n\n if(focused){\n focused.classList.remove('active')\n let tmpNext = $(focused).next().get(0)\n if(tmpNext)\n next = tmpNext\n }\n\n if(next)\n next.classList.add('active')\n }\n\n _focusPrev(){\n let next = $(this._dropdown).children(':last-child').get(0)\n let focused = $(this._dropdown).children('.active').get(0)\n\n if(focused){\n focused.classList.remove('active')\n let tmpNext = $(focused).prev().get(0)\n if(tmpNext)\n next = tmpNext\n }\n\n if(next)\n next.classList.add('active')\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleRelations(){\n this._relations = []\n for(let name in this._config.filterRelation){\n let selector = this._config.filterRelation[name];\n this._relations[name] = $(selector).get(0)\n $(this._relations[name]).change(e => {\n this._element.value = ''\n $(this._element).change() // we need to trigger this manually\n this._items = []\n });\n }\n }\n\n _hideDropdown(){\n this._isShown = false\n this._dropdown.classList.remove('show')\n }\n\n _hideSpinner(){\n this._spinner.style.display = 'none'\n }\n\n _makeDropdown(){\n this._element.parentNode.style.position = 'relative'\n\n let tmpl = '
'\n\n this._dropdown = $(tmpl).appendTo(this._element.parentNode).get(0)\n\n }\n\n _makeSpinner(){\n let tmpl = '
'\n\n this._spinner = $(tmpl).appendTo(this._element.parentNode).get(0)\n\n $(this._spinner).css({\n position : 'absolute',\n right : $(this._element).css('padding-right'),\n top : (this._element.offsetTop + ((this._element.offsetHeight - this._spinner.offsetHeight)/2)) + 'px'\n })\n\n this._hideSpinner()\n }\n\n _renderItem(items){\n items.forEach(i => {\n if(this._dropdown.children.length >= this._config.maxResult)\n return\n\n let item = $('')\n let itemEl = item.get(0)\n\n item.text(i).appendTo(this._dropdown)\n\n if(this._config.onItemRendered)\n this._config.onItemRendered(this._element, itemEl)\n\n const renderEvent = $.Event(Event.ITEM_RENDER, {item:itemEl})\n\n $(this._element).trigger(renderEvent)\n\n item.on(Event.CLICK_DATA_API, e => {\n this._selectItem(e.target);\n this._preventClose = true\n this.hide()\n e.preventDefault()\n this._preventClose = false\n })\n })\n }\n\n _selectItem(item){\n this._element.value = item.innerText\n\n if(this._config.onPick)\n this._config.onPick(this._element, item)\n\n const pickEvent = $.Event(Event.PICK, {item})\n $(this._element).trigger(pickEvent)\n }\n\n _showDropdown(){\n this._isShown = true\n this._dropdown.classList.add('show')\n }\n\n _showSpinner(){\n this._spinner.style.display = 'inline-block'\n }\n\n _truncateDropdown(){\n this._dropdown.innerHTML = ''\n }\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Autocomplete(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined')\n throw new TypeError(`No method named \"${config}\"`)\n data[config](relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Autocomplete._jQueryInterface\n$.fn[NAME].Constructor = Autocomplete\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Autocomplete._jQueryInterface\n}\n\nexport default Autocomplete\n"],"names":["TRANSITION_END","MAX_UID","MILLISECONDS_MULTIPLIER","toType","obj","toString","call","match","toLowerCase","getSpecialTransitionEndEvent","bindType","delegateType","handle","event","$","target","is","handleObj","handler","apply","arguments","undefined","transitionEndEmulator","duration","called","one","Util","setTimeout","triggerTransitionEnd","setTransitionEndSupport","fn","emulateTransitionEnd","special","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","err","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","expectedTypes","value","valueType","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","NAME","VERSION","DATA_KEY","EVENT_KEY","DATA_API_KEY","JQUERY_NO_CONFLICT","Default","list","prefetch","filter","filterDelay","filterMinChars","filterRelation","maxResult","onPick","onItemRendered","preProcess","DefaultType","Event","BLUR_DATA_API","CLICK_DATA_API","KEYDOWN_DATA_API","INPUT_DATA_API","PICK","ITEM_RENDER","KeyCode","ARROW_DOWN","ARROW_UP","ENTER","ESCAPE","Autocomplete","_config","_getConfig","_element","_items","_labels","_isShown","_dropdown","_spinner","_result","_query","_preventClose","_timer","_relations","hasAttribute","removeAttribute","TypeError","_handleRelations","setAttribute","_makeDropdown","_makeSpinner","_fetchPresetData","_addElementListener","show","length","_showDropdown","hide","_hideDropdown","dispose","off","removeData","clearTimeout","on","e","prevent","keyCode","altKey","_findFromList","_focusNext","_focusPrev","item","children","get","_selectItem","preventDefault","_truncateDropdown","dataList","Array","from","forEach","o","val","innerHTML","includes","push","_showSpinner","res","_hideSpinner","i","_findFromAjax","vval","url","replace","sep","k","el","local","_renderItem","label","next","focused","classList","remove","tmpNext","add","prev","name","change","style","display","position","tmpl","appendTo","right","top","offsetTop","items","itemEl","text","renderEvent","innerText","pickEvent","_jQueryInterface","relatedTarget","each","data","Constructor","noConflict"],"mappings":"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"} -------------------------------------------------------------------------------- /dist/js/bootstrap-autocomplete.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Autocomplete v0.2.0 (https://iqbalfn.github.io/bootstrap-autocomplete/) 3 | * Copyright 2019 Iqbal Fauzi 4 | * Licensed under MIT (https://github.com/iqbalfn/bootstrap-autocomplete/blob/master/LICENSE) 5 | */ 6 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],t):t((e=e||self)["bootstrap-autocomplete"]={},e.jQuery)}(this,function(e,s){"use strict";function i(e,t){for(var n=0;n=this._config.maxResult||(this._timer&&clearTimeout(this._timer),r=this._query,this._timer=setTimeout(function(){if(r==o._query){o._showSpinner();var e=o._config.filter.replace(/%23/g,"#").replace("#QUERY#",o._query);if(o._relations){var t,n=e.includes("?")?"&":"?";for(t in o._relations){var i=o._relations[t],i=s(i).val();i&&(e+=""+n+t+"="+i,n="&")}}s.get(e,function(e){o._hideSpinner(),o._config.preProcess&&(e=o._config.preProcess(e));var n=[];e.forEach(function(e){var t=e.toLowerCase();o._items.includes(t)||(o._items.push(t),o._labels[t]=e,n.push(e),o._result.push(e))}),n.length&&o._renderItem(n),o._result.length?o.show():o.hide()})}},this._config.filterDelay)))},n._findFromList=function(){var t=this;this._truncateDropdown(),this._result=[];var n=[];this._items.forEach(function(e){e.includes(t._query)&&(e=t._labels[e],t._result.includes(e)||(n.push(e),t._result.push(e)))}),n.length?(this._renderItem(n),this.show()):this.hide(),this._findFromAjax()},n._focusNext=function(){var e=s(this._dropdown).children(":first-child").get(0),t=s(this._dropdown).children(".active").get(0);t&&(t.classList.remove("active"),(t=s(t).next().get(0))&&(e=t)),e&&e.classList.add("active")},n._focusPrev=function(){var e=s(this._dropdown).children(":last-child").get(0),t=s(this._dropdown).children(".active").get(0);t&&(t.classList.remove("active"),(t=s(t).prev().get(0))&&(e=t)),e&&e.classList.add("active")},n._getConfig=function(e){return e=o({},f,e),l.typeCheckConfig(a,e,_),e},n._handleRelations=function(){var e,t=this;for(e in this._relations=[],this._config.filterRelation){var n=this._config.filterRelation[e];this._relations[e]=s(n).get(0),s(this._relations[e]).change(function(e){t._element.value="",s(t._element).change(),t._items=[]})}},n._hideDropdown=function(){this._isShown=!1,this._dropdown.classList.remove("show")},n._hideSpinner=function(){this._spinner.style.display="none"},n._makeDropdown=function(){this._element.parentNode.style.position="relative";this._dropdown=s('').appendTo(this._element.parentNode).get(0)},n._makeSpinner=function(){this._spinner=s('
').appendTo(this._element.parentNode).get(0),s(this._spinner).css({position:"absolute",right:s(this._element).css("padding-right"),top:this._element.offsetTop+(this._element.offsetHeight-this._spinner.offsetHeight)/2+"px"}),this._hideSpinner()},n._renderItem=function(e){var i=this;e.forEach(function(e){var t,n;i._dropdown.children.length>=i._config.maxResult||(n=(t=s('')).get(0),t.text(e).appendTo(i._dropdown),i._config.onItemRendered&&i._config.onItemRendered(i._element,n),n=s.Event(d.ITEM_RENDER,{item:n}),s(i._element).trigger(n),t.on(d.CLICK_DATA_API,function(e){i._selectItem(e.target),i._preventClose=!0,i.hide(),e.preventDefault(),i._preventClose=!1}))})},n._selectItem=function(e){this._element.value=e.innerText,this._config.onPick&&this._config.onPick(this._element,e);e=s.Event(d.PICK,{item:e});s(this._element).trigger(e)},n._showDropdown=function(){this._isShown=!0,this._dropdown.classList.add("show")},n._showSpinner=function(){this._spinner.style.display="inline-block"},n._truncateDropdown=function(){this._dropdown.innerHTML=""},r._jQueryInterface=function(n,i){return this.each(function(){var e=s(this).data(u),t=o({},f,s(this).data(),"object"==typeof n&&n?n:{});if(e||(e=new r(this,t),s(this).data(u,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](i)}})},e=r,t=[{key:"VERSION",get:function(){return"0.2.0"}},{key:"Default",get:function(){return f}}],(n=null)&&i(e.prototype,n),t&&i(e,t),r}();s.fn[a]=w._jQueryInterface,s.fn[a].Constructor=w,s.fn[a].noConflict=function(){return s.fn[a]=h,w._jQueryInterface},e.Autocomplete=w,Object.defineProperty(e,"__esModule",{value:!0})}); 7 | //# sourceMappingURL=bootstrap-autocomplete.min.js.map -------------------------------------------------------------------------------- /dist/js/bootstrap-autocomplete.min.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../../src/js/util.js","../../src/js/autocomplete.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle(event) {\n if ($(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n }\n return undefined // eslint-disable-line no-undefined\n }\n }\n}\n\nfunction transitionEndEmulator(duration) {\n let called = false\n\n $(this).one(Util.TRANSITION_END, () => {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap Autocomplete (v0.2.0): autocomplete.js\n * Licensed under MIT (https://github.com/iqbalfn/bootstrap-autocomplete/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'autocomplete'\nconst VERSION = '0.2.0'\nconst DATA_KEY = 'bs.autocomplete'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n list : null,\n\n prefetch : null,\n\n filter : null,\n filterDelay : 300,\n filterMinChars : 1,\n filterRelation : null,\n\n maxResult : 10,\n\n onPick : null,\n onItemRendered : null,\n\n preProcess : null\n}\n\nconst DefaultType = {\n list : '(null|string|element)',\n\n prefetch : '(null|string)',\n\n filter : '(null|string)',\n filterDelay : 'number',\n filterMinChars : 'number',\n filterRelation : '(null|object)',\n\n maxResult : 'number',\n\n preProcess : '(null|function)',\n\n onPick : '(null|function)',\n onItemRendered : '(null|function)'\n}\n\nconst Event = {\n BLUR_DATA_API : `blur${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n INPUT_DATA_API : `input${EVENT_KEY}${DATA_API_KEY}`,\n\n PICK : `pick${EVENT_KEY}`,\n ITEM_RENDER : `itemrender${EVENT_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_MENU : 'dropdown-menu',\n DROPDOWN_ITEM : 'dropdown-item'\n}\n\nconst KeyCode = {\n ARROW_DOWN : 40,\n ARROW_UP : 38,\n ENTER : 13,\n ESCAPE : 27\n}\n\nconst Selector = {}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Autocomplete {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n\n this._items = []\n this._labels = {}\n\n this._isShown = false\n this._dropdown = null\n this._spinner = null\n this._result = []\n this._query = ''\n this._preventClose = false\n this._timer = null\n this._relations = null\n\n if(element.hasAttribute('list')){\n this._config.list = '#' + element.getAttribute('list')\n element.removeAttribute('list')\n }\n\n if(!this._config.list && !this._config.prefetch && !this._config.filter)\n throw new TypeError('No data source provided')\n\n if(this._config.filterRelation)\n this._handleRelations()\n\n element.setAttribute('autocomplete', 'off')\n\n this._makeDropdown()\n this._makeSpinner()\n this._fetchPresetData()\n this._addElementListener()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n show(){\n if(this._isShown)\n return\n\n if(this._result.length)\n this._showDropdown()\n }\n\n hide(){\n if(!this._isShown)\n return\n\n this._hideDropdown()\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._items = null\n this._labels = null\n this._isShown = null\n this._dropdown = null\n this._spinner = null\n this._result = null\n this._query = null\n this._preventClose = null\n if(this._timer)\n clearTimeout(this._timer)\n this._timer = null\n }\n\n // Private\n\n _addElementListener(){\n $(this._element).on(Event.KEYDOWN_DATA_API, e => {\n let prevent = false\n\n switch(e.keyCode){\n case KeyCode.ARROW_DOWN:\n if(e.altKey && !this._isShown){\n this._query = this._element.value.trim().toLowerCase()\n\n if(this._query){\n this._findFromList()\n prevent = true\n }\n }else{\n this._focusNext()\n prevent = true\n }\n break;\n\n case KeyCode.ARROW_UP:\n this._focusPrev()\n prevent = true\n break;\n\n case KeyCode.ENTER:\n if(this._isShown){\n let item = $(this._dropdown).children('.active').get(0)\n if(!item)\n item = $(this._dropdown).children(':first-child').get(0)\n\n if(item)\n this._selectItem(item)\n\n this.hide()\n prevent = true\n }\n break;\n\n case KeyCode.ESCAPE:\n prevent = true\n this.hide()\n break;\n }\n\n if(prevent)\n e.preventDefault()\n })\n\n $(this._element).on(Event.INPUT_DATA_API, e => {\n this._query = this._element.value.trim().toLowerCase()\n\n if(!this._query){\n this._truncateDropdown()\n this.hide()\n }else{\n this._findFromList()\n }\n })\n\n $(this._element).on(Event.BLUR_DATA_API, e => {\n if(this._preventClose)\n return\n setTimeout(() => this.hide(), 150)\n })\n }\n\n _fetchPresetData(){\n // from datalist\n if(this._config.list){\n let dataList = this._config.list\n if(typeof dataList === 'string')\n dataList = document.querySelector(this._config.list)\n\n if(dataList){\n Array.from(dataList.children).forEach(o => {\n let val = o.innerHTML.toLowerCase()\n if(this._items.includes(val))\n return\n\n this._items.push(val)\n this._labels[val] = o.innerHTML\n })\n }\n }\n\n // from prefetch\n if(this._config.prefetch){\n this._showSpinner()\n $.get(this._config.prefetch, res => {\n this._hideSpinner()\n if(this._config.preProcess)\n res = this._config.preProcess(res)\n\n res.forEach(i => {\n let val = i.toLowerCase()\n if(this._items.includes(val))\n return\n this._items.push(val)\n this._labels[val] = i\n })\n })\n }\n }\n\n _findFromAjax(){\n if(!this._config.filter)\n return\n if(this._dropdown.children.length >= this._config.maxResult)\n return\n\n if(this._timer)\n clearTimeout(this._timer)\n\n let vval = this._query\n this._timer = setTimeout(() => {\n if(vval != this._query)\n return\n this._showSpinner()\n\n let url = this._config.filter\n .replace(/%23/g, '#')\n .replace('#QUERY#', this._query)\n\n if(this._relations){\n let sep = url.includes('?') ? '&' : '?'\n\n for(let k in this._relations){\n let el = this._relations[k]\n let val= $(el).val()\n if(!val)\n continue;\n\n url+= `${sep}${k}=${val}`\n sep = '&'\n }\n }\n\n $.get(url, res => {\n this._hideSpinner()\n if(this._config.preProcess)\n res = this._config.preProcess(res)\n\n let local = []\n res.forEach(i => {\n let val = i.toLowerCase()\n if(this._items.includes(val))\n return\n\n this._items.push(val)\n this._labels[val] = i\n\n local.push(i)\n this._result.push(i)\n })\n\n if(local.length)\n this._renderItem(local)\n\n if(this._result.length)\n this.show()\n else\n this.hide()\n })\n }, this._config.filterDelay)\n }\n\n _findFromList(){\n this._truncateDropdown()\n this._result = []\n\n let local = []\n this._items.forEach(i => {\n if(!i.includes(this._query))\n return\n\n let label = this._labels[i]\n\n if(this._result.includes(label))\n return\n\n local.push(label)\n this._result.push(label)\n })\n\n // now render the result\n if(local.length){\n this._renderItem(local)\n this.show()\n }else{\n this.hide()\n }\n\n this._findFromAjax()\n }\n\n _focusNext(){\n let next = $(this._dropdown).children(':first-child').get(0)\n let focused = $(this._dropdown).children('.active').get(0)\n\n if(focused){\n focused.classList.remove('active')\n let tmpNext = $(focused).next().get(0)\n if(tmpNext)\n next = tmpNext\n }\n\n if(next)\n next.classList.add('active')\n }\n\n _focusPrev(){\n let next = $(this._dropdown).children(':last-child').get(0)\n let focused = $(this._dropdown).children('.active').get(0)\n\n if(focused){\n focused.classList.remove('active')\n let tmpNext = $(focused).prev().get(0)\n if(tmpNext)\n next = tmpNext\n }\n\n if(next)\n next.classList.add('active')\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleRelations(){\n this._relations = []\n for(let name in this._config.filterRelation){\n let selector = this._config.filterRelation[name];\n this._relations[name] = $(selector).get(0)\n $(this._relations[name]).change(e => {\n this._element.value = ''\n $(this._element).change() // we need to trigger this manually\n this._items = []\n });\n }\n }\n\n _hideDropdown(){\n this._isShown = false\n this._dropdown.classList.remove('show')\n }\n\n _hideSpinner(){\n this._spinner.style.display = 'none'\n }\n\n _makeDropdown(){\n this._element.parentNode.style.position = 'relative'\n\n let tmpl = '
'\n\n this._dropdown = $(tmpl).appendTo(this._element.parentNode).get(0)\n\n }\n\n _makeSpinner(){\n let tmpl = '
'\n\n this._spinner = $(tmpl).appendTo(this._element.parentNode).get(0)\n\n $(this._spinner).css({\n position : 'absolute',\n right : $(this._element).css('padding-right'),\n top : (this._element.offsetTop + ((this._element.offsetHeight - this._spinner.offsetHeight)/2)) + 'px'\n })\n\n this._hideSpinner()\n }\n\n _renderItem(items){\n items.forEach(i => {\n if(this._dropdown.children.length >= this._config.maxResult)\n return\n\n let item = $('')\n let itemEl = item.get(0)\n\n item.text(i).appendTo(this._dropdown)\n\n if(this._config.onItemRendered)\n this._config.onItemRendered(this._element, itemEl)\n\n const renderEvent = $.Event(Event.ITEM_RENDER, {item:itemEl})\n\n $(this._element).trigger(renderEvent)\n\n item.on(Event.CLICK_DATA_API, e => {\n this._selectItem(e.target);\n this._preventClose = true\n this.hide()\n e.preventDefault()\n this._preventClose = false\n })\n })\n }\n\n _selectItem(item){\n this._element.value = item.innerText\n\n if(this._config.onPick)\n this._config.onPick(this._element, item)\n\n const pickEvent = $.Event(Event.PICK, {item})\n $(this._element).trigger(pickEvent)\n }\n\n _showDropdown(){\n this._isShown = true\n this._dropdown.classList.add('show')\n }\n\n _showSpinner(){\n this._spinner.style.display = 'inline-block'\n }\n\n _truncateDropdown(){\n this._dropdown.innerHTML = ''\n }\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Autocomplete(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined')\n throw new TypeError(`No method named \"${config}\"`)\n data[config](relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Autocomplete._jQueryInterface\n$.fn[NAME].Constructor = Autocomplete\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Autocomplete._jQueryInterface\n}\n\nexport default Autocomplete\n"],"names":["TRANSITION_END","transitionEndEmulator","duration","_this","this","called","$","one","Util","setTimeout","triggerTransitionEnd","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","err","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","obj","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","call","expectedTypes","value","valueType","toString","match","toLowerCase","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","ShadowRoot","parentNode","root","fn","emulateTransitionEnd","event","special","bindType","delegateType","handle","target","is","handleObj","handler","apply","arguments","NAME","DATA_KEY","EVENT_KEY","DATA_API_KEY","JQUERY_NO_CONFLICT","Default","list","prefetch","filter","filterDelay","filterMinChars","filterRelation","maxResult","onPick","onItemRendered","preProcess","DefaultType","Event","BLUR_DATA_API","CLICK_DATA_API","KEYDOWN_DATA_API","INPUT_DATA_API","PICK","ITEM_RENDER","KeyCode","Autocomplete","_config","_getConfig","_element","_items","_labels","_isShown","_dropdown","_spinner","_result","_query","_preventClose","_timer","_relations","hasAttribute","removeAttribute","TypeError","_handleRelations","setAttribute","_makeDropdown","_makeSpinner","_fetchPresetData","_addElementListener","show","length","_showDropdown","hide","_hideDropdown","dispose","off","removeData","clearTimeout","on","e","item","prevent","keyCode","altKey","_findFromList","_focusNext","_focusPrev","children","get","_selectItem","preventDefault","_truncateDropdown","dataList","_this2","Array","from","forEach","o","val","innerHTML","includes","push","_showSpinner","res","_hideSpinner","i","_findFromAjax","vval","_this3","url","replace","k","sep","el","local","_renderItem","_this4","label","next","focused","classList","remove","tmpNext","add","prev","_objectSpread","name","_this5","change","style","display","position","appendTo","right","top","offsetTop","items","_this6","renderEvent","itemEl","text","innerText","pickEvent","_jQueryInterface","relatedTarget","each","data","Constructor","noConflict"],"mappings":"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"} -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Bootstrap Autocomplete 10 | 11 | 26 | 27 | 33 | 34 | 35 | 36 | 53 | 54 |
55 |
56 |
57 |
58 |

Autocomplete

59 |

Use Bootstrap's JavaScript autocomplete plugin to view autocomplete suggestion while user typing.

60 | 61 |

This plugin use dropdown plugin to be able to work properly, make sure you include it in your custom build. For the ajax request, we're using jQuery ajax build-in function. You should not use the slim version of the jQuery.

62 | 63 |
64 |

Examples

65 | 66 |
67 |
68 |

List Source

69 |
70 |

List of autocomplete suggestion can be taken from datalist element ase below:

71 |
72 |
73 |
74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 |
90 | 91 | 96 |
97 |
98 |
99 |
100 | 101 |
102 |

Ajax Prefect

103 |
104 |

The suggestions text can also be prefect during initialize time. This method will call ajax request once in the render time. This method is better if suggestions text is 105 | not too many

106 |
107 |
108 |
109 | 110 | 111 |
112 | 113 | 118 |
119 |
120 |
121 |
122 | 123 |
124 |

Ajax Source

125 |
126 |

Suggestion text taken during user typing. This method is good for datalist that is too much for single request.

127 |
128 |
129 |
130 | 131 | 132 |
133 | 134 | 139 |
140 |
141 |
142 |
143 | 144 |
145 |

Ajax Source ( With Relation )

146 |
147 |

Add additional query string to ajax request during user typing by adding option filterRelation

148 |
149 |
150 |
151 | 152 | 162 |
163 |
164 | 165 | 171 |
172 | 173 | 178 |
179 |
180 |
181 |
182 | 183 |
184 |

On Render Item

185 |
186 |

Right after a suggestion item element already rendered and is already on view, event `itemrender.bs.autocomplete` will be called that get two parameters, element, and rendered item.

187 |
188 |
189 |
190 | 191 | 196 |
197 | 198 | 211 |
212 |
213 |
214 |
215 | 216 |
217 |

Pick Item

218 |
219 |

Right after user pick an option, event `pick.bs.autocomplete` will be called that get two parameters, element, and picked element.

220 |
221 |
222 |
223 | 224 | 229 |
230 | 231 | 244 |
245 |
246 |
247 |
248 |
249 |
250 | 251 |
252 |

Usage

253 | 254 |
255 |
256 |

Via JavaScript

257 |
258 |
259 |
260 | $('#input-url').autocomplete(options) 261 |
262 |
263 |
264 |
265 |
266 |
267 | 268 |
269 |

Server

270 |
271 |

Unless you provide preProcess options, the server should response with ajax as below:.

272 |
273 | [ 274 | "Asia/Jakarta", 275 | "Asia/Hongkong" 276 | ] 277 |
278 |
279 |
280 | 281 |
282 |

Options

283 |
284 |

Options can be passed via data attributes or JavaScript. For data attributes, append the option name to data-, as in data-filter="".

285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 |
NameTypeDefaultDescription
liststringnullThe id of datalist element to take the option from.
prefetchstringnullTarget URL to fetch for all enable option on the first init.
filterstringnullTarget URL to fetch the filtered result, the string #QUERY# will be replaced with user input.
filterDelayint300Total microsecond to wait since last user input before triggering ajax request.
filterMinCharsint1Total character user input to trigger ajax request.
filterRelationobjectnullRelated element to add on request query in form of key => selector. For example: {what: "#input-continent"}.
maxResultint10Total result to show on dropdown list.
onPickfunctionnullFunction to call after user picking the dropdown item. onPick(input, item)
onItemRenderedfunctionnullFunction to call right after item element rendered. onItemRendered(input, item).
preProcessfunctionnullProcess the ajax response to suit the response spec.
353 |
354 |
355 | 356 |
357 |

Events

358 |
359 |

Bootstrap autocomplete exposes a few events for hooking into suggestion functionality. All sugggestions events are fired at the input element itself.

360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 |
Event TypeDescription
pick.bs.autocompleteThis event fires immediately when user selecting any of suggestions option item.
itemrender.bs.autocompleteAn event that called right after suggestion item already rendered and is on view.
376 | 377 |
378 |
379 | $('#input-url').on('pick.bs.autocomplete', function(el, item){ 380 | // ... 381 | }) 382 | $('#input-url').on('itemrender.bs.autocomplete', function(el, item){ 383 | // ... 384 | }) 385 |
386 |
387 |
388 |
389 | 390 |
391 |
392 |
393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | -------------------------------------------------------------------------------- /docs/js/bootstrap-autocomplete.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Autocomplete v0.2.0 (https://iqbalfn.github.io/bootstrap-autocomplete/) 3 | * Copyright 2019 Iqbal Fauzi 4 | * Licensed under MIT (https://github.com/iqbalfn/bootstrap-autocomplete/blob/master/LICENSE) 5 | */ 6 | (function (global, factory) { 7 | typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) : 8 | typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) : 9 | (global = global || self, factory(global['bootstrap-autocomplete'] = {}, global.jQuery)); 10 | }(this, (function (exports, $) { 'use strict'; 11 | 12 | $ = $ && Object.prototype.hasOwnProperty.call($, 'default') ? $['default'] : $; 13 | 14 | function _defineProperties(target, props) { 15 | for (var i = 0; i < props.length; i++) { 16 | var descriptor = props[i]; 17 | descriptor.enumerable = descriptor.enumerable || false; 18 | descriptor.configurable = true; 19 | if ("value" in descriptor) descriptor.writable = true; 20 | Object.defineProperty(target, descriptor.key, descriptor); 21 | } 22 | } 23 | 24 | function _createClass(Constructor, protoProps, staticProps) { 25 | if (protoProps) _defineProperties(Constructor.prototype, protoProps); 26 | if (staticProps) _defineProperties(Constructor, staticProps); 27 | return Constructor; 28 | } 29 | 30 | function _defineProperty(obj, key, value) { 31 | if (key in obj) { 32 | Object.defineProperty(obj, key, { 33 | value: value, 34 | enumerable: true, 35 | configurable: true, 36 | writable: true 37 | }); 38 | } else { 39 | obj[key] = value; 40 | } 41 | 42 | return obj; 43 | } 44 | 45 | function _objectSpread(target) { 46 | for (var i = 1; i < arguments.length; i++) { 47 | var source = arguments[i] != null ? Object(arguments[i]) : {}; 48 | var ownKeys = Object.keys(source); 49 | 50 | if (typeof Object.getOwnPropertySymbols === 'function') { 51 | ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { 52 | return Object.getOwnPropertyDescriptor(source, sym).enumerable; 53 | })); 54 | } 55 | 56 | ownKeys.forEach(function (key) { 57 | _defineProperty(target, key, source[key]); 58 | }); 59 | } 60 | 61 | return target; 62 | } 63 | 64 | /** 65 | * -------------------------------------------------------------------------- 66 | * Bootstrap (v4.3.1): util.js 67 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 68 | * -------------------------------------------------------------------------- 69 | */ 70 | /** 71 | * ------------------------------------------------------------------------ 72 | * Private TransitionEnd Helpers 73 | * ------------------------------------------------------------------------ 74 | */ 75 | 76 | var TRANSITION_END = 'transitionend'; 77 | var MAX_UID = 1000000; 78 | var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) 79 | 80 | function toType(obj) { 81 | return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); 82 | } 83 | 84 | function getSpecialTransitionEndEvent() { 85 | return { 86 | bindType: TRANSITION_END, 87 | delegateType: TRANSITION_END, 88 | handle: function handle(event) { 89 | if ($(event.target).is(this)) { 90 | return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params 91 | } 92 | 93 | return undefined; // eslint-disable-line no-undefined 94 | } 95 | }; 96 | } 97 | 98 | function transitionEndEmulator(duration) { 99 | var _this = this; 100 | 101 | var called = false; 102 | $(this).one(Util.TRANSITION_END, function () { 103 | called = true; 104 | }); 105 | setTimeout(function () { 106 | if (!called) { 107 | Util.triggerTransitionEnd(_this); 108 | } 109 | }, duration); 110 | return this; 111 | } 112 | 113 | function setTransitionEndSupport() { 114 | $.fn.emulateTransitionEnd = transitionEndEmulator; 115 | $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); 116 | } 117 | /** 118 | * -------------------------------------------------------------------------- 119 | * Public Util Api 120 | * -------------------------------------------------------------------------- 121 | */ 122 | 123 | 124 | var Util = { 125 | TRANSITION_END: 'bsTransitionEnd', 126 | getUID: function getUID(prefix) { 127 | do { 128 | // eslint-disable-next-line no-bitwise 129 | prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here 130 | } while (document.getElementById(prefix)); 131 | 132 | return prefix; 133 | }, 134 | getSelectorFromElement: function getSelectorFromElement(element) { 135 | var selector = element.getAttribute('data-target'); 136 | 137 | if (!selector || selector === '#') { 138 | var hrefAttr = element.getAttribute('href'); 139 | selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; 140 | } 141 | 142 | try { 143 | return document.querySelector(selector) ? selector : null; 144 | } catch (err) { 145 | return null; 146 | } 147 | }, 148 | getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { 149 | if (!element) { 150 | return 0; 151 | } // Get transition-duration of the element 152 | 153 | 154 | var transitionDuration = $(element).css('transition-duration'); 155 | var transitionDelay = $(element).css('transition-delay'); 156 | var floatTransitionDuration = parseFloat(transitionDuration); 157 | var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found 158 | 159 | if (!floatTransitionDuration && !floatTransitionDelay) { 160 | return 0; 161 | } // If multiple durations are defined, take the first 162 | 163 | 164 | transitionDuration = transitionDuration.split(',')[0]; 165 | transitionDelay = transitionDelay.split(',')[0]; 166 | return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; 167 | }, 168 | reflow: function reflow(element) { 169 | return element.offsetHeight; 170 | }, 171 | triggerTransitionEnd: function triggerTransitionEnd(element) { 172 | $(element).trigger(TRANSITION_END); 173 | }, 174 | // TODO: Remove in v5 175 | supportsTransitionEnd: function supportsTransitionEnd() { 176 | return Boolean(TRANSITION_END); 177 | }, 178 | isElement: function isElement(obj) { 179 | return (obj[0] || obj).nodeType; 180 | }, 181 | typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { 182 | for (var property in configTypes) { 183 | if (Object.prototype.hasOwnProperty.call(configTypes, property)) { 184 | var expectedTypes = configTypes[property]; 185 | var value = config[property]; 186 | var valueType = value && Util.isElement(value) ? 'element' : toType(value); 187 | 188 | if (!new RegExp(expectedTypes).test(valueType)) { 189 | throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); 190 | } 191 | } 192 | } 193 | }, 194 | findShadowRoot: function findShadowRoot(element) { 195 | if (!document.documentElement.attachShadow) { 196 | return null; 197 | } // Can find the shadow root otherwise it'll return the document 198 | 199 | 200 | if (typeof element.getRootNode === 'function') { 201 | var root = element.getRootNode(); 202 | return root instanceof ShadowRoot ? root : null; 203 | } 204 | 205 | if (element instanceof ShadowRoot) { 206 | return element; 207 | } // when we don't find a shadow root 208 | 209 | 210 | if (!element.parentNode) { 211 | return null; 212 | } 213 | 214 | return Util.findShadowRoot(element.parentNode); 215 | } 216 | }; 217 | setTransitionEndSupport(); 218 | 219 | /** 220 | * ------------------------------------------------------------------------ 221 | * Constants 222 | * ------------------------------------------------------------------------ 223 | */ 224 | 225 | var NAME = 'autocomplete'; 226 | var VERSION = '0.2.0'; 227 | var DATA_KEY = 'bs.autocomplete'; 228 | var EVENT_KEY = "." + DATA_KEY; 229 | var DATA_API_KEY = '.data-api'; 230 | var JQUERY_NO_CONFLICT = $.fn[NAME]; 231 | var Default = { 232 | list: null, 233 | prefetch: null, 234 | filter: null, 235 | filterDelay: 300, 236 | filterMinChars: 1, 237 | filterRelation: null, 238 | maxResult: 10, 239 | onPick: null, 240 | onItemRendered: null, 241 | preProcess: null 242 | }; 243 | var DefaultType = { 244 | list: '(null|string|element)', 245 | prefetch: '(null|string)', 246 | filter: '(null|string)', 247 | filterDelay: 'number', 248 | filterMinChars: 'number', 249 | filterRelation: '(null|object)', 250 | maxResult: 'number', 251 | preProcess: '(null|function)', 252 | onPick: '(null|function)', 253 | onItemRendered: '(null|function)' 254 | }; 255 | var Event = { 256 | BLUR_DATA_API: "blur" + EVENT_KEY + DATA_API_KEY, 257 | CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY, 258 | KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY, 259 | INPUT_DATA_API: "input" + EVENT_KEY + DATA_API_KEY, 260 | PICK: "pick" + EVENT_KEY, 261 | ITEM_RENDER: "itemrender" + EVENT_KEY 262 | }; 263 | var KeyCode = { 264 | ARROW_DOWN: 40, 265 | ARROW_UP: 38, 266 | ENTER: 13, 267 | ESCAPE: 27 268 | }; 269 | /** 270 | * ------------------------------------------------------------------------ 271 | * Class Definition 272 | * ------------------------------------------------------------------------ 273 | */ 274 | 275 | var Autocomplete = /*#__PURE__*/function () { 276 | function Autocomplete(element, config) { 277 | this._config = this._getConfig(config); 278 | this._element = element; 279 | this._items = []; 280 | this._labels = {}; 281 | this._isShown = false; 282 | this._dropdown = null; 283 | this._spinner = null; 284 | this._result = []; 285 | this._query = ''; 286 | this._preventClose = false; 287 | this._timer = null; 288 | this._relations = null; 289 | 290 | if (element.hasAttribute('list')) { 291 | this._config.list = '#' + element.getAttribute('list'); 292 | element.removeAttribute('list'); 293 | } 294 | 295 | if (!this._config.list && !this._config.prefetch && !this._config.filter) throw new TypeError('No data source provided'); 296 | if (this._config.filterRelation) this._handleRelations(); 297 | element.setAttribute('autocomplete', 'off'); 298 | 299 | this._makeDropdown(); 300 | 301 | this._makeSpinner(); 302 | 303 | this._fetchPresetData(); 304 | 305 | this._addElementListener(); 306 | } // Getters 307 | 308 | 309 | var _proto = Autocomplete.prototype; 310 | 311 | // Public 312 | _proto.show = function show() { 313 | if (this._isShown) return; 314 | if (this._result.length) this._showDropdown(); 315 | }; 316 | 317 | _proto.hide = function hide() { 318 | if (!this._isShown) return; 319 | 320 | this._hideDropdown(); 321 | }; 322 | 323 | _proto.dispose = function dispose() { 324 | $(this._element).off(EVENT_KEY); 325 | $.removeData(this._element, DATA_KEY); 326 | this._config = null; 327 | this._element = null; 328 | this._items = null; 329 | this._labels = null; 330 | this._isShown = null; 331 | this._dropdown = null; 332 | this._spinner = null; 333 | this._result = null; 334 | this._query = null; 335 | this._preventClose = null; 336 | if (this._timer) clearTimeout(this._timer); 337 | this._timer = null; 338 | } // Private 339 | ; 340 | 341 | _proto._addElementListener = function _addElementListener() { 342 | var _this = this; 343 | 344 | $(this._element).on(Event.KEYDOWN_DATA_API, function (e) { 345 | var prevent = false; 346 | 347 | switch (e.keyCode) { 348 | case KeyCode.ARROW_DOWN: 349 | if (e.altKey && !_this._isShown) { 350 | _this._query = _this._element.value.trim().toLowerCase(); 351 | 352 | if (_this._query) { 353 | _this._findFromList(); 354 | 355 | prevent = true; 356 | } 357 | } else { 358 | _this._focusNext(); 359 | 360 | prevent = true; 361 | } 362 | 363 | break; 364 | 365 | case KeyCode.ARROW_UP: 366 | _this._focusPrev(); 367 | 368 | prevent = true; 369 | break; 370 | 371 | case KeyCode.ENTER: 372 | if (_this._isShown) { 373 | var item = $(_this._dropdown).children('.active').get(0); 374 | if (!item) item = $(_this._dropdown).children(':first-child').get(0); 375 | if (item) _this._selectItem(item); 376 | 377 | _this.hide(); 378 | 379 | prevent = true; 380 | } 381 | 382 | break; 383 | 384 | case KeyCode.ESCAPE: 385 | prevent = true; 386 | 387 | _this.hide(); 388 | 389 | break; 390 | } 391 | 392 | if (prevent) e.preventDefault(); 393 | }); 394 | $(this._element).on(Event.INPUT_DATA_API, function (e) { 395 | _this._query = _this._element.value.trim().toLowerCase(); 396 | 397 | if (!_this._query) { 398 | _this._truncateDropdown(); 399 | 400 | _this.hide(); 401 | } else { 402 | _this._findFromList(); 403 | } 404 | }); 405 | $(this._element).on(Event.BLUR_DATA_API, function (e) { 406 | if (_this._preventClose) return; 407 | setTimeout(function () { 408 | return _this.hide(); 409 | }, 150); 410 | }); 411 | }; 412 | 413 | _proto._fetchPresetData = function _fetchPresetData() { 414 | var _this2 = this; 415 | 416 | // from datalist 417 | if (this._config.list) { 418 | var dataList = this._config.list; 419 | if (typeof dataList === 'string') dataList = document.querySelector(this._config.list); 420 | 421 | if (dataList) { 422 | Array.from(dataList.children).forEach(function (o) { 423 | var val = o.innerHTML.toLowerCase(); 424 | if (_this2._items.includes(val)) return; 425 | 426 | _this2._items.push(val); 427 | 428 | _this2._labels[val] = o.innerHTML; 429 | }); 430 | } 431 | } // from prefetch 432 | 433 | 434 | if (this._config.prefetch) { 435 | this._showSpinner(); 436 | 437 | $.get(this._config.prefetch, function (res) { 438 | _this2._hideSpinner(); 439 | 440 | if (_this2._config.preProcess) res = _this2._config.preProcess(res); 441 | res.forEach(function (i) { 442 | var val = i.toLowerCase(); 443 | if (_this2._items.includes(val)) return; 444 | 445 | _this2._items.push(val); 446 | 447 | _this2._labels[val] = i; 448 | }); 449 | }); 450 | } 451 | }; 452 | 453 | _proto._findFromAjax = function _findFromAjax() { 454 | var _this3 = this; 455 | 456 | if (!this._config.filter) return; 457 | if (this._dropdown.children.length >= this._config.maxResult) return; 458 | if (this._query.length < this._config.filterMinChars) return; 459 | if (this._timer) clearTimeout(this._timer); 460 | var vval = this._query; 461 | this._timer = setTimeout(function () { 462 | if (vval != _this3._query) return; 463 | 464 | _this3._showSpinner(); 465 | 466 | var url = _this3._config.filter.replace(/%23/g, '#').replace('#QUERY#', _this3._query); 467 | 468 | if (_this3._relations) { 469 | var sep = url.includes('?') ? '&' : '?'; 470 | 471 | for (var k in _this3._relations) { 472 | var el = _this3._relations[k]; 473 | var val = $(el).val(); 474 | if (!val) continue; 475 | url += "" + sep + k + "=" + val; 476 | sep = '&'; 477 | } 478 | } 479 | 480 | $.get(url, function (res) { 481 | _this3._hideSpinner(); 482 | 483 | if (_this3._config.preProcess) res = _this3._config.preProcess(res); 484 | var local = []; 485 | res.forEach(function (i) { 486 | var val = i.toLowerCase(); 487 | if (_this3._items.includes(val)) return; 488 | 489 | _this3._items.push(val); 490 | 491 | _this3._labels[val] = i; 492 | local.push(i); 493 | 494 | _this3._result.push(i); 495 | }); 496 | if (local.length) _this3._renderItem(local); 497 | if (_this3._result.length) _this3.show();else _this3.hide(); 498 | }); 499 | }, this._config.filterDelay); 500 | }; 501 | 502 | _proto._findFromList = function _findFromList() { 503 | var _this4 = this; 504 | 505 | this._truncateDropdown(); 506 | 507 | this._result = []; 508 | var local = []; 509 | 510 | this._items.forEach(function (i) { 511 | if (!i.includes(_this4._query)) return; 512 | var label = _this4._labels[i]; 513 | if (_this4._result.includes(label)) return; 514 | local.push(label); 515 | 516 | _this4._result.push(label); 517 | }); // now render the result 518 | 519 | 520 | if (local.length) { 521 | this._renderItem(local); 522 | 523 | this.show(); 524 | } else { 525 | this.hide(); 526 | } 527 | 528 | this._findFromAjax(); 529 | }; 530 | 531 | _proto._focusNext = function _focusNext() { 532 | var next = $(this._dropdown).children(':first-child').get(0); 533 | var focused = $(this._dropdown).children('.active').get(0); 534 | 535 | if (focused) { 536 | focused.classList.remove('active'); 537 | var tmpNext = $(focused).next().get(0); 538 | if (tmpNext) next = tmpNext; 539 | } 540 | 541 | if (next) next.classList.add('active'); 542 | }; 543 | 544 | _proto._focusPrev = function _focusPrev() { 545 | var next = $(this._dropdown).children(':last-child').get(0); 546 | var focused = $(this._dropdown).children('.active').get(0); 547 | 548 | if (focused) { 549 | focused.classList.remove('active'); 550 | var tmpNext = $(focused).prev().get(0); 551 | if (tmpNext) next = tmpNext; 552 | } 553 | 554 | if (next) next.classList.add('active'); 555 | }; 556 | 557 | _proto._getConfig = function _getConfig(config) { 558 | config = _objectSpread({}, Default, config); 559 | Util.typeCheckConfig(NAME, config, DefaultType); 560 | return config; 561 | }; 562 | 563 | _proto._handleRelations = function _handleRelations() { 564 | var _this5 = this; 565 | 566 | this._relations = []; 567 | 568 | for (var name in this._config.filterRelation) { 569 | var selector = this._config.filterRelation[name]; 570 | this._relations[name] = $(selector).get(0); 571 | $(this._relations[name]).change(function (e) { 572 | _this5._element.value = ''; 573 | $(_this5._element).change(); // we need to trigger this manually 574 | 575 | _this5._items = []; 576 | }); 577 | } 578 | }; 579 | 580 | _proto._hideDropdown = function _hideDropdown() { 581 | this._isShown = false; 582 | 583 | this._dropdown.classList.remove('show'); 584 | }; 585 | 586 | _proto._hideSpinner = function _hideSpinner() { 587 | this._spinner.style.display = 'none'; 588 | }; 589 | 590 | _proto._makeDropdown = function _makeDropdown() { 591 | this._element.parentNode.style.position = 'relative'; 592 | var tmpl = ''; 593 | this._dropdown = $(tmpl).appendTo(this._element.parentNode).get(0); 594 | }; 595 | 596 | _proto._makeSpinner = function _makeSpinner() { 597 | var tmpl = '
'; 598 | this._spinner = $(tmpl).appendTo(this._element.parentNode).get(0); 599 | $(this._spinner).css({ 600 | position: 'absolute', 601 | right: $(this._element).css('padding-right'), 602 | top: this._element.offsetTop + (this._element.offsetHeight - this._spinner.offsetHeight) / 2 + 'px' 603 | }); 604 | 605 | this._hideSpinner(); 606 | }; 607 | 608 | _proto._renderItem = function _renderItem(items) { 609 | var _this6 = this; 610 | 611 | items.forEach(function (i) { 612 | if (_this6._dropdown.children.length >= _this6._config.maxResult) return; 613 | var item = $(''); 614 | var itemEl = item.get(0); 615 | item.text(i).appendTo(_this6._dropdown); 616 | if (_this6._config.onItemRendered) _this6._config.onItemRendered(_this6._element, itemEl); 617 | var renderEvent = $.Event(Event.ITEM_RENDER, { 618 | item: itemEl 619 | }); 620 | $(_this6._element).trigger(renderEvent); 621 | item.on(Event.CLICK_DATA_API, function (e) { 622 | _this6._selectItem(e.target); 623 | 624 | _this6._preventClose = true; 625 | 626 | _this6.hide(); 627 | 628 | e.preventDefault(); 629 | _this6._preventClose = false; 630 | }); 631 | }); 632 | }; 633 | 634 | _proto._selectItem = function _selectItem(item) { 635 | this._element.value = item.innerText; 636 | if (this._config.onPick) this._config.onPick(this._element, item); 637 | var pickEvent = $.Event(Event.PICK, { 638 | item: item 639 | }); 640 | $(this._element).trigger(pickEvent); 641 | }; 642 | 643 | _proto._showDropdown = function _showDropdown() { 644 | this._isShown = true; 645 | 646 | this._dropdown.classList.add('show'); 647 | }; 648 | 649 | _proto._showSpinner = function _showSpinner() { 650 | this._spinner.style.display = 'inline-block'; 651 | }; 652 | 653 | _proto._truncateDropdown = function _truncateDropdown() { 654 | this._dropdown.innerHTML = ''; 655 | } // Static 656 | ; 657 | 658 | Autocomplete._jQueryInterface = function _jQueryInterface(config, relatedTarget) { 659 | return this.each(function () { 660 | var data = $(this).data(DATA_KEY); 661 | 662 | var _config = _objectSpread({}, Default, $(this).data(), typeof config === 'object' && config ? config : {}); 663 | 664 | if (!data) { 665 | data = new Autocomplete(this, _config); 666 | $(this).data(DATA_KEY, data); 667 | } 668 | 669 | if (typeof config === 'string') { 670 | if (typeof data[config] === 'undefined') throw new TypeError("No method named \"" + config + "\""); 671 | data[config](relatedTarget); 672 | } 673 | }); 674 | }; 675 | 676 | _createClass(Autocomplete, null, [{ 677 | key: "VERSION", 678 | get: function get() { 679 | return VERSION; 680 | } 681 | }, { 682 | key: "Default", 683 | get: function get() { 684 | return Default; 685 | } 686 | }]); 687 | 688 | return Autocomplete; 689 | }(); 690 | /** 691 | * ------------------------------------------------------------------------ 692 | * jQuery 693 | * ------------------------------------------------------------------------ 694 | */ 695 | 696 | 697 | $.fn[NAME] = Autocomplete._jQueryInterface; 698 | $.fn[NAME].Constructor = Autocomplete; 699 | 700 | $.fn[NAME].noConflict = function () { 701 | $.fn[NAME] = JQUERY_NO_CONFLICT; 702 | return Autocomplete._jQueryInterface; 703 | }; 704 | 705 | exports.Autocomplete = Autocomplete; 706 | 707 | Object.defineProperty(exports, '__esModule', { value: true }); 708 | 709 | }))); 710 | //# sourceMappingURL=bootstrap-autocomplete.js.map 711 | -------------------------------------------------------------------------------- /docs/js/bootstrap-autocomplete.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"bootstrap-autocomplete.js","sources":["../../src/js/util.js","../../src/js/autocomplete.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n return {\n bindType: TRANSITION_END,\n delegateType: TRANSITION_END,\n handle(event) {\n if ($(event.target).is(this)) {\n return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n }\n return undefined // eslint-disable-line no-undefined\n }\n }\n}\n\nfunction transitionEndEmulator(duration) {\n let called = false\n\n $(this).one(Util.TRANSITION_END, () => {\n called = true\n })\n\n setTimeout(() => {\n if (!called) {\n Util.triggerTransitionEnd(this)\n }\n }, duration)\n\n return this\n}\n\nfunction setTransitionEndSupport() {\n $.fn.emulateTransitionEnd = transitionEndEmulator\n $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n TRANSITION_END: 'bsTransitionEnd',\n\n getUID(prefix) {\n do {\n // eslint-disable-next-line no-bitwise\n prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n } while (document.getElementById(prefix))\n return prefix\n },\n\n getSelectorFromElement(element) {\n let selector = element.getAttribute('data-target')\n\n if (!selector || selector === '#') {\n const hrefAttr = element.getAttribute('href')\n selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n }\n\n try {\n return document.querySelector(selector) ? selector : null\n } catch (err) {\n return null\n }\n },\n\n getTransitionDurationFromElement(element) {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let transitionDuration = $(element).css('transition-duration')\n let transitionDelay = $(element).css('transition-delay')\n\n const floatTransitionDuration = parseFloat(transitionDuration)\n const floatTransitionDelay = parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n },\n\n reflow(element) {\n return element.offsetHeight\n },\n\n triggerTransitionEnd(element) {\n $(element).trigger(TRANSITION_END)\n },\n\n // TODO: Remove in v5\n supportsTransitionEnd() {\n return Boolean(TRANSITION_END)\n },\n\n isElement(obj) {\n return (obj[0] || obj).nodeType\n },\n\n typeCheckConfig(componentName, config, configTypes) {\n for (const property in configTypes) {\n if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n const expectedTypes = configTypes[property]\n const value = config[property]\n const valueType = value && Util.isElement(value)\n ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new Error(\n `${componentName.toUpperCase()}: ` +\n `Option \"${property}\" provided type \"${valueType}\" ` +\n `but expected type \"${expectedTypes}\".`)\n }\n }\n }\n },\n\n findShadowRoot(element) {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return Util.findShadowRoot(element.parentNode)\n }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap Autocomplete (v0.2.0): autocomplete.js\n * Licensed under MIT (https://github.com/iqbalfn/bootstrap-autocomplete/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'autocomplete'\nconst VERSION = '0.2.0'\nconst DATA_KEY = 'bs.autocomplete'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n list : null,\n\n prefetch : null,\n\n filter : null,\n filterDelay : 300,\n filterMinChars : 1,\n filterRelation : null,\n\n maxResult : 10,\n\n onPick : null,\n onItemRendered : null,\n\n preProcess : null\n}\n\nconst DefaultType = {\n list : '(null|string|element)',\n\n prefetch : '(null|string)',\n\n filter : '(null|string)',\n filterDelay : 'number',\n filterMinChars : 'number',\n filterRelation : '(null|object)',\n\n maxResult : 'number',\n\n preProcess : '(null|function)',\n\n onPick : '(null|function)',\n onItemRendered : '(null|function)'\n}\n\nconst Event = {\n BLUR_DATA_API : `blur${EVENT_KEY}${DATA_API_KEY}`,\n CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,\n KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n INPUT_DATA_API : `input${EVENT_KEY}${DATA_API_KEY}`,\n\n PICK : `pick${EVENT_KEY}`,\n ITEM_RENDER : `itemrender${EVENT_KEY}`\n}\n\nconst ClassName = {\n DROPDOWN_MENU : 'dropdown-menu',\n DROPDOWN_ITEM : 'dropdown-item'\n}\n\nconst KeyCode = {\n ARROW_DOWN : 40,\n ARROW_UP : 38,\n ENTER : 13,\n ESCAPE : 27\n}\n\nconst Selector = {}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Autocomplete {\n constructor(element, config) {\n this._config = this._getConfig(config)\n this._element = element\n\n this._items = []\n this._labels = {}\n\n this._isShown = false\n this._dropdown = null\n this._spinner = null\n this._result = []\n this._query = ''\n this._preventClose = false\n this._timer = null\n this._relations = null\n\n if(element.hasAttribute('list')){\n this._config.list = '#' + element.getAttribute('list')\n element.removeAttribute('list')\n }\n\n if(!this._config.list && !this._config.prefetch && !this._config.filter)\n throw new TypeError('No data source provided')\n\n if(this._config.filterRelation)\n this._handleRelations()\n\n element.setAttribute('autocomplete', 'off')\n\n this._makeDropdown()\n this._makeSpinner()\n this._fetchPresetData()\n this._addElementListener()\n }\n\n // Getters\n\n static get VERSION() {\n return VERSION\n }\n\n static get Default() {\n return Default\n }\n\n // Public\n\n show(){\n if(this._isShown)\n return\n\n if(this._result.length)\n this._showDropdown()\n }\n\n hide(){\n if(!this._isShown)\n return\n\n this._hideDropdown()\n }\n\n dispose() {\n $(this._element).off(EVENT_KEY)\n\n $.removeData(this._element, DATA_KEY)\n\n this._config = null\n this._element = null\n this._items = null\n this._labels = null\n this._isShown = null\n this._dropdown = null\n this._spinner = null\n this._result = null\n this._query = null\n this._preventClose = null\n if(this._timer)\n clearTimeout(this._timer)\n this._timer = null\n }\n\n // Private\n\n _addElementListener(){\n $(this._element).on(Event.KEYDOWN_DATA_API, e => {\n let prevent = false\n\n switch(e.keyCode){\n case KeyCode.ARROW_DOWN:\n if(e.altKey && !this._isShown){\n this._query = this._element.value.trim().toLowerCase()\n\n if(this._query){\n this._findFromList()\n prevent = true\n }\n }else{\n this._focusNext()\n prevent = true\n }\n break;\n\n case KeyCode.ARROW_UP:\n this._focusPrev()\n prevent = true\n break;\n\n case KeyCode.ENTER:\n if(this._isShown){\n let item = $(this._dropdown).children('.active').get(0)\n if(!item)\n item = $(this._dropdown).children(':first-child').get(0)\n\n if(item)\n this._selectItem(item)\n\n this.hide()\n prevent = true\n }\n break;\n\n case KeyCode.ESCAPE:\n prevent = true\n this.hide()\n break;\n }\n\n if(prevent)\n e.preventDefault()\n })\n\n $(this._element).on(Event.INPUT_DATA_API, e => {\n this._query = this._element.value.trim().toLowerCase()\n\n if(!this._query){\n this._truncateDropdown()\n this.hide()\n }else{\n this._findFromList()\n }\n })\n\n $(this._element).on(Event.BLUR_DATA_API, e => {\n if(this._preventClose)\n return\n setTimeout(() => this.hide(), 150)\n })\n }\n\n _fetchPresetData(){\n // from datalist\n if(this._config.list){\n let dataList = this._config.list\n if(typeof dataList === 'string')\n dataList = document.querySelector(this._config.list)\n\n if(dataList){\n Array.from(dataList.children).forEach(o => {\n let val = o.innerHTML.toLowerCase()\n if(this._items.includes(val))\n return\n\n this._items.push(val)\n this._labels[val] = o.innerHTML\n })\n }\n }\n\n // from prefetch\n if(this._config.prefetch){\n this._showSpinner()\n $.get(this._config.prefetch, res => {\n this._hideSpinner()\n if(this._config.preProcess)\n res = this._config.preProcess(res)\n\n res.forEach(i => {\n let val = i.toLowerCase()\n if(this._items.includes(val))\n return\n this._items.push(val)\n this._labels[val] = i\n })\n })\n }\n }\n\n _findFromAjax(){\n if(!this._config.filter)\n return\n if(this._dropdown.children.length >= this._config.maxResult)\n return\n\n if(this._timer)\n clearTimeout(this._timer)\n\n let vval = this._query\n this._timer = setTimeout(() => {\n if(vval != this._query)\n return\n this._showSpinner()\n\n let url = this._config.filter\n .replace(/%23/g, '#')\n .replace('#QUERY#', this._query)\n\n if(this._relations){\n let sep = url.includes('?') ? '&' : '?'\n\n for(let k in this._relations){\n let el = this._relations[k]\n let val= $(el).val()\n if(!val)\n continue;\n\n url+= `${sep}${k}=${val}`\n sep = '&'\n }\n }\n\n $.get(url, res => {\n this._hideSpinner()\n if(this._config.preProcess)\n res = this._config.preProcess(res)\n\n let local = []\n res.forEach(i => {\n let val = i.toLowerCase()\n if(this._items.includes(val))\n return\n\n this._items.push(val)\n this._labels[val] = i\n\n local.push(i)\n this._result.push(i)\n })\n\n if(local.length)\n this._renderItem(local)\n\n if(this._result.length)\n this.show()\n else\n this.hide()\n })\n }, this._config.filterDelay)\n }\n\n _findFromList(){\n this._truncateDropdown()\n this._result = []\n\n let local = []\n this._items.forEach(i => {\n if(!i.includes(this._query))\n return\n\n let label = this._labels[i]\n\n if(this._result.includes(label))\n return\n\n local.push(label)\n this._result.push(label)\n })\n\n // now render the result\n if(local.length){\n this._renderItem(local)\n this.show()\n }else{\n this.hide()\n }\n\n this._findFromAjax()\n }\n\n _focusNext(){\n let next = $(this._dropdown).children(':first-child').get(0)\n let focused = $(this._dropdown).children('.active').get(0)\n\n if(focused){\n focused.classList.remove('active')\n let tmpNext = $(focused).next().get(0)\n if(tmpNext)\n next = tmpNext\n }\n\n if(next)\n next.classList.add('active')\n }\n\n _focusPrev(){\n let next = $(this._dropdown).children(':last-child').get(0)\n let focused = $(this._dropdown).children('.active').get(0)\n\n if(focused){\n focused.classList.remove('active')\n let tmpNext = $(focused).prev().get(0)\n if(tmpNext)\n next = tmpNext\n }\n\n if(next)\n next.classList.add('active')\n }\n\n _getConfig(config) {\n config = {\n ...Default,\n ...config\n }\n Util.typeCheckConfig(NAME, config, DefaultType)\n return config\n }\n\n _handleRelations(){\n this._relations = []\n for(let name in this._config.filterRelation){\n let selector = this._config.filterRelation[name];\n this._relations[name] = $(selector).get(0)\n $(this._relations[name]).change(e => {\n this._element.value = ''\n $(this._element).change() // we need to trigger this manually\n this._items = []\n });\n }\n }\n\n _hideDropdown(){\n this._isShown = false\n this._dropdown.classList.remove('show')\n }\n\n _hideSpinner(){\n this._spinner.style.display = 'none'\n }\n\n _makeDropdown(){\n this._element.parentNode.style.position = 'relative'\n\n let tmpl = '
'\n\n this._dropdown = $(tmpl).appendTo(this._element.parentNode).get(0)\n\n }\n\n _makeSpinner(){\n let tmpl = '
'\n\n this._spinner = $(tmpl).appendTo(this._element.parentNode).get(0)\n\n $(this._spinner).css({\n position : 'absolute',\n right : $(this._element).css('padding-right'),\n top : (this._element.offsetTop + ((this._element.offsetHeight - this._spinner.offsetHeight)/2)) + 'px'\n })\n\n this._hideSpinner()\n }\n\n _renderItem(items){\n items.forEach(i => {\n if(this._dropdown.children.length >= this._config.maxResult)\n return\n\n let item = $('')\n let itemEl = item.get(0)\n\n item.text(i).appendTo(this._dropdown)\n\n if(this._config.onItemRendered)\n this._config.onItemRendered(this._element, itemEl)\n\n const renderEvent = $.Event(Event.ITEM_RENDER, {item:itemEl})\n\n $(this._element).trigger(renderEvent)\n\n item.on(Event.CLICK_DATA_API, e => {\n this._selectItem(e.target);\n this._preventClose = true\n this.hide()\n e.preventDefault()\n this._preventClose = false\n })\n })\n }\n\n _selectItem(item){\n this._element.value = item.innerText\n\n if(this._config.onPick)\n this._config.onPick(this._element, item)\n\n const pickEvent = $.Event(Event.PICK, {item})\n $(this._element).trigger(pickEvent)\n }\n\n _showDropdown(){\n this._isShown = true\n this._dropdown.classList.add('show')\n }\n\n _showSpinner(){\n this._spinner.style.display = 'inline-block'\n }\n\n _truncateDropdown(){\n this._dropdown.innerHTML = ''\n }\n\n // Static\n\n static _jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n let data = $(this).data(DATA_KEY)\n const _config = {\n ...Default,\n ...$(this).data(),\n ...typeof config === 'object' && config ? config : {}\n }\n\n if (!data) {\n data = new Autocomplete(this, _config)\n $(this).data(DATA_KEY, data)\n }\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined')\n throw new TypeError(`No method named \"${config}\"`)\n data[config](relatedTarget)\n }\n })\n }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Autocomplete._jQueryInterface\n$.fn[NAME].Constructor = Autocomplete\n$.fn[NAME].noConflict = () => {\n $.fn[NAME] = JQUERY_NO_CONFLICT\n return Autocomplete._jQueryInterface\n}\n\nexport default Autocomplete\n"],"names":["TRANSITION_END","MAX_UID","MILLISECONDS_MULTIPLIER","toType","obj","toString","call","match","toLowerCase","getSpecialTransitionEndEvent","bindType","delegateType","handle","event","$","target","is","handleObj","handler","apply","arguments","undefined","transitionEndEmulator","duration","called","one","Util","setTimeout","triggerTransitionEnd","setTransitionEndSupport","fn","emulateTransitionEnd","special","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","err","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","expectedTypes","value","valueType","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","parentNode","NAME","VERSION","DATA_KEY","EVENT_KEY","DATA_API_KEY","JQUERY_NO_CONFLICT","Default","list","prefetch","filter","filterDelay","filterMinChars","filterRelation","maxResult","onPick","onItemRendered","preProcess","DefaultType","Event","BLUR_DATA_API","CLICK_DATA_API","KEYDOWN_DATA_API","INPUT_DATA_API","PICK","ITEM_RENDER","KeyCode","ARROW_DOWN","ARROW_UP","ENTER","ESCAPE","Autocomplete","_config","_getConfig","_element","_items","_labels","_isShown","_dropdown","_spinner","_result","_query","_preventClose","_timer","_relations","hasAttribute","removeAttribute","TypeError","_handleRelations","setAttribute","_makeDropdown","_makeSpinner","_fetchPresetData","_addElementListener","show","length","_showDropdown","hide","_hideDropdown","dispose","off","removeData","clearTimeout","on","e","prevent","keyCode","altKey","_findFromList","_focusNext","_focusPrev","item","children","get","_selectItem","preventDefault","_truncateDropdown","dataList","Array","from","forEach","o","val","innerHTML","includes","push","_showSpinner","res","_hideSpinner","i","_findFromAjax","vval","url","replace","sep","k","el","local","_renderItem","label","next","focused","classList","remove","tmpNext","add","prev","name","change","style","display","position","tmpl","appendTo","right","top","offsetTop","items","itemEl","text","renderEvent","innerText","pickEvent","_jQueryInterface","relatedTarget","each","data","Constructor","noConflict"],"mappings":"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"} -------------------------------------------------------------------------------- /docs/js/mock.js: -------------------------------------------------------------------------------- 1 | $.get = function(url, cb){ 2 | let target = new URL(url) 3 | let search = target.search.replace(/^\?/, ''); 4 | let queries= search.split('&'); 5 | let cond = {} 6 | 7 | queries.forEach(x => { 8 | let y = x.split('=') 9 | cond[y[0]] = (y[1] || y[0]).toLowerCase(); 10 | }) 11 | 12 | console.log('Mocking request: ' + url) 13 | 14 | let result = [] 15 | window.TIMEZONES.forEach(x => { 16 | if(cond.group){ 17 | let names = x.split('/') 18 | if(names[0].toLowerCase() != cond.group) 19 | return; 20 | } 21 | 22 | if(cond.q && !x.toLowerCase().includes(cond.q)) 23 | return; 24 | 25 | result.push(x) 26 | }) 27 | cb(result) 28 | } -------------------------------------------------------------------------------- /docs/js/source.js: -------------------------------------------------------------------------------- 1 | let els = document.querySelectorAll('.source-code') 2 | 3 | for(let el of els){ 4 | let text = el.innerHTML 5 | 6 | // let fix the source code 7 | let lines = text.split("\n"); 8 | let rows = []; 9 | let tabSize = 1000; 10 | 11 | for(let i=0; i/g, '>'); 46 | code.innerHTML = text; 47 | 48 | Prism.highlightElement(code); 49 | } -------------------------------------------------------------------------------- /docs/js/timezone.js: -------------------------------------------------------------------------------- 1 | window.TIMEZONES = [ 2 | "Africa/Abidjan", 3 | "Africa/Accra", 4 | "Africa/Addis_Ababa", 5 | "Africa/Algiers", 6 | "Africa/Asmara", 7 | "Africa/Bamako", 8 | "Africa/Bangui", 9 | "Africa/Banjul", 10 | "Africa/Bissau", 11 | "Africa/Blantyre", 12 | "Africa/Brazzaville", 13 | "Africa/Bujumbura", 14 | "Africa/Cairo", 15 | "Africa/Casablanca", 16 | "Africa/Ceuta", 17 | "Africa/Conakry", 18 | "Africa/Dakar", 19 | "Africa/Dar_es_Salaam", 20 | "Africa/Djibouti", 21 | "Africa/Douala", 22 | "Africa/El_Aaiun", 23 | "Africa/Freetown", 24 | "Africa/Gaborone", 25 | "Africa/Harare", 26 | "Africa/Johannesburg", 27 | "Africa/Juba", 28 | "Africa/Kampala", 29 | "Africa/Khartoum", 30 | "Africa/Kigali", 31 | "Africa/Kinshasa", 32 | "Africa/Lagos", 33 | "Africa/Libreville", 34 | "Africa/Lome", 35 | "Africa/Luanda", 36 | "Africa/Lubumbashi", 37 | "Africa/Lusaka", 38 | "Africa/Malabo", 39 | "Africa/Maputo", 40 | "Africa/Maseru", 41 | "Africa/Mbabane", 42 | "Africa/Mogadishu", 43 | "Africa/Monrovia", 44 | "Africa/Nairobi", 45 | "Africa/Ndjamena", 46 | "Africa/Niamey", 47 | "Africa/Nouakchott", 48 | "Africa/Ouagadougou", 49 | "Africa/Porto-Novo", 50 | "Africa/Sao_Tome", 51 | "Africa/Tripoli", 52 | "Africa/Tunis", 53 | "Africa/Windhoek", 54 | "America/Adak", 55 | "America/Anchorage", 56 | "America/Anguilla", 57 | "America/Antigua", 58 | "America/Araguaina", 59 | "America/Argentina/Buenos_Aires", 60 | "America/Argentina/Catamarca", 61 | "America/Argentina/Cordoba", 62 | "America/Argentina/Jujuy", 63 | "America/Argentina/La_Rioja", 64 | "America/Argentina/Mendoza", 65 | "America/Argentina/Rio_Gallegos", 66 | "America/Argentina/Salta", 67 | "America/Argentina/San_Juan", 68 | "America/Argentina/San_Luis", 69 | "America/Argentina/Tucuman", 70 | "America/Argentina/Ushuaia", 71 | "America/Aruba", 72 | "America/Asuncion", 73 | "America/Atikokan", 74 | "America/Bahia", 75 | "America/Bahia_Banderas", 76 | "America/Barbados", 77 | "America/Belem", 78 | "America/Belize", 79 | "America/Blanc-Sablon", 80 | "America/Boa_Vista", 81 | "America/Bogota", 82 | "America/Boise", 83 | "America/Cambridge_Bay", 84 | "America/Campo_Grande", 85 | "America/Cancun", 86 | "America/Caracas", 87 | "America/Cayenne", 88 | "America/Cayman", 89 | "America/Chicago", 90 | "America/Chihuahua", 91 | "America/Costa_Rica", 92 | "America/Creston", 93 | "America/Cuiaba", 94 | "America/Curacao", 95 | "America/Danmarkshavn", 96 | "America/Dawson", 97 | "America/Dawson_Creek", 98 | "America/Denver", 99 | "America/Detroit", 100 | "America/Dominica", 101 | "America/Edmonton", 102 | "America/Eirunepe", 103 | "America/El_Salvador", 104 | "America/Fort_Nelson", 105 | "America/Fortaleza", 106 | "America/Glace_Bay", 107 | "America/Godthab", 108 | "America/Goose_Bay", 109 | "America/Grand_Turk", 110 | "America/Grenada", 111 | "America/Guadeloupe", 112 | "America/Guatemala", 113 | "America/Guayaquil", 114 | "America/Guyana", 115 | "America/Halifax", 116 | "America/Havana", 117 | "America/Hermosillo", 118 | "America/Indiana/Indianapolis", 119 | "America/Indiana/Knox", 120 | "America/Indiana/Marengo", 121 | "America/Indiana/Petersburg", 122 | "America/Indiana/Tell_City", 123 | "America/Indiana/Vevay", 124 | "America/Indiana/Vincennes", 125 | "America/Indiana/Winamac", 126 | "America/Inuvik", 127 | "America/Iqaluit", 128 | "America/Jamaica", 129 | "America/Juneau", 130 | "America/Kentucky/Louisville", 131 | "America/Kentucky/Monticello", 132 | "America/Kralendijk", 133 | "America/La_Paz", 134 | "America/Lima", 135 | "America/Los_Angeles", 136 | "America/Lower_Princes", 137 | "America/Maceio", 138 | "America/Managua", 139 | "America/Manaus", 140 | "America/Marigot", 141 | "America/Martinique", 142 | "America/Matamoros", 143 | "America/Mazatlan", 144 | "America/Menominee", 145 | "America/Merida", 146 | "America/Metlakatla", 147 | "America/Mexico_City", 148 | "America/Miquelon", 149 | "America/Moncton", 150 | "America/Monterrey", 151 | "America/Montevideo", 152 | "America/Montserrat", 153 | "America/Nassau", 154 | "America/New_York", 155 | "America/Nipigon", 156 | "America/Nome", 157 | "America/Noronha", 158 | "America/North_Dakota/Beulah", 159 | "America/North_Dakota/Center", 160 | "America/North_Dakota/New_Salem", 161 | "America/Ojinaga", 162 | "America/Panama", 163 | "America/Pangnirtung", 164 | "America/Paramaribo", 165 | "America/Phoenix", 166 | "America/Port-au-Prince", 167 | "America/Port_of_Spain", 168 | "America/Porto_Velho", 169 | "America/Puerto_Rico", 170 | "America/Punta_Arenas", 171 | "America/Rainy_River", 172 | "America/Rankin_Inlet", 173 | "America/Recife", 174 | "America/Regina", 175 | "America/Resolute", 176 | "America/Rio_Branco", 177 | "America/Santarem", 178 | "America/Santiago", 179 | "America/Santo_Domingo", 180 | "America/Sao_Paulo", 181 | "America/Scoresbysund", 182 | "America/Sitka", 183 | "America/St_Barthelemy", 184 | "America/St_Johns", 185 | "America/St_Kitts", 186 | "America/St_Lucia", 187 | "America/St_Thomas", 188 | "America/St_Vincent", 189 | "America/Swift_Current", 190 | "America/Tegucigalpa", 191 | "America/Thule", 192 | "America/Thunder_Bay", 193 | "America/Tijuana", 194 | "America/Toronto", 195 | "America/Tortola", 196 | "America/Vancouver", 197 | "America/Whitehorse", 198 | "America/Winnipeg", 199 | "America/Yakutat", 200 | "America/Yellowknife", 201 | "Antarctica/Casey", 202 | "Antarctica/Davis", 203 | "Antarctica/DumontDUrville", 204 | "Antarctica/Macquarie", 205 | "Antarctica/Mawson", 206 | "Antarctica/McMurdo", 207 | "Antarctica/Palmer", 208 | "Antarctica/Rothera", 209 | "Antarctica/Syowa", 210 | "Antarctica/Troll", 211 | "Antarctica/Vostok", 212 | "Arctic/Longyearbyen", 213 | "Asia/Aden", 214 | "Asia/Almaty", 215 | "Asia/Amman", 216 | "Asia/Anadyr", 217 | "Asia/Aqtau", 218 | "Asia/Aqtobe", 219 | "Asia/Ashgabat", 220 | "Asia/Atyrau", 221 | "Asia/Baghdad", 222 | "Asia/Bahrain", 223 | "Asia/Baku", 224 | "Asia/Bangkok", 225 | "Asia/Barnaul", 226 | "Asia/Beirut", 227 | "Asia/Bishkek", 228 | "Asia/Brunei", 229 | "Asia/Chita", 230 | "Asia/Choibalsan", 231 | "Asia/Colombo", 232 | "Asia/Damascus", 233 | "Asia/Dhaka", 234 | "Asia/Dili", 235 | "Asia/Dubai", 236 | "Asia/Dushanbe", 237 | "Asia/Famagusta", 238 | "Asia/Gaza", 239 | "Asia/Hebron", 240 | "Asia/Ho_Chi_Minh", 241 | "Asia/Hong_Kong", 242 | "Asia/Hovd", 243 | "Asia/Irkutsk", 244 | "Asia/Jakarta", 245 | "Asia/Jayapura", 246 | "Asia/Jerusalem", 247 | "Asia/Kabul", 248 | "Asia/Kamchatka", 249 | "Asia/Karachi", 250 | "Asia/Kathmandu", 251 | "Asia/Khandyga", 252 | "Asia/Kolkata", 253 | "Asia/Krasnoyarsk", 254 | "Asia/Kuala_Lumpur", 255 | "Asia/Kuching", 256 | "Asia/Kuwait", 257 | "Asia/Macau", 258 | "Asia/Magadan", 259 | "Asia/Makassar", 260 | "Asia/Manila", 261 | "Asia/Muscat", 262 | "Asia/Nicosia", 263 | "Asia/Novokuznetsk", 264 | "Asia/Novosibirsk", 265 | "Asia/Omsk", 266 | "Asia/Oral", 267 | "Asia/Phnom_Penh", 268 | "Asia/Pontianak", 269 | "Asia/Pyongyang", 270 | "Asia/Qatar", 271 | "Asia/Qostanay", 272 | "Asia/Qyzylorda", 273 | "Asia/Riyadh", 274 | "Asia/Sakhalin", 275 | "Asia/Samarkand", 276 | "Asia/Seoul", 277 | "Asia/Shanghai", 278 | "Asia/Singapore", 279 | "Asia/Srednekolymsk", 280 | "Asia/Taipei", 281 | "Asia/Tashkent", 282 | "Asia/Tbilisi", 283 | "Asia/Tehran", 284 | "Asia/Thimphu", 285 | "Asia/Tokyo", 286 | "Asia/Tomsk", 287 | "Asia/Ulaanbaatar", 288 | "Asia/Urumqi", 289 | "Asia/Ust-Nera", 290 | "Asia/Vientiane", 291 | "Asia/Vladivostok", 292 | "Asia/Yakutsk", 293 | "Asia/Yangon", 294 | "Asia/Yekaterinburg", 295 | "Asia/Yerevan", 296 | "Atlantic/Azores", 297 | "Atlantic/Bermuda", 298 | "Atlantic/Canary", 299 | "Atlantic/Cape_Verde", 300 | "Atlantic/Faroe", 301 | "Atlantic/Madeira", 302 | "Atlantic/Reykjavik", 303 | "Atlantic/South_Georgia", 304 | "Atlantic/St_Helena", 305 | "Atlantic/Stanley", 306 | "Australia/Adelaide", 307 | "Australia/Brisbane", 308 | "Australia/Broken_Hill", 309 | "Australia/Currie", 310 | "Australia/Darwin", 311 | "Australia/Eucla", 312 | "Australia/Hobart", 313 | "Australia/Lindeman", 314 | "Australia/Lord_Howe", 315 | "Australia/Melbourne", 316 | "Australia/Perth", 317 | "Australia/Sydney", 318 | "Europe/Amsterdam", 319 | "Europe/Andorra", 320 | "Europe/Astrakhan", 321 | "Europe/Athens", 322 | "Europe/Belgrade", 323 | "Europe/Berlin", 324 | "Europe/Bratislava", 325 | "Europe/Brussels", 326 | "Europe/Bucharest", 327 | "Europe/Budapest", 328 | "Europe/Busingen", 329 | "Europe/Chisinau", 330 | "Europe/Copenhagen", 331 | "Europe/Dublin", 332 | "Europe/Gibraltar", 333 | "Europe/Guernsey", 334 | "Europe/Helsinki", 335 | "Europe/Isle_of_Man", 336 | "Europe/Istanbul", 337 | "Europe/Jersey", 338 | "Europe/Kaliningrad", 339 | "Europe/Kiev", 340 | "Europe/Kirov", 341 | "Europe/Lisbon", 342 | "Europe/Ljubljana", 343 | "Europe/London", 344 | "Europe/Luxembourg", 345 | "Europe/Madrid", 346 | "Europe/Malta", 347 | "Europe/Mariehamn", 348 | "Europe/Minsk", 349 | "Europe/Monaco", 350 | "Europe/Moscow", 351 | "Europe/Oslo", 352 | "Europe/Paris", 353 | "Europe/Podgorica", 354 | "Europe/Prague", 355 | "Europe/Riga", 356 | "Europe/Rome", 357 | "Europe/Samara", 358 | "Europe/San_Marino", 359 | "Europe/Sarajevo", 360 | "Europe/Saratov", 361 | "Europe/Simferopol", 362 | "Europe/Skopje", 363 | "Europe/Sofia", 364 | "Europe/Stockholm", 365 | "Europe/Tallinn", 366 | "Europe/Tirane", 367 | "Europe/Ulyanovsk", 368 | "Europe/Uzhgorod", 369 | "Europe/Vaduz", 370 | "Europe/Vatican", 371 | "Europe/Vienna", 372 | "Europe/Vilnius", 373 | "Europe/Volgograd", 374 | "Europe/Warsaw", 375 | "Europe/Zagreb", 376 | "Europe/Zaporozhye", 377 | "Europe/Zurich", 378 | "Indian/Antananarivo", 379 | "Indian/Chagos", 380 | "Indian/Christmas", 381 | "Indian/Cocos", 382 | "Indian/Comoro", 383 | "Indian/Kerguelen", 384 | "Indian/Mahe", 385 | "Indian/Maldives", 386 | "Indian/Mauritius", 387 | "Indian/Mayotte", 388 | "Indian/Reunion", 389 | "Pacific/Apia", 390 | "Pacific/Auckland", 391 | "Pacific/Bougainville", 392 | "Pacific/Chatham", 393 | "Pacific/Chuuk", 394 | "Pacific/Easter", 395 | "Pacific/Efate", 396 | "Pacific/Enderbury", 397 | "Pacific/Fakaofo", 398 | "Pacific/Fiji", 399 | "Pacific/Funafuti", 400 | "Pacific/Galapagos", 401 | "Pacific/Gambier", 402 | "Pacific/Guadalcanal", 403 | "Pacific/Guam", 404 | "Pacific/Honolulu", 405 | "Pacific/Kiritimati", 406 | "Pacific/Kosrae", 407 | "Pacific/Kwajalein", 408 | "Pacific/Majuro", 409 | "Pacific/Marquesas", 410 | "Pacific/Midway", 411 | "Pacific/Nauru", 412 | "Pacific/Niue", 413 | "Pacific/Norfolk", 414 | "Pacific/Noumea", 415 | "Pacific/Pago_Pago", 416 | "Pacific/Palau", 417 | "Pacific/Pitcairn", 418 | "Pacific/Pohnpei", 419 | "Pacific/Port_Moresby", 420 | "Pacific/Rarotonga", 421 | "Pacific/Saipan", 422 | "Pacific/Tahiti", 423 | "Pacific/Tarawa", 424 | "Pacific/Tongatapu", 425 | "Pacific/Wake", 426 | "Pacific/Wallis" 427 | ]; -------------------------------------------------------------------------------- /docs/timezone.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iqbalfn/bootstrap-autocomplete/216b1322822b548d04b7434f97a857f4c1e77136/docs/timezone.json -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bootstrap-autocomplete", 3 | "version": "0.2.0", 4 | "description": "Bootstrap Autocomplete Component", 5 | "main": "index.js", 6 | "directories": { 7 | "doc": "docs" 8 | }, 9 | "scripts": { 10 | "js": "npm run js-compile && npm run js-minify", 11 | "js-compile": "rollup --config build/rollup.config.js --sourcemap", 12 | "js-minify": "uglifyjs --compress typeofs=false --mangle --comments \"/^!/\" --source-map \"content='dist/js/bootstrap-autocomplete.js.map',includeSources,url='bootstrap-autocomplete.min.js.map'\" --output dist/js/bootstrap-autocomplete.min.js dist/js/bootstrap-autocomplete.js" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/iqbalfn/bootstrap-autocomplete.git" 17 | }, 18 | "keywords": [ 19 | "ui", 20 | "bootstrap", 21 | "input", 22 | "autocomplete" 23 | ], 24 | "author": "Iqbal Fauzi (https://iqbalfn.com/)", 25 | "license": "MIT", 26 | "bugs": { 27 | "url": "https://github.com/iqbalfn/bootstrap-autocomplete/issues" 28 | }, 29 | "homepage": "https://github.com/iqbalfn/bootstrap-autocomplete#readme", 30 | "devDependencies": { 31 | "@babel/core": "^7.12.10", 32 | "@babel/plugin-proposal-object-rest-spread": "7.4.4", 33 | "@babel/preset-env": "^7.12.11", 34 | "babel-plugin-istanbul": "^5.1.4", 35 | "grunt": "^1.6.1", 36 | "grunt-contrib-copy": "^1.0.0", 37 | "grunt-contrib-watch": "^1.1.0", 38 | "grunt-run": "^0.8.1", 39 | "rollup": "^1.32.1", 40 | "rollup-plugin-babel": "^4.4.0", 41 | "rollup-plugin-commonjs": "^9.3.4", 42 | "rollup-plugin-node-resolve": "^4.2.4", 43 | "uglify-js": "^3.12.4" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/js/autocomplete.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap Autocomplete (v0.2.0): autocomplete.js 4 | * Licensed under MIT (https://github.com/iqbalfn/bootstrap-autocomplete/blob/master/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | import $ from 'jquery' 9 | import Util from './util' 10 | 11 | /** 12 | * ------------------------------------------------------------------------ 13 | * Constants 14 | * ------------------------------------------------------------------------ 15 | */ 16 | 17 | const NAME = 'autocomplete' 18 | const VERSION = '0.2.0' 19 | const DATA_KEY = 'bs.autocomplete' 20 | const EVENT_KEY = `.${DATA_KEY}` 21 | const DATA_API_KEY = '.data-api' 22 | const JQUERY_NO_CONFLICT = $.fn[NAME] 23 | 24 | const Default = { 25 | list : null, 26 | 27 | prefetch : null, 28 | 29 | filter : null, 30 | filterDelay : 300, 31 | filterMinChars : 1, 32 | filterRelation : null, 33 | 34 | maxResult : 10, 35 | 36 | onPick : null, 37 | onItemRendered : null, 38 | 39 | preProcess : null 40 | } 41 | 42 | const DefaultType = { 43 | list : '(null|string|element)', 44 | 45 | prefetch : '(null|string)', 46 | 47 | filter : '(null|string)', 48 | filterDelay : 'number', 49 | filterMinChars : 'number', 50 | filterRelation : '(null|object)', 51 | 52 | maxResult : 'number', 53 | 54 | preProcess : '(null|function)', 55 | 56 | onPick : '(null|function)', 57 | onItemRendered : '(null|function)' 58 | } 59 | 60 | const Event = { 61 | BLUR_DATA_API : `blur${EVENT_KEY}${DATA_API_KEY}`, 62 | CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`, 63 | KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`, 64 | INPUT_DATA_API : `input${EVENT_KEY}${DATA_API_KEY}`, 65 | 66 | PICK : `pick${EVENT_KEY}`, 67 | ITEM_RENDER : `itemrender${EVENT_KEY}` 68 | } 69 | 70 | const ClassName = { 71 | DROPDOWN_MENU : 'dropdown-menu', 72 | DROPDOWN_ITEM : 'dropdown-item' 73 | } 74 | 75 | const KeyCode = { 76 | ARROW_DOWN : 40, 77 | ARROW_UP : 38, 78 | ENTER : 13, 79 | ESCAPE : 27 80 | } 81 | 82 | const Selector = {} 83 | 84 | /** 85 | * ------------------------------------------------------------------------ 86 | * Class Definition 87 | * ------------------------------------------------------------------------ 88 | */ 89 | 90 | class Autocomplete { 91 | constructor(element, config) { 92 | this._config = this._getConfig(config) 93 | this._element = element 94 | 95 | this._items = [] 96 | this._labels = {} 97 | 98 | this._isShown = false 99 | this._dropdown = null 100 | this._spinner = null 101 | this._result = [] 102 | this._query = '' 103 | this._preventClose = false 104 | this._timer = null 105 | this._relations = null 106 | 107 | if(element.hasAttribute('list')){ 108 | this._config.list = '#' + element.getAttribute('list') 109 | element.removeAttribute('list') 110 | } 111 | 112 | if(!this._config.list && !this._config.prefetch && !this._config.filter) 113 | throw new TypeError('No data source provided') 114 | 115 | if(this._config.filterRelation) 116 | this._handleRelations() 117 | 118 | element.setAttribute('autocomplete', 'off') 119 | 120 | this._makeDropdown() 121 | this._makeSpinner() 122 | this._fetchPresetData() 123 | this._addElementListener() 124 | } 125 | 126 | // Getters 127 | 128 | static get VERSION() { 129 | return VERSION 130 | } 131 | 132 | static get Default() { 133 | return Default 134 | } 135 | 136 | // Public 137 | 138 | show(){ 139 | if(this._isShown) 140 | return 141 | 142 | if(this._result.length) 143 | this._showDropdown() 144 | } 145 | 146 | hide(){ 147 | if(!this._isShown) 148 | return 149 | 150 | this._hideDropdown() 151 | } 152 | 153 | dispose() { 154 | $(this._element).off(EVENT_KEY) 155 | 156 | $.removeData(this._element, DATA_KEY) 157 | 158 | this._config = null 159 | this._element = null 160 | this._items = null 161 | this._labels = null 162 | this._isShown = null 163 | this._dropdown = null 164 | this._spinner = null 165 | this._result = null 166 | this._query = null 167 | this._preventClose = null 168 | if(this._timer) 169 | clearTimeout(this._timer) 170 | this._timer = null 171 | } 172 | 173 | // Private 174 | 175 | _addElementListener(){ 176 | $(this._element).on(Event.KEYDOWN_DATA_API, e => { 177 | let prevent = false 178 | 179 | switch(e.keyCode){ 180 | case KeyCode.ARROW_DOWN: 181 | if(e.altKey && !this._isShown){ 182 | this._query = this._element.value.trim().toLowerCase() 183 | 184 | if(this._query){ 185 | this._findFromList() 186 | prevent = true 187 | } 188 | }else{ 189 | this._focusNext() 190 | prevent = true 191 | } 192 | break; 193 | 194 | case KeyCode.ARROW_UP: 195 | this._focusPrev() 196 | prevent = true 197 | break; 198 | 199 | case KeyCode.ENTER: 200 | if(this._isShown){ 201 | let item = $(this._dropdown).children('.active').get(0) 202 | if(!item) 203 | item = $(this._dropdown).children(':first-child').get(0) 204 | 205 | if(item) 206 | this._selectItem(item) 207 | 208 | this.hide() 209 | prevent = true 210 | } 211 | break; 212 | 213 | case KeyCode.ESCAPE: 214 | prevent = true 215 | this.hide() 216 | break; 217 | } 218 | 219 | if(prevent) 220 | e.preventDefault() 221 | }) 222 | 223 | $(this._element).on(Event.INPUT_DATA_API, e => { 224 | this._query = this._element.value.trim().toLowerCase() 225 | 226 | if(!this._query){ 227 | this._truncateDropdown() 228 | this.hide() 229 | }else{ 230 | this._findFromList() 231 | } 232 | }) 233 | 234 | $(this._element).on(Event.BLUR_DATA_API, e => { 235 | if(this._preventClose) 236 | return 237 | setTimeout(() => this.hide(), 150) 238 | }) 239 | } 240 | 241 | _fetchPresetData(){ 242 | // from datalist 243 | if(this._config.list){ 244 | let dataList = this._config.list 245 | if(typeof dataList === 'string') 246 | dataList = document.querySelector(this._config.list) 247 | 248 | if(dataList){ 249 | Array.from(dataList.children).forEach(o => { 250 | let val = o.innerHTML.toLowerCase() 251 | if(this._items.includes(val)) 252 | return 253 | 254 | this._items.push(val) 255 | this._labels[val] = o.innerHTML 256 | }) 257 | } 258 | } 259 | 260 | // from prefetch 261 | if(this._config.prefetch){ 262 | this._showSpinner() 263 | $.get(this._config.prefetch, res => { 264 | this._hideSpinner() 265 | if(this._config.preProcess) 266 | res = this._config.preProcess(res) 267 | 268 | res.forEach(i => { 269 | let val = i.toLowerCase() 270 | if(this._items.includes(val)) 271 | return 272 | this._items.push(val) 273 | this._labels[val] = i 274 | }) 275 | }) 276 | } 277 | } 278 | 279 | _findFromAjax(){ 280 | if(!this._config.filter) 281 | return 282 | if(this._dropdown.children.length >= this._config.maxResult) 283 | return 284 | 285 | if(this._timer) 286 | clearTimeout(this._timer) 287 | 288 | let vval = this._query 289 | this._timer = setTimeout(() => { 290 | if(vval != this._query) 291 | return 292 | this._showSpinner() 293 | 294 | let url = this._config.filter 295 | .replace(/%23/g, '#') 296 | .replace('#QUERY#', this._query) 297 | 298 | if(this._relations){ 299 | let sep = url.includes('?') ? '&' : '?' 300 | 301 | for(let k in this._relations){ 302 | let el = this._relations[k] 303 | let val= $(el).val() 304 | if(!val) 305 | continue; 306 | 307 | url+= `${sep}${k}=${val}` 308 | sep = '&' 309 | } 310 | } 311 | 312 | $.get(url, res => { 313 | this._hideSpinner() 314 | if(this._config.preProcess) 315 | res = this._config.preProcess(res) 316 | 317 | let local = [] 318 | res.forEach(i => { 319 | let val = i.toLowerCase() 320 | if(this._items.includes(val)) 321 | return 322 | 323 | this._items.push(val) 324 | this._labels[val] = i 325 | 326 | local.push(i) 327 | this._result.push(i) 328 | }) 329 | 330 | if(local.length) 331 | this._renderItem(local) 332 | 333 | if(this._result.length) 334 | this.show() 335 | else 336 | this.hide() 337 | }) 338 | }, this._config.filterDelay) 339 | } 340 | 341 | _findFromList(){ 342 | this._truncateDropdown() 343 | this._result = [] 344 | 345 | let local = [] 346 | this._items.forEach(i => { 347 | if(!i.includes(this._query)) 348 | return 349 | 350 | let label = this._labels[i] 351 | 352 | if(this._result.includes(label)) 353 | return 354 | 355 | local.push(label) 356 | this._result.push(label) 357 | }) 358 | 359 | // now render the result 360 | if(local.length){ 361 | this._renderItem(local) 362 | this.show() 363 | }else{ 364 | this.hide() 365 | } 366 | 367 | this._findFromAjax() 368 | } 369 | 370 | _focusNext(){ 371 | let next = $(this._dropdown).children(':first-child').get(0) 372 | let focused = $(this._dropdown).children('.active').get(0) 373 | 374 | if(focused){ 375 | focused.classList.remove('active') 376 | let tmpNext = $(focused).next().get(0) 377 | if(tmpNext) 378 | next = tmpNext 379 | } 380 | 381 | if(next) 382 | next.classList.add('active') 383 | } 384 | 385 | _focusPrev(){ 386 | let next = $(this._dropdown).children(':last-child').get(0) 387 | let focused = $(this._dropdown).children('.active').get(0) 388 | 389 | if(focused){ 390 | focused.classList.remove('active') 391 | let tmpNext = $(focused).prev().get(0) 392 | if(tmpNext) 393 | next = tmpNext 394 | } 395 | 396 | if(next) 397 | next.classList.add('active') 398 | } 399 | 400 | _getConfig(config) { 401 | config = { 402 | ...Default, 403 | ...config 404 | } 405 | Util.typeCheckConfig(NAME, config, DefaultType) 406 | return config 407 | } 408 | 409 | _handleRelations(){ 410 | this._relations = [] 411 | for(let name in this._config.filterRelation){ 412 | let selector = this._config.filterRelation[name]; 413 | this._relations[name] = $(selector).get(0) 414 | $(this._relations[name]).change(e => { 415 | this._element.value = '' 416 | $(this._element).change() // we need to trigger this manually 417 | this._items = [] 418 | }); 419 | } 420 | } 421 | 422 | _hideDropdown(){ 423 | this._isShown = false 424 | this._dropdown.classList.remove('show') 425 | } 426 | 427 | _hideSpinner(){ 428 | this._spinner.style.display = 'none' 429 | } 430 | 431 | _makeDropdown(){ 432 | this._element.parentNode.style.position = 'relative' 433 | 434 | let tmpl = '' 435 | 436 | this._dropdown = $(tmpl).appendTo(this._element.parentNode).get(0) 437 | 438 | } 439 | 440 | _makeSpinner(){ 441 | let tmpl = '
' 442 | 443 | this._spinner = $(tmpl).appendTo(this._element.parentNode).get(0) 444 | 445 | $(this._spinner).css({ 446 | position : 'absolute', 447 | right : $(this._element).css('padding-right'), 448 | top : (this._element.offsetTop + ((this._element.offsetHeight - this._spinner.offsetHeight)/2)) + 'px' 449 | }) 450 | 451 | this._hideSpinner() 452 | } 453 | 454 | _renderItem(items){ 455 | items.forEach(i => { 456 | if(this._dropdown.children.length >= this._config.maxResult) 457 | return 458 | 459 | let item = $('') 460 | let itemEl = item.get(0) 461 | 462 | item.text(i).appendTo(this._dropdown) 463 | 464 | if(this._config.onItemRendered) 465 | this._config.onItemRendered(this._element, itemEl) 466 | 467 | const renderEvent = $.Event(Event.ITEM_RENDER, {item:itemEl}) 468 | 469 | $(this._element).trigger(renderEvent) 470 | 471 | item.on(Event.CLICK_DATA_API, e => { 472 | this._selectItem(e.target); 473 | this._preventClose = true 474 | this.hide() 475 | e.preventDefault() 476 | this._preventClose = false 477 | }) 478 | }) 479 | } 480 | 481 | _selectItem(item){ 482 | this._element.value = item.innerText 483 | 484 | if(this._config.onPick) 485 | this._config.onPick(this._element, item) 486 | 487 | const pickEvent = $.Event(Event.PICK, {item}) 488 | $(this._element).trigger(pickEvent) 489 | } 490 | 491 | _showDropdown(){ 492 | this._isShown = true 493 | this._dropdown.classList.add('show') 494 | } 495 | 496 | _showSpinner(){ 497 | this._spinner.style.display = 'inline-block' 498 | } 499 | 500 | _truncateDropdown(){ 501 | this._dropdown.innerHTML = '' 502 | } 503 | 504 | // Static 505 | 506 | static _jQueryInterface(config, relatedTarget) { 507 | return this.each(function () { 508 | let data = $(this).data(DATA_KEY) 509 | const _config = { 510 | ...Default, 511 | ...$(this).data(), 512 | ...typeof config === 'object' && config ? config : {} 513 | } 514 | 515 | if (!data) { 516 | data = new Autocomplete(this, _config) 517 | $(this).data(DATA_KEY, data) 518 | } 519 | 520 | if (typeof config === 'string') { 521 | if (typeof data[config] === 'undefined') 522 | throw new TypeError(`No method named "${config}"`) 523 | data[config](relatedTarget) 524 | } 525 | }) 526 | } 527 | } 528 | 529 | /** 530 | * ------------------------------------------------------------------------ 531 | * jQuery 532 | * ------------------------------------------------------------------------ 533 | */ 534 | 535 | $.fn[NAME] = Autocomplete._jQueryInterface 536 | $.fn[NAME].Constructor = Autocomplete 537 | $.fn[NAME].noConflict = () => { 538 | $.fn[NAME] = JQUERY_NO_CONFLICT 539 | return Autocomplete._jQueryInterface 540 | } 541 | 542 | export default Autocomplete 543 | -------------------------------------------------------------------------------- /src/js/index.js: -------------------------------------------------------------------------------- 1 | import Autocomplete from './autocomplete' 2 | 3 | export { 4 | Autocomplete 5 | } 6 | -------------------------------------------------------------------------------- /src/js/util.js: -------------------------------------------------------------------------------- 1 | /** 2 | * -------------------------------------------------------------------------- 3 | * Bootstrap (v4.3.1): util.js 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | * -------------------------------------------------------------------------- 6 | */ 7 | 8 | import $ from 'jquery' 9 | 10 | /** 11 | * ------------------------------------------------------------------------ 12 | * Private TransitionEnd Helpers 13 | * ------------------------------------------------------------------------ 14 | */ 15 | 16 | const TRANSITION_END = 'transitionend' 17 | const MAX_UID = 1000000 18 | const MILLISECONDS_MULTIPLIER = 1000 19 | 20 | // Shoutout AngusCroll (https://goo.gl/pxwQGp) 21 | function toType(obj) { 22 | return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase() 23 | } 24 | 25 | function getSpecialTransitionEndEvent() { 26 | return { 27 | bindType: TRANSITION_END, 28 | delegateType: TRANSITION_END, 29 | handle(event) { 30 | if ($(event.target).is(this)) { 31 | return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params 32 | } 33 | return undefined // eslint-disable-line no-undefined 34 | } 35 | } 36 | } 37 | 38 | function transitionEndEmulator(duration) { 39 | let called = false 40 | 41 | $(this).one(Util.TRANSITION_END, () => { 42 | called = true 43 | }) 44 | 45 | setTimeout(() => { 46 | if (!called) { 47 | Util.triggerTransitionEnd(this) 48 | } 49 | }, duration) 50 | 51 | return this 52 | } 53 | 54 | function setTransitionEndSupport() { 55 | $.fn.emulateTransitionEnd = transitionEndEmulator 56 | $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent() 57 | } 58 | 59 | /** 60 | * -------------------------------------------------------------------------- 61 | * Public Util Api 62 | * -------------------------------------------------------------------------- 63 | */ 64 | 65 | const Util = { 66 | 67 | TRANSITION_END: 'bsTransitionEnd', 68 | 69 | getUID(prefix) { 70 | do { 71 | // eslint-disable-next-line no-bitwise 72 | prefix += ~~(Math.random() * MAX_UID) // "~~" acts like a faster Math.floor() here 73 | } while (document.getElementById(prefix)) 74 | return prefix 75 | }, 76 | 77 | getSelectorFromElement(element) { 78 | let selector = element.getAttribute('data-target') 79 | 80 | if (!selector || selector === '#') { 81 | const hrefAttr = element.getAttribute('href') 82 | selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '' 83 | } 84 | 85 | try { 86 | return document.querySelector(selector) ? selector : null 87 | } catch (err) { 88 | return null 89 | } 90 | }, 91 | 92 | getTransitionDurationFromElement(element) { 93 | if (!element) { 94 | return 0 95 | } 96 | 97 | // Get transition-duration of the element 98 | let transitionDuration = $(element).css('transition-duration') 99 | let transitionDelay = $(element).css('transition-delay') 100 | 101 | const floatTransitionDuration = parseFloat(transitionDuration) 102 | const floatTransitionDelay = parseFloat(transitionDelay) 103 | 104 | // Return 0 if element or transition duration is not found 105 | if (!floatTransitionDuration && !floatTransitionDelay) { 106 | return 0 107 | } 108 | 109 | // If multiple durations are defined, take the first 110 | transitionDuration = transitionDuration.split(',')[0] 111 | transitionDelay = transitionDelay.split(',')[0] 112 | 113 | return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER 114 | }, 115 | 116 | reflow(element) { 117 | return element.offsetHeight 118 | }, 119 | 120 | triggerTransitionEnd(element) { 121 | $(element).trigger(TRANSITION_END) 122 | }, 123 | 124 | // TODO: Remove in v5 125 | supportsTransitionEnd() { 126 | return Boolean(TRANSITION_END) 127 | }, 128 | 129 | isElement(obj) { 130 | return (obj[0] || obj).nodeType 131 | }, 132 | 133 | typeCheckConfig(componentName, config, configTypes) { 134 | for (const property in configTypes) { 135 | if (Object.prototype.hasOwnProperty.call(configTypes, property)) { 136 | const expectedTypes = configTypes[property] 137 | const value = config[property] 138 | const valueType = value && Util.isElement(value) 139 | ? 'element' : toType(value) 140 | 141 | if (!new RegExp(expectedTypes).test(valueType)) { 142 | throw new Error( 143 | `${componentName.toUpperCase()}: ` + 144 | `Option "${property}" provided type "${valueType}" ` + 145 | `but expected type "${expectedTypes}".`) 146 | } 147 | } 148 | } 149 | }, 150 | 151 | findShadowRoot(element) { 152 | if (!document.documentElement.attachShadow) { 153 | return null 154 | } 155 | 156 | // Can find the shadow root otherwise it'll return the document 157 | if (typeof element.getRootNode === 'function') { 158 | const root = element.getRootNode() 159 | return root instanceof ShadowRoot ? root : null 160 | } 161 | 162 | if (element instanceof ShadowRoot) { 163 | return element 164 | } 165 | 166 | // when we don't find a shadow root 167 | if (!element.parentNode) { 168 | return null 169 | } 170 | 171 | return Util.findShadowRoot(element.parentNode) 172 | } 173 | } 174 | 175 | setTransitionEndSupport() 176 | 177 | export default Util 178 | --------------------------------------------------------------------------------