import React, { Component } from 'react'; import { DataList, DataListCell, DataListItem, DataListItemCells, DataListItemRow, } from '@patternfly/react-core'; import PropTypes from 'prop-types'; import useFormApi from '@data-driven-forms/react-form-renderer/use-form-api'; import useFieldApi from '@data-driven-forms/react-form-renderer/use-field-api'; class DataListRow extends Component { state = { hasError: false, }; componentDidCatch(_error, info) { this.setState({ hasError: info }); } render() { const { fieldsKey, label, fields, formOptions } = this.props; const { hasError } = this.state; return ( <DataListItemRow> <DataListItemCells dataListCells={[ <DataListCell isFilled={false} className="pref-c-title pref-u-bold" key={`${fieldsKey}-title`} > {fieldsKey === 0 ? label : ''} </DataListCell>, <DataListCell isFilled key={`${fieldsKey}-content`}> {hasError ? 'Error while mapping fields, please check your schema if it has valid component types' : formOptions?.renderForm(fields, formOptions)} </DataListCell>, ]} /> </DataListItemRow> ); } } DataListRow.propTypes = { fieldsKey: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), fields: PropTypes.array, FieldProvider: PropTypes.any, formOptions: PropTypes.any, label: PropTypes.node, name: PropTypes.string, validate: PropTypes.any, FormSpyProvider: PropTypes.any, }; // eslint-disable-next-line no-unused-vars const DataListLayout = (props) => { const { sections, label, name } = useFieldApi(props); const formOptions = useFormApi(); return ( <DataList aria-label={label || name} {...props}> {sections.map(({ label, fields }, key) => { const actualFields = Array.isArray(fields) ? fields : [fields]; return ( actualFields.length > 0 && ( <DataListItem name={name} key={key} aria-labelledby="simple-item1"> {actualFields.map(({ fields: fieldsToRender }, fieldsKey) => ( <DataListRow key={`${key}-${fieldsKey}`} fieldsKey={fieldsKey} label={label} fields={fieldsToRender} formOptions={formOptions} /> ))} </DataListItem> ) ); })} </DataList> ); }; DataListLayout.propTypes = { sections: PropTypes.array, FieldProvider: PropTypes.any, formOptions: PropTypes.any, label: PropTypes.node, name: PropTypes.string, validate: PropTypes.any, FormSpyProvider: PropTypes.any, }; export default DataListLayout;