Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Custom arrows #139

Merged
merged 4 commits into from
Nov 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ Examples on using table-sort-js with frontend frameworks such as [React.js](http
| <table> classes | Description |
| --------------------- | ------------------------------------------------------------------------------------------------------------- |
| "table-sort" | Make the table sortable! (Words, numbers, dates, file sizes)... |
| "no-class-infer" | Turns off inference for adding sort classes automatically i.e (file-size-sort, runtime-sort, dates-dmy-sort). |
| "table-arrows" | Display ascending or descending triangles. |
| "table-arrows" | Display ascending or descending arrows. Supports custom arrows; example: "table-arrows-👆🤙👇" |
| "no-class-infer" | Turns off inference for adding sort classes automatically e.g (file-size-sort, dates-dmy-sort), etc. |
| "remember-sort" | If clicking on different columns remembers sort of the original column. |
| "cells-sort" | sort cells (td) rather than table rows (tr); useful for keeping table rows with classes/attributes in place. |

Expand Down
3 changes: 2 additions & 1 deletion public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
<script type="text/javascript" src="./table-sort.js"></script>

<h1>Manual testing of table sort js</h1>
<table class="table-sort table-arrows">
<!-- -->
<table class="table-sort table-arrows-👆🤙👇">
<tr>
<td>Last Name</td>
<td>First Name</td>
Expand Down
70 changes: 35 additions & 35 deletions public/table-sort.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
/*
/*
table-sort-js
Author: Lee Wannacott
Licence: MIT License Copyright (c) 2021 Lee Wannacott
Licence: MIT License Copyright (c) 2021 Lee Wannacott

GitHub Repository: https://github.com/LeeWannacott/table-sort-js
npm package: https://www.npmjs.com/package/table-sort-js
Demo: https://leewannacott.github.io/Portfolio/#/GitHub
Install:
Frontend: <script src="https://leewannacott.github.io/table-sort-js/table-sort.js"></script> or
Download this file and add <script src="table-sort.js"></script> to your HTML
Backend: npm install table-sort-js and use require("../node_modules/table-sort-js/table-sort.js")
Download this file and add <script src="table-sort.js"></script> to your HTML
Backend: npm install table-sort-js and use require("../node_modules/table-sort-js/table-sort.js")
Instructions:
Add class="table-sort" to tables you'd like to make sortable
Click on the table headers to sort them.
Expand Down Expand Up @@ -139,8 +139,10 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) {
table.hasClass = {
noClassInfer: sortableTable.classList.contains("no-class-infer"),
cellsSort: sortableTable.classList.contains("cells-sort"),
tableArrows: sortableTable.classList.contains("table-arrows"),
rememberSort: sortableTable.classList.contains("remember-sort"),
tableArrows: Array.from(sortableTable.classList).filter((item) =>
item.includes("table-arrows")
),
};
for (
let headerIndex = 0;
Expand Down Expand Up @@ -390,47 +392,36 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) {
return sortAscending(b, a);
}

function clearArrows(arrowUp, arrowDown, initialArrow = "↕") {
th.innerHTML = th.innerHTML.replace(initialArrow, "");
th.innerHTML = th.innerHTML.replace(arrowUp, "");
th.innerHTML = th.innerHTML.replace(arrowDown, "");
function clearArrows(arrow) {
th.innerHTML = th.innerHTML.replace(arrow.neutral, "");
th.innerHTML = th.innerHTML.replace(arrow.up, "");
th.innerHTML = th.innerHTML.replace(arrow.down, "");
}

if (column.toBeSorted[0] === undefined) {
return;
}

function changeTableArrow(arrowDirection) {
function changeArrowAndSort(arrowDirection, sortDirection) {
if (table.hasClass.tableArrows) {
clearArrows(arrow.up, arrow.down);
clearArrows(arrow);
th.insertAdjacentText("beforeend", arrowDirection);
}
}

function sortColumn(sortDirection) {
column.toBeSorted.sort(sortDirection, {
numeric: !isAlphaSort,
ignorePunctuation: !isPunctSort,
});
}

if (timesClickedColumn === 1) {
if (desc) {
changeTableArrow(arrow.down);
sortColumn(sortDescending);
} else {
changeTableArrow(arrow.up);
sortColumn(sortAscending);
}
desc
? changeArrowAndSort(arrow.down, sortDescending)
: changeArrowAndSort(arrow.up, sortAscending);
} else if (timesClickedColumn === 2) {
timesClickedColumn = 0;
if (desc) {
changeTableArrow(arrow.up);
sortColumn(sortAscending);
} else {
changeTableArrow(arrow.down);
sortColumn(sortDescending);
}
desc
? changeArrowAndSort(arrow.up, sortAscending)
: changeArrowAndSort(arrow.down, sortDescending);
}
return timesClickedColumn;
}
Expand Down Expand Up @@ -524,12 +515,21 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) {
columnIndexesClicked
) {
const desc = th.classList.contains("order-by-desc");
const initialArrow = " ↕";
const arrow = { up: " ↑", down: " ↓" };
const fillValue = "!X!Y!Z!";

if (table.hasClass.tableArrows) {
th.insertAdjacentText("beforeend", initialArrow);
let fillValue = "!X!Y!Z!";
let arrow = { up: " ↑", neutral: " ↕", down: " ↓" };
if (table.hasClass.tableArrows[0]) {
if (table.hasClass.tableArrows[0].split("-").length > 2) {
// Array.from to support utf-8 strings e.g emojis
let customArrow = Array.from(
table.hasClass.tableArrows[0].split("-")[2]
);
customArrow = customArrow.map((i) => " " + i);
console.log(customArrow);
if (customArrow.length === 3) {
[arrow.up, arrow.neutral, arrow.down] = [...customArrow];
}
}
th.insertAdjacentText("beforeend", arrow.neutral);
}

let timesClickedColumn = 0;
Expand Down
2 changes: 1 addition & 1 deletion src/test-table.js
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ export class App extends Component {
Statistics on public repositories pulled from the GitHub API v3:
</h6>
<div>
<table className="table table-sort table-bordered table-responsive table-hover">
<table className="table table-sort table-arrows-jkl table-bordered table-responsive table-hover">
<thead className="cw-light">
<tr>
<th>Repository Name</th>
Expand Down
Loading