import type { Meta, StoryObj } from '@storybook/vue3-vite' import { fn } from 'storybook/test' import type { VDataTable } from 'vuetify/components' import SyTable from './SyTable.vue' import { commonTableArgTypes } from '../common/storyArgTypes' import { manyUsers, users, usersHeaders } from '../common/storyData' const meta = { title: 'Composants/Tableaux/SyTable/Slots', 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 // Jeu spécifique à l'affichage complexe : chaque ligne porte une période imbriquée. const projectHeaders = [ { title: 'Titre', key: 'title' }, { title: 'Période', key: 'period' }, ] const projects = [ { title: 'Projet Alpha', period: { start: '01/01/2023', end: '30/06/2023' } }, { title: 'Projet Beta', period: { start: '15/02/2023', end: '15/08/2023' } }, { title: 'Projet Gamma', period: { start: '01/03/2023', end: '31/12/2023' } }, ] /** * Slot `#item` : remplace entièrement le rendu d'une ligne (ici, prénom en lien). */ export const SlotItem: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { 'headers': usersHeaders, 'items': users, 'options': { itemsPerPage: 4 }, 'caption': '', 'suffix': 'slot-item-table', 'density': 'default', 'striped': false, 'onUpdate:options': fn(), }, render: args => ({ components: { SyTable }, setup() { return { args } }, template: ` `, }), } /** * Slot `#headers` : personnalise entièrement la ligne d'en-tête du tableau. */ export const SlotHeaders: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { 'headers': usersHeaders, 'items': users, 'options': { itemsPerPage: 4 }, 'caption': '', 'suffix': 'slot-headers-table', 'density': 'default', 'striped': false, 'onUpdate:options': fn(), }, render: args => ({ components: { SyTable }, setup() { return { args } }, template: ` `, }), } /** * Slot `#header.` : personnalise l'en-tête d'une seule colonne. */ export const SlotHeader: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { 'headers': usersHeaders, 'items': manyUsers, 'suffix': 'slot-header-table', 'onUpdate:options': fn(), }, render: args => ({ components: { SyTable }, setup() { return { args } }, template: ` `, }), } /** * Slot `#item.` : personnalise l'affichage d'une cellule (ici, une période * imbriquée reformatée en texte). */ export const ComplexItemsDisplay: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { headers: projectHeaders, items: projects, caption: 'Périodes des projets en cours', suffix: 'items-display-cell-table', }, render: args => ({ components: { SyTable }, setup() { return { args } }, template: ` `, }), }