ndla-ui
Version:
UI component library for NDLA.
119 lines (107 loc) • 3.12 kB
JSX
/* eslint-disable react/no-multi-comp */
import React, { Fragment, Component } from 'react';
import PropTypes from 'prop-types';
import BEMHelper from 'react-bem-helper';
import { ChevronRight } from 'ndla-icons/common';
// import { Cross } from 'ndla-icons/action';
import { FilterList } from 'ndla-ui';
import Modal, { ModalCloseButton, ModalHeader, ModalBody } from 'ndla-modal';
import Button from 'ndla-button';
const filterClasses = new BEMHelper({
name: 'filter',
prefix: 'c-',
});
const messagesShape = PropTypes.shape({
backButton: PropTypes.string.isRequired,
closeButton: PropTypes.string.isRequired,
confirmButton: PropTypes.string.isRequired,
filterLabel: PropTypes.string.isRequired,
hasValuesButtonText: PropTypes.string.isRequired,
noValuesButtonText: PropTypes.string.isRequired,
});
class Popover extends Component {
constructor(props) {
super(props);
this.state = {
values: props.values,
};
}
render() {
const { messages, close, options, onChange } = this.props;
return (
<Fragment>
<FilterList
options={options}
label={messages.filterLabel}
values={this.state.values}
modifiers="search-popover"
onChange={values => {
this.setState({
values,
});
}}
/>
<div {...filterClasses('usefilter-wrapper')}>
<Button
outline
onClick={() => {
close();
onChange(this.state.values);
}}>
{messages.confirmButton}
</Button>
</div>
</Fragment>
);
}
}
Popover.propTypes = {
messages: messagesShape.isRequired,
close: PropTypes.func,
values: PropTypes.arrayOf(PropTypes.string).isRequired,
options: PropTypes.arrayOf(
PropTypes.shape({
title: PropTypes.string.isRequired,
value: PropTypes.string.isRequired,
}),
).isRequired,
onChange: PropTypes.func.isRequired,
};
const PopoverFilter = ({ messages, values, onChange, ...rest }) => {
const buttonText =
values.length > 0
? messages.hasValuesButtonText
: messages.noValuesButtonText;
const buttonContent = (
<button type="button" {...filterClasses('expand')}>
<span>{buttonText}</span>
<ChevronRight />
</button>
);
return (
<Modal animation="slide-up" size="medium" activateButton={buttonContent}>
{onClose => (
<Fragment>
<ModalHeader modifiers="white">
<ModalCloseButton title="Lukk" onClick={onClose} />
</ModalHeader>
<ModalBody modifier="no-side-padding-mobile">
<Popover
close={onClose}
onChange={onChange}
messages={messages}
{...rest}
values={values}
/>
</ModalBody>
</Fragment>
)}
</Modal>
);
};
PopoverFilter.propTypes = {
values: PropTypes.arrayOf(PropTypes.string).isRequired,
messages: messagesShape.isRequired,
onChange: PropTypes.func.isRequired,
};
export default PopoverFilter;