import type { Meta, StoryObj } from '@storybook/vue3-vite'
import { ref } from 'vue'
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/Sélection',
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', value: 'email' },
]
/**
* Sélection multiple côté serveur : `show-select` ajoute une colonne de cases à
* cocher. La sélection reste un `v-model` local (indépendant du « fetch »).
*/
export const RowSelection: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
Item(s) sélectionné(s) ({{ selection.length }})
Nom : {{ item.lastname }}
Prénom : {{ item.firstname }}
Email : {{ item.email }}
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
options: { itemsPerPage: 5, page: 1 },
headers: serverHeaders,
caption: '',
serverItemsLength: 15,
suffix: 'selection-server-table',
density: 'default',
striped: false,
showSelect: true,
...commonTableEventArgs(),
},
render: args => ({
components: { SyServerTable },
setup() {
const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, serverUsers)
const selection = ref[]>([])
return { args, items, totalItems, state, options, fetchData, StateEnum, selection }
},
template: `
Item(s) sélectionné(s) ({{ selection.length }})
Nom : {{ item.lastname }}
Prénom : {{ item.firstname }}
Email : {{ item.email }}
`,
}),
}
/**
* Sélection unique côté serveur : `show-select-single` limite la sélection à une
* seule ligne (boutons radio). Le `v-model` contient au plus un élément.
*/
export const SingleRowSelection: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
Item(s) sélectionné(s) ({{ selection.length }})
Nom : {{ item.lastname }}
Prénom : {{ item.firstname }}
Email : {{ item.email }}
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
options: { itemsPerPage: 5, page: 1 },
headers: serverHeaders,
caption: '',
serverItemsLength: 15,
suffix: 'selection-server-table',
density: 'default',
striped: false,
showSelectSingle: true,
...commonTableEventArgs(),
},
render: args => ({
components: { SyServerTable },
setup() {
const { items, totalItems, state, options, fetchData, StateEnum } = useServerTableDemo(args, serverUsers)
const selection = ref[]>([])
return { args, items, totalItems, state, options, fetchData, StateEnum, selection }
},
template: `
Item(s) sélectionné(s) ({{ selection.length }})
Nom : {{ item.lastname }}
Prénom : {{ item.firstname }}
Email : {{ item.email }}
`,
}),
}