UNPKG

5.63 kBJavaScriptView Raw
1
2import { AutocompleteMarkup } from './autocomplete/markup';
3import { AutocompleteDecorator } from './autocomplete/decorator';
4import { AutocompleteController } from './autocomplete/controller';
5
6export var Autocomplete = {
7
8 _autocompleteContainers: [],
9 _options: {
10 theme: 'bs4',
11 minCharLimit: 2,
12 minCustomCharLimit: 3,
13 inputDelay: 200,
14 allowCustomInput: false,
15 defaultCustomHiddenInputValue: '',
16 ajaxHeaders: {},
17 ajaxErrorHandler: null
18 },
19
20 /**
21 *
22 * @param {string} input_id
23 * @param {string} hidden_input_id
24 * @param {string} ajax_url
25 * @param {object} options
26 */
27 create(input_id, hidden_input_id, ajax_url, data_handler = JSON.parse, options = {}) {
28
29 for(var i in this._options) {
30 if (options[i] === undefined) {
31 options[i] = this._options[i];
32 }
33 }
34
35 if (ajax_url.indexOf('{search}') === -1) {
36 console.error('BunnyJS Autocomplete.create() error: ajax_url must contain a {search}');
37 return false;
38 }
39
40 var container_id = input_id + '_autocomplete';
41
42 var container = document.getElementById(container_id);
43
44 if (container === null) {
45 console.error('BunnyJS Autocomplete.create() error: container for input with ID "' + input_id + '_autocomplete" not found.' +
46 'Input must be inside a container.');
47 return false;
48 }
49
50 var input = document.getElementById(input_id);
51
52 var default_value = input.getAttribute('value');
53 if (default_value === null) {
54 default_value = '';
55 }
56
57 var hidden_input = document.getElementById(hidden_input_id);
58
59 var default_hidden_value = null;
60 if (hidden_input !== null) {
61 default_hidden_value = hidden_input.value;
62 }
63
64 /*var dropdown = AutocompleteMarkup.createEmptyDropdown();
65 AutocompleteDecorator.decorateDropdown(dropdown, options.theme);*/
66
67 var dropdown = null;
68
69 this._autocompleteContainers[container_id] = {
70 ajaxUrl: ajax_url,
71 container: container,
72 input: input,
73 hiddenInput: hidden_input,
74 dropdown: dropdown,
75 dropdownItems: [],
76 itemSelectHandlers: [],
77 itemSelectHandlersCustom: [],
78 defaultValue: default_value,
79 defaultHiddenValue: default_hidden_value,
80 dataHandler: data_handler,
81 _picked: false, // is picked from list, used in blur (focus out) event
82 _onFocusValue: default_value, // value on focus
83 _isOpened: false,
84 _currentItemIndex: null, // currently active dropdown item index of dropdownItems when navigating with up/down keys
85 options: options
86 };
87
88 //container.appendChild(dropdown);
89
90 AutocompleteController.attachInputTypeEvent(container_id, data_handler, options.ajaxHeaders);
91 AutocompleteController.attachInputFocusEvent(container_id);
92 AutocompleteController.attachInputOutEvent(container_id);
93 AutocompleteController.attachInputKeydownEvent(container_id);
94
95 },
96
97 get(container_id) {
98 return this._autocompleteContainers[container_id];
99 },
100
101 setItems(container_id, data) {
102
103 //var t0 = performance.now();
104
105 var cont = this._autocompleteContainers[container_id];
106
107 if (cont.dropdown !== null) {
108 AutocompleteMarkup.removeDropdown(cont.dropdown);
109 cont.dropdownItems = [];
110 cont._currentItemIndex = null;
111 }
112
113 var dropdown = AutocompleteMarkup.createEmptyDropdown();
114 AutocompleteDecorator.decorateDropdown(dropdown, cont.options.theme);
115
116 var items_fragment = AutocompleteMarkup.createDropdownItemsFromData(data, function(item, value) {
117 AutocompleteDecorator.decorateDropdownItem(item, cont.options.theme);
118 cont.dropdownItems.push(item);
119 //cont.dropdown.appendChild(item);
120 });
121
122 dropdown.appendChild(items_fragment);
123 cont.dropdown = dropdown;
124 AutocompleteMarkup.insertDropdown(cont.container, dropdown);
125
126 AutocompleteController.attachItemSelectEvent(container_id);
127
128 //var t1 = performance.now();
129 //console.log("setItems() call took " + (t1 - t0) + " milliseconds.");
130
131 },
132
133 show(container_id) {
134 this._autocompleteContainers[container_id]._isOpened = true;
135 AutocompleteDecorator.showDropdown(this._autocompleteContainers[container_id].container,
136 this._autocompleteContainers[container_id].options.theme);
137 },
138
139 hide(container_id) {
140 this._autocompleteContainers[container_id]._isOpened = false;
141 AutocompleteDecorator.hideDropdown(this._autocompleteContainers[container_id].container,
142 this._autocompleteContainers[container_id].options.theme);
143 },
144
145 isOpened(container_id) {
146 return this._autocompleteContainers[container_id]._isOpened;
147 },
148
149 onItemSelect(container_id, handler) {
150 this._autocompleteContainers[container_id].itemSelectHandlers.push(handler);
151 },
152
153 onCustomItemSelect(container_id, handler) {
154 this._autocompleteContainers[container_id].itemSelectHandlersCustom.push(handler);
155 },
156
157 restoreDefaultValue(container_id) {
158 var ac = this.get(container_id);
159 ac.input.value = this.get(container_id).defaultValue;
160 if (ac.defaultHiddenValue !== null) {
161 ac.hiddenInput.value = ac.defaultHiddenValue;
162 }
163 }
164
165};