import type { Meta, StoryObj } from '@storybook/vue3-vite'
import { computed, defineComponent, ref } from 'vue'
import { fn } from 'storybook/test'
import { mdiChevronDown, mdiChevronUp } from '@mdi/js'
import type { VDataTable } from 'vuetify/components'
import SyTable from './SyTable.vue'
import { commonTableArgTypes } from '../common/storyArgTypes'
import { users, usersHeaders } from '../common/storyData'
const meta = {
title: 'Composants/Tableaux/SyTable/Lignes',
component: SyTable,
decorators: [
() => ({
template: '
',
}),
],
parameters: {
layout: 'fullscreen',
},
argTypes: {
...commonTableArgTypes,
items: {
description: 'Liste des éléments à afficher dans le tableau',
control: { type: 'object' },
table: {
category: 'props',
defaultValue: { summary: '[]' },
},
},
},
} satisfies Meta
export default meta
type Story = StoryObj
const clickableHeaders = [
{ title: 'Nom', key: 'lastname' },
{ title: 'Prénom', key: 'firstname' },
{ title: 'Email', key: 'email' },
]
const clickableItems = [
{ firstname: 'Virginie', lastname: 'Beauchesne', email: 'virginie.beauchesne@example.com' },
{ firstname: 'Étienne', lastname: 'Salois', email: 'etienne.salois@example.com' },
{ firstname: 'Alice', lastname: 'Dupont', email: 'alice.dupont@example.com' },
{ firstname: 'Marc', lastname: 'Lefevre', email: 'marc.lefevre@example.com' },
]
/**
* Lignes cliquables (`clickable-row`) : chaque clic sur une ligne émet
* l'évènement `@row-click` avec l'élément correspondant.
*/
export const ClickableRow: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
Ligne cliquée
Nom : {{ selectedRow.lastname }}
Prénom : {{ selectedRow.firstname }}
Email : {{ selectedRow.email }}
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
'headers': clickableHeaders,
'items': clickableItems,
'options': { itemsPerPage: 5, filters: [] },
'clickableRow': true,
'suffix': 'clickable-row-table',
'density': 'default',
'striped': false,
'onUpdate:options': fn(),
'onRow-click': fn(),
},
render: args => ({
components: {
ClickableRowTableCanvas: defineComponent({
components: { SyTable },
emits: ['row-click'],
setup() {
const boundArgs = computed(() => {
return Object.fromEntries(Object.entries(args).filter(([key]) => key !== 'onRow-click'))
})
return { args, boundArgs }
},
template: `
`,
}),
},
setup() {
const selectedRow = ref | null>(null)
const handleRowClick = (item: Record) => {
selectedRow.value = item
args['onRow-click']?.(item)
}
return { selectedRow, handleRowClick }
},
template: `
Ligne cliquée
Nom : {{ selectedRow.lastname }}
Prénom : {{ selectedRow.firstname }}
Email : {{ selectedRow.email }}
`,
}),
}
/**
* Lignes dépliables (`show-expand`) : le slot `#item.data-table-expand`
* personnalise le déclencheur, et `#expanded-row` le contenu déplié.
*/
export const ExpandableRows: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
|
Informations complémentaires :
Plus de détails pour {{ item.firstname }} {{ item.lastname }}.
|
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
'headers': usersHeaders,
'items': users,
'options': { itemsPerPage: 4 },
'caption': '',
'showExpand': true,
'suffix': 'expandable-table',
'density': 'default',
'striped': false,
'onUpdate:options': fn(),
},
render: args => ({
components: { SyTable },
setup() {
return { args, mdiChevronDown, mdiChevronUp }
},
template: `
|
Informations complémentaires :
Plus de détails pour {{ item.firstname }} {{ item.lastname }}.
|
`,
}),
}