@portnet/ui 6.0.2 → 6.0.3
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/CHANGELOG.md +652 -0
- package/dist/esm/index.js +72 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/v2/__tests__/AppMain.test.js +130 -0
- package/dist/esm/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js +180 -0
- package/dist/esm/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js +150 -0
- package/dist/esm/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js +93 -0
- package/dist/esm/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldError.test.js +71 -38
- package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FieldNaming.test.js +160 -0
- package/dist/esm/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldWidth.test.js +11 -11
- package/dist/esm/v2/__tests__/FieldWidth.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FileCard.test.js +18 -17
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js +87 -179
- package/dist/esm/v2/__tests__/FormikCheckbox.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js +32 -44
- package/dist/esm/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js +101 -0
- package/dist/esm/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js +118 -199
- package/dist/esm/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +44 -42
- package/dist/esm/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js +165 -0
- package/dist/esm/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js +156 -0
- package/dist/esm/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js +37 -52
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/esm/v2/__tests__/apiError.test.js +50 -69
- package/dist/esm/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/esm/v2/__tests__/banned-patterns.test.js +41 -122
- package/dist/esm/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/esm/v2/__tests__/chart-palette.test.js +204 -0
- package/dist/esm/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/esm/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/esm/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/esm/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/esm/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/esm/v2/__tests__/fileValidation.test.js +134 -0
- package/dist/esm/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js +321 -0
- package/dist/esm/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js +68 -0
- package/dist/esm/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js +218 -0
- package/dist/esm/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/esm/v2/__tests__/labels-merge.test.js +17 -21
- package/dist/esm/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/esm/v2/__tests__/locale-fallback.test.js +35 -40
- package/dist/esm/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js +143 -0
- package/dist/esm/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/esm/v2/__tests__/rowActions.test.js +182 -0
- package/dist/esm/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js +155 -0
- package/dist/esm/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusTrap.test.js +266 -402
- package/dist/esm/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js +120 -0
- package/dist/esm/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/esm/v2/components/Accordion.js +48 -70
- package/dist/esm/v2/components/Accordion.js.map +1 -1
- package/dist/esm/v2/components/ActionStrip.js +31 -43
- package/dist/esm/v2/components/ActionStrip.js.map +1 -1
- package/dist/esm/v2/components/Banner.js +25 -22
- package/dist/esm/v2/components/Banner.js.map +1 -1
- package/dist/esm/v2/components/Busy.js +14 -19
- package/dist/esm/v2/components/Busy.js.map +1 -1
- package/dist/esm/v2/components/Button.js +34 -45
- package/dist/esm/v2/components/Button.js.map +1 -1
- package/dist/esm/v2/components/CategoryTag.js +44 -27
- package/dist/esm/v2/components/CategoryTag.js.map +1 -1
- package/dist/esm/v2/components/Checkbox.js +32 -38
- package/dist/esm/v2/components/Checkbox.js.map +1 -1
- package/dist/esm/v2/components/Chip.js +23 -36
- package/dist/esm/v2/components/Chip.js.map +1 -1
- package/dist/esm/v2/components/Combobox.js +112 -136
- package/dist/esm/v2/components/Combobox.js.map +1 -1
- package/dist/esm/v2/components/CommandPalette.js +113 -198
- package/dist/esm/v2/components/CommandPalette.js.map +1 -1
- package/dist/esm/v2/components/ConfirmDialog.js +36 -45
- package/dist/esm/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/esm/v2/components/DatePicker.js +78 -81
- package/dist/esm/v2/components/DatePicker.js.map +1 -1
- package/dist/esm/v2/components/DateRangePicker.js +63 -74
- package/dist/esm/v2/components/DateRangePicker.js.map +1 -1
- package/dist/esm/v2/components/DateTimePicker.js +81 -86
- package/dist/esm/v2/components/DateTimePicker.js.map +1 -1
- package/dist/esm/v2/components/Drawer.js +71 -65
- package/dist/esm/v2/components/Drawer.js.map +1 -1
- package/dist/esm/v2/components/Dropzone.js +130 -177
- package/dist/esm/v2/components/Dropzone.js.map +1 -1
- package/dist/esm/v2/components/EmptyState.js +9 -9
- package/dist/esm/v2/components/EmptyState.js.map +1 -1
- package/dist/esm/v2/components/FavoriteToggle.js +24 -33
- package/dist/esm/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/esm/v2/components/Field.js +155 -59
- package/dist/esm/v2/components/Field.js.map +1 -1
- package/dist/esm/v2/components/FieldError.js +9 -13
- package/dist/esm/v2/components/FieldError.js.map +1 -1
- package/dist/esm/v2/components/FieldHelp.js +28 -49
- package/dist/esm/v2/components/FieldHelp.js.map +1 -1
- package/dist/esm/v2/components/FileCard.js +14 -19
- package/dist/esm/v2/components/FileCard.js.map +1 -1
- package/dist/esm/v2/components/FilterTab.js +22 -31
- package/dist/esm/v2/components/FilterTab.js.map +1 -1
- package/dist/esm/v2/components/ForbiddenPage.js +28 -8
- package/dist/esm/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/esm/v2/components/FormGrid.js +48 -54
- package/dist/esm/v2/components/FormGrid.js.map +1 -1
- package/dist/esm/v2/components/FormikDisplay.js +98 -24
- package/dist/esm/v2/components/FormikDisplay.js.map +1 -1
- package/dist/esm/v2/components/Input.js +75 -34
- package/dist/esm/v2/components/Input.js.map +1 -1
- package/dist/esm/v2/components/KPICard.js +42 -51
- package/dist/esm/v2/components/KPICard.js.map +1 -1
- package/dist/esm/v2/components/KPIStrip.js +9 -15
- package/dist/esm/v2/components/KPIStrip.js.map +1 -1
- package/dist/esm/v2/components/KV.js +16 -23
- package/dist/esm/v2/components/KV.js.map +1 -1
- package/dist/esm/v2/components/KVGrid.js +15 -23
- package/dist/esm/v2/components/KVGrid.js.map +1 -1
- package/dist/esm/v2/components/Layout.js +81 -117
- package/dist/esm/v2/components/Layout.js.map +1 -1
- package/dist/esm/v2/components/MobileRowCard.js +64 -75
- package/dist/esm/v2/components/MobileRowCard.js.map +1 -1
- package/dist/esm/v2/components/Modal.js +44 -53
- package/dist/esm/v2/components/Modal.js.map +1 -1
- package/dist/esm/v2/components/NetworkErrorPage.js +28 -11
- package/dist/esm/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/esm/v2/components/NotFoundPage.js +28 -9
- package/dist/esm/v2/components/NotFoundPage.js.map +1 -1
- package/dist/esm/v2/components/NumberInput.js +77 -107
- package/dist/esm/v2/components/NumberInput.js.map +1 -1
- package/dist/esm/v2/components/OverflowMenu.js +24 -42
- package/dist/esm/v2/components/OverflowMenu.js.map +1 -1
- package/dist/esm/v2/components/PdfViewer.js +24 -33
- package/dist/esm/v2/components/PdfViewer.js.map +1 -1
- package/dist/esm/v2/components/ProgressBar.js +28 -36
- package/dist/esm/v2/components/ProgressBar.js.map +1 -1
- package/dist/esm/v2/components/Radio.js +49 -57
- package/dist/esm/v2/components/Radio.js.map +1 -1
- package/dist/esm/v2/components/SectionErrorBoundary.js +84 -130
- package/dist/esm/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/esm/v2/components/SectionHeader.js +24 -31
- package/dist/esm/v2/components/SectionHeader.js.map +1 -1
- package/dist/esm/v2/components/Segmented.js +59 -84
- package/dist/esm/v2/components/Segmented.js.map +1 -1
- package/dist/esm/v2/components/Select.js +100 -138
- package/dist/esm/v2/components/Select.js.map +1 -1
- package/dist/esm/v2/components/ServerErrorPage.js +27 -10
- package/dist/esm/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/esm/v2/components/Skeleton.js +81 -96
- package/dist/esm/v2/components/Skeleton.js.map +1 -1
- package/dist/esm/v2/components/SkipLink.js +6 -7
- package/dist/esm/v2/components/SkipLink.js.map +1 -1
- package/dist/esm/v2/components/Spinner.js +13 -22
- package/dist/esm/v2/components/Spinner.js.map +1 -1
- package/dist/esm/v2/components/Status.js +14 -25
- package/dist/esm/v2/components/Status.js.map +1 -1
- package/dist/esm/v2/components/Stepper.js +68 -71
- package/dist/esm/v2/components/Stepper.js.map +1 -1
- package/dist/esm/v2/components/Surface.js +25 -44
- package/dist/esm/v2/components/Surface.js.map +1 -1
- package/dist/esm/v2/components/Switch.js +21 -29
- package/dist/esm/v2/components/Switch.js.map +1 -1
- package/dist/esm/v2/components/TabPanel.js +84 -0
- package/dist/esm/v2/components/TabPanel.js.map +1 -0
- package/dist/esm/v2/components/Tabs.js +43 -19
- package/dist/esm/v2/components/Tabs.js.map +1 -1
- package/dist/esm/v2/components/TelInput.js +75 -108
- package/dist/esm/v2/components/TelInput.js.map +1 -1
- package/dist/esm/v2/components/Textarea.js +21 -30
- package/dist/esm/v2/components/Textarea.js.map +1 -1
- package/dist/esm/v2/components/TimePicker.js +59 -69
- package/dist/esm/v2/components/TimePicker.js.map +1 -1
- package/dist/esm/v2/components/Toast.js +109 -163
- package/dist/esm/v2/components/Toast.js.map +1 -1
- package/dist/esm/v2/components/Tooltip.js +18 -31
- package/dist/esm/v2/components/Tooltip.js.map +1 -1
- package/dist/esm/v2/components/_ErrorPageBody.js +6 -5
- package/dist/esm/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/esm/v2/components/_pickerShared.js +2 -2
- package/dist/esm/v2/components/_pickerShared.js.map +1 -1
- package/dist/esm/v2/components/index.js +37 -0
- package/dist/esm/v2/components/index.js.map +1 -1
- package/dist/esm/v2/hooks/index.js +62 -0
- package/dist/esm/v2/hooks/index.js.map +1 -1
- package/dist/esm/v2/hooks/useAppliedFilters.js +112 -0
- package/dist/esm/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js +82 -0
- package/dist/esm/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/esm/v2/hooks/useDelayedFlag.js +5 -19
- package/dist/esm/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/esm/v2/hooks/useDensity.js +13 -17
- package/dist/esm/v2/hooks/useDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusFirstError.js +25 -33
- package/dist/esm/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js +81 -0
- package/dist/esm/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/esm/v2/hooks/useFocusTrap.js +19 -23
- package/dist/esm/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/esm/v2/hooks/useFormAutoSave.js +38 -53
- package/dist/esm/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/esm/v2/hooks/useFormCompletionProgress.js +32 -51
- package/dist/esm/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js +125 -0
- package/dist/esm/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js +99 -0
- package/dist/esm/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/esm/v2/hooks/useResolvedDensity.js +2 -10
- package/dist/esm/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/esm/v2/hooks/useSortedRows.js +3 -5
- package/dist/esm/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/esm/v2/hooks/useTabLoading.js +6 -21
- package/dist/esm/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/esm/v2/index.js +2 -3
- package/dist/esm/v2/index.js.map +1 -1
- package/dist/esm/v2/modalContext.js +2 -2
- package/dist/esm/v2/modalContext.js.map +1 -1
- package/dist/esm/v2/models/favorite.js.map +1 -1
- package/dist/esm/v2/models/personalization.js.map +1 -1
- package/dist/esm/v2/models/referentiel.js.map +1 -1
- package/dist/esm/v2/models/savedFilter.js.map +1 -1
- package/dist/esm/v2/patterns/ActionBar.js +115 -159
- package/dist/esm/v2/patterns/ActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/AppMain.js +108 -0
- package/dist/esm/v2/patterns/AppMain.js.map +1 -0
- package/dist/esm/v2/patterns/BulkActionBar.js +31 -34
- package/dist/esm/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/esm/v2/patterns/ChartFigure.js +151 -0
- package/dist/esm/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js +111 -152
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/ColumnsToggle.js +43 -77
- package/dist/esm/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/esm/v2/patterns/DataGrid.js +221 -255
- package/dist/esm/v2/patterns/DataGrid.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js +76 -94
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridToolbar.js +85 -89
- package/dist/esm/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/esm/v2/patterns/DataGridVirtualized.js +141 -182
- package/dist/esm/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js +26 -30
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/esm/v2/patterns/DetailSplit.js +108 -0
- package/dist/esm/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/esm/v2/patterns/FavoriteColumn.js +15 -17
- package/dist/esm/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/esm/v2/patterns/FavoritesFilter.js +30 -39
- package/dist/esm/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/esm/v2/patterns/FilterTabBar.js +112 -0
- package/dist/esm/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/esm/v2/patterns/FormErrorSummary.js +12 -13
- package/dist/esm/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/esm/v2/patterns/FormPageShell.js +43 -41
- package/dist/esm/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/FormSection.js +30 -38
- package/dist/esm/v2/patterns/FormSection.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckbox.js +29 -39
- package/dist/esm/v2/patterns/FormikCheckbox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js +56 -60
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/esm/v2/patterns/FormikCombobox.js +51 -69
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDatePicker.js +44 -58
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikDateTimePicker.js +44 -58
- package/dist/esm/v2/patterns/FormikDateTimePicker.js.map +1 -1
- package/dist/esm/v2/patterns/FormikErrorFocus.js +22 -23
- package/dist/esm/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/esm/v2/patterns/FormikErrorSummary.js +89 -0
- package/dist/esm/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/esm/v2/patterns/FormikFile.js +94 -78
- package/dist/esm/v2/patterns/FormikFile.js.map +1 -1
- package/dist/esm/v2/patterns/FormikInput.js +40 -53
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -1
- package/dist/esm/v2/patterns/FormikRadioGroup.js +39 -51
- package/dist/esm/v2/patterns/FormikRadioGroup.js.map +1 -1
- package/dist/esm/v2/patterns/FormikReferentielField.js +49 -59
- package/dist/esm/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/FormikSelect.js +64 -87
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/esm/v2/patterns/FormikTextarea.js +30 -46
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +53 -71
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/esm/v2/patterns/NetworkErrorBanner.js +6 -7
- package/dist/esm/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/esm/v2/patterns/PageContent.js +10 -14
- package/dist/esm/v2/patterns/PageContent.js.map +1 -1
- package/dist/esm/v2/patterns/PreviewDrawer.js +153 -0
- package/dist/esm/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/esm/v2/patterns/ReferentielField.js +327 -312
- package/dist/esm/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/esm/v2/patterns/RowFavoriteToggle.js +27 -22
- package/dist/esm/v2/patterns/RowFavoriteToggle.js.map +1 -1
- package/dist/esm/v2/patterns/SaveFilterDialog.js +38 -66
- package/dist/esm/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/esm/v2/patterns/SavedFiltersMenu.js +62 -81
- package/dist/esm/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/esm/v2/patterns/SkeletonPageShell.js +106 -129
- package/dist/esm/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/esm/v2/patterns/SortableHeader.js +22 -45
- package/dist/esm/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/esm/v2/patterns/Tour.js +94 -120
- package/dist/esm/v2/patterns/Tour.js.map +1 -1
- package/dist/esm/v2/patterns/_dataGridShared.js +107 -128
- package/dist/esm/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/esm/v2/patterns/_pickerSerialisation.js +6 -8
- package/dist/esm/v2/patterns/_pickerSerialisation.js.map +1 -1
- package/dist/esm/v2/patterns/_sort.js +17 -33
- package/dist/esm/v2/patterns/_sort.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnReorder.js +122 -160
- package/dist/esm/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/esm/v2/patterns/_useColumnResize.js +78 -96
- package/dist/esm/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/esm/v2/patterns/filterCriteria.js +102 -0
- package/dist/esm/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/esm/v2/patterns/index.js +152 -0
- package/dist/esm/v2/patterns/index.js.map +1 -1
- package/dist/esm/v2/patterns/rowActions.js +223 -0
- package/dist/esm/v2/patterns/rowActions.js.map +1 -0
- package/dist/esm/v2/personalization/PersonalizationProvider.js +50 -47
- package/dist/esm/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/esm/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js +22 -23
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js +13 -13
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favorites.js +36 -60
- package/dist/esm/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/favoritesView.js +22 -34
- package/dist/esm/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js +28 -34
- package/dist/esm/v2/personalization/capabilities/gridPreferences.js.map +1 -1
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js +119 -0
- package/dist/esm/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/savedFilters.js +90 -98
- package/dist/esm/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/esm/v2/personalization/createPersonalizationStore.js +78 -181
- package/dist/esm/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/esm/v2/personalization/index.js +17 -0
- package/dist/esm/v2/personalization/index.js.map +1 -1
- package/dist/esm/v2/personalization/personalizationContext.js +9 -9
- package/dist/esm/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/esm/v2/personalization/schema.js +8 -9
- package/dist/esm/v2/personalization/schema.js.map +1 -1
- package/dist/esm/v2/referentiel/ReferentielProvider.js +27 -42
- package/dist/esm/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/esm/v2/referentiel/types.js +2 -0
- package/dist/esm/v2/referentiel/types.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielClient.js +10 -11
- package/dist/esm/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielOptions.js +60 -117
- package/dist/esm/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/esm/v2/referentiel/useReferentielSearch.js +37 -91
- package/dist/esm/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/esm/v2/theme/_brand.js +8 -24
- package/dist/esm/v2/theme/_brand.js.map +1 -1
- package/dist/esm/v2/theme/_brandSecondary.js +8 -24
- package/dist/esm/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/esm/v2/theme/createPortnetTheme.js +51 -61
- package/dist/esm/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/esm/v2/theme/cssVariables.js +62 -69
- package/dist/esm/v2/theme/cssVariables.js.map +1 -1
- package/dist/esm/v2/theme/index.js +5 -5
- package/dist/esm/v2/theme/index.js.map +1 -1
- package/dist/esm/v2/tokens/breakpoints.js +14 -14
- package/dist/esm/v2/tokens/breakpoints.js.map +1 -1
- package/dist/esm/v2/tokens/chart.js +261 -0
- package/dist/esm/v2/tokens/chart.js.map +1 -0
- package/dist/esm/v2/tokens/colors.js +22 -22
- package/dist/esm/v2/tokens/colors.js.map +1 -1
- package/dist/esm/v2/tokens/density.js +62 -7
- package/dist/esm/v2/tokens/density.js.map +1 -1
- package/dist/esm/v2/tokens/index.js +49 -34
- package/dist/esm/v2/tokens/index.js.map +1 -1
- package/dist/esm/v2/tokens/motion.js +12 -20
- package/dist/esm/v2/tokens/motion.js.map +1 -1
- package/dist/esm/v2/tokens/radius.js +1 -1
- package/dist/esm/v2/tokens/radius.js.map +1 -1
- package/dist/esm/v2/tokens/shadows.js +6 -6
- package/dist/esm/v2/tokens/shadows.js.map +1 -1
- package/dist/esm/v2/tokens/spacing.js +2 -2
- package/dist/esm/v2/tokens/spacing.js.map +1 -1
- package/dist/esm/v2/tokens/state.js +1 -1
- package/dist/esm/v2/tokens/state.js.map +1 -1
- package/dist/esm/v2/tokens/statusPalette.js +17 -21
- package/dist/esm/v2/tokens/statusPalette.js.map +1 -1
- package/dist/esm/v2/tokens/tokens.json +6 -1
- package/dist/esm/v2/tokens/typography.js +13 -13
- package/dist/esm/v2/tokens/typography.js.map +1 -1
- package/dist/esm/v2/tokens/zIndex.js +1 -1
- package/dist/esm/v2/tokens/zIndex.js.map +1 -1
- package/dist/esm/v2/types/datagrid.js.map +1 -1
- package/dist/esm/v2/utils/apiError.js +16 -37
- package/dist/esm/v2/utils/apiError.js.map +1 -1
- package/dist/esm/v2/utils/contrast.js +31 -32
- package/dist/esm/v2/utils/contrast.js.map +1 -1
- package/dist/esm/v2/utils/cx.js +5 -25
- package/dist/esm/v2/utils/cx.js.map +1 -1
- package/dist/esm/v2/utils/fileDownload.js +23 -26
- package/dist/esm/v2/utils/fileDownload.js.map +1 -1
- package/dist/esm/v2/utils/fileValidation.js +209 -0
- package/dist/esm/v2/utils/fileValidation.js.map +1 -0
- package/dist/esm/v2/utils/fmtDate.js +111 -0
- package/dist/esm/v2/utils/fmtDate.js.map +1 -0
- package/dist/esm/v2/utils/fmtMoney.js +8 -10
- package/dist/esm/v2/utils/fmtMoney.js.map +1 -1
- package/dist/esm/v2/utils/formikErrors.js +78 -0
- package/dist/esm/v2/utils/formikErrors.js.map +1 -0
- package/dist/esm/v2/utils/index.js +35 -2
- package/dist/esm/v2/utils/index.js.map +1 -1
- package/dist/esm/v2/utils/mergeLabels.js +7 -12
- package/dist/esm/v2/utils/mergeLabels.js.map +1 -1
- package/dist/esm/v2/utils/networkStatus.js +12 -12
- package/dist/esm/v2/utils/networkStatus.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +110 -49
- package/dist/index.js.map +1 -1
- package/dist/v2/__tests__/AppMain.test.js +133 -0
- package/dist/v2/__tests__/AppMain.test.js.map +1 -0
- package/dist/v2/__tests__/ChartFigure.test.js +183 -0
- package/dist/v2/__tests__/ChartFigure.test.js.map +1 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js +153 -0
- package/dist/v2/__tests__/DataGridRowActionsPropagation.test.js.map +1 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js +94 -0
- package/dist/v2/__tests__/DrawerTactileTargets.test.js.map +1 -0
- package/dist/v2/__tests__/FieldError.test.js +82 -49
- package/dist/v2/__tests__/FieldError.test.js.map +1 -1
- package/dist/v2/__tests__/FieldNaming.test.js +161 -0
- package/dist/v2/__tests__/FieldNaming.test.js.map +1 -0
- package/dist/v2/__tests__/FieldWidth.test.js +23 -25
- package/dist/v2/__tests__/FieldWidth.test.js.map +1 -1
- package/dist/v2/__tests__/FileCard.test.js +29 -28
- package/dist/v2/__tests__/FileCard.test.js.map +1 -1
- package/dist/v2/__tests__/FormikCheckbox.test.js +90 -183
- package/dist/v2/__tests__/FormikCheckbox.test.js.map +1 -1
- package/dist/v2/__tests__/FormikDateTimePicker.test.js +38 -48
- package/dist/v2/__tests__/FormikDateTimePicker.test.js.map +1 -1
- package/dist/v2/__tests__/FormikDisplayWidth.test.js +102 -0
- package/dist/v2/__tests__/FormikDisplayWidth.test.js.map +1 -0
- package/dist/v2/__tests__/FormikRadioGroup.test.js +123 -204
- package/dist/v2/__tests__/FormikRadioGroup.test.js.map +1 -1
- package/dist/v2/__tests__/MobileRowCard.test.js +63 -61
- package/dist/v2/__tests__/MobileRowCard.test.js.map +1 -1
- package/dist/v2/__tests__/PreviewDrawer.test.js +169 -0
- package/dist/v2/__tests__/PreviewDrawer.test.js.map +1 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js +159 -0
- package/dist/v2/__tests__/ReferentielFieldContainer.test.js.map +1 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js +53 -68
- package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -1
- package/dist/v2/__tests__/apiError.test.js +50 -69
- package/dist/v2/__tests__/apiError.test.js.map +1 -1
- package/dist/v2/__tests__/banned-patterns.test.js +42 -123
- package/dist/v2/__tests__/banned-patterns.test.js.map +1 -1
- package/dist/v2/__tests__/chart-palette.test.js +205 -0
- package/dist/v2/__tests__/chart-palette.test.js.map +1 -0
- package/dist/v2/__tests__/contrast-palette.test.js +42 -74
- package/dist/v2/__tests__/contrast-palette.test.js.map +1 -1
- package/dist/v2/__tests__/cssVariables.test.js +44 -51
- package/dist/v2/__tests__/cssVariables.test.js.map +1 -1
- package/dist/v2/__tests__/fileValidation.test.js +136 -0
- package/dist/v2/__tests__/fileValidation.test.js.map +1 -0
- package/dist/v2/__tests__/filterCriteria.test.js +324 -0
- package/dist/v2/__tests__/filterCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/fmtDate.test.js +69 -0
- package/dist/v2/__tests__/fmtDate.test.js.map +1 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js +221 -0
- package/dist/v2/__tests__/gap-leakage-refonte.test.js.map +1 -0
- package/dist/v2/__tests__/labels-merge.test.js +23 -27
- package/dist/v2/__tests__/labels-merge.test.js.map +1 -1
- package/dist/v2/__tests__/locale-fallback.test.js +47 -52
- package/dist/v2/__tests__/locale-fallback.test.js.map +1 -1
- package/dist/v2/__tests__/reviveSavedCriteria.test.js +144 -0
- package/dist/v2/__tests__/reviveSavedCriteria.test.js.map +1 -0
- package/dist/v2/__tests__/rowActions.test.js +186 -0
- package/dist/v2/__tests__/rowActions.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js +156 -0
- package/dist/v2/__tests__/useFocusOnRouteChange.test.js.map +1 -0
- package/dist/v2/__tests__/useFocusTrap.test.js +270 -407
- package/dist/v2/__tests__/useFocusTrap.test.js.map +1 -1
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js +123 -0
- package/dist/v2/__tests__/usePrefersReducedMotion.test.js.map +1 -0
- package/dist/v2/components/Accordion.js +60 -82
- package/dist/v2/components/Accordion.js.map +1 -1
- package/dist/v2/components/ActionStrip.js +40 -52
- package/dist/v2/components/ActionStrip.js.map +1 -1
- package/dist/v2/components/Banner.js +42 -41
- package/dist/v2/components/Banner.js.map +1 -1
- package/dist/v2/components/Busy.js +22 -27
- package/dist/v2/components/Busy.js.map +1 -1
- package/dist/v2/components/Button.js +39 -50
- package/dist/v2/components/Button.js.map +1 -1
- package/dist/v2/components/CategoryTag.d.ts.map +1 -1
- package/dist/v2/components/CategoryTag.js +49 -32
- package/dist/v2/components/CategoryTag.js.map +1 -1
- package/dist/v2/components/Checkbox.js +39 -45
- package/dist/v2/components/Checkbox.js.map +1 -1
- package/dist/v2/components/Chip.js +29 -42
- package/dist/v2/components/Chip.js.map +1 -1
- package/dist/v2/components/Combobox.js +122 -144
- package/dist/v2/components/Combobox.js.map +1 -1
- package/dist/v2/components/CommandPalette.js +138 -225
- package/dist/v2/components/CommandPalette.js.map +1 -1
- package/dist/v2/components/ConfirmDialog.js +46 -56
- package/dist/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/v2/components/DatePicker.js +81 -86
- package/dist/v2/components/DatePicker.js.map +1 -1
- package/dist/v2/components/DateRangePicker.js +77 -87
- package/dist/v2/components/DateRangePicker.js.map +1 -1
- package/dist/v2/components/DateTimePicker.js +84 -91
- package/dist/v2/components/DateTimePicker.js.map +1 -1
- package/dist/v2/components/Drawer.d.ts.map +1 -1
- package/dist/v2/components/Drawer.js +93 -88
- package/dist/v2/components/Drawer.js.map +1 -1
- package/dist/v2/components/Dropzone.js +150 -196
- package/dist/v2/components/Dropzone.js.map +1 -1
- package/dist/v2/components/EmptyState.js +18 -20
- package/dist/v2/components/EmptyState.js.map +1 -1
- package/dist/v2/components/FavoriteToggle.js +28 -39
- package/dist/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/v2/components/Field.d.ts +62 -4
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +169 -70
- package/dist/v2/components/Field.js.map +1 -1
- package/dist/v2/components/FieldError.js +18 -21
- package/dist/v2/components/FieldError.js.map +1 -1
- package/dist/v2/components/FieldHelp.js +40 -60
- package/dist/v2/components/FieldHelp.js.map +1 -1
- package/dist/v2/components/FileCard.js +27 -31
- package/dist/v2/components/FileCard.js.map +1 -1
- package/dist/v2/components/FilterTab.js +30 -38
- package/dist/v2/components/FilterTab.js.map +1 -1
- package/dist/v2/components/ForbiddenPage.d.ts +25 -1
- package/dist/v2/components/ForbiddenPage.d.ts.map +1 -1
- package/dist/v2/components/ForbiddenPage.js +37 -17
- package/dist/v2/components/ForbiddenPage.js.map +1 -1
- package/dist/v2/components/FormGrid.js +53 -59
- package/dist/v2/components/FormGrid.js.map +1 -1
- package/dist/v2/components/FormikDisplay.d.ts +50 -1
- package/dist/v2/components/FormikDisplay.d.ts.map +1 -1
- package/dist/v2/components/FormikDisplay.js +108 -33
- package/dist/v2/components/FormikDisplay.js.map +1 -1
- package/dist/v2/components/Input.d.ts +40 -0
- package/dist/v2/components/Input.d.ts.map +1 -1
- package/dist/v2/components/Input.js +81 -41
- package/dist/v2/components/Input.js.map +1 -1
- package/dist/v2/components/KPICard.js +57 -67
- package/dist/v2/components/KPICard.js.map +1 -1
- package/dist/v2/components/KPIStrip.js +16 -22
- package/dist/v2/components/KPIStrip.js.map +1 -1
- package/dist/v2/components/KV.js +25 -31
- package/dist/v2/components/KV.js.map +1 -1
- package/dist/v2/components/KVGrid.js +19 -26
- package/dist/v2/components/KVGrid.js.map +1 -1
- package/dist/v2/components/Layout.js +91 -120
- package/dist/v2/components/Layout.js.map +1 -1
- package/dist/v2/components/MobileRowCard.js +79 -91
- package/dist/v2/components/MobileRowCard.js.map +1 -1
- package/dist/v2/components/Modal.js +61 -69
- package/dist/v2/components/Modal.js.map +1 -1
- package/dist/v2/components/NetworkErrorPage.d.ts +19 -1
- package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -1
- package/dist/v2/components/NetworkErrorPage.js +38 -21
- package/dist/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/v2/components/NotFoundPage.d.ts +17 -1
- package/dist/v2/components/NotFoundPage.d.ts.map +1 -1
- package/dist/v2/components/NotFoundPage.js +37 -18
- package/dist/v2/components/NotFoundPage.js.map +1 -1
- package/dist/v2/components/NumberInput.js +88 -118
- package/dist/v2/components/NumberInput.js.map +1 -1
- package/dist/v2/components/OverflowMenu.js +38 -56
- package/dist/v2/components/OverflowMenu.js.map +1 -1
- package/dist/v2/components/PdfViewer.js +34 -45
- package/dist/v2/components/PdfViewer.js.map +1 -1
- package/dist/v2/components/ProgressBar.js +42 -49
- package/dist/v2/components/ProgressBar.js.map +1 -1
- package/dist/v2/components/Radio.js +59 -67
- package/dist/v2/components/Radio.js.map +1 -1
- package/dist/v2/components/SectionErrorBoundary.js +90 -135
- package/dist/v2/components/SectionErrorBoundary.js.map +1 -1
- package/dist/v2/components/SectionHeader.js +34 -41
- package/dist/v2/components/SectionHeader.js.map +1 -1
- package/dist/v2/components/Segmented.js +69 -93
- package/dist/v2/components/Segmented.js.map +1 -1
- package/dist/v2/components/Select.d.ts +26 -2
- package/dist/v2/components/Select.d.ts.map +1 -1
- package/dist/v2/components/Select.js +120 -155
- package/dist/v2/components/Select.js.map +1 -1
- package/dist/v2/components/ServerErrorPage.d.ts +27 -1
- package/dist/v2/components/ServerErrorPage.d.ts.map +1 -1
- package/dist/v2/components/ServerErrorPage.js +37 -20
- package/dist/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/v2/components/Skeleton.js +86 -100
- package/dist/v2/components/Skeleton.js.map +1 -1
- package/dist/v2/components/SkipLink.js +9 -12
- package/dist/v2/components/SkipLink.js.map +1 -1
- package/dist/v2/components/Spinner.js +16 -25
- package/dist/v2/components/Spinner.js.map +1 -1
- package/dist/v2/components/Status.js +18 -29
- package/dist/v2/components/Status.js.map +1 -1
- package/dist/v2/components/Stepper.js +80 -82
- package/dist/v2/components/Stepper.js.map +1 -1
- package/dist/v2/components/Surface.js +34 -49
- package/dist/v2/components/Surface.js.map +1 -1
- package/dist/v2/components/Switch.js +29 -37
- package/dist/v2/components/Switch.js.map +1 -1
- package/dist/v2/components/TabPanel.d.ts +17 -0
- package/dist/v2/components/TabPanel.d.ts.map +1 -0
- package/dist/v2/components/TabPanel.js +90 -0
- package/dist/v2/components/TabPanel.js.map +1 -0
- package/dist/v2/components/Tabs.d.ts +25 -0
- package/dist/v2/components/Tabs.d.ts.map +1 -1
- package/dist/v2/components/Tabs.js +53 -29
- package/dist/v2/components/Tabs.js.map +1 -1
- package/dist/v2/components/TelInput.js +80 -115
- package/dist/v2/components/TelInput.js.map +1 -1
- package/dist/v2/components/Textarea.js +26 -35
- package/dist/v2/components/Textarea.js.map +1 -1
- package/dist/v2/components/TimePicker.js +62 -74
- package/dist/v2/components/TimePicker.js.map +1 -1
- package/dist/v2/components/Toast.js +119 -174
- package/dist/v2/components/Toast.js.map +1 -1
- package/dist/v2/components/Tooltip.js +23 -38
- package/dist/v2/components/Tooltip.js.map +1 -1
- package/dist/v2/components/_ErrorPageBody.js +15 -16
- package/dist/v2/components/_ErrorPageBody.js.map +1 -1
- package/dist/v2/components/_pickerShared.js +5 -5
- package/dist/v2/components/_pickerShared.js.map +1 -1
- package/dist/v2/components/index.d.ts +40 -1
- package/dist/v2/components/index.d.ts.map +1 -1
- package/dist/v2/components/index.js +153 -136
- package/dist/v2/components/index.js.map +1 -1
- package/dist/v2/hooks/index.d.ts +65 -0
- package/dist/v2/hooks/index.d.ts.map +1 -1
- package/dist/v2/hooks/index.js +63 -24
- package/dist/v2/hooks/index.js.map +1 -1
- package/dist/v2/hooks/useAppliedFilters.d.ts +102 -0
- package/dist/v2/hooks/useAppliedFilters.d.ts.map +1 -0
- package/dist/v2/hooks/useAppliedFilters.js +117 -0
- package/dist/v2/hooks/useAppliedFilters.js.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts +64 -0
- package/dist/v2/hooks/useDebouncedCallback.d.ts.map +1 -0
- package/dist/v2/hooks/useDebouncedCallback.js +87 -0
- package/dist/v2/hooks/useDebouncedCallback.js.map +1 -0
- package/dist/v2/hooks/useDelayedFlag.js +6 -20
- package/dist/v2/hooks/useDelayedFlag.js.map +1 -1
- package/dist/v2/hooks/useDensity.d.ts.map +1 -1
- package/dist/v2/hooks/useDensity.js +14 -18
- package/dist/v2/hooks/useDensity.js.map +1 -1
- package/dist/v2/hooks/useFocusFirstError.js +26 -34
- package/dist/v2/hooks/useFocusFirstError.js.map +1 -1
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts +65 -0
- package/dist/v2/hooks/useFocusOnRouteChange.d.ts.map +1 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js +88 -0
- package/dist/v2/hooks/useFocusOnRouteChange.js.map +1 -0
- package/dist/v2/hooks/useFocusTrap.js +20 -24
- package/dist/v2/hooks/useFocusTrap.js.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.d.ts +4 -4
- package/dist/v2/hooks/useFormAutoSave.d.ts.map +1 -1
- package/dist/v2/hooks/useFormAutoSave.js +39 -54
- package/dist/v2/hooks/useFormAutoSave.js.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.d.ts.map +1 -1
- package/dist/v2/hooks/useFormCompletionProgress.js +33 -52
- package/dist/v2/hooks/useFormCompletionProgress.js.map +1 -1
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts +25 -0
- package/dist/v2/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js +132 -0
- package/dist/v2/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts +56 -0
- package/dist/v2/hooks/usePrefersReducedMotion.d.ts.map +1 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js +105 -0
- package/dist/v2/hooks/usePrefersReducedMotion.js.map +1 -0
- package/dist/v2/hooks/useResolvedDensity.js +5 -13
- package/dist/v2/hooks/useResolvedDensity.js.map +1 -1
- package/dist/v2/hooks/useSortedRows.js +4 -6
- package/dist/v2/hooks/useSortedRows.js.map +1 -1
- package/dist/v2/hooks/useTabLoading.js +7 -22
- package/dist/v2/hooks/useTabLoading.js.map +1 -1
- package/dist/v2/index.js +143 -145
- package/dist/v2/index.js.map +1 -1
- package/dist/v2/modalContext.js +2 -2
- package/dist/v2/modalContext.js.map +1 -1
- package/dist/v2/models/favorite.d.ts +8 -9
- package/dist/v2/models/favorite.d.ts.map +1 -1
- package/dist/v2/models/favorite.js.map +1 -1
- package/dist/v2/models/index.js +4 -4
- package/dist/v2/models/index.js.map +1 -1
- package/dist/v2/models/personalization.d.ts +44 -48
- package/dist/v2/models/personalization.d.ts.map +1 -1
- package/dist/v2/models/personalization.js.map +1 -1
- package/dist/v2/models/referentiel.d.ts +32 -50
- package/dist/v2/models/referentiel.d.ts.map +1 -1
- package/dist/v2/models/referentiel.js.map +1 -1
- package/dist/v2/models/savedFilter.d.ts +8 -17
- package/dist/v2/models/savedFilter.d.ts.map +1 -1
- package/dist/v2/models/savedFilter.js.map +1 -1
- package/dist/v2/patterns/ActionBar.js +152 -187
- package/dist/v2/patterns/ActionBar.js.map +1 -1
- package/dist/v2/patterns/AppMain.d.ts +109 -0
- package/dist/v2/patterns/AppMain.d.ts.map +1 -0
- package/dist/v2/patterns/AppMain.js +115 -0
- package/dist/v2/patterns/AppMain.js.map +1 -0
- package/dist/v2/patterns/BulkActionBar.js +40 -42
- package/dist/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/v2/patterns/ChartFigure.d.ts +124 -0
- package/dist/v2/patterns/ChartFigure.d.ts.map +1 -0
- package/dist/v2/patterns/ChartFigure.js +159 -0
- package/dist/v2/patterns/ChartFigure.js.map +1 -0
- package/dist/v2/patterns/CollapsibleDataGrid.js +138 -174
- package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/v2/patterns/ColumnsToggle.js +60 -94
- package/dist/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/v2/patterns/DataGrid.d.ts.map +1 -1
- package/dist/v2/patterns/DataGrid.js +262 -297
- package/dist/v2/patterns/DataGrid.js.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts +12 -0
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.js +104 -121
- package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/v2/patterns/DataGridToolbar.js +103 -106
- package/dist/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/v2/patterns/DataGridVirtualized.js +179 -217
- package/dist/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js +32 -35
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/v2/patterns/DetailSplit.d.ts +87 -0
- package/dist/v2/patterns/DetailSplit.d.ts.map +1 -0
- package/dist/v2/patterns/DetailSplit.js +116 -0
- package/dist/v2/patterns/DetailSplit.js.map +1 -0
- package/dist/v2/patterns/FavoriteColumn.js +22 -23
- package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/v2/patterns/FavoritesFilter.js +36 -44
- package/dist/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/v2/patterns/FilterTabBar.d.ts +28 -0
- package/dist/v2/patterns/FilterTabBar.d.ts.map +1 -0
- package/dist/v2/patterns/FilterTabBar.js +120 -0
- package/dist/v2/patterns/FilterTabBar.js.map +1 -0
- package/dist/v2/patterns/FormErrorSummary.js +20 -23
- package/dist/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/v2/patterns/FormPageShell.js +53 -50
- package/dist/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/v2/patterns/FormSection.d.ts +8 -3
- package/dist/v2/patterns/FormSection.d.ts.map +1 -1
- package/dist/v2/patterns/FormSection.js +44 -51
- package/dist/v2/patterns/FormSection.js.map +1 -1
- package/dist/v2/patterns/FormikCheckbox.js +36 -45
- package/dist/v2/patterns/FormikCheckbox.js.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts +17 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.js +62 -65
- package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/v2/patterns/FormikCombobox.js +55 -72
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +50 -64
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikDateTimePicker.js +50 -64
- package/dist/v2/patterns/FormikDateTimePicker.js.map +1 -1
- package/dist/v2/patterns/FormikErrorFocus.js +25 -26
- package/dist/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/v2/patterns/FormikErrorSummary.d.ts +74 -0
- package/dist/v2/patterns/FormikErrorSummary.d.ts.map +1 -0
- package/dist/v2/patterns/FormikErrorSummary.js +97 -0
- package/dist/v2/patterns/FormikErrorSummary.js.map +1 -0
- package/dist/v2/patterns/FormikFile.d.ts +14 -1
- package/dist/v2/patterns/FormikFile.d.ts.map +1 -1
- package/dist/v2/patterns/FormikFile.js +99 -83
- package/dist/v2/patterns/FormikFile.js.map +1 -1
- package/dist/v2/patterns/FormikInput.js +45 -58
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikRadioGroup.js +45 -56
- package/dist/v2/patterns/FormikRadioGroup.js.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts +12 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.js +54 -64
- package/dist/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/v2/patterns/FormikSelect.js +70 -92
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js +35 -51
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +60 -80
- package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/v2/patterns/NetworkErrorBanner.js +13 -16
- package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/v2/patterns/PageContent.js +17 -20
- package/dist/v2/patterns/PageContent.js.map +1 -1
- package/dist/v2/patterns/PreviewDrawer.d.ts +49 -0
- package/dist/v2/patterns/PreviewDrawer.d.ts.map +1 -0
- package/dist/v2/patterns/PreviewDrawer.js +159 -0
- package/dist/v2/patterns/PreviewDrawer.js.map +1 -0
- package/dist/v2/patterns/ReferentielField.d.ts +86 -2
- package/dist/v2/patterns/ReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/ReferentielField.js +347 -327
- package/dist/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.d.ts +6 -0
- package/dist/v2/patterns/RowFavoriteToggle.d.ts.map +1 -1
- package/dist/v2/patterns/RowFavoriteToggle.js +38 -30
- package/dist/v2/patterns/RowFavoriteToggle.js.map +1 -1
- package/dist/v2/patterns/SaveFilterDialog.js +50 -77
- package/dist/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/v2/patterns/SavedFiltersMenu.js +89 -107
- package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/v2/patterns/SkeletonPageShell.js +122 -143
- package/dist/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/v2/patterns/SortableHeader.js +35 -57
- package/dist/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/v2/patterns/Tour.js +121 -142
- package/dist/v2/patterns/Tour.js.map +1 -1
- package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -1
- package/dist/v2/patterns/_dataGridShared.js +131 -147
- package/dist/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/v2/patterns/_pickerSerialisation.js +9 -10
- package/dist/v2/patterns/_pickerSerialisation.js.map +1 -1
- package/dist/v2/patterns/_sort.js +17 -33
- package/dist/v2/patterns/_sort.js.map +1 -1
- package/dist/v2/patterns/_useColumnReorder.js +124 -163
- package/dist/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/v2/patterns/_useColumnResize.js +80 -99
- package/dist/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/v2/patterns/filterCriteria.d.ts +78 -0
- package/dist/v2/patterns/filterCriteria.d.ts.map +1 -0
- package/dist/v2/patterns/filterCriteria.js +110 -0
- package/dist/v2/patterns/filterCriteria.js.map +1 -0
- package/dist/v2/patterns/index.d.ts +160 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js +157 -79
- package/dist/v2/patterns/index.js.map +1 -1
- package/dist/v2/patterns/rowActions.d.ts +150 -0
- package/dist/v2/patterns/rowActions.d.ts.map +1 -0
- package/dist/v2/patterns/rowActions.js +232 -0
- package/dist/v2/patterns/rowActions.js.map +1 -0
- package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -1
- package/dist/v2/personalization/PersonalizationProvider.js +57 -53
- package/dist/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/v2/personalization/adapters/_storageKey.js +5 -5
- package/dist/v2/personalization/adapters/_storageKey.js.map +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js +25 -24
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.js +14 -14
- package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/index.js +5 -5
- package/dist/v2/personalization/adapters/index.js.map +1 -1
- package/dist/v2/personalization/capabilities/favorites.js +39 -62
- package/dist/v2/personalization/capabilities/favorites.js.map +1 -1
- package/dist/v2/personalization/capabilities/favoritesView.js +25 -37
- package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/v2/personalization/capabilities/gridPreferences.js +31 -36
- package/dist/v2/personalization/capabilities/gridPreferences.js.map +1 -1
- package/dist/v2/personalization/capabilities/index.js +12 -12
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts +88 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.d.ts.map +1 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js +126 -0
- package/dist/v2/personalization/capabilities/reviveSavedCriteria.js.map +1 -0
- package/dist/v2/personalization/capabilities/savedFilters.js +93 -100
- package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.js +81 -182
- package/dist/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/v2/personalization/index.d.ts +16 -0
- package/dist/v2/personalization/index.d.ts.map +1 -1
- package/dist/v2/personalization/index.js +30 -23
- package/dist/v2/personalization/index.js.map +1 -1
- package/dist/v2/personalization/personalizationContext.js +10 -12
- package/dist/v2/personalization/personalizationContext.js.map +1 -1
- package/dist/v2/personalization/schema.js +8 -9
- package/dist/v2/personalization/schema.js.map +1 -1
- package/dist/v2/referentiel/ReferentielProvider.js +31 -45
- package/dist/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/v2/referentiel/index.js +11 -13
- package/dist/v2/referentiel/index.js.map +1 -1
- package/dist/v2/referentiel/types.d.ts +105 -0
- package/dist/v2/referentiel/types.d.ts.map +1 -0
- package/dist/v2/referentiel/types.js +6 -0
- package/dist/v2/referentiel/types.js.map +1 -0
- package/dist/v2/referentiel/useReferentielClient.js +13 -16
- package/dist/v2/referentiel/useReferentielClient.js.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.d.ts +7 -17
- package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.js +63 -120
- package/dist/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.d.ts +7 -48
- package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.js +40 -95
- package/dist/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/v2/theme/_brand.js +12 -26
- package/dist/v2/theme/_brand.js.map +1 -1
- package/dist/v2/theme/_brandSecondary.js +12 -26
- package/dist/v2/theme/_brandSecondary.js.map +1 -1
- package/dist/v2/theme/createPortnetTheme.js +41 -49
- package/dist/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/v2/theme/cssVariables.d.ts +3 -3
- package/dist/v2/theme/cssVariables.d.ts.map +1 -1
- package/dist/v2/theme/cssVariables.js +65 -70
- package/dist/v2/theme/cssVariables.js.map +1 -1
- package/dist/v2/theme/index.js +10 -10
- package/dist/v2/theme/index.js.map +1 -1
- package/dist/v2/tokens/breakpoints.js +16 -16
- package/dist/v2/tokens/breakpoints.js.map +1 -1
- package/dist/v2/tokens/chart.d.ts +103 -0
- package/dist/v2/tokens/chart.d.ts.map +1 -0
- package/dist/v2/tokens/chart.js +270 -0
- package/dist/v2/tokens/chart.js.map +1 -0
- package/dist/v2/tokens/colors.js +24 -24
- package/dist/v2/tokens/colors.js.map +1 -1
- package/dist/v2/tokens/density.d.ts +104 -0
- package/dist/v2/tokens/density.d.ts.map +1 -1
- package/dist/v2/tokens/density.js +67 -12
- package/dist/v2/tokens/density.js.map +1 -1
- package/dist/v2/tokens/index.d.ts +50 -1
- package/dist/v2/tokens/index.d.ts.map +1 -1
- package/dist/v2/tokens/index.js +116 -68
- package/dist/v2/tokens/index.js.map +1 -1
- package/dist/v2/tokens/motion.js +16 -22
- package/dist/v2/tokens/motion.js.map +1 -1
- package/dist/v2/tokens/radius.js +3 -3
- package/dist/v2/tokens/radius.js.map +1 -1
- package/dist/v2/tokens/shadows.js +8 -8
- package/dist/v2/tokens/shadows.js.map +1 -1
- package/dist/v2/tokens/spacing.js +4 -4
- package/dist/v2/tokens/spacing.js.map +1 -1
- package/dist/v2/tokens/state.js +3 -3
- package/dist/v2/tokens/state.js.map +1 -1
- package/dist/v2/tokens/statusPalette.js +21 -23
- package/dist/v2/tokens/statusPalette.js.map +1 -1
- package/dist/v2/tokens/tokens.json +6 -1
- package/dist/v2/tokens/typography.js +15 -15
- package/dist/v2/tokens/typography.js.map +1 -1
- package/dist/v2/tokens/zIndex.js +3 -3
- package/dist/v2/tokens/zIndex.js.map +1 -1
- package/dist/v2/types/datagrid.d.ts +9 -1
- package/dist/v2/types/datagrid.d.ts.map +1 -1
- package/dist/v2/types/datagrid.js.map +1 -1
- package/dist/v2/types/index.js +2 -2
- package/dist/v2/types/index.js.map +1 -1
- package/dist/v2/utils/apiError.js +16 -37
- package/dist/v2/utils/apiError.js.map +1 -1
- package/dist/v2/utils/contrast.js +31 -32
- package/dist/v2/utils/contrast.js.map +1 -1
- package/dist/v2/utils/cx.js +7 -27
- package/dist/v2/utils/cx.js.map +1 -1
- package/dist/v2/utils/fileDownload.js +25 -28
- package/dist/v2/utils/fileDownload.js.map +1 -1
- package/dist/v2/utils/fileValidation.d.ts +116 -0
- package/dist/v2/utils/fileValidation.d.ts.map +1 -0
- package/dist/v2/utils/fileValidation.js +220 -0
- package/dist/v2/utils/fileValidation.js.map +1 -0
- package/dist/v2/utils/fmtDate.d.ts +103 -0
- package/dist/v2/utils/fmtDate.d.ts.map +1 -0
- package/dist/v2/utils/fmtDate.js +119 -0
- package/dist/v2/utils/fmtDate.js.map +1 -0
- package/dist/v2/utils/fmtMoney.d.ts +3 -3
- package/dist/v2/utils/fmtMoney.d.ts.map +1 -1
- package/dist/v2/utils/fmtMoney.js +9 -11
- package/dist/v2/utils/fmtMoney.js.map +1 -1
- package/dist/v2/utils/formikErrors.d.ts +67 -0
- package/dist/v2/utils/formikErrors.d.ts.map +1 -0
- package/dist/v2/utils/formikErrors.js +85 -0
- package/dist/v2/utils/formikErrors.js.map +1 -0
- package/dist/v2/utils/index.d.ts +5 -0
- package/dist/v2/utils/index.d.ts.map +1 -1
- package/dist/v2/utils/index.js +67 -18
- package/dist/v2/utils/index.js.map +1 -1
- package/dist/v2/utils/mergeLabels.js +9 -14
- package/dist/v2/utils/mergeLabels.js.map +1 -1
- package/dist/v2/utils/networkStatus.js +14 -14
- package/dist/v2/utils/networkStatus.js.map +1 -1
- package/package.json +26 -9
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import { render, screen, waitFor } from "@testing-library/react";
|
|
3
|
+
import userEvent from "@testing-library/user-event";
|
|
4
|
+
import ReferentielField from "../patterns/ReferentielField";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* ReferentielField — `container="drawer"` (S-1) et `searchOnOpen` (S-2).
|
|
8
|
+
*
|
|
9
|
+
* CE QUE CE FICHIER PROTÈGE
|
|
10
|
+
* -------------------------
|
|
11
|
+
* Ces deux capacités ont été ajoutées pour débloquer l'adoption du pattern par
|
|
12
|
+
* des hôtes qui ne pouvaient pas l'utiliser :
|
|
13
|
+
*
|
|
14
|
+
* S-1 — R-M.5 impose un `Drawer` au-delà de 3 champs ou pour du contenu
|
|
15
|
+
* défilable long, ce qu'est un sélecteur à critères + grille paginée.
|
|
16
|
+
* Le conteneur était en dur.
|
|
17
|
+
* S-2 — certaines populations sont courtes et connues (les mandatants d'un
|
|
18
|
+
* transitaire), et la réponse attendue à l'ouverture est la LISTE, pas
|
|
19
|
+
* un formulaire vide.
|
|
20
|
+
*
|
|
21
|
+
* L'assertion centrale n'est pas que la recherche initiale part — c'est
|
|
22
|
+
* qu'elle part UNE SEULE FOIS. `runSearch` dépend de `draft`, donc un effet
|
|
23
|
+
* naïf repartirait à chaque frappe dans un critère : le sélecteur émettrait une
|
|
24
|
+
* requête par caractère, ce que le bouton « Rechercher » existe précisément
|
|
25
|
+
* pour éviter. La garde est un `ref`, et c'est elle que le troisième test
|
|
26
|
+
* exerce.
|
|
27
|
+
*
|
|
28
|
+
* Le corps est UNE expression partagée par les deux conteneurs, donc les tests
|
|
29
|
+
* de contenu ci-dessous valent pour les deux branches par construction. Ce
|
|
30
|
+
* fichier vérifie que la branche drawer rend bien ce corps — pas les internes
|
|
31
|
+
* de `Drawer`, qui ont leurs propres tests.
|
|
32
|
+
*/
|
|
33
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
34
|
+
const LIGNES = [{
|
|
35
|
+
id: 1,
|
|
36
|
+
code: "7108",
|
|
37
|
+
description: "Or sous formes brutes"
|
|
38
|
+
}];
|
|
39
|
+
const COLONNES = [{
|
|
40
|
+
key: "code",
|
|
41
|
+
header: "Code"
|
|
42
|
+
}, {
|
|
43
|
+
key: "description",
|
|
44
|
+
header: "Description"
|
|
45
|
+
}];
|
|
46
|
+
const CRITERES = [{
|
|
47
|
+
name: "code",
|
|
48
|
+
label: "Code"
|
|
49
|
+
}];
|
|
50
|
+
function renderPicker(options) {
|
|
51
|
+
return render(/*#__PURE__*/_jsx(ReferentielField, {
|
|
52
|
+
value: null,
|
|
53
|
+
onChange: () => {},
|
|
54
|
+
search: options.search,
|
|
55
|
+
columns: COLONNES,
|
|
56
|
+
criteria: CRITERES,
|
|
57
|
+
title: "Rechercher un code",
|
|
58
|
+
...(options.container !== undefined ? {
|
|
59
|
+
container: options.container
|
|
60
|
+
} : {}),
|
|
61
|
+
...(options.searchOnOpen !== undefined ? {
|
|
62
|
+
searchOnOpen: options.searchOnOpen
|
|
63
|
+
} : {})
|
|
64
|
+
}));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Ouvre le sélecteur par son trigger (un Input en lecture seule). */
|
|
68
|
+
async function ouvrir() {
|
|
69
|
+
await userEvent.click(screen.getByRole("textbox"));
|
|
70
|
+
}
|
|
71
|
+
describe("ReferentielField — conteneur drawer (S-1)", () => {
|
|
72
|
+
test("rend le corps du sélecteur dans la branche drawer", async () => {
|
|
73
|
+
const search = jest.fn(() => ({
|
|
74
|
+
items: LIGNES,
|
|
75
|
+
total: 1
|
|
76
|
+
}));
|
|
77
|
+
renderPicker({
|
|
78
|
+
container: "drawer",
|
|
79
|
+
searchOnOpen: true,
|
|
80
|
+
search
|
|
81
|
+
});
|
|
82
|
+
await ouvrir();
|
|
83
|
+
|
|
84
|
+
/* Le critère ET la ligne de résultat : c'est le corps commun, pas un
|
|
85
|
+
* détail de `Drawer`. Si la branche ne rendait pas `pickerBody`, ces deux
|
|
86
|
+
* assertions tomberaient. */
|
|
87
|
+
expect(await screen.findByText("Or sous formes brutes")).toBeInTheDocument();
|
|
88
|
+
expect(screen.getByLabelText(/Code/)).toBeInTheDocument();
|
|
89
|
+
});
|
|
90
|
+
test("le défaut reste la modale — aucun appelant existant ne change", async () => {
|
|
91
|
+
const search = jest.fn(() => ({
|
|
92
|
+
items: LIGNES,
|
|
93
|
+
total: 1
|
|
94
|
+
}));
|
|
95
|
+
renderPicker({
|
|
96
|
+
searchOnOpen: true,
|
|
97
|
+
search
|
|
98
|
+
});
|
|
99
|
+
await ouvrir();
|
|
100
|
+
expect(await screen.findByText("Or sous formes brutes")).toBeInTheDocument();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe("ReferentielField — searchOnOpen (S-2)", () => {
|
|
104
|
+
test("cherche à vide dès l'ouverture", async () => {
|
|
105
|
+
const search = jest.fn(() => ({
|
|
106
|
+
items: LIGNES,
|
|
107
|
+
total: 1
|
|
108
|
+
}));
|
|
109
|
+
renderPicker({
|
|
110
|
+
searchOnOpen: true,
|
|
111
|
+
search
|
|
112
|
+
});
|
|
113
|
+
await ouvrir();
|
|
114
|
+
await waitFor(() => expect(search).toHaveBeenCalledTimes(1));
|
|
115
|
+
/* À vide : c'est tout l'objet de la prop — la liste, pas un formulaire. */
|
|
116
|
+
expect(search).toHaveBeenCalledWith(expect.objectContaining({
|
|
117
|
+
criteria: {
|
|
118
|
+
code: ""
|
|
119
|
+
},
|
|
120
|
+
page: 1
|
|
121
|
+
}));
|
|
122
|
+
});
|
|
123
|
+
test("ne cherche pas à l'ouverture quand la prop est absente", async () => {
|
|
124
|
+
const search = jest.fn(() => ({
|
|
125
|
+
items: LIGNES,
|
|
126
|
+
total: 1
|
|
127
|
+
}));
|
|
128
|
+
renderPicker({
|
|
129
|
+
search
|
|
130
|
+
});
|
|
131
|
+
await ouvrir();
|
|
132
|
+
|
|
133
|
+
/* L'état « Aucune recherche » reste le comportement par défaut : la prop
|
|
134
|
+
* est un opt-in, pas un changement de contrat. */
|
|
135
|
+
expect(search).not.toHaveBeenCalled();
|
|
136
|
+
});
|
|
137
|
+
test("UNE SEULE recherche par ouverture, même en saisissant un critère", async () => {
|
|
138
|
+
const search = jest.fn(() => ({
|
|
139
|
+
items: LIGNES,
|
|
140
|
+
total: 1
|
|
141
|
+
}));
|
|
142
|
+
renderPicker({
|
|
143
|
+
searchOnOpen: true,
|
|
144
|
+
search
|
|
145
|
+
});
|
|
146
|
+
await ouvrir();
|
|
147
|
+
await waitFor(() => expect(search).toHaveBeenCalledTimes(1));
|
|
148
|
+
|
|
149
|
+
/* LE test de ce fichier. `runSearch` dépend de `draft` : sans la garde par
|
|
150
|
+
* `ref`, l'effet d'ouverture repartirait à chaque frappe et le sélecteur
|
|
151
|
+
* émettrait une requête par caractère. */
|
|
152
|
+
await userEvent.type(screen.getByLabelText(/Code/), "710");
|
|
153
|
+
expect(search).toHaveBeenCalledTimes(1);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=ReferentielFieldContainer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReferentielFieldContainer.test.js","names":["render","screen","waitFor","userEvent","ReferentielField","jsx","_jsx","LIGNES","id","code","description","COLONNES","key","header","CRITERES","name","label","renderPicker","options","value","onChange","search","columns","criteria","title","container","undefined","searchOnOpen","ouvrir","click","getByRole","describe","test","jest","fn","items","total","expect","findByText","toBeInTheDocument","getByLabelText","toHaveBeenCalledTimes","toHaveBeenCalledWith","objectContaining","page","not","toHaveBeenCalled","type"],"sources":["../../../../src/lib/v2/__tests__/ReferentielFieldContainer.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport { render, screen, waitFor } from \"@testing-library/react\";\r\nimport userEvent from \"@testing-library/user-event\";\r\nimport ReferentielField from \"../patterns/ReferentielField\";\r\nimport type { ReferentielSearchResult } from \"../patterns/ReferentielField\";\r\n\r\n/**\r\n * ReferentielField — `container=\"drawer\"` (S-1) et `searchOnOpen` (S-2).\r\n *\r\n * CE QUE CE FICHIER PROTÈGE\r\n * -------------------------\r\n * Ces deux capacités ont été ajoutées pour débloquer l'adoption du pattern par\r\n * des hôtes qui ne pouvaient pas l'utiliser :\r\n *\r\n * S-1 — R-M.5 impose un `Drawer` au-delà de 3 champs ou pour du contenu\r\n * défilable long, ce qu'est un sélecteur à critères + grille paginée.\r\n * Le conteneur était en dur.\r\n * S-2 — certaines populations sont courtes et connues (les mandatants d'un\r\n * transitaire), et la réponse attendue à l'ouverture est la LISTE, pas\r\n * un formulaire vide.\r\n *\r\n * L'assertion centrale n'est pas que la recherche initiale part — c'est\r\n * qu'elle part UNE SEULE FOIS. `runSearch` dépend de `draft`, donc un effet\r\n * naïf repartirait à chaque frappe dans un critère : le sélecteur émettrait une\r\n * requête par caractère, ce que le bouton « Rechercher » existe précisément\r\n * pour éviter. La garde est un `ref`, et c'est elle que le troisième test\r\n * exerce.\r\n *\r\n * Le corps est UNE expression partagée par les deux conteneurs, donc les tests\r\n * de contenu ci-dessous valent pour les deux branches par construction. Ce\r\n * fichier vérifie que la branche drawer rend bien ce corps — pas les internes\r\n * de `Drawer`, qui ont leurs propres tests.\r\n */\r\n\r\ninterface Ligne {\r\n id: number;\r\n code: string;\r\n description: string;\r\n}\r\n\r\nconst LIGNES: Ligne[] = [\r\n { id: 1, code: \"7108\", description: \"Or sous formes brutes\" },\r\n];\r\n\r\nconst COLONNES = [\r\n { key: \"code\", header: \"Code\" },\r\n { key: \"description\", header: \"Description\" },\r\n];\r\n\r\nconst CRITERES = [{ name: \"code\", label: \"Code\" }];\r\n\r\nfunction renderPicker(options: {\r\n container?: \"modal\" | \"drawer\";\r\n searchOnOpen?: boolean;\r\n search: () => ReferentielSearchResult<Ligne>;\r\n}) {\r\n return render(\r\n <ReferentielField<Ligne>\r\n value={null}\r\n onChange={() => {}}\r\n search={options.search}\r\n columns={COLONNES}\r\n criteria={CRITERES}\r\n title=\"Rechercher un code\"\r\n {...(options.container !== undefined\r\n ? { container: options.container }\r\n : {})}\r\n {...(options.searchOnOpen !== undefined\r\n ? { searchOnOpen: options.searchOnOpen }\r\n : {})}\r\n />\r\n );\r\n}\r\n\r\n/** Ouvre le sélecteur par son trigger (un Input en lecture seule). */\r\nasync function ouvrir(): Promise<void> {\r\n await userEvent.click(screen.getByRole(\"textbox\"));\r\n}\r\n\r\ndescribe(\"ReferentielField — conteneur drawer (S-1)\", () => {\r\n test(\"rend le corps du sélecteur dans la branche drawer\", async () => {\r\n const search = jest.fn(() => ({ items: LIGNES, total: 1 }));\r\n renderPicker({ container: \"drawer\", searchOnOpen: true, search });\r\n\r\n await ouvrir();\r\n\r\n /* Le critère ET la ligne de résultat : c'est le corps commun, pas un\r\n * détail de `Drawer`. Si la branche ne rendait pas `pickerBody`, ces deux\r\n * assertions tomberaient. */\r\n expect(await screen.findByText(\"Or sous formes brutes\")).toBeInTheDocument();\r\n expect(screen.getByLabelText(/Code/)).toBeInTheDocument();\r\n });\r\n\r\n test(\"le défaut reste la modale — aucun appelant existant ne change\", async () => {\r\n const search = jest.fn(() => ({ items: LIGNES, total: 1 }));\r\n renderPicker({ searchOnOpen: true, search });\r\n\r\n await ouvrir();\r\n\r\n expect(await screen.findByText(\"Or sous formes brutes\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"ReferentielField — searchOnOpen (S-2)\", () => {\r\n test(\"cherche à vide dès l'ouverture\", async () => {\r\n const search = jest.fn(() => ({ items: LIGNES, total: 1 }));\r\n renderPicker({ searchOnOpen: true, search });\r\n\r\n await ouvrir();\r\n\r\n await waitFor(() => expect(search).toHaveBeenCalledTimes(1));\r\n /* À vide : c'est tout l'objet de la prop — la liste, pas un formulaire. */\r\n expect(search).toHaveBeenCalledWith(\r\n expect.objectContaining({ criteria: { code: \"\" }, page: 1 })\r\n );\r\n });\r\n\r\n test(\"ne cherche pas à l'ouverture quand la prop est absente\", async () => {\r\n const search = jest.fn(() => ({ items: LIGNES, total: 1 }));\r\n renderPicker({ search });\r\n\r\n await ouvrir();\r\n\r\n /* L'état « Aucune recherche » reste le comportement par défaut : la prop\r\n * est un opt-in, pas un changement de contrat. */\r\n expect(search).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"UNE SEULE recherche par ouverture, même en saisissant un critère\", async () => {\r\n const search = jest.fn(() => ({ items: LIGNES, total: 1 }));\r\n renderPicker({ searchOnOpen: true, search });\r\n\r\n await ouvrir();\r\n await waitFor(() => expect(search).toHaveBeenCalledTimes(1));\r\n\r\n /* LE test de ce fichier. `runSearch` dépend de `draft` : sans la garde par\r\n * `ref`, l'effet d'ouverture repartirait à chaque frappe et le sélecteur\r\n * émettrait une requête par caractère. */\r\n await userEvent.type(screen.getByLabelText(/Code/), \"710\");\r\n\r\n expect(search).toHaveBeenCalledTimes(1);\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
4
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
5
|
-
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) { ; } } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
6
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
7
1
|
import "@testing-library/jest-dom";
|
|
8
2
|
import * as React from "react";
|
|
9
3
|
import { render, screen, fireEvent } from "@testing-library/react";
|
|
@@ -31,23 +25,23 @@ import SectionErrorBoundary from "../components/SectionErrorBoundary";
|
|
|
31
25
|
|
|
32
26
|
/** A component that throws on render, controlled by a prop. */
|
|
33
27
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
34
|
-
function Boom(
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
function Boom({
|
|
29
|
+
shouldThrow = true
|
|
30
|
+
}) {
|
|
37
31
|
if (shouldThrow) throw new Error("payload inattendu: articles.map n'est pas une fonction");
|
|
38
32
|
return /*#__PURE__*/_jsx("div", {
|
|
39
33
|
children: "contenu r\xE9tabli"
|
|
40
34
|
});
|
|
41
35
|
}
|
|
42
|
-
|
|
43
|
-
beforeEach(
|
|
44
|
-
consoleErrorSpy = jest.spyOn(console, "error").mockImplementation(
|
|
36
|
+
let consoleErrorSpy;
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
consoleErrorSpy = jest.spyOn(console, "error").mockImplementation(() => {});
|
|
45
39
|
});
|
|
46
|
-
afterEach(
|
|
40
|
+
afterEach(() => {
|
|
47
41
|
consoleErrorSpy.mockRestore();
|
|
48
42
|
});
|
|
49
|
-
describe("SectionErrorBoundary — containment",
|
|
50
|
-
test("renders children untouched when nothing throws",
|
|
43
|
+
describe("SectionErrorBoundary — containment", () => {
|
|
44
|
+
test("renders children untouched when nothing throws", () => {
|
|
51
45
|
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
52
46
|
title: "Marchandises",
|
|
53
47
|
children: /*#__PURE__*/_jsx("div", {
|
|
@@ -57,7 +51,7 @@ describe("SectionErrorBoundary — containment", function () {
|
|
|
57
51
|
expect(screen.getByText("contenu normal")).toBeInTheDocument();
|
|
58
52
|
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
59
53
|
});
|
|
60
|
-
test("catches a render exception and keeps its SIBLINGS mounted",
|
|
54
|
+
test("catches a render exception and keeps its SIBLINGS mounted", () => {
|
|
61
55
|
/* THE contract. The assertion that matters is not that the banner appears —
|
|
62
56
|
* it is that `sibling` is still in the document. Without a boundary React
|
|
63
57
|
* unmounts the entire tree and BOTH would be gone: that is the blank screen
|
|
@@ -73,22 +67,22 @@ describe("SectionErrorBoundary — containment", function () {
|
|
|
73
67
|
expect(screen.getByText("sibling")).toBeInTheDocument();
|
|
74
68
|
expect(screen.getByRole("alert")).toBeInTheDocument();
|
|
75
69
|
});
|
|
76
|
-
test("names the failing section so the user knows WHAT broke",
|
|
70
|
+
test("names the failing section so the user knows WHAT broke", () => {
|
|
77
71
|
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
78
72
|
title: "Marchandises",
|
|
79
73
|
children: /*#__PURE__*/_jsx(Boom, {})
|
|
80
74
|
}));
|
|
81
75
|
expect(screen.getByRole("alert")).toHaveTextContent("Marchandises");
|
|
82
76
|
});
|
|
83
|
-
test("falls back to a generic label when no title is supplied",
|
|
77
|
+
test("falls back to a generic label when no title is supplied", () => {
|
|
84
78
|
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
85
79
|
children: /*#__PURE__*/_jsx(Boom, {})
|
|
86
80
|
}));
|
|
87
81
|
expect(screen.getByRole("alert")).toHaveTextContent("Section");
|
|
88
82
|
});
|
|
89
83
|
});
|
|
90
|
-
describe("SectionErrorBoundary — user-facing copy (§09.3)",
|
|
91
|
-
test("shows French recovery copy, never a raw exception message",
|
|
84
|
+
describe("SectionErrorBoundary — user-facing copy (§09.3)", () => {
|
|
85
|
+
test("shows French recovery copy, never a raw exception message", () => {
|
|
92
86
|
/* Charter §09.3 forbids exposing technical detail to the user, and a raw JS
|
|
93
87
|
* exception is worse than the "Erreur HTTP 422" the charter uses as its DON'T
|
|
94
88
|
* example. The reference implementation this was promoted from rendered
|
|
@@ -104,8 +98,8 @@ describe("SectionErrorBoundary — user-facing copy (§09.3)", function () {
|
|
|
104
98
|
}));
|
|
105
99
|
expect(screen.getByRole("alert")).toHaveTextContent(/Cette section n'a pas pu s'afficher/);
|
|
106
100
|
});
|
|
107
|
-
test("suppresses the technical detail in production",
|
|
108
|
-
|
|
101
|
+
test("suppresses the technical detail in production", () => {
|
|
102
|
+
const previous = process.env["NODE_ENV"];
|
|
109
103
|
/* Bracket access throughout, matching the component: `process.env` is an index
|
|
110
104
|
* signature and `noPropertyAccessFromIndexSignature` is mandatory. Tests are
|
|
111
105
|
* outside tsconfig.build.json's scope so dot access would have compiled here —
|
|
@@ -122,18 +116,18 @@ describe("SectionErrorBoundary — user-facing copy (§09.3)", function () {
|
|
|
122
116
|
expect(screen.getByRole("alert")).toHaveTextContent(/Cette section n'a pas pu s'afficher/);
|
|
123
117
|
expect(screen.getByRole("alert")).not.toHaveTextContent(/articles\.map/);
|
|
124
118
|
} finally {
|
|
125
|
-
process.env["NODE_ENV"] = previous
|
|
119
|
+
process.env["NODE_ENV"] = previous ?? "test";
|
|
126
120
|
}
|
|
127
121
|
});
|
|
128
122
|
});
|
|
129
|
-
describe("SectionErrorBoundary — retry REMOUNTS",
|
|
130
|
-
test("retry clears the error and re-renders the subtree",
|
|
123
|
+
describe("SectionErrorBoundary — retry REMOUNTS", () => {
|
|
124
|
+
test("retry clears the error and re-renders the subtree", () => {
|
|
131
125
|
/* The re-key on `attempt` is what makes this work. Without it React reuses
|
|
132
126
|
* the instance that threw and retry fails identically — a retry button that
|
|
133
127
|
* cannot succeed is worse than no retry button. `shouldThrow` is read from a
|
|
134
128
|
* mutable holder so the same element throws first and succeeds second,
|
|
135
129
|
* exactly as a transient payload problem would. */
|
|
136
|
-
|
|
130
|
+
const holder = {
|
|
137
131
|
shouldThrow: true
|
|
138
132
|
};
|
|
139
133
|
function Flaky() {
|
|
@@ -153,7 +147,7 @@ describe("SectionErrorBoundary — retry REMOUNTS", function () {
|
|
|
153
147
|
expect(screen.getByText("contenu rétabli")).toBeInTheDocument();
|
|
154
148
|
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
155
149
|
});
|
|
156
|
-
test("a custom retryLabel is used on the button and in the copy",
|
|
150
|
+
test("a custom retryLabel is used on the button and in the copy", () => {
|
|
157
151
|
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
158
152
|
title: "Marchandises",
|
|
159
153
|
retryLabel: "Recharger",
|
|
@@ -165,44 +159,39 @@ describe("SectionErrorBoundary — retry REMOUNTS", function () {
|
|
|
165
159
|
expect(screen.getByRole("alert")).toHaveTextContent(/Recharger/);
|
|
166
160
|
});
|
|
167
161
|
});
|
|
168
|
-
describe("SectionErrorBoundary — reporting and second exit",
|
|
169
|
-
test("calls onError with the error and the component info",
|
|
162
|
+
describe("SectionErrorBoundary — reporting and second exit", () => {
|
|
163
|
+
test("calls onError with the error and the component info", () => {
|
|
170
164
|
/* console.error is invisible in production, so without this hook a boundary
|
|
171
165
|
* silently swallows the only signal an operator would ever get. */
|
|
172
|
-
|
|
166
|
+
const onError = jest.fn();
|
|
173
167
|
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
174
168
|
title: "Marchandises",
|
|
175
169
|
onError: onError,
|
|
176
170
|
children: /*#__PURE__*/_jsx(Boom, {})
|
|
177
171
|
}));
|
|
178
172
|
expect(onError).toHaveBeenCalledTimes(1);
|
|
179
|
-
|
|
180
|
-
_ref3 = _slicedToArray(_ref2, 2),
|
|
181
|
-
err = _ref3[0],
|
|
182
|
-
info = _ref3[1];
|
|
173
|
+
const [err, info] = onError.mock.calls[0];
|
|
183
174
|
expect(err).toBeInstanceOf(Error);
|
|
184
175
|
expect(err.message).toMatch(/articles\.map/);
|
|
185
176
|
expect(info).toHaveProperty("componentStack");
|
|
186
177
|
});
|
|
187
|
-
test("a throwing onError does not take the boundary down with it",
|
|
178
|
+
test("a throwing onError does not take the boundary down with it", () => {
|
|
188
179
|
/* Guard on the guard. A reporter that throws must not defeat the component
|
|
189
180
|
* whose entire purpose is stopping one failure from causing another. */
|
|
190
|
-
|
|
181
|
+
const onError = jest.fn(() => {
|
|
191
182
|
throw new Error("APM indisponible");
|
|
192
183
|
});
|
|
193
|
-
expect(
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}));
|
|
199
|
-
}).not.toThrow();
|
|
184
|
+
expect(() => render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
185
|
+
title: "Marchandises",
|
|
186
|
+
onError: onError,
|
|
187
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
188
|
+
}))).not.toThrow();
|
|
200
189
|
expect(screen.getByRole("alert")).toBeInTheDocument();
|
|
201
190
|
});
|
|
202
|
-
test("renders the optional secondary exit when supplied",
|
|
191
|
+
test("renders the optional secondary exit when supplied", () => {
|
|
203
192
|
/* Only possible since Banner gained secondaryAction (gap G-19). The reference
|
|
204
193
|
* implementation offered no way out when retrying could not help. */
|
|
205
|
-
|
|
194
|
+
const onEscape = jest.fn();
|
|
206
195
|
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
207
196
|
title: "Marchandises",
|
|
208
197
|
secondaryAction: {
|
|
@@ -211,24 +200,20 @@ describe("SectionErrorBoundary — reporting and second exit", function () {
|
|
|
211
200
|
},
|
|
212
201
|
children: /*#__PURE__*/_jsx(Boom, {})
|
|
213
202
|
}));
|
|
214
|
-
|
|
203
|
+
const escape = screen.getByRole("button", {
|
|
215
204
|
name: /Retour à la liste/
|
|
216
205
|
});
|
|
217
206
|
fireEvent.click(escape);
|
|
218
207
|
expect(onEscape).toHaveBeenCalledTimes(1);
|
|
219
208
|
});
|
|
220
|
-
test("logs the section title and the component stack",
|
|
209
|
+
test("logs the section title and the component stack", () => {
|
|
221
210
|
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
222
211
|
title: "Marchandises",
|
|
223
212
|
children: /*#__PURE__*/_jsx(Boom, {})
|
|
224
213
|
}));
|
|
225
214
|
/* Asserted loosely — the point is that an operator grepping logs can find
|
|
226
215
|
* WHICH section failed, not the exact format of the line. */
|
|
227
|
-
|
|
228
|
-
return args.some(function (a) {
|
|
229
|
-
return typeof a === "string" && a.includes("Marchandises");
|
|
230
|
-
});
|
|
231
|
-
});
|
|
216
|
+
const logged = consoleErrorSpy.mock.calls.some(args => args.some(a => typeof a === "string" && a.includes("Marchandises")));
|
|
232
217
|
expect(logged).toBe(true);
|
|
233
218
|
});
|
|
234
219
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SectionErrorBoundary.test.js","names":["React","render","screen","fireEvent","SectionErrorBoundary","jsx","_jsx","jsxs","_jsxs","Boom","_ref","_ref$shouldThrow","shouldThrow","Error","children","consoleErrorSpy","beforeEach","jest","spyOn","console","mockImplementation","afterEach","mockRestore","describe","test","title","expect","getByText","toBeInTheDocument","queryByRole","not","getByRole","toHaveTextContent","previous","process","env","holder","Flaky","click","name","retryLabel","onError","fn","toHaveBeenCalledTimes","_ref2","mock","calls","_ref3","_slicedToArray","err","info","toBeInstanceOf","message","toMatch","toHaveProperty","toThrow","onEscape","secondaryAction","label","onClick","escape","logged","some","args","a","includes","toBe"],"sources":["../../../../src/lib/v2/__tests__/SectionErrorBoundary.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport * as React from \"react\";\r\nimport { render, screen, fireEvent } from \"@testing-library/react\";\r\nimport SectionErrorBoundary from \"../components/SectionErrorBoundary\";\r\n\r\n/**\r\n * SectionErrorBoundary — behaviour tests.\r\n *\r\n * WHY THIS FILE MATTERS MORE THAN MOST\r\n * ------------------------------------\r\n * §10.3 R-G.6 MUST, but the real reason is that this is the one component in the\r\n * library whose ENTIRE contract is a failure path. Every other component can be\r\n * eyeballed in Storybook; this one only does its job when something throws, which\r\n * nobody exercises by hand. And its failure mode is total: if the boundary does\r\n * not catch, React unmounts the whole tree and the user gets a blank screen\r\n * (ISO/IEC 25010 § Reliability — fault tolerance).\r\n *\r\n * jsdom is the right tool here, unusually: catching, re-mounting, logging and\r\n * conditional detail are all logic, not layout.\r\n *\r\n * NOTE ON CONSOLE NOISE — React logs caught errors to console.error itself, on\r\n * top of the boundary's own log. Both are silenced per-test rather than globally\r\n * so a genuine unexpected console.error still surfaces in the other suites.\r\n */\r\n\r\n/** A component that throws on render, controlled by a prop. */\r\nfunction Boom({ shouldThrow = true }: { shouldThrow?: boolean }) {\r\n if (shouldThrow) throw new Error(\"payload inattendu: articles.map n'est pas une fonction\");\r\n return <div>contenu rétabli</div>;\r\n}\r\n\r\nlet consoleErrorSpy: jest.SpyInstance;\r\n\r\nbeforeEach(() => {\r\n consoleErrorSpy = jest.spyOn(console, \"error\").mockImplementation(() => {});\r\n});\r\n\r\nafterEach(() => {\r\n consoleErrorSpy.mockRestore();\r\n});\r\n\r\ndescribe(\"SectionErrorBoundary — containment\", () => {\r\n test(\"renders children untouched when nothing throws\", () => {\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <div>contenu normal</div>\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByText(\"contenu normal\")).toBeInTheDocument();\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"catches a render exception and keeps its SIBLINGS mounted\", () => {\r\n /* THE contract. The assertion that matters is not that the banner appears —\r\n * it is that `sibling` is still in the document. Without a boundary React\r\n * unmounts the entire tree and BOTH would be gone: that is the blank screen\r\n * this component exists to prevent. */\r\n render(\r\n <div>\r\n <div>sibling</div>\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n </div>\r\n );\r\n\r\n expect(screen.getByText(\"sibling\")).toBeInTheDocument();\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"names the failing section so the user knows WHAT broke\", () => {\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\"Marchandises\");\r\n });\r\n\r\n test(\"falls back to a generic label when no title is supplied\", () => {\r\n render(\r\n <SectionErrorBoundary>\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\"Section\");\r\n });\r\n});\r\n\r\ndescribe(\"SectionErrorBoundary — user-facing copy (§09.3)\", () => {\r\n test(\"shows French recovery copy, never a raw exception message\", () => {\r\n /* Charter §09.3 forbids exposing technical detail to the user, and a raw JS\r\n * exception is worse than the \"Erreur HTTP 422\" the charter uses as its DON'T\r\n * example. The reference implementation this was promoted from rendered\r\n * error.message straight into the banner body; this asserts we do not.\r\n *\r\n * NODE_ENV is \"test\" here, not \"production\", so the dev detail block DOES\r\n * render — which is why this test targets the recovery sentence rather than\r\n * asserting the absence of the message. The production-only behaviour is\r\n * asserted separately below. */\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\r\n /Cette section n'a pas pu s'afficher/\r\n );\r\n });\r\n\r\n test(\"suppresses the technical detail in production\", () => {\r\n const previous = process.env[\"NODE_ENV\"];\r\n /* Bracket access throughout, matching the component: `process.env` is an index\r\n * signature and `noPropertyAccessFromIndexSignature` is mandatory. Tests are\r\n * outside tsconfig.build.json's scope so dot access would have compiled here —\r\n * two conventions in neighbouring files is the drift this audit exists to stop.\r\n *\r\n * Assigned rather than replaced wholesale: other suites read NODE_ENV, and the\r\n * finally block restores it even if the assertion throws. */\r\n (process.env as Record<string, string>)[\"NODE_ENV\"] = \"production\";\r\n try {\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\r\n /Cette section n'a pas pu s'afficher/\r\n );\r\n expect(screen.getByRole(\"alert\")).not.toHaveTextContent(/articles\\.map/);\r\n } finally {\r\n (process.env as Record<string, string>)[\"NODE_ENV\"] = previous ?? \"test\";\r\n }\r\n });\r\n});\r\n\r\ndescribe(\"SectionErrorBoundary — retry REMOUNTS\", () => {\r\n test(\"retry clears the error and re-renders the subtree\", () => {\r\n /* The re-key on `attempt` is what makes this work. Without it React reuses\r\n * the instance that threw and retry fails identically — a retry button that\r\n * cannot succeed is worse than no retry button. `shouldThrow` is read from a\r\n * mutable holder so the same element throws first and succeeds second,\r\n * exactly as a transient payload problem would. */\r\n const holder = { shouldThrow: true };\r\n function Flaky() {\r\n return <Boom shouldThrow={holder.shouldThrow} />;\r\n }\r\n\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Flaky />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n\r\n holder.shouldThrow = false;\r\n fireEvent.click(screen.getByRole(\"button\", { name: /Réessayer/ }));\r\n\r\n expect(screen.getByText(\"contenu rétabli\")).toBeInTheDocument();\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"a custom retryLabel is used on the button and in the copy\", () => {\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\" retryLabel=\"Recharger\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"button\", { name: /Recharger/ })).toBeInTheDocument();\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(/Recharger/);\r\n });\r\n});\r\n\r\ndescribe(\"SectionErrorBoundary — reporting and second exit\", () => {\r\n test(\"calls onError with the error and the component info\", () => {\r\n /* console.error is invisible in production, so without this hook a boundary\r\n * silently swallows the only signal an operator would ever get. */\r\n const onError = jest.fn();\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\" onError={onError}>\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n\r\n expect(onError).toHaveBeenCalledTimes(1);\r\n const [err, info] = onError.mock.calls[0] as [Error, React.ErrorInfo];\r\n expect(err).toBeInstanceOf(Error);\r\n expect(err.message).toMatch(/articles\\.map/);\r\n expect(info).toHaveProperty(\"componentStack\");\r\n });\r\n\r\n test(\"a throwing onError does not take the boundary down with it\", () => {\r\n /* Guard on the guard. A reporter that throws must not defeat the component\r\n * whose entire purpose is stopping one failure from causing another. */\r\n const onError = jest.fn(() => {\r\n throw new Error(\"APM indisponible\");\r\n });\r\n\r\n expect(() =>\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\" onError={onError}>\r\n <Boom />\r\n </SectionErrorBoundary>\r\n )\r\n ).not.toThrow();\r\n\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"renders the optional secondary exit when supplied\", () => {\r\n /* Only possible since Banner gained secondaryAction (gap G-19). The reference\r\n * implementation offered no way out when retrying could not help. */\r\n const onEscape = jest.fn();\r\n render(\r\n <SectionErrorBoundary\r\n title=\"Marchandises\"\r\n secondaryAction={{ label: \"Retour à la liste\", onClick: onEscape }}\r\n >\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n\r\n const escape = screen.getByRole(\"button\", { name: /Retour à la liste/ });\r\n fireEvent.click(escape);\r\n expect(onEscape).toHaveBeenCalledTimes(1);\r\n });\r\n\r\n test(\"logs the section title and the component stack\", () => {\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n /* Asserted loosely — the point is that an operator grepping logs can find\r\n * WHICH section failed, not the exact format of the line. */\r\n const logged = consoleErrorSpy.mock.calls.some((args) =>\r\n args.some((a: unknown) => typeof a === \"string\" && a.includes(\"Marchandises\"))\r\n );\r\n expect(logged).toBe(true);\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SectionErrorBoundary.test.js","names":["React","render","screen","fireEvent","SectionErrorBoundary","jsx","_jsx","jsxs","_jsxs","Boom","shouldThrow","Error","children","consoleErrorSpy","beforeEach","jest","spyOn","console","mockImplementation","afterEach","mockRestore","describe","test","title","expect","getByText","toBeInTheDocument","queryByRole","not","getByRole","toHaveTextContent","previous","process","env","holder","Flaky","click","name","retryLabel","onError","fn","toHaveBeenCalledTimes","err","info","mock","calls","toBeInstanceOf","message","toMatch","toHaveProperty","toThrow","onEscape","secondaryAction","label","onClick","escape","logged","some","args","a","includes","toBe"],"sources":["../../../../src/lib/v2/__tests__/SectionErrorBoundary.test.tsx"],"sourcesContent":["import \"@testing-library/jest-dom\";\r\nimport * as React from \"react\";\r\nimport { render, screen, fireEvent } from \"@testing-library/react\";\r\nimport SectionErrorBoundary from \"../components/SectionErrorBoundary\";\r\n\r\n/**\r\n * SectionErrorBoundary — behaviour tests.\r\n *\r\n * WHY THIS FILE MATTERS MORE THAN MOST\r\n * ------------------------------------\r\n * §10.3 R-G.6 MUST, but the real reason is that this is the one component in the\r\n * library whose ENTIRE contract is a failure path. Every other component can be\r\n * eyeballed in Storybook; this one only does its job when something throws, which\r\n * nobody exercises by hand. And its failure mode is total: if the boundary does\r\n * not catch, React unmounts the whole tree and the user gets a blank screen\r\n * (ISO/IEC 25010 § Reliability — fault tolerance).\r\n *\r\n * jsdom is the right tool here, unusually: catching, re-mounting, logging and\r\n * conditional detail are all logic, not layout.\r\n *\r\n * NOTE ON CONSOLE NOISE — React logs caught errors to console.error itself, on\r\n * top of the boundary's own log. Both are silenced per-test rather than globally\r\n * so a genuine unexpected console.error still surfaces in the other suites.\r\n */\r\n\r\n/** A component that throws on render, controlled by a prop. */\r\nfunction Boom({ shouldThrow = true }: { shouldThrow?: boolean }) {\r\n if (shouldThrow) throw new Error(\"payload inattendu: articles.map n'est pas une fonction\");\r\n return <div>contenu rétabli</div>;\r\n}\r\n\r\nlet consoleErrorSpy: jest.SpyInstance;\r\n\r\nbeforeEach(() => {\r\n consoleErrorSpy = jest.spyOn(console, \"error\").mockImplementation(() => {});\r\n});\r\n\r\nafterEach(() => {\r\n consoleErrorSpy.mockRestore();\r\n});\r\n\r\ndescribe(\"SectionErrorBoundary — containment\", () => {\r\n test(\"renders children untouched when nothing throws\", () => {\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <div>contenu normal</div>\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByText(\"contenu normal\")).toBeInTheDocument();\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"catches a render exception and keeps its SIBLINGS mounted\", () => {\r\n /* THE contract. The assertion that matters is not that the banner appears —\r\n * it is that `sibling` is still in the document. Without a boundary React\r\n * unmounts the entire tree and BOTH would be gone: that is the blank screen\r\n * this component exists to prevent. */\r\n render(\r\n <div>\r\n <div>sibling</div>\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n </div>\r\n );\r\n\r\n expect(screen.getByText(\"sibling\")).toBeInTheDocument();\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"names the failing section so the user knows WHAT broke\", () => {\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\"Marchandises\");\r\n });\r\n\r\n test(\"falls back to a generic label when no title is supplied\", () => {\r\n render(\r\n <SectionErrorBoundary>\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\"Section\");\r\n });\r\n});\r\n\r\ndescribe(\"SectionErrorBoundary — user-facing copy (§09.3)\", () => {\r\n test(\"shows French recovery copy, never a raw exception message\", () => {\r\n /* Charter §09.3 forbids exposing technical detail to the user, and a raw JS\r\n * exception is worse than the \"Erreur HTTP 422\" the charter uses as its DON'T\r\n * example. The reference implementation this was promoted from rendered\r\n * error.message straight into the banner body; this asserts we do not.\r\n *\r\n * NODE_ENV is \"test\" here, not \"production\", so the dev detail block DOES\r\n * render — which is why this test targets the recovery sentence rather than\r\n * asserting the absence of the message. The production-only behaviour is\r\n * asserted separately below. */\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\r\n /Cette section n'a pas pu s'afficher/\r\n );\r\n });\r\n\r\n test(\"suppresses the technical detail in production\", () => {\r\n const previous = process.env[\"NODE_ENV\"];\r\n /* Bracket access throughout, matching the component: `process.env` is an index\r\n * signature and `noPropertyAccessFromIndexSignature` is mandatory. Tests are\r\n * outside tsconfig.build.json's scope so dot access would have compiled here —\r\n * two conventions in neighbouring files is the drift this audit exists to stop.\r\n *\r\n * Assigned rather than replaced wholesale: other suites read NODE_ENV, and the\r\n * finally block restores it even if the assertion throws. */\r\n (process.env as Record<string, string>)[\"NODE_ENV\"] = \"production\";\r\n try {\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(\r\n /Cette section n'a pas pu s'afficher/\r\n );\r\n expect(screen.getByRole(\"alert\")).not.toHaveTextContent(/articles\\.map/);\r\n } finally {\r\n (process.env as Record<string, string>)[\"NODE_ENV\"] = previous ?? \"test\";\r\n }\r\n });\r\n});\r\n\r\ndescribe(\"SectionErrorBoundary — retry REMOUNTS\", () => {\r\n test(\"retry clears the error and re-renders the subtree\", () => {\r\n /* The re-key on `attempt` is what makes this work. Without it React reuses\r\n * the instance that threw and retry fails identically — a retry button that\r\n * cannot succeed is worse than no retry button. `shouldThrow` is read from a\r\n * mutable holder so the same element throws first and succeeds second,\r\n * exactly as a transient payload problem would. */\r\n const holder = { shouldThrow: true };\r\n function Flaky() {\r\n return <Boom shouldThrow={holder.shouldThrow} />;\r\n }\r\n\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Flaky />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n\r\n holder.shouldThrow = false;\r\n fireEvent.click(screen.getByRole(\"button\", { name: /Réessayer/ }));\r\n\r\n expect(screen.getByText(\"contenu rétabli\")).toBeInTheDocument();\r\n expect(screen.queryByRole(\"alert\")).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"a custom retryLabel is used on the button and in the copy\", () => {\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\" retryLabel=\"Recharger\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n expect(screen.getByRole(\"button\", { name: /Recharger/ })).toBeInTheDocument();\r\n expect(screen.getByRole(\"alert\")).toHaveTextContent(/Recharger/);\r\n });\r\n});\r\n\r\ndescribe(\"SectionErrorBoundary — reporting and second exit\", () => {\r\n test(\"calls onError with the error and the component info\", () => {\r\n /* console.error is invisible in production, so without this hook a boundary\r\n * silently swallows the only signal an operator would ever get. */\r\n const onError = jest.fn();\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\" onError={onError}>\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n\r\n expect(onError).toHaveBeenCalledTimes(1);\r\n const [err, info] = onError.mock.calls[0] as [Error, React.ErrorInfo];\r\n expect(err).toBeInstanceOf(Error);\r\n expect(err.message).toMatch(/articles\\.map/);\r\n expect(info).toHaveProperty(\"componentStack\");\r\n });\r\n\r\n test(\"a throwing onError does not take the boundary down with it\", () => {\r\n /* Guard on the guard. A reporter that throws must not defeat the component\r\n * whose entire purpose is stopping one failure from causing another. */\r\n const onError = jest.fn(() => {\r\n throw new Error(\"APM indisponible\");\r\n });\r\n\r\n expect(() =>\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\" onError={onError}>\r\n <Boom />\r\n </SectionErrorBoundary>\r\n )\r\n ).not.toThrow();\r\n\r\n expect(screen.getByRole(\"alert\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"renders the optional secondary exit when supplied\", () => {\r\n /* Only possible since Banner gained secondaryAction (gap G-19). The reference\r\n * implementation offered no way out when retrying could not help. */\r\n const onEscape = jest.fn();\r\n render(\r\n <SectionErrorBoundary\r\n title=\"Marchandises\"\r\n secondaryAction={{ label: \"Retour à la liste\", onClick: onEscape }}\r\n >\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n\r\n const escape = screen.getByRole(\"button\", { name: /Retour à la liste/ });\r\n fireEvent.click(escape);\r\n expect(onEscape).toHaveBeenCalledTimes(1);\r\n });\r\n\r\n test(\"logs the section title and the component stack\", () => {\r\n render(\r\n <SectionErrorBoundary title=\"Marchandises\">\r\n <Boom />\r\n </SectionErrorBoundary>\r\n );\r\n /* Asserted loosely — the point is that an operator grepping logs can find\r\n * WHICH section failed, not the exact format of the line. */\r\n const logged = consoleErrorSpy.mock.calls.some((args) =>\r\n args.some((a: unknown) => typeof a === \"string\" && a.includes(\"Marchandises\"))\r\n );\r\n expect(logged).toBe(true);\r\n });\r\n});\r\n"],"mappings":"AAAA,OAAO,2BAA2B;AAClC,OAAO,KAAKA,KAAK,MAAM,OAAO;AAC9B,SAASC,MAAM,EAAEC,MAAM,EAAEC,SAAS,QAAQ,wBAAwB;AAClE,OAAOC,oBAAoB,MAAM,oCAAoC;;AAErE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AACA,SAASC,IAAIA,CAAC;EAAEC,WAAW,GAAG;AAAgC,CAAC,EAAE;EAC/D,IAAIA,WAAW,EAAE,MAAM,IAAIC,KAAK,CAAC,wDAAwD,CAAC;EAC1F,oBAAOL,IAAA;IAAAM,QAAA,EAAK;EAAe,CAAK,CAAC;AACnC;AAEA,IAAIC,eAAiC;AAErCC,UAAU,CAAC,MAAM;EACfD,eAAe,GAAGE,IAAI,CAACC,KAAK,CAACC,OAAO,EAAE,OAAO,CAAC,CAACC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEFC,SAAS,CAAC,MAAM;EACdN,eAAe,CAACO,WAAW,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEFC,QAAQ,CAAC,oCAAoC,EAAE,MAAM;EACnDC,IAAI,CAAC,gDAAgD,EAAE,MAAM;IAC3DrB,MAAM,cACJK,IAAA,CAACF,oBAAoB;MAACmB,KAAK,EAAC,cAAc;MAAAX,QAAA,eACxCN,IAAA;QAAAM,QAAA,EAAK;MAAc,CAAK;IAAC,CACL,CACxB,CAAC;IACDY,MAAM,CAACtB,MAAM,CAACuB,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAACC,iBAAiB,CAAC,CAAC;IAC9DF,MAAM,CAACtB,MAAM,CAACyB,WAAW,CAAC,OAAO,CAAC,CAAC,CAACC,GAAG,CAACF,iBAAiB,CAAC,CAAC;EAC7D,CAAC,CAAC;EAEFJ,IAAI,CAAC,2DAA2D,EAAE,MAAM;IACtE;AACJ;AACA;AACA;IACIrB,MAAM,cACJO,KAAA;MAAAI,QAAA,gBACEN,IAAA;QAAAM,QAAA,EAAK;MAAO,CAAK,CAAC,eAClBN,IAAA,CAACF,oBAAoB;QAACmB,KAAK,EAAC,cAAc;QAAAX,QAAA,eACxCN,IAAA,CAACG,IAAI,IAAE;MAAC,CACY,CAAC;IAAA,CACpB,CACP,CAAC;IAEDe,MAAM,CAACtB,MAAM,CAACuB,SAAS,CAAC,SAAS,CAAC,CAAC,CAACC,iBAAiB,CAAC,CAAC;IACvDF,MAAM,CAACtB,MAAM,CAAC2B,SAAS,CAAC,OAAO,CAAC,CAAC,CAACH,iBAAiB,CAAC,CAAC;EACvD,CAAC,CAAC;EAEFJ,IAAI,CAAC,wDAAwD,EAAE,MAAM;IACnErB,MAAM,cACJK,IAAA,CAACF,oBAAoB;MAACmB,KAAK,EAAC,cAAc;MAAAX,QAAA,eACxCN,IAAA,CAACG,IAAI,IAAE;IAAC,CACY,CACxB,CAAC;IACDe,MAAM,CAACtB,MAAM,CAAC2B,SAAS,CAAC,OAAO,CAAC,CAAC,CAACC,iBAAiB,CAAC,cAAc,CAAC;EACrE,CAAC,CAAC;EAEFR,IAAI,CAAC,yDAAyD,EAAE,MAAM;IACpErB,MAAM,cACJK,IAAA,CAACF,oBAAoB;MAAAQ,QAAA,eACnBN,IAAA,CAACG,IAAI,IAAE;IAAC,CACY,CACxB,CAAC;IACDe,MAAM,CAACtB,MAAM,CAAC2B,SAAS,CAAC,OAAO,CAAC,CAAC,CAACC,iBAAiB,CAAC,SAAS,CAAC;EAChE,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFT,QAAQ,CAAC,iDAAiD,EAAE,MAAM;EAChEC,IAAI,CAAC,2DAA2D,EAAE,MAAM;IACtE;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIrB,MAAM,cACJK,IAAA,CAACF,oBAAoB;MAACmB,KAAK,EAAC,cAAc;MAAAX,QAAA,eACxCN,IAAA,CAACG,IAAI,IAAE;IAAC,CACY,CACxB,CAAC;IACDe,MAAM,CAACtB,MAAM,CAAC2B,SAAS,CAAC,OAAO,CAAC,CAAC,CAACC,iBAAiB,CACjD,qCACF,CAAC;EACH,CAAC,CAAC;EAEFR,IAAI,CAAC,+CAA+C,EAAE,MAAM;IAC1D,MAAMS,QAAQ,GAAGC,OAAO,CAACC,GAAG,CAAC,UAAU,CAAC;IACxC;AACJ;AACA;AACA;AACA;AACA;AACA;IACKD,OAAO,CAACC,GAAG,CAA4B,UAAU,CAAC,GAAG,YAAY;IAClE,IAAI;MACFhC,MAAM,cACJK,IAAA,CAACF,oBAAoB;QAACmB,KAAK,EAAC,cAAc;QAAAX,QAAA,eACxCN,IAAA,CAACG,IAAI,IAAE;MAAC,CACY,CACxB,CAAC;MACDe,MAAM,CAACtB,MAAM,CAAC2B,SAAS,CAAC,OAAO,CAAC,CAAC,CAACC,iBAAiB,CACjD,qCACF,CAAC;MACDN,MAAM,CAACtB,MAAM,CAAC2B,SAAS,CAAC,OAAO,CAAC,CAAC,CAACD,GAAG,CAACE,iBAAiB,CAAC,eAAe,CAAC;IAC1E,CAAC,SAAS;MACPE,OAAO,CAACC,GAAG,CAA4B,UAAU,CAAC,GAAGF,QAAQ,IAAI,MAAM;IAC1E;EACF,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFV,QAAQ,CAAC,uCAAuC,EAAE,MAAM;EACtDC,IAAI,CAAC,mDAAmD,EAAE,MAAM;IAC9D;AACJ;AACA;AACA;AACA;IACI,MAAMY,MAAM,GAAG;MAAExB,WAAW,EAAE;IAAK,CAAC;IACpC,SAASyB,KAAKA,CAAA,EAAG;MACf,oBAAO7B,IAAA,CAACG,IAAI;QAACC,WAAW,EAAEwB,MAAM,CAACxB;MAAY,CAAE,CAAC;IAClD;IAEAT,MAAM,cACJK,IAAA,CAACF,oBAAoB;MAACmB,KAAK,EAAC,cAAc;MAAAX,QAAA,eACxCN,IAAA,CAAC6B,KAAK,IAAE;IAAC,CACW,CACxB,CAAC;IACDX,MAAM,CAACtB,MAAM,CAAC2B,SAAS,CAAC,OAAO,CAAC,CAAC,CAACH,iBAAiB,CAAC,CAAC;IAErDQ,MAAM,CAACxB,WAAW,GAAG,KAAK;IAC1BP,SAAS,CAACiC,KAAK,CAAClC,MAAM,CAAC2B,SAAS,CAAC,QAAQ,EAAE;MAAEQ,IAAI,EAAE;IAAY,CAAC,CAAC,CAAC;IAElEb,MAAM,CAACtB,MAAM,CAACuB,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAACC,iBAAiB,CAAC,CAAC;IAC/DF,MAAM,CAACtB,MAAM,CAACyB,WAAW,CAAC,OAAO,CAAC,CAAC,CAACC,GAAG,CAACF,iBAAiB,CAAC,CAAC;EAC7D,CAAC,CAAC;EAEFJ,IAAI,CAAC,2DAA2D,EAAE,MAAM;IACtErB,MAAM,cACJK,IAAA,CAACF,oBAAoB;MAACmB,KAAK,EAAC,cAAc;MAACe,UAAU,EAAC,WAAW;MAAA1B,QAAA,eAC/DN,IAAA,CAACG,IAAI,IAAE;IAAC,CACY,CACxB,CAAC;IACDe,MAAM,CAACtB,MAAM,CAAC2B,SAAS,CAAC,QAAQ,EAAE;MAAEQ,IAAI,EAAE;IAAY,CAAC,CAAC,CAAC,CAACX,iBAAiB,CAAC,CAAC;IAC7EF,MAAM,CAACtB,MAAM,CAAC2B,SAAS,CAAC,OAAO,CAAC,CAAC,CAACC,iBAAiB,CAAC,WAAW,CAAC;EAClE,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFT,QAAQ,CAAC,kDAAkD,EAAE,MAAM;EACjEC,IAAI,CAAC,qDAAqD,EAAE,MAAM;IAChE;AACJ;IACI,MAAMiB,OAAO,GAAGxB,IAAI,CAACyB,EAAE,CAAC,CAAC;IACzBvC,MAAM,cACJK,IAAA,CAACF,oBAAoB;MAACmB,KAAK,EAAC,cAAc;MAACgB,OAAO,EAAEA,OAAQ;MAAA3B,QAAA,eAC1DN,IAAA,CAACG,IAAI,IAAE;IAAC,CACY,CACxB,CAAC;IAEDe,MAAM,CAACe,OAAO,CAAC,CAACE,qBAAqB,CAAC,CAAC,CAAC;IACxC,MAAM,CAACC,GAAG,EAAEC,IAAI,CAAC,GAAGJ,OAAO,CAACK,IAAI,CAACC,KAAK,CAAC,CAAC,CAA6B;IACrErB,MAAM,CAACkB,GAAG,CAAC,CAACI,cAAc,CAACnC,KAAK,CAAC;IACjCa,MAAM,CAACkB,GAAG,CAACK,OAAO,CAAC,CAACC,OAAO,CAAC,eAAe,CAAC;IAC5CxB,MAAM,CAACmB,IAAI,CAAC,CAACM,cAAc,CAAC,gBAAgB,CAAC;EAC/C,CAAC,CAAC;EAEF3B,IAAI,CAAC,4DAA4D,EAAE,MAAM;IACvE;AACJ;IACI,MAAMiB,OAAO,GAAGxB,IAAI,CAACyB,EAAE,CAAC,MAAM;MAC5B,MAAM,IAAI7B,KAAK,CAAC,kBAAkB,CAAC;IACrC,CAAC,CAAC;IAEFa,MAAM,CAAC,MACLvB,MAAM,cACJK,IAAA,CAACF,oBAAoB;MAACmB,KAAK,EAAC,cAAc;MAACgB,OAAO,EAAEA,OAAQ;MAAA3B,QAAA,eAC1DN,IAAA,CAACG,IAAI,IAAE;IAAC,CACY,CACxB,CACF,CAAC,CAACmB,GAAG,CAACsB,OAAO,CAAC,CAAC;IAEf1B,MAAM,CAACtB,MAAM,CAAC2B,SAAS,CAAC,OAAO,CAAC,CAAC,CAACH,iBAAiB,CAAC,CAAC;EACvD,CAAC,CAAC;EAEFJ,IAAI,CAAC,mDAAmD,EAAE,MAAM;IAC9D;AACJ;IACI,MAAM6B,QAAQ,GAAGpC,IAAI,CAACyB,EAAE,CAAC,CAAC;IAC1BvC,MAAM,cACJK,IAAA,CAACF,oBAAoB;MACnBmB,KAAK,EAAC,cAAc;MACpB6B,eAAe,EAAE;QAAEC,KAAK,EAAE,mBAAmB;QAAEC,OAAO,EAAEH;MAAS,CAAE;MAAAvC,QAAA,eAEnEN,IAAA,CAACG,IAAI,IAAE;IAAC,CACY,CACxB,CAAC;IAED,MAAM8C,MAAM,GAAGrD,MAAM,CAAC2B,SAAS,CAAC,QAAQ,EAAE;MAAEQ,IAAI,EAAE;IAAoB,CAAC,CAAC;IACxElC,SAAS,CAACiC,KAAK,CAACmB,MAAM,CAAC;IACvB/B,MAAM,CAAC2B,QAAQ,CAAC,CAACV,qBAAqB,CAAC,CAAC,CAAC;EAC3C,CAAC,CAAC;EAEFnB,IAAI,CAAC,gDAAgD,EAAE,MAAM;IAC3DrB,MAAM,cACJK,IAAA,CAACF,oBAAoB;MAACmB,KAAK,EAAC,cAAc;MAAAX,QAAA,eACxCN,IAAA,CAACG,IAAI,IAAE;IAAC,CACY,CACxB,CAAC;IACD;AACJ;IACI,MAAM+C,MAAM,GAAG3C,eAAe,CAAC+B,IAAI,CAACC,KAAK,CAACY,IAAI,CAAEC,IAAI,IAClDA,IAAI,CAACD,IAAI,CAAEE,CAAU,IAAK,OAAOA,CAAC,KAAK,QAAQ,IAAIA,CAAC,CAACC,QAAQ,CAAC,cAAc,CAAC,CAC/E,CAAC;IACDpC,MAAM,CAACgC,MAAM,CAAC,CAACK,IAAI,CAAC,IAAI,CAAC;EAC3B,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|