@cnamts/synapse 1.0.26 → 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 (253) hide show
  1. package/dist/{AutocompleteFilter-BPR-a55G.js → AutocompleteFilter-C9eLKyW8.js} +3 -3
  2. package/dist/{DateFilter-CknrJWs2.js → DateFilter-y-GLkAkn.js} +8 -8
  3. package/dist/{NumberFilter-DJ-yNlzv.js → NumberFilter-DN6hIBS7.js} +1 -1
  4. package/dist/{PeriodFilter-CiB5Oa9Z.js → PeriodFilter-MoUUp9qS.js} +1 -1
  5. package/dist/{SelectFilter-EiafX97M.js → SelectFilter-bCbrdLmu.js} +1 -1
  6. package/dist/{TextFilter-BzOmpdxj.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 -353
  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 +9 -10
  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 +3 -3
  16. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +3 -3
  17. package/dist/components/Customs/SyIconButton/SyIconButton.d.ts +18 -0
  18. package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +20 -38
  19. package/dist/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.d.ts +50 -0
  20. package/dist/components/Customs/SyTextField/SyTextField.d.ts +6 -6
  21. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +147 -136
  22. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +62 -54
  23. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +27 -24
  24. package/dist/components/DatePicker/composables/index.d.ts +1 -0
  25. package/dist/components/DatePicker/composables/useDatePickerValidationBridge.d.ts +51 -0
  26. package/dist/components/MonthPicker/MonthPicker.d.ts +23 -23
  27. package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +23 -23
  28. package/dist/components/NirField/NirField.d.ts +56 -56
  29. package/dist/components/PasswordField/PasswordField.d.ts +3 -3
  30. package/dist/components/PeriodField/PeriodField.d.ts +236 -212
  31. package/dist/components/PhoneField/PhoneField.d.ts +23 -23
  32. package/dist/components/SyTextArea/SyTextArea.d.ts +25 -15
  33. package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +20 -0
  34. package/dist/components/SyTextArea/locales.d.ts +1 -0
  35. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +1 -0
  36. package/dist/components/Tables/SyTable/SyTable.d.ts +1 -0
  37. package/dist/components/Tables/common/SyTablePagination.d.ts +25 -25
  38. package/dist/components/Tables/common/types.d.ts +2 -0
  39. package/dist/components/index.d.ts +1 -0
  40. package/dist/composables/unifyValidation/documentationValidationProps.d.ts +160 -160
  41. package/dist/composables/unifyValidation/useValidation.d.ts +16 -14
  42. package/dist/design-system-v3.js +81 -80
  43. package/dist/designTokens/tokens/amelipro/apContextual.d.ts +6 -6
  44. package/dist/designTokens/tokens/amelipro/apDarkTheme.d.ts +3 -1
  45. package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +53 -100
  46. package/dist/designTokens/tokens/baseContextualTokens.d.ts +0 -6
  47. package/dist/designTokens/tokens/baseTokens.d.ts +232 -0
  48. package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +6 -6
  49. package/dist/designTokens/tokens/cnam/cnamDarkTheme.d.ts +1 -1
  50. package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +57 -101
  51. package/dist/designTokens/tokens/pa/paContextual.d.ts +0 -6
  52. package/dist/designTokens/tokens/pa/paDarkTheme.d.ts +1 -1
  53. package/dist/designTokens/tokens/pa/paLightTheme.d.ts +53 -97
  54. package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -0
  55. package/dist/designTokens/tokens/semanticTokens.d.ts +112 -0
  56. package/dist/main-CI6Q9nmO.js +39234 -0
  57. package/dist/synapse.css +1 -1
  58. package/dist/vuetifyConfig.js +208 -72
  59. package/package.json +4 -2
  60. package/src/assets/overrides/_icons.scss +5 -4
  61. package/src/assets/overrides/_otp.scss +4 -4
  62. package/src/assets/overrides/_typography.scss +2 -1
  63. package/src/assets/overrides/_utilities.scss +1 -42
  64. package/src/components/ChipList/ChipList.vue +30 -18
  65. package/src/components/ChipList/tests/chipList.spec.ts +4 -4
  66. package/src/components/CopyBtn/CopyBtn.vue +2 -2
  67. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.stories.ts +4 -0
  68. package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +7 -6
  69. package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +223 -0
  70. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +283 -351
  71. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +182 -218
  72. package/src/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.ts +101 -0
  73. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +761 -1
  74. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +3 -1
  75. package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +79 -5
  76. package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +1029 -0
  77. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +9 -491
  78. package/src/components/Customs/Selects/SySelect/SySelect.vue +46 -79
  79. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +3 -0
  80. package/src/components/Customs/Selects/SySelect/composables/useSySelectValidation.ts +64 -0
  81. package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +196 -0
  82. package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1026 -0
  83. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +18 -7
  84. package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +2 -2
  85. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +8 -8
  86. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +8 -8
  87. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +1 -1
  88. package/src/components/Customs/SyIcon/accessibilite/Accessibility.mdx +0 -6
  89. package/src/components/Customs/SyIcon/utils/tests/iconUtils.spec.ts +107 -0
  90. package/src/components/Customs/SyRadioGroup/SyRadioGroup.mdx +2 -2
  91. package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +395 -200
  92. package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +82 -127
  93. package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +127 -0
  94. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.a11y.spec.ts +93 -1
  95. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.spec.ts +146 -9
  96. package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.visual.cy.ts +165 -0
  97. package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +773 -0
  98. package/src/components/Customs/SyTabs/config.ts +3 -3
  99. package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +265 -0
  100. package/src/components/Customs/SyTabs/tests/useTabTransition.spec.ts +188 -0
  101. package/src/components/Customs/SyTextField/SyTextField.stories.ts +10 -29
  102. package/src/components/Customs/SyTextField/SyTextField.vue +23 -15
  103. package/src/components/DataList/DataList.stories.ts +1 -1
  104. package/src/components/DataListItem/tests/DataListItem.spec.ts +3 -1
  105. package/src/components/DatePicker/CalendarMode/DatePicker.vue +37 -142
  106. package/src/components/DatePicker/CalendarMode/tests/DatePicker.coverage.spec.ts +156 -0
  107. package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +495 -4
  108. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +47 -66
  109. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +206 -0
  110. package/src/components/DatePicker/ComplexDatePicker/tests/bridge-integration.regression.spec.ts +210 -0
  111. package/src/components/DatePicker/ComplexDatePicker/tests/calendar-navigation.regression.spec.ts +214 -0
  112. package/src/components/DatePicker/ComplexDatePicker/tests/validation-cross.regression.spec.ts +194 -0
  113. package/src/components/DatePicker/ComplexDatePicker/tests/validation-success-messages.regression.spec.ts +83 -0
  114. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +129 -54
  115. package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +320 -0
  116. package/src/components/DatePicker/composables/index.ts +1 -0
  117. package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +360 -0
  118. package/src/components/DatePicker/composables/tests/useDatePickerValidationBridge.spec.ts +129 -0
  119. package/src/components/DatePicker/composables/useDatePickerValidationBridge.ts +205 -0
  120. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +1 -1
  121. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +1 -1
  122. package/src/components/DatePicker/tests/exposed-methods.coverage.spec.ts +75 -0
  123. package/src/components/DialogBox/DialogBox.vue +1 -1
  124. package/src/components/FileList/UploadItem/UploadItem.vue +4 -4
  125. package/src/components/FileUpload/FileUpload.vue +2 -2
  126. package/src/components/FileUpload/FileUploadContent.vue +1 -1
  127. package/src/components/FilterInline/FilterInline.mdx +2 -2
  128. package/src/components/FilterSideBar/FilterSideBar.stories.ts +1 -1
  129. package/src/components/FilterSideBar/FilterSideBar.vue +2 -2
  130. package/src/components/FooterBar/FooterBar.vue +7 -7
  131. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
  132. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -2
  133. package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +7 -7
  134. package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +2 -2
  135. package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +87 -8
  136. package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +3 -3
  137. package/src/components/HeaderNavigationBar/HorizontalNavbar/tests/HorizontalNavbar.spec.ts +589 -0
  138. package/src/components/HeaderToolbar/tests/HeaderToolBar.spec.ts +153 -1
  139. package/src/components/HeaderToolbar/tests/useMobileRightMenu.spec.ts +258 -0
  140. package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +2 -2
  141. package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +1 -1
  142. package/src/components/LunarCalendar/tests/useLunarCalendarRules.spec.ts +184 -0
  143. package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +3 -3
  144. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +1 -1
  145. package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +2 -2
  146. package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +1 -1
  147. package/src/components/NirField/NirField.vue +3 -3
  148. package/src/components/NotificationBar/Notification/Notification.vue +12 -12
  149. package/src/components/NotificationBar/NotificationBar.stories.ts +8 -8
  150. package/src/components/PaginatedTable/Pagination.vue +2 -2
  151. package/src/components/PasswordField/PasswordField.vue +8 -8
  152. package/src/components/PasswordField/tests/PasswordField.spec.ts +3 -3
  153. package/src/components/RangeField/RangeSlider/RangeSlider.vue +2 -2
  154. package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
  155. package/src/components/StatusPage/tests/StatusPage.spec.ts +149 -0
  156. package/src/components/SubHeader/SubHeader.vue +1 -1
  157. package/src/components/SyAlert/SyAlert.vue +23 -23
  158. package/src/components/SyTextArea/SyTextArea.stories.ts +177 -131
  159. package/src/components/SyTextArea/SyTextArea.vue +235 -83
  160. package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +81 -0
  161. package/src/components/SyTextArea/locales.ts +1 -0
  162. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +449 -1
  163. package/src/components/SyTextArea/useDefaultValidationRules.ts +2 -7
  164. package/src/components/SyTextArea/validation/Validation.stories.ts +856 -0
  165. package/src/components/TableToolbar/TableToolbar.vue +6 -6
  166. package/src/components/TableToolbar/accessibilite/Accessibility.mdx +81 -7
  167. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +163 -0
  168. package/src/components/Tables/SyServerTable/SyServerTable.vue +2 -1
  169. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
  170. package/src/components/Tables/SyTable/SyTable.stories.ts +94 -0
  171. package/src/components/Tables/SyTable/SyTable.vue +2 -1
  172. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +64 -0
  173. package/src/components/Tables/common/TableHeader.vue +2 -2
  174. package/src/components/Tables/common/filters/logics/tests/NumberFilterLogic.spec.ts +176 -0
  175. package/src/components/Tables/common/filters/logics/tests/SelectFilterLogic.spec.ts +111 -0
  176. package/src/components/Tables/common/tableStyles.scss +6 -6
  177. package/src/components/Tables/common/types.ts +2 -0
  178. package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +2 -0
  179. package/src/components/index.ts +1 -0
  180. package/src/composables/date/tests/useDateFormatDayjs.spec.ts +31 -0
  181. package/src/composables/date/tests/useHolidayDay.spec.ts +109 -0
  182. package/src/composables/rules/tests/useFieldValidation.spec.ts +374 -0
  183. package/src/composables/tests/useError.spec.ts +30 -0
  184. package/src/composables/tests/useFormFieldErrorHandling.spec.ts +234 -0
  185. package/src/composables/unifyValidation/documentationValidationProps.ts +5 -5
  186. package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +177 -0
  187. package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +30 -0
  188. package/src/composables/unifyValidation/tests/useValidation.spec.ts +6 -2
  189. package/src/composables/unifyValidation/useCustomValidation.ts +19 -9
  190. package/src/composables/unifyValidation/useValidation.ts +18 -21
  191. package/src/composables/useFilterable/useFilterable.spec.ts +42 -0
  192. package/src/composables/useFilterable/useFilterable.ts +11 -7
  193. package/src/composables/useFormFieldErrorHandling.ts +2 -2
  194. package/src/composantsVuetify/VBtn/VBtn.mdx +9 -39
  195. package/src/composantsVuetify/VBtn/v-btn.stories.ts +26 -86
  196. package/src/designTokens/tokens/amelipro/apContextual.ts +6 -0
  197. package/src/designTokens/tokens/amelipro/apDarkTheme.ts +2 -2
  198. package/src/designTokens/tokens/amelipro/apLightTheme.ts +72 -103
  199. package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
  200. package/src/designTokens/tokens/baseContextualTokens.ts +1 -6
  201. package/src/designTokens/tokens/baseTokens.ts +232 -0
  202. package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -0
  203. package/src/designTokens/tokens/cnam/cnamDarkTheme.ts +2 -2
  204. package/src/designTokens/tokens/cnam/cnamLightTheme.ts +76 -104
  205. package/src/designTokens/tokens/pa/paDarkTheme.ts +2 -2
  206. package/src/designTokens/tokens/pa/paLightTheme.ts +73 -99
  207. package/src/designTokens/tokens/pa/paSemantic.ts +2 -0
  208. package/src/designTokens/tokens/semanticTokens.ts +114 -0
  209. package/src/stories/Components/Components.stories.ts +7 -3
  210. package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -3
  211. package/src/stories/DesignTokens/Colors.mdx +6 -8
  212. package/src/stories/DesignTokens/colors.stories.ts +244 -1081
  213. package/src/utils/amelipro/toKebabCase/tests/toKebabCase.spec.ts +52 -0
  214. package/src/utils/formatNir/tests/formatNir.spec.ts +34 -0
  215. package/src/utils/tests/insertAt.spec.ts +44 -0
  216. package/dist/apLightTheme-DS0Uy44H.js +0 -954
  217. package/dist/components/RatingPicker/tests/RatingPicker.a11y.spect.d.ts +0 -1
  218. package/dist/main-BsJ9ec3i.js +0 -38954
  219. package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
  220. package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
  221. package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
  222. package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
  223. package/src/components/DatePicker/CalendarMode/tests/DatePicker.events.spec.ts +0 -178
  224. package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
  225. package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
  226. package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
  227. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
  228. package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
  229. package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
  230. package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
  231. package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
  232. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
  233. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
  234. package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
  235. package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
  236. package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
  237. package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
  238. package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
  239. package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
  240. package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
  241. package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
  242. package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
  243. package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
  244. package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
  245. package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
  246. package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
  247. package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
  248. package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
  249. package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
  250. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
  251. package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
  252. package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
  253. /package/src/components/RatingPicker/tests/{RatingPicker.a11y.spect.ts → RatingPicker.a11y.spec.ts} +0 -0
@@ -4,12 +4,11 @@
4
4
  import DateTextInput from '../DateTextInput/DateTextInput.vue'
5
5
  import ComplexDatePicker from '../ComplexDatePicker/ComplexDatePicker.vue'
6
6
  import { VDatePicker } from 'vuetify/components'
7
- import { useValidation, type ValidationResult, type ValidationRule } from '@/composables/validation/useValidation'
8
7
  import { useValidatable } from '@/composables/validation/useValidatable'
9
8
  import { useDateFormat } from '@/composables/date/useDateFormatDayjs'
10
9
  import { useDateInitialization, type DateModelValue, type DateInput } from '@/composables/date/useDateInitializationDayjs'
11
10
  import { useDatePickerAccessibility } from '@/composables/date/useDatePickerAccessibility'
12
- import { useWeekendDays, useTodayButton, useDatePickerViewMode, useDateSelection, useMonthButtonCustomization, useDisplayedDateString, useAsteriskDisplay, useDateValidation, useDatePickerState, useHolidayHighlighting, useCalendarKeyboardNavigation, useDatePickerFocusTrap } from '../composables'
11
+ import { useWeekendDays, useTodayButton, useDatePickerViewMode, useDateSelection, useMonthButtonCustomization, useDisplayedDateString, useAsteriskDisplay, useDatePickerState, useHolidayHighlighting, useCalendarKeyboardNavigation, useDatePickerFocusTrap, useDatePickerValidationBridge } from '../composables'
13
12
  import { DATE_PICKER_MESSAGES } from '../constants/messages'
14
13
  import dayjs from 'dayjs'
15
14
  import customParseFormat from 'dayjs/plugin/customParseFormat'
@@ -250,69 +249,6 @@
250
249
  (e: 'date-selected', value: DateModelValue): void
251
250
  }>()
252
251
 
253
- const validation = useValidation({
254
- showSuccessMessages: props.showSuccessMessages,
255
- fieldIdentifier: 'Date',
256
- disableErrorHandling: props.disableErrorHandling,
257
- })
258
- const { errors, warnings, successes, validateField: baseValidateField, clearValidation: baseClearValidation } = validation
259
-
260
- const clearValidation = () => baseClearValidation()
261
-
262
- watch(() => props.readonly, () => {
263
- // When toggling readonly, reset validation state to avoid stale success/errors
264
- errors.value = []
265
- warnings.value = []
266
- successes.value = []
267
- })
268
-
269
- const validateField = (
270
- value: unknown,
271
- rules: ValidationRule[] = [],
272
- warningRules: ValidationRule[] = [],
273
- successRules: ValidationRule[] = [],
274
- ): Promise<ValidationResult> | ValidationResult => {
275
- if (props.readonly) {
276
- return {
277
- hasError: false,
278
- hasWarning: false,
279
- hasSuccess: false,
280
- state: { errors: [], warnings: [], successes: [] },
281
- }
282
- }
283
-
284
- return baseValidateField(value, rules, warningRules, successRules)
285
- }
286
-
287
- const validateFieldForDateValidation = (
288
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- compat signature with useDateValidation
289
- value: any,
290
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- compat signature with useDateValidation
291
- rules: any[] = [],
292
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- compat signature with useDateValidation
293
- warningRules: any[] = [],
294
- ): ValidationResult => {
295
- if (props.readonly) {
296
- return {
297
- hasError: false,
298
- hasWarning: false,
299
- hasSuccess: false,
300
- state: {
301
- errors: [],
302
- warnings: [],
303
- successes: [],
304
- },
305
- }
306
- }
307
-
308
- return validateField(value, rules, warningRules, []) as ValidationResult
309
- }
310
-
311
- const errorMessages = errors
312
- const warningMessages = warnings
313
- const successMessages = validation.displaySuccesses
314
- const isOnSuccess = computed(() => successes.value.length > 0 && errors.value.length === 0 && warnings.value.length === 0)
315
-
316
252
  // Variable pour éviter les mises à jour récursives
317
253
  const isUpdatingFromInternal = ref(false)
318
254
  const preventCloseOnKeyboardNavigation = ref(false)
@@ -320,78 +256,37 @@
320
256
  const currentRangeIsValid = ref(true)
321
257
  const getRangeValidationError = ref('')
322
258
 
323
- const { validateDates: coreValidateDates } = useDateValidation({
259
+ const {
260
+ validation,
261
+ errors,
262
+ warnings,
263
+ successes,
264
+ clearValidation,
265
+ validateDates,
266
+ } = useDatePickerValidationBridge({
267
+ showSuccessMessages: props.showSuccessMessages,
268
+ disableErrorHandling: props.disableErrorHandling,
324
269
  noCalendar: props.noCalendar,
325
- // On garde la logique "required" spécifique à CalendarMode
326
- required: false,
270
+ required: props.required,
327
271
  displayRange: props.displayRange,
328
- disableErrorHandling: props.disableErrorHandling,
329
272
  customRules: computed(() => props.customRules),
330
273
  customWarningRules: computed(() => props.customWarningRules),
331
274
  selectedDates: selectedDates as Ref<DateObjectValue>,
332
275
  isUpdatingFromInternal,
333
276
  currentRangeIsValid,
334
277
  getRangeValidationError,
335
- clearValidation,
336
- validateField: validateFieldForDateValidation,
337
- errors,
338
- warnings,
339
- successes,
278
+ readonly: computed(() => props.readonly),
279
+ skipValidationWhenReadonly: true,
280
+ useCalendarModeRequiredFlow: true,
281
+ isInitialValidation,
282
+ isValidateOnBlur: computed(() => props.isValidateOnBlur),
283
+ onblur,
340
284
  })
341
285
 
342
- // Fonction pour valider les dates
343
- const validateDates = async (forceValidation = false) => {
344
- if (props.noCalendar) {
345
- // En mode no-calendar, on délègue la validation au DateTextInput
346
- return
347
- }
348
-
349
- // Réinitialiser la validation
350
- clearValidation()
351
-
352
- // Si la gestion des erreurs est désactivée, on effectue la validation interne
353
- // mais on n'ajoute pas les messages d'erreur
354
- const shouldDisplayErrors = !props.disableErrorHandling
355
-
356
- // Vérifier si le champ est requis et vide
357
- if ((forceValidation || !isUpdatingFromInternal.value) && props.required && (!selectedDates.value || (Array.isArray(selectedDates.value) && selectedDates.value.length === 0))) {
358
- if (props.readonly) {
359
- return
360
- }
361
- // Ne pas afficher d'erreur si on est sur une perte de focus et si isValidateOnBlur est false
362
- if (onblur.value && !props.isValidateOnBlur) {
363
- return
364
- }
365
- // Ne pas afficher d'erreur si on est dans le contexte du mounted initial
366
- if (shouldDisplayErrors && (!isInitialValidation.value || forceValidation)) {
367
- errors.value.push(DATE_PICKER_MESSAGES.ERROR_REQUIRED)
368
- }
369
- return
370
- }
371
- // Permettre aux custom rules de s'exécuter même sur des champs vides
372
- if (!selectedDates.value) {
373
- if (!props.customRules || props.customRules.length === 0) return
374
-
375
- if (shouldDisplayErrors && (!isInitialValidation.value || forceValidation)) {
376
- // Comportement historique : exécuter directement les règles personnalisées même si la valeur est vide
377
- await validateField(
378
- selectedDates.value,
379
- props.customRules,
380
- props.customWarningRules,
381
- )
382
- // Dédoublonner les messages comme auparavant
383
- errors.value = [...new Set(errors.value)]
384
- warnings.value = [...new Set(warnings.value)]
385
- successes.value = [...new Set(successes.value)]
386
- }
387
- return
388
- }
389
-
390
- // Ne pas afficher d'erreurs de custom rules si on est dans le contexte du mounted initial
391
- if (shouldDisplayErrors && (!isInitialValidation.value || forceValidation)) {
392
- await coreValidateDates(forceValidation)
393
- }
394
- }
286
+ const errorMessages = errors
287
+ const warningMessages = warnings
288
+ const successMessages = validation.displaySuccesses
289
+ const isOnSuccess = computed(() => successes.value.length > 0 && errors.value.length === 0 && warnings.value.length === 0)
395
290
 
396
291
  // Fonction centralisée pour mettre à jour le modèle
397
292
  const updateModel = async (value: DateModelValue) => {
@@ -409,9 +304,9 @@
409
304
  }
410
305
  finally {
411
306
  // S'assurer que le flag est toujours réinitialisé
412
- setTimeout(() => {
307
+ queueMicrotask(() => {
413
308
  isUpdatingFromInternal.value = false
414
- }, 0)
309
+ })
415
310
  }
416
311
  }
417
312
 
@@ -447,9 +342,9 @@
447
342
  }
448
343
  }
449
344
  finally {
450
- setTimeout(() => {
345
+ queueMicrotask(() => {
451
346
  isUpdatingFromInternal.value = false
452
- }, 0)
347
+ })
453
348
  }
454
349
  }
455
350
  else {
@@ -497,7 +392,7 @@
497
392
 
498
393
  // Gestionnaire pour les mises à jour du DateTextInput en mode no-calendar
499
394
  const handleDateTextInputUpdate = async (value: DateModelValue) => {
500
- if (isUpdatingFromInternal.value) return
395
+ if (isUpdatingFromInternal.value && !props.noCalendar) return
501
396
 
502
397
  try {
503
398
  isUpdatingFromInternal.value = true
@@ -1217,13 +1112,13 @@
1217
1112
  .v-messages__message--success {
1218
1113
  :deep(.v-input__control),
1219
1114
  :deep(.v-messages__message) {
1220
- color: rgb(var(--v-theme-textSuccess)) !important;
1115
+ color: rgb(var(--v-theme-onSuccessVariant)) !important;
1221
1116
 
1222
1117
  --v-medium-emphasis-opacity: 1;
1223
1118
  }
1224
1119
 
1225
1120
  .v-field--active & {
1226
- color: rgb(var(--v-theme-borderSuccess)) !important;
1121
+ color: rgb(var(--v-theme-onSuccessVariant)) !important;
1227
1122
  }
1228
1123
  }
1229
1124
 
@@ -1241,33 +1136,33 @@
1241
1136
 
1242
1137
  .v-messages__message--error {
1243
1138
  :deep(.v-input__control) {
1244
- color: rgb(var(--v-theme-textError)) !important;
1139
+ color: rgb(var(--v-theme-error)) !important;
1245
1140
 
1246
1141
  --v-medium-emphasis-opacity: 1;
1247
1142
  }
1248
1143
 
1249
1144
  :deep(.v-messages__message) {
1250
- color: rgb(var(--v-theme-textError)) !important;
1145
+ color: rgb(var(--v-theme-error)) !important;
1251
1146
  }
1252
1147
 
1253
1148
  .v-field--active & {
1254
- color: rgb(var(--v-theme-borderError)) !important;
1149
+ color: rgb(var(--v-theme-error)) !important;
1255
1150
  }
1256
1151
  }
1257
1152
 
1258
1153
  .v-messages__message--warning {
1259
1154
  :deep(.v-input__control) {
1260
- color: rgb(var(--v-theme-textWarning)) !important;
1155
+ color: rgb(var(--v-theme-onWarningVariant)) !important;
1261
1156
 
1262
1157
  --v-medium-emphasis-opacity: 1;
1263
1158
  }
1264
1159
 
1265
1160
  :deep(.v-messages__message) {
1266
- color: rgb(var(--v-theme-textWarning)) !important;
1161
+ color: rgb(var(--v-theme-onWarningVariant)) !important;
1267
1162
  }
1268
1163
 
1269
1164
  .v-field--active & {
1270
- color: rgb(var(--v-theme-textWarning)) !important;
1165
+ color: rgb(var(--v-theme-onWarningVariant)) !important;
1271
1166
  }
1272
1167
  }
1273
1168
 
@@ -1308,7 +1203,7 @@
1308
1203
  }
1309
1204
 
1310
1205
  :deep(.v-date-picker-month__day .v-btn:hover) {
1311
- background-color: rgb(var(--v-theme-backgroundMain));
1206
+ background-color: rgb(var(--v-theme-background));
1312
1207
  }
1313
1208
 
1314
1209
  :deep(.v-date-picker-month__day--selected, .v-date-picker-month__day--adjacent) {
@@ -1316,7 +1211,7 @@
1316
1211
  }
1317
1212
 
1318
1213
  :deep(.v-date-picker-month__day--selected .v-btn:hover) {
1319
- background-color: rgb(var(--v-theme-backgroundAccentContrasted)) !important;
1214
+ background-color: rgb(var(--v-theme-primaryVariant)) !important;
1320
1215
  }
1321
1216
 
1322
1217
  .fade-enter-active,
@@ -0,0 +1,156 @@
1
+ import { mount, flushPromises } from '@vue/test-utils'
2
+ import { describe, it, expect, vi, afterEach } from 'vitest'
3
+ import { nextTick } from 'vue'
4
+ import DatePicker from '../DatePicker.vue'
5
+
6
+ describe('DatePicker.vue - coverage', () => {
7
+ afterEach(() => {
8
+ vi.useRealTimers()
9
+ })
10
+
11
+ it('handleDateTextInputUpdate null efface selectedDates (noCalendar)', async () => {
12
+ const w = mount(DatePicker, {
13
+ props: { label: 'Date', modelValue: '01/01/2025', format: 'DD/MM/YYYY', noCalendar: true },
14
+ })
15
+ await flushPromises()
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ await (w.vm as any).handleDateTextInputUpdate(null)
18
+ await flushPromises()
19
+ expect(w.vm.selectedDates).toBeNull()
20
+ w.unmount()
21
+ })
22
+
23
+ it('handleDateTextInputUpdate array range met à jour selectedDates (noCalendar)', async () => {
24
+ const w = mount(DatePicker, {
25
+ props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', noCalendar: true, displayRange: true },
26
+ })
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ await (w.vm as any).handleDateTextInputUpdate(['01/01/2025', '10/01/2025'])
29
+ await flushPromises()
30
+ expect(w.vm.selectedDates).not.toBeNull()
31
+ w.unmount()
32
+ })
33
+
34
+ it('handleDateTextInputSelection met à jour le modèle', async () => {
35
+ const w = mount(DatePicker, {
36
+ props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', noCalendar: true },
37
+ })
38
+ const input = w.find('input')
39
+ await input.setValue('01/01/2025')
40
+ await input.trigger('blur')
41
+ await flushPromises()
42
+ const emitted = w.emitted('update:modelValue')
43
+ expect(emitted).toBeTruthy()
44
+ w.unmount()
45
+ })
46
+
47
+ it('watcher modelValue array range met à jour textInputValue (noCalendar)', async () => {
48
+ const w = mount(DatePicker, {
49
+ props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', noCalendar: true, displayRange: true },
50
+ })
51
+ await w.setProps({ modelValue: ['01/01/2025', '10/01/2025'] })
52
+ await flushPromises()
53
+ expect(w.exists()).toBe(true)
54
+ w.unmount()
55
+ })
56
+
57
+ it('watcher modelValue string execute le watcher noCalendar (valeur valide)', async () => {
58
+ vi.useFakeTimers()
59
+ const w = mount(DatePicker, {
60
+ props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', noCalendar: true },
61
+ })
62
+ await w.setProps({ modelValue: '15/06/2025' })
63
+ await nextTick()
64
+ vi.runAllTimers()
65
+ await nextTick()
66
+ expect(w.exists()).toBe(true)
67
+ w.unmount()
68
+ })
69
+
70
+ it('watcher modelValue string invalide execute le watcher noCalendar', async () => {
71
+ vi.useFakeTimers()
72
+ const w = mount(DatePicker, {
73
+ props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', noCalendar: true },
74
+ })
75
+ await w.setProps({ modelValue: 'invalid-date' })
76
+ await nextTick()
77
+ vi.runAllTimers()
78
+ await nextTick()
79
+ expect(w.exists()).toBe(true)
80
+ w.unmount()
81
+ })
82
+
83
+ it('watcher selectedDates null remet currentMonth/Year à today', async () => {
84
+ const w = mount(DatePicker, {
85
+ props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY' },
86
+ })
87
+ w.vm.selectedDates = new Date(2020, 5, 15)
88
+ await nextTick()
89
+ w.vm.selectedDates = null
90
+ await nextTick()
91
+ const today = new Date()
92
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
93
+ expect((w.vm as any).currentYear).toBe(today.getFullYear().toString())
94
+ w.unmount()
95
+ })
96
+
97
+ it('syncDisplayedMonthYearFromDate met à jour currentMonth et currentYear', async () => {
98
+ const w = mount(DatePicker, {
99
+ props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY' },
100
+ })
101
+ const date = new Date(2028, 3, 15) // Avril 2028
102
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
103
+ ;(w.vm as any).syncDisplayedMonthYearFromDate(date)
104
+ await nextTick()
105
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
106
+ expect((w.vm as any).currentMonth).toBe('3')
107
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
108
+ expect((w.vm as any).currentYear).toBe('2028')
109
+ w.unmount()
110
+ })
111
+
112
+ it('openDatePickerOnFocus émet focus', async () => {
113
+ const w = mount(DatePicker, {
114
+ props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY' },
115
+ })
116
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
+ ;(w.vm as any).openDatePickerOnFocus()
118
+ await nextTick()
119
+ expect(w.emitted('focus')).toBeTruthy()
120
+ w.unmount()
121
+ })
122
+
123
+ it('openDatePickerOnIconClick ne fait rien si readonly', async () => {
124
+ const w = mount(DatePicker, {
125
+ props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', readonly: true },
126
+ })
127
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
128
+ ;(w.vm as any).openDatePickerOnIconClick()
129
+ await nextTick()
130
+ expect(w.vm.isDatePickerVisible).toBe(false)
131
+ w.unmount()
132
+ })
133
+
134
+ it('watcher displayFormattedDate disabled sync depuis modelValue', async () => {
135
+ const w = mount(DatePicker, {
136
+ props: { label: 'Date', modelValue: '01/01/2025', format: 'DD/MM/YYYY', disabled: true },
137
+ })
138
+ await flushPromises()
139
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
140
+ ;(w.vm as any).displayFormattedDate = ''
141
+ await nextTick()
142
+ expect(w.exists()).toBe(true)
143
+ w.unmount()
144
+ })
145
+
146
+ it('handleSelectToday displayRange sélectionne les deux dates', async () => {
147
+ const w = mount(DatePicker, {
148
+ props: { label: 'Date', modelValue: '', format: 'DD/MM/YYYY', displayRange: true },
149
+ })
150
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
151
+ ;(w.vm as any).handleSelectToday()
152
+ await flushPromises()
153
+ expect(w.emitted('update:modelValue')).toBeTruthy()
154
+ w.unmount()
155
+ })
156
+ })