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: `
| {{ item.lastname }} |
{{ item.firstname }}
|
{{ item.email }} |
`,
},
{
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: `
| {{ item.lastname }} |
{{ item.firstname }}
|
{{ item.email }} |
`,
}),
}
/**
* 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: `
|
{{ column.title }}
|
`,
},
{
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: `
|
{{ column.title }}
|
`,
}),
}
/**
* Slot `#header.` : personnalise l'en-tête d'une seule colonne.
*/
export const SlotHeader: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
Nom de famille
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
'headers': usersHeaders,
'items': manyUsers,
'suffix': 'slot-header-table',
'onUpdate:options': fn(),
},
render: args => ({
components: { SyTable },
setup() {
return { args }
},
template: `
Nom de famille
`,
}),
}
/**
* 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: `
Depuis le {{ item.period.start }} jusqu'au {{ item.period.end }}
`,
},
{
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: `
Depuis le {{ item.period.start }} jusqu'au {{ item.period.end }}
`,
}),
}