Newer
Older
/**
* Hydrograph charting module.
*/
Bucknell, Mary S.
committed
import {select} from 'd3-selection';
Bucknell, Mary S.
committed
Bucknell, Mary S.
committed
import {createStructuredSelector} from 'reselect';
Bucknell, Mary S.
committed
import config from '../../config';
Bucknell, Mary S.
committed
import {drawWarningAlert, drawInfoAlert} from '../../d3-rendering/alerts';
Bucknell, Mary S.
committed
import {link} from '../../lib/d3-redux';
import {hasAnyTimeSeries, getCurrentParmCd, getVariables} from '../../selectors/time-series-selector';
Bucknell, Mary S.
committed
import {Actions} from '../../store';
import {renderTimeSeriesUrlParams} from '../../url-params';
Bucknell, Mary S.
committed
Bucknell, Mary S.
committed
import {cursorSlider} from './cursor';
import {drawDateRangeControls} from './date-controls';
import {lineSegmentsByParmCdSelector} from './drawing-data';
import {drawGraphBrush} from './graph-brush';
import {drawGraphControls} from './graph-controls';
import {SPARK_LINE_DIM} from './layout';
import {drawTimeSeriesLegend} from './legend';
import {drawLoadingIndicator} from '../../d3-rendering/loading-indicator';
Bucknell, Mary S.
committed
import {drawMethodPicker} from './method-picker';
import {plotSeriesSelectTable, availableTimeSeriesSelector} from './parameters';
import {timeSeriesScalesByParmCdSelector} from './scales';
import {drawTimeSeriesGraph} from './time-series-graph';
Bucknell, Mary S.
committed
/**
Bucknell, Mary S.
committed
* Modify styling to hide or display the elem.
Bucknell, Mary S.
committed
*
* @param elem
Bucknell, Mary S.
committed
* @param {Boolean} showElem
Bucknell, Mary S.
committed
*/
const controlDisplay = function(elem, showElem) {
Bucknell, Mary S.
committed
elem.attr('hidden', showElem ? null : true);
Bucknell, Mary S.
committed
};
Bucknell, Mary S.
committed
Bucknell, Mary S.
committed
export const attachToNode = function (store,
node,
{
siteno,
Bucknell, Mary S.
committed
parameterCode,
Bucknell, Mary S.
committed
compare,
period,
startDT,
endDT,
Bucknell, Mary S.
committed
showOnlyGraph = false,
showMLName = false
} = {}) {
Bucknell, Mary S.
committed
const nodeElem = select(node);
if (!siteno) {
Bucknell, Mary S.
committed
select(node).call(drawWarningAlert, {title: 'Hydrograph Alert', body: 'No data is available.'});
Bucknell, Mary S.
committed
}
// Initialize hydrograph with the store and show the loading indicator
Bucknell, Mary S.
committed
store.dispatch(Actions.resizeUI(window.innerWidth, node.offsetWidth));
Bucknell, Mary S.
committed
nodeElem
Naab, Daniel James
committed
.select('.loading-indicator-container')
.call(drawLoadingIndicator, {showLoadingIndicator: true, sizeClass: 'fa-3x'});
Bucknell, Mary S.
committed
// Fetch time zone
const fetchTimeZonePromise = store.dispatch(Actions.retrieveLocationTimeZone(config.siteLocation.latitude, config.siteLocation.longitude));
Bucknell, Mary S.
committed
let fetchDataPromise;
Bucknell, Mary S.
committed
if (showOnlyGraph) {
// Only fetch what is needed
if (parameterCode && period) {
Bucknell, Mary S.
committed
fetchDataPromise = store.dispatch(Actions.retrieveCustomTimePeriodTimeSeries(siteno, parameterCode, period, true));
Bucknell, Mary S.
committed
} else if (parameterCode && startDT && endDT) {
Bucknell, Mary S.
committed
// Don't fetch until time zone is available
fetchDataPromise = fetchTimeZonePromise.then(() => {
store.dispatch(Actions.retrieveDataForDateRange(siteno, startDT, endDT, parameterCode));
});
Bucknell, Mary S.
committed
} else {
Bucknell, Mary S.
committed
fetchDataPromise = store.dispatch(Actions.retrieveTimeSeries(siteno, parameterCode ? [parameterCode] : null, true));
Bucknell, Mary S.
committed
}
Bucknell, Mary S.
committed
} else {
Bucknell, Mary S.
committed
// Retrieve all parameter codes for 7 days and median statistics
Bucknell, Mary S.
committed
fetchDataPromise = store.dispatch(Actions.retrieveTimeSeries(siteno))
Bucknell, Mary S.
committed
.then(() => {
// Fetch any extended data needed to set initial state
const currentParamCode = parameterCode ? parameterCode : getCurrentParmCd(store.getState());
if (period === 'P30D' || period === 'P1Y') {
store.dispatch(Actions.retrieveExtendedTimeSeries(siteno, period, currentParamCode));
} else if (startDT && endDT) {
Bucknell, Mary S.
committed
fetchTimeZonePromise.then(() => {
store.dispatch(Actions.retrieveDataForDateRange(siteno, startDT, endDT, currentParamCode));
});
Bucknell, Mary S.
committed
}
});
store.dispatch(Actions.retrieveMedianStatistics(siteno));
}
Bucknell, Mary S.
committed
fetchDataPromise.then(() => {
// Hide the loading indocatr
nodeElem
.select('.loading-indicator-container')
.call(drawLoadingIndicator, {showLoadingIndicator: false, sizeClass: 'fa-3x'});
Bucknell, Mary S.
committed
if (!hasAnyTimeSeries(store.getState())) {
drawInfoAlert(nodeElem, {body: 'No time series data available for this site'});
} else {
//Update time series state
if (parameterCode) {
Bucknell, Mary S.
committed
const isThisParamCode = function (variable) {
Bucknell, Mary S.
committed
return variable.variableCode.value === parameterCode;
};
const thisVariable = Object.values(getVariables(store.getState())).find(isThisParamCode);
store.dispatch(Actions.setCurrentVariable(thisVariable.oid));
}
if (compare) {
store.dispatch(Actions.toggleTimeSeries('compare', true));
}
if (timeSeriesId) {
store.dispatch(Actions.setCurrentMethodID(timeSeriesId));
}
Bucknell, Mary S.
committed
// Initial data has been fetched and initial state set. We can render the hydrograph elements
// Set up rendering functions for the graph-container
let graphContainer = nodeElem.select('.graph-container')
.call(link(store, controlDisplay, hasAnyTimeSeries))
.call(drawTimeSeriesGraph, store, siteno, showMLName);
if (!showOnlyGraph) {
graphContainer.call(cursorSlider, store);
graphContainer.call(drawGraphBrush, store);
}
graphContainer.append('div')
.classed('ts-legend-controls-container', true)
.call(drawTimeSeriesLegend, store);
Bucknell, Mary S.
committed
// Add UI interactive elements and the provisional data alert.
if (!showOnlyGraph) {
nodeElem
.call(drawMethodPicker, store)
.call(drawDateRangeControls, store, siteno);
Bucknell, Mary S.
committed
Bucknell, Mary S.
committed
nodeElem.select('.ts-legend-controls-container')
.call(drawGraphControls, store);
Bucknell, Mary S.
committed
Bucknell, Mary S.
committed
nodeElem.select('.select-time-series-container')
.call(link(store, plotSeriesSelectTable, createStructuredSelector({
siteno: () => siteno,
availableTimeSeries: availableTimeSeriesSelector,
lineSegmentsByParmCd: lineSegmentsByParmCdSelector('current', 'P7D'),
timeSeriesScalesByParmCd: timeSeriesScalesByParmCdSelector('current', 'P7D', SPARK_LINE_DIM)
}), store));
nodeElem.select('.provisional-data-alert')
.attr('hidden', null);
renderTimeSeriesUrlParams(store);
Bucknell, Mary S.
committed
}
}
});
Bucknell, Mary S.
committed
window.onresize = function() {
store.dispatch(Actions.resizeUI(window.innerWidth, node.offsetWidth));
Bucknell, Mary S.
committed
};