Demos#
Boolean example#
<Form.Handler> <Flex.Stack> <Field.Boolean label="Show content" variant="buttons" path="/toggleValue" value={false} /> <Form.Visibility pathTrue="/toggleValue" animate> <TestElement>Item 1</TestElement> <TestElement>Item 2</TestElement> </Form.Visibility> </Flex.Stack> </Form.Handler>
Matching value#
visibleWhen is pretty powerful. You can use it to show/hide based on the value of a path. You can also give it a hasValue function that gives you the current value, so you can assert it and return a boolean based on that.
<Form.VisibilityvisibleWhen={{path: '/toggleValue',hasValue: (value) => value === 'checked',}}>Content</Form.Visibility>
<Form.Handler> <Field.Toggle label="Show content" valueOn="checked" valueOff="unchecked" variant="buttons" path="/toggleValue" value="unchecked" /> <Form.Visibility visibleWhen={{ path: '/toggleValue', hasValue: 'checked', }} animate > <P>This is visible</P> </Form.Visibility> </Form.Handler>
Direct properties#
This is visible
<Form.Visibility visible={true}> <P>This is visible</P> </Form.Visibility>
Based on DataContext#
<Form.Handler data={{ toBe: true, notToBe: false, }} > <Form.Visibility pathTrue="/toBe"> <P>This will show, as long as `toBe` is true.</P> </Form.Visibility> <Form.Visibility pathTrue="/notToBe"> <P>This will not show until `notToBe` is true.</P> </Form.Visibility> </Form.Handler>
InferData#
const MyComponent = () => { const { data } = Form.useData('example-form', { toggleValue: false, }) const inferDataFunc = useCallback( () => data.toggleValue, [data.toggleValue] ) return ( <Form.Handler id="example-form"> <Flex.Stack> <Field.Boolean path="/toggleValue" label="Check me" /> <Form.Visibility inferData={inferDataFunc} animate> <P>This is visible</P> </Form.Visibility> </Flex.Stack> </Form.Handler> ) } render(<MyComponent />)
Nested visibility example#
Use fieldPropsWhenHidden and keepInDOM to keep the content in the DOM, even if it's not visible.
In this example we filter out all fields that have the data-exclude-field attribute. See the console output for the result.
const filterDataHandler = ({ props }) => !props['data-exclude-field'] const MyForm = () => { return ( <Form.Handler defaultData={{ isVisible: false, }} > <Flex.Stack> <Field.Boolean label="Visible" variant="button" path="/isVisible" data-exclude-field /> <Form.Visibility pathTrue="/isVisible" animate keepInDOM fieldPropsWhenHidden={{ 'data-exclude-field': true, }} > <Field.Selection label="Choose" variant="radio" value="less" path="/mySelection" > <Field.Option value="less" title="Less" /> <Field.Option value="more" title="More" /> </Field.Selection> <Form.Visibility visibleWhen={{ path: '/mySelection', hasValue: 'more', }} animate keepInDOM fieldPropsWhenHidden={{ 'data-exclude-field': true, }} > <Field.String label="My String" path="/myString" value="foo" /> </Form.Visibility> </Form.Visibility> </Flex.Stack> <Output /> </Form.Handler> ) } const Output = () => { const { filterData } = Form.useData() const filteredData = filterData(filterDataHandler) return <Tools.Log data={filteredData} top /> } render(<MyForm />)
Filter data#
Note: This example uses filterData with pathDefined on a Visibility component along, which is a declarative way to describe the data to be shown.
const filterDataPaths = { '/isVisible': false, '/mySelection': ({ data }) => data.isVisible, '/myString': ({ data }) => { return data.isVisible && data.mySelection === 'more' }, } const MyForm = () => { return ( <Form.Handler defaultData={{ myString: 'foo', }} > <Flex.Stack> <Field.Boolean label="Visible" variant="button" path="/isVisible" defaultValue={false} /> <Form.Visibility pathTrue="/isVisible" animate> <Field.Selection label="Choose" variant="radio" value="less" path="/mySelection" > <Field.Option value="less" title="Less" /> <Field.Option value="more" title="More" /> </Field.Selection> <Form.Visibility visibleWhen={{ path: '/mySelection', hasValue: 'more', }} animate > <Field.String label="My String" path="/myString" /> </Form.Visibility> </Form.Visibility> <Form.Visibility pathDefined="/myString" filterData={filterDataPaths} animate > <Form.Card> <P> Result: <Value.String path="/myString" inline /> </P> </Form.Card> </Form.Visibility> </Flex.Stack> <Output /> </Form.Handler> ) } const Output = () => { const { filterData } = Form.useData() const filteredData = filterData(filterDataPaths) return <Tools.Log data={filteredData} top /> } render(<MyForm />)
Inherit visibility#
<Form.Handler> <Form.Card> <Field.Boolean variant="button" path="/isVisible" defaultValue={true} /> <Form.Visibility pathTrue="/isVisible" animate> <Field.Name.First path="/foo" defaultValue="foo" /> <Field.Name.Last path="/bar" defaultValue="bar" /> </Form.Visibility> <Value.Provider inheritVisibility> <HeightAnimation> <Value.SummaryList> <Value.Name.First path="/foo" /> <Value.Name.First path="/bar" /> </Value.SummaryList> </HeightAnimation> </Value.Provider> </Form.Card> </Form.Handler>
Show children when field has no errors (validation)#
<Form.Handler> <Form.Card> <Field.Name.First path="/foo" required /> <Form.Visibility visibleWhen={{ path: '/foo', isValid: true, }} animate > <Value.Name.First path="/foo" /> </Form.Visibility> </Form.Card> </Form.Handler>