import React from "react"; import { connect } from "react-redux"; import { bindActionCreators } from "redux"; import * as actions from "../../actions"; import * as selectors from "../../selectors"; import { Tabs, TabPanel } from "react-tabs"; import FilterListPanel from "./FilterListPanel"; import CategoriesListPanel from "./CategoriesListPanel"; import BottomActions from "./BottomActions"; import copy from "../../common/data/copy.json"; import { trimAndEllipse, getImmediateFilterParent, getFilterSiblings, getFilterParents, } from "../../common/utilities.js"; class Toolbar extends React.Component { constructor(props) { super(props); this.onSelectFilter = this.onSelectFilter.bind(this); this.state = { _selected: -1 }; } selectTab(selected) { const _selected = this.state._selected === selected ? -1 : selected; this.setState({ _selected }); } onSelectFilter(key, matchingKeys) { const { filters, activeFilters, coloringSet, maxNumOfColors } = this.props; const parent = getImmediateFilterParent(filters, key); const isTurningOff = activeFilters.includes(key); if (!isTurningOff) { const flattenedColoringSet = coloringSet.flatMap((f) => f); const newColoringSet = matchingKeys.filter( (k) => flattenedColoringSet.indexOf(k) === -1 ); const updatedColoringSet = [...coloringSet, newColoringSet]; if (updatedColoringSet.length <= maxNumOfColors) { this.props.actions.updateColoringSet(updatedColoringSet); } } else { const newColoringSets = coloringSet.map((set) => set.filter((s) => { return !matchingKeys.includes(s); }) ); this.props.actions.updateColoringSet( newColoringSets.filter((item) => item.length !== 0) ); } if (isTurningOff) { if (parent && activeFilters.includes(parent)) { const siblings = getFilterSiblings(filters, parent, key); let siblingsOff = true; for (const sibling of siblings) { if (activeFilters.includes(sibling)) { siblingsOff = false; break; } } if (siblingsOff) { const grandparentsOn = getFilterParents(filters, key).filter((filt) => activeFilters.includes(filt) ); matchingKeys = matchingKeys.concat(grandparentsOn); } } } this.props.methods.onSelectFilter(matchingKeys); } renderClosePanel() { return (
this.selectTab(-1)}>
); } goToNarrative(narrative) { this.selectTab(-1); // set all unselected within this component this.props.methods.onSelectNarrative(narrative); } renderToolbarNarrativePanel() { return (

{copy[this.props.language].toolbar.narrative_panel_title}

{copy[this.props.language].toolbar.narrative_summary}

{this.props.narratives.map((narr) => { return (
); })}
); } renderToolbarCategoriesPanel() { if (this.props.features.CATEGORIES_AS_FILTERS) { return ( ); } } renderToolbarFilterPanel() { return ( ); } renderToolbarTab(_selected, label, iconKey) { const isActive = this.state._selected === _selected; const classes = isActive ? "toolbar-tab active" : "toolbar-tab"; return (
{ this.selectTab(_selected); }} > {iconKey}
{label}
); } renderToolbarPanels() { const { features, narratives } = this.props; const classes = this.state._selected >= 0 ? "toolbar-panels" : "toolbar-panels folded"; return (
{this.renderClosePanel()} {narratives && narratives.length !== 0 ? this.renderToolbarNarrativePanel() : null} {features.CATEGORIES_AS_FILTERS ? this.renderToolbarCategoriesPanel() : null} {features.USE_ASSOCIATIONS ? this.renderToolbarFilterPanel() : null}
); } renderToolbarNavs() { if (this.props.narratives) { return this.props.narratives.map((nar, idx) => { const isActive = idx === this.state._selected; const classes = isActive ? "toolbar-tab active" : "toolbar-tab"; return (
{ this.selectTab(idx); }} >
{nar.label}
); }); } return null; } renderToolbarTabs() { const { features, narratives } = this.props; const narrativesExist = narratives && narratives.length !== 0; let title = copy[this.props.language].toolbar.title; if (process.env.display_title) title = process.env.display_title; const narrativesLabel = copy[this.props.language].toolbar.narratives_label; const filtersLabel = copy[this.props.language].toolbar.filters_label; const categoriesLabel = "Categories"; // TODO: const narrativesIdx = 0; const categoriesIdx = narrativesExist ? 1 : 0; const filtersIdx = narrativesExist && features.CATEGORIES_AS_FILTERS ? 2 : narrativesExist || features.CATEGORIES_AS_FILTERS ? 1 : 0; return (

{title}

{narrativesExist ? this.renderToolbarTab(narrativesIdx, narrativesLabel, "timeline") : null} {features.CATEGORIES_AS_FILTERS ? this.renderToolbarTab(categoriesIdx, categoriesLabel, "widgets") : null} {features.USE_ASSOCIATIONS ? this.renderToolbarTab(filtersIdx, filtersLabel, "filter_list") : null}
); } render() { const { isNarrative } = this.props; return (
{this.renderToolbarTabs()} {this.renderToolbarPanels()}
); } } function mapStateToProps(state) { return { filters: selectors.getFilters(state), categories: selectors.getCategories(state), narratives: selectors.selectNarratives(state), language: state.app.language, activeFilters: selectors.getActiveFilters(state), activeCategories: selectors.getActiveCategories(state), viewFilters: state.app.associations.views, narrative: state.app.associations.narrative, sitesShowing: state.app.flags.isShowingSites, infoShowing: state.app.flags.isInfopopup, coloringSet: state.app.associations.coloringSet, maxNumOfColors: state.ui.coloring.maxNumOfColors, filterColors: state.ui.coloring.colors, features: selectors.getFeatures(state), }; } function mapDispatchToProps(dispatch) { return { actions: bindActionCreators(actions, dispatch), }; } export default connect(mapStateToProps, mapDispatchToProps)(Toolbar);