From acb0eff60678615a5ff8805e1bfd1b5287c21f5c Mon Sep 17 00:00:00 2001
From: mbucknell <mbucknell@usgs.gov>
Date: Thu, 26 Sep 2019 12:05:20 -0500
Subject: [PATCH] Added a method-picker which gets rerendered whenever the time
 series displayed changes.

---
 .../scripts/components/hydrograph/index.js    | 17 +++++++----
 .../scripts/components/hydrograph/legend.js   |  1 -
 .../components/hydrograph/method-picker.js    | 29 +++++++++++++++++++
 .../components/hydrograph/time-series.js      | 16 +++++-----
 .../components/hydrograph/time-series.spec.js | 21 ++++++++++----
 .../scripts/selectors/time-series-selector.js |  2 +-
 6 files changed, 66 insertions(+), 20 deletions(-)
 create mode 100644 assets/src/scripts/components/hydrograph/method-picker.js

diff --git a/assets/src/scripts/components/hydrograph/index.js b/assets/src/scripts/components/hydrograph/index.js
index eab3264bb..4cc00bd00 100644
--- a/assets/src/scripts/components/hydrograph/index.js
+++ b/assets/src/scripts/components/hydrograph/index.js
@@ -2,27 +2,32 @@
  * Hydrograph charting module.
  */
 import { extent } from 'd3-array';
-
 import { line as d3Line, curveStepAfter } from 'd3-shape';
 import { select } from 'd3-selection';
-import { createStructuredSelector } from 'reselect';
+
 import { DateTime } from 'luxon';
+import { createStructuredSelector } from 'reselect';
+
 import { addSVGAccessibility } from '../../accessibility';
 import config from '../../config';
 import { dispatch, link, provide } from '../../lib/redux';
+import { getTimeSeriesCollectionIds, isLoadingTS } from '../../selectors/time-series-selector';
 import { Actions } from '../../store';
 import { callIf, mediaQuery } from '../../utils';
+
 import { audibleUI } from './audible';
 import { appendAxes, axesSelector } from './axes';
 import { cursorSlider } from './cursor';
-import { lineSegmentsByParmCdSelector, currentVariableLineSegmentsSelector, MASK_DESC, HASH_ID, getCurrentVariableMedianStatPoints } from './drawing-data';
+import { lineSegmentsByParmCdSelector, currentVariableLineSegmentsSelector, MASK_DESC, HASH_ID,
+    getCurrentVariableMedianStatPoints } from './drawing-data';
 import { CIRCLE_RADIUS_SINGLE_PT, SPARK_LINE_DIM, layoutSelector } from './layout';
 import { drawSimpleLegend, legendMarkerRowsSelector } from './legend';
+import { drawMethodPicker } from './method-picker'
 import { plotSeriesSelectTable, availableTimeSeriesSelector } from './parameters';
 import { xScaleSelector, yScaleSelector, timeSeriesScalesByParmCdSelector } from './scales';
-import { allTimeSeriesSelector, isVisibleSelector, titleSelector, descriptionSelector, currentVariableTimeSeriesSelector, hasTimeSeriesWithPoints } from './time-series';
+import { allTimeSeriesSelector, isVisibleSelector, titleSelector, descriptionSelector,
+    currentVariableTimeSeriesSelector, hasTimeSeriesWithPoints } from './time-series';
 import { createTooltipFocus, createTooltipText } from './tooltip';
-import { getTimeSeriesCollectionIds, isLoadingTS } from '../../selectors/time-series-selector';
 
 
 const drawMessage = function(elem, message) {
@@ -314,6 +319,7 @@ const graphControls = function(elem) {
 
     const compareControlDiv = graphControlDiv.append('li')
         .classed('usa-checkbox', true);
+
     compareControlDiv.append('input')
         .classed('usa-checkbox__input', true)
         .attr('type', 'checkbox')
@@ -543,6 +549,7 @@ export const attachToNode = function (store, node, {siteno, parameter, compare,
     select(node)
         .call(provide(store))
         .call(link(noDataAlert, getTimeSeriesCollectionIds('current', 'P7D')))
+        .call(callIf(interactive, drawMethodPicker))
         .call(callIf(interactive, dateRangeControls), siteno)
         .select('.loading-indicator-container')
             .call(link(loadingIndicator, createStructuredSelector({
diff --git a/assets/src/scripts/components/hydrograph/legend.js b/assets/src/scripts/components/hydrograph/legend.js
index a2da7cdc7..eb0381eaa 100644
--- a/assets/src/scripts/components/hydrograph/legend.js
+++ b/assets/src/scripts/components/hydrograph/legend.js
@@ -7,7 +7,6 @@ import { CIRCLE_RADIUS } from './layout';
 import { defineLineMarker, defineTextOnlyMarker, defineRectangleMarker } from './markers';
 import { currentVariableLineSegmentsSelector, HASH_ID, MASK_DESC } from './drawing-data';
 import config from '../../config';
-import { getMethods } from '../../selectors/time-series-selector';
 import { getCurrentVariableMedianMetadata } from '../../selectors/median-statistics-selector';
 import { mediaQuery } from '../../utils';
 
diff --git a/assets/src/scripts/components/hydrograph/method-picker.js b/assets/src/scripts/components/hydrograph/method-picker.js
new file mode 100644
index 000000000..072e5693d
--- /dev/null
+++ b/assets/src/scripts/components/hydrograph/method-picker.js
@@ -0,0 +1,29 @@
+/**
+ * Pick list for methods module
+ */
+
+import{ link } from '../../lib/redux';
+
+import { getAllMethodsForCurrentVariable } from './time-series';
+
+export const drawMethodPicker = function(elem) {
+    const pickerContainer = elem.insert('div', ':nth-child(2)')
+        .attr('id', 'ts-method-select-container');
+
+    pickerContainer.append('label')
+        .attr('class', 'usa-label')
+        .attr('for', 'method-picker')
+        .text('Available Methods');
+    pickerContainer.append('select')
+        .attr('class', 'usa-select')
+        .attr('id', 'method-picker')
+        .call(link(function(elem, methods) {
+            elem.selectAll('option').remove();
+            methods.forEach((method) => {
+                elem.append('option')
+                    .attr('value', method.methodId)
+                    .text(method.methodDescription ? `${method.methodDescription} (${method.methodID})` : method.methodID);
+            });
+        }, getAllMethodsForCurrentVariable));
+};
+
diff --git a/assets/src/scripts/components/hydrograph/time-series.js b/assets/src/scripts/components/hydrograph/time-series.js
index e314f6cd1..b6c96df5f 100644
--- a/assets/src/scripts/components/hydrograph/time-series.js
+++ b/assets/src/scripts/components/hydrograph/time-series.js
@@ -93,12 +93,14 @@ export const getAllTimeSeriesForCurrentVariable = createSelector(
     allTimeSeriesSelector,
     (variable, timeSeries) => {
         let ts = {};
-        Object.keys(timeSeries).forEach(key => {
-            const series= timeSeries[key];
-            if (series.variable === variable.oid) {
-                ts[key] = series;
-            }
-        });
+        if (variable) {
+            Object.keys(timeSeries).forEach(key => {
+                const series = timeSeries[key];
+                if (series.variable === variable.oid) {
+                    ts[key] = series;
+                }
+            });
+        }
         return ts;
     }
 );
@@ -117,7 +119,7 @@ export const getAllMethodsForCurrentVariable = createSelector(
         const currentMethodIds = uniq(Object.values(timeSeries).map((ts) => ts.method));
 
         return allMethods.filter((method) => {
-            return _includes(currentMethodIds, method.methodId);
+            return _includes(currentMethodIds, method.methodID);
         });
     }
 );
diff --git a/assets/src/scripts/components/hydrograph/time-series.spec.js b/assets/src/scripts/components/hydrograph/time-series.spec.js
index 575e48c9c..30645721e 100644
--- a/assets/src/scripts/components/hydrograph/time-series.spec.js
+++ b/assets/src/scripts/components/hydrograph/time-series.spec.js
@@ -171,15 +171,15 @@ const TEST_DATA = {
         methods: {
             69329: {
                 methodDescription: '',
-                methodId: 69928
+                methodID: 69928
             },
             69330: {
                 methodDescription: '4.1 ft from riverbed (middle)',
-                methodId: 69930
+                methodID: 69930
             },
             69331: {
                 methodDescription: '1.0 ft from riverbed (bottom)',
-                methodId: 69931
+                methodID: 69931
             }
         },
         queryInfo: {
@@ -214,7 +214,7 @@ const TEST_DATA = {
     }
 };
 
-fdescribe('TimeSeries module', () => {
+describe('TimeSeries module', () => {
 
     describe('allTimesSeriesSelector', () => {
 
@@ -355,6 +355,15 @@ fdescribe('TimeSeries module', () => {
 
     describe('getAllTimeSeriesForCurrentVariable', () => {
 
+        it('Expect no time series if the current variable is not set', () => {
+            const newTestData = {
+                ...TEST_DATA,
+                timeSeriesState: {
+                }
+            };
+            expect(getAllTimeSeriesForCurrentVariable(newTestData)).toEqual({});
+        });
+
         it('Expect no time series if the current variable does not have any timeSeries', () => {
             const newTestData = {
                 ...TEST_DATA,
@@ -478,11 +487,11 @@ fdescribe('TimeSeries module', () => {
             expect(result.length).toEqual(2);
             expect(result).toContain({
                 methodDescription: '4.1 ft from riverbed (middle)',
-                methodId: 69930
+                methodID: 69930
             });
             expect(result).toContain({
                 methodDescription: '1.0 ft from riverbed (bottom)',
-                methodId: 69931
+                methodID: 69931
             });
         });
     });
diff --git a/assets/src/scripts/selectors/time-series-selector.js b/assets/src/scripts/selectors/time-series-selector.js
index 9af629a1b..87f43c0a6 100644
--- a/assets/src/scripts/selectors/time-series-selector.js
+++ b/assets/src/scripts/selectors/time-series-selector.js
@@ -6,7 +6,7 @@ import { createSelector } from 'reselect';
  */
 export const getVariables = state => state.series.variables ? state.series.variables : null;
 
-export const getMethods = state => state.series.methods ? state.series.methods : null;
+export const getMethods = state => state.series.methods ? state.series.methods : {};
 
 export const getQueryInfo = state => state.series.queryInfo || {};
 
-- 
GitLab