From 4e0e1048d3c57e0987b9487b57a167cf3aef2228 Mon Sep 17 00:00:00 2001 From: LeeWannacott Date: Thu, 18 May 2023 22:03:06 +1200 Subject: [PATCH] NPM version 1.15.2; Fix colspans on non default sorts like data-sort. --- browser-extensions/chrome/manifest.json | 2 +- browser-extensions/chrome/table-sort-js.zip | Bin 7304 -> 7364 bytes browser-extensions/chrome/table-sort.js | 119 +++++++------- browser-extensions/firefox/manifest.json | 2 +- browser-extensions/firefox/table-sort-js.zip | Bin 7304 -> 7364 bytes browser-extensions/firefox/table-sort.js | 119 +++++++------- npm/package.json | 2 +- npm/table-sort.js | 119 +++++++------- public/index.html | 162 ++++++++++--------- 9 files changed, 276 insertions(+), 249 deletions(-) diff --git a/browser-extensions/chrome/manifest.json b/browser-extensions/chrome/manifest.json index a874769..bf54abe 100644 --- a/browser-extensions/chrome/manifest.json +++ b/browser-extensions/chrome/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 3, "author": "Lee Wannacott", "name": "table-sort-js", - "version": "1.15.1", + "version": "1.15.2", "description": "Makes tables sortable using table-sort-js: https://github.com/LeeWannacott/table-sort-js", "icons": { "48": "icons/t.png" }, "browser_action": { diff --git a/browser-extensions/chrome/table-sort-js.zip b/browser-extensions/chrome/table-sort-js.zip index 0d0ed48af335f027dd23275239e1eb8c41ee32bf..adf59672bcd780de450e78547ed0382d2d5c101d 100644 GIT binary patch delta 4764 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 delta 4699 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 diff --git a/browser-extensions/chrome/table-sort.js b/browser-extensions/chrome/table-sort.js index 05ad269..385b443 100644 --- a/browser-extensions/chrome/table-sort.js +++ b/browser-extensions/chrome/table-sort.js @@ -136,16 +136,16 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { th.insertAdjacentText("beforeend", arrowUp); } - function sortDataAttributes(tableRows, columnData) { + function sortDataAttributes(tableRows, column) { for (let [i, tr] of tableRows.entries()) { - const dataAttributeTd = tr.querySelectorAll("td").item(columnIndex) - .dataset.sort; - columnData.push(`${dataAttributeTd}#${i}`); - columnIndexAndTableRow[columnData[i]] = tr.outerHTML; + let dataAttributeTd = getColumn(tr, column.spanSum, column.span).dataset + .sort; + column.toBeSorted.push(`${dataAttributeTd}#${i}`); + columnIndexAndTableRow[column.toBeSorted[i]] = tr.outerHTML; } } - function sortFileSize(tableRows, columnData) { + function sortFileSize(tableRows, column) { let unitToMultiplier = { b: 1, kb: 1000, @@ -167,25 +167,23 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { let number = parseFloat(match[1]); let unit = match[2].toLowerCase(); let multiplier = unitToMultiplier[unit]; - columnData.push(`${number * multiplier}#${i}`); + column.toBeSorted.push(`${number * multiplier}#${i}`); } else { - columnData.push(`${fillValue}#${i}`); + column.toBeSorted.push(`${fillValue}#${i}`); } } } - function sortByRuntime(tableRows, columnData) { + function sortByRuntime(tableRows, column) { try { for (let [i, tr] of tableRows.entries()) { const regexMinutesAndSeconds = /^(\d+h)?\s?(\d+m)?\s?(\d+s)?$/i; let columnOfTd = ""; // TODO: github actions runtime didn't like textContent, tests didn't like innerText? if (testingTableSortJS) { - columnOfTd = tr - .querySelectorAll("td") - .item(columnIndex).textContent; + columnOfTd = getColumn(tr, column.spanSum, column.span).textContent; } else { - columnOfTd = tr.querySelectorAll("td").item(columnIndex).innerText; + columnOfTd = getColumn(tr, column.spanSum, column.span).innerText; } let match = columnOfTd.match(regexMinutesAndSeconds); let [minutesInSeconds, hours, seconds] = [0, 0, 0]; @@ -205,15 +203,15 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } timeinSeconds = hours + minutesInSeconds + seconds; } - columnData.push(`${timeinSeconds}#${i}`); - columnIndexAndTableRow[columnData[i]] = tr.outerHTML; + column.toBeSorted.push(`${timeinSeconds}#${i}`); + columnIndexAndTableRow[column.toBeSorted[i]] = tr.outerHTML; } } catch (e) { console.log(e); } } - function sortDates(datesFormat, tableRows, columnData) { + function sortDates(datesFormat, tableRows, column) { try { for (let [i, tr] of tableRows.entries()) { let columnOfTd, datesRegex; @@ -222,7 +220,7 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } else if (datesFormat === "ymd") { datesRegex = /^(\d\d\d\d)[./-](\d\d?)[./-](\d\d?)/; } - columnOfTd = tr.querySelectorAll("td").item(columnIndex).textContent; + columnOfTd = getColumn(tr, column.spanSum, column.span).textContent; let match = columnOfTd.match(datesRegex); let [years, days, months] = [0, 0, 0]; let numberToSort = columnOfTd; @@ -243,8 +241,8 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { String(days).padStart(2, "0") ); } - columnData.push(`${numberToSort}#${i}`); - columnIndexAndTableRow[columnData[i]] = tr.outerHTML; + column.toBeSorted.push(`${numberToSort}#${i}`); + columnIndexAndTableRow[column.toBeSorted[i]] = tr.outerHTML; } } catch (e) { console.log(e); @@ -268,41 +266,47 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } } - function getColSpanData(sortableTable, colSpanData, colSpanSum) { + function getColSpanData(sortableTable, column) { sortableTable.querySelectorAll("th").forEach((th, index) => { - colSpanData[index] = th.colSpan; - if (index === 0) colSpanSum[index] = th.colSpan; - else colSpanSum[index] = colSpanSum[index - 1] + th.colSpan; + column.span[index] = th.colSpan; + if (index === 0) column.spanSum[index] = th.colSpan; + else column.spanSum[index] = column.spanSum[index - 1] + th.colSpan; }); } + function getColumn(tr, colSpanSum, colSpanData) { + return tr + .querySelectorAll("td") + .item( + colSpanData[columnIndex] === 1 + ? colSpanSum[columnIndex] - 1 + : colSpanSum[columnIndex] - colSpanData[columnIndex] + ); + } + function getTableData(tableProperties) { const { tableRows, - columnData, + column, isFileSize, isTimeSort, isSortDateDayMonthYear, isSortDateMonthDayYear, isSortDateYearMonthDay, isDataAttribute, - colSpanData, - colSpanSum, } = tableProperties; for (let [i, tr] of tableRows.entries()) { - let tdTextContent = tr - .querySelectorAll("td") - .item( - colSpanData[columnIndex] === 1 - ? colSpanSum[columnIndex] - 1 - : colSpanSum[columnIndex] - colSpanData[columnIndex] - ).textContent; + let tdTextContent = getColumn( + tr, + column.spanSum, + column.span + ).textContent; if (tdTextContent.length === 0) { tdTextContent = ""; } if (tdTextContent.trim() !== "") { if (isFileSize) { - fileSizeColumnTextAndRow[columnData[i]] = tr.outerHTML; + fileSizeColumnTextAndRow[column.toBeSorted[i]] = tr.outerHTML; } // These classes already handle pushing to column and setting the tr html. if ( @@ -313,12 +317,12 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { !isSortDateYearMonthDay && !isSortDateMonthDayYear ) { - columnData.push(`${tdTextContent}#${i}`); + column.toBeSorted.push(`${tdTextContent}#${i}`); columnIndexAndTableRow[`${tdTextContent}#${i}`] = tr.outerHTML; } } else { // Fill in blank table cells dict key with filler value. - columnData.push(`${fillValue}#${i}`); + column.toBeSorted.push(`${fillValue}#${i}`); columnIndexAndTableRow[`${fillValue}#${i}`] = tr.outerHTML; } } @@ -348,7 +352,7 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { th.innerHTML = th.innerHTML.replace(arrowDown, ""); } - if (columnData[0] === undefined) { + if (column.toBeSorted[0] === undefined) { return; } @@ -360,7 +364,7 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } function sortColumn(sortDirection) { - columnData.sort(sortDirection, { + column.toBeSorted.sort(sortDirection, { numeric: !isAlphaSort, ignorePunctuation: !isPunctSort, }); @@ -387,10 +391,10 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } function updateTable(tableProperties) { - const { tableRows, columnData, isFileSize } = tableProperties; + const { tableRows, column, isFileSize } = tableProperties; for (let [i, tr] of tableRows.entries()) { if (isFileSize) { - tr.innerHTML = fileSizeColumnTextAndRow[columnData[i]]; + tr.innerHTML = fileSizeColumnTextAndRow[column.toBeSorted[i]]; let fileSizeInBytesHTML = tr .querySelectorAll("td") .item(columnIndex).innerHTML; @@ -398,8 +402,8 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { .querySelectorAll("td") .item(columnIndex).textContent; // Remove the unique identifyer for duplicate values(#number). - columnData[i] = columnData[i].replace(/#[0-9]*/, ""); - const fileSize = parseFloat(columnData[i]); + column.toBeSorted[i] = column.toBeSorted[i].replace(/#[0-9]*/, ""); + const fileSize = parseFloat(column.toBeSorted[i]); let prefixes = ["", "Ki", "Mi", "Gi", "Ti", "Pi"]; let replaced = false; for (let i = 0; i < prefixes.length; ++i) { @@ -423,13 +427,19 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { tr.querySelectorAll("td").item(columnIndex).innerHTML = fileSizeInBytesHTML; } else if (!isFileSize) { - tr.outerHTML = columnIndexAndTableRow[columnData[i]]; + tr.outerHTML = columnIndexAndTableRow[column.toBeSorted[i]]; } } } th.addEventListener("click", function () { - const [columnData, colSpanData, colSpanSum] = [[], {}, {}]; + timesClickedColumn += 1; + const column = { + // column used for sorting; better name? + toBeSorted: [], + span: {}, + spanSum: {}, + }; const visibleTableRows = Array.prototype.filter.call( tableBody.querySelectorAll("tr"), @@ -438,19 +448,21 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } ); + getColSpanData(sortableTable, column); + const isDataAttribute = th.classList.contains("data-sort"); if (isDataAttribute) { - sortDataAttributes(visibleTableRows, columnData); + sortDataAttributes(visibleTableRows, column); } const isFileSize = th.classList.contains("file-size-sort"); if (isFileSize) { - sortFileSize(visibleTableRows, columnData); + sortFileSize(visibleTableRows, column); } const isTimeSort = th.classList.contains("runtime-sort"); if (isTimeSort) { - sortByRuntime(visibleTableRows, columnData); + sortByRuntime(visibleTableRows, column); } const isSortDateDayMonthYear = th.classList.contains("dates-dmy-sort"); @@ -458,11 +470,11 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { const isSortDateYearMonthDay = th.classList.contains("dates-ymd-sort"); // pick mdy first to override the inferred default class which is dmy. if (isSortDateMonthDayYear) { - sortDates("mdy", visibleTableRows, columnData); + sortDates("mdy", visibleTableRows, column); } else if (isSortDateYearMonthDay) { - sortDates("ymd", visibleTableRows, columnData); + sortDates("ymd", visibleTableRows, column); } else if (isSortDateDayMonthYear) { - sortDates("dmy", visibleTableRows, columnData); + sortDates("dmy", visibleTableRows, column); } const isRememberSort = sortableTable.classList.contains("remember-sort"); @@ -470,20 +482,15 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { rememberSort(timesClickedColumn, columnIndexesClicked); } - timesClickedColumn += 1; - - getColSpanData(sortableTable, colSpanData, colSpanSum); const tableProperties = { tableRows: visibleTableRows, - columnData, + column, isFileSize, isSortDateDayMonthYear, isSortDateMonthDayYear, isSortDateYearMonthDay, isDataAttribute, isTimeSort, - colSpanData, - colSpanSum, }; getTableData(tableProperties); updateTable(tableProperties); diff --git a/browser-extensions/firefox/manifest.json b/browser-extensions/firefox/manifest.json index 93f9e9d..c9a8250 100644 --- a/browser-extensions/firefox/manifest.json +++ b/browser-extensions/firefox/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "author": "Lee Wannacott", "name": "table-sort-js", - "version": "1.15.1", + "version": "1.15.2", "description": "Makes tables sortable using table-sort-js: https://github.com/LeeWannacott/table-sort-js", "icons": { "48": "icons/t.png" }, "browser_action": { diff --git a/browser-extensions/firefox/table-sort-js.zip b/browser-extensions/firefox/table-sort-js.zip index f4060636081b61719df0f69dff3309ab0324e685..971b05135b1c0b7cc2d5b0560e501f3c3f4b7168 100644 GIT binary patch delta 4764 zcmV;N5@YR%Im9`zvj_-Fu(DS4<)8|ay9geCuJ>hRuJ>hRb$AN^0R-p+000E&0{{SR zP(5qIFc97SD}-i8CZUC5N|&td)Ix`1%vn}qrLtsn=XNmu@6|`zCXhu)@8jM(Ed^tI z1gj4Usr^zOwX?ityD}0m)8Kq~@@J*kJ6H?S5%EM?7*(VQI-@q|JZ(;xssA~AE4KH4 zVwd4wq4av9GxY+W3R$uvi~e|HGirNeS3_$y5KUND)lt(hcS5?c3XT2>RW~|l=`4nr zh4H(G7?*&G#AJ`0tx3~)_l?T8AkUqafTp4cm<_ej60M@TG?&*R(qwLYL=feW;3Q?K z&AZ1+A8A0&O5aa%P>JA=U`#uEgHOCRDSrj0%t7D3#faCCus47x;;xsu5onTY4QErV z#Sc(R0|XQR000O8PO!38>f-SX)eryxX+@I_3K)O1_hn=%t7T+$cnbgl1n2_*00ig* z007M#?Q+|=@xPt|=H2wDSf*@Wr!$q$$=LDbk~U5F+*GpQO702?8J}$-Z>j8=ozKi`~V3VRr#${D=&Ac$3hBGB5bSyK-<=@kL%t$V*De z4`F|ng;CD=;3bP_7SRd0d~r?0my(jF`EpgT+XW|nG$hA|$4BNYG9d8Z;5){jS2yG> zUFId@d9j+11?S6hG9KSDzNl`3C{M>QQ%xM3EM?1-EW_x1cuU)z0-wGZOICjeFS3${NirEcEAoufES`{W%BWyVPRb%W z^|oL%n9#lj?@I6SH)DzEG0BU;MShnhc^DJEU?rKegpx3eNf^f_!Co9ZC#$?F$n)#V zmt=4bQV`st#F$(JF}M-vE6`m*|5mYr`d$!>vplAMP4l=)Xt|O3ArYb}s)(~ZD<^-T z-!ot}O2V?#ne>n^@wG(uzKTi0-cuY*L->mz_zXW8ww8oDB5LX~utGS)AX&qqrUz zl21Tip}eIWWhl^;zI;dsn-eF2(^G!}QlJeOArXj!Ba-V-LJCS2^#GoKn@}7m&sPBX zDojBGVm03Iq()UxUKJUcYRG2t*_u#T))tzQ;4daM!2bsg5d#9qSkgLCfKi@QY4#$E z>BqAy7SG=bv42{(KxpSz?C`VY*7AcQzbmJQvwF7q3{*i2eojH5 z)VENMEZ8|KN-hWpRHhVJ|Uk#@qm0e zF_bWpTl<7~^{5P}s7ClcA%|o=sxhGgN>G4~%1}y+3x^L7wjUcv>H=l2V{4?>A`N z@&qSehI|o3lqIc`G@)Wlj%ycdx5EPWLIv4I5{yI+!jDf|VtUxQfhhOh3XoTStTp{%}Z&pzS`J5vQu(W7l%12wud%D84yuNt{hy(am`nH`8b(WRrh3b}o z*9M;gl35^?e4>BmsVqUR33jB67MODA$TxrmDK5j;NDs*#>={{=Bqj=CE*rP@6XUU) zVPR_f`#R`)(EWrAZa~nhYC_P!RDuMRMIRdcGSu1VSh~F=!;D&H*P2n9IJVj#PT6b4 zXl|9ZdFw*M#E)eyd+VOPsha>glL^fiFyoLJZ(jm(Vo!gmv#rg0sGf3JbD!50&}lp5 za>IpVI);U29HxtS^HYV| zSy4#y+io(lJPXAH(~PHL@cZS6h!5By!HRS0k$?Z=pRhIK-+y^CEBQk)h5yr+pDeoTFTVW5);|sHsdf)x+QB$w zvzdR)QF6dkU_-+8m9AKy)j8=VfueM(jPdLIvPw8xCX5zZ(hPgogdC03xA*w<@bFL@ zVK8(|9zBBbb~Hse`WtOPfgNjLw*u_9+JFN4S_9((?C4k14^X_TU}EVT+4()Hz0SWsY8EslFopGXFU}?TFv&5PTFLjie8<`bww~V zcZJl>JS0Ln4=^snqNLA~JmeA-s&XT3YODu9<@4hi812jajuubBXZ#LusvDVYcT*gg z=~MbWt7h?$hOz5iozB4~j4HA^@N9Lp^VM5fHE!}XUaT};9$-|ed4T!hCFFn*Eg^qw zTu~T~%bnW@tvV!!ujj%-Jx_l;9+T_W7q2Ho_WDUE``}H@Okx&e^FTJcTg!x{(2|$N zV^v^0v8#|yr_e4l3C`OP|I@HGp290L~7r3>#*Z6(^P`I$ZCiYS>%xG zL1H7ni-h5DMDS;3&qhtLthJApixYoK6^=+?Sle?Xs@(j@prqC00?bB3B+D@SmGD{( z6l&OI0(pb)Eim7~vxL_XC4Y6S9HjpF5^*@P9X7u!EIrbHj#OXHPCe*T$s z9>nR&v#qDaYxH9St)Uw9bYvU(sxqKMaFxb85tKdL4o#zr+h<{)Z3oyGlUuI4ad<^T zjJk2Sg5N11UThA%GC{c(HTQo*BkvSk{7qgSjfnhk++yhmf*2}1t%7g`_TWdw9{xGr*+`6hCxTFm+*s_m0 zrdtREQL^9R?FynvcI!*thQTt7uXtE+A9(Q&K~lXla7|r!1A2J>Sg(Jt<^MO-3pd7X zsT4OcXe>jC(K=Gk8sDCxCz(4%K~swBMV|d#@wL1{VhuK4l~BDz@);z{bJ34$HUly* z@|1`};%20vWu4EJ&9p$3yIpcpHLf!Yk#~2P7H%d&gA<$kL{|o>BrNNoTtlmFY9Djc zO*9UOo?J>2G6{M4xe0&inIej%yAnM8=pk+$JUApu4tso{Wu;uOIrn$2H0Abp1^XLz z%*@t&H$T~W(!TJ90i-S1Q1wL*l?h8Br;iOKt4(z(p3mx*sbs{Ipa5v@8JOGi=E))k z_f2q(3p;`Qw2N%r(`fAE4p&;<(8#ovUVS-0YujvV+Q^oTsq%jYuWpGm>1;;OeWEdB z!X8+VlMRr41QmjQ(Fh|ERwZoaO_48Y!I@qzNng~?9#m><8B6<}l}!&)AG-!;!QiQn zUDfILMYy`eUF}b>^SPdjhXB;~9LF0N{khR%Rvp9U_^4g(FKqeo_`1zIjf7PX78>Wo z&SKq9S`E4rTM>WNb=p05egt`oN4@W}-hdI7oci)a*t4=R;rmM0owMSeJ8<_*0L*Lz z`%?>wQKP=;5heu<;}uziS)5RU8z5vnc(t-Ni^=s}T2c(U>h#@ssR z?>Tr}B1nDKdtyyLOO}gp^Yjowtm#IVwH}8)*Jvz_KW*Vu)_$ihr_t z7xe~t)M}Etl zt-i5QMhUpSJf!vOgI5gk@;q4`?#iKm8BtuExzk8jik;YguS>{(2aBmYQm3f)n?d3-!Ptv0=%_hL>$A6z?OF2Qa;>JRT@rD^_wibT807+@zX1}HXPL8^vYimQJmxB-}iOx#NU3)w~-ZcO1ou5Cxa7*<=& z_=_oC@pv@0wkca4=KTg2%FZdkvVe`~qd07wdU(+GdxpO+#qaOL?`!e<4f8tculcj? zQCnuqL^yyy-zZ{rDR)Bl_nDo^i<1V>!5aZP;&`=@OUq`w$w z+@gbkSdUgE*burqZlkb&o{$^L@m-rNOlf;Trd`H_OlPeIu^BWWpVsEcRh8<4>l3r= z{J=`qG=l3})3Dcvt6*8=Jm;$=zLAyy69H6LNo!Htu2#29_`I52NX{b2gsn>mCm)B-Trng4Mdzn^=EVBS(zHWt%YpS+XHLjXPS=>Eqcb*=` ztoMa1?p*F+T=cv@OR7cH%aZXrl*Ldp+h(Y}4tIZ!oSm^vn$+Km>NHGTow04$(s&y- zqaC*en|jqsVS`|>#8<(APJMsK$8!S7Qc*yPBr+y(5x>BbK{^j%1Cvcoa<^d70@%R! z!vaGQu4OvR7pzts;g32Yp{tiRFuT{?gC39SABtXAc@KKL-LeaM+p6AbhqgQ2+HX#I z9d^HGqBFY^4>=p|;o2&3j15KAG?T6{thT_mtn8= z_F_ceTOQ)yr0Bd^BcMS!&DpGc6$SKDpAe|G%f*?)6~{70+*FD3bO|{!#k*OX;KVyR zc&GLQ^#+nISJz<0KQo};hv~zDyh9FA_wf{1H>bIHeOZ@jFJTHr7uCp(WI=*N#R4%S zfVx@!GZ_R4<>KANnvM<}59r4w%vP^pNmPj9KeN>u0|5w2u(DS4<)8|a;2SIguJ@B+ q921ky8ww6iu(DR_;_(dC5C8yaMUy!kCIYnglVKbo1`!(o0002HNG2Ts delta 4699 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 diff --git a/browser-extensions/firefox/table-sort.js b/browser-extensions/firefox/table-sort.js index 05ad269..385b443 100644 --- a/browser-extensions/firefox/table-sort.js +++ b/browser-extensions/firefox/table-sort.js @@ -136,16 +136,16 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { th.insertAdjacentText("beforeend", arrowUp); } - function sortDataAttributes(tableRows, columnData) { + function sortDataAttributes(tableRows, column) { for (let [i, tr] of tableRows.entries()) { - const dataAttributeTd = tr.querySelectorAll("td").item(columnIndex) - .dataset.sort; - columnData.push(`${dataAttributeTd}#${i}`); - columnIndexAndTableRow[columnData[i]] = tr.outerHTML; + let dataAttributeTd = getColumn(tr, column.spanSum, column.span).dataset + .sort; + column.toBeSorted.push(`${dataAttributeTd}#${i}`); + columnIndexAndTableRow[column.toBeSorted[i]] = tr.outerHTML; } } - function sortFileSize(tableRows, columnData) { + function sortFileSize(tableRows, column) { let unitToMultiplier = { b: 1, kb: 1000, @@ -167,25 +167,23 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { let number = parseFloat(match[1]); let unit = match[2].toLowerCase(); let multiplier = unitToMultiplier[unit]; - columnData.push(`${number * multiplier}#${i}`); + column.toBeSorted.push(`${number * multiplier}#${i}`); } else { - columnData.push(`${fillValue}#${i}`); + column.toBeSorted.push(`${fillValue}#${i}`); } } } - function sortByRuntime(tableRows, columnData) { + function sortByRuntime(tableRows, column) { try { for (let [i, tr] of tableRows.entries()) { const regexMinutesAndSeconds = /^(\d+h)?\s?(\d+m)?\s?(\d+s)?$/i; let columnOfTd = ""; // TODO: github actions runtime didn't like textContent, tests didn't like innerText? if (testingTableSortJS) { - columnOfTd = tr - .querySelectorAll("td") - .item(columnIndex).textContent; + columnOfTd = getColumn(tr, column.spanSum, column.span).textContent; } else { - columnOfTd = tr.querySelectorAll("td").item(columnIndex).innerText; + columnOfTd = getColumn(tr, column.spanSum, column.span).innerText; } let match = columnOfTd.match(regexMinutesAndSeconds); let [minutesInSeconds, hours, seconds] = [0, 0, 0]; @@ -205,15 +203,15 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } timeinSeconds = hours + minutesInSeconds + seconds; } - columnData.push(`${timeinSeconds}#${i}`); - columnIndexAndTableRow[columnData[i]] = tr.outerHTML; + column.toBeSorted.push(`${timeinSeconds}#${i}`); + columnIndexAndTableRow[column.toBeSorted[i]] = tr.outerHTML; } } catch (e) { console.log(e); } } - function sortDates(datesFormat, tableRows, columnData) { + function sortDates(datesFormat, tableRows, column) { try { for (let [i, tr] of tableRows.entries()) { let columnOfTd, datesRegex; @@ -222,7 +220,7 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } else if (datesFormat === "ymd") { datesRegex = /^(\d\d\d\d)[./-](\d\d?)[./-](\d\d?)/; } - columnOfTd = tr.querySelectorAll("td").item(columnIndex).textContent; + columnOfTd = getColumn(tr, column.spanSum, column.span).textContent; let match = columnOfTd.match(datesRegex); let [years, days, months] = [0, 0, 0]; let numberToSort = columnOfTd; @@ -243,8 +241,8 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { String(days).padStart(2, "0") ); } - columnData.push(`${numberToSort}#${i}`); - columnIndexAndTableRow[columnData[i]] = tr.outerHTML; + column.toBeSorted.push(`${numberToSort}#${i}`); + columnIndexAndTableRow[column.toBeSorted[i]] = tr.outerHTML; } } catch (e) { console.log(e); @@ -268,41 +266,47 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } } - function getColSpanData(sortableTable, colSpanData, colSpanSum) { + function getColSpanData(sortableTable, column) { sortableTable.querySelectorAll("th").forEach((th, index) => { - colSpanData[index] = th.colSpan; - if (index === 0) colSpanSum[index] = th.colSpan; - else colSpanSum[index] = colSpanSum[index - 1] + th.colSpan; + column.span[index] = th.colSpan; + if (index === 0) column.spanSum[index] = th.colSpan; + else column.spanSum[index] = column.spanSum[index - 1] + th.colSpan; }); } + function getColumn(tr, colSpanSum, colSpanData) { + return tr + .querySelectorAll("td") + .item( + colSpanData[columnIndex] === 1 + ? colSpanSum[columnIndex] - 1 + : colSpanSum[columnIndex] - colSpanData[columnIndex] + ); + } + function getTableData(tableProperties) { const { tableRows, - columnData, + column, isFileSize, isTimeSort, isSortDateDayMonthYear, isSortDateMonthDayYear, isSortDateYearMonthDay, isDataAttribute, - colSpanData, - colSpanSum, } = tableProperties; for (let [i, tr] of tableRows.entries()) { - let tdTextContent = tr - .querySelectorAll("td") - .item( - colSpanData[columnIndex] === 1 - ? colSpanSum[columnIndex] - 1 - : colSpanSum[columnIndex] - colSpanData[columnIndex] - ).textContent; + let tdTextContent = getColumn( + tr, + column.spanSum, + column.span + ).textContent; if (tdTextContent.length === 0) { tdTextContent = ""; } if (tdTextContent.trim() !== "") { if (isFileSize) { - fileSizeColumnTextAndRow[columnData[i]] = tr.outerHTML; + fileSizeColumnTextAndRow[column.toBeSorted[i]] = tr.outerHTML; } // These classes already handle pushing to column and setting the tr html. if ( @@ -313,12 +317,12 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { !isSortDateYearMonthDay && !isSortDateMonthDayYear ) { - columnData.push(`${tdTextContent}#${i}`); + column.toBeSorted.push(`${tdTextContent}#${i}`); columnIndexAndTableRow[`${tdTextContent}#${i}`] = tr.outerHTML; } } else { // Fill in blank table cells dict key with filler value. - columnData.push(`${fillValue}#${i}`); + column.toBeSorted.push(`${fillValue}#${i}`); columnIndexAndTableRow[`${fillValue}#${i}`] = tr.outerHTML; } } @@ -348,7 +352,7 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { th.innerHTML = th.innerHTML.replace(arrowDown, ""); } - if (columnData[0] === undefined) { + if (column.toBeSorted[0] === undefined) { return; } @@ -360,7 +364,7 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } function sortColumn(sortDirection) { - columnData.sort(sortDirection, { + column.toBeSorted.sort(sortDirection, { numeric: !isAlphaSort, ignorePunctuation: !isPunctSort, }); @@ -387,10 +391,10 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } function updateTable(tableProperties) { - const { tableRows, columnData, isFileSize } = tableProperties; + const { tableRows, column, isFileSize } = tableProperties; for (let [i, tr] of tableRows.entries()) { if (isFileSize) { - tr.innerHTML = fileSizeColumnTextAndRow[columnData[i]]; + tr.innerHTML = fileSizeColumnTextAndRow[column.toBeSorted[i]]; let fileSizeInBytesHTML = tr .querySelectorAll("td") .item(columnIndex).innerHTML; @@ -398,8 +402,8 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { .querySelectorAll("td") .item(columnIndex).textContent; // Remove the unique identifyer for duplicate values(#number). - columnData[i] = columnData[i].replace(/#[0-9]*/, ""); - const fileSize = parseFloat(columnData[i]); + column.toBeSorted[i] = column.toBeSorted[i].replace(/#[0-9]*/, ""); + const fileSize = parseFloat(column.toBeSorted[i]); let prefixes = ["", "Ki", "Mi", "Gi", "Ti", "Pi"]; let replaced = false; for (let i = 0; i < prefixes.length; ++i) { @@ -423,13 +427,19 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { tr.querySelectorAll("td").item(columnIndex).innerHTML = fileSizeInBytesHTML; } else if (!isFileSize) { - tr.outerHTML = columnIndexAndTableRow[columnData[i]]; + tr.outerHTML = columnIndexAndTableRow[column.toBeSorted[i]]; } } } th.addEventListener("click", function () { - const [columnData, colSpanData, colSpanSum] = [[], {}, {}]; + timesClickedColumn += 1; + const column = { + // column used for sorting; better name? + toBeSorted: [], + span: {}, + spanSum: {}, + }; const visibleTableRows = Array.prototype.filter.call( tableBody.querySelectorAll("tr"), @@ -438,19 +448,21 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } ); + getColSpanData(sortableTable, column); + const isDataAttribute = th.classList.contains("data-sort"); if (isDataAttribute) { - sortDataAttributes(visibleTableRows, columnData); + sortDataAttributes(visibleTableRows, column); } const isFileSize = th.classList.contains("file-size-sort"); if (isFileSize) { - sortFileSize(visibleTableRows, columnData); + sortFileSize(visibleTableRows, column); } const isTimeSort = th.classList.contains("runtime-sort"); if (isTimeSort) { - sortByRuntime(visibleTableRows, columnData); + sortByRuntime(visibleTableRows, column); } const isSortDateDayMonthYear = th.classList.contains("dates-dmy-sort"); @@ -458,11 +470,11 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { const isSortDateYearMonthDay = th.classList.contains("dates-ymd-sort"); // pick mdy first to override the inferred default class which is dmy. if (isSortDateMonthDayYear) { - sortDates("mdy", visibleTableRows, columnData); + sortDates("mdy", visibleTableRows, column); } else if (isSortDateYearMonthDay) { - sortDates("ymd", visibleTableRows, columnData); + sortDates("ymd", visibleTableRows, column); } else if (isSortDateDayMonthYear) { - sortDates("dmy", visibleTableRows, columnData); + sortDates("dmy", visibleTableRows, column); } const isRememberSort = sortableTable.classList.contains("remember-sort"); @@ -470,20 +482,15 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { rememberSort(timesClickedColumn, columnIndexesClicked); } - timesClickedColumn += 1; - - getColSpanData(sortableTable, colSpanData, colSpanSum); const tableProperties = { tableRows: visibleTableRows, - columnData, + column, isFileSize, isSortDateDayMonthYear, isSortDateMonthDayYear, isSortDateYearMonthDay, isDataAttribute, isTimeSort, - colSpanData, - colSpanSum, }; getTableData(tableProperties); updateTable(tableProperties); diff --git a/npm/package.json b/npm/package.json index bedd0de..766755c 100644 --- a/npm/package.json +++ b/npm/package.json @@ -1,6 +1,6 @@ { "name": "table-sort-js", - "version": "1.15.1", + "version": "1.15.2", "description": "A JavaScript client-side HTML table sorting library with no dependencies required.", "license": "MIT", "repository": "LeeWannacott/table-sort-js", diff --git a/npm/table-sort.js b/npm/table-sort.js index 05ad269..385b443 100644 --- a/npm/table-sort.js +++ b/npm/table-sort.js @@ -136,16 +136,16 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { th.insertAdjacentText("beforeend", arrowUp); } - function sortDataAttributes(tableRows, columnData) { + function sortDataAttributes(tableRows, column) { for (let [i, tr] of tableRows.entries()) { - const dataAttributeTd = tr.querySelectorAll("td").item(columnIndex) - .dataset.sort; - columnData.push(`${dataAttributeTd}#${i}`); - columnIndexAndTableRow[columnData[i]] = tr.outerHTML; + let dataAttributeTd = getColumn(tr, column.spanSum, column.span).dataset + .sort; + column.toBeSorted.push(`${dataAttributeTd}#${i}`); + columnIndexAndTableRow[column.toBeSorted[i]] = tr.outerHTML; } } - function sortFileSize(tableRows, columnData) { + function sortFileSize(tableRows, column) { let unitToMultiplier = { b: 1, kb: 1000, @@ -167,25 +167,23 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { let number = parseFloat(match[1]); let unit = match[2].toLowerCase(); let multiplier = unitToMultiplier[unit]; - columnData.push(`${number * multiplier}#${i}`); + column.toBeSorted.push(`${number * multiplier}#${i}`); } else { - columnData.push(`${fillValue}#${i}`); + column.toBeSorted.push(`${fillValue}#${i}`); } } } - function sortByRuntime(tableRows, columnData) { + function sortByRuntime(tableRows, column) { try { for (let [i, tr] of tableRows.entries()) { const regexMinutesAndSeconds = /^(\d+h)?\s?(\d+m)?\s?(\d+s)?$/i; let columnOfTd = ""; // TODO: github actions runtime didn't like textContent, tests didn't like innerText? if (testingTableSortJS) { - columnOfTd = tr - .querySelectorAll("td") - .item(columnIndex).textContent; + columnOfTd = getColumn(tr, column.spanSum, column.span).textContent; } else { - columnOfTd = tr.querySelectorAll("td").item(columnIndex).innerText; + columnOfTd = getColumn(tr, column.spanSum, column.span).innerText; } let match = columnOfTd.match(regexMinutesAndSeconds); let [minutesInSeconds, hours, seconds] = [0, 0, 0]; @@ -205,15 +203,15 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } timeinSeconds = hours + minutesInSeconds + seconds; } - columnData.push(`${timeinSeconds}#${i}`); - columnIndexAndTableRow[columnData[i]] = tr.outerHTML; + column.toBeSorted.push(`${timeinSeconds}#${i}`); + columnIndexAndTableRow[column.toBeSorted[i]] = tr.outerHTML; } } catch (e) { console.log(e); } } - function sortDates(datesFormat, tableRows, columnData) { + function sortDates(datesFormat, tableRows, column) { try { for (let [i, tr] of tableRows.entries()) { let columnOfTd, datesRegex; @@ -222,7 +220,7 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } else if (datesFormat === "ymd") { datesRegex = /^(\d\d\d\d)[./-](\d\d?)[./-](\d\d?)/; } - columnOfTd = tr.querySelectorAll("td").item(columnIndex).textContent; + columnOfTd = getColumn(tr, column.spanSum, column.span).textContent; let match = columnOfTd.match(datesRegex); let [years, days, months] = [0, 0, 0]; let numberToSort = columnOfTd; @@ -243,8 +241,8 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { String(days).padStart(2, "0") ); } - columnData.push(`${numberToSort}#${i}`); - columnIndexAndTableRow[columnData[i]] = tr.outerHTML; + column.toBeSorted.push(`${numberToSort}#${i}`); + columnIndexAndTableRow[column.toBeSorted[i]] = tr.outerHTML; } } catch (e) { console.log(e); @@ -268,41 +266,47 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } } - function getColSpanData(sortableTable, colSpanData, colSpanSum) { + function getColSpanData(sortableTable, column) { sortableTable.querySelectorAll("th").forEach((th, index) => { - colSpanData[index] = th.colSpan; - if (index === 0) colSpanSum[index] = th.colSpan; - else colSpanSum[index] = colSpanSum[index - 1] + th.colSpan; + column.span[index] = th.colSpan; + if (index === 0) column.spanSum[index] = th.colSpan; + else column.spanSum[index] = column.spanSum[index - 1] + th.colSpan; }); } + function getColumn(tr, colSpanSum, colSpanData) { + return tr + .querySelectorAll("td") + .item( + colSpanData[columnIndex] === 1 + ? colSpanSum[columnIndex] - 1 + : colSpanSum[columnIndex] - colSpanData[columnIndex] + ); + } + function getTableData(tableProperties) { const { tableRows, - columnData, + column, isFileSize, isTimeSort, isSortDateDayMonthYear, isSortDateMonthDayYear, isSortDateYearMonthDay, isDataAttribute, - colSpanData, - colSpanSum, } = tableProperties; for (let [i, tr] of tableRows.entries()) { - let tdTextContent = tr - .querySelectorAll("td") - .item( - colSpanData[columnIndex] === 1 - ? colSpanSum[columnIndex] - 1 - : colSpanSum[columnIndex] - colSpanData[columnIndex] - ).textContent; + let tdTextContent = getColumn( + tr, + column.spanSum, + column.span + ).textContent; if (tdTextContent.length === 0) { tdTextContent = ""; } if (tdTextContent.trim() !== "") { if (isFileSize) { - fileSizeColumnTextAndRow[columnData[i]] = tr.outerHTML; + fileSizeColumnTextAndRow[column.toBeSorted[i]] = tr.outerHTML; } // These classes already handle pushing to column and setting the tr html. if ( @@ -313,12 +317,12 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { !isSortDateYearMonthDay && !isSortDateMonthDayYear ) { - columnData.push(`${tdTextContent}#${i}`); + column.toBeSorted.push(`${tdTextContent}#${i}`); columnIndexAndTableRow[`${tdTextContent}#${i}`] = tr.outerHTML; } } else { // Fill in blank table cells dict key with filler value. - columnData.push(`${fillValue}#${i}`); + column.toBeSorted.push(`${fillValue}#${i}`); columnIndexAndTableRow[`${fillValue}#${i}`] = tr.outerHTML; } } @@ -348,7 +352,7 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { th.innerHTML = th.innerHTML.replace(arrowDown, ""); } - if (columnData[0] === undefined) { + if (column.toBeSorted[0] === undefined) { return; } @@ -360,7 +364,7 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } function sortColumn(sortDirection) { - columnData.sort(sortDirection, { + column.toBeSorted.sort(sortDirection, { numeric: !isAlphaSort, ignorePunctuation: !isPunctSort, }); @@ -387,10 +391,10 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } function updateTable(tableProperties) { - const { tableRows, columnData, isFileSize } = tableProperties; + const { tableRows, column, isFileSize } = tableProperties; for (let [i, tr] of tableRows.entries()) { if (isFileSize) { - tr.innerHTML = fileSizeColumnTextAndRow[columnData[i]]; + tr.innerHTML = fileSizeColumnTextAndRow[column.toBeSorted[i]]; let fileSizeInBytesHTML = tr .querySelectorAll("td") .item(columnIndex).innerHTML; @@ -398,8 +402,8 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { .querySelectorAll("td") .item(columnIndex).textContent; // Remove the unique identifyer for duplicate values(#number). - columnData[i] = columnData[i].replace(/#[0-9]*/, ""); - const fileSize = parseFloat(columnData[i]); + column.toBeSorted[i] = column.toBeSorted[i].replace(/#[0-9]*/, ""); + const fileSize = parseFloat(column.toBeSorted[i]); let prefixes = ["", "Ki", "Mi", "Gi", "Ti", "Pi"]; let replaced = false; for (let i = 0; i < prefixes.length; ++i) { @@ -423,13 +427,19 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { tr.querySelectorAll("td").item(columnIndex).innerHTML = fileSizeInBytesHTML; } else if (!isFileSize) { - tr.outerHTML = columnIndexAndTableRow[columnData[i]]; + tr.outerHTML = columnIndexAndTableRow[column.toBeSorted[i]]; } } } th.addEventListener("click", function () { - const [columnData, colSpanData, colSpanSum] = [[], {}, {}]; + timesClickedColumn += 1; + const column = { + // column used for sorting; better name? + toBeSorted: [], + span: {}, + spanSum: {}, + }; const visibleTableRows = Array.prototype.filter.call( tableBody.querySelectorAll("tr"), @@ -438,19 +448,21 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { } ); + getColSpanData(sortableTable, column); + const isDataAttribute = th.classList.contains("data-sort"); if (isDataAttribute) { - sortDataAttributes(visibleTableRows, columnData); + sortDataAttributes(visibleTableRows, column); } const isFileSize = th.classList.contains("file-size-sort"); if (isFileSize) { - sortFileSize(visibleTableRows, columnData); + sortFileSize(visibleTableRows, column); } const isTimeSort = th.classList.contains("runtime-sort"); if (isTimeSort) { - sortByRuntime(visibleTableRows, columnData); + sortByRuntime(visibleTableRows, column); } const isSortDateDayMonthYear = th.classList.contains("dates-dmy-sort"); @@ -458,11 +470,11 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { const isSortDateYearMonthDay = th.classList.contains("dates-ymd-sort"); // pick mdy first to override the inferred default class which is dmy. if (isSortDateMonthDayYear) { - sortDates("mdy", visibleTableRows, columnData); + sortDates("mdy", visibleTableRows, column); } else if (isSortDateYearMonthDay) { - sortDates("ymd", visibleTableRows, columnData); + sortDates("ymd", visibleTableRows, column); } else if (isSortDateDayMonthYear) { - sortDates("dmy", visibleTableRows, columnData); + sortDates("dmy", visibleTableRows, column); } const isRememberSort = sortableTable.classList.contains("remember-sort"); @@ -470,20 +482,15 @@ function tableSortJs(testingTableSortJS = false, domDocumentWindow = document) { rememberSort(timesClickedColumn, columnIndexesClicked); } - timesClickedColumn += 1; - - getColSpanData(sortableTable, colSpanData, colSpanSum); const tableProperties = { tableRows: visibleTableRows, - columnData, + column, isFileSize, isSortDateDayMonthYear, isSortDateMonthDayYear, isSortDateYearMonthDay, isDataAttribute, isTimeSort, - colSpanData, - colSpanSum, }; getTableData(tableProperties); updateTable(tableProperties); diff --git a/public/index.html b/public/index.html index 415789d..9f7789d 100644 --- a/public/index.html +++ b/public/index.html @@ -78,84 +78,90 @@

Manual testing of table sort js

8/6/1978 -

Testing table containing colspan and data-sort

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

Testing table containing colspan and data-sort

+
CategoryShowOverallOn Our DatesFirst Sold Out
Comedy Show 118/2572%3/475%1999-07-30
MusicShow 26/1060%3/475%1999-08-04
TheatreShow 37/1547%3/475%1999-07-19
ComedyShow 410/1567%2/367%1999-07-19
ComedyShow 59/1275%1/250%1999-07-29
ComedyShow 616/2467%2/450%1999-07-26
ComedyShow 716/2662%2/450%2022-07-31
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoryShowOverallOn Our DatesFirst Sold Out
ComedyShow 118/2572%3/475%1999-07-30
MusicShow 26/1060%3/475%1999-08-04
TheatreShow 37/1547%3/475%1999-07-19
ComedyShow 410/1567%2/367%1999-07-19
ComedyShow 59/1275%1/250%1999-07-29
ComedyShow 616/2467%2/450%1999-07-26
ComedyShow 716/2662%2/450%2022-07-31
-