@cnamts/synapse 1.0.25 → 1.0.27

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 (393) hide show
  1. package/dist/{AutocompleteFilter-D7qBuCAP.js → AutocompleteFilter-C9eLKyW8.js} +3 -3
  2. package/dist/{DateFilter-BitMWrMU.js → DateFilter-y-GLkAkn.js} +9 -9
  3. package/dist/{NumberFilter-BTLUxw0a.js → NumberFilter-DN6hIBS7.js} +1 -1
  4. package/dist/{PeriodFilter-B5rUIPAC.js → PeriodFilter-MoUUp9qS.js} +1 -1
  5. package/dist/{SelectFilter-l4QnRcuk.js → SelectFilter-bCbrdLmu.js} +1 -1
  6. package/dist/{TextFilter-C9hj6Qrp.js → TextFilter-CvjgEaoM.js} +4 -4
  7. package/dist/apLightTheme2026-ug4Y23ns.js +611 -0
  8. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2369 -351
  9. package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +18 -0
  10. package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +1 -1
  11. package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +3 -1
  12. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +58 -288
  13. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +1 -0
  14. package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +15 -0
  15. package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +4 -3
  16. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +4 -3
  17. package/dist/components/Customs/SyIconButton/SyIconButton.d.ts +18 -0
  18. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +20 -37
  19. package/dist/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.d.ts +50 -0
  20. package/dist/components/Customs/SyTextField/SyTextField.d.ts +8 -10
  21. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +197 -185
  22. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +91 -82
  23. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +35 -32
  24. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  25. package/dist/components/DatePicker/composables/useDatePickerState.d.ts +3 -3
  26. package/dist/components/DatePicker/composables/useDatePickerValidationBridge.d.ts +51 -0
  27. package/dist/components/DatePicker/composables/useDateTextField.d.ts +2 -2
  28. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +2 -2
  29. package/dist/components/DatePicker/types.d.ts +1 -2
  30. package/dist/components/LunarCalendar/useLunarCalendarValidation.d.ts +1 -0
  31. package/dist/components/MonthPicker/MonthPicker.d.ts +24 -24
  32. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +24 -24
  33. package/dist/components/NirField/NirField.d.ts +64 -60
  34. package/dist/components/NirField/useNirValidation.d.ts +6 -2
  35. package/dist/components/PasswordField/PasswordField.d.ts +3 -3
  36. package/dist/components/PeriodField/PeriodField.d.ts +338 -314
  37. package/dist/components/PhoneField/PhoneField.d.ts +34 -24
  38. package/dist/components/RangeField/RangeSlider/RangeSlider.d.ts +0 -3
  39. package/dist/components/RatingPicker/EmotionPicker/EmotionPicker.d.ts +3 -1
  40. package/dist/components/RatingPicker/NumberPicker/NumberPicker.d.ts +4 -3
  41. package/dist/components/RatingPicker/RatingPicker.d.ts +18 -5
  42. package/dist/components/RatingPicker/StarsPicker/StarsPicker.d.ts +3 -1
  43. package/dist/components/RatingPicker/useRatingFocus.d.ts +18 -0
  44. package/dist/components/SyTextArea/SyTextArea.d.ts +25 -15
  45. package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +20 -0
  46. package/dist/components/SyTextArea/locales.d.ts +1 -0
  47. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -4
  48. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -4
  49. package/dist/components/Tables/common/SyTablePagination.d.ts +152 -364
  50. package/dist/components/Tables/common/TableHeader.d.ts +1 -1
  51. package/dist/components/Tables/common/filters/DateFilter.d.ts +4 -4
  52. package/dist/components/Tables/common/types.d.ts +2 -0
  53. package/dist/components/index.d.ts +1 -0
  54. package/dist/composables/date/useDateInitializationDayjs.d.ts +3 -1
  55. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +160 -160
  56. package/dist/composables/unifyValidation/useCustomValidation.d.ts +3 -1
  57. package/dist/composables/unifyValidation/useValidation.d.ts +27 -19
  58. package/dist/composables/unifyValidation/useVuetifyValidation.d.ts +1 -1
  59. package/dist/composables/validation/useValidation.d.ts +1 -0
  60. package/dist/design-system-v3.js +81 -80
  61. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +6 -6
  62. package/dist/designTokens/tokens/amelipro/apDarkTheme.d.ts +3 -1
  63. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +53 -98
  64. package/dist/designTokens/tokens/baseContextualTokens.d.ts +0 -6
  65. package/dist/designTokens/tokens/baseTokens.d.ts +232 -0
  66. package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +6 -6
  67. package/dist/designTokens/tokens/cnam/cnamDarkTheme.d.ts +1 -1
  68. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +57 -99
  69. package/dist/designTokens/tokens/pa/paContextual.d.ts +0 -6
  70. package/dist/designTokens/tokens/pa/paDarkTheme.d.ts +1 -1
  71. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +53 -97
  72. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -0
  73. package/dist/designTokens/tokens/semanticTokens.d.ts +112 -0
  74. package/dist/{main-Cpx8Co6H.js → main-CI6Q9nmO.js} +13843 -13478
  75. package/dist/synapse.css +1 -1
  76. package/dist/vuetifyConfig.js +208 -72
  77. package/package.json +10 -7
  78. package/src/assets/overrides/_icons.scss +5 -17
  79. package/src/assets/overrides/_otp.scss +4 -5
  80. package/src/assets/overrides/_typography.scss +2 -1
  81. package/src/assets/overrides/_utilities.scss +1 -42
  82. package/src/components/Accordion/Accordion.vue +2 -0
  83. package/src/components/ChipList/ChipList.vue +30 -18
  84. package/src/components/ChipList/tests/chipList.spec.ts +4 -4
  85. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -1
  86. package/src/components/CookiesSelection/CookiesSelection.vue +2 -1
  87. package/src/components/CopyBtn/CopyBtn.vue +9 -0
  88. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.stories.ts +4 -0
  89. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +7 -6
  90. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +223 -0
  91. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +283 -351
  92. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +183 -219
  93. package/src/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.ts +101 -0
  94. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +761 -1
  95. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +3 -1
  96. package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +79 -5
  97. package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +1029 -0
  98. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +52 -217
  99. package/src/components/Customs/Selects/SySelect/SySelect.vue +248 -236
  100. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +3 -0
  101. package/src/components/Customs/Selects/SySelect/composables/useSySelectValidation.ts +64 -0
  102. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +440 -5
  103. package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1026 -0
  104. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +18 -7
  105. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +5 -5
  106. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +8 -8
  107. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +27 -6
  108. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +1 -1
  109. package/src/components/Customs/SyIcon/accessibilite/Accessibility.mdx +0 -6
  110. package/src/components/Customs/SyIcon/utils/tests/iconUtils.spec.ts +107 -0
  111. package/src/components/Customs/SyRadioGroup/SyRadioGroup.mdx +2 -2
  112. package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +395 -200
  113. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +100 -127
  114. package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +127 -0
  115. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.a11y.spec.ts +93 -1
  116. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.spec.ts +146 -9
  117. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.visual.cy.ts +165 -0
  118. package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +773 -0
  119. package/src/components/Customs/SyTabs/SyTabs.stories.ts +5 -5
  120. package/src/components/Customs/SyTabs/config.ts +3 -3
  121. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +265 -0
  122. package/src/components/Customs/SyTabs/tests/useTabTransition.spec.ts +188 -0
  123. package/src/components/Customs/SyTextField/SyTextField.stories.ts +10 -29
  124. package/src/components/Customs/SyTextField/SyTextField.vue +52 -17
  125. package/src/components/DataList/DataList.stories.ts +1 -1
  126. package/src/components/DataListItem/tests/DataListItem.spec.ts +3 -1
  127. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +1 -1
  128. package/src/components/DatePicker/CalendarMode/DatePicker.vue +52 -154
  129. package/src/components/DatePicker/CalendarMode/tests/DatePicker.coverage.spec.ts +156 -0
  130. package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +495 -4
  131. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1 -1
  132. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +55 -73
  133. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +207 -1
  134. package/src/components/DatePicker/ComplexDatePicker/tests/bridge-integration.regression.spec.ts +210 -0
  135. package/src/components/DatePicker/ComplexDatePicker/tests/calendar-navigation.regression.spec.ts +214 -0
  136. package/src/components/DatePicker/ComplexDatePicker/tests/validation-cross.regression.spec.ts +194 -0
  137. package/src/components/DatePicker/ComplexDatePicker/tests/validation-success-messages.regression.spec.ts +83 -0
  138. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +1 -1
  139. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +169 -60
  140. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +1 -1
  141. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +320 -0
  142. package/src/components/DatePicker/composables/index.ts +1 -0
  143. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +360 -0
  144. package/src/components/DatePicker/composables/tests/useDatePickerValidationBridge.spec.ts +129 -0
  145. package/src/components/DatePicker/composables/useDatePickerState.ts +33 -14
  146. package/src/components/DatePicker/composables/useDatePickerValidationBridge.ts +205 -0
  147. package/src/components/DatePicker/composables/useDateRangeInput.ts +2 -1
  148. package/src/components/DatePicker/composables/useDateSelection.ts +2 -1
  149. package/src/components/DatePicker/composables/useDateTextField.ts +2 -2
  150. package/src/components/DatePicker/composables/useInputBlurHandler.ts +2 -2
  151. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +1 -1
  152. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +1 -1
  153. package/src/components/DatePicker/tests/exposed-methods.coverage.spec.ts +75 -0
  154. package/src/components/DatePicker/types.ts +1 -2
  155. package/src/components/DialogBox/DialogBox.stories.ts +8 -8
  156. package/src/components/DialogBox/DialogBox.vue +1 -1
  157. package/src/components/DialogBox/accessibilite/Accessibility.mdx +86 -22
  158. package/src/components/FileList/UploadItem/UploadItem.vue +4 -4
  159. package/src/components/FileUpload/FileUpload.vue +2 -2
  160. package/src/components/FileUpload/FileUploadContent.vue +1 -1
  161. package/src/components/FilterInline/FilterInline.mdx +2 -2
  162. package/src/components/FilterSideBar/FilterSideBar.stories.ts +1 -1
  163. package/src/components/FilterSideBar/FilterSideBar.vue +4 -3
  164. package/src/components/FooterBar/FooterBar.vue +7 -7
  165. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  166. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -2
  167. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +7 -7
  168. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +2 -2
  169. package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +87 -8
  170. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +3 -3
  171. package/src/components/HeaderNavigationBar/HorizontalNavbar/tests/HorizontalNavbar.spec.ts +589 -0
  172. package/src/components/HeaderToolbar/tests/HeaderToolBar.spec.ts +153 -1
  173. package/src/components/HeaderToolbar/tests/useMobileRightMenu.spec.ts +258 -0
  174. package/src/components/LangBtn/LangBtn.vue +2 -1
  175. package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +2 -2
  176. package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +1 -1
  177. package/src/components/LunarCalendar/tests/useLunarCalendarRules.spec.ts +184 -0
  178. package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +3 -3
  179. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +1 -1
  180. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +2 -2
  181. package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +1 -1
  182. package/src/components/NirField/NirField.vue +3 -3
  183. package/src/components/NotificationBar/Notification/Notification.vue +12 -12
  184. package/src/components/NotificationBar/NotificationBar.stories.ts +8 -8
  185. package/src/components/PaginatedTable/PaginatedTable.vue +1 -1
  186. package/src/components/PaginatedTable/Pagination.vue +3 -3
  187. package/src/components/PasswordField/PasswordField.vue +15 -11
  188. package/src/components/PasswordField/tests/PasswordField.spec.ts +3 -3
  189. package/src/components/PhoneField/PhoneField.vue +4 -2
  190. package/src/components/RangeField/RangeSlider/RangeSlider.vue +11 -18
  191. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  192. package/src/components/RatingPicker/EmotionPicker/EmotionPicker.vue +32 -48
  193. package/src/components/RatingPicker/EmotionPicker/tests/__snapshots__/EmotionPicker.spec.ts.snap +5 -0
  194. package/src/components/RatingPicker/NumberPicker/NumberPicker.vue +48 -53
  195. package/src/components/RatingPicker/NumberPicker/tests/NumberPicker.spec.ts +2 -1
  196. package/src/components/RatingPicker/NumberPicker/tests/__snapshots__/NumberPicker.spec.ts.snap +40 -13
  197. package/src/components/RatingPicker/RatingPicker.stories.ts +65 -88
  198. package/src/components/RatingPicker/RatingPicker.vue +71 -15
  199. package/src/components/RatingPicker/StarsPicker/StarsPicker.vue +28 -37
  200. package/src/components/RatingPicker/StarsPicker/tests/StarsPicker.spec.ts +1 -1
  201. package/src/components/RatingPicker/StarsPicker/tests/__snapshots__/StarsPicker.spec.ts.snap +5 -0
  202. package/src/components/RatingPicker/accessibilite/Accessibility.mdx +137 -9
  203. package/src/components/RatingPicker/tests/RatingPicker.a11y.spec.ts +123 -0
  204. package/src/components/RatingPicker/tests/RatingPicker.spec.ts +3 -2
  205. package/src/components/RatingPicker/tests/__snapshots__/RatingPicker.spec.ts.snap +40 -11
  206. package/src/components/RatingPicker/useRatingFocus.ts +97 -0
  207. package/src/components/StatusPage/tests/StatusPage.spec.ts +149 -0
  208. package/src/components/SubHeader/SubHeader.vue +1 -1
  209. package/src/components/SyAlert/SyAlert.vue +23 -23
  210. package/src/components/SyTextArea/SyTextArea.stories.ts +177 -131
  211. package/src/components/SyTextArea/SyTextArea.vue +257 -74
  212. package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +81 -0
  213. package/src/components/SyTextArea/locales.ts +1 -0
  214. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +449 -1
  215. package/src/components/SyTextArea/useDefaultValidationRules.ts +2 -7
  216. package/src/components/SyTextArea/validation/Validation.stories.ts +856 -0
  217. package/src/components/TableToolbar/TableToolbar.vue +6 -6
  218. package/src/components/TableToolbar/accessibilite/Accessibility.mdx +81 -7
  219. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +163 -0
  220. package/src/components/Tables/SyServerTable/SyServerTable.vue +3 -2
  221. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
  222. package/src/components/Tables/SyTable/SyTable.stories.ts +94 -0
  223. package/src/components/Tables/SyTable/SyTable.vue +3 -2
  224. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +64 -0
  225. package/src/components/Tables/common/SyTableFilter.vue +4 -4
  226. package/src/components/Tables/common/SyTablePagination.vue +1 -0
  227. package/src/components/Tables/common/TableHeader.vue +3 -3
  228. package/src/components/Tables/common/filters/DateFilter.vue +2 -2
  229. package/src/components/Tables/common/filters/logics/tests/NumberFilterLogic.spec.ts +176 -0
  230. package/src/components/Tables/common/filters/logics/tests/SelectFilterLogic.spec.ts +111 -0
  231. package/src/components/Tables/common/tableStyles.scss +6 -6
  232. package/src/components/Tables/common/types.ts +2 -0
  233. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +2 -0
  234. package/src/components/index.ts +1 -0
  235. package/src/composables/date/tests/useDateFormatDayjs.spec.ts +112 -0
  236. package/src/composables/date/tests/{useDateInitialization.spec.ts → useDateInitializationDayjs.spec.ts} +39 -3
  237. package/src/composables/date/tests/useHolidayDay.spec.ts +109 -0
  238. package/src/composables/date/useDateInitializationDayjs.ts +4 -1
  239. package/src/composables/rules/tests/useFieldValidation.spec.ts +374 -0
  240. package/src/composables/tests/useError.spec.ts +30 -0
  241. package/src/composables/tests/useFormFieldErrorHandling.spec.ts +234 -0
  242. package/src/composables/unifyValidation/documentationValidationProps.ts +12 -12
  243. package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +177 -0
  244. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +32 -1
  245. package/src/composables/unifyValidation/tests/useValidation.spec.ts +28 -2
  246. package/src/composables/unifyValidation/useCustomValidation.ts +34 -12
  247. package/src/composables/unifyValidation/useValidation.ts +55 -27
  248. package/src/composables/unifyValidation/useVuetifyValidation.ts +2 -2
  249. package/src/composables/useFilterable/useFilterable.spec.ts +42 -0
  250. package/src/composables/useFilterable/useFilterable.ts +11 -7
  251. package/src/composables/useFormFieldErrorHandling.ts +6 -3
  252. package/src/composables/validation/tests/useValidation.spec.ts +2 -2
  253. package/src/composables/validation/useValidation.ts +15 -3
  254. package/src/composantsVuetify/VBtn/VBtn.mdx +9 -39
  255. package/src/composantsVuetify/VBtn/v-btn.stories.ts +26 -86
  256. package/src/composantsVuetify/VCard/VCard.mdx +59 -0
  257. package/src/composantsVuetify/VCard/v-card.stories.ts +279 -0
  258. package/src/designTokens/tokens/amelipro/apColors2026.ts +1 -1
  259. package/src/designTokens/tokens/amelipro/apContextual.ts +6 -0
  260. package/src/designTokens/tokens/amelipro/apDarkTheme.ts +2 -2
  261. package/src/designTokens/tokens/amelipro/apLightTheme.ts +72 -100
  262. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  263. package/src/designTokens/tokens/baseContextualTokens.ts +1 -6
  264. package/src/designTokens/tokens/baseTokens.ts +232 -0
  265. package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -0
  266. package/src/designTokens/tokens/cnam/cnamDarkTheme.ts +2 -2
  267. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +76 -101
  268. package/src/designTokens/tokens/pa/paDarkTheme.ts +2 -2
  269. package/src/designTokens/tokens/pa/paLightTheme.ts +73 -99
  270. package/src/designTokens/tokens/pa/paSemantic.ts +2 -0
  271. package/src/designTokens/tokens/semanticTokens.ts +114 -0
  272. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +61 -91
  273. package/src/stories/Accessibilite/AuditDesignSystem.mdx +5 -8
  274. package/src/stories/Accessibilite/AuditEtContreAudit/Exemptions-derogations.mdx +1 -1
  275. package/src/stories/Accessibilite/AuditEtContreAudit/Introduction.mdx +11 -8
  276. package/src/stories/Accessibilite/AuditEtContreAudit/RGAA.mdx +6 -7
  277. package/src/stories/Accessibilite/Introduction.mdx +30 -30
  278. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +168 -78
  279. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +13 -6
  280. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +66 -45
  281. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +23 -49
  282. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/FauxPositifs.stories.ts +6 -0
  283. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru/Utilisation.mdx +7 -19
  284. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +18 -20
  285. package/src/stories/Components/Components.stories.ts +59 -6
  286. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -3
  287. package/src/stories/DesignTokens/Colors.mdx +6 -8
  288. package/src/stories/DesignTokens/colors.stories.ts +244 -1081
  289. package/src/utils/amelipro/toKebabCase/tests/toKebabCase.spec.ts +52 -0
  290. package/src/utils/formatNir/tests/formatNir.spec.ts +34 -0
  291. package/src/utils/tests/insertAt.spec.ts +44 -0
  292. package/dist/AutocompleteFilter-Df9i5mAl.cjs +0 -1
  293. package/dist/DateFilter-BJD6FMev.cjs +0 -1
  294. package/dist/NumberFilter-DGCzCXzI.cjs +0 -1
  295. package/dist/PeriodFilter-DO_ecTZW.cjs +0 -1
  296. package/dist/SelectFilter-CGwcKWLm.cjs +0 -1
  297. package/dist/TextFilter-B8nf7xoK.cjs +0 -1
  298. package/dist/apLightTheme-CEK4iY3f.cjs +0 -1
  299. package/dist/apLightTheme-DnIM24Lv.js +0 -950
  300. package/dist/composables/date/useDateFormat.d.ts +0 -26
  301. package/dist/composables/date/useDateInitialization.d.ts +0 -18
  302. package/dist/design-system-v3.umd.cjs +0 -1
  303. package/dist/main-ByDPHpae.cjs +0 -1067
  304. package/dist/tooth-11-D3sLWv2n.cjs +0 -1
  305. package/dist/tooth-12-CXrLuH03.cjs +0 -1
  306. package/dist/tooth-13-BSfo5fpT.cjs +0 -1
  307. package/dist/tooth-14-DMzulx0h.cjs +0 -1
  308. package/dist/tooth-15-BKRFVi-9.cjs +0 -1
  309. package/dist/tooth-16-CpuxAbuM.cjs +0 -1
  310. package/dist/tooth-17-BPoahUdg.cjs +0 -1
  311. package/dist/tooth-18-DhHJz8sy.cjs +0 -1
  312. package/dist/tooth-21-Dgd5hn_X.cjs +0 -1
  313. package/dist/tooth-22-C2Tn19sB.cjs +0 -1
  314. package/dist/tooth-23-C9uaaSGb.cjs +0 -1
  315. package/dist/tooth-24-BrK9UGpf.cjs +0 -1
  316. package/dist/tooth-25-CE_EfGNp.cjs +0 -1
  317. package/dist/tooth-26-Ctv4i9Fy.cjs +0 -1
  318. package/dist/tooth-27-C5J7JkWM.cjs +0 -1
  319. package/dist/tooth-28-Z9oWqjo0.cjs +0 -1
  320. package/dist/tooth-31-BrYqmkTi.cjs +0 -1
  321. package/dist/tooth-32-BNNR0oCZ.cjs +0 -1
  322. package/dist/tooth-33-DuxvqO2J.cjs +0 -1
  323. package/dist/tooth-34-BCSCXMB6.cjs +0 -1
  324. package/dist/tooth-35-BLUXkX88.cjs +0 -1
  325. package/dist/tooth-36-IrKHYqlA.cjs +0 -1
  326. package/dist/tooth-37-BYqpdMwo.cjs +0 -1
  327. package/dist/tooth-38-B_eNXXdu.cjs +0 -1
  328. package/dist/tooth-41-Ddva4Ot8.cjs +0 -1
  329. package/dist/tooth-42-szcDqlM0.cjs +0 -1
  330. package/dist/tooth-43-B3ka6rQm.cjs +0 -1
  331. package/dist/tooth-44-CazyQucj.cjs +0 -1
  332. package/dist/tooth-45-B4HQtc8n.cjs +0 -1
  333. package/dist/tooth-46-BPM40gbG.cjs +0 -1
  334. package/dist/tooth-47-Dvr20dlh.cjs +0 -1
  335. package/dist/tooth-48-Bd8ljGsF.cjs +0 -1
  336. package/dist/tooth-51-OBpwCOF3.cjs +0 -1
  337. package/dist/tooth-52-aKxyHcmq.cjs +0 -1
  338. package/dist/tooth-53-vCwJjTOc.cjs +0 -1
  339. package/dist/tooth-54-DsWu2iFy.cjs +0 -1
  340. package/dist/tooth-55-BxC1X2Dn.cjs +0 -1
  341. package/dist/tooth-61-BbLvxMQi.cjs +0 -1
  342. package/dist/tooth-62-CmTkWczP.cjs +0 -1
  343. package/dist/tooth-63-DI7l_2qI.cjs +0 -1
  344. package/dist/tooth-64-B21sOsJh.cjs +0 -1
  345. package/dist/tooth-65-D2ZC2VEr.cjs +0 -1
  346. package/dist/tooth-71-D473PPO5.cjs +0 -1
  347. package/dist/tooth-72-Drh1wnNu.cjs +0 -1
  348. package/dist/tooth-73-DzlwYI23.cjs +0 -1
  349. package/dist/tooth-74-8aGvcZPg.cjs +0 -1
  350. package/dist/tooth-75-BFK7At_r.cjs +0 -1
  351. package/dist/tooth-81-BZmR-I0M.cjs +0 -1
  352. package/dist/tooth-82-euVfUUZV.cjs +0 -1
  353. package/dist/tooth-83-KV010j64.cjs +0 -1
  354. package/dist/tooth-84-BBg1RjhZ.cjs +0 -1
  355. package/dist/tooth-85-Cr-kc1wM.cjs +0 -1
  356. package/dist/vuetifyConfig.umd.cjs +0 -1
  357. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  358. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  359. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  360. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  361. package/src/components/DatePicker/CalendarMode/tests/DatePicker.events.spec.ts +0 -178
  362. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  363. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  364. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  365. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  366. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  367. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  368. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  369. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  370. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  371. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  372. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  373. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  374. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  375. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  376. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  377. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  378. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  379. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  380. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  381. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  382. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  383. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  384. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  385. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  386. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  387. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  388. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  389. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  390. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  391. package/src/composables/date/tests/useDateFormat.spec.ts +0 -67
  392. package/src/composables/date/useDateFormat.ts +0 -110
  393. package/src/composables/date/useDateInitialization.ts +0 -92
@@ -0,0 +1,210 @@
1
+ import { mount, flushPromises } from '@vue/test-utils'
2
+ import { describe, it, expect, vi } from 'vitest'
3
+ import { nextTick } from 'vue'
4
+ import ComplexDatePicker from '../ComplexDatePicker.vue'
5
+ import DateTextInput from '../../DateTextInput/DateTextInput.vue'
6
+
7
+ /**
8
+ * Tests de régression pour l'intégration Bridge + validation
9
+ * Couvrent les cas critiques non testés précédemment
10
+ */
11
+ describe('Bridge Integration Regression Tests', () => {
12
+ /**
13
+ * Test 1: Réactivité des customRules
14
+ * Bug potentiel : Si les règles ne sont pas réactives,
15
+ * la validation croisée (dateA -> dateB) ne fonctionne pas
16
+ */
17
+ it('réagit aux changements de customRules dynamiques', async () => {
18
+ const wrapper = mount(ComplexDatePicker, {
19
+ props: {
20
+ modelValue: '',
21
+ label: 'Date',
22
+ format: 'DD/MM/YYYY',
23
+ // Première règle qui passe toujours
24
+ customRules: [{ type: 'custom', options: { validate: () => true, message: 'Erreur' } }],
25
+ },
26
+ })
27
+
28
+ // Changer les règles via setProps (comme le ferait le parent)
29
+ await wrapper.setProps({
30
+ customRules: [{ type: 'custom', options: { validate: () => false, message: 'Nouvelle erreur' } }],
31
+ })
32
+ await nextTick()
33
+
34
+ // La nouvelle règle doit être prise en compte
35
+ const input = wrapper.find('input')
36
+ await input.setValue('15/05/2025')
37
+ await input.trigger('blur')
38
+ await flushPromises()
39
+
40
+ // Avec la nouvelle règle qui retourne false, on doit avoir une erreur
41
+ const errors = wrapper.findAll('.v-messages__message--error')
42
+ expect(errors.length).toBeGreaterThan(0)
43
+
44
+ wrapper.unmount()
45
+ })
46
+
47
+ /**
48
+ * Test 2: Mode readonly - pas de validation active
49
+ * Bug potentiel : Validation qui s'exécute quand même en readonly
50
+ */
51
+ it('ne valide pas quand readonly est true', async () => {
52
+ const validateSpy = vi.fn(() => true)
53
+
54
+ const wrapper = mount(DateTextInput, {
55
+ props: {
56
+ modelValue: '',
57
+ label: 'Date',
58
+ format: 'DD/MM/YYYY',
59
+ readonly: true,
60
+ showSuccessMessages: true,
61
+ customRules: [{ type: 'custom', options: { validate: validateSpy } }],
62
+ },
63
+ })
64
+
65
+ // Attendre un tick pour s'assurer que la validation ne s'est pas déclenchée
66
+ await nextTick()
67
+
68
+ // La règle ne doit pas avoir été appelée
69
+ expect(validateSpy).not.toHaveBeenCalled()
70
+
71
+ wrapper.unmount()
72
+ })
73
+
74
+ /**
75
+ * Test 3: Coordonnation parent/enfant avec skipInternalValidation
76
+ * Bug potentiel : DateTextInput valide en parallèle du parent
77
+ */
78
+ it('ComplexDatePicker contrôle la validation quand DateTextInput a skipInternalValidation', async () => {
79
+ const parentValidate = vi.fn(() => ({ hasError: false, hasWarning: false, hasSuccess: true, state: { errors: [], warnings: [], successes: ['OK'] } }))
80
+
81
+ // Ce test vérifie que le parent gère la validation, pas l'enfant
82
+ const wrapper = mount(ComplexDatePicker, {
83
+ props: {
84
+ modelValue: '',
85
+ label: 'Date parent',
86
+ format: 'DD/MM/YYYY',
87
+ showSuccessMessages: true,
88
+ customRules: [{ type: 'custom', options: { validate: parentValidate } }],
89
+ },
90
+ })
91
+
92
+ const input = wrapper.find('input')
93
+ await input.setValue('20/06/2025')
94
+ await input.trigger('blur')
95
+ await flushPromises()
96
+
97
+ // Vérifier qu'on a un message de succès (du parent)
98
+ const successMessages = wrapper.findAll('.v-messages__message--success')
99
+ expect(successMessages.length).toBeLessThanOrEqual(1)
100
+
101
+ wrapper.unmount()
102
+ })
103
+
104
+ /**
105
+ * Test 4: Pas de double validation avec queueMicrotask
106
+ * Bug potentiel : queueMicrotask pourrait causer des validations en cascade
107
+ */
108
+ it('ne déclenche pas de validation en cascade avec queueMicrotask', async () => {
109
+ let validationCount = 0
110
+ const validateRule = () => {
111
+ validationCount++
112
+ return true
113
+ }
114
+
115
+ const wrapper = mount(DateTextInput, {
116
+ props: {
117
+ modelValue: '',
118
+ label: 'Date',
119
+ format: 'DD/MM/YYYY',
120
+ customRules: [{ type: 'custom', options: { validate: validateRule } }],
121
+ showSuccessMessages: true,
122
+ },
123
+ })
124
+
125
+ // Attendre que les microtasks soient traitées
126
+ await nextTick()
127
+ await new Promise(resolve => queueMicrotask(() => resolve(undefined)))
128
+
129
+ // La validation ne doit pas avoir été déclenchée automatiquement
130
+ // (seulement au blur ou changement de valeur)
131
+ expect(validationCount).toBe(0)
132
+
133
+ wrapper.unmount()
134
+ })
135
+
136
+ /**
137
+ * Test 5: Clear reset correctement les messages
138
+ * Bug potentiel : Messages qui restent après clear
139
+ */
140
+ it('reset les messages de validation après clear', async () => {
141
+ const wrapper = mount(DateTextInput, {
142
+ props: {
143
+ modelValue: '15/05/2025',
144
+ label: 'Date',
145
+ format: 'DD/MM/YYYY',
146
+ showSuccessMessages: true,
147
+ required: true,
148
+ },
149
+ })
150
+
151
+ // D'abord s'assurer qu'on a un message de succès
152
+ await flushPromises()
153
+
154
+ // Puis clear
155
+ await wrapper.setProps({ modelValue: '' })
156
+ await flushPromises()
157
+ await nextTick()
158
+
159
+ // Plus de message de succès
160
+ const successMessages = wrapper.findAll('.v-messages__message--success')
161
+ expect(successMessages.length).toBe(0)
162
+
163
+ wrapper.unmount()
164
+ })
165
+
166
+ /**
167
+ * Test 6: useDatePickerValidationBridge expose les bonnes méthodes
168
+ * Bug potentiel : Methods exposées qui ne fonctionnent pas
169
+ */
170
+ it('expose validateOnSubmit qui retourne un booléen', async () => {
171
+ const wrapper = mount(DateTextInput, {
172
+ props: {
173
+ modelValue: '',
174
+ label: 'Date',
175
+ format: 'DD/MM/YYYY',
176
+ required: true,
177
+ },
178
+ })
179
+
180
+ // Appeler validateOnSubmit exposé
181
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Testing internal API
182
+ const result = await (wrapper.vm as any).validateOnSubmit?.()
183
+
184
+ // Doit retourner false car champ vide et required
185
+ expect(result).toBe(false)
186
+
187
+ wrapper.unmount()
188
+ })
189
+
190
+ /**
191
+ * Test 7: Pas de fuite mémoire avec les watchers
192
+ * Bug potentiel : Watchers qui s'accumulent
193
+ */
194
+ it('nettoie les watchers quand le composant est détruit', async () => {
195
+ const wrapper = mount(DateTextInput, {
196
+ props: {
197
+ modelValue: '',
198
+ label: 'Date',
199
+ format: 'DD/MM/YYYY',
200
+ },
201
+ })
202
+
203
+ // Détruire le composant
204
+ wrapper.unmount()
205
+
206
+ // Aucune erreur ne doit être levée
207
+ // (les watchers sont nettoyés automatiquement par Vue)
208
+ expect(() => wrapper.vm).not.toThrow()
209
+ })
210
+ })
@@ -0,0 +1,214 @@
1
+ import { mount, flushPromises } from '@vue/test-utils'
2
+ import { describe, it, expect } from 'vitest'
3
+ import { nextTick } from 'vue'
4
+ import ComplexDatePicker from '../ComplexDatePicker.vue'
5
+
6
+ /**
7
+ * Tests de régression pour la navigation du calendrier
8
+ * Bug précédent : currentMonthName ne se mettait pas à jour via les flèches
9
+ */
10
+ describe('Calendar Navigation Regression Tests', () => {
11
+ /**
12
+ * Test 1 : Navigation mois via flèches met à jour l'affichage
13
+ */
14
+ it('met à jour currentMonthName quand on navigue via les flèches', async () => {
15
+ const wrapper = mount(ComplexDatePicker, {
16
+ props: {
17
+ modelValue: '15/05/2025',
18
+ label: 'Date',
19
+ format: 'DD/MM/YYYY',
20
+ },
21
+ })
22
+
23
+ // Attendre l'initialisation
24
+ await flushPromises()
25
+
26
+ // Ouvrir le calendrier (via propriété directe pour éviter les listeners)
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ ;(wrapper.vm as any).isDatePickerVisible = true
29
+ await nextTick()
30
+
31
+ // Le mois affiché doit correspondre à la date sélectionnée (mai)
32
+ // Note: On ne peut pas tester directement le DOM interne de VDatePicker
33
+ // mais on peut vérifier que selectedDates est bien synchronisé
34
+ const emitted = wrapper.emitted('date-selected')
35
+ expect(emitted).toBeTruthy()
36
+
37
+ wrapper.unmount()
38
+ })
39
+
40
+ /**
41
+ * Test 2 : Clear réinitialise le calendrier
42
+ * Bug production : VDatePicker gardait l'ancienne date après clear
43
+ */
44
+ it('reset le calendrier après clear', async () => {
45
+ const wrapper = mount(ComplexDatePicker, {
46
+ props: {
47
+ modelValue: '15/05/2025',
48
+ label: 'Date',
49
+ format: 'DD/MM/YYYY',
50
+ },
51
+ })
52
+
53
+ await flushPromises()
54
+
55
+ // Simuler un clear
56
+ await wrapper.find('input').setValue('')
57
+ await wrapper.find('input').trigger('blur')
58
+ await flushPromises()
59
+
60
+ // Vérifier que le model est mis à jour
61
+ const emitted = wrapper.emitted('update:modelValue')
62
+ const lastValue = emitted?.[emitted.length - 1]?.[0]
63
+ expect(lastValue).toBeNull()
64
+
65
+ wrapper.unmount()
66
+ })
67
+
68
+ /**
69
+ * Test 3 : Réouverture avec date déjà sélectionnée
70
+ * Bug : Navigation bloquée après réouverture
71
+ */
72
+ it('permet la navigation après réouverture du calendrier', async () => {
73
+ const wrapper = mount(ComplexDatePicker, {
74
+ props: {
75
+ modelValue: '',
76
+ label: 'Date',
77
+ format: 'DD/MM/YYYY',
78
+ },
79
+ })
80
+
81
+ // Ouvrir le calendrier (via propriété directe)
82
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
83
+ ;(wrapper.vm as any).isDatePickerVisible = true
84
+ await nextTick()
85
+
86
+ // Vérifier que l'input est interactif
87
+ const input = wrapper.find('input')
88
+ expect(input.exists()).toBe(true)
89
+
90
+ // Fermer avec Escape
91
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
92
+ ;(wrapper.vm as any).isDatePickerVisible = false
93
+ await nextTick()
94
+
95
+ // Réouvrir (via propriété directe)
96
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
97
+ ;(wrapper.vm as any).isDatePickerVisible = true
98
+ await nextTick()
99
+
100
+ // L'input doit toujours être interactif (pas de blocage)
101
+ expect(wrapper.find('input').exists()).toBe(true)
102
+
103
+ wrapper.unmount()
104
+ })
105
+
106
+ /**
107
+ * Test 4 : Synchronisation selectedDates avec input
108
+ * Bug : selectedDates et textInputValue désynchronisés
109
+ */
110
+ it('synchronise selectedDates avec la valeur de l\'input', async () => {
111
+ const wrapper = mount(ComplexDatePicker, {
112
+ props: {
113
+ modelValue: '',
114
+ label: 'Date',
115
+ format: 'DD/MM/YYYY',
116
+ },
117
+ })
118
+
119
+ // Saisir une date
120
+ const input = wrapper.find('input')
121
+ await input.setValue('20/06/2025')
122
+ await input.trigger('blur')
123
+ await flushPromises()
124
+
125
+ // La date doit être émise
126
+ const emitted = wrapper.emitted('update:modelValue')
127
+ expect(emitted).toBeTruthy()
128
+ expect(emitted && emitted[0] && emitted[0][0]).toBe('20/06/2025')
129
+
130
+ // Le date-selected doit aussi être émis
131
+ const dateSelected = wrapper.emitted('date-selected')
132
+ expect(dateSelected).toBeTruthy()
133
+
134
+ wrapper.unmount()
135
+ })
136
+
137
+ /**
138
+ * Test 5 : Mode range - sélection de plage complète
139
+ */
140
+ it('gère correctement la sélection de plage de dates', async () => {
141
+ const wrapper = mount(ComplexDatePicker, {
142
+ props: {
143
+ modelValue: '',
144
+ label: 'Période',
145
+ format: 'DD/MM/YYYY',
146
+ displayRange: true,
147
+ },
148
+ })
149
+
150
+ // Saisir une plage
151
+ const input = wrapper.find('input')
152
+ await input.setValue('01/06/2025 - 15/06/2025')
153
+ await input.trigger('blur')
154
+ await flushPromises()
155
+
156
+ // Le model doit être un array
157
+ const emitted = wrapper.emitted('update:modelValue')
158
+ expect(emitted).toBeTruthy()
159
+ const value = emitted && emitted[0] && emitted[0][0]
160
+ expect(Array.isArray(value)).toBe(true)
161
+ if (Array.isArray(value)) {
162
+ expect(value).toHaveLength(2)
163
+ }
164
+
165
+ wrapper.unmount()
166
+ })
167
+
168
+ /**
169
+ * Test 6 : fieldKey pour re-render (bug production)
170
+ * Bug : VDatePicker ne se réinitialisait pas après clear en production
171
+ * Solution : fieldKey force la recréation du composant
172
+ */
173
+ it('utilise fieldKey pour forcer le re-render après clear', async () => {
174
+ const wrapper = mount(ComplexDatePicker, {
175
+ props: {
176
+ modelValue: '15/05/2025',
177
+ label: 'Date',
178
+ format: 'DD/MM/YYYY',
179
+ },
180
+ })
181
+
182
+ // Vérifier que fieldKey existe (utilisé pour forcer le re-render)
183
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Testing internal implementation
184
+ expect((wrapper.vm as any).fieldKey).toBeDefined()
185
+
186
+ wrapper.unmount()
187
+ })
188
+
189
+ /**
190
+ * Test 7 : Reset view mode à l'ouverture
191
+ * Bug : Navigation bloquée après réouverture
192
+ */
193
+ it('reset view mode quand le calendrier s\'ouvre', async () => {
194
+ const wrapper = mount(ComplexDatePicker, {
195
+ props: {
196
+ modelValue: '',
197
+ label: 'Date',
198
+ format: 'DD/MM/YYYY',
199
+ },
200
+ })
201
+
202
+ // Ouvrir le calendrier
203
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
204
+ await (wrapper.vm as any).openDatePicker()
205
+ await nextTick()
206
+
207
+ // Vérifier que le view mode est bien initialisé
208
+ // (la propriété exacte dépend de l'implémentation)
209
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
210
+ expect((wrapper.vm as any).currentViewMode || (wrapper.vm as any).viewMode).toBeDefined()
211
+
212
+ wrapper.unmount()
213
+ })
214
+ })
@@ -0,0 +1,194 @@
1
+ import { mount, flushPromises } from '@vue/test-utils'
2
+ import { describe, it, expect } from 'vitest'
3
+ import { nextTick, ref, computed } from 'vue'
4
+ import ComplexDatePicker from '../ComplexDatePicker.vue'
5
+
6
+ /**
7
+ * Tests de régression pour la validation croisée (dateA -> dateB)
8
+ * Bug précédent : Les règles dateBRules ne se mettaient pas à jour quand dateA changeait
9
+ */
10
+ describe('Validation Croisée Regression Tests', () => {
11
+ /**
12
+ * Test 1 : notBeforeDate avec date dynamique
13
+ * Scénario : Date B ne peut pas être avant Date A
14
+ */
15
+ it('met à jour la validation de Date B quand Date A change', async () => {
16
+ const dateA = ref('15/05/2025')
17
+
18
+ // Date B avec règle notBeforeDate qui dépend de dateA
19
+ const dateBRules = computed(() => [
20
+ {
21
+ type: 'notBeforeDate',
22
+ options: {
23
+ date: dateA.value,
24
+ message: 'Date B doit être après Date A',
25
+ },
26
+ },
27
+ ])
28
+
29
+ const wrapper = mount(ComplexDatePicker, {
30
+ props: {
31
+ modelValue: '',
32
+ label: 'Date B',
33
+ format: 'DD/MM/YYYY',
34
+ customRules: dateBRules.value,
35
+ showSuccessMessages: true,
36
+ },
37
+ })
38
+
39
+ // Date B avant Date A (doit être invalide)
40
+ const input = wrapper.find('input')
41
+ await input.setValue('10/05/2025')
42
+ await input.trigger('blur')
43
+ await flushPromises()
44
+
45
+ // Doit avoir une erreur
46
+ let errors = wrapper.findAll('.v-messages__message--error')
47
+ expect(errors.length).toBeGreaterThan(0)
48
+
49
+ // Changer Date A pour être avant Date B
50
+ dateA.value = '05/05/2025'
51
+ await wrapper.setProps({
52
+ customRules: [
53
+ {
54
+ type: 'notBeforeDate',
55
+ options: {
56
+ date: dateA.value,
57
+ message: 'Date B doit être après Date A',
58
+ },
59
+ },
60
+ ],
61
+ })
62
+ await nextTick()
63
+
64
+ // Re-valider
65
+ await input.trigger('blur')
66
+ await flushPromises()
67
+
68
+ // Maintenant c'est valide (10/05 >= 05/05)
69
+ errors = wrapper.findAll('.v-messages__message--error')
70
+ expect(errors.length).toBe(0)
71
+
72
+ wrapper.unmount()
73
+ })
74
+
75
+ /**
76
+ * Test 2 : Validation réactive sans re-saisie
77
+ * Quand la règle change, la validation doit se mettre à jour automatiquement
78
+ */
79
+ it('re-valide automatiquement quand les règles changent', async () => {
80
+ const strictMode = ref(false)
81
+
82
+ const dynamicRules = computed(() => {
83
+ if (strictMode.value) {
84
+ return [{ type: 'notBeforeToday', options: { message: 'Date future obligatoire' } }]
85
+ }
86
+ return [] // Pas de validation en mode non-strict
87
+ })
88
+
89
+ const wrapper = mount(ComplexDatePicker, {
90
+ props: {
91
+ modelValue: '01/01/2020', // Date passée
92
+ label: 'Date',
93
+ format: 'DD/MM/YYYY',
94
+ customRules: dynamicRules.value,
95
+ },
96
+ })
97
+
98
+ // En mode non-strict, pas d'erreur
99
+ await flushPromises()
100
+ let errors = wrapper.findAll('.v-messages__message--error')
101
+ expect(errors.length).toBe(0)
102
+
103
+ // Passer en mode strict
104
+ strictMode.value = true
105
+ await wrapper.setProps({
106
+ customRules: [{ type: 'notBeforeToday', options: { message: 'Date future obligatoire' } }],
107
+ })
108
+ await nextTick()
109
+ await flushPromises()
110
+
111
+ // Maintenant doit y avoir une erreur (date passée en mode strict)
112
+ errors = wrapper.findAll('.v-messages__message--error')
113
+ expect(errors.length).toBeGreaterThan(0)
114
+
115
+ wrapper.unmount()
116
+ })
117
+
118
+ /**
119
+ * Test 3 : Pas de validation avec règles vides
120
+ */
121
+ it('ne valide pas quand customRules est vide', async () => {
122
+ const wrapper = mount(ComplexDatePicker, {
123
+ props: {
124
+ modelValue: '',
125
+ label: 'Date',
126
+ format: 'DD/MM/YYYY',
127
+ customRules: [], // Pas de règles
128
+ showSuccessMessages: true,
129
+ },
130
+ })
131
+
132
+ const input = wrapper.find('input')
133
+ await input.setValue('15/05/2025')
134
+ await input.trigger('blur')
135
+ await flushPromises()
136
+
137
+ // Pas de validation custom, donc validateSpy ne doit pas être appelé
138
+ // (mais le champ peut avoir un succès de validation de format)
139
+ const successMessages = wrapper.findAll('.v-messages__message--success')
140
+ // Un seul message maximum (pas de double validation)
141
+ expect(successMessages.length).toBeLessThanOrEqual(1)
142
+
143
+ wrapper.unmount()
144
+ })
145
+
146
+ /**
147
+ * Test 4 : Gestion des valeurs null (bug "Date invalide")
148
+ * Bug précédent : "Date invalide" s'affichait quand on supprimait la date
149
+ */
150
+ it('gère les valeurs null sans erreur "Date invalide"', async () => {
151
+ const wrapper = mount(ComplexDatePicker, {
152
+ props: {
153
+ modelValue: null,
154
+ label: 'Date',
155
+ format: 'DD/MM/YYYY',
156
+ customRules: [{ type: 'notBeforeDate', options: { date: '01/01/2025', message: 'Date trop ancienne' } }],
157
+ },
158
+ })
159
+
160
+ await flushPromises()
161
+
162
+ // Ne doit pas afficher "Date invalide" pour valeur null
163
+ const errors = wrapper.findAll('.v-messages__message--error')
164
+ const hasDateInvalide = errors.some(e => e.text().includes('Date invalide'))
165
+ expect(hasDateInvalide).toBe(false)
166
+
167
+ wrapper.unmount()
168
+ })
169
+
170
+ /**
171
+ * Test 5 : Pas d'erreur "Configuration invalide"
172
+ * Bug précédent : Message quand options.date = undefined
173
+ */
174
+ it('ne montre pas "Configuration de la règle invalide" quand la règle est valide', async () => {
175
+ const wrapper = mount(ComplexDatePicker, {
176
+ props: {
177
+ modelValue: '15/05/2025',
178
+ label: 'Date',
179
+ format: 'DD/MM/YYYY',
180
+ // Règle avec une date valide (pas undefined)
181
+ customRules: [{ type: 'notBeforeDate', options: { date: '01/01/2025', message: 'Date trop ancienne' } }],
182
+ },
183
+ })
184
+
185
+ await flushPromises()
186
+
187
+ // Ne doit pas avoir de message d'erreur de configuration
188
+ const errors = wrapper.findAll('.v-messages__message--error')
189
+ const hasConfigError = errors.some(e => e.text().includes('Configuration de la règle invalide'))
190
+ expect(hasConfigError).toBe(false)
191
+
192
+ wrapper.unmount()
193
+ })
194
+ })
@@ -0,0 +1,83 @@
1
+ import { mount, flushPromises } from '@vue/test-utils'
2
+ import { describe, it, expect } from 'vitest'
3
+ import ComplexDatePicker from '../ComplexDatePicker.vue'
4
+ import DateTextInput from '../../DateTextInput/DateTextInput.vue'
5
+
6
+ /**
7
+ * Tests de régression pour les messages de succès
8
+ * Bug précédent : Double affichage des messages de succès quand
9
+ * ComplexDatePicker et DateTextInput validaient tous les deux
10
+ */
11
+ describe('Validation Success Messages Regression', () => {
12
+ it('affiche un seul message de succès quand une date valide est saisie', async () => {
13
+ const wrapper = mount(ComplexDatePicker, {
14
+ props: {
15
+ modelValue: '',
16
+ label: 'Date de test',
17
+ format: 'DD/MM/YYYY',
18
+ showSuccessMessages: true,
19
+ required: true,
20
+ },
21
+ })
22
+
23
+ // Saisir une date valide
24
+ const input = wrapper.find('input')
25
+ await input.setValue('15/05/2025')
26
+ await input.trigger('blur')
27
+ await flushPromises()
28
+
29
+ // Vérifier qu'il n'y a qu'un seul message de succès
30
+ const successMessages = wrapper.findAll('.v-messages__message--success')
31
+ expect(successMessages.length).toBeLessThanOrEqual(1)
32
+
33
+ wrapper.unmount()
34
+ })
35
+
36
+ it('DateTextInput isolé affiche correctement les messages de succès', async () => {
37
+ const wrapper = mount(DateTextInput, {
38
+ props: {
39
+ modelValue: '',
40
+ label: 'Date isolée',
41
+ format: 'DD/MM/YYYY',
42
+ showSuccessMessages: true,
43
+ required: true,
44
+ },
45
+ })
46
+
47
+ const input = wrapper.find('input')
48
+ await input.setValue('20/06/2025')
49
+ await input.trigger('blur')
50
+ await flushPromises()
51
+
52
+ // Un seul message attendu
53
+ const successMessages = wrapper.findAll('.v-messages__message--success')
54
+ expect(successMessages.length).toBeLessThanOrEqual(1)
55
+
56
+ wrapper.unmount()
57
+ })
58
+
59
+ it('pas de double message avec skipInternalValidation', async () => {
60
+ const wrapper = mount(DateTextInput, {
61
+ props: {
62
+ modelValue: '',
63
+ label: 'Date avec skip',
64
+ format: 'DD/MM/YYYY',
65
+ showSuccessMessages: true,
66
+ required: true,
67
+ skipInternalValidation: true, // Simule utilisation dans ComplexDatePicker
68
+ },
69
+ })
70
+
71
+ const input = wrapper.find('input')
72
+ await input.setValue('10/07/2025')
73
+ await input.trigger('blur')
74
+ await flushPromises()
75
+
76
+ // Avec skipInternalValidation, pas de validation interne
77
+ // donc pas de message de succès généré par DateTextInput
78
+ const successMessages = wrapper.findAll('.v-messages__message--success')
79
+ expect(successMessages.length).toBe(0)
80
+
81
+ wrapper.unmount()
82
+ })
83
+ })