{"version":3,"sources":["components/SliderSelect/SliderSelect.jsx","components/sliders/sliderdouble.jsx","components/fileexplorer/fileexplorer.jsx","pages/datadetail/inner/download.jsx","pages/datadetail/inner/information.jsx","graphs/d3/networkgraph/networkgraph.jsx","pages/datadetail/inner/pipeline.jsx","pages/datadetail/inner/external.jsx","pages/datadetail/inner/preview.jsx","pages/datadetail/datasubmenu.jsx","pages/datadetail/inner/threedmodeldownload.jsx","graphs/d3/groupedbargraph/groupedbargraph.jsx","pages/datadetail/inner/ch2018graph.jsx","pages/datadetail/inner/ch2018download.jsx","pages/datadetail/inner/remotesensingdownload.jsx","pages/datadetail/inner/locationmap.jsx","components/interp2/interp2.js","graphs/d3/heatmap/heatmap.jsx","components/sliders/slidersingle.jsx","components/sliders/sliderdoublenumber.jsx","components/loaddatasets/loaddatasets.jsx","components/reportissue/reportissue.jsx","pages/datadetail/inner/bafu.jsx","pages/datadetail/inner/display.jsx","pages/datadetail/inner/plot.jsx","pages/datadetail/inner/mapcomponent.jsx","pages/datadetail/datadetail.jsx","img/download.svg","pages/datadetail/img/mail.svg","pages/datadetail/img/calendar.svg","pages/datadetail/img/location.svg","pages/datadetail/img/git.svg","pages/datadetail/img/depth.svg","pages/datadetail/img/download.svg","pages/datadetail/img/citation.svg","pages/datadetail/img/licence.svg","pages/datadetail/img/connect.svg","components/fileexplorer/img/folder.svg","img/line.svg","img/preview.svg","img/pipe.svg","img/info.svg","img/webgis.svg","img/3d.svg","img/map.svg"],"names":["SliderSelect","state","graphid","Math","round","random","updateDomain","domain","plotSliderSelect","a","props","type","upper","lower","value","language","availability","data","undefined","options","min","max","onChange","onZoom","slider","onChangeLower","onChangeUpper","onChangeValue","this","setTimeout","window","addEventListener","removeEventListener","prevProps","prevState","id","className","Component","DateSliderDouble","formatDate","raw","Date","formatTick","ms","diff","format","event","setState","files","map","f","mindatetime","maxdatetime","style","float","clearIcon","calendarIcon","maxDate","minDate","disableClock","locale","Header","transformSize","size","dir","headerClick","selected","loading","downloadClick","onClick","d","i","Fragment","key","length","ListView","objectClick","prefix","sort","b","children","name","includes","title","e","src","folder","alt","href","target","rel","download","FileExplorer","object","path","join","filter","s","push","new_dir","promisedSetState","newState","Promise","resolve","alert","bucket","repo","pre","split","body","zip","keys","replace","axios","post","apiUrl","timesRun","interval","setInterval","clearInterval","get","status_link","status","console","log","link","document","createElement","display","download_link","targe","appendChild","click","error","file_tree","find","Download","onChangeTime","values","getTime","fileIdSelect","arr","filetype","out","filelineage","downloadFiles","url","embargo","dataset","embargoDate","datasetpassword","prompt","toLowerCase","method","responseType","ids","then","downloadUrl","URL","createObjectURL","Blob","setAttribute","remove","catch","response","getLabel","selectedFiles","datasetparameters","csv","test","dp","axis","selectedArray","licenses_id","citation","persons_id","Information","parseDate","input","date","getMonth","getFullYear","formatTime","time","parts","slice","num","dec","scripts","maintenance","script","dict","dt","starttime","toString","endtime","detail","start","end","parameters","description","reporter","rows","urlFromSsh","ssh","calendar","location","latitude","longitude","lakes_id","git","mindepth","depth","maxdepth","downloads","licence","mail","projects_id","organisations_id","NetworkGraph","plotNetworkGraph","textlabel","ticked","dragstarted","dragged","dragended","d3","active","simulation","alphaTarget","fx","fy","x","y","restart","attr","source","node","label","pop","JSON","parse","stringify","lineage","datasourcelink","rootlink","width","getBoundingClientRect","height","nodes","force","edges","strength","svg","append","selectAll","enter","call","on","text","links","isEqual","SyntaxHighlighter","registerLanguage","js","python","r","Pipeline","scriptInt","setScriptInt","renku","gitlab","renkulab","downloadlink","selectedscript","scriptType","py","scriptHeaders","k","parseInt","filterEdges","findScriptDataset","escript","edataset","filepath","shift","diagram","j","edge","unshift","github","wrapLines","lake","Preview","tableHeader","parameters_id","unit","tableBody","l","inner","len","Connect","DataSubMenu","hide","allowedStep","step","updateSelectedState","td","line","info","preview","pipe","to","webgis","ThreeDModelDownload","year","week","dates","2020","onChangeYear","onChangeWeek","parseDateFormat","day","getDate","month","parseSimpleDate","String","padStart","parseWeek","setDate","currentDate","endDate","getDay","Object","years","yearlist","weeks","sunday","toLocaleDateString","D3GroupedBarGraph","plotBarGraph","downloadGraph","titlesvg","str","XMLSerializer","serializeToString","getElementById","canvas","context","getContext","viswidth","visheight","image","Image","onerror","onload","drawImage","toDataURL","encodeURIComponent","colors","xlabel","xunits","legend","setDownloadGraph","margin","top","right","bottom","left","maingroup","subgroup","Infinity","m","range","rangeRound","paddingInner","align","y1","bandwidth","padding","color","xAxis","yAxis","plotdata","mg","subdata","sg","legendblock","offset","Ch2018Graph","lakes","period","smoothing","updateSmoothing","updateLake","timeout","lakedata","updateDepth","updatePeriod","movingAvg","array","count","qualifier","val","avg","sum","result","isNaN","index","search","ll","indexOf","inData","lake_options","listlake","lakeproperties","altitude","area","volume","lcolor","lweight","yearly","seasonal","barlegend","barcolors","stratification","yearlyConfidence","seasonalConfidence","CI_upper","CI_lower","Array","perioddict","p1","p2","p3","p4","depthdict","surface","innerWidth","ylabel","yunits","xscale","yscale","confidence","Ch2018Download","RemoteSensingDownload","selected_files","onChangeRange","sf","filelink","name_path","nc","satellite","table_inner","file","toLocaleTimeString","selectRange","LocationMap","onChangeBounds","clickPoint","onChangeFileInt","removeFile","selectFilesDatetime","plotfiles","mindt","maxdt","filecontrol","ave","toDateString","nc_name","sidebartitle","wide","datasets","rightNoScroll","preopen","content","interp2","z","Error","flat","every","isNumeric","linear","xlinear","ylinear","xnearest","ynearest","linearInterpolate","nearestInterpolate","zz","iArr","yy","interp","indexOfLower","xdata","indexOfClosest","n","parseFloat","isFinite","abs","newdiff","D3HeatMap","fullscreen","zoom","fontSize","xgraph","ygraph","mousex","mousey","idx","ads","editFontSize","toggleXgraph","dispatchEvent","Event","toggleYgraph","toggleDownload","toggleFullscreen","toggleDisplay","closest","curr","median","mid","floor","nums","gaps","columnSelect","downloadCSV","printdata","zlabel","zunits","isArray","csvContent","encodedUri","encodeURI","downloadJSON","getDomain","minarr","maxarr","thresholds","t","hover","obj","plotHeatMap","bcolor","minvalue","maxvalue","yReverse","xReverse","thresholdStep","levels","xLabel","yLabel","zLabel","xUnit","yUnit","zUnit","zMin","zMax","backgroundColor","autoDownsample","contour","setDownloadGraphDiv","heatmap","TimeLabels","xy","dxy","dxx","dyy","dyx","linedata","datax","datay","x_dots","y_dots","header","xmax","xmin","simple","plotdots","SliderSingle","valueStr","currentfile","NumberSliderDouble","tupper","tlower","onUpdate","toFixed","LoadDataSets","downloadProgress","ReportIssue","reported","modal","message","email","sensordepths","submitted","openModal","closeModal","updateState","parameter","addAllParameters","p","updateInput","updateMessage","updateEmail","toggleMaintenance","submitReport","repositories_id","from","personalizations","dynamic_template_data","template_id","issues","repo_id","deleteMaintenance","delete","updateMaintenance","submitMaintenance","componentDidMount","sd","checked","isMulti","classNamePrefix","placeholder","readOnly","Bafu","onChangeLowerX","onChangeX","upperX","onChangeUpperX","lowerX","graph","yScale","minX","maxX","dropdown","lang","lang_map","en","de","fr","it","ylabel_info","zlabel_info","yi","yaxis_dict","dp1","yaxis","dp2","xaxis","box","grid","border","Display","calculateMovingAverage","windowSize","movingAverages","windowStart","average","reduce","acc","head","xmlns","xmlnsXlink","preserveAspectRatio","viewBox","fill","xlinkHref","curve","Graph","lowerZ","upperZ","timeaxis","xScale","x2label","x2units","y2label","y2units","Sidebar","zaxis","addNewFiles","xoptions","yoptions","zoptions","handleAxisSelect","handleAxisAppend","AxisSelect","dataList","defaultValue","disabled","newFeature","Compare","units","selectable","concat","Set","o","Range","onChangeLowerY","onChangeY","upperY","onChangeUpperY","lowerY","onChangeFile","connect","minY","maxY","downloadData","toggleAddNewFile","fileControl","DisplayOptions","mask","decimate","interpolate","toggleMask","togglePlotdots","resetLower","minZ","resetUpper","maxZ","onChangeDecimate","onChangeInterpolate","onChangeAverage","onChangexScale","onChangeyScale","onChangeLocalColors","onChangeLocalTitle","onChangeLocalThreshold","onChangeLocalMin","onChangeLocalMax","onChangeLocalBcolor","updatePlot","onChangeState","updateZ","interpolate_options","colSpan","op","Plot","point","refresh","failed","downloadMultipleFiles","toDownload","parseColor","colorname","colorparse","colorlist","c","findLink","setAxisOptions","xdp","ydp","extra","Number","isInteger","shape","getAxisLabels","zdp","axisEdit","getBounds","maskArray","maskArr","addMaintenance","selectAxisAndMask","iter","pd","maskaxis","apply","findaxis","ax","findmask","axp","maintenance_ids","datasetparameters_id","findIndex","depths","pdx","pdy","joinData","joinLinegraphData","reorderMultipleLines","joinHeatmapData","relabelDataObject","lines","roundFactor","factor","hours","getHours","average1D","tx","ox","arrDict","average2D","bounds","zt","averageData","decimate1D","decimate2D","decimateData","sliceXArray","item","sliceYArray","sliceXYArray","sliceData","dataout","dataoutX","dataoutY","addGaps","gap","splice","processPlotData","getZBounds","interpolate2D","filterData","getInitialBounds","plotproperties","zdomain","yextents","ya","ydomain","xextents","xa","xdomain","processUrlAxis","validAxis","xxaxis","yyaxis","processUrlBounds","newLower","dataJoined","minB","maxB","minA","maxA","fileChange","iframe","MapComponent","mapplotfunction","timestep","defaults","param","center","datetime","hidelayerbutton","DataDetail","selection","innerLoading","addnewfiles","dataArray","_isMounted","downloadFile","cleanData","newfile","isInt","filedict","newfiles","confirm","fileid","fileList","prop","parameterDetails","numDescending","numA","numB","compare","dataBounds","xe","addAverageTime","addFileLocation","fileBounds","getAve","getMax","getMin","merge2DArray","merged","innerMerge","customizer","objValue","srcValue","getShape","bucket_url","level","forEach","dataset_id","pathname","searchArr","all","server","serverlessUrl","v","getFileTree","details","characteristic","err","all_files","temp","af","monitor","module","exports"],"mappings":"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","file":"static/js/5.ab1b0df1.chunk.js","sourcesContent":["import React, { Component } from \"react\";\nimport slider from \"interactive-slider\";\nimport \"./SliderSelect.css\";\n\nclass SliderSelect extends Component {\n  state = {\n    graphid: Math.round(Math.random() * 100000),\n  };\n\n  updateDomain = (domain) => {\n    this.domain = domain;\n  };\n\n  plotSliderSelect = async () => {\n    var { graphid } = this.state;\n    var {\n      type,\n      upper,\n      lower,\n      value,\n      language,\n      data: availability,\n    } = this.props;\n    if (language === undefined) language = \"en\";\n    var options = {\n      type,\n      min: this.domain[0],\n      max: this.domain[1],\n      availability,\n      onChange: this.onChange,\n      onZoom: this.updateDomain,\n      language,\n    };\n\n    if (type === \"single\") {\n      options[\"value\"] = value;\n    } else {\n      options[\"lower\"] = lower;\n      options[\"upper\"] = upper;\n    }\n    slider(\"sliderselect\" + graphid, options);\n  };\n\n  onChange = (value) => {\n    var { onChangeLower, onChangeUpper, onChangeValue, type, upper, lower } =\n      this.props;\n    if (type === \"single\") {\n      onChangeValue(value[0]);\n    } else {\n      if (lower !== value[0]) {\n        onChangeLower(value[0]);\n      } else if (upper !== value[1]) {\n        onChangeUpper(value[1]);\n      }\n    }\n  };\n\n  componentDidMount() {\n    this.domain = [this.props.min, this.props.max];\n    setTimeout(this.plotSliderSelect, 10);\n    window.addEventListener(\"resize\", this.plotSliderSelect, false);\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.plotSliderSelect, false);\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    if (prevProps.min !== this.props.min && prevProps.min === 0)\n      this.domain[0] = this.props.min;\n    if (prevProps.max !== this.props.max && prevProps.max === 1)\n      this.domain[1] = this.props.max;\n    setTimeout(this.plotSliderSelect, 10);\n  }\n  render() {\n    var { graphid } = this.state;\n    return <div id={\"sliderselect\" + graphid} className=\"sliderselect\" />;\n  }\n}\n\nexport default SliderSelect;\n","import React, { Component } from \"react\";\nimport DateTimePicker from \"react-datetime-picker\";\nimport { format } from \"date-fns\";\nimport \"./slider.css\";\nimport SliderSelect from \"../SliderSelect/SliderSelect\";\n\nclass DateSliderDouble extends Component {\n  state = {\n    upper: this.props.upper,\n    lower: this.props.lower,\n  };\n  formatDate = (raw) => {\n    return new Date(raw * 1000);\n  };\n\n  formatTick = (ms) => {\n    const { min, max } = this.props;\n    const diff = max - min;\n    if (diff < 172800) {\n      // 3 Days\n      return format(new Date(ms), \"hh:mm:ss\");\n    } else if (diff < 31556952) {\n      // 1 Year\n      return format(new Date(ms), \"dd MMM\");\n    } else if (diff < 157784760) {\n      // 5 Years\n      return format(new Date(ms), \"MMM yy\");\n    } else {\n      return format(new Date(ms), \"yyyy\");\n    }\n  };\n\n  onChangeLower = (event) => {\n    if (event instanceof Date) {\n      this.props.onChangeLower(event);\n    }\n  };\n\n  onChangeUpper = (event) => {\n    if (event instanceof Date) {\n      this.props.onChangeUpper(event);\n    }\n  };\n\n  onChange = (event) => {\n    var lower = event[0];\n    var upper = event[1];\n    if (lower !== this.state.lower || upper !== this.state.upper) {\n      this.props.onChange(event);\n      this.setState({ upper, lower });\n    }\n  };\n\n  render() {\n    var {\n      min,\n      max,\n      lower,\n      upper,\n      onChangeLower,\n      onChangeUpper,\n      files,\n      language,\n    } = this.props;\n    min = this.formatDate(min);\n    max = this.formatDate(max);\n    lower = this.formatDate(lower);\n    upper = this.formatDate(upper);\n    const availability = files.map((f) => [\n      new Date(f.mindatetime),\n      new Date(f.maxdatetime),\n    ]);\n\n    return (\n      <div className=\"datetime-selector\">\n        {onChangeLower && (\n          <div className=\"datetime-picker\">\n            <div className=\"datetime-value\" style={{ float: \"left\" }}>\n              <DateTimePicker\n                onChange={this.onChangeLower}\n                value={lower}\n                clearIcon={null}\n                calendarIcon={null}\n                maxDate={upper}\n                minDate={min}\n                disableClock={true}\n                format={\"dd.MM.y H:mm\"}\n                locale={language}\n              />\n            </div>\n            <div className=\"datetime-value\">{\">\"}</div>\n            <div className=\"datetime-value\" style={{ float: \"right\" }}>\n              <DateTimePicker\n                onChange={this.onChangeUpper}\n                value={upper}\n                clearIcon={null}\n                calendarIcon={null}\n                maxDate={max}\n                minDate={lower}\n                disableClock={true}\n                format={\"dd.MM.y H:mm\"}\n                locale={language}\n              />\n            </div>\n          </div>\n        )}\n        <SliderSelect\n          type=\"double\"\n          min={min}\n          max={max}\n          lower={lower}\n          upper={upper}\n          data={availability}\n          onChangeLower={onChangeLower}\n          onChangeUpper={onChangeUpper}\n          language={language}\n        />\n      </div>\n    );\n  }\n}\n\nexport default DateSliderDouble;\n","import React, { Component } from \"react\";\nimport folder from \"./img/folder.svg\";\nimport download from \"../../img/download.svg\";\nimport axios from \"axios\";\nimport { apiUrl } from \"../../config.json\";\nimport \"./fileexplorer.css\";\n\nclass Header extends Component {\n  transformSize = (size) => {\n    if (size < 1000) {\n      return `${Math.round(size)} B`;\n    } else if (size < 1000000) {\n      return `${Math.round((size / 1000) * 10) / 10} kB`;\n    }\n    if (size < 1000000000) {\n      return `${Math.round((size / 1000000) * 10) / 10} MB`;\n    } else {\n      return `${Math.round((size / 1000000000) * 10) / 10} GB`;\n    }\n  };\n  render() {\n    var { dir, headerClick, selected, size, loading, downloadClick } =\n      this.props;\n    return (\n      <div className=\"file-explorer-header-inner\">\n        <div\n          className=\"file-explorer-header-inner-object home\"\n          onClick={() => headerClick(\"\")}\n        >\n          data\n        </div>\n        {dir.map((d, i) => (\n          <React.Fragment key={`header_${d}_${i}`}>\n            /\n            <div\n              className=\"file-explorer-header-inner-object\"\n              onClick={() => headerClick(d)}\n            >\n              {d}\n            </div>\n          </React.Fragment>\n        ))}\n        <div\n          className={\n            loading\n              ? \"file-explorer-header-inner-selected active\"\n              : \"file-explorer-header-inner-selected\"\n          }\n        >\n          {loading ? (\n            <React.Fragment>\n              <div className=\"lds-ring\">\n                <div></div>\n                <div></div>\n                <div></div>\n                <div></div>\n              </div>\n              <div className=\"lds-text\">Zipping files...</div>\n            </React.Fragment>\n          ) : (\n            <div onClick={downloadClick}>\n              Download {selected.length} selected files (\n              {this.transformSize(size)})\n            </div>\n          )}\n        </div>\n      </div>\n    );\n  }\n}\n\nclass ListView extends Component {\n  transformSize = (size) => {\n    if (size < 1000) {\n      return `${Math.round(size)} B`;\n    } else if (size < 1000000) {\n      return `${Math.round((size / 1000) * 10) / 10} kB`;\n    }\n    if (size < 1000000000) {\n      return `${Math.round((size / 1000000) * 10) / 10} MB`;\n    } else {\n      return `${Math.round((size / 1000000000) * 10) / 10} GB`;\n    }\n  };\n  render() {\n    var { files, objectClick, prefix, dir, selected } = this.props;\n\n    files.sort((a, b) => {\n      if (a.children.length === 0 && b.children.length !== 0) {\n        return 1;\n      } else if (b.children.length === 0 && a.children.length !== 0) {\n        return -1;\n      } else {\n        return a.name > b.name ? 1 : -1;\n      }\n    });\n    return (\n      <div className=\"file-explorer-content-list\">\n        {files.map((f, i) => (\n          <div\n            className={\n              f.children.length > 0\n                ? \"file-explorer-content-list-object folder\"\n                : selected.includes(`${dir}/${f.name}`)\n                ? \"file-explorer-content-list-object selected\"\n                : \"file-explorer-content-list-object\"\n            }\n            title=\"Select file\"\n            onClick={(e) => objectClick(f, e)}\n            key={`list_${f.name}_${i}`}\n          >\n            <div className=\"list-object-img\">\n              {f.children.length > 0 ? (\n                <img src={folder} alt=\"Folder\" />\n              ) : (\n                <a\n                  href={`${prefix}/${f.name}`}\n                  title=\"Download file\"\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                >\n                  <img src={download} alt=\"Download file\" id=\"download\" />\n                </a>\n              )}\n            </div>\n            <div className=\"list-object-name\">{f.name}</div>\n            <div className=\"list-object-size\">\n              {f.children.length > 0 ? \"-\" : this.transformSize(f.size)}\n            </div>\n          </div>\n        ))}\n      </div>\n    );\n  }\n}\n\nclass FileExplorer extends Component {\n  state = {\n    dir: [],\n    selected: [],\n    size: 0,\n    loading: false,\n  };\n  objectClick = (object, event) => {\n    if (event.target.id === \"download\") return;\n    var { dir, selected, size } = this.state;\n    if (object.children.length === 0) {\n      let path = `${dir.join(\"/\")}/${object.name}`;\n      if (selected.includes(path)) {\n        selected = selected.filter((s) => s !== path);\n        size = size - object.size;\n      } else {\n        selected.push(path);\n        size = size + object.size;\n      }\n      this.setState({ selected, size });\n    } else {\n      dir.push(object.name);\n      this.setState({ dir });\n    }\n  };\n  headerClick = (folder) => {\n    var { dir } = this.state;\n    var new_dir = [];\n    if (folder === \"\") {\n      this.setState({ dir: [], selected: [] });\n    } else {\n      for (let i = 0; i < dir.length; i++) {\n        new_dir.push(folder);\n        if (dir[i] === folder) {\n          break;\n        }\n      }\n      this.setState({ dir: new_dir });\n    }\n  };\n  promisedSetState = (newState) =>\n    new Promise((resolve) => this.setState(newState, resolve));\n  downloadClick = async () => {\n    const { selected, size } = this.state;\n    if (size > 2000000000) {\n      alert(\n        \"The download interface can only be used for downloading < 200 MB of data. Please use the scripts provided in the git repository to download larger volumes.\"\n      );\n      return\n    }\n    if (selected.length > 0) {\n      const { bucket, repo, prefix } = this.props;\n      var pre = prefix.split(\".com/\")[1];\n      await this.promisedSetState({ loading: true });\n      try {\n        var body = {\n          bucket,\n          zip: repo,\n          keys: selected.map((s) => `${pre}/${s}`.replace(\"//\", \"/\")),\n        };\n        const { data } = await axios.post(apiUrl + \"/s3zip\", body);\n        var timesRun = 0;\n        var interval = setInterval(async () => {\n          timesRun += 1;\n          if (timesRun === 20) {\n            clearInterval(interval);\n            alert(\"Request timed out, please try with less data.\");\n          }\n          try {\n            var { data: status } = await axios.get(data.status_link);\n          } catch (e) {\n            console.log(\"Link not yet generated.\");\n          }\n          if (status === \"Complete\") {\n            clearInterval(interval);\n            const link = document.createElement(\"a\");\n            link.style.display = \"none\";\n            link.href = data.download_link;\n            link.targe = \"_blank\";\n            document.body.appendChild(link);\n            link.click();\n            this.setState({ selected: [], size: 0, loading: false });\n          }\n        }, 1000);\n      } catch (e) {\n        console.error(e);\n        alert(\"Download failed.\");\n        this.setState({ selected: [], size: 0, loading: false });\n      }\n    }\n  };\n  render() {\n    var { dir, selected, size, loading } = this.state;\n    var { prefix } = this.props;\n\n    var files = this.props.file_tree;\n    for (let i = 0; i < dir.length; i++) {\n      files = files.find((f) => f.name === dir[i]).children;\n    }\n    return (\n      <div className=\"file-explorer\">\n        <div className=\"file-explorer-header\">\n          <Header\n            dir={dir}\n            headerClick={this.headerClick}\n            downloadClick={this.downloadClick}\n            selected={selected}\n            size={size}\n            loading={loading}\n          />\n        </div>\n        <div className=\"file-explorer-content\">\n          <ListView\n            files={files}\n            objectClick={this.objectClick}\n            prefix={`${prefix}${dir.length > 0 ? \"/\" : \"\"}${dir.join(\"/\")}`}\n            dir={dir.join(\"/\")}\n            selected={selected}\n          />\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default FileExplorer;\n","import React, { Component } from \"react\";\nimport SliderDouble from \"../../../components/sliders/sliderdouble\";\nimport Loading from \"../../../components/loading/loading\";\nimport FileExplorer from \"../../../components/fileexplorer/fileexplorer\";\nimport { bucket } from \"../../../../src/config.json\";\nimport axios from \"axios\";\nimport \"../css/datadetail.css\";\n\nclass Download extends Component {\n  state = {\n    upper: this.props.max,\n    lower: this.props.min,\n    loading: false,\n  };\n\n  onChangeTime = (values) => {\n    const lower = values[0] / 1000;\n    const upper = values[1] / 1000;\n    if (\n      Math.round(lower) !== Math.round(this.state.lower) ||\n      Math.round(upper) !== Math.round(this.state.upper)\n    ) {\n      this.setState({ lower, upper });\n    }\n  };\n\n  onChangeUpper = (value) => {\n    var upper = value.getTime() / 1000;\n    this.setState({ upper });\n  };\n\n  onChangeLower = (value) => {\n    var lower = value.getTime() / 1000;\n    this.setState({ lower });\n  };\n\n  fileIdSelect = (arr, filetype) => {\n    var { files } = this.props;\n    var out = [];\n    if (filetype === \"nc\") {\n      for (var i = 0; i < arr.length; i++) {\n        out.push(files[arr[i]].filelineage);\n      }\n    } else {\n      for (i = 0; i < arr.length; i++) {\n        out.push(files[arr[i]].id);\n      }\n    }\n\n    return out;\n  };\n\n  downloadFiles = (filetype, apiUrl, arr, title) => {\n    this.setState({ loading: true }, () => {\n      arr = this.fileIdSelect(arr, filetype);\n      var { embargo } = this.props.dataset;\n      var { upper } = this.state;\n      var embargoDate =\n        new Date().getTime() - embargo * 30.4167 * 24 * 60 * 60 * 1000;\n      var datasetpassword = \"\";\n      if (upper * 1000 > embargoDate) {\n        datasetpassword = prompt(\n          \"Selection contains embargoed data. (after \" +\n            new Date(embargoDate) +\n            \") Please enter the password to download data.\"\n        );\n      }\n      var url;\n      if (filetype === \"csv\") {\n        url = `${apiUrl}/download/csv?password=${datasetpassword}`;\n      } else {\n        url = `${apiUrl}/download?password=${datasetpassword}`;\n      }\n      var name =\n        title.replace(/\\s/g, \"\").toLowerCase() + \"_datalakesdownload.zip\";\n      axios({\n        method: \"post\",\n        url: url,\n        responseType: \"blob\",\n        data: { ids: arr },\n      })\n        .then(({ data }) => {\n          const downloadUrl = window.URL.createObjectURL(new Blob([data]));\n          const link = document.createElement(\"a\");\n          link.href = downloadUrl;\n          link.setAttribute(\"download\", name);\n          document.body.appendChild(link);\n          link.click();\n          link.remove();\n          this.setState({ loading: false });\n        })\n        .catch((error) => {\n          console.error(error);\n          this.setState({ loading: false });\n          if (error.response !== undefined && error.response.status === 403) {\n            alert(\"Incorrect password provided\");\n          } else {\n            alert(\n              \"Failed to download files, please select fewer files or access data directly from the git repository (a link can be found under the information tab).\"\n            );\n          }\n        });\n    });\n  };\n\n  render() {\n    const {\n      getLabel,\n      dataset,\n      apiUrl,\n      min,\n      max,\n      files,\n      selectedFiles,\n      datasetparameters,\n      file_tree,\n      prefix,\n      repo,\n    } = this.props;\n    var { upper, lower, loading } = this.state;\n    var csv =\n      !/\\d/.test(datasetparameters.map((dp) => dp.axis).join(\"\")) ||\n      !datasetparameters\n        .map((dp) => dp.axis)\n        .join(\"\")\n        .includes(\"z\");\n    var selectedArray = [0];\n    if (files.length > 1) {\n      selectedArray = selectedFiles(upper, lower, files, \"download\");\n    }\n\n    return (\n      <div className=\"download\">\n        <div className=\"info-title\">Licence</div>\n        <a\n          href={getLabel(\"licenses\", dataset.licenses_id, \"link\")}\n          title={getLabel(\"licenses\", dataset.licenses_id, \"description\")}\n        >\n          {getLabel(\"licenses\", dataset.licenses_id, \"name\")}\n        </a>\n        <div className=\"info-title\">Citation</div>\n        {dataset.citation}\n\n        {dataset.embargo > 0 && (\n          <div>\n            <div className=\"info-title\">Embargo Period</div>\n            Data more recent than {dataset.embargo} months requires a password\n            to download. <br />\n            Please contact {getLabel(\"persons\", dataset.persons_id, \"email\")} to\n            request access to this data.\n          </div>\n        )}\n\n        <div className=\"info-title\">Download</div>\n        <div>\n          Select all files for a given time period.\n          <div className=\"multipledownload\">\n            {files.length > 1 && (\n              <div>\n                {loading && (\n                  <div className=\"download-loading\">\n                    Sending download request...\n                    <Loading />\n                  </div>\n                )}\n                <SliderDouble\n                  onChange={this.onChangeTime}\n                  onChangeLower={this.onChangeLower}\n                  onChangeUpper={this.onChangeUpper}\n                  min={min}\n                  max={max}\n                  lower={lower}\n                  upper={upper}\n                  files={files}\n                />\n                <div className=\"selected-download\">\n                  {selectedArray.length} of {files.length} files selected for\n                  download.\n                </div>\n              </div>\n            )}\n\n            <div className=\"subheading\">Select file type for download.</div>\n            <button\n              onClick={() =>\n                this.downloadFiles(\"nc\", apiUrl, selectedArray, dataset.title)\n              }\n              className=\"download-button\"\n              title=\"Download datasets in NetCDF format\"\n            >\n              NetCDF\n            </button>\n            <button\n              onClick={() =>\n                this.downloadFiles(\"json\", apiUrl, selectedArray, dataset.title)\n              }\n              className=\"download-button\"\n              title=\"Download datasets in JSON format\"\n            >\n              JSON\n            </button>\n            {csv && (\n              <button\n                onClick={() =>\n                  this.downloadFiles(\n                    \"csv\",\n                    apiUrl,\n                    selectedArray,\n                    dataset.title\n                  )\n                }\n                className=\"download-button\"\n                title=\"Download datasets in CSV format\"\n              >\n                CSV (Beta)\n              </button>\n            )}\n          </div>\n        </div>\n\n        {file_tree.length > 0 && (\n          <div>\n            Explore all files in the repository.\n            <table>\n            <tbody>\n              <tr>\n                <th>Level 0</th>\n                <td>Raw data</td>\n              </tr>\n              <tr>\n                <th>Level 1</th>\n                <td>Reformatted to NetCDF and quality assurance applied</td>\n              </tr>\n              <tr>\n                <th>Level 2</th>\n                <td>Resampled, interpolated, combined or further processed datasets</td>\n              </tr>\n            </tbody>\n          </table>\n            <div className=\"download-fileexplorer\">\n              <FileExplorer\n                file_tree={file_tree}\n                prefix={prefix}\n                bucket={bucket.name}\n                repo={repo}\n              />\n            </div>\n          </div>\n        )}\n\n        <div className=\"info-title\">Parse Data</div>\n        <div className=\"parsedata\">\n          <p>\n            Data is provided as a Zip file containing the files (in the format\n            you have specified) for the selected time period.\n          </p>\n          <b>Date and Time</b>\n          <p>\n            Datetime is in Unix time format (\n            <a\n              href=\"https://www.unixtimestamp.com/\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              details\n            </a>\n            ). Most languages have a function for parsing this format to a\n            datetime object.\n          </p>\n          <table>\n            <tbody>\n              <tr>\n                <th>Python</th>\n                <td></td>\n                <td>\n                  from datetime import datetime <br /> dt =\n                  datetime.utcfromtimestamp(unixdatetime)\n                </td>\n              </tr>\n              <tr>\n                <th>R</th>\n                <td></td>\n                <td>\n                  library(anytime) <br /> dt {\"<\"}- anytime(unixdatetime)\n                </td>\n              </tr>\n              <tr>\n                <th>Javascript</th>\n                <td></td>\n                <td>var dt = new Date(unixdatetime * 1000)</td>\n              </tr>\n            </tbody>\n          </table>\n          <b>Reading from NetCDF</b>\n          <p>\n            There are a number of resources that give detailed information on\n            how to read and interact with NetCDF files. Linked below are some\n            suggested resources.\n          </p>\n          <table>\n            <tbody>\n              <tr>\n                <th>Python</th>\n                <td></td>\n                <td>\n                  <a\n                    href=\"https://unidata.github.io/netcdf4-python/\"\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\"\n                  >\n                    https://unidata.github.io/netcdf4-python/\n                  </a>\n                </td>\n              </tr>\n              <tr>\n                <th>R</th>\n                <td></td>\n                <td>\n                  <a\n                    href=\"https://cran.r-project.org/web/packages/ncdf4/ncdf4.pdf\"\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\"\n                  >\n                    https://cran.r-project.org/web/packages/ncdf4/ncdf4.pdf\n                  </a>\n                </td>\n              </tr>\n              <tr>\n                <th>Javascript</th>\n                <td></td>\n                <td>\n                  <a\n                    href=\"https://github.com/cheminfo/netcdfjs\"\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\"\n                  >\n                    https://github.com/cheminfo/netcdfjs\n                  </a>\n                </td>\n              </tr>\n            </tbody>\n          </table>\n          <b>Reading from JSON</b>\n          <p>\n            JSON is the native format of Javascript, data is stored in this\n            format to allow fast access to the data for visualistion on the web\n            platform. Significantly more metadata is available in the NetCDF\n            file. As with datetime, most languages have a native import function\n            for JSON.\n          </p>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default Download;\n","import React, { Component } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport mail from \"../img/mail.svg\";\nimport calendar from \"../img/calendar.svg\";\nimport location from \"../img/location.svg\";\nimport git from \"../img/git.svg\";\nimport depth from \"../img/depth.svg\";\nimport download from \"../img/download.svg\";\nimport citation from \"../img/citation.svg\";\nimport licence from \"../img/licence.svg\";\nimport { urlFromSsh } from '../../../functions';\nimport \"../css/datadetail.css\";\n\n\nclass Information extends Component {\n  state = {};\n\n  parseDate = (input) => {\n    var months = [\n      \"Jan \",\n      \"Feb \",\n      \"Mar \",\n      \"Apr \",\n      \"May \",\n      \"Jun \",\n      \"Jul \",\n      \"Aug \",\n      \"Sept \",\n      \"Oct \",\n      \"Nov \",\n      \"Dec \",\n    ];\n    var date = new Date(input);\n    return months[date.getMonth()] + date.getFullYear();\n  };\n\n  formatTime = (time) => {\n    let parts = time.split(\"T\");\n    return parts[0] + \" \" + parts[1].slice(0, 5);\n  };\n\n  round = (num, dec) => {\n    return Math.round(num * 10 ** dec) / 10 ** dec;\n  };\n\n  render() {\n    const { dataset, getLabel, scripts, maintenance } = this.props;\n    var script = scripts.filter((s) => s.name.includes(\".md\"));\n    var dict = {};\n    for (let i = 0; i < maintenance.length; i++) {\n      let dt =\n        maintenance[i].starttime.toString() + maintenance[i].endtime.toString();\n      if (dt in dict) {\n        dict[dt][\"parameters\"].push(\n          maintenance[i].name +\n            (maintenance[i].detail !== \"none\"\n              ? ` (${maintenance[i].detail})`\n              : \"\")\n        );\n        dict[dt][\"id\"].push(maintenance[i].id);\n      } else {\n        dict[dt] = {\n          start: maintenance[i].starttime,\n          end: maintenance[i].endtime,\n          parameters: [\n            maintenance[i].name +\n              (maintenance[i].detail !== \"none\"\n                ? ` (${maintenance[i].detail})`\n                : \"\"),\n          ],\n          description: maintenance[i].description,\n          id: [maintenance[i].id],\n          reporter: maintenance[i].reporter,\n        };\n      }\n    }\n\n    var rows = [];\n    for (var key in dict) {\n      rows.push(\n        <tr key={key}>\n          <td>{this.formatTime(dict[key].start)}</td>\n          <td>{this.formatTime(dict[key].end)}</td>\n          <td>{dict[key].parameters.join(\", \")}</td>\n          <td>{dict[key].description}</td>\n          <td>{dict[key].reporter}</td>\n        </tr>\n      );\n    }\n    urlFromSsh(dataset.ssh)\n    return (\n      <React.Fragment>\n        <div className=\"info-mation\">\n          <div className=\"description\">\n            <div className=\"data-row\">\n              <img src={calendar} alt=\"calendar\" />{\" \"}\n              {this.parseDate(dataset.mindatetime)} to{\" \"}\n              {this.parseDate(dataset.maxdatetime)}\n            </div>\n            <div className=\"data-row\">\n              <img src={location} alt=\"location\" />\n              <a\n                href={`https://www.google.com/maps/search/${dataset.latitude},${dataset.longitude}`}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                {getLabel(\"lakes\", dataset.lakes_id, \"name\")} [\n                {this.round(dataset.latitude, 3)},{\" \"}\n                {this.round(dataset.longitude, 3)}]\n              </a>\n            </div>\n            <div className=\"data-row\">\n              <img src={git} alt=\"git\" />\n              <a\n                href={urlFromSsh(dataset.ssh)}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                Link to Git Repository\n              </a>\n            </div>\n            {dataset.mindepth !== \"-9999\" && (\n              <div className=\"data-row\">\n                <img src={depth} alt=\"depth\" />\n                {`${this.round(dataset.mindepth, 3)}m to ${this.round(\n                  dataset.maxdepth,\n                  3\n                )}m`}\n              </div>\n            )}\n            {dataset.downloads > 10 && (\n              <div className=\"data-row\">\n                <img src={download} alt=\"download\" /> {dataset.downloads}{\" \"}\n                downloads\n              </div>\n            )}\n            <div className=\"data-row\">\n              <img src={licence} alt=\"licence\" />\n              <a\n                href={getLabel(\"licenses\", dataset.licenses_id, \"link\")}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                title={getLabel(\"licenses\", dataset.licenses_id, \"description\")}\n              >\n                {getLabel(\"licenses\", dataset.licenses_id, \"name\")}\n              </a>\n            </div>\n            <div className=\"data-row\">\n              <img src={citation} alt=\"citation\" />\n              {dataset.citation}\n            </div>\n          </div>\n          <React.Fragment>\n            {maintenance.length > 0 ? (\n              <div className=\"description\">\n                <div className=\"desc-header\">Reported maintenance periods:</div>\n                <table>\n                  <tbody>\n                    <tr>\n                      <th>Start</th>\n                      <th>End</th>\n                      <th>Parameters</th>\n                      <th>Description</th>\n                      <th>Reporter</th>\n                    </tr>\n                    {rows}\n                  </tbody>\n                </table>\n                <div className=\"desc-warning\">WARNING: Reported maintenance periods are masked on Datalakes however may not be in the downloadable files.</div>\n              </div>\n            ) : (\n              \"\"\n            )}\n          </React.Fragment>\n          <div className=\"readme\">\n            {script.length === 1 ? (\n              <ReactMarkdown>{script[0].data}</ReactMarkdown>\n            ) : (\n              <React.Fragment>{dataset.description}</React.Fragment>\n            )}\n          </div>\n          <div className=\"info-contact\">\n            <div className=\"contact-header\">Questions about the dataset?</div>\n            <div className=\"contact-inner\">\n              <div className=\"contact-icon\">\n                <img src={mail} alt=\"mail\" />\n              </div>\n              <div className=\"contact-text\">\n                <div className=\"contact-name\">\n                  {getLabel(\"persons\", dataset.persons_id, \"name\")}\n                </div>\n                <div className=\"contact-email\">\n                  {getLabel(\"persons\", dataset.persons_id, \"email\")}\n                </div>\n                <div className=\"contact-job\">\n                  {getLabel(\"projects\", dataset.projects_id, \"name\")},{\" \"}\n                  {getLabel(\"organisations\", dataset.organisations_id, \"name\")}\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default Information;\n","import React, { Component } from \"react\";\nimport * as d3 from \"d3\";\nimport isEqual from \"lodash/isEqual\";\nimport \"./networkgraph.css\";\n\nclass NetworkGraph extends Component {\n  plotNetworkGraph = async () => {\n    try {\n      d3.select(\"#networksvg\").remove();\n    } catch (e) {}\n    if (this.props.data) {\n      try {\n        var { data, dataset } = this.props;\n        data = JSON.parse(JSON.stringify(data.data.lineage));\n\n        // Repo link\n        var url = dataset.datasourcelink.split(\"blob/\");\n        var rootlink = url[0] + \"blob/\" + url[1].split(\"/\")[0] + \"/\";\n\n        // Set graph size\n        var width = d3.select(\"#vis\").node().getBoundingClientRect().width;\n        var height = d3.select(\"#vis\").node().getBoundingClientRect().height;\n\n        const simulation = d3\n          .forceSimulation(data.nodes)\n          .force(\n            \"link\",\n            d3.forceLink(data.edges).id((d) => d.id)\n          )\n          .force(\"charge\", d3.forceManyBody().strength(-400))\n          .force(\"x\", d3.forceX())\n          .force(\"y\", d3.forceY());\n\n        // Adds the svg canvas\n        var svg = d3\n          .select(\"#vis\")\n          .append(\"svg\")\n          .attr(\"id\", \"networksvg\")\n          .attr(\"viewBox\", [-width / 3, -height / 3, width, height]);\n\n        svg\n          .append(\"defs\")\n          .append(\"marker\")\n          .attr(\"id\", \"marker\")\n          .attr(\"viewBox\", \"0 -5 10 10\")\n          .attr(\"refX\", 25)\n          .attr(\"refY\", 0)\n          .attr(\"markerWidth\", 6)\n          .attr(\"markerHeight\", 6)\n          .attr(\"orient\", \"auto\")\n          .append(\"path\")\n          .attr(\"d\", \"M0,-5L10,0L0,5\");\n\n        var link = svg\n          .append(\"g\")\n          .attr(\"class\", \"links\")\n          .selectAll(\"line\")\n          .data(data.edges)\n          .enter()\n          .append(\"line\")\n          .attr(\"stroke-width\", \"2\")\n          .attr(\"stroke\", \"black\")\n          .attr(\"marker-end\", \"url(#marker)\");\n\n        var node = svg\n          .append(\"g\")\n          .attr(\"class\", \"nodes\")\n          .selectAll(\"g\")\n          .data(data.nodes)\n          .enter()\n          .append(\"g\");\n\n        node\n          .append(\"circle\")\n          .attr(\"r\", function (d) {\n            if (d.id.includes(\".cwl\")) {\n              return 2;\n            } else {\n              return 10;\n            }\n          })\n          .attr(\"fill\", \"white\")\n          .attr(\"stroke-width\", \"1\")\n          .attr(\"stroke\", \"black\")\n          .call(\n            d3\n              .drag()\n              .on(\"start\", dragstarted)\n              .on(\"drag\", dragged)\n              .on(\"end\", dragended)\n          );\n\n        node\n          .append(\"a\")\n          .attr(\"xlink:href\", function (d) {\n            return rootlink + d.id;\n          })\n          .append(\"text\")\n          .text(textlabel)\n          .attr(\"x\", 12)\n          .attr(\"y\", 5);\n\n        simulation.nodes(data.nodes).on(\"tick\", ticked);\n\n        simulation.force(\"link\").links(data.edges);\n\n        function textlabel(label) {\n          if (label.id.includes(\".cwl\")) {\n            return \"\";\n          } else {\n            label = label.id.split(\"/\");\n            label = label.pop();\n            return label;\n          }\n        }\n\n        function ticked() {\n          link\n            .attr(\"x1\", function (d) {\n              return d.source.x;\n            })\n            .attr(\"y1\", function (d) {\n              return d.source.y;\n            })\n            .attr(\"x2\", function (d) {\n              return d.target.x;\n            })\n            .attr(\"y2\", function (d) {\n              return d.target.y;\n            });\n\n          node.attr(\"transform\", function (d) {\n            return \"translate(\" + d.x + \",\" + d.y + \")\";\n          });\n        }\n        function dragstarted(event, d) {\n          if (!event.active) simulation.alphaTarget(0.3).restart();\n          d.fx = d.x;\n          d.fy = d.y;\n        }\n\n        function dragged(event, d) {\n          d.fx = event.x;\n          d.fy = event.y;\n        }\n\n        function dragended(event, d) {\n          if (!event.active) simulation.alphaTarget(0);\n          d.fx = null;\n          d.fy = null;\n        }\n      } catch (e) {\n        console.error(e);\n      }\n    }\n  };\n\n  componentDidMount() {\n    this.plotNetworkGraph();\n    window.addEventListener(\"resize\", this.plotNetworkGraph, false);\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.plotNetworkGraph, false);\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    if (!isEqual(prevProps, this.props)) {\n      this.plotNetworkGraph();\n    }\n  }\n\n  render() {\n    return (\n      <React.Fragment>\n        <div id=\"vis\"></div>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default NetworkGraph;\n","import React, { Component } from \"react\";\nimport { apiUrl } from \"../../../../src/config.json\";\nimport { LightAsync as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport github from \"react-syntax-highlighter/dist/esm/styles/hljs/github\";\nimport js from \"react-syntax-highlighter/dist/esm/languages/hljs/javascript\";\nimport python from \"react-syntax-highlighter/dist/esm/languages/hljs/python\";\nimport r from \"react-syntax-highlighter/dist/esm/languages/hljs/r\";\nimport NetworkGraph from \"../../../graphs/d3/networkgraph/networkgraph\";\nimport { urlFromSsh } from \"../../../functions\";\nimport \"../css/datadetail.css\";\n\nSyntaxHighlighter.registerLanguage(\"javascript\", js);\nSyntaxHighlighter.registerLanguage(\"python\", python);\nSyntaxHighlighter.registerLanguage(\"r\", r);\n\nclass Pipeline extends Component {\n  state = {\n    scriptInt: 0,\n  };\n\n  setScriptInt = (event) => {\n    var scriptInt = event.target.id;\n    if (this.state.scriptInt !== scriptInt) {\n      this.setState({ scriptInt });\n    }\n  };\n  render() {\n    var { dataset, renku, scripts } = this.props;\n    var { scriptInt } = this.state;\n    scripts = scripts.filter((s) => !s.name.includes(\".md\"));\n    var gitlab = urlFromSsh(dataset.ssh);\n    var renkulab = urlFromSsh(dataset.ssh, (renku = true));\n    var downloadlink = apiUrl + \"/pipeline/files/\" + dataset.id;\n    var selectedscript = scripts[scriptInt];\n    var nameDict = { js: \"javascript\", r: \"r\", py: \"python\" };\n    var scriptType = \"python\"; // Default\n    try {\n      scriptType = nameDict[selectedscript.name.split(\".\")[1]];\n    } catch (error) {\n      console.error(error);\n    }\n\n    var scriptHeaders = [];\n    for (var k = 0; k < scripts.length; k++) {\n      var arr = scripts[k].name.split(\"/\");\n      var name = arr[arr.length - 1];\n      scriptHeaders.push(\n        <div\n          className={\n            parseInt(scriptInt) === k\n              ? \"pipeline-headitem active\"\n              : \"pipeline-headitem\"\n          }\n          id={k}\n          key={\"key\" + k}\n          onClick={this.setScriptInt}\n        >\n          {name}\n        </div>\n      );\n    }\n\n    if (dataset.renku === 0) {\n      var { edges } = renku.data.lineage;\n\n      function filterEdges(edges, id) {\n        return edges.filter((e) => e.target === id);\n      }\n\n      function findScriptDataset(edges) {\n        var escript = edges.find((e) => {\n          return [\"py\", \"r\"].includes(e.source.split(\".\")[1]);\n        });\n        var edataset = edges.find((e) => e.source !== escript.source);\n        return { escript, edataset };\n      }\n\n      // Create linage diagram\n      var filepath = dataset.datasourcelink.split(\"/blob/\")[1];\n      filepath = filepath.split(\"/\");\n      filepath.shift();\n      filepath = filepath.join(\"/\");\n\n      var diagram = [\n        <div key=\"dat0\" className=\"datasets\">\n          {filepath}\n        </div>,\n      ];\n      var i = 1;\n      var j = 0;\n      while (i < 30 && j === 0) {\n        var edge = filterEdges(edges, filepath);\n        if (edge.length === 0) {\n          j = 1;\n        } else if (edge.length === 1) {\n          if (edge[0].source.includes(\"cwl\")) {\n            diagram.unshift(\n              <div key={\"coa\" + i} className=\"connector\">\n                &#8595;\n              </div>\n            );\n            edge = filterEdges(edges, edge[0].source);\n            var { escript, edataset } = findScriptDataset(edge);\n\n            diagram.unshift(\n              <div key={\"scr\" + i} className=\"script\">\n                {escript.source}\n              </div>\n            );\n            diagram.unshift(\n              <div key={\"cob\" + i} className=\"connector\">\n                &#8595;\n              </div>\n            );\n            diagram.unshift(\n              <div key={\"dat\" + i} className=\"datasets\">\n                {edataset.source}\n              </div>\n            );\n            filepath = edataset.source;\n          }\n        } else if (edge.length > 1) {\n          j = 1;\n        }\n        i++;\n      }\n    }\n\n    return (\n      <div>\n        <div className=\"pipeline\">\n          <div className=\"pipeline-right\">\n            <div className=\"accessType\">\n              Open Access\n              <div className=\"accessOption\">\n                1. Download example data and scripts package\n                <div className=\"pipeline-private\">\n                  Additional raw data can be obtained from the git repository.\n                </div>\n                <a\n                  href={downloadlink}\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                >\n                  <button>Download</button>\n                </a>\n              </div>\n            </div>\n          </div>\n          <div className=\"pipeline-right\">\n            <div className=\"accessType\">\n              Access Depends on Project Visibility\n              <div className=\"accessOption\">\n                2. Clone the git repository\n                <div className=\"pipeline-private\">\n                  Private repositories will require login. Get in touch for\n                  access to private repositories.\n                </div>\n                <a href={gitlab} target=\"_blank\" rel=\"noopener noreferrer\">\n                  <button>GitLab</button>\n                </a>\n              </div>\n              {renkulab && (\n                <div className=\"accessOption\">\n                  3. View on Renkulab.io, interactive environments are availble.\n                  <div className=\"pipeline-private\">\n                    Private repositories will require login. Get in touch for\n                    access to private repositories.\n                  </div>\n                  <a href={renkulab} target=\"_blank\" rel=\"noopener noreferrer\">\n                    <button>Renkulab</button>\n                  </a>\n                </div>\n              )}\n            </div>\n          </div>\n        </div>\n        {dataset.renku === 0 && <div className=\"pipeline-left\">{diagram}</div>}\n        <div className=\"scripts\">\n          <h3>Processing Scripts</h3>\n          <div className=\"pipeline-script\">\n            <div className=\"pipeline-head\">{scriptHeaders}</div>\n            <div className=\"pipeline-body\">\n              {selectedscript ? (\n                <SyntaxHighlighter\n                  language={scriptType}\n                  style={github}\n                  wrapLines={true}\n                >\n                  {selectedscript.data}\n                </SyntaxHighlighter>\n              ) : (\n                <div>\n                  Appologies, no accompanying scripts have been included with\n                  this dataset.\n                </div>\n              )}\n            </div>\n          </div>\n        </div>\n        {dataset.renku === 0 && (\n          <div className=\"networkgraph-outer\">\n            <div className=\"networkgraph-inner\">\n              <NetworkGraph data={renku} dataset={dataset} />\n            </div>\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default Pipeline;\n","import React, { Component } from \"react\";\nimport mail from \"../img/mail.svg\";\nimport calendar from \"../img/calendar.svg\";\nimport location from \"../img/location.svg\";\nimport git from \"../img/git.svg\";\nimport depth from \"../img/depth.svg\";\nimport download from \"../img/download.svg\";\nimport citation from \"../img/citation.svg\";\nimport licence from \"../img/licence.svg\";\nimport \"../css/datadetail.css\";\n\nclass Information extends Component {\n  state = {};\n\n  parseDate = (input) => {\n    var months = [\n      \"Jan \",\n      \"Feb \",\n      \"Mar \",\n      \"Apr \",\n      \"May \",\n      \"Jun \",\n      \"Jul \",\n      \"Aug \",\n      \"Sept \",\n      \"Oct \",\n      \"Nov \",\n      \"Dec \",\n    ];\n    var date = new Date(input);\n    return months[date.getMonth()] + date.getFullYear();\n  };\n\n  render() {\n    const { dataset, getLabel } = this.props;\n    var lake = getLabel(\"lakes\", dataset.lakes_id, \"name\");\n    return (\n      <React.Fragment>\n        <div className=\"info-mation\">\n          <div className=\"description\">\n            <div className=\"data-row\">\n              <img src={calendar} alt=\"calendar\" />{\" \"}\n              {this.parseDate(dataset.mindatetime)} to{\" \"}\n              {this.parseDate(dataset.maxdatetime)}\n            </div>\n            <div className=\"data-row\">\n              <img src={location} alt=\"location\" />\n              <a\n                href={`https://www.google.com/maps/search/${dataset.latitude},${dataset.longitude}`}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                {lake}{\" \"}\n                {lake !== \"Multiple\"\n                  ? `[${dataset.latitude}, ${dataset.longitude}]`\n                  : \"\"}\n              </a>\n            </div>\n            <div className=\"data-row\">\n              <img src={git} alt=\"git\" />\n              <a\n                href={dataset.datasourcelink.split(\"/-/blob\")[0]}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                Link to external data\n              </a>\n            </div>\n            {dataset.mindepth !== \"-9999\" && (\n              <div className=\"data-row\">\n                <img src={depth} alt=\"depth\" />\n                {`${dataset.mindepth}m to ${dataset.maxdepth}m`}\n              </div>\n            )}\n\n            <div className=\"data-row\">\n              <img src={download} alt=\"download\" /> {dataset.downloads}{\" \"}\n              downloads\n            </div>\n            <div className=\"data-row\">\n              <img src={licence} alt=\"licence\" />\n              <a\n                href={getLabel(\"licenses\", dataset.licenses_id, \"link\")}\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n                title={getLabel(\"licenses\", dataset.licenses_id, \"description\")}\n              >\n                {getLabel(\"licenses\", dataset.licenses_id, \"name\")}\n              </a>\n            </div>\n            <div className=\"data-row\">\n              <img src={citation} alt=\"citation\" />\n              {dataset.citation}\n            </div>\n          </div>\n          <div className=\"description\">\n            <div className=\"exinfo\">\n              The data source is hosted by an external partner. For more details\n              please contact {getLabel(\"persons\", dataset.persons_id, \"name\")}{\" \"}\n              using the contact details listed below.\n            </div>\n          </div>\n          <div className=\"info-contact\">\n            <div className=\"contact-header\">Questions about the dataset?</div>\n            <div className=\"contact-inner\">\n              <div className=\"contact-icon\">\n                <img src={mail} alt=\"mail\" />\n              </div>\n              <div className=\"contact-text\">\n                <div className=\"contact-name\">\n                  {getLabel(\"persons\", dataset.persons_id, \"name\")}\n                </div>\n                <div className=\"contact-email\">\n                  {getLabel(\"persons\", dataset.persons_id, \"email\")}\n                </div>\n                <div className=\"contact-job\">\n                  {getLabel(\"projects\", dataset.projects_id, \"name\")},{\" \"}\n                  {getLabel(\"organisations\", dataset.organisations_id, \"name\")}\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default Information;\n","import React, { Component } from \"react\";\nimport Connect from \"../img/connect.svg\";\nimport \"../css/datadetail.css\";\n\nclass Preview extends Component {\n  tableHeader = (i, datasetparameters, getLabel) => {\n    var detail = \"\";\n    if (\n      datasetparameters[i] &&\n      datasetparameters[i].detail !== null &&\n      datasetparameters[i].detail !== \"none\"\n    ) {\n      detail = `[${datasetparameters[i].detail}]`;\n    }\n    return (\n      datasetparameters[i] &&\n      `${getLabel(\n        \"parameters\",\n        datasetparameters[i].parameters_id,\n        \"name\"\n      )} ${detail} (${datasetparameters[i].unit})`\n    );\n  };\n\n  tableBody = (i, l, datasetparameters, data) => {\n    var out = datasetparameters[i] && data[datasetparameters[i].axis][l];\n    if (out === null) out = \"null\";\n    return out;\n  };\n\n  render() {\n    var { data, datasetparameters, getLabel } = this.props;\n    if (data[0] !== false) {\n      data = data[0];\n      var inner = [];\n      inner = [\n        <tr key=\"h\">\n          <th>1</th>\n          <td>{this.tableHeader(0, datasetparameters, getLabel)}</td>\n          <td>{this.tableHeader(1, datasetparameters, getLabel)}</td>\n          <td>{this.tableHeader(2, datasetparameters, getLabel)}</td>\n          <td>{this.tableHeader(3, datasetparameters, getLabel)}</td>\n          <td>{this.tableHeader(4, datasetparameters, getLabel)}</td>\n          <td>{this.tableHeader(5, datasetparameters, getLabel)}</td>\n          <td>{this.tableHeader(6, datasetparameters, getLabel)}</td>\n        </tr>,\n      ];\n      var len = data.y ? data.y.length : data.x.length;\n      for (var l = 0; l < Math.min(50, len); l++) {\n        inner.push(\n          <tr key={\"h\" + l}>\n            <th>{l + 2}</th>\n            <td>{this.tableBody(0, l, datasetparameters, data)}</td>\n            <td>{this.tableBody(1, l, datasetparameters, data)}</td>\n            <td>{this.tableBody(2, l, datasetparameters, data)}</td>\n            <td>{this.tableBody(3, l, datasetparameters, data)}</td>\n            <td>{this.tableBody(4, l, datasetparameters, data)}</td>\n            <td>{this.tableBody(5, l, datasetparameters, data)}</td>\n            <td>{this.tableBody(6, l, datasetparameters, data)}</td>\n          </tr>\n        );\n      }\n    }\n    if (this.props.data[0] === false) {\n      return (\n        <div className=\"failed-download\">\n          <img src={Connect} alt=\"Disconnected\" />\n          Unable to download data from the Datalakes API. \n          <div><b>Please try refreshing the page or come back later.</b></div>\n        </div>\n      );\n    } else {\n      return (\n        <div className=\"preview-table\">\n          <table className=\"excel\">\n            <tbody>\n              <tr>\n                <th></th>\n                <th>a</th>\n                <th>b</th>\n                <th>c</th>\n                <th>d</th>\n                <th>e</th>\n                <th>f</th>\n                <th>g</th>\n              </tr>\n              {inner}\n            </tbody>\n          </table>\n        </div>\n      );\n    }\n  }\n}\n\nexport default Preview;\n","import React, { Component } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport line from \"../../img/line.svg\";\nimport preview from \"../../img/preview.svg\";\nimport download from \"../../img/download.svg\";\nimport pipe from \"../../img/pipe.svg\";\nimport info from \"../../img/info.svg\";\nimport webgis from \"../../img/webgis.svg\";\nimport td from \"../../img/3d.svg\";\nimport map from \"../../img/map.svg\";\nimport \"./css/datadetail.css\";\n\nclass DataSubMenu extends Component {\n  hide = (name, allowedStep) => {\n    return !allowedStep.includes(name);\n  };\n  active = (name, step) => {\n    return name === step;\n  };\n\n  render() {\n    const { step, allowedStep, updateSelectedState, link } = this.props;\n    return (\n      <React.Fragment>\n        <div className=\"data-subnav\">\n          <div\n            title=\"Interact with 3D model\"\n            className={\n              this.active(\"threedmodel\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{ display: this.hide(\"threedmodel\", allowedStep) && \"none\" }}\n            onClick={() => updateSelectedState(\"threedmodel\")}\n          >\n            <img src={td} className=\"subnav-img\" alt=\"3D\" />\n            <div className=\"subnav-text\">3D Model</div>\n          </div>\n          <div\n            title=\"Interact with ch2018 data\"\n            className={\n              this.active(\"ch2018\", step) ? \"subnav-item active\" : \"subnav-item\"\n            }\n            style={{ display: this.hide(\"ch2018\", allowedStep) && \"none\" }}\n            onClick={() => updateSelectedState(\"ch2018\")}\n          >\n            <img src={line} className=\"subnav-img\" alt=\"ch2018\" />\n            <div className=\"subnav-text\">Graph</div>\n          </div>\n          <div\n            title=\"Download ch2018 data\"\n            className={\n              this.active(\"ch2018download\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{\n              display: this.hide(\"ch2018download\", allowedStep) && \"none\",\n            }}\n            onClick={() => updateSelectedState(\"ch2018download\")}\n          >\n            <img src={download} className=\"subnav-img\" alt=\"ch2018download\" />\n            <div className=\"subnav-text\">Download</div>\n          </div>\n          <div\n            title=\"Interact with Simstrat data\"\n            className={\n              this.active(\"simstrat\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{\n              display: this.hide(\"simstrat\", allowedStep) && \"none\",\n            }}\n            onClick={() => updateSelectedState(\"simstrat\")}\n          >\n            <img src={td} className=\"subnav-img\" alt=\"3D\" />\n            <div className=\"subnav-text\">Map</div>\n          </div>\n          <div\n            title=\"Interact with remote sensing data\"\n            className={\n              this.active(\"remotesensing\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{\n              display: this.hide(\"remotesensing\", allowedStep) && \"none\",\n            }}\n            onClick={() => updateSelectedState(\"remotesensing\")}\n          >\n            <img src={td} className=\"subnav-img\" alt=\"3D\" />\n            <div className=\"subnav-text\">Map</div>\n          </div>\n          <div\n            title=\"Download Three Dimentional Model Data\"\n            className={\n              this.active(\"threedmodeldownload\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{\n              display: this.hide(\"threedmodeldownload\", allowedStep) && \"none\",\n            }}\n            onClick={() => updateSelectedState(\"threedmodeldownload\")}\n          >\n            <img src={download} className=\"subnav-img\" alt=\"3D\" />\n            <div className=\"subnav-text\">Download</div>\n          </div>\n          <div\n            title=\"Download Remote Sensing Data\"\n            className={\n              this.active(\"remotesensingdownload\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{\n              display:\n                this.hide(\"remotesensingdownload\", allowedStep) && \"none\",\n            }}\n            onClick={() => updateSelectedState(\"remotesensingdownload\")}\n          >\n            <img src={download} className=\"subnav-img\" alt=\"download\" />\n            <div className=\"subnav-text\">Download</div>\n          </div>\n          <div\n            title=\"Information on external data source\"\n            className={\n              this.active(\"external\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{ display: this.hide(\"external\", allowedStep) && \"none\" }}\n            onClick={() => updateSelectedState(\"external\")}\n          >\n            <img src={info} className=\"subnav-img\" alt=\"Info\" />\n            <div className=\"subnav-text\">Information</div>\n          </div>\n          <div\n            title=\"Plot data\"\n            className={\n              this.active(\"plot\", step) ? \"subnav-item active\" : \"subnav-item\"\n            }\n            style={{ display: this.hide(\"plot\", allowedStep) && \"none\" }}\n            onClick={() => updateSelectedState(\"plot\")}\n          >\n            <img src={line} className=\"subnav-img\" alt=\"Plot\" />\n            <div className=\"subnav-text\">Plot</div>\n          </div>\n          <div\n            title=\"Preview data on the map\"\n            className={\n              this.active(\"locationmap\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{ display: this.hide(\"locationmap\", allowedStep) && \"none\" }}\n            onClick={() => updateSelectedState(\"locationmap\")}\n          >\n            <img src={map} className=\"subnav-img\" alt=\"Location Map\" />\n            <div className=\"subnav-text\">Map</div>\n          </div>\n          <div\n            title=\"Preview data as a table\"\n            className={\n              this.active(\"preview\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{ display: this.hide(\"preview\", allowedStep) && \"none\" }}\n            onClick={() => updateSelectedState(\"preview\")}\n          >\n            <img src={preview} className=\"subnav-img\" alt=\"Preview\" />\n            <div className=\"subnav-text\">Preview</div>\n          </div>\n          <div\n            title=\"Download data\"\n            className={\n              this.active(\"download\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{ display: this.hide(\"download\", allowedStep) && \"none\" }}\n            onClick={() => updateSelectedState(\"download\")}\n          >\n            <img src={download} className=\"subnav-img\" alt=\"Download\" />\n            <div className=\"subnav-text\">Download</div>\n          </div>\n          <div\n            title=\"See the data lineage\"\n            className={\n              this.active(\"pipeline\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{ display: this.hide(\"pipeline\", allowedStep) && \"none\" }}\n            onClick={() => updateSelectedState(\"pipeline\")}\n          >\n            <img src={pipe} className=\"subnav-img\" alt=\"Data Pipeline\" />\n            <div className=\"subnav-text\">Reproduce</div>\n          </div>\n          <div\n            title=\"See meta data for dataset\"\n            className={\n              this.active(\"information\", step)\n                ? \"subnav-item active\"\n                : \"subnav-item\"\n            }\n            style={{ display: this.hide(\"information\", allowedStep) && \"none\" }}\n            onClick={() => updateSelectedState(\"information\")}\n          >\n            <img src={info} className=\"subnav-img\" alt=\"Information\" />\n            <div className=\"subnav-text\">Information</div>\n          </div>\n          <Link\n            to={link}\n            title=\"Compare with other datasets in the Map Viewer\"\n            className={\n              this.active(\"webgis\", step) ? \"subnav-item active\" : \"subnav-item\"\n            }\n            style={{ display: this.hide(\"webgis\", allowedStep) && \"none\" }}\n          >\n            <img src={webgis} className=\"subnav-img\" alt=\"webgis\" />\n            <div className=\"subnav-text\">Map Viewer</div>\n          </Link>\n        </div>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default DataSubMenu;\n","import React, { Component } from \"react\";\nimport SwaggerUI from \"swagger-ui-react\";\nimport \"swagger-ui-react/swagger-ui.css\";\nimport \"../css/datadetail.css\";\n\nclass ThreeDModelDownload extends Component {\n  state = {\n    year: 2020,\n    week: 0,\n    dates: { 2020: [] },\n  };\n\n  onChangeYear = (event) => {\n    this.setState({\n      year: event.target.value,\n      week: 0,\n    });\n  };\n\n  onChangeWeek = (event) => {\n    this.setState({ week: event.target.value });\n  };\n\n  parseDateFormat = (date) => {\n    var months = [\n      \"Jan\",\n      \"Feb\",\n      \"Mar\",\n      \"Apr\",\n      \"May\",\n      \"Jun\",\n      \"July\",\n      \"Aug\",\n      \"Sept\",\n      \"Oct\",\n      \"Nov\",\n      \"Dec\",\n    ];\n    var day = date.getDate();\n    var month = months[date.getMonth()];\n    return `${day} ${month}`;\n  };\n\n  parseSimpleDate = (date) => {\n    if (date !== undefined) {\n      const year = date.getFullYear();\n      const month = String(date.getMonth() + 1).padStart(2, \"0\");\n      const day = String(date.getDate()).padStart(2, \"0\");\n      return `${year}${month}${day}`;\n    } else {\n      return \"\";\n    }\n  };\n\n  parseWeek = (date) => {\n    var end = new Date(date.getTime());\n    end.setDate(end.getDate() + 7);\n    return `${this.parseDateFormat(date)} to ${this.parseDateFormat(end)}`;\n  };\n\n  async componentDidMount() {\n    var { mindatetime, maxdatetime } = this.props.dataset;\n\n    const dates = {};\n    let currentDate = new Date(mindatetime);\n    let endDate = new Date(maxdatetime);\n    while (currentDate <= endDate) {\n      if (currentDate.getDay() === 0) {\n        const year = currentDate.getFullYear();\n        if (!dates[year]) {\n          dates[year] = [];\n        }\n        dates[year].push(new Date(currentDate.getTime()));\n      }\n      currentDate.setDate(currentDate.getDate() + 1);\n    }\n    var year = Math.max(...Object.keys(dates).map((d) => parseInt(d)));\n    var week = dates[String(year)].length - 1;\n    this.setState({ dates, year, week });\n  }\n\n  render() {\n    const { getLabel, dataset } = this.props;\n    var { mindatetime, maxdatetime, datasourcelink } = dataset;\n    let arr = datasourcelink.split(\"/\");\n    var lake = arr[arr.length - 1];\n    mindatetime = new Date(mindatetime);\n    maxdatetime = new Date(maxdatetime);\n    var { dates, year, week } = this.state;\n\n    var years = [];\n    var yearlist = Object.keys(dates);\n    for (var i = 0; i < yearlist.length; i++) {\n      years.push(\n        <option key={yearlist[i]} value={yearlist[i]}>\n          {yearlist[i]}\n        </option>\n      );\n    }\n    var weeks = [];\n    for (var j = 0; j < dates[year].length; j++) {\n      weeks.push(\n        <option key={dates[year][j]} value={j}>\n          {this.parseWeek(dates[year][j])}\n        </option>\n      );\n    }\n\n    var url = \"https://alplakes-api.eawag.ch\";\n    var swagger = \"https://alplakes-api.eawag.ch/openapi.json\";\n    var git =\n      \"https://github.com/eawag-surface-waters-research/alplakes-simulations\";\n    var sunday = this.parseSimpleDate(dates[year][week]);\n    var link = `${url}/simulations/file/delft3d-flow/${lake}/${sunday}`;\n\n    return (\n      <div className=\"download\">\n        <div className=\"info-title\">Licence</div>\n        <a\n          href={getLabel(\"licenses\", dataset.licenses_id, \"link\")}\n          title={getLabel(\"licenses\", dataset.licenses_id, \"description\")}\n        >\n          {getLabel(\"licenses\", dataset.licenses_id, \"name\")}\n        </a>\n        <div className=\"info-title\">Citation</div>\n        {dataset.citation}\n\n        <div className=\"info-title\">Git Repository</div>\n        <a href={git} target=\"_blank\" rel=\"noopener noreferrer\">\n          {git}\n        </a>\n\n        <div className=\"info-title\">Available Data</div>\n        <p>\n          Data available from {mindatetime.toLocaleDateString()} to{\" \"}\n          {maxdatetime.toLocaleDateString()}\n        </p>\n\n        <div className=\"info-title\">Download</div>\n        <p>\n          Download NetCDF file containing one week of simulations (every 3hrs).\n          Warning - files are around 160mb. For slices of the data please use\n          the API below.\n        </p>\n        <div className=\"meteolakesdownload\">\n          <select value={year} onChange={this.onChangeYear}>\n            Year: {years}\n          </select>\n          <select value={week} onChange={this.onChangeWeek}>\n            Week: {weeks}\n          </select>\n          <a href={link}>\n            <button>Download</button>\n          </a>\n        </div>\n\n        <div className=\"info-title\">API</div>\n\n        <div className=\"api-meteolakes\">\n          [ Base URL: {url} ]\n          <SwaggerUI url={swagger} />\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default ThreeDModelDownload;\n","import React, { Component } from \"react\";\nimport * as d3 from \"d3\";\nimport isEqual from \"lodash/isEqual\";\n\nclass D3GroupedBarGraph extends Component {\n  state = {\n    graphid: Math.round(Math.random() * 100000),\n  };\n  plotBarGraph = async () => {\n    var { graphid } = this.state;\n    try {\n      d3.select(\"#bargraphsvg\" + graphid).remove();\n    } catch (e) {}\n    if (this.props.data) {\n      try {\n        var {\n          data,\n          colors,\n          xlabel,\n          xunits,\n          title,\n          legend,\n          setDownloadGraph,\n        } = this.props;\n\n        // Set graph size\n        var margin = { top: 20, right: 20, bottom: 50, left: 50, legend: 50 },\n          viswidth = d3\n            .select(\"#vis\" + graphid)\n            .node()\n            .getBoundingClientRect().width,\n          visheight =\n            d3\n              .select(\"#vis\" + graphid)\n              .node()\n              .getBoundingClientRect().height,\n          width = viswidth - margin.left - margin.right,\n          height = visheight - margin.top - margin.bottom;\n\n        var maingroup = [];\n        var subgroup = [];\n\n        if (Object.keys(data).length > 0) maingroup = Object.keys(data);\n        if (Object.keys(maingroup).length > 0)\n          subgroup = Object.keys(data[maingroup[0]]);\n\n        var max = -Infinity;\n        for (var m = 0; m < maingroup.length; m++) {\n          for (var s = 0; s < subgroup.length; s++) {\n            max = Math.max(max, data[maingroup[m]][subgroup[s]]);\n          }\n        }\n\n        if (Object.keys(data).length > 0) {\n          // Format X-axis\n          var x = d3.scaleLinear().domain([0, max]).range([0, width]);\n\n          // Format Y-axis\n          var y = d3\n            .scaleBand()\n            .rangeRound([0, height - margin.legend])\n            .domain(maingroup)\n            .paddingInner(0.3)\n            .align(0.1);\n\n          var y1 = d3\n            .scaleBand()\n            .domain(subgroup)\n            .rangeRound([0, y.bandwidth()])\n            .padding(0);\n\n          if (legend) y.rangeRound([margin.legend, height]);\n\n          var color = d3.scaleOrdinal().range(colors);\n\n          // Define the axes\n          var xAxis = d3.axisBottom(x);\n          var yAxis = d3.axisLeft(y);\n\n          // Adds the svg canvas\n          var svg = d3\n            .select(\"#vis\" + graphid)\n            .append(\"svg\")\n            .attr(\"id\", \"bargraphsvg\" + graphid)\n            .attr(\"width\", viswidth)\n            .attr(\"height\", visheight)\n            .append(\"g\")\n            .attr(\n              \"transform\",\n              \"translate(\" + margin.left + \",\" + margin.top + \")\"\n            );\n\n          // Add bars\n          var plotdata = maingroup.map((mg) => {\n            let subdata = subgroup.map((sg) => {\n              return { name: sg, data: data[mg][sg] };\n            });\n            return { name: mg, data: subdata };\n          });\n          svg\n            .append(\"g\")\n            .attr(\"id\", \"bars\")\n            .selectAll(\"g\")\n            .data(plotdata)\n            .join(\"g\")\n            .attr(\"transform\", (d) => `translate(0,${y(d.name)})`)\n            .selectAll(\"rect\")\n            .data((d) => d.data)\n            .join(\"rect\")\n            .attr(\"x\", (d) => x(0))\n            .attr(\"y\", (d) => y1(d.name))\n            .attr(\"height\", y1.bandwidth())\n            .attr(\"width\", (d) => x(d.data))\n            .attr(\"fill\", (d) => color(d.name))\n            .append(\"title\")\n            .text((d) => `${d.data} ${xunits}`);\n\n          /*svg\n            .append(\"g\")\n            .selectAll(\"g\")\n            .data(maingroup)\n            .data()\n            .join(\"g\")\n            .attr(\"fill\", (d) => {\n              console.log(d);\n              color(d.key);\n            })\n            .selectAll(\"rect\")\n            .data((d) => d)\n            .join(\"rect\")\n            .attr(\"x\", (d) => x(d[0]))\n            .attr(\"y\", (d, i) => y(d.data.name))\n            .attr(\"width\", (d) => x(d[1]) - x(d[0]))\n            .attr(\"height\", y.bandwidth())\n            .append(\"title\")\n            .text((d) => `${d.key} ${d.data[d.key]} ${xunits}`);*/\n\n          // Add the X Axis\n          svg\n            .append(\"g\")\n            .attr(\"class\", \"x axis\")\n            .attr(\"id\", \"axis--x\")\n            .attr(\"transform\", \"translate(0,\" + height + \")\")\n            .call(xAxis);\n\n          if (xlabel) {\n            svg\n              .append(\"text\")\n              .attr(\n                \"transform\",\n                \"translate(\" +\n                  width / 2 +\n                  \" ,\" +\n                  (height + margin.bottom / 1.5) +\n                  \")\"\n              )\n              .attr(\"x\", 6)\n              .attr(\"dx\", \"1em\")\n              .style(\"text-anchor\", \"middle\")\n              .text(xunits ? `${xlabel} (${xunits})` : xlabel);\n          }\n\n          // Add the Y Axis\n          svg\n            .append(\"g\")\n            .attr(\"class\", \"y axis\")\n            .attr(\"id\", \"axis--y\")\n            .call(yAxis);\n\n          // Add title\n          var titlesvg = svg\n            .append(\"text\")\n            .attr(\"x\", width / 2)\n            .attr(\"y\", 2 - margin.top / 2)\n            .attr(\"text-anchor\", \"middle\")\n            .style(\"font-size\", \"14px\")\n            .style(\"text-decoration\", \"underline\")\n            .style(\"opacity\", \"1\")\n            .text(title);\n          d3.select(\"#pngdownloadline\" + graphid).on(\"click\", function () {\n            downloadGraph();\n          });\n\n          // Add legend\n          if (legend) {\n            var legendblock = svg\n              .append(\"g\")\n              .attr(\"id\", \"legendbox\")\n              .attr(\"pointer-events\", \"none\");\n\n            // Add one dot in the legend for each name.\n            legendblock\n              .selectAll(\"legendtext\")\n              .data(legend)\n              .enter()\n              .append(\"text\")\n              .attr(\"x\", function (d) {\n                return d.offset + 15;\n              })\n              .attr(\"y\", margin.legend / 2)\n              .style(\"font-size\", \"12\")\n              .text(function (d) {\n                return d.text;\n              })\n              .attr(\"text-anchor\", \"start\")\n              .style(\"alignment-baseline\", \"middle\");\n            legendblock\n              .selectAll(\"legendsquare\")\n              .data(legend)\n              .enter()\n              .append(\"rect\")\n              .attr(\"x\", function (d) {\n                return d.offset;\n              })\n              .attr(\"y\", margin.legend / 2 - 7)\n              .attr(\"width\", 10)\n              .attr(\"height\", 10)\n              .style(\"fill\", function (d) {\n                return d.color;\n              });\n          }\n        }\n\n        function downloadGraph() {\n          titlesvg.style(\"opacity\", \"1\");\n          var s = new XMLSerializer();\n          var str = s.serializeToString(\n            document.getElementById(\"linegraphsvg\" + graphid)\n          );\n\n          var canvas = document.createElement(\"canvas\"),\n            context = canvas.getContext(\"2d\");\n\n          canvas.width = viswidth;\n          canvas.height = visheight;\n\n          var image = new Image();\n          image.onerror = function () {\n            alert(\n              \"Appologies .png download failed. Pleaseawait  download as .svg.\"\n            );\n          };\n          image.onload = function () {\n            context.drawImage(image, 0, 0);\n            var a = document.createElement(\"a\");\n            a.download = \"downloadgraph.png\";\n            a.href = canvas.toDataURL(\"image/png\");\n            a.click();\n          };\n          image.src =\n            \"data:image/svg+xml;charset=utf8,\" + encodeURIComponent(str);\n          titlesvg.style(\"opacity\", \"0\");\n        }\n\n        if (setDownloadGraph) {\n          setDownloadGraph(downloadGraph);\n        }\n      } catch (e) {\n        console.error(\"Error plotting line graph\", e);\n      }\n    }\n  };\n  componentDidMount() {\n    this.plotBarGraph();\n    window.addEventListener(\"resize\", this.plotBarGraph, false);\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.plotBarGraph, false);\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    if (!isEqual(prevProps, this.props)) {\n      this.plotBarGraph();\n    }\n  }\n  render() {\n    var { graphid } = this.state;\n    return (\n      <React.Fragment>\n        <div id={\"vis\" + graphid} className=\"vis-main\"></div>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default D3GroupedBarGraph;\n","import React, { Component } from \"react\";\nimport axios from \"axios\";\nimport { apiUrl } from \"../../../config.json\";\nimport D3LineGraph from \"../../../graphs/d3/linegraph/linegraph\";\nimport D3GroupedBarGraph from \"../../../graphs/d3/groupedbargraph/groupedbargraph\";\nimport \"../css/datadetail.css\";\n\nclass Ch2018Graph extends Component {\n  state = {\n    lakes: [],\n    data: [],\n    lake: \"\",\n    depth: \"surface\",\n    period: \"p1\",\n    smoothing: 5,\n  };\n\n  updateSmoothing = (event) => {\n    this.setState({ smoothing: parseInt(event.target.value) });\n  };\n\n  updateLake = async (event) => {\n    var { data } = this.state;\n    var lake = event.target.value;\n    if (!Object.keys(data).includes(lake)) {\n      var { data: lakedata } = await axios\n        .get(apiUrl + \"/externaldata/ch2018/\" + lake, {\n          timeout: 10000,\n        })\n        .catch((error) => {\n          console.error(error);\n        });\n      data[lake] = lakedata;\n      this.setState({ lake, data });\n    } else {\n      this.setState({ lake });\n    }\n  };\n\n  updateDepth = (event) => {\n    this.setState({ depth: event.target.value });\n  };\n\n  updatePeriod = (event) => {\n    this.setState({ period: event.target.value });\n  };\n\n  movingAvg = (array, count, qualifier) => {\n    if (count === 0) {\n      return array;\n    }\n    // calculate average for subarray\n    var avg = function (array, qualifier) {\n      var sum = 0,\n        count = 0,\n        val;\n      for (var i in array) {\n        val = array[i];\n        if (!qualifier || qualifier(val)) {\n          sum += val;\n          count++;\n        }\n      }\n\n      return sum / count;\n    };\n\n    var result = [],\n      val;\n\n    // pad beginning of result with null values\n    for (var i = 0; i < count - 1; i++) result.push(null);\n\n    // calculate average for each subarray and add to result\n    for (var j = 0, len = array.length - count; j <= len; j++) {\n      val = avg(array.slice(j, j + count), qualifier);\n      if (isNaN(val)) result.push(null);\n      else result.push(val);\n    }\n\n    return result;\n  };\n\n  async componentDidMount() {\n    var { data: lakes } = await axios\n      .get(apiUrl + \"/externaldata/ch2018/lakes\", {\n        timeout: 10000,\n      })\n      .catch((error) => {\n        console.error(error);\n      });\n    var { data: lakedata } = await axios\n      .get(apiUrl + \"/externaldata/ch2018/\" + lakes[0].id, {\n        timeout: 10000,\n      })\n      .catch((error) => {\n        console.error(error);\n      });\n\n    var index = 0;\n    if (this.props.search) {\n      var l = this.props.search.replace(\"?\", \"\");\n      if (lakes.map((ll) => ll.id).includes(l)) {\n        index = lakes.map((ll) => ll.id).indexOf(l);\n      }\n    }\n\n    var data = {};\n\n    data[lakes[index].id] = lakedata;\n    this.setState({ lakes, data, lake: lakes[index].id });\n  }\n\n  render() {\n    var { lakes, depth, lake, data: inData, period, smoothing } = this.state;\n    var lake_options = [];\n    var data = JSON.parse(JSON.stringify(inData));\n    for (var listlake of lakes) {\n      lake_options.push(\n        <option value={listlake.id} key={listlake.id}>\n          {listlake.name}\n        </option>\n      );\n    }\n    var lakeproperties = {};\n    if (lakes.length > 0) lakeproperties = lakes.find((l) => l.id === lake);\n    var { name, altitude, area, volume } = lakeproperties;\n    var lcolor = [];\n    var lweight = [];\n    var yearly = [];\n    var seasonal = [];\n    var legend = [];\n    var barlegend = [];\n    var barcolors = [];\n    var stratification = [];\n    var yearlyConfidence = [];\n    var seasonalConfidence = [];\n    if (Object.keys(data).length > 0) {\n      lcolor = [\"green\", \"#FF8C00\", \"red\"];\n      lweight = [1, 1, 1];\n      legend = [\n        { color: \"green\", text: \"RCP 2.6\" },\n        { color: \"#FF8C00\", text: \"RCP 4.5\" },\n        { color: \"red\", text: \"RCP 8.5\" },\n      ];\n      barlegend = [\n        { color: \"#F4A460\", text: \"Summer Stratification\", offset: 0 },\n        { color: \"#8FBC8F\", text: \"Mixed\", offset: 140 },\n        { color: \"#87CEFA\", text: \"Winter Stratification\", offset: 200 },\n        { color: \"#ADD8E6\", text: \"Ice Cover\", offset: 330 },\n      ];\n      barcolors = [\"#F4A460\", \"#8FBC8F\", \"#87CEFA\", \"#ADD8E6\"];\n\n      stratification = data[lake].stratification[period];\n\n      yearly = [\n        {\n          x: data[lake][\"yearly\"][depth][\"RCP26\"][\"x\"],\n          y: this.movingAvg(\n            data[lake][\"yearly\"][depth][\"RCP26\"][\"y_ave\"],\n            smoothing\n          ),\n        },\n        {\n          x: data[lake][\"yearly\"][depth][\"RCP45\"][\"x\"],\n          y: this.movingAvg(\n            data[lake][\"yearly\"][depth][\"RCP45\"][\"y_ave\"],\n            smoothing\n          ),\n        },\n        {\n          x: data[lake][\"yearly\"][depth][\"RCP85\"][\"x\"],\n          y: this.movingAvg(\n            data[lake][\"yearly\"][depth][\"RCP85\"][\"y_ave\"],\n            smoothing\n          ),\n        },\n      ];\n      yearlyConfidence = [\n        {\n          CI_upper: data[lake][\"yearly\"][depth][\"RCP26\"][\"y_max\"],\n          CI_lower: data[lake][\"yearly\"][depth][\"RCP26\"][\"y_min\"],\n        },\n        {\n          CI_upper: data[lake][\"yearly\"][depth][\"RCP45\"][\"y_max\"],\n          CI_lower: data[lake][\"yearly\"][depth][\"RCP45\"][\"y_min\"],\n        },\n        {\n          CI_upper: data[lake][\"yearly\"][depth][\"RCP85\"][\"y_max\"],\n          CI_lower: data[lake][\"yearly\"][depth][\"RCP85\"][\"y_min\"],\n        },\n      ];\n      seasonal = [\n        {\n          y: data[lake][\"seasonal\"][depth][period][\"RCP26\"][\"ave\"],\n          x: [\n            ...Array(\n              data[lake][\"seasonal\"][depth][period][\"RCP26\"][\"ave\"].length\n            ).keys(),\n          ],\n        },\n        {\n          y: data[lake][\"seasonal\"][depth][period][\"RCP45\"][\"ave\"],\n          x: [\n            ...Array(\n              data[lake][\"seasonal\"][depth][period][\"RCP45\"][\"ave\"].length\n            ).keys(),\n          ],\n        },\n        {\n          y: data[lake][\"seasonal\"][depth][period][\"RCP85\"][\"ave\"],\n          x: [\n            ...Array(\n              data[lake][\"seasonal\"][depth][period][\"RCP85\"][\"ave\"].length\n            ).keys(),\n          ],\n        },\n      ];\n      seasonalConfidence = [\n        {\n          CI_upper: data[lake][\"seasonal\"][depth][period][\"RCP26\"][\"max\"],\n          CI_lower: data[lake][\"seasonal\"][depth][period][\"RCP26\"][\"min\"],\n        },\n        {\n          CI_upper: data[lake][\"seasonal\"][depth][period][\"RCP45\"][\"max\"],\n          CI_lower: data[lake][\"seasonal\"][depth][period][\"RCP45\"][\"min\"],\n        },\n        {\n          CI_upper: data[lake][\"seasonal\"][depth][period][\"RCP85\"][\"max\"],\n          CI_lower: data[lake][\"seasonal\"][depth][period][\"RCP85\"][\"min\"],\n        },\n      ];\n    }\n\n    var perioddict = {\n      p1: \"1980 - 2011\",\n      p2: \"2012 - 2040\",\n      p3: \"2041 - 2070\",\n      p4: \"2071 - 2100\",\n    };\n\n    var depthdict = { surface: \"Surface\", bottom: \"Bottom\" };\n\n    return (\n      <div className=\"ch2018graph\">\n        <div className=\"selections\">\n          <table>\n            <tbody>\n              <tr>\n                <td>Lake</td>\n                <td>Surface/ Bottom</td>\n                <td>Time Period</td>\n                <td>Smoothing</td>\n                {window.innerWidth > 500 && (\n                  <React.Fragment>\n                    <td>Altitude</td>\n                    <td>Area</td>\n                    <td>Volume</td>\n                  </React.Fragment>\n                )}\n              </tr>\n              <tr>\n                <td>\n                  <select value={lake} onChange={this.updateLake}>\n                    {lake_options}\n                  </select>\n                </td>\n                <td>\n                  <select value={depth} onChange={this.updateDepth}>\n                    <option value=\"surface\">Surface</option>\n                    <option value=\"bottom\">Bottom</option>\n                  </select>\n                </td>\n                <td>\n                  <select value={period} onChange={this.updatePeriod}>\n                    <option value=\"p1\">1980 - 2011</option>\n                    <option value=\"p2\">2012 - 2040</option>\n                    <option value=\"p3\">2041 - 2070</option>\n                    <option value=\"p4\">2071 - 2100</option>\n                  </select>\n                </td>\n                <td>\n                  <select value={smoothing} onChange={this.updateSmoothing}>\n                    <option value=\"0\">None</option>\n                    <option value=\"2\">2Yr Moving Ave</option>\n                    <option value=\"3\">3Yr Moving Ave</option>\n                    <option value=\"5\">5Yr Moving Ave</option>\n                    <option value=\"10\">10Yr Moving Ave</option>\n                  </select>\n                </td>\n                {window.innerWidth > 500 && (\n                  <React.Fragment>\n                    <td>{altitude} m a.s.l.</td>\n                    <td>{area} km&sup2;</td>\n                    <td>{volume} km&sup3;</td>\n                  </React.Fragment>\n                )}\n              </tr>\n            </tbody>\n          </table>\n        </div>\n        <div className=\"left\">\n          <D3LineGraph\n            data={yearly}\n            title={`Average Yearly ${depthdict[depth]} Temperature for ${name}`}\n            xlabel={\"Year\"}\n            ylabel={`${depthdict[depth]} Temperature`}\n            yunits={\"°C\"}\n            lcolor={lcolor}\n            lweight={lweight}\n            xscale={\"linear\"}\n            yscale={\"linear\"}\n            confidence={yearlyConfidence}\n            legend={legend}\n          />\n        </div>\n        <div className=\"right\">\n          <div className=\"upper\">\n            <D3GroupedBarGraph\n              title={`Seasonal Stratification for ${name} (${perioddict[period]})`}\n              xlabel={\"Average Days per Year\"}\n              data={stratification}\n              colors={barcolors}\n              xunits={\"days\"}\n              legend={barlegend}\n            />\n          </div>\n          <div className=\"lower\">\n            <D3LineGraph\n              data={seasonal}\n              title={`Seasonal ${depthdict[depth]} Temperature for ${name} (${perioddict[period]})`}\n              xlabel={\"Day of Year\"}\n              ylabel={`${depthdict[depth]} Temperature`}\n              yunits={\"°C\"}\n              lcolor={lcolor}\n              lweight={lweight}\n              xscale={\"linear\"}\n              yscale={\"linear\"}\n              confidence={seasonalConfidence}\n              legend={legend}\n            />\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default Ch2018Graph;\n","import React, { Component } from \"react\";\nimport axios from \"axios\";\nimport { apiUrl } from \"../../../config.json\";\nimport \"../css/datadetail.css\";\n\nclass Ch2018Download extends Component {\n  state = {\n    lakes: [],\n    data: [],\n    lake: \"\",\n    depth: \"surface\",\n    period: \"p1\",\n    smoothing: 5,\n  };\n\n  updateLake = (event) => {\n    this.setState({ lake: event.target.value });\n  };\n\n  async componentDidMount() {\n    var { data: lakes } = await axios\n      .get(apiUrl + \"/externaldata/ch2018/lakes\", {\n        timeout: 10000,\n      })\n      .catch((error) => {\n        console.error(error);\n      });\n    var lake = lakes[0].id;\n    this.setState({ lakes, lake });\n  }\n\n  render() {\n    var { dataset, getLabel } = this.props;\n    var { lakes, lake } = this.state;\n    var options = lakes.map((l) => (\n      <option key={l.id} value={l.id}>\n        {l.name}\n      </option>\n    ));\n    var download = apiUrl + \"/externaldata/ch2018/\" + lake;\n    return (\n      <div className=\"download\">\n        <div className=\"info-title\">Licence</div>\n        <a\n          href={getLabel(\"licenses\", dataset.licenses_id, \"link\")}\n          title={getLabel(\"licenses\", dataset.licenses_id, \"description\")}\n        >\n          {getLabel(\"licenses\", dataset.licenses_id, \"name\")}\n        </a>\n        <div className=\"info-title\">Download Summary Data</div>\n        <div className=\"ch2018download\">\n          <p>\n            It is possible to download a .JSON file containing summary\n            information for a given lake in the study.\n          </p>\n          <p>The .JSON file contains the following statistics:</p>\n          <ul>\n            <li>\n              Yearly average of surface and bottom temperature for each of the\n              three climate scenarios.\n            </li>\n            <li>\n              Seasonal average of surface and bottom temperature for each of the\n              three climate scenarios over four time periods (2018-2011,\n              2021-2040, 2041-2070, 2071-2100).\n            </li>\n            <li>\n              Stratification for each of the three climate scenarios over four\n              time periods (2018-2011, 2021-2040, 2041-2070, 2071-2100).\n            </li>\n          </ul>\n          <div className=\"downloadinner\">\n            <select onChange={this.updateLake} value={lake}>\n              {options}\n            </select>\n            <a href={download}>\n              <button>Download</button>\n            </a>\n          </div>\n        </div>\n        <div className=\"info-title\">Full Dataset</div>\n        <p>\n          <a\n            href=\"https://opendata.eawag.ch/dataset/the-vulnerability-of-lakes-along-an-altitudinal-gradient-to-climate-change\"\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            ERIC Open\n          </a>\n        </p>\n        <div className=\"info-title\">API</div>\n        <p>Download list of lakes: <a href=\"https://api.datalakes-eawag.ch/externaldata/ch2018/lakes\">https://api.datalakes-eawag.ch/externaldata/ch2018/lakes</a></p>\n        <p>Download lake statistics: <a href=\"https://api.datalakes-eawag.ch/externaldata/ch2018/Maggiore\">https://api.datalakes-eawag.ch/externaldata/ch2018/{\"{lakeid}\"}</a></p>\n      </div>\n    );\n  }\n}\n\nexport default Ch2018Download;\n","import React, { Component } from \"react\";\nimport \"swagger-ui-react/swagger-ui.css\";\nimport SwaggerUI from \"swagger-ui-react\";\nimport Calendar from \"react-calendar\";\nimport \"../css/datadetail.css\";\n\nclass RemoteSensingDownload extends Component {\n  state = {\n    start: new Date(),\n    end: new Date(),\n    selected_files: [],\n  };\n\n  onChangeRange = (value) => {\n    var { files } = this.props;\n    var start = value[0];\n    var end = value[1];\n    var selected_files = this.selectedFiles(files, start, end);\n    this.setState({ start, end, selected_files });\n  };\n\n  selectedFiles = (files, start, end) => {\n    var selected_files = files.filter(\n      (f) => f.mindatetime >= start && f.maxdatetime <= end\n    );\n    selected_files = selected_files.map((sf) => {\n      let path = sf.filelink.split(\"/\");\n      let name = path.pop().split(\".\")[0];\n      let name_path = name.split(\"_\");\n      let len = name_path.length;\n      sf.folder = path.join(\"/\");\n      sf.nc = `${sf.folder}/${name_path[0]}_${name_path[len - 2]}_${\n        name_path[len - 1]\n      }.nc`;\n      sf.satellite = name_path[len - 2];\n      return sf;\n    });\n    return selected_files;\n  };\n\n  async componentDidMount() {\n    var { files } = this.props;\n    files = files.map((f) => {\n      f.maxdatetime = new Date(f.maxdatetime);\n      f.mindatetime = new Date(f.mindatetime);\n      return f;\n    });\n\n    var end = new Date(this.props.dataset.maxdatetime);\n    var start = new Date(end.getTime() - 4 * 24 * 60 * 60 * 1000);\n\n    var selected_files = this.selectedFiles(files, start, end);\n\n    this.setState({\n      start,\n      end,\n      files,\n      selected_files,\n    });\n  }\n\n  render() {\n    const { getLabel, dataset } = this.props;\n    var { start, end, selected_files } = this.state;\n    var { mindatetime, maxdatetime } = dataset;\n    mindatetime = new Date(mindatetime);\n    maxdatetime = new Date(maxdatetime);\n\n    var table_inner = [];\n    for (var file of selected_files) {\n      table_inner.push(\n        <tr key={file.filelink}>\n          <td>{file.satellite}</td>\n          <td>\n            {file.mindatetime.toLocaleTimeString() +\n              \" \" +\n              file.mindatetime.toLocaleDateString()}\n          </td>\n          <td title=\"Download NetCDF\">\n            <a href={file.nc}>\n              <button className=\"download-rs\">Download</button>\n            </a>\n          </td>\n        </tr>\n      );\n    }\n\n    var git = \"https://gitlab.com/eawag-rs/sencast\";\n\n    var url = \"https://api.datalakes-eawag.ch/externaldata/remotesensing/\";\n    var swagger = url + \"api\";\n\n    return (\n      <div className=\"download\">\n        <div className=\"info-title\">Licence</div>\n        <a\n          href={getLabel(\"licenses\", dataset.licenses_id, \"link\")}\n          title={getLabel(\"licenses\", dataset.licenses_id, \"description\")}\n        >\n          {getLabel(\"licenses\", dataset.licenses_id, \"name\")}\n        </a>\n        <div className=\"info-title\">Citation</div>\n        {dataset.citation}\n\n        <div className=\"info-title\">Git Repository</div>\n        <a href={git} target=\"_blank\" rel=\"noopener noreferrer\">\n          {git}\n        </a>\n\n        <div className=\"info-title\">Available Data</div>\n        <p>\n          Data available from {mindatetime.toLocaleDateString()} to{\" \"}\n          {maxdatetime.toLocaleDateString()}\n        </p>\n\n        <div className=\"info-title\">Download</div>\n        <div className=\"remotesensingdownload\">\n          Use the calender below to select your desired time period and then specific products can be downloaded.\n          <div className=\"downloadinner\">\n            <Calendar\n              selectRange={true}\n              minDate={mindatetime}\n              maxDate={maxdatetime}\n              value={[start, end]}\n              onChange={this.onChangeRange}\n            />\n          </div>\n          <div className=\"downloadinner\">\n            <table>\n              <thead>\n                <tr>\n                  <th>Satellite</th>\n                  <th>Datetime</th>\n                  <th></th>\n                </tr>\n              </thead>\n              <tbody>{table_inner}</tbody>\n            </table>\n          </div>\n        </div>\n        <div className=\"info-title\">API</div>\n\n        <div className=\"api-meteolakes\">\n          [ Base URL: {url} ]\n          <SwaggerUI url={swagger} />\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default RemoteSensingDownload;\n","import React, { Component } from \"react\";\nimport SidebarLayout from \"../../../format/sidebarlayout/sidebarlayout\";\nimport SliderDouble from \"../../../components/sliders/sliderdouble\";\nimport FilterBox from \"../../../components/filterbox/filterbox\";\nimport MapSelect from \"../../../graphs/leaflet/mapselect\";\nimport axios from \"axios\";\nimport \"../css/datadetail.css\";\n\nclass LocationMap extends Component {\n  state = {\n    lower: this.props.min,\n    upper: this.props.max,\n    loading: false,\n  };\n  onChangeBounds = (event) => {\n    let lower = event[0] / 1000;\n    let upper = event[1] / 1000;\n    if (lower !== this.state.lower || upper !== this.state.upper) {\n      this.setState({ lower, upper });\n    }\n  };\n  clickPoint = (event) => {\n    var { onChangeFileInt } = this.props;\n    onChangeFileInt(event.target.options.id);\n  };\n  onChangeLower = (event) => {\n    let lower = event.getTime() / 1000;\n    if (lower !== this.state.lower) {\n      this.setState({ lower });\n    }\n  };\n  onChangeUpper = (event) => {\n    let upper = event.getTime() / 1000;\n    if (upper !== this.state.upper) {\n      this.setState({ upper });\n    }\n  };\n  fileIdSelect = (arr, filetype) => {\n    var { files } = this.props;\n    var out = [];\n    if (filetype === \"nc\") {\n      for (var i = 0; i < arr.length; i++) {\n        out.push(files[arr[i]].filelineage);\n      }\n    } else {\n      for (i = 0; i < arr.length; i++) {\n        out.push(files[arr[i]].id);\n      }\n    }\n\n    return out;\n  };\n  downloadFiles = (filetype, apiUrl, arr, title) => {\n    this.setState({ loading: true }, () => {\n      arr = this.fileIdSelect(arr, filetype);\n      var { embargo } = this.props.dataset;\n      var { upper } = this.state;\n      var embargoDate =\n        new Date().getTime() - embargo * 30.4167 * 24 * 60 * 60 * 1000;\n      var datasetpassword = \"\";\n      if (upper * 1000 > embargoDate) {\n        datasetpassword = prompt(\n          \"Selection contains embargoed data. (after \" +\n            new Date(embargoDate) +\n            \") Please enter the password to download data.\"\n        );\n      }\n      var url;\n      if (filetype === \"csv\") {\n        url = `${apiUrl}/download/csv?password=${datasetpassword}`;\n      } else {\n        url = `${apiUrl}/download?password=${datasetpassword}`;\n      }\n      var name =\n        title.replace(/\\s/g, \"\").toLowerCase() + \"_datalakesdownload.zip\";\n      axios({\n        method: \"post\",\n        url: url,\n        responseType: \"blob\",\n        data: { ids: arr },\n      })\n        .then(({ data }) => {\n          const downloadUrl = window.URL.createObjectURL(new Blob([data]));\n          const link = document.createElement(\"a\");\n          link.href = downloadUrl;\n          link.setAttribute(\"download\", name);\n          document.body.appendChild(link);\n          link.click();\n          link.remove();\n          this.setState({ loading: false });\n        })\n        .catch((error) => {\n          console.error(error);\n          this.setState({ loading: false });\n          if (error.response !== undefined && error.response.status === 403) {\n            alert(\"Incorrect password provided\");\n          } else {\n            alert(\n              \"Failed to download files, please select fewer files or access data directly from the git repository (a link can be found under the information tab).\"\n            );\n          }\n        });\n    });\n  };\n  render() {\n    var {\n      files,\n      file,\n      removeFile,\n      selectFilesDatetime,\n      min,\n      max,\n      dataset,\n      apiUrl,\n    } = this.props;\n    var { lower, upper } = this.state;\n    var plotfiles = files.map((f, index) => {\n      f[\"fileid\"] = index;\n      return f;\n    });\n    plotfiles = plotfiles.filter((f) => f.mindt >= lower && f.maxdt <= upper);\n    var filecontrol = [];\n    if (files.length > 0) {\n      for (let i = 0; i < file.length; i++) {\n        let value = new Date(files[file[i]].ave);\n        let text = `${value.toDateString()} ${value.toLocaleTimeString()}`;\n        let name = `(${files[file[i]].nc_name})`;\n        filecontrol.push(\n          <tr key={\"filename\" + file[i]}>\n            <td>\n              {text}\n              <br />\n              <span>{name}</span>\n            </td>\n            <td\n              id={i}\n              onClick={removeFile}\n              title=\"Remove\"\n              className=\"removefile\"\n            >\n              ✕\n            </td>\n          </tr>\n        );\n      }\n    }\n\n    return (\n      <React.Fragment>\n        <SidebarLayout\n          sidebartitle=\"Plot Controls\"\n          wide={true}\n          left={\n            <React.Fragment>\n              <MapSelect\n                datasets={plotfiles}\n                clickPoint={this.clickPoint}\n                files={file}\n              />\n            </React.Fragment>\n          }\n          rightNoScroll={\n            <React.Fragment>\n              <FilterBox\n                title=\"Selected Files\"\n                preopen=\"true\"\n                content={\n                  <div className=\"mapfilecontrol\">\n                    <table className=\"filecontrol\">\n                      <tbody>{filecontrol}</tbody>\n                    </table>\n                    <button\n                      onClick={() =>\n                        this.downloadFiles(\n                          \"nc\",\n                          apiUrl,\n                          file,\n                          dataset.title\n                        )\n                      }\n                      title=\"Download selected files.\"\n                    >\n                      {this.state.loading\n                        ? \"Downloading, please wait...\"\n                        : `Download ${filecontrol.length} NetCDF files`}\n                    </button>\n                  </div>\n                }\n              />\n              <FilterBox\n                title=\"Date Filter\"\n                preopen=\"true\"\n                content={\n                  <div className=\"mapdatefilter\">\n                    <SliderDouble\n                      onChange={this.onChangeBounds}\n                      onChangeLower={this.onChangeLower}\n                      onChangeUpper={this.onChangeUpper}\n                      min={min}\n                      max={max}\n                      lower={lower}\n                      upper={upper}\n                      files={files}\n                    />\n                    <button\n                      onClick={() => selectFilesDatetime(plotfiles)}\n                      title=\"Select all profiles in time period.\"\n                      className={plotfiles.length < 21 ? \"\" : \"red\"}\n                    >\n                      {plotfiles.length < 21\n                        ? `Select ${plotfiles.length} profiles`\n                        : `Reduce time range to select max 20 files (currently ${plotfiles.length} files in time range)`}\n                    </button>\n                  </div>\n                }\n              />\n            </React.Fragment>\n          }\n        />\n      </React.Fragment>\n    );\n  }\n}\n\nexport default LocationMap;\n","export const interp2 = (x, y, z, type = \"linear\") => {\n  if (z.length !== y.length) {\n    throw new Error(\"y and z lengths do not match\");\n  }\n  if (z[0].length !== x.length) {\n    throw new Error(\"x and z lengths do not match\");\n  }\n  if (z.flat().every(isNumeric)) {\n    return { x, y, z };\n  }\n\n  if (type === \"linear\") {\n    return linear(x, y, z);\n  } else if (type === \"x-linear\") {\n    return xlinear(x, y, z);\n  } else if (type === \"y-linear\") {\n    return ylinear(x, y, z);\n  } else if (type === \"x-nearest\") {\n    return xnearest(x, y, z);\n  } else if (type === \"y-nearest\") {\n    return ynearest(x, y, z);\n  } else {\n    throw new Error(\"Type \" + type + \" not recognised.\");\n  }\n};\n\nconst linear = (x, y, z) => {\n  return { x, y, z };\n};\n\nconst xlinear = (x, y, z) => {\n  for (let i = 0; i < y.length; i++) {\n    z[i] = linearInterpolate(x, z[i]);\n  }\n  return { x, y, z };\n};\n\nconst xnearest = (x, y, z) => {\n  for (let i = 0; i < y.length; i++) {\n    z[i] = nearestInterpolate(x, z[i]);\n  }\n  return { x, y, z };\n};\n\nconst ylinear = (x, y, z) => {\n  for (let i = 0; i < x.length; i++) {\n    let arr = z.map((zz) => zz[i]);\n    let iArr = linearInterpolate(y, arr);\n    z = z.map((zz, index) => {\n      zz[i] = iArr[index];\n      return zz;\n    });\n  }\n  return { x, y, z };\n};\n\nconst ynearest = (x, y, z) => {\n  for (let i = 0; i < x.length; i++) {\n    let arr = z.map((zz) => zz[i]);\n    let iArr = linearInterpolate(y, arr);\n    z = z.map((zz, index) => {\n      zz[i] = iArr[index];\n      return zz;\n    });\n  }\n  return { x, y, z };\n};\n\nconst linearInterpolate = (x, y) => {\n  if (y.every(isNumeric)) {\n    return y;\n  } else if (y.filter((yy) => isNumeric(yy)).length < 2) {\n    return y;\n  } else {\n    // If first value null\n    if (!isNumeric(y[0])) {\n      let arr = [];\n      for (let i = 1; i < y.length; i++) {\n        if (arr.length > 0) {\n          break;\n        } else if (isNumeric(y[i])) {\n          arr.push(i);\n        }\n      }\n      y[0] = y[arr[0]];\n    }\n\n    // If last value null\n    if (!isNumeric(y[y.length - 1])) {\n      let arr = [];\n      for (let i = y.length - 1; i > -1; i--) {\n        if (arr.length > 0) {\n          break;\n        } else if (isNumeric(y[i])) {\n          arr.push(i);\n        }\n      }\n      y[y.length - 1] = y[arr[0]];\n    }\n\n    // Get inner values\n    let data = [];\n    let interp = [];\n    for (let i = 0; i < y.length; i++) {\n      if (isNumeric(y[i])) {\n        data.push(i);\n      } else {\n        interp.push(i);\n      }\n    }\n\n    for (let i = 0; i < interp.length; i++) {\n      let index = indexOfLower(interp[i], data);\n      y[interp[i]] =\n        y[data[index]] +\n        ((x[interp[i]] - x[data[index]]) *\n          (y[data[index + 1]] - y[data[index]])) /\n          (x[data[index + 1]] - x[data[index]]);\n    }\n    return y;\n  }\n};\n\nconst nearestInterpolate = (x, y) => {\n  if (y.every(isNumeric)) {\n    return y;\n  } else {\n    // If first value null\n    if (!isNumeric(y[0])) {\n      let arr = [];\n      for (let i = 1; i < y.length; i++) {\n        if (arr.length > 0) {\n          break;\n        } else if (isNumeric(y[i])) {\n          arr.push(i);\n        }\n      }\n      y[0] = y[arr[0]];\n    }\n\n    // If last value null\n    if (!isNumeric(y[y.length - 1])) {\n      let arr = [];\n      for (let i = y.length - 1; i > -1; i--) {\n        if (arr.length > 0) {\n          break;\n        } else if (isNumeric(y[i])) {\n          arr.push(i);\n        }\n      }\n      y[y.length - 1] = y[arr[0]];\n    }\n\n    // Get inner values\n    let data = [];\n    let xdata = [];\n    let interp = [];\n    for (let i = 0; i < y.length; i++) {\n      if (isNumeric(y[i])) {\n        data.push(i);\n        xdata.push(x[i]);\n      } else {\n        interp.push(i);\n      }\n    }\n\n    for (let i = 0; i < interp.length; i++) {\n      let index = indexOfClosest(x[interp[i]], xdata);\n      y[interp[i]] = y[data[index]];\n    }\n    return y;\n  }\n};\n\nconst isNumeric = (n) => {\n  return !isNaN(parseFloat(n)) && isFinite(n);\n};\n\nconst indexOfLower = (num, arr) => {\n  for (var i = 1; i < arr.length; i++) {\n    if (arr[i] > num) {\n      return i - 1;\n    }\n  }\n  return 0;\n};\n\nconst indexOfClosest = (num, arr) => {\n  var index = 0;\n  var diff = Math.abs(num - arr[0]);\n  for (var val = 0; val < arr.length; val++) {\n    var newdiff = Math.abs(num - arr[val]);\n    if (newdiff < diff) {\n      diff = newdiff;\n      index = val;\n    }\n  }\n  return index;\n};\n","import React, { Component } from \"react\";\nimport * as d3 from \"d3\";\nimport \"d3-contour\";\nimport GraphHeader from \"../graphheader/graphheader\";\nimport \"./heatmap.css\";\nimport isEqual from \"lodash/isEqual\";\nimport D3LineGraph from \"../linegraph/linegraph\";\nimport heatmap from \"canvas-heatmap\";\n\nclass D3HeatMap extends Component {\n  state = {\n    graphid: Math.round(Math.random() * 100000),\n    download: false,\n    fullscreen: false,\n    display: this.props.display ? this.props.display : \"heatmap\",\n    zoom: false,\n    fontSize: 12,\n    xgraph: false,\n    ygraph: false,\n    mousex: false,\n    mousey: false,\n    idx: 0,\n    ads: 500,\n  };\n\n  editFontSize = (fontSize) => {\n    this.setState({ fontSize });\n  };\n\n  toggleXgraph = () => {\n    this.setState({ xgraph: !this.state.xgraph }, () => {\n      window.dispatchEvent(new Event(\"resize\"));\n    });\n  };\n\n  toggleYgraph = () => {\n    this.setState({ ygraph: !this.state.ygraph }, () => {\n      window.dispatchEvent(new Event(\"resize\"));\n    });\n  };\n\n  toggleDownload = () => {\n    this.setState({ download: !this.state.download });\n  };\n\n  toggleFullscreen = () => {\n    var { fullscreen, xgraph, ygraph } = this.state;\n    this.setState(\n      {\n        fullscreen: !fullscreen,\n        xgraph: false,\n        ygraph: false,\n      },\n      () => {\n        this.setState({ xgraph, ygraph });\n      }\n    );\n  };\n\n  toggleDisplay = () => {\n    var { display } = this.state;\n    if (display === \"contour\") {\n      display = \"heatmap\";\n    } else {\n      display = \"contour\";\n    }\n    this.setState({ display });\n  };\n\n  closest = (num, arr) => {\n    var curr = 0;\n    var diff = Math.abs(num - arr[curr]);\n    for (var val = 0; val < arr.length; val++) {\n      var newdiff = Math.abs(num - arr[val]);\n      if (newdiff < diff) {\n        diff = newdiff;\n        curr = val;\n      }\n    }\n    return curr;\n  };\n\n  median = (arr) => {\n    const mid = Math.floor(arr.length / 2),\n      nums = [...arr].sort((a, b) => a - b);\n    return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;\n  };\n\n  gaps = (arr) => {\n    var out = [];\n    for (var i = 1; i < arr.length; i++) {\n      out.push(arr[i] - arr[i - 1]);\n    }\n    return out;\n  };\n\n  indexOfClosest = (num, arr) => {\n    var index = 0;\n    var diff = Math.abs(num - arr[0]);\n    for (var val = 0; val < arr.length; val++) {\n      var newdiff = Math.abs(num - arr[val]);\n      if (newdiff < diff) {\n        diff = newdiff;\n        index = val;\n      }\n    }\n    return index;\n  };\n\n  columnSelect = (arr, i) => {\n    return arr.map((a) => a[i]);\n  };\n\n  downloadCSV = () => {\n    try {\n      var { data, xlabel, ylabel, zlabel, xunits, yunits, zunits, title } =\n        this.props;\n      var printdata;\n      if (Array.isArray(data)) {\n        if (data.length !== 1) {\n          alert(\n            \"Dataset too complex for single CSV download, please use the download interface for accessing CSV results for this dataset.\"\n          );\n          return;\n        } else {\n          printdata = data[0];\n        }\n      } else {\n        printdata = data;\n      }\n      var csvContent = `data:text/csv;charset=utf-8,,${ylabel} (${yunits})\\n${xlabel} (${xunits}),${zlabel} (${zunits})\\n`;\n      csvContent = csvContent + `,${printdata.y.join(\",\")}\\n`;\n      for (var i = 0; i < printdata.x.length; i++) {\n        csvContent =\n          csvContent +\n          `${printdata.x[i]},${this.columnSelect(printdata.z, i).join(\",\")}\\n`;\n      }\n      var name = title + \".csv\";\n      var encodedUri = encodeURI(csvContent);\n      var link = document.createElement(\"a\");\n      link.setAttribute(\"href\", encodedUri);\n      link.setAttribute(\"download\", name);\n      document.body.appendChild(link);\n      link.click();\n      this.setState({ download: false });\n    } catch (e) {\n      alert(\"Failed to convert data to .csv, please download in .json format.\");\n    }\n  };\n\n  downloadJSON = () => {\n    var { data, xlabel, ylabel, zlabel, xunits, yunits, zunits, title } =\n      this.props;\n    var arr = {\n      ...{ xlabel, xunits, ylabel, yunits, zlabel, zunits, title },\n      ...data,\n    };\n    var name = title.split(\" \").join(\"_\") + \".json\";\n    var encodedUri =\n      \"data:text/json;charset=utf-8,\" + encodeURIComponent(JSON.stringify(arr));\n    var link = document.createElement(\"a\");\n    link.setAttribute(\"href\", encodedUri);\n    link.setAttribute(\"download\", name);\n    document.body.appendChild(link);\n    link.click();\n    this.setState({ download: false });\n  };\n\n  getDomain = (domain) => {\n    var minarr = domain.map((d) => d[0]);\n    var maxarr = domain.map((d) => d[1]);\n    var min = d3.extent(minarr)[0];\n    var max = d3.extent(maxarr)[1];\n    return [min, max];\n  };\n\n  thresholds = (domain, t) => {\n    let thresholds = [];\n    let step = (domain[1] - domain[0]) / (t + 1);\n    for (let i = 0; i < t; i++) {\n      thresholds.push(domain[0] + step * i);\n    }\n    return thresholds;\n  };\n\n  hover = (obj) => {\n    this.setState(obj);\n  };\n\n  plotHeatMap = () => {\n    var { display, graphid, fontSize, ads } = this.state;\n    if (this.props.data !== undefined) {\n      try {\n        var {\n          data,\n          xlabel,\n          ylabel,\n          zlabel,\n          xunits,\n          yunits,\n          zunits,\n          bcolor,\n          colors,\n          title,\n          minvalue,\n          maxvalue,\n          yReverse,\n          xReverse,\n          thresholdStep,\n          language,\n          levels,\n        } = this.props;\n\n        var options = {\n          xLabel: xlabel,\n          yLabel: ylabel,\n          zLabel: zlabel,\n          xUnit: xunits,\n          yUnit: yunits,\n          zUnit: zunits ? zunits : \"\",\n          yReverse,\n          xReverse,\n          thresholdStep: parseFloat(thresholdStep),\n          zMin: minvalue,\n          zMax: maxvalue,\n          colors,\n          title,\n          language,\n          backgroundColor: bcolor,\n          autoDownsample: ads,\n          fontSize,\n          contour: display === \"contour\",\n          hover: this.hover,\n          setDownloadGraphDiv: \"png\" + graphid,\n          levels,\n        };\n        heatmap(\"vis\" + graphid, data, options);\n      } catch (e) {\n        console.log(\"Heatmap failed to plot\", e);\n      }\n    }\n  };\n\n  componentDidMount() {\n    if (\"display\" in this.props) {\n      this.setState({ display: this.props.display });\n    }\n    this.plotHeatMap();\n    window.addEventListener(\"resize\", this.plotHeatMap);\n  }\n\n  componentWillUnmount() {\n    window.removeEventListener(\"resize\", this.plotHeatMap);\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    var { display, fontSize, fullscreen, xgraph, ygraph } = this.state;\n    if (\n      !isEqual(prevProps, this.props) ||\n      display !== prevState.display ||\n      fontSize !== prevState.fontSize ||\n      fullscreen !== prevState.fullscreen ||\n      xgraph !== prevState.xgraph ||\n      ygraph !== prevState.ygraph\n    )\n      this.plotHeatMap();\n  }\n\n  render() {\n    var {\n      graphid,\n      download,\n      fullscreen,\n      display,\n      fontSize,\n      xgraph,\n      ygraph,\n      mousex,\n      mousey,\n      idx,\n    } = this.state;\n    var {\n      title,\n      ylabel,\n      xlabel,\n      zlabel,\n      xunits,\n      yunits,\n      zunits,\n      data,\n      xReverse,\n      yReverse,\n      maxvalue,\n      minvalue,\n    } = this.props;\n\n    const TimeLabels = [\"Time\", \"time\", \"datetime\", \"Datetime\", \"Date\", \"date\"];\n\n    var xy = \" \";\n    if (xgraph) xy = xy + \"x\";\n    if (ygraph) xy = xy + \"y\";\n\n    var dxy = [];\n    var dxx = [];\n    var dyy = [];\n    var dyx = [];\n\n    try {\n      let linedata = data;\n      if (Array.isArray(linedata)) linedata = linedata[idx];\n      if (xgraph && mousey !== false && linedata) {\n        dxx = linedata.x;\n        dxy = linedata.z[mousey];\n      }\n      if (ygraph && mousex !== false && linedata) {\n        dyx = linedata.z.map((z) => z[mousex]);\n        dyy = linedata.y;\n      }\n    } catch (e) {\n      console.log(e);\n    }\n\n    var datax = [{ x: dxx, y: dxy }];\n    var datay = [{ x: dyx, y: dyy }];\n\n    var x_dots = false;\n    var y_dots = false;\n\n    if (datax[0].x.length < 100) x_dots = true\n    if (datay[0].y.length < 100) y_dots = true\n\n    return (\n      <div className={fullscreen ? \"vis-main full\" : \"vis-main\"}>\n        <div className=\"heatmap-main\">\n          {this.props.header !== false && (\n            <div className=\"heatmap-header\">\n              <GraphHeader\n                id={graphid}\n                title={title}\n                download={download}\n                display={display}\n                fontSize={fontSize}\n                fullscreen={fullscreen}\n                toggleDownload={this.toggleDownload}\n                editFontSize={this.editFontSize}\n                toggleDisplay={this.toggleDisplay}\n                toggleFullscreen={this.toggleFullscreen}\n                downloadJSON={this.downloadJSON}\n                downloadCSV={this.downloadCSV}\n                toggleXgraph={this.toggleXgraph}\n                toggleYgraph={this.toggleYgraph}\n              />\n            </div>\n          )}\n\n          <div className=\"heatmap-graphs\">\n            <div className={\"heatmap-top\" + xy}>\n              <div className={\"heatmap-left\" + xy}>\n                {ygraph && (\n                  <D3LineGraph\n                    data={datay}\n                    xlabel={zlabel}\n                    ylabel={ylabel}\n                    xunits={zunits}\n                    yunits={yunits}\n                    xmax={maxvalue}\n                    xmin={minvalue}\n                    fontSize={fontSize}\n                    xReverse={false}\n                    yReverse={yReverse}\n                    lcolor={[\"black\"]}\n                    lweight={[1]}\n                    bcolor={[\"white\"]}\n                    simple={true}\n                    plotdots={y_dots}\n                    xscale={TimeLabels.includes(zlabel) ? \"Time\" : \"\"}\n                    yscale={TimeLabels.includes(ylabel) ? \"Time\" : \"\"}\n                  />\n                )}\n              </div>\n              <div className={\"heatmap-right\" + xy} id={\"vis\" + graphid} />\n            </div>\n            <div className={\"heatmap-bottom\" + xy}>\n              {xgraph && (\n                <D3LineGraph\n                  data={datax}\n                  xlabel={xlabel}\n                  ylabel={zlabel}\n                  xunits={xunits}\n                  yunits={zunits}\n                  fontSize={fontSize}\n                  xReverse={xReverse}\n                  yReverse={false}\n                  lcolor={[\"black\"]}\n                  lweight={[1]}\n                  bcolor={[\"white\"]}\n                  plotdots={x_dots}\n                  xscale={TimeLabels.includes(xlabel) ? \"Time\" : \"\"}\n                  yscale={TimeLabels.includes(zlabel) ? \"Time\" : \"\"}\n                  simple={true}\n                />\n              )}\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nexport default D3HeatMap;\n","import React, { Component } from \"react\";\nimport \"./slider.css\";\nimport SliderSelect from \"../SliderSelect/SliderSelect\";\n\nclass SliderSingle extends Component {\n  formatDate = (raw) => {\n    return new Date(raw * 1000);\n  };\n\n  render() {\n    var { value, onChange, type, min, max, file, files, onChangeFileInt } =\n      this.props;\n    var valueStr;\n    if (type === \"time\") {\n      valueStr =\n        new Date(value).toDateString() +\n        \" \" +\n        new Date(value).toLocaleTimeString();\n      min = this.formatDate(min);\n      max = this.formatDate(max);\n    } else if (type === \"depth\") {\n      valueStr = value.toString();\n    }\n    var currentfile = file[file.length - 1];\n    const availability = files.map((f) => [\n      new Date(f.mindatetime),\n      new Date(f.maxdatetime),\n    ]);\n    return (\n      <div\n        className=\"datetime-selector\"\n        title=\"Hint: use arrow keys to move between timesteps\"\n      >\n        <div>\n          <div\n            className=\"slider-arrow\"\n            onClick={() =>\n              onChangeFileInt(\n                Math.min(files.length - 1, parseInt(currentfile) + 1)\n              )\n            }\n          >\n            &#60;\n          </div>\n          <div className=\"single-value\">{valueStr}</div>\n          <div\n            className=\"slider-arrow\"\n            onClick={() =>\n              onChangeFileInt(Math.max(0, parseInt(currentfile) - 1))\n            }\n          >\n            &#62;\n          </div>\n        </div>\n        <SliderSelect\n          type=\"single\"\n          min={min}\n          max={max}\n          value={value}\n          data={availability}\n          onChangeValue={onChange}\n        />\n      </div>\n    );\n  }\n}\n\nexport default SliderSingle;\n","import React, { Component } from \"react\";\nimport SliderSelect from \"../SliderSelect/SliderSelect\";\nimport \"./slider.css\";\n\nclass NumberSliderDouble extends Component {\n  state = {\n    tupper: this.props.upper,\n    tlower: this.props.lower,\n  };\n  onUpdate = (event) => {\n    this.setState({ tlower: event[0], tupper: event[1] });\n  };\n  componentDidUpdate(prevProps) {\n    if (this.props.upper !== prevProps.upper && !isNaN(this.props.upper)) {\n      this.setState({ tupper: this.props.upper });\n    }\n    if (this.props.lower !== prevProps.lower && !isNaN(this.props.lower)) {\n      this.setState({ tlower: this.props.lower });\n    }\n  }\n  render() {\n    var { tlower, tupper } = this.state;\n    var {\n      min,\n      max,\n      lower,\n      upper,\n      unit,\n      onChangeLower,\n      onChangeUpper,\n    } = this.props;\n    var availability = [[min, max]];\n    return (\n      <div className=\"datetime-selector\">\n        <div>\n          {tlower.toFixed(2)}\n          {unit} > {tupper.toFixed(2)}\n          {unit}\n        </div>\n        <SliderSelect\n          type=\"double\"\n          min={min}\n          max={max}\n          lower={lower}\n          upper={upper}\n          data={availability}\n          onChangeLower={onChangeLower}\n          onChangeUpper={onChangeUpper}\n        />\n      </div>\n    );\n  }\n}\n\nexport default NumberSliderDouble;\n","import React, { Component } from \"react\";\nimport \"./loaddatasets.css\";\n\nclass LoadDataSets extends Component {\n  downloadProgress = (data) => {\n    var len = data.length;\n    var count = 0;\n    for (var i = 0; i < len; i++) {\n      if (data[i] === 0) count++;\n    }\n    count = len - count;\n    return count;\n  };\n\n  render() {\n    var { data } = this.props;\n    var count = this.downloadProgress(data);\n\n    return (\n      <div className=\"loaddatasets\">\n        {count < data.length && (\n          <div className=\"linegraph-file\">\n            {count} of {data.length} files in memory.\n            {/*<button className=\"read-button\" onClick={() => downloadData()}>\n                Preload full dataset\n          </button>*/}\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default LoadDataSets;\n","import React, { Component } from \"react\";\nimport DateTimePicker from \"react-datetime-picker\";\nimport Select from \"react-select\";\nimport axios from \"axios\";\nimport { apiUrl } from \"../../config.json\";\nimport \"./reportissue.css\";\n\nclass ReportIssue extends Component {\n  state = {\n    reported: false,\n    modal: false,\n    maintenance: false,\n    message: \"\",\n    email: \"\",\n    start: new Date(),\n    end: new Date(),\n    parameters: null,\n    description: \"\",\n    reporter: \"\",\n    sensordepths: \"\",\n    submitted: false,\n    error: false,\n    data: [],\n  };\n\n  openModal = () => {\n    this.setState({ modal: true });\n  };\n\n  closeModal = (event) => {\n    if (\n      event.target.className === \"report-modal\" ||\n      event.target.className === \"close-modal\"\n    )\n      this.setState({ modal: false });\n  };\n\n  updateState = (parameter, event) => {\n    if (event == null) {\n      this.setState({ [parameter]: null });\n    } else if (!(\"target\" in event)) this.setState({ [parameter]: event });\n  };\n\n  addAllParameters = () => {\n    var parameters = this.props.datasetparameters\n      .filter((d) => ![1, 2, 18, 27, 28, 29, 30].includes(d.parameters_id))\n      .map((p) => {\n        return {\n          value: p.id,\n          label: p.name + (p.detail !== \"none\" ? ` (${p.detail})` : \"\"),\n          id: p.parameters_id,\n        };\n      });\n    this.setState({ parameters });\n  };\n\n  updateInput = (parameter, event) => {\n    this.setState({ [parameter]: event.target.value });\n  };\n\n  updateMessage = (event) => {\n    this.setState({ message: event.target.value });\n  };\n\n  updateEmail = (event) => {\n    this.setState({ email: event.target.value });\n  };\n\n  toggleMaintenance = () => {\n    if (!this.state.maintenance) {\n      var key = \"thetis\";\n      var output = window.prompt(\n        \"Please enter the password to report maintenance.\",\n        \"\"\n      );\n      if (key !== output) {\n        window.alert(\"Incorrect password.\");\n      } else {\n        this.setState({ maintenance: !this.state.maintenance });\n      }\n    } else {\n      this.setState({ maintenance: !this.state.maintenance });\n    }\n  };\n\n  submitReport = async () => {\n    var { message, email } = this.state;\n    var { dataset, repositories_id } = this.props;\n    var content = {\n      from: {\n        email: \"runnalls.james@gmail.com\",\n      },\n      personalizations: [\n        {\n          to: [\n            {\n              email: \"james.runnalls@eawag.ch\",\n            },\n          ],\n          dynamic_template_data: {\n            dataset: dataset,\n            email: email,\n            url: window.location.href,\n            message: message,\n          },\n        },\n      ],\n      template_id: \"d-819e0202b4724bbb99069fdff49d667a\",\n    };\n    var issues = {\n      title: message,\n      description: \"Reported by: \" + email,\n      repo_id: repositories_id,\n    };\n    try {\n      await axios.post(apiUrl + \"/contact\", content);\n      try {\n        await axios.post(apiUrl + \"/issues\", issues);\n      } catch (e) {\n        console.error(e);\n      }\n      this.setState({ reported: true, error: false });\n    } catch (e) {\n      console.error(e);\n      this.setState({ error: true });\n    }\n  };\n\n  deleteMaintenance = async (ids) => {\n    for (let i = 0; i < ids.length; i++) {\n      await axios.delete(apiUrl + \"/maintenance/\" + ids[i]);\n    }\n    this.updateMaintenance();\n  };\n\n  updateMaintenance = async () => {\n    var { data } = await axios.get(apiUrl + \"/maintenance/\" + this.props.id);\n    this.setState({ data });\n  };\n\n  submitMaintenance = async () => {\n    var { start, end, parameters, description, reporter, sensordepths } =\n      this.state;\n    var { id } = this.props;\n\n    if (parameters === null) {\n      window.alert(\"You must select at least one parameter.\");\n      return;\n    }\n    var p = parameters.map((p) => p.id);\n    var dp = parameters.map((p) => p.value);\n    var content = {\n      id,\n      start,\n      end,\n      parameters: p,\n      description,\n      reporter,\n      sensordepths,\n      datasetparameters: dp,\n    };\n\n    try {\n      await axios.post(apiUrl + \"/maintenance\", content);\n      this.updateMaintenance();\n      this.setState({\n        start: new Date(),\n        end: new Date(),\n        parameters: null,\n        description: \"\",\n        reporter: \"\",\n        sensordepths: \"\",\n        error: false,\n      });\n    } catch (e) {\n      console.error(e);\n      this.setState({ error: true });\n    }\n  };\n\n  formatTime = (time) => {\n    let parts = time.split(\"T\");\n    return parts[0] + \" \" + parts[1].slice(0, 5);\n  };\n\n  componentDidMount = async () => {\n    this.updateMaintenance();\n  };\n\n  render() {\n    var {\n      reported,\n      modal,\n      maintenance,\n      start,\n      end,\n      parameters,\n      description,\n      reporter,\n      sensordepths,\n      error,\n      data,\n    } = this.state;\n    var { dataset, datasetparameters } = this.props;\n    var dp = datasetparameters\n      .filter((d) => ![1, 2, 18, 27, 28, 29, 30].includes(d.parameters_id))\n      .map((p) => {\n        return {\n          value: p.id,\n          label: p.name + (p.detail !== \"none\" ? ` (${p.detail})` : \"\"),\n          id: p.parameters_id,\n        };\n      });\n    var sd =\n      datasetparameters.filter(\n        (dp) => dp.parameters_id === 2 && dp.axis === \"y\"\n      ).length > 0;\n\n    var dict = {};\n    for (let i = 0; i < data.length; i++) {\n      let dt = data[i].starttime.toString() + data[i].endtime.toString();\n      if (dt in dict) {\n        dict[dt][\"parameters\"].push(data[i].name + (data[i].detail !== \"none\" ? ` (${data[i].detail})` : \"\"));\n        dict[dt][\"id\"].push(data[i].id);\n      } else {\n        dict[dt] = {\n          start: data[i].starttime,\n          end: data[i].endtime,\n          parameters: [data[i].name + (data[i].detail !== \"none\" ? ` (${data[i].detail})` : \"\")],\n          description: data[i].description,\n          id: [data[i].id],\n          reporter: data[i].reporter,\n        };\n      }\n    }\n\n    var rows = [];\n    for (var key in dict) {\n      let ids = dict[key].id;\n      rows.push(\n        <tr key={key}>\n          <td>{this.formatTime(dict[key].start)}</td>\n          <td>{this.formatTime(dict[key].end)}</td>\n          <td>{dict[key].parameters.join(\", \")}</td>\n          <td>{dict[key].description}</td>\n          <td>{dict[key].reporter}</td>\n          <td\n            style={{ width: \"20px\" }}\n            className=\"close\"\n            title=\"Delete report\"\n            onClick={() => this.deleteMaintenance(ids)}\n          >\n            &#10005;\n          </td>\n        </tr>\n      );\n    }\n\n    return (\n      <div className=\"report-issue\">\n        <div className=\"report-button\">\n          <button\n            className=\"click\"\n            onClick={this.openModal}\n            title=\"Does something not look right with this dataset?\"\n          >\n            Report Issue\n          </button>\n        </div>\n        {modal && (\n          <div className=\"report-modal\" onClick={this.closeModal}>\n            <div className=\"report-modal-box\">\n              <div className=\"close-modal\" onClick={this.closeModal}>\n                &#215;\n              </div>\n              <h2>Report Issue</h2>\n              <div className=\"reportslider\">\n                Report Maintenance\n                <label className=\"switch\">\n                  <input\n                    type=\"checkbox\"\n                    checked={maintenance}\n                    onChange={this.toggleMaintenance}\n                  />\n                  <span className=\"slider round\"></span>\n                </label>\n              </div>\n              {maintenance ? (\n                <React.Fragment>\n                  <p>Current maintenance periods:</p>\n                  <table>\n                    <tbody>\n                      <tr>\n                        <th>Start</th>\n                        <th>End</th>\n                        <th>Parameters</th>\n                        <th>Description</th>\n                        <th>Reporter</th>\n                        <th></th>\n                      </tr>\n                      {rows}\n                    </tbody>\n                  </table>\n                  <p>\n                    Please complete the form below to suggest a maintenance\n                    period for the dataset.\n                  </p>\n                  <table className=\"report\">\n                    <tbody>\n                      <tr>\n                        <th>Start time</th>\n                        <td>\n                          <DateTimePicker\n                            onChange={(event) =>\n                              this.updateState(\"start\", event)\n                            }\n                            value={start}\n                            clearIcon={null}\n                            calendarIcon={null}\n                            disableClock={true}\n                            format={\"dd.MM.y H:mm\"}\n                          />\n                        </td>\n                      </tr>\n                      <tr>\n                        <th>End time</th>\n                        <td>\n                          <DateTimePicker\n                            onChange={(event) => this.updateState(\"end\", event)}\n                            value={end}\n                            clearIcon={null}\n                            calendarIcon={null}\n                            disableClock={true}\n                            format={\"dd.MM.y H:mm\"}\n                          />\n                        </td>\n                      </tr>\n                      <tr>\n                        <th>Parameters</th>\n                        <td>\n                          <Select\n                            options={dp}\n                            value={parameters}\n                            isMulti\n                            className=\"multi-select\"\n                            classNamePrefix=\"reportparameter\"\n                            onChange={(event) =>\n                              this.updateState(\"parameters\", event)\n                            }\n                          />\n                          <div\n                            className=\"addbutton\"\n                            onClick={this.addAllParameters}\n                          >\n                            Add all\n                          </div>\n                        </td>\n                      </tr>\n                      <tr>\n                        <th>Description</th>\n                        <td>\n                          <textarea\n                            value={description}\n                            onChange={(event) =>\n                              this.updateInput(\"description\", event)\n                            }\n                          />\n                        </td>\n                      </tr>\n                      {sd && (\n                        <tr>\n                          <th>Comma Seperated Sensor Depths</th>\n                          <td>\n                            <textarea\n                              value={sensordepths}\n                              placeholder=\"1.6,4.5,18.0\"\n                              onChange={(event) =>\n                                this.updateInput(\"sensordepths\", event)\n                              }\n                            />\n                          </td>\n                        </tr>\n                      )}\n                      <tr>\n                        <th>Reporter</th>\n                        <td>\n                          <input\n                            value={reporter}\n                            type=\"text\"\n                            onChange={(event) =>\n                              this.updateInput(\"reporter\", event)\n                            }\n                          />\n                        </td>\n                      </tr>\n                    </tbody>\n                  </table>\n                  <div className=\"modal-submit\">\n                    {error &&\n                      \"Failed to submit please refresh the page and try again.\"}\n                    <button className=\"click\" onClick={this.submitMaintenance}>\n                      Submit Report\n                    </button>\n                  </div>\n                </React.Fragment>\n              ) : (\n                <React.Fragment>\n                  <p>\n                    Thanks for filling out a data report, please add a message\n                    describing the issue and your email address in case we have\n                    further questions.\n                  </p>\n                  <p>Dataset: {dataset}</p>\n                  <textarea\n                    placeholder=\"Please type your report here.\"\n                    onChange={this.updateMessage}\n                    readOnly={reported}\n                  />\n                  <input\n                    type=\"text\"\n                    placeholder=\"Email address\"\n                    onChange={this.updateEmail}\n                    readOnly={reported}\n                  />\n                  {reported ? (\n                    <p>\n                      Thanks for submitting a data report. We will look into it\n                      as soon as possible.\n                    </p>\n                  ) : (\n                    <div className=\"modal-submit\">\n                      {error &&\n                        \"Failed to submit please refresh the page and try again.\"}\n                      <button className=\"click\" onClick={this.submitReport}>\n                        Submit Report\n                      </button>\n                    </div>\n                  )}\n                </React.Fragment>\n              )}\n            </div>\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nexport default ReportIssue;\n","import React, { Component } from \"react\";\nimport Loading from \"../../../components/loading/loading\";\nimport D3HeatMap from \"../../../graphs/d3/heatmap/heatmap\";\nimport D3LineGraph from \"../../../graphs/d3/linegraph/linegraph\";\nimport SliderDouble from \"../../../components/sliders/sliderdouble\";\nimport \"../css/bafu.css\";\n\nclass Bafu extends Component {\n  onChangeLowerX = (event) => {\n    this.props.onChangeX([event.getTime(), this.props.upperX * 1000]);\n  };\n  onChangeUpperX = (event) => {\n    this.props.onChangeX([this.props.lowerX * 1000, event.getTime()]);\n  };\n  render() {\n    var {\n      graph,\n      plotdata,\n      title,\n      xlabel,\n      ylabel,\n      zlabel,\n      xunits,\n      yunits,\n      zunits,\n      bcolor,\n      colors,\n      plotdots,\n      thresholdStep,\n      confidence,\n      lcolor,\n      lweight,\n      xReverse,\n      yReverse,\n      yScale,\n      minX,\n      maxX,\n      lowerX,\n      upperX,\n      files,\n      onChangeX,\n      dropdown,\n      lang,\n    } = this.props;\n    thresholdStep = 50;\n\n    var lang_map = { en: \"name\", de: \"german\", fr: \"french\", it: \"italian\" };\n\n    if (ylabel !== \"\") {\n      var ylabel_info = dropdown.parameters.find((f) => f.name === ylabel);\n      if (ylabel_info[lang_map[lang]] !== null)\n        ylabel = ylabel_info[lang_map[lang]];\n    }\n\n    if (zlabel !== \"\") {\n      var zlabel_info = dropdown.parameters.find((f) => f.name === zlabel);\n      if (zlabel_info[lang_map[lang]] !== null)\n        zlabel = zlabel_info[lang_map[lang]];\n    }\n\n    switch (graph) {\n      default:\n        return (\n          <React.Fragment>\n            <table className=\"loading-table\">\n              <tbody>\n                <tr>\n                  <td>\n                    <Loading />\n                    Loading Data\n                  </td>\n                </tr>\n              </tbody>\n            </table>\n          </React.Fragment>\n        );\n      case \"heatmap\":\n        return (\n          <div className=\"bafu\">\n            <div className=\"graph\">\n              <D3HeatMap\n                data={plotdata}\n                title={title}\n                xlabel={xlabel}\n                ylabel={ylabel}\n                zlabel={zlabel}\n                xunits={xunits}\n                yunits={yunits}\n                zunits={zunits}\n                bcolor={bcolor}\n                colors={colors}\n                thresholdStep={thresholdStep}\n                yReverse={yReverse}\n                xReverse={xReverse}\n                display={\"contour\"}\n                header={false}\n                language={lang}\n                levels={true}\n              />\n            </div>\n            <div className=\"selector\">\n              <SliderDouble\n                onChange={onChangeX}\n                onChangeLower={this.onChangeLowerX}\n                onChangeUpper={this.onChangeUpperX}\n                min={minX}\n                max={maxX}\n                lower={lowerX}\n                upper={upperX}\n                files={files}\n                language={lang}\n              />\n            </div>\n          </div>\n        );\n      case \"linegraph\":\n        lcolor[0] = \"#0E18EB\";\n        lcolor[1] = \"#FF0000\";\n        lweight[0] = 2;\n        lweight[1] = 2;\n        var legend = [];\n        if (plotdata.length > 1) {\n          var yi = dropdown.parameters.find((f) => f.id === 5);\n          var yaxis_dict = {\n            en: \"name\",\n            de: \"german\",\n            it: \"italian\",\n            fr: \"french\",\n          };\n          ylabel = yi[yaxis_dict[lang]];\n          var dp1 = this.props.datasetparameters.find(\n            (d) => d.axis === this.props.yaxis[0]\n          );\n          var dp2 = this.props.datasetparameters.find(\n            (d) => d.axis === this.props.yaxis[1]\n          );\n          legend = [\n            {\n              id: 0,\n              color: lcolor[0],\n              text:\n                dropdown.parameters.find((f) => f.id === dp1.parameters_id)[\n                  yaxis_dict[lang]\n                ] + (dp1.detail === \"none\" ? \"\" : ` (${dp1.detail})`),\n              value: \"\",\n              xaxis: \"x\",\n              yaxis: \"y\",\n            },\n            {\n              id: 1,\n              color: lcolor[1],\n              text:\n                dropdown.parameters.find((f) => f.id === dp2.parameters_id)[\n                  yaxis_dict[lang]\n                ] + (dp2.detail === \"none\" ? \"\" : ` (${dp2.detail})`),\n              value: \"\",\n              xaxis: \"x\",\n              yaxis: \"y\",\n            },\n          ];\n        }\n        return (\n          <div className=\"bafu\" id=\"bafu\">\n            <div className=\"graph\">\n              <D3LineGraph\n                data={plotdata}\n                confidence={confidence}\n                title={title}\n                legend={legend}\n                xlabel={xlabel}\n                ylabel={ylabel}\n                xunits={xunits}\n                yunits={yunits}\n                lcolor={lcolor}\n                lweight={lweight}\n                bcolor={bcolor}\n                xscale={\"Time\"}\n                yscale={yScale}\n                yReverse={yReverse}\n                xReverse={xReverse}\n                plotdots={plotdots}\n                setDownloadGraph={this.setDownloadGraph}\n                box={true}\n                grid={true}\n                header={false}\n                fontSize={14}\n                language={lang}\n                border={true}\n              />\n            </div>\n            <div className=\"selector\">\n              <SliderDouble\n                onChange={onChangeX}\n                onChangeLower={this.onChangeLowerX}\n                onChangeUpper={this.onChangeUpperX}\n                min={minX}\n                max={maxX}\n                lower={lowerX}\n                upper={upperX}\n                files={files}\n                language={lang}\n              />\n            </div>\n          </div>\n        );\n    }\n  }\n}\n\nexport default Bafu;\n","import React, { Component } from \"react\";\nimport Loading from \"../../../components/loading/loading\";\nimport D3HeatMap from \"../../../graphs/d3/heatmap/heatmap\";\nimport D3LineGraph from \"../../../graphs/d3/linegraph/linegraph\";\nimport \"../css/display.css\";\n\nclass Display extends Component {\n  calculateMovingAverage = (array, windowSize) => {\n    if (windowSize <= 0 || windowSize > array.length) {\n      throw new Error(\"Window size is invalid\");\n    }\n\n    const movingAverages = [];\n\n    for (let i = 0; i < array.length; i++) {\n      const windowStart = Math.max(0, i - windowSize + 1);\n      const window = array.slice(windowStart, i + 1);\n      const sum = window.reduce((acc, num) => acc + num, 0);\n      const average = sum / window.length;\n      movingAverages.push(average);\n    }\n\n    return movingAverages;\n  };\n  render() {\n    var {\n      graph,\n      plotdata,\n      title,\n      xlabel,\n      ylabel,\n      zlabel,\n      xunits,\n      yunits,\n      zunits,\n      bcolor,\n      colors,\n      thresholdStep,\n      confidence,\n      lcolor,\n      lweight,\n      xReverse,\n      yReverse,\n      yScale,\n      dropdown,\n      lang,\n    } = this.props;\n    thresholdStep = 50;\n\n    var lang_map = { en: \"name\", de: \"german\", fr: \"french\", it: \"italian\" };\n\n    if (ylabel !== \"\") {\n      var ylabel_info = dropdown.parameters.find((f) => f.name === ylabel);\n      if (ylabel_info[lang_map[lang]] !== null)\n        ylabel = ylabel_info[lang_map[lang]];\n    }\n\n    if (zlabel !== \"\") {\n      var zlabel_info = dropdown.parameters.find((f) => f.name === zlabel);\n      if (zlabel_info[lang_map[lang]] !== null)\n        zlabel = zlabel_info[lang_map[lang]];\n    }\n\n    var value = \"\";\n    var time = \"\";\n\n    var data = JSON.parse(JSON.stringify(plotdata));\n\n    if (data.length > 0) {\n      try {\n        data[0].x = data[0].x.map((d) => new Date(d));\n        value = data[0].y[data[0].y.length - 1];\n        let x = data[0].x[data[0].x.length - 1];\n        var now = new Date();\n        let diff = now - x;\n        if (diff < 1000 * 3600) {\n          time = `${Math.round(diff / (1000 * 60))} minutes`;\n        } else if (diff < 1000 * 3600 * 24) {\n          time = `${Math.round(diff / (100 * 3600)) / 10} hours`;\n        } else {\n          time = `${Math.round(diff / (100 * 3600 * 24)) / 10} days`;\n        }\n      } catch (e) {\n        console.error(e);\n      }\n      try {\n        data[0].y = this.calculateMovingAverage(data[0].y, 10);\n      } catch (e) {\n        console.error(e);\n      }\n    }\n\n    var head = (\n      <div className=\"header\">\n        <div className=\"inner-header\">\n          <div className=\"value\">{value}°C</div>\n          <div className=\"time\">Last reading: {time} ago</div>\n          <div className=\"title\">{title}</div>\n          <a href={window.location.href.split(\"?\")[0]}>\n            <button>More info</button>\n          </a>\n        </div>\n\n        <div>\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n            className=\"waves\"\n            preserveAspectRatio=\"none\"\n            viewBox=\"0 24 150 28\"\n          >\n            <defs>\n              <path\n                id=\"gentle-wave\"\n                d=\"M-160 44c30 0 58-18 88-18s58 18 88 18 58-18 88-18 58 18 88 18v44h-352z\"\n              ></path>\n            </defs>\n            <g className=\"parallax\">\n              <use\n                x=\"48\"\n                fill=\"rgba(255,255,255,0.7\"\n                xlinkHref=\"#gentle-wave\"\n              ></use>\n              <use\n                x=\"48\"\n                y=\"3\"\n                fill=\"rgba(255,255,255,0.5)\"\n                xlinkHref=\"#gentle-wave\"\n              ></use>\n              <use\n                x=\"48\"\n                y=\"5\"\n                fill=\"rgba(255,255,255,0.3)\"\n                xlinkHref=\"#gentle-wave\"\n              ></use>\n              <use x=\"48\" y=\"7\" fill=\"#fff\" xlinkHref=\"#gentle-wave\"></use>\n            </g>\n          </svg>\n        </div>\n      </div>\n    );\n\n    switch (graph) {\n      default:\n        return (\n          <React.Fragment>\n            <table className=\"loading-table\">\n              <tbody>\n                <tr>\n                  <td>\n                    <Loading />\n                    Loading Data\n                  </td>\n                </tr>\n              </tbody>\n            </table>\n          </React.Fragment>\n        );\n      case \"heatmap\":\n        return (\n          <div className=\"display\">\n            {head}\n            <div className=\"graph\">\n              <D3HeatMap\n                data={data}\n                title={title}\n                xlabel={xlabel}\n                ylabel={ylabel}\n                zlabel={zlabel}\n                xunits={xunits}\n                yunits={yunits}\n                zunits={zunits}\n                bcolor={bcolor}\n                colors={colors}\n                thresholdStep={thresholdStep}\n                yReverse={yReverse}\n                xReverse={xReverse}\n                display={\"contour\"}\n                header={false}\n                language={lang}\n                levels={true}\n              />\n            </div>\n          </div>\n        );\n      case \"linegraph\":\n        lcolor[0] = \"#673AB7\";\n        lcolor[1] = \"#FF0000\";\n        lweight[0] = 2;\n        lweight[1] = 2;\n        var legend = [];\n        return (\n          <div className=\"display\" id=\"display\">\n            {head}\n            <div className=\"graph\">\n              <D3LineGraph\n                data={data}\n                confidence={confidence}\n                title={title}\n                legend={legend}\n                xlabel={xlabel}\n                ylabel={ylabel}\n                xunits={xunits}\n                yunits={yunits}\n                lcolor={lcolor}\n                lweight={lweight}\n                bcolor={bcolor}\n                xscale={\"Time\"}\n                yscale={yScale}\n                yReverse={yReverse}\n                xReverse={xReverse}\n                plotdots={false}\n                setDownloadGraph={this.setDownloadGraph}\n                header={false}\n                fontSize={14}\n                language={lang}\n                border={true}\n                curve={true}\n              />\n            </div>\n          </div>\n        );\n    }\n  }\n}\n\nexport default Display;\n","import React, { Component } from \"react\";\nimport * as d3 from \"d3\";\nimport { interp2 } from \"../../../components/interp2/interp2\";\nimport SidebarLayout from \"../../../format/sidebarlayout/sidebarlayout\";\nimport ColorManipulation from \"../../../components/colormanipulation/colormanipulation\";\nimport DataSelect from \"../../../components/dataselect/dataselect\";\nimport Loading from \"../../../components/loading/loading\";\nimport D3HeatMap from \"../../../graphs/d3/heatmap/heatmap\";\nimport SliderDouble from \"../../../components/sliders/sliderdouble\";\nimport SliderSingle from \"../../../components/sliders/slidersingle\";\nimport NumberSliderDouble from \"../../../components/sliders/sliderdoublenumber\";\nimport LoadDataSets from \"../../../components/loaddatasets/loaddatasets\";\nimport D3LineGraph from \"../../../graphs/d3/linegraph/linegraph\";\nimport FilterBox from \"../../../components/filterbox/filterbox\";\nimport colorlist from \"../../../components/colorramp/colors\";\nimport isArray from \"lodash/isArray\";\nimport isInteger from \"lodash/isInteger\";\nimport ReportIssue from \"../../../components/reportissue/reportissue\";\nimport Connect from \"../img/connect.svg\";\nimport Bafu from \"./bafu\";\nimport Display from \"./display\";\n\nclass Graph extends Component {\n  render() {\n    var {\n      graph,\n      plotdata,\n      title,\n      xlabel,\n      ylabel,\n      zlabel,\n      xunits,\n      yunits,\n      zunits,\n      bcolor,\n      colors,\n      plotdots,\n      thresholdStep,\n      display,\n      lowerZ,\n      upperZ,\n      confidence,\n      lcolor,\n      lweight,\n      timeaxis,\n      xReverse,\n      yReverse,\n      file,\n      files,\n      xaxis,\n      yaxis,\n      xScale,\n      yScale,\n      datasetparameters,\n    } = this.props;\n    switch (graph) {\n      default:\n        return (\n          <React.Fragment>\n            <table className=\"loading-table\">\n              <tbody>\n                <tr>\n                  <td>\n                    <Loading />\n                    Loading Data\n                  </td>\n                </tr>\n              </tbody>\n            </table>\n          </React.Fragment>\n        );\n      case \"heatmap\":\n        return (\n          <React.Fragment>\n            <D3HeatMap\n              data={plotdata}\n              title={title}\n              xlabel={xlabel}\n              ylabel={ylabel}\n              zlabel={zlabel}\n              xunits={xunits}\n              yunits={yunits}\n              zunits={zunits}\n              bcolor={bcolor}\n              colors={colors}\n              thresholdStep={thresholdStep}\n              minvalue={lowerZ}\n              maxvalue={upperZ}\n              yReverse={yReverse}\n              xReverse={xReverse}\n              display={display}\n            />\n          </React.Fragment>\n        );\n      case \"linegraph\":\n        if (timeaxis === \"x\") xScale = \"Time\";\n        if (timeaxis === \"y\") yScale = \"Time\";\n        var x2label = \"\";\n        var x2units = \"\";\n        var y2label = \"\";\n        var y2units = \"\";\n\n        var legend = [];\n        if (xaxis.length > 1 && file.length < 2) {\n          xlabel = \"\";\n          for (let i = 0; i < xaxis.length; i++) {\n            let dp = datasetparameters.find((d) => d.axis === xaxis[i]);\n            let axis = \"x\";\n            if (i > 0 && legend[0].unit !== dp.unit) {\n              axis = \"x2\";\n              xlabel = this.props.xlabel;\n              x2label = dp.name;\n              x2units = dp.unit;\n            }\n            legend.push({\n              id: i,\n              color: lcolor[i],\n              text: dp.name + (dp.detail === \"none\" ? \"\" : ` (${dp.detail})`),\n              unit: dp.unit,\n              xaxis: axis,\n              yaxis: \"y\",\n            });\n          }\n          if (legend.filter((l) => l.xaxis === \"x\").length > 1) xlabel = \"\";\n          if (legend.filter((l) => l.xaxis === \"x\").length > 1) x2label = \"\";\n        } else if (yaxis.length > 1 && file.length < 2) {\n          ylabel = \"\";\n          for (let i = 0; i < yaxis.length; i++) {\n            let dp = datasetparameters.find((d) => d.axis === yaxis[i]);\n            let axis = \"y\";\n            if (i > 0 && legend[0].unit !== dp.unit) {\n              axis = \"y2\";\n              ylabel = this.props.ylabel;\n              y2label = dp.name;\n              y2units = dp.unit;\n            }\n            legend.push({\n              id: i,\n              color: lcolor[i],\n              text: dp.name + (dp.detail === \"none\" ? \"\" : ` (${dp.detail})`),\n              unit: dp.unit,\n              yaxis: axis,\n              xaxis: \"x\",\n            });\n          }\n          if (legend.filter((l) => l.yaxis === \"y2\").length > 1) y2label = \"\";\n          if (legend.filter((l) => l.yaxis === \"y\").length > 1) ylabel = \"\";\n        } else {\n          for (let i = 0; i < file.length; i++) {\n            var value = new Date(files[file[i]].ave);\n            var text = value.toDateString() + \" \" + value.toLocaleTimeString();\n            var color = lcolor[i];\n            legend.push({ id: i, color, text, value, yaxis: \"y\", xaxis: \"x\" });\n          }\n        }\n\n        return (\n          <React.Fragment>\n            <D3LineGraph\n              data={plotdata}\n              legend={legend}\n              confidence={confidence}\n              title={title}\n              xlabel={xlabel}\n              ylabel={ylabel}\n              xunits={xunits}\n              yunits={yunits}\n              x2label={x2label}\n              y2label={y2label}\n              x2units={x2units}\n              y2units={y2units}\n              lcolor={lcolor}\n              lweight={lweight}\n              bcolor={bcolor}\n              xscale={xScale}\n              yscale={yScale}\n              yReverse={yReverse}\n              xReverse={xReverse}\n              plotdots={plotdots}\n              setDownloadGraph={this.setDownloadGraph}\n              border={true}\n            />\n          </React.Fragment>\n        );\n    }\n  }\n}\n\nclass Sidebar extends Component {\n  render() {\n    return (\n      <React.Fragment>\n        <AxisSelect\n          graph={this.props.graph}\n          xaxis={this.props.xaxis}\n          yaxis={this.props.yaxis}\n          zaxis={this.props.zaxis}\n          addNewFiles={this.props.addNewFiles}\n          xoptions={this.props.xoptions}\n          yoptions={this.props.yoptions}\n          zoptions={this.props.zoptions}\n          handleAxisSelect={this.props.handleAxisSelect}\n          handleAxisAppend={this.props.handleAxisAppend}\n        />\n        <Range {...this.props} />\n        <DisplayOptions {...this.props} />\n      </React.Fragment>\n    );\n  }\n}\n\nclass AxisSelect extends Component {\n  render() {\n    var {\n      graph,\n      xaxis,\n      yaxis,\n      zaxis,\n      xoptions,\n      yoptions,\n      zoptions,\n      addNewFiles,\n      handleAxisSelect,\n    } = this.props;\n    return (\n      <React.Fragment>\n        <FilterBox\n          title=\"Axis\"\n          preopen=\"true\"\n          content={\n            <div>\n              {xaxis && (\n                <div>\n                  x:{\" \"}\n                  <div className=\"axis-select\">\n                    <DataSelect\n                      value=\"value\"\n                      label=\"label\"\n                      dataList={xoptions}\n                      defaultValue={xaxis[0]}\n                      onChange={handleAxisSelect}\n                    />\n                  </div>\n                </div>\n              )}\n              {yaxis && (\n                <div>\n                  y:{\" \"}\n                  <div className=\"axis-select\">\n                    <DataSelect\n                      value=\"value\"\n                      label=\"label\"\n                      dataList={yoptions}\n                      defaultValue={yaxis[0]}\n                      onChange={handleAxisSelect}\n                    />\n                  </div>\n                </div>\n              )}\n              {zaxis && (\n                <div>\n                  z:{\" \"}\n                  <div className=\"axis-select\">\n                    <DataSelect\n                      value=\"value\"\n                      label=\"label\"\n                      dataList={zoptions}\n                      defaultValue={zaxis}\n                      disabled={graph === \"linegraph\"}\n                      onChange={handleAxisSelect}\n                    />\n                  </div>\n                </div>\n              )}\n            </div>\n          }\n        />\n        {graph === \"linegraph\" && !addNewFiles && (\n          <FilterBox\n            title=\"Compare\"\n            newFeature=\"true\"\n            preopen=\"false\"\n            content={<Compare {...this.props} />}\n          />\n        )}\n      </React.Fragment>\n    );\n  }\n}\n\nclass Compare extends Component {\n  state = {};\n  render() {\n    var { xaxis, yaxis, xoptions, yoptions, handleAxisAppend } = this.props;\n    var units = [];\n    var selected = [];\n    var selectable = [];\n    var options = xoptions.concat(yoptions);\n    if (xaxis.length > 1) {\n      for (let i = 0; i < xaxis.length; i++) {\n        units.push(xoptions.find((x) => x.value === xaxis[i]).unit);\n        if (i !== 0) selected.push(xoptions.find((x) => x.value === xaxis[i]));\n      }\n      units = [...new Set(units)];\n    } else if (yaxis.length > 1) {\n      for (let i = 0; i < yaxis.length; i++) {\n        units.push(yoptions.find((y) => y.value === yaxis[i]).unit);\n        if (i !== 0) selected.push(yoptions.find((y) => y.value === yaxis[i]));\n      }\n      units = [...new Set(units)];\n    }\n    if (units.length < 2) units = options.map((o) => o.unit);\n    for (let i = 0; i < options.length; i++) {\n      if (\n        ![1, 2, 18].includes(options[i].id) &&\n        units.includes(options[i].unit) &&\n        !xaxis.includes(options[i].value) &&\n        !yaxis.includes(options[i].value)\n      ) {\n        selectable.push(options[i]);\n      }\n    }\n    return (\n      <div className=\"axis-compare\">\n        <div className=\"axis-compare-selected\">\n          {selected.map((o) => (\n            <div\n              className=\"axis-compare-selected-object\"\n              key={\"selected_\" + o.value}\n              onClick={() => handleAxisAppend(o.value)}\n              title=\"Click to remove parameter\"\n            >\n              {o.label}\n              <span className=\"close\">&#215;</span>\n            </div>\n          ))}\n        </div>\n        {selectable.length > 0 && (\n          <div className=\"axis-compare-title\">\n            Add Additional Parameter\n            <div className=\"axis-compare-selectable\">\n              {selectable.map((o) => (\n                <div\n                  className=\"axis-compare-selectable-object\"\n                  key={\"selectable_\" + o.value}\n                  onClick={() => handleAxisAppend(o.value)}\n                  title=\"Click to add parameter\"\n                >\n                  {o.label}\n                </div>\n              ))}\n            </div>\n          </div>\n        )}\n      </div>\n    );\n  }\n}\n\nclass Range extends Component {\n  closest = (num, arr) => {\n    var diff = Infinity;\n    var index = 0;\n    for (var i = 0; i < arr.length; i++) {\n      var newdiff = Math.abs(num - arr[i]);\n      if (newdiff < diff) {\n        diff = newdiff;\n        index = i;\n      }\n    }\n    return index;\n  };\n\n  onChangeLowerX = (event) => {\n    if (event instanceof Date) {\n      this.props.onChangeX([event.getTime(), this.props.upperX * 1000]);\n    } else {\n      this.props.onChangeX([event, this.props.upperX]);\n    }\n  };\n\n  onChangeLowerY = (event) => {\n    if (event instanceof Date) {\n      this.props.onChangeY([event.getTime(), this.props.upperY * 1000]);\n    } else {\n      this.props.onChangeY([event, this.props.upperY]);\n    }\n  };\n\n  onChangeUpperX = (event) => {\n    if (event instanceof Date) {\n      this.props.onChangeX([this.props.lowerX * 1000, event.getTime()]);\n    } else {\n      this.props.onChangeX([this.props.lowerX, event]);\n    }\n  };\n\n  onChangeUpperY = (event) => {\n    if (event instanceof Date) {\n      this.props.onChangeY([this.props.lowerY * 1000, event.getTime()]);\n    } else {\n      this.props.onChangeY([this.props.lowerY, event]);\n    }\n  };\n\n  onChangeFile = (event) => {\n    var { onChangeFile, files } = this.props;\n    var id = this.closest(\n      event.getTime(),\n      files.map((a) => a.ave.getTime())\n    );\n    if (id > 0 && id < files.length) onChangeFile(id);\n  };\n\n  render() {\n    var { timeaxis, graph, files, file, xaxis, yaxis } = this.props;\n    var { minX, maxX, minY, maxY, lowerX, upperX, lowerY, upperY } = this.props;\n    var { data, downloadData, xunits, yunits, xlabel, ylabel } = this.props;\n    var { onChangeFile, toggleAddNewFile, removeFile, lcolor } = this.props;\n    var { mindatetime, maxdatetime, addNewFiles } = this.props;\n    var connect;\n    if (files.length > 0) {\n      connect = files[file[0]].connect;\n    }\n    if (connect === \"ind\") {\n      var fileControl = [];\n      if (file.length > 0) {\n        var value = files[file[file.length - 1]].ave;\n        for (var i = 0; i < file.length; i++) {\n          let dt = new Date(files[file[i]].ave);\n          let text = dt.toDateString() + \" \" + dt.toLocaleTimeString();\n          fileControl.push(\n            <tr key={\"file\" + i}>\n              <td>\n                <div\n                  className=\"color-line\"\n                  style={{ backgroundColor: lcolor[i] }}\n                />\n              </td>\n              <td>{text}</td>\n              <td\n                id={i}\n                onClick={removeFile}\n                title=\"Remove\"\n                className=\"removefile\"\n              >\n                ✕\n              </td>\n            </tr>\n          );\n        }\n      }\n    }\n    return (\n      <React.Fragment>\n        {timeaxis === \"M\" && (\n          <FilterBox\n            title=\"Files\"\n            preopen=\"true\"\n            content={\n              <div className=\"\">\n                <SliderSingle\n                  onChange={this.onChangeFile}\n                  onChangeFileInt={onChangeFile}\n                  file={file}\n                  value={value}\n                  min={mindatetime}\n                  max={maxdatetime}\n                  files={files}\n                  type=\"time\"\n                />\n                <LoadDataSets data={data} downloadData={downloadData} />\n                {graph === \"linegraph\" && (\n                  <React.Fragment>\n                    <div className=\"keeplines\">\n                      Keep previously plotted line{\" \"}\n                      <input\n                        checked={addNewFiles}\n                        type=\"checkbox\"\n                        onChange={toggleAddNewFile}\n                      />\n                    </div>\n                    <table className=\"filecontrol\">\n                      <tbody>{fileControl}</tbody>\n                    </table>\n                  </React.Fragment>\n                )}\n              </div>\n            }\n          />\n        )}\n        {[\"x\", \"y\"].includes(timeaxis) && (\n          <FilterBox\n            title={\"x\" === timeaxis ? xlabel + \" Range\" : ylabel + \" Range\"}\n            content={\n              <div className=\"side-date-slider\">\n                <SliderDouble\n                  onChangeLower={\n                    \"x\" === timeaxis ? this.onChangeLowerX : this.onChangeLowerY\n                  }\n                  onChangeUpper={\n                    \"x\" === timeaxis ? this.onChangeUpperX : this.onChangeUpperY\n                  }\n                  min={\"x\" === timeaxis ? minX : minY}\n                  max={\"x\" === timeaxis ? maxX : maxY}\n                  lower={\"x\" === timeaxis ? lowerX : lowerY}\n                  upper={\"x\" === timeaxis ? upperX : upperY}\n                  files={files}\n                />\n                <LoadDataSets data={data} downloadData={downloadData} />\n              </div>\n            }\n            preopen={true}\n          />\n        )}\n        {timeaxis !== \"x\" && xaxis.length === 1 && (\n          <FilterBox\n            title={xlabel + \" Range\"}\n            content={\n              <div className=\"side-date-slider\">\n                <NumberSliderDouble\n                  onChangeLower={this.onChangeLowerX}\n                  onChangeUpper={this.onChangeUpperX}\n                  min={minX}\n                  max={maxX}\n                  lower={lowerX}\n                  upper={upperX}\n                  unit={xunits}\n                />\n              </div>\n            }\n            preopen={false}\n          />\n        )}\n        {timeaxis !== \"y\" && yaxis.length === 1 && (\n          <FilterBox\n            title={ylabel + \" Range\"}\n            content={\n              <div className=\"side-date-slider\">\n                <NumberSliderDouble\n                  onChangeLower={this.onChangeLowerY}\n                  onChangeUpper={this.onChangeUpperY}\n                  min={minY}\n                  max={maxY}\n                  lower={lowerY}\n                  upper={upperY}\n                  unit={yunits}\n                />\n              </div>\n            }\n            preopen={false}\n          />\n        )}\n      </React.Fragment>\n    );\n  }\n}\n\nclass DisplayOptions extends Component {\n  state = {\n    colors: this.props.colors,\n    title: this.props.title,\n    bcolor: this.props.bcolor,\n    upperZ: this.props.upperZ,\n    lowerZ: this.props.lowerZ,\n    mask: this.props.mask,\n    thresholdStep: this.props.thresholdStep,\n    decimate: this.props.decimate,\n    average: this.props.average,\n    plotdots: this.props.plotdots,\n    interpolate: this.props.interpolate,\n    xScale: this.props.xScale,\n    yScale: this.props.yScale,\n  };\n  toggleMask = () => {\n    this.setState({ mask: !this.state.mask });\n  };\n\n  togglePlotdots = () => {\n    this.setState({ plotdots: !this.state.plotdots });\n  };\n\n  resetLower = () => {\n    var lowerZ = this.props.minZ;\n    this.setState({ lowerZ });\n  };\n\n  resetUpper = () => {\n    var upperZ = this.props.maxZ;\n    this.setState({ upperZ });\n  };\n\n  onChangeDecimate = (event) => {\n    var decimate = parseInt(event.target.value);\n    this.setState({ decimate });\n  };\n\n  onChangeInterpolate = (event) => {\n    this.setState({ interpolate: event.target.value });\n  };\n  onChangeAverage = (event) => {\n    var average = event.target.value;\n    this.setState({ average });\n  };\n  onChangexScale = (event) => {\n    var xScale = event.target.value;\n    this.setState({ xScale });\n  };\n  onChangeyScale = (event) => {\n    var yScale = event.target.value;\n    this.setState({ yScale });\n  };\n  onChangeLocalColors = (colors) => {\n    this.setState({ colors });\n  };\n  onChangeLocalTitle = (event) => {\n    var title = event.target.value;\n    this.setState({ title });\n  };\n  onChangeLocalThreshold = (event) => {\n    var thresholdStep = event.target.value;\n    this.setState({ thresholdStep });\n  };\n  onChangeLocalMin = (event) => {\n    var lowerZ = parseFloat(event.target.value);\n    this.setState({ lowerZ });\n  };\n  onChangeLocalMax = (event) => {\n    var upperZ = parseFloat(event.target.value);\n    this.setState({ upperZ });\n  };\n  onChangeLocalBcolor = (event) => {\n    var bcolor = event.target.value;\n    this.setState({ bcolor });\n  };\n  updatePlot = () => {\n    this.props.onChangeState(this.state);\n  };\n  componentDidUpdate(prevProps) {\n    var {\n      colors,\n      title,\n      bcolor,\n      lowerZ,\n      upperZ,\n      thresholdStep,\n      decimate,\n      average,\n      plotdots,\n      interpolate,\n    } = this.props;\n    var updateZ = false;\n    if (\n      !isNaN(lowerZ) &&\n      !isNaN(upperZ) &&\n      (prevProps.lowerZ !== lowerZ || prevProps.upperZ !== upperZ)\n    ) {\n      updateZ = true;\n    }\n    if (\n      prevProps.title !== title ||\n      prevProps.colors !== colors ||\n      updateZ ||\n      prevProps.thresholdStep !== thresholdStep ||\n      prevProps.decimate !== decimate ||\n      prevProps.average !== average ||\n      prevProps.plotdots !== plotdots ||\n      prevProps.interpolate !== interpolate\n    ) {\n      this.setState({\n        colors,\n        title,\n        bcolor,\n        lowerZ,\n        upperZ,\n        thresholdStep,\n        decimate,\n        average,\n        plotdots,\n        interpolate,\n      });\n    }\n  }\n  render() {\n    var {\n      colors,\n      title,\n      bcolor,\n      lowerZ,\n      upperZ,\n      thresholdStep,\n      mask,\n      decimate,\n      average,\n      plotdots,\n      interpolate,\n      xScale,\n      yScale,\n    } = this.state;\n    var { array, graph, timeaxis, interpolate_options } = this.props;\n    upperZ = upperZ === undefined ? 0 : upperZ;\n    lowerZ = lowerZ === undefined ? 0 : lowerZ;\n    return (\n      <FilterBox\n        title=\"Display Options\"\n        content={\n          <React.Fragment>\n            <table className=\"colors-table\">\n              <tbody>\n                <tr>\n                  <td>Title</td>\n                  <td colSpan=\"2\">\n                    <textarea\n                      id=\"title\"\n                      defaultValue={title}\n                      onChange={this.onChangeLocalTitle}\n                    />\n                  </td>\n                </tr>\n                <tr>\n                  <td>Background</td>\n                  <td>\n                    <input\n                      type=\"color\"\n                      id=\"bcolor\"\n                      defaultValue={bcolor}\n                      onChange={this.onChangeLocalBcolor}\n                    />\n                  </td>\n                </tr>\n                {graph === \"heatmap\" && (\n                  <tr>\n                    <td>Maximum</td>\n                    <td colSpan=\"2\">\n                      <div className=\"z-edit\">\n                        <input\n                          type=\"number\"\n                          id=\"upperZ\"\n                          value={upperZ}\n                          onChange={this.onChangeLocalMax}\n                        />\n                        <button onClick={this.resetUpper}>Reset</button>\n                      </div>\n                    </td>\n                  </tr>\n                )}\n                {graph === \"heatmap\" && (\n                  <tr>\n                    <td>Minimum</td>\n                    <td colSpan=\"2\">\n                      <div className=\"z-edit\">\n                        <input\n                          type=\"number\"\n                          id=\"lowerZ\"\n                          value={lowerZ}\n                          onChange={this.onChangeLocalMin}\n                        />\n                        <button onClick={this.resetLower}>Reset</button>\n                      </div>\n                    </td>\n                  </tr>\n                )}\n                {graph === \"heatmap\" && (\n                  <tr>\n                    <td>Number of Thresholds</td>\n                    <td>\n                      <input\n                        type=\"number\"\n                        id=\"threshold\"\n                        step=\"1\"\n                        value={thresholdStep}\n                        onChange={this.onChangeLocalThreshold}\n                      />\n                    </td>\n                  </tr>\n                )}\n                {graph === \"heatmap\" && (\n                  <tr>\n                    <td>Interpolate missing values</td>\n                    <td>\n                      <select\n                        id=\"interpolate\"\n                        value={interpolate}\n                        onChange={this.onChangeInterpolate}\n                        className=\"scale-select\"\n                      >\n                        {interpolate_options.map((op) => (\n                          <option key={op} value={op}>\n                            {op}\n                          </option>\n                        ))}\n                      </select>\n                    </td>\n                  </tr>\n                )}\n                {[\"x\", \"y\"].includes(timeaxis) && (\n                  <tr>\n                    <td>Down Sample</td>\n                    <td>\n                      1:\n                      <input\n                        className=\"downsample\"\n                        type=\"number\"\n                        step=\"1\"\n                        min=\"1\"\n                        value={decimate}\n                        onChange={this.onChangeDecimate}\n                      />\n                    </td>\n                  </tr>\n                )}\n                {[\"x\", \"y\"].includes(timeaxis) && (\n                  <tr>\n                    <td>Averaging</td>\n                    <td>\n                      <select\n                        id=\"average\"\n                        value={average}\n                        onChange={this.onChangeAverage}\n                        className=\"scale-select\"\n                      >\n                        <option value=\"None\">None</option>\n                        <option value=\"Hourly\">Hourly</option>\n                        <option value=\"Daily\">Daily</option>\n                        <option value=\"Monthly\">Monthly</option>\n                        <option value=\"Yearly\">Yearly</option>\n                      </select>\n                    </td>\n                  </tr>\n                )}\n                <tr>\n                  <td>Show Masked Points</td>\n                  <td>\n                    <input\n                      type=\"checkbox\"\n                      checked={!mask}\n                      onChange={this.toggleMask}\n                    />\n                  </td>\n                </tr>\n                {graph === \"linegraph\" && (\n                  <tr>\n                    <td>Plot Points</td>\n                    <td>\n                      <input\n                        type=\"checkbox\"\n                        checked={plotdots}\n                        onChange={this.togglePlotdots}\n                      />\n                    </td>\n                  </tr>\n                )}\n                {graph === \"linegraph\" && timeaxis !== \"x\" && (\n                  <tr>\n                    <td>xScale</td>\n                    <td>\n                      <select value={xScale} onChange={this.onChangexScale}>\n                        <option value=\"Linear\">Linear</option>\n                        <option value=\"Log\">Log</option>\n                      </select>\n                    </td>\n                  </tr>\n                )}\n                {graph === \"linegraph\" && timeaxis !== \"y\" && (\n                  <tr>\n                    <td>yScale</td>\n                    <td>\n                      <select value={yScale} onChange={this.onChangeyScale}>\n                        <option value=\"Linear\">Linear</option>\n                        <option value=\"Log\">Log</option>\n                      </select>\n                    </td>\n                  </tr>\n                )}\n              </tbody>\n            </table>\n\n            {graph === \"heatmap\" && (\n              <ColorManipulation\n                onChange={this.onChangeLocalColors}\n                colors={colors}\n                array={array}\n              />\n            )}\n            <div className=\"editsettings-button\">\n              <button\n                type=\"button\"\n                title=\"Update mapplot settings\"\n                onClick={this.updatePlot}\n              >\n                Update Plot\n              </button>\n            </div>\n          </React.Fragment>\n        }\n      />\n    );\n  }\n}\n\nclass Plot extends Component {\n  state = {\n    plotdata: [],\n    xaxis: [\"x\"],\n    yaxis: [\"y\"],\n    zaxis: \"z\",\n    xoptions: [],\n    yoptions: [],\n    zoptions: [],\n    xlabel: \"\",\n    ylabel: \"\",\n    zlabel: \"\",\n    xunits: \"\",\n    yunits: \"\",\n    zunits: \"\",\n    graph: \"\",\n    colors: [\n      { color: \"#0000ff\", point: 0 },\n      { color: \"#ff0000\", point: 1 },\n    ],\n    title: \"\",\n    bcolor: false,\n    lcolor: [\n      \"#000000\",\n      \"#e6194B\",\n      \"#3cb44b\",\n      \"#ffe119\",\n      \"#4363d8\",\n      \"#f58231\",\n      \"#911eb4\",\n      \"#42d4f4\",\n      \"#f032e6\",\n      \"#bfef45\",\n      \"#fabed4\",\n      \"#469990\",\n      \"#dcbeff\",\n      \"#9A6324\",\n      \"#fffac8\",\n      \"#800000\",\n      \"#aaffc3\",\n      \"#808000\",\n      \"#ffd8b1\",\n      \"#000075\",\n    ],\n    thresholdStep: 20,\n    display: \"heatmap\",\n    lweight: Array.from({ length: 20 }).map((x) => \"1\"),\n    decimate: 1,\n    average: \"None\",\n    mask: true,\n    interpolate: \"none\",\n    interpolate_options: [\n      \"none\",\n      \"x-linear\",\n      \"y-linear\",\n      \"x-nearest\",\n      \"y-nearest\",\n    ],\n    plotdots: false,\n    upperY: 1,\n    lowerY: 0,\n    upperX: 1,\n    lowerX: 0,\n    upperZ: 1,\n    lowerZ: 0,\n    maxY: 1,\n    minY: 0,\n    maxX: 1,\n    minX: 0,\n    maxZ: 1,\n    minZ: 0,\n    xScale: \"Linear\",\n    yScale: \"Linear\",\n    yReverse: false,\n    xReverse: false,\n    timeaxis: \"\",\n    refresh: false,\n    addNewFiles: false,\n    failed: false,\n  };\n\n  closest = (num, arr) => {\n    var diff = Infinity;\n    var index = 0;\n    for (var i = 0; i < arr.length; i++) {\n      var newdiff = Math.abs(num - arr[i]);\n      if (newdiff < diff) {\n        diff = newdiff;\n        index = i;\n      }\n    }\n    return index;\n  };\n\n  average = (nums) => {\n    return d3.mean(nums);\n  };\n\n  toggleAddNewFile = () => {\n    this.setState({ addNewFiles: !this.state.addNewFiles });\n  };\n\n  onChangeState = (state) => {\n    state.refresh = \"z\";\n    this.setState(state);\n  };\n\n  onChangeY = async (event) => {\n    var lower = event[0];\n    var upper = event[1];\n    if (\n      lower !== this.state.lowerY * 1000 ||\n      upper !== this.state.upperY * 1000\n    ) {\n      var { downloadMultipleFiles, data, files } = this.props;\n      var { timeaxis } = this.state;\n      if (timeaxis === \"y\") {\n        var toDownload = [];\n        for (var i = 0; i < files.length; i++) {\n          if (\n            new Date(files[i].mindatetime).getTime() < upper &&\n            new Date(files[i].maxdatetime).getTime() > lower &&\n            data[i] === 0\n          ) {\n            toDownload.push(i);\n          }\n        }\n        upper = upper / 1000;\n        lower = lower / 1000;\n        if (toDownload.length > 0) {\n          document.getElementById(\"detailloading\").style.display = \"block\";\n          await downloadMultipleFiles(toDownload);\n          document.getElementById(\"detailloading\").style.display = \"none\";\n        }\n      }\n      this.setState({ lowerY: lower, upperY: upper, refresh: true });\n    }\n  };\n\n  onChangeX = async (event) => {\n    var lower = event[0];\n    var upper = event[1];\n    if (\n      lower !== this.state.lowerX * 1000 ||\n      upper !== this.state.upperX * 1000\n    ) {\n      var { downloadMultipleFiles, data, files } = this.props;\n      var { timeaxis } = this.state;\n      if (timeaxis === \"x\") {\n        var toDownload = [];\n        for (var i = 0; i < files.length; i++) {\n          if (\n            new Date(files[i].mindatetime).getTime() < upper &&\n            new Date(files[i].maxdatetime).getTime() > lower &&\n            data[i] === 0\n          ) {\n            toDownload.push(i);\n          }\n        }\n        upper = upper / 1000;\n        lower = lower / 1000;\n        if (toDownload.length > 0) {\n          document.getElementById(\"detailloading\").style.display = \"block\";\n          await downloadMultipleFiles(toDownload);\n          document.getElementById(\"detailloading\").style.display = \"none\";\n        }\n      }\n      this.setState({ lowerX: lower, upperX: upper, refresh: true });\n    }\n  };\n\n  onChangeFile = async (event) => {\n    var { file, data, downloadMultipleFiles } = this.props;\n    var { addNewFiles } = this.state;\n    if (!file.includes(event) && file.length < 20) {\n      if (!addNewFiles) file = [];\n      file.push(event);\n      if (data[event] === 0) {\n        document.getElementById(\"detailloading\").style.display = \"block\";\n        await downloadMultipleFiles([event], file);\n        document.getElementById(\"detailloading\").style.display = \"none\";\n      } else {\n        await downloadMultipleFiles([], file);\n      }\n    }\n  };\n\n  parseColor = (colorname) => {\n    var defaultColors = [\n      { color: \"#0000ff\", point: 0 },\n      { color: \"#ff0000\", point: 1 },\n    ];\n    var colorparse = colorlist.find((c) => c.name === colorname);\n    if (colorparse) {\n      return colorparse.data;\n    } else {\n      return defaultColors;\n    }\n  };\n\n  findLink = (parameters, link) => {\n    return parameters.find((p) => p.id === link);\n  };\n\n  setAxisOptions = (datasetparameters, xaxis, yaxis) => {\n    var xoptions = [];\n    var yoptions = [];\n    var zoptions = [];\n    var graph = \"linegraph\";\n    var xdp = datasetparameters.find((dp) => dp.axis === xaxis[0]);\n    var ydp = datasetparameters.find((dp) => dp.axis === yaxis[0]);\n    var yReverse = false;\n    var xReverse = false;\n    if ([2, 18, 43].includes(xdp.parameters_id)) xReverse = true;\n    if ([2, 18, 43].includes(ydp.parameters_id)) yReverse = true;\n    for (var j = 0; j < datasetparameters.length; j++) {\n      var detail = datasetparameters[j][\"detail\"];\n      var link = datasetparameters[j][\"link\"];\n      var extra = \"\";\n      if (Number.isInteger(link) && this.findLink(datasetparameters, link)) {\n        extra = ` (${this.findLink(datasetparameters, link).name})`;\n      } else if ([\"none\", null, \"null\"].includes(detail)) {\n        extra = \"\";\n      } else {\n        extra = ` (${detail})`;\n      }\n\n      if (\n        datasetparameters[j][\"axis\"].includes(\"x\") &&\n        datasetparameters[j].parameters_id !== 27\n      ) {\n        xoptions.push({\n          value: datasetparameters[j][\"axis\"],\n          label: datasetparameters[j][\"name\"] + extra,\n          id: datasetparameters[j][\"parameters_id\"],\n          unit: datasetparameters[j][\"unit\"],\n        });\n      } else if (\n        datasetparameters[j][\"axis\"].includes(\"y\") &&\n        datasetparameters[j].parameters_id !== 27\n      ) {\n        yoptions.push({\n          value: datasetparameters[j][\"axis\"],\n          label: datasetparameters[j][\"name\"] + extra,\n          id: datasetparameters[j][\"parameters_id\"],\n          unit: datasetparameters[j][\"unit\"],\n        });\n      } else if (datasetparameters[j][\"axis\"].includes(\"z\")) {\n        if (\n          xdp.shape[0] === datasetparameters[j].shape[1] &&\n          ydp.shape[0] === datasetparameters[j].shape[0] &&\n          datasetparameters[j].parameters_id !== 27\n        ) {\n          graph = \"heatmap\";\n          zoptions.push({\n            value: datasetparameters[j][\"axis\"],\n            label: datasetparameters[j][\"name\"] + extra,\n          });\n        }\n      }\n    }\n    return { xoptions, yoptions, zoptions, graph, yReverse, xReverse };\n  };\n\n  getAxisLabels = (datasetparameters, xaxis, yaxis, zaxis) => {\n    var xdp = datasetparameters.find((dp) => dp.axis === xaxis[0]);\n    var ydp = datasetparameters.find((dp) => dp.axis === yaxis[0]);\n    var zdp = datasetparameters.find((dp) => dp.axis === zaxis);\n\n    var xlabel = xdp ? xdp.name : \"\";\n    var ylabel = ydp ? ydp.name : \"\";\n    var zlabel = zdp ? zdp.name : \"\";\n\n    var xunits = xdp ? xdp.unit : \"\";\n    var yunits = ydp ? ydp.unit : \"\";\n    var zunits = zdp ? zdp.unit : \"\";\n\n    return { xlabel, ylabel, zlabel, xunits, yunits, zunits };\n  };\n\n  handleAxisAppend = (event) => {\n    var { xaxis, yaxis, zaxis } = this.state;\n    if (event.includes(\"x\")) {\n      if (xaxis.includes(event)) {\n        xaxis = xaxis.filter((x) => x !== event);\n      } else {\n        xaxis.push(event);\n      }\n    }\n    if (event.includes(\"y\")) {\n      if (yaxis.includes(event)) {\n        yaxis = yaxis.filter((y) => y !== event);\n      } else {\n        yaxis.push(event);\n      }\n    }\n    this.axisEdit(xaxis, yaxis, zaxis);\n  };\n\n  handleAxisSelect = (event) => {\n    var { xaxis, yaxis, zaxis } = this.state;\n    if (event.value.includes(\"x\")) xaxis = [event.value];\n    if (event.value.includes(\"y\")) yaxis = [event.value];\n    if (event.value.includes(\"z\")) zaxis = event.value;\n    this.axisEdit(xaxis, yaxis, zaxis);\n  };\n\n  axisEdit = (xaxis, yaxis, zaxis) => {\n    var { datasetparameters, data } = this.props;\n    var { timeaxis, lowerY, lowerX, upperY, upperX } = this.state;\n    var { xoptions, yoptions, zoptions, graph, yReverse, xReverse } =\n      this.setAxisOptions(datasetparameters, xaxis, yaxis);\n    if (zoptions.length > 0 && !zoptions.map((z) => z.value).includes(zaxis))\n      zaxis = zoptions[0].value;\n    var { xlabel, ylabel, zlabel, xunits, yunits, zunits } = this.getAxisLabels(\n      datasetparameters,\n      xaxis,\n      yaxis,\n      zaxis\n    );\n    var { minX, maxX, minY, maxY } = this.getBounds(\n      data,\n      xaxis,\n      yaxis,\n      timeaxis\n    );\n    if (timeaxis !== \"x\") {\n      upperX = maxX;\n      lowerX = minX;\n    }\n    if (timeaxis !== \"y\") {\n      upperY = maxY;\n      lowerY = minY;\n    }\n\n    this.setState({\n      xaxis,\n      yaxis,\n      zaxis,\n      xoptions,\n      yoptions,\n      zoptions,\n      graph,\n      xlabel,\n      ylabel,\n      zlabel,\n      xunits,\n      yunits,\n      zunits,\n      upperX,\n      lowerX,\n      upperY,\n      lowerY,\n      yReverse,\n      xReverse,\n      minX,\n      maxX,\n      minY,\n      maxY,\n      refresh: true,\n    });\n  };\n\n  maskArray = (arr, maskArr, mask) => {\n    var out = [];\n    if (mask && isArray(maskArr) && arr.length === maskArr.length) {\n      if (isArray(arr[0])) {\n        for (let i = 0; i < arr.length; i++) {\n          let inner = [];\n          for (let j = 0; j < arr[i].length; j++) {\n            if (maskArr[i][j] === 0) {\n              inner.push(arr[i][j]);\n            } else {\n              inner.push(null);\n            }\n          }\n          out.push(inner);\n        }\n      } else {\n        for (let i = 0; i < arr.length; i++) {\n          if (maskArr[i] < 1) {\n            out.push(arr[i]);\n          } else {\n            out.push(null);\n          }\n        }\n      }\n      return out;\n    } else {\n      return arr;\n    }\n  };\n\n  addMaintenance = (data, mask, time, maintenance) => {\n    if (mask === undefined) {\n      if (isArray(data[0])) {\n        mask = Array(data.length)\n          .fill()\n          .map(() => Array(data[0].length).fill(0));\n      } else {\n        mask = new Array(time.length).fill(0);\n      }\n    }\n    for (let i = 0; i < time.length; i++) {\n      for (let j = 0; j < maintenance.length; j++) {\n        if (maintenance[j].start < time[i] && time[i] < maintenance[j].end) {\n          if (isArray(data[0])) {\n            if (time.length === data.length) {\n              for (let k = 0; k < data.length; k++) {\n                mask[i][k] = 1;\n              }\n            } else if (time.length === data[0].length) {\n              for (let k = 0; k < data.length; k++) {\n                mask[k][i] = 1;\n              }\n            }\n          } else {\n            mask[i] = 1;\n          }\n        }\n      }\n    }\n    return mask;\n  };\n\n  selectAxisAndMask = (\n    data,\n    files,\n    file,\n    xaxis,\n    yaxis,\n    zaxis,\n    dp,\n    mask,\n    timeaxis,\n    maintenance,\n    graph\n  ) => {\n    var plotdata = [];\n    var maskaxis = [];\n    var axis = [].concat.apply([], [xaxis, yaxis, zaxis]);\n    const findaxis = (dp, ax) => {\n      return dp.find((p) => p.axis === ax);\n    };\n    const findmask = (dp, axp) => {\n      return dp.find((dp) => dp.link === axp.id && dp.parameters_id === 27);\n    };\n    for (var ax of axis) {\n      var axp = findaxis(dp, ax);\n      if (axp && findmask(dp, axp)) {\n        maskaxis.push(findmask(dp, axp)[\"axis\"]);\n      } else {\n        maskaxis.push(false);\n      }\n    }\n\n    var iter, pd, j;\n    if (files[file[0]].connect === \"ind\") {\n      iter = file;\n    } else {\n      iter = [...Array(data.length).keys()];\n    }\n\n    try {\n      var maintenance_ids = maintenance.map((m) => m.datasetparameters_id);\n      if (graph === \"linegraph\") {\n        if (String([timeaxis]) === String(xaxis)) {\n          for (let i = 0; i < yaxis.length; i++) {\n            let a = dp.find((d) => d.axis === yaxis[i]).id;\n            if (maintenance_ids.includes(a)) {\n              let idx = axis.findIndex((e) => e === yaxis[i]);\n              let m = maintenance.filter((m) => m.datasetparameters_id === a);\n              for (let i of iter) {\n                if (data[i] !== 0) {\n                  if (maskaxis[idx] === false) {\n                    maskaxis[idx] = axis[idx] + \"_qual\";\n                  }\n                  data[i][maskaxis[idx]] = this.addMaintenance(\n                    data[i][axis[idx]],\n                    data[i][maskaxis[idx]],\n                    data[i][timeaxis],\n                    m\n                  );\n                }\n              }\n            }\n          }\n        }\n      } else if (graph === \"heatmap\") {\n        if (String([timeaxis]) === String(xaxis)) {\n          let a = dp.find((d) => d.axis === zaxis).id;\n          if (maintenance_ids.includes(a)) {\n            let idx = axis.findIndex((e) => e === zaxis);\n            let m = maintenance.filter(\n              (m) => m.datasetparameters_id === a && m.depths === \"\"\n            );\n            for (let i of iter) {\n              if (data[i] !== 0) {\n                if (maskaxis[idx] === false) {\n                  maskaxis[idx] = axis[i] + \"_qual\";\n                }\n                data[i][maskaxis[idx]] = this.addMaintenance(\n                  data[i][axis[idx]],\n                  data[i][maskaxis[idx]],\n                  data[i][timeaxis],\n                  m\n                );\n              }\n            }\n          }\n        }\n      }\n    } catch (e) {\n      console.error(\"Failed to add maintenace periods.\");\n      console.error(e);\n    }\n\n    for (let i of iter) {\n      if (data[i] !== 0) {\n        pd = {};\n        for (j = 0; j < axis.length; j++) {\n          if (maskaxis) {\n            pd[axis[j]] = this.maskArray(\n              data[i][axis[j]],\n              data[i][maskaxis[j]],\n              mask\n            );\n          } else {\n            pd[axis[j]] = data[i][axis[j]];\n          }\n        }\n        plotdata.push(pd);\n      }\n    }\n\n    return plotdata;\n  };\n\n  formatTime = (plotdata, datasetparameters, xaxis, yaxis) => {\n    var xdp = datasetparameters.find((dp) => dp.axis === xaxis);\n    var ydp = datasetparameters.find((dp) => dp.axis === yaxis);\n\n    if (xdp.parameters_id === 1) {\n      if (isArray(plotdata)) {\n        for (let i = 0; i < plotdata.length; i++) {\n          plotdata[i].x = plotdata[i].x.map((pdx) => new Date(pdx * 1000));\n        }\n      } else {\n        plotdata.x = plotdata.x.map((pdx) => new Date(pdx * 1000));\n      }\n    }\n    if (ydp.parameters_id === 1) {\n      if (isArray(plotdata)) {\n        for (let i = 0; i < plotdata.length; i++) {\n          plotdata[i].y = plotdata[i].y.map((pdy) => new Date(pdy * 1000));\n        }\n      } else {\n        plotdata.y = plotdata.y.map((pdy) => new Date(pdy * 1000));\n      }\n    }\n    return plotdata;\n  };\n\n  joinData = (plotdata, graph, xaxis, yaxis, zaxis, connect, timeaxis) => {\n    if (graph === \"linegraph\") {\n      if (isArray(plotdata) && connect === \"join\") {\n        plotdata = this.joinLinegraphData(plotdata, xaxis, yaxis, timeaxis);\n      }\n      if ((xaxis.length > 1 || yaxis.length > 1) && plotdata.length === 1) {\n        plotdata = this.reorderMultipleLines(plotdata, xaxis, yaxis);\n      }\n    } else if (graph === \"heatmap\") {\n      if (isArray(plotdata) && connect === \"join\") {\n        plotdata = this.joinHeatmapData(plotdata, xaxis, yaxis, zaxis);\n      }\n    }\n    return this.relabelDataObject(plotdata);\n  };\n\n  reorderMultipleLines = (plotdata, xaxis, yaxis) => {\n    var lines = [];\n    var ax;\n    if (xaxis.length > 1) {\n      for (ax of xaxis) {\n        lines.push({\n          x: plotdata[0][ax],\n          y: plotdata[0][yaxis[0]],\n          z: undefined,\n        });\n      }\n    } else if (yaxis.length > 1) {\n      for (ax of yaxis) {\n        lines.push({\n          y: plotdata[0][ax],\n          x: plotdata[0][xaxis[0]],\n          z: undefined,\n        });\n      }\n    }\n    return lines;\n  };\n\n  relabelDataObject = (plotdata) => {\n    var data = [];\n    for (var i = 0; i < plotdata.length; i++) {\n      var keys = Object.keys(plotdata[i]);\n      data.push({\n        x: plotdata[i][keys.filter((k) => k.includes(\"x\"))[0]],\n        y: plotdata[i][keys.filter((k) => k.includes(\"y\"))[0]],\n        z: plotdata[i][keys.filter((k) => k.includes(\"z\"))[0]],\n      });\n    }\n    return data;\n  };\n\n  joinLinegraphData(plotdata, xaxis, yaxis, timeaxis) {\n    var ax;\n    var data = [];\n    var axis = [].concat.apply([], [xaxis, yaxis]);\n    for (var i = 0; i < plotdata.length; i++) {\n      for (var j = 0; j < plotdata[i][xaxis[0]].length; j++) {\n        var pd = {};\n        for (ax of axis) {\n          pd[ax] = plotdata[i][ax][j];\n        }\n        data.push(pd);\n      }\n    }\n    if (timeaxis === \"x\") {\n      data.sort((a, b) =>\n        a[xaxis[0]] > b[xaxis[0]] ? 1 : b[xaxis[0]] > a[xaxis[0]] ? -1 : 0\n      );\n      data = data.filter((d) => d[xaxis] !== null);\n    } else if (timeaxis === \"y\") {\n      data.sort((a, b) =>\n        a[yaxis[0]] > b[yaxis[0]] ? 1 : b[yaxis[0]] > a[yaxis[0]] ? -1 : 0\n      );\n      data = data.filter((d) => d[yaxis] !== null);\n    }\n    var out = { z: undefined };\n    for (ax of axis) {\n      out[ax] = [];\n    }\n    for (var k = 0; k < data.length; k++) {\n      for (ax of axis) {\n        out[ax].push(data[k][ax]);\n      }\n    }\n    return [out];\n  }\n\n  joinHeatmapData(data, xaxis, yaxis, zaxis) {\n    if (data.length > 1) {\n      if (\n        data.every(\n          (d) =>\n            JSON.stringify(d[yaxis[0]]) === JSON.stringify(data[0][yaxis[0]])\n        )\n      ) {\n        var dataJoined = JSON.parse(JSON.stringify(data[0]));\n        for (let i = 1; i < data.length; i++) {\n          if (\n            data[i][xaxis[0]].length === data[i][zaxis][0].length &&\n            data[i][yaxis[0]].length === data[i][zaxis].length\n          ) {\n            let minB = Math.min(...data[i - 1][xaxis[0]]);\n            let maxB = Math.max(...data[i - 1][xaxis[0]]);\n            let minA = Math.min(...data[i][xaxis[0]]);\n            let maxA = Math.max(...data[i][xaxis[0]]);\n            if (minA > maxB) {\n              dataJoined[xaxis[0]] = dataJoined[xaxis[0]].concat(\n                data[i][xaxis[0]]\n              );\n              dataJoined[zaxis] = dataJoined[zaxis].map((d, index) =>\n                d.concat(data[i][zaxis][index])\n              );\n            } else if (minB > maxA) {\n              dataJoined[xaxis[0]] = data[i][xaxis[0]].concat(\n                dataJoined[xaxis[0]]\n              );\n              dataJoined[zaxis] = data[i][zaxis].map((d, index) =>\n                d.concat(dataJoined[zaxis][index])\n              );\n            } else {\n              return data;\n            }\n          }\n        }\n        return [dataJoined];\n      }\n    }\n    return data;\n  }\n\n  roundFactor = (dt, factor) => {\n    var year = dt.getFullYear();\n    var month = dt.getMonth();\n    var day = dt.getDate();\n    var hours = dt.getHours();\n    if (factor === \"Hourly\") {\n      return new Date(year, month, day, hours);\n    } else if (factor === \"Daily\") {\n      return new Date(year, month, day);\n    } else if (factor === \"Monthly\") {\n      return new Date(year, month, 0);\n    } else if (factor === \"Yearly\") {\n      return new Date(year, 0, 0);\n    } else {\n      return dt;\n    }\n  };\n\n  average1D = (arr, factor, tx) => {\n    var ox = \"y\";\n    if (tx === \"y\") ox = \"x\";\n    var data = {};\n    var value;\n    for (var i = 0; i < arr[tx].length; i++) {\n      value = this.roundFactor(arr[tx][i], factor).getTime();\n      if (value in data) {\n        data[value].push(arr[ox][i]);\n      } else {\n        data[value] = [arr[ox][i]];\n      }\n    }\n    var arrDict = [];\n    for (var key in data) {\n      arrDict.push({\n        [tx]: new Date(parseInt(key)),\n        [ox]: this.average(data[key]),\n      });\n    }\n    arrDict.sort((a, b) => (a[tx] > b[tx] ? 1 : b[tx] > a[tx] ? -1 : 0));\n    var x = [];\n    var y = [];\n    for (var k = 0; k < arrDict.length; k++) {\n      x.push(arrDict[k].x);\n      y.push(arrDict[k].y);\n    }\n    return { x, y, z: undefined };\n  };\n\n  average2D = (arr, factor, tx, bounds) => {\n    var ox = \"y\";\n    var data = {};\n    var arrDict = [];\n    var value, x, y, z;\n    if (tx === \"x\") {\n      for (let i = 0; i < arr[tx].length; i++) {\n        value = this.roundFactor(arr[tx][i], factor).getTime();\n        if (value in data) {\n          for (let j = 0; j < arr[ox].length; j++) {\n            data[value][j].push(arr.z[j][i]);\n          }\n        } else {\n          data[value] = [];\n          for (let j = 0; j < arr[ox].length; j++) {\n            data[value].push([arr.z[j][i]]);\n          }\n        }\n      }\n      for (let key in data) {\n        arrDict.push({\n          [tx]: new Date(parseInt(key)),\n          z: data[key].map((d) => this.average(d)),\n        });\n      }\n      arrDict.sort((a, b) => (a[tx] > b[tx] ? 1 : b[tx] > a[tx] ? -1 : 0));\n      x = [];\n      y = arr[ox];\n      z = [...Array(y.length)].map((x) => []);\n      for (let i = 0; i < arrDict.length; i++) {\n        x.push(arrDict[i].x);\n        for (let j = 0; j < arr[ox].length; j++) {\n          z[j].push(arrDict[i].z[j]);\n        }\n      }\n      return { x, y, z };\n    } else if (tx === \"y\") {\n      ox = \"x\";\n      for (let i = 0; i < arr[tx].length; i++) {\n        value = this.roundFactor(arr[tx][i], factor).getTime();\n        if (value in data) {\n          data[value].push(arr.z[i]);\n        } else {\n          data[value] = [arr.z[i]];\n        }\n      }\n      for (let key in data) {\n        let zz = [];\n        for (let i = 0; i < arr[ox].length; i++) {\n          let zt = [];\n          for (let j = 0; j < data[key].length; j++) {\n            zt.push(data[key][j][i]);\n          }\n          zz.push(this.average(zt));\n        }\n        arrDict.push({\n          [tx]: new Date(parseInt(key)),\n          z: zz,\n        });\n      }\n      arrDict.sort((a, b) => (a[tx] > b[tx] ? 1 : b[tx] > a[tx] ? -1 : 0));\n      x = arr[ox];\n      y = [];\n      z = [];\n      for (let i = 0; i < arrDict.length; i++) {\n        y.push(arrDict[i].y);\n        z.push(arrDict[i].z);\n      }\n      return { x, y, z };\n    } else {\n      return arr;\n    }\n  };\n\n  averageData = (plotdata, timeaxis, average, graph, bounds) => {\n    var out;\n    if ((plotdata && [\"x\", \"y\"].includes(timeaxis), average !== \"None\")) {\n      if (graph === \"linegraph\") {\n        if (Array.isArray(plotdata)) {\n          out = [];\n          for (let i = 0; i < plotdata.length; i++) {\n            out.push(this.average1D(plotdata[i], average, timeaxis));\n          }\n        } else {\n          out = this.average1D(plotdata, average, timeaxis);\n        }\n        return out;\n      } else if (graph === \"heatmap\") {\n        if (Array.isArray(plotdata)) {\n          out = [];\n          for (let i = 0; i < plotdata.length; i++) {\n            out.push(this.average2D(plotdata[i], average, timeaxis, bounds));\n          }\n        } else {\n          out = this.average2D(plotdata, average, timeaxis, bounds);\n        }\n        return out;\n      } else {\n        return plotdata;\n      }\n    } else {\n      return plotdata;\n    }\n  };\n\n  decimate1D = (arr, factor) => {\n    var x = [];\n    var y = [];\n    for (let i = 0; i < arr.x.length; i = i + factor) {\n      if (arr.x[i]) {\n        x.push(arr.x[i]);\n        y.push(arr.y[i]);\n      }\n    }\n    return { x, y, z: undefined };\n  };\n\n  decimate2D = (arr, factor, timeaxis) => {\n    var x, y, z;\n    if (timeaxis === \"x\") {\n      y = arr.y;\n      x = [];\n      z = [...Array(arr.y.length)].map((x) => []);\n      for (let i = 0; i < arr.x.length; i = i + factor) {\n        if (arr.x[i]) {\n          x.push(arr.x[i]);\n          for (let j = 0; j < arr.y.length; j++) {\n            z[j].push(arr.z[j][i]);\n          }\n        }\n      }\n      return { x, y, z };\n    } else if (timeaxis === \"y\") {\n      x = arr.x;\n      y = [];\n      z = [];\n      for (let i = 0; i < arr.y.length; i = i + factor) {\n        if (arr.y[i]) {\n          y.push(arr.y[i]);\n          z.push(arr.z[i]);\n        }\n      }\n      return { x, y, z };\n    } else {\n      return arr;\n    }\n  };\n\n  decimateData = (plotdata, timeaxis, decimate, graph) => {\n    var out;\n    if (decimate > 1 && isInteger(decimate) && plotdata) {\n      if (graph === \"linegraph\") {\n        if (Array.isArray(plotdata)) {\n          out = [];\n          for (let i = 0; i < plotdata.length; i++) {\n            out.push(this.decimate1D(plotdata[i], decimate));\n          }\n        } else {\n          out = this.decimate1D(plotdata, decimate);\n        }\n        return out;\n      } else if (graph === \"heatmap\") {\n        if (Array.isArray(plotdata)) {\n          out = [];\n          for (let i = 0; i < plotdata.length; i++) {\n            out.push(this.decimate2D(plotdata[i], decimate, timeaxis));\n          }\n        } else {\n          out = this.decimate2D(plotdata, decimate, timeaxis);\n        }\n        return out;\n      } else {\n        return plotdata;\n      }\n    } else {\n      return plotdata;\n    }\n  };\n\n  sliceXArray = (data, lower, upper) => {\n    var y = data.y;\n    var x = [];\n    var z = [];\n    var mask = [];\n    if (data.z && data.y) {\n      for (var i = 0; i < data.x.length; i++) {\n        if (data.x[i] >= lower && data.x[i] <= upper) {\n          x.push(data.x[i]);\n          mask.push(true);\n        } else {\n          mask.push(false);\n        }\n      }\n      for (var j = 0; j < data.y.length; j++) {\n        z.push(data.z[j].filter((item, i) => mask[i]));\n      }\n    }\n    if (x.length > 0) {\n      return { x: x, y: y, z: z };\n    } else {\n      return false;\n    }\n  };\n\n  sliceYArray = (data, lower, upper) => {\n    var x = data.x;\n    var y = [];\n    var z = [];\n    if (data.z && data.y) {\n      for (var i = 0; i < data.y.length; i++) {\n        if (data.y[i] >= lower && data.y[i] <= upper) {\n          y.push(data.y[i]);\n          z.push(data.z[i]);\n        }\n      }\n    }\n    if (y.length > 0) {\n      return { x: x, y: y, z: z };\n    } else {\n      return false;\n    }\n  };\n\n  sliceXYArray = (\n    data,\n    lowerX,\n    upperX,\n    lowerY,\n    upperY,\n    minX,\n    maxX,\n    minY,\n    maxY\n  ) => {\n    var x = [];\n    var y = [];\n    if (upperX < maxX || lowerX > minX) {\n      for (let i = 0; i < data.x.length; i++) {\n        if (data.x[i] >= lowerX && data.x[i] <= upperX) {\n          x.push(data.x[i]);\n          y.push(data.y[i]);\n        }\n      }\n    } else {\n      x = data.x;\n      y = data.y;\n    }\n    var d = { x, y };\n    x = [];\n    y = [];\n    if (upperY < maxY || lowerY > minY) {\n      for (let i = 0; i < d.y.length; i++) {\n        if (d.y[i] >= lowerY && d.y[i] <= upperY) {\n          x.push(d.x[i]);\n          y.push(d.y[i]);\n        }\n      }\n    } else {\n      x = d.x;\n      y = d.y;\n    }\n    return { x, y, z: undefined };\n  };\n\n  sliceData = (\n    plotdata,\n    graph,\n    upperX,\n    lowerX,\n    upperY,\n    lowerY,\n    minX,\n    maxX,\n    minY,\n    maxY,\n    connect\n  ) => {\n    if (graph === \"linegraph\") {\n      if (Array.isArray(plotdata)) {\n        var dataout = [];\n        for (let i = 0; i < plotdata.length; i++) {\n          let slice = this.sliceXYArray(\n            plotdata[i],\n            lowerX,\n            upperX,\n            lowerY,\n            upperY,\n            minX,\n            maxX,\n            minY,\n            maxY\n          );\n          if (slice) dataout.push(slice);\n        }\n        plotdata = dataout;\n      } else {\n        plotdata = this.sliceXYArray(\n          plotdata,\n          lowerX,\n          upperX,\n          lowerY,\n          upperY,\n          minX,\n          maxX,\n          minY,\n          maxY\n        );\n      }\n      return plotdata;\n    } else if (graph === \"heatmap\") {\n      if (upperX < maxX || lowerX > minX) {\n        if (Array.isArray(plotdata)) {\n          var dataoutX = [];\n          for (let i = 0; i < plotdata.length; i++) {\n            let slice = this.sliceXArray(plotdata[i], lowerX, upperX);\n            if (slice) dataoutX.push(slice);\n          }\n          plotdata = dataoutX;\n        } else {\n          plotdata = this.sliceXArray(plotdata, lowerX, upperX);\n        }\n      }\n      if (upperY < maxY || lowerY > minY) {\n        if (Array.isArray(plotdata)) {\n          var dataoutY = [];\n          for (let i = 0; i < plotdata.length; i++) {\n            let slice = this.sliceYArray(plotdata[i], lowerY, upperY);\n            if (slice) dataoutY.push(slice);\n          }\n          plotdata = dataoutY;\n        } else {\n          plotdata = this.sliceYArray(plotdata, lowerY, upperY);\n        }\n      }\n      return plotdata;\n    } else {\n      return plotdata;\n    }\n  };\n\n  addGaps = (obj, timeaxis, gap) => {\n    if (timeaxis === \"x\" && obj) {\n      if (!Array.isArray(obj)) obj = [obj];\n      for (let i = 0; i < obj.length; i++) {\n        for (let j = 1; j < obj[i].x.length; j++) {\n          if (\n            obj[i].x[j].getTime() - obj[i].x[j - 1].getTime() >\n            gap * 60 * 60 * 1000\n          ) {\n            obj[i].x.splice(\n              j,\n              0,\n              new Date(obj[i].x[j - 1].getTime() + 60 * 1000)\n            );\n            obj[i].z.map((z) => z.splice(j, 0, null));\n            obj[i].x.splice(\n              j + 1,\n              0,\n              new Date(obj[i].x[j + 1].getTime() - 60 * 1000)\n            );\n            obj[i].z.map((z) => z.splice(j + 1, 0, null));\n            j = j + 2;\n          }\n        }\n      }\n      return obj;\n    } else if (timeaxis === \"y\" && obj) {\n      if (!Array.isArray(obj)) obj = [obj];\n      for (let i = 0; i < obj.length; i++) {\n        for (let j = 1; j < obj[i].y.length; j++) {\n          if (\n            obj[i].y[j].getTime() - obj[i].y[j - 1].getTime() >\n            gap * 60 * 60 * 1000\n          ) {\n            obj[i].y.splice(\n              j,\n              0,\n              new Date(obj[i].y[j - 1].getTime() + 60 * 1000)\n            );\n            obj[i].z.splice(j, 0, Array(obj[i].x.length).fill(null));\n            obj[i].y.splice(\n              j + 1,\n              0,\n              new Date(obj[i].y[j + 1].getTime() - 60 * 1000)\n            );\n            obj[i].z.splice(j, 0, Array(obj[i].x.length).fill(null));\n            j = j + 2;\n          }\n        }\n      }\n      return obj;\n    } else {\n      return obj;\n    }\n  };\n\n  processPlotData = (\n    xaxis,\n    yaxis,\n    zaxis,\n    upperY,\n    lowerY,\n    maxY,\n    minY,\n    upperX,\n    lowerX,\n    minX,\n    maxX,\n    decimate,\n    average,\n    datasetparameters,\n    timeaxis,\n    graph,\n    interpolate\n  ) => {\n    var { mask, gap } = this.state;\n    var { data, files, file, maintenance } = this.props;\n\n    var plotdata = this.selectAxisAndMask(\n      data,\n      files,\n      file,\n      xaxis,\n      yaxis,\n      zaxis,\n      datasetparameters,\n      mask,\n      timeaxis,\n      maintenance,\n      graph\n    );\n\n    var { minZ: lowerZ, maxZ: upperZ } = this.getZBounds(plotdata);\n\n    plotdata = this.joinData(\n      plotdata,\n      graph,\n      xaxis,\n      yaxis,\n      zaxis,\n      files[file[0]].connect,\n      timeaxis\n    );\n\n    try {\n      plotdata = this.sliceData(\n        plotdata,\n        graph,\n        upperX,\n        lowerX,\n        upperY,\n        lowerY,\n        minX,\n        maxX,\n        minY,\n        maxY,\n        files[file[0]].connect\n      );\n    } catch (e) {\n      console.error(e);\n    }\n\n    try {\n      plotdata = this.decimateData(plotdata, timeaxis, decimate, graph);\n    } catch (e) {\n      console.error(e);\n    }\n    try {\n      plotdata = this.formatTime(\n        plotdata,\n        datasetparameters,\n        xaxis[0],\n        yaxis[0]\n      );\n      try {\n        plotdata = this.averageData(plotdata, timeaxis, average, graph, {\n          lowerX,\n          lowerY,\n          upperX,\n          upperY,\n        });\n      } catch (e) {\n        console.error(e);\n      }\n    } catch (e) {\n      console.error(e);\n    }\n\n    try {\n      plotdata = this.addGaps(plotdata, timeaxis, gap);\n    } catch (e) {\n      console.error(e);\n    }\n\n    try {\n      plotdata = this.interpolate2D(plotdata, interpolate, graph);\n    } catch (e) {\n      console.error(e);\n    }\n\n    return { plotdata, lowerZ, upperZ };\n  };\n\n  interpolate2D = (obj, interpolate, graph) => {\n    if (graph === \"heatmap\" && interpolate !== \"none\") {\n      if (!Array.isArray(obj)) obj = [obj];\n      for (let i = 0; i < obj.length; i++) {\n        obj[i] = interp2(obj[i].x, obj[i].y, obj[i].z, interpolate);\n      }\n    }\n    return obj;\n  };\n\n  filterData = (arr) => {\n    if (Array.isArray(arr)) {\n      var data = [];\n      for (let i = 0; i < arr.length; i++) {\n        if (!isNaN(parseFloat(arr[i])) && isFinite(arr[i])) {\n          data.push(arr[i]);\n        }\n      }\n      return arr;\n    } else {\n      return [];\n    }\n  };\n\n  getInitialBounds = (dataset, data, file, xaxis, yaxis, zaxis) => {\n    var { maxdatetime, mindatetime, datasetparameters } = this.props;\n    var timeaxis = \"x\";\n    if (\n      datasetparameters\n        .filter((dp) => dp.axis.includes(\"y\"))\n        .map((d) => d.parameters_id)\n        .includes(1)\n    )\n      timeaxis = \"y\";\n    if (datasetparameters.map((d) => d.axis).includes(\"M\")) timeaxis = \"M\";\n\n    const title = dataset.title;\n    var colors = this.parseColor(dataset.plotproperties.colors);\n    var zdomain = d3.extent(this.filterData(data[file[0]][zaxis]).flat());\n\n    var yextents = [];\n    for (var ya of yaxis) {\n      yextents = yextents.concat(d3.extent(this.filterData(data[file[0]][ya])));\n    }\n    var ydomain = d3.extent(yextents);\n\n    var xextents = [];\n    for (var xa of xaxis) {\n      xextents = xextents.concat(d3.extent(this.filterData(data[file[0]][xa])));\n    }\n    var xdomain = d3.extent(xextents);\n\n    var minZ = zdomain[0] || 0;\n    var maxZ = zdomain[1] || 1;\n    var minY = ydomain[0];\n    var maxY = ydomain[1];\n    var minX = xdomain[0];\n    var maxX = xdomain[1];\n    var lowerY = minY;\n    var upperY = maxY;\n    var lowerX = minX;\n    var upperX = maxX;\n    var lowerZ = minZ;\n    var upperZ = maxZ;\n    if (timeaxis === \"x\" && maxdatetime && mindatetime) {\n      minX = Math.min(minX, mindatetime);\n      maxX = Math.max(maxX, maxdatetime);\n    }\n\n    if (timeaxis === \"y\" && maxdatetime && mindatetime) {\n      minY = Math.min(minY, mindatetime);\n      maxY = Math.max(maxY, maxdatetime);\n    }\n\n    return {\n      title,\n      colors,\n      minZ,\n      maxZ,\n      minY,\n      maxY,\n      minX,\n      maxX,\n      lowerY,\n      upperY,\n      lowerX,\n      upperX,\n      lowerZ,\n      upperZ,\n      timeaxis,\n    };\n  };\n\n  getZBounds = (plotdata) => {\n    var minZ = Infinity;\n    var maxZ = -Infinity;\n    var pd = plotdata;\n    if (!isArray(plotdata)) {\n      pd = [pd];\n    }\n    for (var i = 0; i < pd.length; i++) {\n      let zdomain = d3.extent(this.filterData(pd[i].z).flat());\n      minZ = Math.min(zdomain[0], minZ);\n      maxZ = Math.max(zdomain[1], maxZ);\n    }\n    return { minZ, maxZ };\n  };\n\n  getBounds = (data, xaxis, yaxis, timeaxis) => {\n    var { maxdatetime, mindatetime } = this.props;\n    var minX = Infinity;\n    var maxX = -Infinity;\n    var minY = Infinity;\n    var maxY = -Infinity;\n    for (var i = 0; i < data.length; i++) {\n      if (data[i] !== 0) {\n        let xdomain = d3.extent(this.filterData(data[i][xaxis]));\n        let ydomain = d3.extent(this.filterData(data[i][yaxis]));\n        minX = Math.min(xdomain[0], minX);\n        maxX = Math.max(xdomain[1], maxX);\n        minY = Math.min(ydomain[0], minY);\n        maxY = Math.max(ydomain[1], maxY);\n      }\n    }\n\n    if (timeaxis === \"x\" && maxdatetime && mindatetime) {\n      minX = Math.min(minX, mindatetime);\n      maxX = Math.max(maxX, maxdatetime);\n    }\n\n    if (timeaxis === \"y\" && maxdatetime && mindatetime) {\n      minY = Math.min(minY, mindatetime);\n      maxY = Math.max(maxY, maxdatetime);\n    }\n\n    return { minX, maxX, minY, maxY };\n  };\n\n  processUrlAxis = (url, datasetparameters, xaxis, yaxis, zaxis) => {\n    var search = url.replace(\"?\", \"\").split(\"&\");\n    var validAxis = datasetparameters.map((d) => d.axis);\n    for (let s of search) {\n      if (s.includes(\"axis\")) {\n        try {\n          var xxaxis = [];\n          var yyaxis = [];\n          let axis = s\n            .replace(\"axis:[\", \"\")\n            .replace(\"axis:(\", \"\")\n            .replace(\"axis:%5B\", \"\")\n            .replace(\"axis:%5b\", \"\")\n            .replace(\"]\", \"\")\n            .replace(\")\", \"\")\n            .replace(\"%5D\", \"\")\n            .replace(\"%5d\", \"\")\n            .split(\",\");\n          for (let a of axis) {\n            if (validAxis.includes(a)) {\n              if (a.includes(\"x\")) xxaxis.push(a);\n              if (a.includes(\"y\")) yyaxis.push(a);\n              if (a.includes(\"z\")) zaxis = a;\n            }\n          }\n          xaxis = xxaxis;\n          yaxis = yyaxis;\n        } catch (e) {\n          console.error(\"Failed to parse axis from url\");\n        }\n      }\n    }\n    return { xaxis, yaxis, zaxis };\n  };\n\n  processUrlBounds = (url, lowerX, upperX) => {\n    if (url.includes(\"&latest\")) {\n      let newLower = upperX - 7 * 24 * 60 * 60;\n      if (newLower > lowerX) lowerX = newLower;\n    }\n    return { lowerX, upperX };\n  };\n\n  componentDidMount() {\n    var { datasetparameters, dataset, file, data } = this.props;\n    var {\n      xaxis,\n      yaxis,\n      zaxis,\n      decimate,\n      average,\n      display,\n      thresholdStep,\n      plotdots,\n      interpolate,\n    } = this.state;\n\n    if (data[0] === false) {\n      this.setState({ failed: true });\n    } else {\n      ({ xaxis, yaxis, zaxis } = this.processUrlAxis(\n        this.props.search,\n        datasetparameters,\n        xaxis,\n        yaxis,\n        zaxis\n      ));\n\n      var { xoptions, yoptions, zoptions, graph, yReverse, xReverse } =\n        this.setAxisOptions(datasetparameters, xaxis, yaxis);\n\n      var { xlabel, ylabel, zlabel, xunits, yunits, zunits } =\n        this.getAxisLabels(datasetparameters, xaxis, yaxis, zaxis);\n\n      var {\n        title,\n        colors,\n        minY,\n        maxY,\n        minX,\n        maxX,\n        minZ,\n        maxZ,\n        lowerY,\n        upperY,\n        lowerX,\n        upperX,\n        timeaxis,\n      } = this.getInitialBounds(dataset, data, file, xaxis, yaxis, zaxis);\n\n      ({ lowerX, upperX } = this.processUrlBounds(\n        this.props.search,\n        lowerX,\n        upperX\n      ));\n\n      if (\"interpolate\" in dataset.plotproperties)\n        interpolate = dataset.plotproperties.interpolate;\n\n      var { plotdata, lowerZ, upperZ } = this.processPlotData(\n        xaxis,\n        yaxis,\n        zaxis,\n        upperY,\n        lowerY,\n        maxY,\n        minY,\n        upperX,\n        lowerX,\n        minX,\n        maxX,\n        decimate,\n        average,\n        datasetparameters,\n        timeaxis,\n        graph,\n        interpolate\n      );\n\n      if (\"display\" in dataset.plotproperties)\n        display = dataset.plotproperties.display;\n      if (\"thresholdStep\" in dataset.plotproperties)\n        thresholdStep = dataset.plotproperties.thresholdStep;\n      if (plotdata[0].x.length < 100) plotdots = true;\n\n      this.setState({\n        plotdata,\n        xaxis,\n        yaxis,\n        zaxis,\n        xoptions,\n        yoptions,\n        zoptions,\n        graph,\n        xlabel,\n        ylabel,\n        zlabel,\n        xunits,\n        yunits,\n        zunits,\n        yReverse,\n        xReverse,\n        title,\n        colors,\n        minZ,\n        maxZ,\n        minY,\n        maxY,\n        minX,\n        maxX,\n        lowerY,\n        upperY,\n        lowerX,\n        upperX,\n        lowerZ,\n        upperZ,\n        timeaxis,\n        display,\n        thresholdStep,\n        plotdots,\n        interpolate,\n      });\n    }\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    var {\n      refresh,\n      timeaxis,\n      upperY,\n      lowerY,\n      upperX,\n      lowerX,\n      lowerZ,\n      upperZ,\n      xaxis,\n      yaxis,\n      zaxis,\n      graph,\n      minZ,\n      maxZ,\n    } = this.state;\n    if (refresh || this.props.fileChange !== prevProps.fileChange) {\n      var { minX, maxX, minY, maxY } = this.getBounds(\n        this.props.data,\n        xaxis,\n        yaxis,\n        timeaxis\n      );\n      if (prevState.minY === prevState.lowerY && prevState.lowerY === lowerY)\n        lowerY = minY;\n      if (prevState.maxY === prevState.upperY && prevState.upperY === upperY)\n        upperY = maxY;\n      if (prevState.minX === prevState.lowerX && prevState.lowerX === lowerX)\n        lowerX = minX;\n      if (prevState.maxX === prevState.upperX && prevState.upperX === upperX)\n        upperX = maxX;\n\n      var { plotdata } = this.processPlotData(\n        xaxis,\n        yaxis,\n        zaxis,\n        upperY,\n        lowerY,\n        maxY,\n        minY,\n        upperX,\n        lowerX,\n        minX,\n        maxX,\n        this.state.decimate,\n        this.state.average,\n        this.props.datasetparameters,\n        timeaxis,\n        graph,\n        this.state.interpolate\n      );\n\n      if (refresh !== \"z\") {\n        if (minZ === lowerZ || maxZ === upperZ) {\n          ({ minZ, maxZ } = this.getZBounds(plotdata));\n          upperZ = maxZ;\n          lowerZ = minZ;\n        } else {\n          ({ minZ, maxZ } = this.getZBounds(plotdata));\n        }\n      }\n\n      this.setState({\n        plotdata,\n        refresh: false,\n        minZ,\n        maxZ,\n        minX,\n        maxX,\n        minY,\n        maxY,\n        upperX,\n        upperY,\n        upperZ,\n        lowerX,\n        lowerY,\n        lowerZ,\n      });\n    }\n  }\n\n  render() {\n    if (this.state.failed) {\n      return (\n        <div className=\"failed-download\">\n          <img src={Connect} alt=\"Disconnected\" />\n          Unable to download data from the Datalakes API.\n          <div>\n            <b>Please try refreshing the page or come back later.</b>\n          </div>\n        </div>\n      );\n    } else if (this.props.search.toLowerCase().includes(\"bafu\")) {\n      return (\n        <React.Fragment>\n          <div className=\"detailloading\" id=\"detailloading\">\n            <Loading />\n            Downloading extra files.\n          </div>\n          <Bafu {...this.state} {...this.props} onChangeX={this.onChangeX} />\n        </React.Fragment>\n      );\n    } else if (this.props.search.toLowerCase().includes(\"display\")) {\n      return (\n        <React.Fragment>\n          <div className=\"detailloading\" id=\"detailloading\">\n            <Loading />\n            Downloading extra files.\n          </div>\n          <Display {...this.state} {...this.props} onChangeX={this.onChangeX} />\n        </React.Fragment>\n      );\n    } else {\n      return (\n        <React.Fragment>\n          <SidebarLayout\n            sidebartitle=\"Plot Controls\"\n            wide={true}\n            left={\n              <React.Fragment>\n                <div className=\"detailloading\" id=\"detailloading\">\n                  <Loading />\n                  Downloading extra files.\n                </div>\n                <div className=\"detailgraph\">\n                  <Graph {...this.state} {...this.props} />\n                  {!this.props.iframe && (\n                    <ReportIssue\n                      id={this.props.dataset.id}\n                      repositories_id={this.props.dataset.repositories_id}\n                      dataset={this.state.title}\n                      datasetparameters={this.props.datasetparameters}\n                    />\n                  )}\n                </div>\n              </React.Fragment>\n            }\n            rightNoScroll={\n              <Sidebar\n                {...this.state}\n                {...this.props}\n                onChangeState={this.onChangeState}\n                onChangeFile={this.onChangeFile}\n                onChangeX={this.onChangeX}\n                onChangeY={this.onChangeY}\n                toggleAddNewFile={this.toggleAddNewFile}\n                handleAxisSelect={this.handleAxisSelect}\n                handleAxisAppend={this.handleAxisAppend}\n              />\n            }\n          />\n        </React.Fragment>\n      );\n    }\n  }\n}\n\nexport default Plot;\n","import React, { Component } from \"react\";\nimport GIS from \"../../../graphs/leaflet/gis\";\nimport \"../css/datadetail.css\";\nimport \"../css/threed.css\";\n\nclass MapComponent extends Component {\n  state = {};\n\n  render() {\n    var { dataset, datasetparameters } = this.props;\n    var p = datasetparameters.filter(\n      (dp) => ![1, 2, 3, 4].includes(dp.parameters_id)\n    );\n    p.sort((a, b) =>\n      a.parameters_id > b.parameters_id\n        ? -1\n        : b.parameters_id > a.parameters_id\n        ? 1\n        : 0\n    );\n    var zoom = 8;\n    if ([\"meteolakes\", \"datalakes\"].includes(dataset.mapplotfunction))\n      zoom = 11;\n    var timestep = 180;\n    if (dataset.mapplotfunction === \"remoteSensing\") timestep = \"Next\";\n    var defaults = {\n      selected: p.map((param) => [dataset.id, param.parameters_id]),\n      center: [dataset.latitude, dataset.longitude],\n      datetime: new Date(dataset.maxdatetime),\n      zoom,\n      timestep,\n    };\n    return (\n      <div className=\"threed\">\n        <GIS defaults={defaults} hidelayerbutton={true} />\n      </div>\n    );\n  }\n}\n\nexport default MapComponent;\n","import React, { Component } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { apiUrl, serverlessUrl, bucket } from \"../../../src/config.json\";\nimport axios from \"axios\";\nimport * as d3 from \"d3\";\nimport Download from \"./inner/download\";\nimport Information from \"./inner/information\";\nimport Pipeline from \"./inner/pipeline\";\nimport External from \"./inner/external\";\nimport Preview from \"./inner/preview\";\nimport DataSubMenu from \"./datasubmenu\";\nimport Loading from \"../../components/loading/loading\";\nimport ThreeDModelDownload from \"./inner/threedmodeldownload\";\nimport Ch2018Graph from \"./inner/ch2018graph\";\nimport Ch2018Download from \"./inner/ch2018download\";\nimport RemoteSensingDownload from \"./inner/remotesensingdownload\";\nimport LocationMap from \"./inner/locationmap\";\nimport Plot from \"./inner/plot\";\nimport isArray from \"lodash/isArray\";\nimport MapComponent from \"./inner/mapcomponent\";\nimport \"./css/datadetail.css\";\n\nclass DataDetail extends Component {\n  state = {\n    selection: \"\",\n    dataset: [],\n    datasetparameters: [],\n    error: false,\n    mindatetime: \"\",\n    maxdatetime: \"\",\n    mindepth: \"\",\n    maxdepth: \"\",\n    lower: \"\",\n    upper: \"\",\n    files: [],\n    file_tree: [],\n    data: \"\",\n    step: \"\",\n    lang: \"en\",\n    allowedStep: [\"plot\", \"download\", \"pipeline\", \"information\", \"webgis\"],\n    file: [0],\n    innerLoading: false,\n    addnewfiles: true,\n    iframe: false,\n    search: false,\n    maintenance: false,\n  };\n\n  // Download data\n\n  downloadData = async () => {\n    this.downloadData = () => {}; // Only possible to fire once.\n    var { data: dataArray, files } = this.state;\n    for (var j = 0; j < files.length; j++) {\n      if (dataArray[j] === 0) {\n        var { data } = await axios\n          .get(apiUrl + \"/files/\" + files[j].id + \"?get=raw\")\n          .catch((error) => {\n            this.setState({ error: true });\n          });\n        dataArray[j] = data;\n        if (this._isMounted) {\n          this.setState({\n            data: dataArray,\n          });\n        } else {\n          return false;\n        }\n      }\n    }\n  };\n\n  downloadFile = async (index) => {\n    var { data: dataArray, files } = this.state;\n    var { data } = await axios\n      .get(apiUrl + \"/files/\" + files[index].id + \"?get=raw\")\n      .catch((error) => {\n        this.setState({ error: true });\n      });\n    dataArray[index] = data;\n    if (this._isMounted) {\n      this.setState({\n        data: dataArray,\n        innerLoading: false,\n      });\n    } else {\n      return false;\n    }\n  };\n\n  cleanData = (data) => {\n    if (Object.keys(data).includes(\"undefined\")) {\n      delete data.undefined;\n    }\n    return data;\n  };\n\n  downloadMultipleFiles = async (arr, newfile = false) => {\n    var { data: dataArray, files, file } = this.state;\n    for (var j = 0; j < arr.length; j++) {\n      if (dataArray[arr[j]] === 0) {\n        var { data } = await axios\n          .get(apiUrl + \"/files/\" + files[arr[j]].id + \"?get=raw\")\n          .catch((error) => {\n            this.setState({ error: true });\n          });\n        dataArray[arr[j]] = this.cleanData(data);\n      }\n    }\n    if (newfile) {\n      file = newfile;\n    }\n    if (this._isMounted) {\n      this.setState({\n        data: dataArray,\n        file,\n        innerLoading: false,\n      });\n    } else {\n      return false;\n    }\n  };\n  // Update state based on actions\n\n  updateSelectedState = (step) => {\n    this.setState({ step });\n  };\n\n  onChangeFileInt = (value) => {\n    var { file, data, addnewfiles } = this.state;\n    if (!file.includes(value) && this.isInt(value) && file.length < 20) {\n      if (value >= 0 && value <= data.length) {\n        if (!addnewfiles) file = [];\n        file.push(value);\n        if (data[value] === 0) {\n          this.setState({ file, innerLoading: true });\n          this.downloadFile(value);\n        } else {\n          this.setState({ file });\n        }\n      }\n    }\n  };\n\n  onChangeFile = (values) => {\n    var { files, file, data, addnewfiles } = this.state;\n    let filedict = files.map((a) => a.ave.getTime());\n    var newfile = this.closest(values[0], filedict);\n    if (!file.includes(newfile) && this.isInt(values[0]) && file.length < 20) {\n      if (!addnewfiles) file = [];\n      file.push(newfile);\n      if (data[newfile] === 0) {\n        this.setState({ file, innerLoading: true });\n        this.downloadFile(newfile);\n      } else {\n        this.setState({ file });\n      }\n    }\n  };\n\n  selectFilesDatetime = (newfiles) => {\n    if (newfiles.length < 1 || newfiles.length > 20) {\n      window.alert(\n        \"A maximum of 20 profiles can be plotted simultaneously, please select a shorter time period.\"\n      );\n    } else if (\n      window.confirm(\n        \"You sure you want to select \" + newfiles.length + \" files?\"\n      )\n    ) {\n      var file = newfiles.map((f) => f.fileid);\n      var { data } = this.state;\n      this.setState({ innerLoading: true });\n      for (var i = 0; i < newfiles.length; i++) {\n        if (data[newfiles[i].fileid] === 0) {\n          this.downloadFile(newfiles[i].fileid);\n        }\n      }\n      this.setState({ file, innerLoading: false });\n    }\n  };\n\n  removeFile = (event) => {\n    var { file } = this.state;\n    if (file.length > 1) {\n      var index = parseInt(event.target.id);\n      file.splice(index, 1);\n      this.setState({ file });\n    }\n  };\n\n  toggleAddNewFile = () => {\n    this.setState({ addnewfiles: !this.state.addnewfiles });\n  };\n\n  selectedFiles = (upper, lower, files, data) => {\n    if (data === \"download\") {\n      data = new Array(files.length).fill(0);\n    }\n    var fileList = [];\n    for (var i = 0; i < files.length; i++) {\n      if (\n        new Date(files[i].mindatetime).getTime() / 1000 < upper &&\n        new Date(files[i].maxdatetime).getTime() / 1000 > lower &&\n        data[i] === 0\n      ) {\n        fileList.push(i);\n      }\n    }\n    return fileList;\n  };\n\n  onChangeTime = (values) => {\n    var { files, data } = this.state;\n    const lower = values[0] / 1000;\n    const upper = values[1] / 1000;\n    if (\n      Math.round(lower) !== Math.round(this.state.lower) ||\n      Math.round(upper) !== Math.round(this.state.upper)\n    ) {\n      var toDownload = this.selectedFiles(upper, lower, files, data);\n      if (toDownload.length > 0) {\n        this.setState({ innerLoading: true });\n        this.downloadMultipleFiles(toDownload);\n      }\n      this.setState({ lower, upper });\n    }\n  };\n\n  onChangeUpper = (value) => {\n    var { files, data, lower } = this.state;\n    var upper = value.getTime() / 1000;\n    var toDownload = this.selectedFiles(upper, lower, files, data);\n    if (toDownload.length > 0) {\n      this.setState({ innerLoading: true });\n      this.downloadMultipleFiles(toDownload);\n    }\n    this.setState({ upper });\n  };\n\n  onChangeLower = (value) => {\n    var { files, data, upper } = this.state;\n    var lower = value.getTime() / 1000;\n    var toDownload = this.selectedFiles(upper, lower, files, data);\n    if (toDownload.length > 0) {\n      this.setState({ innerLoading: true, lower });\n      this.downloadMultipleFiles(toDownload);\n    }\n  };\n\n  // Get data from API\n  getLabel = (input, id, prop) => {\n    const { dropdown } = this.state;\n    try {\n      return dropdown[input].find((x) => x.id === id)[prop];\n    } catch (e) {\n      console.error(input, id, e);\n      return \"NA\";\n    }\n  };\n\n  parameterDetails = (dropdown, parameters, x) => {\n    return dropdown.parameters.find(\n      (item) => item.id === parameters[x].parameters_id\n    );\n  };\n\n  // Number functions\n\n  closest = (num, arr) => {\n    var diff = Infinity;\n    var index = 0;\n    for (var i = 0; i < arr.length; i++) {\n      var newdiff = Math.abs(num - arr[i]);\n      if (newdiff < diff) {\n        diff = newdiff;\n        index = i;\n      }\n    }\n    return index;\n  };\n\n  isInt = (value) => {\n    if (/^[-+]?(\\d+|Infinity)$/.test(value)) {\n      return true;\n    } else {\n      return false;\n    }\n  };\n\n  numDescending = (a, b) => {\n    var numA = a.ave.getTime();\n    var numB = b.ave.getTime();\n    var compare = 0;\n    if (numA > numB) {\n      compare = -1;\n    } else if (numA < numB) {\n      compare = 1;\n    }\n    return compare;\n  };\n\n  dataBounds = (dataArray) => {\n    var xe = d3.extent(dataArray[0].x);\n    var lower = xe[0],\n      upper = xe[1];\n    return { upper: upper, lower: lower };\n  };\n\n  addAverageTime = (array) => {\n    for (var i = 0; i < array.length; i++) {\n      let mindt = parseFloat(new Date(array[i].mindatetime).getTime());\n      let maxdt = parseFloat(new Date(array[i].maxdatetime).getTime());\n      array[i].ave = new Date((mindt + maxdt) / 2);\n      array[i].mindt = mindt / 1000;\n      array[i].maxdt = maxdt / 1000;\n    }\n    return array;\n  };\n\n  addFileLocation = (arr, dataset) => {\n    for (let i = 0; i < arr.length; i++) {\n      if (arr[i].latitude === \"-9999\" || arr[i].longitude === \"-9999\") {\n        arr[i].latitude = dataset.latitude;\n        arr[i].longitude = dataset.longitude;\n      }\n    }\n    return arr;\n  };\n\n  fileBounds = (array) => {\n    var min = Math.min.apply(\n      Math,\n      array.map(function (o) {\n        return o.min;\n      })\n    );\n    var max = Math.max.apply(\n      Math,\n      array.map(function (o) {\n        return o.max;\n      })\n    );\n    return { min: min, max: max };\n  };\n\n  getAve = (arr) => {\n    const sum = arr.reduce((a, b) => a + b, 0);\n    return sum / arr.length || 0;\n  };\n\n  getMax = (arr) => {\n    let len = arr.length;\n    let max = -Infinity;\n\n    while (len--) {\n      max = arr[len] > max ? arr[len] : max;\n    }\n    return max;\n  };\n\n  getMin = (arr) => {\n    let len = arr.length;\n    let min = Infinity;\n\n    while (len--) {\n      min = arr[len] < min ? arr[len] : min;\n    }\n    return min;\n  };\n\n  merge2DArray = (arr) => {\n    let merged = [];\n    for (var i = 0; i < arr[0].length; i++) {\n      merged.push(innerMerge(i, arr));\n    }\n    return merged;\n    function innerMerge(i, arr) {\n      return arr.map((a) => a[i]).flat();\n    }\n  };\n\n  customizer = (objValue, srcValue) => {\n    return objValue.concat(srcValue);\n  };\n\n  getShape = (arr) => {\n    if (isArray(arr[0])) {\n      return [arr.length, arr[0].length];\n    } else {\n      return [arr.length];\n    }\n  };\n\n  async getFileTree(bucket_url, ssh) {\n    var path = ssh.replace(\"git@\", \"\").replace(\".git\", \"\").replace(\":\", \"/\");\n    var prefix = `${bucket_url}/${path}/data`;\n    var repo = ssh.split(\"/\")[1].replace(\".git\", \"\");\n    try {\n      const { data } = await axios.get(\n        `${bucket_url}/${path}/filelist.json?timestamp=${new Date().getTime()}`\n      );\n\n      let file_tree = [];\n      let level = { file_tree };\n\n      data.forEach((path) => {\n        let arr = path.k.split(\"/\");\n        arr.reduce((r, name, i, a) => {\n          if (!r[name]) {\n            r[name] = { file_tree: [] };\n            r.file_tree.push({\n              name,\n              size: i === arr.length - 1 ? path.s : 0,\n              children: r[name].file_tree,\n            });\n          }\n\n          return r[name];\n        }, level);\n      });\n      this.setState({ file_tree, prefix, repo });\n    } catch (e) {\n      console.error(\"No file tree data available\");\n    }\n  }\n\n  async componentDidMount() {\n    this._isMounted = true;\n    var { step, allowedStep, lower, upper } = this.state;\n    var dataset_id;\n    if (\"id\" in this.props) {\n      dataset_id = this.props.id;\n    } else {\n      dataset_id = this.props.location.pathname.split(\"/\").slice(-1)[0];\n    }\n\n    if (dataset_id === \"\") {\n      this.setState({ step: \"error\" });\n      return;\n    }\n\n    var search = this.props.location.search;\n    var iframe = this.props.location.search.includes(\"iframe\");\n    var lang = \"en\";\n    var searchArr = search.split(\"&\");\n    if (searchArr.includes(\"de\") || searchArr.includes(\"DE\")) lang = \"de\";\n    if (searchArr.includes(\"fr\") || searchArr.includes(\"FR\")) lang = \"fr\";\n    if (searchArr.includes(\"it\") || searchArr.includes(\"IT\")) lang = \"it\";\n\n    var server;\n    const timeout = 1000;\n    try {\n      server = await Promise.all([\n        axios.get(apiUrl + \"/datasets/\" + dataset_id, { timeout: timeout }),\n        axios.get(apiUrl + \"/files?datasets_id=\" + dataset_id, {\n          timeout: timeout,\n        }),\n        axios.get(apiUrl + \"/datasetparameters?datasets_id=\" + dataset_id, {\n          timeout: timeout,\n        }),\n        axios.get(apiUrl + \"/selectiontables\", { timeout: timeout }),\n        axios.get(apiUrl + \"/maintenance/\" + dataset_id, { timeout: timeout }),\n      ]);\n    } catch (error) {\n      console.error(\"NodeJS API error switching to serverless API\");\n      server = await Promise.all([\n        axios.get(serverlessUrl + \"/datasets/\" + dataset_id),\n        axios.get(serverlessUrl + \"/files?datasets_id=\" + dataset_id),\n        axios.get(\n          serverlessUrl + \"/datasetparameters?datasets_id=\" + dataset_id\n        ),\n        axios.get(serverlessUrl + \"/selectiontables\"),\n        axios.get(serverlessUrl + \"/maintenance/\" + dataset_id),\n      ]).catch((error) => {\n        let status = error.response.status;\n        if ((status === 404) | (status === 400)) {\n          this.setState({ step: \"error\" });\n        } else {\n          this.setState({ step: \"database-error\" });\n        }\n      });\n    }\n\n    if (server === undefined) {\n      return;\n    }\n\n    var dataset = server[0].data;\n    var { mapplotfunction } = dataset;\n    var files = server[1].data;\n    files = files.filter(\n      (v, i, a) => a.findIndex((t) => t.filelink === v.filelink) === i\n    ); // Remove duplicates\n    var datasetparameters = server[2].data;\n    var dropdown = server[3].data;\n    var maintenance = server[4].data;\n\n    for (let i = 0; i < maintenance.length; i++) {\n      let start = new Date(maintenance[i].starttime);\n      let end = new Date(maintenance[i].endtime);\n      maintenance[i].start = Math.floor(start.getTime() / 1000);\n      maintenance[i].end = Math.floor(end.getTime() / 1000);\n    }\n\n    // Check for file tree\n    if (!dataset.datasourcelink.includes(\"https://\")) {\n      this.getFileTree(bucket.url, dataset.ssh);\n    }\n\n    // Internal vs External Data source\n    if (mapplotfunction === \"gitPlot\") {\n      // Add parameter details\n      var details;\n      for (var p in datasetparameters) {\n        try {\n          details = this.parameterDetails(dropdown, datasetparameters, p);\n          datasetparameters[p][\"name\"] = details.name;\n          datasetparameters[p][\"characteristic\"] = details.characteristic;\n        } catch (err) {\n          datasetparameters[p][\"name\"] = null;\n          datasetparameters[p][\"characteristic\"] = null;\n        }\n      }\n\n      // Logic for graphs\n      var x =\n        datasetparameters.filter((param) => param.axis === \"x\").length > 0;\n      var y =\n        datasetparameters.filter((param) => param.axis === \"y\").length > 0;\n      var z =\n        datasetparameters.filter((param) => param.axis === \"z\").length > 0;\n\n      if (x && y && z) {\n      } else if (x && y) {\n        allowedStep.push(\"preview\");\n      } else {\n        allowedStep.push(\"preview\");\n        step = \"preview\";\n      }\n\n      step = \"plot\";\n\n      // Logic for showing map\n      if (dataset.longitude !== \"-9999\" && dataset.latitude !== \"-9999\") {\n        allowedStep.push(\"locationmap\");\n      }\n\n      // Filter for only json files\n      var all_files = files;\n      files = files.filter((file) => file.filetype === \"json\");\n      files = files.map((file) => {\n        var temp = [\"\"];\n        try {\n          temp = all_files\n            .find((af) => af.id === file.filelineage)\n            .filelink.split(\"/\");\n        } catch (e) {}\n        file[\"nc_name\"] = temp[temp.length - 1];\n        return file;\n      });\n\n      // Get add average time\n      files = this.addAverageTime(files);\n\n      // Add location of file\n      files = this.addFileLocation(files, dataset);\n\n      // Sort by value (descending)\n      files.sort(this.numDescending);\n\n      // Get min and max\n      var { mindatetime, maxdatetime, mindepth, maxdepth } = dataset;\n      mindatetime = new Date(mindatetime).getTime() / 1000;\n      maxdatetime = new Date(maxdatetime).getTime() / 1000;\n\n      for (let i = 0; i < files.length; i++) {\n        mindatetime = Math.min(mindatetime, files[i].ave / 1000);\n        maxdatetime = Math.max(maxdatetime, files[i].ave / 1000);\n      }\n\n      var dataArray = new Array(files.length).fill(0);\n      var data = false;\n      try {\n        ({ data } = await axios.get(\n          apiUrl + \"/files/\" + files[0].id + \"?get=raw\"\n        ));\n      } catch {\n        console.error(\"Unable to collect data from the server.\");\n      }\n\n      dataArray[0] = data;\n\n      if (data) {\n        ({ lower, upper } = this.dataBounds(dataArray));\n\n        // Add dataset length to datasetparameters\n        datasetparameters = datasetparameters.map((d) => {\n          d.shape = this.getShape(data[d.axis]);\n          return d;\n        });\n      }\n\n      // Get Pipeline Data\n      var renku = false;\n      var scripts = [];\n      if (dataset.renku === 0) {\n        try {\n          ({ data: renku } = await axios.post(\n            apiUrl + \"/renku\",\n            {\n              url: dataset.datasourcelink,\n            },\n            { timeout: 500 }\n          ));\n        } catch (e) {\n          console.error(\"Failed to fetch Renku data.\");\n          renku = false;\n        }\n      }\n      try {\n        ({ data: scripts } = await axios({\n          method: \"get\",\n          url: apiUrl + \"/pipeline/scripts/\" + dataset_id,\n          timeout: 2000,\n        }));\n      } catch (e) {\n        console.error(\"Failed to collect scripts.\");\n      }\n\n      this.setState({\n        renku,\n        dataset,\n        datasetparameters,\n        files,\n        data: dataArray,\n        mindatetime,\n        maxdatetime,\n        mindepth,\n        maxdepth,\n        lower,\n        upper,\n        dropdown,\n        step,\n        allowedStep,\n        scripts,\n        iframe,\n        search,\n        lang,\n        maintenance,\n      });\n    } else if (mapplotfunction === \"meteolakes\") {\n      this.setState({\n        dataset,\n        datasetparameters,\n        dropdown,\n        files,\n        lang,\n        loading: false,\n        step: \"threedmodel\",\n        allowedStep: [\n          \"threedmodel\",\n          \"threedmodeldownload\",\n          \"external\",\n          \"webgis\",\n        ],\n      });\n    } else if (mapplotfunction === \"datalakes\") {\n      this.setState({\n        dataset,\n        datasetparameters,\n        dropdown,\n        files,\n        lang,\n        loading: false,\n        step: \"threedmodel\",\n        allowedStep: [\n          \"threedmodel\",\n          \"threedmodeldownload\",\n          \"external\",\n          \"webgis\",\n        ],\n      });\n    } else if (mapplotfunction === \"remoteSensing\") {\n      this.setState({\n        dataset,\n        datasetparameters,\n        dropdown,\n        files,\n        lang,\n        step: \"remotesensing\",\n        allowedStep: [\n          \"remotesensing\",\n          \"remotesensingdownload\",\n          \"external\",\n          \"webgis\",\n        ],\n      });\n    } else if (mapplotfunction === \"ch2018\") {\n      this.setState({\n        dataset,\n        datasetparameters,\n        dropdown,\n        files,\n        lang,\n        step: \"ch2018\",\n        allowedStep: [\"ch2018\", \"ch2018download\", \"external\"],\n      });\n    } else if (mapplotfunction === \"simstrat\") {\n      this.setState({\n        dataset,\n        datasetparameters,\n        dropdown,\n        files,\n        lang,\n        step: \"simstrat\",\n        allowedStep: [\"simstrat\", \"external\", \"webgis\"],\n      });\n    } else {\n      this.setState({\n        dataset,\n        datasetparameters,\n        dropdown,\n        files,\n        lang,\n        step: \"external\",\n        allowedStep: [\"external\", \"webgis\"],\n      });\n    }\n  }\n\n  componentWillUnmount() {\n    this._isMounted = false;\n  }\n\n  render() {\n    var {\n      renku,\n      dataset,\n      datasetparameters,\n      data,\n      mindatetime,\n      maxdatetime,\n      step,\n      allowedStep,\n      files,\n      file,\n      scripts,\n      iframe,\n      search,\n      lang,\n      dropdown,\n      maintenance,\n      file_tree,\n      prefix,\n      repo,\n    } = this.state;\n    document.title = dataset.title\n      ? dataset.title + \" - Datalakes\"\n      : \"Datalakes\";\n\n    // Link\n    var p = JSON.parse(JSON.stringify(datasetparameters));\n    p = p.filter((x) => ![1, 2, 3, 4].includes(x.parameters_id));\n    p = p.map((x) => [dataset.id, x.parameters_id]);\n    var link = \"/map?selected=\" + JSON.stringify(p);\n    var monitor = Number.isInteger(dataset.monitor);\n    if (iframe && step !== \"\") step = \"plot\";\n    var title = (\n      <div className=\"datadetail-title\">\n        {dataset.title} {monitor && <div className=\"title-live\">LIVE</div>}\n      </div>\n    );\n\n    switch (step) {\n      default:\n        return (\n          <React.Fragment>\n            <table className=\"loading-table\">\n              <tbody>\n                <tr>\n                  <td>\n                    <Loading />\n                    Loading Data\n                  </td>\n                </tr>\n              </tbody>\n            </table>\n          </React.Fragment>\n        );\n      case \"plot\":\n        return (\n          <React.Fragment>\n            {!iframe && (\n              <React.Fragment>\n                {title}\n                <DataSubMenu\n                  step={step}\n                  allowedStep={allowedStep}\n                  updateSelectedState={this.updateSelectedState}\n                  link={link}\n                />\n              </React.Fragment>\n            )}\n            <div className=\"datadetail-padding\">\n              <Plot\n                datasetparameters={datasetparameters}\n                dropdown={dropdown}\n                dataset={dataset}\n                data={data}\n                files={files}\n                file={file}\n                lang={lang}\n                fileChange={JSON.stringify(file)}\n                maxdatetime={maxdatetime}\n                mindatetime={mindatetime}\n                removeFile={this.removeFile}\n                downloadMultipleFiles={this.downloadMultipleFiles}\n                iframe={iframe}\n                search={search}\n                maintenance={maintenance}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"locationmap\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <LocationMap\n                dataset={dataset}\n                file={file}\n                files={files}\n                min={mindatetime}\n                max={maxdatetime}\n                onChangeFileInt={this.onChangeFileInt}\n                removeFile={this.removeFile}\n                selectFilesDatetime={this.selectFilesDatetime}\n                apiUrl={apiUrl}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"preview\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <Preview\n                data={data}\n                getLabel={this.getLabel}\n                datasetparameters={datasetparameters}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"download\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <Download\n                dataset={dataset}\n                files={files}\n                datasetparameters={datasetparameters}\n                selectedFiles={this.selectedFiles}\n                getLabel={this.getLabel}\n                max={maxdatetime}\n                min={mindatetime}\n                apiUrl={apiUrl}\n                file_tree={file_tree}\n                prefix={prefix}\n                repo={repo}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"pipeline\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <Pipeline dataset={dataset} renku={renku} scripts={scripts} />\n            </div>\n          </React.Fragment>\n        );\n      case \"information\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <Information\n                dataset={dataset}\n                datasetparameters={datasetparameters}\n                getLabel={this.getLabel}\n                scripts={scripts}\n                maintenance={maintenance}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"external\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <External\n                dataset={dataset}\n                datasetparameters={datasetparameters}\n                getLabel={this.getLabel}\n                link={link}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"threedmodel\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <MapComponent\n                dataset={dataset}\n                datasetparameters={datasetparameters}\n                getLabel={this.getLabel}\n                files={files}\n                link={link}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"threedmodeldownload\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <ThreeDModelDownload\n                dataset={dataset}\n                datasetparameters={datasetparameters}\n                getLabel={this.getLabel}\n                files={files}\n                link={link}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"remotesensingdownload\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <RemoteSensingDownload\n                dataset={dataset}\n                datasetparameters={datasetparameters}\n                getLabel={this.getLabel}\n                files={files}\n                link={link}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"remotesensing\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <MapComponent\n                dataset={dataset}\n                datasetparameters={datasetparameters}\n                getLabel={this.getLabel}\n                files={files}\n                link={link}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"simstrat\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <MapComponent\n                dataset={dataset}\n                datasetparameters={datasetparameters}\n                getLabel={this.getLabel}\n                files={files}\n                link={link}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"ch2018\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <Ch2018Graph\n                dataset={dataset}\n                datasetparameters={datasetparameters}\n                getLabel={this.getLabel}\n                files={files}\n                link={link}\n                search={this.props.location.search}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"ch2018download\":\n        return (\n          <React.Fragment>\n            {title}\n            <DataSubMenu\n              step={step}\n              allowedStep={allowedStep}\n              updateSelectedState={this.updateSelectedState}\n              link={link}\n            />\n            <div className=\"datadetail-padding\">\n              <Ch2018Download\n                dataset={dataset}\n                datasetparameters={datasetparameters}\n                getLabel={this.getLabel}\n                files={files}\n                link={link}\n              />\n            </div>\n          </React.Fragment>\n        );\n      case \"error\":\n        return (\n          <React.Fragment>\n            <table className=\"loading-table\">\n              <tbody>\n                <tr>\n                  <td>\n                    <h3>\n                      Sorry we cannot locate that dataset, it may have moved to\n                      a new location.\n                    </h3>\n                    <Link to=\"/data\">\n                      <h2>Head back to the data portal</h2>\n                    </Link>\n                  </td>\n                </tr>\n              </tbody>\n            </table>\n          </React.Fragment>\n        );\n      case \"database-error\":\n        return (\n          <React.Fragment>\n            <table className=\"loading-table\">\n              <tbody>\n                <tr>\n                  <td>\n                    <h3>\n                      Appologies the Datalakes API is experiencing some\n                      connectivity issues. <br />\n                      Please wait a few minutes then try refreshing the page.\n                    </h3>\n                  </td>\n                </tr>\n              </tbody>\n            </table>\n          </React.Fragment>\n        );\n    }\n  }\n}\n\nexport default DataDetail;\n","module.exports = __webpack_public_path__ + \"static/media/download.8ee71643.svg\";","module.exports = __webpack_public_path__ + \"static/media/mail.38089112.svg\";","module.exports = __webpack_public_path__ + \"static/media/calendar.bac84002.svg\";","module.exports = __webpack_public_path__ + \"static/media/location.c36bc45b.svg\";","module.exports = __webpack_public_path__ + \"static/media/git.122d0d1e.svg\";","module.exports = __webpack_public_path__ + \"static/media/depth.932cc9f3.svg\";","module.exports = __webpack_public_path__ + \"static/media/download.1ac5b6f2.svg\";","module.exports = __webpack_public_path__ + \"static/media/citation.9f3255c3.svg\";","module.exports = __webpack_public_path__ + \"static/media/licence.4a1cb26f.svg\";","module.exports = __webpack_public_path__ + \"static/media/connect.f37aa557.svg\";","module.exports = __webpack_public_path__ + \"static/media/folder.89adab1b.svg\";","module.exports = __webpack_public_path__ + \"static/media/line.f9eeb433.svg\";","module.exports = __webpack_public_path__ + \"static/media/preview.c440c8c7.svg\";","module.exports = __webpack_public_path__ + \"static/media/pipe.6e745e84.svg\";","module.exports = __webpack_public_path__ + \"static/media/info.3c30f8e3.svg\";","module.exports = __webpack_public_path__ + \"static/media/webgis.f468ab47.svg\";","module.exports = __webpack_public_path__ + \"static/media/3d.4456b611.svg\";","module.exports = __webpack_public_path__ + \"static/media/map.766df80c.svg\";"],"sourceRoot":""}