@cnamts/synapse 1.0.22 → 1.0.23

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.
Files changed (190) hide show
  1. package/dist/{DateFilter-B5n-ZkLi.js → DateFilter-Dc-gSGwk.js} +1 -1
  2. package/dist/{NumberFilter-CtiZ9uj8.js → NumberFilter-vP38Wp6j.js} +1 -1
  3. package/dist/{PeriodFilter-DzqiMb-b.js → PeriodFilter-Ba1uYUnT.js} +1 -1
  4. package/dist/{SelectFilter-BOYlF7rX.js → SelectFilter-BioGT6Nn.js} +1 -1
  5. package/dist/{TextFilter-BOFRNfcX.js → TextFilter-B84dpnoq.js} +1 -1
  6. package/dist/components/Accordion/Accordion.d.ts +13 -2
  7. package/dist/components/Accordion/composables/useAccordionState.d.ts +2 -1
  8. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +7 -7
  9. package/dist/components/Amelipro/AmeliproCheckbox/AmeliproCheckbox.d.ts +1 -1
  10. package/dist/components/Amelipro/AmeliproCustomSelector/AmeliproCustomSelector.d.ts +1 -1
  11. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +1 -1
  12. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +7 -7
  13. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +16 -16
  14. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +1 -1
  15. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +1 -1
  16. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +22 -1
  17. package/dist/components/Customs/Selects/SyAutocomplete/locales.d.ts +5 -0
  18. package/dist/components/Customs/Selects/SyInputSelect/SyInputSelect.d.ts +1 -1
  19. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +1 -1
  20. package/dist/components/Customs/Selects/SySelect/locales.d.ts +1 -0
  21. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +1 -1
  22. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +1 -1
  23. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +1 -1
  24. package/dist/components/Customs/SyTextField/SyTextField.d.ts +5 -2
  25. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +13 -9
  26. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +7 -5
  27. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +2 -1
  28. package/dist/components/ErrorPage/ErrorPage.d.ts +3 -1
  29. package/dist/components/FileList/UploadItem/UploadItem.d.ts +6 -0
  30. package/dist/components/FileList/UploadItem/locales.d.ts +1 -4
  31. package/dist/components/FileUpload/FileUploadContent.d.ts +2 -0
  32. package/dist/components/FileUpload/validateFiles.d.ts +2 -1
  33. package/dist/components/HeaderBar/HeaderBar.d.ts +2 -1
  34. package/dist/components/HeaderBar/HeaderLogo/HeaderLogo.d.ts +2 -1
  35. package/dist/components/HeaderNavigationBar/HeaderNavigationBar.d.ts +2 -1
  36. package/dist/components/MonthPicker/MonthPicker.d.ts +1939 -0
  37. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +1899 -0
  38. package/dist/components/MonthPicker/MonthPickerText/useTextField.d.ts +21 -0
  39. package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.d.ts +21 -0
  40. package/dist/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.d.ts +12 -0
  41. package/dist/components/MonthPicker/MonthPickerVisual/MonthSelector.d.ts +11 -0
  42. package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.d.ts +6 -0
  43. package/dist/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.d.ts +14 -0
  44. package/dist/components/MonthPicker/MonthPickerVisual/YearSelector.d.ts +14 -0
  45. package/dist/components/MonthPicker/MonthPickerVisual/useMonthGrid.d.ts +9 -0
  46. package/dist/components/MonthPicker/MonthPickerVisual/useYearGrid.d.ts +8 -0
  47. package/dist/components/MonthPicker/MonthPickerVisual/utils.d.ts +8 -0
  48. package/dist/components/MonthPicker/locales.d.ts +12 -0
  49. package/dist/components/MonthPicker/useMonthPickerValidation.d.ts +25 -0
  50. package/dist/components/NirField/NirField.d.ts +3 -1
  51. package/dist/components/NotificationBar/Notification/Notification.d.ts +3 -0
  52. package/dist/components/PasswordField/PasswordField.d.ts +1 -1
  53. package/dist/components/PeriodField/PeriodField.d.ts +29 -21
  54. package/dist/components/PhoneField/PhoneField.d.ts +2 -1
  55. package/dist/components/SyBtnMenu/SyBtnMenu.d.ts +1 -1
  56. package/dist/components/SyHeading/SyHeading.a11y.test.d.ts +1 -0
  57. package/dist/components/SyHeading/SyHeading.d.ts +4 -2
  58. package/dist/components/SyHeading/SyHeading.test.d.ts +1 -0
  59. package/dist/components/SyTextArea/SyTextArea.d.ts +1 -1
  60. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +4 -4
  61. package/dist/components/Tables/SyTable/SyTable.d.ts +4 -4
  62. package/dist/components/Tables/common/SyTablePagination.d.ts +6 -6
  63. package/dist/components/index.d.ts +1 -0
  64. package/dist/design-system-v3.js +102 -99
  65. package/dist/design-system-v3.umd.cjs +126 -126
  66. package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +5 -0
  67. package/dist/{main-CEl4J8_T.js → main-aLKwdMi1.js} +11167 -10522
  68. package/dist/main.d.ts +1 -0
  69. package/dist/style.css +1 -1
  70. package/package.json +10 -4
  71. package/src/assets/apTokens.scss +2 -2
  72. package/src/assets/overrides/_btns.scss +8 -0
  73. package/src/assets/overrides/_forms.scss +9 -0
  74. package/src/assets/overrides/_icons.scss +38 -9
  75. package/src/assets/overrides/_tables.scss +19 -0
  76. package/src/components/Accordion/Accordion.mdx +23 -9
  77. package/src/components/Accordion/Accordion.stories.ts +153 -3
  78. package/src/components/Accordion/Accordion.vue +7 -6
  79. package/src/components/Accordion/composables/__tests__/useAccordionState.spec.ts +40 -12
  80. package/src/components/Accordion/composables/useAccordionState.ts +3 -4
  81. package/src/components/Accordion/tests/accordion.spec.ts +131 -19
  82. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.mdx +3 -1
  83. package/src/components/Amelipro/AmeliproPagination/AmeliproPagination.stories.ts +8 -0
  84. package/src/components/BackBtn/accessibilite/Accessibility.mdx +62 -10
  85. package/src/components/BackToTopBtn/BackToTopBtn.stories.ts +9 -3
  86. package/src/components/BackToTopBtn/accessibilite/Accessibility.mdx +86 -6
  87. package/src/components/Captcha/tests/Captcha.spec.ts +0 -29
  88. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +2 -110
  89. package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +133 -10
  90. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +379 -93
  91. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +144 -83
  92. package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibilite.stories.ts +40 -1
  93. package/src/components/Customs/Selects/SyAutocomplete/accessibilite/Accessibility.mdx +7 -1
  94. package/src/components/Customs/Selects/SyAutocomplete/locales.ts +5 -0
  95. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +96 -0
  96. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +234 -9
  97. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +13 -3
  98. package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +9 -10
  99. package/src/components/Customs/Selects/SySelect/SySelect.vue +46 -3
  100. package/src/components/Customs/Selects/SySelect/locales.ts +1 -0
  101. package/src/components/Customs/SyIcon/SyIcon.vue +1 -1
  102. package/src/components/Customs/SyIcon/tests/SyIcon.a11y.spec.ts +20 -0
  103. package/src/components/Customs/SyIconButton/SyIconButton.mdx +46 -0
  104. package/src/components/Customs/SyIconButton/SyIconButton.stories.ts +184 -0
  105. package/src/components/Customs/SyIconButton/SyIconButton.vue +38 -0
  106. package/src/components/Customs/SyIconButton/accessibilite/Accessibility.mdx +64 -0
  107. package/src/components/Customs/SyIconButton/tests/SyIconButton.a11y.spec.ts +87 -0
  108. package/src/components/Customs/SyIconButton/tests/SyIconButton.spec.ts +152 -0
  109. package/src/components/Customs/SyIconButton/tests/__snapshots__/SyIconButton.spec.ts.snap +61 -0
  110. package/src/components/Customs/SyPagination/SyPagination.vue +5 -5
  111. package/src/components/Customs/SyTextField/SyTextField.vue +20 -2
  112. package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +67 -9
  113. package/src/components/Customs/SyTextField/tests/SyTextField.a11y.spec.ts +15 -0
  114. package/src/components/Customs/SyTextField/tests/SyTextField.spec.ts +36 -0
  115. package/src/components/DataList/accessibilite/Accessibility.mdx +79 -11
  116. package/src/components/DataListGroup/accessibilite/Accessibility.mdx +80 -11
  117. package/src/components/DownloadBtn/tests/DownloadBtn.a11y.spec.ts +25 -0
  118. package/src/components/ErrorPage/ErrorPage.stories.ts +113 -19
  119. package/src/components/ErrorPage/ErrorPage.vue +17 -2
  120. package/src/components/ErrorPage/tests/ErrorPage.a11y.spec.ts +17 -0
  121. package/src/components/ErrorPage/tests/ErrorPage.spec.ts +21 -1
  122. package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +0 -1
  123. package/src/components/ExternalLinks/tests/ExternalLinks.a11y.spec.ts +23 -0
  124. package/src/components/FileList/FileList.stories.ts +51 -1
  125. package/src/components/FileList/UploadItem/UploadItem.vue +13 -6
  126. package/src/components/FileList/UploadItem/locales.ts +3 -12
  127. package/src/components/FileList/accessibilite/Accessibility.mdx +3 -0
  128. package/src/components/FileUpload/FileUpload.vue +2 -1
  129. package/src/components/FileUpload/FileUploadContent.vue +2 -1
  130. package/src/components/FileUpload/tests/FileUpload.spec.ts +47 -0
  131. package/src/components/FileUpload/validateFiles.ts +5 -2
  132. package/src/components/FranceConnectBtn/accessibilite/Accessibility.mdx +62 -9
  133. package/src/components/HeaderBar/HeaderBar.vue +2 -1
  134. package/src/components/HeaderBar/HeaderLogo/HeaderLogo.vue +2 -1
  135. package/src/components/HeaderNavigationBar/HeaderNavigationBar.vue +2 -1
  136. package/src/components/LunarCalendar/accessibilite/Accessibility.mdx +74 -8
  137. package/src/components/LunarCalendar/tests/LunarCalendar.a11y.spec.ts +163 -0
  138. package/src/components/MaintenancePage/MaintenancePage.vue +1 -1
  139. package/src/components/MaintenancePage/tests/MaintenancePage.spec.ts +4 -5
  140. package/src/components/MaintenancePage/tests/__snapshots__/MaintenancePage.spec.ts.snap +0 -1
  141. package/src/components/MonthPicker/MonthPicker.mdx +35 -0
  142. package/src/components/MonthPicker/MonthPicker.stories.ts +527 -0
  143. package/src/components/MonthPicker/MonthPicker.vue +79 -0
  144. package/src/components/MonthPicker/MonthPickerText/MonthPickerInput.vue +89 -0
  145. package/src/components/MonthPicker/MonthPickerText/useTextField.ts +27 -0
  146. package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisual.vue +154 -0
  147. package/src/components/MonthPicker/MonthPickerVisual/MonthPickerVisualProps.ts +13 -0
  148. package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +137 -0
  149. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +60 -0
  150. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +149 -0
  151. package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +143 -0
  152. package/src/components/MonthPicker/MonthPickerVisual/useMonthGrid.ts +45 -0
  153. package/src/components/MonthPicker/MonthPickerVisual/useYearGrid.ts +45 -0
  154. package/src/components/MonthPicker/MonthPickerVisual/utils.ts +17 -0
  155. package/src/components/MonthPicker/accessibilite/Accessibility.mdx +59 -0
  156. package/src/components/MonthPicker/locales.ts +12 -0
  157. package/src/components/MonthPicker/tests/MonthPicker.a11y.spec.ts +71 -0
  158. package/src/components/MonthPicker/tests/MonthPicker.spec.ts +1248 -0
  159. package/src/components/MonthPicker/tests/__snapshots__/MonthPicker.spec.ts.snap +2545 -0
  160. package/src/components/MonthPicker/useMonthPickerValidation.ts +30 -0
  161. package/src/components/NirField/NirField.mdx +1 -2
  162. package/src/components/NirField/NirField.stories.ts +66 -6
  163. package/src/components/NotFoundPage/tests/NotFoundPage.spec.ts +2 -3
  164. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +22 -14
  165. package/src/components/NotificationBar/Notification/Notification.vue +3 -1
  166. package/src/components/NotificationBar/NotificationBar.stories.ts +154 -0
  167. package/src/components/NotificationBar/tests/NotificationBar.a11y.spec.ts +26 -0
  168. package/src/components/NotificationBar/tests/NotificationBar.spec.ts +60 -0
  169. package/src/components/RangeField/accessibilite/Accessibility.mdx +79 -11
  170. package/src/components/SkipLink/tests/SkipLink.a11y.spec.ts +23 -0
  171. package/src/components/StatusPage/StatusPage.stories.ts +118 -0
  172. package/src/components/StatusPage/StatusPage.vue +5 -3
  173. package/src/components/StatusPage/tests/StatusPage.a11y.spec.ts +22 -0
  174. package/src/components/StatusPage/tests/StatusPage.spec.ts +22 -0
  175. package/src/components/StatusPage/tests/__snapshots__/StatusPage.spec.ts.snap +22 -14
  176. package/src/components/SubHeader/tests/SubHeader.a11y.spec.ts +20 -0
  177. package/src/components/SyAlert/SyAlert.vue +1 -0
  178. package/src/components/SyAlert/accessibilite/Accessibility.mdx +79 -9
  179. package/src/components/SyAlert/tests/SyAlert.a11y.spec.ts +23 -0
  180. package/src/components/SyHeading/SyHeading.a11y.test.ts +149 -0
  181. package/src/components/SyHeading/SyHeading.test.ts +115 -0
  182. package/src/components/SyHeading/SyHeading.vue +5 -3
  183. package/src/components/SyTextArea/accessibilite/Accessibility.mdx +80 -8
  184. package/src/components/SyTextArea/tests/SyTextArea.a11y.spec.ts +151 -0
  185. package/src/components/ToolbarContainer/tests/ToolbarContainer.a11y.spec.ts +126 -0
  186. package/src/components/UploadWorkflow/tests/__snapshots__/UploadWorkflow.spec.ts.snap +2 -2
  187. package/src/components/index.ts +1 -0
  188. package/src/composables/useFormFieldErrorHandling.ts +11 -2
  189. package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -1
  190. package/src/main.ts +2 -0
@@ -14,135 +14,150 @@ const meta: Meta<typeof SyAutocomplete> = {
14
14
  controls: { exclude: ['selectedValue', 'isOpen', 'closeList'] },
15
15
  docs: { page: AccessibilityDocs },
16
16
  },
17
+ args: {
18
+ 'onUpdate:modelValue': fn(),
19
+ },
17
20
  argTypes: {
18
- bgColor: {
21
+ 'bgColor': {
19
22
  control: 'text',
20
23
  description: 'Couleur de fond du champ',
21
24
  },
22
- chips: {
25
+ 'chips': {
23
26
  control: 'boolean',
24
27
  description: 'Affiche les options sélectionnées sous forme de chips',
25
28
  },
26
- clearable: {
29
+ 'clearable': {
27
30
  control: 'boolean',
28
31
  description: 'Permet de vider la sélection',
29
32
  },
30
- customRules: {
33
+ 'customRules': {
31
34
  control: 'object',
32
35
  description: 'Règles de validation personnalisées',
33
36
  },
34
- customSuccessRules: {
37
+ 'customSuccessRules': {
35
38
  control: 'object',
36
39
  description: 'Règles de succès personnalisées',
37
40
  },
38
- customWarningRules: {
41
+ 'customWarningRules': {
39
42
  control: 'object',
40
43
  description: 'Règles d\'avertissement personnalisées',
41
44
  },
42
- debounce: {
45
+ 'debounce': {
43
46
  control: 'number',
44
47
  description: 'Délai en millisecondes avant le filtrage (défaut: 200)',
45
48
  },
46
- density: {
49
+ 'density': {
47
50
  control: 'select',
48
51
  options: ['default', 'comfortable', 'compact'],
49
52
  description: 'Définit la densité du champ',
50
53
  },
51
- disableErrorHandling: {
54
+ 'disableErrorHandling': {
52
55
  control: 'boolean',
53
56
  description: 'Désactive la gestion des erreurs',
54
57
  },
55
- displayAsterisk: {
58
+ 'displayAsterisk': {
56
59
  control: 'boolean',
57
60
  description: 'Affiche un astérisque pour les champs obligatoires',
58
61
  },
59
- errorMessages: {
62
+ 'errorMessages': {
60
63
  control: 'object',
61
64
  description: 'Messages d\'erreur personnalisés',
62
65
  },
63
- filter: {
66
+ 'filter': {
64
67
  control: 'boolean',
65
68
  description: 'Active le filtrage des options basé sur la saisie',
66
69
  },
67
- hasError: {
70
+ 'hasError': {
68
71
  control: 'boolean',
69
72
  description: 'Indique si le champ a une erreur',
70
73
  },
71
- hasSuccess: {
74
+ 'hasSuccess': {
72
75
  control: 'boolean',
73
76
  description: 'Indique si le champ est en succès',
74
77
  },
75
- hasWarning: {
78
+ 'hasWarning': {
76
79
  control: 'boolean',
77
80
  description: 'Indique si le champ a un avertissement',
78
81
  },
79
- hideNoData: {
82
+ 'hideNoData': {
80
83
  control: 'boolean',
81
84
  description: 'Cache le message "aucune option" quand la liste est vide',
82
85
  },
83
- isValidateOnBlur: {
86
+ 'isValidateOnBlur': {
84
87
  control: 'boolean',
85
88
  description: 'Valide le champ à la perte de focus',
86
89
  },
87
- items: { control: 'object' },
88
- label: {
90
+ 'items': { control: 'object' },
91
+ 'label': {
89
92
  control: 'text',
90
93
  description: 'Libellé du champ',
91
94
  },
92
- loading: {
95
+ 'loading': {
93
96
  control: 'boolean',
94
97
  description: 'Affiche un indicateur de chargement',
95
98
  },
96
- menuId: {
99
+ 'menuId': {
97
100
  control: 'text',
98
101
  description: 'ID personnalisé pour le menu',
99
102
  },
100
- modelValue: { control: 'text' },
101
- multiple: {
103
+ 'modelValue': { control: 'text' },
104
+ 'multiple': {
102
105
  control: 'boolean',
103
106
  description: 'Permet la sélection multiple d\'options',
104
107
  },
105
- noDataText: {
108
+ 'noDataText': {
106
109
  control: 'text',
107
110
  description: 'Texte affiché quand aucune option n\'est disponible',
108
111
  },
109
- placeholder: {
112
+ 'placeholder': {
110
113
  control: 'text',
111
114
  description: 'Texte d\'indice affiché quand le champ est vide',
112
115
  },
113
- plainTextKey: {
116
+ 'plainTextKey': {
114
117
  control: 'text',
115
118
  description: 'Nom de la propriété pour le texte brut de filtrage',
116
119
  },
117
- readonly: {
120
+ 'onSearch': {
121
+ action: 'search',
122
+ description: 'Émis à chaque frappe dans le champ. Reçoit la valeur saisie en paramètre. Utile pour déclencher des recherches asynchrones.',
123
+ },
124
+ 'onUpdate:modelValue': {
125
+ action: 'update:modelValue',
126
+ description: 'Émis lors de la sélection d\'une option. Reçoit la valeur sélectionnée.',
127
+ },
128
+ 'readonly': {
118
129
  control: 'boolean',
119
130
  description: 'Rend le champ en lecture seule',
120
131
  },
121
- required: {
132
+ 'required': {
122
133
  control: 'boolean',
123
134
  description: 'Marque le champ comme obligatoire',
124
135
  },
125
- returnObject: {
136
+ 'returnObject': {
126
137
  control: 'boolean',
127
138
  description: 'Retourne l\'objet complet sélectionné',
128
139
  },
129
- showSuccessMessages: {
140
+ 'showSuccessMessages': {
130
141
  control: 'boolean',
131
142
  description: 'Affiche les messages de succès',
132
143
  },
133
- successMessages: {
144
+ 'successMessages': {
134
145
  control: 'object',
135
146
  description: 'Messages de succès personnalisés',
136
147
  },
137
- textKey: {
148
+ 'textKey': {
138
149
  control: 'text',
139
150
  description: 'Nom de la propriété qui contient le texte à afficher',
140
151
  },
141
- valueKey: {
152
+ 'valueKey': {
142
153
  control: 'text',
143
154
  description: 'Nom de la propriété qui contient la valeur à retourner',
144
155
  },
145
- warningMessages: {
156
+ 'selectionText': {
157
+ control: false,
158
+ description: 'Fonction de personnalisation du texte affiché dans l\'input en mode multiple. Reçoit le tableau des valeurs sélectionnées et retourne une chaîne.',
159
+ },
160
+ 'warningMessages': {
146
161
  control: 'object',
147
162
  description: 'Messages d\'avertissement personnalisés',
148
163
  },
@@ -208,9 +223,8 @@ export const Default: Story = {
208
223
  ],
209
224
  },
210
225
  args: {
211
- 'items': sampleItems,
212
- 'label': 'Rechercher un prénom',
213
- 'onUpdate:modelValue': fn(),
226
+ items: sampleItems,
227
+ label: 'Rechercher un prénom',
214
228
  },
215
229
  render: (args) => {
216
230
  return {
@@ -285,15 +299,14 @@ const onSubmit = (event) => {
285
299
  ],
286
300
  },
287
301
  args: {
288
- 'items': [
302
+ items: [
289
303
  { text: 'Option 1', value: '1' },
290
304
  { text: 'Option 2', value: '2' },
291
305
  { text: 'Option 3', value: '3' },
292
306
  ],
293
- 'label': 'Recherche obligatoire',
294
- 'required': true,
295
- 'displayAsterisk': true,
296
- 'onUpdate:modelValue': fn(),
307
+ label: 'Recherche obligatoire',
308
+ required: true,
309
+ displayAsterisk: true,
297
310
  },
298
311
  render: (args) => {
299
312
  return {
@@ -379,12 +392,11 @@ const clearError = () => {
379
392
  ],
380
393
  },
381
394
  args: {
382
- 'items': [
395
+ items: [
383
396
  { text: 'Option 1', value: '1' },
384
397
  { text: 'Option 2', value: '2' },
385
398
  ],
386
- 'label': 'Erreur serveur',
387
- 'onUpdate:modelValue': fn(),
399
+ label: 'Erreur serveur',
388
400
  },
389
401
  render: (args) => {
390
402
  return {
@@ -426,12 +438,11 @@ export const WarningSuccessMessages: Story = {
426
438
  },
427
439
  },
428
440
  args: {
429
- 'items': [
441
+ items: [
430
442
  { text: 'Option 1', value: '1' },
431
443
  { text: 'Option 2', value: '2' },
432
444
  ],
433
- 'label': 'Avec warning & succès',
434
- 'onUpdate:modelValue': fn(),
445
+ label: 'Avec warning & succès',
435
446
  },
436
447
  render: (args) => {
437
448
  return {
@@ -520,18 +531,17 @@ const onSubmit = (event) => {
520
531
  ],
521
532
  },
522
533
  args: {
523
- 'items': [
534
+ items: [
524
535
  { label: 'Premier choix', id: '1' },
525
536
  { label: 'Deuxième choix', id: '2' },
526
537
  { label: 'Troisième choix', id: '3' },
527
538
  ],
528
- 'label': 'Objet complet',
529
- 'textKey': 'label',
530
- 'valueKey': 'id',
531
- 'returnObject': true,
532
- 'required': true,
533
- 'displayAsterisk': true,
534
- 'onUpdate:modelValue': fn(),
539
+ label: 'Objet complet',
540
+ textKey: 'label',
541
+ valueKey: 'id',
542
+ returnObject: true,
543
+ required: true,
544
+ displayAsterisk: true,
535
545
  },
536
546
  render: (args) => {
537
547
  return {
@@ -618,11 +628,10 @@ const items = [
618
628
  ],
619
629
  },
620
630
  args: {
621
- 'items': sampleItems,
622
- 'label': 'Sélectionner plusieurs prénoms',
623
- 'multiple': true,
624
- 'clearable': true,
625
- 'onUpdate:modelValue': fn(),
631
+ items: sampleItems,
632
+ label: 'Sélectionner plusieurs prénoms',
633
+ multiple: true,
634
+ clearable: true,
626
635
  },
627
636
  render: (args) => {
628
637
  return {
@@ -690,12 +699,11 @@ const items = [
690
699
  ],
691
700
  },
692
701
  args: {
693
- 'items': sampleItems.slice(0, 4),
694
- 'label': 'Prénoms sélectionnés',
695
- 'multiple': true,
696
- 'chips': true,
697
- 'clearable': true,
698
- 'onUpdate:modelValue': fn(),
702
+ items: sampleItems.slice(0, 4),
703
+ label: 'Prénoms sélectionnés',
704
+ multiple: true,
705
+ chips: true,
706
+ clearable: true,
699
707
  },
700
708
  render: (args) => {
701
709
  return {
@@ -716,12 +724,88 @@ const items = [
716
724
  },
717
725
  }
718
726
 
719
- export const LoadingState: Story = {
727
+ export const ChipsWithCustomSelectionText: Story = {
720
728
  parameters: {
729
+ docs: {
730
+ description: {
731
+ story: 'En mode multiple, `selectionText` permet d\'afficher un texte personnalisé dans l\'input à la place de la liste des éléments sélectionnés. Utile pour indiquer un nombre de sélections (ex : "3 colonnes sélectionnées") plutôt que d\'énumérer chaque valeur.',
732
+ },
733
+ },
734
+ sourceCode: [
735
+ {
736
+ name: 'Template',
737
+ code: `
738
+ <template>
739
+ <SyAutocomplete
740
+ v-model="selectedColumns"
741
+ :items="columns"
742
+ label="Colonnes affichées"
743
+ multiple
744
+ clearable
745
+ :selection-text="(selected) => \`\${selected.length} colonne\${selected.length > 1 ? 's' : ''} sélectionnée\${selected.length > 1 ? 's' : ''}\`"
746
+ />
747
+ <div class="mt-4">Valeurs : {{ selectedColumns }}</div>
748
+ </template>
749
+ `,
750
+ },
751
+ {
752
+ name: 'Script',
753
+ code: `
754
+ <script setup lang="ts">
755
+ import { ref } from 'vue'
756
+ import { SyAutocomplete } from '@cnamts/synapse'
757
+
758
+ const selectedColumns = ref([])
759
+ const columns = [
760
+ { text: 'Nom', value: 'name' },
761
+ { text: 'Prénom', value: 'firstname' },
762
+ { text: 'Date de naissance', value: 'birthdate' },
763
+ { text: 'Numéro de sécurité sociale', value: 'nss' },
764
+ { text: 'Adresse', value: 'address' },
765
+ ]
766
+ </script>
767
+ `,
768
+ },
769
+ ],
770
+ },
771
+ args: {
772
+ items: [
773
+ { text: 'Nom', value: 'name' },
774
+ { text: 'Prénom', value: 'firstname' },
775
+ { text: 'Date de naissance', value: 'birthdate' },
776
+ { text: 'Numéro de sécurité sociale', value: 'nss' },
777
+ { text: 'Adresse', value: 'address' },
778
+ ],
779
+ label: 'Colonnes affichées',
780
+ multiple: true,
781
+ clearable: true,
782
+ selectionText: (selected: unknown[]) => `${selected.length} colonne${selected.length > 1 ? 's' : ''} sélectionnée${selected.length > 1 ? 's' : ''}`,
783
+ },
784
+ render: (args) => {
785
+ return {
786
+ components: { SyAutocomplete },
787
+ setup() {
788
+ const selectedColumns = ref([])
789
+ return { args, selectedColumns }
790
+ },
791
+ template: `
792
+ <div class="pa-4">
793
+ <SyAutocomplete
794
+ v-model="selectedColumns"
795
+ v-bind="args"
796
+ />
797
+ <div class="mt-4">Valeurs : {{ selectedColumns }}</div>
798
+ </div>
799
+ `,
800
+ }
801
+ },
802
+ }
721
803
 
804
+ export const LoadingState: Story = {
805
+ parameters: {
722
806
  docs: {
723
807
  description: {
724
- story: 'État de chargement du composant SyAutocomplete.',
808
+ story: 'Simule un chargement asynchrone : au clic le dropdown s\'ouvre, le loader s\'active puis les résultats apparaissent.',
725
809
  },
726
810
  },
727
811
  sourceCode: [
@@ -734,6 +818,7 @@ export const LoadingState: Story = {
734
818
  :items="items"
735
819
  label="Recherche avec chargement"
736
820
  :loading="isLoading"
821
+ @click="loadOnClick"
737
822
  />
738
823
  </template>
739
824
  `,
@@ -746,37 +831,72 @@ import { ref } from 'vue'
746
831
  import { SyAutocomplete } from '@cnamts/synapse'
747
832
 
748
833
  const selectedValue = ref('')
749
- const isLoading = ref(true)
750
- const items = [
834
+ const isLoading = ref(false)
835
+ const items = ref([])
836
+ let timeout = null
837
+
838
+ const allItems = [
751
839
  { text: 'Option 1', value: '1' },
752
840
  { text: 'Option 2', value: '2' },
841
+ { text: 'Option 3', value: '3' },
842
+ { text: 'Option 4', value: '4' },
843
+ { text: 'Option 5', value: '5' },
753
844
  ]
845
+
846
+ const loadOnClick = () => {
847
+ isLoading.value = true
848
+ items.value = []
849
+ if (timeout) clearTimeout(timeout)
850
+ timeout = setTimeout(() => {
851
+ items.value = allItems
852
+ isLoading.value = false
853
+ }, 1000)
854
+ }
754
855
  </script>
755
856
  `,
756
857
  },
757
858
  ],
758
859
  },
759
860
  args: {
760
- 'items': [
761
- { text: 'Option 1', value: '1' },
762
- { text: 'Option 2', value: '2' },
763
- ],
764
- 'label': 'Recherche avec chargement',
765
- 'loading': true,
766
- 'onUpdate:modelValue': fn(),
861
+ label: 'Recherche avec chargement',
767
862
  },
768
863
  render: (args) => {
769
864
  return {
770
865
  components: { SyAutocomplete },
771
866
  setup() {
772
867
  const selectedValue = ref('')
773
- return { args, selectedValue }
868
+ const isLoading = ref(false)
869
+ const items = ref<{ text: string, value: string }[]>([])
870
+ let timeout: ReturnType<typeof setTimeout> | null = null
871
+
872
+ const allItems = [
873
+ { text: 'Option 1', value: '1' },
874
+ { text: 'Option 2', value: '2' },
875
+ { text: 'Option 3', value: '3' },
876
+ { text: 'Option 4', value: '4' },
877
+ { text: 'Option 5', value: '5' },
878
+ ]
879
+
880
+ const loadOnClick = () => {
881
+ isLoading.value = true
882
+ items.value = []
883
+ if (timeout) clearTimeout(timeout)
884
+ timeout = setTimeout(() => {
885
+ items.value = allItems
886
+ isLoading.value = false
887
+ }, 1000)
888
+ }
889
+
890
+ return { args, selectedValue, isLoading, items, loadOnClick }
774
891
  },
775
892
  template: `
776
893
  <div class="pa-4">
777
894
  <SyAutocomplete
778
895
  v-model="selectedValue"
779
896
  v-bind="args"
897
+ :items="items"
898
+ :loading="isLoading"
899
+ @click="loadOnClick"
780
900
  />
781
901
  </div>
782
902
  `,
@@ -820,14 +940,13 @@ const items = [
820
940
  ],
821
941
  },
822
942
  args: {
823
- 'items': [
943
+ items: [
824
944
  { text: 'Option 1', value: '1' },
825
945
  { text: 'Option 2', value: '2' },
826
946
  ],
827
- 'label': 'Champ obligatoire',
828
- 'required': true,
829
- 'displayAsterisk': true,
830
- 'onUpdate:modelValue': fn(),
947
+ label: 'Champ obligatoire',
948
+ required: true,
949
+ displayAsterisk: true,
831
950
  },
832
951
  render: (args) => {
833
952
  return {
@@ -848,6 +967,175 @@ const items = [
848
967
  },
849
968
  }
850
969
 
970
+ export const HideDetails: Story = {
971
+ parameters: {
972
+ sourceCode: [
973
+ {
974
+ name: 'Template',
975
+ code: `
976
+ <template>
977
+ <div class="d-flex flex-column gap-4">
978
+ <!-- Sans hide-details : la zone de messages est réservée (espace visible) -->
979
+ <SyAutocomplete
980
+ v-model="value1"
981
+ :items="items"
982
+ label="Avec zone de messages (défaut)"
983
+ has-success
984
+ :success-messages="['Sélection valide']"
985
+ />
986
+
987
+ <!-- Avec hide-details : la zone est masquée, même en état success -->
988
+ <SyAutocomplete
989
+ v-model="value2"
990
+ :items="items"
991
+ label="Sans zone de messages (hide-details)"
992
+ has-success
993
+ :success-messages="['Sélection valide']"
994
+ hide-details
995
+ />
996
+ </div>
997
+ </template>
998
+ `,
999
+ },
1000
+ {
1001
+ name: 'Script',
1002
+ code: `
1003
+ <script setup lang="ts">
1004
+ import { ref } from 'vue'
1005
+ import { SyAutocomplete } from '@cnamts/synapse'
1006
+
1007
+ const items = [
1008
+ { text: 'Option 1', value: '1' },
1009
+ { text: 'Option 2', value: '2' },
1010
+ { text: 'Option 3', value: '3' },
1011
+ ]
1012
+ const value1 = ref('1')
1013
+ const value2 = ref('1')
1014
+ </script>
1015
+ `,
1016
+ },
1017
+ ],
1018
+ },
1019
+ args: {
1020
+ items: [
1021
+ { text: 'Option 1', value: '1' },
1022
+ { text: 'Option 2', value: '2' },
1023
+ { text: 'Option 3', value: '3' },
1024
+ ],
1025
+ },
1026
+ render: (args) => {
1027
+ return {
1028
+ components: { SyAutocomplete },
1029
+ setup() {
1030
+ const value1 = ref('1')
1031
+ const value2 = ref('1')
1032
+ return { args, value1, value2 }
1033
+ },
1034
+ template: `
1035
+ <div class="pa-4 d-flex flex-column" style="gap: 16px;">
1036
+ <SyAutocomplete
1037
+ v-model="value1"
1038
+ v-bind="args"
1039
+ label="Avec zone de messages (défaut)"
1040
+ :has-success="true"
1041
+ :success-messages="['Sélection valide']"
1042
+ />
1043
+ <SyAutocomplete
1044
+ v-model="value2"
1045
+ v-bind="args"
1046
+ label="Sans zone de messages (hide-details)"
1047
+ :has-success="true"
1048
+ :success-messages="['Sélection valide']"
1049
+ :hide-details="true"
1050
+ />
1051
+ </div>
1052
+ `,
1053
+ }
1054
+ },
1055
+ }
1056
+
1057
+ export const DisableErrorHandling: Story = {
1058
+ parameters: {
1059
+ sourceCode: [
1060
+ {
1061
+ name: 'Template',
1062
+ code: `
1063
+ <template>
1064
+ <div class="d-flex flex-column gap-4">
1065
+ <SyAutocomplete
1066
+ v-model="value1"
1067
+ :items="items"
1068
+ label="Avec validation interne (défaut)"
1069
+ required
1070
+ />
1071
+
1072
+ <SyAutocomplete
1073
+ v-model="value2"
1074
+ :items="items"
1075
+ label="Validation interne désactivée"
1076
+ required
1077
+ disable-error-handling
1078
+ />
1079
+ </div>
1080
+ </template>
1081
+ `,
1082
+ },
1083
+ {
1084
+ name: 'Script',
1085
+ code: `
1086
+ <script setup lang="ts">
1087
+ import { ref } from 'vue'
1088
+ import { SyAutocomplete } from '@cnamts/synapse'
1089
+
1090
+ const items = [
1091
+ { text: 'Option 1', value: '1' },
1092
+ { text: 'Option 2', value: '2' },
1093
+ { text: 'Option 3', value: '3' },
1094
+ ]
1095
+
1096
+ const value1 = ref(null)
1097
+ const value2 = ref(null)
1098
+ </script>
1099
+ `,
1100
+ },
1101
+ ],
1102
+ },
1103
+ args: {
1104
+ items: [
1105
+ { text: 'Option 1', value: '1' },
1106
+ { text: 'Option 2', value: '2' },
1107
+ { text: 'Option 3', value: '3' },
1108
+ ],
1109
+ },
1110
+ render: (args) => {
1111
+ return {
1112
+ components: { SyAutocomplete },
1113
+ setup() {
1114
+ const value1 = ref(null)
1115
+ const value2 = ref(null)
1116
+ return { args, value1, value2 }
1117
+ },
1118
+ template: `
1119
+ <div class="pa-4 d-flex flex-column" style="gap: 16px;">
1120
+ <SyAutocomplete
1121
+ v-model="value1"
1122
+ v-bind="args"
1123
+ label="Avec validation interne (défaut)"
1124
+ required
1125
+ />
1126
+ <SyAutocomplete
1127
+ v-model="value2"
1128
+ v-bind="args"
1129
+ label="Validation interne désactivée"
1130
+ required
1131
+ disable-error-handling
1132
+ />
1133
+ </div>
1134
+ `,
1135
+ }
1136
+ },
1137
+ }
1138
+
851
1139
  export const ReadonlyField: Story = {
852
1140
  parameters: {
853
1141
 
@@ -884,14 +1172,13 @@ const items = [
884
1172
  ],
885
1173
  },
886
1174
  args: {
887
- 'items': [
1175
+ items: [
888
1176
  { text: 'Adrien', value: 'Adrien' },
889
1177
  { text: 'Axel', value: 'Axel' },
890
1178
  { text: 'Baptiste', value: 'Baptiste' },
891
1179
  ],
892
- 'label': 'Champ en lecture seule',
893
- 'readonly': true,
894
- 'onUpdate:modelValue': fn(),
1180
+ label: 'Champ en lecture seule',
1181
+ readonly: true,
895
1182
  },
896
1183
  render: (args) => {
897
1184
  return {
@@ -949,15 +1236,14 @@ const items = [
949
1236
  ],
950
1237
  },
951
1238
  args: {
952
- 'items': [
1239
+ items: [
953
1240
  { label: 'Premier choix', id: '1' },
954
1241
  { label: 'Deuxième choix', id: '2' },
955
1242
  { label: 'Troisième choix', id: '3' },
956
1243
  ],
957
- 'label': 'Recherche avec clés personnalisées',
958
- 'textKey': 'label',
959
- 'valueKey': 'id',
960
- 'onUpdate:modelValue': fn(),
1244
+ label: 'Recherche avec clés personnalisées',
1245
+ textKey: 'label',
1246
+ valueKey: 'id',
961
1247
  },
962
1248
  render: (args) => {
963
1249
  return {