Skip to content

Commit b4b4655

Browse files
committed
Added support for column sorting and handled URL parameters.
1 parent e41754d commit b4b4655

File tree

2 files changed

+62
-5
lines changed

2 files changed

+62
-5
lines changed
Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,72 @@
1-
function update_table(table_id, url, search=null) {
1+
function updateHeaders(tableId, url, tableElement) {
2+
// Get the column header elements.
3+
headerElements = tableElement.getElementsByTagName('TH');
4+
for (let x = 0; x < headerElements.length; x++) {
5+
const headerLinks = headerElements[x].getElementsByTagName('A');
6+
for (let y = 0; y < headerLinks.length; y++) {
7+
headerLinks[y].onclick = function(e) {
8+
e.preventDefault();
9+
sortParameters = decodeParameters(headerLinks[y].getAttribute('href'));
10+
urlParameters = decodeParameters(url);
11+
for (const [key, value] of Object.entries(sortParameters)) {
12+
urlParameters[key] = value;
13+
}
14+
url = clearParameters(url);
15+
updateTable(tableId, url + encodeParameters(urlParameters));
16+
};
17+
}
18+
}
19+
}
20+
21+
function updateTable(tableId, url, search=null) {
222
const xhr = new XMLHttpRequest();
323
xhr.onreadystatechange = function() {
424
if (xhr.readyState == XMLHttpRequest.DONE ) {
525
if (xhr.status == 200) {
626
// Replace the existing table with the table fetched from the request.
7-
var table_element = document.getElementById(table_id);
8-
table_element.innerHTML = xhr.responseText;
27+
var tableElement = document.getElementById(tableId);
28+
tableElement.innerHTML = xhr.responseText;
29+
updateHeaders(tableId, url, tableElement);
930
}
1031
}
1132
};
1233
if (search) xhr.open('GET', url + "?search=" + search, true);
1334
else xhr.open('GET', url, true);
1435
xhr.send();
36+
}
37+
38+
function encodeParameters(params) {
39+
let result = '?';
40+
for (let i = 0; i < Object.keys(params).length; i++) {
41+
let currentKey = Object.keys(params).at(i)
42+
result += currentKey + "=" + params[currentKey];
43+
if (i < Object.keys(params).length - 1) {
44+
result += "&";
45+
}
46+
}
47+
return result;
48+
}
49+
50+
function decodeParameters(url) {
51+
let result = {};
52+
let parameters = url.split("?");
53+
// If no question mark was found, there were no parameters.
54+
if (parameters.length <= 1) return { };
55+
else parameters = parameters[1];
56+
parameters = parameters.split("&");
57+
for (i in parameters) {
58+
pair = parameters[i].split("=");
59+
if (pair.length == 2) {
60+
if (pair[1]) {
61+
result[pair[0]] = pair[1];
62+
}
63+
}
64+
}
65+
return result;
66+
}
67+
68+
function clearParameters(url) {
69+
split = url.split("?");
70+
if (split.length > 1) return split[0];
71+
else return url;
1572
}

django_responsive_tables2/templates/django_responsive_tables2/basic_table.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
// Load initial values when page is loaded, and add event listeners.
1111
document.addEventListener("DOMContentLoaded", function() {
12-
update_table("{{ table_id }}", "{{ table_url }}");
12+
updateTable("{{ table_id }}", "{{ table_url }}");
1313
searchElement_{{ table_id }}.addEventListener("keyup", keyUp_{{ table_id }});
1414
searchElement_{{ table_id }}.addEventListener("keydown", keyDown_{{ table_id }});
1515
});
@@ -27,6 +27,6 @@
2727

2828
//User is finished typing.
2929
function doneTyping_{{ table_id }}(e) {
30-
update_table("{{ table_id }}", "{{ table_url }}", searchElement_{{ table_id }}.value);
30+
updateTable("{{ table_id }}", "{{ table_url }}", searchElement_{{ table_id }}.value);
3131
}
3232
</script>

0 commit comments

Comments
 (0)