import type { Meta, StoryObj } from '@storybook/vue3-vite'
import type { VDataTable } from 'vuetify/components'
import SyServerTable from './SyServerTable.vue'
import { commonTableArgTypes, commonTableEventArgs } from '../common/storyArgTypes'
import { serverUsers } from '../common/storyData'
import { useServerTableDemo } from '../common/serverStoryHelpers'
const meta = {
title: 'Composants/Tableaux/SyServerTable/Slots',
component: SyServerTable,
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: 'undefined' },
},
},
serverItemsLength: {
description: 'Nombre total d\'éléments à afficher',
control: { type: 'number' },
},
},
} satisfies Meta
export default meta
type Story = StoryObj
const serverHeaders = [
{ title: 'Nom', key: 'lastname' },
{ title: 'Prénom', key: 'firstname' },
{ title: 'Email', key: 'email' },
]
const defaultSortOptions = {
itemsPerPage: 5,
sortBy: [{ key: 'lastname', order: 'asc' as const }],
page: 1,
}
// Jeu spécifique à l'affichage complexe : période imbriquée + statut.
const projectHeaders = [
{ title: 'Titre', key: 'title' },
{ title: 'Période', key: 'period' },
{ title: 'Statut', key: 'status' },
]
const projectItems = [
{ title: 'Projet Alpha', period: { start: '2023-01-01', end: '2023-06-30' }, status: 'En cours' },
{ title: 'Projet Beta', period: { start: '2022-05-15', end: '2022-12-15' }, status: 'Terminé' },
{ title: 'Projet Gamma', period: { start: '2023-03-01', end: '2023-09-30' }, status: 'En cours' },
{ title: 'Projet Delta', period: { start: '2021-11-01', end: '2022-04-30' }, status: 'Terminé' },
{ title: 'Projet Epsilon', period: { start: '2023-07-01', end: '2023-12-31' }, status: 'À venir' },
{ title: 'Projet Zeta', period: { start: '2022-02-01', end: '2022-08-31' }, status: 'Terminé' },
]
const serverScript = `
`
/**
* Slot `#item` côté serveur : remplace entièrement le rendu d'une ligne.
*/
export const SlotItem: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
| {{ item.lastname }} |
{{ item.firstname }}
|
{{ item.email }} |
`,
},
{
name: 'Script',
code: serverScript,
},
],
},
args: {
options: { ...defaultSortOptions },
headers: serverHeaders,
caption: '',
serverItemsLength: 15,
suffix: 'server-slot-item',
density: 'default',
striped: false,
...commonTableEventArgs(),
},
render: args => ({
components: { SyServerTable },
setup() {
const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, serverUsers)
return { args, items, totalItems, state, options, fetchData, StateEnum }
},
template: `
| {{ item.lastname }} |
{{ item.firstname }}
|
{{ item.email }} |
`,
}),
}
/**
* Slot `#headers` côté serveur : personnalise entièrement la ligne d'en-tête.
*/
export const SlotHeaders: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
|
{{ column.title }}
|
`,
},
{
name: 'Script',
code: serverScript,
},
],
},
args: {
options: { ...defaultSortOptions },
headers: serverHeaders,
caption: '',
serverItemsLength: 15,
suffix: 'server-slot-headers',
density: 'default',
striped: false,
...commonTableEventArgs(),
},
render: args => ({
components: { SyServerTable },
setup() {
const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, serverUsers)
return { args, items, totalItems, state, options, fetchData, StateEnum }
},
template: `
|
{{ column.title }}
|
`,
}),
}
/**
* Slot `#header.` côté serveur : 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: serverScript,
},
],
},
args: {
options: { ...defaultSortOptions },
headers: serverHeaders,
caption: '',
serverItemsLength: 15,
suffix: 'server-slot-header',
density: 'default',
striped: false,
...commonTableEventArgs(),
},
render: args => ({
components: { SyServerTable },
setup() {
const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, serverUsers)
return { args, items, totalItems, state, options, fetchData, StateEnum }
},
template: `
Nom de famille
`,
}),
}
/**
* Slot `#item.` côté serveur : 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: {
options: {
itemsPerPage: 5,
sortBy: [{ key: 'title', order: 'asc' }],
page: 1,
},
headers: projectHeaders,
caption: '',
serverItemsLength: 6,
suffix: 'server-complex-item',
density: 'default',
striped: false,
...commonTableEventArgs(),
},
render: args => ({
components: { SyServerTable },
setup() {
const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, projectItems)
return { args, items, totalItems, state, options, fetchData, StateEnum }
},
template: `
Depuis le {{ item.period.start }} jusqu'au {{ item.period.end }}
`,
}),
}