|
| 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; |
0 commit comments