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