Skip to content

Commit 40a8001

Browse files
authored
Merge pull request #1285 from rvsia/addCascadingSelectExample
Add Cascading Select example
2 parents 2cdc8f8 + 2d1362d commit 40a8001

File tree

3 files changed

+107
-0
lines changed

3 files changed

+107
-0
lines changed

packages/react-renderer-demo/src/components/navigation/schemas/custom-examples.schema.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ const customExamplesSchema = [
3131
component: 'value-listener',
3232
linkText: 'Value listener',
3333
},
34+
{
35+
component: 'cascading-select',
36+
linkText: 'Cascading select',
37+
},
3438
];
3539

3640
export default customExamplesSchema;
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import React from 'react';
2+
import FormRenderer from '@data-driven-forms/react-form-renderer/form-renderer';
3+
import componentTypes from '@data-driven-forms/react-form-renderer/component-types';
4+
import FormSpy from '@data-driven-forms/react-form-renderer/form-spy';
5+
import FormTemplate from '@data-driven-forms/mui-component-mapper/form-template';
6+
import Select from '@data-driven-forms/mui-component-mapper/select';
7+
8+
const mockApi = (type) => {
9+
console.log(type);
10+
switch (type) {
11+
case 'vegetable':
12+
return Promise.resolve([
13+
{ label: 'Carrot', value: 'carrot' },
14+
{ label: 'Potato', value: 'potato' },
15+
]);
16+
case 'fruit':
17+
return Promise.resolve([
18+
{ label: 'Apple', value: 'apple' },
19+
{ label: 'Orange', value: 'orange' },
20+
]);
21+
case 'pasta':
22+
return Promise.resolve([
23+
{ label: 'Manicotti', value: 'manicotti' },
24+
{ label: 'Rotini', value: 'rotini' },
25+
{ label: 'Tortellini', value: 'tortellini' },
26+
{ label: 'Bucatini', value: 'bucatini' },
27+
]);
28+
default:
29+
return Promise.resolve([]);
30+
}
31+
};
32+
33+
const counterMapper = (type) => {
34+
switch (type) {
35+
case 'vegetable':
36+
return 3;
37+
case 'fruit':
38+
return 2;
39+
case 'pasta':
40+
return 1;
41+
default:
42+
return 0;
43+
}
44+
};
45+
46+
const schema = {
47+
fields: [
48+
{
49+
component: 'select',
50+
name: 'favorite',
51+
label: 'Select your favorite category of food',
52+
options: [
53+
{ label: 'Vegetable', value: 'vegetable' },
54+
{ label: 'Fruit', value: 'fruit' },
55+
{ label: 'Pasta', value: 'pasta' },
56+
],
57+
},
58+
{
59+
component: 'enhanced-select',
60+
name: 'food',
61+
label: 'Select your favorite food of the selected category',
62+
onInputChange: () => null,
63+
noOptionsMessage: 'Select category first',
64+
resolveProps: (_props, _field, { getState }) => {
65+
const favoriteValue = getState().values.favorite;
66+
67+
return {
68+
loadOptionsChangeCounter: counterMapper(favoriteValue),
69+
loadOptions: () => mockApi(favoriteValue),
70+
};
71+
},
72+
},
73+
],
74+
};
75+
76+
const EnhancedSelect = (props) => <FormSpy subscription={{ values: true }}>{() => <Select {...props} />}</FormSpy>;
77+
78+
const componentMapper = {
79+
[componentTypes.SELECT]: Select,
80+
'enhanced-select': EnhancedSelect,
81+
};
82+
83+
const CascadingSelect = () => <FormRenderer FormTemplate={FormTemplate} componentMapper={componentMapper} schema={schema} onSubmit={console.log} />;
84+
85+
export default CascadingSelect;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import DocPage from '@docs/doc-page';
2+
import CodeExample from '@docs/code-example';
3+
4+
<DocPage>
5+
6+
# Cascading select
7+
8+
This example shows how to integrate that asynchronously loaded select depends on a value from different select.
9+
10+
This select combines common DDF select with [value listener](/examples/value-listener). To change `loadOptions` prop you have to tell the component that the function is being changed. If you provide a function, that has the same string representation, you have to provide `loadOptionsChangeCounter` (*number*) prop to trigger a data reload.
11+
12+
Using `noValueUpdates` (*boolean*) prop you control whether the value is being cleared when is not found in the current options array.
13+
14+
## Preview
15+
16+
<CodeExample source="components/examples/cascading-select" mode="preview" />
17+
18+
</DocPage>

0 commit comments

Comments
 (0)