-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathEventsDataTable.vue
More file actions
79 lines (75 loc) · 2.52 KB
/
EventsDataTable.vue
File metadata and controls
79 lines (75 loc) · 2.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
<script setup lang="ts" generic="TData, TValue">
import type { ColumnDef } from '@tanstack/vue-table'
import DataTableInputFilter from '@/shared/components/data/DataTableInputFilter.vue'
import { Icon } from '@iconify/vue'
import { Button } from '@/shared/ui/button'
import DataTablePagination from '@/shared/components/data/DataTablePagination.vue'
import DataTable from '@/shared/components/data/DataTable.vue'
import DataTableLayout from '@/shared/components/data/DataTableLayout.vue'
import { useDataTableWithUrlQuery } from '@/shared/composables/useDataTableWithUrlQuery'
import DataTableSkeleton from '@/shared/components/skeletons/DataTableSkeleton.vue'
import DataTableSingleSelectFilter from '@/shared/components/data/DataTableSingleSelectFilter.vue'
import type { Tag } from '@/modules/tags/types'
import type { UrlFiltersReturn, EventsUrlFilters } from '@/shared/types/urlFilters'
const props = defineProps<{
columns: ColumnDef<TData, TValue>[]
data: TData[]
tags: Tag[]
isLoading: boolean
isLoadingTags: boolean
urlFilters: UrlFiltersReturn<EventsUrlFilters>
}>()
const { table } = useDataTableWithUrlQuery(
{
data: () => props.data,
columns: () => props.columns,
defaultSorting: [{ id: 'id', desc: true }],
},
props.urlFilters,
'events'
)
</script>
<template>
<DataTableLayout>
<template #filters>
<!-- Name Filter -->
<DataTableInputFilter
class="max-w-3xs"
:column="table.getColumn('name')!"
placeholder="Filter by name..."
/>
<!-- Tag Filter -->
<DataTableSingleSelectFilter
:column="table.getColumn('tags')"
title="Tag"
placeholder="Search tags..."
icon="ph:tag"
:options="tags.map(tag => tag.id)"
:disabled="isLoadingTags"
/>
</template>
<template #buttons>
<Button as-child>
<RouterLink to="/events/new">
<Icon icon="radix-icons:plus" class="mr-2 h-4 w-4" />
Add Event
</RouterLink>
</Button>
</template>
<template #table>
<DataTableSkeleton v-if="isLoading" :columns="table.getVisibleFlatColumns().length" />
<DataTable v-else :table="table">
<template #row-placeholder>
<div class="relative">
<div class="inline-flex size-4 h-8 w-8 items-center justify-center gap-2 p-0 px-4">
</div>
</div>
</template>
</DataTable>
</template>
<template #footer>
<DataTablePagination :table="table" />
</template>
</DataTableLayout>
</template>