/* eslint-disable vue/one-component-per-file */ import { fn } from '@storybook/test' import type { Meta, StoryObj } from '@storybook/vue3' import { defineComponent, ref, watch, type PropType } from 'vue' import { VCheckbox, VDivider, VSelect, VTextField } from 'vuetify/components' import FilterSideBar from '../FilterSideBar/FilterSideBar.vue' import PeriodField from '../PeriodField/PeriodField.vue' import RangeField from '../RangeField/RangeField.vue' import SearchListField from '../SearchListField/SearchListField.vue' import FilterInline from './FilterInline.vue' const meta = { title: 'Composants/Filtres/FilterInline', component: FilterInline, argTypes: { 'modelValue': { description: 'Valeur des filtres', control: { type: 'object', }, table: { category: 'props', type: { summary: 'array', detail: `{ name: string value?: unknown formatChip?: (value: unknown) => ChipItem[] chipOverflowLimit?: number title?: string }[]`, }, defaultValue: { summary: '[]', }, }, }, 'locales': { description: 'Traductions', control: { type: 'object', }, table: { category: 'props', type: { summary: 'Record', }, defaultValue: { summary: 'locales', detail: `{ badgeLabel: (count: number): string => \`\${count} filtre\${count > 1 ? 's' : ''}\`, }`, }, }, }, 'onUpdate:modelValue': { description: 'Événement déclenché lors de la mise à jour des filtres', control: { type: undefined, }, table: { category: 'events', type: { summary: 'array', detail: `{ name: string value?: unknown formatChip?: (value: unknown) => ChipItem[] chipOverflowLimit?: number title?: string }[]`, }, }, }, // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - storybook can't infer dynamic slot name '${filterName}': { description: 'Slot pour les filtre.
Le nom de chaque slot correspond au nom (`name`) du filtre.
Le paramètre du slot `props` est un objet contenant les props à passer du filtre.', table: { category: 'slots', type: { summary: '{ props: Object }', }, }, }, }, parameters: { controls: { exclude: ['update:modelValue', '`${formatFilterName(filter.name)}`'], }, }, } satisfies Meta export default meta type Story = StoryObj export const Default: Story = { args: { 'onUpdate:modelValue': fn(), }, render: args => ({ components: { FilterInline, VTextField, VSelect, PeriodField, SearchListField }, setup() { const filters = [ { name: 'name', title: 'Identité', }, { name: 'folder', title: 'Type de dossier', }, { name: 'period', title: 'Période', }, { name: 'profession', title: 'Profession', }, ] const folderTypes = [ { title: 'Arrêt de Travail (AT)', value: 'AT' }, { title: 'Maladie Professionnelle (MP)', value: 'MP' }, { title: 'Autre', value: 'other' }, ] const professionList = [ { label: 'Chirurgien-dentiste', value: 'chirurgien-dentiste', }, { label: 'Infirmier', value: 'infirmier', }, { label: 'Orthophoniste', value: 'orthophoniste', }, { label: 'Orthoptiste', value: 'orthoptiste', }, { label: 'Pédicure-podologue', value: 'pedicure-podologue', }, { label: 'Pharmacien', value: 'pharmacien', }, ] return { args, filters, folderTypes, professionList } }, template: ` `, }), parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, } const BooleanFilter = defineComponent({ components: { VCheckbox, }, props: { modelValue: { type: String, default: null, }, title: { required: true, type: String, }, label: { required: true, type: String, }, }, template: ` `, }) export const Boolean: Story = { args: { 'onUpdate:modelValue': fn(), }, render: args => ({ components: { FilterInline, BooleanFilter }, setup() { const filters = ref([ { name: 'eligibility', title: 'Éligibilité', }, ]) return { args, filters } }, template: ` `, }), parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, { name: 'BooleanFilter.vue', code: ` `, }, ], }, } const ManyFilters = defineComponent({ components: { VCheckbox, }, props: { modelValue: { type: Object as PropType, default: undefined, }, }, emits: ['update:modelValue'], setup(args, ctx) { const rqth = ref(false) const pch = ref(false) const aeeh = ref(false) watch(() => args.modelValue, (value) => { rqth.value = !!value?.includes('RQTH') pch.value = !!value?.includes('PCH') aeeh.value = !!value?.includes('AEEH') }, { immediate: true, deep: true }) watch([rqth, pch, aeeh], () => { const values: string[] = [] if (rqth.value) values.push('RQTH') if (pch.value) values.push('PCH') if (aeeh.value) values.push('AEEH') ctx.emit('update:modelValue', values.length ? values : undefined) }) return { rqth, pch, aeeh } }, template: `

Est ce que le patient est éligible à la Reconnaissance en Qualité de travailleur handicapé ?


Est ce que le patient est éligible à Prestation de Compensation du Handicap ?


Est ce que le patient est éligible à l'Allocation d'Education de l'Enfant Handicapé ?

`, }) export const ManyFields: Story = { args: { 'onUpdate:modelValue': fn(), }, render: args => ({ components: { FilterInline, ManyFilters }, setup() { const filters = ref([ { name: 'eligibilities', title: 'Éligibilités', }, ]) return { args, filters } }, template: ` `, }), parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, { name: 'ManyFilters.vue', code: ` `, }, ], }, }