Creates an event type called TIMELINE_ONLY which doesnt get filtered by filter panel; allowing for panel copy to be read in via the config

This commit is contained in:
efarooqui
2021-05-12 20:03:02 -07:00
parent 7e14f5427d
commit b50ee8b5fe
6 changed files with 75 additions and 19 deletions

View File

@@ -3,3 +3,11 @@ export const ASSOCIATION_MODES = {
NARRATIVE: "NARRATIVE",
FILTER: "FILTER",
};
export const TIMELINE_ONLY = "TIMELINE_ONLY";
export const DEFAULT_TAB_ICONS = {
CATEGORY: "widgets",
NARRATIVE: "timeline",
FILTER: "filter_list",
};

View File

@@ -123,7 +123,7 @@
"panels": {
"mentions": {
"title": "Mentions",
"overview": "Selecting the names of people/organisation will show events in which these have been mentioned in their own testistimony and by others. The number in the parentheses shows how many events contain a mention of a person or organisation, e.g. (34)"
"overview": "Selecting the names of people/organisation will show events in which these have been mentioned in their own testimony and by others. The number in the parentheses shows how many events contain a mention of a person or organisation, e.g. (34)"
},
"categories": {
"title": "Testimonies",
@@ -137,6 +137,7 @@
"narratives_label": "Narratives",
"narrative_summary": "Follow a path through the data, from one key event to the next.",
"categories": "Categories",
"categories_label": "Categories",
"filters": "Filters",
"filters_label": "Filters",
"explore_by_filter__title": "Explore by filter",

View File

@@ -17,6 +17,7 @@ import {
addToColoringSet,
removeFromColoringSet,
} from "../common/utilities.js";
import { DEFAULT_TAB_ICONS } from "../common/constants";
class Toolbar extends React.Component {
constructor(props) {
@@ -108,7 +109,15 @@ class Toolbar extends React.Component {
}
renderToolbarCategoriesPanel() {
if (this.props.features.CATEGORIES_AS_FILTERS) {
const { panels } = this.props.toolbarCopy;
const panelTitle = panels.categories.label
? panels.categories.label
: copy[this.props.language].toolbar.categories;
const panelDescription = panels.categories.description
? panels.categories.description
: copy[this.props.language].toolbar.explore_by_category__description;
if (this.props.features.USE_CATEGORIES) {
return (
<TabPanel>
<CategoriesListPanel
@@ -116,6 +125,8 @@ class Toolbar extends React.Component {
activeCategories={this.props.activeCategories}
onCategoryFilter={this.props.methods.onCategoryFilter}
language={this.props.language}
title={panelTitle}
description={panelDescription}
/>
</TabPanel>
);
@@ -165,9 +176,7 @@ class Toolbar extends React.Component {
{narratives && narratives.length !== 0
? this.renderToolbarNarrativePanel()
: null}
{features.CATEGORIES_AS_FILTERS
? this.renderToolbarCategoriesPanel()
: null}
{features.USE_CATEGORIES ? this.renderToolbarCategoriesPanel() : null}
{features.USE_ASSOCIATIONS ? this.renderToolbarFilterPanel() : null}
</Tabs>
</div>
@@ -197,13 +206,26 @@ class Toolbar extends React.Component {
}
renderToolbarTabs() {
const { features, narratives } = this.props;
const { features, narratives, toolbarCopy } = 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 { panels } = toolbarCopy;
const narrativesLabel = copy[this.props.language].toolbar.narratives_label;
const filtersLabel = copy[this.props.language].toolbar.filters_label;
const categoriesLabel = "Categories"; // TODO:
const filtersLabel = panels.filters.label
? panels.filters.label
: copy[this.props.language].toolbar.filters_label;
const categoriesLabel = panels.categories.label
? panels.categories.label
: copy[this.props.language].toolbar.categories_label;
const filterIcon = panels.filters.icon
? panels.filters.icon
: DEFAULT_TAB_ICONS.FILTER;
const categoriesIcon = panels.categories.icon
? panels.categories.icon
: DEFAULT_TAB_ICONS.CATEGORY;
const narrativesIdx = 0;
const categoriesIdx = narrativesExist ? 1 : 0;
@@ -223,10 +245,14 @@ class Toolbar extends React.Component {
? this.renderToolbarTab(narrativesIdx, narrativesLabel, "timeline")
: null}
{features.CATEGORIES_AS_FILTERS
? this.renderToolbarTab(categoriesIdx, categoriesLabel, "widgets")
? this.renderToolbarTab(
categoriesIdx,
categoriesLabel,
categoriesIcon
)
: null}
{features.USE_ASSOCIATIONS
? this.renderToolbarTab(filtersIdx, filtersLabel, "filter_list")
? this.renderToolbarTab(filtersIdx, filtersLabel, filterIcon)
: null}
</div>
<BottomActions
@@ -268,6 +294,7 @@ function mapStateToProps(state) {
categories: selectors.getCategories(state),
narratives: selectors.selectNarratives(state),
language: state.app.language,
toolbarCopy: state.app.toolbar,
activeFilters: selectors.getActiveFilters(state),
activeCategories: selectors.getActiveCategories(state),
viewFilters: state.app.associations.views,

View File

@@ -1,13 +1,14 @@
import React from "react";
import marked from "marked";
import Checkbox from "../atoms/Checkbox";
import copy from "../../common/data/copy.json";
const CategoriesListPanel = ({
categories,
activeCategories,
onCategoryFilter,
language,
title,
description,
}) => {
function renderCategoryTree() {
return (
@@ -33,12 +34,10 @@ const CategoriesListPanel = ({
return (
<div className="react-innertabpanel">
<h2>{copy[language].toolbar.categories}</h2>
<h2>{title}</h2>
<p
dangerouslySetInnerHTML={{
__html: marked(
copy[language].toolbar.explore_by_category__description
),
__html: marked(description),
}}
/>
{renderCategoryTree()}

View File

@@ -8,7 +8,7 @@ import {
createFilterPathString,
} from "../common/utilities";
import { isTimeRangedIn } from "./helpers";
import { ASSOCIATION_MODES } from "../common/constants";
import { ASSOCIATION_MODES, TIMELINE_ONLY } from "../common/constants";
// Input selectors
export const getEvents = (state) => state.domain.events;
@@ -95,9 +95,13 @@ export const selectEvents = createSelector(
isActiveTime = features.GRAPH_NONLOCATED
? (!event.latitude && !event.longitude) || isActiveTime
: isActiveTime;
if (isActiveTime && isActiveFilter && isActiveCategory) {
acc[event.id] = { ...event };
// if (isActiveTime && isActiveFilter && isActiveCategory) {
// acc[event.id] = { ...event };
// }
if (isActiveTime && isActiveCategory) {
if (event.type === TIMELINE_ONLY || isActiveFilter) {
acc[event.id] = { ...event };
}
}
return acc;
}, []);

View File

@@ -3,6 +3,7 @@ import { mergeDeepLeft } from "ramda";
import global, { colors } from "../common/global";
import copy from "../common/data/copy.json";
import { language } from "../common/utilities";
import { DEFAULT_TAB_ICONS } from "../common/constants";
const isSmallLaptop = window.innerHeight < 800;
const mapIniital = {
@@ -105,6 +106,22 @@ const initial = {
"A description of the project goes here.\n\nThis description may contain markdown.\n\n# This is a large title, for example.\n\n## Whereas this is a slightly smaller title.\n\nCheck out docs/custom-covers.md in the [Timemap GitHub repo](https://github.com/forensic-architecture/timemap) for more information around how to specify custom covers.",
exploreButton: "EXPLORE",
},
toolbar: {
panels: {
categories: {
icon: DEFAULT_TAB_ICONS.CATEGORY,
label: copy[language].toolbar.categories_label,
title: copy[language].toolbar.explore_by_category__title,
description: copy[language].toolbar.explore_by_category__description,
},
filters: {
icon: DEFAULT_TAB_ICONS.FILTER,
label: copy[language].toolbar.filters_label,
title: copy[language].toolbar.explore_by_filter__title,
description: copy[language].toolbar.explore_by_filter__description,
},
},
},
loading: false,
},