1 |
|
2 | import { AutocompleteMarkup } from './autocomplete/markup';
|
3 | import { AutocompleteDecorator } from './autocomplete/decorator';
|
4 | import { AutocompleteController } from './autocomplete/controller';
|
5 |
|
6 | export 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 |
|
23 |
|
24 |
|
25 |
|
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 | |
65 |
|
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,
|
82 | _onFocusValue: default_value,
|
83 | _isOpened: false,
|
84 | _currentItemIndex: null,
|
85 | options: options
|
86 | };
|
87 |
|
88 |
|
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 |
|
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 |
|
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 |
|
129 |
|
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 | };
|