Skip to content

Commit d913ef3

Browse files
committed
feat(evergreen): add combo-box component to evergreen component mapper
combo-box will be treated similar to a select component, with a required format for an array of objects to populate items
1 parent 663f904 commit d913ef3

File tree

5 files changed

+75
-1
lines changed

5 files changed

+75
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ dist
1818
.env.development.local
1919
.env.test.local
2020
.env.production.local
21+
.idea
2122

2223
npm-debug.log*
2324
yarn-debug.log*
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import React, { useMemo } from 'react';
2+
3+
import { Combobox as EvergreenCombobox, FormField } from 'evergreen-ui';
4+
5+
import useFieldApi from '@data-driven-forms/react-form-renderer/use-field-api';
6+
import {
7+
AnyObject,
8+
UseFieldApiProps,
9+
} from '@data-driven-forms/react-form-renderer';
10+
11+
export interface ComboBoxItem extends AnyObject {
12+
value?: any;
13+
label: string;
14+
}
15+
16+
export interface ComboBoxProps extends UseFieldApiProps<string> {
17+
name: string;
18+
isRequired?: boolean;
19+
options: ComboBoxItem[];
20+
}
21+
22+
const ComboBox: React.FC<ComboBoxProps> = (props) => {
23+
const {
24+
id,
25+
input,
26+
meta,
27+
isDisabled,
28+
options,
29+
isRequired,
30+
label,
31+
description,
32+
inputProps,
33+
...rest
34+
} = useFieldApi(props);
35+
36+
const selectedItem = useMemo(() => {
37+
return options.find((item: ComboBoxItem) => item.value === input.value);
38+
}, [input.value, options]);
39+
40+
return (
41+
<FormField
42+
labelFor={id}
43+
label={label}
44+
description={description}
45+
isRequired={isRequired}
46+
validationMessage={meta.error}
47+
marginBottom={24}
48+
>
49+
<EvergreenCombobox
50+
id={id}
51+
width="100%"
52+
selectedItem={selectedItem}
53+
onChange={(item?: ComboBoxItem) => input.onChange(item?.value)}
54+
disabled={isDisabled}
55+
items={options}
56+
itemToString={(item?: ComboBoxItem) => (item ? item.label : '')}
57+
inputProps={{
58+
required: isRequired,
59+
isInvalid: Boolean(meta.error),
60+
...inputProps,
61+
}}
62+
{...rest}
63+
/>
64+
</FormField>
65+
);
66+
};
67+
68+
export default ComboBox;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { default } from './combo-box';
2+
export * from './combo-box';

packages/evergreen-component-mapper/src/component-mapper/component-mapper.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Tabs from '../tabs';
99
import FieldArray from '../field-array';
1010
import Link from '../link';
1111
import PlainText from '../plain-text';
12+
import ComboBox from '../combo-box';
1213

1314
const NullComponent = () => <span>Not implemented</span>;
1415

@@ -28,7 +29,8 @@ const mapper = {
2829
[componentTypes.FIELD_ARRAY]: FieldArray,
2930
[componentTypes.DUAL_LIST_SELECT]: NullComponent,
3031
[componentTypes.SLIDER]: NullComponent,
31-
'link': Link
32+
'link': Link,
33+
'combo-box': ComboBox
3234
};
3335

3436
export default mapper;

packages/evergreen-component-mapper/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from './checkbox';
2+
export * from './combo-box';
23
export * from './component-mapper';
34
export * from './field-array';
45
export * from './link';

0 commit comments

Comments
 (0)