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 type { DataTableHeaders } from '../common/types'
import { serverUsers, wideHeaders, wideServerUsers } from '../common/storyData'
import { useServerTableDemo } from '../common/serverStoryHelpers'
const meta = {
title: 'Composants/Tableaux/SyServerTable/Colonnes',
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 alignmentHeaders: DataTableHeaders[] = [
{ title: 'ID', key: 'id', align: 'center' },
{ title: 'Nom', key: 'lastname', align: 'start' },
{ title: 'Date de naissance', key: 'birthdate', align: 'center' },
{ title: 'NIR', key: 'nir', align: 'end' },
]
const alignmentData = [
{ id: '1', lastname: 'Lefebvre', birthdate: '18/02/1989', nir: '1 89 02 75 120 005 79' },
{ id: '2', lastname: 'Richard', birthdate: '22/05/1991', nir: '2 91 05 75 120 005 76' },
{ id: '3', lastname: 'Fournier', birthdate: '11/11/2000', nir: '2 00 11 42 120 008 87' },
]
/**
* Alignement des colonnes côté serveur (`align`) : chaque en-tête aligne son
* contenu `start`, `center` ou `end`.
*/
export const DataAlignment: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
options: {
itemsPerPage: 5,
sortBy: [{ key: 'lastname', order: 'asc' }],
page: 1,
},
headers: alignmentHeaders,
caption: '',
serverItemsLength: 3,
suffix: 'server-data-alignment',
density: 'default',
striped: false,
...commonTableEventArgs(),
},
render: args => ({
components: { SyServerTable },
setup() {
const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, alignmentData)
return { args, items, totalItems, state, options, fetchData, StateEnum }
},
template: `
`,
}),
}
/**
* Colonnes redimensionnables côté serveur (`resizable-columns`) : une poignée sur
* le bord des en-têtes permet d'ajuster la largeur des colonnes.
*/
export const ResizableColumns: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
options: {
itemsPerPage: 5,
sortBy: [{ key: 'lastname', order: 'asc' }],
page: 1,
},
headers: serverHeaders,
caption: '',
serverItemsLength: 15,
suffix: 'server-resizable-columns',
density: 'default',
striped: false,
resizableColumns: true,
...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: `
`,
}),
}
/**
* Colonnes épinglées côté serveur (`pinned-columns`) et sélection collante
* (`sticky-select`) : certaines colonnes restent visibles lors du défilement
* horizontal, à travers la pagination serveur.
*/
export const PinnedColumns: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
options: { itemsPerPage: 5, page: 1 },
headers: wideHeaders,
serverItemsLength: 30,
suffix: 'server-pinned-columns',
showSelect: true,
stickySelect: true,
pinnedColumns: [
{ key: 'actions', side: 'right' },
],
...commonTableEventArgs(),
},
render: args => ({
components: { SyServerTable },
setup() {
const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, wideServerUsers)
return { args, items, totalItems, state, options, fetchData, StateEnum }
},
template: `
`,
}),
}
/**
* Contrôles de colonnes côté serveur (`enable-column-controls`) : réordonner et
* afficher/masquer les colonnes.
*/
export const ColumnControls: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
options: {
itemsPerPage: 5,
sortBy: [{ key: 'lastname', order: 'asc' }],
page: 1,
},
headers: serverHeaders,
caption: '',
serverItemsLength: 15,
suffix: 'server-control-columns',
density: 'default',
striped: false,
enableColumnControls: true,
...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: `
`,
}),
}