From 827a59c72f09fd3caa7e9922ceb38160f73fd077 Mon Sep 17 00:00:00 2001 From: Darius Williams <dswilliams@contractor.usgs.gov> Date: Mon, 1 Aug 2022 16:02:39 -0500 Subject: [PATCH] Removing old files, adding new tests --- .../components/hydrograph/HydrographApp.vue | 11 +- .../components/hydrograph/index.js | 1 - .../components/hydrograph/index.test.js | 2 +- .../components/hydrograph/legend.js | 18 --- .../components/hydrograph/legend.test.js | 68 --------- .../hydrograph/vue-components/legend.test.js | 71 ++++++--- .../hydrograph/vue-components/legend.vue | 136 +++++++++--------- 7 files changed, 124 insertions(+), 183 deletions(-) delete mode 100644 assets/src/scripts/monitoring-location/components/hydrograph/legend.js delete mode 100644 assets/src/scripts/monitoring-location/components/hydrograph/legend.test.js diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/HydrographApp.vue b/assets/src/scripts/monitoring-location/components/hydrograph/HydrographApp.vue index c12507eb1..57c5a5467 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/HydrographApp.vue +++ b/assets/src/scripts/monitoring-location/components/hydrograph/HydrographApp.vue @@ -2,7 +2,12 @@ <div> <CursorSlider /> <GraphBrush /> - <Legend /> + <div class="ts-legend-controls-container"> + <Legend /> + <div class="graph-controls-container"> + <GraphControls /> + </div> + </div> </div> </template> @@ -10,12 +15,14 @@ import GraphBrush from './vue-components/graph-brush.vue'; import CursorSlider from './vue-components/cursor-slider.vue'; import Legend from './vue-components/legend.vue' +import GraphControls from './vue-components/graph-controls.vue'; export default { name: 'HydrographApp', components: { GraphBrush, CursorSlider, - Legend + Legend, + GraphControls } }; </script> \ No newline at end of file diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/index.js b/assets/src/scripts/monitoring-location/components/hydrograph/index.js index 314c6a777..ffafb6494 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/index.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/index.js @@ -33,7 +33,6 @@ import {showDataIndicators} from './data-indicator'; import {initializeTimeSeriesGraph, drawTimeSeriesGraphData} from './time-series-graph'; import DataTablesApp from './DataTablesApp.vue'; -import GraphControlsApp from './GraphControlsApp.vue'; import HydrographApp from './HydrographApp.vue'; import ParameterSelectionApp from './ParameterSelectionApp.vue'; import StatisticsTableApp from './StatisticsTableApp.vue'; diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/index.test.js b/assets/src/scripts/monitoring-location/components/hydrograph/index.test.js index b24c602a4..f019eb341 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/index.test.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/index.test.js @@ -430,7 +430,7 @@ describe('monitoring-location/components/hydrograph module', () => { }); it('should render the correct number of svg nodes', () => { - expect(selectAll('svg').size()).toBe(2); + expect(selectAll('svg').size()).toBe(1); }); it('should have a title div', () => { diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/legend.js b/assets/src/scripts/monitoring-location/components/hydrograph/legend.js deleted file mode 100644 index bb05f6765..000000000 --- a/assets/src/scripts/monitoring-location/components/hydrograph/legend.js +++ /dev/null @@ -1,18 +0,0 @@ -import {createStructuredSelector} from 'reselect'; - -import {drawSimpleLegend} from 'd3render/legend'; -import {link} from 'ui/lib/d3-redux'; - -import {getMainLayout} from './selectors/layout'; -import {getLegendMarkerRows} from './selectors/legend-data'; - - -export const drawTimeSeriesLegend = function(elem, store) { - elem.append('div') - .classed('hydrograph-container', true) - .call(link(store, drawSimpleLegend, createStructuredSelector({ - legendMarkerRows: getLegendMarkerRows, - layout: getMainLayout - }))); -}; - diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/legend.test.js b/assets/src/scripts/monitoring-location/components/hydrograph/legend.test.js deleted file mode 100644 index 6347641a7..000000000 --- a/assets/src/scripts/monitoring-location/components/hydrograph/legend.test.js +++ /dev/null @@ -1,68 +0,0 @@ -import {select, selectAll} from 'd3-selection'; - -import config from 'ui/config'; -import * as utils from 'ui/utils'; - -import {configureStore} from 'ml/store'; - -import {drawTimeSeriesLegend} from './legend'; -import {TEST_PRIMARY_IV_DATA, TEST_GW_LEVELS} from './mock-hydrograph-state'; - -describe('monitoring-location/components/hydrograph/legend module', () => { - utils.mediaQuery = jest.fn().mockReturnValue(true); - config.ivPeriodOfRecord = { - '72019': {} - }; - config.gwPeriodOfRecord = { - '72019': {} - }; - const TEST_STATE = { - hydrographData: { - currentTimeRange: { - start: 1582560000000, - end: 1600700000000 - }, - primaryIVData: TEST_PRIMARY_IV_DATA - }, - groundwaterLevelData: { - all: [TEST_GW_LEVELS] - }, - hydrographState: { - showCompareIVData: false, - showMedianData: false, - selectedIVMethodID: '90649', - selectedParameterCode: '72019' - } - }; - - describe('legends should render', () => { - - let graphNode; - let store; - - beforeEach(() => { - let body = select('body'); - let component = body.append('div') - .attr('id', 'hydrograph'); - component.append('div').attr('class', 'loading-indicator-container'); - component.append('div').attr('class', 'graph-container'); - component.append('div').attr('class', 'select-time-series-container'); - - graphNode = document.getElementById('hydrograph'); - - store = configureStore(TEST_STATE); - select(graphNode) - .call(drawTimeSeriesLegend, store); - - }); - - afterEach(() => { - select('#hydrograph').remove(); - }); - - - it('Should have the correct number of legend markers', () => { - expect(selectAll('.legend g').size()).toBe(9); - }); - }); -}); diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/legend.test.js b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/legend.test.js index db74ea9f2..abbfa1068 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/legend.test.js +++ b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/legend.test.js @@ -1,13 +1,17 @@ -import {select, selectAll} from 'd3-selection'; +import {mount} from '@vue/test-utils'; +import {bindActionCreators} from 'redux'; +import ReduxConnectVue from 'redux-connect-vue'; +import {createStructuredSelector} from 'reselect'; import config from 'ui/config'; import * as utils from 'ui/utils'; import {configureStore} from 'ml/store'; -import {drawTimeSeriesLegend} from './legend'; import {TEST_PRIMARY_IV_DATA, TEST_GW_LEVELS} from '../mock-hydrograph-state'; +import Legend from './legend.vue' + describe('monitoring-location/components/hydrograph/legend module', () => { utils.mediaQuery = jest.fn().mockReturnValue(true); config.ivPeriodOfRecord = { @@ -35,35 +39,58 @@ describe('monitoring-location/components/hydrograph/legend module', () => { } }; - describe('legends should render', () => { - - let graphNode; + utils.mediaQuery = jest.fn().mockReturnValue(true); + describe('drawSimpleLegend', () => { let store; + let wrapper; beforeEach(() => { - let body = select('body'); - let component = body.append('div') - .attr('id', 'hydrograph'); - component.append('div').attr('class', 'loading-indicator-container'); - component.append('div').attr('class', 'graph-container'); - component.append('div').attr('class', 'select-time-series-container'); - - graphNode = document.getElementById('hydrograph'); - store = configureStore(TEST_STATE); - select(graphNode) - .call(drawTimeSeriesLegend, store); + wrapper = mount(Legend, { + global: { + plugins: [ + [ReduxConnectVue, { + store, + mapDispatchToPropsFactory: (actionCreators) => (dispatch) => bindActionCreators(actionCreators, dispatch), + mapStateToPropsFactory: createStructuredSelector + }] + ] + } + }); }); - afterEach(() => { - select('#hydrograph').remove(); + it('Should have the correct number of legend markers', () => { + expect(wrapper.findAll('.legend g')).toHaveLength(9); }); + it('If no markers are provided legend-svg will contain no groups', () => { + wrapper = mount(Legend, { + global: { + plugins: [ + [ReduxConnectVue, { + store: configureStore({}), + mapDispatchToPropsFactory: (actionCreators) => (dispatch) => bindActionCreators(actionCreators, dispatch), + mapStateToPropsFactory: createStructuredSelector + }] + ] + } + }); - it('Should have the correct number of legend markers', () => { - expect(selectAll('.legend g').size()).toBe(9); + expect(wrapper.findAll('svg g')).toHaveLength(0); + }); + + it('Adds the correct number of legend elements', () => { + expect(wrapper.findAll('svg')).toHaveLength(1); + expect(wrapper.findAll('line')).toHaveLength(3); + expect(wrapper.findAll('rect')).toHaveLength(2); + expect(wrapper.findAll('text')).toHaveLength(9); + expect(wrapper.findAll('circle')).toHaveLength(3); + }); + + it('Expects that the legend has the expected text', () => { + let text = wrapper.findAll('text'); + }); }); -}); -z \ No newline at end of file +}); \ No newline at end of file diff --git a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/legend.vue b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/legend.vue index 00006944a..c33468c82 100644 --- a/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/legend.vue +++ b/assets/src/scripts/monitoring-location/components/hydrograph/vue-components/legend.vue @@ -13,15 +13,10 @@ /> </svg> </div> - <div class="graph-controls-container"> - <GraphControls /> - </div> </div> </template> <script> -import GraphControls from './graph-controls.vue'; - import {useState} from 'redux-connect-vue'; import {computed, ref, watchEffect} from 'vue'; import {select} from 'd3-selection'; @@ -33,9 +28,6 @@ import config from 'ui/config'; export default { name: 'Legend', - components: { - GraphControls - }, setup() { const legend = ref(null); @@ -45,41 +37,29 @@ export default { const MARKER_GROUP_X_OFFSET = 15; const VERTICAL_ROW_OFFSET = 18; - let yPosition = VERTICAL_ROW_OFFSET; - const state = useState({ legendMarkerRows: getLegendMarkerRows, layout: getMainLayout }); - // Set the size of the containing svg node to the size of the legend. - const bBox = computed(() => { - try { - return select(legend.value).node().getBBox(); - } catch (error) { - return null; - } - }) - const legendTransform = computed(() => { return `translate(${mediaQuery(config.USWDS_MEDIUM_SCREEN) ? state.layout.value.margin.left : 0}, 0)`; }); - const svgViewBox = computed(() => { - if (bBox.value) { - return `0 0 ${state.layout.value.width} ${bBox.value.height + 10}`; - } - return '' - }); + let svgViewBox; watchEffect(() => { - state.legendMarkerRows.value.forEach((rowMarkers) => { - let xPosition = 0; - let markerArgs; - let markerGroup; - let lastMarker; + if (legend.value) { + select(legend.value).selectChildren().remove(); + let yPosition = VERTICAL_ROW_OFFSET; + + state.legendMarkerRows.value.forEach((rowMarkers) => { + let xPosition = 0; + let markerArgs; + let markerGroup; + let lastMarker; - const getNewXPosition = function(markerGroup, lastXPosition) { + const getNewXPosition = function(markerGroup, lastXPosition) { // Long story short, firefox is unable to get the bounding box if // the svg element isn't actually taking up space and visible. Folks on the // internet seem to have gotten around this by setting `visibility:hidden` @@ -96,48 +76,62 @@ export default { // See above explanation return lastXPosition; } - }; - - const repositionLastMarkerWhenNeeded = function() { - if (xPosition - MARKER_GROUP_X_OFFSET > state.layout.value.width && legend.value) { - // Need to remove the last marker and draw it on the next row. - markerGroup.remove(); - xPosition = 0; - yPosition = yPosition + VERTICAL_ROW_OFFSET; - markerArgs.x = xPosition; - markerArgs.y = yPosition; - markerGroup = lastMarker.type(legend.value, markerArgs); - xPosition = getNewXPosition(markerGroup, xPosition); - } - }; - - rowMarkers.forEach((marker) => { - if (legend.value) { - repositionLastMarkerWhenNeeded(); - - markerArgs = { - x: xPosition, - y: yPosition, - text: marker.text, - domId: marker.domId, - domClass: marker.domClass, - width: RECTANGLE_MARKER_WIDTH, - height: RECTANGLE_MARKER_HEIGHT, - length: LINE_MARKER_WIDTH, - r: marker.radius, - fill: marker.fill - }; - - lastMarker = marker; - markerGroup = marker.type(select(legend.value), markerArgs); - xPosition = getNewXPosition(markerGroup, xPosition); + }; + + const repositionLastMarkerWhenNeeded = function() { + if (xPosition - MARKER_GROUP_X_OFFSET > state.layout.value.width) { + // Need to remove the last marker and draw it on the next row. + markerGroup.remove(); + xPosition = 0; + yPosition = yPosition + VERTICAL_ROW_OFFSET; + markerArgs.x = xPosition; + markerArgs.y = yPosition; + markerGroup = lastMarker.type(legend.value, markerArgs); + xPosition = getNewXPosition(markerGroup, xPosition); + } + }; + + rowMarkers.forEach((marker) => { + repositionLastMarkerWhenNeeded(); + + markerArgs = { + x: xPosition, + y: yPosition, + text: marker.text, + domId: marker.domId, + domClass: marker.domClass, + width: RECTANGLE_MARKER_WIDTH, + height: RECTANGLE_MARKER_HEIGHT, + length: LINE_MARKER_WIDTH, + r: marker.radius, + fill: marker.fill + }; + + lastMarker = marker; + markerGroup = marker.type(select(legend.value), markerArgs); + xPosition = getNewXPosition(markerGroup, xPosition); + + }); + repositionLastMarkerWhenNeeded(); + //start new row + yPosition = yPosition + VERTICAL_ROW_OFFSET; + }); + + // Set the size of the containing svg node to the size of the legend. + let bBox; + try { + bBox = select(legend.value).node().getBBox(); + } catch (error) { + return; + } + + svgViewBox = computed(() => { + if (bBox.value) { + return `0 0 ${state.layout.value.width} ${bBox.height + 10}`; } - + return '' }); - repositionLastMarkerWhenNeeded(); - //start new row - yPosition = yPosition = yPosition + VERTICAL_ROW_OFFSET; - }); + } }); return { -- GitLab