From 2d1362dd4112c49ccb18f5b615136ad39cb2373b Mon Sep 17 00:00:00 2001 From: rvsia Date: Mon, 11 Jul 2022 15:53:10 +0200 Subject: [PATCH] Add Cascading Select example --- .../schemas/custom-examples.schema.js | 4 + .../components/examples/cascading-select.js | 85 +++++++++++++++++++ .../src/pages/examples/cascading-select.md | 18 ++++ 3 files changed, 107 insertions(+) create mode 100644 packages/react-renderer-demo/src/examples/components/examples/cascading-select.js create mode 100644 packages/react-renderer-demo/src/pages/examples/cascading-select.md diff --git a/packages/react-renderer-demo/src/components/navigation/schemas/custom-examples.schema.js b/packages/react-renderer-demo/src/components/navigation/schemas/custom-examples.schema.js index f9cec059e..8d24e5ec9 100644 --- a/packages/react-renderer-demo/src/components/navigation/schemas/custom-examples.schema.js +++ b/packages/react-renderer-demo/src/components/navigation/schemas/custom-examples.schema.js @@ -31,6 +31,10 @@ const customExamplesSchema = [ component: 'value-listener', linkText: 'Value listener', }, + { + component: 'cascading-select', + linkText: 'Cascading select', + }, ]; export default customExamplesSchema; diff --git a/packages/react-renderer-demo/src/examples/components/examples/cascading-select.js b/packages/react-renderer-demo/src/examples/components/examples/cascading-select.js new file mode 100644 index 000000000..a0d34f565 --- /dev/null +++ b/packages/react-renderer-demo/src/examples/components/examples/cascading-select.js @@ -0,0 +1,85 @@ +import React from 'react'; +import FormRenderer from '@data-driven-forms/react-form-renderer/form-renderer'; +import componentTypes from '@data-driven-forms/react-form-renderer/component-types'; +import FormSpy from '@data-driven-forms/react-form-renderer/form-spy'; +import FormTemplate from '@data-driven-forms/mui-component-mapper/form-template'; +import Select from '@data-driven-forms/mui-component-mapper/select'; + +const mockApi = (type) => { + console.log(type); + switch (type) { + case 'vegetable': + return Promise.resolve([ + { label: 'Carrot', value: 'carrot' }, + { label: 'Potato', value: 'potato' }, + ]); + case 'fruit': + return Promise.resolve([ + { label: 'Apple', value: 'apple' }, + { label: 'Orange', value: 'orange' }, + ]); + case 'pasta': + return Promise.resolve([ + { label: 'Manicotti', value: 'manicotti' }, + { label: 'Rotini', value: 'rotini' }, + { label: 'Tortellini', value: 'tortellini' }, + { label: 'Bucatini', value: 'bucatini' }, + ]); + default: + return Promise.resolve([]); + } +}; + +const counterMapper = (type) => { + switch (type) { + case 'vegetable': + return 3; + case 'fruit': + return 2; + case 'pasta': + return 1; + default: + return 0; + } +}; + +const schema = { + fields: [ + { + component: 'select', + name: 'favorite', + label: 'Select your favorite category of food', + options: [ + { label: 'Vegetable', value: 'vegetable' }, + { label: 'Fruit', value: 'fruit' }, + { label: 'Pasta', value: 'pasta' }, + ], + }, + { + component: 'enhanced-select', + name: 'food', + label: 'Select your favorite food of the selected category', + onInputChange: () => null, + noOptionsMessage: 'Select category first', + resolveProps: (_props, _field, { getState }) => { + const favoriteValue = getState().values.favorite; + + return { + loadOptionsChangeCounter: counterMapper(favoriteValue), + loadOptions: () => mockApi(favoriteValue), + }; + }, + }, + ], +}; + +const EnhancedSelect = (props) => {() =>