feat(list): add table sorting
This commit is contained in:
parent
461bb83757
commit
df756a620e
1 changed files with 47 additions and 9 deletions
|
@ -3,7 +3,9 @@ import {
|
||||||
FlexRender,
|
FlexRender,
|
||||||
getCoreRowModel,
|
getCoreRowModel,
|
||||||
useVueTable,
|
useVueTable,
|
||||||
|
type SortingState,
|
||||||
createColumnHelper,
|
createColumnHelper,
|
||||||
|
getSortedRowModel,
|
||||||
} from "@tanstack/vue-table"
|
} from "@tanstack/vue-table"
|
||||||
|
|
||||||
useHead({
|
useHead({
|
||||||
|
@ -15,16 +17,27 @@ type ContentCreator = {
|
||||||
name: string
|
name: string
|
||||||
subscribers: number
|
subscribers: number
|
||||||
}
|
}
|
||||||
const _contentCreators: ContentCreator[] = [
|
const contentCreators = ref([
|
||||||
{
|
{
|
||||||
channelId: "asdf",
|
channelId: "asdf",
|
||||||
name: "Channel A",
|
name: "Channel A",
|
||||||
subscribers: 9999,
|
subscribers: 9999,
|
||||||
},
|
},
|
||||||
]
|
{
|
||||||
|
channelId: "xyzw",
|
||||||
|
name: "Channel B",
|
||||||
|
subscribers: 1111,
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
function sortIcon(isSorted: false | "asc" | "desc") {
|
||||||
|
if (isSorted === "asc") return "fa6-solid:sort-up"
|
||||||
|
if (isSorted === "desc") return "fa6-solid:sort-down"
|
||||||
|
return "fa6-solid:sort"
|
||||||
|
}
|
||||||
|
|
||||||
|
const sorting = ref<SortingState>([])
|
||||||
const columnHelper = createColumnHelper<ContentCreator>()
|
const columnHelper = createColumnHelper<ContentCreator>()
|
||||||
const contentCreators = ref(_contentCreators)
|
|
||||||
const t = useVueTable({
|
const t = useVueTable({
|
||||||
get data() {
|
get data() {
|
||||||
return contentCreators.value
|
return contentCreators.value
|
||||||
|
@ -38,7 +51,19 @@ const t = useVueTable({
|
||||||
header: "Subscribers",
|
header: "Subscribers",
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
state: {
|
||||||
|
get sorting() {
|
||||||
|
return sorting.value
|
||||||
|
},
|
||||||
|
},
|
||||||
|
onSortingChange: (updaterOrValue) => {
|
||||||
|
sorting.value =
|
||||||
|
typeof updaterOrValue === "function"
|
||||||
|
? updaterOrValue(sorting.value)
|
||||||
|
: updaterOrValue
|
||||||
|
},
|
||||||
getCoreRowModel: getCoreRowModel(),
|
getCoreRowModel: getCoreRowModel(),
|
||||||
|
getSortedRowModel: getSortedRowModel(),
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
@ -55,16 +80,29 @@ const t = useVueTable({
|
||||||
:key="headerGroup.id"
|
:key="headerGroup.id"
|
||||||
>
|
>
|
||||||
<th
|
<th
|
||||||
class="border p-1"
|
class="cursor-pointer border p-1"
|
||||||
v-for="header in headerGroup.headers"
|
v-for="header in headerGroup.headers"
|
||||||
:key="header.id"
|
:key="header.id"
|
||||||
:colSpan="header.colSpan"
|
:colSpan="header.colSpan"
|
||||||
|
@click="
|
||||||
|
header.column.getToggleSortingHandler()?.(
|
||||||
|
$event,
|
||||||
|
)
|
||||||
|
"
|
||||||
>
|
>
|
||||||
<FlexRender
|
<div class="flex items-center justify-center gap-1">
|
||||||
v-if="!header.isPlaceholder"
|
<FlexRender
|
||||||
:render="header.column.columnDef.header"
|
v-if="!header.isPlaceholder"
|
||||||
:props="header.getContext()"
|
:render="header.column.columnDef.header"
|
||||||
/>
|
:props="header.getContext()"
|
||||||
|
/>
|
||||||
|
<Icon
|
||||||
|
:name="
|
||||||
|
sortIcon(header.column.getIsSorted())
|
||||||
|
"
|
||||||
|
size="24"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</th>
|
</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue