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 { users, usersHeaders } from '../common/storyData'
const meta = {
title: 'Composants/Tableaux/SyTable/Tri',
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 de données spécifique au tri multiple (colonne Ville + un doublon de nom
// pour illustrer le tri secondaire).
const multiSortHeaders = [
...usersHeaders,
{ title: 'Ville', key: 'city' },
]
const multiSortItems = [
{ firstname: 'Virginie', lastname: 'Beauchesne', email: 'virginie.beauchesne@example.com', city: 'Paris' },
{ firstname: 'Simone', lastname: 'Bellefeuille', email: 'simone.bellefeuille@example.com', city: 'Lyon' },
{ firstname: 'Étienne', lastname: 'Salois', email: 'etienne.salois@example.com', city: 'Marseille' },
{ firstname: 'Thierry', lastname: 'Bobu', email: 'thierry.bobu@example.com', city: 'Toulouse' },
{ firstname: 'Bernadette', lastname: 'Langelier', email: 'bernadette.langelier@exemple.com', city: 'Nice' },
{ firstname: 'Agate', lastname: 'Roy', email: 'agate.roy@exemple.com', city: 'Bordeaux' },
{ firstname: 'Agate', lastname: 'Beauchesne', email: 'agate.beauchesne@exemple.com', city: 'Lille' },
]
/**
* Tri simple : clic sur l'en-tête d'une colonne. L'état de tri est piloté par
* `v-model:options` (`sortBy`).
*/
export const SortBy: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
'headers': usersHeaders,
'items': users,
'caption': '',
'options': {
itemsPerPage: 4,
sortBy: [
{ key: 'lastname', order: 'desc' },
],
},
'suffix': 'sort-table',
'density': 'default',
'striped': false,
'onUpdate:options': fn(),
},
render: args => ({
components: { SyTable },
setup() {
return { args }
},
template: `
`,
}),
}
/**
* Tri multiple (`multi-sort`) : un chiffre à côté de l'icône de tri indique
* l'ordre de priorité des colonnes triées.
*/
export const MultiSort: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
'headers': multiSortHeaders,
'items': multiSortItems,
'caption': '',
'options': {
itemsPerPage: 4,
multiSort: true,
sortBy: [
{ key: 'lastname', order: 'desc' },
{ key: 'firstname', order: 'asc' },
],
},
'suffix': 'multi-sort-table',
'density': 'default',
'striped': false,
'multiSort': true,
'onUpdate:options': fn(),
},
render: args => ({
components: { SyTable },
setup() {
return { args }
},
template: `
Cet exemple montre le tri multiple avec des indicateurs d'ordre de priorité.
Les chiffres à côté des icônes de tri indiquent l'ordre de priorité du tri.
`,
}),
}