1
1
---
2
+ /* eslint-disable max-lines */
2
3
import type { DataTableProps , HeadingObject } from ' ./datatable'
3
4
4
5
import Button from ' ../Button/Button.astro'
@@ -8,6 +9,7 @@ import Pagination from '../Pagination/Pagination.astro'
8
9
import Select from ' ../Select/Select.astro'
9
10
10
11
import checkIcon from ' ../../icons/check.svg?raw'
12
+ import orderIcon from ' ../../icons/order.svg?raw'
11
13
import searchIcon from ' ../../icons/search.svg?raw'
12
14
13
15
import styles from ' ./datatable.module.scss'
@@ -117,8 +119,9 @@ const hasPagination = data?.length && itemsPerPage
117
119
{ headings .map (heading => (
118
120
<th data-name = { getColumnName (heading )} >
119
121
<ConditionalWrapper condition = { !! (heading as HeadingObject ).sortable } >
120
- <Button theme = " flat" slot = " wrapper" >
122
+ <Button theme = " flat" slot = " wrapper" data-id = " w-data-table-sort " >
121
123
children
124
+ <Fragment set :html = { orderIcon } />
122
125
</Button >
123
126
{ (heading as HeadingObject ).name || heading }
124
127
</ConditionalWrapper >
@@ -170,6 +173,7 @@ const hasPagination = data?.length && itemsPerPage
170
173
import { dispatch, listen } from '../../utils/event'
171
174
172
175
const filters = document.querySelectorAll('[data-id="w-data-table-filter"]')
176
+ const sorts = document.querySelectorAll('[data-id="w-data-table-sort"]')
173
177
174
178
Array.from(filters).forEach(filter => {
175
179
filter.addEventListener('input', debounce((event: Event) => {
@@ -233,6 +237,53 @@ const hasPagination = data?.length && itemsPerPage
233
237
}, 400))
234
238
})
235
239
240
+ Array.from(sorts).forEach(sort => {
241
+ let sortOrder = 1
242
+
243
+ sort.addEventListener('click', event => {
244
+ const target = event.target as HTMLButtonElement
245
+ const sortBy = target.parentElement?.dataset.name
246
+ const table = target.closest('section')?.querySelector('table')
247
+ const tableBody = table?.querySelector('tbody')
248
+ const sortedTableRows = Array.from(
249
+ table?.querySelectorAll('tbody tr') as NodeListOf<HTMLTableRowElement>
250
+ ).sort((a, b) => {
251
+ let aValue: string | number = (a.querySelector(`[data-name=${sortBy}]`) as HTMLElement)
252
+ ?.innerText.replace(/\s/g, '')
253
+ let bValue: string | number = (b.querySelector(`[data-name=${sortBy}]`) as HTMLElement)
254
+ ?.innerText.replace(/\s/g, '')
255
+
256
+ if (!isNaN(aValue as any)) {
257
+ aValue = Number(aValue)
258
+ }
259
+
260
+ if (!isNaN(bValue as any)) {
261
+ bValue = Number(bValue)
262
+ }
263
+
264
+ return aValue > bValue
265
+ ? sortOrder * -1
266
+ : sortOrder
267
+ }).map((row, index) => {
268
+ if (table?.dataset.page) {
269
+ row.dataset.page = `${Math.ceil((index + 1) / Number(table.dataset.itemsPerPage))}`
270
+
271
+ if (row.dataset.page !== table.dataset.page) {
272
+ row.dataset.hidden = 'true'
273
+ } else {
274
+ row.removeAttribute('data-hidden')
275
+ }
276
+ }
277
+
278
+ return row
279
+ })
280
+
281
+ tableBody?.replaceChildren(...sortedTableRows)
282
+
283
+ sortOrder = sortOrder === 1 ? -1 : 1
284
+ })
285
+ })
286
+
236
287
listen('selectOnChange', event => {
237
288
const eventName = event.name.toLowerCase().replace(/\s/g, '')
238
289
const table = event.selectElement
0 commit comments