import cn from 'classnames'; import { connect } from 'react-redux'; import { Set, List as ImmutableList } from "immutable"; import { NoContent, Loader, Checkbox, LoadMoreButton, IconButton, Input, DropdownPlain } from 'UI'; import { merge, resolve, unresolve, ignore, updateCurrentPage } from "Duck/errors"; import { applyFilter } from 'Duck/filters'; import { IGNORED, RESOLVED, UNRESOLVED } from 'Types/errorInfo'; import SortDropdown from 'Components/BugFinder/Filters/SortDropdown'; import Divider from 'Components/Errors/ui/Divider'; import ListItem from './ListItem/ListItem'; const PER_PAGE = 5; const DEFAULT_SORT = 'lastOccurrence'; const DEFAULT_ORDER = 'desc'; const sortOptionsMap = { 'lastOccurrence-desc': 'Last Occurrence', 'firstOccurrence-desc': 'First Occurrence', 'sessions-asc': 'Sessions Ascending', 'sessions-desc': 'Sessions Descending', 'users-asc': 'Users Ascending', 'users-desc': 'Users Descending', }; const sortOptions = Object.entries(sortOptionsMap) .map(([ value, text ]) => ({ value, text })); @connect(state => ({ loading: state.getIn([ "errors", "loading" ]), resolveToggleLoading: state.getIn(["errors", "resolve", "loading"]) || state.getIn(["errors", "unresolve", "loading"]), ignoreLoading: state.getIn([ "errors", "ignore", "loading" ]), mergeLoading: state.getIn([ "errors", "merge", "loading" ]), currentPage: state.getIn(["errors", "currentPage"]), }), { merge, resolve, unresolve, ignore, applyFilter, updateCurrentPage, }) export default class List extends React.PureComponent { state = { checkedAll: false, checkedIds: Set(), sort: {} } componentDidMount() { this.props.applyFilter({ sort: DEFAULT_SORT, order: DEFAULT_ORDER, events: ImmutableList(), filters: ImmutableList() }); } check = ({ errorId }) => { const { checkedIds } = this.state; const newCheckedIds = checkedIds.contains(errorId) ? checkedIds.remove(errorId) : checkedIds.add(errorId); this.setState({ checkedAll: newCheckedIds.size === this.props.list.size, checkedIds: newCheckedIds }); } checkAll = () => { if (this.state.checkedAll) { this.setState({ checkedAll: false, checkedIds: Set(), }); } else { this.setState({ checkedAll: true, checkedIds: this.props.list.map(({ errorId }) => errorId).toSet(), }); } } resetChecked = () => { this.setState({ checkedAll: false, checkedIds: Set(), }); } currentCheckedIds() { return this.state.checkedIds .intersect(this.props.list.map(({ errorId }) => errorId).toSet()); } merge = () => { this.props.merge(currentCheckedIds().toJS()).then(this.resetChecked); } applyToAllChecked(f) { return Promise.all(this.currentCheckedIds().map(f).toJS()).then(this.resetChecked); } resolve = () => { this.applyToAllChecked(this.props.resolve); } unresolve = () => { this.applyToAllChecked(this.props.unresolve); } ignore = () => { this.applyToAllChecked(this.props.ignore); } addPage = () => this.props.updateCurrentPage(this.props.currentPage + 1) writeOption = (e, { name, value }) => { const [ sort, order ] = value.split('-'); const sign = order === 'desc' ? -1 : 1; this.setState({ sort: { sort, order }}) } render() { const { list, status, loading, ignoreLoading, resolveToggleLoading, mergeLoading, onFilterChange, currentPage, } = this.props; const { checkedAll, checkedIds, sort } = this.state; const someLoading = loading || ignoreLoading || resolveToggleLoading || mergeLoading; const currentCheckedIds = this.currentCheckedIds(); const displayedCount = Math.min(currentPage * PER_PAGE, list.size); let _list = sort.sort ? list.sortBy(i => i[sort.sort]) : list; _list = sort.order === 'desc' ? _list.reverse() : _list; return (
{ status === UNRESOLVED ? : } { status !== IGNORED && }
Sort By
{ _list.take(displayedCount).map(e => <> )}
); } }