From bd0e6b673e526eb4c8f997d2b85e9d7098afb097 Mon Sep 17 00:00:00 2001 From: Franc Camps-Febrer Date: Mon, 12 Nov 2018 15:18:11 -0500 Subject: [PATCH] Add selector and reducer for narrative --- src/reducers/schema/eventSchema.js | 1 + src/selectors/index.js | 44 ++++++++++++++++++++++++++++++ src/store/initial.js | 1 + 3 files changed, 46 insertions(+) diff --git a/src/reducers/schema/eventSchema.js b/src/reducers/schema/eventSchema.js index c01528e..3ecc635 100644 --- a/src/reducers/schema/eventSchema.js +++ b/src/reducers/schema/eventSchema.js @@ -11,6 +11,7 @@ const eventSchema = Joi.object().keys({ longitude: Joi.string().required(), type: Joi.string().allow(''), category: Joi.string().required(), + narrative: Joi.string().allow(''), source: Joi.string().allow(''), tags: Joi.string().allow(''), comments: Joi.string().allow(''), diff --git a/src/selectors/index.js b/src/selectors/index.js index 5a8f00b..1f52b23 100644 --- a/src/selectors/index.js +++ b/src/selectors/index.js @@ -49,6 +49,7 @@ export const getFilteredEvents = createSelector( const isRange = (rangeFilter[0] < d3.timeParse('%Y-%m-%dT%H:%M:%S')(value.timestamp)) && (d3.timeParse('%Y-%m-%dT%H:%M:%S')(value.timestamp) < rangeFilter[1]) +<<<<<<< HEAD if (isRange && isTagged) { const event = Object.assign({}, value) acc[event.id] = event @@ -57,6 +58,49 @@ export const getFilteredEvents = createSelector( }, []) } ) +======= + const isRange = (rangeFilter[0] < d3.timeParse("%Y-%m-%dT%H:%M:%S")(value.timestamp)) && + (d3.timeParse("%Y-%m-%dT%H:%M:%S")(value.timestamp) < rangeFilter[1]); + + if (isRange && isTagged) { + const event = Object.assign({}, value); + acc[event.id] = event; + } + + return acc; + }, []); +}); +>>>>>>> Add selector and reducer for narrative + +/** + * Of all available events, selects those that fall within the time range, + * and if TAGS are being used, select them if their tags are enabled + */ +const parseTimestamp = ts => d3.timeParse("%Y-%m-%dT%H:%M:%S")(ts); +export const getFilteredNarratives = createSelector( + [getEvents, getTagsFilter, getRangeFilter], + (events, tagFilters, rangeFilter) => { + + const narratives = {}; + events.forEach((evt) => { + const noTags = (tagFilters.length === 0 || !process.env.features.USE_TAGS || tagFilters.every(t => !t.active)); + + const isTagged = (noTags) || isTaggedIn(evt, tagFilters); + const isRange = (rangeFilter[0] < parseTimestamp(evt.timestamp)) && + (parseTimestamp(evt.timestamp) < rangeFilter[1]); + + if (isRange && isTagged && evt.narrative) { + if (!narratives[evt.narrative]) narratives[evt.narrative] = { key: evt.narrative, steps: [] }; + narratives[evt.narrative].steps.push(evt); + } + }); + Object.keys(narratives).forEach((key) => { + narratives[key].steps.sort((a, b) => { + return (parseTimestamp(a.timestamp) > parseTimestamp(b.timestamp)); + }); + }) + return Object.values(narratives); +}); /** * Of all the filtered events, group them by location and return a list of diff --git a/src/store/initial.js b/src/store/initial.js index 1059aa8..fd2e900 100644 --- a/src/store/initial.js +++ b/src/store/initial.js @@ -7,6 +7,7 @@ const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl') const initial = { domain: { events: [], + narratives: [], locations: [], categories: [],