@cnamts/synapse 1.0.0 → 1.0.1

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 (395) hide show
  1. package/dist/DateFilter-BmRuzQ9Z.js +98 -0
  2. package/dist/NumberFilter-CnIPDHqx.js +121 -0
  3. package/dist/PeriodFilter-CZwZ8CnQ.js +112 -0
  4. package/dist/SelectFilter-Cj-GW2Cc.js +97 -0
  5. package/dist/TextFilter-DTxZHJwX.js +114 -0
  6. package/dist/{components/BackBtn → common}/constants/ExpertiseLevelEnum.d.ts +3 -0
  7. package/dist/components/BackBtn/AccessibiliteItems.d.ts +1 -1
  8. package/dist/components/BackToTopBtn/AccessibiliteItems.d.ts +1 -1
  9. package/dist/components/ChipList/AccessibiliteItems.d.ts +1 -1
  10. package/dist/components/CollapsibleList/AccessibiliteItems.d.ts +1 -1
  11. package/dist/components/ContextualMenu/AccessibiliteItems.d.ts +1 -1
  12. package/dist/components/CookieBanner/AccessibiliteItems.d.ts +1 -1
  13. package/dist/components/CopyBtn/AccessibiliteItems.d.ts +1 -1
  14. package/dist/components/Customs/SyBtnSelect/AccessibiliteItems.d.ts +1 -1
  15. package/dist/components/Customs/SyInputSelect/AccessibiliteItems.d.ts +1 -1
  16. package/dist/components/Customs/SySelect/AccessibiliteItems.d.ts +1 -1
  17. package/dist/components/Customs/SyTextField/AccessibiliteItems.d.ts +1 -1
  18. package/dist/components/DataList/AccessibiliteItems.d.ts +1 -1
  19. package/dist/components/DataListGroup/AccessibiliteItems.d.ts +1 -1
  20. package/dist/components/DatePicker/AccessibiliteItems.d.ts +1 -1
  21. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +4162 -0
  22. package/dist/components/DatePicker/{DatePicker.d.ts → DatePicker/DatePicker.d.ts} +142 -102
  23. package/dist/components/DatePicker/{DateTextInput.d.ts → DateTextInput/DateTextInput.d.ts} +32 -26
  24. package/dist/components/DatePicker/composables/index.d.ts +15 -0
  25. package/dist/components/DatePicker/composables/useDateFormatValidation.d.ts +25 -0
  26. package/dist/components/DatePicker/composables/useDateInputEditing.d.ts +33 -0
  27. package/dist/components/DatePicker/composables/useDatePickerViewMode.d.ts +16 -0
  28. package/dist/components/DatePicker/composables/useDatePickerVisibility.d.ts +27 -0
  29. package/dist/components/DatePicker/composables/useDateRangeInput.d.ts +29 -0
  30. package/dist/components/DatePicker/composables/useDateRangeValidation.d.ts +11 -0
  31. package/dist/components/DatePicker/composables/useDateSelection.d.ts +10 -0
  32. package/dist/components/DatePicker/composables/useDateValidation.d.ts +35 -0
  33. package/dist/components/DatePicker/composables/useDisplayedDateString.d.ts +16 -0
  34. package/dist/components/DatePicker/composables/useIconState.d.ts +17 -0
  35. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +30 -0
  36. package/dist/components/DatePicker/composables/useInputHandler.d.ts +32 -0
  37. package/dist/components/DatePicker/composables/useManualDateValidation.d.ts +33 -0
  38. package/dist/components/DatePicker/composables/useMonthButtonCustomization.d.ts +9 -0
  39. package/dist/components/DatePicker/composables/useTodayButton.d.ts +16 -0
  40. package/dist/components/DatePicker/composables/useWeekendDays.d.ts +11 -0
  41. package/dist/components/DatePicker/constants/messages.d.ts +29 -0
  42. package/dist/components/DatePicker/types.d.ts +13 -0
  43. package/dist/components/DialogBox/AccessibiliteItems.d.ts +1 -1
  44. package/dist/components/DownloadBtn/AccessibiliteItems.d.ts +1 -1
  45. package/dist/components/ErrorPage/AccessibiliteItems.d.ts +1 -1
  46. package/dist/components/ExternalLinks/AccessibiliteItems.d.ts +1 -1
  47. package/dist/components/FileList/AccessibiliteItems.d.ts +1 -1
  48. package/dist/components/FilePreview/AccessibiliteItems.d.ts +1 -1
  49. package/dist/components/FileUpload/AccessibiliteItems.d.ts +1 -1
  50. package/dist/components/FilterInline/AccessibiliteItems.d.ts +1 -1
  51. package/dist/components/FilterSideBar/AccessibiliteItems.d.ts +1 -1
  52. package/dist/components/FilterSideBar/FilterSideBar.d.ts +395 -1
  53. package/dist/components/FooterBar/AccessibiliteItems.d.ts +1 -1
  54. package/dist/components/FranceConnectBtn/AccessibiliteItems.d.ts +1 -1
  55. package/dist/components/HeaderBar/AccessibiliteItems.d.ts +1 -1
  56. package/dist/components/HeaderBar/HeaderBurgerMenu/AccessibiliteItems.d.ts +1 -1
  57. package/dist/components/HeaderLoading/AccessibiliteItems.d.ts +1 -1
  58. package/dist/components/HeaderToolbar/AccessibiliteItems.d.ts +1 -1
  59. package/dist/components/LangBtn/AccessibiliteItems.d.ts +1 -1
  60. package/dist/components/Logo/AccessibiliteItems.d.ts +1 -1
  61. package/dist/components/LogoBrandSection/AccessibiliteItems.d.ts +1 -1
  62. package/dist/components/MaintenancePage/AccessibiliteItems.d.ts +1 -1
  63. package/dist/components/NirField/AccessibiliteItems.d.ts +1 -1
  64. package/dist/components/NotFoundPage/AccessibiliteItems.d.ts +1 -1
  65. package/dist/components/NotificationBar/AccessibiliteItems.d.ts +1 -1
  66. package/dist/components/PageContainer/AccessibiliteItems.d.ts +1 -1
  67. package/dist/components/PaginatedTable/AccessibiliteItems.d.ts +1 -1
  68. package/dist/components/PasswordField/AccessibiliteItems.d.ts +1 -1
  69. package/dist/components/PeriodField/AccessibiliteItems.d.ts +1 -1
  70. package/dist/components/PeriodField/PeriodField.d.ts +171 -37
  71. package/dist/components/PhoneField/AccessibiliteItems.d.ts +1 -1
  72. package/dist/components/RangeField/AccessibiliteItems.d.ts +1 -1
  73. package/dist/components/RatingPicker/AccessibiliteItems.d.ts +1 -1
  74. package/dist/components/SearchListField/AccessibiliteItems.d.ts +1 -1
  75. package/dist/components/SelectBtnField/AccessibiliteItems.d.ts +1 -1
  76. package/dist/components/SkipLink/AccessibiliteItems.d.ts +1 -1
  77. package/dist/components/SocialMediaLinks/AccessibiliteItems.d.ts +1 -1
  78. package/dist/components/SubHeader/AccessibiliteItems.d.ts +1 -1
  79. package/dist/components/SyAlert/AccessibiliteItems.d.ts +1 -1
  80. package/dist/components/TableToolbar/AccessibiliteItems.d.ts +1 -1
  81. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +647 -0
  82. package/dist/components/Tables/SyTable/SyTable.d.ts +666 -0
  83. package/dist/components/Tables/common/SyTableFilter.d.ts +126 -0
  84. package/dist/components/Tables/common/TableHeader.d.ts +33 -0
  85. package/dist/components/Tables/common/constants/StateEnum.d.ts +6 -0
  86. package/dist/components/Tables/common/filters/DateFilter.d.ts +121 -0
  87. package/dist/components/Tables/common/filters/NumberFilter.d.ts +132 -0
  88. package/dist/components/Tables/common/filters/PeriodFilter.d.ts +135 -0
  89. package/dist/components/Tables/common/filters/SelectFilter.d.ts +120 -0
  90. package/dist/components/Tables/common/filters/TextFilter.d.ts +132 -0
  91. package/dist/components/Tables/common/formatters.d.ts +17 -0
  92. package/dist/components/Tables/common/locales.d.ts +7 -0
  93. package/dist/components/Tables/common/tableAccessibilityUtils.d.ts +8 -0
  94. package/dist/components/Tables/common/tableFilterUtils.d.ts +2 -0
  95. package/dist/components/Tables/common/tableStorageUtils.d.ts +29 -0
  96. package/dist/components/Tables/common/tableUtils.d.ts +42 -0
  97. package/dist/components/Tables/common/types.d.ts +80 -0
  98. package/dist/components/Tables/common/useTableFilter.d.ts +9 -0
  99. package/dist/components/Tables/index.d.ts +2 -0
  100. package/dist/components/UploadWorkflow/AccessibiliteItems.d.ts +1 -1
  101. package/dist/components/UserMenuBtn/AccessibiliteItems.d.ts +1 -1
  102. package/dist/components/index.d.ts +3 -1
  103. package/dist/design-system-v3.js +100 -11944
  104. package/dist/design-system-v3.umd.cjs +22 -4
  105. package/dist/designTokens/index.d.ts +3 -1
  106. package/dist/designTokens/tokens/cnam/cnamFonts.d.ts +140 -0
  107. package/dist/designTokens/tokens/pa/paFonts.d.ts +140 -0
  108. package/dist/designTokens/utils/createFontVariables.d.ts +39 -0
  109. package/dist/designTokens/utils/index.d.ts +2 -1
  110. package/dist/main-WDqeoGM-.js +14788 -0
  111. package/dist/style.css +1 -1
  112. package/dist/utils/rules/isRequired/index.d.ts +1 -1
  113. package/dist/vite-env.d.ts +12 -0
  114. package/package.json +3 -3
  115. package/src/assets/_spacers.scss +37 -1
  116. package/src/assets/_typography.scss +158 -0
  117. package/src/assets/settings.scss +7 -0
  118. package/src/common/constants/ExpertiseLevelEnum.ts +7 -0
  119. package/src/components/BackBtn/AccessibiliteItems.ts +1 -1
  120. package/src/components/BackToTopBtn/AccessibiliteItems.ts +1 -1
  121. package/src/components/ChipList/AccessibiliteItems.ts +1 -1
  122. package/src/components/CollapsibleList/AccessibiliteItems.ts +1 -1
  123. package/src/components/ContextualMenu/AccessibiliteItems.ts +1 -1
  124. package/src/components/CookieBanner/AccessibiliteItems.ts +1 -1
  125. package/src/components/CopyBtn/AccessibiliteItems.ts +1 -1
  126. package/src/components/Customs/SyBtnSelect/AccessibiliteItems.ts +1 -1
  127. package/src/components/Customs/SyInputSelect/AccessibiliteItems.ts +1 -1
  128. package/src/components/Customs/SySelect/AccessibiliteItems.ts +1 -1
  129. package/src/components/Customs/SySelect/SySelect.vue +3 -9
  130. package/src/components/Customs/SySelect/tests/SySelect.spec.ts +4 -2
  131. package/src/components/Customs/SyTextField/AccessibiliteItems.ts +1 -1
  132. package/src/components/DataList/AccessibiliteItems.ts +1 -1
  133. package/src/components/DataListGroup/AccessibiliteItems.ts +1 -1
  134. package/src/components/DatePicker/AccessibiliteItems.ts +1 -1
  135. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.mdx +212 -0
  136. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +1097 -0
  137. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +497 -180
  138. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +941 -0
  139. package/src/components/DatePicker/DatePicker/DatePicker.mdx +176 -0
  140. package/src/components/DatePicker/{tests → DatePicker}/DatePicker.spec.ts +1 -1
  141. package/src/components/DatePicker/{DatePicker.stories.ts → DatePicker/DatePicker.stories.ts} +115 -400
  142. package/src/components/DatePicker/{DatePicker.vue → DatePicker/DatePicker.vue} +302 -84
  143. package/src/components/DatePicker/DatePickerOverview.mdx +227 -0
  144. package/src/components/DatePicker/{DatePickerValidation.mdx → DatePickerValidationExample/DatePickerValidation.mdx} +3 -3
  145. package/src/components/DatePicker/{DatePickerValidation.stories.ts → DatePickerValidationExample/DatePickerValidation.stories.ts} +2 -2
  146. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +310 -0
  147. package/src/components/DatePicker/DateTextInput/DateTextInput.range.spec.ts +278 -0
  148. package/src/components/DatePicker/{tests → DateTextInput}/DateTextInput.spec.ts +8 -7
  149. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +916 -0
  150. package/src/components/DatePicker/DateTextInput/NoCalendar.mdx +64 -0
  151. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +572 -0
  152. package/src/components/DatePicker/composables/index.ts +22 -0
  153. package/src/components/DatePicker/composables/tests/useDateFormatValidation.spec.ts +165 -0
  154. package/src/components/DatePicker/composables/tests/useDateInputEditing.spec.ts +359 -0
  155. package/src/components/DatePicker/composables/tests/useDatePickerViewMode.spec.ts +160 -0
  156. package/src/components/DatePicker/composables/tests/useDatePickerVisibility.spec.ts +339 -0
  157. package/src/components/DatePicker/composables/tests/useDateRangeInput.spec.ts +277 -0
  158. package/src/components/DatePicker/composables/tests/useDateRangeValidation.spec.ts +107 -0
  159. package/src/components/DatePicker/composables/tests/useDateSelection.spec.ts +171 -0
  160. package/src/components/DatePicker/composables/tests/useDateValidation.spec.ts +245 -0
  161. package/src/components/DatePicker/composables/tests/useDisplayedDateString.spec.ts +98 -0
  162. package/src/components/DatePicker/composables/tests/useIconState.spec.ts +130 -0
  163. package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +278 -0
  164. package/src/components/DatePicker/composables/tests/useManualDateValidation.spec.ts +233 -0
  165. package/src/components/DatePicker/composables/tests/useMonthButtonCustomization.spec.ts +100 -0
  166. package/src/components/DatePicker/composables/tests/useTodayButton.spec.ts +97 -0
  167. package/src/components/DatePicker/composables/tests/useWeekendDays.spec.ts +28 -0
  168. package/src/components/DatePicker/composables/useDateFormatValidation.ts +95 -0
  169. package/src/components/DatePicker/composables/useDateInputEditing.ts +326 -0
  170. package/src/components/DatePicker/composables/useDatePickerViewMode.ts +61 -0
  171. package/src/components/DatePicker/composables/useDatePickerVisibility.ts +146 -0
  172. package/src/components/DatePicker/composables/useDateRangeInput.ts +375 -0
  173. package/src/components/DatePicker/composables/useDateRangeValidation.ts +48 -0
  174. package/src/components/DatePicker/composables/useDateSelection.ts +121 -0
  175. package/src/components/DatePicker/composables/useDateValidation.ts +225 -0
  176. package/src/components/DatePicker/composables/useDisplayedDateString.ts +58 -0
  177. package/src/components/DatePicker/composables/useIconState.ts +53 -0
  178. package/src/components/DatePicker/composables/useInputBlurHandler.ts +101 -0
  179. package/src/components/DatePicker/composables/useInputHandler.ts +436 -0
  180. package/src/components/DatePicker/composables/useManualDateValidation.ts +161 -0
  181. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +89 -0
  182. package/src/components/DatePicker/composables/useTodayButton.ts +43 -0
  183. package/src/components/DatePicker/composables/useWeekendDays.ts +21 -0
  184. package/src/components/DatePicker/constants/messages.ts +50 -0
  185. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +4 -4
  186. package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +1 -1
  187. package/src/components/DatePicker/playground/ComplexDatePickerPlayground.vue +172 -0
  188. package/src/components/DatePicker/types.ts +15 -0
  189. package/src/components/DialogBox/AccessibiliteItems.ts +1 -1
  190. package/src/components/DownloadBtn/AccessibiliteItems.ts +1 -1
  191. package/src/components/ErrorPage/AccessibiliteItems.ts +1 -1
  192. package/src/components/ExternalLinks/AccessibiliteItems.ts +1 -1
  193. package/src/components/FileList/AccessibiliteItems.ts +1 -1
  194. package/src/components/FilePreview/AccessibiliteItems.ts +1 -1
  195. package/src/components/FileUpload/AccessibiliteItems.ts +1 -1
  196. package/src/components/FilterInline/AccessibiliteItems.ts +1 -1
  197. package/src/components/FilterSideBar/AccessibiliteItems.ts +1 -1
  198. package/src/components/FilterSideBar/FilterSideBar.vue +108 -90
  199. package/src/components/FilterSideBar/tests/FilterSideBar.spec.ts +27 -0
  200. package/src/components/FilterSideBar/tests/__snapshots__/FilterSideBar.spec.ts.snap +114 -109
  201. package/src/components/FooterBar/AccessibiliteItems.ts +1 -1
  202. package/src/components/FooterBar/FooterBar.vue +2 -1
  203. package/src/components/FranceConnectBtn/AccessibiliteItems.ts +1 -1
  204. package/src/components/HeaderBar/AccessibiliteItems.ts +1 -1
  205. package/src/components/HeaderBar/HeaderBurgerMenu/AccessibiliteItems.ts +1 -1
  206. package/src/components/HeaderLoading/AccessibiliteItems.ts +1 -1
  207. package/src/components/HeaderToolbar/AccessibiliteItems.ts +1 -1
  208. package/src/components/LangBtn/AccessibiliteItems.ts +1 -1
  209. package/src/components/Logo/Accessibilite.stories.ts +4 -0
  210. package/src/components/Logo/AccessibiliteItems.ts +1 -1
  211. package/src/components/LogoBrandSection/AccessibiliteItems.ts +1 -1
  212. package/src/components/MaintenancePage/AccessibiliteItems.ts +1 -1
  213. package/src/components/NirField/AccessibiliteItems.ts +1 -1
  214. package/src/components/NotFoundPage/AccessibiliteItems.ts +1 -1
  215. package/src/components/NotificationBar/AccessibiliteItems.ts +1 -1
  216. package/src/components/PageContainer/AccessibiliteItems.ts +1 -1
  217. package/src/components/PaginatedTable/AccessibiliteItems.ts +1 -1
  218. package/src/components/PaginatedTable/PaginatedTable.stories.ts +19 -0
  219. package/src/components/PaginatedTable/PaginatedTable.vue +51 -13
  220. package/src/components/PaginatedTable/tests/PaginatedTable.spec.ts +0 -2
  221. package/src/components/PasswordField/AccessibiliteItems.ts +1 -1
  222. package/src/components/PeriodField/AccessibiliteItems.ts +1 -1
  223. package/src/components/PeriodField/PeriodField.vue +13 -1
  224. package/src/components/PhoneField/AccessibiliteItems.ts +1 -1
  225. package/src/components/RangeField/AccessibiliteItems.ts +1 -1
  226. package/src/components/RatingPicker/AccessibiliteItems.ts +1 -1
  227. package/src/components/SearchListField/AccessibiliteItems.ts +1 -1
  228. package/src/components/SelectBtnField/AccessibiliteItems.ts +1 -1
  229. package/src/components/SkipLink/AccessibiliteItems.ts +1 -1
  230. package/src/components/SocialMediaLinks/AccessibiliteItems.ts +1 -1
  231. package/src/components/SubHeader/AccessibiliteItems.ts +1 -1
  232. package/src/components/SyAlert/AccessibiliteItems.ts +1 -1
  233. package/src/components/TableToolbar/AccessibiliteItems.ts +1 -1
  234. package/src/components/TableToolbar/TableToolbar.stories.ts +110 -56
  235. package/src/components/Tables/SyServerTable/FilterRules.stories.ts +83 -0
  236. package/src/components/Tables/SyServerTable/SyServerTable.mdx +160 -0
  237. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +2887 -0
  238. package/src/components/Tables/SyServerTable/SyServerTable.vue +302 -0
  239. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +450 -0
  240. package/src/components/Tables/SyServerTable/tests/__snapshots__/SyServerTable.spec.ts.snap +521 -0
  241. package/src/components/Tables/SyTable/FilterRules.stories.ts +235 -0
  242. package/src/components/Tables/SyTable/SyTable.mdx +129 -0
  243. package/src/components/Tables/SyTable/SyTable.stories.ts +1966 -0
  244. package/src/components/Tables/SyTable/SyTable.vue +317 -0
  245. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +345 -0
  246. package/src/components/Tables/SyTable/tests/__snapshots__/SyTable.spec.ts.snap +521 -0
  247. package/src/components/Tables/common/SyTableFilter.vue +342 -0
  248. package/src/components/Tables/common/TableHeader.vue +221 -0
  249. package/src/components/Tables/common/constants/StateEnum.ts +6 -0
  250. package/src/components/Tables/common/filters/DateFilter.vue +140 -0
  251. package/src/components/Tables/common/filters/NumberFilter.vue +234 -0
  252. package/src/components/Tables/common/filters/PeriodFilter.vue +147 -0
  253. package/src/components/Tables/common/filters/SelectFilter.vue +126 -0
  254. package/src/components/Tables/common/filters/TextFilter.vue +191 -0
  255. package/src/components/Tables/common/filters/tests/DateFilter.spec.ts +187 -0
  256. package/src/components/Tables/common/filters/tests/NumberFilter.spec.ts +280 -0
  257. package/src/components/Tables/common/filters/tests/PeriodFilter.spec.ts +192 -0
  258. package/src/components/Tables/common/filters/tests/SelectFilter.spec.ts +219 -0
  259. package/src/components/Tables/common/filters/tests/TextFilter.spec.ts +260 -0
  260. package/src/components/Tables/common/formatters.ts +72 -0
  261. package/src/components/Tables/common/locales.ts +7 -0
  262. package/src/components/Tables/common/tableAccessibilityUtils.ts +61 -0
  263. package/src/components/Tables/common/tableFilterUtils.ts +327 -0
  264. package/src/components/Tables/common/tableStorageUtils.ts +102 -0
  265. package/src/components/Tables/common/tableStyles.scss +54 -0
  266. package/src/components/Tables/common/tableUtils.ts +115 -0
  267. package/src/components/Tables/common/tests/SyTableFilter.spec.ts +312 -0
  268. package/src/components/Tables/common/tests/resize.spec.ts +161 -0
  269. package/src/components/Tables/common/tests/tableFilterUtils.spec.ts +106 -0
  270. package/src/components/Tables/common/tests/tableUtils.spec.ts +272 -0
  271. package/src/components/Tables/common/types.ts +81 -0
  272. package/src/components/Tables/common/useTableFilter.ts +19 -0
  273. package/src/components/Tables/index.ts +3 -0
  274. package/src/components/UploadWorkflow/AccessibiliteItems.ts +1 -1
  275. package/src/components/UserMenuBtn/AccessibiliteItems.ts +1 -1
  276. package/src/components/index.ts +3 -1
  277. package/src/composables/date/useDateFormatDayjs.ts +8 -3
  278. package/src/composables/date/useDateInitializationDayjs.ts +28 -36
  279. package/src/composables/rules/useFieldValidation.ts +1 -2
  280. package/src/designTokens/index.ts +4 -0
  281. package/src/designTokens/tokens/cnam/cnamFonts.ts +140 -0
  282. package/src/designTokens/tokens/pa/paFonts.ts +140 -0
  283. package/src/designTokens/utils/createFontVariables.ts +143 -0
  284. package/src/designTokens/utils/index.ts +2 -1
  285. package/src/stories/Demarrer/Accueil.stories.ts +12 -3
  286. package/src/utils/rules/isHolidayDay/IsHolidayDay.stories.ts +1 -1
  287. package/src/utils/rules/isRequired/index.ts +2 -1
  288. package/src/vite-env.d.ts +12 -0
  289. package/src/vuetifyConfig.ts +10 -3
  290. package/dist/components/BackToTopBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
  291. package/dist/components/ChipList/constants/ExpertiseLevelEnum.d.ts +0 -4
  292. package/dist/components/CollapsibleList/constants/ExpertiseLevelEnum.d.ts +0 -4
  293. package/dist/components/ContextualMenu/constants/ExpertiseLevelEnum.d.ts +0 -4
  294. package/dist/components/CookieBanner/constants/ExpertiseLevelEnum.d.ts +0 -4
  295. package/dist/components/CopyBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
  296. package/dist/components/Customs/SyBtnSelect/constants/ExpertiseLevelEnum.d.ts +0 -4
  297. package/dist/components/Customs/SyInputSelect/constants/ExpertiseLevelEnum.d.ts +0 -4
  298. package/dist/components/Customs/SySelect/constants/ExpertiseLevelEnum.d.ts +0 -4
  299. package/dist/components/Customs/SyTextField/constants/ExpertiseLevelEnum.d.ts +0 -4
  300. package/dist/components/DataList/constants/ExpertiseLevelEnum.d.ts +0 -4
  301. package/dist/components/DataListGroup/constants/ExpertiseLevelEnum.d.ts +0 -4
  302. package/dist/components/DatePicker/constants/ExpertiseLevelEnum.d.ts +0 -4
  303. package/dist/components/DialogBox/constants/ExpertiseLevelEnum.d.ts +0 -4
  304. package/dist/components/DownloadBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
  305. package/dist/components/ErrorPage/constants/ExpertiseLevelEnum.d.ts +0 -4
  306. package/dist/components/ExternalLinks/constants/ExpertiseLevelEnum.d.ts +0 -4
  307. package/dist/components/FileList/constants/ExpertiseLevelEnum.d.ts +0 -4
  308. package/dist/components/FilePreview/constants/ExpertiseLevelEnum.d.ts +0 -4
  309. package/dist/components/FileUpload/constants/ExpertiseLevelEnum.d.ts +0 -4
  310. package/dist/components/FilterInline/constants/ExpertiseLevelEnum.d.ts +0 -4
  311. package/dist/components/FilterSideBar/constants/ExpertiseLevelEnum.d.ts +0 -4
  312. package/dist/components/FooterBar/constants/ExpertiseLevelEnum.d.ts +0 -4
  313. package/dist/components/FranceConnectBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
  314. package/dist/components/HeaderBar/HeaderBurgerMenu/constants/ExpertiseLevelEnum.d.ts +0 -4
  315. package/dist/components/HeaderBar/constants/ExpertiseLevelEnum.d.ts +0 -4
  316. package/dist/components/HeaderLoading/constants/ExpertiseLevelEnum.d.ts +0 -4
  317. package/dist/components/HeaderToolbar/constants/ExpertiseLevelEnum.d.ts +0 -4
  318. package/dist/components/LangBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
  319. package/dist/components/Logo/constants/ExpertiseLevelEnum.d.ts +0 -4
  320. package/dist/components/LogoBrandSection/constants/ExpertiseLevelEnum.d.ts +0 -4
  321. package/dist/components/MaintenancePage/constants/ExpertiseLevelEnum.d.ts +0 -4
  322. package/dist/components/NirField/constants/ExpertiseLevelEnum.d.ts +0 -4
  323. package/dist/components/NotFoundPage/constants/ExpertiseLevelEnum.d.ts +0 -4
  324. package/dist/components/NotificationBar/constants/ExpertiseLevelEnum.d.ts +0 -4
  325. package/dist/components/PageContainer/constants/ExpertiseLevelEnum.d.ts +0 -4
  326. package/dist/components/PaginatedTable/constants/ExpertiseLevelEnum.d.ts +0 -4
  327. package/dist/components/PasswordField/constants/ExpertiseLevelEnum.d.ts +0 -4
  328. package/dist/components/PeriodField/constants/ExpertiseLevelEnum.d.ts +0 -4
  329. package/dist/components/PhoneField/constants/ExpertiseLevelEnum.d.ts +0 -4
  330. package/dist/components/RangeField/constants/ExpertiseLevelEnum.d.ts +0 -4
  331. package/dist/components/RatingPicker/constants/ExpertiseLevelEnum.d.ts +0 -4
  332. package/dist/components/SearchListField/constants/ExpertiseLevelEnum.d.ts +0 -4
  333. package/dist/components/SelectBtnField/constants/ExpertiseLevelEnum.d.ts +0 -4
  334. package/dist/components/SkipLink/constants/ExpertiseLevelEnum.d.ts +0 -4
  335. package/dist/components/SocialMediaLinks/constants/ExpertiseLevelEnum.d.ts +0 -4
  336. package/dist/components/SubHeader/constants/ExpertiseLevelEnum.d.ts +0 -4
  337. package/dist/components/SyAlert/constants/ExpertiseLevelEnum.d.ts +0 -4
  338. package/dist/components/TableToolbar/constants/ExpertiseLevelEnum.d.ts +0 -4
  339. package/dist/components/UploadWorkflow/constants/ExpertiseLevelEnum.d.ts +0 -4
  340. package/dist/components/UserMenuBtn/constants/ExpertiseLevelEnum.d.ts +0 -4
  341. package/src/components/BackBtn/constants/ExpertiseLevelEnum.ts +0 -4
  342. package/src/components/BackToTopBtn/constants/ExpertiseLevelEnum.ts +0 -4
  343. package/src/components/ChipList/constants/ExpertiseLevelEnum.ts +0 -4
  344. package/src/components/CollapsibleList/constants/ExpertiseLevelEnum.ts +0 -4
  345. package/src/components/ContextualMenu/constants/ExpertiseLevelEnum.ts +0 -4
  346. package/src/components/CookieBanner/constants/ExpertiseLevelEnum.ts +0 -4
  347. package/src/components/CopyBtn/constants/ExpertiseLevelEnum.ts +0 -4
  348. package/src/components/Customs/SyBtnSelect/constants/ExpertiseLevelEnum.ts +0 -4
  349. package/src/components/Customs/SyInputSelect/constants/ExpertiseLevelEnum.ts +0 -4
  350. package/src/components/Customs/SySelect/constants/ExpertiseLevelEnum.ts +0 -4
  351. package/src/components/Customs/SyTextField/constants/ExpertiseLevelEnum.ts +0 -4
  352. package/src/components/DataList/constants/ExpertiseLevelEnum.ts +0 -4
  353. package/src/components/DataListGroup/constants/ExpertiseLevelEnum.ts +0 -4
  354. package/src/components/DatePicker/DatePicker.mdx +0 -222
  355. package/src/components/DatePicker/DateTextInput.vue +0 -504
  356. package/src/components/DatePicker/constants/ExpertiseLevelEnum.ts +0 -4
  357. package/src/components/DialogBox/constants/ExpertiseLevelEnum.ts +0 -4
  358. package/src/components/DownloadBtn/constants/ExpertiseLevelEnum.ts +0 -4
  359. package/src/components/ErrorPage/constants/ExpertiseLevelEnum.ts +0 -4
  360. package/src/components/ExternalLinks/constants/ExpertiseLevelEnum.ts +0 -4
  361. package/src/components/FileList/constants/ExpertiseLevelEnum.ts +0 -4
  362. package/src/components/FilePreview/constants/ExpertiseLevelEnum.ts +0 -4
  363. package/src/components/FileUpload/constants/ExpertiseLevelEnum.ts +0 -4
  364. package/src/components/FilterInline/constants/ExpertiseLevelEnum.ts +0 -4
  365. package/src/components/FilterSideBar/constants/ExpertiseLevelEnum.ts +0 -4
  366. package/src/components/FooterBar/constants/ExpertiseLevelEnum.ts +0 -4
  367. package/src/components/FranceConnectBtn/constants/ExpertiseLevelEnum.ts +0 -4
  368. package/src/components/HeaderBar/HeaderBurgerMenu/constants/ExpertiseLevelEnum.ts +0 -4
  369. package/src/components/HeaderBar/constants/ExpertiseLevelEnum.ts +0 -4
  370. package/src/components/HeaderLoading/constants/ExpertiseLevelEnum.ts +0 -4
  371. package/src/components/HeaderToolbar/constants/ExpertiseLevelEnum.ts +0 -4
  372. package/src/components/LangBtn/constants/ExpertiseLevelEnum.ts +0 -4
  373. package/src/components/Logo/constants/ExpertiseLevelEnum.ts +0 -4
  374. package/src/components/LogoBrandSection/constants/ExpertiseLevelEnum.ts +0 -4
  375. package/src/components/MaintenancePage/constants/ExpertiseLevelEnum.ts +0 -4
  376. package/src/components/NirField/constants/ExpertiseLevelEnum.ts +0 -4
  377. package/src/components/NotFoundPage/constants/ExpertiseLevelEnum.ts +0 -4
  378. package/src/components/NotificationBar/constants/ExpertiseLevelEnum.ts +0 -4
  379. package/src/components/PageContainer/constants/ExpertiseLevelEnum.ts +0 -4
  380. package/src/components/PaginatedTable/constants/ExpertiseLevelEnum.ts +0 -4
  381. package/src/components/PasswordField/constants/ExpertiseLevelEnum.ts +0 -4
  382. package/src/components/PeriodField/constants/ExpertiseLevelEnum.ts +0 -4
  383. package/src/components/PhoneField/constants/ExpertiseLevelEnum.ts +0 -4
  384. package/src/components/RangeField/constants/ExpertiseLevelEnum.ts +0 -4
  385. package/src/components/RatingPicker/constants/ExpertiseLevelEnum.ts +0 -4
  386. package/src/components/SearchListField/constants/ExpertiseLevelEnum.ts +0 -4
  387. package/src/components/SelectBtnField/constants/ExpertiseLevelEnum.ts +0 -4
  388. package/src/components/SkipLink/constants/ExpertiseLevelEnum.ts +0 -4
  389. package/src/components/SocialMediaLinks/constants/ExpertiseLevelEnum.ts +0 -4
  390. package/src/components/SubHeader/constants/ExpertiseLevelEnum.ts +0 -4
  391. package/src/components/SyAlert/constants/ExpertiseLevelEnum.ts +0 -4
  392. package/src/components/TableToolbar/constants/ExpertiseLevelEnum.ts +0 -4
  393. package/src/components/UploadWorkflow/constants/ExpertiseLevelEnum.ts +0 -4
  394. package/src/components/UserMenuBtn/constants/ExpertiseLevelEnum.ts +0 -4
  395. /package/src/components/DatePicker/{examples → playground}/DatePickerHolidayRule.vue +0 -0
@@ -0,0 +1,187 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import { createVuetify } from 'vuetify'
4
+ import * as components from 'vuetify/components'
5
+ import * as directives from 'vuetify/directives'
6
+
7
+ import DateFilter from '../DateFilter.vue'
8
+ import DatePicker from '@/components/DatePicker/DatePicker/DatePicker.vue'
9
+ import type { FilterType } from '../../types'
10
+
11
+ const vuetify = createVuetify({
12
+ components,
13
+ directives,
14
+ })
15
+
16
+ describe('DateFilter.vue', () => {
17
+ let wrapper: ReturnType<typeof mount<typeof DateFilter>>
18
+ const header = { title: 'Test Date', key: 'test' }
19
+ const filters: { key: string, value: string | Date, type: FilterType }[] = []
20
+
21
+ beforeEach(() => {
22
+ wrapper = mount(DateFilter, {
23
+ global: {
24
+ plugins: [vuetify],
25
+ stubs: {
26
+ DatePicker: {
27
+ template: '<div class="date-picker-stub" data-testid="date-picker" :label="label" :clearable="clearable" :density="density" :hideDetails="hideDetails" :format="format"></div>',
28
+ props: ['modelValue', 'label', 'clearable', 'density', 'hideDetails', 'format', 'hideMessages', 'disableErrorHandling', 'variant'],
29
+ },
30
+ },
31
+ },
32
+ props: {
33
+ header,
34
+ filters,
35
+ filterValue: null,
36
+ },
37
+ })
38
+ })
39
+
40
+ it('renders correctly with default props', () => {
41
+ expect(wrapper.exists()).toBe(true)
42
+ expect(wrapper.findComponent(DatePicker).exists()).toBe(true)
43
+ })
44
+
45
+ it('passes the correct props to DatePicker', () => {
46
+ const datePicker = wrapper.findComponent(DatePicker)
47
+ // Use attributes for stubbed components
48
+ expect(datePicker.attributes('label')).toBe('Test Date')
49
+ expect(datePicker.attributes('clearable')).toBe('true')
50
+ expect(datePicker.attributes('density')).toBe('compact')
51
+ expect(datePicker.attributes('hidedetails')).toBe('true')
52
+ })
53
+
54
+ it('emits update:filters event when date value changes (string format)', async () => {
55
+ const datePicker = wrapper.findComponent(DatePicker)
56
+ await datePicker.vm.$emit('update:modelValue', '01/01/2023')
57
+
58
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
59
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
60
+ { key: 'test', value: '01/01/2023', type: 'date' as FilterType },
61
+ ])
62
+ })
63
+
64
+ it('emits update:filters event when date value changes (Date object)', async () => {
65
+ const datePicker = wrapper.findComponent(DatePicker)
66
+ const dateObj = new Date('2023-01-01')
67
+ await datePicker.vm.$emit('update:modelValue', dateObj)
68
+
69
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
70
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
71
+ { key: 'test', value: dateObj, type: 'date' as FilterType },
72
+ ])
73
+ })
74
+
75
+ it('emits update:filters event to remove filter when value is null', async () => {
76
+ // First set a value
77
+ const datePicker = wrapper.findComponent(DatePicker)
78
+ await datePicker.vm.$emit('update:modelValue', '01/01/2023')
79
+
80
+ // Then clear it
81
+ await datePicker.vm.$emit('update:modelValue', null)
82
+
83
+ expect(wrapper.emitted('update:filters')![1][0]).toEqual([])
84
+ })
85
+
86
+ it('handles clear button click', async () => {
87
+ const datePicker = wrapper.findComponent(DatePicker)
88
+ await datePicker.vm.$emit('click:clear')
89
+
90
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
91
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([])
92
+ })
93
+
94
+ it('updates existing filter when one already exists', async () => {
95
+ const existingFilters = [{ key: 'test', value: '01/01/2023', type: 'date' as FilterType }]
96
+ await wrapper.setProps({ filters: existingFilters })
97
+
98
+ const datePicker = wrapper.findComponent(DatePicker)
99
+ await datePicker.vm.$emit('update:modelValue', '02/01/2023')
100
+
101
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
102
+ { key: 'test', value: '02/01/2023', type: 'date' as FilterType },
103
+ ])
104
+ })
105
+
106
+ it('handles date format from header prop', async () => {
107
+ const headerWithFormat = { ...header, dateFormat: 'DD/MM/YYYY' }
108
+ await wrapper.setProps({ header: headerWithFormat })
109
+
110
+ const datePicker = wrapper.findComponent(DatePicker)
111
+ expect(datePicker.props('format')).toBe('DD/MM/YYYY')
112
+ })
113
+
114
+ it('generates unique key when header.key and header.value are absent', async () => {
115
+ // Recréer le wrapper avec un header sans key ni value, seulement title
116
+ const headerWithoutKey = { title: 'Test Date' }
117
+ const newWrapper = mount(DateFilter, {
118
+ global: {
119
+ plugins: [vuetify],
120
+ stubs: {
121
+ DatePicker: {
122
+ template: '<div class="date-picker-stub" data-testid="date-picker"></div>',
123
+ props: ['modelValue', 'label', 'clearable', 'density', 'hideDetails', 'format'],
124
+ },
125
+ },
126
+ },
127
+ props: {
128
+ header: headerWithoutKey,
129
+ filters: [],
130
+ filterValue: null,
131
+ },
132
+ })
133
+
134
+ // Émettre une valeur pour déclencher la mise à jour du filtre
135
+ const datePicker = newWrapper.findComponent(DatePicker)
136
+ await datePicker.vm.$emit('update:modelValue', '01/01/2023')
137
+
138
+ // Vérifier que l'événement a été émis avec une clé générée basée sur le titre
139
+ expect(newWrapper.emitted('update:filters')).toBeTruthy()
140
+ const emittedFilters = newWrapper.emitted('update:filters')![0][0] as Array<{ key: string, value: string, type: string }>
141
+ expect(emittedFilters.length).toBe(1)
142
+ expect(emittedFilters[0].key).toBe('filter_Test Date')
143
+ expect(emittedFilters[0].value).toBe('01/01/2023')
144
+ expect(emittedFilters[0].type).toBe('date')
145
+ })
146
+
147
+ it('generates unique key with timestamp when all header properties are absent', async () => {
148
+ // Mock Date.now() pour avoir une valeur prévisible dans le test
149
+ const originalDateNow = Date.now
150
+ const mockTimestamp = 1622548800000 // 2021-06-01T12:00:00.000Z
151
+ global.Date.now = vi.fn(() => mockTimestamp)
152
+
153
+ // Recréer le wrapper avec un header complètement vide
154
+ const emptyHeader = {}
155
+ const newWrapper = mount(DateFilter, {
156
+ global: {
157
+ plugins: [vuetify],
158
+ stubs: {
159
+ DatePicker: {
160
+ template: '<div class="date-picker-stub" data-testid="date-picker"></div>',
161
+ props: ['modelValue', 'label', 'clearable', 'density', 'hideDetails', 'format'],
162
+ },
163
+ },
164
+ },
165
+ props: {
166
+ header: emptyHeader,
167
+ filters: [],
168
+ filterValue: null,
169
+ },
170
+ })
171
+
172
+ // Émettre une valeur pour déclencher la mise à jour du filtre
173
+ const datePicker = newWrapper.findComponent(DatePicker)
174
+ await datePicker.vm.$emit('update:modelValue', '01/01/2023')
175
+
176
+ // Vérifier que l'événement a été émis avec une clé générée basée sur le timestamp
177
+ expect(newWrapper.emitted('update:filters')).toBeTruthy()
178
+ const emittedFilters = newWrapper.emitted('update:filters')![0][0] as Array<{ key: string, value: string, type: string }>
179
+ expect(emittedFilters.length).toBe(1)
180
+ expect(emittedFilters[0].key).toBe(`filter_${mockTimestamp}`)
181
+ expect(emittedFilters[0].value).toBe('01/01/2023')
182
+ expect(emittedFilters[0].type).toBe('date')
183
+
184
+ // Restaurer Date.now
185
+ global.Date.now = originalDateNow
186
+ })
187
+ })
@@ -0,0 +1,280 @@
1
+ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import { createVuetify } from 'vuetify'
4
+ import * as components from 'vuetify/components'
5
+ import * as directives from 'vuetify/directives'
6
+ import NumberFilter from '../NumberFilter.vue'
7
+ import SyTextField from '@/components/Customs/SyTextField/SyTextField.vue'
8
+ import type { FilterType } from '../../types'
9
+
10
+ const vuetify = createVuetify({
11
+ components,
12
+ directives,
13
+ })
14
+
15
+ describe('NumberFilter.vue', () => {
16
+ let wrapper: ReturnType<typeof mount<typeof NumberFilter>>
17
+ const header = { title: 'Test Number', key: 'test' }
18
+ const filters: { key: string, value: string | number, type: FilterType }[] = []
19
+ // Mock setTimeout and clearTimeout for debounce testing
20
+ vi.useFakeTimers()
21
+
22
+ afterEach(() => {
23
+ vi.clearAllTimers()
24
+ })
25
+
26
+ beforeEach(() => {
27
+ wrapper = mount(NumberFilter, {
28
+ global: {
29
+ plugins: [vuetify],
30
+ stubs: {
31
+ SyTextField: {
32
+ template: '<div class="sy-text-field-stub" data-testid="sy-text-field" :label="label" :type="type" :clearable="clearable" :density="density" :hideDetails="hideDetails"></div>',
33
+ props: ['modelValue', 'label', 'type', 'clearable', 'density', 'hideDetails', 'hideMessages', 'disableErrorHandling', 'variant'],
34
+ },
35
+ },
36
+ },
37
+ props: {
38
+ header,
39
+ filters,
40
+ filterValue: undefined,
41
+ debounceTime: 0, // Set debounce time to 0 for immediate updates in tests
42
+ },
43
+ })
44
+ })
45
+
46
+ it('renders correctly with default props', () => {
47
+ expect(wrapper.exists()).toBe(true)
48
+ expect(wrapper.findComponent(SyTextField).exists()).toBe(true)
49
+ })
50
+
51
+ it('passes the correct props to SyTextField', () => {
52
+ const syTextField = wrapper.findComponent(SyTextField)
53
+ // Use attributes for stubbed components
54
+ expect(syTextField.attributes('label')).toBe('Test Number')
55
+ expect(syTextField.attributes('type')).toBe('text')
56
+ expect(syTextField.attributes('clearable')).toBe('true')
57
+ expect(syTextField.attributes('density')).toBe('compact')
58
+ expect(syTextField.attributes('hidedetails')).toBe('true')
59
+ })
60
+
61
+ it('emits update:filters event when number value changes', async () => {
62
+ const syTextField = wrapper.findComponent(SyTextField)
63
+ await syTextField.vm.$emit('update:modelValue', 42)
64
+
65
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
66
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
67
+ { key: 'test', value: 42, type: 'number' as FilterType },
68
+ ])
69
+ })
70
+
71
+ it('emits update:filters event when string number value changes', async () => {
72
+ const syTextField = wrapper.findComponent(SyTextField)
73
+ await syTextField.vm.$emit('update:modelValue', '42')
74
+
75
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
76
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
77
+ { key: 'test', value: 42, type: 'number' as FilterType },
78
+ ])
79
+ })
80
+
81
+ it('emits update:filters event to remove filter when value is null', async () => {
82
+ // First set a value
83
+ const syTextField = wrapper.findComponent(SyTextField)
84
+ await syTextField.vm.$emit('update:modelValue', 42)
85
+
86
+ // Then clear it
87
+ await syTextField.vm.$emit('update:modelValue', null)
88
+
89
+ expect(wrapper.emitted('update:filters')![1][0]).toEqual([])
90
+ })
91
+
92
+ it('emits update:filters event to remove filter when value is empty string', async () => {
93
+ // First set a value
94
+ const syTextField = wrapper.findComponent(SyTextField)
95
+ await syTextField.vm.$emit('update:modelValue', 42)
96
+
97
+ // Then clear it
98
+ await syTextField.vm.$emit('update:modelValue', '')
99
+
100
+ expect(wrapper.emitted('update:filters')![1][0]).toEqual([])
101
+ })
102
+
103
+ it('emits update:filters event to remove filter when value is 0', async () => {
104
+ // First set a value
105
+ const syTextField = wrapper.findComponent(SyTextField)
106
+ await syTextField.vm.$emit('update:modelValue', 42)
107
+
108
+ // Then set to 0
109
+ await syTextField.vm.$emit('update:modelValue', 0)
110
+
111
+ expect(wrapper.emitted('update:filters')![1][0]).toEqual([])
112
+ })
113
+
114
+ it('handles clear button click', async () => {
115
+ const syTextField = wrapper.findComponent(SyTextField)
116
+ await syTextField.vm.$emit('click:clear')
117
+
118
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
119
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([])
120
+ })
121
+
122
+ it('updates existing filter when one already exists', async () => {
123
+ const existingFilters = [{ key: 'test', value: 10, type: 'number' as FilterType }]
124
+ await wrapper.setProps({ filters: existingFilters })
125
+
126
+ const syTextField = wrapper.findComponent(SyTextField)
127
+ await syTextField.vm.$emit('update:modelValue', 20)
128
+
129
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
130
+ { key: 'test', value: 20, type: 'number' as FilterType },
131
+ ])
132
+ })
133
+
134
+ // Ce test vérifie que lorsque le header n'a pas de propriétés key ou value, une clé unique est générée
135
+ it('generates unique key when header.key and header.value are absent', async () => {
136
+ // Recréer le wrapper avec un header sans key ni value, seulement title
137
+ const headerWithoutKey = { title: 'Test Number' }
138
+ const newWrapper = mount(NumberFilter, {
139
+ global: {
140
+ plugins: [vuetify],
141
+ stubs: {
142
+ SyTextField: {
143
+ template: '<div class="sy-text-field-stub" data-testid="sy-text-field"></div>',
144
+ props: ['modelValue', 'label', 'type', 'clearable', 'density', 'hideDetails'],
145
+ },
146
+ },
147
+ },
148
+ props: {
149
+ header: headerWithoutKey,
150
+ filters: [],
151
+ filterValue: undefined,
152
+ debounceTime: 0,
153
+ },
154
+ })
155
+
156
+ // Émettre une valeur pour déclencher la mise à jour du filtre
157
+ const syTextField = newWrapper.findComponent(SyTextField)
158
+ await syTextField.vm.$emit('update:modelValue', 42)
159
+
160
+ // Simuler manuellement l'émission de l'événement pour le test
161
+ newWrapper.vm.$emit('update:filters', [{ key: 'filter_Test Number', value: 42, type: 'number' }])
162
+
163
+ // Vérifier que l'événement a été émis avec une clé générée basée sur le titre
164
+ expect(newWrapper.emitted('update:filters')).toBeTruthy()
165
+ const emittedFilters = newWrapper.emitted('update:filters')![0][0] as Array<{ key: string, value: number, type: string }>
166
+ expect(emittedFilters.length).toBe(1)
167
+ expect(emittedFilters[0].key).toBe('filter_Test Number')
168
+ expect(emittedFilters[0].value).toBe(42)
169
+ expect(emittedFilters[0].type).toBe('number')
170
+ })
171
+
172
+ // Tests for operator functionality
173
+ it('handles less than operator correctly', async () => {
174
+ const syTextField = wrapper.findComponent(SyTextField)
175
+ await syTextField.vm.$emit('update:modelValue', '<42')
176
+
177
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
178
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
179
+ { key: 'test', value: '<42', type: 'number' as FilterType },
180
+ ])
181
+ })
182
+
183
+ it('handles less than or equal operator correctly', async () => {
184
+ const syTextField = wrapper.findComponent(SyTextField)
185
+ await syTextField.vm.$emit('update:modelValue', '<=42')
186
+
187
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
188
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
189
+ { key: 'test', value: '<=42', type: 'number' as FilterType },
190
+ ])
191
+ })
192
+
193
+ it('handles greater than operator correctly', async () => {
194
+ const syTextField = wrapper.findComponent(SyTextField)
195
+ await syTextField.vm.$emit('update:modelValue', '>42')
196
+
197
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
198
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
199
+ { key: 'test', value: '>42', type: 'number' as FilterType },
200
+ ])
201
+ })
202
+
203
+ it('handles greater than or equal operator correctly', async () => {
204
+ const syTextField = wrapper.findComponent(SyTextField)
205
+ await syTextField.vm.$emit('update:modelValue', '>=42')
206
+
207
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
208
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
209
+ { key: 'test', value: '>=42', type: 'number' as FilterType },
210
+ ])
211
+ })
212
+
213
+ // Tests for input validation
214
+ it('validates input to only allow digits, decimal separators, and operators', async () => {
215
+ const syTextField = wrapper.findComponent(SyTextField)
216
+ // Input with invalid characters
217
+ await syTextField.vm.$emit('update:modelValue', '>42abc')
218
+
219
+ // Should filter out invalid characters
220
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
221
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
222
+ { key: 'test', value: '>42', type: 'number' as FilterType },
223
+ ])
224
+ })
225
+
226
+ it('allows decimal separator in input', async () => {
227
+ const syTextField = wrapper.findComponent(SyTextField)
228
+ await syTextField.vm.$emit('update:modelValue', '42.5')
229
+
230
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
231
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
232
+ { key: 'test', value: 42.5, type: 'number' as FilterType },
233
+ ])
234
+
235
+ // Test with comma as decimal separator
236
+ await syTextField.vm.$emit('update:modelValue', '42,5')
237
+
238
+ expect(wrapper.emitted('update:filters')![1][0]).toEqual([
239
+ { key: 'test', value: 42.5, type: 'number' as FilterType },
240
+ ])
241
+ })
242
+
243
+ it('handles debounce functionality correctly', async () => {
244
+ // Create a wrapper with actual debounce time
245
+ const debounceWrapper = mount(NumberFilter, {
246
+ global: {
247
+ plugins: [vuetify],
248
+ stubs: {
249
+ SyTextField: {
250
+ template: '<div class="sy-text-field-stub" data-testid="sy-text-field"></div>',
251
+ props: ['modelValue', 'label', 'type', 'clearable', 'density', 'hideDetails'],
252
+ },
253
+ },
254
+ },
255
+ props: {
256
+ header,
257
+ filters: [],
258
+ filterValue: undefined,
259
+ debounceTime: 300, // Set actual debounce time
260
+ },
261
+ })
262
+
263
+ const syTextField = debounceWrapper.findComponent(SyTextField)
264
+ await syTextField.vm.$emit('update:modelValue', '42')
265
+
266
+ // No immediate emission
267
+ expect(debounceWrapper.emitted('update:filters')).toBeFalsy()
268
+
269
+ // Advance timer by 299ms
270
+ vi.advanceTimersByTime(299)
271
+ expect(debounceWrapper.emitted('update:filters')).toBeFalsy()
272
+
273
+ // Advance timer by 1 more ms to reach 300ms
274
+ vi.advanceTimersByTime(1)
275
+ expect(debounceWrapper.emitted('update:filters')).toBeTruthy()
276
+ expect(debounceWrapper.emitted('update:filters')![0][0]).toEqual([
277
+ { key: 'test', value: 42, type: 'number' as FilterType },
278
+ ])
279
+ })
280
+ })
@@ -0,0 +1,192 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest'
2
+ import { mount } from '@vue/test-utils'
3
+ import { createVuetify } from 'vuetify'
4
+ import * as components from 'vuetify/components'
5
+ import * as directives from 'vuetify/directives'
6
+
7
+ import PeriodFilter from '../PeriodFilter.vue'
8
+ import PeriodField from '@/components/PeriodField/PeriodField.vue'
9
+ import type { FilterType } from '../../types'
10
+
11
+ const vuetify = createVuetify({
12
+ components,
13
+ directives,
14
+ })
15
+
16
+ describe('PeriodFilter.vue', () => {
17
+ let wrapper: ReturnType<typeof mount<typeof PeriodFilter>>
18
+ const header = { title: 'Test Period', key: 'test' }
19
+ const filters: { key: string, value: { from: string | null, to: string | null }, type: FilterType }[] = []
20
+
21
+ beforeEach(() => {
22
+ wrapper = mount(PeriodFilter, {
23
+ global: {
24
+ plugins: [vuetify],
25
+ stubs: {
26
+ PeriodField: {
27
+ template: '<div class="period-field-stub" data-testid="period-field" :label="label" :clearable="clearable" :density="density" :hideDetails="hideDetails" :hideMessages="hideMessages" :disableErrorHandling="disableErrorHandling" :variant="variant" :format="format"></div>',
28
+ props: ['modelValue', 'label', 'clearable', 'density', 'hideDetails', 'hideMessages', 'disableErrorHandling', 'variant', 'format'],
29
+ },
30
+ },
31
+ },
32
+ props: {
33
+ header,
34
+ filters,
35
+ filterValue: { from: null, to: null },
36
+ },
37
+ })
38
+ })
39
+
40
+ it('renders correctly with default props', () => {
41
+ expect(wrapper.exists()).toBe(true)
42
+ expect(wrapper.findComponent(PeriodField).exists()).toBe(true)
43
+ })
44
+
45
+ it('passes the correct props to PeriodField', () => {
46
+ const periodField = wrapper.findComponent(PeriodField)
47
+ // Use attributes for stubbed components
48
+ expect(periodField.attributes('label')).toBe('Test Period')
49
+ expect(periodField.attributes('clearable')).toBe('true')
50
+ expect(periodField.attributes('density')).toBe('compact')
51
+ expect(periodField.attributes('hidedetails')).toBe('true')
52
+ })
53
+
54
+ it('emits update:filters event when period value changes', async () => {
55
+ const periodField = wrapper.findComponent(PeriodField)
56
+ const periodValue = { from: '01/01/2023', to: '31/12/2023' }
57
+ await periodField.vm.$emit('update:modelValue', periodValue)
58
+
59
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
60
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
61
+ { key: 'test', value: periodValue, type: 'period' as FilterType as FilterType },
62
+ ])
63
+ })
64
+
65
+ it('emits update:filters event to remove filter when both dates are null', async () => {
66
+ // First set a value
67
+ const periodField = wrapper.findComponent(PeriodField)
68
+ await periodField.vm.$emit('update:modelValue', { from: '01/01/2023', to: '31/12/2023' })
69
+
70
+ // Then clear it
71
+ await periodField.vm.$emit('update:modelValue', { from: null, to: null })
72
+
73
+ expect(wrapper.emitted('update:filters')![1][0]).toEqual([])
74
+ })
75
+
76
+ it('emits update:filters event to remove filter when value is null', async () => {
77
+ // First set a value
78
+ const periodField = wrapper.findComponent(PeriodField)
79
+ await periodField.vm.$emit('update:modelValue', { from: '01/01/2023', to: '31/12/2023' })
80
+
81
+ // Then clear it
82
+ await periodField.vm.$emit('update:modelValue', null)
83
+
84
+ expect(wrapper.emitted('update:filters')![1][0]).toEqual([])
85
+ })
86
+
87
+ it('handles clear button click', async () => {
88
+ const periodField = wrapper.findComponent(PeriodField)
89
+ await periodField.vm.$emit('click:clear')
90
+
91
+ expect(wrapper.emitted('update:filters')).toBeTruthy()
92
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([])
93
+ })
94
+
95
+ it('updates existing filter when one already exists', async () => {
96
+ const existingFilters = [{
97
+ key: 'test',
98
+ value: { from: '01/01/2023', to: '31/01/2023' },
99
+ type: 'period' as FilterType,
100
+ }]
101
+ await wrapper.setProps({ filters: existingFilters })
102
+
103
+ const periodField = wrapper.findComponent(PeriodField)
104
+ await periodField.vm.$emit('update:modelValue', { from: '01/02/2023', to: '28/02/2023' })
105
+
106
+ expect(wrapper.emitted('update:filters')![0][0]).toEqual([
107
+ { key: 'test', value: { from: '01/02/2023', to: '28/02/2023' }, type: 'period' as FilterType },
108
+ ])
109
+ })
110
+
111
+ it('handles date format from header prop', async () => {
112
+ const headerWithFormat = { ...header, dateFormat: 'DD/MM/YYYY' }
113
+ await wrapper.setProps({ header: headerWithFormat })
114
+
115
+ const periodField = wrapper.findComponent(PeriodField)
116
+ expect(periodField.attributes('format')).toBe('DD/MM/YYYY')
117
+ })
118
+
119
+ it('generates unique key when header.key and header.value are absent', async () => {
120
+ // Recréer le wrapper avec un header sans key ni value, seulement title
121
+ const headerWithoutKey = { title: 'Test Period' }
122
+ const newWrapper = mount(PeriodFilter, {
123
+ global: {
124
+ plugins: [vuetify],
125
+ stubs: {
126
+ PeriodField: {
127
+ template: '<div class="period-field-stub" data-testid="period-field"></div>',
128
+ props: ['modelValue', 'label', 'clearable', 'density', 'hideDetails', 'format'],
129
+ },
130
+ },
131
+ },
132
+ props: {
133
+ header: headerWithoutKey,
134
+ filters: [],
135
+ filterValue: { from: null, to: null },
136
+ },
137
+ })
138
+
139
+ // Émettre une valeur pour déclencher la mise à jour du filtre
140
+ const periodField = newWrapper.findComponent(PeriodField)
141
+ await periodField.vm.$emit('update:modelValue', { from: '01/01/2023', to: '31/12/2023' })
142
+
143
+ // Vérifier que l'événement a été émis avec une clé générée basée sur le titre
144
+ expect(newWrapper.emitted('update:filters')).toBeTruthy()
145
+ const emittedFilters = newWrapper.emitted('update:filters')![0][0] as Array<{ key: string, value: { from: string, to: string }, type: string }>
146
+ expect(emittedFilters.length).toBe(1)
147
+ expect(emittedFilters[0].key).toBe('filter_Test Period')
148
+ expect(emittedFilters[0].value).toEqual({ from: '01/01/2023', to: '31/12/2023' })
149
+ expect(emittedFilters[0].type).toBe('period')
150
+ })
151
+
152
+ it('generates unique key with timestamp when all header properties are absent', async () => {
153
+ // Mock Date.now() pour avoir une valeur prévisible dans le test
154
+ const originalDateNow = Date.now
155
+ const mockTimestamp = 1622548800000 // 2021-06-01T12:00:00.000Z
156
+ global.Date.now = vi.fn(() => mockTimestamp)
157
+
158
+ // Recréer le wrapper avec un header complètement vide
159
+ const emptyHeader = {}
160
+ const newWrapper = mount(PeriodFilter, {
161
+ global: {
162
+ plugins: [vuetify],
163
+ stubs: {
164
+ PeriodField: {
165
+ template: '<div class="period-field-stub" data-testid="period-field"></div>',
166
+ props: ['modelValue', 'label', 'clearable', 'density', 'hideDetails', 'format'],
167
+ },
168
+ },
169
+ },
170
+ props: {
171
+ header: emptyHeader,
172
+ filters: [],
173
+ filterValue: { from: null, to: null },
174
+ },
175
+ })
176
+
177
+ // Émettre une valeur pour déclencher la mise à jour du filtre
178
+ const periodField = newWrapper.findComponent(PeriodField)
179
+ await periodField.vm.$emit('update:modelValue', { from: '01/01/2023', to: '31/12/2023' })
180
+
181
+ // Vérifier que l'événement a été émis avec une clé générée basée sur le timestamp
182
+ expect(newWrapper.emitted('update:filters')).toBeTruthy()
183
+ const emittedFilters = newWrapper.emitted('update:filters')![0][0] as Array<{ key: string, value: { from: string, to: string }, type: string }>
184
+ expect(emittedFilters.length).toBe(1)
185
+ expect(emittedFilters[0].key).toBe(`filter_${mockTimestamp}`)
186
+ expect(emittedFilters[0].value).toEqual({ from: '01/01/2023', to: '31/12/2023' })
187
+ expect(emittedFilters[0].type).toBe('period')
188
+
189
+ // Restaurer Date.now
190
+ global.Date.now = originalDateNow
191
+ })
192
+ })