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