From 7f79c9cb006123a9cb921c9db582af9f0b35f168 Mon Sep 17 00:00:00 2001
From: mbucknell <mbucknell@usgs.gov>
Date: Mon, 3 Jan 2022 16:30:27 -0600
Subject: [PATCH] Code needs to be seriously cleaned up and the radio buttons
 are not getting set correctly.

---
 .../daily-value-hydrograph/graph-controls.js  | 99 ++++++++-----------
 .../daily-value-hydrograph/index.js           | 39 ++++----
 .../daily-value-time-series-selector.js       |  2 +-
 .../templates/macros/components.html          |  6 +-
 .../templates/monitoring_location.html        |  2 +-
 5 files changed, 68 insertions(+), 80 deletions(-)

diff --git a/assets/src/scripts/monitoring-location/components/daily-value-hydrograph/graph-controls.js b/assets/src/scripts/monitoring-location/components/daily-value-hydrograph/graph-controls.js
index 2691e9c19..e54c731ba 100644
--- a/assets/src/scripts/monitoring-location/components/daily-value-hydrograph/graph-controls.js
+++ b/assets/src/scripts/monitoring-location/components/daily-value-hydrograph/graph-controls.js
@@ -8,68 +8,55 @@ import {Actions} from 'ml/store/daily-value-time-series';
  * @param {Object} elem - D3 selection
  * @param {Object} store - Redux Store
  */
-const drawDVTimeSeriesSelection = function(ul, store) {
-
-    const availTimeSeries = store.getState()
-        .dailyValueTimeSeriesData.availableDVTimeSeries;
-    const tsByParameterCode = _.groupBy(availTimeSeries, (ts) => {
+const drawDVTimeSeriesSelection = function(container, store, monitoringLocationId, initialParameterCode) {
+    const availableTimeSeries = store.getState().dailyValueTimeSeriesData.availableDVTimeSeries;
+    const tsByParameterCode = _.groupBy(availableTimeSeries, (ts) => {
         return ts.parameterCode;
     });
     const availableParameterCodes = Object.keys(tsByParameterCode);
 
     if (availableParameterCodes.length > 1) {
-        let divSize = 30;
-
-        ul.append('li')
-            .text('Parameter Codes:');
-
-        availableParameterCodes.forEach((key, idx) => {
-            const paramCd = groupedTs[key][0].parameterCode;
-            const ts_id = groupedTs[key][0].id.split('-')[2];
-            const monitorLoc = `${groupedTs[key][0].id.split('-')[0]}-${groupedTs[key][0].id.split('-')[1]}`;
-            const element = ul.append('li')
-                 .classed('usa-radio', true);
+        container.append('legend')
+            .attr('class', 'usa-legend')
+            .text('Parameter codes:');
 
-            const input = element.append('input')
-                .classed('usa-radio__input', true)
+        availableParameterCodes.forEach((parameterCode) => {
+            const inputId = `code-${parameterCode}-radio`;
+            const inputContainer = container.append('div')
+                .attr('class', 'usa-radio');
+            inputContainer.append('input')
+                .attr('class', 'usa-radio__input')
+                .attr('id', inputId)
                 .attr('type', 'radio')
-                .attr('id', `code-${paramCd}-radio`)
-                .attr('aria-labelledby', `code-${paramCd}-label`)
-                .attr('ga-on', 'click')
-                .attr('ga-event-category', 'DVSeriesGraph')
-                .attr('ga-event-action', 'toggleParameterCode')
-                .attr('name', 'dvParamCd');
-
-            if (idx == 0) {
-                input.attr('checked', 'checked');
-            }
-
-            input.on('click', function() {
-                store.dispatch(Actions.retrieveDVTimeSeries(
-                    monitorLoc, ts_id
-                )).then(function() {
-                    store.dispatch(Actions.setCurrentDVTimeSeriesIds(
-                        input.attr('data-00002'),
-                        input.attr('data-00003'),
-                        input.attr('data-00001')));
+                .attr('name', inputId)
+                .attr('value', parameterCode)
+                .attr('checked', initialParameterCode === parameterCode ? true: null)
+                .on('click', function() {
+                    let min, max, mean = null;
+                    tsByParameterCode[parameterCode]
+                        .filter(ts => ['00001', '00002', '00003'].includes(ts.statisticCode))
+                        .forEach(ts => {
+                            store.dispatch(Actions.retrieveDVTimeSeries(monitoringLocationId, ts.id));
+                            switch (ts.statisticCode) {
+                                case '00001':
+                                    max = ts.id;
+                                    break;
+                                case '00002':
+                                    min = ts.id;
+                                    break;
+                                case '00003':
+                                    mean = ts.id;
+                                    break;
+                            }
+                        });
+                        store.dispatch(Actions.setCurrentDVTimeSeriesIds(min, mean, max));
                 });
-            });
+            inputContainer.append('label')
+                .attr('class', 'usa-radio__label')
+                .attr('for', inputId)
+                .text(parameterCode);
 
-            element.append('label')
-                .classed('usa-radio__label', true)
-                .attr('id', `code-${paramCd}-label`)
-                .attr('for', `code-${paramCd}-radio`)
-                .text(`${paramCd}`);
-
-            groupedTs[key].forEach((ts) => {
-                element.select('input[type="radio"]')
-                .attr(`data-${ts.statisticCode}`, ts_id);
-            });
-
-            divSize += 30;
         });
-
-        select('.dv-legend-container ').style('min-height', `${divSize}px`);
     }
 };
 
@@ -77,11 +64,11 @@ const drawDVTimeSeriesSelection = function(ul, store) {
  * Create the parameter code toggle for the daily values time series graph.
  * @param {Object} elem - D3 selection
  * @param {Object} store - Redux Store
+ * @param {String} monitoringLocationId - Generally of form agency_cd-siteno
  */
-export const drawGraphControls = function(elem, store) {
-    const tsSelectionContainer = elem.append('div')
+export const drawGraphControls = function(elem, store, monitoringLocationId, initialParameterCode) {
+    elem.append('div')
         .attr('id', 'dv-parameter-code-toggle')
         .classed('usa-fieldset', true)
-
-        .call(drawDVTimeSeriesSelection, store);
+        .call(drawDVTimeSeriesSelection, store, monitoringLocationId, initialParameterCode);
 };
diff --git a/assets/src/scripts/monitoring-location/components/daily-value-hydrograph/index.js b/assets/src/scripts/monitoring-location/components/daily-value-hydrograph/index.js
index 2ebac7e5c..e6a66fd59 100644
--- a/assets/src/scripts/monitoring-location/components/daily-value-hydrograph/index.js
+++ b/assets/src/scripts/monitoring-location/components/daily-value-hydrograph/index.js
@@ -22,19 +22,15 @@ const STATISTIC_CODES = {
 };
 
 /*
- * Returns the set of time series for a single parameter code. That code must
- * be in GROUND_WATER_LEVELS_PARM_CD and contain one or more STATISTIC_CODES. If more
- * than one parameter code has time series than the one with the most of the
- * desired statistics codes will be chosen.
- * @return Object - available time series object
+ * Returns the set of time series for the best parameter code.
+ * @return Array - of ts to use initially.
  */
-const getBestAvailableTimeSeriesToUse = function(availableTimeSeries) {
-    const gwAvailableTimeSeries = availableTimeSeries
-        .filter(ts => includes(GROUND_WATER_LEVELS_PARM_CD, ts.parameterCode))
-        .filter(ts => includes(Object.values(STATISTIC_CODES), ts.statisticCode));
-    let gwByParmCode = groupBy(gwAvailableTimeSeries, ts => ts.parameterCode);
-    let bestParamToUse = Object.values(gwByParmCode).sort((a, b) => a.length - b.length);
-    return bestParamToUse.length ? bestParamToUse[0] : [];
+const getInitialTimeSeriesToUse = function(availableTimeSeries) {
+    const bestTimeSeries = availableTimeSeries.filter(ts => ts.best);
+    const bestParameterCode = bestTimeSeries.length ? bestTimeSeries[0].parameterCode : availableTimeSeries[0].parameterCode
+
+    return availableTimeSeries
+        .filter(ts => ts.parameterCode === bestParameterCode && ['00001', '00002', '00003'].includes(ts.statisticCode));
 };
 
 /*
@@ -47,7 +43,8 @@ const getBestAvailableTimeSeriesToUse = function(availableTimeSeries) {
 export const attachToNode = function(store,
                                       node,
                                       {
-                                          siteno
+                                          siteno,
+                                          agencyCd
                                       } = {}) {
     const nodeElem = select(node);
     if (!siteno) {
@@ -58,18 +55,19 @@ export const attachToNode = function(store,
         return;
     }
 
-    const monitoringLocationId = `USGS-${siteno}`;
+    const monitoringLocationId = `${agencyCd}-${siteno}`;
     const loadingIndicator = nodeElem.select('.loading-indicator-container')
         .call(drawLoadingIndicator, {
             showLoadingIndicator: true
         });
     const fetchAvailableDVTimeSeries = store.dispatch(Actions.retrieveAvailableDVTimeSeries(monitoringLocationId));
     fetchAvailableDVTimeSeries.then(() => {
-        const bestAvailableTimeSeries = getBestAvailableTimeSeriesToUse(getAvailableDVTimeSeries(store.getState()));
-        if (bestAvailableTimeSeries.length) {
-            const fetchDVTimeSeries = bestAvailableTimeSeries
-                .map(availableTs => availableTs.id)
-                .map(id => store.dispatch(Actions.retrieveDVTimeSeries(monitoringLocationId, id)));
+        const availableTimeSeries = getAvailableDVTimeSeries(store.getState());
+        if (availableTimeSeries.length) {
+            const initialTimeSeries = getInitialTimeSeriesToUse(availableTimeSeries);
+            const fetchDVTimeSeries =
+                initialTimeSeries
+                    .map(ts => store.dispatch(Actions.retrieveDVTimeSeries(monitoringLocationId, ts.id)));
             Promise.allSettled(fetchDVTimeSeries).then(() => {
                 let min, mean, max = null;
                 let allDVTimeSeries = getAllDVTimeSeries(store.getState());
@@ -83,13 +81,14 @@ export const attachToNode = function(store,
                             break;
                         case 'MAXIMUM':
                             max = tsId;
+                            break;
                     }
                 });
                 store.dispatch(Actions.setCurrentDVTimeSeriesIds(min, mean, max));
                 loadingIndicator.call(drawLoadingIndicator, {showLoadingIndicator: false});
                 let graphContainer = nodeElem.select('.graph-container');
                 graphContainer
-                    .call(drawGraphControls, store)
+                    .call(drawGraphControls, store, monitoringLocationId, initialTimeSeries[0].parameterCode)
                     .call(drawTimeSeriesGraph, store)
                     .call(drawTooltipCursorSlider, store)
                     .call(drawGraphBrush, store)
diff --git a/assets/src/scripts/monitoring-location/selectors/daily-value-time-series-selector.js b/assets/src/scripts/monitoring-location/selectors/daily-value-time-series-selector.js
index b548dfbc5..e2f938774 100644
--- a/assets/src/scripts/monitoring-location/selectors/daily-value-time-series-selector.js
+++ b/assets/src/scripts/monitoring-location/selectors/daily-value-time-series-selector.js
@@ -130,7 +130,7 @@ export const getCurrentDVTimeSeriesUnitOfMeasure = createSelector(
         let result = '';
         if (currentTimeSeries) {
             let ts = currentTimeSeries.min || currentTimeSeries.mean || currentTimeSeries.max;
-            result = ts.properties.unitOfMeasureName ? ts.properties.unitOfMeasureName : '';
+            result = ts && ts.properties && ts.properties.unitOfMeasureName ? ts.properties.unitOfMeasureName : '';
         }
         return result;
     }
diff --git a/wdfn-server/waterdata/templates/macros/components.html b/wdfn-server/waterdata/templates/macros/components.html
index 81cd5e79b..6476edaca 100644
--- a/wdfn-server/waterdata/templates/macros/components.html
+++ b/wdfn-server/waterdata/templates/macros/components.html
@@ -42,8 +42,10 @@
     </div>
 {%- endmacro %}
 
-{%  macro DailyValueTimeSeriesComponent(site_no, time_series_id) -%}
-    <div class="wdfn-component" data-component="dv-hydrograph" data-siteno="{{ site_no }}">
+{%  macro DailyValueTimeSeriesComponent(site_no, agency_cd) -%}
+    <div class="wdfn-component" data-component="dv-hydrograph"
+         data-siteno="{{ site_no }}"
+         data-agency-cd="{{ agency_cd }}">
         <div class="loading-indicator-container"></div>
         <div class="graph-container usa-prose"></div>
     </div>
diff --git a/wdfn-server/waterdata/templates/monitoring_location.html b/wdfn-server/waterdata/templates/monitoring_location.html
index e6b31a230..f058986b9 100644
--- a/wdfn-server/waterdata/templates/monitoring_location.html
+++ b/wdfn-server/waterdata/templates/monitoring_location.html
@@ -177,7 +177,7 @@
                                     </button>
                                 </h3>
                                 <div id="dv-graph-container">
-                                    {{ components.DailyValueTimeSeriesComponent(stations[0].site_no) }}
+                                    {{ components.DailyValueTimeSeriesComponent(stations[0].site_no, stations[0].agency_cd) }}
                                 </div>
                             </div>
                         </div>
-- 
GitLab