xxxxxxxxxx
1
2
<div style="padding:20px;">
3
4
<div class="container">
5
<div class="row">
6
<div class="col-2 dropdown">
7
<button
8
class="btn btn-primary dropdown-toggle"
9
type="button"
10
id="dropdownMenuButton"
11
data-mdb-toggle="dropdown"
12
aria-expanded="false"
13
>
14
A-Z
15
</button>
16
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
17
<li><div class="dropdown-item" data-order="A-Z">A-Z</div></li>
18
<li><div class="dropdown-item" data-order="Z-A">Z-A</div></li>
19
</ul>
20
</div>
21
<div class="col-10">
22
<div id="async" class="form-outline autocomplete">
23
<input type="text" id="autocompletetext" class="form-control" />
24
<label class="form-label" for="autocompletetext">Enter text...</label>
25
</div>
26
</div>
27
</div>
28
</div>
29
30
31
</div>
1
1
xxxxxxxxxx
1
var order = "A-Z";
2
3
const asyncAutocomplete = document.querySelector('#async');
4
5
const asyncFilter = async (query) => {
6
const url = `https://swapi.py4e.com/api/people/?search=${encodeURI(query)}`;
7
const response = await fetch(url);
8
const data = await response.json();
9
var res = data.results;
10
11
//Order data by AZ or ZA, according to selection
12
res.sort( function( a, b ) {
13
if(order == "A-Z")
14
return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
15
else if(order == "Z-A")
16
return b.name < a.name ? -1 : b.name > a.name ? 1 : 0;
17
});
18
19
//Return data
20
return res;
21
};
22
23
//Initialise the autocomplete
24
var AutoCompleteObject = new mdb.Autocomplete(asyncAutocomplete, {
25
filter: asyncFilter,
26
displayValue: (value) => value.name
27
});
28
29
/* Order for dropdown - on order selection (or perhaps filter in other cases),
30
* we have to re-request the data again, and then force a focus on the textfield to see a change
31
* in results. But often we have already loaded all the data and it simply needs to be reordered
32
* (or filtered). */
33
var divs = document.querySelectorAll('.dropdown-item'), i;
34
for (i = 0; i < divs.length; ++i) {
35
divs[i].addEventListener("click",function(){
36
order = this.dataset.order;
37
document.getElementById("dropdownMenuButton").innerHTML = order;
38
//Re-request the data again in order to prompt the autocomplete system to function as desired
39
//but this means another ajax request
40
AutoCompleteObject = new mdb.Autocomplete(asyncAutocomplete, {
41
filter: asyncFilter,
42
displayValue: (value) => value.name
43
});
44
//we also refocus on it to see the list
45
document.getElementById('autocompletetext').focus();
46
47
});
48
}
Console errors: 0