Create a Custom Attribute Filter
Attribute elements component is a low level counterpart to the Attribute Filter component.
It lists attribute values and allows you to completely customize how they are rendered.
The child function receives the following arguments:
- an array of attribute values
 - a callback to load more values
 - loading status
 - an optional error object
 
Example
In the following example, attribute values are listed as a combination of checkboxes and label elements, a 'load more' button, and an onChange callback that logs the selected values to the console.
import React, { Component } from 'react';
import { AttributeElements } from '@gooddata/react-components';
import PropTypes from 'prop-types';
import '@gooddata/react-components/styles/css/main.css';
import { employeeNameIdentifier, workspaceId } from '../utils/fixtures';
export class AttributeFilterItem extends Component {
    static propTypes = {
        title: PropTypes.string.isRequired,
        uri: PropTypes.string.isRequired
    };
    onChange(uri) {
        // eslint-disable-next-line no-console
        return event => console.log('AttributeFilterItem onChange', uri, event.target.value === 'on');
    }
    render() {
        const { title, uri } = this.props;
        return (
            <label className="gd-list-item s-attribute-filter-list-item" style={{ display: 'inline-flex' }}>
                <input type="checkbox" className="gd-input-checkbox" onChange={this.onChange(uri)} />
                <span>{title}</span>
            </label>
        );
    }
}
export class AttributeElementsExample extends Component {
    render() {
        return (
            <div style={{ minHeight: 500 }}>
                <AttributeElements identifier={employeeNameIdentifier} projectId={workspaceId} options={{ limit: 20 }}>
                    {({ validElements, loadMore, isLoading, error }) => {
                        const {
                            offset = null,
                            count = null,
                            total = null
                        } = validElements ? validElements.paging : {};
                        if (error) {
                            return <div>{error}</div>;
                        }
                        return (
                            <div>
                                <button
                                    className="button button-secondary s-show-more-filters-button"
                                    onClick={loadMore}
                                    disabled={isLoading || (offset + count === total)}
                                >More
                                </button>
                                <h2>validElements</h2>
                                <pre>
                                    isLoading: {isLoading.toString()}<br />
                                    offset: {offset}<br />
                                    count: {count}<br />
                                    total: {total}<br />
                                    nextOffset: {offset + count}
                                </pre>
                                <div>
                                    {validElements ? validElements.items.map(item => (
                                        <AttributeFilterItem
                                            key={item.element.uri}
                                            uri={item.element.uri}
                                            title={item.element.title}
                                        />
                                    )) : null}
                                </div>
                                {validElements ? <pre>{JSON.stringify(validElements, null, '  ')}</pre> : null}
                            </div>
                        );
                    }}
                </AttributeElements>
            </div>
        );
    }
}