├── .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 |
37 | Bootstrap Autocomplete
38 |
39 |
52 |
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 | Timezone
75 |
76 |
77 | Asia/Aden
78 | Asia/Aqtau
79 | Asia/Baghdad
80 | Asia/Barnaul
81 | Asia/Chita
82 | Asia/Dhaka
83 | Asia/Famagusta
84 | Asia/Hong_Kong
85 | Asia/Jayapura
86 | Asia/Kuala_Lumpur
87 | Asia/Jakarta
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 | Timezone
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 | Timezone
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 | Continent
152 |
153 | Africa
154 | America
155 | Asia
156 | Atlantic
157 | Australia
158 | Europe
159 | Indian
160 | Pacific
161 |
162 |
163 |
164 | Timezone
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 | Timezone
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 | Timezone
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 | Name Type Default Description
289 |
290 |
291 |
292 | list
293 | string
294 | null
295 | The id of datalist element to take the option from.
296 |
297 |
298 | prefetch
299 | string
300 | null
301 | Target URL to fetch for all enable option on the first init.
302 |
303 |
304 | filter
305 | string
306 | null
307 | Target URL to fetch the filtered result, the string #QUERY#
will be replaced with user input.
308 |
309 |
310 | filterDelay
311 | int
312 | 300
313 | Total microsecond to wait since last user input before triggering ajax request.
314 |
315 |
316 | filterMinChars
317 | int
318 | 1
319 | Total character user input to trigger ajax request.
320 |
321 |
322 | filterRelation
323 | object
324 | null
325 | Related element to add on request query in form of key => selector
. For example: {what: "#input-continent"}
.
326 |
327 |
328 | maxResult
329 | int
330 | 10
331 | Total result to show on dropdown list.
332 |
333 |
334 | onPick
335 | function
336 | null
337 | Function to call after user picking the dropdown item. onPick(input, item)
338 |
339 |
340 | onItemRendered
341 | function
342 | null
343 | Function to call right after item element rendered. onItemRendered(input, item)
.
344 |
345 |
346 | preProcess
347 | function
348 | null
349 | Process the ajax response to suit the response spec.
350 |
351 |
352 |
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 | Event Type Description
364 |
365 |
366 |
367 | pick.bs.autocomplete
368 | This event fires immediately when user selecting any of suggestions option item.
369 |
370 |
371 | itemrender.bs.autocomplete
372 | An event that called right after suggestion item already rendered and is on view.
373 |
374 |
375 |
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 |
--------------------------------------------------------------------------------