@cnamts/synapse 1.0.11 → 1.0.13

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 (200) hide show
  1. package/dist/{DateFilter-QEfKOz0P.js → DateFilter-_EFzsvvM.js} +1 -1
  2. package/dist/{NumberFilter-C0h7gVzp.js → NumberFilter-CUxEbKJh.js} +1 -1
  3. package/dist/{PeriodFilter-8dVrKjju.js → PeriodFilter-D5ueqtKy.js} +1 -1
  4. package/dist/{SelectFilter-BI3QGbqb.js → SelectFilter-BciBNydy.js} +1 -1
  5. package/dist/{TextFilter-UOp1hcPp.js → TextFilter-DMN_WAQB.js} +1 -1
  6. package/dist/components/Amelipro/AmeliproAccordion/AmeliproAccordion.d.ts +7 -3
  7. package/dist/components/Amelipro/AmeliproAccordion/AmeliproAccordionTemplate/AmeliproAccordionTemplate.d.ts +1 -1
  8. package/dist/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.d.ts +2 -0
  9. package/dist/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.d.ts +7 -3
  10. package/dist/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResultTemplate/AmeliproAccordionResultTemplate.d.ts +1 -1
  11. package/dist/components/Amelipro/AmeliproAutoCompleteField/AmeliproAutoCompleteField.d.ts +50 -68
  12. package/dist/components/Amelipro/AmeliproCard/AmeliproCard.d.ts +1 -1
  13. package/dist/components/Amelipro/AmeliproIcon/AmeliproIcon.d.ts +1 -1
  14. package/dist/components/Amelipro/AmeliproIconBtn/AmeliproIconBtn.d.ts +5 -5
  15. package/dist/components/Amelipro/AmeliproMultipleFoldingCard/AmeliproMultipleFoldingCard.d.ts +1 -1
  16. package/dist/components/Amelipro/AmeliproNumberedCard/AmeliproNumberedCard.d.ts +1 -1
  17. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressCityRow/AmeliproPostalAddressCityRow.d.ts +24 -32
  18. package/dist/components/Amelipro/AmeliproPostalAddressField/AmeliproPostalAddressField.d.ts +36 -48
  19. package/dist/components/Amelipro/AmeliproSelect/AmeliproSelect.d.ts +50 -68
  20. package/dist/components/Amelipro/AmeliproTable/AmeliproTable.d.ts +4 -0
  21. package/dist/components/Amelipro/AmeliproTable/types.d.ts +11 -0
  22. package/dist/components/Amelipro/AmeliproTabs/AmeliproTabs.d.ts +50 -68
  23. package/dist/components/Amelipro/AmeliproTextArea/AmeliproTextArea.d.ts +0 -4
  24. package/dist/components/Amelipro/AmeliproTextField/AmeliproTextField.d.ts +12 -16
  25. package/dist/components/Captcha/Captcha.d.ts +68 -0
  26. package/dist/components/Captcha/CaptchaAlert.d.ts +13 -0
  27. package/dist/components/Captcha/CaptchaBase.d.ts +55 -0
  28. package/dist/components/Captcha/CaptchaBtn.d.ts +12 -0
  29. package/dist/components/Captcha/CaptchaForm.d.ts +16 -0
  30. package/dist/components/Captcha/CaptchaImg.d.ts +12 -0
  31. package/dist/components/Captcha/CaptchaInformation.d.ts +20 -0
  32. package/dist/components/Captcha/captchaApi.d.ts +41 -0
  33. package/dist/components/Captcha/icons/volumeUp.d.ts +2 -0
  34. package/dist/components/Captcha/locales.d.ts +35 -0
  35. package/dist/components/Captcha/types.d.ts +2 -0
  36. package/dist/components/ChipList/ChipList.d.ts +2 -2
  37. package/dist/components/CookiesSelection/CookiesInformation/CookiesInformation.d.ts +14 -14
  38. package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +5 -5
  39. package/dist/components/Customs/SyForm/SyForm.d.ts +6 -3
  40. package/dist/components/Customs/SyTextField/SyTextField.d.ts +12 -16
  41. package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +96 -68
  42. package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +63 -38
  43. package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +23 -27
  44. package/dist/components/DatePicker/composables/useDatePickerViewMode.d.ts +2 -1
  45. package/dist/components/DatePicker/tests/setup.d.ts +816 -520
  46. package/dist/components/HeaderToolbar/HeaderToolbar.d.ts +10 -10
  47. package/dist/components/NirField/NirField.d.ts +31 -34
  48. package/dist/components/NirField/locales.d.ts +1 -3
  49. package/dist/components/PasswordField/PasswordField.d.ts +2 -0
  50. package/dist/components/PeriodField/PeriodField.d.ts +192 -128
  51. package/dist/components/PhoneField/PhoneField.d.ts +13 -17
  52. package/dist/components/SearchListField/SearchListField.d.ts +5 -5
  53. package/dist/components/SyTextArea/SyTextArea.d.ts +0 -4
  54. package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +5 -8
  55. package/dist/components/Tables/SyTable/SyTable.d.ts +5 -8
  56. package/dist/components/Tables/common/SyTablePagination.d.ts +5 -5
  57. package/dist/components/Tables/common/types.d.ts +4 -0
  58. package/dist/components/Tables/common/usePagination.d.ts +3 -4
  59. package/dist/components/Tables/common/useTableCheckbox.d.ts +10 -6
  60. package/dist/components/index.d.ts +1 -0
  61. package/dist/composables/validation/useFormValidation.d.ts +10 -0
  62. package/dist/composables/validation/useValidatable.d.ts +10 -2
  63. package/dist/design-system-v3.js +126 -125
  64. package/dist/design-system-v3.umd.cjs +265 -265
  65. package/dist/main-DISHlqcd.js +34217 -0
  66. package/dist/style.css +1 -1
  67. package/package.json +1 -1
  68. package/src/assets/overrides/_forms.scss +2 -0
  69. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordion.stories.ts +7 -4
  70. package/src/components/Amelipro/AmeliproAccordion/AmeliproAccordion.vue +2 -0
  71. package/src/components/Amelipro/AmeliproAccordionFrieze/AmeliproAccordionFrieze.vue +1 -0
  72. package/src/components/Amelipro/AmeliproAccordionFrieze/__tests__/__snapshots__/AmeliproAccordionFrieze.spec.ts.snap +574 -112
  73. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.stories.ts +5 -2
  74. package/src/components/Amelipro/AmeliproAccordionList/AmeliproAccordionList.vue +2 -1
  75. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.stories.ts +6 -3
  76. package/src/components/Amelipro/AmeliproAccordionResult/AmeliproAccordionResult.vue +2 -0
  77. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.stories.ts +5 -2
  78. package/src/components/Amelipro/AmeliproAccordionResultList/AmeliproAccordionResultList.vue +2 -1
  79. package/src/components/Amelipro/AmeliproCheckbox/__tests__/AmeliproCheckbox.spec.ts +175 -0
  80. package/src/components/Amelipro/AmeliproCheckbox/__tests__/__snapshots__/AmeliproCheckbox.spec.ts.snap +88 -0
  81. package/src/components/Amelipro/AmeliproCheckboxGroup/__tests__/AmeliproCheckboxGroup.spec.ts +423 -0
  82. package/src/components/Amelipro/AmeliproCheckboxGroup/{tests → __tests__}/__snapshots__/AmeliproCheckboxGroup.spec.ts.snap +112 -78
  83. package/src/components/Amelipro/AmeliproChips/__tests__/AmeliproChips.spec.ts +92 -0
  84. package/src/components/Amelipro/AmeliproChips/__tests__/__snapshots__/AmeliproChips.spec.ts.snap +81 -0
  85. package/src/components/Amelipro/AmeliproDialog/__tests__/AmeliproDialog.spec.ts +257 -0
  86. package/src/components/Amelipro/AmeliproDialog/__tests__/__snapshots__/AmeliproDialog.spec.ts.snap +61 -0
  87. package/src/components/Amelipro/AmeliproDisclosure/__tests__/AmeliproDisclosure.spec.ts +79 -0
  88. package/src/components/Amelipro/AmeliproDisclosure/__tests__/__snapshots__/AmeliproDisclosure.spec.ts.snap +89 -0
  89. package/src/components/Amelipro/AmeliproFooter/AmeliproFooter.vue +6 -7
  90. package/src/components/Amelipro/AmeliproFooter/__tests__/AmeliproFooter.spec.ts +787 -0
  91. package/src/components/Amelipro/AmeliproFooter/__tests__/__snapshots__/AmeliproFooter.spec.ts.snap +318 -0
  92. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/AmeliproHeaderBrandSection.spec.ts +167 -0
  93. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/__tests__/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +100 -0
  94. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/__tests__/AmeliproHeaderBar.spec.ts +312 -0
  95. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/__tests__/__snapshots__/AmeliproHeaderBar.spec.ts.snap +98 -0
  96. package/src/components/Amelipro/AmeliproHeader/__tests__/AmeliproHeader.spec.ts +361 -0
  97. package/src/components/Amelipro/AmeliproHeader/__tests__/__snapshots__/AmeliproHeader.spec.ts.snap +22 -0
  98. package/src/components/Amelipro/AmeliproMenu/__tests__/AmeliproMenu.spec.ts +168 -0
  99. package/src/components/Amelipro/AmeliproMenu/__tests__/__snapshots__/AmeliproMenu.spec.ts.snap +295 -0
  100. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenuBtn/__tests__/AmeliproDropdownMenuBtn.spec.ts +128 -0
  101. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenuBtn/__tests__/__snapshots__/AmeliproDropdownMenuBtn.spec.ts.snap +67 -0
  102. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/__tests__/AmeliproDropdownMenu.spec.ts +266 -0
  103. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/__tests__/__snapshots__/AmeliproDropdownMenu.spec.ts.snap +134 -0
  104. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingMenuBtn/__tests__/AmeliproMessagingMenuBtn.spec.ts +72 -0
  105. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingMenuBtn/__tests__/__snapshots__/AmeliproMessagingMenuBtn.spec.ts.snap +71 -0
  106. package/src/components/Amelipro/AmeliproPageLayout/tests/__snapshots__/AmeliproPageLayout.spec.ts.snap +12 -0
  107. package/src/components/Amelipro/AmeliproTable/AmeliproTable.stories.ts +81 -9
  108. package/src/components/Amelipro/AmeliproTable/AmeliproTable.vue +139 -61
  109. package/src/components/Amelipro/AmeliproTable/__tests__/AmeliproTable.spec.ts +10 -0
  110. package/src/components/Amelipro/AmeliproTable/__tests__/__snapshots__/AmeliproTable.spec.ts.snap +361 -187
  111. package/src/components/Amelipro/AmeliproTable/types.d.ts +11 -0
  112. package/src/components/Captcha/Captcha.mdx +72 -0
  113. package/src/components/Captcha/Captcha.stories.ts +276 -0
  114. package/src/components/Captcha/Captcha.vue +325 -0
  115. package/src/components/Captcha/CaptchaAlert.vue +60 -0
  116. package/src/components/Captcha/CaptchaBase.vue +219 -0
  117. package/src/components/Captcha/CaptchaBtn.vue +35 -0
  118. package/src/components/Captcha/CaptchaForm.vue +58 -0
  119. package/src/components/Captcha/CaptchaImg.vue +41 -0
  120. package/src/components/Captcha/CaptchaInformation.vue +64 -0
  121. package/src/components/Captcha/captchaApi.ts +111 -0
  122. package/src/components/Captcha/icons/volumeUp.vue +11 -0
  123. package/src/components/Captcha/locales.ts +35 -0
  124. package/src/components/Captcha/readme.md +5 -0
  125. package/src/components/Captcha/tests/Captcha.spec.ts +298 -0
  126. package/src/components/Captcha/tests/__snapshots__/Captcha.spec.ts.snap +716 -0
  127. package/src/components/Captcha/types.ts +2 -0
  128. package/src/components/Customs/Selects/SySelect/SySelect.vue +2 -2
  129. package/src/components/Customs/SyCheckbox/SyCheckbox.vue +4 -0
  130. package/src/components/Customs/SyForm/SyForm.stories.ts +133 -23
  131. package/src/components/Customs/SyForm/SyForm.vue +17 -1
  132. package/src/components/Customs/SyTextField/SyTextField.vue +29 -7
  133. package/src/components/DatePicker/CalendarMode/DatePicker.vue +32 -9
  134. package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +154 -18
  135. package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +2 -2
  136. package/src/components/DatePicker/DateTextInput/DateTextInput.vue +35 -4
  137. package/src/components/DatePicker/composables/tests/useDatePickerViewMode.spec.ts +107 -72
  138. package/src/components/DatePicker/composables/tests/useMonthButtonCustomization.spec.ts +6 -6
  139. package/src/components/DatePicker/composables/useDatePickerViewMode.ts +57 -7
  140. package/src/components/DatePicker/composables/useMonthButtonCustomization.ts +14 -14
  141. package/src/components/DatePicker/tests/navigation.regression.spec.ts +74 -0
  142. package/src/components/DatePicker/tests/navigation.simple.spec.ts +137 -0
  143. package/src/components/NirField/NirField.stories.ts +85 -2
  144. package/src/components/NirField/NirField.vue +55 -18
  145. package/src/components/NirField/locales.ts +1 -3
  146. package/src/components/PasswordField/PasswordField.vue +39 -7
  147. package/src/components/PhoneField/PhoneField.vue +43 -10
  148. package/src/components/RangeField/tests/RangeField.spec.ts +0 -3
  149. package/src/components/Tables/SyServerTable/SyServerTable.mdx +15 -0
  150. package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +309 -0
  151. package/src/components/Tables/SyServerTable/SyServerTable.vue +18 -3
  152. package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
  153. package/src/components/Tables/SyTable/SyTable.mdx +15 -0
  154. package/src/components/Tables/SyTable/SyTable.stories.ts +228 -0
  155. package/src/components/Tables/SyTable/SyTable.vue +18 -3
  156. package/src/components/Tables/SyTable/tests/SyTable.spec.ts +63 -0
  157. package/src/components/Tables/common/SyTablePagination.vue +10 -8
  158. package/src/components/Tables/common/types.ts +4 -0
  159. package/src/components/Tables/common/usePagination.ts +11 -20
  160. package/src/components/Tables/common/useTableCheckbox.ts +23 -11
  161. package/src/components/index.ts +1 -0
  162. package/src/composables/validation/AvecVosComposants.mdx.old +1 -1
  163. package/src/composables/validation/FormValidation.stories.ts.old +5 -5
  164. package/src/composables/validation/useFormValidation.ts +46 -8
  165. package/src/composables/validation/useValidatable.ts +19 -8
  166. package/src/stories/Accessibilite/Introduction.mdx +1 -1
  167. package/src/stories/Demarrer/EnrichirLeDesignSystem.mdx +43 -0
  168. package/src/stories/Demarrer/EnrichirLeDesignSystem.stories.ts +239 -0
  169. package/src/stories/Demarrer/SignalerUneAnomalie.mdx +39 -0
  170. package/src/stories/Demarrer/SignalerUneAnomalie.stories.ts +261 -0
  171. package/dist/main-DyEOPqqn.js +0 -33329
  172. package/src/components/Amelipro/AmeliproCheckbox/tests/AmeliproCheckbox.spec.ts +0 -19
  173. package/src/components/Amelipro/AmeliproCheckbox/tests/__snapshots__/AmeliproCheckbox.spec.ts.snap +0 -40
  174. package/src/components/Amelipro/AmeliproCheckboxGroup/tests/AmeliproCheckboxGroup.spec.ts +0 -46
  175. package/src/components/Amelipro/AmeliproChips/tests/AmeliproChips.spec.ts +0 -16
  176. package/src/components/Amelipro/AmeliproChips/tests/__snapshots__/AmeliproChips.spec.ts.snap +0 -97
  177. package/src/components/Amelipro/AmeliproDialog/tests/AmeliproDialog.spec.ts +0 -24
  178. package/src/components/Amelipro/AmeliproDialog/tests/__snapshots__/AmeliproDialog.spec.ts.snap +0 -134
  179. package/src/components/Amelipro/AmeliproDisclosure/tests/AmeliproDisclosure.spec.ts +0 -19
  180. package/src/components/Amelipro/AmeliproDisclosure/tests/__snapshots__/AmeliproDisclosure.spec.ts.snap +0 -104
  181. package/src/components/Amelipro/AmeliproFooter/tests/AmeliproFooter.spec.ts +0 -15
  182. package/src/components/Amelipro/AmeliproFooter/tests/__snapshots__/AmeliproFooter.spec.ts.snap +0 -432
  183. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/tests/AmeliproHeaderBrandSection.spec.ts +0 -15
  184. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/AmeliproHeaderBrandSection/tests/__snapshots__/AmeliproHeaderBrandSection.spec.ts.snap +0 -131
  185. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/tests/AmeliproHeaderBar.spec.ts +0 -15
  186. package/src/components/Amelipro/AmeliproHeader/AmeliproHeaderBar/tests/__snapshots__/AmeliproHeaderBar.spec.ts.snap +0 -172
  187. package/src/components/Amelipro/AmeliproHeader/tests/AmeliproHeader.spec.ts +0 -159
  188. package/src/components/Amelipro/AmeliproHeader/tests/__snapshots__/AmeliproHeader.spec.ts.snap +0 -841
  189. package/src/components/Amelipro/AmeliproMenu/tests/AmeliproMenu.spec.ts +0 -85
  190. package/src/components/Amelipro/AmeliproMenu/tests/__snapshots__/AmeliproMenu.spec.ts.snap +0 -537
  191. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenuBtn/tests/AmeliproDropdownMenuBtn.spec.ts +0 -16
  192. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/AmeliproDropdownMenuBtn/tests/__snapshots__/AmeliproDropdownMenuBtn.spec.ts.snap +0 -56
  193. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/tests/AmeliproDropdownMenu.spec.ts +0 -28
  194. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproDropdownMenu/tests/__snapshots__/AmeliproDropdownMenu.spec.ts.snap +0 -300
  195. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingMenuBtn/tests/AmeliproMessagingMenuBtn.spec.ts +0 -16
  196. package/src/components/Amelipro/AmeliproMessagingLayout/AmeliproMessagingMenuBtn/tests/__snapshots__/AmeliproMessagingMenuBtn.spec.ts.snap +0 -89
  197. package/src/components/BackBtn/tests/__snapshots__/BackBtn.spec.ts.snap +0 -45
  198. package/src/components/RangeField/tests/__snapshots__/RangeField.spec.ts.snap +0 -1270
  199. package/src/stories/Demarrer/CreerUneIssue.mdx +0 -67
  200. package/src/stories/Demarrer/components.stories.ts +0 -25
@@ -47,6 +47,16 @@ const meta = {
47
47
  width: string;
48
48
  maxWidth: string;
49
49
  descriptionId?: string;
50
+ sort?: {
51
+ ascendant?: {
52
+ label: string,
53
+ disabled: boolean,
54
+ },
55
+ descendant?: {
56
+ label: string,
57
+ disabled: boolean,
58
+ },
59
+ };
50
60
  }>`,
51
61
  },
52
62
  },
@@ -560,7 +570,42 @@ export const PaginationEtTri: Story = {
560
570
  name: 'Pagination et tri',
561
571
  args: {
562
572
  dataList,
563
- headers,
573
+ headers: [
574
+ {
575
+ align: 'left',
576
+ maxWidth: '25%',
577
+ minWidth: '20%',
578
+ name: 'name',
579
+ title: 'Nom',
580
+ width: '25%',
581
+ sort: {
582
+ ascendant: {
583
+ label: 'tri de A vers Z',
584
+ disabled: false,
585
+ },
586
+ descendant: {
587
+ label: 'tri de Z vers A',
588
+ disabled: false,
589
+ },
590
+ },
591
+ },
592
+ {
593
+ align: 'left',
594
+ maxWidth: '25%',
595
+ minWidth: '20%',
596
+ name: 'firstname',
597
+ title: 'Prénom',
598
+ width: '25%',
599
+ },
600
+ {
601
+ align: 'left',
602
+ maxWidth: '25%',
603
+ minWidth: '20%',
604
+ name: 'email',
605
+ title: 'E-mail',
606
+ width: '25%',
607
+ },
608
+ ],
564
609
  title: 'Tableau avec pagination et tri',
565
610
  uniqueId: 'table-pagination-tri',
566
611
  itemsToDisplayDesktop: 2,
@@ -597,6 +642,8 @@ export const PaginationEtTri: Story = {
597
642
  pagination-select-label="Résultats par page"
598
643
  pagination-select-placeholder="Sélectionner"
599
644
  @change:sort-select="onSortChange"
645
+ @asc-sort="onSortAsc"
646
+ @desc-sort="onSortDesc"
600
647
  />
601
648
  </template>
602
649
  `,
@@ -608,7 +655,7 @@ import { ref, computed } from 'vue'
608
655
  import { AmeliproTable } from '@cnamts/synapse'
609
656
 
610
657
  const headers = [
611
- { align: 'left', maxWidth: '25%', minWidth: '20%', name: 'name', title: 'Nom', width: '25%' },
658
+ { align: 'left', maxWidth: '25%', minWidth: '20%', name: 'name', title: 'Nom', width: '25%', sort: { ascendant: { label: 'Tri de A vers Z', disabled: false }, descedant: {label: 'Tri de Z vers A', disabled: false } } },
612
659
  { align: 'left', maxWidth: '25%', minWidth: '20%', name: 'firstname', title: 'Prénom', width: '25%' },
613
660
  { align: 'left', maxWidth: '25%', minWidth: '20%', name: 'email', title: 'E-mail', width: '25%' },
614
661
  ]
@@ -636,8 +683,19 @@ const sortedDataList = computed(() => {
636
683
  function onSortChange(val: string) {
637
684
  sortValue.value = val
638
685
  }
639
- </script>
640
- `,
686
+
687
+ function onSortAsc(event: Event, header: string) {
688
+ if (header === 'name') {
689
+ sortValue.value = 'name-asc'
690
+ }
691
+ }
692
+
693
+ function onSortDesc(event: Event, header: string) {
694
+ if (header === 'name') {
695
+ sortValue.value = 'name-desc'
696
+ }
697
+ }
698
+ </script>`,
641
699
  },
642
700
  ],
643
701
  },
@@ -658,7 +716,19 @@ function onSortChange(val: string) {
658
716
  function onSortChange(val: string) {
659
717
  sortValue.value = val
660
718
  }
661
- return { args, sortedDataList, onSortChange }
719
+
720
+ function onSortAsc(header: string) {
721
+ if (header === 'name') {
722
+ sortValue.value = 'name-asc'
723
+ }
724
+ }
725
+
726
+ function onSortDesc(header: string) {
727
+ if (header === 'name') {
728
+ sortValue.value = 'name-desc'
729
+ }
730
+ }
731
+ return { args, sortedDataList, onSortChange, onSortAsc, onSortDesc }
662
732
  },
663
733
  template: `
664
734
  <p class="mb-2">Tableau avec pagination personnalisée et options de tri. Le tri est appliqué via l'événement <code>change:sort-select</code>.</p>
@@ -666,6 +736,8 @@ function onSortChange(val: string) {
666
736
  v-bind="args"
667
737
  :data-list="sortedDataList"
668
738
  @change:sort-select="onSortChange"
739
+ @asc-sort="onSortAsc"
740
+ @desc-sort="onSortDesc"
669
741
  />
670
742
  `,
671
743
  }),
@@ -678,9 +750,9 @@ export const LargeurPersonnalisee: Story = {
678
750
  headers,
679
751
  title: 'Tableau largeur personnalisée',
680
752
  uniqueId: 'table-largeur',
681
- tableMinWidth: '600px',
753
+ tableMinWidth: '1200px',
682
754
  tableMaxWidth: '900px',
683
- tableWidth: '80%',
755
+ tableWidth: '100%',
684
756
  },
685
757
  parameters: {
686
758
  sourceCode: [
@@ -692,9 +764,9 @@ export const LargeurPersonnalisee: Story = {
692
764
  :headers="headers"
693
765
  title="Tableau largeur personnalisée"
694
766
  unique-id="table-largeur"
695
- table-min-width="600px"
767
+ table-min-width="1200px"
696
768
  table-max-width="900px"
697
- table-width="80%"
769
+ table-width="100%"
698
770
  />
699
771
  </template>
700
772
  `,
@@ -2,6 +2,7 @@
2
2
  import type { AmeliproTableCell, AmeliproTableHeader } from './types'
3
3
  import type { IDataListItem, IndexedObject } from '../types'
4
4
  import { type PropType, computed, onMounted, onUpdated, ref, watch } from 'vue'
5
+ import AmeliproIconBtn from '../AmeliproIconBtn/AmeliproIconBtn.vue'
5
6
  import AmeliproPagination from '../AmeliproPagination/AmeliproPagination.vue'
6
7
  import AmeliproSelect from '../AmeliproSelect/AmeliproSelect.vue'
7
8
  import type { SelectItem } from '../AmeliproSelect/types'
@@ -133,6 +134,16 @@
133
134
 
134
135
  const currentDataList = computed<IDataListItem[]>(() => currentPageItems(props.dataList))
135
136
 
137
+ const hasHeaderSorting = computed<boolean>(() => {
138
+ const hasSorting = ref(false)
139
+ props.headers.forEach((header: AmeliproTableHeader) => {
140
+ if (header.sort) {
141
+ hasSorting.value = true
142
+ }
143
+ })
144
+ return hasSorting.value
145
+ })
146
+
136
147
  const tableWidthStyles = computed<IndexedObject>(() => {
137
148
  const tableStyle: IndexedObject = {
138
149
  maxWidth: props.tableMaxWidth,
@@ -146,7 +157,7 @@
146
157
  return tableStyle
147
158
  })
148
159
 
149
- const emit = defineEmits(['click', 'change:sort-select', 'change:pagination-select'])
160
+ const emit = defineEmits(['click', 'change:sort-select', 'change:pagination-select', 'asc-sort', 'desc-sort'])
150
161
  const emitClickEvent = (newCurrentPage: number): void => {
151
162
  emit('click')
152
163
  if (newCurrentPage !== null && newCurrentPage !== undefined) {
@@ -158,6 +169,16 @@
158
169
  emit('change:sort-select', sortSelectModel.value)
159
170
  }
160
171
 
172
+ const emitHeaderSortEvent = (order: string, header: string): void => {
173
+ if (order.toLowerCase() === 'ascendant') {
174
+ emit('asc-sort', header)
175
+ }
176
+
177
+ if (order.toLowerCase() === 'descendant') {
178
+ emit('desc-sort', header)
179
+ }
180
+ }
181
+
161
182
  const emitPaginationSelectChange = (): void => {
162
183
  emit('change:pagination-select')
163
184
  updatePagination(props.dataList, paginationSelectModel.value)
@@ -223,76 +244,113 @@
223
244
  </div>
224
245
  </div>
225
246
  <div
226
- v-if="mdAndUp"
247
+ v-if="mdAndUp || hasHeaderSorting"
227
248
  :id="`${uniqueId}-desktop`"
228
- class="amelipro-table__wrapper--desktop"
229
249
  style="overflow-x: auto;"
230
- :style="tableWidthStyles"
231
250
  >
232
- <table
233
- :id="`${uniqueId}-table`"
234
- :aria-label="title"
235
- class="amelipro-table__table--desktop"
236
- :class="{
237
- 'vertical-border': verticalBorder
238
- }"
251
+ <div
252
+ class="amelipro-table__wrapper--desktop"
253
+ :style="tableWidthStyles"
239
254
  >
240
- <thead>
241
- <tr :id="`${uniqueId}-table-header`">
242
- <th
243
- v-for="(header, index) in headers"
244
- :id="`${uniqueId}-table-header-cell-${index}`"
245
- :key="index"
246
- class="bg-ap-grey-lighten-4 font-weight-semibold"
247
- :class="header.headerClasses"
248
- scope="col"
249
- :style="`min-width: ${header.minWidth};
250
- width: ${header.width};
251
- max-width: ${header.maxWidth};
252
- text-align: ${header.align};`"
253
- >
254
- <p
255
- :aria-describedby="header.descriptionId"
256
- class="mb-0"
255
+ <table
256
+ :id="`${uniqueId}-table`"
257
+ :aria-label="title"
258
+ class="amelipro-table__table--desktop"
259
+ :class="{
260
+ 'vertical-border': verticalBorder
261
+ }"
262
+ >
263
+ <thead>
264
+ <tr :id="`${uniqueId}-table-header`">
265
+ <th
266
+ v-for="(header, index) in headers"
267
+ :id="`${uniqueId}-table-header-cell-${index}`"
268
+ :key="index"
269
+ class="bg-ap-grey-lighten-4 font-weight-semibold"
270
+ :class="header.headerClasses"
271
+ scope="col"
272
+ :style="`min-width: ${header.minWidth};
273
+ width: ${header.width};
274
+ max-width: ${header.maxWidth};
275
+ text-align: ${header.align};`"
257
276
  >
258
- {{ header.title }}
259
- </p>
260
- </th>
261
- </tr>
262
- </thead>
263
- <tbody>
264
- <tr
265
- v-for="(row, rowIndex) in currentDataList"
266
- :id="`${uniqueId}-table-row-${rowIndex}`"
267
- :key="rowIndex"
268
- >
269
- <td
270
- v-for="(cell, cellIndex) in datas(row)"
271
- :id="`${uniqueId}-table-row-${rowIndex}-cell-${cellIndex}`"
272
- :key="cellIndex"
273
- :class="cell.value !== undefined ? cell.columnClasses : undefined"
274
- :style="cell !== undefined ? `text-align: ${cell.columnAlign};` : undefined"
277
+ <p
278
+ :aria-describedby="header.descriptionId"
279
+ class="mb-0"
280
+ :class="{ 'd-flex' : header.sort }"
281
+ >
282
+ {{ header.title }}
283
+
284
+ <AmeliproIconBtn
285
+ v-if="header.sort?.ascendant"
286
+ class="ml-2 sort-btn"
287
+ :btn-label="header.sort?.ascendant.label"
288
+ :btn-title="header.sort?.ascendant.label"
289
+ :disabled="header.sort.ascendant.disabled"
290
+ icon="triangleUp"
291
+ icon-bg-color="transparent"
292
+ :icon-color="header.sort.ascendant.disabled ? 'ap-grey-lighten-2' :'ap-grey-darken-1'"
293
+ icon-hover-bg-color="transparent"
294
+ :icon-hover-color="header.sort.ascendant.disabled ? 'ap-grey-lighten-2' :'ap-grey-darken-1'"
295
+ :unique-id="`${uniqueId}-table-header-cell-${index}-asc-sort-btn`"
296
+ size="9px"
297
+ @click="emitHeaderSortEvent('ascendant', header.name)"
298
+ />
299
+
300
+ <AmeliproIconBtn
301
+ v-if="header.sort?.descendant"
302
+ class="sort-btn"
303
+ :class="{ 'ml-2': !header.sort.ascendant }"
304
+ :btn-label="header.sort.descendant.label"
305
+ :btn-title="header.sort.descendant.label"
306
+ :disabled="header.sort.descendant.disabled"
307
+ icon="triangleDown"
308
+ icon-bg-color="transparent"
309
+ :icon-color="header.sort.descendant.disabled ? 'ap-grey-lighten-2' :'ap-grey-darken-1'"
310
+ icon-hover-bg-color="transparent"
311
+ :icon-hover-color="header.sort.descendant.disabled ? 'ap-grey-lighten-2' :'ap-grey-darken-1'"
312
+ :unique-id="`${uniqueId}-table-header-cell-${index}-desc-sort-btn`"
313
+ size="9px"
314
+ @click="emitHeaderSortEvent('descendant', header.name)"
315
+ />
316
+ </p>
317
+ </th>
318
+ </tr>
319
+ </thead>
320
+ <tbody>
321
+ <tr
322
+ v-for="(row, rowIndex) in currentDataList"
323
+ :id="`${uniqueId}-table-row-${rowIndex}`"
324
+ :key="rowIndex"
275
325
  >
276
- <p
277
- v-if="cell.value !== undefined"
278
- class="mb-0"
326
+ <td
327
+ v-for="(cell, cellIndex) in datas(row)"
328
+ :id="`${uniqueId}-table-row-${rowIndex}-cell-${cellIndex}`"
329
+ :key="cellIndex"
330
+ :class="cell.value !== undefined ? cell.columnClasses : undefined"
331
+ :style="cell !== undefined ? `text-align: ${cell.columnAlign};` : undefined"
279
332
  >
280
- {{ cell.value }}
281
- </p>
282
-
283
- <slot
284
- v-else
285
- :name="`item-${headers[cellIndex].name}`"
286
- v-bind="row"
287
- />
288
- </td>
289
- </tr>
290
- </tbody>
291
- </table>
333
+ <p
334
+ v-if="cell.value !== undefined"
335
+ class="mb-0"
336
+ >
337
+ {{ cell.value }}
338
+ </p>
339
+
340
+ <slot
341
+ v-else
342
+ :name="`item-${headers[cellIndex].name}`"
343
+ v-bind="row"
344
+ />
345
+ </td>
346
+ </tr>
347
+ </tbody>
348
+ </table>
349
+ </div>
292
350
  </div>
293
351
 
294
352
  <div
295
- v-if="!mdAndUp"
353
+ v-if="!mdAndUp && !hasHeaderSorting"
296
354
  :id="`${uniqueId}-mobile`"
297
355
  class="amelipro-table__wrapper--mobile"
298
356
  >
@@ -396,6 +454,16 @@ td {
396
454
  }
397
455
  }
398
456
 
457
+ .amelipro-table__wrapper--desktop {
458
+ & th:first-child {
459
+ border-top-left-radius: 8px;
460
+ }
461
+
462
+ & th:last-child {
463
+ border-top-right-radius: 8px;
464
+ }
465
+ }
466
+
399
467
  .vertical-border {
400
468
  td,
401
469
  th {
@@ -424,4 +492,14 @@ tr:last-child td {
424
492
  border-radius: apTokens.$btn-radius;
425
493
  padding: 0.5rem 0.75rem;
426
494
  }
495
+
496
+ .sort-btn {
497
+ margin-top: -4px;
498
+ width: 24px !important;
499
+ height: 24px !important;
500
+
501
+ & :deep(.amelipro-custom-icon) {
502
+ vertical-align: unset !important;
503
+ }
504
+ }
427
505
  </style>
@@ -14,6 +14,16 @@ describe('AmeliproTable', () => {
14
14
  name: 'name',
15
15
  title: 'Nom',
16
16
  width: '25%',
17
+ sort: {
18
+ ascendant: {
19
+ label: 'tri asc',
20
+ disabled: false,
21
+ },
22
+ descendant: {
23
+ label: 'tri desc',
24
+ disabled: true,
25
+ },
26
+ },
17
27
  },
18
28
  {
19
29
  align: 'left',