Skip to content
This repository was archived by the owner on May 8, 2022. It is now read-only.

Commit ee54eb8

Browse files
committed
Rework table sorting. Fixes: numeric entries are sorted as strings. Duplicated numeric entries are lost on sorting. Closes #28
1 parent 98a6468 commit ee54eb8

File tree

2 files changed

+64
-94
lines changed

2 files changed

+64
-94
lines changed

html/js/base_ts.js

+29-43
Original file line numberDiff line numberDiff line change
@@ -156,27 +156,24 @@ function bulkEdit() {
156156
return;
157157
}
158158
function sortTable(column) {
159-
//console.log(columm);
160159
if (column == COLUMN_TO_SORT) {
161160
return;
162161
}
163-
var table = document.getElementById("content_table");
164-
var tableHead = table.getElementsByTagName("TR")[0];
165-
var tableItems = tableHead.getElementsByTagName("TD");
166-
var sortObj = new Object();
167-
var x, xValue;
168-
var tableHeader;
169-
var sortByString = false;
170-
if (column > 0 && COLUMN_TO_SORT > 0) {
162+
const table = document.getElementById("content_table");
163+
const tableHead = table.getElementsByTagName("TR")[0];
164+
const tableItems = tableHead.getElementsByTagName("TD");
165+
const sortArr = [];
166+
let xValue;
167+
if (column >= 0 && COLUMN_TO_SORT >= 0) {
171168
tableItems[COLUMN_TO_SORT].className = "pointer";
172169
tableItems[column].className = "sortThis";
173170
}
174171
COLUMN_TO_SORT = column;
175-
var rows = table.rows;
172+
const rows = table.rows;
176173
if (rows[1] != undefined) {
177-
tableHeader = rows[0];
178-
x = rows[1].getElementsByTagName("TD")[column];
179-
for (i = 1; i < rows.length; i++) {
174+
const tableHeader = rows[0];
175+
let x = rows[1].getElementsByTagName("TD")[column];
176+
for (let i = 1; i < rows.length; i++) {
180177
x = rows[i].getElementsByTagName("TD")[column];
181178
switch (x.childNodes[0].tagName.toLowerCase()) {
182179
case "input":
@@ -185,43 +182,32 @@ function sortTable(column) {
185182
case "p":
186183
xValue = x.getElementsByTagName("P")[0].innerText.toLowerCase();
187184
break;
188-
default: console.log(x.childNodes[0].tagName);
189-
}
190-
if (xValue == "" || xValue == NaN) {
191-
xValue = i;
192-
sortObj[i] = rows[i];
193-
}
194-
else {
195-
switch (isNaN(xValue) || typeof xValue == "string") {
196-
case false:
197-
xValue = parseFloat(xValue);
198-
sortObj[xValue] = rows[i];
199-
break;
200-
case true:
201-
sortByString = true;
202-
sortObj[xValue.toLowerCase() + i] = rows[i];
203-
break;
204-
}
185+
default:
186+
console.log(x.childNodes[0].tagName);
205187
}
188+
sortArr.push({ key: xValue ? xValue : i, row: rows[i] });
206189
}
207190
while (table.firstChild) {
208191
table.removeChild(table.firstChild);
209192
}
210-
var sortValues = getObjKeys(sortObj);
211-
if (sortByString == true) {
212-
sortValues.sort();
213-
console.log(sortValues);
214-
}
215-
else {
216-
function sortFloat(a, b) {
217-
return a - b;
193+
sortArr.sort((se1, se2) => {
194+
const se1KeyNum = parseFloat(String(se1.key));
195+
const se2KeyNum = parseFloat(String(se2.key));
196+
if (!isNaN(se1KeyNum) && !isNaN(se2KeyNum)) {
197+
return se1KeyNum - se2KeyNum;
218198
}
219-
sortValues.sort(sortFloat);
220-
}
199+
if (se1.key < se2.key) {
200+
return -1;
201+
}
202+
if (se1.key > se2.key) {
203+
return 1;
204+
}
205+
return 0;
206+
});
221207
table.appendChild(tableHeader);
222-
for (var i = 0; i < sortValues.length; i++) {
223-
table.appendChild(sortObj[sortValues[i]]);
224-
}
208+
sortArr.forEach((se) => {
209+
table.appendChild(se.row);
210+
});
225211
}
226212
return;
227213
}

ts/base_ts.ts

+35-51
Original file line numberDiff line numberDiff line change
@@ -204,38 +204,38 @@ function bulkEdit() {
204204
}
205205

206206
function sortTable(column) {
207-
//console.log(columm);
208207

209208
if (column == COLUMN_TO_SORT) {
210209
return;
211210
}
212211

212+
const table = document.getElementById("content_table");
213+
const tableHead = table.getElementsByTagName("TR")[0];
214+
const tableItems = tableHead.getElementsByTagName("TD");
213215

214-
var table = document.getElementById("content_table");
215-
var tableHead = table.getElementsByTagName("TR")[0];
216-
var tableItems = tableHead.getElementsByTagName("TD");
216+
type SortEntry = {
217+
key: string | number;
218+
row: HTMLTableRowElement;
219+
}
217220

218-
var sortObj = new Object();
219-
var x, xValue;
220-
var tableHeader
221-
var sortByString = false
221+
const sortArr: SortEntry[] = [];
222+
let xValue: string | number;
222223

223-
if (column > 0 && COLUMN_TO_SORT > 0) {
224+
if (column >= 0 && COLUMN_TO_SORT >= 0) {
224225
tableItems[COLUMN_TO_SORT].className = "pointer";
225226
tableItems[column].className = "sortThis";
226227
}
227228

228229
COLUMN_TO_SORT = column;
229230

230-
231-
var rows = (table as HTMLTableElement).rows;
231+
const rows = (table as HTMLTableElement).rows;
232232

233233
if (rows[1] != undefined) {
234-
tableHeader = rows[0]
234+
const tableHeader = rows[0];
235235

236-
x = rows[1].getElementsByTagName("TD")[column];
236+
let x: any = rows[1].getElementsByTagName("TD")[column];
237237

238-
for (i = 1; i < rows.length; i++) {
238+
for (let i = 1; i < rows.length; i++) {
239239

240240
x = rows[i].getElementsByTagName("TD")[column];
241241

@@ -248,58 +248,42 @@ function sortTable(column) {
248248
xValue = x.getElementsByTagName("P")[0].innerText.toLowerCase();
249249
break;
250250

251-
default: console.log(x.childNodes[0].tagName);
251+
default:
252+
console.log(x.childNodes[0].tagName);
252253
}
253254

254-
if (xValue == "" || xValue == NaN) {
255-
256-
xValue = i
257-
sortObj[i] = rows[i];
258-
259-
} else {
260-
261-
switch(isNaN(xValue) || typeof xValue == "string") {
262-
case false:
263-
264-
xValue = parseFloat(xValue);
265-
sortObj[xValue] = rows[i]
266-
break;
267-
268-
case true:
269-
270-
sortByString = true
271-
sortObj[xValue.toLowerCase() + i] = rows[i]
272-
break;
273-
274-
}
275-
276-
}
255+
sortArr.push({key: xValue ? xValue : i, row: rows[i]});
277256

278257
}
279258

280259
while (table.firstChild) {
281260
table.removeChild(table.firstChild);
282261
}
283262

284-
var sortValues = getObjKeys(sortObj)
263+
sortArr.sort((se1: SortEntry, se2: SortEntry): number => {
264+
const se1KeyNum = parseFloat(String(se1.key));
265+
const se2KeyNum = parseFloat(String(se2.key));
285266

286-
if (sortByString == true) {
287-
sortValues.sort()
288-
console.log(sortValues);
289-
} else {
290-
function sortFloat(a, b) {
291-
return a - b;
267+
if (!isNaN(se1KeyNum) && !isNaN(se2KeyNum)) {
268+
return se1KeyNum - se2KeyNum;
292269
}
293-
sortValues.sort(sortFloat);
294-
}
295270

296-
table.appendChild(tableHeader)
271+
if (se1.key < se2.key) {
272+
return -1;
273+
}
297274

298-
for (var i = 0; i < sortValues.length; i++) {
275+
if (se1.key > se2.key) {
276+
return 1;
277+
}
299278

300-
table.appendChild(sortObj[sortValues[i]])
279+
return 0;
280+
});
301281

302-
}
282+
table.appendChild(tableHeader);
283+
284+
sortArr.forEach((se: SortEntry) => {
285+
table.appendChild(se.row);
286+
});
303287

304288
}
305289

0 commit comments

Comments
 (0)