{"version":3,"sources":["data/r6_boundary.geojson","Utils.js","components/SiteMenuOption.js","components/SiteMenu.js","components/RegionMap.js","components/SitePicture.js","components/SiteInfo.js","components/Year.js","components/TableTrendIcon.js","components/TableRow.js","components/Table.js","components/DownloadData.js","components/Graph.js","components/Trend.js","components/GraphSection.js","components/GraphContainer.js","components/ReturnToTop.js","components/WelcomeModal.js","App.js","index.js","data/sites.csv"],"names":["module","exports","analyteDict","dateDict","0","1","2","3","4","5","6","7","8","9","10","11","getGraphDate","date","dataType","year","getFullYear","Date","monthDate","getMonth","getMidDate","getTrend","data","preloadImage","url","Image","src","roundToTwo","num","Math","round","sortIgnoreCap","arr","sort","a","b","toLowerCase","SiteMenuOption","this","props","sites","map","site","Fragment","key","id","value","code","name","Component","SiteMenu","handleChange","bind","e","changeActiveSite","target","className","selected","onChange","RegionMap","color","fillColor","fillOpacity","weight","radius","d3","boundary","then","res","feature","features","L","geoJson","pane","style","boundaryStyle","addTo","siteLayer","featureGroup","forEach","lat","long","content","circle","circleMarker","defaultStyle","on","bindTooltip","fitBounds","getBounds","center","zoom","preferCanvas","require","basemapLayer","createPane","drawBoundary","drawMarkers","Object","keys","_layers","setStyle","activeStyle","SitePicture","image","alt","SiteInfo","display","desc","Year","yearSet","Set","add","SampleDate","years","yearData","filter","push","analyte","Analyte","obj","getCount","getMean","getMedian","getMin","getMax","dangerouslySetInnerHTML","__html","objectiveValue","TableTrendIcon","getIcon","trend","trends","icon","TableRow","length","values","d","DataValue","getObjective","objectives","filtered","Value","handleClick","event","toggleArrow","closest","childNodes","classList","contains","remove","analytes","aName","bName","data-toggle","data-target","onClick","Table","scope","DownloadData","downloadCSV","fileName","now","fileData","formatData","csvContent","convertToCSV","checkEdge","blob","Blob","type","linkElement","document","createElement","URL","createObjectURL","setAttribute","clickEvent","MouseEvent","window","dispatchEvent","csv","href","encodeURIComponent","download","body","appendChild","click","formatDate","SiteCode","Unit","MDL","RL","ResQualCode","QACode","Compliance","csvString","join","ua","navigator","userAgent","test","fontSize","label","Graph","bufferX","extent","averages","min","getTime","max","avg","dateStamp","DataType","difference","bufferedMax","drawChart","timeMargin","timeWidth","timeHeight","analyteCode","average","objective","chartID","chart","append","attr","call","responsive","clipPadding","tooltip","xExtent","xExtentBuffered","yMax","xScale","domain","range","yScale","xAxis","scale","ticks","yAxis","ObjClass","rangeRect","Upper","Lower","text","points","selectAll","enter","getColor","html","Label","pageY","pageX","merge","exit","triangleIcon","size","triangles","AdjustedDate","formatNum","Type","objLine","datum","select","red","svg","container","node","parentNode","width","parseInt","height","aspect","resize","targetWidth","offsetWidth","componentDidMount","componentDidUpdate","Trend","trendText","GraphSection","GraphContainer","sortByRank","analyte1Set","analyte2Set","analyte3Set","Rank","console","log","analyte1List","Array","from","analyte2List","analyte3List","analyteList","analyteData","analyteAvg","analyteObj","ReturnToTop","scrollToTop","$","animate","scrollTop","class","WelcomeModal","modal","backdrop","keyboard","tabIndex","role","rel","data-dismiss","App","state","siteCode","findIndex","loadData","parseDate","dataPath","avgPath","objPath","trendPath","Promise","all","responses","rec","uniqueAnalytes","dataByAnalyte","analyteAverage","analyteObjective","setState","defaultSiteObj","maxWidth","indexOf","isIE","getElementById","innerHTML","ReactDOM","render"],"mappings":"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","file":"static/js/main.2087641c.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/r6_boundary.8eb17952.geojson\";","export const analyteDict = {\n 'Phosphorus as P, Total' : 'PhosphorusAsP',\n 'Phosphorus, Total' : 'Phosphorus',\n 'Total Dissolved Solids' : 'TDS',\n 'Boron, Dissolved' : 'BoronD',\n 'Boron, Total' : 'BoronT',\n 'Chloride, Dissolved' : 'Chloride',\n 'Sulfate, Dissolved' : 'Sulfate',\n 'Nitrogen, Total (Calculated)' : 'NitrogenCalc',\n 'Turbidity, Total' : 'Turbidity',\n 'Temperature' : 'Temperature',\n 'Oxygen, Dissolved, Total' : 'OxygenDissolved',\n 'Alkalinity as CaCO3, Total' : 'Alkalinity',\n 'Oxygen, Saturation, Total': 'OxygenSaturation',\n 'Coliform, Fecal (Single Sample)' : 'ColiformFecalSingle',\n 'E. coli (Single Sample)' : 'EcoliSingle',\n 'E. coli (Geometric Mean)' : 'EcoliGM',\n 'Fluoride, Dissolved' : 'Fluoride',\n 'pH' : 'pH',\n 'Total Suspended Solids' : 'TSS',\n 'Specific Conductivity' : 'SConductivity',\n 'Electrical Conductivity' : 'EConductivity',\n 'Sodium, Dissolved' : 'Sodium',\n 'Potassium, Dissolved' : 'Potassium',\n 'Nitrogen, Total' : 'Nitrogen',\n 'Magnesium, Dissolved' : 'Magnesium',\n 'Calcium, Dissolved' : 'Calcium',\n 'Salinity' : 'Salinity',\n 'OrthoPhosphate as P, Dissolved' : 'Orthophosphate',\n 'Kjeldahl Nitrogen, Total' : 'KjeldahlN',\n 'Nitrate as Nitrogen' : 'NitrateAsNitrogen',\n 'Nitrate + Nitrite as N, Dissolved' : 'NitrateNitrite',\n 'Nitrogen, Total, Total' : 'Nitrogen'\n};\n\nexport const dateDict = {\n 0 : [0, 16],\n 1 : [1, 15],\n 2 : [2, 16],\n 3 : [3, 15],\n 4 : [4, 16],\n 5 : [5, 16],\n 6 : [6, 16],\n 7 : [7, 16],\n 8 : [8, 16],\n 9 : [9, 16],\n 10 : [10, 16],\n 11 : [11, 16]\n}\n\nexport const getGraphDate = (date, dataType) => {\n const year = date.getFullYear();\n if (dataType === 'Annual Average') {\n return new Date(year, 1, 1);\n } else if (dataType === 'Monthly Mean') {\n const monthDate = dateDict[date.getMonth()];\n return new Date(year, monthDate[0], monthDate[1]);\n } else {\n return date;\n }\n}\n\nexport const getMidDate = (date, dataType) => {\n const year = date.getFullYear();\n if (dataType === 'Annual Average') {\n return new Date(year, 1, 1);\n } else if (dataType === 'Monthly Mean') {\n const monthDate = dateDict[date.getMonth()];\n return new Date(year, monthDate[0], monthDate[1]);\n } else {\n return date;\n }\n}\n\nexport const getTrend = (data) => {\n if (data['p_value'] > 0.05) {\n // fail to reject null hypothesis, statistically nonsignificant\n return 'No Significant Trend';\n } else {\n // reject null hypothesis, statistically significant\n if (data['tau'] < 0) {\n return 'Decreasing';\n } else if (data['tau'] > 0) {\n return 'Increasing';\n } else {\n return 'No Significant Trend';\n }\n }\n}\n\nexport const loadImages = () => {\n preloadImage('./images/630EWK001.jpg');\n preloadImage('./images/631WWK001.jpg');\n preloadImage('./images/632ECR005.jpg');\n preloadImage('./images/633WCR002.jpg');\n preloadImage('./images/635TRK002.jpg');\n preloadImage('./images/637SUS001.jpg');\n}\n\nexport const preloadImage = (url) => {\n const img = new Image();\n img.src = url;\n}\n\n// rounds to two decimal places\nexport const roundToTwo = (num) => { \n return +(Math.round(num + \"e+2\") + \"e-2\");\n}\n\n// sorts an array alphabetical ignoring capitalization\nexport const sortIgnoreCap = (arr) => {\n const sortedArr = arr.sort((a,b) => {\n a = a.toLowerCase();\n b = b.toLowerCase();\n if (a === b) return 0;\n return a < b ? -1 : 1;\n });\n return sortedArr;\n}","import React, { Component } from 'react';\n\nclass SiteMenuOption extends Component {\n render() {\n return this.props.sites.map(site => (\n \n \n \n ));\n }\n}\n\nexport default SiteMenuOption;","import React, { Component } from 'react';\nimport SiteMenuOption from './SiteMenuOption';\n\nclass SiteMenu extends Component {\n constructor(props) {\n super(props);\n // bind value to selector\n this.handleChange = this.handleChange.bind(this);\n }\n handleChange(e) {\n this.props.changeActiveSite(e.target.value);\n }\n render() {\n return (\n
\n
\n \n
\n
\n )\n }\n}\n\nexport default SiteMenu;","import React, { Component } from 'react';\nimport boundary from '../data/r6_boundary.geojson';\nimport sites from '../data/sites.csv';\nimport * as d3 from 'd3';\nimport L from 'leaflet';\nimport 'leaflet/dist/leaflet.css';\n\nclass RegionMap extends Component {\n activeStyle() {\n return {\n color: '#fff',\n fillColor: '#d34a37',\n fillOpacity: 0.9,\n weight: 1,\n radius: 9\n };\n }\n boundaryStyle() {\n return {\n weight: 2,\n fillColor: '#e0ddd0',\n fillOpacity: 0,\n color: '#877968',\n };\n }\n defaultStyle() {\n return {\n color: '#fff',\n fillColor: '#046b99',\n fillOpacity: 0.9,\n weight: 1,\n radius: 9\n };\n }\n drawBoundary() {\n d3.json(boundary).then(res => {\n const feature = res.features[0];\n L.geoJson(feature, {\n pane: 'boundaryPane',\n style: this.boundaryStyle\n }).addTo(this.map);\n });\n }\n drawMarkers() {\n this.siteLayer = L.featureGroup().addTo(this.map);\n d3.csv(sites).then(res => {\n res.forEach(site => {\n site.id = +site.id;\n site.lat = +site.lat;\n site.long = +site.long;\n });\n res.forEach(site => {\n const content = '
' + site.name + '
(' + site.code + ')
';\n const circle = L.circleMarker([site.lat, site.long], {\n pane: 'circlePane',\n style: this.defaultStyle\n });\n circle.code = site.code;\n circle.on('click', e => {\n this.props.changeActiveSite(e.target.code);\n }).addTo(this.siteLayer).bindTooltip(content, {className: 'map-tooltip'});\n });\n this.map.fitBounds(this.siteLayer.getBounds());\n })\n }\n componentDidMount() {\n this.map = L.map('map', {\n center: [39.4068, -119.7824],\n zoom: 8,\n preferCanvas: true\n });\n const esri = require('esri-leaflet'); // required\n esri.basemapLayer('Topographic').addTo(this.map);\n this.map.createPane('boundaryPane');\n this.map.createPane('circlePane');\n this.drawBoundary();\n this.drawMarkers();\n }\n // this handles site changes originating from both the map and selector\n componentDidUpdate() {\n const keys = Object.keys(this.siteLayer._layers);\n keys.forEach(key => {\n const siteCode = this.siteLayer._layers[key].code;\n if (siteCode === this.props.selected.code) {\n this.siteLayer._layers[key].setStyle(this.activeStyle());\n } else {\n this.siteLayer._layers[key].setStyle(this.defaultStyle());\n }\n });\n }\n render() {\n return (\n
\n )\n }\n}\n\nexport default RegionMap;","import React, { Component } from 'react';\n\nclass SitePicture extends Component {\n render() {\n return (\n {'Photo\n );\n }\n}\n\nexport default SitePicture;","import React, { Component } from 'react';\nimport SitePicture from './SitePicture';\n\nclass SiteInfo extends Component {\n render() {\n return (\n
\n
\n
\n
\n
\n

{this.props.selected.display}

\n

{this.props.selected.desc}

\n
\n
\n
\n \n
\n
\n
\n
\n );\n }\n}\n\nexport default SiteInfo;","import React, { Component } from 'react';\nimport { analyteDict, roundToTwo } from '../Utils.js';\n\nclass Year extends Component {\n render() {\n // get unique years\n const yearSet = new Set();\n this.props.data.forEach(res => {\n yearSet.add(res.SampleDate.getFullYear());\n });\n // filter data by year\n const years = [];\n yearSet.forEach(year => {\n const yearData = this.props.data.filter(res => {\n return res.SampleDate.getFullYear() === year;\n });\n years.push({\n year: year,\n data: yearData,\n analyte: this.props.data[0].Analyte\n });\n });\n // sort descending to show latest years first\n const sortedYears = years.sort((a, b) => b.year - a.year);\n return sortedYears.map(obj => (\n \n \n     {obj.year}\n \n {this.props.getCount(obj.data)}\n {roundToTwo(this.props.getMean(obj.data))}\n {roundToTwo(this.props.getMedian(obj.data))}\n {roundToTwo(this.props.getMin(obj.data))}\n {roundToTwo(this.props.getMax(obj.data))}\n
\n \n \n ));\n }\n}\n\nexport default Year;","import React, { Component } from 'react';\nimport { getTrend } from '../Utils.js';\n\nclass TableTrendIcon extends Component {\n getIcon = (trend) => {\n switch(trend) {\n case 'No Significant Trend':\n return 'zmdi zmdi-minus zmdi-hc-lg';\n case 'Decreasing':\n return 'zmdi zmdi-arrow-left zmdi-hc-rotate-270 zmdi-hc-lg';\n case 'Increasing':\n return 'zmdi zmdi-arrow-left zmdi-hc-rotate-90 zmdi-hc-lg';\n default:\n return 'zmdi zmdi-help zmdi-hc-lg';\n }\n }\n render() {\n const trend = getTrend(this.props.trends[this.props.analyte]);\n const icon = this.getIcon(trend);\n return (\n \n )\n }\n\n}\n\nexport default TableTrendIcon;","import React, { Component } from 'react';\nimport { analyteDict, roundToTwo } from '../Utils.js';\nimport Year from './Year';\nimport TableTrendIcon from './TableTrendIcon';\nimport * as d3 from 'd3';\n\nclass TableRow extends Component {\n getCount = (data) => data.length;\n getMin = (data) => {\n const values = data.map(d => d.DataValue);\n return d3.min(values);\n }\n getMax = (data) => {\n const values = data.map(d => d.DataValue);\n return d3.max(values);\n }\n getMedian = (data) => {\n const values = data.map(d => d.DataValue);\n return d3.median(values);\n }\n getMean = (data) => {\n const values = data.map(d => d.DataValue);\n return d3.mean(values);\n }\n getObjective = (analyte, objectives) => {\n if (analyte === 'pH') { return '6.5-8.5'}\n const filtered = objectives.filter((obj) => { return obj.Analyte === analyte; }); \n if (filtered.length > 0) {\n return filtered[0].Value;\n } else {\n return '—';\n }\n }\n handleClick = (event) => {\n this.toggleArrow(event.target);\n }\n toggleArrow = (target) => {\n const caretRight = 'zmdi-caret-right';\n const caretDown = 'zmdi-caret-down';\n const row = target.closest('tr');\n const firstColumn = row.childNodes[0];\n const icon = firstColumn.childNodes[0];\n if (icon.classList.contains(caretRight)) {\n icon.classList.remove(caretRight);\n icon.classList.add(caretDown);\n } else if (icon.classList.contains(caretDown)) {\n icon.classList.remove(caretDown);\n icon.classList.add(caretRight);\n } else {\n icon.classList.add('zmdi-help');\n }\n }\n render() {\n // sort analytes alphabetical\n const analytes = this.props.analytes.sort((a, b) => {\n const aName = a.name.toLowerCase();\n const bName = b.name.toLowerCase();\n return (aName > bName) ? 1 \n : (bName > aName) ? -1\n : 0;\n });\n return analytes.map((analyte) => (\n \n \n   {analyte.name}\n \n {this.getCount(analyte.data)}\n {roundToTwo(this.getMean(analyte.data))}\n {roundToTwo(this.getMedian(analyte.data))}\n {roundToTwo(this.getMin(analyte.data))}\n {roundToTwo(this.getMax(analyte.data))}\n
\n \n \n \n ));\n }\n}\n\nexport default TableRow;","import React, { Component } from 'react';\nimport TableRow from './TableRow';\n\nclass Table extends Component {\n render() {\n return (\n
\n
\n
Summary Table
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
AnalyteTrendCountMeanMedianMinMaxObjective
\n
\n
\n
\n );\n }\n}\n\nexport default Table;","import React, { Component } from 'react';\nimport * as d3 from 'd3';\n\nclass DownloadData extends Component {\n downloadCSV = (data) => {\n const fileName = 'R6_Download_' + Date.now() + '.csv';\n const fileData = this.formatData(data);\n const csvContent = this.convertToCSV(fileData);\n if (this.checkEdge()) {\n let blob = new Blob([csvContent], { type: 'data:text/csv;charset=utf-8;' });\n const linkElement = document.createElement('a');\n const url = URL.createObjectURL(blob);\n linkElement.setAttribute('href', url);\n linkElement.setAttribute('download', fileName);\n const clickEvent = new MouseEvent('click', {\n 'view': window,\n 'bubbles': true,\n 'cancelable': false\n });\n linkElement.dispatchEvent(clickEvent);\n } else {\n let csv = document.createElement('a');\n csv.href = 'data:text/csv;charset=utf-8,' + encodeURIComponent(csvContent);\n csv.target = '_blank';\n csv.download = fileName;\n document.body.appendChild(csv);\n csv.click();\n } \n }\n formatData = (data) => {\n const formatDate = d3.timeFormat('%Y-%m-%d');\n const selected = data.map(d => {\n return {\n 'SiteCode': '\"' + d.SiteCode + '\"',\n 'SampleDate': formatDate(d.SampleDate),\n 'Analyte': '\"' + d.Analyte + '\"',\n 'Unit': '\"' + d.Unit + '\"',\n 'Result': d.DataValue,\n 'MDL': d.MDL,\n 'RL': d.RL,\n 'ResQualCode': '\"' + d.ResQualCode + '\"',\n 'QACode': '\"' + d.QACode + '\"',\n 'Compliance': '\"' + d.Compliance + '\"'\n };\n });\n return selected;\n }\n convertToCSV = (data) => {\n let csvString = '';\n const header = Object.keys(data[0]);\n const values = data.map(obj => {\n return Object.keys(obj)\n .map(e => { return obj[e]; })\n .join(',');\n });\n const body = values.join('\\r\\n');\n csvString += header + '\\r\\n' + body;\n return csvString;\n }\n checkEdge = () => {\n const ua = window.navigator.userAgent;\n return (/edge|msie\\s|trident\\//i.test(ua)) ? true : false;\n }\n render() {\n return (\n \n );\n }\n\n}\n\nexport default DownloadData;","import React, { Component } from 'react';\nimport { analyteDict, getMidDate } from '../Utils.js';\nimport * as d3 from 'd3';\n\nclass Graph extends Component {\n bufferX = (extent, averages) => {\n // convert to UNIX\n let min = extent[0].getTime();\n let max = extent[1].getTime();\n // compare min/max to averages, add padding so that all graph elements at edges are fully visible\n if (averages) {\n averages.forEach(avg => {\n // get adjusted date\n const adjustedDate = getMidDate(avg.Date, avg.DataType);\n const dateStamp = adjustedDate.getTime();\n // compare only the minimum dates. maxes should not be an issue since all averages will be positioned before the last result\n if (dateStamp < min) {\n min = dateStamp;\n }\n });\n }\n const difference = max - min;\n const bufferedMin = min - (difference * .05); \n const bufferedMax = max + (difference * .05);\n // return date objects\n return [new Date(bufferedMin), new Date(bufferedMax)];\n }\n drawChart = () => {\n // initialize chart elements\n const timeMargin = { top: 30, right: 20, bottom: 30, left: 60 };\n const timeWidth = 495 + timeMargin.left + timeMargin.right;\n const timeHeight = 275 + timeMargin.top + timeMargin.bottom;\n const analyteCode = analyteDict[this.props.analyte.name];\n const data = this.props.analyte.data;\n const average = this.props.analyte.average;\n const objective = this.props.analyte.objective;\n const chartID = analyteCode + '-chart';\n const chart = d3.select('#' + analyteCode).append('svg')\n .attr('id', chartID)\n .attr('className', 'chart')\n .attr('width', timeWidth)\n .attr('height', timeHeight)\n .call(() => { this.responsive(chartID); });\n // add geometry for clipping chart elements\n const clipPadding = 4;\n chart.append('clipPath')\n .attr('id', 'clip-range')\n .append('rect')\n .attr('x', timeMargin.left + 1)\n .attr('y', 0)\n .attr('width', timeWidth - timeMargin.left - timeMargin.right)\n .attr('height', timeHeight - timeMargin.bottom + clipPadding * 2);\n chart.append('clipPath')\n .attr('id', 'clip')\n .append('rect')\n .attr('x', timeMargin.left - clipPadding)\n .attr('y', 0)\n .attr('width', timeWidth - timeMargin.left - timeMargin.right + clipPadding * 2)\n .attr('height', timeHeight - timeMargin.bottom +clipPadding);\n chart.append('clipPath')\n .attr('id', 'clean-clip')\n .append('rect')\n .attr('x', timeMargin.left)\n .attr('y', 0)\n .attr('width', timeWidth - timeMargin.left - timeMargin.right)\n .attr('height', timeHeight - timeMargin.bottom);\n // add tooltips\n const tooltip = d3.select('body').append('div')\n .attr('id', analyteCode + '-tooltip')\n .attr('class', 'tooltip')\n .style('opacity', 0);\n // initialize axes\n chart.append('g')\n .attr('class', 'x axis')\n .attr('transform', 'translate(0,' + (timeHeight - timeMargin.bottom) + ')');\n chart.append('g')\n .attr('class', 'y axis')\n .attr('transform', 'translate(' + timeMargin.left + ', 0)');\n const xExtent = d3.extent(data, (d) => { return d.SampleDate; });\n const xExtentBuffered = this.bufferX(xExtent, average);\n let yMax = d3.max(data, (d) => { return d.DataValue; });\n if (objective.length > 0) {\n if (objective[0].Value > yMax) { \n yMax = objective[0].Value; \n }\n }\n const xScale = d3.scaleTime()\n .domain(xExtentBuffered)\n .range([timeMargin.left, timeWidth - timeMargin.right]);\n const yScale = d3.scaleLinear()\n .domain([0, yMax])\n .range([timeHeight - timeMargin.bottom, timeMargin.top]);\n const xAxis = d3.axisBottom()\n .scale(xScale)\n .ticks(5);\n const yAxis = d3.axisLeft()\n .scale(yScale)\n .ticks(5);\n // draw objective range\n if (objective.length > 0) {\n if (objective[0].ObjClass === 'Range') {\n const rangeRect = chart.append('g')\n .attr('className', 'range-g')\n .attr('clip-path', 'url(#clip-range)');\n rangeRect.append('rect')\n .attr('visibility', 'visible')\n .attr('x', 0)\n .attr('y', yScale(objective[0].Upper))\n .attr('width', timeWidth)\n .attr('height', yScale(objective[0].Lower) - yScale(objective[0].Upper))\n .attr('fill', '#d6d6d6')\n .style('opacity', 0.5);\n // draw range box label\n rangeRect.append('text')\n .attr('class', 'range-label')\n .attr('x', timeMargin.left + 'px')\n .attr('y', yScale(objective[0].Upper))\n .attr('transform', 'translate(5, -5)')\n .attr('text-anchor', 'left')\n .text('Range: ' + objective[0].Lower + ' — ' + objective[0].Upper + ' ' + objective[0].Unit); \n }\n }\n // draw points\n const points = chart.append('g')\n .attr('clip-path', 'url(#clip)');\n points.selectAll('.circle')\n .data(data)\n .enter().append('circle')\n .attr('className', 'circle')\n .attr('r', 4)\n .attr('cx', (d) => { return xScale(d.SampleDate); })\n .attr('cy', (d) => { return yScale(d.DataValue); })\n .attr('fill', (d) => { return this.getColor(d, objective); })\n .on('mouseover', (d) => {\n const formatDate = d3.timeFormat('%b %e, %Y');\n return tooltip\n .style('opacity', 1)\n .html(formatDate(d.SampleDate) + '
' + d.DataValue + ' ' + d.Unit + '
' + d.Label);;\n })\n .on(\"mousemove\", () => {\n return tooltip\n .style('top', (window.event.pageY - 20) + 'px')\n .style('left', (window.event.pageX + 10) + 'px');\n })\n .on(\"mouseout\", () => {\n return tooltip.style('opacity', 0);\n })\n .merge(points)\n .attr('cx', (d) => { return xScale(d.SampleDate); })\n .attr('cy', (d) => { return yScale(d.DataValue); });\n points.exit()\n .remove();\n // draw averages\n const triangleIcon = d3.symbol().type(d3.symbolTriangle).size(8 * 8);\n const triangles = chart.append('g')\n .attr('clip-path', 'url(#clean-clip)'); \n triangles.selectAll('.diamond')\n .data(average)\n .enter().append('path')\n .attr('class', 'diamond')\n .attr('d', triangleIcon)\n .attr('transform', (d) => { return 'translate(' + xScale(d.AdjustedDate) + ',' + yScale(d.DataValue) + ')'; })\n .style('fill', (d) => { return this.getColor(d, objective); })\n .on('mouseover', (d) => {\n const formatNum = d3.format('.2f');\n let formatDate;\n if (d.DataType === 'Annual Average') {\n formatDate = d3.timeFormat('%Y');\n } else if (d.DataType === 'Monthly Mean') {\n formatDate = d3.timeFormat('%b %Y');\n }\n return tooltip\n .style('opacity', 1)\n .html(d.DataType + ': ' + formatDate(d.AdjustedDate) + '
' + formatNum(d.DataValue) + ' ' + d.Unit);\n })\n .on('mousemove', () => {\n return tooltip\n .style('top', (window.event.pageY - 20) + 'px')\n .style('left', (window.event.pageX + 10) + 'px');\n })\n .on('mouseout', () => {\n return tooltip.style('opacity', 0);\n });\n triangles.exit()\n .remove();\n // draw objective line\n if (objective.length > 0) {\n if (objective[0].Type === 'Max' || objective[0].Type === 'Min') {\n const objLine = chart.append('g')\n .datum(objective[0])\n .attr('clip-path', 'url(#clean-clip)');\n objLine.append('line')\n .attr('className', 'objective')\n .style('stroke', '#e74c3c')\n .style('stroke-width', '2px')\n //.attr('stroke-dasharray', ('9, 3'))\n .attr('x1', 0)\n .attr('x2', timeWidth)\n .attr('y1', (d) => { return yScale(d.Value); })\n .attr('y2', (d) => { return yScale(d.Value); });\n objLine.append('text')\n .attr('class', 'line-label')\n .attr('x', timeMargin.left + 'px')\n .attr('y', (d) => { return yScale(d.Value); })\n .attr('transform', 'translate(5, -5)')\n .attr('text-anchor', 'left')\n .text((d) => { return d.Label + ': ' + d.Value + ' ' + d.Unit; });\n }\n }\n // draw axes\n chart.select('.x.axis').call(xAxis);\n chart.select('.y.axis').call(yAxis);\n chart.append('text')\n .attr('class', 'axis-label')\n .attr('text-anchor', 'middle') \n .attr('transform', 'translate(' + 12 + \",\" + (timeHeight / 2) + ') rotate(-90)')\n .text(data[0].Unit);\n }\n getColor = (d, objective) => {\n const red = '#e84141';\n const green = '#147554';\n const gray = '#4d5e6b';\n if (objective.length > 0) {\n switch (objective[0].Type) {\n case 'Max': \n if (d.DataValue > objective[0].Value) {\n return red;\n } else {\n return green;\n }\n case 'Min':\n if (d.DataValue < objective[0].Value) {\n return red;\n } else {\n return green;\n }\n case 'Range':\n if ((d.DataValue >= objective[0].Lower) && (d.DataValue <= objective[0].Upper)) {\n return green;\n } else {\n return red;\n }\n default:\n return gray;\n }\n } else {\n return gray;\n }\n }\n responsive = (id) => {\n // get container + svg aspect ratio\n const svg = d3.select('#' + id),\n container = svg.node().parentNode,\n width = parseInt(svg.style('width')),\n height = parseInt(svg.style('height')),\n aspect = width / height;\n // add viewBox and preserveAspectRatio properties,\n // and call resize so that svg resizes on inital page load\n svg.attr('viewBox', '0 0 ' + width + ' ' + height)\n .attr('perserveAspectRatio', 'xMinYMid')\n .call(resize);\n // to register multiple listeners for same event type, \n // you need to add namespace, i.e., 'click.foo'\n // necessary if you call invoke this function for multiple svgs\n // api docs: https://github.com/mbostock/d3/wiki/Selections#on\n d3.select(window).on('resize.' + container.id, resize);\n // get width of container and resize svg to fit it\n function resize() {\n const targetWidth = parseInt(container.offsetWidth);\n svg.attr('width', targetWidth);\n svg.attr('height', Math.round(targetWidth / aspect));\n }\n }\n componentDidMount = () => {\n this.drawChart();\n }\n componentDidUpdate = () => {\n this.drawChart();\n }\n render() {\n return
;\n }\n}\n\nexport default Graph;","import React, { Component } from 'react';\nimport { getTrend } from '../Utils.js';\nimport * as d3 from 'd3';\n\nclass Trend extends Component {\n getIcon(trend) {\n switch (trend) {\n case 'No Significant Trend':\n return 'zmdi zmdi-minus zmdi-hc-5x';\n case 'Decreasing':\n return 'zmdi zmdi-trending-down zmdi-hc-5x';\n case 'Increasing':\n return 'zmdi zmdi-trending-up zmdi-hc-5x';\n default:\n return 'zmdi zmdi-help zmdi-hc-5x';\n }\n }\n render() {\n const trendText = getTrend(this.props.trend);\n const icon = this.getIcon(trendText);\n const formatNum = d3.format('.2f');\n return (\n
\n
\n
Trend
\n
\n \n \n
{trendText}
\n

\n Kendall's tau-b: {formatNum(this.props.trend['tau'])}
\n p-value: {formatNum(this.props.trend['p_value'])}
\n n = {this.props.trend['n']}\n

\n
\n
\n
\n )\n }\n\n}\n\nexport default Trend;","import React, { Component } from 'react';\nimport { analyteDict } from '../Utils.js';\nimport Graph from './Graph';\nimport Trend from './Trend';\nimport DownloadData from './DownloadData';\n\nclass GraphSection extends Component {\n render() {\n return this.props.analytes.map((analyte) => (\n
\n

{analyte.name}

\n
\n
\n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n
\n ));\n }\n}\n\nexport default GraphSection;","import React, { Component } from 'react';\nimport DownloadData from './DownloadData';\nimport GraphSection from './GraphSection';\nimport { sortIgnoreCap } from '../Utils.js';\nimport * as d3 from 'd3';\n\nclass GraphContainer extends Component {\n // sorts analytes and data by rank for display\n // returns all data nested in objects\n sortByRank = () => {\n const analyte1Set = new Set(),\n analyte2Set = new Set(),\n analyte3Set = new Set();\n this.props.data.forEach(res => {\n switch (res.Rank) {\n case 1:\n analyte1Set.add(res.Analyte);\n break;\n case 2:\n analyte2Set.add(res.Analyte);\n break;\n case 3:\n analyte3Set.add(res.Analyte);\n break;\n default:\n console.log('Error. Missing Rank value.');\n }\n });\n // sort alphabetical and concatenate\n const analyte1List = sortIgnoreCap(Array.from(analyte1Set));\n const analyte2List = sortIgnoreCap(Array.from(analyte2Set));\n const analyte3List = sortIgnoreCap(Array.from(analyte3Set));\n const analyteList = [...analyte1List, ...analyte2List, ...analyte3List];\n // filter data by analyte\n const analytes = [];\n analyteList.forEach(analyte => {\n const analyteData = this.props.data.filter(res => {\n return res.Analyte === analyte;\n });\n const analyteAvg = this.props.averages.filter(res => {\n return res.Analyte === analyte;\n });\n const analyteObj = this.props.objectives.filter(res => {\n return res.Analyte === analyte;\n });\n analytes.push({\n name: analyte,\n data: analyteData,\n average: analyteAvg,\n objective: analyteObj\n });\n });\n return analytes;\n }\n render() {\n const analytes = this.sortByRank();\n // need to remove rather than redraw because each site has different analytes\n // revisit and clean up\n d3.selectAll('svg').remove();\n d3.selectAll('.tooltip').remove();\n return (\n
\n
\n
\n
Water Quality Data
\n
\n \n
\n
\n
\n
\n \n
\n
\n );\n }\n}\n\nexport default GraphContainer;","import React, { Component } from 'react';\nimport $ from 'jquery';\n\nclass ReturnToTop extends Component {\n handleClick = () => {\n this.scrollToTop();\n }\n scrollToTop = () => {\n $('body, html, #right').animate({ scrollTop: 0 }, 'slow');\n }\n render() {\n return (\n \n );\n }\n}\n\nexport default ReturnToTop;","import React, { Component } from 'react';\nimport $ from 'jquery';\n\nclass WelcomeModal extends Component {\n componentDidMount() {\n $(window).on('load', () => {\n $('#welcome-modal').modal({backdrop: 'static', keyboard: false}) \n $('#welcome-modal').modal('show');\n });\n }\n render() {\n return (\n
\n
\n
\n
\n
  Disclaimer
\n
\n
\n
\n \"Water\n
\n

This application is in early development. It may change at any time without prior notification. All data provided are provisional and should not be used for any particular purpose other than general reference.

\n

This application is best viewed in Firefox, Chrome, or Safari. Internet Explorer is not supported.

\n

If you have any questions, please contact the Surface Water Ambient Monitoring Program.

\n
\n
\n \n
\n
\n
\n
\n )\n }\n}\n\nexport default WelcomeModal;","// Polyfill must be the first lines in src/index.js\nimport 'react-app-polyfill/stable';\nimport React, { Component } from 'react';\nimport { getGraphDate, loadImages } from './Utils.js'\nimport SiteMenu from './components/SiteMenu';\nimport RegionMap from './components/RegionMap';\nimport SiteInfo from './components/SiteInfo';\nimport Table from './components/Table';\nimport GraphContainer from './components/GraphContainer';\nimport ReturnToTop from './components/ReturnToTop';\nimport WelcomeModal from './components/WelcomeModal';\nimport sites from './data/sites.csv';\nimport * as d3 from 'd3';\nimport $ from 'jquery';\nimport 'bootstrap/dist/css/bootstrap.css';\nimport 'bootstrap/dist/js/bootstrap.min.js';\nimport './App.css';\n\nclass App extends Component {\n state = {\n selected: {},\n data: [],\n averages: [],\n objectives: [],\n analytes: [],\n sites: []\n }\n changeActiveSite = (siteCode) => {\n if (siteCode !== this.state.selected.code) {\n const selected = this.state.sites[this.state.sites.findIndex(site => site.code === siteCode)];\n this.loadData(selected);\n }\n }\n loadData = (site) => {\n const parseDate = d3.timeParse('%-m/%-d/%y');\n // data file paths\n const dataPath = './data/' + site.code + '_Data.csv',\n avgPath = './data/' + site.code + '_Averages.csv',\n objPath = './data/' + site.code + '_Objectives.csv',\n trendPath = './trend/' + site.code + '_Trends.json';\n Promise.all([\n d3.csv(dataPath),\n d3.csv(avgPath),\n d3.csv(objPath),\n d3.json(trendPath)\n ]).then(responses => {\n const data = responses[0],\n averages = responses[1],\n objectives = responses[2],\n trends = responses[3];\n // process data\n data.forEach(res => {\n res.SampleDate = parseDate(res.SampleDate);\n res.DataValue = +res.DataValue;\n res.Rank = +res.Rank;\n });\n averages.forEach(res => {\n res.Date = parseDate(res.Date);\n res.AdjustedDate = getGraphDate(res.Date, res.DataType);\n res.DataValue = +res.DataValue;\n })\n objectives.forEach(res => {\n res.Value = +res.Value;\n res.Upper = +res.Upper;\n res.Lower = +res.Lower;\n });\n // organize data by analyte\n const analytes = data.map(rec => rec.Analyte)\n const uniqueAnalytes = [...new Set(analytes)];\n const dataByAnalyte = [];\n uniqueAnalytes.forEach(analyte => {\n const analyteData = data.filter(res => res.Analyte === analyte),\n analyteAverage = averages.filter(res => res.Analyte === analyte),\n analyteObjective = objectives.filter(res => res.Analyte === analyte);\n dataByAnalyte.push({\n name: analyte,\n data: analyteData,\n average: analyteAverage,\n objective: analyteObjective\n });\n });\n // load site data into state\n this.setState({\n selected: site,\n data: data,\n averages: averages,\n objectives: objectives,\n analytes: dataByAnalyte,\n trends: trends\n });\n });\n }\n componentDidMount() {\n // load all sites into state\n d3.csv(sites).then(res => {\n res.forEach(site => {\n site.id = +site.id;\n site.lat = +site.lat;\n site.long = +site.long;\n });\n this.setState({\n sites: res\n });\n loadImages();\n $('body, html, #right').scrollTop();\n // initialize app view on default site\n const defaultSiteCode = '637SUS001';\n const defaultSiteObj = res[res.findIndex(site => site.code === defaultSiteCode)];\n this.loadData(defaultSiteObj);\n });\n }\n render() {\n return (\n
\n \n
\n
\n
\n {/* height attribute needed for map render */}\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n \n
\n
\n
\n \n \n \n \n \n \n \n );\n }\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n\nconst isIE = () => {\n const ua = navigator.userAgent;\n const checkIE = ua.indexOf('MSIE ') > -1 || ua.indexOf('Trident/') > -1;\n return checkIE;\n}\n\nif (isIE()) {\n const content = \"

Internet Explorer is not supported.
Please try opening the application using the latest version of FireFox, Chrome, or Safari.

Questions?

\";\n document.getElementById('root').innerHTML = content;\n} else {\n ReactDOM.render(, document.getElementById('root'));\n}\n","module.exports = __webpack_public_path__ + \"static/media/sites.a27f406d.csv\";"],"sourceRoot":""}