From 90da19c487e35c2a8c3da4134c38d16c2779def6 Mon Sep 17 00:00:00 2001
From: Darius Williams <dswilliams@contractor.usgs.gov>
Date: Fri, 22 Jul 2022 16:00:38 -0500
Subject: [PATCH] placeholder tests and initial attempt

---
 .../components/hydrograph/index.js            |  7 +--
 .../vue-components/cursor-slider.test.js      | 61 +++++++++++++++++++
 .../vue-components/cursor-slider.vue          | 57 +++++++++++++----
 3 files changed, 107 insertions(+), 18 deletions(-)

diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/index.js b/assets/src/scripts/monitoring-location/components/hydrograph/index.js
index fc3220f68..b3c046270 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/index.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/index.js
@@ -32,7 +32,6 @@ import {showDataIndicators} from './data-indicator';
 import {drawTimeSeriesLegend} from './legend';
 
 import {initializeTimeSeriesGraph, drawTimeSeriesGraphData} from './time-series-graph';
-import {initializeTooltipCursorSlider, drawTooltipCursorSlider} from './tooltip';
 
 import DataTablesApp from './DataTablesApp.vue';
 import GraphControlsApp from './GraphControlsApp.vue';
@@ -142,7 +141,7 @@ export const attachToNode = function(store,
     graphContainer.call(initializeTimeSeriesGraph, store, siteno, agencyCd, sitename, thisShowMLName, !thisShowOnlyGraph);
     showDataIndicators(true, store);
     if (!showOnlyGraph) {
-        initializeTooltipCursorSlider(graphContainer, store);
+
         //TODO: The tooltips, legend and  the main hydrograph can be added to the HydrographApp.
         // The main hydrograph should be converted to a Vue component last. As part of that task we
         // will figure out how to handle the loading indicator and the no data overlay
@@ -196,10 +195,6 @@ export const attachToNode = function(store,
         showDataIndicators(false, store);
         graphContainer.call(drawTimeSeriesGraphData, store, !thisShowOnlyGraph);
 
-        if (!thisShowOnlyGraph) {
-            graphContainer
-                .call(drawTooltipCursorSlider, store);
-        }
         legendControlsContainer.call(drawTimeSeriesLegend, store);
 
         if (!thisShowOnlyGraph) {
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.test.js b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.test.js
index e69de29bb..de60f6f9f 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.test.js
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.test.js
@@ -0,0 +1,61 @@
+describe('monitoring-location/components/hydrograph/cursor-slider', () => {
+    utils.mediaQuery = jest.fn().mockReturnValue(true);
+    config.locationTimeZone = 'America/Chicago';
+    const TEST_STATE = {
+        hydrographData: {
+            primaryIVData: TEST_PRIMARY_IV_DATA,
+            currentTimeRAnge: TEST_CURRENT_TIME_RANGE
+        },
+        hydrographState: {
+            graphCursorOffset: 500000
+        },
+        ui: {
+            windowWidth: 1300,
+            width: 990
+        }
+    };
+
+    describe('drawCursorSlider', () => {
+        let svg;
+        let store;
+        beforeEach(() => {
+            svg = select('body').append('svg');
+            store = configureStore(TEST_STATE);
+        });
+
+        afterEach(() => {
+            svg.remove();
+        });
+
+        it('Creates a cursor slider', () => {
+            drawCursorSlider(svg, store);
+
+            const sliderGroup = svg.selectAll('.cursor-slider-group');
+            expect(sliderGroup.size()).toBe(1);
+            expect(sliderGroup.selectAll('.slider').size()).toBe(1);
+        });
+    });
+});
+
+describe('initializeTooltipCursorSlider and drawTooltipCursorSlider', () => {
+    let div;
+    beforeEach(() => {
+        div = select('body').append('div');
+    });
+
+    afterEach(() => {
+        div.remove();
+    });
+
+    it('should render the cursor slider', () => {
+        let store = configureStore(TEST_STATE);
+        initializeTooltipCursorSlider(div, store);
+        drawTooltipCursorSlider(div, store);
+
+        const sliderSvg = div.selectAll('.cursor-slider-svg');
+        const slider = sliderSvg.selectAll('.slider');
+
+        expect(sliderSvg.size()).toBe(1);
+        expect(slider.size()).toBe(1);
+    });
+});
\ No newline at end of file
diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.vue b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.vue
index 248df6c86..5bcb99791 100644
--- a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.vue
+++ b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/cursor-slider.vue
@@ -2,53 +2,86 @@
   <svg
     class="cursor-slider-svg"
     xmlns="http://www.w3.org/2000/svg"
-    :viewBox=viewBox
+    :viewBox="viewBox"
   >
     <g
       class="cursor-slider-group"
       ga-on="click"
       ga-event-category="hydrograph-interaction"
       ga-event-action="clickOnSlider"
-    >
-
-    </g>
+      ref="group"
+    />
   </svg>
 </template>
 
 <script>
 import {useActions, useState} from 'redux-connect-vue';
-import {computed, inject, ref, watchEffect} from 'vue';
+import {computed, ref, watchEffect} from 'vue';
 
 import {sliderTop} from 'd3-simple-slider';
-import {createStructuredSelector} from 'reselect';
+import {select} from 'd3-selection';
 
 import {getGraphCursorOffset} from 'ml/selectors/hydrograph-state-selector';
 
 import {setGraphCursorOffset} from 'ml/store/hydrograph-state';
 
-import {getMainXScale} from './selectors/scales';
-import {getMainLayout} from './selectors/layout';
+import {getMainXScale} from '../selectors/scales';
+import {getMainLayout} from '../selectors/layout';
 
 export default {
 name: 'CursorSlider',
 setup() {
   const state = useState({
     layout: getMainLayout,
-    xAxis: getBrushXAxis,
-    xScale: getMainXScale,
+    xScale: getMainXScale('current'),
     cursorOffset: getGraphCursorOffset
   });
 
+  const actions = useActions({
+    setGraphCursorOffset
+  });
+
+  const group = ref(null);
+
   const viewBox = computed(() => {
     return `0 0 ${state.layout.value.width + state.layout.value.margin.left + state.layout.value.margin.right} 25`;
   });
 
+  const slider = sliderTop()
+    .displayValue(false)
+    .ticks(0);
+
+  watchEffect(() => {
+    const [startMillis, endMillis] = state.xScale.value.domain();
+    const [startX, endX] = state.xScale.value.range();
+
+    slider
+      .min(startMillis)
+      .max(endMillis)
+      .width(endX - startX);
+    slider.silentValue(state.cursorOffset.value ? slider.min() + state.cursorOffset.value : slider.max());
+
+    if(group.value) {
+      group.value.setAttribute('transform', `translate(${state.layout.value.margin.left},15)`);
+      select(group.value.className.baseVal).call(slider);
+    }
+    
+    slider.on('onchange', (val) => {
+      actions.setGraphCursorOffset(val - startMillis);
+    });
+  });
+
+  watchEffect(() => {
+    slider.silentValue(state.cursorOffset.value ? slider.min() + state.cursorOffset.value : slider.max());
+  });
+
   return {
     ...state,
-    viewBox
+    viewBox,
+    group,
+    slider
   }
 }
 
-
 }
 </script>
\ No newline at end of file
-- 
GitLab