@12-apps/ui 1.5.0 → 1.5.2
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/package.json +17 -9
- package/src/button/index.ts +1 -0
- package/src/social-login-button/index.ts +1 -0
- package/src/{social-login-button.tsx → social-login-button/social-login-button.tsx} +5 -5
- package/src/user-avatar/index.ts +1 -0
- package/src/{user-avatar.tsx → user-avatar/user-avatar.tsx} +4 -4
- package/eslint.config.js +0 -89
- package/src/__tests__/data-grid.test.tsx +0 -125
- package/src/__tests__/package-wiring.test.ts +0 -41
- package/src/__tests__/setup.ts +0 -1
- package/src/__tests__/social-login-button.test.tsx +0 -186
- package/src/__tests__/user-avatar.test.tsx +0 -195
- package/src/__tests__/viewport.test.ts +0 -50
- package/src/components/command/__tests__/command.test.tsx +0 -112
- package/src/components/data-display/Alert/Alert.stories.tsx +0 -559
- package/src/components/data-display/Alert/Alert.test.stories.tsx +0 -707
- package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +0 -362
- package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +0 -763
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +0 -230
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +0 -270
- package/src/components/data-display/Avatar/Avatar.stories.tsx +0 -721
- package/src/components/data-display/Avatar/Avatar.test.stories.tsx +0 -822
- package/src/components/data-display/Badge/Badge.stories.tsx +0 -1134
- package/src/components/data-display/Badge/Badge.test.stories.tsx +0 -1194
- package/src/components/data-display/Banner/Banner.stories.tsx +0 -528
- package/src/components/data-display/Banner/Banner.test.stories.tsx +0 -511
- package/src/components/data-display/Carousel/Carousel.stories.tsx +0 -607
- package/src/components/data-display/Carousel/Carousel.test.stories.tsx +0 -701
- package/src/components/data-display/Chart/Chart.stories.tsx +0 -568
- package/src/components/data-display/Chart/Chart.test.stories.tsx +0 -174
- package/src/components/data-display/Chart/SpecChart.stories.tsx +0 -150
- package/src/components/data-display/Chart/SpecChart.test.stories.tsx +0 -56
- package/src/components/data-display/Chart/__tests__/SpecChart.test.tsx +0 -60
- package/src/components/data-display/Chart/__tests__/chart-format.test.ts +0 -43
- package/src/components/data-display/Chart/__tests__/chart-spec.test.ts +0 -119
- package/src/components/data-display/Chip/Chip.stories.tsx +0 -252
- package/src/components/data-display/Chip/Chip.test.stories.tsx +0 -266
- package/src/components/data-display/DataGrid/DataGrid.stories.tsx +0 -515
- package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +0 -653
- package/src/components/data-display/DataViews/__tests__/DataViewsGrid.test.tsx +0 -271
- package/src/components/data-display/DataViews/__tests__/DataViewsTableBase.test.tsx +0 -134
- package/src/components/data-display/DataViews/__tests__/SaveViewModal.test.tsx +0 -83
- package/src/components/data-display/DataViews/__tests__/data-views-filter.test.ts +0 -115
- package/src/components/data-display/DataViews/__tests__/data-views-preview.test.ts +0 -53
- package/src/components/data-display/DataViews/__tests__/range-pill.test.tsx +0 -114
- package/src/components/data-display/DataViews/base-card.stories.tsx +0 -136
- package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +0 -254
- package/src/components/data-display/EmptyState/EmptyState.stories.tsx +0 -282
- package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +0 -441
- package/src/components/data-display/ErrorState/ErrorState.stories.tsx +0 -110
- package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +0 -133
- package/src/components/data-display/HoverCard/HoverCard.stories.tsx +0 -650
- package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +0 -929
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +0 -411
- package/src/components/data-display/LazyImage/LazyImage.stories.tsx +0 -387
- package/src/components/data-display/Lightbox/Lightbox.stories.tsx +0 -315
- package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +0 -598
- package/src/components/data-display/LoadingState/LoadingState.stories.tsx +0 -124
- package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +0 -99
- package/src/components/data-display/MapPreview/MapPreview.stories.tsx +0 -458
- package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +0 -394
- package/src/components/data-display/Popover/Popover.stories.tsx +0 -295
- package/src/components/data-display/Popover/Popover.test.stories.tsx +0 -1162
- package/src/components/data-display/Progress/Progress.stories.tsx +0 -481
- package/src/components/data-display/Progress/Progress.test.stories.tsx +0 -2070
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +0 -160
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +0 -190
- package/src/components/data-display/Sheet/Sheet.stories.tsx +0 -883
- package/src/components/data-display/Sheet/Sheet.test.stories.tsx +0 -1105
- package/src/components/data-display/StatCard/StatCard.stories.tsx +0 -167
- package/src/components/data-display/StatCard/StatCard.test.stories.tsx +0 -240
- package/src/components/data-display/Stepper/Stepper.stories.tsx +0 -540
- package/src/components/data-display/Stepper/Stepper.test.stories.tsx +0 -600
- package/src/components/data-display/Table/Table.stories.tsx +0 -803
- package/src/components/data-display/Table/Table.test.stories.tsx +0 -369
- package/src/components/data-display/Timeline/Timeline.stories.tsx +0 -442
- package/src/components/data-display/Timeline/Timeline.test.stories.tsx +0 -930
- package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +0 -475
- package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +0 -734
- package/src/components/data-display/Tooltip/Tooltip.stories.tsx +0 -468
- package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +0 -1154
- package/src/components/feedback/ConfirmAction/ConfirmAction.stories.tsx +0 -146
- package/src/components/feedback/ConfirmAction/ConfirmAction.test.stories.tsx +0 -114
- package/src/components/feedback/ConfirmAction/__tests__/confirm-action.test.tsx +0 -288
- package/src/components/feedback/Dialog/Dialog.stories.tsx +0 -833
- package/src/components/feedback/Dialog/Dialog.test.stories.tsx +0 -964
- package/src/components/feedback/Dialog/__tests__/dialog-content-spacing.test.tsx +0 -66
- package/src/components/feedback/Modal/Modal.stories.tsx +0 -765
- package/src/components/feedback/Modal/Modal.test.stories.tsx +0 -251
- package/src/components/feedback/Sonner/Sonner.stories.tsx +0 -698
- package/src/components/feedback/Sonner/Sonner.test.stories.tsx +0 -896
- package/src/components/feedback/StackedModal/StackedModal.stories.tsx +0 -1783
- package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +0 -973
- package/src/components/feedback/StackedModal/__tests__/stacked-modal-viewport.test.tsx +0 -104
- package/src/components/feedback/Toast/Toast.stories.tsx +0 -548
- package/src/components/feedback/Toast/Toast.test.stories.tsx +0 -834
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +0 -691
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +0 -634
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +0 -665
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +0 -727
- package/src/components/form/Autocomplete/Autocomplete.stories.tsx +0 -715
- package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +0 -825
- package/src/components/form/Button/Button.stories.tsx +0 -365
- package/src/components/form/Button/Button.test.stories.tsx +0 -607
- package/src/components/form/Calendar/Calendar.stories.tsx +0 -349
- package/src/components/form/Calendar/Calendar.test.stories.tsx +0 -464
- package/src/components/form/CepField/CepField.stories.tsx +0 -138
- package/src/components/form/CepField/CepField.test.stories.tsx +0 -281
- package/src/components/form/Checkbox/Checkbox.stories.tsx +0 -265
- package/src/components/form/Checkbox/Checkbox.test.stories.tsx +0 -181
- package/src/components/form/CodeEditor/CodeEditor.stories.tsx +0 -871
- package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +0 -574
- package/src/components/form/Command/Command.stories.tsx +0 -580
- package/src/components/form/Command/Command.test.stories.tsx +0 -215
- package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +0 -112
- package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +0 -134
- package/src/components/form/Form/Form.stories.tsx +0 -687
- package/src/components/form/Form/Form.test.stories.tsx +0 -601
- package/src/components/form/Input/Input.stories.tsx +0 -260
- package/src/components/form/Input/Input.test.stories.tsx +0 -1191
- package/src/components/form/InputOTP/InputOTP.stories.tsx +0 -774
- package/src/components/form/InputOTP/InputOTP.test.stories.tsx +0 -588
- package/src/components/form/Label/Label.stories.tsx +0 -473
- package/src/components/form/Label/Label.test.stories.tsx +0 -915
- package/src/components/form/Menubar/Menubar.stories.tsx +0 -472
- package/src/components/form/Menubar/Menubar.test.stories.tsx +0 -584
- package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +0 -562
- package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +0 -327
- package/src/components/form/PhoneInput/PhoneInput.stories.tsx +0 -495
- package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +0 -666
- package/src/components/form/RadioGroup/RadioGroup.stories.tsx +0 -518
- package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +0 -685
- package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +0 -261
- package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +0 -491
- package/src/components/form/SearchPalette/SearchPalette.stories.tsx +0 -135
- package/src/components/form/Select/Select.stories.tsx +0 -364
- package/src/components/form/Select/Select.test.stories.tsx +0 -985
- package/src/components/form/Slider/Slider.stories.tsx +0 -418
- package/src/components/form/Slider/Slider.test.stories.tsx +0 -1042
- package/src/components/form/Switch/Switch.stories.tsx +0 -697
- package/src/components/form/Switch/Switch.test.stories.tsx +0 -597
- package/src/components/form/Textarea/Textarea.stories.tsx +0 -473
- package/src/components/form/Textarea/Textarea.test.stories.tsx +0 -702
- package/src/components/form/Toggle/Toggle.stories.tsx +0 -638
- package/src/components/form/Toggle/Toggle.test.stories.tsx +0 -1159
- package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +0 -617
- package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +0 -915
- package/src/components/form/UploadButton/UploadButton.stories.tsx +0 -367
- package/src/components/form/UploadButton/UploadButton.test.stories.tsx +0 -573
- package/src/components/form/total-form/total-form.test.tsx +0 -214
- package/src/components/layout/Accordion/Accordion.stories.tsx +0 -694
- package/src/components/layout/Accordion/Accordion.test.stories.tsx +0 -1344
- package/src/components/layout/Card/Card.stories.tsx +0 -591
- package/src/components/layout/Card/Card.test.stories.tsx +0 -1134
- package/src/components/layout/CardGrid/__tests__/CardGrid.test.tsx +0 -92
- package/src/components/layout/Collapsible/Collapsible.stories.tsx +0 -180
- package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +0 -308
- package/src/components/layout/Container/Container.stories.tsx +0 -557
- package/src/components/layout/Container/Container.test.stories.tsx +0 -745
- package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +0 -129
- package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +0 -251
- package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +0 -39
- package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +0 -131
- package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +0 -99
- package/src/components/layout/Dashboard/Dashboard.stories.tsx +0 -104
- package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +0 -190
- package/src/components/layout/Drawer/Drawer.stories.tsx +0 -658
- package/src/components/layout/Drawer/Drawer.test.stories.tsx +0 -1343
- package/src/components/layout/Resizable/Resizable.stories.tsx +0 -1039
- package/src/components/layout/Resizable/Resizable.test.stories.tsx +0 -754
- package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +0 -651
- package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +0 -619
- package/src/components/layout/Separator/Separator.stories.tsx +0 -563
- package/src/components/layout/Separator/Separator.test.stories.tsx +0 -518
- package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +0 -192
- package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +0 -175
- package/src/components/layout/Sidebar/Sidebar.stories.tsx +0 -609
- package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +0 -1324
- package/src/components/layout/Skeleton/Skeleton.stories.tsx +0 -689
- package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +0 -521
- package/src/components/layout/Spacer/Spacer.stories.tsx +0 -502
- package/src/components/layout/Spacer/Spacer.test.stories.tsx +0 -474
- package/src/components/layout/TableFilter/TableFilter.stories.tsx +0 -82
- package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +0 -87
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +0 -638
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +0 -1008
- package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +0 -386
- package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +0 -435
- package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +0 -614
- package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +0 -845
- package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +0 -578
- package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +0 -660
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +0 -516
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +0 -935
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +0 -501
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +0 -453
- package/src/components/navigation/Pagination/Pagination.stories.tsx +0 -602
- package/src/components/navigation/Pagination/Pagination.test.stories.tsx +0 -520
- package/src/components/navigation/Tabs/Tabs.stories.tsx +0 -1004
- package/src/components/navigation/Tabs/Tabs.test.stories.tsx +0 -1225
- package/src/components/typography/Blockquote/Blockquote.stories.tsx +0 -359
- package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +0 -432
- package/src/components/typography/Code/Code.stories.tsx +0 -686
- package/src/components/typography/Code/Code.test.stories.tsx +0 -703
- package/src/components/typography/Heading/Heading.stories.tsx +0 -451
- package/src/components/typography/Heading/Heading.test.stories.tsx +0 -830
- package/src/components/typography/Paragraph/Paragraph.stories.tsx +0 -280
- package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +0 -231
- package/src/components/typography/Text/Text.stories.tsx +0 -359
- package/src/components/typography/Text/Text.test.stories.tsx +0 -759
- package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +0 -945
- package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +0 -603
- package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +0 -414
- package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +0 -859
- package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +0 -620
- package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +0 -361
- package/src/components/utility/InstallPrompt/InstallPrompt.stories.tsx +0 -118
- package/src/components/utility/InstallPrompt/InstallPrompt.test.stories.tsx +0 -83
- package/src/components/utility/InstallPrompt/__tests__/InstallPrompt.ios.test.tsx +0 -65
- package/src/components/utility/InstallPrompt/__tests__/usePwaInstall.test.tsx +0 -271
- package/src/components/utility/Portal/Portal.stories.tsx +0 -340
- package/src/components/utility/Portal/Portal.test.stories.tsx +0 -2086
- package/src/components/utility/Transition/Transition.stories.tsx +0 -493
- package/src/components/utility/Transition/Transition.test.stories.tsx +0 -854
- package/src/components/utility/VirtualList/VirtualList.stories.tsx +0 -1073
- package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +0 -1085
- package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +0 -431
- package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +0 -364
- /package/src/{button.tsx → button/button.tsx} +0 -0
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { Stack } from '@mui/material';
|
|
3
|
-
|
|
4
|
-
import { Button } from '../../form/Button';
|
|
5
|
-
|
|
6
|
-
import { ConfirmAction } from './ConfirmAction';
|
|
7
|
-
import { ConfirmButton } from './ConfirmButton';
|
|
8
|
-
import { withConfirmation } from './with-confirmation';
|
|
9
|
-
|
|
10
|
-
const meta: Meta<typeof ConfirmAction> = {
|
|
11
|
-
title: 'Feedback/ConfirmAction',
|
|
12
|
-
component: ConfirmAction,
|
|
13
|
-
parameters: {
|
|
14
|
-
layout: 'centered',
|
|
15
|
-
docs: {
|
|
16
|
-
description: {
|
|
17
|
-
component:
|
|
18
|
-
'Wraps a destructive action in a confirmation popup. The guarded handler runs only after the operator confirms; cancelling sends nothing, an in-flight write cannot be fired twice, and a failure keeps the popup open carrying the error.',
|
|
19
|
-
},
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
tags: ['autodocs'],
|
|
23
|
-
argTypes: {
|
|
24
|
-
tone: { control: 'inline-radio', options: ['destructive', 'default'] },
|
|
25
|
-
initialFocus: { control: 'inline-radio', options: ['confirm', 'cancel'] },
|
|
26
|
-
typeToConfirm: { control: 'text' },
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export default meta;
|
|
31
|
-
type Story = StoryObj<typeof meta>;
|
|
32
|
-
|
|
33
|
-
/** Resolves after a beat, so the popup's pending state is visible in the story. */
|
|
34
|
-
const slowWrite = () => new Promise<void>((resolve) => setTimeout(resolve, 1200));
|
|
35
|
-
|
|
36
|
-
export const Default: Story = {
|
|
37
|
-
args: {
|
|
38
|
-
title: 'Excluir a categoria?',
|
|
39
|
-
entityName: 'Bebidas',
|
|
40
|
-
description: 'Ela vai para a lixeira e pode ser restaurada de lá.',
|
|
41
|
-
confirmText: 'Excluir',
|
|
42
|
-
onConfirm: slowWrite,
|
|
43
|
-
children: (request) => (
|
|
44
|
-
<Button color="danger" onClick={request}>
|
|
45
|
-
Excluir
|
|
46
|
-
</Button>
|
|
47
|
-
),
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
/** No body of its own: the popup falls back to naming the row it affects. */
|
|
52
|
-
export const DescriptionFromEntityName: Story = {
|
|
53
|
-
args: {
|
|
54
|
-
...Default.args,
|
|
55
|
-
description: undefined,
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
/** The non-destructive tone — same machinery, and focus opens on the confirm. */
|
|
60
|
-
export const NeutralTone: Story = {
|
|
61
|
-
args: {
|
|
62
|
-
...Default.args,
|
|
63
|
-
title: 'Publicar o cardápio?',
|
|
64
|
-
description: 'As alterações ficam visíveis na vitrine imediatamente.',
|
|
65
|
-
confirmText: 'Publicar',
|
|
66
|
-
tone: 'default',
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
/** For actions with no recovery path: the confirm stays dead until the name is typed. */
|
|
71
|
-
export const TypeToConfirm: Story = {
|
|
72
|
-
args: {
|
|
73
|
-
...Default.args,
|
|
74
|
-
title: 'Excluir definitivamente',
|
|
75
|
-
description: 'Este item e tudo o que depende dele somem para sempre.',
|
|
76
|
-
confirmText: 'Excluir definitivamente',
|
|
77
|
-
typeToConfirm: 'Bebidas',
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
/** The write rejects: the popup stays open and says so, instead of closing silently. */
|
|
82
|
-
export const FailedWrite: Story = {
|
|
83
|
-
args: {
|
|
84
|
-
...Default.args,
|
|
85
|
-
onConfirm: () => Promise.reject(new Error('409')),
|
|
86
|
-
errorText: 'Esta categoria ainda tem produtos vinculados.',
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
/** The long label case — a title and body that wrap. */
|
|
91
|
-
export const LongContent: Story = {
|
|
92
|
-
args: {
|
|
93
|
-
...Default.args,
|
|
94
|
-
title: 'Remover este integrante da equipe e revogar todos os seus acessos?',
|
|
95
|
-
entityName: 'maria.fernanda.dossantos@exemplo.com.br',
|
|
96
|
-
description:
|
|
97
|
-
'A pessoa perde o acesso ao painel imediatamente e precisa de um novo convite para voltar. Os pedidos que ela registrou continuam no histórico da loja, atribuídos ao nome dela.',
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
/** The HOC path: an ordinary button, guarded by adding one prop. */
|
|
102
|
-
export const WithConfirmationHoc: StoryObj = {
|
|
103
|
-
render: () => (
|
|
104
|
-
<Stack direction="row" spacing={2}>
|
|
105
|
-
<ConfirmButton
|
|
106
|
-
color="danger"
|
|
107
|
-
onClick={slowWrite}
|
|
108
|
-
confirm={{
|
|
109
|
-
title: 'Excluir o desconto?',
|
|
110
|
-
entityName: 'Combo almoço',
|
|
111
|
-
description: 'O cupom para de valer na vitrine assim que for excluído.',
|
|
112
|
-
confirmText: 'Excluir',
|
|
113
|
-
}}
|
|
114
|
-
>
|
|
115
|
-
Excluir
|
|
116
|
-
</ConfirmButton>
|
|
117
|
-
<ConfirmButton color="neutral" onClick={slowWrite} confirm={false}>
|
|
118
|
-
Sem confirmação
|
|
119
|
-
</ConfirmButton>
|
|
120
|
-
</Stack>
|
|
121
|
-
),
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
/** Wording baked into the wrapper once; each instance only says what differs. */
|
|
125
|
-
const DeleteButton = withConfirmation(Button, {
|
|
126
|
-
title: 'Excluir o item?',
|
|
127
|
-
confirmText: 'Excluir',
|
|
128
|
-
description: 'Ele vai para a lixeira e pode ser restaurado de lá.',
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
export const HocWithBakedInDefaults: StoryObj = {
|
|
132
|
-
render: () => (
|
|
133
|
-
<Stack direction="row" spacing={2}>
|
|
134
|
-
<DeleteButton color="danger" onClick={slowWrite} confirm={{ entityName: 'Bebidas' }}>
|
|
135
|
-
Excluir categoria
|
|
136
|
-
</DeleteButton>
|
|
137
|
-
<DeleteButton
|
|
138
|
-
color="danger"
|
|
139
|
-
onClick={slowWrite}
|
|
140
|
-
confirm={{ entityName: 'Mesa 12', title: 'Excluir a mesa?' }}
|
|
141
|
-
>
|
|
142
|
-
Excluir mesa
|
|
143
|
-
</DeleteButton>
|
|
144
|
-
</Stack>
|
|
145
|
-
),
|
|
146
|
-
};
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
-
import { expect, fn, userEvent, within } from 'storybook/test';
|
|
3
|
-
|
|
4
|
-
import { Button } from '../../form/Button';
|
|
5
|
-
|
|
6
|
-
import { ConfirmAction } from './ConfirmAction';
|
|
7
|
-
import { ConfirmButton } from './ConfirmButton';
|
|
8
|
-
|
|
9
|
-
const meta: Meta<typeof ConfirmAction> = {
|
|
10
|
-
title: 'Feedback/ConfirmAction/Tests',
|
|
11
|
-
component: ConfirmAction,
|
|
12
|
-
parameters: {
|
|
13
|
-
layout: 'centered',
|
|
14
|
-
chromatic: { disableSnapshot: false },
|
|
15
|
-
},
|
|
16
|
-
tags: ['autodocs', 'test', 'component:ConfirmAction'],
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export default meta;
|
|
20
|
-
type Story = StoryObj<typeof meta>;
|
|
21
|
-
|
|
22
|
-
const BASE = {
|
|
23
|
-
title: 'Excluir a categoria?',
|
|
24
|
-
description: 'Ela vai para a lixeira e pode ser restaurada de lá.',
|
|
25
|
-
confirmText: 'Excluir',
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/** The popup lives on `document.body`, so queries run against the whole screen. */
|
|
29
|
-
const body = (): ReturnType<typeof within> => within(document.body);
|
|
30
|
-
|
|
31
|
-
export const OpensWithoutRunningTheAction: Story = {
|
|
32
|
-
name: '🧪 Trigger opens the popup and runs nothing',
|
|
33
|
-
args: {
|
|
34
|
-
...BASE,
|
|
35
|
-
onConfirm: fn(),
|
|
36
|
-
children: (request) => (
|
|
37
|
-
<Button color="danger" onClick={request}>
|
|
38
|
-
Excluir
|
|
39
|
-
</Button>
|
|
40
|
-
),
|
|
41
|
-
},
|
|
42
|
-
play: async ({ args, canvasElement }) => {
|
|
43
|
-
await userEvent.click(within(canvasElement).getByRole('button', { name: 'Excluir' }));
|
|
44
|
-
|
|
45
|
-
await expect(body().getByText('Excluir a categoria?')).toBeInTheDocument();
|
|
46
|
-
await expect(args.onConfirm).not.toHaveBeenCalled();
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
export const CancelSendsNothing: Story = {
|
|
51
|
-
name: '🧪 Cancel sends nothing',
|
|
52
|
-
args: { ...OpensWithoutRunningTheAction.args, onConfirm: fn() },
|
|
53
|
-
play: async ({ args, canvasElement }) => {
|
|
54
|
-
await userEvent.click(within(canvasElement).getByRole('button', { name: 'Excluir' }));
|
|
55
|
-
await userEvent.click(body().getByTestId('confirm-action-cancel-button'));
|
|
56
|
-
|
|
57
|
-
await expect(args.onConfirm).not.toHaveBeenCalled();
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
export const ConfirmRunsTheAction: Story = {
|
|
62
|
-
name: '🧪 Confirm runs the action once',
|
|
63
|
-
args: { ...OpensWithoutRunningTheAction.args, onConfirm: fn() },
|
|
64
|
-
play: async ({ args, canvasElement }) => {
|
|
65
|
-
await userEvent.click(within(canvasElement).getByRole('button', { name: 'Excluir' }));
|
|
66
|
-
await userEvent.click(body().getByTestId('confirm-action-confirm-button'));
|
|
67
|
-
|
|
68
|
-
await expect(args.onConfirm).toHaveBeenCalledTimes(1);
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
export const TypeToConfirmGate: Story = {
|
|
73
|
-
name: '🧪 Type-to-confirm gates the confirm button',
|
|
74
|
-
args: {
|
|
75
|
-
...OpensWithoutRunningTheAction.args,
|
|
76
|
-
onConfirm: fn(),
|
|
77
|
-
typeToConfirm: 'Bebidas',
|
|
78
|
-
},
|
|
79
|
-
play: async ({ canvasElement }) => {
|
|
80
|
-
await userEvent.click(within(canvasElement).getByRole('button', { name: 'Excluir' }));
|
|
81
|
-
|
|
82
|
-
await expect(body().getByTestId('confirm-action-confirm-button')).toBeDisabled();
|
|
83
|
-
await userEvent.type(body().getByTestId('confirm-action-type-to-confirm'), 'Bebidas');
|
|
84
|
-
await expect(body().getByTestId('confirm-action-confirm-button')).toBeEnabled();
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
export const KeyboardCancelsWithEscape: Story = {
|
|
89
|
-
name: '🧪 Escape closes without running the action',
|
|
90
|
-
args: { ...OpensWithoutRunningTheAction.args, onConfirm: fn() },
|
|
91
|
-
play: async ({ args, canvasElement }) => {
|
|
92
|
-
await userEvent.click(within(canvasElement).getByRole('button', { name: 'Excluir' }));
|
|
93
|
-
await userEvent.keyboard('{Escape}');
|
|
94
|
-
|
|
95
|
-
await expect(args.onConfirm).not.toHaveBeenCalled();
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
|
|
99
|
-
export const HocGuardsTheWrappedButton: StoryObj = {
|
|
100
|
-
name: '🧪 withConfirmation guards the wrapped button',
|
|
101
|
-
render: (_args, { args }) => (
|
|
102
|
-
<ConfirmButton color="danger" onClick={args.onClick} confirm={BASE}>
|
|
103
|
-
Excluir
|
|
104
|
-
</ConfirmButton>
|
|
105
|
-
),
|
|
106
|
-
args: { onClick: fn() },
|
|
107
|
-
play: async ({ args, canvasElement }) => {
|
|
108
|
-
await userEvent.click(within(canvasElement).getByRole('button', { name: 'Excluir' }));
|
|
109
|
-
await expect(args.onClick).not.toHaveBeenCalled();
|
|
110
|
-
|
|
111
|
-
await userEvent.click(body().getByTestId('confirm-action-confirm-button'));
|
|
112
|
-
await expect(args.onClick).toHaveBeenCalledTimes(1);
|
|
113
|
-
},
|
|
114
|
-
};
|
|
@@ -1,288 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The safety contract, asserted at the surface an operator actually touches.
|
|
3
|
-
*
|
|
4
|
-
* Every case here is a way the guard could fail OPEN — the write leaving before
|
|
5
|
-
* anyone confirmed it, or leaving twice. A confirmation that merely renders is
|
|
6
|
-
* worth nothing; what matters is that nothing happens until the confirm button
|
|
7
|
-
* is pressed, and that it then happens exactly once.
|
|
8
|
-
*/
|
|
9
|
-
import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
|
|
10
|
-
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
11
|
-
|
|
12
|
-
import { Button } from '../../../form/Button';
|
|
13
|
-
import { ConfirmAction, withConfirmation } from '../index';
|
|
14
|
-
|
|
15
|
-
afterEach(cleanup);
|
|
16
|
-
|
|
17
|
-
const OPTIONS = {
|
|
18
|
-
title: 'Excluir a categoria?',
|
|
19
|
-
description: 'Ela vai para a lixeira e pode ser restaurada de lá.',
|
|
20
|
-
confirmText: 'Excluir',
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/** The dialog's buttons, by the test ids `AlertDialog` derives from ours. */
|
|
24
|
-
const confirmButton = (): HTMLElement => screen.getByTestId('confirm-action-confirm-button');
|
|
25
|
-
const cancelButton = (): HTMLElement => screen.getByTestId('confirm-action-cancel-button');
|
|
26
|
-
const trigger = (): HTMLElement => screen.getByRole('button', { name: 'Excluir' });
|
|
27
|
-
|
|
28
|
-
function renderConfirmAction(
|
|
29
|
-
onConfirm: () => void | Promise<unknown>,
|
|
30
|
-
options: Record<string, unknown> = {},
|
|
31
|
-
): void {
|
|
32
|
-
render(
|
|
33
|
-
<ConfirmAction {...OPTIONS} {...options} onConfirm={onConfirm}>
|
|
34
|
-
{(request) => (
|
|
35
|
-
<button type="button" onClick={request}>
|
|
36
|
-
Excluir
|
|
37
|
-
</button>
|
|
38
|
-
)}
|
|
39
|
-
</ConfirmAction>,
|
|
40
|
-
);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
describe('ConfirmAction', () => {
|
|
44
|
-
it('opens the popup without running the action', () => {
|
|
45
|
-
const onConfirm = vi.fn();
|
|
46
|
-
renderConfirmAction(onConfirm);
|
|
47
|
-
|
|
48
|
-
fireEvent.click(trigger());
|
|
49
|
-
|
|
50
|
-
expect(screen.getByText('Excluir a categoria?')).toBeInTheDocument();
|
|
51
|
-
expect(onConfirm).not.toHaveBeenCalled();
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('runs nothing when the operator cancels', async () => {
|
|
55
|
-
const onConfirm = vi.fn();
|
|
56
|
-
renderConfirmAction(onConfirm);
|
|
57
|
-
|
|
58
|
-
fireEvent.click(trigger());
|
|
59
|
-
fireEvent.click(cancelButton());
|
|
60
|
-
|
|
61
|
-
expect(onConfirm).not.toHaveBeenCalled();
|
|
62
|
-
await waitFor(() => {
|
|
63
|
-
expect(screen.queryByText('Excluir a categoria?')).not.toBeInTheDocument();
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('runs the action once the operator confirms', async () => {
|
|
68
|
-
const onConfirm = vi.fn();
|
|
69
|
-
renderConfirmAction(onConfirm);
|
|
70
|
-
|
|
71
|
-
fireEvent.click(trigger());
|
|
72
|
-
fireEvent.click(confirmButton());
|
|
73
|
-
|
|
74
|
-
expect(onConfirm).toHaveBeenCalledTimes(1);
|
|
75
|
-
await waitFor(() => {
|
|
76
|
-
expect(screen.queryByText('Excluir a categoria?')).not.toBeInTheDocument();
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('sends one write when the confirm button is double-clicked', () => {
|
|
81
|
-
// The write is held open so both clicks land inside the in-flight window —
|
|
82
|
-
// the exact race a bare onClick would turn into two DELETEs. The resolver
|
|
83
|
-
// lives on a container because the flakiness gate forbids reassigning a
|
|
84
|
-
// closed-over binding from inside a stub.
|
|
85
|
-
const inFlight: { resolve: () => void } = { resolve: () => undefined };
|
|
86
|
-
const onConfirm = vi.fn(
|
|
87
|
-
() =>
|
|
88
|
-
new Promise<void>((resolve) => {
|
|
89
|
-
inFlight.resolve = resolve;
|
|
90
|
-
}),
|
|
91
|
-
);
|
|
92
|
-
renderConfirmAction(onConfirm);
|
|
93
|
-
|
|
94
|
-
fireEvent.click(trigger());
|
|
95
|
-
fireEvent.click(confirmButton());
|
|
96
|
-
fireEvent.click(confirmButton());
|
|
97
|
-
|
|
98
|
-
expect(onConfirm).toHaveBeenCalledTimes(1);
|
|
99
|
-
inFlight.resolve();
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
it('disables the confirm while the write is in flight', async () => {
|
|
103
|
-
const inFlight: { resolve: () => void } = { resolve: () => undefined };
|
|
104
|
-
const onConfirm = vi.fn(
|
|
105
|
-
() =>
|
|
106
|
-
new Promise<void>((resolve) => {
|
|
107
|
-
inFlight.resolve = resolve;
|
|
108
|
-
}),
|
|
109
|
-
);
|
|
110
|
-
renderConfirmAction(onConfirm);
|
|
111
|
-
|
|
112
|
-
fireEvent.click(trigger());
|
|
113
|
-
fireEvent.click(confirmButton());
|
|
114
|
-
|
|
115
|
-
await waitFor(() => {
|
|
116
|
-
expect(confirmButton()).toBeDisabled();
|
|
117
|
-
});
|
|
118
|
-
inFlight.resolve();
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('keeps the popup open, carrying the error, when the action fails', async () => {
|
|
122
|
-
// The server's sentence is the one the operator can act on, so a rejection
|
|
123
|
-
// carrying a message beats the generic fallback.
|
|
124
|
-
const onConfirm = vi.fn(() =>
|
|
125
|
-
Promise.reject(new Error('Esta categoria ainda tem produtos vinculados.')),
|
|
126
|
-
);
|
|
127
|
-
renderConfirmAction(onConfirm);
|
|
128
|
-
|
|
129
|
-
fireEvent.click(trigger());
|
|
130
|
-
fireEvent.click(confirmButton());
|
|
131
|
-
|
|
132
|
-
await waitFor(() => {
|
|
133
|
-
expect(screen.getByTestId('confirm-action-error')).toHaveTextContent(
|
|
134
|
-
'Esta categoria ainda tem produtos vinculados.',
|
|
135
|
-
);
|
|
136
|
-
});
|
|
137
|
-
expect(screen.getByText('Excluir a categoria?')).toBeInTheDocument();
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
it('falls back to the configured wording when the rejection says nothing', async () => {
|
|
141
|
-
const onConfirm = vi.fn(() => Promise.reject(new Error('')));
|
|
142
|
-
renderConfirmAction(onConfirm, { errorText: 'Não foi possível excluir a categoria.' });
|
|
143
|
-
|
|
144
|
-
fireEvent.click(trigger());
|
|
145
|
-
fireEvent.click(confirmButton());
|
|
146
|
-
|
|
147
|
-
await waitFor(() => {
|
|
148
|
-
expect(screen.getByTestId('confirm-action-error')).toHaveTextContent(
|
|
149
|
-
'Não foi possível excluir a categoria.',
|
|
150
|
-
);
|
|
151
|
-
});
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it('recovers from a failure: a second confirm can still run', async () => {
|
|
155
|
-
// `busy` must be released on the failure path too, or the popup is left
|
|
156
|
-
// holding an error it can never be retried out of.
|
|
157
|
-
const attempts = { count: 0 };
|
|
158
|
-
const onConfirm = vi.fn(() => {
|
|
159
|
-
attempts.count += 1;
|
|
160
|
-
return attempts.count === 1 ? Promise.reject(new Error('rede')) : Promise.resolve();
|
|
161
|
-
});
|
|
162
|
-
renderConfirmAction(onConfirm);
|
|
163
|
-
|
|
164
|
-
fireEvent.click(trigger());
|
|
165
|
-
fireEvent.click(confirmButton());
|
|
166
|
-
await waitFor(() => {
|
|
167
|
-
expect(screen.getByTestId('confirm-action-error')).toBeInTheDocument();
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
fireEvent.click(confirmButton());
|
|
171
|
-
expect(onConfirm).toHaveBeenCalledTimes(2);
|
|
172
|
-
await waitFor(() => {
|
|
173
|
-
expect(screen.queryByText('Excluir a categoria?')).not.toBeInTheDocument();
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it('announces as an alertdialog named by its title and described by its body', () => {
|
|
178
|
-
// `alertdialog`, not `dialog`: this interrupts what the operator was doing
|
|
179
|
-
// and will not go away until answered, which is what makes a screen reader
|
|
180
|
-
// read the message out on open instead of just the dialog's name. MUI
|
|
181
|
-
// hardcodes role="dialog", so the override has to keep working.
|
|
182
|
-
renderConfirmAction(vi.fn());
|
|
183
|
-
fireEvent.click(trigger());
|
|
184
|
-
|
|
185
|
-
const dialog = screen.getByRole('alertdialog');
|
|
186
|
-
expect(dialog).toHaveAccessibleName('Excluir a categoria?');
|
|
187
|
-
expect(dialog).toHaveAccessibleDescription(
|
|
188
|
-
/Ela vai para a lixeira e pode ser restaurada de lá./,
|
|
189
|
-
);
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
it('opens with focus on Cancel, so a stray Enter cannot delete', async () => {
|
|
193
|
-
renderConfirmAction(vi.fn());
|
|
194
|
-
|
|
195
|
-
fireEvent.click(trigger());
|
|
196
|
-
|
|
197
|
-
await waitFor(() => {
|
|
198
|
-
expect(cancelButton()).toHaveFocus();
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
it('holds the confirm disabled until the exact text is typed', async () => {
|
|
203
|
-
const onConfirm = vi.fn();
|
|
204
|
-
renderConfirmAction(onConfirm, { typeToConfirm: 'Bebidas' });
|
|
205
|
-
|
|
206
|
-
fireEvent.click(trigger());
|
|
207
|
-
const field = screen.getByTestId('confirm-action-type-to-confirm');
|
|
208
|
-
expect(confirmButton()).toBeDisabled();
|
|
209
|
-
|
|
210
|
-
fireEvent.change(field, { target: { value: 'Bebida' } });
|
|
211
|
-
expect(confirmButton()).toBeDisabled();
|
|
212
|
-
|
|
213
|
-
fireEvent.change(field, { target: { value: 'Bebidas' } });
|
|
214
|
-
expect(confirmButton()).toBeEnabled();
|
|
215
|
-
|
|
216
|
-
fireEvent.click(confirmButton());
|
|
217
|
-
expect(onConfirm).toHaveBeenCalledTimes(1);
|
|
218
|
-
await waitFor(() => {
|
|
219
|
-
expect(screen.queryByText('Excluir a categoria?')).not.toBeInTheDocument();
|
|
220
|
-
});
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
it('starts each open from an empty type-to-confirm field', async () => {
|
|
224
|
-
renderConfirmAction(vi.fn(), { typeToConfirm: 'Bebidas' });
|
|
225
|
-
|
|
226
|
-
fireEvent.click(trigger());
|
|
227
|
-
fireEvent.change(screen.getByTestId('confirm-action-type-to-confirm'), {
|
|
228
|
-
target: { value: 'Bebidas' },
|
|
229
|
-
});
|
|
230
|
-
fireEvent.click(cancelButton());
|
|
231
|
-
await waitFor(() => {
|
|
232
|
-
expect(screen.queryByText('Excluir a categoria?')).not.toBeInTheDocument();
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
fireEvent.click(trigger());
|
|
236
|
-
expect(screen.getByTestId('confirm-action-type-to-confirm')).toHaveValue('');
|
|
237
|
-
expect(confirmButton()).toBeDisabled();
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
describe('withConfirmation', () => {
|
|
242
|
-
const ConfirmButton = withConfirmation(Button);
|
|
243
|
-
|
|
244
|
-
it("guards the wrapped component's own onClick", async () => {
|
|
245
|
-
const onClick = vi.fn();
|
|
246
|
-
render(
|
|
247
|
-
<ConfirmButton onClick={onClick} confirm={OPTIONS}>
|
|
248
|
-
Excluir
|
|
249
|
-
</ConfirmButton>,
|
|
250
|
-
);
|
|
251
|
-
|
|
252
|
-
fireEvent.click(trigger());
|
|
253
|
-
expect(onClick).not.toHaveBeenCalled();
|
|
254
|
-
|
|
255
|
-
fireEvent.click(confirmButton());
|
|
256
|
-
expect(onClick).toHaveBeenCalledTimes(1);
|
|
257
|
-
await waitFor(() => {
|
|
258
|
-
expect(screen.queryByText('Excluir a categoria?')).not.toBeInTheDocument();
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
it('falls through to the plain component when confirm is false', () => {
|
|
263
|
-
const onClick = vi.fn();
|
|
264
|
-
render(
|
|
265
|
-
<ConfirmButton onClick={onClick} confirm={false}>
|
|
266
|
-
Excluir
|
|
267
|
-
</ConfirmButton>,
|
|
268
|
-
);
|
|
269
|
-
|
|
270
|
-
fireEvent.click(trigger());
|
|
271
|
-
|
|
272
|
-
expect(onClick).toHaveBeenCalledTimes(1);
|
|
273
|
-
// A COUNT rather than an absence assertion: the popup was never rendered
|
|
274
|
-
// here, so there is no prior presence to wait for — which is exactly the
|
|
275
|
-
// distinction the flakiness rule exists to enforce.
|
|
276
|
-
expect(screen.queryAllByTestId('confirm-action')).toHaveLength(0);
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
it('does not leak its own confirm prop onto the DOM node', () => {
|
|
280
|
-
render(
|
|
281
|
-
<ConfirmButton onClick={vi.fn()} confirm={OPTIONS}>
|
|
282
|
-
Excluir
|
|
283
|
-
</ConfirmButton>,
|
|
284
|
-
);
|
|
285
|
-
|
|
286
|
-
expect(trigger()).not.toHaveAttribute('confirm');
|
|
287
|
-
});
|
|
288
|
-
});
|