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/Pagination',
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' },
]
// Jeux dérivés du dataset serveur partagé.
const sixUsers = serverUsers.slice(0, 6)
const elevenUsers = serverUsers.slice(0, 11)
/**
* Choix du nombre de lignes par page côté serveur (`items-per-page-options`) :
* chaque changement déclenche un nouveau « fetch ».
*/
export const ItemsPerPageOptions: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
options: {
itemsPerPage: 5,
sortBy: [{ key: 'lastname', order: 'asc' }],
page: 1,
},
itemsPerPageOptions: [5, 10, 15],
headers: serverHeaders,
caption: '',
serverItemsLength: 15,
suffix: 'server-default',
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: `
`,
}),
}
/**
* Masquer le pied de page côté serveur (`hide-default-footer`) : ici toutes les
* lignes sont renvoyées (`itemsPerPage: -1`).
*/
export const HideDefaultFooter: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
options: { itemsPerPage: -1, page: 1 },
headers: serverHeaders,
serverItemsLength: 6,
suffix: 'server-hide-footer',
density: 'default',
striped: false,
hideDefaultFooter: true,
...commonTableEventArgs(),
},
render: args => ({
components: { SyServerTable },
setup() {
const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, sixUsers)
return { args, items, totalItems, state, options, fetchData, StateEnum }
},
template: `
`,
}),
}
/**
* Saisie directe de la page côté serveur (`page-input`) : un champ numérique
* permet d'aller directement à une page donnée.
*/
export const PageInput: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
options: { itemsPerPage: 5, page: 1 },
headers: serverHeaders,
serverItemsLength: 11,
suffix: 'server-page-input',
density: 'default',
striped: false,
pageInput: true,
...commonTableEventArgs(),
},
render: args => ({
components: { SyServerTable },
setup() {
const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, elevenUsers)
return { args, items, totalItems, state, options, fetchData, StateEnum }
},
template: `
`,
}),
}