Filter by timerange on selecting Narrative

This commit is contained in:
Franc Camps-Febrer
2018-12-06 12:23:02 +00:00
parent b53e4876da
commit b6f7053375
12 changed files with 52 additions and 16 deletions

View File

@@ -1,5 +1,5 @@
import copy from '../js/data/copy.json';
import {isNotNullNorUndefined} from '../js/data/utilities';
import {isNotNullNorUndefined} from '../js/utilities';
import React from 'react';
import Spinner from './presentational/Spinner';

View File

@@ -6,7 +6,7 @@ import Card from './Card.jsx';
import copy from '../js/data/copy.json';
import {
isNotNullNorUndefined
} from '../js/data/utilities.js';
} from '../js/utilities.js';
class CardStack extends React.Component {

View File

@@ -64,7 +64,6 @@ class NarrativeCard extends React.Component {
}
function mapStateToProps(state) {
console.log(state)
return {
narrative: state.app.narrative
}

View File

@@ -2,7 +2,7 @@ import React from 'react'
import { connect } from 'react-redux'
import * as selectors from '../selectors'
import Map from '../js/map/map.js'
import { areEqual } from '../js/data/utilities.js'
import { areEqual } from '../js/utilities.js'
class Viewport extends React.Component {
constructor(props) {

View File

@@ -1,7 +1,7 @@
import React from 'react';
import copy from '../../js/data/copy.json';
import {isNotNullNorUndefined} from '../../js/data/utilities';
import { isNotNullNorUndefined } from '../../js/utilities';
const CardLocation = ({ language, location }) => {

View File

@@ -1,7 +1,7 @@
import React from 'react';
import copy from '../../js/data/copy.json';
import {isNotNullNorUndefined} from '../../js/data/utilities';
import { isNotNullNorUndefined } from '../../js/utilities';
const CardTimestamp = ({ makeTimelabel, language, timestamp }) => {

View File

@@ -1,7 +1,7 @@
import {
areEqual,
isNotNullNorUndefined
} from '../data/utilities';
} from '../utilities';
import hash from 'object-hash';
import 'leaflet-polylinedecorator';
@@ -363,16 +363,19 @@ Stop and start the development process in terminal after you have added your tok
.attr('class', 'narrative')
.attr('d', sequenceLine)
.style('stroke-width', d => {
if (!d[0]) return 0;
// Note: [0] is a non-elegant way to get the narrative id out of the first
// event in the narrative sequence
const styleProps = getNarrativeStyle(d[0].narrative);
return styleProps.strokeWidth;
})
.style('stroke-dasharray', d => {
if (!d[0]) return 'none';
const styleProps = getNarrativeStyle(d[0].narrative);
return (styleProps.style === 'dotted') ? "2px 5px" : 'none';
})
.style('stroke', d => {
if (!d[0]) return 'none';
const styleProps = getNarrativeStyle(d[0].narrative);
return styleProps.stroke;
})

View File

@@ -6,7 +6,7 @@
*/
import {
areEqual
} from '../data/utilities';
} from '../utilities';
import esLocale from '../data/es-MX.json';
import copy from '../data/copy.json';

View File

@@ -35,3 +35,17 @@ export function areEqual(arr1, arr2) {
export function isNotNullNorUndefined(variable) {
return (typeof variable !== 'undefined' && variable !== null);
}
/**
* Return a Date object given a datetime string of the format: "2016-09-10T07:00:00"
* @param {string} datetime
*/
export function parseDate(datetime) {
return new Date(datetime.slice(0, 4),
datetime.slice(5, 7) - 1,
datetime.slice(8, 10),
datetime.slice(11, 13),
datetime.slice(14, 16),
datetime.slice(17, 19)
);
}

View File

@@ -1,5 +1,7 @@
import initial from '../store/initial.js';
import { parseDate } from '../js/utilities.js';
import {
UPDATE_HIGHLIGHTED,
UPDATE_SELECTED,
@@ -26,9 +28,25 @@ function updateSelected(appState, action) {
}
function updateNarrative(appState, action) {
return Object.assign({}, appState, {
narrative: action.narrative
});
if (action.narrative === null) {
return Object.assign({}, appState, {
narrative: action.narrative,
});
} else {
const dates = action.narrative.steps.map(n => parseDate(n.timestamp).getTime())
let minDate = Math.min(...dates);
let maxDate = Math.max(...dates);
// Add some margin to the datetime extent
minDate = minDate - ((maxDate - minDate) / 20);
maxDate = maxDate + ((maxDate - minDate) / 20);
return Object.assign({}, appState, {
narrative: action.narrative,
filters: Object.assign({}, appState.filters, {
timerange: [new Date(minDate), new Date(maxDate)]
}),
});
}
}
function updateTagFilters(appState, action) {

View File

@@ -94,10 +94,11 @@ export const selectNarratives = createSelector(
const isTimeRanged = isTimeRangedIn(evt, timeRange);
const isInNarrative = evt.narrative;
if (isTimeRanged && isTagged && isInNarrative) {
if (!narratives[evt.narrative]) {
narratives[evt.narrative] = { id: evt.narrative, steps: [], byId: {} };
}
if (!narratives[evt.narrative]) {
narratives[evt.narrative] = { id: evt.narrative, steps: [], byId: {} };
}
if (/*isTimeRanged && isTagged && */isInNarrative) {
narratives[evt.narrative].steps.push(evt);
narratives[evt.narrative].byId[evt.id] = { next: null, prev: null };
}
@@ -117,6 +118,7 @@ export const selectNarratives = createSelector(
narratives[key] = Object.assign(narrativeMetadata.find(n => n.id === key), narratives[key]);
});
console.log(narrativeMetadata, narratives)
return Object.values(narratives);
});