import type { Meta, StoryObj } from '@storybook/vue3'
import { ref } from 'vue'
import PasswordField from './PasswordField.vue'
import type { PasswordFieldProps } from './types'
import { fn } from '@storybook/test'
import { getValidationDocumentation } from '@/composables/unifyValidation/documentationValidationProps'
type PasswordFieldStoryArgs = PasswordFieldProps & {
'onUpdate:modelValue': (...args: unknown[]) => unknown
'onSubmit': (...args: unknown[]) => unknown
}
const meta = {
title: 'Composants/Formulaires/PasswordField',
component: PasswordField,
decorators: [
() => ({
template: '
',
}),
],
parameters: {
layout: 'fullscreen',
controls: { exclude: '^on*' },
docs: {
description: {
component: `PasswordField est un champ de saisie sécurisé pour les mots de passe`,
},
},
},
argTypes: {
...getValidationDocumentation('string'),
'modelValue': {
control: 'text',
description: 'Valeur du champ de mot de passe',
},
'variantStyle': {
control: 'select',
options: ['outlined', 'underlined'],
description: 'Style du champ (contour ou souligné)',
},
'color': {
control: 'select',
options: ['primary', 'secondary', 'error', 'warning', 'success', 'info'],
description: 'Couleur principale du champ',
},
'label': {
control: 'text',
description: 'Libellé du champ',
},
'displayAsterisk': {
control: 'boolean',
description: 'Affiche un astérisque à côté du libellé pour indiquer que le champ est obligatoire',
},
'bgColor': {
control: 'color',
description: 'Couleur de fond du champ',
},
'clearable': {
control: 'boolean',
description: 'Affiche un bouton pour vider le champ',
},
'autocompleteType': {
control: 'select',
options: ['current-password', 'new-password'],
description: 'Type d\'auto-complétion',
default: 'current-password',
},
'helpText': {
control: 'text',
description: 'Texte d\'aide affiché sous le champ',
},
'hideDetails': {
control: 'boolean',
description: 'Masque la zone de détails (messages d\'erreur, d\'aide…) sous le champ',
},
'update:modelValue': {
action: 'update:modelValue',
description: 'Événement émis lors de la mise à jour de la valeur du champ',
table: {
type: 'string',
},
category: 'Events',
},
},
args: {
'modelValue': '',
'variantStyle': 'outlined',
'color': 'primary',
'label': 'Mot de passe',
'required': false,
'errorMessages': null,
'warningMessages': null,
'successMessages': null,
'readonly': false,
'disabled': false,
'placeholder': 'Entrez votre mot de passe',
'customRules': [],
'customWarningRules': [],
'customSuccessRules': [],
'showSuccessMessages': false,
'displayAsterisk': false,
'clearable': false,
'isValidateOnBlur': true,
'bgColor': 'white',
'onUpdate:modelValue': fn(),
},
} as Meta
export default meta
type Story = StoryObj
/**
* Story par défaut montrant un champ de mot de passe basique.
*/
export const Default: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
render: args => ({
components: { PasswordField },
setup() {
const password = ref(args.modelValue ?? '')
return { args, password }
},
template: `
`,
}),
}
/**
* Champ de mot de passe avec validation requise.
*/
export const Required: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
required: true,
displayAsterisk: false,
},
}
/**
* Champ de mot de passe avec validation requise avec asterisk.
*/
export const RequiredWithAsterisk: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
required: true,
displayAsterisk: true,
},
}
/**
* Champ de mot de passe désactivé.
*/
export const Disabled: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
disabled: true,
modelValue: 'MonMotDePasse123',
},
}
/**
* Champ de mot de passe en lecture seule.
*/
export const ReadOnly: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
readonly: true,
modelValue: 'MonMotDePasse123',
},
}
export const HelpText: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
helpText: 'Votre mot de passe doit contenir au moins 8 caractères.',
modelValue: 'MonMotDePasse123',
},
}
export const HideDetails: Story = {
parameters: {
a11y: {
disable: true,
},
sourceCode: [
{
name: 'Template',
code: `
`,
},
{
name: 'Script',
code: `
`,
},
],
},
args: {
hideDetails: true,
required: true,
modelValue: '',
},
}