@cnamts/synapse 1.0.19 → 1.0.20

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 (269) hide show
  1. package/dist/{DateFilter-CeVuSfJ9.js → DateFilter-XURUmpMl.js} +1 -1
  2. package/dist/{NumberFilter-C8PAu_sw.js → NumberFilter-BZc0O8wV.js} +1 -1
  3. package/dist/{PeriodFilter-UMUaxx3d.js → PeriodFilter-ZNdXcl3p.js} +1 -1
  4. package/dist/{SelectFilter-CqZl8CYt.js → SelectFilter-DshYU5OK.js} +1 -1
  5. package/dist/{TextFilter-D_RhhNOh.js → TextFilter-D_c5dRPl.js} +1 -1
  6. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +4 -4
  7. package/dist/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.d.ts +17 -7
  8. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +4 -4
  9. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +4 -4
  10. package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2416 -0
  11. package/dist/components/Customs/Selects/SyAutocomplete/types.d.ts +5 -0
  12. package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +14 -0
  13. package/dist/components/Customs/Selects/SyAutocomplete/utils/useItemUtils.d.ts +16 -0
  14. package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +28 -0
  15. package/dist/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.d.ts +12 -0
  16. package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +2 -0
  17. package/dist/components/Customs/SyIcon/SyIcon.d.ts +2 -1
  18. package/dist/components/DatePicker/composables/useDateSelection.d.ts +1 -0
  19. package/dist/components/PaginatedTable/PaginatedTable.d.ts +1 -1
  20. package/dist/components/PaginatedTable/Pagination.d.ts +17 -0
  21. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -5
  22. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -5
  23. package/dist/components/index.d.ts +1 -0
  24. package/dist/components/types.d.ts +15 -0
  25. package/dist/composables/useFormFieldErrorHandling.d.ts +31 -0
  26. package/dist/design-system-v3.js +68 -67
  27. package/dist/design-system-v3.umd.cjs +320 -309
  28. package/dist/{main-B39UVv5p.js → main-CuI6xaPq.js} +9921 -9194
  29. package/dist/modules.d.ts +6 -0
  30. package/dist/style.css +1 -1
  31. package/package.json +8 -9
  32. package/src/assets/amelipro/icons.ts +166 -153
  33. package/src/components/Accordion/Accordion.mdx +4 -1
  34. package/src/components/Accordion/{Accessibilite/AccessibilityGuide.mdx → accessibilite/Accessibility.mdx} +2 -2
  35. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.stories.ts +73 -14
  36. package/src/components/Amelipro/AmeliproClickableTile/AmeliproClickableTile.vue +119 -27
  37. package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.a11y.spec.ts +304 -0
  38. package/src/components/Amelipro/AmeliproClickableTile/tests/AmeliproClickableTile.spec.ts +435 -9
  39. package/src/components/Amelipro/AmeliproClickableTile/tests/__snapshots__/AmeliproClickableTile.spec.ts.snap +60 -0
  40. package/src/components/Amelipro/AmeliproIcon/__tests__/AmeliproIcon.spec.ts +1 -1
  41. package/src/components/Amelipro/AmeliproIcon/iconList.ts +2 -0
  42. package/src/components/BackBtn/BackBtn.vue +5 -4
  43. package/src/components/BackBtn/accessibilite/Accessibility.mdx +15 -0
  44. package/src/components/BackToTopBtn/BackToTopBtn.vue +6 -3
  45. package/src/components/BackToTopBtn/accessibilite/Accessibility.mdx +15 -0
  46. package/src/components/Captcha/Captcha.vue +5 -1
  47. package/src/components/Captcha/CaptchaAlert.vue +9 -7
  48. package/src/components/Captcha/accessibilite/Accessibility.mdx +10 -0
  49. package/src/components/ChipList/accessibilite/Accessibility.mdx +15 -0
  50. package/src/components/CollapsibleList/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +8 -6
  51. package/src/components/Common/IconSlot/IconSlot.vue +1 -1
  52. package/src/components/ContextualMenu/accessibilite/Accessibility.mdx +15 -0
  53. package/src/components/CookieBanner/accessibilite/Accessibility.mdx +15 -0
  54. package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +5 -4
  55. package/src/components/CopyBtn/CopyBtn.vue +6 -3
  56. package/src/components/CopyBtn/accessibilite/Accessibility.mdx +15 -0
  57. package/src/components/Customs/Selects/SelectBtnField/accessibilite/Accessibility.mdx +15 -0
  58. package/src/components/Customs/Selects/SelectOverview.mdx +112 -1
  59. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.mdx +52 -0
  60. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +979 -0
  61. package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +653 -0
  62. package/src/components/Customs/Selects/{SySelect → SyAutocomplete/accessibilite}/Accessibilite.stories.ts +7 -38
  63. package/src/components/Customs/Selects/{SySelect/Accessibilite.mdx → SyAutocomplete/accessibilite/Accessibility.mdx} +15 -20
  64. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.a11y.spec.ts +72 -0
  65. package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +345 -0
  66. package/src/components/Customs/Selects/SyAutocomplete/types.ts +7 -0
  67. package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +180 -0
  68. package/src/components/Customs/Selects/SyAutocomplete/utils/useItemUtils.ts +46 -0
  69. package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +107 -0
  70. package/src/components/Customs/Selects/SyAutocomplete/utils/useSelectionLogic.ts +74 -0
  71. package/src/components/Customs/Selects/SyInputSelect/SyInputSelect.vue +13 -9
  72. package/src/components/Customs/Selects/SyInputSelect/accessibilite/Accessibility.mdx +12 -0
  73. package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +43 -34
  74. package/src/components/Customs/Selects/SySelect/SySelect.vue +19 -2
  75. package/src/components/Customs/Selects/SySelect/accessibilite/Accessibility.mdx +274 -0
  76. package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +21 -16
  77. package/src/components/Customs/SyCheckbox/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
  78. package/src/components/Customs/SyForm/accessibilite/Accessibility.mdx +10 -0
  79. package/src/components/Customs/SyIcon/SyIcon.mdx +4 -1
  80. package/src/components/Customs/SyIcon/SyIcon.vue +4 -3
  81. package/src/components/Customs/SyIcon/{Accessibilite.stories.ts → accessibilite/Accessibilite.stories.ts} +3 -3
  82. package/src/components/Customs/SyIcon/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
  83. package/src/components/Customs/SyPagination/SyPagination.mdx +4 -2
  84. package/src/components/Customs/SyPagination/accessibilite/Accessibility.mdx +10 -0
  85. package/src/components/Customs/SyRadioGroup/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
  86. package/src/components/Customs/SyTabs/SyTabs.mdx +4 -2
  87. package/src/components/Customs/SyTabs/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +2 -2
  88. package/src/components/Customs/SyTextField/SyTextField.mdx +1 -2
  89. package/src/components/Customs/SyTextField/SyTextField.vue +13 -0
  90. package/src/components/Customs/SyTextField/accessibilite/Accessibility.mdx +15 -0
  91. package/src/components/DataList/accessibilite/Accessibility.mdx +15 -0
  92. package/src/components/DataListGroup/accessibilite/Accessibility.mdx +14 -0
  93. package/src/components/DatePicker/Accessibilite.mdx +1 -1
  94. package/src/components/DatePicker/Accessibilite.stories.ts +1 -1
  95. package/src/components/DatePicker/CalendarMode/DatePicker.stories.ts +7 -4
  96. package/src/components/DatePicker/CalendarMode/DatePicker.vue +14 -2
  97. package/src/components/DatePicker/DatePickerValidationExample/DatePickerValidation.stories.ts +297 -0
  98. package/src/components/DatePicker/composables/useDateSelection.ts +5 -0
  99. package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +273 -0
  100. package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +4 -4
  101. package/src/components/DatePicker/docExamples/DatePickerValidationExamples.vue +10 -0
  102. package/src/components/DiacriticPicker/accessibilite/Accessibility.mdx +10 -0
  103. package/src/components/DialogBox/accessibilite/Accessibility.mdx +15 -0
  104. package/src/components/DownloadBtn/DownloadBtn.vue +5 -4
  105. package/src/components/DownloadBtn/accessibilite/Accessibility.mdx +15 -0
  106. package/src/components/ErrorPage/accessibilite/Accessibility.mdx +15 -0
  107. package/src/components/ExternalLinks/accessibilite/Accessibility.mdx +15 -0
  108. package/src/components/FileList/UploadItem/UploadItem.vue +25 -20
  109. package/src/components/FileList/accessibilite/Accessibility.mdx +12 -0
  110. package/src/components/FilePreview/accessibilite/Accessibility.mdx +12 -0
  111. package/src/components/FileUpload/FileUploadContent.vue +5 -4
  112. package/src/components/FileUpload/accessibilite/Accessibility.mdx +12 -0
  113. package/src/components/FilterInline/FilterInline.vue +5 -4
  114. package/src/components/FilterInline/accessibilite/Accessibility.mdx +12 -0
  115. package/src/components/FilterSideBar/accessibilite/Accessibility.mdx +15 -0
  116. package/src/components/FooterBar/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +3 -4
  117. package/src/components/FranceConnectBtn/FranceConnectBtn.vue +6 -5
  118. package/src/components/FranceConnectBtn/accessibilite/Accessibility.mdx +15 -0
  119. package/src/components/FranceConnectBtn/tests/__snapshots__/FranceConnectBtn.spec.ts.snap +3 -0
  120. package/src/components/HeaderBar/HeaderBurgerMenu/accessibilite/Accessibility.mdx +15 -0
  121. package/src/components/HeaderBar/accessibilite/Accessibility.mdx +15 -0
  122. package/src/components/HeaderBar/{Usages.mdx → usages/Usages.mdx} +2 -2
  123. package/src/components/HeaderLoading/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +9 -5
  124. package/src/components/HeaderToolbar/accessibilite/Accessibility.mdx +15 -0
  125. package/src/components/LangBtn/LangBtn.vue +5 -4
  126. package/src/components/LangBtn/accessibilite/Accessibility.mdx +15 -0
  127. package/src/components/Logo/accessibilite/Accessibility.mdx +17 -0
  128. package/src/components/LogoBrandSection/accessibilite/Accessibility.mdx +12 -0
  129. package/src/components/LunarCalendar/accessibilite/Accessibility.mdx +10 -0
  130. package/src/components/MaintenancePage/accessibilite/Accessibility.mdx +15 -0
  131. package/src/components/NirField/accessibilite/Accessibility.mdx +15 -0
  132. package/src/components/NotFoundPage/accessibilite/Accessibility.mdx +15 -0
  133. package/src/components/NotificationBar/Notification/Notification.vue +1 -1
  134. package/src/components/NotificationBar/accessibilite/Accessibility.mdx +15 -0
  135. package/src/components/PageContainer/{AccessibilityGuide.mdx → Accessibilite/Accessibility.mdx} +7 -4
  136. package/src/components/PageContainer/Accessibilite/AccessibilityGuide.mdx +0 -0
  137. package/src/components/PaginatedTable/PaginatedTable.vue +27 -47
  138. package/src/components/PaginatedTable/Pagination.vue +93 -0
  139. package/src/components/PaginatedTable/accessibilite/Accessibility.mdx +12 -0
  140. package/src/components/PasswordField/PasswordField.vue +2 -1
  141. package/src/components/PasswordField/accessibilite/Accessibility.mdx +108 -0
  142. package/src/components/PeriodField/accessibilite/Accessibility.mdx +12 -0
  143. package/src/components/PhoneField/accessibilite/Accessibility.mdx +15 -0
  144. package/src/components/RangeField/accessibilite/Accessibility.mdx +15 -0
  145. package/src/components/RatingPicker/accessibilite/Accessibility.mdx +15 -0
  146. package/src/components/SearchListField/SearchListField.vue +6 -3
  147. package/src/components/SearchListField/accessibilite/Accessibility.mdx +15 -0
  148. package/src/components/SkipLink/{Accessibilite.mdx → accessibilite/Accessibility.mdx} +7 -4
  149. package/src/components/SocialMediaLinks/accessibilite/Accessibility.mdx +15 -0
  150. package/src/components/SubHeader/accessibilite/Accessibility.mdx +15 -0
  151. package/src/components/SyAlert/SyAlert.vue +6 -6
  152. package/src/components/SyAlert/accessibilite/Accessibility.mdx +12 -0
  153. package/src/components/SyTextArea/accessibilite/Accessibility.mdx +10 -0
  154. package/src/components/TableToolbar/TableToolbar.vue +6 -3
  155. package/src/components/TableToolbar/accessibilite/Accessibility.mdx +12 -0
  156. package/src/components/Tables/SyServerTable/SyServerTable.mdx +4 -1
  157. package/src/components/Tables/SyServerTable/accessibilite/Accessibility.mdx +10 -0
  158. package/src/components/Tables/SyTable/SyTable.mdx +4 -1
  159. package/src/components/Tables/SyTable/accessibilite/Accessibility.mdx +10 -0
  160. package/src/components/Tables/common/TableHeader.vue +3 -1
  161. package/src/components/Tables/common/organizeColumns/OrganizeColumns.vue +18 -14
  162. package/src/components/ToolbarContainer/ToolbarContainer.mdx +2 -1
  163. package/src/components/ToolbarContainer/ToolbarContainer.stories.ts +563 -420
  164. package/src/components/ToolbarContainer/accessibilite/Accessibility.mdx +69 -0
  165. package/src/components/UploadWorkflow/accessibilite/Accessibility.mdx +12 -0
  166. package/src/components/Usages/Usages.vue +3 -2
  167. package/src/components/UserMenuBtn/UserMenuBtn.vue +7 -5
  168. package/src/components/UserMenuBtn/accessibilite/Accessibility.mdx +12 -0
  169. package/src/components/index.ts +2 -0
  170. package/src/components/types.ts +10 -0
  171. package/src/composables/rules/useFieldValidation.ts +7 -0
  172. package/src/composables/useFormFieldErrorHandling.ts +141 -0
  173. package/src/modules.d.ts +6 -0
  174. package/src/components/BackBtn/Accessibilite.mdx +0 -14
  175. package/src/components/BackBtn/Accessibilite.stories.ts +0 -30
  176. package/src/components/BackToTopBtn/Accessibilite.mdx +0 -14
  177. package/src/components/BackToTopBtn/Accessibilite.stories.ts +0 -31
  178. package/src/components/ChipList/Accessibilite.mdx +0 -14
  179. package/src/components/ChipList/Accessibilite.stories.ts +0 -31
  180. package/src/components/CollapsibleList/Accessibilite.stories.ts +0 -29
  181. package/src/components/ContextualMenu/Accessibilite.mdx +0 -13
  182. package/src/components/ContextualMenu/Accessibilite.stories.ts +0 -29
  183. package/src/components/CookieBanner/Accessibilite.mdx +0 -13
  184. package/src/components/CookieBanner/Accessibilite.stories.ts +0 -30
  185. package/src/components/CopyBtn/Accessibilite.mdx +0 -13
  186. package/src/components/CopyBtn/Accessibilite.stories.ts +0 -29
  187. package/src/components/Customs/Selects/SelectBtnField/Accessibilite.mdx +0 -14
  188. package/src/components/Customs/Selects/SelectBtnField/Accessibilite.stories.ts +0 -29
  189. package/src/components/Customs/Selects/SyInputSelect/Accessibilite.mdx +0 -13
  190. package/src/components/Customs/Selects/SyInputSelect/Accessibilite.stories.ts +0 -25
  191. package/src/components/Customs/SyTextField/Accessibilite.mdx +0 -14
  192. package/src/components/Customs/SyTextField/Accessibilite.stories.ts +0 -34
  193. package/src/components/DataList/Accessibilite.mdx +0 -13
  194. package/src/components/DataList/Accessibilite.stories.ts +0 -29
  195. package/src/components/DataListGroup/Accessibilite.mdx +0 -13
  196. package/src/components/DataListGroup/Accessibilite.stories.ts +0 -29
  197. package/src/components/DialogBox/Accessibilite.mdx +0 -14
  198. package/src/components/DialogBox/Accessibilite.stories.ts +0 -29
  199. package/src/components/DownloadBtn/Accessibilite.mdx +0 -14
  200. package/src/components/DownloadBtn/Accessibilite.stories.ts +0 -29
  201. package/src/components/ErrorPage/Accessibilite.mdx +0 -13
  202. package/src/components/ErrorPage/Accessibilite.stories.ts +0 -36
  203. package/src/components/ExternalLinks/Accessibilite.mdx +0 -18
  204. package/src/components/ExternalLinks/Accessibilite.stories.ts +0 -62
  205. package/src/components/FileList/Accessibilite.mdx +0 -13
  206. package/src/components/FileList/Accessibilite.stories.ts +0 -26
  207. package/src/components/FilePreview/Accessibilite.mdx +0 -14
  208. package/src/components/FilePreview/Accessibilite.stories.ts +0 -26
  209. package/src/components/FileUpload/Accessibilite.mdx +0 -13
  210. package/src/components/FileUpload/Accessibilite.stories.ts +0 -26
  211. package/src/components/FilterInline/Accessibilite.mdx +0 -15
  212. package/src/components/FilterInline/Accessibilite.stories.ts +0 -26
  213. package/src/components/FilterSideBar/Accessibilite.mdx +0 -13
  214. package/src/components/FilterSideBar/Accessibilite.stories.ts +0 -30
  215. package/src/components/FooterBar/Accessibilite.stories.ts +0 -26
  216. package/src/components/FranceConnectBtn/Accessibilite.mdx +0 -13
  217. package/src/components/FranceConnectBtn/Accessibilite.stories.ts +0 -30
  218. package/src/components/HeaderBar/Accessibilite.mdx +0 -13
  219. package/src/components/HeaderBar/Accessibilite.stories.ts +0 -31
  220. package/src/components/HeaderBar/HeaderBurgerMenu/Accessibilite.mdx +0 -13
  221. package/src/components/HeaderBar/HeaderBurgerMenu/Accessibilite.stories.ts +0 -30
  222. package/src/components/HeaderLoading/Accessibilite.stories.ts +0 -31
  223. package/src/components/HeaderToolbar/Accessibilite.mdx +0 -13
  224. package/src/components/HeaderToolbar/Accessibilite.stories.ts +0 -36
  225. package/src/components/LangBtn/Accessibilite.mdx +0 -13
  226. package/src/components/LangBtn/Accessibilite.stories.ts +0 -32
  227. package/src/components/Logo/Accessibilite.mdx +0 -13
  228. package/src/components/Logo/Accessibilite.stories.ts +0 -30
  229. package/src/components/LogoBrandSection/Accessibilite.mdx +0 -13
  230. package/src/components/LogoBrandSection/Accessibilite.stories.ts +0 -26
  231. package/src/components/MaintenancePage/Accessibilite.mdx +0 -13
  232. package/src/components/MaintenancePage/Accessibilite.stories.ts +0 -36
  233. package/src/components/NirField/Accessibilite.mdx +0 -13
  234. package/src/components/NirField/Accessibilite.stories.ts +0 -31
  235. package/src/components/NotFoundPage/Accessibilite.mdx +0 -13
  236. package/src/components/NotFoundPage/Accessibilite.stories.ts +0 -36
  237. package/src/components/NotificationBar/Accessibilite.mdx +0 -13
  238. package/src/components/NotificationBar/Accessibilite.stories.ts +0 -30
  239. package/src/components/PageContainer/Accessibilite.mdx +0 -13
  240. package/src/components/PageContainer/Accessibilite.stories.ts +0 -30
  241. package/src/components/PaginatedTable/Accessibilite.mdx +0 -13
  242. package/src/components/PaginatedTable/Accessibilite.stories.ts +0 -26
  243. package/src/components/PasswordField/Accessibilite.mdx +0 -13
  244. package/src/components/PasswordField/Accessibilite.stories.ts +0 -121
  245. package/src/components/PeriodField/Accessibilite.mdx +0 -13
  246. package/src/components/PeriodField/Accessibilite.stories.ts +0 -27
  247. package/src/components/PhoneField/Accessibilite.mdx +0 -13
  248. package/src/components/PhoneField/Accessibilite.stories.ts +0 -32
  249. package/src/components/RangeField/Accessibilite.mdx +0 -13
  250. package/src/components/RangeField/Accessibilite.stories.ts +0 -32
  251. package/src/components/RatingPicker/Accessibilite.mdx +0 -13
  252. package/src/components/RatingPicker/Accessibilite.stories.ts +0 -30
  253. package/src/components/SearchListField/Accessibilite.mdx +0 -13
  254. package/src/components/SearchListField/Accessibilite.stories.ts +0 -30
  255. package/src/components/SkipLink/Accessibilite.stories.ts +0 -36
  256. package/src/components/SocialMediaLinks/Accessibilite.mdx +0 -13
  257. package/src/components/SocialMediaLinks/Accessibilite.stories.ts +0 -36
  258. package/src/components/SubHeader/Accessibilite.mdx +0 -13
  259. package/src/components/SubHeader/Accessibilite.stories.ts +0 -36
  260. package/src/components/SyAlert/Accessibilite.mdx +0 -13
  261. package/src/components/SyAlert/Accessibilite.stories.ts +0 -30
  262. package/src/components/TableToolbar/Accessibilite.mdx +0 -13
  263. package/src/components/TableToolbar/Accessibilite.stories.ts +0 -26
  264. package/src/components/UploadWorkflow/Accessibilite.mdx +0 -13
  265. package/src/components/UploadWorkflow/Accessibilite.stories.ts +0 -26
  266. package/src/components/UserMenuBtn/Accessibilite.mdx +0 -13
  267. package/src/components/UserMenuBtn/Accessibilite.stories.ts +0 -25
  268. /package/src/components/HeaderBar/{Usages.stories.ts → usages/Usages.stories.ts} +0 -0
  269. /package/src/components/SyBtnMenu/accessibilite/{AccessibilityGuide.mdx → Accessibility.mdx} +0 -0
@@ -0,0 +1,979 @@
1
+ import type { Meta, StoryObj } from '@storybook/vue3'
2
+ import SyAutocomplete from './SyAutocomplete.vue'
3
+ import SyForm from '../../SyForm/SyForm.vue'
4
+ import AccessibilityDocs from './accessibilite/Accessibility.mdx'
5
+ import { ref } from 'vue'
6
+ import { fn } from '@storybook/test'
7
+ import { VBtn } from 'vuetify/components'
8
+
9
+ const meta: Meta<typeof SyAutocomplete> = {
10
+ title: 'Composants/Formulaires/Selects/SyAutocomplete',
11
+ component: SyAutocomplete,
12
+ parameters: {
13
+ layout: 'fullscreen',
14
+ controls: { exclude: ['selectedValue', 'isOpen', 'closeList'] },
15
+ docs: { page: AccessibilityDocs },
16
+ },
17
+ argTypes: {
18
+ bgColor: {
19
+ control: 'text',
20
+ description: 'Couleur de fond du champ',
21
+ },
22
+ chips: {
23
+ control: 'boolean',
24
+ description: 'Affiche les options sélectionnées sous forme de chips',
25
+ },
26
+ clearable: {
27
+ control: 'boolean',
28
+ description: 'Permet de vider la sélection',
29
+ },
30
+ customRules: {
31
+ control: 'object',
32
+ description: 'Règles de validation personnalisées',
33
+ },
34
+ customSuccessRules: {
35
+ control: 'object',
36
+ description: 'Règles de succès personnalisées',
37
+ },
38
+ customWarningRules: {
39
+ control: 'object',
40
+ description: 'Règles d\'avertissement personnalisées',
41
+ },
42
+ debounce: {
43
+ control: 'number',
44
+ description: 'Délai en millisecondes avant le filtrage (défaut: 200)',
45
+ },
46
+ density: {
47
+ control: 'select',
48
+ options: ['default', 'comfortable', 'compact'],
49
+ description: 'Définit la densité du champ',
50
+ },
51
+ disableErrorHandling: {
52
+ control: 'boolean',
53
+ description: 'Désactive la gestion des erreurs',
54
+ },
55
+ displayAsterisk: {
56
+ control: 'boolean',
57
+ description: 'Affiche un astérisque pour les champs obligatoires',
58
+ },
59
+ errorMessages: {
60
+ control: 'object',
61
+ description: 'Messages d\'erreur personnalisés',
62
+ },
63
+ filter: {
64
+ control: 'boolean',
65
+ description: 'Active le filtrage des options basé sur la saisie',
66
+ },
67
+ hasError: {
68
+ control: 'boolean',
69
+ description: 'Indique si le champ a une erreur',
70
+ },
71
+ hasSuccess: {
72
+ control: 'boolean',
73
+ description: 'Indique si le champ est en succès',
74
+ },
75
+ hasWarning: {
76
+ control: 'boolean',
77
+ description: 'Indique si le champ a un avertissement',
78
+ },
79
+ hideNoData: {
80
+ control: 'boolean',
81
+ description: 'Cache le message "aucune option" quand la liste est vide',
82
+ },
83
+ isValidateOnBlur: {
84
+ control: 'boolean',
85
+ description: 'Valide le champ à la perte de focus',
86
+ },
87
+ items: { control: 'object' },
88
+ label: {
89
+ control: 'text',
90
+ description: 'Libellé du champ',
91
+ },
92
+ loading: {
93
+ control: 'boolean',
94
+ description: 'Affiche un indicateur de chargement',
95
+ },
96
+ menuId: {
97
+ control: 'text',
98
+ description: 'ID personnalisé pour le menu',
99
+ },
100
+ modelValue: { control: 'text' },
101
+ multiple: {
102
+ control: 'boolean',
103
+ description: 'Permet la sélection multiple d\'options',
104
+ },
105
+ noDataText: {
106
+ control: 'text',
107
+ description: 'Texte affiché quand aucune option n\'est disponible',
108
+ },
109
+ placeholder: {
110
+ control: 'text',
111
+ description: 'Texte d\'indice affiché quand le champ est vide',
112
+ },
113
+ plainTextKey: {
114
+ control: 'text',
115
+ description: 'Nom de la propriété pour le texte brut de filtrage',
116
+ },
117
+ readonly: {
118
+ control: 'boolean',
119
+ description: 'Rend le champ en lecture seule',
120
+ },
121
+ required: {
122
+ control: 'boolean',
123
+ description: 'Marque le champ comme obligatoire',
124
+ },
125
+ returnObject: {
126
+ control: 'boolean',
127
+ description: 'Retourne l\'objet complet sélectionné',
128
+ },
129
+ showSuccessMessages: {
130
+ control: 'boolean',
131
+ description: 'Affiche les messages de succès',
132
+ },
133
+ successMessages: {
134
+ control: 'object',
135
+ description: 'Messages de succès personnalisés',
136
+ },
137
+ textKey: {
138
+ control: 'text',
139
+ description: 'Nom de la propriété qui contient le texte à afficher',
140
+ },
141
+ valueKey: {
142
+ control: 'text',
143
+ description: 'Nom de la propriété qui contient la valeur à retourner',
144
+ },
145
+ warningMessages: {
146
+ control: 'object',
147
+ description: 'Messages d\'avertissement personnalisés',
148
+ },
149
+ },
150
+ } as Meta<typeof SyAutocomplete>
151
+
152
+ export default meta
153
+
154
+ type Story = StoryObj<typeof meta>
155
+
156
+ const sampleItems = [
157
+ { text: 'Adrien', value: 'Adrien' },
158
+ { text: 'Axel', value: 'Axel' },
159
+ { text: 'Baptiste', value: 'Baptiste' },
160
+ { text: 'Clement', value: 'Clement' },
161
+ { text: 'Corentin', value: 'Corentin' },
162
+ { text: 'Damien', value: 'Damien' },
163
+ { text: 'David', value: 'David' },
164
+ { text: 'Eloi', value: 'Eloi' },
165
+ { text: 'Louis', value: 'Louis' },
166
+ { text: 'Valentin', value: 'Valentin' },
167
+ ]
168
+
169
+ export const Default: Story = {
170
+ parameters: {
171
+
172
+ sourceCode: [
173
+ {
174
+ name: 'Template',
175
+ code: `
176
+ <template>
177
+ <SyAutocomplete
178
+ v-model="selectedValue"
179
+ :items="items"
180
+ label="Rechercher un prénom"
181
+ />
182
+ </template>
183
+ `,
184
+ },
185
+ {
186
+ name: 'Script',
187
+ code: `
188
+ <script setup lang="ts">
189
+ import { ref } from 'vue'
190
+ import { SyAutocomplete } from '@cnamts/synapse'
191
+
192
+ const selectedValue = ref('')
193
+ const items = [
194
+ { text: 'Adrien', value: 'Adrien' },
195
+ { text: 'Axel', value: 'Axel' },
196
+ { text: 'Baptiste', value: 'Baptiste' },
197
+ { text: 'Clement', value: 'Clement' },
198
+ { text: 'Corentin', value: 'Corentin' },
199
+ { text: 'Damien', value: 'Damien' },
200
+ { text: 'David', value: 'David' },
201
+ { text: 'Eloi', value: 'Eloi' },
202
+ { text: 'Louis', value: 'Louis' },
203
+ { text: 'Valentin', value: 'Valentin' },
204
+ ]
205
+ </script>
206
+ `,
207
+ },
208
+ ],
209
+ },
210
+ args: {
211
+ 'items': sampleItems,
212
+ 'label': 'Rechercher un prénom',
213
+ 'onUpdate:modelValue': fn(),
214
+ },
215
+ render: (args) => {
216
+ return {
217
+ components: { SyAutocomplete },
218
+ setup() {
219
+ const selectedValue = ref('')
220
+ return { args, selectedValue }
221
+ },
222
+ template: `
223
+ <div class="pa-4">
224
+ <SyAutocomplete
225
+ v-model="selectedValue"
226
+ v-bind="args"
227
+ />
228
+ </div>
229
+ `,
230
+ }
231
+ },
232
+ }
233
+
234
+ export const FormValidation: Story = {
235
+ parameters: {
236
+ docs: {
237
+ description: {
238
+ story: 'Le champ requis ne montre l\'erreur qu\'après interaction (blur/submit), pas au mount.',
239
+ },
240
+ },
241
+ sourceCode: [
242
+ {
243
+ name: 'Template',
244
+ code: `
245
+ <template>
246
+ <SyForm @submit="onSubmit">
247
+ <SyAutocomplete
248
+ v-model="value"
249
+ :items="items"
250
+ label="Recherche obligatoire"
251
+ required
252
+ display-asterisk
253
+ class="mb-4"
254
+ />
255
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
256
+ </SyForm>
257
+ </template>
258
+ `,
259
+ },
260
+ {
261
+ name: 'Script',
262
+ code: `
263
+ <script setup lang="ts">
264
+ import { ref } from 'vue'
265
+ import { SyAutocomplete, SyForm } from '@cnamts/synapse'
266
+ import { VBtn } from 'vuetify/components'
267
+
268
+ const value = ref('')
269
+ const items = [
270
+ { text: 'Option 1', value: '1' },
271
+ { text: 'Option 2', value: '2' },
272
+ { text: 'Option 3', value: '3' }
273
+ ]
274
+
275
+ const onSubmit = (event) => {
276
+ if (event.isValid) {
277
+ alert('Formulaire valide : ' + JSON.stringify(value.value))
278
+ } else {
279
+ alert('Formulaire invalide : veuillez choisir une option.')
280
+ }
281
+ }
282
+ </script>
283
+ `,
284
+ },
285
+ ],
286
+ },
287
+ args: {
288
+ 'items': [
289
+ { text: 'Option 1', value: '1' },
290
+ { text: 'Option 2', value: '2' },
291
+ { text: 'Option 3', value: '3' },
292
+ ],
293
+ 'label': 'Recherche obligatoire',
294
+ 'required': true,
295
+ 'displayAsterisk': true,
296
+ 'onUpdate:modelValue': fn(),
297
+ },
298
+ render: (args) => {
299
+ return {
300
+ components: { SyAutocomplete, SyForm, VBtn },
301
+ setup() {
302
+ const value = ref('')
303
+
304
+ const onSubmit = (event: { isValid: boolean }) => {
305
+ if (event.isValid) {
306
+ alert(`Formulaire valide : ${JSON.stringify(value.value)}`)
307
+ }
308
+ else {
309
+ alert('Formulaire invalide : veuillez choisir une option.')
310
+ }
311
+ }
312
+
313
+ return { args, value, onSubmit }
314
+ },
315
+ template: `
316
+ <div class="pa-4">
317
+ <SyForm @submit="onSubmit">
318
+ <SyAutocomplete
319
+ v-model="value"
320
+ v-bind="args"
321
+ class="mb-4"
322
+ />
323
+ <VBtn type="submit" color="primary">Soumettre</VBtn>
324
+ </SyForm>
325
+ </div>
326
+ `,
327
+ }
328
+ },
329
+ }
330
+
331
+ export const ExternalErrorToggle: Story = {
332
+ parameters: {
333
+ docs: {
334
+ description: {
335
+ story: 'Démontre l\'affichage d\'un message d\'erreur externe injecté via `error-messages`.',
336
+ },
337
+ },
338
+ sourceCode: [
339
+ {
340
+ name: 'Template',
341
+ code: `
342
+ <template>
343
+ <SyAutocomplete
344
+ v-model="value"
345
+ :items="items"
346
+ label="Erreur serveur"
347
+ :error-messages="errorMessages"
348
+ />
349
+ <VBtn class="mt-2" @click="triggerError">Déclencher l'erreur</VBtn>
350
+ <VBtn class="mt-2 ml-2" variant="text" @click="clearError">Effacer</VBtn>
351
+ </template>
352
+ `,
353
+ },
354
+ {
355
+ name: 'Script',
356
+ code: `
357
+ <script setup lang="ts">
358
+ import { ref } from 'vue'
359
+ import { SyAutocomplete } from '@cnamts/synapse'
360
+ import { VBtn } from 'vuetify/components'
361
+
362
+ const value = ref('')
363
+ const items = [
364
+ { text: 'Option 1', value: '1' },
365
+ { text: 'Option 2', value: '2' }
366
+ ]
367
+ const errorMessages = ref<string[]>([])
368
+
369
+ const triggerError = () => {
370
+ errorMessages.value = ['Erreur serveur : sélection invalide']
371
+ }
372
+
373
+ const clearError = () => {
374
+ errorMessages.value = []
375
+ }
376
+ </script>
377
+ `,
378
+ },
379
+ ],
380
+ },
381
+ args: {
382
+ 'items': [
383
+ { text: 'Option 1', value: '1' },
384
+ { text: 'Option 2', value: '2' },
385
+ ],
386
+ 'label': 'Erreur serveur',
387
+ 'onUpdate:modelValue': fn(),
388
+ },
389
+ render: (args) => {
390
+ return {
391
+ components: { SyAutocomplete, VBtn },
392
+ setup() {
393
+ const value = ref('')
394
+ const errorMessages = ref<string[]>([])
395
+ const triggerError = () => {
396
+ errorMessages.value = ['Erreur serveur : sélection invalide']
397
+ }
398
+ const clearError = () => {
399
+ errorMessages.value = []
400
+ }
401
+ return { args, value, errorMessages, triggerError, clearError }
402
+ },
403
+ template: `
404
+ <div class="pa-4 d-flex flex-column gap-2">
405
+ <SyAutocomplete
406
+ v-model="value"
407
+ v-bind="args"
408
+ :error-messages="errorMessages"
409
+ />
410
+ <div class="d-flex align-center gap-2">
411
+ <VBtn color="error" @click="triggerError">Déclencher l'erreur</VBtn>
412
+ <VBtn variant="text" @click="clearError">Effacer</VBtn>
413
+ </div>
414
+ </div>
415
+ `,
416
+ }
417
+ },
418
+ }
419
+
420
+ export const WarningSuccessMessages: Story = {
421
+ parameters: {
422
+ docs: {
423
+ description: {
424
+ story: 'Déclenche un warning si "Option 1" est choisi et un succès si "Option 2" est choisi.',
425
+ },
426
+ },
427
+ },
428
+ args: {
429
+ 'items': [
430
+ { text: 'Option 1', value: '1' },
431
+ { text: 'Option 2', value: '2' },
432
+ ],
433
+ 'label': 'Avec warning & succès',
434
+ 'onUpdate:modelValue': fn(),
435
+ },
436
+ render: (args) => {
437
+ return {
438
+ components: { SyAutocomplete },
439
+ setup() {
440
+ const value = ref('')
441
+ const warningMessages = ref<string[]>([])
442
+ const successMessages = ref<string[]>([])
443
+
444
+ const handleChange = (newVal: unknown) => {
445
+ value.value = newVal as string
446
+ warningMessages.value = newVal === '1' ? ['Attention: Option 1 choisie'] : []
447
+ successMessages.value = newVal === '2' ? ['Succès: Option 2 valide'] : []
448
+ }
449
+
450
+ return { args, value, warningMessages, successMessages, handleChange }
451
+ },
452
+ template: `
453
+ <div class="pa-4">
454
+ <SyAutocomplete
455
+ v-model="value"
456
+ v-bind="args"
457
+ :warning-messages="warningMessages"
458
+ :success-messages="successMessages"
459
+ @update:modelValue="handleChange"
460
+ />
461
+ </div>
462
+ `,
463
+ }
464
+ },
465
+ }
466
+
467
+ export const ReturnObjectWithCustomKeys: Story = {
468
+ parameters: {
469
+ docs: {
470
+ description: {
471
+ story: 'Retourne l\'objet complet avec clés personnalisées et required.',
472
+ },
473
+ },
474
+ sourceCode: [
475
+ {
476
+ name: 'Template',
477
+ code: `
478
+ <template>
479
+ <SyForm @submit="onSubmit">
480
+ <SyAutocomplete
481
+ v-model="value"
482
+ :items="items"
483
+ label="Objet complet"
484
+ text-key="label"
485
+ value-key="id"
486
+ return-object
487
+ required
488
+ display-asterisk
489
+ />
490
+ <VBtn type="submit" class="mt-4" color="primary">Soumettre</VBtn>
491
+ </SyForm>
492
+ </template>
493
+ `,
494
+ },
495
+ {
496
+ name: 'Script',
497
+ code: `
498
+ <script setup lang="ts">
499
+ import { ref } from 'vue'
500
+ import { SyAutocomplete, SyForm } from '@cnamts/synapse'
501
+ import { VBtn } from 'vuetify/components'
502
+
503
+ const value = ref<{ label: string; id: string } | null>(null)
504
+ const items = [
505
+ { label: 'Premier choix', id: '1' },
506
+ { label: 'Deuxième choix', id: '2' },
507
+ { label: 'Troisième choix', id: '3' }
508
+ ]
509
+
510
+ const onSubmit = (event) => {
511
+ if (event.isValid) {
512
+ alert('Formulaire valide : ' + JSON.stringify(value.value))
513
+ } else {
514
+ alert('Formulaire invalide : veuillez choisir une option.')
515
+ }
516
+ }
517
+ </script>
518
+ `,
519
+ },
520
+ ],
521
+ },
522
+ args: {
523
+ 'items': [
524
+ { label: 'Premier choix', id: '1' },
525
+ { label: 'Deuxième choix', id: '2' },
526
+ { label: 'Troisième choix', id: '3' },
527
+ ],
528
+ 'label': 'Objet complet',
529
+ 'textKey': 'label',
530
+ 'valueKey': 'id',
531
+ 'returnObject': true,
532
+ 'required': true,
533
+ 'displayAsterisk': true,
534
+ 'onUpdate:modelValue': fn(),
535
+ },
536
+ render: (args) => {
537
+ return {
538
+ components: { SyAutocomplete, SyForm, VBtn },
539
+ setup() {
540
+ const value = ref<{ label: string, id: string } | null>(null)
541
+
542
+ const onSubmit = (event: { isValid: boolean }) => {
543
+ if (event.isValid) {
544
+ alert(`Formulaire valide : ${JSON.stringify(value.value)}`)
545
+ }
546
+ else {
547
+ alert('Formulaire invalide : veuillez choisir une option.')
548
+ }
549
+ }
550
+
551
+ return { args, value, onSubmit }
552
+ },
553
+ template: `
554
+ <div class="pa-4">
555
+ <SyForm @submit="onSubmit">
556
+ <SyAutocomplete
557
+ v-model="value"
558
+ v-bind="args"
559
+ class="mb-4"
560
+ />
561
+ <VBtn type="submit" class="mt-4" color="primary">Soumettre</VBtn>
562
+ </SyForm>
563
+ </div>
564
+ `,
565
+ }
566
+ },
567
+ }
568
+
569
+ export const MultipleSelection: Story = {
570
+ parameters: {
571
+
572
+ docs: {
573
+ description: {
574
+ story: 'Exemple de sélection multiple avec SyAutocomplete. Les options sont filtrées en temps réel selon la saisie.',
575
+ },
576
+ },
577
+ sourceCode: [
578
+ {
579
+ name: 'Template',
580
+ code: `
581
+ <template>
582
+ <SyAutocomplete
583
+ v-model="selectedValues"
584
+ :items="items"
585
+ label="Sélectionner plusieurs prénoms"
586
+ multiple
587
+ clearable
588
+ />
589
+ <div class="mt-4">
590
+ Valeurs sélectionnées: {{ selectedValues }}
591
+ </div>
592
+ </template>
593
+ `,
594
+ },
595
+ {
596
+ name: 'Script',
597
+ code: `
598
+ <script setup lang="ts">
599
+ import { ref } from 'vue'
600
+ import { SyAutocomplete } from '@cnamts/synapse'
601
+
602
+ const selectedValues = ref([])
603
+ const items = [
604
+ { text: 'Adrien', value: 'Adrien' },
605
+ { text: 'Axel', value: 'Axel' },
606
+ { text: 'Baptiste', value: 'Baptiste' },
607
+ { text: 'Clement', value: 'Clement' },
608
+ { text: 'Corentin', value: 'Corentin' },
609
+ { text: 'Damien', value: 'Damien' },
610
+ { text: 'David', value: 'David' },
611
+ { text: 'Eloi', value: 'Eloi' },
612
+ { text: 'Louis', value: 'Louis' },
613
+ { text: 'Valentin', value: 'Valentin' },
614
+ ]
615
+ </script>
616
+ `,
617
+ },
618
+ ],
619
+ },
620
+ args: {
621
+ 'items': sampleItems,
622
+ 'label': 'Sélectionner plusieurs prénoms',
623
+ 'multiple': true,
624
+ 'clearable': true,
625
+ 'onUpdate:modelValue': fn(),
626
+ },
627
+ render: (args) => {
628
+ return {
629
+ components: { SyAutocomplete },
630
+ setup() {
631
+ const selectedValues = ref([])
632
+ return { args, selectedValues }
633
+ },
634
+ template: `
635
+ <div class="pa-4">
636
+ <SyAutocomplete
637
+ v-model="selectedValues"
638
+ v-bind="args"
639
+ />
640
+ <div class="mt-4">
641
+ Valeurs sélectionnées: {{ selectedValues }}
642
+ </div>
643
+ </div>
644
+ `,
645
+ }
646
+ },
647
+ }
648
+
649
+ export const ChipsDisplay: Story = {
650
+ parameters: {
651
+
652
+ docs: {
653
+ description: {
654
+ story: 'Sélection multiple avec affichage en chips. Les options sélectionnées sont affichées sous forme de chips.',
655
+ },
656
+ },
657
+ sourceCode: [
658
+ {
659
+ name: 'Template',
660
+ code: `
661
+ <template>
662
+ <SyAutocomplete
663
+ v-model="selectedValues"
664
+ :items="items"
665
+ label="Prénoms sélectionnés"
666
+ multiple
667
+ chips
668
+ clearable
669
+ />
670
+ </template>
671
+ `,
672
+ },
673
+ {
674
+ name: 'Script',
675
+ code: `
676
+ <script setup lang="ts">
677
+ import { ref } from 'vue'
678
+ import { SyAutocomplete } from '@cnamts/synapse'
679
+
680
+ const selectedValues = ref([])
681
+ const items = [
682
+ { text: 'Adrien', value: 'Adrien' },
683
+ { text: 'Axel', value: 'Axel' },
684
+ { text: 'Baptiste', value: 'Baptiste' },
685
+ { text: 'Clement', value: 'Clement' },
686
+ ]
687
+ </script>
688
+ `,
689
+ },
690
+ ],
691
+ },
692
+ args: {
693
+ 'items': sampleItems.slice(0, 4),
694
+ 'label': 'Prénoms sélectionnés',
695
+ 'multiple': true,
696
+ 'chips': true,
697
+ 'clearable': true,
698
+ 'onUpdate:modelValue': fn(),
699
+ },
700
+ render: (args) => {
701
+ return {
702
+ components: { SyAutocomplete },
703
+ setup() {
704
+ const selectedValues = ref([])
705
+ return { args, selectedValues }
706
+ },
707
+ template: `
708
+ <div class="pa-4">
709
+ <SyAutocomplete
710
+ v-model="selectedValues"
711
+ v-bind="args"
712
+ />
713
+ </div>
714
+ `,
715
+ }
716
+ },
717
+ }
718
+
719
+ export const LoadingState: Story = {
720
+ parameters: {
721
+
722
+ docs: {
723
+ description: {
724
+ story: 'État de chargement du composant SyAutocomplete.',
725
+ },
726
+ },
727
+ sourceCode: [
728
+ {
729
+ name: 'Template',
730
+ code: `
731
+ <template>
732
+ <SyAutocomplete
733
+ v-model="selectedValue"
734
+ :items="items"
735
+ label="Recherche avec chargement"
736
+ :loading="isLoading"
737
+ />
738
+ </template>
739
+ `,
740
+ },
741
+ {
742
+ name: 'Script',
743
+ code: `
744
+ <script setup lang="ts">
745
+ import { ref } from 'vue'
746
+ import { SyAutocomplete } from '@cnamts/synapse'
747
+
748
+ const selectedValue = ref('')
749
+ const isLoading = ref(true)
750
+ const items = [
751
+ { text: 'Option 1', value: '1' },
752
+ { text: 'Option 2', value: '2' },
753
+ ]
754
+ </script>
755
+ `,
756
+ },
757
+ ],
758
+ },
759
+ args: {
760
+ 'items': [
761
+ { text: 'Option 1', value: '1' },
762
+ { text: 'Option 2', value: '2' },
763
+ ],
764
+ 'label': 'Recherche avec chargement',
765
+ 'loading': true,
766
+ 'onUpdate:modelValue': fn(),
767
+ },
768
+ render: (args) => {
769
+ return {
770
+ components: { SyAutocomplete },
771
+ setup() {
772
+ const selectedValue = ref('')
773
+ return { args, selectedValue }
774
+ },
775
+ template: `
776
+ <div class="pa-4">
777
+ <SyAutocomplete
778
+ v-model="selectedValue"
779
+ v-bind="args"
780
+ />
781
+ </div>
782
+ `,
783
+ }
784
+ },
785
+ }
786
+
787
+ export const RequiredField: Story = {
788
+ parameters: {
789
+
790
+ sourceCode: [
791
+ {
792
+ name: 'Template',
793
+ code: `
794
+ <template>
795
+ <SyAutocomplete
796
+ v-model="selectedValue"
797
+ :items="items"
798
+ label="Champ obligatoire"
799
+ required
800
+ display-asterisk
801
+ />
802
+ </template>
803
+ `,
804
+ },
805
+ {
806
+ name: 'Script',
807
+ code: `
808
+ <script setup lang="ts">
809
+ import { ref } from 'vue'
810
+ import { SyAutocomplete } from '@cnamts/synapse'
811
+
812
+ const selectedValue = ref()
813
+ const items = [
814
+ { text: 'Option 1', value: '1' },
815
+ { text: 'Option 2', value: '2' },
816
+ ]
817
+ </script>
818
+ `,
819
+ },
820
+ ],
821
+ },
822
+ args: {
823
+ 'items': [
824
+ { text: 'Option 1', value: '1' },
825
+ { text: 'Option 2', value: '2' },
826
+ ],
827
+ 'label': 'Champ obligatoire',
828
+ 'required': true,
829
+ 'displayAsterisk': true,
830
+ 'onUpdate:modelValue': fn(),
831
+ },
832
+ render: (args) => {
833
+ return {
834
+ components: { SyAutocomplete },
835
+ setup() {
836
+ const selectedValue = ref()
837
+ return { args, selectedValue }
838
+ },
839
+ template: `
840
+ <div class="pa-4">
841
+ <SyAutocomplete
842
+ v-model="selectedValue"
843
+ v-bind="args"
844
+ />
845
+ </div>
846
+ `,
847
+ }
848
+ },
849
+ }
850
+
851
+ export const ReadonlyField: Story = {
852
+ parameters: {
853
+
854
+ sourceCode: [
855
+ {
856
+ name: 'Template',
857
+ code: `
858
+ <template>
859
+ <SyAutocomplete
860
+ v-model="selectedValue"
861
+ :items="items"
862
+ label="Champ en lecture seule"
863
+ readonly
864
+ />
865
+ </template>
866
+ `,
867
+ },
868
+ {
869
+ name: 'Script',
870
+ code: `
871
+ <script setup lang="ts">
872
+ import { ref } from 'vue'
873
+ import { SyAutocomplete } from '@cnamts/synapse'
874
+
875
+ const selectedValue = ref('Axel')
876
+ const items = [
877
+ { text: 'Adrien', value: 'Adrien' },
878
+ { text: 'Axel', value: 'Axel' },
879
+ { text: 'Baptiste', value: 'Baptiste' },
880
+ ]
881
+ </script>
882
+ `,
883
+ },
884
+ ],
885
+ },
886
+ args: {
887
+ 'items': [
888
+ { text: 'Adrien', value: 'Adrien' },
889
+ { text: 'Axel', value: 'Axel' },
890
+ { text: 'Baptiste', value: 'Baptiste' },
891
+ ],
892
+ 'label': 'Champ en lecture seule',
893
+ 'readonly': true,
894
+ 'onUpdate:modelValue': fn(),
895
+ },
896
+ render: (args) => {
897
+ return {
898
+ components: { SyAutocomplete },
899
+ setup() {
900
+ const selectedValue = ref('Axel')
901
+ return { args, selectedValue }
902
+ },
903
+ template: `
904
+ <div class="pa-4">
905
+ <SyAutocomplete
906
+ v-model="selectedValue"
907
+ v-bind="args"
908
+ />
909
+ </div>
910
+ `,
911
+ }
912
+ },
913
+ }
914
+
915
+ export const WithCustomKeys: Story = {
916
+ parameters: {
917
+
918
+ sourceCode: [
919
+ {
920
+ name: 'Template',
921
+ code: `
922
+ <template>
923
+ <SyAutocomplete
924
+ v-model="selectedValue"
925
+ :items="items"
926
+ label="Recherche avec clés personnalisées"
927
+ text-key="label"
928
+ value-key="id"
929
+ />
930
+ </template>
931
+ `,
932
+ },
933
+ {
934
+ name: 'Script',
935
+ code: `
936
+ <script setup lang="ts">
937
+ import { ref } from 'vue'
938
+ import { SyAutocomplete } from '@cnamts/synapse'
939
+
940
+ const selectedValue = ref('')
941
+ const items = [
942
+ { label: 'Premier choix', id: '1' },
943
+ { label: 'Deuxième choix', id: '2' },
944
+ { label: 'Troisième choix', id: '3' },
945
+ ]
946
+ </script>
947
+ `,
948
+ },
949
+ ],
950
+ },
951
+ args: {
952
+ 'items': [
953
+ { label: 'Premier choix', id: '1' },
954
+ { label: 'Deuxième choix', id: '2' },
955
+ { label: 'Troisième choix', id: '3' },
956
+ ],
957
+ 'label': 'Recherche avec clés personnalisées',
958
+ 'textKey': 'label',
959
+ 'valueKey': 'id',
960
+ 'onUpdate:modelValue': fn(),
961
+ },
962
+ render: (args) => {
963
+ return {
964
+ components: { SyAutocomplete },
965
+ setup() {
966
+ const selectedValue = ref('')
967
+ return { args, selectedValue }
968
+ },
969
+ template: `
970
+ <div class="pa-4">
971
+ <SyAutocomplete
972
+ v-model="selectedValue"
973
+ v-bind="args"
974
+ />
975
+ </div>
976
+ `,
977
+ }
978
+ },
979
+ }