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: ` `, }, { 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: ` `, }, { 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: ` `, }), }