import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { Input } from 'reactstrap'; import { gettext } from '../../utils/constants'; import '../../css/files-activities.css'; const propTypes = { availableUsers: PropTypes.array.isRequired, currentSelectedUsers: PropTypes.array.isRequired, setTargetUsers: PropTypes.func.isRequired, }; class UserSelector extends Component { constructor(props) { super(props); this.state = { isPopoverOpen: false, availableUsers: props.availableUsers.map(item => { item.isSelected = false; return item; }), filteredAvailableUsers: props.availableUsers.map(item => { item.isSelected = false; return item; }) }; } componentDidMount() { document.addEventListener('click', this.handleOutsideClick); } componentWillUnmount() { document.removeEventListener('click', this.handleOutsideClick); } handleOutsideClick = (e) => { const { isPopoverOpen } = this.state; if (isPopoverOpen && !this.userSelector.contains(e.target)) { this.togglePopover(); } } togglePopover = () => { this.setState({ isPopoverOpen: !this.state.isPopoverOpen }, () => { if (!this.state.isPopoverOpen) { const { availableUsers } = this.state; const selectedUsers = availableUsers.filter(item => item.isSelected); this.props.setTargetUsers(selectedUsers); } }); }; onToggleClick = (e) => { e.stopPropagation(); this.togglePopover(); } searchUsers = (e) => { const { availableUsers } = this.state; const query = e.target.value.trim(); const filteredAvailableUsers = availableUsers.filter(item => item.email.indexOf(query) != -1); this.setState({ filteredAvailableUsers: filteredAvailableUsers }); }; toggleSelectItem = (e, targetItem) => { e.stopPropagation(); const { availableUsers } = this.state; const handleItem = (item) => { if (item.email == targetItem.email) { item.isSelected = !targetItem.isSelected; } return item; }; this.setState({ availableUsers: availableUsers.map(handleItem) }); }; render() { const { isPopoverOpen, availableUsers, filteredAvailableUsers } = this.state; const { currentSelectedUsers } = this.props; const selectedUsers = availableUsers.filter(item => item.isSelected); return (
{gettext('Modified by:')} {currentSelectedUsers.length > 0 && ( {currentSelectedUsers.map(item => item.name).join(', ')} )} {isPopoverOpen && (
this.userSelector = ref}>
    {filteredAvailableUsers.map((item, index) => { return (
  • {this.toggleSelectItem(e, item);}}>
    {item.name}
    {item.isSelected && }
  • ); })}
)}
); } } UserSelector.propTypes = propTypes; export default UserSelector;