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.

`, }), }