Skip to content

Commit 7431412

Browse files
committed
fix: controlled tag added a default selected prop and tests carbon-design-system#19228
1 parent 3b440f1 commit 7431412

File tree

2 files changed

+51
-8
lines changed

2 files changed

+51
-8
lines changed

packages/react/src/components/Tag/SelectableTag.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ export interface SelectableTagBaseProps {
6161
*/
6262
selected?: boolean;
6363

64+
/**
65+
* Specify the default state of the selectable tag.
66+
*/
67+
defaultSelected?: boolean;
68+
6469
/**
6570
* Specify the size of the Tag. Currently supports either `sm`,
6671
* `md` (default) or `lg` sizes.
@@ -90,6 +95,7 @@ const SelectableTag = forwardRef(
9095
selected,
9196
size,
9297
text,
98+
defaultSelected = false,
9399
...other
94100
}: SelectableTagProps<T>,
95101
forwardRef: ForwardedRef<HTMLButtonElement>
@@ -100,7 +106,7 @@ const SelectableTag = forwardRef(
100106
const [selectedTag, setSelectedTag] = useControllableState({
101107
value: selected,
102108
onChange: onChange,
103-
defaultValue: false,
109+
defaultValue: defaultSelected,
104110
});
105111
const tagClasses = classNames(`${prefix}--tag--selectable`, className, {
106112
[`${prefix}--tag--selectable-selected`]: selectedTag,
@@ -206,6 +212,11 @@ SelectableTag.propTypes = {
206212
*/
207213
selected: PropTypes.bool,
208214

215+
/**
216+
* Specify the default state of the selectable tag.
217+
*/
218+
defaultSelected: PropTypes.bool,
219+
209220
/**
210221
* Specify the size of the Tag. Currently supports either `sm`,
211222
* `md` (default) or `lg` sizes.

packages/react/src/components/Tag/Tag-test.js

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -310,32 +310,64 @@ describe('Tag', () => {
310310
});
311311
it('Controlled selectable tag', () => {
312312
const ref = React.createRef();
313-
const { rerender, container } = render(
313+
const { rerender } = render(
314314
<SelectableTag type="red" text="Test Tag" ref={ref} selected={true} />
315315
);
316316

317317
expect(ref.current).toBeInstanceOf(HTMLButtonElement);
318-
expect(container.firstChild).toHaveClass(
319-
`${prefix}--tag--selectable-selected`
318+
expect(screen.getByRole('button', { name: 'Test Tag' })).toHaveAttribute(
319+
'aria-pressed',
320+
'true'
320321
);
321322

322323
rerender(
323324
<SelectableTag type="red" text="Test Tag" ref={ref} selected={false} />
324325
);
325-
expect(container.firstChild).not.toHaveClass(
326-
`${prefix}--tag--selectable-selected`
326+
expect(screen.getByRole('button', { name: 'Test Tag' })).toHaveAttribute(
327+
'aria-pressed',
328+
'false'
327329
);
328330
});
329331
it('Controlled selectable tag, should call onChange', async () => {
330332
const onChange = jest.fn();
331333

332-
const { container } = render(
334+
render(
333335
<SelectableTag text="Tag content" onChange={onChange} selected={true} />
334336
);
335337

336-
const selectableTag = container.firstChild;
338+
const selectableTag = screen.getByRole('button', { name: 'Tag content' });
337339

338340
await userEvent.click(selectableTag);
339341
expect(onChange).toHaveBeenCalledWith(false);
340342
});
343+
it('Controlled selectable tag should be selected by default if defaultSelected is true', () => {
344+
const onChange = jest.fn();
345+
346+
render(
347+
<SelectableTag
348+
text="Tag content"
349+
onChange={onChange}
350+
defaultSelected={true}
351+
/>
352+
);
353+
354+
const selectableTag = screen.getByRole('button', { name: 'Tag content' });
355+
356+
expect(selectableTag).toHaveAttribute('aria-pressed', 'true');
357+
});
358+
it('Controlled selectable tag should not be be selected by default if defaultSelected is false', () => {
359+
const onChange = jest.fn();
360+
361+
render(
362+
<SelectableTag
363+
text="Tag content"
364+
onChange={onChange}
365+
defaultSelected={false}
366+
/>
367+
);
368+
369+
const selectableTag = screen.getByRole('button', { name: 'Tag content' });
370+
371+
expect(selectableTag).toHaveAttribute('aria-pressed', 'false');
372+
});
341373
});

0 commit comments

Comments
 (0)