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