mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-27 07:16:19 +09:00
81 lines
2.0 KiB
Vue
81 lines
2.0 KiB
Vue
<script setup lang="ts" generic="TData, TValue">
|
|
import type { ColumnDef } from '@tanstack/vue-table'
|
|
import {
|
|
FlexRender,
|
|
getCoreRowModel,
|
|
useVueTable,
|
|
} from '@tanstack/vue-table'
|
|
import {
|
|
Table,
|
|
TableBody,
|
|
TableCell,
|
|
TableHead,
|
|
TableHeader,
|
|
TableRow,
|
|
} from '@memoh/ui'
|
|
|
|
const props = defineProps<{
|
|
columns: ColumnDef<TData, TValue>[]
|
|
data: TData[]
|
|
}>()
|
|
|
|
const table = useVueTable({
|
|
get data() { return props.data },
|
|
get columns() { return props.columns },
|
|
getCoreRowModel: getCoreRowModel(),
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div class="border rounded-md">
|
|
<Table>
|
|
<TableHeader>
|
|
<TableRow
|
|
v-for="headerGroup in table.getHeaderGroups()"
|
|
:key="headerGroup.id"
|
|
>
|
|
<TableHead
|
|
v-for="header in headerGroup.headers"
|
|
:key="header.id"
|
|
>
|
|
<FlexRender
|
|
v-if="!header.isPlaceholder"
|
|
:render="header.column.columnDef.header"
|
|
:props="header.getContext()"
|
|
/>
|
|
</TableHead>
|
|
</TableRow>
|
|
</TableHeader>
|
|
<TableBody class="[&_td]:py-4!">
|
|
<template v-if="table.getRowModel().rows?.length">
|
|
<TableRow
|
|
v-for="row in table.getRowModel().rows"
|
|
:key="row.id"
|
|
:data-state="row.getIsSelected() ? 'selected' : undefined"
|
|
>
|
|
<TableCell
|
|
v-for="cell in row.getVisibleCells()"
|
|
:key="cell.id"
|
|
>
|
|
<FlexRender
|
|
:render="cell.column.columnDef.cell"
|
|
:props="cell.getContext()"
|
|
/>
|
|
</TableCell>
|
|
</TableRow>
|
|
</template>
|
|
<template v-else>
|
|
<TableRow>
|
|
<TableCell
|
|
:colspan="columns.length"
|
|
class="h-24 text-center"
|
|
>
|
|
No results.
|
|
</TableCell>
|
|
</TableRow>
|
|
</template>
|
|
</TableBody>
|
|
</Table>
|
|
</div>
|
|
</template>
|
|
|