Skip to content

Commit 44cd7a5

Browse files
committed
fix(pf4): allow translated strings in select
1 parent 28166c1 commit 44cd7a5

File tree

6 files changed

+82
-4
lines changed

6 files changed

+82
-4
lines changed

packages/pf4-component-mapper/demo/demo-schemas/select-schema.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import React from 'react';
12
import componentTypes from '@data-driven-forms/react-form-renderer/dist/cjs/component-types';
23

34
const options = [
@@ -127,6 +128,37 @@ const selectSchema = {
127128
name: 'dosbaled-option-select',
128129
label: 'Disabled-option-select',
129130
options: [...options, { label: 'Disabled option', value: 'disabled', isDisabled: true }]
131+
},
132+
{
133+
component: componentTypes.SELECT,
134+
name: 'translated-select',
135+
label: 'Translated-select',
136+
options: [
137+
{
138+
label: <span>None</span>,
139+
key: 'none'
140+
},
141+
{
142+
label: <span>Jack</span>,
143+
value: 'jack'
144+
}
145+
]
146+
},
147+
{
148+
component: componentTypes.SELECT,
149+
name: 'translated-select-multi',
150+
label: 'Translated-select-multi',
151+
isMulti: true,
152+
options: [
153+
{
154+
label: <span>Jack</span>,
155+
value: 'jack'
156+
},
157+
{
158+
label: <span>Mary</span>,
159+
value: 'Mary'
160+
}
161+
]
130162
}
131163
]
132164
};

packages/pf4-component-mapper/demo/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const fieldArrayState = { schema: arraySchemaDDF, additionalOptions: {
2424
class App extends React.Component {
2525
constructor(props) {
2626
super(props);
27-
this.state = {schema: wizardSchema, additionalOptions: {}}
27+
this.state = {schema: selectSchema, additionalOptions: {}}
2828
}
2929

3030
render() {

packages/pf4-component-mapper/src/common/select/menu.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ const Menu = ({
106106
isSelected: isMulti ? !!selectedItem.find(({ value }) => item.value === value) : selectedItem === item.value,
107107
onMouseUp: (e) => e.stopPropagation() // we need this to prevent issues with portal menu not selecting a option
108108
});
109-
return <Option key={item.value} item={item} {...itemProps} />;
109+
return <Option key={item.key || item.value || (typeof item.label === 'string' && item.label) || item} item={item} {...itemProps} />;
110110
})}
111111
</ul>
112112
);

packages/pf4-component-mapper/src/common/select/select.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ const itemToString = (value, isMulti, showMore, handleShowMore, handleChange) =>
2929
{visibleOptions.map((item, index) => {
3030
const label = typeof item === 'object' ? item.label : item;
3131
return (
32-
<li className="pf-c-chip-group__list-item" onClick={(event) => event.stopPropagation()} key={label}>
32+
<li className="pf-c-chip-group__list-item" onClick={(event) => event.stopPropagation()} key={item.key || item.value || item}>
3333
<div className="pf-c-chip">
3434
<span className="pf-c-chip__text" id={`pf-random-id-${index}-${label}`}>
3535
{label}
@@ -53,7 +53,7 @@ const itemToString = (value, isMulti, showMore, handleShowMore, handleChange) =>
5353
);
5454
}
5555

56-
return value.map((item) => (typeof item === 'object' ? item.label : item)).join(',');
56+
return value.map((item) => (typeof item === 'object' ? item.label : item));
5757
}
5858

5959
if (typeof value === 'object') {

packages/pf4-component-mapper/src/files/select.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ReactNode } from "react";
55
export interface SelectOption {
66
label: ReactNode;
77
value?: any;
8+
key?: string;
89
}
910

1011
interface BaseSelectProps {

packages/pf4-component-mapper/src/tests/select/select.test.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import React from 'react';
22
import { mount } from 'enzyme';
33
import isEqual from 'lodash/isEqual';
4+
import FormRenderer, { componentTypes } from '@data-driven-forms/react-form-renderer';
45

56
import Select from '../../common/select/select';
67
import { act } from 'react-dom/test-utils';
8+
import ValueContainer from '../../common/select/value-container';
9+
import FormTemplate from '../../files/form-template';
10+
import componentMapper from '../../files/component-mapper';
711

812
describe('<Select />', () => {
913
let initialProps;
@@ -30,6 +34,47 @@ describe('<Select />', () => {
3034
onChange.mockReset();
3135
});
3236

37+
it('should render translated option in value container', async () => {
38+
const wrapper = mount(
39+
<FormRenderer
40+
onSubmit={jest.fn}
41+
FormTemplate={FormTemplate}
42+
componentMapper={componentMapper}
43+
schema={{
44+
fields: [
45+
{
46+
component: componentTypes.SELECT,
47+
name: 'select',
48+
options: [
49+
{
50+
label: <h1>Translated</h1>,
51+
value: 'translated'
52+
}
53+
]
54+
}
55+
]
56+
}}
57+
/>
58+
);
59+
60+
expect(wrapper.find(ValueContainer).find('h1')).toHaveLength(0);
61+
62+
wrapper.find('.pf-c-select__toggle').simulate('click');
63+
const option = wrapper.find('button.pf-c-select__menu-item').first();
64+
65+
await act(async () => {
66+
option.simulate('click');
67+
});
68+
wrapper.update();
69+
70+
expect(
71+
wrapper
72+
.find(ValueContainer)
73+
.find('h1')
74+
.text()
75+
).toEqual('Translated');
76+
});
77+
3378
it('should return single simple value', async () => {
3479
const wrapper = mount(<Select {...initialProps} />);
3580
wrapper.find('.pf-c-select__toggle').simulate('click');

0 commit comments

Comments
 (0)