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 type { DataTableHeaders } from '../common/types' import { users, usersHeaders, wideHeaders, wideUsers } from '../common/storyData' const meta = { title: 'Composants/Tableaux/SyTable/Colonnes', 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'alignement : colonnes alignées au centre / début / fin. const alignmentHeaders: DataTableHeaders[] = [ { title: 'ID', key: 'id', align: 'center', sortable: false }, { title: 'Nom', key: 'lastname', align: 'start', sortable: false }, { title: 'Date de naissance', key: 'birthdate', align: 'center', sortable: false }, { title: 'NIR', key: 'nir', align: 'end', sortable: false }, ] const alignmentItems = [ { 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 (`align`) : chaque en-tête peut aligner son contenu * `start`, `center` ou `end`. */ export const DataAlignment: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { 'headers': alignmentHeaders, 'items': alignmentItems, 'options': { itemsPerPage: 4 }, 'suffix': 'alignment-table', 'onUpdate:options': fn(), }, render: args => ({ components: { SyTable }, setup() { return { args } }, template: ` `, }), } /** * Colonnes redimensionnables (`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: { 'resizableColumns': true, 'headers': usersHeaders, 'items': users, 'options': { itemsPerPage: 4 }, 'suffix': 'resizable-columns', 'onUpdate:options': fn(), }, render: args => ({ components: { SyTable }, setup() { return { args } }, template: ` `, }), } /** * Colonnes épinglées (`pinned-columns`) et sélection collante (`sticky-select`) : * certaines colonnes restent visibles lors du défilement horizontal. */ export const PinnedColumns: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { 'headers': wideHeaders, 'items': wideUsers, 'options': { itemsPerPage: 5 }, 'suffix': 'pinned-columns-table', 'showSelect': true, 'stickySelect': true, 'pinnedColumns': [ { key: 'actions', side: 'right' }, ], 'onUpdate:options': fn(), }, render: args => ({ components: { SyTable }, setup() { return { args } }, template: `
`, }), } /** * Contrôles de colonnes (`enable-column-controls`) : une interface permet de * réordonner et d'afficher/masquer les colonnes. */ export const ColumnControls: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { 'headers': usersHeaders, 'items': users, 'options': { itemsPerPage: 4 }, 'caption': '', 'suffix': 'column-control-table', 'density': 'default', 'striped': false, 'enableColumnControls': true, 'onUpdate:options': fn(), }, render: args => ({ components: { SyTable }, setup() { return { args } }, template: ` `, }), }