table-sort-js
Advanced tools
Comparing version 1.12.1 to 1.13.0
{ | ||
"name": "table-sort-js", | ||
"version": "1.12.1", | ||
"version": "1.13.0", | ||
"description": "A JavaScript client-side HTML table sorting library with no dependencies required.", | ||
@@ -5,0 +5,0 @@ "license": "MIT", |
@@ -15,2 +15,3 @@ ![table-sort-js](https://img.shields.io/npm/v/table-sort-js) | ||
- [npm package.](https://www.npmjs.com/package/table-sort-js) | ||
- [firefox browser extension](https://addons.mozilla.org/en-US/firefox/addon/table-sort-js/) | ||
@@ -45,22 +46,30 @@ ## Install instructions. | ||
| <table> classes | Description | | ||
| --------------------- | -------------------------------------------------------------------------------------------- | | ||
| "table-sort" | Make the table sortable! (Words, numbers)... | | ||
| "table-arrows" | Display ascending or descending triangles. | | ||
| "no-class-infer" | Turns off inference for adding sort classes automatically (file-size-sort and runtime-sort). | | ||
| "remember-sort" | If clicking on different columns remembers sort of the original column. | | ||
| <table> classes | Description | | ||
| --------------------- | ------------------------------------------------------------------------------------------------------------- | | ||
| "table-sort" | Make the table sortable! (Words, numbers, dates, file sizes)... | | ||
| "table-arrows" | Display ascending or descending triangles. | | ||
| "no-class-infer" | Turns off inference for adding sort classes automatically i.e (file-size-sort, runtime-sort, dates-dmy-sort). | | ||
| "remember-sort" | If clicking on different columns remembers sort of the original column. | | ||
| <th> classes | Description | | ||
| ------------------ | --------------------------------------------------------------------------------------------------------------------------------------- | | ||
| "order-by-desc" | Order by descending on first click. (default is aescending) | | ||
| "data-sort" | Sort by [data attributes](https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes), e.g <td data-sort="42"> | | ||
| "onload-sort" | Sort column on loading of the page. Simulates a click from the user. (can only sort onload for one column) | | ||
| "file-size-sort" | Sort file sizes(B->TiB) uses the binary prefix. (e.g KiB) | | ||
| "runtime-sort" | Sorts runtime in minutes and seconds e.g (1m 20s). Useful for sorting the GitHub actions Run time column... | | ||
| "disable-sort" | Disallow sorting the table by this specific column. | | ||
| "alpha-sort" | Sort alphabetically (z11,z2); default is [natural sort](https://en.wikipedia.org/wiki/Natural_sort_order) (z2,z11). | | ||
| "punct-sort" | Sort punctuation; default ignores punctuation. | | ||
| "dates-mdy-sort" | Sorts dates in mm/dd/yyyy format. e.g (12/28/2023). Can use "/" or "-" or "." as separator. Overides inferred "dates-dmy-sort" class. | | ||
| <th> Inferred Classes. | Description | | ||
| ---------------------------- | --------------------------------------------------------------------------------------------------------------------- | | ||
| "dates-dmy-sort" | Sorts dates in dd/mm/yyyy format. e.g (18/10/1995). Can use "/" or "-" or "." as separator. | | ||
| "runtime-sort" | Sorts runtime in hours minutes and seconds e.g (10h 1m 20s). Useful for sorting the GitHub actions Run time column... | | ||
| "file-size-sort" | Sorts file sizes(B->TiB) uses the binary prefix. (e.g KiB). Input data ideally in Bytes e.g (10b or 10B) | | ||
| <th> Classes that change defaults. | Description | | ||
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | | ||
| "order-by-desc" | Order by descending on first click. (default is aescending) | | ||
| "alpha-sort" | Sort alphabetically (z11,z2); default is [natural sort](https://en.wikipedia.org/wiki/Natural_sort_order) (z2,z11). | | ||
| "punct-sort" | Sort punctuation; default ignores punctuation. | | ||
#### Development: | ||
If you wish to contribute, install instructions can be found [here.](https://leewannacott.github.io/table-sort-js/docs/development.html) |
@@ -73,8 +73,9 @@ /* | ||
const regexFileSizeSort = /^([.0-9]+)\s?(B|KB|KiB|MB|MiB|GB|GiB|TB|TiB)/i; | ||
const regexDates = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/; | ||
let runtimeSortCounter = 0, | ||
fileSizeSortCounter = 0; | ||
fileSizeSortCounter = 0, | ||
datesSortCounter = 0; | ||
let tableColumnLength = th.parentElement.childElementCount; | ||
for (let tr of tableRows) { | ||
let runtimeSortMatch, fileSizeSortMatch; | ||
let runtimeSortMatch, fileSizeSortMatch, datesSortMatch; | ||
const tableColumn = tr.querySelectorAll("td").item(columnIndex); | ||
@@ -86,2 +87,3 @@ if (tableColumn.innerText) { | ||
fileSizeSortMatch = tableColumn.innerText.match(regexFileSizeSort); | ||
datesSortMatch = tableColumn.innerText.match(regexDates); | ||
} | ||
@@ -94,2 +96,5 @@ if (runtimeSortMatch) { | ||
} | ||
if (datesSortMatch) { | ||
datesSortCounter++; | ||
} | ||
} | ||
@@ -109,2 +114,8 @@ // TODO: refactor this into one function called addInferredClasses that loops over sort classes and counters | ||
); | ||
addInferredClass( | ||
th, | ||
tableColumnLength, | ||
datesSortCounter, | ||
"dates-dmy-sort" | ||
); | ||
} | ||
@@ -197,3 +208,4 @@ } | ||
let match = columnOfTd.match(regexMinutesAndSeconds); | ||
let [minutesInSeconds, hours, seconds, timeinSeconds] = [0, 0, 0, 0]; | ||
let [minutesInSeconds, hours, seconds] = [0, 0, 0]; | ||
let timeinSeconds = columnOfTd; | ||
if (match) { | ||
@@ -222,2 +234,41 @@ const regexHours = match[1]; | ||
function sortDates(dateFormat, tableRows, columnData) { | ||
try { | ||
for (let [i, tr] of tableRows.entries()) { | ||
let columnOfTd; | ||
const regexDate = /^(\d\d?)[./-](\d\d?)[./-]((\d\d)?\d\d)$/; | ||
columnOfTd = tr.querySelectorAll("td").item(columnIndex).textContent; | ||
let match = columnOfTd.match(regexDate); | ||
let [years, days, months] = [0, 0, 0]; | ||
let numberToSort = columnOfTd; | ||
if (match) { | ||
const regexFirstNumber = match[1]; | ||
const regexSecondNumber = match[2]; | ||
const regexYears = match[3]; | ||
if (regexFirstNumber && regexSecondNumber) { | ||
if (dateFormat === "mdy") { | ||
days = regexSecondNumber; | ||
months = regexFirstNumber; | ||
} else { | ||
days = regexFirstNumber; | ||
months = regexSecondNumber; | ||
} | ||
} | ||
if (regexYears) { | ||
years = regexYears; | ||
} | ||
numberToSort = Number( | ||
years + | ||
String(months).padStart(2, "0") + | ||
String(days).padStart(2, "0") | ||
); | ||
} | ||
columnData.push(`${numberToSort}#${i}`); | ||
columnIndexAndTableRow[columnData[i]] = tr.innerHTML; | ||
} | ||
} catch (e) { | ||
console.log(e); | ||
} | ||
} | ||
let [timesClickedColumn, columnIndexesClicked] = [0, []]; | ||
@@ -254,2 +305,4 @@ | ||
isTimeSort, | ||
isSortDateDayMonthYear, | ||
isSortDateMonthDayYear, | ||
isDataAttribute, | ||
@@ -274,3 +327,10 @@ colSpanData, | ||
} | ||
if (!isFileSize && !isDataAttribute && !isTimeSort) { | ||
// These classes already handle pushing to column and setting the tr html. | ||
if ( | ||
!isFileSize && | ||
!isDataAttribute && | ||
!isTimeSort && | ||
!isSortDateDayMonthYear && | ||
!isSortDateMonthDayYear | ||
) { | ||
columnData.push(`${tdTextContent}#${i}`); | ||
@@ -416,2 +476,11 @@ columnIndexAndTableRow[`${tdTextContent}#${i}`] = tr.innerHTML; | ||
const isSortDateDayMonthYear = th.classList.contains("dates-dmy-sort"); | ||
const isSortDateMonthDayYear = th.classList.contains("dates-mdy-sort"); | ||
// pick mdy first to override the inferred default class which is dmy. | ||
if (isSortDateMonthDayYear) { | ||
sortDates("mdy", visibleTableRows, columnData); | ||
} else if (isSortDateDayMonthYear) { | ||
sortDates("dmy", visibleTableRows, columnData); | ||
} | ||
const isRememberSort = sortableTable.classList.contains("remember-sort"); | ||
@@ -429,2 +498,4 @@ if (!isRememberSort) { | ||
isFileSize, | ||
isSortDateDayMonthYear, | ||
isSortDateMonthDayYear, | ||
isDataAttribute, | ||
@@ -431,0 +502,0 @@ isTimeSort, |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
25733
478
74