@@ 1-372 (lines=372) @@ | ||
1 | $(document).ready(function() { |
|
2 | ||
3 | /* |
|
4 | * jQuery accessible and keyboard-enhanced autocomplete list |
|
5 | * @version v1.6.0 |
|
6 | * Website: https://a11y.nicolas-hoffmann.net/autocomplet-list/ |
|
7 | * License MIT: https://github.com/nico3333fr/jquery-accessible-autocomplete-list-aria/blob/master/LICENSE |
|
8 | */ |
|
9 | // loading combobox ------------------------------------------------------------------------------------------------------------ |
|
10 | // init |
|
11 | var $js_combobox = $('.js-combobox'), |
|
12 | $body = $('body'), |
|
13 | // default_text_help = 'Use tabulation (or down) key to access and browse suggestions after input. Confirm your choice with enter key, or esc key to close suggestions box.', |
|
14 | default_text_help = '', |
|
15 | default_class_for_invisible_text = 'invisible', |
|
16 | suggestion_single = 'There is ', |
|
17 | suggestion_plural = 'There are ', |
|
18 | suggestion_word = 'suggestion', |
|
19 | suggestion_word_plural = 'suggestions', |
|
20 | button_clear_title = 'clear this field', |
|
21 | button_clear_text = 'X', |
|
22 | case_sensitive = 'no', |
|
23 | min_length = 0, |
|
24 | limit_number_suggestions = 666, |
|
25 | search_option = 'beginning', // or 'containing' |
|
26 | see_more_text = 'See more results…', |
|
27 | tablo_suggestions = []; |
|
28 | ||
29 | ||
30 | function do_see_more_option() { |
|
31 | var $output_content = $('#js-codeit'); |
|
32 | $output_content.html('You have to code a function or a redirection to display more results ;)'); |
|
33 | } |
|
34 | ||
35 | if ($js_combobox.length) { // if there are at least one :) |
|
36 | ||
37 | // init |
|
38 | $js_combobox.each(function(index_combo) { |
|
39 | var $this = $(this), |
|
40 | $this_id = $this.attr('id'), |
|
41 | $label_this = $('label[for="' + $this_id + '"]'), |
|
42 | index_lisible = index_combo + 1, |
|
43 | options = $this.data(), |
|
44 | $combobox_prefix_class = typeof options.comboboxPrefixClass !== 'undefined' ? options.comboboxPrefixClass + '-' : '', |
|
45 | $combobox_help_text = typeof options.comboboxHelpText !== 'undefined' ? options.comboboxHelpText : default_text_help, |
|
46 | $list_suggestions = $('#' + $this.attr('list')), |
|
47 | $combobox_button_title = typeof options.comboboxButtonTitle !== 'undefined' ? options.comboboxButtonTitle : button_clear_title, |
|
48 | $combobox_button_text = typeof options.comboboxButtonText !== 'undefined' ? options.comboboxButtonText : button_clear_text, |
|
49 | $combobox_case_sensitive = typeof options.comboboxCaseSensitive !== 'undefined' ? options.comboboxCaseSensitive : case_sensitive, |
|
50 | tablo_temp_suggestions = []; |
|
51 | ||
52 | // input |
|
53 | $this.attr({ |
|
54 | 'data-number': index_lisible, |
|
55 | 'autocorrect': 'off', |
|
56 | 'autocapitalize': 'off', |
|
57 | 'spellcheck': 'false', |
|
58 | 'autocomplete': 'off', |
|
59 | 'aria-describedby': $combobox_prefix_class + 'help-text' + index_lisible, |
|
60 | 'aria-autocomplete': 'list', |
|
61 | 'data-lastval': '', |
|
62 | 'aria-owns': $combobox_prefix_class + 'suggest_' + index_lisible |
|
63 | }); |
|
64 | // stock into tables |
|
65 | $list_suggestions.find('option').each(function(index_option, index_element) { |
|
66 | tablo_temp_suggestions.push(index_element.value); |
|
67 | }); |
|
68 | if ($combobox_case_sensitive === 'no') { |
|
69 | // order case tablo_temp_suggestions |
|
70 | tablo_suggestions[index_lisible] = tablo_temp_suggestions.sort(function(a, b) { |
|
71 | a = a.toLowerCase(); |
|
72 | b = b.toLowerCase(); |
|
73 | if (a == b) { |
|
74 | return 0; |
|
75 | } |
|
76 | if (a > b) { |
|
77 | return 1; |
|
78 | } |
|
79 | return -1; |
|
80 | }); |
|
81 | } else { |
|
82 | tablo_suggestions[index_lisible] = tablo_temp_suggestions.sort(); |
|
83 | } |
|
84 | ||
85 | // wrap into a container |
|
86 | $this.wrap('<div class="' + $combobox_prefix_class + 'container js-container" data-combobox-prefix-class="' + $combobox_prefix_class + '"></div>'); |
|
87 | ||
88 | var $combobox_container = $this.parent(); |
|
89 | ||
90 | // custom datalist/listbox linked to input |
|
91 | $combobox_container.append('<div id="' + $combobox_prefix_class + 'suggest_' + index_lisible + '" class="js-suggest ' + $combobox_prefix_class + 'suggestions"><div role="listbox"></div></div>'); |
|
92 | $list_suggestions.remove(); |
|
93 | ||
94 | // status zone |
|
95 | // $combobox_container.prepend('<div id="' + $combobox_prefix_class + 'suggestion-text' + index_lisible + '" class="js-suggestion-text ' + $combobox_prefix_class + 'suggestion-text ' + default_class_for_invisible_text + '" aria-live="assertive"></div>'); |
|
96 | ||
97 | // help text |
|
98 | $combobox_container.prepend('<span id="' + $combobox_prefix_class + 'help-text' + index_lisible + '" class="' + $combobox_prefix_class + 'help-text ' + default_class_for_invisible_text + '">' + $combobox_help_text + '</span>'); |
|
99 | ||
100 | // label id |
|
101 | $label_this.attr('id', 'label-id-' + $this_id); |
|
102 | ||
103 | // button clear |
|
104 | $this.after('<button class="js-clear-button ' + $combobox_prefix_class + 'clear-button" aria-label="' + $combobox_button_title + '" title="' + $combobox_button_title + '" aria-describedby="label-id-' + $this_id + '" type="button">' + $combobox_button_text + '</button>'); |
|
105 | ||
106 | }); |
|
107 | ||
108 | ||
109 | // listeners |
|
110 | // keydown on field |
|
111 | $body.on('keyup', '.js-combobox', function(event) { |
|
112 | var $this = $(this), |
|
113 | options_combo = $this.data(), |
|
114 | $container = $this.parent(), |
|
115 | $form = $container.parents('form'), |
|
116 | options = $container.data(), |
|
117 | $combobox_prefix_class = typeof options.comboboxPrefixClass !== 'undefined' ? options.comboboxPrefixClass : '', // no "-"" because already generated |
|
118 | $suggestions = $container.find('.js-suggest div'), |
|
119 | //$suggestion_list = $suggestions.find('.js-suggestion'), |
|
120 | $suggestions_text = $container.find('.js-suggestion-text'), |
|
121 | $combobox_suggestion_single = typeof options_combo.suggestionSingle !== 'undefined' ? options_combo.suggestionSingle : suggestion_single, |
|
122 | $combobox_suggestion_plural = typeof options_combo.suggestionPlural !== 'undefined' ? options_combo.suggestionPlural : suggestion_plural, |
|
123 | $combobox_suggestion_word = typeof options_combo.suggestionWord !== 'undefined' ? options_combo.suggestionWord : suggestion_word, |
|
124 | $combobox_suggestion_word_plural = typeof options_combo.suggestionWord !== 'undefined' ? options_combo.suggestionWordPlural : suggestion_word_plural, |
|
125 | combobox_min_length = typeof options_combo.comboboxMinLength !== 'undefined' ? Math.abs(options_combo.comboboxMinLength) : min_length, |
|
126 | $combobox_case_sensitive = typeof options_combo.comboboxCaseSensitive !== 'undefined' ? options_combo.comboboxCaseSensitive : case_sensitive, |
|
127 | combobox_limit_number_suggestions = typeof options_combo.comboboxLimitNumberSuggestions !== 'undefined' ? Math.abs(options_combo.comboboxLimitNumberSuggestions) : limit_number_suggestions, |
|
128 | $combobox_search_option = typeof options_combo.comboboxSearchOption !== 'undefined' ? options_combo.comboboxSearchOption : search_option, |
|
129 | $combobox_see_more_text = typeof options_combo.comboboxSeeMoreText !== 'undefined' ? options_combo.comboboxSeeMoreText : see_more_text, |
|
130 | index_table = $this.attr('data-number'), |
|
131 | value_to_search = $this.val(), |
|
132 | text_number_suggestions = ''; |
|
133 | ||
134 | if (event.keyCode === 13) { |
|
135 | $form.submit(); |
|
136 | } else { |
|
137 | ||
138 | if (event.keyCode !== 27) { // No Escape |
|
139 | ||
140 | $this.attr('data-lastval', value_to_search); |
|
141 | // search for text suggestion in the array tablo_suggestions[index_table] |
|
142 | var size_tablo = tablo_suggestions[index_table].length, |
|
143 | i = 0, |
|
144 | counter = 0; |
|
145 | ||
146 | $suggestions.empty(); |
|
147 | ||
148 | if (value_to_search != '' && value_to_search.length >= combobox_min_length) { |
|
149 | while (i < size_tablo) { |
|
150 | if (counter < combobox_limit_number_suggestions) { |
|
151 | if ( |
|
152 | ( |
|
153 | $combobox_search_option === 'containing' && |
|
154 | ( |
|
155 | ($combobox_case_sensitive === 'yes' && (tablo_suggestions[index_table][i].indexOf(value_to_search) >= 0)) || |
|
156 | ($combobox_case_sensitive === 'no' && (tablo_suggestions[index_table][i].toUpperCase().indexOf(value_to_search.toUpperCase()) >= 0)) |
|
157 | ) |
|
158 | ) || |
|
159 | ( |
|
160 | $combobox_search_option === 'beginning' && |
|
161 | ( |
|
162 | ($combobox_case_sensitive === 'yes' && tablo_suggestions[index_table][i].substring(0, value_to_search.length) === value_to_search) || |
|
163 | ($combobox_case_sensitive === 'no' && tablo_suggestions[index_table][i].substring(0, value_to_search.length).toUpperCase() === value_to_search.toUpperCase()) |
|
164 | ) |
|
165 | ) |
|
166 | ) { |
|
167 | $suggestions.append('<div id="suggestion-' + index_table + '-' + counter + '" class="js-suggestion ' + $combobox_prefix_class + 'suggestion" tabindex="-1" role="option">' + tablo_suggestions[index_table][i] + '</div>'); |
|
168 | counter++; |
|
169 | } |
|
170 | } |
|
171 | i++; |
|
172 | } |
|
173 | if (counter >= combobox_limit_number_suggestions) { |
|
174 | $suggestions.append('<div id="suggestion-' + index_table + '-' + counter + '" class="js-suggestion js-seemore ' + $combobox_prefix_class + 'suggestion" tabindex="-1" role="option">' + $combobox_see_more_text + '</div>'); |
|
175 | counter++; |
|
176 | } |
|
177 | // update number of suggestions |
|
178 | if (counter > 1) { |
|
179 | text_number_suggestions = $combobox_suggestion_plural + counter + ' ' + $combobox_suggestion_word_plural + '.'; |
|
180 | } |
|
181 | if (counter === 1) { |
|
182 | text_number_suggestions = $combobox_suggestion_single + counter + ' ' + $combobox_suggestion_word + '.'; |
|
183 | } |
|
184 | if (counter === 0) { |
|
185 | text_number_suggestions = $combobox_suggestion_single + counter + ' ' + $combobox_suggestion_word + '.'; |
|
186 | } |
|
187 | if (counter >= 0) { |
|
188 | var text_number_suggestions_default = $suggestions_text.text(); |
|
189 | if (text_number_suggestions != text_number_suggestions_default) { // @Goestu trick to make it work on all AT |
|
190 | var suggestions_to_add = $("<p>").text(text_number_suggestions); |
|
191 | $suggestions_text.attr('aria-live', 'polite'); |
|
192 | $suggestions_text.empty(); |
|
193 | $suggestions_text.append(suggestions_to_add); |
|
194 | } |
|
195 | } |
|
196 | ||
197 | } |
|
198 | ||
199 | } |
|
200 | } |
|
201 | ||
202 | }) |
|
203 | .on('click', function(event) { |
|
204 | var $target = $(event.target), |
|
205 | $suggestions_text = $('.js-suggestion-text:not(:empty)'), // if a suggestion text is not empty => suggestion opened somewhere |
|
206 | $container = $suggestions_text.parents('.js-container'), |
|
207 | $input_text = $container.find('.js-combobox'), |
|
208 | $suggestions = $container.find('.js-suggest div'); |
|
209 | ||
210 | // if click outside => close opened suggestions |
|
211 | if (!$target.is('.js-suggestion') && !$target.is('.js-combobox') && $suggestions_text.length) { |
|
212 | $input_text.val($input_text.attr('data-lastval')); |
|
213 | $suggestions.empty(); |
|
214 | $suggestions_text.empty(); |
|
215 | } |
|
216 | }) |
|
217 | // tab + down management for autocomplete (when list of suggestion) |
|
218 | .on('keydown', '.js-combobox', function(event) { |
|
219 | var $this = $(this), |
|
220 | $container = $this.parent(), |
|
221 | $input_text = $container.find('.js-combobox'), |
|
222 | $suggestions = $container.find('.js-suggest div'), |
|
223 | $suggestion_list = $suggestions.find('.js-suggestion'), |
|
224 | $suggestions_text = $container.find('.js-suggestion-text'), |
|
225 | $autorise_tab_options = typeof $this.attr('data-combobox-notab-options') !== 'undefined' ? false : true, |
|
226 | $first_suggestion = $suggestion_list.first(); |
|
227 | ||
228 | if ((!event.shiftKey && event.keyCode == 9 && $autorise_tab_options) || event.keyCode == 40) { // tab (if authorised) or bottom |
|
229 | // See if there are suggestions, and yes => focus on first one |
|
230 | if ($suggestion_list.length) { |
|
231 | $input_text.val($first_suggestion.html()); |
|
232 | $suggestion_list.first().focus(); |
|
233 | event.preventDefault(); |
|
234 | } |
|
235 | } |
|
236 | if (event.keyCode == 27 || ($autorise_tab_options === false && event.keyCode == 9)) { // esc or (tab/shift tab + notab option) = close |
|
237 | $input_text.val($input_text.attr('data-lastval')); |
|
238 | $suggestions.empty(); |
|
239 | $suggestions_text.empty(); |
|
240 | if (event.keyCode == 27) { // Esc prevented only, tab can go :) |
|
241 | event.preventDefault(); |
|
242 | setTimeout(function() { |
|
243 | $input_text.focus(); |
|
244 | }, 300); // timeout to avoid problem in suggestions display |
|
245 | } |
|
246 | } |
|
247 | ||
248 | }) |
|
249 | // tab + down management in list of suggestions |
|
250 | .on('keydown', '.js-suggestion', function(event) { |
|
251 | var $this = $(this), |
|
252 | $container = $this.parents('.js-container'), |
|
253 | $input_text = $container.find('.js-combobox'), |
|
254 | $autorise_tab_options = typeof $input_text.attr('data-combobox-notab-options') !== 'undefined' ? false : true, |
|
255 | $suggestions = $container.find('.js-suggest div'), |
|
256 | $suggestions_text = $container.find('.js-suggestion-text'), |
|
257 | $next_suggestion = $this.next(), |
|
258 | $previous_suggestion = $this.prev(); |
|
259 | ||
260 | if (event.keyCode == 27 || ($autorise_tab_options === false && event.keyCode == 9)) { // esc or (tab/shift tab + notab option) = close |
|
261 | if (event.keyCode == 27) { // Esc prevented only, tab can go :) |
|
262 | $input_text.val($input_text.attr('data-lastval')); |
|
263 | $suggestions.empty(); |
|
264 | $suggestions_text.empty(); |
|
265 | setTimeout(function() { |
|
266 | $input_text.focus(); |
|
267 | }, 300); // timeout to avoid problem in suggestions display |
|
268 | event.preventDefault(); |
|
269 | } |
|
270 | if ($autorise_tab_options === false && event.keyCode == 9) { |
|
271 | $suggestions.empty(); |
|
272 | $suggestions_text.empty(); |
|
273 | $input_text.focus(); |
|
274 | } |
|
275 | } |
|
276 | if (event.keyCode == 13 || event.keyCode == 32) { // Enter or space |
|
277 | if ($this.hasClass('js-seemore')) { |
|
278 | $input_text.val($input_text.attr('data-lastval')); |
|
279 | $suggestions.empty(); |
|
280 | $suggestions_text.empty(); |
|
281 | setTimeout(function() { |
|
282 | $input_text.focus(); |
|
283 | }, 300); // timeout to avoid problem in suggestions display |
|
284 | // go define the function you need when we click the see_more option |
|
285 | setTimeout(function() { |
|
286 | do_see_more_option(); |
|
287 | }, 301); // timeout to avoid problem in suggestions display |
|
288 | event.preventDefault(); |
|
289 | } else { |
|
290 | $input_text.val($this.html()); |
|
291 | $input_text.attr('data-lastval', $this.html()); |
|
292 | $suggestions.empty(); |
|
293 | $suggestions_text.empty(); |
|
294 | setTimeout(function() { |
|
295 | $input_text.focus(); |
|
296 | }, 300); // timeout to avoid problem in suggestions display |
|
297 | event.preventDefault(); |
|
298 | } |
|
299 | ||
300 | } |
|
301 | if ((!event.shiftKey && event.keyCode == 9 && $autorise_tab_options) || event.keyCode == 40) { // tab (if authorised) or bottom |
|
302 | if ($next_suggestion.length) { |
|
303 | $input_text.val($next_suggestion.html()); |
|
304 | $next_suggestion.focus(); |
|
305 | } else { |
|
306 | $input_text.val($input_text.attr('data-lastval')); |
|
307 | if (!event.shiftKey && event.keyCode == 9) { // tab closes the list |
|
308 | var e = jQuery.Event("keydown"); |
|
309 | e.which = 27; // # Some key code value |
|
310 | e.keyCode = 27; |
|
311 | $this.trigger(e); |
|
312 | } else { |
|
313 | setTimeout(function() { |
|
314 | $input_text.focus(); |
|
315 | }, 300); |
|
316 | } // timeout to avoid problem in suggestions display |
|
317 | ||
318 | } |
|
319 | event.preventDefault(); |
|
320 | } |
|
321 | ||
322 | if ((event.shiftKey && event.keyCode == 9 && $autorise_tab_options) || event.keyCode == 38) { // top or Maj+tab (if authorised) |
|
323 | if ($previous_suggestion.length) { |
|
324 | $input_text.val($previous_suggestion.html()); |
|
325 | $previous_suggestion.focus(); |
|
326 | } else { |
|
327 | $input_text.val($input_text.attr('data-lastval')).focus(); |
|
328 | } |
|
329 | event.preventDefault(); |
|
330 | } |
|
331 | }) |
|
332 | // clear button |
|
333 | .on('click', '.js-clear-button', function() { |
|
334 | var $this = $(this), |
|
335 | $container = $this.parent(), |
|
336 | $input_text = $container.find('.js-combobox'), |
|
337 | $suggestions = $container.find('.js-suggest div'), |
|
338 | $suggestions_text = $container.find('.js-suggestion-text'); |
|
339 | ||
340 | $suggestions.empty(); |
|
341 | $suggestions_text.empty(); |
|
342 | $input_text.val(''); |
|
343 | $input_text.attr('data-lastval', ''); |
|
344 | ||
345 | }) |
|
346 | .on('click', '.js-suggestion', function() { |
|
347 | var $this = $(this), |
|
348 | value = $this.html(), |
|
349 | $container = $this.parents('.js-container'), |
|
350 | $input_text = $container.find('.js-combobox'), |
|
351 | $suggestions = $container.find('.js-suggest div'), |
|
352 | $suggestions_text = $container.find('.js-suggestion-text'); |
|
353 | ||
354 | if ($this.hasClass('js-seemore')) { |
|
355 | $suggestions.empty(); |
|
356 | $suggestions_text.empty(); |
|
357 | $input_text.focus(); |
|
358 | // go define the function you need when we click the see_more option |
|
359 | do_see_more_option(); |
|
360 | } else { |
|
361 | $input_text.val(value).focus(); |
|
362 | $suggestions.empty(); |
|
363 | $suggestions_text.empty(); |
|
364 | } |
|
365 | ||
366 | ||
367 | }); |
|
368 | ||
369 | ||
370 | } |
|
371 | ||
372 | }); |
@@ 77-437 (lines=361) @@ | ||
74 | /***/ }), |
|
75 | ||
76 | /***/ 33: |
|
77 | /***/ (function(module, exports) { |
|
78 | ||
79 | $(document).ready(function () { |
|
80 | ||
81 | /* |
|
82 | * jQuery accessible and keyboard-enhanced autocomplete list |
|
83 | * @version v1.6.0 |
|
84 | * Website: https://a11y.nicolas-hoffmann.net/autocomplet-list/ |
|
85 | * License MIT: https://github.com/nico3333fr/jquery-accessible-autocomplete-list-aria/blob/master/LICENSE |
|
86 | */ |
|
87 | // loading combobox ------------------------------------------------------------------------------------------------------------ |
|
88 | // init |
|
89 | var $js_combobox = $('.js-combobox'), |
|
90 | $body = $('body'), |
|
91 | ||
92 | // default_text_help = 'Use tabulation (or down) key to access and browse suggestions after input. Confirm your choice with enter key, or esc key to close suggestions box.', |
|
93 | default_text_help = '', |
|
94 | default_class_for_invisible_text = 'invisible', |
|
95 | suggestion_single = 'There is ', |
|
96 | suggestion_plural = 'There are ', |
|
97 | suggestion_word = 'suggestion', |
|
98 | suggestion_word_plural = 'suggestions', |
|
99 | button_clear_title = 'clear this field', |
|
100 | button_clear_text = 'X', |
|
101 | case_sensitive = 'no', |
|
102 | min_length = 0, |
|
103 | limit_number_suggestions = 666, |
|
104 | search_option = 'beginning', |
|
105 | // or 'containing' |
|
106 | see_more_text = 'See more results…', |
|
107 | tablo_suggestions = []; |
|
108 | ||
109 | function do_see_more_option() { |
|
110 | var $output_content = $('#js-codeit'); |
|
111 | $output_content.html('You have to code a function or a redirection to display more results ;)'); |
|
112 | } |
|
113 | ||
114 | if ($js_combobox.length) { |
|
115 | // if there are at least one :) |
|
116 | ||
117 | // init |
|
118 | $js_combobox.each(function (index_combo) { |
|
119 | var $this = $(this), |
|
120 | $this_id = $this.attr('id'), |
|
121 | $label_this = $('label[for="' + $this_id + '"]'), |
|
122 | index_lisible = index_combo + 1, |
|
123 | options = $this.data(), |
|
124 | $combobox_prefix_class = typeof options.comboboxPrefixClass !== 'undefined' ? options.comboboxPrefixClass + '-' : '', |
|
125 | $combobox_help_text = typeof options.comboboxHelpText !== 'undefined' ? options.comboboxHelpText : default_text_help, |
|
126 | $list_suggestions = $('#' + $this.attr('list')), |
|
127 | $combobox_button_title = typeof options.comboboxButtonTitle !== 'undefined' ? options.comboboxButtonTitle : button_clear_title, |
|
128 | $combobox_button_text = typeof options.comboboxButtonText !== 'undefined' ? options.comboboxButtonText : button_clear_text, |
|
129 | $combobox_case_sensitive = typeof options.comboboxCaseSensitive !== 'undefined' ? options.comboboxCaseSensitive : case_sensitive, |
|
130 | tablo_temp_suggestions = []; |
|
131 | ||
132 | // input |
|
133 | $this.attr({ |
|
134 | 'data-number': index_lisible, |
|
135 | 'autocorrect': 'off', |
|
136 | 'autocapitalize': 'off', |
|
137 | 'spellcheck': 'false', |
|
138 | 'autocomplete': 'off', |
|
139 | 'aria-describedby': $combobox_prefix_class + 'help-text' + index_lisible, |
|
140 | 'aria-autocomplete': 'list', |
|
141 | 'data-lastval': '', |
|
142 | 'aria-owns': $combobox_prefix_class + 'suggest_' + index_lisible |
|
143 | }); |
|
144 | // stock into tables |
|
145 | $list_suggestions.find('option').each(function (index_option, index_element) { |
|
146 | tablo_temp_suggestions.push(index_element.value); |
|
147 | }); |
|
148 | if ($combobox_case_sensitive === 'no') { |
|
149 | // order case tablo_temp_suggestions |
|
150 | tablo_suggestions[index_lisible] = tablo_temp_suggestions.sort(function (a, b) { |
|
151 | a = a.toLowerCase(); |
|
152 | b = b.toLowerCase(); |
|
153 | if (a == b) { |
|
154 | return 0; |
|
155 | } |
|
156 | if (a > b) { |
|
157 | return 1; |
|
158 | } |
|
159 | return -1; |
|
160 | }); |
|
161 | } else { |
|
162 | tablo_suggestions[index_lisible] = tablo_temp_suggestions.sort(); |
|
163 | } |
|
164 | ||
165 | // wrap into a container |
|
166 | $this.wrap('<div class="' + $combobox_prefix_class + 'container js-container" data-combobox-prefix-class="' + $combobox_prefix_class + '"></div>'); |
|
167 | ||
168 | var $combobox_container = $this.parent(); |
|
169 | ||
170 | // custom datalist/listbox linked to input |
|
171 | $combobox_container.append('<div id="' + $combobox_prefix_class + 'suggest_' + index_lisible + '" class="js-suggest ' + $combobox_prefix_class + 'suggestions"><div role="listbox"></div></div>'); |
|
172 | $list_suggestions.remove(); |
|
173 | ||
174 | // status zone |
|
175 | // $combobox_container.prepend('<div id="' + $combobox_prefix_class + 'suggestion-text' + index_lisible + '" class="js-suggestion-text ' + $combobox_prefix_class + 'suggestion-text ' + default_class_for_invisible_text + '" aria-live="assertive"></div>'); |
|
176 | ||
177 | // help text |
|
178 | $combobox_container.prepend('<span id="' + $combobox_prefix_class + 'help-text' + index_lisible + '" class="' + $combobox_prefix_class + 'help-text ' + default_class_for_invisible_text + '">' + $combobox_help_text + '</span>'); |
|
179 | ||
180 | // label id |
|
181 | $label_this.attr('id', 'label-id-' + $this_id); |
|
182 | ||
183 | // button clear |
|
184 | $this.after('<button class="js-clear-button ' + $combobox_prefix_class + 'clear-button" aria-label="' + $combobox_button_title + '" title="' + $combobox_button_title + '" aria-describedby="label-id-' + $this_id + '" type="button">' + $combobox_button_text + '</button>'); |
|
185 | }); |
|
186 | ||
187 | // listeners |
|
188 | // keydown on field |
|
189 | $body.on('keyup', '.js-combobox', function (event) { |
|
190 | var $this = $(this), |
|
191 | options_combo = $this.data(), |
|
192 | $container = $this.parent(), |
|
193 | $form = $container.parents('form'), |
|
194 | options = $container.data(), |
|
195 | $combobox_prefix_class = typeof options.comboboxPrefixClass !== 'undefined' ? options.comboboxPrefixClass : '', |
|
196 | // no "-"" because already generated |
|
197 | $suggestions = $container.find('.js-suggest div'), |
|
198 | ||
199 | //$suggestion_list = $suggestions.find('.js-suggestion'), |
|
200 | $suggestions_text = $container.find('.js-suggestion-text'), |
|
201 | $combobox_suggestion_single = typeof options_combo.suggestionSingle !== 'undefined' ? options_combo.suggestionSingle : suggestion_single, |
|
202 | $combobox_suggestion_plural = typeof options_combo.suggestionPlural !== 'undefined' ? options_combo.suggestionPlural : suggestion_plural, |
|
203 | $combobox_suggestion_word = typeof options_combo.suggestionWord !== 'undefined' ? options_combo.suggestionWord : suggestion_word, |
|
204 | $combobox_suggestion_word_plural = typeof options_combo.suggestionWord !== 'undefined' ? options_combo.suggestionWordPlural : suggestion_word_plural, |
|
205 | combobox_min_length = typeof options_combo.comboboxMinLength !== 'undefined' ? Math.abs(options_combo.comboboxMinLength) : min_length, |
|
206 | $combobox_case_sensitive = typeof options_combo.comboboxCaseSensitive !== 'undefined' ? options_combo.comboboxCaseSensitive : case_sensitive, |
|
207 | combobox_limit_number_suggestions = typeof options_combo.comboboxLimitNumberSuggestions !== 'undefined' ? Math.abs(options_combo.comboboxLimitNumberSuggestions) : limit_number_suggestions, |
|
208 | $combobox_search_option = typeof options_combo.comboboxSearchOption !== 'undefined' ? options_combo.comboboxSearchOption : search_option, |
|
209 | $combobox_see_more_text = typeof options_combo.comboboxSeeMoreText !== 'undefined' ? options_combo.comboboxSeeMoreText : see_more_text, |
|
210 | index_table = $this.attr('data-number'), |
|
211 | value_to_search = $this.val(), |
|
212 | text_number_suggestions = ''; |
|
213 | ||
214 | if (event.keyCode === 13) { |
|
215 | $form.submit(); |
|
216 | } else { |
|
217 | ||
218 | if (event.keyCode !== 27) { |
|
219 | // No Escape |
|
220 | ||
221 | $this.attr('data-lastval', value_to_search); |
|
222 | // search for text suggestion in the array tablo_suggestions[index_table] |
|
223 | var size_tablo = tablo_suggestions[index_table].length, |
|
224 | i = 0, |
|
225 | counter = 0; |
|
226 | ||
227 | $suggestions.empty(); |
|
228 | ||
229 | if (value_to_search != '' && value_to_search.length >= combobox_min_length) { |
|
230 | while (i < size_tablo) { |
|
231 | if (counter < combobox_limit_number_suggestions) { |
|
232 | if ($combobox_search_option === 'containing' && ($combobox_case_sensitive === 'yes' && tablo_suggestions[index_table][i].indexOf(value_to_search) >= 0 || $combobox_case_sensitive === 'no' && tablo_suggestions[index_table][i].toUpperCase().indexOf(value_to_search.toUpperCase()) >= 0) || $combobox_search_option === 'beginning' && ($combobox_case_sensitive === 'yes' && tablo_suggestions[index_table][i].substring(0, value_to_search.length) === value_to_search || $combobox_case_sensitive === 'no' && tablo_suggestions[index_table][i].substring(0, value_to_search.length).toUpperCase() === value_to_search.toUpperCase())) { |
|
233 | $suggestions.append('<div id="suggestion-' + index_table + '-' + counter + '" class="js-suggestion ' + $combobox_prefix_class + 'suggestion" tabindex="-1" role="option">' + tablo_suggestions[index_table][i] + '</div>'); |
|
234 | counter++; |
|
235 | } |
|
236 | } |
|
237 | i++; |
|
238 | } |
|
239 | if (counter >= combobox_limit_number_suggestions) { |
|
240 | $suggestions.append('<div id="suggestion-' + index_table + '-' + counter + '" class="js-suggestion js-seemore ' + $combobox_prefix_class + 'suggestion" tabindex="-1" role="option">' + $combobox_see_more_text + '</div>'); |
|
241 | counter++; |
|
242 | } |
|
243 | // update number of suggestions |
|
244 | if (counter > 1) { |
|
245 | text_number_suggestions = $combobox_suggestion_plural + counter + ' ' + $combobox_suggestion_word_plural + '.'; |
|
246 | } |
|
247 | if (counter === 1) { |
|
248 | text_number_suggestions = $combobox_suggestion_single + counter + ' ' + $combobox_suggestion_word + '.'; |
|
249 | } |
|
250 | if (counter === 0) { |
|
251 | text_number_suggestions = $combobox_suggestion_single + counter + ' ' + $combobox_suggestion_word + '.'; |
|
252 | } |
|
253 | if (counter >= 0) { |
|
254 | var text_number_suggestions_default = $suggestions_text.text(); |
|
255 | if (text_number_suggestions != text_number_suggestions_default) { |
|
256 | // @Goestu trick to make it work on all AT |
|
257 | var suggestions_to_add = $("<p>").text(text_number_suggestions); |
|
258 | $suggestions_text.attr('aria-live', 'polite'); |
|
259 | $suggestions_text.empty(); |
|
260 | $suggestions_text.append(suggestions_to_add); |
|
261 | } |
|
262 | } |
|
263 | } |
|
264 | } |
|
265 | } |
|
266 | }).on('click', function (event) { |
|
267 | var $target = $(event.target), |
|
268 | $suggestions_text = $('.js-suggestion-text:not(:empty)'), |
|
269 | // if a suggestion text is not empty => suggestion opened somewhere |
|
270 | $container = $suggestions_text.parents('.js-container'), |
|
271 | $input_text = $container.find('.js-combobox'), |
|
272 | $suggestions = $container.find('.js-suggest div'); |
|
273 | ||
274 | // if click outside => close opened suggestions |
|
275 | if (!$target.is('.js-suggestion') && !$target.is('.js-combobox') && $suggestions_text.length) { |
|
276 | $input_text.val($input_text.attr('data-lastval')); |
|
277 | $suggestions.empty(); |
|
278 | $suggestions_text.empty(); |
|
279 | } |
|
280 | }) |
|
281 | // tab + down management for autocomplete (when list of suggestion) |
|
282 | .on('keydown', '.js-combobox', function (event) { |
|
283 | var $this = $(this), |
|
284 | $container = $this.parent(), |
|
285 | $input_text = $container.find('.js-combobox'), |
|
286 | $suggestions = $container.find('.js-suggest div'), |
|
287 | $suggestion_list = $suggestions.find('.js-suggestion'), |
|
288 | $suggestions_text = $container.find('.js-suggestion-text'), |
|
289 | $autorise_tab_options = typeof $this.attr('data-combobox-notab-options') !== 'undefined' ? false : true, |
|
290 | $first_suggestion = $suggestion_list.first(); |
|
291 | ||
292 | if (!event.shiftKey && event.keyCode == 9 && $autorise_tab_options || event.keyCode == 40) { |
|
293 | // tab (if authorised) or bottom |
|
294 | // See if there are suggestions, and yes => focus on first one |
|
295 | if ($suggestion_list.length) { |
|
296 | $input_text.val($first_suggestion.html()); |
|
297 | $suggestion_list.first().focus(); |
|
298 | event.preventDefault(); |
|
299 | } |
|
300 | } |
|
301 | if (event.keyCode == 27 || $autorise_tab_options === false && event.keyCode == 9) { |
|
302 | // esc or (tab/shift tab + notab option) = close |
|
303 | $input_text.val($input_text.attr('data-lastval')); |
|
304 | $suggestions.empty(); |
|
305 | $suggestions_text.empty(); |
|
306 | if (event.keyCode == 27) { |
|
307 | // Esc prevented only, tab can go :) |
|
308 | event.preventDefault(); |
|
309 | setTimeout(function () { |
|
310 | $input_text.focus(); |
|
311 | }, 300); // timeout to avoid problem in suggestions display |
|
312 | } |
|
313 | } |
|
314 | }) |
|
315 | // tab + down management in list of suggestions |
|
316 | .on('keydown', '.js-suggestion', function (event) { |
|
317 | var $this = $(this), |
|
318 | $container = $this.parents('.js-container'), |
|
319 | $input_text = $container.find('.js-combobox'), |
|
320 | $autorise_tab_options = typeof $input_text.attr('data-combobox-notab-options') !== 'undefined' ? false : true, |
|
321 | $suggestions = $container.find('.js-suggest div'), |
|
322 | $suggestions_text = $container.find('.js-suggestion-text'), |
|
323 | $next_suggestion = $this.next(), |
|
324 | $previous_suggestion = $this.prev(); |
|
325 | ||
326 | if (event.keyCode == 27 || $autorise_tab_options === false && event.keyCode == 9) { |
|
327 | // esc or (tab/shift tab + notab option) = close |
|
328 | if (event.keyCode == 27) { |
|
329 | // Esc prevented only, tab can go :) |
|
330 | $input_text.val($input_text.attr('data-lastval')); |
|
331 | $suggestions.empty(); |
|
332 | $suggestions_text.empty(); |
|
333 | setTimeout(function () { |
|
334 | $input_text.focus(); |
|
335 | }, 300); // timeout to avoid problem in suggestions display |
|
336 | event.preventDefault(); |
|
337 | } |
|
338 | if ($autorise_tab_options === false && event.keyCode == 9) { |
|
339 | $suggestions.empty(); |
|
340 | $suggestions_text.empty(); |
|
341 | $input_text.focus(); |
|
342 | } |
|
343 | } |
|
344 | if (event.keyCode == 13 || event.keyCode == 32) { |
|
345 | // Enter or space |
|
346 | if ($this.hasClass('js-seemore')) { |
|
347 | $input_text.val($input_text.attr('data-lastval')); |
|
348 | $suggestions.empty(); |
|
349 | $suggestions_text.empty(); |
|
350 | setTimeout(function () { |
|
351 | $input_text.focus(); |
|
352 | }, 300); // timeout to avoid problem in suggestions display |
|
353 | // go define the function you need when we click the see_more option |
|
354 | setTimeout(function () { |
|
355 | do_see_more_option(); |
|
356 | }, 301); // timeout to avoid problem in suggestions display |
|
357 | event.preventDefault(); |
|
358 | } else { |
|
359 | $input_text.val($this.html()); |
|
360 | $input_text.attr('data-lastval', $this.html()); |
|
361 | $suggestions.empty(); |
|
362 | $suggestions_text.empty(); |
|
363 | setTimeout(function () { |
|
364 | $input_text.focus(); |
|
365 | }, 300); // timeout to avoid problem in suggestions display |
|
366 | event.preventDefault(); |
|
367 | } |
|
368 | } |
|
369 | if (!event.shiftKey && event.keyCode == 9 && $autorise_tab_options || event.keyCode == 40) { |
|
370 | // tab (if authorised) or bottom |
|
371 | if ($next_suggestion.length) { |
|
372 | $input_text.val($next_suggestion.html()); |
|
373 | $next_suggestion.focus(); |
|
374 | } else { |
|
375 | $input_text.val($input_text.attr('data-lastval')); |
|
376 | if (!event.shiftKey && event.keyCode == 9) { |
|
377 | // tab closes the list |
|
378 | var e = jQuery.Event("keydown"); |
|
379 | e.which = 27; // # Some key code value |
|
380 | e.keyCode = 27; |
|
381 | $this.trigger(e); |
|
382 | } else { |
|
383 | setTimeout(function () { |
|
384 | $input_text.focus(); |
|
385 | }, 300); |
|
386 | } // timeout to avoid problem in suggestions display |
|
387 | } |
|
388 | event.preventDefault(); |
|
389 | } |
|
390 | ||
391 | if (event.shiftKey && event.keyCode == 9 && $autorise_tab_options || event.keyCode == 38) { |
|
392 | // top or Maj+tab (if authorised) |
|
393 | if ($previous_suggestion.length) { |
|
394 | $input_text.val($previous_suggestion.html()); |
|
395 | $previous_suggestion.focus(); |
|
396 | } else { |
|
397 | $input_text.val($input_text.attr('data-lastval')).focus(); |
|
398 | } |
|
399 | event.preventDefault(); |
|
400 | } |
|
401 | }) |
|
402 | // clear button |
|
403 | .on('click', '.js-clear-button', function () { |
|
404 | var $this = $(this), |
|
405 | $container = $this.parent(), |
|
406 | $input_text = $container.find('.js-combobox'), |
|
407 | $suggestions = $container.find('.js-suggest div'), |
|
408 | $suggestions_text = $container.find('.js-suggestion-text'); |
|
409 | ||
410 | $suggestions.empty(); |
|
411 | $suggestions_text.empty(); |
|
412 | $input_text.val(''); |
|
413 | $input_text.attr('data-lastval', ''); |
|
414 | }).on('click', '.js-suggestion', function () { |
|
415 | var $this = $(this), |
|
416 | value = $this.html(), |
|
417 | $container = $this.parents('.js-container'), |
|
418 | $input_text = $container.find('.js-combobox'), |
|
419 | $suggestions = $container.find('.js-suggest div'), |
|
420 | $suggestions_text = $container.find('.js-suggestion-text'); |
|
421 | ||
422 | if ($this.hasClass('js-seemore')) { |
|
423 | $suggestions.empty(); |
|
424 | $suggestions_text.empty(); |
|
425 | $input_text.focus(); |
|
426 | // go define the function you need when we click the see_more option |
|
427 | do_see_more_option(); |
|
428 | } else { |
|
429 | $input_text.val(value).focus(); |
|
430 | $suggestions.empty(); |
|
431 | $suggestions_text.empty(); |
|
432 | } |
|
433 | }); |
|
434 | } |
|
435 | }); |
|
436 | ||
437 | /***/ }) |
|
438 | ||
439 | /******/ }); |