Skip to content

Commit 22deef7

Browse files
johannes-weberJohannes Weber
andauthored
chore: Warn when columns exceed max value in Key-Value pairs component (#3645)
Co-authored-by: Johannes Weber <[email protected]>
1 parent d80496e commit 22deef7

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

src/key-value-pairs/__tests__/key-value-pairs.test.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,29 @@
33
import * as React from 'react';
44
import { render } from '@testing-library/react';
55

6+
import { warnOnce } from '@cloudscape-design/component-toolkit/internal';
7+
68
import Icon from '../../../lib/components/icon';
79
import KeyValuePairs from '../../../lib/components/key-value-pairs';
810
import Link from '../../../lib/components/link';
911
import SpaceBetween from '../../../lib/components/space-between';
1012
import createWrapper, { IconWrapper } from '../../../lib/components/test-utils/dom';
1113

14+
jest.mock('@cloudscape-design/component-toolkit/internal', () => ({
15+
...jest.requireActual('@cloudscape-design/component-toolkit/internal'),
16+
warnOnce: jest.fn(),
17+
}));
18+
1219
function renderKeyValuePairs(jsx: React.ReactElement) {
1320
const { container, ...rest } = render(jsx);
1421
return { wrapper: createWrapper(container).findKeyValuePairs()!, ...rest };
1522
}
1623

1724
describe('KeyValuePairs', () => {
25+
afterEach(() => {
26+
(warnOnce as jest.Mock).mockReset();
27+
});
28+
1829
describe('item rendering', () => {
1930
test('renders correctly', () => {
2031
const { wrapper } = renderKeyValuePairs(
@@ -95,6 +106,25 @@ describe('KeyValuePairs', () => {
95106
});
96107
});
97108

109+
describe('warnOnce when columns property exceeds max', () => {
110+
test.each([
111+
{ columns: 1, warnOnceMessage: false },
112+
{ columns: 2, warnOnceCalled: false },
113+
{
114+
columns: 3,
115+
warnOnceCalled: false,
116+
},
117+
{ columns: 4, warnOnceCalled: false },
118+
{
119+
columns: 5,
120+
warnOnceCalled: true,
121+
},
122+
])(`warnOnce called = $warnOnceCalled when columns is set to $columns`, ({ columns, warnOnceCalled }) => {
123+
renderKeyValuePairs(<KeyValuePairs items={[]} columns={columns} />);
124+
expect(warnOnce).toHaveBeenCalledTimes(warnOnceCalled ? 1 : 0);
125+
});
126+
});
127+
98128
describe('column layout', () => {
99129
test('renders correctly', () => {
100130
const { wrapper } = renderKeyValuePairs(

src/key-value-pairs/internal.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import React from 'react';
44
import clsx from 'clsx';
55

6-
import { useUniqueId } from '@cloudscape-design/component-toolkit/internal';
6+
import { useUniqueId, warnOnce } from '@cloudscape-design/component-toolkit/internal';
77

88
import Box from '../box/internal';
99
import ColumnLayout from '../column-layout/internal';
@@ -51,6 +51,15 @@ const InternalKeyValuePairs = React.forwardRef(
5151
}: KeyValuePairsProps & Required<Pick<KeyValuePairsProps, 'columns'>>,
5252
ref: React.Ref<HTMLDivElement>
5353
) => {
54+
const MAX_COLUMNS = 4;
55+
56+
if (columns > MAX_COLUMNS) {
57+
warnOnce(
58+
'Key-value pairs',
59+
`\`columns\` (${columns}) must be <= ${MAX_COLUMNS}. Using ${MAX_COLUMNS} as default.`
60+
);
61+
}
62+
5463
return (
5564
<LinkDefaultVariantContext.Provider value={{ defaultVariant: 'primary' }}>
5665
<div
@@ -66,7 +75,7 @@ const InternalKeyValuePairs = React.forwardRef(
6675
*/}
6776
<ColumnLayout
6877
__tagOverride="dl"
69-
columns={Math.min(columns, 4)}
78+
columns={Math.min(columns, MAX_COLUMNS)}
7079
variant="text-grid"
7180
minColumnWidth={minColumnWidth}
7281
>

0 commit comments

Comments
 (0)