This comprehensive demo showcases many NuGrid features working together in a real-world scenario.
This demo includes:
<script setup lang="ts">
import type { NuGridColumn, NuGridActionMenuItem, NuGridRow } from '#nu-grid/types'
const gridRef = useTemplateRef('grid')
const columns: NuGridColumn<User>[] = [
{ accessorKey: 'id', header: 'ID', enableEditing: false },
{ accessorKey: 'name', header: 'Name' },
{ accessorKey: 'email', header: 'Email' },
{ accessorKey: 'status', header: 'Status' },
]
// Row selection state
const rowSelection = ref({})
// Column filters
const columnFilters = ref([{ id: 'email', value: '' }])
// Column pinning
const columnPinning = ref({
left: ['__selection', 'id'],
right: ['__actions'],
})
// Action menu items
function getRowActions(row: NuGridRow<User>): NuGridActionMenuItem[] {
return [
{ label: 'Edit', icon: 'i-lucide-pencil' },
{ label: 'Delete', icon: 'i-lucide-trash', color: 'error' },
]
}
</script>
<template>
<NuGrid
ref="grid"
v-model:row-selection="rowSelection"
v-model:column-filters="columnFilters"
v-model:column-pinning="columnPinning"
:data="data"
:columns="columns"
:selection="{ mode: 'multi' }"
:actions="{ getActions: getRowActions }"
:editing="{ enabled: true, startClicks: 'double' }"
:focus="{ mode: 'cell' }"
virtualization
/>
</template>
Filter data by setting the column filter value:
<script setup lang="ts">
const gridRef = useTemplateRef('grid')
const emailFilter = ref('')
// Apply filter to the email column
watch(emailFilter, (value) => {
gridRef.value?.tableApi?.getColumn('email')?.setFilterValue(value)
})
</script>
<template>
<UInput v-model="emailFilter" placeholder="Filter emails..." />
<NuGrid ref="grid" :data="data" :columns="columns" />
</template>
Pin columns to the left or right edges:
<script setup lang="ts">
const columnPinning = ref({
left: ['id'], // Pin ID column to left
right: ['actions'], // Pin actions to right
})
</script>
<template>
<NuGrid
v-model:column-pinning="columnPinning"
:data="data"
:columns="columns"
/>
</template>
Add row action menus with custom items:
<script setup lang="ts">
import type { NuGridActionMenuItem, NuGridRow } from '#nu-grid/types'
function getRowActions(row: NuGridRow<User>): NuGridActionMenuItem[] {
return [
{ type: 'label', label: 'Actions' },
{ label: 'View Details', icon: 'i-lucide-eye' },
{ type: 'separator' },
{
label: 'Delete',
icon: 'i-lucide-trash',
color: 'error',
onSelect: () => deleteUser(row.original.id)
},
]
}
</script>
<template>
<NuGrid
:data="data"
:columns="columns"
:actions="{ getActions: getRowActions }"
/>
</template>