import * as React from 'react'; import PostListByPostStatus from './PostListByPostStatus'; import MultiSelect, { MultiSelectOption } from '../common/MultiSelect'; import IPostStatus from '../../interfaces/IPostStatus'; import IPostJSON from '../../interfaces/json/IPost'; import IBoard from '../../interfaces/IBoard'; interface Props { postStatuses: Array; posts: Array; boards: Array; isEmbedded: boolean; } interface State { selectedBoards: Array; selectedPostStatuses: Array; } class Roadmap extends React.Component { private showBoardFilter: boolean; private showPostStatusFilter: boolean; private boardsToShow: Array; private postStatusesToShow: Array; constructor(props: Props) { super(props); // read query params const queryParams = new URLSearchParams(window.location.search); this.showBoardFilter = queryParams.get('show_board_filter') !== 'false'; this.showPostStatusFilter = queryParams.get('show_status_filter') !== 'false'; this.boardsToShow = queryParams.get('show_boards') ? queryParams.get('show_boards').split(',').map(Number) : props.boards.map(board => board.id); this.postStatusesToShow = queryParams.get('show_statuses') ? queryParams.get('show_statuses').split(',').map(Number) : props.postStatuses.map(postStatus => postStatus.id); this.state = { selectedBoards: props.boards.filter(board => this.boardsToShow.includes(board.id)).map(board => ({ value: board.id, label: board.name })), selectedPostStatuses: props.postStatuses.filter(postStatus => this.postStatusesToShow.includes(postStatus.id)).map(postStatus => ({ value: postStatus.id, label: postStatus.name, color: postStatus.color })), }; this.setSelectedBoards = this.setSelectedBoards.bind(this); this.setSelectedPostStatuses = this.setSelectedPostStatuses.bind(this); } setSelectedBoards(selectedBoards: Array) { this.setState({ ...this.state, selectedBoards, }); } setSelectedPostStatuses(selectedPostStatuses: Array) { this.setState({ ...this.state, selectedPostStatuses, }); } render() { const { postStatuses, posts, boards } = this.props; const { selectedBoards, selectedPostStatuses } = this.state; const boardSelectOptions = boards.filter(board => this.boardsToShow.includes(board.id)).map(board => ({ value: board.id, label: board.name })); const postStatusSelectOptions = postStatuses.filter(postStatus => this.postStatusesToShow.includes(postStatus.id)).map(postStatus => ({ value: postStatus.id, label: postStatus.name, color: postStatus.color })); // Filter by board const filteredPosts = posts.filter(post => selectedBoards.some(selectedBoard => selectedBoard.value === post.board_id) ); // Filter by post status const filteredPostStatuses = postStatuses.filter(postStatus => selectedPostStatuses.some(selectedPostStatus => selectedPostStatus.value === postStatus.id) ); return (
{ this.showBoardFilter && } { this.showPostStatusFilter && }
{filteredPostStatuses.map((postStatus, i) => ( post.post_status_id === postStatus.id)} boards={boards} openPostsInNewTab={this.props.isEmbedded} key={i} /> ))}
); } } export default Roadmap;