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 { serverUsers } from '../common/storyData' import { useServerTableDemo } from '../common/serverStoryHelpers' const meta = { title: 'Composants/Tableaux/SyServerTable/Tri', 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' }, ] // Jeu spécifique au tri multiple : un doublon de nom (« Beauchesne ») pour // illustrer le tri secondaire par prénom. const serverMultiSortDataset: Record[] = [ { firstname: 'Virginie', lastname: 'Beauchesne', email: 'virginie.beauchesne@example.com' }, { firstname: 'Simone', lastname: 'Bellefeuille', email: 'simone.bellefeuille@example.com' }, { firstname: 'Étienne', lastname: 'Salois', email: 'etienne.salois@example.com' }, { firstname: 'Thierry', lastname: 'Bobu', email: 'thierry.bobu@example.com' }, { firstname: 'Bernadette', lastname: 'Langelier', email: 'bernadette.langelier@example.com' }, { firstname: 'Agate', lastname: 'Roy', email: 'agate.roy@example.com' }, { firstname: 'Agate', lastname: 'Beauchesne', email: 'agate.beauchesne@example.com' }, ] /** * Tri simple côté serveur : le tri est délégué au serveur via l'évènement * `@update:options`, qui déclenche un nouveau « fetch ». */ export const ServerSortBy: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { options: { itemsPerPage: 5, sortBy: [{ key: 'lastname', order: 'desc' }], page: 1, }, headers: serverHeaders, caption: '', serverItemsLength: 15, suffix: 'server-sort', density: 'default', striped: false, ...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: ` `, }), } /** * Tri multiple côté serveur (`multi-sort`) : un chiffre à côté de l'icône de tri * indique l'ordre de priorité des colonnes. Le serveur applique le tri multi-clés. */ export const ServerMultiSort: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { options: { itemsPerPage: 5, multiSort: true, sortBy: [ { key: 'lastname', order: 'desc' }, { key: 'firstname', order: 'asc' }, ], page: 1, }, headers: serverHeaders, caption: '', serverItemsLength: 7, suffix: 'server-multi-sort', density: 'default', striped: false, multiSort: true, ...commonTableEventArgs(), }, render: args => ({ components: { SyServerTable }, setup() { const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, serverMultiSortDataset) return { args, items, totalItems, state, options, fetchData, StateEnum } }, template: `

Cet exemple montre le tri multiple côté serveur avec des indicateurs d'ordre de priorité. Les chiffres à côté des icônes de tri indiquent l'ordre de priorité du tri.

`, }), }