@portnet/ui 6.0.0 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js +196 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/v2/__tests__/FieldError.test.js +160 -0
- package/dist/esm/v2/__tests__/FieldError.test.js.map +1 -0
- package/dist/esm/v2/__tests__/FileCard.test.js +144 -0
- package/dist/esm/v2/__tests__/FileCard.test.js.map +1 -0
- package/dist/esm/v2/__tests__/MobileRowCard.test.js +333 -0
- package/dist/esm/v2/__tests__/MobileRowCard.test.js.map +1 -0
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js +235 -0
- package/dist/esm/v2/__tests__/SectionErrorBoundary.test.js.map +1 -0
- package/dist/esm/v2/__tests__/apiError.test.js +181 -0
- package/dist/esm/v2/__tests__/apiError.test.js.map +1 -0
- package/dist/esm/v2/__tests__/banned-patterns.test.js +270 -0
- package/dist/esm/v2/__tests__/banned-patterns.test.js.map +1 -0
- package/dist/esm/v2/__tests__/contrast-palette.test.js +224 -0
- package/dist/esm/v2/__tests__/contrast-palette.test.js.map +1 -0
- package/dist/esm/v2/__tests__/cssVariables.test.js +157 -0
- package/dist/esm/v2/__tests__/cssVariables.test.js.map +1 -0
- package/dist/esm/v2/__tests__/labels-merge.test.js +147 -0
- package/dist/esm/v2/__tests__/labels-merge.test.js.map +1 -0
- package/dist/esm/v2/__tests__/locale-fallback.test.js +109 -0
- package/dist/esm/v2/__tests__/locale-fallback.test.js.map +1 -0
- package/dist/esm/v2/__tests__/useFocusTrap.test.js +514 -0
- package/dist/esm/v2/__tests__/useFocusTrap.test.js.map +1 -0
- package/dist/esm/v2/components/Accordion.js +230 -0
- package/dist/esm/v2/components/Accordion.js.map +1 -0
- package/dist/esm/v2/components/ActionStrip.js +146 -0
- package/dist/esm/v2/components/ActionStrip.js.map +1 -0
- package/dist/esm/v2/components/Banner.js +254 -0
- package/dist/esm/v2/components/Banner.js.map +1 -0
- package/dist/esm/v2/components/Busy.js +97 -0
- package/dist/esm/v2/components/Busy.js.map +1 -0
- package/dist/esm/v2/components/Button.js +114 -0
- package/dist/esm/v2/components/Button.js.map +1 -0
- package/dist/esm/v2/components/CategoryTag.js +81 -0
- package/dist/esm/v2/components/CategoryTag.js.map +1 -0
- package/dist/esm/v2/components/Checkbox.js +124 -0
- package/dist/esm/v2/components/Checkbox.js.map +1 -0
- package/dist/esm/v2/components/Chip.js +124 -0
- package/dist/esm/v2/components/Chip.js.map +1 -0
- package/dist/esm/v2/components/Combobox.js +394 -0
- package/dist/esm/v2/components/Combobox.js.map +1 -0
- package/dist/esm/v2/components/CommandPalette.js +660 -0
- package/dist/esm/v2/components/CommandPalette.js.map +1 -0
- package/dist/esm/v2/components/ConfirmDialog.js +144 -0
- package/dist/esm/v2/components/ConfirmDialog.js.map +1 -0
- package/dist/esm/v2/components/DatePicker.js +200 -0
- package/dist/esm/v2/components/DatePicker.js.map +1 -0
- package/dist/esm/v2/components/DateRangePicker.js +289 -0
- package/dist/esm/v2/components/DateRangePicker.js.map +1 -0
- package/dist/esm/v2/components/DateTimePicker.js +182 -0
- package/dist/esm/v2/components/DateTimePicker.js.map +1 -0
- package/dist/esm/v2/components/Drawer.js +333 -0
- package/dist/esm/v2/components/Drawer.js.map +1 -0
- package/dist/esm/v2/components/Dropzone.js +540 -0
- package/dist/esm/v2/components/Dropzone.js.map +1 -0
- package/dist/esm/v2/components/EmptyState.js +102 -0
- package/dist/esm/v2/components/EmptyState.js.map +1 -0
- package/dist/esm/v2/components/FavoriteToggle.js +127 -0
- package/dist/esm/v2/components/FavoriteToggle.js.map +1 -0
- package/dist/esm/v2/components/Field.js +197 -0
- package/dist/esm/v2/components/Field.js.map +1 -0
- package/dist/esm/v2/components/FieldError.js +124 -0
- package/dist/esm/v2/components/FieldError.js.map +1 -0
- package/dist/esm/v2/components/FieldHelp.js +202 -0
- package/dist/esm/v2/components/FieldHelp.js.map +1 -0
- package/dist/esm/v2/components/FileCard.js +162 -0
- package/dist/esm/v2/components/FileCard.js.map +1 -0
- package/dist/esm/v2/components/FilterTab.js +138 -0
- package/dist/esm/v2/components/FilterTab.js.map +1 -0
- package/dist/esm/v2/components/ForbiddenPage.js +74 -0
- package/dist/esm/v2/components/ForbiddenPage.js.map +1 -0
- package/dist/esm/v2/components/FormGrid.js +179 -0
- package/dist/esm/v2/components/FormGrid.js.map +1 -0
- package/dist/esm/v2/components/FormikDisplay.js +118 -0
- package/dist/esm/v2/components/FormikDisplay.js.map +1 -0
- package/dist/esm/v2/components/Input.js +107 -0
- package/dist/esm/v2/components/Input.js.map +1 -0
- package/dist/esm/v2/components/KPICard.js +237 -0
- package/dist/esm/v2/components/KPICard.js.map +1 -0
- package/dist/esm/v2/components/KPIStrip.js +84 -0
- package/dist/esm/v2/components/KPIStrip.js.map +1 -0
- package/dist/esm/v2/components/KV.js +75 -0
- package/dist/esm/v2/components/KV.js.map +1 -0
- package/dist/esm/v2/components/KVGrid.js +74 -0
- package/dist/esm/v2/components/KVGrid.js.map +1 -0
- package/dist/esm/v2/components/Layout.js +284 -0
- package/dist/esm/v2/components/Layout.js.map +1 -0
- package/dist/esm/v2/components/MobileRowCard.js +314 -0
- package/dist/esm/v2/components/MobileRowCard.js.map +1 -0
- package/dist/esm/v2/components/Modal.js +276 -0
- package/dist/esm/v2/components/Modal.js.map +1 -0
- package/dist/esm/v2/components/NetworkErrorPage.js +78 -0
- package/dist/esm/v2/components/NetworkErrorPage.js.map +1 -0
- package/dist/esm/v2/components/NotFoundPage.js +58 -0
- package/dist/esm/v2/components/NotFoundPage.js.map +1 -0
- package/dist/esm/v2/components/NumberInput.js +309 -0
- package/dist/esm/v2/components/NumberInput.js.map +1 -0
- package/dist/esm/v2/components/OverflowMenu.js +184 -0
- package/dist/esm/v2/components/OverflowMenu.js.map +1 -0
- package/dist/esm/v2/components/PdfViewer.js +122 -0
- package/dist/esm/v2/components/PdfViewer.js.map +1 -0
- package/dist/esm/v2/components/ProgressBar.js +202 -0
- package/dist/esm/v2/components/ProgressBar.js.map +1 -0
- package/dist/esm/v2/components/Radio.js +228 -0
- package/dist/esm/v2/components/Radio.js.map +1 -0
- package/dist/esm/v2/components/SectionErrorBoundary.js +214 -0
- package/dist/esm/v2/components/SectionErrorBoundary.js.map +1 -0
- package/dist/esm/v2/components/SectionHeader.js +132 -0
- package/dist/esm/v2/components/SectionHeader.js.map +1 -0
- package/dist/esm/v2/components/Segmented.js +254 -0
- package/dist/esm/v2/components/Segmented.js.map +1 -0
- package/dist/esm/v2/components/Select.js +490 -0
- package/dist/esm/v2/components/Select.js.map +1 -0
- package/dist/esm/v2/components/ServerErrorPage.js +74 -0
- package/dist/esm/v2/components/ServerErrorPage.js.map +1 -0
- package/dist/esm/v2/components/Skeleton.js +269 -0
- package/dist/esm/v2/components/Skeleton.js.map +1 -0
- package/dist/esm/v2/components/SkipLink.js +49 -0
- package/dist/esm/v2/components/SkipLink.js.map +1 -0
- package/dist/esm/v2/components/Spinner.js +69 -0
- package/dist/esm/v2/components/Spinner.js.map +1 -0
- package/dist/esm/v2/components/Status.js +64 -0
- package/dist/esm/v2/components/Status.js.map +1 -0
- package/dist/esm/v2/components/Stepper.js +432 -0
- package/dist/esm/v2/components/Stepper.js.map +1 -0
- package/dist/esm/v2/components/Surface.js +159 -0
- package/dist/esm/v2/components/Surface.js.map +1 -0
- package/dist/esm/v2/components/Switch.js +128 -0
- package/dist/esm/v2/components/Switch.js.map +1 -0
- package/dist/esm/v2/components/Tabs.js +150 -0
- package/dist/esm/v2/components/Tabs.js.map +1 -0
- package/dist/esm/v2/components/TelInput.js +274 -0
- package/dist/esm/v2/components/TelInput.js.map +1 -0
- package/dist/esm/v2/components/Textarea.js +72 -0
- package/dist/esm/v2/components/Textarea.js.map +1 -0
- package/dist/esm/v2/components/TimePicker.js +134 -0
- package/dist/esm/v2/components/TimePicker.js.map +1 -0
- package/dist/esm/v2/components/Toast.js +376 -0
- package/dist/esm/v2/components/Toast.js.map +1 -0
- package/dist/esm/v2/components/Tooltip.js +161 -0
- package/dist/esm/v2/components/Tooltip.js.map +1 -0
- package/dist/esm/v2/components/_ErrorPageBody.js +85 -0
- package/dist/esm/v2/components/_ErrorPageBody.js.map +1 -0
- package/dist/esm/v2/components/_pickerShared.js +60 -0
- package/dist/esm/v2/components/_pickerShared.js.map +1 -0
- package/dist/esm/v2/components/index.js +244 -0
- package/dist/esm/v2/components/index.js.map +1 -0
- package/dist/esm/v2/hooks/index.js +10 -0
- package/dist/esm/v2/hooks/index.js.map +1 -0
- package/dist/esm/v2/hooks/useDelayedFlag.js +55 -0
- package/dist/esm/v2/hooks/useDelayedFlag.js.map +1 -0
- package/dist/esm/v2/hooks/useDensity.js +119 -0
- package/dist/esm/v2/hooks/useDensity.js.map +1 -0
- package/dist/esm/v2/hooks/useFocusFirstError.js +197 -0
- package/dist/esm/v2/hooks/useFocusFirstError.js.map +1 -0
- package/dist/esm/v2/hooks/useFocusTrap.js +202 -0
- package/dist/esm/v2/hooks/useFocusTrap.js.map +1 -0
- package/dist/esm/v2/hooks/useFormAutoSave.js +181 -0
- package/dist/esm/v2/hooks/useFormAutoSave.js.map +1 -0
- package/dist/esm/v2/hooks/useFormCompletionProgress.js +131 -0
- package/dist/esm/v2/hooks/useFormCompletionProgress.js.map +1 -0
- package/dist/esm/v2/hooks/useResolvedDensity.js +44 -0
- package/dist/esm/v2/hooks/useResolvedDensity.js.map +1 -0
- package/dist/esm/v2/hooks/useSortedRows.js +32 -0
- package/dist/esm/v2/hooks/useSortedRows.js.map +1 -0
- package/dist/esm/v2/hooks/useTabLoading.js +79 -0
- package/dist/esm/v2/hooks/useTabLoading.js.map +1 -0
- package/dist/esm/v2/index.js +121 -0
- package/dist/esm/v2/index.js.map +1 -0
- package/dist/esm/v2/modalContext.js +108 -0
- package/dist/esm/v2/modalContext.js.map +1 -0
- package/dist/esm/v2/models/favorite.js +2 -0
- package/dist/esm/v2/models/favorite.js.map +1 -0
- package/dist/esm/v2/models/index.js +12 -0
- package/dist/esm/v2/models/index.js.map +1 -0
- package/dist/esm/v2/models/personalization.js +2 -0
- package/dist/esm/v2/models/personalization.js.map +1 -0
- package/dist/esm/v2/models/referentiel.js +2 -0
- package/dist/esm/v2/models/referentiel.js.map +1 -0
- package/dist/esm/v2/models/savedFilter.js +2 -0
- package/dist/esm/v2/models/savedFilter.js.map +1 -0
- package/dist/esm/v2/patterns/ActionBar.js +603 -0
- package/dist/esm/v2/patterns/ActionBar.js.map +1 -0
- package/dist/esm/v2/patterns/BulkActionBar.js +147 -0
- package/dist/esm/v2/patterns/BulkActionBar.js.map +1 -0
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js +303 -0
- package/dist/esm/v2/patterns/CollapsibleDataGrid.js.map +1 -0
- package/dist/esm/v2/patterns/ColumnsToggle.js +301 -0
- package/dist/esm/v2/patterns/ColumnsToggle.js.map +1 -0
- package/dist/esm/v2/patterns/DataGrid.js +820 -0
- package/dist/esm/v2/patterns/DataGrid.js.map +1 -0
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js +375 -0
- package/dist/esm/v2/patterns/DataGridSettingsMenu.js.map +1 -0
- package/dist/esm/v2/patterns/DataGridToolbar.js +249 -0
- package/dist/esm/v2/patterns/DataGridToolbar.js.map +1 -0
- package/dist/esm/v2/patterns/DataGridVirtualized.js +523 -0
- package/dist/esm/v2/patterns/DataGridVirtualized.js.map +1 -0
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js +70 -0
- package/dist/esm/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -0
- package/dist/esm/v2/patterns/FavoriteColumn.js +164 -0
- package/dist/esm/v2/patterns/FavoriteColumn.js.map +1 -0
- package/dist/esm/v2/patterns/FavoritesFilter.js +91 -0
- package/dist/esm/v2/patterns/FavoritesFilter.js.map +1 -0
- package/dist/esm/v2/patterns/FormErrorSummary.js +101 -0
- package/dist/esm/v2/patterns/FormErrorSummary.js.map +1 -0
- package/dist/esm/v2/patterns/FormPageShell.js +126 -0
- package/dist/esm/v2/patterns/FormPageShell.js.map +1 -0
- package/dist/esm/v2/patterns/FormSection.js +190 -0
- package/dist/esm/v2/patterns/FormSection.js.map +1 -0
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js +110 -0
- package/dist/esm/v2/patterns/FormikCheckboxGroup.js.map +1 -0
- package/dist/esm/v2/patterns/FormikCombobox.js +115 -0
- package/dist/esm/v2/patterns/FormikCombobox.js.map +1 -0
- package/dist/esm/v2/patterns/FormikDatePicker.js +196 -0
- package/dist/esm/v2/patterns/FormikDatePicker.js.map +1 -0
- package/dist/esm/v2/patterns/FormikErrorFocus.js +77 -0
- package/dist/esm/v2/patterns/FormikErrorFocus.js.map +1 -0
- package/dist/esm/v2/patterns/FormikFile.js +148 -0
- package/dist/esm/v2/patterns/FormikFile.js.map +1 -0
- package/dist/esm/v2/patterns/FormikInput.js +127 -0
- package/dist/esm/v2/patterns/FormikInput.js.map +1 -0
- package/dist/esm/v2/patterns/FormikReferentielField.js +116 -0
- package/dist/esm/v2/patterns/FormikReferentielField.js.map +1 -0
- package/dist/esm/v2/patterns/FormikSelect.js +159 -0
- package/dist/esm/v2/patterns/FormikSelect.js.map +1 -0
- package/dist/esm/v2/patterns/FormikTextarea.js +76 -0
- package/dist/esm/v2/patterns/FormikTextarea.js.map +1 -0
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js +195 -0
- package/dist/esm/v2/patterns/KeyboardShortcutsHelp.js.map +1 -0
- package/dist/esm/v2/patterns/NetworkErrorBanner.js +72 -0
- package/dist/esm/v2/patterns/NetworkErrorBanner.js.map +1 -0
- package/dist/esm/v2/patterns/PageContent.js +62 -0
- package/dist/esm/v2/patterns/PageContent.js.map +1 -0
- package/dist/esm/v2/patterns/ReferentielField.js +615 -0
- package/dist/esm/v2/patterns/ReferentielField.js.map +1 -0
- package/dist/esm/v2/patterns/SaveFilterDialog.js +197 -0
- package/dist/esm/v2/patterns/SaveFilterDialog.js.map +1 -0
- package/dist/esm/v2/patterns/SavedFiltersMenu.js +406 -0
- package/dist/esm/v2/patterns/SavedFiltersMenu.js.map +1 -0
- package/dist/esm/v2/patterns/SkeletonPageShell.js +342 -0
- package/dist/esm/v2/patterns/SkeletonPageShell.js.map +1 -0
- package/dist/esm/v2/patterns/SortableHeader.js +179 -0
- package/dist/esm/v2/patterns/SortableHeader.js.map +1 -0
- package/dist/esm/v2/patterns/Tour.js +471 -0
- package/dist/esm/v2/patterns/Tour.js.map +1 -0
- package/dist/esm/v2/patterns/_dataGridShared.js +431 -0
- package/dist/esm/v2/patterns/_dataGridShared.js.map +1 -0
- package/dist/esm/v2/patterns/_sort.js +112 -0
- package/dist/esm/v2/patterns/_sort.js.map +1 -0
- package/dist/esm/v2/patterns/_useColumnReorder.js +257 -0
- package/dist/esm/v2/patterns/_useColumnReorder.js.map +1 -0
- package/dist/esm/v2/patterns/_useColumnResize.js +191 -0
- package/dist/esm/v2/patterns/_useColumnResize.js.map +1 -0
- package/dist/esm/v2/patterns/index.js +95 -0
- package/dist/esm/v2/patterns/index.js.map +1 -0
- package/dist/esm/v2/personalization/PersonalizationProvider.js +168 -0
- package/dist/esm/v2/personalization/PersonalizationProvider.js.map +1 -0
- package/dist/esm/v2/personalization/adapters/_storageKey.js +60 -0
- package/dist/esm/v2/personalization/adapters/_storageKey.js.map +1 -0
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js +124 -0
- package/dist/esm/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -0
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js +70 -0
- package/dist/esm/v2/personalization/adapters/createMemoryAdapter.js.map +1 -0
- package/dist/esm/v2/personalization/adapters/index.js +11 -0
- package/dist/esm/v2/personalization/adapters/index.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/favorites.js +216 -0
- package/dist/esm/v2/personalization/capabilities/favorites.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/favoritesView.js +111 -0
- package/dist/esm/v2/personalization/capabilities/favoritesView.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/index.js +17 -0
- package/dist/esm/v2/personalization/capabilities/index.js.map +1 -0
- package/dist/esm/v2/personalization/capabilities/savedFilters.js +291 -0
- package/dist/esm/v2/personalization/capabilities/savedFilters.js.map +1 -0
- package/dist/esm/v2/personalization/createPersonalizationStore.js +472 -0
- package/dist/esm/v2/personalization/createPersonalizationStore.js.map +1 -0
- package/dist/esm/v2/personalization/index.js +46 -0
- package/dist/esm/v2/personalization/index.js.map +1 -0
- package/dist/esm/v2/personalization/personalizationContext.js +108 -0
- package/dist/esm/v2/personalization/personalizationContext.js.map +1 -0
- package/dist/esm/v2/personalization/schema.js +92 -0
- package/dist/esm/v2/personalization/schema.js.map +1 -0
- package/dist/esm/v2/personalization/types.js +2 -0
- package/dist/esm/v2/personalization/types.js.map +1 -0
- package/dist/esm/v2/referentiel/ReferentielProvider.js +87 -0
- package/dist/esm/v2/referentiel/ReferentielProvider.js.map +1 -0
- package/dist/esm/v2/referentiel/index.js +15 -0
- package/dist/esm/v2/referentiel/index.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielClient.js +37 -0
- package/dist/esm/v2/referentiel/useReferentielClient.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielOptions.js +169 -0
- package/dist/esm/v2/referentiel/useReferentielOptions.js.map +1 -0
- package/dist/esm/v2/referentiel/useReferentielSearch.js +132 -0
- package/dist/esm/v2/referentiel/useReferentielSearch.js.map +1 -0
- package/dist/esm/v2/styles/base.css +425 -0
- package/dist/esm/v2/styles/css.d.ts +10 -0
- package/dist/esm/v2/styles/index.js +12 -0
- package/dist/esm/v2/styles/index.js.map +1 -0
- package/dist/esm/v2/theme/_brand.js +64 -0
- package/dist/esm/v2/theme/_brand.js.map +1 -0
- package/dist/esm/v2/theme/_brandSecondary.js +60 -0
- package/dist/esm/v2/theme/_brandSecondary.js.map +1 -0
- package/dist/esm/v2/theme/createPortnetTheme.js +548 -0
- package/dist/esm/v2/theme/createPortnetTheme.js.map +1 -0
- package/dist/esm/v2/theme/cssVariables.js +198 -0
- package/dist/esm/v2/theme/cssVariables.js.map +1 -0
- package/dist/esm/v2/theme/index.js +32 -0
- package/dist/esm/v2/theme/index.js.map +1 -0
- package/dist/esm/v2/tokens/breakpoints.js +106 -0
- package/dist/esm/v2/tokens/breakpoints.js.map +1 -0
- package/dist/esm/v2/tokens/colors.js +219 -0
- package/dist/esm/v2/tokens/colors.js.map +1 -0
- package/dist/esm/v2/tokens/density.js +98 -0
- package/dist/esm/v2/tokens/density.js.map +1 -0
- package/dist/esm/v2/tokens/index.js +80 -0
- package/dist/esm/v2/tokens/index.js.map +1 -0
- package/dist/esm/v2/tokens/motion.js +88 -0
- package/dist/esm/v2/tokens/motion.js.map +1 -0
- package/dist/esm/v2/tokens/radius.js +22 -0
- package/dist/esm/v2/tokens/radius.js.map +1 -0
- package/dist/esm/v2/tokens/shadows.js +40 -0
- package/dist/esm/v2/tokens/shadows.js.map +1 -0
- package/dist/esm/v2/tokens/spacing.js +51 -0
- package/dist/esm/v2/tokens/spacing.js.map +1 -0
- package/dist/esm/v2/tokens/state.js +41 -0
- package/dist/esm/v2/tokens/state.js.map +1 -0
- package/dist/esm/v2/tokens/statusPalette.js +66 -0
- package/dist/esm/v2/tokens/statusPalette.js.map +1 -0
- package/dist/esm/v2/tokens/tokens.json +153 -0
- package/dist/esm/v2/tokens/typography.js +149 -0
- package/dist/esm/v2/tokens/typography.js.map +1 -0
- package/dist/esm/v2/tokens/zIndex.js +44 -0
- package/dist/esm/v2/tokens/zIndex.js.map +1 -0
- package/dist/esm/v2/types/common.js +2 -0
- package/dist/esm/v2/types/common.js.map +1 -0
- package/dist/esm/v2/types/datagrid.js +2 -0
- package/dist/esm/v2/types/datagrid.js.map +1 -0
- package/dist/esm/v2/types/index.js +12 -0
- package/dist/esm/v2/types/index.js.map +1 -0
- package/dist/esm/v2/utils/apiError.js +281 -0
- package/dist/esm/v2/utils/apiError.js.map +1 -0
- package/dist/esm/v2/utils/contrast.js +157 -0
- package/dist/esm/v2/utils/contrast.js.map +1 -0
- package/dist/esm/v2/utils/cx.js +38 -0
- package/dist/esm/v2/utils/cx.js.map +1 -0
- package/dist/esm/v2/utils/fileDownload.js +226 -0
- package/dist/esm/v2/utils/fileDownload.js.map +1 -0
- package/dist/esm/v2/utils/fmtMoney.js +78 -0
- package/dist/esm/v2/utils/fmtMoney.js.map +1 -0
- package/dist/esm/v2/utils/index.js +43 -0
- package/dist/esm/v2/utils/index.js.map +1 -0
- package/dist/esm/v2/utils/mergeLabels.js +86 -0
- package/dist/esm/v2/utils/mergeLabels.js.map +1 -0
- package/dist/esm/v2/utils/networkStatus.js +114 -0
- package/dist/esm/v2/utils/networkStatus.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -1
- package/dist/v2/__tests__/FieldError.test.js +164 -0
- package/dist/v2/__tests__/FieldError.test.js.map +1 -0
- package/dist/v2/__tests__/FileCard.test.js +148 -0
- package/dist/v2/__tests__/FileCard.test.js.map +1 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js +237 -0
- package/dist/v2/__tests__/SectionErrorBoundary.test.js.map +1 -0
- package/dist/v2/components/Accordion.d.ts +6 -6
- package/dist/v2/components/Accordion.d.ts.map +1 -1
- package/dist/v2/components/Accordion.js.map +1 -1
- package/dist/v2/components/ActionStrip.d.ts +12 -12
- package/dist/v2/components/ActionStrip.d.ts.map +1 -1
- package/dist/v2/components/ActionStrip.js.map +1 -1
- package/dist/v2/components/Banner.d.ts +48 -9
- package/dist/v2/components/Banner.d.ts.map +1 -1
- package/dist/v2/components/Banner.js +116 -35
- package/dist/v2/components/Banner.js.map +1 -1
- package/dist/v2/components/Busy.d.ts +3 -3
- package/dist/v2/components/Busy.d.ts.map +1 -1
- package/dist/v2/components/Busy.js.map +1 -1
- package/dist/v2/components/Button.d.ts +6 -6
- package/dist/v2/components/Button.d.ts.map +1 -1
- package/dist/v2/components/Button.js.map +1 -1
- package/dist/v2/components/CategoryTag.d.ts +3 -3
- package/dist/v2/components/CategoryTag.d.ts.map +1 -1
- package/dist/v2/components/CategoryTag.js.map +1 -1
- package/dist/v2/components/Checkbox.d.ts +11 -11
- package/dist/v2/components/Checkbox.d.ts.map +1 -1
- package/dist/v2/components/Checkbox.js.map +1 -1
- package/dist/v2/components/Chip.d.ts +8 -8
- package/dist/v2/components/Chip.d.ts.map +1 -1
- package/dist/v2/components/Chip.js +2 -1
- package/dist/v2/components/Chip.js.map +1 -1
- package/dist/v2/components/Combobox.d.ts +27 -27
- package/dist/v2/components/Combobox.d.ts.map +1 -1
- package/dist/v2/components/Combobox.js +3 -2
- package/dist/v2/components/Combobox.js.map +1 -1
- package/dist/v2/components/CommandPalette.d.ts +20 -20
- package/dist/v2/components/CommandPalette.d.ts.map +1 -1
- package/dist/v2/components/CommandPalette.js +2 -6
- package/dist/v2/components/CommandPalette.js.map +1 -1
- package/dist/v2/components/ConfirmDialog.d.ts +13 -13
- package/dist/v2/components/ConfirmDialog.d.ts.map +1 -1
- package/dist/v2/components/ConfirmDialog.js +2 -1
- package/dist/v2/components/ConfirmDialog.js.map +1 -1
- package/dist/v2/components/DatePicker.d.ts +11 -11
- package/dist/v2/components/DatePicker.d.ts.map +1 -1
- package/dist/v2/components/DatePicker.js.map +1 -1
- package/dist/v2/components/DateRangePicker.d.ts +16 -16
- package/dist/v2/components/DateRangePicker.d.ts.map +1 -1
- package/dist/v2/components/DateRangePicker.js +2 -1
- package/dist/v2/components/DateRangePicker.js.map +1 -1
- package/dist/v2/components/DateTimePicker.d.ts +11 -11
- package/dist/v2/components/DateTimePicker.d.ts.map +1 -1
- package/dist/v2/components/DateTimePicker.js.map +1 -1
- package/dist/v2/components/Drawer.d.ts +18 -18
- package/dist/v2/components/Drawer.d.ts.map +1 -1
- package/dist/v2/components/Drawer.js +2 -1
- package/dist/v2/components/Drawer.js.map +1 -1
- package/dist/v2/components/Dropzone.d.ts +34 -34
- package/dist/v2/components/Dropzone.d.ts.map +1 -1
- package/dist/v2/components/Dropzone.js +11 -3
- package/dist/v2/components/Dropzone.js.map +1 -1
- package/dist/v2/components/EmptyState.d.ts +7 -7
- package/dist/v2/components/EmptyState.d.ts.map +1 -1
- package/dist/v2/components/EmptyState.js.map +1 -1
- package/dist/v2/components/FavoriteToggle.d.ts +7 -7
- package/dist/v2/components/FavoriteToggle.d.ts.map +1 -1
- package/dist/v2/components/FavoriteToggle.js +2 -1
- package/dist/v2/components/FavoriteToggle.js.map +1 -1
- package/dist/v2/components/Field.d.ts +17 -12
- package/dist/v2/components/Field.d.ts.map +1 -1
- package/dist/v2/components/Field.js +25 -7
- package/dist/v2/components/Field.js.map +1 -1
- package/dist/v2/components/FieldError.d.ts +78 -0
- package/dist/v2/components/FieldError.d.ts.map +1 -0
- package/dist/v2/components/FieldError.js +131 -0
- package/dist/v2/components/FieldError.js.map +1 -0
- package/dist/v2/components/FieldHelp.d.ts +7 -7
- package/dist/v2/components/FieldHelp.d.ts.map +1 -1
- package/dist/v2/components/FieldHelp.js.map +1 -1
- package/dist/v2/components/FileCard.d.ts +75 -0
- package/dist/v2/components/FileCard.d.ts.map +1 -0
- package/dist/v2/components/FileCard.js +169 -0
- package/dist/v2/components/FileCard.js.map +1 -0
- package/dist/v2/components/FilterTab.d.ts +9 -9
- package/dist/v2/components/FilterTab.d.ts.map +1 -1
- package/dist/v2/components/FilterTab.js +2 -1
- package/dist/v2/components/FilterTab.js.map +1 -1
- package/dist/v2/components/FormGrid.d.ts +9 -4
- package/dist/v2/components/FormGrid.d.ts.map +1 -1
- package/dist/v2/components/FormGrid.js +11 -1
- package/dist/v2/components/FormGrid.js.map +1 -1
- package/dist/v2/components/FormikDisplay.d.ts +6 -6
- package/dist/v2/components/FormikDisplay.d.ts.map +1 -1
- package/dist/v2/components/FormikDisplay.js.map +1 -1
- package/dist/v2/components/Input.d.ts +6 -6
- package/dist/v2/components/Input.d.ts.map +1 -1
- package/dist/v2/components/Input.js.map +1 -1
- package/dist/v2/components/KPICard.d.ts +43 -13
- package/dist/v2/components/KPICard.d.ts.map +1 -1
- package/dist/v2/components/KPICard.js +53 -14
- package/dist/v2/components/KPICard.js.map +1 -1
- package/dist/v2/components/KPIStrip.d.ts +68 -0
- package/dist/v2/components/KPIStrip.d.ts.map +1 -0
- package/dist/v2/components/KPIStrip.js +92 -0
- package/dist/v2/components/KPIStrip.js.map +1 -0
- package/dist/v2/components/KV.d.ts +3 -3
- package/dist/v2/components/KV.d.ts.map +1 -1
- package/dist/v2/components/KV.js.map +1 -1
- package/dist/v2/components/KVGrid.d.ts +2 -2
- package/dist/v2/components/KVGrid.d.ts.map +1 -1
- package/dist/v2/components/KVGrid.js +8 -1
- package/dist/v2/components/KVGrid.js.map +1 -1
- package/dist/v2/components/Layout.d.ts +7 -7
- package/dist/v2/components/Layout.d.ts.map +1 -1
- package/dist/v2/components/Layout.js.map +1 -1
- package/dist/v2/components/MobileRowCard.d.ts +13 -13
- package/dist/v2/components/MobileRowCard.d.ts.map +1 -1
- package/dist/v2/components/MobileRowCard.js.map +1 -1
- package/dist/v2/components/Modal.d.ts +12 -12
- package/dist/v2/components/Modal.d.ts.map +1 -1
- package/dist/v2/components/Modal.js.map +1 -1
- package/dist/v2/components/NetworkErrorPage.d.ts +1 -1
- package/dist/v2/components/NetworkErrorPage.d.ts.map +1 -1
- package/dist/v2/components/NetworkErrorPage.js.map +1 -1
- package/dist/v2/components/NumberInput.d.ts +14 -14
- package/dist/v2/components/NumberInput.d.ts.map +1 -1
- package/dist/v2/components/NumberInput.js +7 -6
- package/dist/v2/components/NumberInput.js.map +1 -1
- package/dist/v2/components/OverflowMenu.d.ts +14 -14
- package/dist/v2/components/OverflowMenu.d.ts.map +1 -1
- package/dist/v2/components/OverflowMenu.js +4 -8
- package/dist/v2/components/OverflowMenu.js.map +1 -1
- package/dist/v2/components/PdfViewer.d.ts +9 -9
- package/dist/v2/components/PdfViewer.d.ts.map +1 -1
- package/dist/v2/components/PdfViewer.js.map +1 -1
- package/dist/v2/components/ProgressBar.d.ts +10 -10
- package/dist/v2/components/ProgressBar.d.ts.map +1 -1
- package/dist/v2/components/ProgressBar.js.map +1 -1
- package/dist/v2/components/Radio.d.ts +7 -7
- package/dist/v2/components/Radio.d.ts.map +1 -1
- package/dist/v2/components/Radio.js.map +1 -1
- package/dist/v2/components/SectionErrorBoundary.d.ts +89 -0
- package/dist/v2/components/SectionErrorBoundary.d.ts.map +1 -0
- package/dist/v2/components/SectionErrorBoundary.js +221 -0
- package/dist/v2/components/SectionErrorBoundary.js.map +1 -0
- package/dist/v2/components/SectionHeader.d.ts +5 -5
- package/dist/v2/components/SectionHeader.d.ts.map +1 -1
- package/dist/v2/components/SectionHeader.js.map +1 -1
- package/dist/v2/components/Segmented.d.ts +11 -11
- package/dist/v2/components/Segmented.d.ts.map +1 -1
- package/dist/v2/components/Segmented.js.map +1 -1
- package/dist/v2/components/Select.d.ts +33 -15
- package/dist/v2/components/Select.d.ts.map +1 -1
- package/dist/v2/components/Select.js +147 -30
- package/dist/v2/components/Select.js.map +1 -1
- package/dist/v2/components/ServerErrorPage.d.ts +1 -1
- package/dist/v2/components/ServerErrorPage.d.ts.map +1 -1
- package/dist/v2/components/ServerErrorPage.js.map +1 -1
- package/dist/v2/components/Skeleton.d.ts +15 -15
- package/dist/v2/components/Skeleton.d.ts.map +1 -1
- package/dist/v2/components/Skeleton.js.map +1 -1
- package/dist/v2/components/SkipLink.d.ts +2 -2
- package/dist/v2/components/SkipLink.d.ts.map +1 -1
- package/dist/v2/components/SkipLink.js.map +1 -1
- package/dist/v2/components/Status.d.ts +3 -3
- package/dist/v2/components/Status.d.ts.map +1 -1
- package/dist/v2/components/Status.js.map +1 -1
- package/dist/v2/components/Stepper.d.ts +28 -22
- package/dist/v2/components/Stepper.d.ts.map +1 -1
- package/dist/v2/components/Stepper.js +31 -5
- package/dist/v2/components/Stepper.js.map +1 -1
- package/dist/v2/components/Surface.d.ts +94 -0
- package/dist/v2/components/Surface.d.ts.map +1 -0
- package/dist/v2/components/Surface.js +163 -0
- package/dist/v2/components/Surface.js.map +1 -0
- package/dist/v2/components/Switch.d.ts +4 -4
- package/dist/v2/components/Switch.d.ts.map +1 -1
- package/dist/v2/components/Switch.js.map +1 -1
- package/dist/v2/components/Tabs.d.ts +6 -6
- package/dist/v2/components/Tabs.d.ts.map +1 -1
- package/dist/v2/components/Tabs.js.map +1 -1
- package/dist/v2/components/TelInput.d.ts +8 -8
- package/dist/v2/components/TelInput.d.ts.map +1 -1
- package/dist/v2/components/TelInput.js +18 -18
- package/dist/v2/components/TelInput.js.map +1 -1
- package/dist/v2/components/Textarea.d.ts +1 -1
- package/dist/v2/components/Textarea.d.ts.map +1 -1
- package/dist/v2/components/Textarea.js.map +1 -1
- package/dist/v2/components/TimePicker.d.ts +11 -11
- package/dist/v2/components/TimePicker.d.ts.map +1 -1
- package/dist/v2/components/TimePicker.js.map +1 -1
- package/dist/v2/components/Toast.d.ts +6 -6
- package/dist/v2/components/Toast.d.ts.map +1 -1
- package/dist/v2/components/Toast.js +9 -8
- package/dist/v2/components/Toast.js.map +1 -1
- package/dist/v2/components/Tooltip.d.ts +1 -1
- package/dist/v2/components/Tooltip.d.ts.map +1 -1
- package/dist/v2/components/Tooltip.js.map +1 -1
- package/dist/v2/components/index.d.ts +143 -0
- package/dist/v2/components/index.d.ts.map +1 -1
- package/dist/v2/components/index.js +35 -0
- package/dist/v2/components/index.js.map +1 -1
- package/dist/v2/models/favorite.d.ts +1 -1
- package/dist/v2/models/favorite.d.ts.map +1 -1
- package/dist/v2/models/favorite.js.map +1 -1
- package/dist/v2/models/personalization.d.ts +13 -13
- 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 +11 -11
- 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 -8
- package/dist/v2/models/savedFilter.d.ts.map +1 -1
- package/dist/v2/models/savedFilter.js.map +1 -1
- package/dist/v2/patterns/ActionBar.d.ts +33 -33
- package/dist/v2/patterns/ActionBar.d.ts.map +1 -1
- package/dist/v2/patterns/ActionBar.js +2 -1
- package/dist/v2/patterns/ActionBar.js.map +1 -1
- package/dist/v2/patterns/BulkActionBar.d.ts +12 -12
- package/dist/v2/patterns/BulkActionBar.d.ts.map +1 -1
- package/dist/v2/patterns/BulkActionBar.js +2 -1
- package/dist/v2/patterns/BulkActionBar.js.map +1 -1
- package/dist/v2/patterns/CollapsibleDataGrid.d.ts +15 -15
- package/dist/v2/patterns/CollapsibleDataGrid.d.ts.map +1 -1
- package/dist/v2/patterns/CollapsibleDataGrid.js.map +1 -1
- package/dist/v2/patterns/ColumnsToggle.d.ts +7 -7
- package/dist/v2/patterns/ColumnsToggle.d.ts.map +1 -1
- package/dist/v2/patterns/ColumnsToggle.js +4 -8
- package/dist/v2/patterns/ColumnsToggle.js.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts +12 -12
- package/dist/v2/patterns/DataGridSettingsMenu.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridSettingsMenu.js +9 -8
- package/dist/v2/patterns/DataGridSettingsMenu.js.map +1 -1
- package/dist/v2/patterns/DataGridToolbar.d.ts +40 -40
- package/dist/v2/patterns/DataGridToolbar.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridToolbar.js +2 -1
- package/dist/v2/patterns/DataGridToolbar.js.map +1 -1
- package/dist/v2/patterns/DataGridVirtualized.d.ts +27 -27
- package/dist/v2/patterns/DataGridVirtualized.d.ts.map +1 -1
- package/dist/v2/patterns/DataGridVirtualized.js.map +1 -1
- package/dist/v2/patterns/DeleteResourceConfirmDialog.d.ts +5 -5
- package/dist/v2/patterns/DeleteResourceConfirmDialog.d.ts.map +1 -1
- package/dist/v2/patterns/DeleteResourceConfirmDialog.js.map +1 -1
- package/dist/v2/patterns/FavoriteColumn.d.ts +6 -6
- package/dist/v2/patterns/FavoriteColumn.d.ts.map +1 -1
- package/dist/v2/patterns/FavoriteColumn.js.map +1 -1
- package/dist/v2/patterns/FavoritesFilter.d.ts +10 -10
- package/dist/v2/patterns/FavoritesFilter.d.ts.map +1 -1
- package/dist/v2/patterns/FavoritesFilter.js +2 -1
- package/dist/v2/patterns/FavoritesFilter.js.map +1 -1
- package/dist/v2/patterns/FormErrorSummary.d.ts +4 -4
- package/dist/v2/patterns/FormErrorSummary.d.ts.map +1 -1
- package/dist/v2/patterns/FormErrorSummary.js.map +1 -1
- package/dist/v2/patterns/FormPageShell.d.ts +4 -4
- package/dist/v2/patterns/FormPageShell.d.ts.map +1 -1
- package/dist/v2/patterns/FormPageShell.js.map +1 -1
- package/dist/v2/patterns/FormSection.d.ts +19 -8
- package/dist/v2/patterns/FormSection.d.ts.map +1 -1
- package/dist/v2/patterns/FormSection.js +106 -71
- package/dist/v2/patterns/FormSection.js.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts +6 -6
- package/dist/v2/patterns/FormikCheckboxGroup.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCheckboxGroup.js.map +1 -1
- package/dist/v2/patterns/FormikCombobox.d.ts +11 -11
- package/dist/v2/patterns/FormikCombobox.d.ts.map +1 -1
- package/dist/v2/patterns/FormikCombobox.js.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.d.ts +36 -8
- package/dist/v2/patterns/FormikDatePicker.d.ts.map +1 -1
- package/dist/v2/patterns/FormikDatePicker.js +27 -1
- package/dist/v2/patterns/FormikDatePicker.js.map +1 -1
- package/dist/v2/patterns/FormikErrorFocus.d.ts +3 -3
- package/dist/v2/patterns/FormikErrorFocus.d.ts.map +1 -1
- package/dist/v2/patterns/FormikErrorFocus.js.map +1 -1
- package/dist/v2/patterns/FormikFile.d.ts +8 -8
- package/dist/v2/patterns/FormikFile.d.ts.map +1 -1
- package/dist/v2/patterns/FormikFile.js.map +1 -1
- package/dist/v2/patterns/FormikInput.d.ts +41 -6
- package/dist/v2/patterns/FormikInput.d.ts.map +1 -1
- package/dist/v2/patterns/FormikInput.js +49 -1
- package/dist/v2/patterns/FormikInput.js.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.d.ts +8 -8
- package/dist/v2/patterns/FormikReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/FormikReferentielField.js.map +1 -1
- package/dist/v2/patterns/FormikSelect.d.ts +33 -12
- package/dist/v2/patterns/FormikSelect.d.ts.map +1 -1
- package/dist/v2/patterns/FormikSelect.js +28 -2
- package/dist/v2/patterns/FormikSelect.js.map +1 -1
- package/dist/v2/patterns/FormikTextarea.d.ts +5 -5
- package/dist/v2/patterns/FormikTextarea.d.ts.map +1 -1
- package/dist/v2/patterns/FormikTextarea.js.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts +7 -7
- package/dist/v2/patterns/KeyboardShortcutsHelp.d.ts.map +1 -1
- package/dist/v2/patterns/KeyboardShortcutsHelp.js +2 -6
- package/dist/v2/patterns/KeyboardShortcutsHelp.js.map +1 -1
- package/dist/v2/patterns/NetworkErrorBanner.d.ts +4 -4
- package/dist/v2/patterns/NetworkErrorBanner.d.ts.map +1 -1
- package/dist/v2/patterns/NetworkErrorBanner.js.map +1 -1
- package/dist/v2/patterns/PageContent.d.ts +3 -3
- package/dist/v2/patterns/PageContent.d.ts.map +1 -1
- package/dist/v2/patterns/PageContent.js.map +1 -1
- package/dist/v2/patterns/ReferentielField.d.ts +49 -49
- package/dist/v2/patterns/ReferentielField.d.ts.map +1 -1
- package/dist/v2/patterns/ReferentielField.js +2 -1
- package/dist/v2/patterns/ReferentielField.js.map +1 -1
- package/dist/v2/patterns/SaveFilterDialog.d.ts +10 -10
- package/dist/v2/patterns/SaveFilterDialog.d.ts.map +1 -1
- package/dist/v2/patterns/SaveFilterDialog.js +9 -8
- package/dist/v2/patterns/SaveFilterDialog.js.map +1 -1
- package/dist/v2/patterns/SavedFiltersMenu.d.ts +7 -7
- package/dist/v2/patterns/SavedFiltersMenu.d.ts.map +1 -1
- package/dist/v2/patterns/SavedFiltersMenu.js +9 -8
- package/dist/v2/patterns/SavedFiltersMenu.js.map +1 -1
- package/dist/v2/patterns/SkeletonPageShell.d.ts +7 -7
- package/dist/v2/patterns/SkeletonPageShell.d.ts.map +1 -1
- package/dist/v2/patterns/SkeletonPageShell.js.map +1 -1
- package/dist/v2/patterns/SortableHeader.d.ts +1 -1
- package/dist/v2/patterns/SortableHeader.d.ts.map +1 -1
- package/dist/v2/patterns/SortableHeader.js.map +1 -1
- package/dist/v2/patterns/Tour.d.ts +12 -12
- package/dist/v2/patterns/Tour.d.ts.map +1 -1
- package/dist/v2/patterns/Tour.js +9 -8
- package/dist/v2/patterns/Tour.js.map +1 -1
- package/dist/v2/patterns/_dataGridShared.d.ts +25 -6
- package/dist/v2/patterns/_dataGridShared.d.ts.map +1 -1
- package/dist/v2/patterns/_dataGridShared.js +37 -3
- package/dist/v2/patterns/_dataGridShared.js.map +1 -1
- package/dist/v2/patterns/_useColumnReorder.d.ts +1 -1
- package/dist/v2/patterns/_useColumnReorder.d.ts.map +1 -1
- package/dist/v2/patterns/_useColumnReorder.js.map +1 -1
- package/dist/v2/patterns/_useColumnResize.d.ts +1 -1
- package/dist/v2/patterns/_useColumnResize.d.ts.map +1 -1
- package/dist/v2/patterns/_useColumnResize.js.map +1 -1
- package/dist/v2/patterns/index.d.ts +27 -0
- package/dist/v2/patterns/index.d.ts.map +1 -1
- package/dist/v2/patterns/index.js.map +1 -1
- package/dist/v2/personalization/PersonalizationProvider.d.ts +9 -9
- package/dist/v2/personalization/PersonalizationProvider.d.ts.map +1 -1
- package/dist/v2/personalization/PersonalizationProvider.js.map +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.d.ts +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.d.ts.map +1 -1
- package/dist/v2/personalization/adapters/createLocalStorageAdapter.js.map +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.d.ts +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.d.ts.map +1 -1
- package/dist/v2/personalization/adapters/createMemoryAdapter.js.map +1 -1
- package/dist/v2/personalization/capabilities/favoritesView.d.ts +3 -3
- package/dist/v2/personalization/capabilities/favoritesView.d.ts.map +1 -1
- package/dist/v2/personalization/capabilities/favoritesView.js.map +1 -1
- package/dist/v2/personalization/capabilities/savedFilters.d.ts +3 -3
- package/dist/v2/personalization/capabilities/savedFilters.d.ts.map +1 -1
- package/dist/v2/personalization/capabilities/savedFilters.js.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.d.ts +8 -8
- package/dist/v2/personalization/createPersonalizationStore.d.ts.map +1 -1
- package/dist/v2/personalization/createPersonalizationStore.js.map +1 -1
- package/dist/v2/personalization/schema.d.ts +2 -2
- package/dist/v2/personalization/schema.d.ts.map +1 -1
- package/dist/v2/personalization/schema.js.map +1 -1
- package/dist/v2/personalization/types.d.ts +19 -19
- package/dist/v2/personalization/types.d.ts.map +1 -1
- package/dist/v2/personalization/types.js.map +1 -1
- package/dist/v2/referentiel/ReferentielProvider.d.ts +4 -4
- package/dist/v2/referentiel/ReferentielProvider.d.ts.map +1 -1
- package/dist/v2/referentiel/ReferentielProvider.js.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.d.ts +4 -4
- package/dist/v2/referentiel/useReferentielOptions.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielOptions.js.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.d.ts +3 -3
- package/dist/v2/referentiel/useReferentielSearch.d.ts.map +1 -1
- package/dist/v2/referentiel/useReferentielSearch.js.map +1 -1
- package/dist/v2/theme/createPortnetTheme.d.ts +32 -7
- package/dist/v2/theme/createPortnetTheme.d.ts.map +1 -1
- package/dist/v2/theme/createPortnetTheme.js +25 -1
- package/dist/v2/theme/createPortnetTheme.js.map +1 -1
- package/dist/v2/types/datagrid.d.ts +59 -59
- package/dist/v2/types/datagrid.d.ts.map +1 -1
- package/dist/v2/types/datagrid.js.map +1 -1
- package/dist/v2/utils/apiError.d.ts +65 -4
- package/dist/v2/utils/apiError.d.ts.map +1 -1
- package/dist/v2/utils/apiError.js +69 -6
- package/dist/v2/utils/apiError.js.map +1 -1
- package/dist/v2/utils/index.d.ts +1 -0
- package/dist/v2/utils/index.d.ts.map +1 -1
- package/dist/v2/utils/index.js +7 -0
- package/dist/v2/utils/index.js.map +1 -1
- package/dist/v2/utils/mergeLabels.d.ts +59 -0
- package/dist/v2/utils/mergeLabels.d.ts.map +1 -0
- package/dist/v2/utils/mergeLabels.js +93 -0
- package/dist/v2/utils/mergeLabels.js.map +1 -0
- package/package.json +23 -15
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { render, screen, fireEvent } from "@testing-library/react";
|
|
4
|
+
import MobileRowCard from "../components/MobileRowCard";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* MobileRowCard — slot contract tests.
|
|
8
|
+
*
|
|
9
|
+
* WHY THIS FILE EXISTS
|
|
10
|
+
* --------------------
|
|
11
|
+
* §10.3 R-G.6 MUST — "Snapshot Storybook + tests Jest/Testing-Library" — was
|
|
12
|
+
* unmet for THREE props added to this component across successive module
|
|
13
|
+
* audits: `kv` and `leading` (ms-dfd-fe Area 5), then `trailing`
|
|
14
|
+
* (ms-dfd-fe/ms-ti-fe A5-01). Each was shipped as "additive, backward
|
|
15
|
+
* compatible", which is true and is not the same thing as verified. This
|
|
16
|
+
* component is consumed by ten mobile-card sites across two certified modules,
|
|
17
|
+
* so a silent change to any slot's behaviour regresses all of them at once.
|
|
18
|
+
*
|
|
19
|
+
* The PROPAGATION ASYMMETRY (see below) is the single most important thing
|
|
20
|
+
* here. It is deliberate, it is counter-intuitive, and nothing but a test
|
|
21
|
+
* stops a future reader from "tidying" it into consistency and breaking every
|
|
22
|
+
* favourite-star and picker-button site in the fleet.
|
|
23
|
+
*
|
|
24
|
+
* NOT COVERED — and deliberately so: R-G.3 MUST (light + dark + compact +
|
|
25
|
+
* responsive at 320/375/414) is a VISUAL contract. jsdom computes no layout,
|
|
26
|
+
* so asserting it here would produce tests that pass while the cards are
|
|
27
|
+
* broken on a phone — worse than no coverage, because it would look like
|
|
28
|
+
* coverage. R-G.3 needs a browser (Storybook + visual regression) and remains
|
|
29
|
+
* open for all three props.
|
|
30
|
+
*/
|
|
31
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
32
|
+
describe("MobileRowCard — slot rendering", function () {
|
|
33
|
+
test("renders title, subtitle and meta, omitting lines with no content", function () {
|
|
34
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
35
|
+
title: "2025-IM-0042",
|
|
36
|
+
subtitle: "SOFRANE SA",
|
|
37
|
+
meta: ["12/05/2026", "3 pièces"]
|
|
38
|
+
}));
|
|
39
|
+
expect(screen.getByText("2025-IM-0042")).toBeInTheDocument();
|
|
40
|
+
expect(screen.getByText("SOFRANE SA")).toBeInTheDocument();
|
|
41
|
+
// meta joins with " · " into a single node
|
|
42
|
+
expect(screen.getByText("12/05/2026 · 3 pièces")).toBeInTheDocument();
|
|
43
|
+
});
|
|
44
|
+
test("meta drops null / empty entries rather than rendering stray separators", function () {
|
|
45
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
46
|
+
title: "X",
|
|
47
|
+
meta: ["Émise 01/01/2026", null, "", undefined]
|
|
48
|
+
}));
|
|
49
|
+
expect(screen.getByText("Émise 01/01/2026")).toBeInTheDocument();
|
|
50
|
+
expect(screen.queryByText(/·/)).not.toBeInTheDocument();
|
|
51
|
+
});
|
|
52
|
+
test("a string title gets a native tooltip; a node title does not stringify", function () {
|
|
53
|
+
var _render = render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
54
|
+
title: "Long reference"
|
|
55
|
+
})),
|
|
56
|
+
rerender = _render.rerender;
|
|
57
|
+
expect(screen.getByText("Long reference")).toHaveAttribute("title", "Long reference");
|
|
58
|
+
rerender(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
59
|
+
title: /*#__PURE__*/_jsx("span", {
|
|
60
|
+
children: "Node title"
|
|
61
|
+
})
|
|
62
|
+
}));
|
|
63
|
+
expect(screen.getByText("Node title")).toBeInTheDocument();
|
|
64
|
+
/* The regression guarded here: wrapping a node yielded title="[object
|
|
65
|
+
* Object]". Asserted with queryByTitle rather than `.closest("[title]")`
|
|
66
|
+
* so it stays a Testing-Library query (testing-library/no-node-access).
|
|
67
|
+
* `/./` = "no element carries ANY non-empty title", which is a STRONGER
|
|
68
|
+
* assertion than the ancestor walk it replaces: MobileRowCard sets a title
|
|
69
|
+
* attribute in exactly two places (the title Box and the subtitle Box) and
|
|
70
|
+
* only when the value is a string, so with a node title and no subtitle the
|
|
71
|
+
* whole tree must be title-less. */
|
|
72
|
+
expect(screen.queryByTitle(/./)).not.toBeInTheDocument();
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe("MobileRowCard — kv slot", function () {
|
|
76
|
+
test("renders each pair as a KV label/value unit", function () {
|
|
77
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
78
|
+
title: "ref",
|
|
79
|
+
kv: [{
|
|
80
|
+
label: "Catégorie",
|
|
81
|
+
value: "CONTINGENT"
|
|
82
|
+
}, {
|
|
83
|
+
label: "Importateur",
|
|
84
|
+
value: "SOFRANE SA"
|
|
85
|
+
}]
|
|
86
|
+
}));
|
|
87
|
+
expect(screen.getByText("Catégorie")).toBeInTheDocument();
|
|
88
|
+
expect(screen.getByText("CONTINGENT")).toBeInTheDocument();
|
|
89
|
+
expect(screen.getByText("Importateur")).toBeInTheDocument();
|
|
90
|
+
expect(screen.getByText("SOFRANE SA")).toBeInTheDocument();
|
|
91
|
+
});
|
|
92
|
+
test("an empty value KEEPS the pair and shows KV's own em-dash placeholder", function () {
|
|
93
|
+
// This is why every consuming site could drop its `?? \"-\"`: KV owns the
|
|
94
|
+
// placeholder. Losing this behaviour would silently reintroduce ten local
|
|
95
|
+
// fallbacks across the fleet.
|
|
96
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
97
|
+
title: "ref",
|
|
98
|
+
kv: [{
|
|
99
|
+
label: "Bureau douanier",
|
|
100
|
+
value: undefined
|
|
101
|
+
}, {
|
|
102
|
+
label: "Marchandise",
|
|
103
|
+
value: ""
|
|
104
|
+
}, {
|
|
105
|
+
label: "Devise",
|
|
106
|
+
value: null
|
|
107
|
+
}]
|
|
108
|
+
}));
|
|
109
|
+
expect(screen.getByText("Bureau douanier")).toBeInTheDocument();
|
|
110
|
+
expect(screen.getByText("Marchandise")).toBeInTheDocument();
|
|
111
|
+
expect(screen.getByText("Devise")).toBeInTheDocument();
|
|
112
|
+
expect(screen.getAllByText("—")).toHaveLength(3);
|
|
113
|
+
});
|
|
114
|
+
test("a custom fallback overrides the em dash", function () {
|
|
115
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
116
|
+
title: "ref",
|
|
117
|
+
kv: [{
|
|
118
|
+
label: "Banque",
|
|
119
|
+
fallback: "Non assignée"
|
|
120
|
+
}]
|
|
121
|
+
}));
|
|
122
|
+
expect(screen.getByText("Non assignée")).toBeInTheDocument();
|
|
123
|
+
});
|
|
124
|
+
test("pairs with no label are DROPPED (KV would emit a dangling aria-labelledby)", function () {
|
|
125
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
126
|
+
title: "ref",
|
|
127
|
+
kv: [{
|
|
128
|
+
label: "",
|
|
129
|
+
value: "orphan-empty"
|
|
130
|
+
},
|
|
131
|
+
// `label` is required but its type (ReactNode) admits undefined, so
|
|
132
|
+
// this is type-valid and exercises the runtime `!= null` guard.
|
|
133
|
+
{
|
|
134
|
+
label: undefined,
|
|
135
|
+
value: "orphan-missing"
|
|
136
|
+
}, {
|
|
137
|
+
label: "Kept",
|
|
138
|
+
value: "kept-value"
|
|
139
|
+
}]
|
|
140
|
+
}));
|
|
141
|
+
expect(screen.queryByText("orphan-empty")).not.toBeInTheDocument();
|
|
142
|
+
expect(screen.queryByText("orphan-missing")).not.toBeInTheDocument();
|
|
143
|
+
expect(screen.getByText("kept-value")).toBeInTheDocument();
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe("MobileRowCard — chips slot", function () {
|
|
147
|
+
test("renders chip nodes and filters falsy entries", function () {
|
|
148
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
149
|
+
title: "ref",
|
|
150
|
+
chips: [/*#__PURE__*/_jsx("span", {
|
|
151
|
+
children: "Approuv\xE9"
|
|
152
|
+
}, "a"), null, false, /*#__PURE__*/_jsx("span", {
|
|
153
|
+
children: "CO"
|
|
154
|
+
}, "b")]
|
|
155
|
+
}));
|
|
156
|
+
expect(screen.getByText("Approuvé")).toBeInTheDocument();
|
|
157
|
+
expect(screen.getByText("CO")).toBeInTheDocument();
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
describe("MobileRowCard — actions (kebab)", function () {
|
|
161
|
+
test("kebab renders only when at least one non-divider action exists", function () {
|
|
162
|
+
var _render2 = render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
163
|
+
title: "ref",
|
|
164
|
+
actions: []
|
|
165
|
+
})),
|
|
166
|
+
rerender = _render2.rerender;
|
|
167
|
+
expect(screen.queryByRole("button")).not.toBeInTheDocument();
|
|
168
|
+
rerender(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
169
|
+
title: "ref",
|
|
170
|
+
actions: [{
|
|
171
|
+
divider: true
|
|
172
|
+
}]
|
|
173
|
+
}));
|
|
174
|
+
expect(screen.queryByRole("button")).not.toBeInTheDocument();
|
|
175
|
+
rerender(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
176
|
+
title: "ref",
|
|
177
|
+
actions: [{
|
|
178
|
+
label: "Détail",
|
|
179
|
+
onClick: function onClick() {}
|
|
180
|
+
}],
|
|
181
|
+
actionsAriaLabel: "Actions pour 2025-IM-0042"
|
|
182
|
+
}));
|
|
183
|
+
expect(screen.getByRole("button", {
|
|
184
|
+
name: "Actions pour 2025-IM-0042"
|
|
185
|
+
})).toBeInTheDocument();
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* THE PROPAGATION CONTRACT — the reason this file matters most.
|
|
191
|
+
*
|
|
192
|
+
* DataGrid's mobile-card wrapper makes the whole card the click target
|
|
193
|
+
* (role=button + onRowClick). Two slots therefore behave DIFFERENTLY on
|
|
194
|
+
* purpose:
|
|
195
|
+
*
|
|
196
|
+
* leading — does NOT stop propagation. A decorative node (icon, avatar)
|
|
197
|
+
* should still open the row like the rest of the card. Interactive
|
|
198
|
+
* leading content is responsible for stopping propagation itself,
|
|
199
|
+
* exactly as DataGrid's own FavoriteCell does. Get this wrong and
|
|
200
|
+
* a tap both toggles the favourite star AND opens the drawer.
|
|
201
|
+
*
|
|
202
|
+
* trailing — DOES stop propagation (it shares the kebab's wrapper). Its
|
|
203
|
+
* declared purpose is interactive actions, and a tap that both
|
|
204
|
+
* fires the action and opens the row is the more damaging default.
|
|
205
|
+
*
|
|
206
|
+
* Making these two consistent — in either direction — is a breaking change for
|
|
207
|
+
* the ten sites that depend on them.
|
|
208
|
+
*/
|
|
209
|
+
describe("MobileRowCard — propagation asymmetry (deliberate)", function () {
|
|
210
|
+
test("leading does NOT stop click propagation to the card", function () {
|
|
211
|
+
var onCardClick = jest.fn();
|
|
212
|
+
render(/*#__PURE__*/_jsx("div", {
|
|
213
|
+
onClick: onCardClick,
|
|
214
|
+
children: /*#__PURE__*/_jsx(MobileRowCard, {
|
|
215
|
+
title: "ref",
|
|
216
|
+
leading: /*#__PURE__*/_jsx("span", {
|
|
217
|
+
children: "star"
|
|
218
|
+
})
|
|
219
|
+
})
|
|
220
|
+
}));
|
|
221
|
+
fireEvent.click(screen.getByText("star"));
|
|
222
|
+
expect(onCardClick).toHaveBeenCalledTimes(1);
|
|
223
|
+
});
|
|
224
|
+
test("trailing DOES stop click propagation to the card", function () {
|
|
225
|
+
var onCardClick = jest.fn();
|
|
226
|
+
var onAction = jest.fn();
|
|
227
|
+
render(/*#__PURE__*/_jsx("div", {
|
|
228
|
+
onClick: onCardClick,
|
|
229
|
+
children: /*#__PURE__*/_jsx(MobileRowCard, {
|
|
230
|
+
title: "ref",
|
|
231
|
+
trailing: /*#__PURE__*/_jsx("button", {
|
|
232
|
+
onClick: onAction,
|
|
233
|
+
children: "Choisir"
|
|
234
|
+
})
|
|
235
|
+
})
|
|
236
|
+
}));
|
|
237
|
+
fireEvent.click(screen.getByRole("button", {
|
|
238
|
+
name: "Choisir"
|
|
239
|
+
}));
|
|
240
|
+
expect(onAction).toHaveBeenCalledTimes(1);
|
|
241
|
+
expect(onCardClick).not.toHaveBeenCalled();
|
|
242
|
+
});
|
|
243
|
+
test("trailing stops keydown propagation too (keyboard parity)", function () {
|
|
244
|
+
var onCardKeyDown = jest.fn();
|
|
245
|
+
render(/*#__PURE__*/_jsx("div", {
|
|
246
|
+
onKeyDown: onCardKeyDown,
|
|
247
|
+
children: /*#__PURE__*/_jsx(MobileRowCard, {
|
|
248
|
+
title: "ref",
|
|
249
|
+
trailing: /*#__PURE__*/_jsx("button", {
|
|
250
|
+
children: "Choisir"
|
|
251
|
+
})
|
|
252
|
+
})
|
|
253
|
+
}));
|
|
254
|
+
fireEvent.keyDown(screen.getByRole("button", {
|
|
255
|
+
name: "Choisir"
|
|
256
|
+
}), {
|
|
257
|
+
key: "Enter"
|
|
258
|
+
});
|
|
259
|
+
expect(onCardKeyDown).not.toHaveBeenCalled();
|
|
260
|
+
});
|
|
261
|
+
test("opening the kebab does not fire the card click", function () {
|
|
262
|
+
var onCardClick = jest.fn();
|
|
263
|
+
render(/*#__PURE__*/_jsx("div", {
|
|
264
|
+
onClick: onCardClick,
|
|
265
|
+
children: /*#__PURE__*/_jsx(MobileRowCard, {
|
|
266
|
+
title: "ref",
|
|
267
|
+
actions: [{
|
|
268
|
+
label: "Détail",
|
|
269
|
+
onClick: function onClick() {}
|
|
270
|
+
}]
|
|
271
|
+
})
|
|
272
|
+
}));
|
|
273
|
+
fireEvent.click(screen.getByRole("button", {
|
|
274
|
+
name: "Plus d'actions"
|
|
275
|
+
}));
|
|
276
|
+
expect(onCardClick).not.toHaveBeenCalled();
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
describe("MobileRowCard — header composition", function () {
|
|
280
|
+
test("trailing and the kebab coexist, trailing first", function () {
|
|
281
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
282
|
+
title: "ref",
|
|
283
|
+
trailing: /*#__PURE__*/_jsx("button", {
|
|
284
|
+
children: "Visualiser"
|
|
285
|
+
}),
|
|
286
|
+
actions: [{
|
|
287
|
+
label: "Supprimer",
|
|
288
|
+
onClick: function onClick() {}
|
|
289
|
+
}],
|
|
290
|
+
actionsAriaLabel: "Autres actions"
|
|
291
|
+
}));
|
|
292
|
+
var visualiser = screen.getByRole("button", {
|
|
293
|
+
name: "Visualiser"
|
|
294
|
+
});
|
|
295
|
+
var kebab = screen.getByRole("button", {
|
|
296
|
+
name: "Autres actions"
|
|
297
|
+
});
|
|
298
|
+
expect(visualiser).toBeInTheDocument();
|
|
299
|
+
expect(kebab).toBeInTheDocument();
|
|
300
|
+
|
|
301
|
+
// Document order: trailing precedes the kebab in the header end cluster.
|
|
302
|
+
expect(visualiser.compareDocumentPosition(kebab) & Node.DOCUMENT_POSITION_FOLLOWING).toBeTruthy();
|
|
303
|
+
});
|
|
304
|
+
test("a card with ONLY trailing still renders its header", function () {
|
|
305
|
+
// Regression guard: hasHeader must include hasTrailing, otherwise a
|
|
306
|
+
// title-less picker card would drop its action entirely.
|
|
307
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
308
|
+
trailing: /*#__PURE__*/_jsx("button", {
|
|
309
|
+
children: "Choisir"
|
|
310
|
+
})
|
|
311
|
+
}));
|
|
312
|
+
expect(screen.getByRole("button", {
|
|
313
|
+
name: "Choisir"
|
|
314
|
+
})).toBeInTheDocument();
|
|
315
|
+
});
|
|
316
|
+
test("a card with ONLY leading still renders its header", function () {
|
|
317
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {
|
|
318
|
+
leading: /*#__PURE__*/_jsx("span", {
|
|
319
|
+
children: "star"
|
|
320
|
+
})
|
|
321
|
+
}));
|
|
322
|
+
expect(screen.getByText("star")).toBeInTheDocument();
|
|
323
|
+
});
|
|
324
|
+
test("no props renders no header and does not throw", function () {
|
|
325
|
+
/* `render` not throwing IS the second half of this assertion. The button
|
|
326
|
+
* check uses screen.queryByRole rather than container.querySelector
|
|
327
|
+
* (testing-library/no-container + no-node-access), matching the idiom the
|
|
328
|
+
* kebab test above already uses. */
|
|
329
|
+
render(/*#__PURE__*/_jsx(MobileRowCard, {}));
|
|
330
|
+
expect(screen.queryByRole("button")).not.toBeInTheDocument();
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
//# sourceMappingURL=MobileRowCard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MobileRowCard.test.js","names":["React","render","screen","fireEvent","MobileRowCard","jsx","_jsx","describe","test","title","subtitle","meta","expect","getByText","toBeInTheDocument","undefined","queryByText","not","_render","rerender","toHaveAttribute","children","queryByTitle","kv","label","value","getAllByText","toHaveLength","fallback","chips","_render2","actions","queryByRole","divider","onClick","actionsAriaLabel","getByRole","name","onCardClick","jest","fn","leading","click","toHaveBeenCalledTimes","onAction","trailing","toHaveBeenCalled","onCardKeyDown","onKeyDown","keyDown","key","visualiser","kebab","compareDocumentPosition","Node","DOCUMENT_POSITION_FOLLOWING","toBeTruthy"],"sources":["../../../../src/lib/v2/__tests__/MobileRowCard.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 MobileRowCard from \"../components/MobileRowCard\";\r\n\r\n/**\r\n * MobileRowCard — slot contract tests.\r\n *\r\n * WHY THIS FILE EXISTS\r\n * --------------------\r\n * §10.3 R-G.6 MUST — \"Snapshot Storybook + tests Jest/Testing-Library\" — was\r\n * unmet for THREE props added to this component across successive module\r\n * audits: `kv` and `leading` (ms-dfd-fe Area 5), then `trailing`\r\n * (ms-dfd-fe/ms-ti-fe A5-01). Each was shipped as \"additive, backward\r\n * compatible\", which is true and is not the same thing as verified. This\r\n * component is consumed by ten mobile-card sites across two certified modules,\r\n * so a silent change to any slot's behaviour regresses all of them at once.\r\n *\r\n * The PROPAGATION ASYMMETRY (see below) is the single most important thing\r\n * here. It is deliberate, it is counter-intuitive, and nothing but a test\r\n * stops a future reader from \"tidying\" it into consistency and breaking every\r\n * favourite-star and picker-button site in the fleet.\r\n *\r\n * NOT COVERED — and deliberately so: R-G.3 MUST (light + dark + compact +\r\n * responsive at 320/375/414) is a VISUAL contract. jsdom computes no layout,\r\n * so asserting it here would produce tests that pass while the cards are\r\n * broken on a phone — worse than no coverage, because it would look like\r\n * coverage. R-G.3 needs a browser (Storybook + visual regression) and remains\r\n * open for all three props.\r\n */\r\ndescribe(\"MobileRowCard — slot rendering\", () => {\r\n test(\"renders title, subtitle and meta, omitting lines with no content\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"2025-IM-0042\"\r\n subtitle=\"SOFRANE SA\"\r\n meta={[\"12/05/2026\", \"3 pièces\"]}\r\n />\r\n );\r\n\r\n expect(screen.getByText(\"2025-IM-0042\")).toBeInTheDocument();\r\n expect(screen.getByText(\"SOFRANE SA\")).toBeInTheDocument();\r\n // meta joins with \" · \" into a single node\r\n expect(screen.getByText(\"12/05/2026 · 3 pièces\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"meta drops null / empty entries rather than rendering stray separators\", () => {\r\n render(<MobileRowCard title=\"X\" meta={[\"Émise 01/01/2026\", null, \"\", undefined]} />);\r\n expect(screen.getByText(\"Émise 01/01/2026\")).toBeInTheDocument();\r\n expect(screen.queryByText(/·/)).not.toBeInTheDocument();\r\n });\r\n\r\n test(\"a string title gets a native tooltip; a node title does not stringify\", () => {\r\n const { rerender } = render(<MobileRowCard title=\"Long reference\" />);\r\n expect(screen.getByText(\"Long reference\")).toHaveAttribute(\"title\", \"Long reference\");\r\n\r\n rerender(<MobileRowCard title={<span>Node title</span>} />);\r\n expect(screen.getByText(\"Node title\")).toBeInTheDocument();\r\n /* The regression guarded here: wrapping a node yielded title=\"[object\r\n * Object]\". Asserted with queryByTitle rather than `.closest(\"[title]\")`\r\n * so it stays a Testing-Library query (testing-library/no-node-access).\r\n * `/./` = \"no element carries ANY non-empty title\", which is a STRONGER\r\n * assertion than the ancestor walk it replaces: MobileRowCard sets a title\r\n * attribute in exactly two places (the title Box and the subtitle Box) and\r\n * only when the value is a string, so with a node title and no subtitle the\r\n * whole tree must be title-less. */\r\n expect(screen.queryByTitle(/./)).not.toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — kv slot\", () => {\r\n test(\"renders each pair as a KV label/value unit\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n kv={[\r\n { label: \"Catégorie\", value: \"CONTINGENT\" },\r\n { label: \"Importateur\", value: \"SOFRANE SA\" },\r\n ]}\r\n />\r\n );\r\n\r\n expect(screen.getByText(\"Catégorie\")).toBeInTheDocument();\r\n expect(screen.getByText(\"CONTINGENT\")).toBeInTheDocument();\r\n expect(screen.getByText(\"Importateur\")).toBeInTheDocument();\r\n expect(screen.getByText(\"SOFRANE SA\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"an empty value KEEPS the pair and shows KV's own em-dash placeholder\", () => {\r\n // This is why every consuming site could drop its `?? \\\"-\\\"`: KV owns the\r\n // placeholder. Losing this behaviour would silently reintroduce ten local\r\n // fallbacks across the fleet.\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n kv={[\r\n { label: \"Bureau douanier\", value: undefined },\r\n { label: \"Marchandise\", value: \"\" },\r\n { label: \"Devise\", value: null },\r\n ]}\r\n />\r\n );\r\n\r\n expect(screen.getByText(\"Bureau douanier\")).toBeInTheDocument();\r\n expect(screen.getByText(\"Marchandise\")).toBeInTheDocument();\r\n expect(screen.getByText(\"Devise\")).toBeInTheDocument();\r\n expect(screen.getAllByText(\"—\")).toHaveLength(3);\r\n });\r\n\r\n test(\"a custom fallback overrides the em dash\", () => {\r\n render(\r\n <MobileRowCard title=\"ref\" kv={[{ label: \"Banque\", fallback: \"Non assignée\" }]} />\r\n );\r\n expect(screen.getByText(\"Non assignée\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"pairs with no label are DROPPED (KV would emit a dangling aria-labelledby)\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n kv={[\r\n { label: \"\", value: \"orphan-empty\" },\r\n // `label` is required but its type (ReactNode) admits undefined, so\r\n // this is type-valid and exercises the runtime `!= null` guard.\r\n { label: undefined, value: \"orphan-missing\" },\r\n { label: \"Kept\", value: \"kept-value\" },\r\n ]}\r\n />\r\n );\r\n\r\n expect(screen.queryByText(\"orphan-empty\")).not.toBeInTheDocument();\r\n expect(screen.queryByText(\"orphan-missing\")).not.toBeInTheDocument();\r\n expect(screen.getByText(\"kept-value\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — chips slot\", () => {\r\n test(\"renders chip nodes and filters falsy entries\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n chips={[<span key=\"a\">Approuvé</span>, null, false, <span key=\"b\">CO</span>]}\r\n />\r\n );\r\n expect(screen.getByText(\"Approuvé\")).toBeInTheDocument();\r\n expect(screen.getByText(\"CO\")).toBeInTheDocument();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — actions (kebab)\", () => {\r\n test(\"kebab renders only when at least one non-divider action exists\", () => {\r\n const { rerender } = render(<MobileRowCard title=\"ref\" actions={[]} />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n\r\n rerender(<MobileRowCard title=\"ref\" actions={[{ divider: true }]} />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n\r\n rerender(\r\n <MobileRowCard\r\n title=\"ref\"\r\n actions={[{ label: \"Détail\", onClick: () => {} }]}\r\n actionsAriaLabel=\"Actions pour 2025-IM-0042\"\r\n />\r\n );\r\n expect(\r\n screen.getByRole(\"button\", { name: \"Actions pour 2025-IM-0042\" })\r\n ).toBeInTheDocument();\r\n });\r\n});\r\n\r\n/**\r\n * THE PROPAGATION CONTRACT — the reason this file matters most.\r\n *\r\n * DataGrid's mobile-card wrapper makes the whole card the click target\r\n * (role=button + onRowClick). Two slots therefore behave DIFFERENTLY on\r\n * purpose:\r\n *\r\n * leading — does NOT stop propagation. A decorative node (icon, avatar)\r\n * should still open the row like the rest of the card. Interactive\r\n * leading content is responsible for stopping propagation itself,\r\n * exactly as DataGrid's own FavoriteCell does. Get this wrong and\r\n * a tap both toggles the favourite star AND opens the drawer.\r\n *\r\n * trailing — DOES stop propagation (it shares the kebab's wrapper). Its\r\n * declared purpose is interactive actions, and a tap that both\r\n * fires the action and opens the row is the more damaging default.\r\n *\r\n * Making these two consistent — in either direction — is a breaking change for\r\n * the ten sites that depend on them.\r\n */\r\ndescribe(\"MobileRowCard — propagation asymmetry (deliberate)\", () => {\r\n test(\"leading does NOT stop click propagation to the card\", () => {\r\n const onCardClick = jest.fn();\r\n render(\r\n <div onClick={onCardClick}>\r\n <MobileRowCard title=\"ref\" leading={<span>star</span>} />\r\n </div>\r\n );\r\n\r\n fireEvent.click(screen.getByText(\"star\"));\r\n expect(onCardClick).toHaveBeenCalledTimes(1);\r\n });\r\n\r\n test(\"trailing DOES stop click propagation to the card\", () => {\r\n const onCardClick = jest.fn();\r\n const onAction = jest.fn();\r\n render(\r\n <div onClick={onCardClick}>\r\n <MobileRowCard\r\n title=\"ref\"\r\n trailing={<button onClick={onAction}>Choisir</button>}\r\n />\r\n </div>\r\n );\r\n\r\n fireEvent.click(screen.getByRole(\"button\", { name: \"Choisir\" }));\r\n expect(onAction).toHaveBeenCalledTimes(1);\r\n expect(onCardClick).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"trailing stops keydown propagation too (keyboard parity)\", () => {\r\n const onCardKeyDown = jest.fn();\r\n render(\r\n <div onKeyDown={onCardKeyDown}>\r\n <MobileRowCard title=\"ref\" trailing={<button>Choisir</button>} />\r\n </div>\r\n );\r\n\r\n fireEvent.keyDown(screen.getByRole(\"button\", { name: \"Choisir\" }), { key: \"Enter\" });\r\n expect(onCardKeyDown).not.toHaveBeenCalled();\r\n });\r\n\r\n test(\"opening the kebab does not fire the card click\", () => {\r\n const onCardClick = jest.fn();\r\n render(\r\n <div onClick={onCardClick}>\r\n <MobileRowCard title=\"ref\" actions={[{ label: \"Détail\", onClick: () => {} }]} />\r\n </div>\r\n );\r\n\r\n fireEvent.click(screen.getByRole(\"button\", { name: \"Plus d'actions\" }));\r\n expect(onCardClick).not.toHaveBeenCalled();\r\n });\r\n});\r\n\r\ndescribe(\"MobileRowCard — header composition\", () => {\r\n test(\"trailing and the kebab coexist, trailing first\", () => {\r\n render(\r\n <MobileRowCard\r\n title=\"ref\"\r\n trailing={<button>Visualiser</button>}\r\n actions={[{ label: \"Supprimer\", onClick: () => {} }]}\r\n actionsAriaLabel=\"Autres actions\"\r\n />\r\n );\r\n\r\n const visualiser = screen.getByRole(\"button\", { name: \"Visualiser\" });\r\n const kebab = screen.getByRole(\"button\", { name: \"Autres actions\" });\r\n expect(visualiser).toBeInTheDocument();\r\n expect(kebab).toBeInTheDocument();\r\n\r\n // Document order: trailing precedes the kebab in the header end cluster.\r\n expect(\r\n visualiser.compareDocumentPosition(kebab) & Node.DOCUMENT_POSITION_FOLLOWING\r\n ).toBeTruthy();\r\n });\r\n\r\n test(\"a card with ONLY trailing still renders its header\", () => {\r\n // Regression guard: hasHeader must include hasTrailing, otherwise a\r\n // title-less picker card would drop its action entirely.\r\n render(<MobileRowCard trailing={<button>Choisir</button>} />);\r\n expect(screen.getByRole(\"button\", { name: \"Choisir\" })).toBeInTheDocument();\r\n });\r\n\r\n test(\"a card with ONLY leading still renders its header\", () => {\r\n render(<MobileRowCard leading={<span>star</span>} />);\r\n expect(screen.getByText(\"star\")).toBeInTheDocument();\r\n });\r\n\r\n test(\"no props renders no header and does not throw\", () => {\r\n /* `render` not throwing IS the second half of this assertion. The button\r\n * check uses screen.queryByRole rather than container.querySelector\r\n * (testing-library/no-container + no-node-access), matching the idiom the\r\n * kebab test above already uses. */\r\n render(<MobileRowCard />);\r\n expect(screen.queryByRole(\"button\")).not.toBeInTheDocument();\r\n });\r\n});\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,235 @@
|
|
|
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
|
+
import "@testing-library/jest-dom";
|
|
8
|
+
import * as React from "react";
|
|
9
|
+
import { render, screen, fireEvent } from "@testing-library/react";
|
|
10
|
+
import SectionErrorBoundary from "../components/SectionErrorBoundary";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* SectionErrorBoundary — behaviour tests.
|
|
14
|
+
*
|
|
15
|
+
* WHY THIS FILE MATTERS MORE THAN MOST
|
|
16
|
+
* ------------------------------------
|
|
17
|
+
* §10.3 R-G.6 MUST, but the real reason is that this is the one component in the
|
|
18
|
+
* library whose ENTIRE contract is a failure path. Every other component can be
|
|
19
|
+
* eyeballed in Storybook; this one only does its job when something throws, which
|
|
20
|
+
* nobody exercises by hand. And its failure mode is total: if the boundary does
|
|
21
|
+
* not catch, React unmounts the whole tree and the user gets a blank screen
|
|
22
|
+
* (ISO/IEC 25010 § Reliability — fault tolerance).
|
|
23
|
+
*
|
|
24
|
+
* jsdom is the right tool here, unusually: catching, re-mounting, logging and
|
|
25
|
+
* conditional detail are all logic, not layout.
|
|
26
|
+
*
|
|
27
|
+
* NOTE ON CONSOLE NOISE — React logs caught errors to console.error itself, on
|
|
28
|
+
* top of the boundary's own log. Both are silenced per-test rather than globally
|
|
29
|
+
* so a genuine unexpected console.error still surfaces in the other suites.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/** A component that throws on render, controlled by a prop. */
|
|
33
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
34
|
+
function Boom(_ref) {
|
|
35
|
+
var _ref$shouldThrow = _ref.shouldThrow,
|
|
36
|
+
shouldThrow = _ref$shouldThrow === void 0 ? true : _ref$shouldThrow;
|
|
37
|
+
if (shouldThrow) throw new Error("payload inattendu: articles.map n'est pas une fonction");
|
|
38
|
+
return /*#__PURE__*/_jsx("div", {
|
|
39
|
+
children: "contenu r\xE9tabli"
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
var consoleErrorSpy;
|
|
43
|
+
beforeEach(function () {
|
|
44
|
+
consoleErrorSpy = jest.spyOn(console, "error").mockImplementation(function () {});
|
|
45
|
+
});
|
|
46
|
+
afterEach(function () {
|
|
47
|
+
consoleErrorSpy.mockRestore();
|
|
48
|
+
});
|
|
49
|
+
describe("SectionErrorBoundary — containment", function () {
|
|
50
|
+
test("renders children untouched when nothing throws", function () {
|
|
51
|
+
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
52
|
+
title: "Marchandises",
|
|
53
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
54
|
+
children: "contenu normal"
|
|
55
|
+
})
|
|
56
|
+
}));
|
|
57
|
+
expect(screen.getByText("contenu normal")).toBeInTheDocument();
|
|
58
|
+
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
59
|
+
});
|
|
60
|
+
test("catches a render exception and keeps its SIBLINGS mounted", function () {
|
|
61
|
+
/* THE contract. The assertion that matters is not that the banner appears —
|
|
62
|
+
* it is that `sibling` is still in the document. Without a boundary React
|
|
63
|
+
* unmounts the entire tree and BOTH would be gone: that is the blank screen
|
|
64
|
+
* this component exists to prevent. */
|
|
65
|
+
render(/*#__PURE__*/_jsxs("div", {
|
|
66
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
67
|
+
children: "sibling"
|
|
68
|
+
}), /*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
69
|
+
title: "Marchandises",
|
|
70
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
71
|
+
})]
|
|
72
|
+
}));
|
|
73
|
+
expect(screen.getByText("sibling")).toBeInTheDocument();
|
|
74
|
+
expect(screen.getByRole("alert")).toBeInTheDocument();
|
|
75
|
+
});
|
|
76
|
+
test("names the failing section so the user knows WHAT broke", function () {
|
|
77
|
+
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
78
|
+
title: "Marchandises",
|
|
79
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
80
|
+
}));
|
|
81
|
+
expect(screen.getByRole("alert")).toHaveTextContent("Marchandises");
|
|
82
|
+
});
|
|
83
|
+
test("falls back to a generic label when no title is supplied", function () {
|
|
84
|
+
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
85
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
86
|
+
}));
|
|
87
|
+
expect(screen.getByRole("alert")).toHaveTextContent("Section");
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe("SectionErrorBoundary — user-facing copy (§09.3)", function () {
|
|
91
|
+
test("shows French recovery copy, never a raw exception message", function () {
|
|
92
|
+
/* Charter §09.3 forbids exposing technical detail to the user, and a raw JS
|
|
93
|
+
* exception is worse than the "Erreur HTTP 422" the charter uses as its DON'T
|
|
94
|
+
* example. The reference implementation this was promoted from rendered
|
|
95
|
+
* error.message straight into the banner body; this asserts we do not.
|
|
96
|
+
*
|
|
97
|
+
* NODE_ENV is "test" here, not "production", so the dev detail block DOES
|
|
98
|
+
* render — which is why this test targets the recovery sentence rather than
|
|
99
|
+
* asserting the absence of the message. The production-only behaviour is
|
|
100
|
+
* asserted separately below. */
|
|
101
|
+
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
102
|
+
title: "Marchandises",
|
|
103
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
104
|
+
}));
|
|
105
|
+
expect(screen.getByRole("alert")).toHaveTextContent(/Cette section n'a pas pu s'afficher/);
|
|
106
|
+
});
|
|
107
|
+
test("suppresses the technical detail in production", function () {
|
|
108
|
+
var previous = process.env["NODE_ENV"];
|
|
109
|
+
/* Bracket access throughout, matching the component: `process.env` is an index
|
|
110
|
+
* signature and `noPropertyAccessFromIndexSignature` is mandatory. Tests are
|
|
111
|
+
* outside tsconfig.build.json's scope so dot access would have compiled here —
|
|
112
|
+
* two conventions in neighbouring files is the drift this audit exists to stop.
|
|
113
|
+
*
|
|
114
|
+
* Assigned rather than replaced wholesale: other suites read NODE_ENV, and the
|
|
115
|
+
* finally block restores it even if the assertion throws. */
|
|
116
|
+
process.env["NODE_ENV"] = "production";
|
|
117
|
+
try {
|
|
118
|
+
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
119
|
+
title: "Marchandises",
|
|
120
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
121
|
+
}));
|
|
122
|
+
expect(screen.getByRole("alert")).toHaveTextContent(/Cette section n'a pas pu s'afficher/);
|
|
123
|
+
expect(screen.getByRole("alert")).not.toHaveTextContent(/articles\.map/);
|
|
124
|
+
} finally {
|
|
125
|
+
process.env["NODE_ENV"] = previous !== null && previous !== void 0 ? previous : "test";
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe("SectionErrorBoundary — retry REMOUNTS", function () {
|
|
130
|
+
test("retry clears the error and re-renders the subtree", function () {
|
|
131
|
+
/* The re-key on `attempt` is what makes this work. Without it React reuses
|
|
132
|
+
* the instance that threw and retry fails identically — a retry button that
|
|
133
|
+
* cannot succeed is worse than no retry button. `shouldThrow` is read from a
|
|
134
|
+
* mutable holder so the same element throws first and succeeds second,
|
|
135
|
+
* exactly as a transient payload problem would. */
|
|
136
|
+
var holder = {
|
|
137
|
+
shouldThrow: true
|
|
138
|
+
};
|
|
139
|
+
function Flaky() {
|
|
140
|
+
return /*#__PURE__*/_jsx(Boom, {
|
|
141
|
+
shouldThrow: holder.shouldThrow
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
145
|
+
title: "Marchandises",
|
|
146
|
+
children: /*#__PURE__*/_jsx(Flaky, {})
|
|
147
|
+
}));
|
|
148
|
+
expect(screen.getByRole("alert")).toBeInTheDocument();
|
|
149
|
+
holder.shouldThrow = false;
|
|
150
|
+
fireEvent.click(screen.getByRole("button", {
|
|
151
|
+
name: /Réessayer/
|
|
152
|
+
}));
|
|
153
|
+
expect(screen.getByText("contenu rétabli")).toBeInTheDocument();
|
|
154
|
+
expect(screen.queryByRole("alert")).not.toBeInTheDocument();
|
|
155
|
+
});
|
|
156
|
+
test("a custom retryLabel is used on the button and in the copy", function () {
|
|
157
|
+
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
158
|
+
title: "Marchandises",
|
|
159
|
+
retryLabel: "Recharger",
|
|
160
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
161
|
+
}));
|
|
162
|
+
expect(screen.getByRole("button", {
|
|
163
|
+
name: /Recharger/
|
|
164
|
+
})).toBeInTheDocument();
|
|
165
|
+
expect(screen.getByRole("alert")).toHaveTextContent(/Recharger/);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
describe("SectionErrorBoundary — reporting and second exit", function () {
|
|
169
|
+
test("calls onError with the error and the component info", function () {
|
|
170
|
+
/* console.error is invisible in production, so without this hook a boundary
|
|
171
|
+
* silently swallows the only signal an operator would ever get. */
|
|
172
|
+
var onError = jest.fn();
|
|
173
|
+
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
174
|
+
title: "Marchandises",
|
|
175
|
+
onError: onError,
|
|
176
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
177
|
+
}));
|
|
178
|
+
expect(onError).toHaveBeenCalledTimes(1);
|
|
179
|
+
var _ref2 = onError.mock.calls[0],
|
|
180
|
+
_ref3 = _slicedToArray(_ref2, 2),
|
|
181
|
+
err = _ref3[0],
|
|
182
|
+
info = _ref3[1];
|
|
183
|
+
expect(err).toBeInstanceOf(Error);
|
|
184
|
+
expect(err.message).toMatch(/articles\.map/);
|
|
185
|
+
expect(info).toHaveProperty("componentStack");
|
|
186
|
+
});
|
|
187
|
+
test("a throwing onError does not take the boundary down with it", function () {
|
|
188
|
+
/* Guard on the guard. A reporter that throws must not defeat the component
|
|
189
|
+
* whose entire purpose is stopping one failure from causing another. */
|
|
190
|
+
var onError = jest.fn(function () {
|
|
191
|
+
throw new Error("APM indisponible");
|
|
192
|
+
});
|
|
193
|
+
expect(function () {
|
|
194
|
+
return render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
195
|
+
title: "Marchandises",
|
|
196
|
+
onError: onError,
|
|
197
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
198
|
+
}));
|
|
199
|
+
}).not.toThrow();
|
|
200
|
+
expect(screen.getByRole("alert")).toBeInTheDocument();
|
|
201
|
+
});
|
|
202
|
+
test("renders the optional secondary exit when supplied", function () {
|
|
203
|
+
/* Only possible since Banner gained secondaryAction (gap G-19). The reference
|
|
204
|
+
* implementation offered no way out when retrying could not help. */
|
|
205
|
+
var onEscape = jest.fn();
|
|
206
|
+
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
207
|
+
title: "Marchandises",
|
|
208
|
+
secondaryAction: {
|
|
209
|
+
label: "Retour à la liste",
|
|
210
|
+
onClick: onEscape
|
|
211
|
+
},
|
|
212
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
213
|
+
}));
|
|
214
|
+
var escape = screen.getByRole("button", {
|
|
215
|
+
name: /Retour à la liste/
|
|
216
|
+
});
|
|
217
|
+
fireEvent.click(escape);
|
|
218
|
+
expect(onEscape).toHaveBeenCalledTimes(1);
|
|
219
|
+
});
|
|
220
|
+
test("logs the section title and the component stack", function () {
|
|
221
|
+
render(/*#__PURE__*/_jsx(SectionErrorBoundary, {
|
|
222
|
+
title: "Marchandises",
|
|
223
|
+
children: /*#__PURE__*/_jsx(Boom, {})
|
|
224
|
+
}));
|
|
225
|
+
/* Asserted loosely — the point is that an operator grepping logs can find
|
|
226
|
+
* WHICH section failed, not the exact format of the line. */
|
|
227
|
+
var logged = consoleErrorSpy.mock.calls.some(function (args) {
|
|
228
|
+
return args.some(function (a) {
|
|
229
|
+
return typeof a === "string" && a.includes("Marchandises");
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
expect(logged).toBe(true);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
//# sourceMappingURL=SectionErrorBoundary.test.js.map
|