-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
111 lines (101 loc) · 2.83 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import './style.css';
var headers = Array.from(document.querySelectorAll('.headers > div')),
search = document.getElementById('search-field'),
clear = document.querySelector('.clear'),
caret = document.querySelector('.caret'),
body = document.querySelector('.body'),
filterType = null,
filtered = null,
data = null,
markup = '',
str = '';
clear.addEventListener('click', () => {
search.value = '';
populateTable(data);
clear.classList.remove('enable-clear');
});
search.addEventListener('keyup', () => {
str = search.value;
if (str != '') {
filtered = [];
for (let x of data) {
Object.values(x).filter((val) => {
if (typeof val === 'string' && val.includes(str)) {
filtered.push(x);
filtered = filtered.filter((item, i) => filtered.indexOf(item) === i);
populateTable(filtered);
}
if (typeof val === 'number' && val.toString().indexOf(str) > -1) {
filtered.push(x);
populateTable(filtered);
}
clear.classList.add('enable-clear');
});
}
} else populateTable(data);
});
// In retrospect, innerHTML should be replaced with something else
function populateTable(arr) {
markup = '';
body.innerHTML = '';
renderData(arr);
body.innerHTML = markup;
}
// RETURN THE HTML
function renderData(arr) {
for (var i = 0; i < arr.length; i++) {
markup +=
'<div class="tble-rows">' +
'<div class="tble-cells">' +
arr[i].id +
'</div>' +
'<div class="tble-cells">' +
arr[i].brand +
'</div>' +
'<div class="tble-cells">' +
arr[i].category +
'</div>' +
'<div class="tble-cells">' +
arr[i].title +
'</div>' +
'<div class="tble-cells">' +
arr[i].price +
'</div>' +
`</div>`;
}
}
function comparison(key, order = 'ascending') {
return (a, b) => {
const varA = typeof a[key] === 'string' ? a[key].toUpperCase() : a[key];
const varB = typeof b[key] === 'string' ? b[key].toUpperCase() : b[key];
let comparison = 0;
if (varA > varB) {
comparison = 1;
} else if (varA < varB) {
comparison = -1;
}
return order === 'descending' ? comparison * -1 : comparison;
};
}
function sortColumn(e) {
let index = null;
filterType = e.target.innerHTML.toLowerCase();
data.sort(comparison(filterType));
populateTable(data);
caret != undefined ? caret.remove() : '';
caret = document.createElement('span');
caret.classList.add('caret');
caret.innerHTML = '▲';
index = e.target.getAttribute('data-id');
e.target.appendChild(caret);
}
(async () => {
const { default: json } = await import('./data.json', {
assert: { type: 'json' },
});
data = json.products;
populateTable(data);
for (var i = 0; i < headers.length; i++) {
headers[i].addEventListener('click', sortColumn);
}
})();