@cnamts/synapse 0.0.12-alpha → 0.0.13-alpha
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.
- package/dist/design-system-v3.js +4913 -4021
- package/dist/design-system-v3.umd.cjs +1 -1
- package/dist/src/components/Amelipro/types/types.d.ts +30 -57
- package/dist/src/components/Customs/SyTextField/SyTextField.d.ts +2 -0
- package/dist/src/components/DatePicker/DatePicker.d.ts +36 -44
- package/dist/src/components/DatePicker/DateTextInput.d.ts +33 -36
- package/dist/src/components/FilterInline/AccessibiliteItems.d.ts +30 -0
- package/dist/src/components/FilterInline/constants/ExpertiseLevelEnum.d.ts +4 -0
- package/dist/src/components/FilterSideBar/AccessibiliteItems.d.ts +29 -0
- package/dist/src/components/FilterSideBar/constants/ExpertiseLevelEnum.d.ts +4 -0
- package/dist/src/components/NirField/NirField.d.ts +14 -2
- package/dist/src/components/NotificationBar/NotificationBar.d.ts +5 -5
- package/dist/src/components/PasswordField/PasswordField.d.ts +2 -0
- package/dist/src/components/PeriodField/PeriodField.d.ts +159 -157
- package/dist/src/components/PhoneField/PhoneField.d.ts +22 -1
- package/dist/src/components/UploadWorkflow/AccessibiliteItems.d.ts +29 -0
- package/dist/src/components/UploadWorkflow/constants/ExpertiseLevelEnum.d.ts +4 -0
- package/dist/src/components/Usages/Usages.d.ts +10 -0
- package/dist/src/components/index.d.ts +3 -0
- package/dist/src/composables/date/tests/useDatePickerAccessibility.spec.d.ts +1 -0
- package/dist/src/composables/date/useDateFormat.d.ts +26 -0
- package/dist/src/composables/date/useDateInitialization.d.ts +18 -0
- package/dist/src/composables/date/useDatePickerAccessibility.d.ts +8 -0
- package/dist/src/composables/useFilterable/useFilterable.d.ts +1 -1
- package/dist/src/composables/validation/useValidation.d.ts +1 -0
- package/dist/src/main.d.ts +1 -0
- package/dist/src/utils/formatDate/index.d.ts +3 -0
- package/dist/src/utils/formatDate/tests/formatDate.spec.d.ts +1 -0
- package/dist/src/utils/functions/validation/isDateAfter/index.d.ts +2 -0
- package/dist/src/utils/functions/validation/isDateAfter/tests/isDateAfter.spec.d.ts +1 -0
- package/dist/src/utils/functions/validation/isDateBefore/index.d.ts +2 -0
- package/dist/src/utils/functions/validation/isDateBefore/tests/isDateBefore.spec.d.ts +1 -0
- package/dist/src/utils/functions/validation/isDateInRange/index.d.ts +3 -0
- package/dist/src/utils/functions/validation/isDateInRange/tests/isDateInRange.spec.d.ts +1 -0
- package/dist/src/utils/functions/validation/isDateValid/index.d.ts +9 -0
- package/dist/src/utils/functions/validation/isDateValid/tests/isDateValid.spec.d.ts +1 -0
- package/dist/src/utils/functions/validation/isEmailValid/tests/isEmailValid.spec.d.ts +1 -0
- package/dist/src/utils/functions/validation/isWeekend/index.d.ts +3 -0
- package/dist/src/utils/functions/validation/isWeekend/tests/isWeekend.spec.d.ts +1 -0
- package/dist/src/utils/parseDate/index.d.ts +3 -0
- package/dist/src/utils/parseDate/tests/parseDate.spec.d.ts +1 -0
- package/dist/src/utils/rules/doMatchPattern/index.d.ts +3 -0
- package/dist/src/utils/rules/doMatchPattern/tests/matchPattern.spec.d.ts +1 -0
- package/dist/src/utils/rules/index.d.ts +11 -0
- package/dist/src/utils/rules/isDateValid/index.d.ts +4 -0
- package/dist/src/utils/rules/isDateValid/tests/isDateValid.spec.d.ts +1 -0
- package/dist/src/utils/rules/isExactLength/index.d.ts +3 -0
- package/dist/src/utils/rules/isExactLength/locales.d.ts +2 -0
- package/dist/src/utils/rules/isExactLength/tests/exactLength.spec.d.ts +1 -0
- package/dist/src/utils/rules/isMaxLength/index.d.ts +3 -0
- package/dist/src/utils/rules/isMaxLength/locales.d.ts +2 -0
- package/dist/src/utils/rules/isMaxLength/tests/isMaxLength.spec.d.ts +1 -0
- package/dist/src/utils/rules/isMinLength/index.d.ts +3 -0
- package/dist/src/utils/rules/isMinLength/locales.d.ts +2 -0
- package/dist/src/utils/rules/isMinLength/tests/isMinLength.spec.d.ts +1 -0
- package/dist/src/utils/rules/isNotAfterDate/index.d.ts +3 -0
- package/dist/src/utils/rules/isNotAfterDate/tests/isNotAfterDate.spec.d.ts +1 -0
- package/dist/src/utils/rules/isNotAfterToday/index.d.ts +4 -0
- package/dist/src/utils/rules/isNotAfterToday/locales.d.ts +2 -0
- package/dist/src/utils/rules/isNotAfterToday/tests/isNotAfterToday.spec.d.ts +1 -0
- package/dist/src/utils/rules/isNotBeforeDate/index.d.ts +3 -0
- package/dist/src/utils/rules/isNotBeforeDate/locales.d.ts +2 -0
- package/dist/src/utils/rules/isNotBeforeDate/tests/IsNotBeforeDate.spec.d.ts +1 -0
- package/dist/src/utils/rules/isNotBeforeToday/index.d.ts +4 -0
- package/dist/src/utils/rules/isNotBeforeToday/locales.d.ts +2 -0
- package/dist/src/utils/rules/isNotBeforeToday/tests/notBeforeToday.spec.d.ts +1 -0
- package/dist/src/utils/rules/isRequired/index.d.ts +4 -0
- package/dist/src/utils/rules/isRequired/locales.d.ts +2 -0
- package/dist/src/utils/rules/isRequired/tests/isRequred.spec.d.ts +1 -0
- package/dist/src/utils/rules/isValidEmail/index.d.ts +4 -0
- package/dist/src/utils/rules/isValidEmail/locales.d.ts +2 -0
- package/dist/src/utils/rules/isValidEmail/tests/isValidEmail.spec.d.ts +1 -0
- package/dist/style.css +1 -1
- package/package.json +3 -1
- package/src/assets/_radius.scss +12 -6
- package/src/assets/settings.scss +8 -0
- package/src/components/Amelipro/types/types.ts +40 -0
- package/src/components/ChipList/ChipList.stories.ts +26 -27
- package/src/components/ChipList/ChipList.vue +5 -1
- package/src/components/ChipList/config.ts +1 -0
- package/src/components/CookiesSelection/CookiesInformation/CookiesInformation.vue +2 -2
- package/src/components/Customs/SyBtnSelect/SyBtnSelect.mdx +1 -1
- package/src/components/Customs/SyInputSelect/SyInputSelect.mdx +1 -1
- package/src/components/Customs/SySelect/SySelect.mdx +1 -1
- package/src/components/Customs/SySelect/SySelect.vue +19 -4
- package/src/components/Customs/SyTextField/SyTextField.mdx +2 -2
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +239 -0
- package/src/components/Customs/SyTextField/SyTextField.vue +3 -0
- package/src/components/DatePicker/DatePicker.stories.ts +177 -5
- package/src/components/DatePicker/DatePicker.vue +148 -347
- package/src/components/DatePicker/DateTextInput.vue +91 -251
- package/src/components/DatePicker/tests/DatePicker.spec.ts +118 -48
- package/src/components/DatePicker/tests/DateTextInput.spec.ts +202 -6
- package/src/components/FileList/Accessibilite.stories.ts +1 -1
- package/src/components/FileList/AccessibiliteItems.ts +22 -0
- package/src/components/FileUpload/FileUpload.stories.ts +9 -7
- package/src/components/FilterInline/Accessibilite.mdx +14 -0
- package/src/components/FilterInline/Accessibilite.stories.ts +216 -0
- package/src/components/FilterInline/AccessibiliteItems.ts +132 -0
- package/src/components/FilterInline/constants/ExpertiseLevelEnum.ts +4 -0
- package/src/components/FilterSideBar/Accessibilite.mdx +14 -0
- package/src/components/FilterSideBar/Accessibilite.stories.ts +216 -0
- package/src/components/FilterSideBar/AccessibiliteItems.ts +153 -0
- package/src/components/FilterSideBar/constants/ExpertiseLevelEnum.ts +4 -0
- package/src/components/NirField/NirField.stories.ts +165 -0
- package/src/components/NirField/NirField.vue +6 -2
- package/src/components/NirField/tests/config.spec.ts +65 -0
- package/src/components/NotificationBar/NotificationBar.mdx +2 -2
- package/src/components/NotificationBar/NotificationBar.stories.ts +59 -11
- package/src/components/NotificationBar/NotificationBar.vue +42 -114
- package/src/components/NotificationBar/tests/NotificationBar.spec.ts +28 -33
- package/src/components/NotificationBar/tests/__snapshots__/NotificationBar.spec.ts.snap +1 -1
- package/src/components/PaginatedTable/PaginatedTable.vue +6 -10
- package/src/components/PaginatedTable/tests/__snapshots__/PaginatedTable.spec.ts.snap +4 -4
- package/src/components/PasswordField/PasswordField.stories.ts +191 -4
- package/src/components/PasswordField/PasswordField.vue +3 -0
- package/src/components/PeriodField/PeriodField.stories.ts +214 -118
- package/src/components/PeriodField/PeriodField.vue +195 -148
- package/src/components/PeriodField/tests/PeriodField.spec.ts +146 -0
- package/src/components/PhoneField/PhoneField.stories.ts +101 -0
- package/src/components/PhoneField/PhoneField.vue +73 -17
- package/src/components/PhoneField/tests/PhoneField.spec.ts +40 -0
- package/src/components/RatingPicker/RatingPicker.stories.ts +7 -7
- package/src/components/SearchListField/SearchListField.stories.ts +1 -1
- package/src/components/UploadWorkflow/Accessibilite.mdx +14 -0
- package/src/components/UploadWorkflow/Accessibilite.stories.ts +216 -0
- package/src/components/UploadWorkflow/AccessibiliteItems.ts +192 -0
- package/src/components/UploadWorkflow/UploadWorkflow.vue +2 -2
- package/src/components/UploadWorkflow/constants/ExpertiseLevelEnum.ts +4 -0
- package/src/components/Usages/tests/Usages.spec.ts +183 -0
- package/src/components/index.ts +3 -0
- package/src/composables/date/tests/useDateFormat.spec.ts +67 -0
- package/src/composables/date/tests/useDateInitialization.spec.ts +89 -0
- package/src/composables/date/tests/useDatePickerAccessibility.spec.ts +102 -0
- package/src/composables/date/useDateFormat.ts +94 -0
- package/src/composables/date/useDateInitialization.ts +92 -0
- package/src/composables/date/useDatePickerAccessibility.ts +78 -0
- package/src/composables/rules/tests/useFieldValidation.spec.ts +385 -4
- package/src/composables/useFilterable/useFilterable.ts +5 -4
- package/src/composables/validation/useValidation.ts +15 -0
- package/src/main.ts +1 -0
- package/src/stories/Accessibilite/Aculturation/AuditDesignSystem.mdx +28 -0
- package/src/stories/Accessibilite/Aculturation/SensibilisationAccessibilite.mdx +2 -2
- package/src/stories/Accessibilite/Audit/RGAA.mdx +6 -6
- package/src/stories/Accessibilite/Introduction.mdx +2 -1
- package/src/stories/Accessibilite/KitDePreAudit/Echantillonnage.mdx +1 -1
- package/src/stories/Accessibilite/KitDePreAudit/Introduction.mdx +1 -1
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Introduction.mdx +8 -11
- package/src/stories/Accessibilite/KitDePreAudit/Outils/LecteursDEcran.mdx +77 -0
- package/src/stories/Accessibilite/KitDePreAudit/Outils/Tanaguru.mdx +9 -3
- package/src/stories/Accessibilite/KitDePreAudit/Preaudit.mdx +2 -2
- package/src/stories/Demarrer/Introduction.stories.ts +3 -3
- package/src/stories/Demarrer/Releases.mdx +8 -0
- package/src/stories/Demarrer/Releases.stories.ts +66 -0
- package/src/stories/DesignTokens/Conteneurs.stories.ts +3 -3
- package/src/stories/GuideDuDev/LesBreackingChanges.mdx +36 -0
- package/src/stories/GuideDuDev/UtiliserLesRules.mdx +2 -2
- package/src/utils/formatDate/index.ts +6 -0
- package/src/utils/formatDate/tests/formatDate.spec.ts +18 -0
- package/src/utils/functions/validation/isDateAfter/index.ts +9 -0
- package/src/utils/functions/validation/isDateAfter/tests/isDateAfter.spec.ts +18 -0
- package/src/utils/functions/validation/isDateBefore/index.ts +9 -0
- package/src/utils/functions/validation/isDateBefore/tests/isDateBefore.spec.ts +23 -0
- package/src/utils/functions/validation/isDateInRange/index.ts +22 -0
- package/src/utils/functions/validation/isDateInRange/tests/isDateInRange.spec.ts +28 -0
- package/src/utils/functions/validation/isDateValid/index.ts +67 -0
- package/src/utils/functions/validation/isDateValid/tests/isDateValid.spec.ts +46 -0
- package/src/utils/functions/validation/isEmailValid/index.ts +9 -0
- package/src/utils/functions/validation/isWeekend/index.ts +10 -0
- package/src/utils/functions/validation/isWeekend/tests/isWeekend.spec.ts +16 -0
- package/src/utils/parseDate/index.ts +29 -0
- package/src/utils/parseDate/tests/parseDate.spec.ts +52 -0
- package/src/utils/rules/Rules.mdx +16 -0
- package/src/utils/rules/doMatchPattern/DoMachPattern.mdx +66 -0
- package/src/utils/rules/doMatchPattern/DoMatchPattern.stories.ts +106 -0
- package/src/utils/rules/doMatchPattern/index.ts +28 -0
- package/src/utils/rules/doMatchPattern/locales.ts +5 -0
- package/src/utils/rules/doMatchPattern/tests/matchPattern.spec.ts +38 -0
- package/src/utils/rules/index.ts +11 -0
- package/src/utils/rules/isDateValid/IsDateValid.mdx +87 -0
- package/src/utils/rules/isDateValid/IsDateValid.stories.ts +113 -0
- package/src/utils/rules/isDateValid/index.ts +32 -0
- package/src/utils/rules/isDateValid/locales.ts +10 -0
- package/src/utils/rules/isDateValid/tests/isDateValid.spec.ts +27 -0
- package/src/utils/rules/isExactLength/IsExactLenght.mdx +68 -0
- package/src/utils/rules/isExactLength/IsExactLength.stories.ts +151 -0
- package/src/utils/rules/{exactLength → isExactLength}/index.ts +2 -4
- package/src/utils/rules/isExactLength/tests/exactLength.spec.ts +48 -0
- package/src/utils/rules/isMaxLength/IsMaxLength.mdx +68 -0
- package/src/utils/rules/isMaxLength/IsMaxLength.stories.ts +152 -0
- package/src/utils/rules/isMaxLength/index.ts +30 -0
- package/src/utils/rules/isMaxLength/locales.ts +6 -0
- package/src/utils/rules/isMaxLength/tests/isMaxLength.spec.ts +42 -0
- package/src/utils/rules/isMinLength/IsMinLength.mdx +68 -0
- package/src/utils/rules/isMinLength/IsMinLength.stories.ts +152 -0
- package/src/utils/rules/isMinLength/index.ts +30 -0
- package/src/utils/rules/isMinLength/locales.ts +6 -0
- package/src/utils/rules/isMinLength/tests/isMinLength.spec.ts +42 -0
- package/src/utils/rules/isNotAfterDate/IsNotAfterDate.mdx +68 -0
- package/src/utils/rules/isNotAfterDate/IsNotAfterDate.stories.ts +109 -0
- package/src/utils/rules/isNotAfterDate/index.ts +25 -0
- package/src/utils/rules/isNotAfterDate/locales.ts +6 -0
- package/src/utils/rules/isNotAfterDate/tests/isNotAfterDate.spec.ts +25 -0
- package/src/utils/rules/isNotAfterToday/IsNotAfterToday.mdx +83 -0
- package/src/utils/rules/isNotAfterToday/IsNotAfterToday.stories.ts +110 -0
- package/src/utils/rules/isNotAfterToday/index.ts +28 -0
- package/src/utils/rules/isNotAfterToday/locales.ts +5 -0
- package/src/utils/rules/isNotAfterToday/tests/isNotAfterToday.spec.ts +30 -0
- package/src/utils/rules/isNotBeforeDate/IsNotBeforeDate.mdx +68 -0
- package/src/utils/rules/isNotBeforeDate/IsNotBeforeDate.stories.ts +114 -0
- package/src/utils/rules/isNotBeforeDate/index.ts +25 -0
- package/src/utils/rules/isNotBeforeDate/locales.ts +6 -0
- package/src/utils/rules/isNotBeforeDate/tests/IsNotBeforeDate.spec.ts +25 -0
- package/src/utils/rules/isNotBeforeToday/IsNotBeforeToday.mdx +83 -0
- package/src/utils/rules/isNotBeforeToday/IsNotBeforeToday.stories.ts +110 -0
- package/src/utils/rules/isNotBeforeToday/index.ts +28 -0
- package/src/utils/rules/isNotBeforeToday/locales.ts +5 -0
- package/src/utils/rules/isNotBeforeToday/tests/notBeforeToday.spec.ts +36 -0
- package/src/utils/rules/isRequired/IsRequired.mdx +81 -0
- package/src/utils/rules/isRequired/IsRequired.stories.ts +101 -0
- package/src/utils/rules/{required → isRequired}/index.ts +3 -3
- package/src/utils/rules/{required/tests/index.spec.ts → isRequired/tests/isRequred.spec.ts} +9 -9
- package/src/utils/rules/isValidEmail/IsValidEmail.mdx +81 -0
- package/src/utils/rules/isValidEmail/IsValidEmail.stories.ts +101 -0
- package/src/utils/rules/{email → isValidEmail}/index.ts +3 -5
- package/src/utils/rules/{email/tests/email.spec.ts → isValidEmail/tests/isValidEmail.spec.ts} +5 -5
- package/dist/src/components/Amelipro/types/languages.d.ts +0 -6
- package/dist/src/utils/rules/email/index.d.ts +0 -4
- package/dist/src/utils/rules/exactLength/index.d.ts +0 -4
- package/dist/src/utils/rules/required/index.d.ts +0 -4
- package/dist/src/utils/rules/required/ruleMessageHelper.d.ts +0 -3
- package/src/components/Amelipro/types/languages.d.ts +0 -6
- package/src/components/Amelipro/types/types.d.ts +0 -65
- package/src/components/Customs/SyTextField/tests/__snapshots__/SyTextField.spec.ts.snap +0 -58
- package/src/utils/functions/isEmailValid/index.ts +0 -8
- package/src/utils/rules/required/ruleMessageHelper.ts +0 -14
- package/src/utils/rules/required/tests/rulesMessageHelper.spec.ts +0 -22
- /package/dist/src/{utils/functions/isEmailValid/tests/isEmailValid.spec.d.ts → components/NirField/tests/config.spec.d.ts} +0 -0
- /package/dist/src/{utils/rules/email/tests/email.spec.d.ts → components/Usages/tests/Usages.spec.d.ts} +0 -0
- /package/dist/src/{utils/rules/required/tests/index.spec.d.ts → composables/date/tests/useDateFormat.spec.d.ts} +0 -0
- /package/dist/src/{utils/rules/required/tests/rulesMessageHelper.spec.d.ts → composables/date/tests/useDateInitialization.spec.d.ts} +0 -0
- /package/dist/src/utils/functions/{isEmailValid → validation/isEmailValid}/index.d.ts +0 -0
- /package/dist/src/utils/rules/{exactLength → doMatchPattern}/locales.d.ts +0 -0
- /package/dist/src/utils/rules/{email → isDateValid}/locales.d.ts +0 -0
- /package/dist/src/utils/rules/{required → isNotAfterDate}/locales.d.ts +0 -0
- /package/src/components/NirField/{tests → examples}//342/200/257dataset/342/200/257.md" +0 -0
- /package/src/utils/functions/{isEmailValid → validation/isEmailValid}/tests/isEmailValid.spec.ts +0 -0
- /package/src/utils/rules/{exactLength → isExactLength}/locales.ts +0 -0
- /package/src/utils/rules/{required → isRequired}/locales.ts +0 -0
- /package/src/utils/rules/{email → isValidEmail}/locales.ts +0 -0
|
@@ -3,11 +3,14 @@
|
|
|
3
3
|
import SyTextField from '@/components/Customs/SyTextField/SyTextField.vue'
|
|
4
4
|
import DateTextInput from './DateTextInput.vue'
|
|
5
5
|
import { VDatePicker } from 'vuetify/components'
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
6
|
+
import { useValidation } from '@/composables/validation/useValidation'
|
|
7
|
+
import { useDateFormat } from '@/composables/date/useDateFormat'
|
|
8
|
+
import { useDateInitialization, type DateValue, type DateInput } from '@/composables/date/useDateInitialization'
|
|
9
|
+
import { useDatePickerAccessibility } from '@/composables/date/useDatePickerAccessibility'
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
const { parseDate, formatDate } = useDateFormat()
|
|
12
|
+
const { initializeSelectedDates } = useDateInitialization()
|
|
13
|
+
const { updateAccessibility } = useDatePickerAccessibility()
|
|
11
14
|
|
|
12
15
|
const props = withDefaults(defineProps<{
|
|
13
16
|
modelValue?: DateInput
|
|
@@ -21,14 +24,18 @@
|
|
|
21
24
|
displayIcon?: boolean
|
|
22
25
|
displayAppendIcon?: boolean
|
|
23
26
|
displayPrependIcon?: boolean
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- mock Axios headers
|
|
28
|
+
customRules?: { type: string, options: any }[]
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- mock Axios headers
|
|
30
|
+
customWarningRules?: { type: string, options: any }[]
|
|
26
31
|
isDisabled?: boolean
|
|
27
32
|
noIcon?: boolean
|
|
28
33
|
noCalendar?: boolean
|
|
29
34
|
isOutlined?: boolean
|
|
30
35
|
isReadOnly?: boolean
|
|
31
36
|
width?: string
|
|
37
|
+
disableErrorHandling?: boolean
|
|
38
|
+
showSuccessMessages?: boolean
|
|
32
39
|
}>(), {
|
|
33
40
|
modelValue: undefined,
|
|
34
41
|
placeholder: 'Sélectionner une date',
|
|
@@ -49,6 +56,8 @@
|
|
|
49
56
|
isOutlined: true,
|
|
50
57
|
isReadOnly: false,
|
|
51
58
|
width: '100%',
|
|
59
|
+
disableErrorHandling: false,
|
|
60
|
+
showSuccessMessages: true,
|
|
52
61
|
})
|
|
53
62
|
|
|
54
63
|
const emit = defineEmits<{
|
|
@@ -58,120 +67,23 @@
|
|
|
58
67
|
(e: 'blur'): void
|
|
59
68
|
}>()
|
|
60
69
|
|
|
61
|
-
// Fonction pour parser les dates selon le format spécifié
|
|
62
|
-
const parseDate = (dateString: string, format: string = props.format): Date | null => {
|
|
63
|
-
if (!dateString) return null
|
|
64
|
-
|
|
65
|
-
// Créer un mapping des positions des éléments de date selon le format
|
|
66
|
-
const separator = format.includes('/') ? '/' : format.includes('-') ? '-' : '.'
|
|
67
|
-
const parts = format.split(separator)
|
|
68
|
-
const dateParts = dateString.split(separator)
|
|
69
|
-
|
|
70
|
-
if (parts.length !== dateParts.length) return null
|
|
71
|
-
|
|
72
|
-
let day = 0, month = 0, year = 0
|
|
73
|
-
|
|
74
|
-
// Extraire les valeurs selon leur position dans le format
|
|
75
|
-
parts.forEach((part, index) => {
|
|
76
|
-
const value = parseInt(dateParts[index], 10)
|
|
77
|
-
if (isNaN(value)) return
|
|
78
|
-
|
|
79
|
-
if (part.includes('DD') || part.includes('D')) day = value
|
|
80
|
-
else if (part.includes('MM') || part.includes('M')) month = value - 1 // Les mois en JS sont 0-indexés
|
|
81
|
-
else if (part.includes('YYYY')) year = value
|
|
82
|
-
else if (part.includes('YY')) {
|
|
83
|
-
// Gestion intelligente des années à 2 chiffres
|
|
84
|
-
// Si l'année est < 50, on considère qu'elle est dans le 21ème siècle
|
|
85
|
-
// Sinon, elle est dans le 20ème siècle
|
|
86
|
-
year = value < 50 ? 2000 + value : 1900 + value
|
|
87
|
-
}
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
// Vérifier que nous avons toutes les parties nécessaires et qu'elles sont dans des plages valides
|
|
91
|
-
if (day < 1 || day > 31 || month < 0 || month > 11 || year < 1000 || year > 9999) return null
|
|
92
|
-
|
|
93
|
-
// Créer la date à midi (12:00) pour éviter les problèmes de décalage de fuseau horaire
|
|
94
|
-
// Cela garantit que la date reste la même lors de la conversion en UTC
|
|
95
|
-
const date = new Date(year, month, day, 12, 0, 0)
|
|
96
|
-
|
|
97
|
-
// Vérifier que la date est valide (par exemple, 31 février n'existe pas)
|
|
98
|
-
if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) return null
|
|
99
|
-
|
|
100
|
-
return date
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function initializeSelectedDates(
|
|
104
|
-
modelValue: DateInput | null,
|
|
105
|
-
): Date | Date[] | null {
|
|
106
|
-
if (!modelValue) return null
|
|
107
|
-
|
|
108
|
-
// Déterminer le format à utiliser pour l'analyse
|
|
109
|
-
const parseFormat = props.dateFormatReturn || props.format
|
|
110
|
-
|
|
111
|
-
if (Array.isArray(modelValue)) {
|
|
112
|
-
if (modelValue.length >= 2) {
|
|
113
|
-
// Essayer d'abord avec le format de retour, puis avec le format d'affichage
|
|
114
|
-
let dates = [parseDate(modelValue[0], parseFormat), parseDate(modelValue[1], parseFormat)]
|
|
115
|
-
|
|
116
|
-
// Si l'une des dates est invalide avec le format de retour, essayer avec le format d'affichage
|
|
117
|
-
if (dates.some(date => date === null) && props.dateFormatReturn) {
|
|
118
|
-
dates = [parseDate(modelValue[0], props.format), parseDate(modelValue[1], props.format)]
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Vérifie si l'une des dates est toujours invalide
|
|
122
|
-
if (dates.some(date => date === null)) {
|
|
123
|
-
return []
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Vérifie si la première date est après la seconde
|
|
127
|
-
if (dates[0] && dates[1] && dates[0] > dates[1]) {
|
|
128
|
-
return []
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Filtrer les dates nulles et convertir en tableau de Date
|
|
132
|
-
return dates.filter((date): date is Date => date !== null)
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
if (modelValue.length === 1) {
|
|
136
|
-
// Essayer d'abord avec le format de retour, puis avec le format d'affichage
|
|
137
|
-
let date = parseDate(modelValue[0], parseFormat)
|
|
138
|
-
|
|
139
|
-
// Si la date est invalide avec le format de retour, essayer avec le format d'affichage
|
|
140
|
-
if (date === null && props.dateFormatReturn) {
|
|
141
|
-
date = parseDate(modelValue[0], props.format)
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return date === null ? [] : [date]
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return []
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Si modelValue est un objet, on le convertit en chaîne
|
|
151
|
-
if (typeof modelValue === 'object') {
|
|
152
|
-
return null
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// Essayer d'abord avec le format de retour, puis avec le format d'affichage
|
|
156
|
-
let date = parseDate(modelValue, parseFormat)
|
|
157
|
-
|
|
158
|
-
// Si la date est invalide avec le format de retour, essayer avec le format d'affichage
|
|
159
|
-
if (date === null && props.dateFormatReturn) {
|
|
160
|
-
date = parseDate(modelValue, props.format)
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return date === null ? null : date
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Utilisation de la fonction pour initialiser `selectedDates`
|
|
167
70
|
const selectedDates = ref<Date | Date[] | null>(
|
|
168
|
-
initializeSelectedDates(props.modelValue as DateInput | null),
|
|
71
|
+
initializeSelectedDates(props.modelValue as DateInput | null, props.format, props.dateFormatReturn),
|
|
169
72
|
)
|
|
170
73
|
|
|
171
74
|
const isDatePickerVisible = ref(false)
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
|
|
75
|
+
const validation = useValidation({
|
|
76
|
+
showSuccessMessages: props.showSuccessMessages,
|
|
77
|
+
fieldIdentifier: 'Date',
|
|
78
|
+
customRules: props.customRules,
|
|
79
|
+
warningRules: props.customWarningRules,
|
|
80
|
+
disableErrorHandling: props.disableErrorHandling,
|
|
81
|
+
})
|
|
82
|
+
const { errors, warnings, successes, validateField, clearValidation } = validation
|
|
83
|
+
|
|
84
|
+
const errorMessages = errors
|
|
85
|
+
const warningMessages = warnings
|
|
86
|
+
const successMessages = successes
|
|
175
87
|
const displayFormattedDate = ref('')
|
|
176
88
|
|
|
177
89
|
const textInputValue = ref<string>('')
|
|
@@ -179,31 +91,25 @@
|
|
|
179
91
|
// Variable pour éviter les mises à jour récursives
|
|
180
92
|
const isUpdatingFromInternal = ref(false)
|
|
181
93
|
|
|
182
|
-
// Déclaration des règles de validation
|
|
183
|
-
type Rule = { type: string, options: RuleOptions }
|
|
184
|
-
const customRules = ref<Rule[]>(props.customRules || [])
|
|
185
|
-
const customWarningRules = ref<Rule[]>(props.customWarningRules || [])
|
|
186
|
-
|
|
187
|
-
const { generateRules } = useFieldValidation()
|
|
188
|
-
const validationRules = generateRules(customRules.value)
|
|
189
|
-
const warningValidationRules = generateRules(customWarningRules.value)
|
|
190
|
-
|
|
191
94
|
// Déclaration de la fonction validateDates avant son utilisation
|
|
192
95
|
const validateDates = (forceValidation = false) => {
|
|
193
|
-
// Réinitialiser tous les messages
|
|
194
|
-
errorMessages.value = []
|
|
195
|
-
successMessages.value = []
|
|
196
|
-
warningMessages.value = []
|
|
197
|
-
|
|
198
96
|
if (props.noCalendar) {
|
|
199
97
|
// En mode no-calendar, on délègue la validation au DateTextInput
|
|
200
98
|
return
|
|
201
99
|
}
|
|
202
100
|
|
|
101
|
+
// Réinitialiser la validation
|
|
102
|
+
clearValidation()
|
|
103
|
+
|
|
104
|
+
// Si la gestion des erreurs est désactivée, on effectue la validation interne
|
|
105
|
+
// mais on n'ajoute pas les messages d'erreur
|
|
106
|
+
const shouldDisplayErrors = !props.disableErrorHandling
|
|
107
|
+
|
|
203
108
|
// Vérifier si le champ est requis et vide
|
|
204
|
-
// Si forceValidation est true, on ignore les conditions de validation interactive
|
|
205
109
|
if ((forceValidation || !isUpdatingFromInternal.value) && props.required && (!selectedDates.value || (Array.isArray(selectedDates.value) && selectedDates.value.length === 0))) {
|
|
206
|
-
|
|
110
|
+
if (shouldDisplayErrors) {
|
|
111
|
+
errors.value.push('La date est requise.')
|
|
112
|
+
}
|
|
207
113
|
return
|
|
208
114
|
}
|
|
209
115
|
|
|
@@ -214,32 +120,21 @@
|
|
|
214
120
|
? selectedDates.value
|
|
215
121
|
: [selectedDates.value]
|
|
216
122
|
|
|
217
|
-
//
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
validationRules.forEach((rule) => {
|
|
226
|
-
const result = rule(date)
|
|
227
|
-
if (result?.error) allErrors.push(result.error)
|
|
228
|
-
else if (result?.success) allSuccess.push(result.success)
|
|
123
|
+
// Valider chaque date
|
|
124
|
+
if (shouldDisplayErrors) {
|
|
125
|
+
datesToValidate.forEach((date) => {
|
|
126
|
+
validateField(
|
|
127
|
+
date,
|
|
128
|
+
props.customRules,
|
|
129
|
+
props.customWarningRules,
|
|
130
|
+
)
|
|
229
131
|
})
|
|
230
132
|
|
|
231
|
-
//
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
})
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
// Dédoublonner et assigner les messages
|
|
240
|
-
errorMessages.value = [...new Set(allErrors)]
|
|
241
|
-
warningMessages.value = [...new Set(allWarnings)]
|
|
242
|
-
successMessages.value = [...new Set(allSuccess)]
|
|
133
|
+
// Dédoublonner les messages (au cas où plusieurs dates auraient les mêmes messages)
|
|
134
|
+
errors.value = [...new Set(errors.value)]
|
|
135
|
+
warnings.value = [...new Set(warnings.value)]
|
|
136
|
+
successes.value = [...new Set(successes.value)]
|
|
137
|
+
}
|
|
243
138
|
}
|
|
244
139
|
|
|
245
140
|
// Fonction centralisée pour mettre à jour le modèle
|
|
@@ -293,18 +188,6 @@
|
|
|
293
188
|
// Réinitialiser textInputValue
|
|
294
189
|
textInputValue.value = ''
|
|
295
190
|
}
|
|
296
|
-
|
|
297
|
-
// Gérer la visibilité du date picker
|
|
298
|
-
if (props.displayRange) {
|
|
299
|
-
if (Array.isArray(newValue) && newValue.length >= 2) {
|
|
300
|
-
isDatePickerVisible.value = false
|
|
301
|
-
emit('closed')
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
else {
|
|
305
|
-
isDatePickerVisible.value = false
|
|
306
|
-
emit('closed')
|
|
307
|
-
}
|
|
308
191
|
})
|
|
309
192
|
|
|
310
193
|
const getMessageClasses = () => ({
|
|
@@ -318,32 +201,6 @@
|
|
|
318
201
|
'min-width': '100%',
|
|
319
202
|
}))
|
|
320
203
|
|
|
321
|
-
// Formate une date unique au format spécifié
|
|
322
|
-
const formatDate = (date: Date, format: string): string => {
|
|
323
|
-
if (!date) return ''
|
|
324
|
-
|
|
325
|
-
// Formats de base
|
|
326
|
-
const day = date.getDate().toString().padStart(2, '0')
|
|
327
|
-
const month = (date.getMonth() + 1).toString().padStart(2, '0')
|
|
328
|
-
const year = date.getFullYear().toString()
|
|
329
|
-
const shortYear = year.slice(-2)
|
|
330
|
-
|
|
331
|
-
// Formats sans padding
|
|
332
|
-
const dayNoPad = date.getDate().toString()
|
|
333
|
-
const monthNoPad = (date.getMonth() + 1).toString()
|
|
334
|
-
|
|
335
|
-
// Remplacer les tokens dans l'ordre correct (du plus spécifique au moins spécifique)
|
|
336
|
-
let result = format
|
|
337
|
-
.replace(/YYYY/g, year)
|
|
338
|
-
.replace(/YY/g, shortYear)
|
|
339
|
-
.replace(/MM/g, month)
|
|
340
|
-
.replace(/M/g, monthNoPad)
|
|
341
|
-
.replace(/DD/g, day)
|
|
342
|
-
.replace(/D/g, dayNoPad)
|
|
343
|
-
|
|
344
|
-
return result
|
|
345
|
-
}
|
|
346
|
-
|
|
347
204
|
// Date(s) formatée(s) en chaîne de caractères pour la valeur de retour
|
|
348
205
|
const formattedDate = computed<DateValue>(() => {
|
|
349
206
|
if (!selectedDates.value) return ''
|
|
@@ -455,16 +312,6 @@
|
|
|
455
312
|
return formatDate(selectedDates.value, props.format)
|
|
456
313
|
})
|
|
457
314
|
|
|
458
|
-
// const validateDateValue = (value: DateValue): DateValue => {
|
|
459
|
-
// if (Array.isArray(value)) {
|
|
460
|
-
// if (value.length >= 2) {
|
|
461
|
-
// return [value[0], value[1]] as [string, string]
|
|
462
|
-
// }
|
|
463
|
-
// return value[0] || ''
|
|
464
|
-
// }
|
|
465
|
-
// return value
|
|
466
|
-
// }
|
|
467
|
-
|
|
468
315
|
watch(displayFormattedDateComputed, (newValue) => {
|
|
469
316
|
if (!props.noCalendar && newValue) {
|
|
470
317
|
displayFormattedDate.value = newValue
|
|
@@ -474,7 +321,7 @@
|
|
|
474
321
|
const updateSelectedDates = (input: DateValue) => {
|
|
475
322
|
if (Array.isArray(input)) {
|
|
476
323
|
const dates = input
|
|
477
|
-
.map(date => (date ? parseDate(date) : null))
|
|
324
|
+
.map(date => (date ? parseDate(date, props.format) : null))
|
|
478
325
|
.filter((date): date is Date => date !== null)
|
|
479
326
|
|
|
480
327
|
if (dates.length === 0) {
|
|
@@ -486,7 +333,7 @@
|
|
|
486
333
|
return
|
|
487
334
|
}
|
|
488
335
|
|
|
489
|
-
const date = input ? parseDate(input) : null
|
|
336
|
+
const date = input ? parseDate(input, props.format) : null
|
|
490
337
|
selectedDates.value = date === null ? null : date
|
|
491
338
|
}
|
|
492
339
|
|
|
@@ -512,40 +359,6 @@
|
|
|
512
359
|
})).replace(/\b\w/g, l => l.toUpperCase())
|
|
513
360
|
})
|
|
514
361
|
|
|
515
|
-
// Watcher pour le modelValue pour synchroniser les dates sélectionnées
|
|
516
|
-
watch(() => props.modelValue, (newValue) => {
|
|
517
|
-
// Éviter les mises à jour récursives
|
|
518
|
-
if (isUpdatingFromInternal.value) return
|
|
519
|
-
|
|
520
|
-
try {
|
|
521
|
-
isUpdatingFromInternal.value = true
|
|
522
|
-
|
|
523
|
-
if (!newValue || newValue === '') {
|
|
524
|
-
// Réinitialiser les valeurs
|
|
525
|
-
selectedDates.value = null
|
|
526
|
-
textInputValue.value = ''
|
|
527
|
-
displayFormattedDate.value = ''
|
|
528
|
-
}
|
|
529
|
-
else {
|
|
530
|
-
// Initialiser les dates sélectionnées
|
|
531
|
-
selectedDates.value = initializeSelectedDates(newValue)
|
|
532
|
-
|
|
533
|
-
// Mettre à jour l'affichage
|
|
534
|
-
if (selectedDates.value) {
|
|
535
|
-
displayFormattedDate.value = displayFormattedDateComputed.value || ''
|
|
536
|
-
}
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
// Valider les dates
|
|
540
|
-
validateDates()
|
|
541
|
-
}
|
|
542
|
-
finally {
|
|
543
|
-
setTimeout(() => {
|
|
544
|
-
isUpdatingFromInternal.value = false
|
|
545
|
-
}, 0)
|
|
546
|
-
}
|
|
547
|
-
}, { immediate: true })
|
|
548
|
-
|
|
549
362
|
onMounted(() => {
|
|
550
363
|
document.addEventListener('click', handleClickOutside)
|
|
551
364
|
|
|
@@ -570,96 +383,60 @@
|
|
|
570
383
|
}
|
|
571
384
|
// Forcer la validation pour ignorer les conditions de validation interactive
|
|
572
385
|
validateDates(true)
|
|
573
|
-
|
|
386
|
+
// Retourner directement un booléen pour maintenir la compatibilité avec les tests existants
|
|
387
|
+
return errors.value.length === 0
|
|
574
388
|
}
|
|
575
389
|
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
isDatePickerVisible,
|
|
579
|
-
selectedDates,
|
|
580
|
-
errorMessages,
|
|
581
|
-
handleClickOutside,
|
|
582
|
-
initializeSelectedDates,
|
|
583
|
-
})
|
|
584
|
-
|
|
585
|
-
// Fonction pour améliorer l'accessibilité du DatePicker
|
|
586
|
-
const updateAccessibility = async () => {
|
|
587
|
-
await nextTick()
|
|
390
|
+
const showDatePicker = () => {
|
|
391
|
+
if (props.isDisabled || props.isReadOnly) return
|
|
588
392
|
|
|
589
|
-
|
|
590
|
-
const datePickerEl = document.querySelector('.v-date-picker')
|
|
591
|
-
if (!datePickerEl) return
|
|
592
|
-
|
|
593
|
-
// Ajouter un attribut role="application" au conteneur principal
|
|
594
|
-
datePickerEl.setAttribute('role', 'application')
|
|
595
|
-
datePickerEl.setAttribute('aria-label', 'Sélecteur de date')
|
|
393
|
+
isDatePickerVisible.value = true
|
|
596
394
|
|
|
597
|
-
//
|
|
598
|
-
|
|
395
|
+
// Mettre à jour l'accessibilité après l'ouverture du DatePicker
|
|
396
|
+
nextTick(() => {
|
|
397
|
+
updateAccessibility()
|
|
398
|
+
})
|
|
399
|
+
}
|
|
599
400
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
if (!iconEl) return
|
|
401
|
+
const openDatePicker = () => {
|
|
402
|
+
showDatePicker()
|
|
403
|
+
}
|
|
604
404
|
|
|
605
|
-
|
|
606
|
-
const iconContent = iconEl.textContent || ''
|
|
607
|
-
const iconClasses = iconEl.className || ''
|
|
405
|
+
type ViewMode = 'month' | 'year' | 'months' | undefined
|
|
608
406
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
}
|
|
612
|
-
else if (iconClasses.includes('mdi-chevron-right') || iconContent.includes('chevron-right')) {
|
|
613
|
-
button.setAttribute('aria-label', 'Mois suivant')
|
|
614
|
-
}
|
|
615
|
-
else if (iconClasses.includes('mdi-chevron-down') || iconContent.includes('chevron-down')
|
|
616
|
-
|| iconClasses.includes('mdi-menu-down') || iconContent.includes('menu-down')) {
|
|
617
|
-
button.setAttribute('aria-label', 'Changer de vue')
|
|
618
|
-
}
|
|
619
|
-
})
|
|
407
|
+
// Variable pour suivre le mode d'affichage actuel du DatePicker
|
|
408
|
+
const currentViewMode = ref<ViewMode>(props.isBirthDate ? 'year' : 'month')
|
|
620
409
|
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
srOnlyEl = document.createElement('span')
|
|
625
|
-
srOnlyEl.className = 'sr-only-instructions'
|
|
626
|
-
srOnlyEl.setAttribute('aria-live', 'polite')
|
|
627
|
-
// Utiliser HTMLElement pour accéder aux propriétés de style
|
|
628
|
-
const srOnlyHtmlEl = srOnlyEl as HTMLElement
|
|
629
|
-
srOnlyHtmlEl.style.position = 'absolute'
|
|
630
|
-
srOnlyHtmlEl.style.width = '1px'
|
|
631
|
-
srOnlyHtmlEl.style.height = '1px'
|
|
632
|
-
srOnlyHtmlEl.style.padding = '0'
|
|
633
|
-
srOnlyHtmlEl.style.margin = '-1px'
|
|
634
|
-
srOnlyHtmlEl.style.overflow = 'hidden'
|
|
635
|
-
srOnlyHtmlEl.style.clip = 'rect(0, 0, 0, 0)'
|
|
636
|
-
srOnlyHtmlEl.style.whiteSpace = 'nowrap'
|
|
637
|
-
srOnlyHtmlEl.style.border = '0'
|
|
638
|
-
srOnlyEl.textContent = 'Utilisez les flèches pour naviguer entre les dates et Entrée pour sélectionner une date'
|
|
639
|
-
|
|
640
|
-
datePickerEl.prepend(srOnlyEl)
|
|
641
|
-
}
|
|
410
|
+
// Fonction pour gérer le changement de mode d'affichage
|
|
411
|
+
const handleViewModeUpdate = (newMode: ViewMode) => {
|
|
412
|
+
currentViewMode.value = newMode
|
|
642
413
|
}
|
|
643
414
|
|
|
644
|
-
//
|
|
645
|
-
|
|
646
|
-
if (
|
|
647
|
-
|
|
415
|
+
// Fonction pour gérer la sélection de l'année quand isBirthDate est true
|
|
416
|
+
const handleYearUpdate = () => {
|
|
417
|
+
if (props.isBirthDate) {
|
|
418
|
+
// Après la sélection de l'année, passer automatiquement à la sélection du mois
|
|
419
|
+
currentViewMode.value = 'months'
|
|
648
420
|
}
|
|
649
|
-
})
|
|
650
|
-
|
|
651
|
-
const handlePrependIconClick = () => {
|
|
652
|
-
isDatePickerVisible.value = true
|
|
653
421
|
}
|
|
654
422
|
|
|
655
|
-
|
|
656
|
-
|
|
423
|
+
// Fonction pour gérer la sélection du mois quand isBirthDate est true
|
|
424
|
+
const handleMonthUpdate = () => {
|
|
425
|
+
if (props.isBirthDate) {
|
|
426
|
+
// Après la sélection du mois, passer automatiquement à la sélection du jour
|
|
427
|
+
currentViewMode.value = undefined
|
|
428
|
+
}
|
|
657
429
|
}
|
|
658
430
|
|
|
659
|
-
|
|
431
|
+
watch(isDatePickerVisible, (isVisible) => {
|
|
432
|
+
if (!isVisible && props.isBirthDate) {
|
|
433
|
+
// Réinitialiser le mode d'affichage au type birthdate
|
|
434
|
+
currentViewMode.value = 'year'
|
|
435
|
+
}
|
|
436
|
+
})
|
|
660
437
|
|
|
661
438
|
const getIcon = () => {
|
|
662
|
-
if (props.noCalendar) {
|
|
439
|
+
if (props.noCalendar || props.disableErrorHandling) {
|
|
663
440
|
return
|
|
664
441
|
}
|
|
665
442
|
switch (true) {
|
|
@@ -674,40 +451,47 @@
|
|
|
674
451
|
}
|
|
675
452
|
}
|
|
676
453
|
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
454
|
+
const syncFromModelValue = (newValue: DateInput | undefined) => {
|
|
455
|
+
if (!newValue || newValue === '') {
|
|
456
|
+
selectedDates.value = null
|
|
457
|
+
textInputValue.value = ''
|
|
458
|
+
displayFormattedDate.value = ''
|
|
459
|
+
validateDates()
|
|
460
|
+
return
|
|
461
|
+
}
|
|
681
462
|
|
|
682
|
-
|
|
683
|
-
isUpdatingFromInternal.value = true
|
|
463
|
+
selectedDates.value = initializeSelectedDates(newValue, props.format, props.dateFormatReturn)
|
|
684
464
|
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
465
|
+
if (selectedDates.value) {
|
|
466
|
+
const firstDate = Array.isArray(selectedDates.value)
|
|
467
|
+
? selectedDates.value[0]
|
|
468
|
+
: selectedDates.value
|
|
469
|
+
|
|
470
|
+
textInputValue.value = formatDate(firstDate, props.format)
|
|
471
|
+
displayFormattedDate.value = displayFormattedDateComputed.value || ''
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
validateDates()
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
watch(() => props.modelValue, (newValue) => {
|
|
478
|
+
if (isUpdatingFromInternal.value) {
|
|
479
|
+
if (props.displayRange) {
|
|
480
|
+
if (Array.isArray(newValue) && newValue.length >= 2) {
|
|
481
|
+
isDatePickerVisible.value = false
|
|
482
|
+
emit('closed')
|
|
483
|
+
}
|
|
689
484
|
}
|
|
690
485
|
else {
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
// Mettre à jour l'affichage et le textInputValue
|
|
695
|
-
if (selectedDates.value) {
|
|
696
|
-
if (Array.isArray(selectedDates.value)) {
|
|
697
|
-
if (selectedDates.value.length > 0) {
|
|
698
|
-
textInputValue.value = formatDate(selectedDates.value[0], props.format)
|
|
699
|
-
displayFormattedDate.value = displayFormattedDateComputed.value || ''
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
else {
|
|
703
|
-
textInputValue.value = formatDate(selectedDates.value, props.format)
|
|
704
|
-
displayFormattedDate.value = displayFormattedDateComputed.value || ''
|
|
705
|
-
}
|
|
706
|
-
}
|
|
486
|
+
isDatePickerVisible.value = false
|
|
487
|
+
emit('closed')
|
|
707
488
|
}
|
|
489
|
+
return
|
|
490
|
+
}
|
|
708
491
|
|
|
709
|
-
|
|
710
|
-
|
|
492
|
+
try {
|
|
493
|
+
isUpdatingFromInternal.value = true
|
|
494
|
+
syncFromModelValue(newValue)
|
|
711
495
|
}
|
|
712
496
|
finally {
|
|
713
497
|
setTimeout(() => {
|
|
@@ -715,6 +499,17 @@
|
|
|
715
499
|
}, 0)
|
|
716
500
|
}
|
|
717
501
|
}, { immediate: true })
|
|
502
|
+
|
|
503
|
+
defineExpose({
|
|
504
|
+
validateOnSubmit,
|
|
505
|
+
isDatePickerVisible,
|
|
506
|
+
selectedDates,
|
|
507
|
+
errorMessages,
|
|
508
|
+
handleClickOutside,
|
|
509
|
+
initializeSelectedDates,
|
|
510
|
+
updateAccessibility,
|
|
511
|
+
openDatePicker,
|
|
512
|
+
})
|
|
718
513
|
</script>
|
|
719
514
|
|
|
720
515
|
<template>
|
|
@@ -741,6 +536,8 @@
|
|
|
741
536
|
:display-append-icon="props.displayAppendIcon"
|
|
742
537
|
:display-prepend-icon="props.displayPrependIcon"
|
|
743
538
|
:no-icon="props.noIcon"
|
|
539
|
+
:disable-error-handling="props.disableErrorHandling"
|
|
540
|
+
:show-success-messages="props.showSuccessMessages"
|
|
744
541
|
title="Date text input"
|
|
745
542
|
@focus="emit('focus')"
|
|
746
543
|
@blur="emit('blur')"
|
|
@@ -754,7 +551,7 @@
|
|
|
754
551
|
:class="[getMessageClasses(), 'label-hidden-on-focus']"
|
|
755
552
|
:error-messages="errorMessages"
|
|
756
553
|
:warning-messages="warningMessages"
|
|
757
|
-
:success-messages="successMessages"
|
|
554
|
+
:success-messages="props.showSuccessMessages ? successMessages : []"
|
|
758
555
|
:is-disabled="props.isDisabled"
|
|
759
556
|
:is-read-only="true"
|
|
760
557
|
:label="props.placeholder"
|
|
@@ -762,12 +559,13 @@
|
|
|
762
559
|
:prepend-icon="displayIcon && !displayAppendIcon ? 'calendar' : undefined"
|
|
763
560
|
:variant-style="props.isOutlined ? 'outlined' : 'underlined'"
|
|
764
561
|
color="primary"
|
|
562
|
+
:show-success-messages="props.showSuccessMessages"
|
|
765
563
|
is-clearable
|
|
766
564
|
title="Date Picker"
|
|
767
|
-
@focus="
|
|
565
|
+
@focus="openDatePicker"
|
|
768
566
|
@update:model-value="updateSelectedDates"
|
|
769
|
-
@prepend-icon-click="
|
|
770
|
-
@append-icon-click="
|
|
567
|
+
@prepend-icon-click="openDatePicker"
|
|
568
|
+
@append-icon-click="openDatePicker"
|
|
771
569
|
/>
|
|
772
570
|
</template>
|
|
773
571
|
<div>
|
|
@@ -787,12 +585,15 @@
|
|
|
787
585
|
<VDatePicker
|
|
788
586
|
v-if="isDatePickerVisible && !props.noCalendar"
|
|
789
587
|
v-model="selectedDates"
|
|
588
|
+
color="primary"
|
|
790
589
|
:first-day-of-week="1"
|
|
791
590
|
:multiple="props.displayRange ? 'range' : false"
|
|
792
591
|
:show-adjacent-months="true"
|
|
793
592
|
:show-week="props.showWeekNumber"
|
|
794
|
-
:view-mode="
|
|
795
|
-
|
|
593
|
+
:view-mode="currentViewMode"
|
|
594
|
+
@update:view-mode="handleViewModeUpdate"
|
|
595
|
+
@update:year="handleYearUpdate"
|
|
596
|
+
@update:month="handleMonthUpdate"
|
|
796
597
|
>
|
|
797
598
|
<template #title>
|
|
798
599
|
Sélectionnez une date
|