@cnamts/synapse 0.0.11-alpha → 0.0.12-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/design-system-v3.js +3878 -3189
- package/dist/design-system-v3.umd.cjs +1 -1
- package/dist/src/components/Amelipro/types/languages.d.ts +6 -0
- package/dist/src/components/Amelipro/types/types.d.ts +65 -0
- package/dist/src/components/CookieBanner/CookieBanner.d.ts +1 -1
- package/dist/src/components/Customs/SyInputSelect/SyInputSelect.d.ts +2 -0
- package/dist/src/components/Customs/SyTextField/SyTextField.d.ts +29 -23
- package/dist/src/components/Customs/SyTextField/types.d.ts +1 -0
- package/dist/src/components/DatePicker/DatePicker.d.ts +70 -59
- package/dist/src/components/DatePicker/DateTextInput.d.ts +67 -56
- package/dist/src/components/ErrorPage/ErrorPage.d.ts +1 -1
- package/dist/src/components/FileList/FileList.d.ts +1 -0
- package/dist/src/components/FileList/UploadItem/UploadItem.d.ts +1 -1
- package/dist/src/components/FilterSideBar/FilterSideBar.d.ts +31 -0
- package/dist/src/components/FilterSideBar/locales.d.ts +7 -0
- package/dist/src/components/FilterSideBar/tests/FilterSideBar.spec.d.ts +1 -0
- package/dist/src/components/LangBtn/LangBtn.d.ts +2 -2
- package/dist/src/components/NirField/NirField.d.ts +940 -0
- package/dist/src/components/NotificationBar/NotificationBar.d.ts +1 -1
- package/dist/src/components/PasswordField/PasswordField.d.ts +40 -8
- package/dist/src/components/PeriodField/PeriodField.d.ts +142 -120
- package/dist/src/components/PhoneField/PhoneField.d.ts +11 -2
- package/dist/src/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +1 -1
- package/dist/src/components/RatingPicker/NumberPicker/NumberPicker.d.ts +1 -1
- package/dist/src/components/RatingPicker/StarsPicker/StarsPicker.d.ts +1 -1
- package/dist/src/components/UploadWorkflow/config.d.ts +29 -0
- package/dist/src/components/UploadWorkflow/locales.d.ts +7 -0
- package/dist/src/components/UploadWorkflow/tests/UploadWorkflow.spec.d.ts +1 -0
- package/dist/src/components/UploadWorkflow/types.d.ts +19 -0
- package/dist/src/components/UploadWorkflow/useFileList.d.ts +10 -0
- package/dist/src/components/UploadWorkflow/useFileUploadJourney.d.ts +9 -0
- package/dist/src/components/index.d.ts +2 -0
- package/dist/src/composables/rules/useFieldValidation.d.ts +1 -0
- package/dist/src/composables/validation/tests/useValidation.spec.d.ts +1 -0
- package/dist/src/composables/validation/useValidation.d.ts +39 -0
- package/dist/src/designTokens/index.d.ts +3 -1
- package/dist/src/vuetifyConfig.d.ts +81 -0
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/assets/_elevations.scss +89 -0
- package/src/assets/_fonts.scss +6 -0
- package/src/assets/_radius.scss +86 -0
- package/src/assets/_spacers.scss +149 -0
- package/src/assets/settings.scss +7 -3
- package/src/assets/tokens.scss +32 -29
- package/src/components/Amelipro/types/languages.d.ts +6 -0
- package/src/components/Amelipro/types/types.d.ts +65 -0
- package/src/components/Customs/SyInputSelect/SyInputSelect.stories.ts +65 -0
- package/src/components/Customs/SyInputSelect/SyInputSelect.vue +13 -3
- package/src/components/Customs/SySelect/SySelect.stories.ts +88 -5
- package/src/components/Customs/SySelect/SySelect.vue +36 -10
- package/src/components/Customs/SySelect/tests/SySelect.spec.ts +135 -2
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +576 -85
- package/src/components/Customs/SyTextField/SyTextField.vue +132 -104
- package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +190 -38
- package/src/components/Customs/SyTextField/types.d.ts +1 -0
- package/src/components/DatePicker/DatePicker.vue +405 -137
- package/src/components/DatePicker/DateTextInput.vue +15 -0
- package/src/components/DatePicker/tests/DatePicker.spec.ts +8 -15
- package/src/components/FileList/FileList.vue +2 -1
- package/src/components/FileList/UploadItem/UploadItem.vue +10 -0
- package/src/components/FileUpload/FileUpload.stories.ts +84 -0
- package/src/components/FileUpload/FileUpload.vue +1 -0
- package/src/components/FileUpload/tests/FileUpload.spec.ts +4 -4
- package/src/components/FilterInline/FilterInline.mdx +180 -34
- package/src/components/FilterInline/FilterInline.stories.ts +363 -6
- package/src/components/FilterSideBar/FilterSideBar.mdx +237 -0
- package/src/components/FilterSideBar/FilterSideBar.stories.ts +798 -0
- package/src/components/FilterSideBar/FilterSideBar.vue +193 -0
- package/src/components/FilterSideBar/locales.ts +8 -0
- package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +305 -0
- package/src/components/FilterSideBar/tests/__snapshots__/FilterSideBar.spec.ts.snap +39 -0
- package/src/components/HeaderBar/Usages.mdx +1 -1
- package/src/components/NirField/NirField.stories.ts +573 -29
- package/src/components/NirField/NirField.vue +397 -359
- package/src/components/NirField/tests/NirField.spec.ts +88 -52
- package/src/components/NirField/tests//342/200/257dataset/342/200/257.md +12 -0
- package/src/components/NotificationBar/Accessibilite.stories.ts +4 -0
- package/src/components/NotificationBar/NotificationBar.stories.ts +18 -13
- package/src/components/PasswordField/PasswordField.mdx +129 -47
- package/src/components/PasswordField/PasswordField.stories.ts +924 -120
- package/src/components/PasswordField/PasswordField.vue +209 -99
- package/src/components/PasswordField/tests/PasswordField.spec.ts +138 -9
- package/src/components/PeriodField/PeriodField.vue +55 -54
- package/src/components/PhoneField/PhoneField.stories.ts +69 -0
- package/src/components/PhoneField/PhoneField.vue +3 -0
- package/src/components/PhoneField/indicatifs.ts +1 -1
- package/src/components/UploadWorkflow/UploadWorkflow.mdx +75 -0
- package/src/components/UploadWorkflow/UploadWorkflow.stories.ts +943 -0
- package/src/components/UploadWorkflow/UploadWorkflow.vue +230 -0
- package/src/components/UploadWorkflow/config.ts +29 -0
- package/src/components/UploadWorkflow/locales.ts +8 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +257 -0
- package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +54 -0
- package/src/components/UploadWorkflow/types.ts +21 -0
- package/src/components/UploadWorkflow/useFileList.ts +84 -0
- package/src/components/UploadWorkflow/useFileUploadJourney.ts +18 -0
- package/src/components/index.ts +2 -0
- package/src/composables/rules/useFieldValidation.ts +5 -2
- package/src/composables/validation/tests/useValidation.spec.ts +154 -0
- package/src/composables/validation/useValidation.ts +165 -0
- package/src/designTokens/index.ts +4 -0
- package/src/stories/Demarrer/Accueil.mdx +1 -1
- package/src/stories/DesignTokens/ThemePA.mdx +4 -30
- package/src/stories/GuideDuDev/UtiliserLesRules.mdx +319 -76
- package/src/stories/GuideDuDev/moduleDeNotification.mdx +1 -1
- package/src/vuetifyConfig.ts +61 -0
- package/src/composables/useFilterable/__snapshots__/useFilterable.spec.ts.snap +0 -3
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3'
|
|
2
|
+
import { ref } from 'vue'
|
|
2
3
|
import PasswordField from './PasswordField.vue'
|
|
3
4
|
|
|
4
5
|
const meta = {
|
|
5
|
-
title: 'Composants/Formulaires/
|
|
6
|
+
title: 'Composants/Formulaires/Passwordfield',
|
|
6
7
|
component: PasswordField,
|
|
7
8
|
decorators: [
|
|
8
9
|
() => ({
|
|
@@ -11,57 +12,102 @@ const meta = {
|
|
|
11
12
|
],
|
|
12
13
|
parameters: {
|
|
13
14
|
layout: 'fullscreen',
|
|
15
|
+
docs: {
|
|
16
|
+
description: {
|
|
17
|
+
component: `PasswordField est un champ de saisie sécurisé pour les mots de passe`,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
14
20
|
},
|
|
15
21
|
argTypes: {
|
|
16
22
|
modelValue: {
|
|
17
|
-
description: 'La valeur du modèle pour le champ.',
|
|
18
23
|
control: 'text',
|
|
19
|
-
|
|
20
|
-
table: {
|
|
21
|
-
type: {
|
|
22
|
-
summary: 'string | null',
|
|
23
|
-
},
|
|
24
|
-
},
|
|
24
|
+
description: 'Valeur du champ de mot de passe',
|
|
25
25
|
},
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
variantStyle: {
|
|
27
|
+
control: 'select',
|
|
28
|
+
options: ['outlined', 'underlined'],
|
|
29
|
+
description: 'Style du champ (contour ou souligné)',
|
|
30
|
+
},
|
|
31
|
+
color: {
|
|
32
|
+
control: 'select',
|
|
33
|
+
options: ['primary', 'secondary', 'error', 'warning', 'success', 'info'],
|
|
34
|
+
description: 'Couleur principale du champ',
|
|
35
|
+
},
|
|
36
|
+
label: {
|
|
37
|
+
control: 'text',
|
|
38
|
+
description: 'Libellé du champ',
|
|
35
39
|
},
|
|
36
40
|
required: {
|
|
37
|
-
description: 'Indique si le champ est requis.',
|
|
38
41
|
control: 'boolean',
|
|
39
|
-
|
|
40
|
-
table: {
|
|
41
|
-
type: {
|
|
42
|
-
summary: 'boolean',
|
|
43
|
-
},
|
|
44
|
-
},
|
|
42
|
+
description: 'Indique si le champ est obligatoire',
|
|
45
43
|
},
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
errorMessages: {
|
|
45
|
+
control: 'object',
|
|
46
|
+
description: 'Messages d\'erreur à afficher',
|
|
47
|
+
},
|
|
48
|
+
warningMessages: {
|
|
49
|
+
control: 'object',
|
|
50
|
+
description: 'Messages d\'avertissement à afficher',
|
|
51
|
+
},
|
|
52
|
+
successMessages: {
|
|
53
|
+
control: 'object',
|
|
54
|
+
description: 'Messages de succès à afficher',
|
|
55
|
+
},
|
|
56
|
+
isReadOnly: {
|
|
48
57
|
control: 'boolean',
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
58
|
+
description: 'Indique si le champ est en lecture seule',
|
|
59
|
+
},
|
|
60
|
+
isDisabled: {
|
|
61
|
+
control: 'boolean',
|
|
62
|
+
description: 'Indique si le champ est désactivé',
|
|
63
|
+
},
|
|
64
|
+
placeholder: {
|
|
65
|
+
control: 'text',
|
|
66
|
+
description: 'Texte d\'indication affiché lorsque le champ est vide',
|
|
55
67
|
},
|
|
56
68
|
customRules: {
|
|
57
|
-
description: 'Règles de validation personnalisées.',
|
|
58
69
|
control: 'object',
|
|
59
|
-
|
|
60
|
-
type: {
|
|
61
|
-
summary: 'array',
|
|
62
|
-
},
|
|
63
|
-
},
|
|
70
|
+
description: 'Règles de validation personnalisées',
|
|
64
71
|
},
|
|
72
|
+
customWarningRules: {
|
|
73
|
+
control: 'object',
|
|
74
|
+
description: 'Règles d\'avertissement personnalisées',
|
|
75
|
+
},
|
|
76
|
+
customSuccessRules: {
|
|
77
|
+
control: 'object',
|
|
78
|
+
description: 'Règles de succès personnalisées',
|
|
79
|
+
},
|
|
80
|
+
showSuccessMessages: {
|
|
81
|
+
control: 'boolean',
|
|
82
|
+
description: 'Indique si les messages de succès doivent être affichés',
|
|
83
|
+
},
|
|
84
|
+
displayAsterisk: {
|
|
85
|
+
control: 'boolean',
|
|
86
|
+
description: 'Affiche un astérisque à côté du libellé pour indiquer que le champ est obligatoire',
|
|
87
|
+
},
|
|
88
|
+
isValidateOnBlur: {
|
|
89
|
+
control: 'boolean',
|
|
90
|
+
description: 'Indique si la validation doit être effectuée lors de la perte de focus',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
args: {
|
|
94
|
+
modelValue: '',
|
|
95
|
+
variantStyle: 'outlined',
|
|
96
|
+
color: 'primary',
|
|
97
|
+
label: 'Mot de passe',
|
|
98
|
+
required: false,
|
|
99
|
+
errorMessages: null,
|
|
100
|
+
warningMessages: null,
|
|
101
|
+
successMessages: null,
|
|
102
|
+
isReadOnly: false,
|
|
103
|
+
isDisabled: false,
|
|
104
|
+
placeholder: 'Entrez votre mot de passe',
|
|
105
|
+
customRules: [],
|
|
106
|
+
customWarningRules: [],
|
|
107
|
+
customSuccessRules: [],
|
|
108
|
+
showSuccessMessages: true,
|
|
109
|
+
displayAsterisk: false,
|
|
110
|
+
isValidateOnBlur: true,
|
|
65
111
|
},
|
|
66
112
|
} satisfies Meta<typeof PasswordField>
|
|
67
113
|
|
|
@@ -70,144 +116,902 @@ export default meta
|
|
|
70
116
|
type Story = StoryObj<typeof meta>
|
|
71
117
|
|
|
72
118
|
/**
|
|
73
|
-
* Story par défaut
|
|
119
|
+
* Story par défaut montrant un champ de mot de passe basique.
|
|
74
120
|
*/
|
|
75
121
|
export const Default: Story = {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
122
|
+
parameters: {
|
|
123
|
+
sourceCode: [
|
|
124
|
+
{
|
|
125
|
+
name: 'Template',
|
|
126
|
+
code: `
|
|
127
|
+
<template>
|
|
128
|
+
<PasswordField
|
|
129
|
+
v-model="password"
|
|
130
|
+
label="Mot de passe"
|
|
131
|
+
placeholder="Entrez votre mot de passe"
|
|
132
|
+
/>
|
|
133
|
+
</template>
|
|
134
|
+
`,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: 'Script',
|
|
138
|
+
code: `
|
|
139
|
+
<script setup lang="ts">
|
|
140
|
+
import { ref } from 'vue'
|
|
141
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
142
|
+
|
|
143
|
+
const password = ref('')
|
|
144
|
+
</script>
|
|
145
|
+
`,
|
|
88
146
|
},
|
|
89
|
-
|
|
90
|
-
<PasswordField v-bind="args" v-model="args.modelValue"/>
|
|
91
|
-
`,
|
|
92
|
-
}
|
|
147
|
+
],
|
|
93
148
|
},
|
|
149
|
+
render: args => ({
|
|
150
|
+
components: { PasswordField },
|
|
151
|
+
setup() {
|
|
152
|
+
const password = ref(args.modelValue)
|
|
153
|
+
return { args, password }
|
|
154
|
+
},
|
|
155
|
+
template: `
|
|
156
|
+
<PasswordField
|
|
157
|
+
v-model="password"
|
|
158
|
+
:variant-style="args.variantStyle"
|
|
159
|
+
:color="args.color"
|
|
160
|
+
:label="args.label"
|
|
161
|
+
:required="args.required"
|
|
162
|
+
:error-messages="args.errorMessages"
|
|
163
|
+
:warning-messages="args.warningMessages"
|
|
164
|
+
:success-messages="args.successMessages"
|
|
165
|
+
:is-read-only="args.isReadOnly"
|
|
166
|
+
:is-disabled="args.isDisabled"
|
|
167
|
+
:placeholder="args.placeholder"
|
|
168
|
+
:custom-rules="args.customRules"
|
|
169
|
+
:custom-warning-rules="args.customWarningRules"
|
|
170
|
+
:custom-success-rules="args.customSuccessRules"
|
|
171
|
+
:show-success-messages="args.showSuccessMessages"
|
|
172
|
+
:display-asterisk="args.displayAsterisk"
|
|
173
|
+
:is-validate-on-blur="args.isValidateOnBlur"
|
|
174
|
+
/>
|
|
175
|
+
`,
|
|
176
|
+
}),
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Champ de mot de passe avec validation requise.
|
|
181
|
+
*/
|
|
182
|
+
export const Required: Story = {
|
|
94
183
|
parameters: {
|
|
95
184
|
sourceCode: [
|
|
96
185
|
{
|
|
97
186
|
name: 'Template',
|
|
98
187
|
code: `
|
|
99
|
-
<template>
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
</template>
|
|
106
|
-
|
|
188
|
+
<template>
|
|
189
|
+
<PasswordField
|
|
190
|
+
v-model="password"
|
|
191
|
+
label="Mot de passe"
|
|
192
|
+
:required="true"
|
|
193
|
+
/>
|
|
194
|
+
</template>
|
|
195
|
+
`,
|
|
107
196
|
},
|
|
108
197
|
{
|
|
109
198
|
name: 'Script',
|
|
110
199
|
code: `
|
|
111
|
-
<script setup lang="ts">
|
|
112
|
-
import { ref } from 'vue'
|
|
113
|
-
import PasswordField from '@cnamts/synapse'
|
|
114
|
-
|
|
115
|
-
const password = ref('')
|
|
116
|
-
</script>
|
|
117
|
-
|
|
200
|
+
<script setup lang="ts">
|
|
201
|
+
import { ref } from 'vue'
|
|
202
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
203
|
+
|
|
204
|
+
const password = ref('')
|
|
205
|
+
</script>
|
|
206
|
+
`,
|
|
118
207
|
},
|
|
119
208
|
],
|
|
120
209
|
},
|
|
210
|
+
args: {
|
|
211
|
+
required: true,
|
|
212
|
+
displayAsterisk: false,
|
|
213
|
+
},
|
|
121
214
|
}
|
|
122
215
|
|
|
123
216
|
/**
|
|
124
|
-
*
|
|
217
|
+
* Champ de mot de passe avec validation requise avec asterisk.
|
|
125
218
|
*/
|
|
126
|
-
export const
|
|
219
|
+
export const RequiredWithAsterisk: Story = {
|
|
220
|
+
parameters: {
|
|
221
|
+
sourceCode: [
|
|
222
|
+
{
|
|
223
|
+
name: 'Template',
|
|
224
|
+
code: `
|
|
225
|
+
<template>
|
|
226
|
+
<PasswordField
|
|
227
|
+
v-model="password"
|
|
228
|
+
label="Mot de passe"
|
|
229
|
+
:required="true"
|
|
230
|
+
:display-asterisk="true"
|
|
231
|
+
/>
|
|
232
|
+
</template>
|
|
233
|
+
`,
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
name: 'Script',
|
|
237
|
+
code: `
|
|
238
|
+
<script setup lang="ts">
|
|
239
|
+
import { ref } from 'vue'
|
|
240
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
241
|
+
|
|
242
|
+
const password = ref('')
|
|
243
|
+
</script>
|
|
244
|
+
`,
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
},
|
|
127
248
|
args: {
|
|
128
|
-
...Default.args,
|
|
129
249
|
required: true,
|
|
250
|
+
displayAsterisk: true,
|
|
130
251
|
},
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Champ de mot de passe désactivé.
|
|
256
|
+
*/
|
|
257
|
+
export const Disabled: Story = {
|
|
131
258
|
parameters: {
|
|
132
|
-
...Default.parameters,
|
|
133
259
|
sourceCode: [
|
|
134
260
|
{
|
|
135
261
|
name: 'Template',
|
|
136
262
|
code: `
|
|
137
|
-
<template>
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
</template>
|
|
144
|
-
|
|
263
|
+
<template>
|
|
264
|
+
<PasswordField
|
|
265
|
+
v-model="password"
|
|
266
|
+
label="Mot de passe"
|
|
267
|
+
:is-disabled="true"
|
|
268
|
+
/>
|
|
269
|
+
</template>
|
|
270
|
+
`,
|
|
145
271
|
},
|
|
146
272
|
{
|
|
147
273
|
name: 'Script',
|
|
148
274
|
code: `
|
|
149
|
-
<script setup lang="ts">
|
|
150
|
-
import { ref } from 'vue'
|
|
151
|
-
import PasswordField
|
|
275
|
+
<script setup lang="ts">
|
|
276
|
+
import { ref } from 'vue'
|
|
277
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
278
|
+
|
|
279
|
+
const password = ref('MonMotDePasse123')
|
|
280
|
+
</script>
|
|
281
|
+
`,
|
|
282
|
+
},
|
|
283
|
+
],
|
|
284
|
+
},
|
|
285
|
+
args: {
|
|
286
|
+
isDisabled: true,
|
|
287
|
+
modelValue: 'MonMotDePasse123',
|
|
288
|
+
},
|
|
289
|
+
}
|
|
152
290
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
291
|
+
/**
|
|
292
|
+
* Champ de mot de passe en lecture seule.
|
|
293
|
+
*/
|
|
294
|
+
export const ReadOnly: Story = {
|
|
295
|
+
parameters: {
|
|
296
|
+
sourceCode: [
|
|
297
|
+
{
|
|
298
|
+
name: 'Template',
|
|
299
|
+
code: `
|
|
300
|
+
<template>
|
|
301
|
+
<PasswordField
|
|
302
|
+
v-model="password"
|
|
303
|
+
label="Mot de passe"
|
|
304
|
+
:is-read-only="true"
|
|
305
|
+
/>
|
|
306
|
+
</template>
|
|
307
|
+
`,
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
name: 'Script',
|
|
311
|
+
code: `
|
|
312
|
+
<script setup lang="ts">
|
|
313
|
+
import { ref } from 'vue'
|
|
314
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
315
|
+
|
|
316
|
+
const password = ref('MonMotDePasse123')
|
|
317
|
+
</script>
|
|
318
|
+
`,
|
|
156
319
|
},
|
|
157
320
|
],
|
|
158
321
|
},
|
|
322
|
+
args: {
|
|
323
|
+
isReadOnly: true,
|
|
324
|
+
modelValue: 'MonMotDePasse123',
|
|
325
|
+
},
|
|
159
326
|
}
|
|
160
327
|
|
|
161
|
-
|
|
328
|
+
/**
|
|
329
|
+
* Champ de mot de passe avec règles de validation qui génèrent une erreur.
|
|
330
|
+
*/
|
|
331
|
+
export const WithError: Story = {
|
|
332
|
+
parameters: {
|
|
333
|
+
sourceCode: [
|
|
334
|
+
{
|
|
335
|
+
name: 'Template',
|
|
336
|
+
code: `
|
|
337
|
+
<template>
|
|
338
|
+
<PasswordField
|
|
339
|
+
v-model="password"
|
|
340
|
+
label="Mot de passe"
|
|
341
|
+
:custom-rules="customRules"
|
|
342
|
+
/>
|
|
343
|
+
</template>
|
|
344
|
+
`,
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
name: 'Script',
|
|
348
|
+
code: `
|
|
349
|
+
<script setup lang="ts">
|
|
350
|
+
import { ref } from 'vue'
|
|
351
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
352
|
+
|
|
353
|
+
const password = ref('Mdp123')
|
|
354
|
+
|
|
355
|
+
const customRules = [
|
|
356
|
+
{
|
|
357
|
+
type: 'custom',
|
|
358
|
+
options: {
|
|
359
|
+
validate: (value: string) => {
|
|
360
|
+
if (!value || value.length < 8) {
|
|
361
|
+
return 'Le mot de passe doit contenir au moins 8 caractères'
|
|
362
|
+
}
|
|
363
|
+
return true
|
|
364
|
+
},
|
|
365
|
+
fieldIdentifier: 'password',
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
]
|
|
369
|
+
</script>
|
|
370
|
+
`,
|
|
371
|
+
},
|
|
372
|
+
],
|
|
373
|
+
},
|
|
162
374
|
args: {
|
|
163
|
-
|
|
375
|
+
modelValue: 'Mdp123',
|
|
164
376
|
customRules: [
|
|
165
377
|
{
|
|
166
|
-
type: '
|
|
378
|
+
type: 'custom',
|
|
167
379
|
options: {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
380
|
+
validate: (value: string) => {
|
|
381
|
+
if (!value || value.length < 8) {
|
|
382
|
+
return 'Le mot de passe doit contenir au moins 8 caractères'
|
|
383
|
+
}
|
|
384
|
+
return true
|
|
385
|
+
},
|
|
386
|
+
fieldIdentifier: 'password',
|
|
171
387
|
},
|
|
172
388
|
},
|
|
173
389
|
],
|
|
174
390
|
},
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Champ de mot de passe avec règles de validation qui génèrent un avertissement.
|
|
395
|
+
*/
|
|
396
|
+
export const WithWarning: Story = {
|
|
175
397
|
parameters: {
|
|
176
|
-
...Default.parameters,
|
|
177
398
|
sourceCode: [
|
|
178
399
|
{
|
|
179
400
|
name: 'Template',
|
|
180
401
|
code: `
|
|
181
|
-
<template>
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
options: {
|
|
190
|
-
length: 8,
|
|
191
|
-
message: 'Le mot de passe doit comporter au moins 8 caractères.',
|
|
192
|
-
successMessage: 'Le mot de passe est suffisamment long.'
|
|
193
|
-
}
|
|
194
|
-
},
|
|
195
|
-
]"
|
|
196
|
-
/>
|
|
197
|
-
</template>
|
|
198
|
-
`,
|
|
402
|
+
<template>
|
|
403
|
+
<PasswordField
|
|
404
|
+
v-model="password"
|
|
405
|
+
label="Mot de passe"
|
|
406
|
+
:custom-warning-rules="customWarningRules"
|
|
407
|
+
/>
|
|
408
|
+
</template>
|
|
409
|
+
`,
|
|
199
410
|
},
|
|
200
411
|
{
|
|
201
412
|
name: 'Script',
|
|
202
413
|
code: `
|
|
203
|
-
<script setup lang="ts">
|
|
204
|
-
import { ref } from 'vue'
|
|
205
|
-
import PasswordField
|
|
414
|
+
<script setup lang="ts">
|
|
415
|
+
import { ref } from 'vue'
|
|
416
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
417
|
+
|
|
418
|
+
const password = ref('MotDePasse123')
|
|
419
|
+
|
|
420
|
+
const customWarningRules = [
|
|
421
|
+
{
|
|
422
|
+
type: 'custom',
|
|
423
|
+
options: {
|
|
424
|
+
validate: (value: string) => {
|
|
425
|
+
const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(value)
|
|
426
|
+
if (!hasSpecialChar) {
|
|
427
|
+
return 'Le mot de passe pourrait être plus fort avec des caractères spéciaux'
|
|
428
|
+
}
|
|
429
|
+
return true
|
|
430
|
+
},
|
|
431
|
+
fieldIdentifier: 'password',
|
|
432
|
+
},
|
|
433
|
+
},
|
|
434
|
+
]
|
|
435
|
+
</script>
|
|
436
|
+
`,
|
|
437
|
+
},
|
|
438
|
+
],
|
|
439
|
+
},
|
|
440
|
+
args: {
|
|
441
|
+
modelValue: 'MotDePasse123',
|
|
442
|
+
customWarningRules: [
|
|
443
|
+
{
|
|
444
|
+
type: 'custom',
|
|
445
|
+
options: {
|
|
446
|
+
validate: (value: string) => {
|
|
447
|
+
const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(value)
|
|
448
|
+
if (!hasSpecialChar) {
|
|
449
|
+
return 'Le mot de passe pourrait être plus fort avec des caractères spéciaux'
|
|
450
|
+
}
|
|
451
|
+
return true
|
|
452
|
+
},
|
|
453
|
+
fieldIdentifier: 'password',
|
|
454
|
+
},
|
|
455
|
+
},
|
|
456
|
+
],
|
|
457
|
+
},
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/**
|
|
461
|
+
* Champ de mot de passe avec règles de validation qui génèrent un succès.
|
|
462
|
+
*/
|
|
463
|
+
export const WithSuccess: Story = {
|
|
464
|
+
parameters: {
|
|
465
|
+
sourceCode: [
|
|
466
|
+
{
|
|
467
|
+
name: 'Template',
|
|
468
|
+
code: `
|
|
469
|
+
<template>
|
|
470
|
+
<PasswordField
|
|
471
|
+
v-model="password"
|
|
472
|
+
label="Mot de passe"
|
|
473
|
+
:custom-success-rules="customSuccessRules"
|
|
474
|
+
/>
|
|
475
|
+
</template>
|
|
476
|
+
`,
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
name: 'Script',
|
|
480
|
+
code: `
|
|
481
|
+
<script setup lang="ts">
|
|
482
|
+
import { ref } from 'vue'
|
|
483
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
484
|
+
|
|
485
|
+
const password = ref('MotDePasse123!@#')
|
|
486
|
+
|
|
487
|
+
const customSuccessRules = [
|
|
488
|
+
{
|
|
489
|
+
type: 'custom',
|
|
490
|
+
options: {
|
|
491
|
+
validate: (value: string) => {
|
|
492
|
+
const hasUpperCase = /[A-Z]/.test(value)
|
|
493
|
+
const hasLowerCase = /[a-z]/.test(value)
|
|
494
|
+
const hasNumber = /[0-9]/.test(value)
|
|
495
|
+
const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(value)
|
|
496
|
+
const hasMinLength = value.length >= 8
|
|
497
|
+
|
|
498
|
+
if (hasUpperCase && hasLowerCase && hasNumber && hasSpecialChar && hasMinLength) {
|
|
499
|
+
return 'Mot de passe fort'
|
|
500
|
+
}
|
|
501
|
+
return true
|
|
502
|
+
},
|
|
503
|
+
fieldIdentifier: 'password',
|
|
504
|
+
},
|
|
505
|
+
},
|
|
506
|
+
]
|
|
507
|
+
</script>
|
|
508
|
+
`,
|
|
509
|
+
},
|
|
510
|
+
],
|
|
511
|
+
},
|
|
512
|
+
args: {
|
|
513
|
+
modelValue: 'MotDePasse123!@#',
|
|
514
|
+
customSuccessRules: [
|
|
515
|
+
{
|
|
516
|
+
type: 'custom',
|
|
517
|
+
options: {
|
|
518
|
+
validate: (value: string) => {
|
|
519
|
+
const hasUpperCase = /[A-Z]/.test(value)
|
|
520
|
+
const hasLowerCase = /[a-z]/.test(value)
|
|
521
|
+
const hasNumber = /[0-9]/.test(value)
|
|
522
|
+
const hasSpecialChar = /[!@#$%^&*(),.?":{}|<>]/.test(value)
|
|
523
|
+
const isLongEnough = value.length >= 8
|
|
524
|
+
|
|
525
|
+
if (hasUpperCase && hasLowerCase && hasNumber && hasSpecialChar && isLongEnough) {
|
|
526
|
+
return 'Mot de passe fort'
|
|
527
|
+
}
|
|
528
|
+
return false
|
|
529
|
+
},
|
|
530
|
+
fieldIdentifier: 'password',
|
|
531
|
+
},
|
|
532
|
+
},
|
|
533
|
+
],
|
|
534
|
+
},
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Démonstration des différents types de validation (erreurs, avertissements, succès).
|
|
539
|
+
*/
|
|
540
|
+
export const WithValidation: Story = {
|
|
541
|
+
parameters: {
|
|
542
|
+
sourceCode: [
|
|
543
|
+
{
|
|
544
|
+
name: 'Template',
|
|
545
|
+
code: `
|
|
546
|
+
<template>
|
|
547
|
+
<PasswordField
|
|
548
|
+
v-model="password"
|
|
549
|
+
label="Mot de passe"
|
|
550
|
+
:required="true"
|
|
551
|
+
:custom-rules="customRules"
|
|
552
|
+
:custom-warning-rules="customWarningRules"
|
|
553
|
+
:custom-success-rules="customSuccessRules"
|
|
554
|
+
:show-success-messages="true"
|
|
555
|
+
:display-asterisk="true"
|
|
556
|
+
:is-validate-on-blur="false"
|
|
557
|
+
/>
|
|
558
|
+
</template>
|
|
559
|
+
`,
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
name: 'Script',
|
|
563
|
+
code: `
|
|
564
|
+
<script setup lang="ts">
|
|
565
|
+
import { ref } from 'vue'
|
|
566
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
567
|
+
|
|
568
|
+
const password = ref('')
|
|
569
|
+
|
|
570
|
+
// Règles personnalisées pour la validation du mot de passe
|
|
571
|
+
const customRules = [
|
|
572
|
+
{
|
|
573
|
+
type: 'custom',
|
|
574
|
+
options: {
|
|
575
|
+
validate: (value: string) => {
|
|
576
|
+
if (!value || value.length < 8) {
|
|
577
|
+
return 'Le mot de passe doit contenir au moins 8 caractères'
|
|
578
|
+
}
|
|
579
|
+
return true
|
|
580
|
+
},
|
|
581
|
+
fieldIdentifier: 'password',
|
|
582
|
+
},
|
|
583
|
+
},
|
|
584
|
+
]
|
|
585
|
+
|
|
586
|
+
const customWarningRules = [
|
|
587
|
+
{
|
|
588
|
+
type: 'custom',
|
|
589
|
+
options: {
|
|
590
|
+
validate: (value: string) => {
|
|
591
|
+
if (!value || !/[!@#$%^&*(),.?":{}|<>]/.test(value)) {
|
|
592
|
+
return 'Le mot de passe pourrait être plus fort avec des caractères spéciaux'
|
|
593
|
+
}
|
|
594
|
+
return true
|
|
595
|
+
},
|
|
596
|
+
fieldIdentifier: 'password',
|
|
597
|
+
},
|
|
598
|
+
},
|
|
599
|
+
]
|
|
600
|
+
|
|
601
|
+
const customSuccessRules = [
|
|
602
|
+
{
|
|
603
|
+
type: 'custom',
|
|
604
|
+
options: {
|
|
605
|
+
validate: (value: string) => {
|
|
606
|
+
if (value && value.length >= 12
|
|
607
|
+
&& /[A-Z]/.test(value)
|
|
608
|
+
&& /[0-9]/.test(value)
|
|
609
|
+
&& /[!@#$%^&*(),.?":{}|<>]/.test(value)) {
|
|
610
|
+
return 'Mot de passe très sécurisé !'
|
|
611
|
+
}
|
|
612
|
+
return true
|
|
613
|
+
},
|
|
614
|
+
fieldIdentifier: 'password',
|
|
615
|
+
},
|
|
616
|
+
},
|
|
617
|
+
]
|
|
618
|
+
</script>
|
|
619
|
+
`,
|
|
620
|
+
},
|
|
621
|
+
],
|
|
622
|
+
},
|
|
623
|
+
render: args => ({
|
|
624
|
+
components: { PasswordField },
|
|
625
|
+
setup() {
|
|
626
|
+
const password = ref('')
|
|
206
627
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
628
|
+
// Règles personnalisées pour la validation du mot de passe
|
|
629
|
+
const customRules = [
|
|
630
|
+
{
|
|
631
|
+
type: 'custom',
|
|
632
|
+
options: {
|
|
633
|
+
validate: (value: string) => {
|
|
634
|
+
if (!value || value.length < 8) {
|
|
635
|
+
return 'Le mot de passe doit contenir au moins 8 caractères'
|
|
636
|
+
}
|
|
637
|
+
return true
|
|
638
|
+
},
|
|
639
|
+
fieldIdentifier: 'password',
|
|
640
|
+
},
|
|
641
|
+
},
|
|
642
|
+
]
|
|
643
|
+
|
|
644
|
+
const customWarningRules = [
|
|
645
|
+
{
|
|
646
|
+
type: 'custom',
|
|
647
|
+
options: {
|
|
648
|
+
validate: (value: string) => {
|
|
649
|
+
if (!value || !/[!@#$%^&*(),.?":{}|<>]/.test(value)) {
|
|
650
|
+
return 'Le mot de passe pourrait être plus fort avec des caractères spéciaux'
|
|
651
|
+
}
|
|
652
|
+
return true
|
|
653
|
+
},
|
|
654
|
+
fieldIdentifier: 'password',
|
|
655
|
+
},
|
|
656
|
+
},
|
|
657
|
+
]
|
|
658
|
+
|
|
659
|
+
const customSuccessRules = [
|
|
660
|
+
{
|
|
661
|
+
type: 'custom',
|
|
662
|
+
options: {
|
|
663
|
+
validate: (value: string) => {
|
|
664
|
+
if (value && value.length >= 12
|
|
665
|
+
&& /[A-Z]/.test(value)
|
|
666
|
+
&& /[0-9]/.test(value)
|
|
667
|
+
&& /[!@#$%^&*(),.?":{}|<>]/.test(value)) {
|
|
668
|
+
return true
|
|
669
|
+
}
|
|
670
|
+
return 'Pas encore un mot de passe fort'
|
|
671
|
+
},
|
|
672
|
+
successMessage: 'Mot de passe très sécurisé !',
|
|
673
|
+
fieldIdentifier: 'password',
|
|
674
|
+
},
|
|
675
|
+
},
|
|
676
|
+
]
|
|
677
|
+
|
|
678
|
+
return { args, password, customRules, customWarningRules, customSuccessRules }
|
|
679
|
+
},
|
|
680
|
+
template: `
|
|
681
|
+
<div>
|
|
682
|
+
<p class="mb-2">Entrez un mot de passe pour voir les différents types de validation :</p>
|
|
683
|
+
<PasswordField
|
|
684
|
+
v-model="password"
|
|
685
|
+
:variant-style="args.variantStyle"
|
|
686
|
+
:color="args.color"
|
|
687
|
+
label="Mot de passe"
|
|
688
|
+
:required="true"
|
|
689
|
+
:custom-rules="customRules"
|
|
690
|
+
:custom-warning-rules="customWarningRules"
|
|
691
|
+
:custom-success-rules="customSuccessRules"
|
|
692
|
+
:show-success-messages="true"
|
|
693
|
+
:display-asterisk="true"
|
|
694
|
+
:is-validate-on-blur="false"
|
|
695
|
+
/>
|
|
696
|
+
<div class="mt-4">
|
|
697
|
+
<p><strong>Conseils pour tester :</strong></p>
|
|
698
|
+
<ul>
|
|
699
|
+
<li>Laissez le champ vide pour voir l'erreur de champ requis</li>
|
|
700
|
+
<li>Entrez moins de 8 caractères pour voir l'erreur de longueur</li>
|
|
701
|
+
<li>Entrez un mot de passe sans caractères spéciaux pour voir l'avertissement</li>
|
|
702
|
+
<li>Entrez un mot de passe fort (12+ caractères avec majuscules, chiffres et caractères spéciaux) pour voir le message de succès</li>
|
|
703
|
+
</ul>
|
|
704
|
+
</div>
|
|
705
|
+
</div>
|
|
706
|
+
`,
|
|
707
|
+
}),
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
/**
|
|
711
|
+
* Champ de mot de passe avec règles de validation personnalisées.
|
|
712
|
+
*/
|
|
713
|
+
export const WithCustomRules: Story = {
|
|
714
|
+
parameters: {
|
|
715
|
+
sourceCode: [
|
|
716
|
+
{
|
|
717
|
+
name: 'Template',
|
|
718
|
+
code: `
|
|
719
|
+
<template>
|
|
720
|
+
<PasswordField
|
|
721
|
+
v-model="password"
|
|
722
|
+
label="Mot de passe"
|
|
723
|
+
:custom-rules="customRules"
|
|
724
|
+
/>
|
|
725
|
+
</template>
|
|
726
|
+
`,
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
name: 'Script',
|
|
730
|
+
code: `
|
|
731
|
+
<script setup lang="ts">
|
|
732
|
+
import { ref } from 'vue'
|
|
733
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
734
|
+
|
|
735
|
+
const password = ref('')
|
|
736
|
+
|
|
737
|
+
// Règles personnalisées pour la validation du mot de passe
|
|
738
|
+
const customRules = [
|
|
739
|
+
{
|
|
740
|
+
type: 'custom',
|
|
741
|
+
options: {
|
|
742
|
+
validate: (value: string) => {
|
|
743
|
+
if (!value || value.length < 8) {
|
|
744
|
+
return 'Le mot de passe doit contenir au moins 8 caractères'
|
|
745
|
+
}
|
|
746
|
+
return true
|
|
747
|
+
},
|
|
748
|
+
fieldIdentifier: 'password',
|
|
749
|
+
},
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
type: 'custom',
|
|
753
|
+
options: {
|
|
754
|
+
validate: (value: string) => {
|
|
755
|
+
if (!value || !/[A-Z]/.test(value)) {
|
|
756
|
+
return 'Le mot de passe doit contenir au moins une lettre majuscule'
|
|
757
|
+
}
|
|
758
|
+
return true
|
|
759
|
+
},
|
|
760
|
+
fieldIdentifier: 'password',
|
|
761
|
+
},
|
|
762
|
+
},
|
|
763
|
+
{
|
|
764
|
+
type: 'custom',
|
|
765
|
+
options: {
|
|
766
|
+
validate: (value: string) => {
|
|
767
|
+
if (!value || !/[0-9]/.test(value)) {
|
|
768
|
+
return 'Le mot de passe doit contenir au moins un chiffre'
|
|
769
|
+
}
|
|
770
|
+
return true
|
|
771
|
+
},
|
|
772
|
+
fieldIdentifier: 'password',
|
|
773
|
+
},
|
|
774
|
+
},
|
|
775
|
+
]
|
|
776
|
+
</script>
|
|
777
|
+
`,
|
|
210
778
|
},
|
|
211
779
|
],
|
|
212
780
|
},
|
|
781
|
+
render: args => ({
|
|
782
|
+
components: { PasswordField },
|
|
783
|
+
setup() {
|
|
784
|
+
const password = ref(args.modelValue)
|
|
785
|
+
|
|
786
|
+
// Règles personnalisées pour la validation du mot de passe
|
|
787
|
+
const customRules = [
|
|
788
|
+
{
|
|
789
|
+
type: 'custom',
|
|
790
|
+
options: {
|
|
791
|
+
validate: (value: string) => {
|
|
792
|
+
if (!value || value.length < 8) {
|
|
793
|
+
return 'Le mot de passe doit contenir au moins 8 caractères'
|
|
794
|
+
}
|
|
795
|
+
return true
|
|
796
|
+
},
|
|
797
|
+
fieldIdentifier: 'password',
|
|
798
|
+
},
|
|
799
|
+
},
|
|
800
|
+
{
|
|
801
|
+
type: 'custom',
|
|
802
|
+
options: {
|
|
803
|
+
validate: (value: string) => {
|
|
804
|
+
if (!value || !/[A-Z]/.test(value)) {
|
|
805
|
+
return 'Le mot de passe doit contenir au moins une lettre majuscule'
|
|
806
|
+
}
|
|
807
|
+
return true
|
|
808
|
+
},
|
|
809
|
+
fieldIdentifier: 'password',
|
|
810
|
+
},
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
type: 'custom',
|
|
814
|
+
options: {
|
|
815
|
+
validate: (value: string) => {
|
|
816
|
+
if (!value || !/[0-9]/.test(value)) {
|
|
817
|
+
return 'Le mot de passe doit contenir au moins un chiffre'
|
|
818
|
+
}
|
|
819
|
+
return true
|
|
820
|
+
},
|
|
821
|
+
fieldIdentifier: 'password',
|
|
822
|
+
},
|
|
823
|
+
},
|
|
824
|
+
]
|
|
825
|
+
|
|
826
|
+
return { args, password, customRules }
|
|
827
|
+
},
|
|
828
|
+
template: `
|
|
829
|
+
<PasswordField
|
|
830
|
+
v-model="password"
|
|
831
|
+
:variant-style="args.variantStyle"
|
|
832
|
+
:color="args.color"
|
|
833
|
+
:label="args.label"
|
|
834
|
+
:required="args.required"
|
|
835
|
+
:is-read-only="args.isReadOnly"
|
|
836
|
+
:is-disabled="args.isDisabled"
|
|
837
|
+
:placeholder="args.placeholder"
|
|
838
|
+
:custom-rules="customRules"
|
|
839
|
+
:show-success-messages="args.showSuccessMessages"
|
|
840
|
+
:display-asterisk="args.displayAsterisk"
|
|
841
|
+
:is-validate-on-blur="args.isValidateOnBlur"
|
|
842
|
+
/>
|
|
843
|
+
`,
|
|
844
|
+
}),
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
/**
|
|
848
|
+
* Démonstration de la validation de formulaire avec la méthode validateOnSubmit.
|
|
849
|
+
*/
|
|
850
|
+
export const WithFormValidation: Story = {
|
|
851
|
+
parameters: {
|
|
852
|
+
sourceCode: [
|
|
853
|
+
{
|
|
854
|
+
name: 'Template',
|
|
855
|
+
code: `
|
|
856
|
+
<template>
|
|
857
|
+
<form @submit.prevent="handleSubmit">
|
|
858
|
+
<PasswordField
|
|
859
|
+
ref="passwordFieldRef"
|
|
860
|
+
v-model="password"
|
|
861
|
+
label="Mot de passe"
|
|
862
|
+
:required="true"
|
|
863
|
+
:custom-rules="customRules"
|
|
864
|
+
:display-asterisk="true"
|
|
865
|
+
:is-validate-on-blur="false"
|
|
866
|
+
/>
|
|
867
|
+
<button
|
|
868
|
+
type="submit"
|
|
869
|
+
class="mt-4 px-4 py-2 bg-primary text-white rounded"
|
|
870
|
+
>
|
|
871
|
+
Valider
|
|
872
|
+
</button>
|
|
873
|
+
</form>
|
|
874
|
+
<div v-if="formStatus" class="mt-4 p-4 rounded" :class="formStatus.includes('succès') ? 'bg-success-lighten5' : 'bg-error-lighten5'">
|
|
875
|
+
{{ formStatus }}
|
|
876
|
+
</div>
|
|
877
|
+
</template>
|
|
878
|
+
`,
|
|
879
|
+
},
|
|
880
|
+
{
|
|
881
|
+
name: 'Script',
|
|
882
|
+
code: `
|
|
883
|
+
<script setup lang="ts">
|
|
884
|
+
import { ref } from 'vue'
|
|
885
|
+
import { PasswordField } from '@cnamts/synapse'
|
|
886
|
+
|
|
887
|
+
const password = ref('')
|
|
888
|
+
const passwordFieldRef = ref(null)
|
|
889
|
+
const formStatus = ref('')
|
|
890
|
+
|
|
891
|
+
// Règles personnalisées pour la validation du mot de passe
|
|
892
|
+
const customRules = [
|
|
893
|
+
{
|
|
894
|
+
type: 'custom',
|
|
895
|
+
options: {
|
|
896
|
+
validate: (value: string) => {
|
|
897
|
+
if (!value || value.length < 8) {
|
|
898
|
+
return 'Le mot de passe doit contenir au moins 8 caractères'
|
|
899
|
+
}
|
|
900
|
+
return true
|
|
901
|
+
},
|
|
902
|
+
fieldIdentifier: 'password',
|
|
903
|
+
},
|
|
904
|
+
},
|
|
905
|
+
{
|
|
906
|
+
type: 'custom',
|
|
907
|
+
options: {
|
|
908
|
+
validate: (value: string) => {
|
|
909
|
+
if (!value || !/[A-Z]/.test(value)) {
|
|
910
|
+
return 'Le mot de passe doit contenir au moins une lettre majuscule'
|
|
911
|
+
}
|
|
912
|
+
return true
|
|
913
|
+
},
|
|
914
|
+
fieldIdentifier: 'password',
|
|
915
|
+
},
|
|
916
|
+
},
|
|
917
|
+
]
|
|
918
|
+
|
|
919
|
+
// Fonction de soumission du formulaire
|
|
920
|
+
const handleSubmit = () => {
|
|
921
|
+
if (passwordFieldRef.value) {
|
|
922
|
+
const isValid = passwordFieldRef.value.validateOnSubmit()
|
|
923
|
+
if (isValid) {
|
|
924
|
+
formStatus.value = 'Formulaire soumis avec succès !'
|
|
925
|
+
} else {
|
|
926
|
+
formStatus.value = 'Erreur de validation, veuillez corriger les champs'
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
</script>
|
|
931
|
+
`,
|
|
932
|
+
},
|
|
933
|
+
],
|
|
934
|
+
},
|
|
935
|
+
render: args => ({
|
|
936
|
+
components: { PasswordField },
|
|
937
|
+
setup() {
|
|
938
|
+
const password = ref('')
|
|
939
|
+
const passwordFieldRef = ref<InstanceType<typeof PasswordField> | null>(null)
|
|
940
|
+
const formStatus = ref('')
|
|
941
|
+
|
|
942
|
+
// Règles personnalisées pour la validation du mot de passe
|
|
943
|
+
const customRules = [
|
|
944
|
+
{
|
|
945
|
+
type: 'custom',
|
|
946
|
+
options: {
|
|
947
|
+
validate: (value: string) => {
|
|
948
|
+
if (!value || value.length < 8) {
|
|
949
|
+
return 'Le mot de passe doit contenir au moins 8 caractères'
|
|
950
|
+
}
|
|
951
|
+
return true
|
|
952
|
+
},
|
|
953
|
+
fieldIdentifier: 'password',
|
|
954
|
+
},
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
type: 'custom',
|
|
958
|
+
options: {
|
|
959
|
+
validate: (value: string) => {
|
|
960
|
+
if (!value || !/[A-Z]/.test(value)) {
|
|
961
|
+
return 'Le mot de passe doit contenir au moins une lettre majuscule'
|
|
962
|
+
}
|
|
963
|
+
return true
|
|
964
|
+
},
|
|
965
|
+
fieldIdentifier: 'password',
|
|
966
|
+
},
|
|
967
|
+
},
|
|
968
|
+
]
|
|
969
|
+
|
|
970
|
+
// Fonction de soumission du formulaire
|
|
971
|
+
const handleSubmit = () => {
|
|
972
|
+
if (passwordFieldRef.value) {
|
|
973
|
+
const isValid = passwordFieldRef.value.validateOnSubmit()
|
|
974
|
+
if (isValid) {
|
|
975
|
+
formStatus.value = 'Formulaire soumis avec succès !'
|
|
976
|
+
}
|
|
977
|
+
else {
|
|
978
|
+
formStatus.value = 'Erreur de validation, veuillez corriger les champs'
|
|
979
|
+
}
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
return { args, password, passwordFieldRef, customRules, handleSubmit, formStatus }
|
|
984
|
+
},
|
|
985
|
+
template: `
|
|
986
|
+
<div>
|
|
987
|
+
<form @submit.prevent="handleSubmit" class="mb-4">
|
|
988
|
+
<PasswordField
|
|
989
|
+
ref="passwordFieldRef"
|
|
990
|
+
v-model="password"
|
|
991
|
+
:variant-style="args.variantStyle"
|
|
992
|
+
:color="args.color"
|
|
993
|
+
label="Mot de passe"
|
|
994
|
+
:required="true"
|
|
995
|
+
:custom-rules="customRules"
|
|
996
|
+
:display-asterisk="true"
|
|
997
|
+
:is-validate-on-blur="false"
|
|
998
|
+
/>
|
|
999
|
+
<button
|
|
1000
|
+
type="submit"
|
|
1001
|
+
class="mt-4 px-4 py-2 bg-primary text-white rounded"
|
|
1002
|
+
>
|
|
1003
|
+
Valider
|
|
1004
|
+
</button>
|
|
1005
|
+
</form>
|
|
1006
|
+
<div v-if="formStatus" class="mt-4 p-4 rounded" :class="formStatus.includes('succès') ? 'bg-success-lighten5' : 'bg-error-lighten5'">
|
|
1007
|
+
{{ formStatus }}
|
|
1008
|
+
</div>
|
|
1009
|
+
<div class="mt-4">
|
|
1010
|
+
<p><strong>Instructions :</strong></p>
|
|
1011
|
+
<p>Ce formulaire utilise la méthode <code>validateOnSubmit()</code> pour valider le champ lors de la soumission.</p>
|
|
1012
|
+
<p>La validation ne se fait pas à la perte de focus (<code>isValidateOnBlur="false"</code>) mais uniquement lors du clic sur le bouton.</p>
|
|
1013
|
+
</div>
|
|
1014
|
+
</div>
|
|
1015
|
+
`,
|
|
1016
|
+
}),
|
|
213
1017
|
}
|