@cnamts/synapse 1.0.26 → 1.0.27
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/{AutocompleteFilter-BPR-a55G.js → AutocompleteFilter-C9eLKyW8.js} +3 -3
- package/dist/{DateFilter-CknrJWs2.js → DateFilter-y-GLkAkn.js} +8 -8
- package/dist/{NumberFilter-DJ-yNlzv.js → NumberFilter-DN6hIBS7.js} +1 -1
- package/dist/{PeriodFilter-CiB5Oa9Z.js → PeriodFilter-MoUUp9qS.js} +1 -1
- package/dist/{SelectFilter-EiafX97M.js → SelectFilter-bCbrdLmu.js} +1 -1
- package/dist/{TextFilter-BzOmpdxj.js → TextFilter-CvjgEaoM.js} +4 -4
- package/dist/apLightTheme2026-ug4Y23ns.js +611 -0
- package/dist/components/Customs/Selects/SyAutocomplete/SyAutocomplete.d.ts +2369 -353
- package/dist/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.d.ts +18 -0
- package/dist/components/Customs/Selects/SyAutocomplete/utils/ariaManager.d.ts +1 -1
- package/dist/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.d.ts +3 -1
- package/dist/components/Customs/Selects/SySelect/SySelect.d.ts +9 -10
- package/dist/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.d.ts +1 -0
- package/dist/components/Customs/Selects/SySelect/composables/useSySelectValidation.d.ts +15 -0
- package/dist/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.d.ts +3 -3
- package/dist/components/Customs/SyCheckbox/SyCheckbox.d.ts +3 -3
- package/dist/components/Customs/SyIconButton/SyIconButton.d.ts +18 -0
- package/dist/components/Customs/SyRadioGroup/SyRadioGroup.d.ts +20 -38
- package/dist/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.d.ts +50 -0
- package/dist/components/Customs/SyTextField/SyTextField.d.ts +6 -6
- package/dist/components/DatePicker/CalendarMode/DatePicker.d.ts +147 -136
- package/dist/components/DatePicker/ComplexDatePicker/ComplexDatePicker.d.ts +62 -54
- package/dist/components/DatePicker/DateTextInput/DateTextInput.d.ts +27 -24
- package/dist/components/DatePicker/composables/index.d.ts +1 -0
- package/dist/components/DatePicker/composables/useDatePickerValidationBridge.d.ts +51 -0
- package/dist/components/MonthPicker/MonthPicker.d.ts +23 -23
- package/dist/components/MonthPicker/MonthPickerText/MonthPickerInput.d.ts +23 -23
- package/dist/components/NirField/NirField.d.ts +56 -56
- package/dist/components/PasswordField/PasswordField.d.ts +3 -3
- package/dist/components/PeriodField/PeriodField.d.ts +236 -212
- package/dist/components/PhoneField/PhoneField.d.ts +23 -23
- package/dist/components/SyTextArea/SyTextArea.d.ts +25 -15
- package/dist/components/SyTextArea/composables/useSyTextAreaValidation.d.ts +20 -0
- package/dist/components/SyTextArea/locales.d.ts +1 -0
- package/dist/components/Tables/SyServerTable/SyServerTable.d.ts +1 -0
- package/dist/components/Tables/SyTable/SyTable.d.ts +1 -0
- package/dist/components/Tables/common/SyTablePagination.d.ts +25 -25
- package/dist/components/Tables/common/types.d.ts +2 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/composables/unifyValidation/documentationValidationProps.d.ts +160 -160
- package/dist/composables/unifyValidation/useValidation.d.ts +16 -14
- package/dist/design-system-v3.js +81 -80
- package/dist/designTokens/tokens/amelipro/apContextual.d.ts +6 -6
- package/dist/designTokens/tokens/amelipro/apDarkTheme.d.ts +3 -1
- package/dist/designTokens/tokens/amelipro/apLightTheme.d.ts +53 -100
- package/dist/designTokens/tokens/baseContextualTokens.d.ts +0 -6
- package/dist/designTokens/tokens/baseTokens.d.ts +232 -0
- package/dist/designTokens/tokens/cnam/cnamContextual.d.ts +6 -6
- package/dist/designTokens/tokens/cnam/cnamDarkTheme.d.ts +1 -1
- package/dist/designTokens/tokens/cnam/cnamLightTheme.d.ts +57 -101
- package/dist/designTokens/tokens/pa/paContextual.d.ts +0 -6
- package/dist/designTokens/tokens/pa/paDarkTheme.d.ts +1 -1
- package/dist/designTokens/tokens/pa/paLightTheme.d.ts +53 -97
- package/dist/designTokens/tokens/pa/paSemantic.d.ts +1 -0
- package/dist/designTokens/tokens/semanticTokens.d.ts +112 -0
- package/dist/main-CI6Q9nmO.js +39234 -0
- package/dist/synapse.css +1 -1
- package/dist/vuetifyConfig.js +208 -72
- package/package.json +4 -2
- package/src/assets/overrides/_icons.scss +5 -4
- package/src/assets/overrides/_otp.scss +4 -4
- package/src/assets/overrides/_typography.scss +2 -1
- package/src/assets/overrides/_utilities.scss +1 -42
- package/src/components/ChipList/ChipList.vue +30 -18
- package/src/components/ChipList/tests/chipList.spec.ts +4 -4
- package/src/components/CopyBtn/CopyBtn.vue +2 -2
- package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.stories.ts +4 -0
- package/src/components/Customs/Selects/SelectBtnField/SelectBtnField.vue +7 -6
- package/src/components/Customs/Selects/SelectBtnField/tests/SelectBtnField.spec.ts +223 -0
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.stories.ts +283 -351
- package/src/components/Customs/Selects/SyAutocomplete/SyAutocomplete.vue +182 -218
- package/src/components/Customs/Selects/SyAutocomplete/composables/useSyAutocompleteValidation.ts +101 -0
- package/src/components/Customs/Selects/SyAutocomplete/tests/SyAutocomplete.spec.ts +761 -1
- package/src/components/Customs/Selects/SyAutocomplete/utils/ariaManager.ts +3 -1
- package/src/components/Customs/Selects/SyAutocomplete/utils/useKeyboardHandler.ts +79 -5
- package/src/components/Customs/Selects/SyAutocomplete/validation/Validation.stories.ts +1029 -0
- package/src/components/Customs/Selects/SySelect/SySelect.stories.ts +9 -491
- package/src/components/Customs/Selects/SySelect/SySelect.vue +46 -79
- package/src/components/Customs/Selects/SySelect/composables/useSySelectKeyboard.ts +3 -0
- package/src/components/Customs/Selects/SySelect/composables/useSySelectValidation.ts +64 -0
- package/src/components/Customs/Selects/SySelect/tests/SySelect.spec.ts +196 -0
- package/src/components/Customs/Selects/SySelect/validation/Validation.stories.ts +1026 -0
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.stories.ts +18 -7
- package/src/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue +2 -2
- package/src/components/Customs/SyCheckbox/SyCheckbox.stories.ts +8 -8
- package/src/components/Customs/SyCheckbox/SyCheckbox.vue +8 -8
- package/src/components/Customs/SyCheckbox/tests/SyCheckbox.spec.ts +1 -1
- package/src/components/Customs/SyIcon/accessibilite/Accessibility.mdx +0 -6
- package/src/components/Customs/SyIcon/utils/tests/iconUtils.spec.ts +107 -0
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.mdx +2 -2
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.stories.ts +395 -200
- package/src/components/Customs/SyRadioGroup/SyRadioGroup.vue +82 -127
- package/src/components/Customs/SyRadioGroup/composables/useSyRadioGroupValidation.ts +127 -0
- package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.a11y.spec.ts +93 -1
- package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.spec.ts +146 -9
- package/src/components/Customs/SyRadioGroup/tests/SyRadioGroup.visual.cy.ts +165 -0
- package/src/components/Customs/SyRadioGroup/validation/Validation.stories.ts +773 -0
- package/src/components/Customs/SyTabs/config.ts +3 -3
- package/src/components/Customs/SyTabs/tests/SyTabs.spec.ts +265 -0
- package/src/components/Customs/SyTabs/tests/useTabTransition.spec.ts +188 -0
- package/src/components/Customs/SyTextField/SyTextField.stories.ts +10 -29
- package/src/components/Customs/SyTextField/SyTextField.vue +23 -15
- package/src/components/DataList/DataList.stories.ts +1 -1
- package/src/components/DataListItem/tests/DataListItem.spec.ts +3 -1
- package/src/components/DatePicker/CalendarMode/DatePicker.vue +37 -142
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.coverage.spec.ts +156 -0
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.spec.ts +495 -4
- package/src/components/DatePicker/ComplexDatePicker/ComplexDatePicker.vue +47 -66
- package/src/components/DatePicker/ComplexDatePicker/tests/ComplexDatePicker.spec.ts +206 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/bridge-integration.regression.spec.ts +210 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/calendar-navigation.regression.spec.ts +214 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/validation-cross.regression.spec.ts +194 -0
- package/src/components/DatePicker/ComplexDatePicker/tests/validation-success-messages.regression.spec.ts +83 -0
- package/src/components/DatePicker/DateTextInput/DateTextInput.vue +129 -54
- package/src/components/DatePicker/DateTextInput/tests/DateTextInput.spec.ts +320 -0
- package/src/components/DatePicker/composables/index.ts +1 -0
- package/src/components/DatePicker/composables/tests/useCalendarKeyboardNavigation.spec.ts +360 -0
- package/src/components/DatePicker/composables/tests/useDatePickerValidationBridge.spec.ts +129 -0
- package/src/components/DatePicker/composables/useDatePickerValidationBridge.ts +205 -0
- package/src/components/DatePicker/docExamples/BidirectionalComplexValidation.vue +1 -1
- package/src/components/DatePicker/docExamples/DatePickerBidirectionalValidation.vue +1 -1
- package/src/components/DatePicker/tests/exposed-methods.coverage.spec.ts +75 -0
- package/src/components/DialogBox/DialogBox.vue +1 -1
- package/src/components/FileList/UploadItem/UploadItem.vue +4 -4
- package/src/components/FileUpload/FileUpload.vue +2 -2
- package/src/components/FileUpload/FileUploadContent.vue +1 -1
- package/src/components/FilterInline/FilterInline.mdx +2 -2
- package/src/components/FilterSideBar/FilterSideBar.stories.ts +1 -1
- package/src/components/FilterSideBar/FilterSideBar.vue +2 -2
- package/src/components/FooterBar/FooterBar.vue +7 -7
- package/src/components/FranceConnectBtn/FranceConnectBtn.vue +1 -1
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderMenuItem/HeaderMenuItem.vue +2 -2
- package/src/components/HeaderBar/HeaderBurgerMenu/HeaderSubMenu/HeaderSubMenu.vue +7 -7
- package/src/components/HeaderBar/HeaderMenuBtn/HeaderMenuBtn.vue +2 -2
- package/src/components/HeaderLoading/tests/HeaderLoading.spec.ts +87 -8
- package/src/components/HeaderNavigationBar/HorizontalNavbar/HorizontalNavbar.vue +3 -3
- package/src/components/HeaderNavigationBar/HorizontalNavbar/tests/HorizontalNavbar.spec.ts +589 -0
- package/src/components/HeaderToolbar/tests/HeaderToolBar.spec.ts +153 -1
- package/src/components/HeaderToolbar/tests/useMobileRightMenu.spec.ts +258 -0
- package/src/components/LogoBrandSection/tests/LogoBrandSection.spec.ts +2 -2
- package/src/components/LogoBrandSection/tests/__snapshots__/LogoBrandSection.spec.ts.snap +1 -1
- package/src/components/LunarCalendar/tests/useLunarCalendarRules.spec.ts +184 -0
- package/src/components/MonthPicker/MonthPickerVisual/MonthSelector.vue +3 -3
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerFooter.vue +1 -1
- package/src/components/MonthPicker/MonthPickerVisual/VisualPickerHeader.vue +2 -2
- package/src/components/MonthPicker/MonthPickerVisual/YearSelector.vue +1 -1
- package/src/components/NirField/NirField.vue +3 -3
- package/src/components/NotificationBar/Notification/Notification.vue +12 -12
- package/src/components/NotificationBar/NotificationBar.stories.ts +8 -8
- package/src/components/PaginatedTable/Pagination.vue +2 -2
- package/src/components/PasswordField/PasswordField.vue +8 -8
- package/src/components/PasswordField/tests/PasswordField.spec.ts +3 -3
- package/src/components/RangeField/RangeSlider/RangeSlider.vue +2 -2
- package/src/components/RangeField/RangeSlider/Tooltip/Tooltip.vue +1 -1
- package/src/components/StatusPage/tests/StatusPage.spec.ts +149 -0
- package/src/components/SubHeader/SubHeader.vue +1 -1
- package/src/components/SyAlert/SyAlert.vue +23 -23
- package/src/components/SyTextArea/SyTextArea.stories.ts +177 -131
- package/src/components/SyTextArea/SyTextArea.vue +235 -83
- package/src/components/SyTextArea/composables/useSyTextAreaValidation.ts +81 -0
- package/src/components/SyTextArea/locales.ts +1 -0
- package/src/components/SyTextArea/tests/SyTextArea.spec.ts +449 -1
- package/src/components/SyTextArea/useDefaultValidationRules.ts +2 -7
- package/src/components/SyTextArea/validation/Validation.stories.ts +856 -0
- package/src/components/TableToolbar/TableToolbar.vue +6 -6
- package/src/components/TableToolbar/accessibilite/Accessibility.mdx +81 -7
- package/src/components/Tables/SyServerTable/SyServerTable.stories.ts +163 -0
- package/src/components/Tables/SyServerTable/SyServerTable.vue +2 -1
- package/src/components/Tables/SyServerTable/tests/SyServerTable.spec.ts +67 -0
- package/src/components/Tables/SyTable/SyTable.stories.ts +94 -0
- package/src/components/Tables/SyTable/SyTable.vue +2 -1
- package/src/components/Tables/SyTable/tests/SyTable.spec.ts +64 -0
- package/src/components/Tables/common/TableHeader.vue +2 -2
- package/src/components/Tables/common/filters/logics/tests/NumberFilterLogic.spec.ts +176 -0
- package/src/components/Tables/common/filters/logics/tests/SelectFilterLogic.spec.ts +111 -0
- package/src/components/Tables/common/tableStyles.scss +6 -6
- package/src/components/Tables/common/types.ts +2 -0
- package/src/components/UploadWorkflow/tests/UploadWorkflow.spec.ts +2 -0
- package/src/components/index.ts +1 -0
- package/src/composables/date/tests/useDateFormatDayjs.spec.ts +31 -0
- package/src/composables/date/tests/useHolidayDay.spec.ts +109 -0
- package/src/composables/rules/tests/useFieldValidation.spec.ts +374 -0
- package/src/composables/tests/useError.spec.ts +30 -0
- package/src/composables/tests/useFormFieldErrorHandling.spec.ts +234 -0
- package/src/composables/unifyValidation/documentationValidationProps.ts +5 -5
- package/src/composables/unifyValidation/tests/documentationValidationProps.spec.ts +177 -0
- package/src/composables/unifyValidation/tests/useCustomValidation.spec.ts +30 -0
- package/src/composables/unifyValidation/tests/useValidation.spec.ts +6 -2
- package/src/composables/unifyValidation/useCustomValidation.ts +19 -9
- package/src/composables/unifyValidation/useValidation.ts +18 -21
- package/src/composables/useFilterable/useFilterable.spec.ts +42 -0
- package/src/composables/useFilterable/useFilterable.ts +11 -7
- package/src/composables/useFormFieldErrorHandling.ts +2 -2
- package/src/composantsVuetify/VBtn/VBtn.mdx +9 -39
- package/src/composantsVuetify/VBtn/v-btn.stories.ts +26 -86
- package/src/designTokens/tokens/amelipro/apContextual.ts +6 -0
- package/src/designTokens/tokens/amelipro/apDarkTheme.ts +2 -2
- package/src/designTokens/tokens/amelipro/apLightTheme.ts +72 -103
- package/src/designTokens/tokens/amelipro/apSemantic.ts +1 -1
- package/src/designTokens/tokens/baseContextualTokens.ts +1 -6
- package/src/designTokens/tokens/baseTokens.ts +232 -0
- package/src/designTokens/tokens/cnam/cnamContextual.ts +6 -0
- package/src/designTokens/tokens/cnam/cnamDarkTheme.ts +2 -2
- package/src/designTokens/tokens/cnam/cnamLightTheme.ts +76 -104
- package/src/designTokens/tokens/pa/paDarkTheme.ts +2 -2
- package/src/designTokens/tokens/pa/paLightTheme.ts +73 -99
- package/src/designTokens/tokens/pa/paSemantic.ts +2 -0
- package/src/designTokens/tokens/semanticTokens.ts +114 -0
- package/src/stories/Components/Components.stories.ts +7 -3
- package/src/stories/DesignTokens/ColorIntegrationExample.vue +2 -3
- package/src/stories/DesignTokens/Colors.mdx +6 -8
- package/src/stories/DesignTokens/colors.stories.ts +244 -1081
- package/src/utils/amelipro/toKebabCase/tests/toKebabCase.spec.ts +52 -0
- package/src/utils/formatNir/tests/formatNir.spec.ts +34 -0
- package/src/utils/tests/insertAt.spec.ts +44 -0
- package/dist/apLightTheme-DS0Uy44H.js +0 -954
- package/dist/components/RatingPicker/tests/RatingPicker.a11y.spect.d.ts +0 -1
- package/dist/main-BsJ9ec3i.js +0 -38954
- package/src/components/BackBtn/tests/__snapshots__/back-btn-custom-bg.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-dark-mode.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-default.snap.png +0 -0
- package/src/components/BackBtn/tests/__snapshots__/back-btn-no-icon.snap.png +0 -0
- package/src/components/DatePicker/CalendarMode/tests/DatePicker.events.spec.ts +0 -178
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-custom-texts.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-default.snap.png +0 -0
- package/src/components/DialogBox/tests/__snapshots__/dialog-box-no-actions.snap.png +0 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated-submenu-open.snap.png +0 -0
- package/src/components/HeaderBar/HeaderBurgerMenu/tests/__snapshots__/header-burger-menu-generated.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-custom-width.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-default.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-no-sticky.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-prepend.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-side.snap.png +0 -0
- package/src/components/HeaderBar/tests/__snapshots__/header-bar-with-subtitle.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-avatar.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-dark.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-default.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-organism.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-no-signature.snap.png +0 -0
- package/src/components/Logo/tests/__snapshots__/logo-risque-pro.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-bg.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-custom-range.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-default.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-step.snap.png +0 -0
- package/src/components/RangeField/tests/__snapshots__/range-field-with-label.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-closable.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-error.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-info.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-success.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-outlined.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-variant-tonal.snap.png +0 -0
- package/src/components/SyAlert/tests/__snapshots__/sy-alert-warning.snap.png +0 -0
- /package/src/components/RatingPicker/tests/{RatingPicker.a11y.spect.ts → RatingPicker.a11y.spec.ts} +0 -0
|
@@ -0,0 +1,856 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/vue3'
|
|
2
|
+
import SyTextArea from '../SyTextArea.vue'
|
|
3
|
+
import SyForm from '../../Customs/SyForm/SyForm.vue'
|
|
4
|
+
import { ref, onMounted, nextTick } from 'vue'
|
|
5
|
+
import { fn } from '@storybook/test'
|
|
6
|
+
import { VBtn, VForm } from 'vuetify/components'
|
|
7
|
+
|
|
8
|
+
const meta: Meta<typeof SyTextArea> = {
|
|
9
|
+
title: 'Composants/Formulaires/SyTextArea/Validation',
|
|
10
|
+
component: SyTextArea,
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: 'fullscreen',
|
|
13
|
+
},
|
|
14
|
+
args: {
|
|
15
|
+
'onUpdate:modelValue': fn(),
|
|
16
|
+
},
|
|
17
|
+
} as Meta<typeof SyTextArea>
|
|
18
|
+
|
|
19
|
+
export default meta
|
|
20
|
+
|
|
21
|
+
type Story = StoryObj<typeof meta>
|
|
22
|
+
|
|
23
|
+
export const WithError: Story = {
|
|
24
|
+
parameters: {
|
|
25
|
+
docs: {
|
|
26
|
+
description: {
|
|
27
|
+
story: 'Un message prédéfini est présélectionné et déclenche une erreur bloquante au chargement.',
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
sourceCode: [
|
|
31
|
+
{
|
|
32
|
+
name: 'Template',
|
|
33
|
+
code: `
|
|
34
|
+
<template>
|
|
35
|
+
<SyTextArea
|
|
36
|
+
ref="textAreaRef"
|
|
37
|
+
v-model="value"
|
|
38
|
+
label="Description"
|
|
39
|
+
:custom-rules="[
|
|
40
|
+
{
|
|
41
|
+
type: 'custom',
|
|
42
|
+
options: {
|
|
43
|
+
validate: (v) => v.length <= 20,
|
|
44
|
+
message: 'Le texte ne doit pas dépasser 20 caractères.'
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
]"
|
|
48
|
+
/>
|
|
49
|
+
</template>`,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'Script',
|
|
53
|
+
code: `
|
|
54
|
+
<script setup lang="ts">
|
|
55
|
+
import { onMounted, ref } from 'vue'
|
|
56
|
+
import { SyTextArea } from '@cnamts/synapse'
|
|
57
|
+
|
|
58
|
+
const value = ref('Ce texte est trop long et provoque une erreur.')
|
|
59
|
+
const textAreaRef = ref(null)
|
|
60
|
+
|
|
61
|
+
onMounted(() => {
|
|
62
|
+
textAreaRef.value?.validateOnSubmit()
|
|
63
|
+
})
|
|
64
|
+
</script>`,
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
args: {
|
|
69
|
+
'label': 'Description',
|
|
70
|
+
'onUpdate:modelValue': fn(),
|
|
71
|
+
},
|
|
72
|
+
render: args => ({
|
|
73
|
+
components: { SyTextArea },
|
|
74
|
+
setup() {
|
|
75
|
+
const value = ref('Ce texte est trop long et provoque une erreur.')
|
|
76
|
+
const textAreaRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
|
|
77
|
+
|
|
78
|
+
onMounted(() => {
|
|
79
|
+
textAreaRef.value?.validateOnSubmit()
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
return { args, value, textAreaRef }
|
|
83
|
+
},
|
|
84
|
+
template: `
|
|
85
|
+
<div class="pa-4">
|
|
86
|
+
<SyTextArea
|
|
87
|
+
ref="textAreaRef"
|
|
88
|
+
v-model="value"
|
|
89
|
+
v-bind="args"
|
|
90
|
+
:custom-rules="[
|
|
91
|
+
{
|
|
92
|
+
type: 'custom',
|
|
93
|
+
options: {
|
|
94
|
+
validate: (v) => v.length <= 20,
|
|
95
|
+
message: 'Le texte ne doit pas dépasser 20 caractères.'
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
]"
|
|
99
|
+
/>
|
|
100
|
+
</div>
|
|
101
|
+
`,
|
|
102
|
+
}),
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export const WithWarning: Story = {
|
|
106
|
+
parameters: {
|
|
107
|
+
docs: {
|
|
108
|
+
description: {
|
|
109
|
+
story: 'Les règles d\'alerte (`customWarningRules`) sont non bloquantes : le formulaire peut être soumis même si elles échouent.',
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
sourceCode: [
|
|
113
|
+
{
|
|
114
|
+
name: 'Template',
|
|
115
|
+
code: `
|
|
116
|
+
<template>
|
|
117
|
+
<SyTextArea
|
|
118
|
+
ref="textAreaRef"
|
|
119
|
+
v-model="value"
|
|
120
|
+
label="Observations"
|
|
121
|
+
:custom-warning-rules="[
|
|
122
|
+
{
|
|
123
|
+
type: 'custom',
|
|
124
|
+
options: {
|
|
125
|
+
validate: (v) => v.length >= 10,
|
|
126
|
+
warningMessage: 'Pour une meilleure description, saisissez au moins 10 caractères.'
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
]"
|
|
130
|
+
/>
|
|
131
|
+
</template>`,
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
args: {
|
|
136
|
+
'label': 'Observations',
|
|
137
|
+
'onUpdate:modelValue': fn(),
|
|
138
|
+
},
|
|
139
|
+
render: args => ({
|
|
140
|
+
components: { SyTextArea },
|
|
141
|
+
setup() {
|
|
142
|
+
const value = ref('Court.')
|
|
143
|
+
const textAreaRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
|
|
144
|
+
|
|
145
|
+
onMounted(() => {
|
|
146
|
+
textAreaRef.value?.validateOnSubmit()
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
return { args, value, textAreaRef }
|
|
150
|
+
},
|
|
151
|
+
template: `
|
|
152
|
+
<div class="pa-4">
|
|
153
|
+
<SyTextArea
|
|
154
|
+
ref="textAreaRef"
|
|
155
|
+
v-model="value"
|
|
156
|
+
v-bind="args"
|
|
157
|
+
:custom-warning-rules="[
|
|
158
|
+
{
|
|
159
|
+
type: 'custom',
|
|
160
|
+
options: {
|
|
161
|
+
validate: (v) => v.length >= 10,
|
|
162
|
+
warningMessage: 'Pour une meilleure description, saisissez au moins 10 caractères.'
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
]"
|
|
166
|
+
/>
|
|
167
|
+
</div>
|
|
168
|
+
`,
|
|
169
|
+
}),
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export const WithSuccess: Story = {
|
|
173
|
+
parameters: {
|
|
174
|
+
docs: {
|
|
175
|
+
description: {
|
|
176
|
+
story: 'Les règles de succès (`customSuccessRules`) affichent un message positif quand la valeur est valide.',
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
sourceCode: [
|
|
180
|
+
{
|
|
181
|
+
name: 'Template',
|
|
182
|
+
code: `
|
|
183
|
+
<template>
|
|
184
|
+
<SyTextArea
|
|
185
|
+
ref="textAreaRef"
|
|
186
|
+
v-model="value"
|
|
187
|
+
label="Commentaire"
|
|
188
|
+
show-success-messages
|
|
189
|
+
:custom-success-rules="[
|
|
190
|
+
{
|
|
191
|
+
type: 'custom',
|
|
192
|
+
options: {
|
|
193
|
+
validate: (v) => v.length >= 20,
|
|
194
|
+
successMessage: 'Description suffisamment détaillée.'
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
]"
|
|
198
|
+
/>
|
|
199
|
+
</template>`,
|
|
200
|
+
},
|
|
201
|
+
],
|
|
202
|
+
},
|
|
203
|
+
args: {
|
|
204
|
+
'label': 'Commentaire',
|
|
205
|
+
'showSuccessMessages': true,
|
|
206
|
+
'onUpdate:modelValue': fn(),
|
|
207
|
+
},
|
|
208
|
+
render: args => ({
|
|
209
|
+
components: { SyTextArea },
|
|
210
|
+
setup() {
|
|
211
|
+
const value = ref('Voici une description bien détaillée du problème rencontré.')
|
|
212
|
+
const textAreaRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
|
|
213
|
+
|
|
214
|
+
onMounted(() => {
|
|
215
|
+
textAreaRef.value?.validateOnSubmit()
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
return { args, value, textAreaRef }
|
|
219
|
+
},
|
|
220
|
+
template: `
|
|
221
|
+
<div class="pa-4">
|
|
222
|
+
<SyTextArea
|
|
223
|
+
ref="textAreaRef"
|
|
224
|
+
v-model="value"
|
|
225
|
+
v-bind="args"
|
|
226
|
+
:custom-success-rules="[
|
|
227
|
+
{
|
|
228
|
+
type: 'custom',
|
|
229
|
+
options: {
|
|
230
|
+
validate: (v) => v.length >= 20,
|
|
231
|
+
successMessage: 'Description suffisamment détaillée.'
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
]"
|
|
235
|
+
/>
|
|
236
|
+
</div>
|
|
237
|
+
`,
|
|
238
|
+
}),
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
export const NoSuccessMessage: Story = {
|
|
242
|
+
parameters: {
|
|
243
|
+
docs: {
|
|
244
|
+
description: {
|
|
245
|
+
story: 'Avec `showSuccessMessages: false`, l\'état visuel de succès reste actif (bordure verte, icône) mais le message texte n\'est pas affiché. Utile quand un retour positif silencieux est suffisant.',
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
sourceCode: [
|
|
249
|
+
{
|
|
250
|
+
name: 'Template',
|
|
251
|
+
code: `
|
|
252
|
+
<template>
|
|
253
|
+
<SyTextArea
|
|
254
|
+
ref="textAreaRef"
|
|
255
|
+
v-model="value"
|
|
256
|
+
label="Commentaire"
|
|
257
|
+
:show-success-messages="false"
|
|
258
|
+
:custom-success-rules="[
|
|
259
|
+
{
|
|
260
|
+
type: 'custom',
|
|
261
|
+
options: {
|
|
262
|
+
validate: (v) => v.length >= 20,
|
|
263
|
+
successMessage: 'Description suffisamment détaillée.'
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
]"
|
|
267
|
+
/>
|
|
268
|
+
</template>`,
|
|
269
|
+
},
|
|
270
|
+
{
|
|
271
|
+
name: 'Script',
|
|
272
|
+
code: `
|
|
273
|
+
<script setup lang="ts">
|
|
274
|
+
import { onMounted, ref } from 'vue'
|
|
275
|
+
import { SyTextArea } from '@cnamts/synapse'
|
|
276
|
+
|
|
277
|
+
const value = ref('Voici une description bien détaillée du problème rencontré.')
|
|
278
|
+
const textAreaRef = ref(null)
|
|
279
|
+
|
|
280
|
+
onMounted(() => {
|
|
281
|
+
textAreaRef.value?.validateOnSubmit()
|
|
282
|
+
})
|
|
283
|
+
</script>`,
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
},
|
|
287
|
+
args: {
|
|
288
|
+
'label': 'Commentaire',
|
|
289
|
+
'showSuccessMessages': false,
|
|
290
|
+
'onUpdate:modelValue': fn(),
|
|
291
|
+
},
|
|
292
|
+
render: args => ({
|
|
293
|
+
components: { SyTextArea },
|
|
294
|
+
setup() {
|
|
295
|
+
const value = ref('Voici une description bien détaillée du problème rencontré.')
|
|
296
|
+
const textAreaRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
|
|
297
|
+
|
|
298
|
+
onMounted(() => {
|
|
299
|
+
textAreaRef.value?.validateOnSubmit()
|
|
300
|
+
})
|
|
301
|
+
|
|
302
|
+
return { args, value, textAreaRef }
|
|
303
|
+
},
|
|
304
|
+
template: `
|
|
305
|
+
<div class="pa-4">
|
|
306
|
+
<SyTextArea
|
|
307
|
+
ref="textAreaRef"
|
|
308
|
+
v-model="value"
|
|
309
|
+
v-bind="args"
|
|
310
|
+
:custom-success-rules="[
|
|
311
|
+
{
|
|
312
|
+
type: 'custom',
|
|
313
|
+
options: {
|
|
314
|
+
validate: (v) => v.length >= 20,
|
|
315
|
+
successMessage: 'Description suffisamment détaillée.'
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
]"
|
|
319
|
+
/>
|
|
320
|
+
</div>
|
|
321
|
+
`,
|
|
322
|
+
}),
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
export const NoValidateOnBlur: Story = {
|
|
326
|
+
parameters: {
|
|
327
|
+
docs: {
|
|
328
|
+
description: {
|
|
329
|
+
story: 'Avec `isValidateOnBlur: false`, la validation se déclenche **immédiatement** dès que la valeur change. Dans cette story, l\'état de validation est volontairement conservé uniquement pour les changements déclenchés par les boutons. Une saisie directe dans le textarea met donc à jour la valeur, puis réinitialise aussitôt les messages et l\'état visuel.',
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
sourceCode: [
|
|
333
|
+
{
|
|
334
|
+
name: 'Template',
|
|
335
|
+
code: `
|
|
336
|
+
<template>
|
|
337
|
+
<div class="d-flex flex-column gap-4 pa-4">
|
|
338
|
+
<SyTextArea
|
|
339
|
+
ref="textAreaRef"
|
|
340
|
+
:model-value="value"
|
|
341
|
+
label="Description"
|
|
342
|
+
:is-validate-on-blur="false"
|
|
343
|
+
:custom-rules="[{
|
|
344
|
+
type: 'custom',
|
|
345
|
+
options: {
|
|
346
|
+
validate: (v) => v !== 'Contenu interdit',
|
|
347
|
+
message: 'Le contenu « Contenu interdit » n\\'est pas autorisé.'
|
|
348
|
+
}
|
|
349
|
+
}]"
|
|
350
|
+
@update:model-value="handleManualChange"
|
|
351
|
+
/>
|
|
352
|
+
<div class="d-flex gap-4 mt-2">
|
|
353
|
+
<VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('Contenu interdit')">Définir une valeur invalide</VBtn>
|
|
354
|
+
<VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('Contenu valide')">Définir une valeur valide</VBtn>
|
|
355
|
+
<VBtn @mousedown.prevent @click="applyButtonValue('')">Réinitialiser</VBtn>
|
|
356
|
+
</div>
|
|
357
|
+
</div>
|
|
358
|
+
</template>`,
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
name: 'Script',
|
|
362
|
+
code: `
|
|
363
|
+
<script setup lang="ts">
|
|
364
|
+
import { nextTick, ref } from 'vue'
|
|
365
|
+
import { SyTextArea } from '@cnamts/synapse'
|
|
366
|
+
import { VBtn } from 'vuetify/components'
|
|
367
|
+
|
|
368
|
+
const value = ref('')
|
|
369
|
+
const textAreaRef = ref(null)
|
|
370
|
+
const isButtonDrivenChange = ref(false)
|
|
371
|
+
|
|
372
|
+
const handleManualChange = async (newValue) => {
|
|
373
|
+
value.value = newValue
|
|
374
|
+
if (isButtonDrivenChange.value) {
|
|
375
|
+
isButtonDrivenChange.value = false
|
|
376
|
+
return
|
|
377
|
+
}
|
|
378
|
+
await nextTick()
|
|
379
|
+
textAreaRef.value?.clearValidation()
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
const applyButtonValue = (newValue) => {
|
|
383
|
+
isButtonDrivenChange.value = true
|
|
384
|
+
value.value = newValue
|
|
385
|
+
}
|
|
386
|
+
</script>`,
|
|
387
|
+
},
|
|
388
|
+
],
|
|
389
|
+
},
|
|
390
|
+
args: {
|
|
391
|
+
'label': 'Description',
|
|
392
|
+
'isValidateOnBlur': false,
|
|
393
|
+
'onUpdate:modelValue': fn(),
|
|
394
|
+
},
|
|
395
|
+
render: args => ({
|
|
396
|
+
components: { SyTextArea, VBtn },
|
|
397
|
+
setup() {
|
|
398
|
+
const value = ref('')
|
|
399
|
+
const textAreaRef = ref<{ clearValidation: () => void } | null>(null)
|
|
400
|
+
const isButtonDrivenChange = ref(false)
|
|
401
|
+
|
|
402
|
+
const handleManualChange = async (newValue: string) => {
|
|
403
|
+
value.value = newValue
|
|
404
|
+
if (isButtonDrivenChange.value) {
|
|
405
|
+
isButtonDrivenChange.value = false
|
|
406
|
+
return
|
|
407
|
+
}
|
|
408
|
+
await nextTick()
|
|
409
|
+
textAreaRef.value?.clearValidation()
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
const applyButtonValue = (newValue: string) => {
|
|
413
|
+
isButtonDrivenChange.value = true
|
|
414
|
+
value.value = newValue
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
return { args, value, textAreaRef, handleManualChange, applyButtonValue }
|
|
418
|
+
},
|
|
419
|
+
template: `
|
|
420
|
+
<div class="d-flex flex-column gap-4 pa-4">
|
|
421
|
+
<SyTextArea
|
|
422
|
+
ref="textAreaRef"
|
|
423
|
+
:model-value="value"
|
|
424
|
+
v-bind="args"
|
|
425
|
+
:custom-rules="[{
|
|
426
|
+
type: 'custom',
|
|
427
|
+
options: {
|
|
428
|
+
validate: (v) => v !== 'Contenu interdit',
|
|
429
|
+
message: 'Le contenu « Contenu interdit » n\\'est pas autorisé.'
|
|
430
|
+
}
|
|
431
|
+
}]"
|
|
432
|
+
@update:model-value="handleManualChange"
|
|
433
|
+
/>
|
|
434
|
+
<div class="d-flex gap-4 mt-2">
|
|
435
|
+
<VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('Contenu interdit')">Définir une valeur invalide</VBtn>
|
|
436
|
+
<VBtn color="primary" class="mr-1" @mousedown.prevent @click="applyButtonValue('Contenu valide')">Définir une valeur valide</VBtn>
|
|
437
|
+
<VBtn @mousedown.prevent @click="applyButtonValue('')">Réinitialiser</VBtn>
|
|
438
|
+
</div>
|
|
439
|
+
</div>
|
|
440
|
+
`,
|
|
441
|
+
}),
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
export const DisableErrorHandling: Story = {
|
|
445
|
+
parameters: {
|
|
446
|
+
docs: {
|
|
447
|
+
description: {
|
|
448
|
+
story: 'Avec `disableErrorHandling: true`, les messages d\'erreur ne sont pas affichés même si des règles échouent. L\'état visuel reste inchangé.',
|
|
449
|
+
},
|
|
450
|
+
},
|
|
451
|
+
},
|
|
452
|
+
render: () => ({
|
|
453
|
+
components: { SyTextArea },
|
|
454
|
+
setup() {
|
|
455
|
+
const valueWithHandling = ref('')
|
|
456
|
+
const valueWithout = ref('')
|
|
457
|
+
|
|
458
|
+
const customRules = [
|
|
459
|
+
{
|
|
460
|
+
type: 'required',
|
|
461
|
+
options: {},
|
|
462
|
+
},
|
|
463
|
+
]
|
|
464
|
+
|
|
465
|
+
const textAreaRef1 = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
|
|
466
|
+
const textAreaRef2 = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
|
|
467
|
+
|
|
468
|
+
onMounted(async () => {
|
|
469
|
+
await nextTick()
|
|
470
|
+
textAreaRef1.value?.validateOnSubmit()
|
|
471
|
+
textAreaRef2.value?.validateOnSubmit()
|
|
472
|
+
})
|
|
473
|
+
|
|
474
|
+
return { valueWithHandling, valueWithout, customRules, textAreaRef1, textAreaRef2 }
|
|
475
|
+
},
|
|
476
|
+
template: `
|
|
477
|
+
<div class="pa-4 d-flex flex-column gap-6">
|
|
478
|
+
<div>
|
|
479
|
+
<p class="text-subtitle-2 mb-2">Avec gestion des erreurs (défaut)</p>
|
|
480
|
+
<SyTextArea
|
|
481
|
+
ref="textAreaRef1"
|
|
482
|
+
v-model="valueWithHandling"
|
|
483
|
+
label="Description"
|
|
484
|
+
:custom-rules="customRules"
|
|
485
|
+
/>
|
|
486
|
+
</div>
|
|
487
|
+
<div>
|
|
488
|
+
<p class="text-subtitle-2 mb-2">Sans gestion des erreurs (disableErrorHandling)</p>
|
|
489
|
+
<SyTextArea
|
|
490
|
+
ref="textAreaRef2"
|
|
491
|
+
v-model="valueWithout"
|
|
492
|
+
label="Description"
|
|
493
|
+
:custom-rules="customRules"
|
|
494
|
+
disable-error-handling
|
|
495
|
+
/>
|
|
496
|
+
</div>
|
|
497
|
+
</div>
|
|
498
|
+
`,
|
|
499
|
+
}),
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
export const SyFormValidation: Story = {
|
|
503
|
+
parameters: {
|
|
504
|
+
docs: {
|
|
505
|
+
description: {
|
|
506
|
+
story: 'Le composant s\'enregistre automatiquement auprès de `SyForm` via `useValidatable`. Le champ reste neutre au chargement, puis la soumission déclenche la validation.',
|
|
507
|
+
},
|
|
508
|
+
},
|
|
509
|
+
sourceCode: [
|
|
510
|
+
{
|
|
511
|
+
name: 'Template',
|
|
512
|
+
code: `
|
|
513
|
+
<template>
|
|
514
|
+
<SyForm @submit="onSubmit">
|
|
515
|
+
<SyTextArea
|
|
516
|
+
v-model="value"
|
|
517
|
+
label="Description obligatoire"
|
|
518
|
+
required
|
|
519
|
+
display-asterisk
|
|
520
|
+
class="mb-4"
|
|
521
|
+
/>
|
|
522
|
+
<VBtn type="submit" color="primary">Soumettre</VBtn>
|
|
523
|
+
</SyForm>
|
|
524
|
+
</template>`,
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
name: 'Script',
|
|
528
|
+
code: `
|
|
529
|
+
<script setup lang="ts">
|
|
530
|
+
import { ref } from 'vue'
|
|
531
|
+
import { SyTextArea, SyForm } from '@cnamts/synapse'
|
|
532
|
+
import { VBtn } from 'vuetify/components'
|
|
533
|
+
|
|
534
|
+
const value = ref('')
|
|
535
|
+
|
|
536
|
+
function onSubmit(event: { isValid: boolean }) {
|
|
537
|
+
if (event.isValid) {
|
|
538
|
+
alert('Formulaire valide : ' + value.value)
|
|
539
|
+
} else {
|
|
540
|
+
alert('Formulaire invalide.')
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
</script>`,
|
|
544
|
+
},
|
|
545
|
+
],
|
|
546
|
+
},
|
|
547
|
+
args: {
|
|
548
|
+
'label': 'Description obligatoire',
|
|
549
|
+
'required': true,
|
|
550
|
+
'displayAsterisk': true,
|
|
551
|
+
'onUpdate:modelValue': fn(),
|
|
552
|
+
},
|
|
553
|
+
render: args => ({
|
|
554
|
+
components: { SyTextArea, SyForm, VBtn },
|
|
555
|
+
setup() {
|
|
556
|
+
const value = ref('')
|
|
557
|
+
|
|
558
|
+
function onSubmit(event: { isValid: boolean }) {
|
|
559
|
+
if (event.isValid) {
|
|
560
|
+
alert(`Formulaire valide : ${value.value}`)
|
|
561
|
+
}
|
|
562
|
+
else {
|
|
563
|
+
alert('Formulaire invalide.')
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
return { args, value, onSubmit }
|
|
568
|
+
},
|
|
569
|
+
template: `
|
|
570
|
+
<div class="pa-4">
|
|
571
|
+
<SyForm @submit="onSubmit">
|
|
572
|
+
<SyTextArea
|
|
573
|
+
v-model="value"
|
|
574
|
+
label="Description obligatoire"
|
|
575
|
+
:required="true"
|
|
576
|
+
:display-asterisk="true"
|
|
577
|
+
class="mb-4"
|
|
578
|
+
/>
|
|
579
|
+
<VBtn type="submit" color="primary">Soumettre</VBtn>
|
|
580
|
+
</SyForm>
|
|
581
|
+
</div>
|
|
582
|
+
`,
|
|
583
|
+
}),
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
export const VFormValidation: Story = {
|
|
587
|
+
parameters: {
|
|
588
|
+
docs: {
|
|
589
|
+
description: {
|
|
590
|
+
story: 'Intégration avec `VForm` natif Vuetify en conservant la validation Synapse. Le formulaire est rendu avec `novalidate` pour désactiver la validation HTML native du `textarea`. Le champ reste neutre au chargement, puis la soumission appelle `validateOnSubmit()` manuellement.',
|
|
591
|
+
},
|
|
592
|
+
},
|
|
593
|
+
sourceCode: [
|
|
594
|
+
{
|
|
595
|
+
name: 'Template',
|
|
596
|
+
code: `
|
|
597
|
+
<template>
|
|
598
|
+
<VForm novalidate @submit.prevent="onSubmit">
|
|
599
|
+
<SyTextArea
|
|
600
|
+
ref="textAreaRef"
|
|
601
|
+
v-model="value"
|
|
602
|
+
label="Description obligatoire"
|
|
603
|
+
required
|
|
604
|
+
display-asterisk
|
|
605
|
+
class="mb-4"
|
|
606
|
+
/>
|
|
607
|
+
<VBtn type="submit" color="primary">Soumettre</VBtn>
|
|
608
|
+
</VForm>
|
|
609
|
+
</template>`,
|
|
610
|
+
},
|
|
611
|
+
{
|
|
612
|
+
name: 'Script',
|
|
613
|
+
code: `
|
|
614
|
+
<script setup lang="ts">
|
|
615
|
+
import { ref } from 'vue'
|
|
616
|
+
import { SyTextArea } from '@cnamts/synapse'
|
|
617
|
+
import { VBtn, VForm } from 'vuetify/components'
|
|
618
|
+
|
|
619
|
+
const value = ref('')
|
|
620
|
+
const textAreaRef = ref(null)
|
|
621
|
+
|
|
622
|
+
async function onSubmit() {
|
|
623
|
+
const isValid = await textAreaRef.value?.validateOnSubmit()
|
|
624
|
+
if (isValid) {
|
|
625
|
+
alert('Formulaire valide : ' + value.value)
|
|
626
|
+
} else {
|
|
627
|
+
alert('Formulaire invalide.')
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
</script>`,
|
|
631
|
+
},
|
|
632
|
+
],
|
|
633
|
+
},
|
|
634
|
+
args: {
|
|
635
|
+
'label': 'Description obligatoire',
|
|
636
|
+
'required': true,
|
|
637
|
+
'displayAsterisk': true,
|
|
638
|
+
'onUpdate:modelValue': fn(),
|
|
639
|
+
},
|
|
640
|
+
render: args => ({
|
|
641
|
+
components: { SyTextArea, VBtn, VForm },
|
|
642
|
+
setup() {
|
|
643
|
+
const value = ref('')
|
|
644
|
+
const textAreaRef = ref<{ validateOnSubmit: () => Promise<boolean> } | null>(null)
|
|
645
|
+
|
|
646
|
+
async function onSubmit() {
|
|
647
|
+
const isValid = await textAreaRef.value?.validateOnSubmit()
|
|
648
|
+
if (isValid) {
|
|
649
|
+
alert(`Formulaire valide : ${value.value}`)
|
|
650
|
+
}
|
|
651
|
+
else {
|
|
652
|
+
alert('Formulaire invalide.')
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
return { args, value, textAreaRef, onSubmit }
|
|
657
|
+
},
|
|
658
|
+
template: `
|
|
659
|
+
<div class="pa-4">
|
|
660
|
+
<VForm novalidate @submit.prevent="onSubmit">
|
|
661
|
+
<SyTextArea
|
|
662
|
+
ref="textAreaRef"
|
|
663
|
+
v-model="value"
|
|
664
|
+
label="Description obligatoire"
|
|
665
|
+
:required="true"
|
|
666
|
+
:display-asterisk="true"
|
|
667
|
+
class="mb-4"
|
|
668
|
+
/>
|
|
669
|
+
<VBtn type="submit" color="primary">Soumettre</VBtn>
|
|
670
|
+
</VForm>
|
|
671
|
+
</div>
|
|
672
|
+
`,
|
|
673
|
+
}),
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
export const SyFormVuetifyValidation: Story = {
|
|
677
|
+
parameters: {
|
|
678
|
+
docs: {
|
|
679
|
+
description: {
|
|
680
|
+
story: 'Validation native Vuetify (`useVuetifyValidation`) intégrée dans `SyForm`. Les règles sont définies au format Vuetify : des fonctions retournant `true` ou un message d\'erreur.',
|
|
681
|
+
},
|
|
682
|
+
},
|
|
683
|
+
sourceCode: [
|
|
684
|
+
{
|
|
685
|
+
name: 'Template',
|
|
686
|
+
code: `
|
|
687
|
+
<template>
|
|
688
|
+
<SyForm @submit="onSubmit">
|
|
689
|
+
<SyTextArea
|
|
690
|
+
v-model="value"
|
|
691
|
+
label="Description"
|
|
692
|
+
use-vuetify-validation
|
|
693
|
+
validate-on="submit"
|
|
694
|
+
:show-success-messages="false"
|
|
695
|
+
:rules="[v => !!v || 'Ce champ est requis']"
|
|
696
|
+
class="mb-4"
|
|
697
|
+
/>
|
|
698
|
+
<VBtn type="submit" color="primary">Soumettre</VBtn>
|
|
699
|
+
</SyForm>
|
|
700
|
+
</template>`,
|
|
701
|
+
},
|
|
702
|
+
{
|
|
703
|
+
name: 'Script',
|
|
704
|
+
code: `
|
|
705
|
+
<script setup lang="ts">
|
|
706
|
+
import { ref } from 'vue'
|
|
707
|
+
import { SyTextArea, SyForm } from '@cnamts/synapse'
|
|
708
|
+
import { VBtn } from 'vuetify/components'
|
|
709
|
+
|
|
710
|
+
const value = ref('')
|
|
711
|
+
|
|
712
|
+
function onSubmit(event: { isValid: boolean }) {
|
|
713
|
+
if (event.isValid) {
|
|
714
|
+
alert('Formulaire valide : ' + value.value)
|
|
715
|
+
} else {
|
|
716
|
+
alert('Formulaire invalide.')
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
</script>`,
|
|
720
|
+
},
|
|
721
|
+
],
|
|
722
|
+
},
|
|
723
|
+
args: {
|
|
724
|
+
'label': 'Description',
|
|
725
|
+
'useVuetifyValidation': true,
|
|
726
|
+
'validateOn': 'submit',
|
|
727
|
+
'showSuccessMessages': false,
|
|
728
|
+
'onUpdate:modelValue': fn(),
|
|
729
|
+
},
|
|
730
|
+
render: args => ({
|
|
731
|
+
components: { SyTextArea, SyForm, VBtn },
|
|
732
|
+
setup() {
|
|
733
|
+
const value = ref('')
|
|
734
|
+
const rules = [
|
|
735
|
+
(v: string) => !!v || 'Ce champ est requis',
|
|
736
|
+
]
|
|
737
|
+
|
|
738
|
+
function onSubmit(event: { isValid: boolean }) {
|
|
739
|
+
if (event.isValid) {
|
|
740
|
+
alert(`Formulaire valide : ${value.value}`)
|
|
741
|
+
}
|
|
742
|
+
else {
|
|
743
|
+
alert('Formulaire invalide.')
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
return { args, value, rules, onSubmit }
|
|
748
|
+
},
|
|
749
|
+
template: `
|
|
750
|
+
<div class="pa-4">
|
|
751
|
+
<SyForm @submit="onSubmit">
|
|
752
|
+
<SyTextArea
|
|
753
|
+
v-model="value"
|
|
754
|
+
v-bind="args"
|
|
755
|
+
:rules="rules"
|
|
756
|
+
class="mb-4"
|
|
757
|
+
/>
|
|
758
|
+
<VBtn type="submit" color="primary">Soumettre</VBtn>
|
|
759
|
+
</SyForm>
|
|
760
|
+
</div>
|
|
761
|
+
`,
|
|
762
|
+
}),
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
export const VFormVuetifyValidation: Story = {
|
|
766
|
+
parameters: {
|
|
767
|
+
docs: {
|
|
768
|
+
description: {
|
|
769
|
+
story: 'Validation native Vuetify (`useVuetifyValidation`) intégrée dans `VForm`. Les règles sont définies au format Vuetify : des fonctions retournant `true` ou un message d\'erreur.',
|
|
770
|
+
},
|
|
771
|
+
},
|
|
772
|
+
sourceCode: [
|
|
773
|
+
{
|
|
774
|
+
name: 'Template',
|
|
775
|
+
code: `
|
|
776
|
+
<template>
|
|
777
|
+
<VForm ref="form" @submit.prevent="onSubmit">
|
|
778
|
+
<SyTextArea
|
|
779
|
+
v-model="value"
|
|
780
|
+
label="Description"
|
|
781
|
+
use-vuetify-validation
|
|
782
|
+
validate-on="submit"
|
|
783
|
+
:show-success-messages="false"
|
|
784
|
+
:rules="[v => !!v || 'Ce champ est requis']"
|
|
785
|
+
class="mb-4"
|
|
786
|
+
/>
|
|
787
|
+
<VBtn type="submit" color="primary">Soumettre</VBtn>
|
|
788
|
+
</VForm>
|
|
789
|
+
</template>`,
|
|
790
|
+
},
|
|
791
|
+
{
|
|
792
|
+
name: 'Script',
|
|
793
|
+
code: `
|
|
794
|
+
<script setup lang="ts">
|
|
795
|
+
import { ref } from 'vue'
|
|
796
|
+
import { SyTextArea } from '@cnamts/synapse'
|
|
797
|
+
import { VBtn, VForm } from 'vuetify/components'
|
|
798
|
+
|
|
799
|
+
const value = ref('')
|
|
800
|
+
const form = ref<InstanceType<typeof VForm> | null>(null)
|
|
801
|
+
|
|
802
|
+
async function onSubmit() {
|
|
803
|
+
const { valid } = await form.value?.validate() || { valid: false }
|
|
804
|
+
if (valid) {
|
|
805
|
+
alert('Formulaire valide : ' + value.value)
|
|
806
|
+
} else {
|
|
807
|
+
alert('Formulaire invalide.')
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
</script>`,
|
|
811
|
+
},
|
|
812
|
+
],
|
|
813
|
+
},
|
|
814
|
+
args: {
|
|
815
|
+
'label': 'Description',
|
|
816
|
+
'useVuetifyValidation': true,
|
|
817
|
+
'validateOn': 'submit',
|
|
818
|
+
'showSuccessMessages': false,
|
|
819
|
+
'onUpdate:modelValue': fn(),
|
|
820
|
+
},
|
|
821
|
+
render: args => ({
|
|
822
|
+
components: { SyTextArea, VBtn, VForm },
|
|
823
|
+
setup() {
|
|
824
|
+
const value = ref('')
|
|
825
|
+
const form = ref<InstanceType<typeof VForm> | null>(null)
|
|
826
|
+
const rules = [
|
|
827
|
+
(v: string) => !!v || 'Ce champ est requis',
|
|
828
|
+
]
|
|
829
|
+
|
|
830
|
+
async function onSubmit() {
|
|
831
|
+
const { valid } = await form.value?.validate() || { valid: false }
|
|
832
|
+
if (valid) {
|
|
833
|
+
alert(`Formulaire valide : ${value.value}`)
|
|
834
|
+
}
|
|
835
|
+
else {
|
|
836
|
+
alert('Formulaire invalide.')
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
return { args, value, form, rules, onSubmit }
|
|
841
|
+
},
|
|
842
|
+
template: `
|
|
843
|
+
<div class="pa-4">
|
|
844
|
+
<VForm ref="form" @submit.prevent="onSubmit">
|
|
845
|
+
<SyTextArea
|
|
846
|
+
v-model="value"
|
|
847
|
+
v-bind="args"
|
|
848
|
+
:rules="rules"
|
|
849
|
+
class="mb-4"
|
|
850
|
+
/>
|
|
851
|
+
<VBtn type="submit" color="primary">Soumettre</VBtn>
|
|
852
|
+
</VForm>
|
|
853
|
+
</div>
|
|
854
|
+
`,
|
|
855
|
+
}),
|
|
856
|
+
}
|