@cnamts/synapse 1.0.1 → 1.0.2

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 (217) hide show
  1. package/README.md +1 -1
  2. package/dist/{DateFilter-BmRuzQ9Z.js → DateFilter-YWOTbfeL.js} +1 -1
  3. package/dist/{NumberFilter-CnIPDHqx.js → NumberFilter-DMmMgALM.js} +1 -1
  4. package/dist/{PeriodFilter-CZwZ8CnQ.js → PeriodFilter-Bok5BHcn.js} +1 -1
  5. package/dist/SelectFilter-BKud2WhN.js +136 -0
  6. package/dist/{TextFilter-DTxZHJwX.js → TextFilter-DvMf2thH.js} +1 -1
  7. package/dist/components/Accordion/Accordion.d.ts +2 -1
  8. package/dist/components/Accordion/composables/useAccordionGroupCommunication.d.ts +5 -0
  9. package/dist/components/Accordion/composables/useAccordionKeyboardNavigation.d.ts +12 -0
  10. package/dist/components/Accordion/composables/useAccordionState.d.ts +13 -0
  11. package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +85 -0
  12. package/dist/components/Customs/SyInputSelect/SyInputSelect.d.ts +2 -0
  13. package/dist/components/Customs/SySelect/SySelect.d.ts +33 -13
  14. package/dist/components/Customs/SyTextField/SyTextField.d.ts +2 -2
  15. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +1585 -1452
  16. package/dist/components/DatePicker/DatePicker/DatePicker.d.ts +16 -2
  17. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +3 -1
  18. package/dist/components/DatePicker/composables/index.d.ts +2 -0
  19. package/dist/components/DatePicker/composables/useAsteriskDisplay.d.ts +14 -0
  20. package/dist/components/DatePicker/composables/useDateAutoClamp.d.ts +16 -0
  21. package/dist/components/DatePicker/composables/useDateRangeInput.d.ts +1 -1
  22. package/dist/components/DatePicker/composables/useDisplayedDateString.d.ts +3 -0
  23. package/dist/components/DatePicker/composables/useInputBlurHandler.d.ts +1 -0
  24. package/dist/components/DatePicker/composables/useMonthButtonCustomization.d.ts +5 -2
  25. package/dist/components/NirField/NirField.d.ts +7 -3
  26. package/dist/components/NirField/nirValidation.d.ts +1 -1
  27. package/dist/components/PasswordField/PasswordField.d.ts +2 -0
  28. package/dist/components/PeriodField/PeriodField.d.ts +52 -8
  29. package/dist/components/PhoneField/PhoneField.d.ts +2 -2
  30. package/dist/components/RangeField/RangeField.d.ts +2 -0
  31. package/dist/components/SearchListField/SearchListField.d.ts +9 -0
  32. package/dist/components/SyTextArea/SyTextArea.d.ts +2 -0
  33. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +14 -9
  34. package/dist/components/Tables/SyTable/SyTable.d.ts +12 -7
  35. package/dist/components/Tables/common/SyTablePagination.d.ts +1636 -0
  36. package/dist/components/Tables/common/TableHeader.d.ts +2 -20
  37. package/dist/components/Tables/common/filters/SelectFilter.d.ts +5 -5
  38. package/dist/components/Tables/common/filters/getFilterComponent.d.ts +1 -0
  39. package/dist/components/Tables/common/filters/locales.d.ts +4 -0
  40. package/dist/components/Tables/common/filters/logics/date.d.ts +1 -0
  41. package/dist/components/Tables/common/filters/logics/number.d.ts +1 -0
  42. package/dist/components/Tables/common/filters/logics/period.d.ts +1 -0
  43. package/dist/components/Tables/common/filters/logics/select.d.ts +1 -0
  44. package/dist/components/Tables/common/filters/logics/text.d.ts +1 -0
  45. package/dist/components/Tables/common/locales.d.ts +21 -0
  46. package/dist/components/Tables/common/organizeColumns/OrganizeColumns.d.ts +267 -0
  47. package/dist/components/Tables/common/organizeColumns/sortHeaders.d.ts +2 -0
  48. package/dist/components/Tables/common/tableFilterUtils.d.ts +1 -0
  49. package/dist/components/Tables/common/tableStorageUtils.d.ts +41 -1
  50. package/dist/components/Tables/common/tableUtils.d.ts +42 -5
  51. package/dist/components/Tables/common/types.d.ts +19 -8
  52. package/dist/components/Tables/common/usePagination.d.ts +22 -0
  53. package/dist/components/Tables/common/useTableCheckbox.d.ts +20 -0
  54. package/dist/components/Tables/common/useTableHeaders.d.ts +76 -0
  55. package/dist/components/Tables/common/useTableItems.d.ts +24 -0
  56. package/dist/components/Tables/common/useTableOptions.d.ts +18 -0
  57. package/dist/components/ToolbarContainer/ToolbarContainer.d.ts +11 -0
  58. package/dist/components/UserMenuBtn/UserMenuBtn.d.ts +9 -2
  59. package/dist/components/index.d.ts +8 -6
  60. package/dist/design-system-v3.js +58 -56
  61. package/dist/design-system-v3.umd.cjs +22 -22
  62. package/dist/main-Cx8qG7YR.js +16344 -0
  63. package/dist/stories/Accessibilite/Vuetify/VuetifyItems.d.ts +14 -2
  64. package/dist/stories/DesignTokens/StylesTypographiques.stories.new.d.ts +8 -0
  65. package/dist/stories/DesignTokens/TypographyDisplay.d.ts +28 -0
  66. package/dist/stories/DesignTokens/vue-shims.d.ts +6 -0
  67. package/dist/style.css +1 -1
  68. package/package.json +1 -1
  69. package/src/common/imgs/accessibility-svgrepo-com.svg +4 -0
  70. package/src/components/Accordion/Accessibilite/AccessibilityGuide.mdx +249 -0
  71. package/src/components/Accordion/Accordion.vue +48 -76
  72. package/src/components/Accordion/composables/__tests__/useAccordionGroupCommunication.spec.ts +146 -0
  73. package/src/components/Accordion/composables/__tests__/useAccordionKeyboardNavigation.spec.ts +209 -0
  74. package/src/components/Accordion/composables/__tests__/useAccordionState.spec.ts +144 -0
  75. package/src/components/Accordion/composables/useAccordionGroupCommunication.ts +52 -0
  76. package/src/components/Accordion/composables/useAccordionKeyboardNavigation.ts +111 -0
  77. package/src/components/Accordion/composables/useAccordionState.ts +59 -0
  78. package/src/components/Accordion/tests/__snapshots__/accordion.spec.ts.snap +3 -0
  79. package/src/components/Customs/SyCheckbox/Accessibilite.mdx +303 -0
  80. package/src/components/Customs/SyCheckbox/SyCheckbox.mdx +50 -0
  81. package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +630 -0
  82. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +326 -0
  83. package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +201 -0
  84. package/src/components/Customs/SyInputSelect/SyInputSelect.stories.ts +1 -0
  85. package/src/components/Customs/SyInputSelect/SyInputSelect.vue +8 -1
  86. package/src/components/Customs/SySelect/SySelect.stories.ts +160 -0
  87. package/src/components/Customs/SySelect/SySelect.vue +291 -32
  88. package/src/components/Customs/SySelect/tests/SySelect.spec.ts +230 -0
  89. package/src/components/Customs/SyTextField/SyTextField.stories.ts +3 -2
  90. package/src/components/Customs/SyTextField/SyTextField.vue +19 -8
  91. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.stories.ts +241 -31
  92. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +305 -57
  93. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.events.spec.ts +161 -0
  94. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +4 -2
  95. package/src/components/DatePicker/DatePicker/DatePicker.stories.ts +259 -137
  96. package/src/components/DatePicker/DatePicker/DatePicker.vue +153 -25
  97. package/src/components/DatePicker/DatePicker/tests/DatePicker.events.spec.ts +189 -0
  98. package/src/components/DatePicker/DatePicker/{DatePicker.spec.ts → tests/DatePicker.spec.ts} +1 -15
  99. package/src/components/DatePicker/DateTextInput/DateRange.stories.ts +24 -14
  100. package/src/components/DatePicker/DateTextInput/DateTextInput.events.spec.ts +148 -0
  101. package/src/components/DatePicker/DateTextInput/DateTextInput.spec.ts +3 -1
  102. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +200 -5
  103. package/src/components/DatePicker/DateTextInput/NoCalendar.stories.ts +241 -31
  104. package/src/components/DatePicker/composables/index.ts +2 -0
  105. package/src/components/DatePicker/composables/tests/useDateAutoClamp.spec.ts +190 -0
  106. package/src/components/DatePicker/composables/tests/useInputBlurHandler.spec.ts +182 -4
  107. package/src/components/DatePicker/composables/tests/useMonthButtonCustomization.spec.ts +105 -80
  108. package/src/components/DatePicker/composables/useAsteriskDisplay.ts +31 -0
  109. package/src/components/DatePicker/composables/useDateAutoClamp.ts +136 -0
  110. package/src/components/DatePicker/composables/useDateRangeInput.ts +21 -18
  111. package/src/components/DatePicker/composables/useDisplayedDateString.ts +13 -1
  112. package/src/components/DatePicker/composables/useInputBlurHandler.ts +84 -20
  113. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +149 -51
  114. package/src/components/DiacriticPicker/DiacriticPicker.stories.ts +10 -0
  115. package/src/components/ErrorPage/Accessibilite.stories.ts +8 -0
  116. package/src/components/ErrorPage/ErrorPage.vue +12 -6
  117. package/src/components/ErrorPage/tests/__snapshots__/ErrorPage.spec.ts.snap +4 -4
  118. package/src/components/NirField/NirField.mdx +22 -9
  119. package/src/components/NirField/NirField.stories.ts +26 -2
  120. package/src/components/NirField/NirField.vue +209 -22
  121. package/src/components/NirField/nirValidation.ts +17 -3
  122. package/src/components/NirField/tests/NirField.spec.ts +2 -2
  123. package/src/components/NotFoundPage/Accessibilite.stories.ts +8 -0
  124. package/src/components/NotFoundPage/NotFoundPage.vue +2 -1
  125. package/src/components/NotFoundPage/tests/__snapshots__/NotFoundPage.spec.ts.snap +8 -6
  126. package/src/components/PaginatedTable/PaginatedTable.mdx +2 -0
  127. package/src/components/PasswordField/PasswordField.stories.ts +4 -0
  128. package/src/components/PasswordField/PasswordField.vue +3 -0
  129. package/src/components/PeriodField/PeriodField.vue +2 -0
  130. package/src/components/PhoneField/PhoneField.stories.ts +15 -15
  131. package/src/components/PhoneField/PhoneField.vue +1 -1
  132. package/src/components/RangeField/RangeField.stories.ts +9 -0
  133. package/src/components/RangeField/RangeField.vue +4 -0
  134. package/src/components/RangeField/tests/__snapshots__/RangeField.spec.ts.snap +12 -0
  135. package/src/components/SearchListField/SearchListField.vue +5 -0
  136. package/src/components/SyTextArea/SyTextArea.vue +3 -0
  137. package/src/components/SyTextArea/tests/SyTextArea.spec.ts +0 -1
  138. package/src/components/Tables/SyServerTable/FilterRules.stories.ts +632 -15
  139. package/src/components/Tables/SyServerTable/SyServerTable.mdx +15 -5
  140. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +2844 -1377
  141. package/src/components/Tables/SyServerTable/SyServerTable.vue +155 -66
  142. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +256 -4
  143. package/src/components/Tables/SyTable/FilterRules.stories.ts +183 -0
  144. package/src/components/Tables/SyTable/SyTable.mdx +14 -4
  145. package/src/components/Tables/SyTable/SyTable.stories.ts +1265 -477
  146. package/src/components/Tables/SyTable/SyTable.vue +152 -72
  147. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +366 -4
  148. package/src/components/Tables/common/SyTableFilter.vue +3 -56
  149. package/src/components/Tables/common/SyTablePagination.vue +375 -0
  150. package/src/components/Tables/common/TableHeader.vue +10 -26
  151. package/src/components/Tables/common/filters/SelectFilter.vue +131 -22
  152. package/src/components/Tables/common/filters/getFilterComponent.ts +54 -0
  153. package/src/components/Tables/common/filters/locales.ts +4 -0
  154. package/src/components/Tables/common/filters/logics/date.ts +12 -0
  155. package/src/components/Tables/common/filters/logics/number.ts +48 -0
  156. package/src/components/Tables/common/filters/logics/period.ts +25 -0
  157. package/src/components/Tables/common/filters/logics/select.ts +27 -0
  158. package/src/components/Tables/common/filters/logics/tests/TextFilterLogic.spec.ts +177 -0
  159. package/src/components/Tables/common/filters/logics/text.ts +62 -0
  160. package/src/components/Tables/common/filters/tests/TextFilter.spec.ts +11 -11
  161. package/src/components/Tables/common/locales.ts +24 -0
  162. package/src/components/Tables/common/organizeColumns/OrganizeColumns.vue +269 -0
  163. package/src/components/Tables/common/organizeColumns/sortHeaders.ts +9 -0
  164. package/src/components/Tables/common/tableFilterUtils.ts +43 -295
  165. package/src/components/Tables/common/tableStorageUtils.ts +27 -2
  166. package/src/components/Tables/common/tableStyles.scss +26 -0
  167. package/src/components/Tables/common/tableUtils.ts +3 -16
  168. package/src/components/Tables/common/tests/SyTablePagination.spec.ts +170 -0
  169. package/src/components/Tables/common/tests/filterByRange.spec.ts +215 -0
  170. package/src/components/Tables/common/tests/tableFilterUtils.spec.ts +0 -14
  171. package/src/components/Tables/common/tests/tableUtils.spec.ts +7 -51
  172. package/src/components/Tables/common/types.ts +17 -6
  173. package/src/components/Tables/common/usePagination.ts +83 -0
  174. package/src/components/Tables/common/useTableCheckbox.ts +58 -0
  175. package/src/components/Tables/common/useTableHeaders.ts +88 -0
  176. package/src/components/Tables/common/useTableItems.ts +87 -0
  177. package/src/components/Tables/common/useTableOptions.ts +93 -0
  178. package/src/components/ToolbarContainer/ToolbarContainer.mdx +16 -0
  179. package/src/components/ToolbarContainer/ToolbarContainer.stories.ts +675 -0
  180. package/src/components/ToolbarContainer/ToolbarContainer.vue +128 -0
  181. package/src/components/ToolbarContainer/tests/ToolbarContainer.spec.ts +156 -0
  182. package/src/components/UserMenuBtn/UserMenuBtn.stories.ts +74 -0
  183. package/src/components/UserMenuBtn/UserMenuBtn.vue +19 -17
  184. package/src/components/index.ts +8 -6
  185. package/src/stories/Accessibilite/Aculturation/AuditDesignSystem.mdx +293 -20
  186. package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +448 -54
  187. package/src/stories/Accessibilite/Audit/RGAA.mdx +231 -23
  188. package/src/stories/Accessibilite/Avancement/Avancement.mdx +591 -7
  189. package/src/stories/Accessibilite/Avancement/Avancement.stories.ts +139 -38
  190. package/src/stories/Accessibilite/Introduction.mdx +258 -18
  191. package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +221 -31
  192. package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +204 -22
  193. package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +537 -24
  194. package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +577 -70
  195. package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru.mdx +382 -31
  196. package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +419 -81
  197. package/src/stories/Accessibilite/Vuetify/Vuetify.mdx +132 -6
  198. package/src/stories/Accessibilite/Vuetify/Vuetify.stories.ts +370 -146
  199. package/src/stories/Accessibilite/Vuetify/VuetifyItems.ts +35 -57
  200. package/src/stories/Demarrer/Accueil.stories.ts +20 -5
  201. package/src/stories/DesignTokens/StylesTypographiques.mdx +10 -9
  202. package/src/stories/DesignTokens/StylesTypographiques.stories.new.ts +397 -0
  203. package/src/stories/DesignTokens/StylesTypographiques.stories.ts +397 -0
  204. package/src/stories/DesignTokens/TypographyDisplay.vue +155 -0
  205. package/src/stories/DesignTokens/vue-shims.d.ts +6 -0
  206. package/src/stories/GuideDuDev/LesBreackingChanges.mdx +0 -2
  207. package/src/stories/GuideDuDev/MigrationDepuisBridge.mdx +1 -1
  208. package/src/stories/GuideDuDev/MigrationDepuisVue2.mdx +1 -1
  209. package/src/stories/GuideDuDev/PortailAgent.mdx +10 -0
  210. package/src/stories/GuideDuDev/PortailAgent.stories.ts +506 -0
  211. package/src/stories/GuideDuDev/Theme.mdx +41 -0
  212. package/dist/SelectFilter-Cj-GW2Cc.js +0 -97
  213. package/dist/main-WDqeoGM-.js +0 -14788
  214. package/src/components/PaginatedTable/tests/__snapshots__/PaginatedTable.spec.ts.snap +0 -886
  215. package/src/components/Tables/SyServerTable/tests/__snapshots__/SyServerTable.spec.ts.snap +0 -521
  216. package/src/components/Tables/SyTable/tests/__snapshots__/SyTable.spec.ts.snap +0 -521
  217. package/src/stories/DesignTokens/ThemePA.mdx +0 -35
@@ -0,0 +1,161 @@
1
+ import { mount } from '@vue/test-utils'
2
+ import { describe, it, expect, beforeEach } from 'vitest'
3
+ import { vuetify } from '@tests/unit/setup'
4
+ import { nextTick } from 'vue'
5
+ import ComplexDatePicker from '../ComplexDatePicker.vue'
6
+
7
+ describe('ComplexDatePicker.vue - Events', () => {
8
+ let wrapper
9
+
10
+ beforeEach(() => {
11
+ wrapper = mount(ComplexDatePicker, {
12
+ global: {
13
+ plugins: [vuetify],
14
+ },
15
+ props: {
16
+ modelValue: '',
17
+ format: 'DD/MM/YYYY',
18
+ },
19
+ })
20
+ })
21
+
22
+ it('émet update:modelValue lors de la saisie d\'une date valide', async () => {
23
+ const input = wrapper.find('input')
24
+ await input.setValue('01/01/2023')
25
+ await input.trigger('blur')
26
+
27
+ expect(wrapper.emitted('update:modelValue')).toBeTruthy()
28
+ expect(wrapper.emitted('update:modelValue')[0]).toEqual(['01/01/2023'])
29
+ })
30
+
31
+ it('met à jour la valeur interne lors de la sélection d\'une date', async () => {
32
+ // Ouvrir le calendrier
33
+ wrapper.vm.isDatePickerVisible = true
34
+ await nextTick()
35
+
36
+ // Simuler une saisie directe dans l'input
37
+ const input = wrapper.find('input')
38
+ await input.setValue('01/01/2023')
39
+ await input.trigger('blur')
40
+ await nextTick()
41
+
42
+ // Vérifier que l'événement update:modelValue est émis
43
+ expect(wrapper.emitted('update:modelValue')).toBeTruthy()
44
+ })
45
+
46
+ it('émet focus lors du focus sur l\'input', async () => {
47
+ const input = wrapper.find('input')
48
+ await input.trigger('focus')
49
+
50
+ expect(wrapper.emitted('focus')).toBeTruthy()
51
+ })
52
+
53
+ it('émet blur lors de la perte de focus', async () => {
54
+ const input = wrapper.find('input')
55
+ await input.trigger('focus')
56
+ await input.trigger('blur')
57
+
58
+ expect(wrapper.emitted('blur')).toBeTruthy()
59
+ })
60
+
61
+ it('met à jour la valeur de l\'input lors de la saisie', async () => {
62
+ const input = wrapper.find('input')
63
+ await input.setValue('01/01')
64
+ await nextTick()
65
+
66
+ // Vérifier que la valeur est mise à jour dans l'input
67
+ expect(input.element.value).toContain('01/01')
68
+ })
69
+
70
+ it('gère la visibilité du calendrier', async () => {
71
+ // Ouvrir le calendrier
72
+ wrapper.vm.isDatePickerVisible = true
73
+ await nextTick()
74
+
75
+ // Vérifier que le calendrier est visible
76
+ expect(wrapper.vm.isDatePickerVisible).toBe(true)
77
+
78
+ // Fermer le calendrier
79
+ wrapper.vm.isDatePickerVisible = false
80
+ await nextTick()
81
+
82
+ // Vérifier que le calendrier est fermé
83
+ expect(wrapper.vm.isDatePickerVisible).toBe(false)
84
+ })
85
+
86
+ it('met à jour la valeur interne lors de la sélection d\'une date', async () => {
87
+ // Simuler une saisie directe dans l'input
88
+ const input = wrapper.find('input')
89
+ await input.setValue('01/01/2023')
90
+ await input.trigger('blur')
91
+ await nextTick()
92
+
93
+ // Vérifier que la valeur interne est mise à jour
94
+ expect(input.element.value).toContain('01/01/2023')
95
+
96
+ // Vérifier que l'événement update:modelValue est émis
97
+ expect(wrapper.emitted('update:modelValue')).toBeTruthy()
98
+ })
99
+
100
+ it('synchronise textInputValue et selectedDates', async () => {
101
+ const input = wrapper.find('input')
102
+ await input.setValue('01/01/2023')
103
+ await input.trigger('blur')
104
+ await nextTick()
105
+
106
+ // Vérifier que selectedDates est mis à jour
107
+ expect(wrapper.vm.selectedDates).not.toBeNull()
108
+ const selectedDate = wrapper.vm.selectedDates
109
+ expect(selectedDate instanceof Date).toBe(true)
110
+ expect(selectedDate.getFullYear()).toBe(2023)
111
+ expect(selectedDate.getMonth()).toBe(0) // Janvier (0-indexed)
112
+ expect(selectedDate.getDate()).toBe(1)
113
+ })
114
+
115
+ it('accepte une plage de dates en entrée', async () => {
116
+ const wrapperWithRange = mount(ComplexDatePicker, {
117
+ global: {
118
+ plugins: [vuetify],
119
+ },
120
+ props: {
121
+ modelValue: ['01/01/2023', '05/01/2023'],
122
+ format: 'DD/MM/YYYY',
123
+ displayRange: true,
124
+ },
125
+ })
126
+ await nextTick()
127
+
128
+ // Vérifier que l'input affiche au moins la première date
129
+ const input = wrapperWithRange.find('input')
130
+ expect(input.element.value).toContain('01/01/2023')
131
+
132
+ // Vérifier que la propriété displayRange est bien prise en compte
133
+ expect(wrapperWithRange.props('displayRange')).toBe(true)
134
+ })
135
+
136
+ it('valide les dates selon les règles personnalisées', async () => {
137
+ const customRule = {
138
+ type: 'isDateValid',
139
+ options: {},
140
+ }
141
+
142
+ const wrapperWithRules = mount(ComplexDatePicker, {
143
+ global: {
144
+ plugins: [vuetify],
145
+ },
146
+ props: {
147
+ modelValue: '',
148
+ format: 'DD/MM/YYYY',
149
+ customRules: [customRule],
150
+ required: true,
151
+ },
152
+ })
153
+
154
+ // Valider sans sélectionner de date
155
+ await wrapperWithRules.vm.validateOnSubmit()
156
+ await nextTick()
157
+
158
+ // Vérifier qu'une erreur de validation est affichée
159
+ expect(wrapperWithRules.vm.errorMessages.length).toBeGreaterThan(0)
160
+ })
161
+ })
@@ -242,8 +242,10 @@ describe('ComplexDatePicker', () => {
242
242
  await wrapper.vm.updateDisplayFormattedDate()
243
243
  await flushPromises()
244
244
 
245
- // Vérifier que l'événement est émis
246
- expect(wrapper.emitted('date-selected')).toBeTruthy()
245
+ // Vérifier que displayFormattedDate est mis à jour
246
+ // Note: L'événement date-selected n'est émis que dans certaines conditions
247
+ // qui ne sont pas remplies dans ce test
248
+ expect(wrapper.vm.displayFormattedDate).not.toBe('')
247
249
  })
248
250
 
249
251
  it('devrait exposer les méthodes nécessaires via defineExpose', () => {
@@ -3,6 +3,7 @@ import DatePicker from './DatePicker.vue'
3
3
  import SyAlert from '@/components/SyAlert/SyAlert.vue'
4
4
  import { ref, watch, computed } from 'vue'
5
5
  import { useDateFormat } from '@/composables/date/useDateFormatDayjs'
6
+ import { fn } from '@storybook/test'
6
7
 
7
8
  const meta = {
8
9
  title: 'Composants/Formulaires/DatePicker/DatePicker',
@@ -15,6 +16,7 @@ const meta = {
15
16
  parameters: {
16
17
  layout: 'fullscreen',
17
18
  controls: { exclude: ['modelValue'] },
19
+ actions: { argTypesRegex: '^on.*' },
18
20
  },
19
21
  argTypes: {
20
22
  modelValue: {
@@ -94,6 +96,14 @@ const meta = {
94
96
  control: 'object',
95
97
  description: 'Période pendant laquelle les dates peuvent être sélectionnées (au format: MM/DD/YYYY)',
96
98
  },
99
+ autoClamp: {
100
+ control: 'boolean',
101
+ description: 'Active le clamping automatique des dates',
102
+ },
103
+ displayHolidayDays: {
104
+ control: 'boolean',
105
+ description: 'Affiche les jours fériés',
106
+ },
97
107
  },
98
108
  } as Meta<typeof DatePicker>
99
109
 
@@ -127,19 +137,93 @@ export const Default: Story = {
127
137
  ],
128
138
  },
129
139
  args: {
130
- placeholder: 'Sélectionner une date',
131
- format: 'DD/MM/YYYY',
132
- isBirthDate: false,
133
- showWeekNumber: false,
134
- required: false,
135
- displayRange: false,
136
- displayIcon: true,
137
- displayAppendIcon: false,
138
- disabled: false,
139
- noIcon: false,
140
- noCalendar: false,
141
- modelValue: '',
142
- displayTodayButton: true,
140
+ 'placeholder': 'Sélectionner une date',
141
+ 'format': 'DD/MM/YYYY',
142
+ 'isBirthDate': false,
143
+ 'showWeekNumber': false,
144
+ 'required': false,
145
+ 'displayRange': false,
146
+ 'displayIcon': true,
147
+ 'displayAppendIcon': false,
148
+ 'disabled': false,
149
+ 'noIcon': false,
150
+ 'noCalendar': false,
151
+ 'displayHolidayDays': true,
152
+ 'modelValue': '',
153
+ 'displayTodayButton': true,
154
+ 'onUpdate:modelValue': fn(),
155
+ 'onFocus': fn(),
156
+ 'onBlur': fn(),
157
+ 'onClosed': fn(),
158
+ },
159
+ render: (args) => {
160
+ return {
161
+ components: { DatePicker: DatePicker },
162
+ setup() {
163
+ const value = ref('')
164
+ return { args, value }
165
+ },
166
+ template: `
167
+ <div class="d-flex flex-wrap align-center pa-4">
168
+ <DatePicker v-bind="args" v-model="value"/>
169
+ </div>
170
+ `,
171
+ }
172
+ },
173
+ }
174
+
175
+ export const Required: Story = {
176
+ parameters: {
177
+ sourceCode: [
178
+ {
179
+ name: 'Template',
180
+ code: `
181
+ <template>
182
+ <DatePicker
183
+ v-model="date"
184
+ placeholder="Sélectionner une date"
185
+ required
186
+ format="DD/MM/YYYY"
187
+ />
188
+ <DatePicker
189
+ v-model="date"
190
+ placeholder="Sélectionner une date"
191
+ required
192
+ displayAsterisk
193
+ format="DD/MM/YYYY"
194
+ />
195
+ </template>
196
+ `,
197
+ },
198
+ {
199
+ name: 'Script',
200
+ code: `
201
+ <script setup lang="ts">
202
+ import { DatePicker } from '@cnamts/synapse'
203
+ </script>
204
+ `,
205
+ },
206
+ ],
207
+ },
208
+ args: {
209
+ 'placeholder': 'Sélectionner une date',
210
+ 'format': 'DD/MM/YYYY',
211
+ 'isBirthDate': false,
212
+ 'showWeekNumber': false,
213
+ 'required': true,
214
+ 'displayRange': false,
215
+ 'displayIcon': true,
216
+ 'displayAppendIcon': false,
217
+ 'disabled': false,
218
+ 'noIcon': false,
219
+ 'noCalendar': false,
220
+ 'displayHolidayDays': true,
221
+ 'modelValue': '',
222
+ 'displayTodayButton': true,
223
+ 'onUpdate:modelValue': fn(),
224
+ 'onFocus': fn(),
225
+ 'onBlur': fn(),
226
+ 'onClosed': fn(),
143
227
  },
144
228
  render: (args) => {
145
229
  return {
@@ -150,7 +234,10 @@ export const Default: Story = {
150
234
  },
151
235
  template: `
152
236
  <div class="d-flex flex-wrap align-center pa-4">
237
+ <h4 class="mb-4">Sans astérisque :</h4>
153
238
  <DatePicker v-bind="args" v-model="value"/>
239
+ <h4 class="mb-4">Avec astérisque :</h4>
240
+ <DatePicker v-bind="args" v-model="value" displayAsterisk/>
154
241
  </div>
155
242
  `,
156
243
  }
@@ -187,19 +274,23 @@ export const DateRange: Story = {
187
274
  ],
188
275
  },
189
276
  args: {
190
- placeholder: 'Sélectionner une période',
191
- format: 'DD/MM/YYYY',
192
- dateFormatReturn: '',
193
- isBirthDate: false,
194
- showWeekNumber: false,
195
- required: false,
196
- displayRange: true,
197
- displayIcon: true,
198
- displayAppendIcon: false,
199
- disabled: false,
200
- noIcon: false,
201
- noCalendar: false,
202
- modelValue: ['', ''],
277
+ 'placeholder': 'Sélectionner une période',
278
+ 'format': 'DD/MM/YYYY',
279
+ 'dateFormatReturn': '',
280
+ 'isBirthDate': false,
281
+ 'showWeekNumber': false,
282
+ 'required': false,
283
+ 'displayRange': true,
284
+ 'displayIcon': true,
285
+ 'displayAppendIcon': false,
286
+ 'disabled': false,
287
+ 'noIcon': false,
288
+ 'noCalendar': false,
289
+ 'modelValue': ['', ''],
290
+ 'onUpdate:modelValue': fn(),
291
+ 'onFocus': fn(),
292
+ 'onBlur': fn(),
293
+ 'onClosed': fn(),
203
294
  },
204
295
  render: (args) => {
205
296
  return {
@@ -265,23 +356,27 @@ export const WithCustomPeriod: Story = {
265
356
  ],
266
357
  },
267
358
  args: {
268
- placeholder: 'Sélectionner une date',
269
- format: 'DD/MM/YYYY',
270
- isBirthDate: false,
271
- showWeekNumber: false,
272
- required: false,
273
- displayRange: false,
274
- displayIcon: true,
275
- displayAppendIcon: false,
276
- disabled: false,
277
- noIcon: false,
278
- noCalendar: false,
279
- modelValue: '',
280
- period: {
359
+ 'placeholder': 'Sélectionner une date',
360
+ 'format': 'DD/MM/YYYY',
361
+ 'isBirthDate': false,
362
+ 'showWeekNumber': false,
363
+ 'required': false,
364
+ 'displayRange': false,
365
+ 'displayIcon': true,
366
+ 'displayAppendIcon': false,
367
+ 'disabled': false,
368
+ 'noIcon': false,
369
+ 'noCalendar': false,
370
+ 'modelValue': '',
371
+ 'onUpdate:modelValue': fn(),
372
+ 'onFocus': fn(),
373
+ 'onBlur': fn(),
374
+ 'onClosed': fn(),
375
+ 'period': {
281
376
  min: '01/01/1995',
282
377
  max: '12/31/2005',
283
378
  },
284
- customRules: [
379
+ 'customRules': [
285
380
  {
286
381
  type: 'notBeforeDate',
287
382
  options: {
@@ -311,9 +406,8 @@ export const WithCustomPeriod: Story = {
311
406
  <div style="margin-bottom: 20px; padding: 15px;">
312
407
  <SyAlert variant="tonal" :closable="false">
313
408
  <template #default>
314
- <h4>Note importante pour la validation manuelle</h4>
315
- <p>Pour valider les dates saisies manuellement en fonction de la période définie, il faut utiliser la propriété customRules comme dans l'exemple ci-dessous.</p>
316
- <p>La propriété <strong>period</strong> limite les dates sélectionnables dans le calendrier, mais les règles personnalisées sont nécessaires pour la validation des saisies manuelles.</p>
409
+ <p>La propriété <strong>period</strong> limite les dates sélectionnables dans le calendrier</p>
410
+ <p>Ouvrez les années dans le calendrier pour voir les dates limites</p>
317
411
  </template>
318
412
  </SyAlert>
319
413
  </div>
@@ -355,19 +449,23 @@ export const WithAppendIcon: Story = {
355
449
  ],
356
450
  },
357
451
  args: {
358
- placeholder: 'Sélectionner une date',
359
- format: 'DD/MM/YYYY',
360
- dateFormatReturn: '',
361
- isBirthDate: false,
362
- showWeekNumber: false,
363
- required: false,
364
- displayRange: false,
365
- displayIcon: true,
366
- displayAppendIcon: true,
367
- disabled: false,
368
- noIcon: false,
369
- noCalendar: false,
370
- modelValue: '',
452
+ 'placeholder': 'Sélectionner une date',
453
+ 'format': 'DD/MM/YYYY',
454
+ 'dateFormatReturn': '',
455
+ 'isBirthDate': false,
456
+ 'showWeekNumber': false,
457
+ 'required': false,
458
+ 'displayRange': false,
459
+ 'displayIcon': true,
460
+ 'displayAppendIcon': true,
461
+ 'disabled': false,
462
+ 'noIcon': false,
463
+ 'noCalendar': false,
464
+ 'modelValue': '',
465
+ 'onUpdate:modelValue': fn(),
466
+ 'onFocus': fn(),
467
+ 'onBlur': fn(),
468
+ 'onClosed': fn(),
371
469
  },
372
470
  render: (args) => {
373
471
  return {
@@ -415,19 +513,23 @@ export const WithoutIcon: Story = {
415
513
  ],
416
514
  },
417
515
  args: {
418
- placeholder: 'Sélectionner une date',
419
- format: 'DD/MM/YYYY',
420
- dateFormatReturn: '',
421
- isBirthDate: false,
422
- showWeekNumber: false,
423
- required: false,
424
- displayRange: false,
425
- displayIcon: false,
426
- displayAppendIcon: false,
427
- disabled: false,
428
- noIcon: false,
429
- noCalendar: false,
430
- modelValue: '',
516
+ 'placeholder': 'Sélectionner une date',
517
+ 'format': 'DD/MM/YYYY',
518
+ 'dateFormatReturn': '',
519
+ 'isBirthDate': false,
520
+ 'showWeekNumber': false,
521
+ 'required': false,
522
+ 'displayRange': false,
523
+ 'displayIcon': false,
524
+ 'displayAppendIcon': false,
525
+ 'disabled': false,
526
+ 'noIcon': false,
527
+ 'noCalendar': false,
528
+ 'modelValue': '',
529
+ 'onUpdate:modelValue': fn(),
530
+ 'onFocus': fn(),
531
+ 'onBlur': fn(),
532
+ 'onClosed': fn(),
431
533
  },
432
534
  render: (args) => {
433
535
  return {
@@ -475,19 +577,23 @@ export const BirthDate: Story = {
475
577
  ],
476
578
  },
477
579
  args: {
478
- placeholder: 'Date de naissance',
479
- format: 'DD/MM/YYYY',
480
- dateFormatReturn: '',
481
- isBirthDate: true,
482
- showWeekNumber: false,
483
- required: false,
484
- displayRange: false,
485
- displayIcon: true,
486
- displayAppendIcon: false,
487
- disabled: false,
488
- noIcon: false,
489
- noCalendar: false,
490
- modelValue: '',
580
+ 'placeholder': 'Date de naissance',
581
+ 'format': 'DD/MM/YYYY',
582
+ 'dateFormatReturn': '',
583
+ 'isBirthDate': true,
584
+ 'showWeekNumber': false,
585
+ 'required': false,
586
+ 'displayRange': false,
587
+ 'displayIcon': true,
588
+ 'displayAppendIcon': false,
589
+ 'disabled': false,
590
+ 'noIcon': false,
591
+ 'noCalendar': false,
592
+ 'modelValue': '',
593
+ 'onUpdate:modelValue': fn(),
594
+ 'onFocus': fn(),
595
+ 'onBlur': fn(),
596
+ 'onClosed': fn(),
491
597
  },
492
598
  render: (args) => {
493
599
  return {
@@ -536,22 +642,26 @@ export const WithError: Story = {
536
642
  ],
537
643
  },
538
644
  args: {
539
- placeholder: 'Sélectionner une date',
540
- format: 'DD/MM/YYYY',
541
- dateFormatReturn: '',
542
- isBirthDate: false,
543
- showWeekNumber: false,
544
- required: false,
545
- displayRange: false,
546
- displayIcon: true,
547
- displayAppendIcon: false,
548
- disabled: false,
549
- noIcon: false,
550
- noCalendar: false,
551
- modelValue: '01/01/2100',
552
- customRules: [
645
+ 'placeholder': 'Sélectionner une date',
646
+ 'format': 'DD/MM/YYYY',
647
+ 'dateFormatReturn': '',
648
+ 'isBirthDate': false,
649
+ 'showWeekNumber': false,
650
+ 'required': false,
651
+ 'displayRange': false,
652
+ 'displayIcon': true,
653
+ 'displayAppendIcon': false,
654
+ 'disabled': false,
655
+ 'noIcon': false,
656
+ 'noCalendar': false,
657
+ 'modelValue': '01/01/2100',
658
+ 'customRules': [
553
659
  { type: 'notAfterToday', options: { message: 'La date ne peut pas être après aujourd\'hui' } },
554
660
  ],
661
+ 'onUpdate:modelValue': fn(),
662
+ 'onFocus': fn(),
663
+ 'onBlur': fn(),
664
+ 'onClosed': fn(),
555
665
  },
556
666
  render: (args) => {
557
667
  return {
@@ -604,20 +714,20 @@ export const WithWarning: Story = {
604
714
  ],
605
715
  },
606
716
  args: {
607
- placeholder: 'Date avec avertissement',
608
- format: 'DD/MM/YYYY',
609
- dateFormatReturn: '',
610
- isBirthDate: false,
611
- showWeekNumber: false,
612
- required: false,
613
- displayRange: false,
614
- displayIcon: true,
615
- displayAppendIcon: false,
616
- disabled: false,
617
- noIcon: false,
618
- noCalendar: false,
619
- modelValue: '20/12/2023',
620
- customWarningRules: [
717
+ 'placeholder': 'Date avec avertissement',
718
+ 'format': 'DD/MM/YYYY',
719
+ 'dateFormatReturn': '',
720
+ 'isBirthDate': false,
721
+ 'showWeekNumber': false,
722
+ 'required': false,
723
+ 'displayRange': false,
724
+ 'displayIcon': true,
725
+ 'displayAppendIcon': false,
726
+ 'disabled': false,
727
+ 'noIcon': false,
728
+ 'noCalendar': false,
729
+ 'modelValue': '20/12/2023',
730
+ 'customWarningRules': [
621
731
  {
622
732
  type: 'notBeforeDate', options: {
623
733
  warningMessage: 'Attention : la date est antérieure à la date de référence',
@@ -626,6 +736,10 @@ export const WithWarning: Story = {
626
736
  },
627
737
  },
628
738
  ],
739
+ 'onUpdate:modelValue': fn(),
740
+ 'onFocus': fn(),
741
+ 'onBlur': fn(),
742
+ 'onClosed': fn(),
629
743
  },
630
744
  render: (args) => {
631
745
  return {
@@ -675,22 +789,26 @@ export const WithSuccess: Story = {
675
789
  ],
676
790
  },
677
791
  args: {
678
- placeholder: 'Date valide',
679
- format: 'DD/MM/YYYY',
680
- dateFormatReturn: '',
681
- isBirthDate: false,
682
- showWeekNumber: false,
683
- required: true,
684
- displayRange: false,
685
- displayIcon: true,
686
- displayAppendIcon: false,
687
- disabled: false,
688
- noIcon: false,
689
- noCalendar: false,
690
- modelValue: '22/01/2024',
691
- customRules: [
792
+ 'placeholder': 'Date valide',
793
+ 'format': 'DD/MM/YYYY',
794
+ 'dateFormatReturn': '',
795
+ 'isBirthDate': false,
796
+ 'showWeekNumber': false,
797
+ 'required': true,
798
+ 'displayRange': false,
799
+ 'displayIcon': true,
800
+ 'displayAppendIcon': false,
801
+ 'disabled': false,
802
+ 'noIcon': false,
803
+ 'noCalendar': false,
804
+ 'modelValue': '22/01/2024',
805
+ 'customRules': [
692
806
  { type: 'notWeekend', options: { message: 'La date ne peut pas être un weekend' } },
693
807
  ],
808
+ 'onUpdate:modelValue': fn(),
809
+ 'onFocus': fn(),
810
+ 'onBlur': fn(),
811
+ 'onClosed': fn(),
694
812
  },
695
813
  render: (args) => {
696
814
  return {
@@ -861,19 +979,23 @@ export const WithDateFormatReturn: Story = {
861
979
  ],
862
980
  },
863
981
  args: {
864
- placeholder: 'Sélectionner une date',
865
- format: 'DD/MM/YYYY',
866
- dateFormatReturn: '',
867
- isBirthDate: false,
868
- showWeekNumber: false,
869
- required: false,
870
- displayRange: false,
871
- displayIcon: true,
872
- displayAppendIcon: false,
873
- disabled: false,
874
- noIcon: false,
875
- noCalendar: false,
876
- modelValue: '24/12/2025',
982
+ 'placeholder': 'Sélectionner une date',
983
+ 'format': 'DD/MM/YYYY',
984
+ 'dateFormatReturn': '',
985
+ 'isBirthDate': false,
986
+ 'showWeekNumber': false,
987
+ 'required': false,
988
+ 'displayRange': false,
989
+ 'displayIcon': true,
990
+ 'displayAppendIcon': false,
991
+ 'disabled': false,
992
+ 'noIcon': false,
993
+ 'noCalendar': false,
994
+ 'modelValue': '24/12/2025',
995
+ 'onUpdate:modelValue': fn(),
996
+ 'onFocus': fn(),
997
+ 'onBlur': fn(),
998
+ 'onClosed': fn(),
877
999
  },
878
1000
  render: () => {
879
1001
  return {