{"version":3,"sources":["pages/Charts.tsx","state/State.tsx","pages/DashboardLayout.tsx","components/NoAssets.tsx","pages/Dashboard.tsx","assets/hd_logo.png","pages/LandingLayout.tsx","pages/External.tsx","assets/vi_1.gif","assets/spec_1.png","assets/robot.svg","assets/spec_3.png","assets/ser_img_6.png","assets/iner_team.png","pages/Welcome.tsx","pages/WelcomeGr.tsx","pages/Terms.tsx","pages/Reports.tsx","assets/wind-turbine.svg","assets/solar-panel.svg","Utils.ts","pages/AssetData.tsx","pages/Assets.tsx","assets/wind-gauge.png","pages/Asset.tsx","data/ForecastFields.ts","pages/Users.tsx","pages/Parks.tsx","pages/Portfolios.tsx","App.tsx","reportWebVitals.ts","index.tsx"],"names":["observations","forecasts","dateFrom","dateTo","initialState","loggedIn","setLoggedIn","action","userInfo","setUserInfo","dashboardMenuActiveOption","setDashboardMenuActiveOption","version","setVersion","AppContext","createContext","AppContextProvider","children","useState","stateValue","Provider","value","Header","Layout","Content","Footer","Sider","DashboardLayout","props","context","useContext","menuCollapsed","setMenuCollapsed","loc","useLocation","useEffect","pathname","document","title","className","span","to","theme","style","display","justifyContent","mode","Item","href","target","rel","collapsible","collapsed","onCollapse","x","height","selectedKeys","icon","AimOutlined","BuildOutlined","EnvironmentOutlined","AppstoreOutlined","faChartLine","faFileExcel","grafanaUrl","faChartBar","admin","faUser","faBlog","faBug","Date","getFullYear","join","NoAssets","description","Dashboard","loading","setLoading","hasError","setHasError","assetsCapacity","assetCount","production","forecastUpdate","info","setInfo","history","useHistory","fetchInfo","a","fetch","method","headers","Accept","response","status","json","tmpInfo","moment","toDate","organization","subTitle","paddingTop","gutter","extra","type","onClick","xs","lg","format","prefix","faCloudSunRain","push","Math","round","suffix","faBolt","LandingLayout","url","rootElement","getElementById","text","id","align","sm","offset","xl","alt","src","whiteLogo","maxWidth","marginBottom","PhoneOutlined","MailOutlined","PushpinOutlined","External","window","location","state","Welcome","gif1","textAlign","hoverable","nwp","ml","wt","power","RocketOutlined","team","paddingBottom","size","WelcomeGr","Terms","Reports","reportList","setReportList","fetchList","list","map","i","default","dayAhead","crida1","crida2","crida3","index","columns","dataIndex","render","length","rowKey","dataSource","excelDateToJSDate","serial","utc_days","floor","date_info","fractional_day","total_seconds","hours","minutes","d","getMonth","getDate","getTime","fiveMinutes","Step","Steps","Option","Select","confirm","Modal","AssetData","currentStep","setCurrentStep","workBook","setWorkBook","mapping","setMapping","active","progress","processed","uploading","setUploading","presets","setPresets","visible","presetSaveForm","setPresetSaveForm","useForm","mappingsForm","loadPresets","presetsResp","onSavePresetClick","values","body","JSON","stringify","name","content","clearUpload","getPowerScaleFactor","assetMappings","productionUnits","dateSheet","Sheets","dateColumn","dateRange","XLSX","decode_range","excelDate1","encode_cell","c","parseInt","r","s","v","date1","dateOffsetUtcMinutes","excelDate2","diffMinutes","factor","scale","getHeaderRow","sheet","C","range","R","e","cell","hdr","t","format_cell","label","getWorkBookAsCascader","SheetNames","sheetName","uploadObservations","powerScaleFactor","totalRecords","data","excelDateValue","excelDate","date","records","am","ai","asset","assets","find","assetId","productionCell","productionColumn","record","windSpeedColumn","windSpeedCell","windSpeed","windDirectionColumn","windDirectionCell","windDirection","irradianceColumn","irradianceCell","irradiance","undefined","uploadPartResponse","notification","message","error","min","askSavePreset","presetId","ExclamationCircleOutlined","onOk","onCancel","preset","resetFields","fileProps","accept","onChange","fileList","reader","FileReader","rABS","readAsBinaryString","onload","bstr","result","wb","onerror","console","log","file","readAsArrayBuffer","beforeUpload","multiple","maxCount","steps","FileExcelOutlined","labelCol","wrapperCol","layout","autoComplete","form","allowClear","setFieldsValue","parse","rules","required","options","placeholder","help","controls","List","fields","add","remove","key","restField","Fragment","showSearch","optionFilterProp","autoClearSearchValue","danger","block","MinusCircleOutlined","PlusCircleOutlined","bordered","row","dateUtc","forEach","Object","assign","toFixed","getUploadDataPreview","getUploadColumns","next","validateFields","then","catch","percent","current","item","StepBackwardOutlined","marginRight","StepForwardOutlined","renderPage","confirmLoading","destroyOnClose","footer","initialValues","onFinish","htmlType","disabled","mapCentered","Assets","setData","column","search","setSearch","searchInput","useRef","handleExport","exportData","Name","ExternalId","externalId","Park","park","Portfolio","portfolio","Type","capacity","columnWidths","keys","wch","max","toString","worksheet","json_to_sheet","workbook","book_new","book_append_sheet","excelBuffer","bookType","blob","Blob","saveAs","getColumnSearchProps","filterDropdown","padding","ref","setSelectedKeys","onPressEnter","handleSearch","SearchOutlined","width","handleReset","clearFilters","closeDropdown","filterIcon","filtered","color","onFilter","toLowerCase","includes","onFilterDropdownVisibleChange","setTimeout","select","highlightStyle","backgroundColor","searchWords","autoEscape","textToHighlight","fetchData","parks","y","parkId","portfolios","portfolioId","sorter","b","toLocaleLowerCase","localeCompare","defaultSortOrder","EditOutlined","okText","okType","cancelText","success","DeleteFilled","postRenderCallback","useCallback","getView","fit","boundingExtent","fromLonLat","longitude","latitude","defaultActiveKey","TabPane","tab","faList","summary","pageData","totalWt","totalPv","totalCapacity","Summary","Row","Cell","colSpan","PlusOutlined","borderColor","faMap","initial","center","zoom","onPostRender","zIndex","filter","geometry","Point","RStyle","RIcon","windTurbine","anchor","RText","font","solarPanel","faDatabase","Asset","setPortfolios","setParks","setAsset","loadingState","setLoadingState","parkModalState","setParkModalState","portfolioModalState","setPortfolioModalState","assetType","setAssetType","assetProps","setAssetProps","loadAsset","assetResp","loadParks","parksResp","loadPortfolios","portfoliosResp","loadData","onSaveParkClick","onSavePortfolioClick","onFieldsChange","changedFields","allFields","onSaveClick","atype","aprops","HubHeight","SweptArea","Tilt","organizationId","AssetProps","tilt","hidden","maxLength","SyncOutlined","ForecastFields","OptGroup","RangePicker","DatePicker","getObsFieldValue","field","obs","humidity","temperature","pressure","getForecastFieldValue","forecast","relativeHumidity","radiation","temperature2m","surfacePressure","getUnit","minuteInterval","Charts","assetFilter","setAssetFilter","setAssets","domains","setDomains","chartData","setChartData","errorStats","setErrorStats","errorStatsPerAsset","setErrorStatsPerAsset","chartType","setChartType","errorStatsPerModelColumns","model","bias","unit","mae","rmse","isNaN","nmae","nrmse","errorStatsPerAssetColumns","selectAllAssets","formatSetErrorStats","stats","getForecastModelTypes","getForecastSourceOptions","isAdmin","valueToModelString","valueToModelStringForDisplay","findRecord","mid","diff","onDrawChartClick","selection","assetIds","indexOf","strInterval","t1","t2","getHours","getMinutes","mfd","from","interval","reportResp","reportData","validDate","getTimezoneOffset","forecastSources","fsi","fs","maxForecastDate","modelType","enhancements","domain","run","forecastResponse","createSumChart","createErrorSumChart","createChart","stepMinutes","assetsObservations","assetsForecasts","tmpChartData","capacityDictionary","obsSum","forecastSum","hasObsData","hasForData","hasOwnProperty","assetForecasts","idx","af","fPower","category","keyIdx","m","biasSum","errorCount","maeSum","rmseSum","abs","tmpErrorStatsPerModel","stat","sqrt","count","sort","hourObsSum","hourObsCount","hourForCount","hourForSum","obsAvg","NaN","assetStatsDict","fAsset","tmpErrorStatsPerAsset","tmpParks","splice","tmp","loadAssets","loadDomains","handleAssetFilterChange","renderAssetsSelect","p","assetTypes","k","startOf","subtract","step","Group","showTime","renderChartOptions","reload","ctype","Button","xField","yField","seriesField","yAxis","xAxis","tooltip","formatter","datum","pagination","EditableCell","editing","setEditing","setValue","save","wrap","flex","defaultValue","SaveOutlined","CloseOutlined","Users","userList","setUserList","organizations","setOrganizations","userName","inputType","UserOutlined","Parks","isModalVisible","setIsModalVisible","editingPark","setEditingPark","Form","showModal","handleOk","ok","Error","numberOfAssets","NumberOfAssets","pageSizeOptions","showSizeChanger","defaultPageSize","locale","emptyText","Portfolios","editingPortfolio","setEditingPortfolio","App","ready","setReady","responseVersion","exact","path","encodeURIComponent","match","params","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","createBrowserHistory"],"mappings":"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","file":"static/js/main.70819f28.chunk.js","sourcesContent":["import React, { ReactNode, useContext, useEffect, useState } from \"react\";\r\nimport { Line } from \"@ant-design/charts\";\r\nimport { DatePicker, Button, Card, Form, Select, Col, Row, Spin, Result, Radio, Table, Input } from \"antd\";\r\nimport { ColumnsType } from \"antd/es/table\";\r\nimport moment from \"moment\";\r\nimport { Observation } from \"../data/Observation\";\r\nimport { Asset } from \"../data/Asset\";\r\nimport { Park } from \"../data/Park\";\r\nimport { AssetForecast } from \"../data/AssetForecast\";\r\nimport NoAssets from \"../components/NoAssets\";\r\nimport { AppContext } from \"../state/State\";\r\nimport { ForecastDomain } from \"../data/ForecastDomain\";\r\nimport { useForm } from \"antd/lib/form/Form\";\r\nimport { ForecastFields } from \"../data/ForecastFields\";\r\nimport { Portfolio } from \"../data/Portfolio\";\r\n\r\nconst { Option, OptGroup } = Select;\r\nconst { RangePicker } = DatePicker;\r\ntype ChartField = \"Power (KW)\" | \"Wind speed (m/sec)\" | \"Irradiance (W⋅m−2)\" | \"Temperature (°C)\" | \"Humidity %\" | \"Pressure (hPa)\" | \"Error %\";\r\ntype AssetFilter = \"portfolios\" | \"parks\" | \"assets\" | \"technology\";\r\n\r\ninterface ErrorStats {\r\n model: string;\r\n unit: string;\r\n bias: number;\r\n mae: number;\r\n rmse: number;\r\n nmae: number;\r\n nrmse: number;\r\n capacity: number;\r\n count: number;\r\n}\r\n\r\ninterface AssetErrorStats {\r\n asset: string;\r\n unit: string;\r\n bias: number;\r\n mae: number;\r\n rmse: number;\r\n nmae: number;\r\n nrmse: number;\r\n capacity: number;\r\n count: number;\r\n}\r\n\r\nconst getObsFieldValue = (field: ChartField, obs: Observation): number => {\r\n switch (field) {\r\n case \"Power (KW)\":\r\n return obs.power!;\r\n case \"Humidity %\":\r\n return obs.humidity!;\r\n case \"Irradiance (W⋅m−2)\":\r\n return obs.irradiance!;\r\n case \"Temperature (°C)\":\r\n return obs.temperature!;\r\n case \"Wind speed (m/sec)\":\r\n return obs.windSpeed!;\r\n case \"Pressure (hPa)\":\r\n return obs.pressure!;\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nconst getForecastFieldValue = (field: ChartField, forecast: AssetForecast): number => {\r\n switch (field) {\r\n case \"Power (KW)\":\r\n return forecast.power;\r\n case \"Humidity %\":\r\n return forecast.relativeHumidity;\r\n case \"Irradiance (W⋅m−2)\":\r\n return forecast.radiation;\r\n case \"Temperature (°C)\":\r\n return forecast.temperature2m;\r\n case \"Wind speed (m/sec)\":\r\n return forecast.windSpeed[0].value;\r\n case \"Pressure (hPa)\":\r\n return forecast.surfacePressure;\r\n }\r\n\r\n return 0;\r\n};\r\n\r\nconst getUnit = (field: ChartField): string => {\r\n switch (field) {\r\n case \"Power (KW)\":\r\n return \"KW\";\r\n case \"Humidity %\":\r\n return \"%\";\r\n case \"Irradiance (W⋅m−2)\":\r\n return \"W⋅m−2\";\r\n case \"Temperature (°C)\":\r\n return \"°C\";\r\n case \"Wind speed (m/sec)\":\r\n return \"m/sec\";\r\n case \"Pressure (hPa)\":\r\n return \"hPa\";\r\n case \"Error %\":\r\n return \"%\";\r\n }\r\n\r\n return \"\";\r\n};\r\n\r\nlet observations: Array<{ asset: Asset | undefined; observations: Array }>;\r\nlet forecasts: Array<{ asset: Asset | undefined; forecasts: Array; model: string }>;\r\nlet minuteInterval = 60;\r\nlet dateFrom: Date;\r\nlet dateTo: Date;\r\n\r\nconst Charts: React.FC = (props) => {\r\n const [assetFilter, setAssetFilter] = useState(\"assets\");\r\n const [assets, setAssets] = useState>([]);\r\n const [parks, setParks] = useState>([]);\r\n const [portfolios, setPortfolios] = useState>([]);\r\n const [domains, setDomains] = useState>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [hasError, setHasError] = useState(false);\r\n const [chartData, setChartData] = useState<{ field: ChartField; data: Array<{ x: Date; y: number; category: string }> } | null>(null);\r\n const [errorStats, setErrorStats] = useState | null>(null);\r\n const [errorStatsPerAsset, setErrorStatsPerAsset] = useState | null>(null);\r\n const [chartType, setChartType] = useState(0);\r\n const context = useContext(AppContext);\r\n const [form] = useForm();\r\n\r\n const errorStatsPerModelColumns: ColumnsType = [\r\n {\r\n title: \"Model\",\r\n dataIndex: \"model\",\r\n sorter: (a, b) => a.model.localeCompare(b.model),\r\n defaultSortOrder: \"ascend\"\r\n },\r\n {\r\n title: \"BIAS\",\r\n dataIndex: \"bias\",\r\n render: (text, record) => `${record.bias.toFixed(2)} ${record.unit}`,\r\n sorter: (a, b) => a.bias - b.bias\r\n },\r\n {\r\n title: \"MAE\",\r\n dataIndex: \"mae\",\r\n render: (text, record) => `${record.mae.toFixed(2)} ${record.unit}`,\r\n sorter: (a, b) => a.mae - b.mae\r\n },\r\n {\r\n title: \"RMSE\",\r\n dataIndex: \"rmse\",\r\n sorter: (a, b) => a.rmse - b.rmse,\r\n render: (text, record) => (isNaN(record.rmse) ? \"-\" : `${record.rmse.toFixed(2)} ${record.unit}`)\r\n },\r\n {\r\n title: \"NMAE\",\r\n dataIndex: \"nmae\",\r\n sorter: (a, b) => a.nmae - b.nmae,\r\n render: (text, record) => (isNaN(record.nmae) ? \"-\" : `${record.nmae.toFixed(2)}%`)\r\n },\r\n {\r\n title: \"NRMSE\",\r\n dataIndex: \"nrmse\",\r\n sorter: (a, b) => a.nrmse - b.nrmse,\r\n render: (text, record) => (isNaN(record.nrmse) ? \"-\" : `${record.nrmse.toFixed(2)}%`)\r\n }\r\n ];\r\n\r\n const errorStatsPerAssetColumns: ColumnsType = [\r\n {\r\n title: \"Asset\",\r\n dataIndex: [\"asset\"],\r\n sorter: (a, b) => a.asset.localeCompare(b.asset),\r\n defaultSortOrder: \"ascend\"\r\n },\r\n {\r\n title: \"BIAS\",\r\n dataIndex: \"bias\",\r\n render: (text, record) => `${record.bias.toFixed(2)} ${record.unit}`,\r\n sorter: (a, b) => a.bias - b.bias\r\n },\r\n {\r\n title: \"MAE\",\r\n dataIndex: \"mae\",\r\n render: (text, record) => `${record.mae.toFixed(2)} ${record.unit}`,\r\n sorter: (a, b) => a.mae - b.mae\r\n },\r\n {\r\n title: \"RMSE\",\r\n dataIndex: \"rmse\",\r\n sorter: (a, b) => a.rmse - b.rmse,\r\n render: (text, record) => `${record.rmse.toFixed(2)} ${record.unit}`\r\n },\r\n {\r\n title: \"NMAE\",\r\n dataIndex: \"nmae\",\r\n sorter: (a, b) => a.nmae - b.nmae,\r\n render: (text, record) => (isNaN(record.nmae) ? \"-\" : `${record.nmae.toFixed(2)}%`)\r\n },\r\n {\r\n title: \"NRMSE\",\r\n dataIndex: \"nrmse\",\r\n sorter: (a, b) => a.nrmse - b.nrmse,\r\n render: (text, record) => (isNaN(record.nrmse) ? \"-\" : `${record.nrmse.toFixed(2)}%`)\r\n }\r\n ];\r\n\r\n const selectAllAssets = () => {\r\n switch (assetFilter) {\r\n case \"assets\":\r\n form.setFieldsValue({ assets: assets.map((x) => x.id) });\r\n break;\r\n case \"parks\":\r\n form.setFieldsValue({ assets: parks.map((x) => x.id) });\r\n break;\r\n case \"portfolios\":\r\n form.setFieldsValue({ assets: portfolios.map((x) => x.id) });\r\n break;\r\n case \"technology\":\r\n form.setFieldsValue({ assets: [1, 2, 3] });\r\n break;\r\n }\r\n };\r\n\r\n const formatSetErrorStats = (field: ChartField, stats: Array) => {\r\n stats.forEach((x) => {\r\n if (field === \"Power (KW)\" && (x.bias > 1000 || x.mae > 1000 || x.rmse > 1000)) {\r\n x.unit = \"MW\";\r\n x.bias /= 1000;\r\n x.mae /= 1000;\r\n x.rmse /= 1000;\r\n }\r\n });\r\n\r\n setErrorStats(stats);\r\n };\r\n\r\n const getForecastModelTypes = (): React.ReactNode => {\r\n if (!(context.userInfo?.admin ?? false)) {\r\n return (\r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n const getForecastModelEnhancements = (): React.ReactNode => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n const getForecastSourceOptions = (): React.ReactNode => {\r\n const isAdmin = context.userInfo?.admin ?? false;\r\n return (\r\n <>\r\n \r\n {getForecastModelTypes()}\r\n \r\n {isAdmin && (\r\n \r\n {getForecastModelEnhancements()}\r\n \r\n )}\r\n \r\n );\r\n };\r\n\r\n const getDomainOptions = (): ReactNode => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n const valueToModelString = (value: number): string => {\r\n switch (value) {\r\n case 2:\r\n return \"WrfGfs\";\r\n case 3:\r\n return \"WrfIcon\";\r\n case 4:\r\n return \"Ecmwf\";\r\n case 5:\r\n return \"Icon\";\r\n case 6:\r\n return \"Era5Reanalysis\";\r\n }\r\n\r\n return \"Meteogen\";\r\n };\r\n\r\n const valueToModelStringForDisplay = (value: number): string => {\r\n switch (value) {\r\n case 1:\r\n return \"Meteogen\";\r\n case 2:\r\n return \"WRF GFS\";\r\n case 3:\r\n return \"WRF ICON\";\r\n case 4:\r\n return \"ECMWF\";\r\n case 5:\r\n return \"ICON\";\r\n case 6:\r\n return \"ERA5\";\r\n case 12345:\r\n return \"Day ahead report\";\r\n }\r\n\r\n return \"Meteogen\";\r\n };\r\n\r\n const valueToEnhancements = (value: number): number => {\r\n if (value === undefined) {\r\n return 0;\r\n }\r\n\r\n return value;\r\n };\r\n\r\n const findRecord = (data: Array, field: string, key: any) => {\r\n let min = 0;\r\n let max = data.length - 1;\r\n\r\n while (min <= max) {\r\n let mid = Math.round((min + max) / 2);\r\n const diff = key.getTime() - data[mid][field].getTime();\r\n if (diff === 0) {\r\n return data[mid];\r\n } else if (diff < 0) {\r\n max = mid - 1;\r\n } else {\r\n min = mid + 1;\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n\r\n const onChangeChartTypeClick = (e: any) => {\r\n const ctype = parseInt(e.target.value);\r\n if (ctype === 0) {\r\n createSumChart(dateFrom, dateTo, minuteInterval, observations, forecasts);\r\n } else if (ctype === 5) {\r\n createErrorSumChart(dateFrom, dateTo, minuteInterval, observations, forecasts);\r\n } else {\r\n let field: ChartField = \"Power (KW)\";\r\n switch (ctype) {\r\n case 2:\r\n field = \"Wind speed (m/sec)\";\r\n break;\r\n case 3:\r\n field = \"Irradiance (W⋅m−2)\";\r\n break;\r\n case 4:\r\n field = \"Temperature (°C)\";\r\n break;\r\n case 5:\r\n field = \"Error %\";\r\n break;\r\n }\r\n\r\n createChart(dateFrom, dateTo, minuteInterval, observations, forecasts, field);\r\n }\r\n\r\n setChartType(ctype);\r\n };\r\n\r\n const onDrawChartClick = async (values: any) => {\r\n setLoading(true);\r\n setChartData(null);\r\n setErrorStats(null);\r\n setHasError(false);\r\n\r\n const selection = values.assets as Array;\r\n\r\n let assetIds: Array = [];\r\n switch (assetFilter) {\r\n case \"assets\":\r\n assetIds = selection;\r\n break;\r\n case \"parks\":\r\n assetIds = assets.filter((x) => selection.indexOf(x.parkId) !== -1).map((x) => x.id);\r\n break;\r\n case \"portfolios\":\r\n assetIds = assets.filter((x) => selection.indexOf(x.portfolioId) !== -1).map((x) => x.id);\r\n break;\r\n case \"technology\":\r\n assetIds = assets.filter((x) => selection.indexOf(x.type) !== -1).map((x) => x.id);\r\n break;\r\n }\r\n\r\n observations = [];\r\n forecasts = [];\r\n minuteInterval = 10;\r\n\r\n let strInterval = \"TenMinutes\";\r\n if (values[\"step\"] === 1) {\r\n strInterval = \"FifteenMinutes\";\r\n minuteInterval = 15;\r\n } else if (values[\"step\"] === 2) {\r\n strInterval = \"Hour\";\r\n minuteInterval = 60;\r\n }\r\n\r\n const t1 = (values[\"date-range\"][\"0\"] as moment.Moment).toDate();\r\n const t2 = (values[\"date-range\"][\"1\"] as moment.Moment).toDate();\r\n\r\n dateFrom = new Date(t1.getFullYear(), t1.getMonth(), t1.getDate(), t1.getHours(), t1.getMinutes());\r\n dateTo = new Date(t2.getFullYear(), t2.getMonth(), t2.getDate(), t2.getHours(), t2.getMinutes());\r\n\r\n let mfd: Date | null = null;\r\n if (values[\"max-forecast-date\"]) {\r\n mfd = (values[\"max-forecast-date\"] as moment.Moment).toDate();\r\n }\r\n\r\n try {\r\n if (values[\"forecast\"] && values[\"forecast\"].indexOf(12345) > -1) {\r\n const reportResp = await fetch(`/api/Assets/ReportForecast`, {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n from: moment(dateFrom).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n to: moment(dateTo).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n dayAhead: true,\r\n interval: strInterval,\r\n assetIds: assetIds\r\n })\r\n });\r\n\r\n if (reportResp.status === 200) {\r\n const reportData = await reportResp.json();\r\n const keys = Object.keys(reportData);\r\n keys.forEach((key) => {\r\n const assetId = parseInt(key);\r\n\r\n forecasts.push({\r\n asset: assets.find((x) => x.id === assetId),\r\n forecasts: reportData[key],\r\n model: valueToModelStringForDisplay(12345)\r\n });\r\n\r\n forecasts[forecasts.length - 1].forecasts.forEach(\r\n (x) => (x.validDate = moment(x.validDate).add(moment(x.validDate).toDate().getTimezoneOffset(), \"minutes\").toDate())\r\n );\r\n });\r\n } else {\r\n setLoading(false);\r\n setHasError(true);\r\n return;\r\n }\r\n }\r\n\r\n for (let i = 0; i < assetIds.length; i++) {\r\n const response = await fetch(`/api/Assets/${assetIds[i]}/Observations`, {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n from: moment(dateFrom).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n to: moment(dateTo).format(\"YYYY-MM-DDTHH:mm:ss\")\r\n })\r\n });\r\n\r\n if (response.status === 200) {\r\n observations.push({\r\n asset: assets.find((x) => x.id === assetIds[i]),\r\n observations: await response.json()\r\n });\r\n\r\n observations[observations.length - 1].observations.forEach(\r\n (x) => (x.date = moment(x.date).add(moment(x.date).toDate().getTimezoneOffset(), \"minutes\").toDate())\r\n );\r\n } else {\r\n setLoading(false);\r\n setHasError(true);\r\n return;\r\n }\r\n\r\n if (values[\"forecast\"] && values[\"forecast\"].length > 0) {\r\n const forecastSources = values[\"forecast\"] as Array;\r\n\r\n for (let fsi = 0; fsi < forecastSources.length; fsi++) {\r\n let fs = forecastSources[fsi];\r\n if (fs === 12345) {\r\n continue;\r\n }\r\n\r\n const forecastResponse = await fetch(`/api/Assets/${assetIds[i]}/Forecast`, {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n from: moment(dateFrom).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n to: moment(dateTo).format(\"YYYY-MM-DDTHH:mm:ss\"),\r\n maxForecastDate: mfd ? moment(mfd).format(\"YYYY-MM-DDTHH:mm:ss\") : null,\r\n interval: strInterval,\r\n modelType: valueToModelString(fs),\r\n enhancements: valueToEnhancements(values[\"enhancements\"]),\r\n domain: values[\"domain\"],\r\n run: values[\"run\"],\r\n fields: [ForecastFields.Wind, ForecastFields.Power, ForecastFields.Radiation]\r\n })\r\n });\r\n\r\n if (forecastResponse.status === 200) {\r\n forecasts.push({\r\n asset: assets.find((x) => x.id === assetIds[i]),\r\n forecasts: await forecastResponse.json(),\r\n model: valueToModelStringForDisplay(fs)\r\n });\r\n\r\n forecasts[forecasts.length - 1].forecasts.forEach(\r\n (x) => (x.validDate = moment(x.validDate).add(moment(x.validDate).toDate().getTimezoneOffset(), \"minutes\").toDate())\r\n );\r\n } else {\r\n setLoading(false);\r\n setHasError(true);\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n } catch {\r\n setLoading(false);\r\n setHasError(true);\r\n return;\r\n }\r\n\r\n if (chartType === 0) {\r\n createSumChart(dateFrom, dateTo, minuteInterval, observations, forecasts);\r\n } else if (chartType === 5) {\r\n createErrorSumChart(dateFrom, dateTo, minuteInterval, observations, forecasts);\r\n } else {\r\n let field: ChartField = \"Power (KW)\";\r\n switch (chartType) {\r\n case 2:\r\n field = \"Wind speed (m/sec)\";\r\n break;\r\n case 3:\r\n field = \"Irradiance (W⋅m−2)\";\r\n break;\r\n case 4:\r\n field = \"Temperature (°C)\";\r\n break;\r\n }\r\n\r\n createChart(dateFrom, dateTo, minuteInterval, observations, forecasts, field);\r\n }\r\n\r\n setLoading(false);\r\n };\r\n\r\n const createSumChart = (\r\n from: Date,\r\n to: Date,\r\n stepMinutes: number,\r\n assetsObservations: Array<{ asset: Asset | undefined; observations: Array }>,\r\n assetsForecasts: Array<{ asset: Asset | undefined; forecasts: Array; model: string }>\r\n ) => {\r\n let tmpChartData: Array<{ x: Date; y: number; category: string }> = [];\r\n let d = from;\r\n\r\n let stats: { [key: string]: { maeSum: number; biasSum: number; rmseSum: number; errorCount: number } } = {};\r\n let capacityDictionary: any = {};\r\n\r\n while (d <= to) {\r\n let obsSum = 0;\r\n let forecastSum: any = {};\r\n\r\n let hasObsData = false;\r\n let hasForData = false;\r\n\r\n for (let i = 0; i < assetsObservations.length; i++) {\r\n const assetId = assetsObservations[i].asset!.id;\r\n\r\n const obs = findRecord(assetsObservations[i].observations, \"date\", d) as Observation | null;\r\n if (obs !== null) {\r\n hasObsData = true;\r\n obsSum += obs.power!;\r\n\r\n if (!capacityDictionary.hasOwnProperty(assetId)) {\r\n capacityDictionary[assetId] = assetsObservations[i].asset!.capacity;\r\n }\r\n }\r\n\r\n if (assetsForecasts.length > 0) {\r\n const assetForecasts = assetsForecasts.filter((x) => x.asset!.id === assetId);\r\n for (let idx = 0; idx < assetForecasts.length; idx++) {\r\n const af = assetForecasts[idx];\r\n const fPower = findRecord(af.forecasts, \"validDate\", d) as AssetForecast | null;\r\n if (fPower !== null) {\r\n hasForData = true;\r\n if (!forecastSum.hasOwnProperty(af.model)) {\r\n forecastSum[af.model] = 0;\r\n }\r\n\r\n forecastSum[af.model] += fPower.power;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (hasObsData) {\r\n tmpChartData.push({\r\n x: d,\r\n y: obsSum,\r\n category: \"Power\"\r\n });\r\n }\r\n\r\n if (hasForData) {\r\n const keys = Object.keys(forecastSum);\r\n for (let keyIdx = 0; keyIdx < keys.length; keyIdx++) {\r\n const m = keys[keyIdx];\r\n tmpChartData.push({\r\n x: d,\r\n y: forecastSum[m],\r\n category: `${m} Forecast`\r\n });\r\n\r\n if (hasObsData) {\r\n const diff = forecastSum[m] - obsSum;\r\n if (!stats[m]) {\r\n stats[m] = { biasSum: 0, errorCount: 0, maeSum: 0, rmseSum: 0 };\r\n }\r\n\r\n stats[m].biasSum += diff;\r\n stats[m].maeSum += Math.abs(diff);\r\n stats[m].rmseSum += diff * diff;\r\n stats[m].errorCount++;\r\n }\r\n }\r\n }\r\n\r\n d = new Date(d.getTime() + stepMinutes * 60 * 1000);\r\n }\r\n\r\n setChartData({ field: \"Power (KW)\", data: tmpChartData });\r\n setErrorStatsPerAsset(null);\r\n setErrorStats(null);\r\n\r\n let capacity = 0;\r\n Object.keys(capacityDictionary).forEach((x) => {\r\n capacity += capacityDictionary[x];\r\n });\r\n\r\n let tmpErrorStatsPerModel: Array = [];\r\n Object.keys(stats).forEach((x) => {\r\n let stat = stats[x];\r\n if (stat.errorCount > 0) {\r\n tmpErrorStatsPerModel.push({\r\n bias: stat.biasSum / stat.errorCount,\r\n rmse: Math.sqrt(stat.rmseSum / stat.errorCount),\r\n capacity: capacity,\r\n count: stat.errorCount,\r\n mae: stat.maeSum / stat.errorCount,\r\n model: x,\r\n nmae: (100 * (stat.maeSum / stat.errorCount)) / capacity,\r\n nrmse: (100 * Math.sqrt(stat.rmseSum / stat.errorCount)) / capacity,\r\n unit: \"KW\"\r\n });\r\n }\r\n });\r\n\r\n tmpErrorStatsPerModel.sort((a, b) => {\r\n if (a.model > b.model) {\r\n return 1;\r\n } else if (a.model < b.model) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n formatSetErrorStats(\"Power (KW)\", tmpErrorStatsPerModel);\r\n };\r\n\r\n const createErrorSumChart = (\r\n from: Date,\r\n to: Date,\r\n stepMinutes: number,\r\n assetsObservations: Array<{ asset: Asset | undefined; observations: Array }>,\r\n assetsForecasts: Array<{ asset: Asset | undefined; forecasts: Array; model: string }>\r\n ) => {\r\n let tmpChartData: Array<{ x: Date; y: number; category: string }> = [];\r\n let d = from;\r\n\r\n let capacityDictionary: any = {};\r\n\r\n let hourObsSum = 0;\r\n let hourObsCount = 0;\r\n\r\n let stats: { [key: string]: { maeSum: number; biasSum: number; errorCount: number; hourForSum: number; hourForCount: number } } = {};\r\n\r\n for (let i = 0; i < assetsObservations.length; i++) {\r\n const assetId = assetsObservations[i].asset!.id;\r\n\r\n const obs = findRecord(assetsObservations[i].observations, \"date\", d) as Observation | null;\r\n if (obs !== null) {\r\n if (!capacityDictionary.hasOwnProperty(assetId)) {\r\n capacityDictionary[assetId] = assetsObservations[i].asset!.capacity;\r\n }\r\n }\r\n }\r\n\r\n let capacity = 0;\r\n let assetCount = 0;\r\n Object.keys(capacityDictionary).forEach((x) => {\r\n capacity += capacityDictionary[x];\r\n assetCount++;\r\n });\r\n\r\n while (d <= to) {\r\n for (let i = 0; i < assetsObservations.length; i++) {\r\n const assetId = assetsObservations[i].asset!.id;\r\n\r\n const obs = findRecord(assetsObservations[i].observations, \"date\", d) as Observation | null;\r\n if (obs !== null) {\r\n hourObsSum += obs.power!;\r\n hourObsCount++;\r\n }\r\n\r\n if (assetsForecasts.length > 0) {\r\n const assetForecasts = assetsForecasts.filter((x) => x.asset!.id === assetId);\r\n assetForecasts.forEach((af) => {\r\n const fPower = findRecord(af.forecasts, \"validDate\", d) as AssetForecast | null;\r\n\r\n if (fPower !== null) {\r\n if (!stats.hasOwnProperty(af.model)) {\r\n stats[af.model] = { biasSum: 0, errorCount: 0, maeSum: 0, hourForCount: 0, hourForSum: 0 };\r\n }\r\n\r\n stats[af.model].hourForSum += fPower.power;\r\n stats[af.model].hourForCount++;\r\n }\r\n });\r\n }\r\n }\r\n\r\n if (d.getTime() % (1000 * 3600) === 0) {\r\n const obsAvg = hourObsCount === 0 ? 0 : hourObsSum / (hourObsCount / assetCount);\r\n\r\n Object.keys(stats).forEach((model) => {\r\n const forAvg = stats[model].hourForCount === 0 ? 0 : stats[model].hourForSum / (stats[model].hourForCount / assetCount);\r\n const diff = forAvg - obsAvg;\r\n const mae = Math.abs(diff) / capacity;\r\n const bias = diff / capacity;\r\n tmpChartData.push({\r\n x: d,\r\n y: mae * 100,\r\n category: `${model} error %`\r\n });\r\n stats[model].hourForCount = 0;\r\n stats[model].hourForSum = 0;\r\n\r\n stats[model].errorCount++;\r\n stats[model].maeSum += mae;\r\n stats[model].biasSum += bias;\r\n });\r\n\r\n hourObsCount = 0;\r\n hourObsSum = 0;\r\n }\r\n\r\n d = new Date(d.getTime() + stepMinutes * 60 * 1000);\r\n }\r\n\r\n setChartData({ field: \"Error %\", data: tmpChartData });\r\n setErrorStatsPerAsset(null);\r\n\r\n formatSetErrorStats(\r\n \"Error %\",\r\n Object.keys(stats).map((model) => {\r\n return {\r\n model: `${model} error %`,\r\n unit: \"%\",\r\n mae: 100 * (stats[model].maeSum / stats[model].errorCount),\r\n bias: 100 * (stats[model].biasSum / stats[model].errorCount),\r\n rmse: NaN,\r\n nmae: NaN,\r\n nrmse: NaN,\r\n count: stats[model].errorCount,\r\n capacity: capacity\r\n };\r\n })\r\n );\r\n };\r\n\r\n const createChart = (\r\n from: Date,\r\n to: Date,\r\n stepMinutes: number,\r\n observations: Array<{ asset: Asset | undefined; observations: Array }>,\r\n forecasts: Array<{ asset: Asset | undefined; forecasts: Array; model: string }>,\r\n field: ChartField\r\n ) => {\r\n let tmpChartData: Array<{ x: Date; y: number; category: string }> = [];\r\n let assetStatsDict: { [key: string]: AssetErrorStats } = {};\r\n\r\n let d = from;\r\n\r\n while (d <= to) {\r\n for (let i = 0; i < observations.length; i++) {\r\n const assetId = observations[i].asset!.id;\r\n\r\n const obs = findRecord(observations[i].observations, \"date\", d) as Observation | null;\r\n if (obs !== null) {\r\n tmpChartData.push({\r\n x: d,\r\n y: getObsFieldValue(field, obs),\r\n category: observations[i].asset!.name\r\n });\r\n }\r\n\r\n if (forecasts.length > 0) {\r\n const assetForecasts = forecasts.filter((x) => x.asset!.id === assetId);\r\n assetForecasts.forEach((af) => {\r\n const fAsset = findRecord(af.forecasts, \"validDate\", d) as AssetForecast | null;\r\n if (fAsset !== null) {\r\n tmpChartData.push({\r\n x: d,\r\n y: getForecastFieldValue(field, fAsset),\r\n category: `${af.model} ${observations[i].asset!.name}`\r\n });\r\n\r\n if (obs !== null) {\r\n const key = `${assetId}_${af.model}`;\r\n if (!assetStatsDict.hasOwnProperty(key)) {\r\n assetStatsDict[key] = {\r\n unit: getUnit(field),\r\n count: 0,\r\n rmse: 0,\r\n bias: 0,\r\n mae: 0,\r\n nmae: 0,\r\n nrmse: 0,\r\n asset: `${observations[i].asset!.name} ${af.model}`,\r\n capacity: observations[i].asset!.capacity\r\n };\r\n }\r\n\r\n const diff = getForecastFieldValue(field, fAsset) - getObsFieldValue(field, obs);\r\n assetStatsDict[key].bias += diff;\r\n assetStatsDict[key].mae += Math.abs(diff);\r\n assetStatsDict[key].rmse += diff * diff;\r\n assetStatsDict[key].count++;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\n d = new Date(d.getTime() + stepMinutes * 60 * 1000);\r\n }\r\n\r\n setChartData({ field, data: tmpChartData });\r\n setErrorStats(null);\r\n\r\n let tmpErrorStatsPerAsset: Array = [];\r\n Object.keys(assetStatsDict).forEach((x) => {\r\n let stat = assetStatsDict[x];\r\n if (stat.count > 0) {\r\n stat.bias /= stat.count;\r\n stat.rmse = Math.sqrt(stat.rmse / stat.count);\r\n stat.mae /= stat.count;\r\n stat.nmae = field !== \"Power (KW)\" || stat.capacity === 0 ? NaN : (100 * stat.mae) / stat.capacity;\r\n stat.nrmse = field !== \"Power (KW)\" || stat.capacity === 0 ? NaN : (100 * stat.rmse) / stat.capacity;\r\n tmpErrorStatsPerAsset.push(stat);\r\n }\r\n });\r\n\r\n if (tmpErrorStatsPerAsset.length > 0) {\r\n tmpErrorStatsPerAsset.sort((a, b) => {\r\n if (a.asset > b.asset) {\r\n return 1;\r\n } else if (a.asset < b.asset) {\r\n return -1;\r\n }\r\n\r\n return 0;\r\n });\r\n\r\n setErrorStatsPerAsset(tmpErrorStatsPerAsset);\r\n } else {\r\n setErrorStatsPerAsset(null);\r\n }\r\n };\r\n\r\n const loadParks = async () => {\r\n setLoading(true);\r\n setHasError(false);\r\n\r\n try {\r\n const response = await fetch(\"/api/Parks\", {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status === 200) {\r\n let tmpParks = (await response.json()) as Array;\r\n tmpParks.splice(0, 0, { id: 0, name: \"Without park\", assets: [] });\r\n setParks(tmpParks);\r\n } else {\r\n setHasError(true);\r\n }\r\n } catch {\r\n setHasError(true);\r\n }\r\n\r\n setLoading(false);\r\n };\r\n\r\n const loadPortfolios = async () => {\r\n setLoading(true);\r\n setHasError(false);\r\n\r\n try {\r\n const response = await fetch(\"/api/Portfolios\", {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status === 200) {\r\n let tmp = (await response.json()) as Array;\r\n tmp.splice(0, 0, { id: 0, name: \"Without portfolio\", assets: [] });\r\n setPortfolios(tmp);\r\n } else {\r\n setHasError(true);\r\n }\r\n } catch {\r\n setHasError(true);\r\n }\r\n\r\n setLoading(false);\r\n };\r\n\r\n const loadAssets = async () => {\r\n setLoading(true);\r\n setHasError(false);\r\n\r\n try {\r\n const response = await fetch(\"/api/Assets\", {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status === 200) {\r\n setAssets(await response.json());\r\n } else {\r\n setHasError(true);\r\n }\r\n } catch {\r\n setHasError(true);\r\n }\r\n\r\n setLoading(false);\r\n };\r\n\r\n const loadDomains = async () => {\r\n setLoading(true);\r\n setHasError(false);\r\n\r\n try {\r\n const response = await fetch(\"/api/ForecastDomains\", {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status === 200) {\r\n setDomains(await response.json());\r\n } else {\r\n setHasError(true);\r\n }\r\n } catch {\r\n setHasError(true);\r\n }\r\n\r\n setLoading(false);\r\n };\r\n\r\n const getChartConfig = () => {\r\n return {\r\n data: chartData!.data,\r\n height: 400,\r\n xField: \"x\",\r\n yField: \"y\",\r\n seriesField: \"category\",\r\n yAxis: {\r\n title: { text: chartData!.field }\r\n },\r\n xAxis: {\r\n type: \"time\"\r\n },\r\n tooltip: {\r\n formatter: (datum: any) => {\r\n return { title: moment(datum.x).format(\"LLL\"), name: datum.category, value: Math.round(datum.y) };\r\n }\r\n }\r\n };\r\n };\r\n\r\n const handleAssetFilterChange = (value: AssetFilter) => {\r\n form.setFieldsValue({ assets: [] });\r\n setAssetFilter(value);\r\n };\r\n\r\n const renderAssetsSelect = (): React.ReactNode => {\r\n if (assetFilter === \"parks\") {\r\n if ((parks?.length ?? 0) === 0) {\r\n return;\r\n }\r\n\r\n return (\r\n \r\n {parks.map((p) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n );\r\n } else if (assetFilter === \"portfolios\") {\r\n if ((portfolios?.length ?? 0) === 0) {\r\n return;\r\n }\r\n\r\n return (\r\n \r\n {portfolios.map((p) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n );\r\n } else if (assetFilter === \"technology\") {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n let assetTypes: any = {};\r\n assets.forEach((x) => {\r\n if (!assetTypes.hasOwnProperty(x.type)) {\r\n assetTypes[x.type] = [];\r\n }\r\n\r\n assetTypes[x.type].push(x);\r\n });\r\n\r\n return (\r\n \r\n {Object.keys(assetTypes).map((k) => {\r\n return (\r\n \r\n {(assetTypes[k] as Array).map((a) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n );\r\n })}\r\n \r\n );\r\n };\r\n\r\n const renderChartOptions = (): React.ReactNode => {\r\n return (\r\n \r\n

Chart options

\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {renderAssetsSelect()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n {getForecastSourceOptions()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n useEffect(() => {\r\n loadParks();\r\n loadPortfolios();\r\n loadAssets();\r\n if (context.userInfo?.admin ?? false) {\r\n loadDomains();\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <>\r\n {!loading && assets.length === 0 ? (\r\n \r\n ) : (\r\n \r\n {loading && }\r\n {hasError && (\r\n \r\n \r\n {\r\n window.location.reload();\r\n }}\r\n >\r\n Retry\r\n \r\n ]}\r\n >\r\n \r\n \r\n )}\r\n {chartData !== null && chartData!.data.length > 0 && (\r\n <>\r\n \r\n \r\n \r\n Power sum\r\n Power forecast error per hour\r\n Power per asset\r\n Wind per asset\r\n Irradiance per asset\r\n \r\n \r\n \r\n \r\n {errorStats !== null && (\r\n <>\r\n {/* Forecast error\r\n \r\n {!isNaN(errorStats!.bias) && \r\n \r\n }\r\n {!isNaN(errorStats!.mae) && \r\n \r\n }\r\n {!isNaN(errorStats!.rmse) && \r\n \r\n }\r\n {!isNaN(errorStats!.nmae) && \r\n \r\n }\r\n {!isNaN(errorStats!.nrmse) && \r\n \r\n }\r\n */}\r\n
\r\n \r\n )}\r\n\r\n {errorStatsPerAsset !== null && (\r\n
\r\n )}\r\n \r\n )}\r\n
\r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Charts;\r\n","import React, { SetStateAction, createContext, useState } from \"react\";\r\nimport { UserInfo } from \"../data/User\";\r\n\r\nexport interface AppState {\r\n loggedIn: boolean;\r\n setLoggedIn: React.Dispatch>;\r\n userInfo: UserInfo | null;\r\n setUserInfo: React.Dispatch>;\r\n dashboardMenuActiveOption: string;\r\n setDashboardMenuActiveOption: React.Dispatch>;\r\n version: Array;\r\n setVersion: React.Dispatch>>;\r\n}\r\n\r\nconst initialState: AppState = {\r\n loggedIn: false,\r\n setLoggedIn: (action: boolean | ((prevState: boolean) => boolean)) => undefined,\r\n userInfo: null,\r\n setUserInfo: (action: (UserInfo | null) | ((prevState: UserInfo | null) => UserInfo | null)) => undefined,\r\n dashboardMenuActiveOption: \"\",\r\n setDashboardMenuActiveOption: (action: string | ((prevState: string) => string)) => undefined,\r\n version: [1, 0, 0],\r\n setVersion: (action: Array | ((prevState: Array) => Array)) => undefined\r\n};\r\n\r\nlet AppContext = createContext(initialState);\r\n\r\n// let reducer = (state: AppState, action: ReducerAction): AppState => {\r\n// switch (action.type) {\r\n// case \"LOGIN\": {\r\n// return {\r\n// ...state,\r\n// loggedIn: true,\r\n// userInfo: action.payload.userInfo\r\n// }\r\n// }\r\n// case \"LOGOUT\": {\r\n// return {\r\n// ...state,\r\n// loggedIn: false,\r\n// userInfo: null\r\n// }\r\n// }\r\n// case \"DashboardMenuActiveOptionChangedAction\": {\r\n// return {\r\n// ...state,\r\n// dashboardMenuActiveOption: action.option,\r\n// }\r\n// }\r\n// case \"SetVersion\": {\r\n// return {\r\n// ...state,\r\n// version: action.option,\r\n// }\r\n// }\r\n// }\r\n\r\n// return state;\r\n// };\r\n\r\nconst AppContextProvider: React.FC = ({ children }) => {\r\n const [loggedIn, setLoggedIn] = useState(false);\r\n const [userInfo, setUserInfo] = useState(null);\r\n const [dashboardMenuActiveOption, setDashboardMenuActiveOption] = useState(\"\");\r\n const [version, setVersion] = useState>([1, 0, 0]);\r\n let stateValue: AppState = {\r\n loggedIn: loggedIn,\r\n setLoggedIn: setLoggedIn,\r\n userInfo: userInfo,\r\n setUserInfo: setUserInfo,\r\n dashboardMenuActiveOption: dashboardMenuActiveOption,\r\n setDashboardMenuActiveOption: setDashboardMenuActiveOption,\r\n version: version,\r\n setVersion: setVersion\r\n };\r\n\r\n return {children};\r\n};\r\n\r\nexport { AppContext, AppContextProvider };\r\n","import React from \"react\";\r\nimport { Layout, Menu, Col, Row } from \"antd\";\r\nimport { Link, useLocation } from \"react-router-dom\";\r\nimport { AimOutlined, BuildOutlined } from \"@ant-design/icons\";\r\nimport { useContext } from \"react\";\r\nimport { AppContext } from \"../state/State\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faChartBar, faChartLine, faFileExcel, faUser, faBlog, faBug } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { EnvironmentOutlined, AppstoreOutlined } from \"@ant-design/icons\";\r\n\r\nconst { Header, Content, Footer, Sider } = Layout;\r\n\r\nconst DashboardLayout: React.FC = (props) => {\r\n const children = props.children ? props.children : [];\r\n const context = useContext(AppContext);\r\n const [menuCollapsed, setMenuCollapsed] = useState(false);\r\n\r\n const loc = useLocation();\r\n useEffect(() => {\r\n const pageTitleSuffix = \" - Meteogen\";\r\n switch (loc.pathname) {\r\n case \"/dashboard\":\r\n context.setDashboardMenuActiveOption(\"dashboard-home\");\r\n document.title = \"Dashboard\" + pageTitleSuffix;\r\n break;\r\n case \"/reports\":\r\n context.setDashboardMenuActiveOption(\"dashboard-reports\");\r\n document.title = \"Reports\" + pageTitleSuffix;\r\n break;\r\n case \"/charts\":\r\n context.setDashboardMenuActiveOption(\"dashboard-charts\");\r\n document.title = \"Charts\" + pageTitleSuffix;\r\n break;\r\n case \"/assets\":\r\n context.setDashboardMenuActiveOption(\"dashboard-assets\");\r\n document.title = \"Assets\" + pageTitleSuffix;\r\n break;\r\n case \"/parks\":\r\n context.setDashboardMenuActiveOption(\"dashboard-parks\");\r\n document.title = \"Parks\" + pageTitleSuffix;\r\n break;\r\n case \"/portfolios\":\r\n context.setDashboardMenuActiveOption(\"dashboard-portfolios\");\r\n document.title = \"Portfolios\" + pageTitleSuffix;\r\n break;\r\n case \"/users\":\r\n context.setDashboardMenuActiveOption(\"dashboard-users\");\r\n document.title = \"Users\" + pageTitleSuffix;\r\n break;\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [loc]);\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n Dashboard\r\n \r\n \r\n Account\r\n \r\n \r\n Logout\r\n \r\n \r\n \r\n API docs\r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n {\r\n setMenuCollapsed(x);\r\n }}\r\n >\r\n \r\n } title=\"Dashboard\" key=\"dashboard-home\">\r\n Dashboard\r\n \r\n } title=\"Assets\" key=\"dashboard-assets\">\r\n Assets\r\n \r\n } title=\"Parks\" key=\"dashboard-parks\">\r\n Parks\r\n \r\n } title=\"Portfolios\" key=\"dashboard-portfolios\">\r\n Portfolios\r\n \r\n } title=\"Charts\" key=\"dashboard-charts\">\r\n Charts\r\n \r\n } title=\"Reports\" key=\"dashboard-reports\">\r\n Reports\r\n \r\n {context.userInfo?.grafanaUrl && (\r\n } title=\"Grafana\" key=\"dashboard-grafana\">\r\n \r\n Grafana\r\n \r\n \r\n )}\r\n {context.userInfo?.admin && (\r\n } title=\"Users\" key=\"dashboard-users\">\r\n Users\r\n \r\n )}\r\n {context.userInfo?.admin && (\r\n } title=\"CMS\" key=\"dashboard-cms\">\r\n \r\n CMS\r\n \r\n \r\n )}\r\n {context.userInfo?.admin && (\r\n } title=\"Elmah\" key=\"dashboard-el,ah\">\r\n \r\n Elmah\r\n \r\n \r\n )}\r\n \r\n \r\n \r\n
{children}
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n Meteogen {new Date().getFullYear()} - {context.version.join(\".\")}\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default DashboardLayout;\r\n","import React from \"react\";\r\nimport { Empty } from \"antd\";\r\nimport { Link } from \"react-router-dom\";\r\n\r\nconst NoAssets: React.FC = (props) => {\r\n return (\r\n \r\n
\r\n You don't have any assets configured yet. Click here to add some.\r\n
\r\n
We will contact you as soon as possible to get you started.
\r\n \r\n }\r\n >\r\n );\r\n};\r\n\r\nexport default NoAssets;\r\n","import { Button, Card, Col, PageHeader, Result, Row, Statistic } from \"antd\";\r\nimport React, { useState } from \"react\";\r\nimport { useHistory } from \"react-router-dom\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faBolt, faChartLine, faCloudSunRain } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { useContext } from \"react\";\r\nimport { AppContext } from \"../state/State\";\r\nimport { useEffect } from \"react\";\r\nimport moment from \"moment\";\r\nimport NoAssets from \"../components/NoAssets\";\r\n\r\ninterface DashboardInfo {\r\n production: number;\r\n assetsCapacity: number;\r\n forecastUpdate: Date;\r\n assetCount: number;\r\n}\r\n\r\nconst Dashboard: React.FC = (props) => {\r\n const [loading, setLoading] = useState(true);\r\n const [hasError, setHasError] = useState(false);\r\n const [info, setInfo] = useState({ assetsCapacity: 0, assetCount: 0, production: 0, forecastUpdate: new Date() });\r\n\r\n const context = useContext(AppContext);\r\n let history = useHistory();\r\n\r\n const fetchInfo = async () => {\r\n setLoading(true);\r\n setHasError(false);\r\n\r\n try {\r\n const response = await fetch(\"/api/dashboard\", {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status === 200) {\r\n let tmpInfo: DashboardInfo = await response.json();\r\n tmpInfo.forecastUpdate = moment(tmpInfo.forecastUpdate).toDate();\r\n setInfo(tmpInfo);\r\n } else {\r\n setHasError(true);\r\n }\r\n } catch {\r\n setHasError(true);\r\n }\r\n\r\n setLoading(false);\r\n };\r\n\r\n useEffect(() => {\r\n fetchInfo();\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n {hasError && (\r\n \r\n \r\n \r\n Retry\r\n \r\n ]}\r\n >\r\n \r\n \r\n )}\r\n\r\n {!hasError && (loading || info.assetCount > 0) && (\r\n \r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n )}\r\n\r\n {!hasError && !loading && info.assetCount === 0 && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Dashboard;\r\n","export default __webpack_public_path__ + \"static/media/hd_logo.13af5a41.png\";","import React from \"react\";\r\nimport { Layout, Menu, Col, Row } from \"antd\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { MailOutlined, PhoneOutlined, PushpinOutlined } from \"@ant-design/icons\";\r\nimport { PopupButton } from \"react-calendly\";\r\nimport { HashLink } from \"react-router-hash-link\";\r\nimport whiteLogo from \"../assets/hd_logo.png\";\r\n\r\nconst { Header, Content, Footer } = Layout;\r\n\r\nconst LandingLayout: React.FC = (props) => {\r\n const children = props.children ? props.children : [];\r\n return (\r\n <>\r\n \r\n \r\n
\r\n \r\n \r\n \r\n Home\r\n \r\n \r\n Account\r\n \r\n \r\n Services\r\n \r\n \r\n About\r\n \r\n \r\n Contact\r\n \r\n \r\n \r\n API docs\r\n \r\n \r\n \r\n \r\n Blog\r\n \r\n \r\n \r\n
\r\n \r\n
{children}
\r\n
\r\n
\r\n \r\n \r\n \"\"\r\n

Weather and energy forecasting services. Global coverage, custom services, unmatched accuracy and very competitive pricing.

\r\n \r\n \r\n

Contact us

\r\n \r\n \r\n
\r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default LandingLayout;\r\n","import React from \"react\";\r\nimport { useLocation } from \"react-router-dom\";\r\n\r\nconst External: React.FC = (props) => {\r\n const loc = useLocation();\r\n window.location = (loc.state as any).url;\r\n return <>;\r\n};\r\n\r\nexport default External;\r\n","export default __webpack_public_path__ + \"static/media/vi_1.42b71df8.gif\";","export default \"data:image/png;base64,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\"","export default __webpack_public_path__ + \"static/media/robot.f3e47d4d.svg\";","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEcAAABRCAYAAACAP7uZAAAN4ElEQVR4nO2ceXQV1R3HfwiIKNUWLC5AYthRCVkgQWwFRVksoKWgAnrc2qPH1rqwSyw7SKpCsdgqVGhVTnukrXUDZBESEEgQEKjJmwlEMBBI8lhEFsnW3+/ODEzuu9u85OFC//ieHPJmXt798Fvv/c2D7JIEiLGWokbX9n1yylrAsuLrYKZ1FzxnDYVM+xcxV6zBPIyqdvUuqu3/4Tj6IarcB6fa/ffj5zuceqhPOTB+rUElnq9wLkCNRR1RACJlnI9w/CIAJxSAtqF6msBZcaAjA/N9gZOAehJ1TGNBpAmy98kqaQ1bw82Z5UwLDYNZ1pDvLJzGqMdQnxgA8etOGZhNpS3g49I4mFMwEKaG7jknYOoaTiPUKNT+gFBIL/rfax0CWV0WD8vDrWBFuCWsP3QFLCi8FTLy7off24Nli7kMdd+3Ec6DqD1RQCGV1ASTACvK4mDjwdaQ/0UnKNifAKv3pkJGaATMspXu9ASqGvVf1OBvAxyKKSsMAFDM2Sd57SYezJrSeDhpdYXqz3pAdX4qlOT3hMn2XTBDDafEheNpCerH3xScB1CnNFB2ocag2qDyBa8v9oNZjVA+DMfB4V3JCOYGKLe6QTVBslLhZfsOeMa+G91KuJBxHBhPh2pjRdGCmauBstOF510/XXDN19lOnHIDbwJ8cKglFO3pzCyGwJAqGKAkWG73hcfse9mHFgDaLIHjadq5gNNQ40alqF9z9zwkuXaY/zoCk1/UkVlMZSjtDBxSJVpOpZUCi+0B8KQ9TAToctQE1EkFoLdjCecS1A4FmFdRPxLcN1JwbfZZd2oNyzArbS5uC9V53aEqPx1O+8CQTltpaD3JzIJeR0AjEdDz4gXFof6hAJSDaljXcBq5riKCcho1XHN/EmqV756rst04sxJT9tqSaxgQgsOBuTASUDK8ivFnnH2PLP6QHlUAIhesV5dwciRgKOB2CGB9FHvO9FME5X10p5LCLjXiDKoB6reoiyItKBGKrJ/AWITznHpxKahiCaDsuoKzRAJmE6pJADARojgTojiDFlMRqmExf0DllnPuRapi2SsZXrMH6qzHi0XbJYAW1xbOOAWYqKFQnFkqjzMXoKpRr4ngOOm9C+ywe7HYY2ABF6J2SACNjBZOugTMdlT92oChQo9c6uuQMM78yYVzvxwOZa+u8JJ9JzyLtY8BoMaokARQ16BwaLPqsABMuDaudKbQK2sFRwtSWNrmwLRzwZD6yeA4gBJhg90bU/twnWt5aoo6KoBTFhTOPInVJNXGnT4qvYbFmX2fd+YDsKdcH5w0NZwUOIEBehYuYrJtvL/TTWI9fzSF014CZmQQEGQh1FmvdLtrEsUZC5tJUaGHGu4DQ2qvglPhWs8yuw+zHkndI9JYCaD2JnDWCsBsMXUb+rkSY8rH2FVvOtAGcg+0hc8wIxWhtbCeCYMvgeHciVL3MR+YctTlKjjlblsRtrrDeMxaz2Jj+rx8O4PXVgGciPTOLzBNYjWtTS2Gqt0d+9pDuWsZlVSb5HfHwHsD+0n/Fiz0Fc5qit2spYTj9V0b7JthDAKaZA6ojcR6uqvgfCQAs8DMapw2YMv+diwDEYgqBESqUC+yAweGtFUHppwVhQSoK3OvkHUT1j13w1SMP4YBer4ATpYMThuJ1VxmAmcNBttVGF9O2KnMSvj+SKGdAjjLDO91rZMAdYb19q0s/swyg3OpxHo6iODMEYCZbxprKAt5wTbAwn4lAENaGAQOqQprHyoO38TG9GnWmBq5158FcObxcKiuKRHAiTfNTKyoo/9BDLiGC7rEDbwiONODwnH6riT8DN1gpj0EMtDFDDJYSwGcMKq+H05vAZiPg1hNwd5rg1rNGxIwpCeDwnHkNKY2xh9qLWaqt1U9rRUA6ueH84IAjm4bwi3s0Gow3pyyA1lNigKMsnUwiz9d4N92f3iK1T9a9xoqgDPXDydPAEe0cRVhNVTYhSjW5AWymnwNnAHRwmH7Qti1n0JItKWRgeldk71+gKri4Oz24FwlALPBxGrWuhnqGPVJmL4NF/CYBgwpPVo4fvfKs3uy4GyQvdYIrCeOFtlXAGeyCRxqCbbvb+8Wd8ZBuMIATnzt4Jx1rzftn8EoffZ6RgBnEC1yrADOEFM4BwsTRd21TH83AHMY1ai2cBz3SoJD2F78Dl1rqro5HSSAM5kW+TcBnC46MOROG7F3qgx1Y1WwwQfuZgCGlFNbMJ685nQtFofUXijgtBPAWUILzeLAfIW6WJ++W4H9xbVBAnGBIZxC1ARUhqEmokbJ/i4F5+NWOos7CuuhuqaMg7ORFhvi4Hyms5osLPhWYQo/Ql22WSAebQgmWkmLRoLzhXWjyXHyJxycEC32IAcnSweHtjk3F7eBarex1IBpFmMwWaq/T0E5G93KYL95OQdnPy32Sw7OMh0cqm127TV2qXdjDOdK2d92TipSYJE9kJ2za+D8i4MTBjfG+OF8YOJSh81c6qYYgxmvtpoUOILZitxpur6VeIuDcziw5VCW2nCgNcsEBi61N4ZgCnVWSy6Va98Co9WZytM/OTiHRDEnWwWHNrTy3IM4zYd7JsZW01X196vcYPyGPYCdjhrAWcrBKaYF83Mz+brCr7iwsy7edI4xmL/orSYZC8AbYJqZS5E2cXAsWjC/oX4825moiABDu33UTx2n3T51B04fnirdIkOR+500BEPv21APJ5FlKeqtDLZNabCAP1fPpUUvMq2Qs9w0zloGteU0R9U3FG2k1yt3YogJnIE6MFXuNNir9iCYYHYiGi+okP9Dix4tgDNUHpCxWT2YAOV0lGu+f6MTHc2cMgCzXPdep91AvNv6KYs1hvvJ/QRwZtKCbxPAmSqDw+8Xa04WTKXb/PLUVPdelZbTcC6xb2fduOFJxCgBnCG04CsEcHJUQZliz4pwHHxZkBz0pEGmAQZgnjB5LwrEhzEQT8I+yjAQk94XwGnrLVg0tdVUZT2UtXKwK2d7OWZduUoPasDkmbxPhetSy+0+poGY1Aj1NZ/G6TVvwZkCOPeprCfbda89e66TDQUE0VgNnOtNrea4lcYq4gDDBf0FVrPAD6eXAI52QGk1uRcG6K+CbZOK9JICzDxzq0mEVfZtQQcL3hHAGeyHQzogAKQ8I3fcK44NDFDmqoo+e70jAUM1TT3d/d6m+jErncWZAFbTVADmOOpiHo7oeGahznq87GWz7NUj2uy1RQLn9iBW857d17Ua42mLGQI4r3uv+xeaIIBjdERDVTP1XIKpUBNRjVMiAPOeyf3ehCntFU+w72LtgiGYBpnioe5UERzSSgGcv5pYD83krCrF+EOtRTBAV6OqODCVqCaye7wK2FESc6n59h1snzhArJkuALPdfw2/0FSJ9Whnjb1BSJrmKtudFCRAJwqs5tFI63COWhylwEn8HY29fYmvv24PVE21i9QsM/Igr9rNXFI4pNUCONt1cDxA5F5Z6Gbl7FTCKED35sBsiQSTwqxkh9UTPsQahkb859o/h9koqmUy3P7JsK4hfSgAs5O/TrRI2ZyO9BnMiAAdbgl7Wf1jtI36AAenrT8LeaMlb2E78Bt7BGsJxrtTXFMwK2nOo0S6VwCGlG4ChzRbAijdBBC5Vw4700ozqZ4n+sBk1sxCztRWFtYuT2AWoqmJANYhUpwEzBLR9apFiuZ1aEtV2lb45WQvo9NQbx6whH+NwFi2M04ytfZgSLsEYCpQTYLCSZZYD51zNdbBod5rm9k5+joXzi1nf5fGXCnsHuU6k6K1BvORxGoGyO7RWcBTEkD0VQwNVffSpBe511H9KQWB+aRmAE5Gl0qFF7GYoz2ZF8yLOplEXTdptuo+rXug3lQAaqYKzEvPbMZL931oEJs2ueJrBuBklp4DzPap9IEEzFrdvSZwSNkSQPTEr3TogMb5ae/nNAXWyAdASNQePHw2AHdjU6G09/s4BmDuwz6CejYAlOaoXAkYij0N6goODVRulgAi/VJmPRR7du7rwAKz4BHFi/g4c9DqwfZ9p9ScJ27iWxgd216vWVhfVKkEzP5Mw0eqTeGAG2NyFYDI/a7m78ty3ct7uLUqP2K0/8wk6Gl0KfrGgXFsErSGO/EHbqSxggWRNcyUQCEVoVqYWl8QOJ7eUQCih+vpOfJL/dbjPa4YKurEspf/qTxnuyGFwVlkDxLFmd6ShfJwhqEKFGBoiuLyAG4Z9XPlzykAecG6Xk1ACfDuoRbO40S+Y51Kt9BbavdlhZ7gQ/JzM6SFvtcHotYroJC0jyzWJRzSUNRRCZw5ovhD7rWDah96ptM6uw+z1b4ZnkKLmRFZ6M0WLPRzVGvUQ6htGigk5aOKsYJDuhL1NgeGvkhI+JjjytJ49gUerLMO0WPQ18Ne60YWYyZFPtDRSbLYfZlOUNVBoUekU6IFUxdwPN2dfXZCbLr0Okzr68tawpZdPWBb/q2wxe7FCrwJkQGYZBkAEOlIpnMOFTWUuobjpftHXGuKeJ2+JOjTcHNYWnwdjLZGwBhrOHv0mbpqQQU8JgootPdLG1i1+uaTWMFRamNpKwzKbViqnhJyAq/kqLZnQCiUocajrqwrKOcUzjpM5bllV8Mrhbfpvj0JMsVHs7xOoCaikuoayDcCZxPGmpd394fJoREmH4xqm50KOKcynW89iRmYcw7nlcI+pnA8TdZYUNi1NG2f9H2EQ6KjElWRV3Q+w/H0tARO3PnqVrw6ZtYcbIxp3PmuwfE0OtPZ9owZGNL/ACb8oM7uZJ/5AAAAAElFTkSuQmCC\"","export default __webpack_public_path__ + \"static/media/iner_team.40077c05.png\";","import { Button, Card, Col, Row, Divider } from \"antd\";\r\nimport React from \"react\";\r\nimport { RocketOutlined } from \"@ant-design/icons\";\r\nimport gif1 from \"../assets/vi_1.gif\";\r\nimport nwp from \"../assets/spec_1.png\";\r\nimport ml from \"../assets/robot.svg\";\r\nimport wt from \"../assets/spec_3.png\";\r\nimport power from \"../assets/ser_img_6.png\";\r\nimport team from \"../assets/iner_team.png\";\r\n\r\nconst Welcome: React.FC = (props) => {\r\n return (\r\n
\r\n \r\n \r\n

Wind & solar energy forecasting

\r\n

\r\n We produce weather and energy forecasts for wind and PV farms up to 14 days ahead. Using historic data and adding individual turbine and\r\n PV plants' attributes into the calculation, we adjust our proprietary models to match closely the details of your sites.\r\n

\r\n

\r\n We incorporate a variety of models into an ensemble of forecasts to achieve the best and highest resolution, making the most accurate\r\n forecasts possible.\r\n

\r\n \r\n \r\n \"\"\r\n \r\n
\r\n \r\n \r\n

State of the art meteorological forecast models

\r\n \r\n
\r\n \r\n \r\n \r\n \"\"\r\n Numerical weather prediction\r\n

\r\n We run the most up to date numerical weather prediction models, which we combine with well established global models to generate the\r\n most accurate ensemble forecasts.\r\n

\r\n
\r\n \r\n \r\n \r\n \"\"\r\n Machine learning models\r\n

\r\n Our proprietary machine learning models, can receive real time feedback from wind turbines, in order to improve the short term\r\n forecast precision by orders of magnitude.\r\n

\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \"\"\r\n High resolution forecasts\r\n

\r\n We deliver forecast updates up to 4 times per hour, with high spatial & temporal resolution that goes up{\" \"}\r\n 15 minute steps and 0.5km horizontal grid density.\r\n

\r\n
\r\n \r\n \r\n \r\n \"\"\r\n User friendly platform\r\n

\r\n We offer a modern web based platform, where you can access forecasts for your site(s). Furthermore, we deliver forecast data in\r\n Excel and CSV format.\r\n

\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n Decades of experience\r\n \r\n

\r\n Meteogen is the product of years of research, experience and collaboration between meteorologists and software engineers. Our team also\r\n operates{\" \"}\r\n \r\n k24.net\r\n \r\n , one of the biggest weather forecasting websites in Greece.\r\n

\r\n \r\n \r\n \"\"\r\n \r\n
\r\n \r\n \r\n \r\n

Register now and get one month free forecasts for all your assets!

\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Welcome;\r\n","import { Button, Card, Col, Row, Divider } from \"antd\";\r\nimport React from \"react\";\r\nimport { RocketOutlined } from \"@ant-design/icons\";\r\nimport gif1 from \"../assets/vi_1.gif\";\r\nimport nwp from \"../assets/spec_1.png\";\r\nimport ml from \"../assets/robot.svg\";\r\nimport wt from \"../assets/spec_3.png\";\r\nimport power from \"../assets/ser_img_6.png\";\r\nimport team from \"../assets/iner_team.png\";\r\n\r\nconst WelcomeGr: React.FC = (props) => {\r\n return (\r\n
\r\n \r\n \r\n

Πρόγνωση καιρού και ενέργειας

\r\n

\r\n Η METEOGEN είναι μια ελληνική εταιρία παροχής προγνώσεων καιρού και ενέργειας για αιολικά και φωτοβολταϊκά πάρκα.\r\n

\r\n

\r\n Παρέχουμε υπερ-υψηλής χωρικής και χρονικής ανάλυσης προγνώσεις παραγωγής ενέργειας, καλύπτοντας πλήρως τις ανάγκες των\r\n καθημερινών συναλλαγών στις αγορές ενέργειας της Ελλάδας και της Ευρώπης,{\" \"}\r\n στις ανταγωνιστικότερες τιμές της αγοράς.\r\n

\r\n \r\n \r\n \"\"\r\n \r\n
\r\n \r\n \r\n

Τελευταίας τεχονολογίας προγνωστικά μοντέλα

\r\n \r\n
\r\n \r\n \r\n \r\n \"\"\r\n Αριθμητική πρόγνωση καιρού\r\n

\r\n Τρέχουμε τα πιο σύγχρονα μοντέλα αριθμητικής πρόγνωσης καιρού, τα οποία συνδυάζουμε με τα εγκυρότερα παγκόσμια μοντέλα καιρού ώστε\r\n να παράγουμε προγνώσεις πολύ υψηλής ακρίβειας.\r\n

\r\n
\r\n \r\n \r\n \r\n \"\"\r\n Μοντέλα machine learning\r\n

\r\n Τα μοντέλα προγνώσεων της METEOGEN χρησιμοποιούν αλγόριθμους machine learning, οι οποίοι λαμβάνουν υπόψη πλήθος παραγόντων που\r\n συμβάλουν στη διαμόρφωση της παραγωγής ενέργειας, όπως τη μικρομετεωρολογία κάθε περιοχής, την τοπογραφία, καθώς και τις σχετικές\r\n θέσεις των συστημάτων παραγωγής στο χώρο.\r\n

\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n \"\"\r\n Υποστήριξη\r\n

\r\n Στη METEOGEN δίνουμε πολύ μεγάλη σημασία στην υποστήριξη των πελατών. Εργαζόμαστε διαρκώς μαζί σας για την\r\n βελτιστοποίηση των προγνώσεων ενώ πάντοτε υπάρχει διαθέσιμος μηχανικός για την αντιμετώπιση προβλημάτων.\r\n

\r\n
\r\n \r\n \r\n \r\n \"\"\r\n Πλατφόρμα & API\r\n

\r\n Η METEOGEN διαθέτει ολοκληρωμένη πλατφόρμα διαχείρισης των προγνώσεων καθώς και πλήρες API για διασύνδεση με άλλα υποσυστήματα. Οι\r\n προγνώσεις παραδίδονται με διάφορους τρόπους και format, όπως μέσω API, Email ή web και σε Excel καθώς και CSV.\r\n

\r\n
\r\n \r\n
\r\n \r\n \r\n \r\n Δεκαετίες εμπειρίας\r\n \r\n

\r\n Η πρόγνωση μετεωρολογικών δεδομένων αποτελεί αντικείμενο της ομάδας της METEOGEN για πάνω από 17 χρόνια καλύπτοντας\r\n ανάγκες της ναυσιπλοΐα, της γεωργίας και άλλων πεδίων των ανθρώπινων δραστηριοτήτων που σχετίζονται με τον καιρό.\r\n

\r\n

\r\n Η ομάδα της METEOGEN επίσης διαχειρίζεται τον ιστότοπο πρόγνωσης καιρού{\" \"}\r\n \r\n k24.net\r\n \r\n , ένα από τα μεγαλύτερα site πρόγνωσης καιρού στην Ελλάδα.\r\n

\r\n \r\n \r\n \"\"\r\n \r\n
\r\n \r\n \r\n \r\n

Κάνετε εγγραφή και λάβετε δωρεάν πρόγνωση για ένα μήνα για όλα τα έργα σας!

\r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default WelcomeGr;\r\n","import { Col, Row } from \"antd\";\r\nimport React from \"react\";\r\n\r\nconst Terms: React.FC = (props) => {\r\n return (\r\n \r\n \r\n

TERMS OF USE

\r\n

\r\n Welcome to Meteogen, an online platform for weather & energy forecasting. By using this service, you agree to be bound by these Terms of\r\n Use, which constitute a legally binding agreement between you and Meteogen. Please read these Terms of Use carefully before using the\r\n website.\r\n

\r\n

1. ACCEPTANCE OF TERMS

\r\n By accessing or using this service, you agree to be bound by these Terms of Use and all applicable laws and regulations.If you do not agree to\r\n be bound by these Terms of Use, you may not access or use this website.\r\n

2. USE OF THE SERVICE

\r\n You may use this service only for lawful purposes and in accordance with these Terms of Use.You agree not to use this service:\r\n
    \r\n
  • In any way that violates any applicable federal, state, local or international law or regulation;
  • \r\n
  • \r\n To engage in any conduct that restricts or inhibits anyone's use or enjoyment of the service, or which, as determined by Meteogen, may\r\n harm Meteogen or users of the service or expose them to liability;\r\n
  • \r\n
  • To impersonate or attempt to impersonate Meteogen, a Meteogen employee, another user or any other person or entity;
  • \r\n
  • To engage in any other conduct that Meteogen determines, in its sole discretion, is harmful to Meteogen or its users.
  • \r\n
\r\n

3. INTELLECTUAL PROPERTY

\r\n The content, features, and functionality of this service, including but not limited to all information, software, text, displays, images, video,\r\n and audio, and the design, selection, and arrangement thereof, are owned by Meteogen, its licensors, or other providers of such material and are\r\n protected by United States and international copyright, trademark, patent, trade secret, and other intellectual property or proprietary rights\r\n laws.\r\n

4. DISCLAIMER OF WARRANTIES

\r\n THIS SERVICE AND ALL INFORMATION, CONTENT, MATERIALS, PRODUCTS, AND SERVICES INCLUDED ON OR OTHERWISE MADE AVAILABLE TO YOU THROUGH THIS SERVICE\r\n ARE PROVIDED BY Meteogen ON AN \"AS IS\" AND \"AS AVAILABLE\" BASIS, UNLESS OTHERWISE SPECIFIED IN WRITING.Meteogen MAKES NO REPRESENTATIONS OR\r\n WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, AS TO THE OPERATION OF THIS SERVICE OR THE INFORMATION, CONTENT, MATERIALS, PRODUCTS, OR SERVICES\r\n INCLUDED ON OR OTHERWISE MADE AVAILABLE TO YOU THROUGH THIS SERVICE, UNLESS OTHERWISE SPECIFIED IN WRITING.YOU EXPRESSLY AGREE THAT YOUR USE OF\r\n THIS SERVICE IS AT YOUR SOLE RISK.\r\n

5. LIMITATION OF LIABILITY

\r\n IN NO EVENT SHALL Meteogen, ITS OFFICERS, DIRECTORS, EMPLOYEES, OR AGENTS, BE LIABLE TO YOU FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r\n PUNITIVE, OR CONSEQUENTIAL DAMAGES WHATSOEVER RESULTING FROM ANY(I) ERRORS, MISTAKES, OR INACCURACIES OF CONTENT, (II) PERSONAL INJURY OR\r\n PROPERTY DAMAGE, OF ANY NATURE WHATSOEVER, RESULTING FROM YOUR ACCESS TO AND USE OF OUR SERVICE, (III) ANY UNAUTHORIZED ACCESS TO OR USE OF OUR\r\n SECURE SERVERS AND / OR ANY AND ALL PERSONAL INFORMATION AND / OR FINANCIAL INFORMATION STORED THEREIN, (IV) ANY INTERRUPTION OR CESSATION OF\r\n TRANSMISSION TO OR FROM OUR SERVICE, (V) ANY BUGS, VIRUSES, TROJAN HORSES, OR THE LIKE WHICH MAY BE TRANSMITTED TO OR THROUGH OUR SERVICE BY ANY\r\n THIRD PARTY, AND / OR(VI) ANY ERRORS OR OMISSIONS IN ANY CONTENT\r\n \r\n
\r\n );\r\n};\r\n\r\nexport default Terms;\r\n","import React, { useContext, useEffect, useState } from \"react\";\r\nimport { Button, Col, Empty, PageHeader, Result, Row, Table } from \"antd\";\r\nimport { ColumnsType } from \"antd/es/table\";\r\nimport { AppContext } from \"../state/State\";\r\n\r\ninterface ReportData {\r\n default: string;\r\n crida1: string;\r\n crida2: string;\r\n crida3: string;\r\n dayAhead: string;\r\n index: string;\r\n}\r\n\r\nconst Reports: React.FC = (props) => {\r\n const [loading, setLoading] = useState(true);\r\n const [hasError, setHasError] = useState(false);\r\n const [reportList, setReportList] = useState>([]);\r\n\r\n const context = useContext(AppContext);\r\n\r\n const fetchList = async () => {\r\n setLoading(true);\r\n setHasError(false);\r\n\r\n try {\r\n const response = await fetch(`/api/Reports/List`, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status === 200) {\r\n const list: Array<{ default: string; dayAhead: string; crida1: string; crida2: string; crida3: string }> = await response.json();\r\n setReportList(\r\n list.map((x, i) => {\r\n return { default: x.default, dayAhead: x.dayAhead, crida1: x.crida1, crida2: x.crida2, crida3: x.crida3, index: i + \"\" };\r\n })\r\n );\r\n } else {\r\n setHasError(true);\r\n }\r\n } catch (error) {\r\n setHasError(true);\r\n }\r\n\r\n setLoading(false);\r\n };\r\n\r\n const columns: ColumnsType = [\r\n {\r\n title: \"Default\",\r\n dataIndex: \"default\",\r\n render: (x) => (\r\n \r\n {x}\r\n \r\n )\r\n },\r\n {\r\n title: \"DAM\",\r\n dataIndex: \"dayAhead\",\r\n render: (x) => (\r\n \r\n {x}\r\n \r\n )\r\n },\r\n {\r\n title: \"CRIDA 1\",\r\n dataIndex: \"crida1\",\r\n render: (x) => (\r\n \r\n {x}\r\n \r\n )\r\n },\r\n {\r\n title: \"CRIDA 2\",\r\n dataIndex: \"crida2\",\r\n render: (x) => (\r\n \r\n {x}\r\n \r\n )\r\n },\r\n {\r\n title: \"CRIDA 3\",\r\n dataIndex: \"crida3\",\r\n render: (x) => (\r\n \r\n {x}\r\n \r\n )\r\n }\r\n ];\r\n\r\n useEffect(() => {\r\n fetchList();\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n {hasError && (\r\n \r\n \r\n \r\n Retry\r\n \r\n ]}\r\n >\r\n \r\n \r\n )}\r\n\r\n {!hasError && (loading || reportList.length > 0) &&
}\r\n\r\n {!hasError && !loading && reportList.length === 0 && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Reports;\r\n","export default __webpack_public_path__ + \"static/media/wind-turbine.3301bdba.svg\";","export default __webpack_public_path__ + \"static/media/solar-panel.dc73f5da.svg\";","export const excelDateToJSDate = (serial: number): Date => {\r\n const utc_days = Math.floor(serial - 25569);\r\n const utc_value = utc_days * 86400;\r\n const date_info = new Date(utc_value * 1000);\r\n\r\n const fractional_day = serial - Math.floor(serial) + 0.0000001;\r\n\r\n let total_seconds = Math.floor(86400 * fractional_day);\r\n\r\n const seconds = total_seconds % 60;\r\n\r\n total_seconds -= seconds;\r\n\r\n const hours = Math.floor(total_seconds / (60 * 60));\r\n const minutes = Math.floor(total_seconds / 60) % 60;\r\n\r\n // original code\r\n // return new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate(), hours, minutes, seconds);\r\n\r\n // we round to the closest 5' instead\r\n let d = new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate(), hours, minutes, 0).getTime();\r\n const fiveMinutes = 1000 * 60 * 5;\r\n return new Date(Math.round(d / fiveMinutes) * fiveMinutes);\r\n};\r\n","import {\r\n message,\r\n Upload,\r\n Button,\r\n Col,\r\n Form,\r\n Row,\r\n Select,\r\n Steps,\r\n UploadProps,\r\n Cascader,\r\n Divider,\r\n InputNumber,\r\n Table,\r\n Alert,\r\n Progress,\r\n Result,\r\n Modal,\r\n Input,\r\n notification\r\n} from \"antd\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { Asset } from \"../data/Asset\";\r\nimport {\r\n MinusCircleOutlined,\r\n PlusCircleOutlined,\r\n StepBackwardOutlined,\r\n StepForwardOutlined,\r\n FileExcelOutlined,\r\n ExclamationCircleOutlined\r\n} from \"@ant-design/icons\";\r\nimport * as XLSX from \"xlsx\";\r\nimport { useForm } from \"antd/es/form/Form\";\r\nimport moment from \"moment\";\r\nimport { excelDateToJSDate } from \"../Utils\";\r\nimport { ObservationPost } from \"../data/Observation\";\r\nimport { Link } from \"react-router-dom\";\r\nimport { DataUploadPreset } from \"../data/DataUploadPreset\";\r\nimport NoAssets from \"../components/NoAssets\";\r\n\r\nconst { Step } = Steps;\r\nconst { Option } = Select;\r\nconst { confirm } = Modal;\r\n\r\ntype MappedAsset = {\r\n assetId: string;\r\n productionColumn: Array;\r\n windDirectionColumn?: Array;\r\n windSpeedColumn?: Array;\r\n irradianceColumn?: Array;\r\n};\r\n\r\ntype Mapping = {\r\n dateColumn: Array;\r\n dateOffsetUtcMinutes: number;\r\n assetMappings: Array;\r\n productionUnits: \"Wh\" | \"KWh\" | \"MWh\" | \"KW\" | \"MW\";\r\n presetId?: string;\r\n};\r\n\r\ntype PreviewTableColumn = {\r\n title: string;\r\n dataIndex: string;\r\n key: string;\r\n children?: Array;\r\n};\r\n\r\nconst AssetData: React.FC<{ assets: Array | undefined }> = (props) => {\r\n const [currentStep, setCurrentStep] = useState(0);\r\n const [workBook, setWorkBook] = useState(null);\r\n const [mapping, setMapping] = useState(null);\r\n const [uploading, setUploading] = useState<{ active: boolean; progress: number; processed: number }>({ active: false, progress: 0, processed: 0 });\r\n const [hasError, setHasError] = useState(false);\r\n const [presets, setPresets] = useState>([]);\r\n const [presetSaveForm, setPresetSaveForm] = useState<{ loading: boolean; visible: boolean }>({ loading: false, visible: false });\r\n const [mappingsForm] = useForm();\r\n\r\n useEffect(() => {\r\n loadPresets();\r\n }, []);\r\n\r\n const loadPresets = async () => {\r\n const presetsResp = await fetch(`/api/DataUploadPresets`, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (presetsResp.status === 200) {\r\n setPresets(await presetsResp.json());\r\n }\r\n };\r\n\r\n const onSavePresetClick = async (values: any) => {\r\n setPresetSaveForm({ visible: true, loading: true });\r\n\r\n await fetch(`/api/DataUploadPresets`, {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n name: values[\"name\"],\r\n content: JSON.stringify(mapping)\r\n })\r\n });\r\n\r\n await loadPresets();\r\n\r\n clearUpload(false);\r\n };\r\n\r\n const setFormFromPreset = (presetId: string | undefined) => {\r\n if (!presetId) {\r\n return;\r\n }\r\n\r\n const preset = presets.find((x) => x.id === parseInt(presetId));\r\n if (!preset) {\r\n return;\r\n }\r\n\r\n mappingsForm.setFieldsValue(JSON.parse(preset.content));\r\n };\r\n\r\n const getPowerScaleFactor = (): number => {\r\n if (!mapping || !mapping.assetMappings || !workBook) {\r\n return 1;\r\n }\r\n\r\n switch (mapping.productionUnits) {\r\n case \"KW\":\r\n return 1;\r\n case \"MW\":\r\n return 1000;\r\n }\r\n\r\n const dateSheet = workBook!.Sheets[mapping.dateColumn[0]];\r\n const dateRange = XLSX.utils.decode_range(dateSheet[\"!ref\"]!);\r\n\r\n const cell1 = dateSheet[XLSX.utils.encode_cell({ c: parseInt(mapping.dateColumn[1]), r: dateRange.s.r + 1 })];\r\n const excelDate1 = cell1.v as number;\r\n const date1 = new Date(excelDateToJSDate(excelDate1).getTime() - mapping.dateOffsetUtcMinutes * 60 * 1000);\r\n\r\n const cell2 = dateSheet[XLSX.utils.encode_cell({ c: parseInt(mapping.dateColumn[1]), r: dateRange.s.r + 2 })];\r\n const excelDate2 = cell2.v as number;\r\n const date2 = new Date(excelDateToJSDate(excelDate2).getTime() - mapping.dateOffsetUtcMinutes * 60 * 1000);\r\n\r\n const diffMinutes = (date2.getTime() - date1.getTime()) / 1000 / 60;\r\n\r\n if (diffMinutes > 60 || diffMinutes <= 0) {\r\n return 1;\r\n }\r\n\r\n const factor = 60 / diffMinutes;\r\n let scale = 1;\r\n if (mapping.productionUnits === \"MWh\") {\r\n scale = 1000;\r\n } else if (mapping.productionUnits === \"Wh\") {\r\n scale = 0.001;\r\n }\r\n\r\n return factor * scale;\r\n };\r\n\r\n const getUploadColumns = () => {\r\n if (!mapping || !mapping.assetMappings) {\r\n return [];\r\n }\r\n\r\n let columns: Array = [\r\n {\r\n title: \"Date UTC\",\r\n dataIndex: \"dateUtc\",\r\n key: \"dateUtc\"\r\n }\r\n ];\r\n\r\n mapping!.assetMappings.forEach((am, ai) => {\r\n const asset = props.assets!.find((x) => x.id === parseInt(am.assetId))!;\r\n let children: Array = [\r\n {\r\n title: \"Power KW\",\r\n dataIndex: `power_${asset.id}`,\r\n key: `power_${asset.id}`\r\n }\r\n ];\r\n\r\n if (am.windSpeedColumn) {\r\n children.push({\r\n title: \"Wind speed m/s\",\r\n dataIndex: `windSpeed_${asset.id}`,\r\n key: `windSpeed_${asset.id}`\r\n });\r\n }\r\n\r\n if (am.windDirectionColumn) {\r\n children.push({\r\n title: \"Wind direction\",\r\n dataIndex: `windDirection_${asset.id}`,\r\n key: `windDirection_${asset.id}`\r\n });\r\n }\r\n\r\n if (am.irradianceColumn) {\r\n children.push({\r\n title: \"Irradiance\",\r\n dataIndex: `irradiance_${asset.id}`,\r\n key: `irradiance_${asset.id}`\r\n });\r\n }\r\n\r\n columns.push({\r\n title: asset.name,\r\n dataIndex: \"asset\",\r\n key: \"asset\",\r\n children: children\r\n });\r\n });\r\n\r\n return columns;\r\n };\r\n\r\n const getUploadDataPreview = () => {\r\n if (!mapping || !mapping.assetMappings || !workBook) {\r\n return [];\r\n }\r\n\r\n const powerScaleFactor = getPowerScaleFactor();\r\n\r\n const dateSheet = workBook!.Sheets[mapping.dateColumn[0]];\r\n const dateRange = XLSX.utils.decode_range(dateSheet[\"!ref\"]!);\r\n\r\n let data = [];\r\n for (let i = 1; i < Math.min(101, dateRange.e.r); i++) {\r\n let cell = dateSheet[XLSX.utils.encode_cell({ c: parseInt(mapping.dateColumn[1]), r: dateRange.s.r + i })];\r\n\r\n const excelDateValue = cell.v as any;\r\n let excelDate: Date;\r\n if (typeof excelDateValue === \"string\") {\r\n excelDate = moment(excelDateValue, \"YYYY-MM-DD HH:mm:ss\").toDate();\r\n } else {\r\n excelDate = excelDateToJSDate(excelDateValue);\r\n }\r\n\r\n const date = new Date(excelDate.getTime() - mapping.dateOffsetUtcMinutes * 60 * 1000);\r\n let row = {\r\n key: i,\r\n dateUtc: moment(date).format(\"YYYY-MM-DD HH:mm:ss\")\r\n };\r\n\r\n data.push(row);\r\n\r\n mapping.assetMappings.forEach((am, ai) => {\r\n const asset = props.assets!.find((x) => x.id === parseInt(am.assetId))!;\r\n\r\n const productionSheet = workBook!.Sheets[am.productionColumn[0]];\r\n let productionCell = productionSheet[XLSX.utils.encode_cell({ c: parseInt(am.productionColumn[1]), r: dateRange.s.r + i })];\r\n\r\n if (!productionCell) {\r\n return;\r\n }\r\n\r\n Object.assign(row, { [`power_${asset.id}`]: ((productionCell.v as number) * powerScaleFactor).toFixed(3) });\r\n\r\n if (am.windSpeedColumn) {\r\n const windSpeedSheet = workBook!.Sheets[am.windSpeedColumn[0]];\r\n const windSpeedCell = windSpeedSheet[XLSX.utils.encode_cell({ c: parseInt(am.windSpeedColumn[1]), r: dateRange.s.r + i })];\r\n Object.assign(row, { [`windSpeed_${asset.id}`]: windSpeedCell.v as number });\r\n }\r\n\r\n if (am.windDirectionColumn) {\r\n const windDirectionSheet = workBook!.Sheets[am.windDirectionColumn[0]];\r\n const windDirectionCell = windDirectionSheet[XLSX.utils.encode_cell({ c: parseInt(am.windDirectionColumn[1]), r: dateRange.s.r + i })];\r\n Object.assign(row, { [`windDirection_${asset.id}`]: windDirectionCell.v as number });\r\n }\r\n\r\n if (am.irradianceColumn) {\r\n const irradianceSheet = workBook!.Sheets[am.irradianceColumn[0]];\r\n const irradianceCell = irradianceSheet[XLSX.utils.encode_cell({ c: parseInt(am.irradianceColumn[1]), r: dateRange.s.r + i })];\r\n Object.assign(row, { [`irradiance_${asset.id}`]: irradianceCell.v as number });\r\n }\r\n });\r\n }\r\n\r\n return data;\r\n };\r\n\r\n const getHeaderRow = (sheet: XLSX.WorkSheet): Array<{ value: string; label: string }> => {\r\n let headers = [];\r\n let range = XLSX.utils.decode_range(sheet[\"!ref\"]!);\r\n let C,\r\n R = range.s.r; /* start in the first row */\r\n\r\n /* walk every column in the range */\r\n for (C = range.s.c; C <= range.e.c; ++C) {\r\n let cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })];\r\n\r\n let hdr = \"UNKNOWN \" + C;\r\n if (cell && cell.t) {\r\n hdr = XLSX.utils.format_cell(cell);\r\n }\r\n\r\n headers.push({ value: `${C}`, label: hdr });\r\n }\r\n\r\n return headers;\r\n };\r\n\r\n const getWorkBookAsCascader = () => {\r\n if (!workBook || !workBook.SheetNames) {\r\n return [];\r\n }\r\n\r\n return workBook!.SheetNames.map((sheetName) => {\r\n return {\r\n value: sheetName,\r\n label: sheetName,\r\n children: getHeaderRow(workBook!.Sheets[sheetName])\r\n };\r\n });\r\n };\r\n\r\n const uploadObservations = async () => {\r\n if (!mapping || !mapping.assetMappings || !workBook) {\r\n return;\r\n }\r\n\r\n setUploading({ active: true, progress: 0, processed: 0 });\r\n\r\n const powerScaleFactor = getPowerScaleFactor();\r\n const dateSheet = workBook!.Sheets[mapping.dateColumn[0]];\r\n const dateRange = XLSX.utils.decode_range(dateSheet[\"!ref\"]!);\r\n\r\n const totalRecords = mapping.assetMappings.length * dateRange.e.r;\r\n let processed = 0;\r\n\r\n let data: Array = [];\r\n for (let i = 1; i < dateRange.e.r; i++) {\r\n let cell = dateSheet[XLSX.utils.encode_cell({ c: parseInt(mapping.dateColumn[1]), r: dateRange.s.r + i })];\r\n\r\n if (!cell) {\r\n break;\r\n }\r\n\r\n const excelDateValue = cell.v as any;\r\n let excelDate: Date;\r\n if (typeof excelDateValue === \"string\") {\r\n excelDate = moment(excelDateValue, \"YYYY-MM-DD HH:mm:ss\").toDate();\r\n } else {\r\n excelDate = excelDateToJSDate(excelDateValue);\r\n }\r\n\r\n const date = new Date(excelDate.getTime() - mapping.dateOffsetUtcMinutes * 60 * 1000);\r\n\r\n const records = mapping.assetMappings.map((am, ai) => {\r\n const asset = props.assets!.find((x) => x.id === parseInt(am.assetId))!;\r\n\r\n const productionSheet = workBook!.Sheets[am.productionColumn[0]];\r\n const productionCell = productionSheet[XLSX.utils.encode_cell({ c: parseInt(am.productionColumn[1]), r: dateRange.s.r + i })];\r\n\r\n if (!productionCell) {\r\n return null;\r\n }\r\n\r\n let record: ObservationPost = {\r\n assetId: asset.id,\r\n date: moment(date).format(\"YYYY-MM-DDTHH:mm:ss.000\") + \"Z\",\r\n power: (productionCell.v as number) * powerScaleFactor\r\n };\r\n\r\n if (am.windSpeedColumn) {\r\n const windSpeedSheet = workBook!.Sheets[am.windSpeedColumn[0]];\r\n const windSpeedCell = windSpeedSheet[XLSX.utils.encode_cell({ c: parseInt(am.windSpeedColumn[1]), r: dateRange.s.r + i })];\r\n if (windSpeedCell) {\r\n record.windSpeed = windSpeedCell.v as number;\r\n }\r\n }\r\n\r\n if (am.windDirectionColumn) {\r\n const windDirectionSheet = workBook!.Sheets[am.windDirectionColumn[0]];\r\n const windDirectionCell = windDirectionSheet[XLSX.utils.encode_cell({ c: parseInt(am.windDirectionColumn[1]), r: dateRange.s.r + i })];\r\n if (windDirectionCell) {\r\n record.windDirection = windDirectionCell.v as number;\r\n }\r\n }\r\n\r\n if (am.irradianceColumn) {\r\n const irradianceSheet = workBook!.Sheets[am.irradianceColumn[0]];\r\n const irradianceCell = irradianceSheet[XLSX.utils.encode_cell({ c: parseInt(am.irradianceColumn[1]), r: dateRange.s.r + i })];\r\n if (irradianceCell) {\r\n record.irradiance = irradianceCell.v as number;\r\n }\r\n }\r\n\r\n return record;\r\n });\r\n\r\n for (let i = 0; i < records.length; i++) {\r\n const r = records[i];\r\n if (r !== null && r !== undefined) {\r\n data.push(r);\r\n }\r\n }\r\n\r\n if (data.length >= 500) {\r\n const uploadPartResponse = await fetch(`/api/Assets/Observations`, {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify(data)\r\n });\r\n\r\n if (uploadPartResponse.status !== 204) {\r\n notification.error({\r\n message: \"Uploading observations failed\",\r\n description: `Between rows ${i - 500} and ${i}:\\r\\n${await uploadPartResponse.text()}`\r\n });\r\n } else {\r\n processed += data.length;\r\n }\r\n\r\n data = [];\r\n setUploading({ active: true, progress: Math.min(100, Math.round((processed * 100) / totalRecords)), processed: processed });\r\n }\r\n }\r\n\r\n if (data.length > 0) {\r\n const uploadPartResponse = await fetch(`/api/Assets/Observations`, {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify(data)\r\n });\r\n\r\n if (uploadPartResponse.status !== 204) {\r\n notification.error({\r\n message: \"Uploading observations failed\",\r\n description: `At the last ${data.length} rows:\\r\\n${await uploadPartResponse.text()}`\r\n });\r\n } else {\r\n processed += data.length;\r\n }\r\n }\r\n\r\n setUploading({ active: true, progress: 100, processed: processed });\r\n };\r\n\r\n const clearUpload = async (askSavePreset: boolean) => {\r\n if (askSavePreset && !mapping?.presetId) {\r\n confirm({\r\n title: \"Save preset?\",\r\n icon: ,\r\n content: \"You can save this configuration for future use.\",\r\n onOk() {\r\n setPresetSaveForm({ loading: false, visible: true });\r\n },\r\n onCancel() {\r\n clearUpload(false);\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n if (askSavePreset && mapping?.presetId) {\r\n const preset = presets.find((x) => x.id === parseInt(mapping?.presetId ?? \"-1\"));\r\n if (preset) {\r\n await fetch(`/api/DataUploadPresets/${preset.id}`, {\r\n method: \"PUT\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n id: preset.id,\r\n name: preset.name,\r\n content: JSON.stringify(mapping)\r\n })\r\n });\r\n\r\n await loadPresets();\r\n }\r\n }\r\n\r\n setHasError(false);\r\n setPresetSaveForm({ loading: false, visible: false });\r\n setUploading({ active: false, progress: 0, processed: 0 });\r\n setWorkBook(null);\r\n setMapping(null);\r\n setCurrentStep(0);\r\n setHasError(false);\r\n mappingsForm.resetFields();\r\n };\r\n\r\n const fileProps: UploadProps = {\r\n accept: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\r\n onChange: (info: any) => {\r\n if (info.fileList.length === 0) {\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n const rABS = !!reader.readAsBinaryString;\r\n\r\n reader.onload = (e) => {\r\n const bstr = e.target?.result;\r\n const wb = XLSX.read(bstr, { type: rABS ? \"binary\" : \"array\" });\r\n setWorkBook(wb);\r\n };\r\n\r\n reader.onerror = (e) => {\r\n console.log(e);\r\n };\r\n\r\n if (rABS) {\r\n reader.readAsBinaryString(info.file as File);\r\n } else {\r\n reader.readAsArrayBuffer(info.file as File);\r\n }\r\n },\r\n beforeUpload: (file: any) => {\r\n return false;\r\n },\r\n multiple: false,\r\n maxCount: 1\r\n };\r\n\r\n const steps = [\r\n {\r\n title: \"Select a file\",\r\n content: (\r\n \r\n \r\n

\r\n In this section you can upload observation data for multiple assets, so that we can build ML forecast models for each one of them.\r\n This way the forecasts become much more accurate.\r\n

\r\n \r\n \r\n \r\n \r\n
\r\n )\r\n },\r\n {\r\n title: \"Map data\",\r\n content: (\r\n
\r\n {presets.length > 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n\r\n \r\n {(fields, { add, remove }) => (\r\n <>\r\n {fields.map(({ key, name, ...restField }) => (\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n },\r\n {\r\n title: \"Upload\",\r\n content: (\r\n <>\r\n \r\n

WARNING!

\r\n

This will overwrite existing observations for the same dates and assets.

\r\n

Please validate the data before uploading. Posting wrong values will severely impact the forecasting procedure.

\r\n
    \r\n
  • \r\n Dates will be converted to UTC.\r\n
  • \r\n
  • \r\n Production will be converted to power (KW), make sure you selected the appropriate input unit.\r\n
  • \r\n
\r\n

\r\n If the data below doesn't look correct, go to the previous steps and adjust the dates and power conversion accordingly or\r\n fix them in Excel and upload a new file.\r\n

\r\n \r\n }\r\n type=\"warning\"\r\n />\r\n \r\n \r\n )\r\n }\r\n ];\r\n\r\n const next = async () => {\r\n if (currentStep === 1) {\r\n mappingsForm\r\n .validateFields()\r\n .then((values) => {\r\n const mapping = values as Mapping;\r\n if (!mapping.assetMappings || mapping.assetMappings.length === 0) {\r\n message.error(\"Please add at least one mapping\");\r\n return;\r\n }\r\n\r\n setMapping(mapping);\r\n setCurrentStep(currentStep + 1);\r\n })\r\n .catch((e) => {});\r\n\r\n return;\r\n }\r\n\r\n setCurrentStep(currentStep + 1);\r\n };\r\n\r\n const prev = () => {\r\n setCurrentStep(currentStep - 1);\r\n };\r\n\r\n const renderPage = () => {\r\n if (props.assets?.length === 0) {\r\n return ;\r\n }\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n {steps.map((item) => (\r\n \r\n ))}\r\n \r\n \r\n \r\n
{steps[currentStep].content}
\r\n \r\n \r\n {currentStep > 0 && (\r\n \r\n )}\r\n {((currentStep === 0 && workBook !== null) || currentStep === 1) && (\r\n \r\n )}\r\n {currentStep === steps.length - 1 && (\r\n {\r\n try {\r\n await uploadObservations();\r\n } catch (e) {\r\n console.log(e);\r\n setHasError(true);\r\n }\r\n }}\r\n >\r\n Upload\r\n \r\n )}\r\n \r\n \r\n \r\n );\r\n };\r\n\r\n return (\r\n <>\r\n {hasError && (\r\n \r\n \r\n clearUpload(false)}>\r\n Retry\r\n \r\n ]}\r\n >\r\n \r\n \r\n )}\r\n {!hasError &&\r\n (uploading.active ? (\r\n uploading.progress === 100 ? (\r\n \r\n You can inspect them in the Charts section. The system will start processing them soon.\r\n \r\n }\r\n extra={[\r\n \r\n ]}\r\n />\r\n ) : (\r\n <>\r\n

Please wait while the data is being processed.

\r\n \r\n \r\n )\r\n ) : (\r\n renderPage()\r\n ))}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n
\r\n \r\n {\r\n clearUpload(false);\r\n }}\r\n >\r\n Cancel\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n};\r\n\r\nexport default AssetData;\r\n","import React, { useCallback, useContext, useEffect, useRef, useState } from \"react\";\r\nimport { message, Button, Col, Empty, Input, Modal, PageHeader, Result, Row, Space, Table, Tabs } from \"antd\";\r\nimport { ColumnsType } from \"antd/es/table\";\r\nimport { AppContext } from \"../state/State\";\r\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\";\r\nimport { faList, faMap, faDatabase } from \"@fortawesome/free-solid-svg-icons\";\r\nimport { Asset } from \"../data/Asset\";\r\nimport { Park } from \"../data/Park\";\r\nimport windTurbine from \"../assets/wind-turbine.svg\";\r\nimport solarPanel from \"../assets/solar-panel.svg\";\r\nimport windGauge from \"../assets/wind-gauge.png\";\r\nimport { fromLonLat } from \"ol/proj\";\r\nimport { boundingExtent } from \"ol/extent\";\r\nimport { Point } from \"ol/geom\";\r\nimport { RMap, ROSM, RLayerVector, RFeature, RStyle } from \"rlayers\";\r\nimport Highlighter from \"react-highlight-words\";\r\nimport \"ol/ol.css\";\r\nimport { Link, useHistory } from \"react-router-dom\";\r\nimport { ExclamationCircleOutlined, PlusOutlined, SearchOutlined, DeleteFilled, EditOutlined, FileExcelOutlined } from \"@ant-design/icons\";\r\nimport { FilterConfirmProps, FilterDropdownProps } from \"antd/lib/table/interface\";\r\nimport { Portfolio } from \"../data/Portfolio\";\r\nimport AssetData from \"./AssetData\";\r\nimport { saveAs } from \"file-saver\";\r\nimport * as XLSX from \"xlsx\";\r\n\r\nconst { confirm } = Modal;\r\n\r\nlet mapCentered = false;\r\n\r\nconst Assets: React.FC = (props) => {\r\n const [loading, setLoading] = useState(true);\r\n const [hasError, setHasError] = useState(false);\r\n const [data, setData] = useState<{ assets: Array; parks: Array; portfolios: Array } | null>(null);\r\n const [search, setSearch] = useState<{ text: string; column: React.ReactNode | null }>({ text: \"\", column: null });\r\n const context = useContext(AppContext);\r\n const searchInput = useRef(null);\r\n const history = useHistory();\r\n\r\n const confirmDeleteAsset = (asset: Asset) => {\r\n confirm({\r\n title: `Are you sure you want to delete ${asset.name}?`,\r\n icon: ,\r\n content: \"This action cannot be undone!\",\r\n okText: \"Yes\",\r\n okType: \"danger\",\r\n cancelText: \"No\",\r\n onOk: async () => {\r\n const response = await fetch(`/api/Assets/${asset.id}`, {\r\n method: \"DELETE\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status < 400) {\r\n message.success(\"Asset deleted.\");\r\n await fetchData();\r\n } else {\r\n message.error(`Error deleting ${asset.name}.`);\r\n }\r\n },\r\n onCancel() {}\r\n });\r\n };\r\n\r\n const handleExport = () => {\r\n if (!data?.assets) return;\r\n const exportData = data.assets.map((asset) => ({\r\n Name: asset.name,\r\n ExternalId: asset.externalId,\r\n Park: asset.park?.name,\r\n Portfolio: asset.portfolio?.name,\r\n Type: asset.type,\r\n \"Capacity (KW)\": asset.capacity\r\n }));\r\n\r\n const headers = Object.keys(exportData[0]) as (keyof (typeof exportData)[0])[];\r\n\r\n const columnWidths = headers.map((key) => ({\r\n wch: Math.max(key.length, ...exportData.map((row) => (row[key] ? row[key]!.toString().length : 0))) + 5\r\n }));\r\n\r\n const worksheet = XLSX.utils.json_to_sheet(exportData);\r\n worksheet[\"!cols\"] = columnWidths;\r\n\r\n const workbook = XLSX.utils.book_new();\r\n XLSX.utils.book_append_sheet(workbook, worksheet, \"Assets\");\r\n const excelBuffer = XLSX.write(workbook, { bookType: \"xlsx\", type: \"array\" });\r\n const blob = new Blob([excelBuffer], { type: \"application/octet-stream\" });\r\n saveAs(blob, \"assets.xlsx\");\r\n };\r\n\r\n const getColumnSearchProps = (dataIndex: string) => ({\r\n filterDropdown: (props: FilterDropdownProps) => (\r\n
\r\n props.setSelectedKeys(e.target.value ? [e.target.value] : [])}\r\n onPressEnter={() => handleSearch(props.selectedKeys, props.confirm, dataIndex)}\r\n style={{ marginBottom: 8, display: \"block\" }}\r\n />\r\n \r\n handleSearch(props.selectedKeys, props.confirm, dataIndex)}\r\n icon={}\r\n size=\"small\"\r\n style={{ width: 90 }}\r\n >\r\n Search\r\n \r\n \r\n {\r\n props.confirm({ closeDropdown: false });\r\n setSearch({ text: props.selectedKeys[0] as string, column: dataIndex });\r\n }}\r\n >\r\n Filter\r\n \r\n \r\n
\r\n ),\r\n filterIcon: (filtered: boolean) => ,\r\n onFilter: (value: string | number | boolean, record: Asset) => {\r\n switch (dataIndex) {\r\n case \"name\":\r\n case \"type\":\r\n return (record as any)[dataIndex]\r\n .toString()\r\n .toLowerCase()\r\n .includes((value as string).toLowerCase()) as boolean;\r\n case \"park\":\r\n return (record.park?.name.toString().toLowerCase() ?? \"\").includes((value as string).toLowerCase()) as boolean;\r\n case \"portfolio\":\r\n return (record.portfolio?.name.toString().toLowerCase() ?? \"\").includes((value as string).toLowerCase()) as boolean;\r\n case \"externalId\":\r\n return (record.externalId?.toString().toLowerCase() ?? \"\").includes((value as string).toLowerCase()) as boolean;\r\n default:\r\n return false;\r\n }\r\n },\r\n onFilterDropdownVisibleChange: (visible: boolean) => {\r\n if (visible) {\r\n setTimeout(() => searchInput.current?.select(), 100);\r\n }\r\n },\r\n render: (text: string, record: Asset) => {\r\n if (dataIndex === \"name\") {\r\n if (search.column === dataIndex) {\r\n return (\r\n \r\n \r\n \r\n );\r\n } else {\r\n return {text};\r\n }\r\n } else if (search.column === dataIndex) {\r\n return (\r\n \r\n );\r\n }\r\n\r\n return text;\r\n }\r\n });\r\n\r\n const handleSearch = (selectedKeys: Array, confirm: (param?: FilterConfirmProps) => void, dataIndex: string) => {\r\n confirm();\r\n setSearch({ text: selectedKeys[0] as string, column: dataIndex });\r\n };\r\n\r\n const handleReset = (clearFilters?: () => void) => {\r\n clearFilters?.();\r\n setSearch({ text: \"\", column: search.column });\r\n };\r\n\r\n const fetchData = async () => {\r\n setLoading(true);\r\n setHasError(false);\r\n\r\n let assets: Array = [];\r\n\r\n try {\r\n const response = await fetch(`/api/Assets`, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status === 200) {\r\n assets = await response.json();\r\n } else {\r\n setHasError(true);\r\n setLoading(false);\r\n return;\r\n }\r\n } catch (error) {\r\n setHasError(true);\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n let parks: Array = [];\r\n\r\n try {\r\n const response = await fetch(`/api/Parks`, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status === 200) {\r\n parks = await response.json();\r\n } else {\r\n setHasError(true);\r\n setLoading(false);\r\n return;\r\n }\r\n } catch (error) {\r\n setHasError(true);\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n assets?.forEach((x) => (x.park = parks?.find((y) => y.id === x.parkId)));\r\n\r\n let portfolios: Array = [];\r\n\r\n try {\r\n const response = await fetch(`/api/Portfolios`, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status === 200) {\r\n portfolios = await response.json();\r\n } else {\r\n setHasError(true);\r\n setLoading(false);\r\n return;\r\n }\r\n } catch (error) {\r\n setHasError(true);\r\n setLoading(false);\r\n return;\r\n }\r\n\r\n assets?.forEach((x) => (x.portfolio = portfolios?.find((y) => y.id === x.portfolioId)));\r\n\r\n setData({ assets: assets, parks: parks, portfolios: portfolios });\r\n setLoading(false);\r\n };\r\n\r\n const columns: ColumnsType = [\r\n {\r\n title: \"Name\",\r\n dataIndex: \"name\",\r\n ...getColumnSearchProps(\"name\"),\r\n sorter: (a, b) => a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase()),\r\n defaultSortOrder: \"ascend\"\r\n },\r\n {\r\n title: \"External ID\",\r\n dataIndex: \"externalId\",\r\n ...getColumnSearchProps(\"externalId\"),\r\n sorter: (a, b) => (a.externalId || \"\").localeCompare(b.externalId || \"\")\r\n },\r\n {\r\n title: \"Park\",\r\n dataIndex: [\"park\", \"name\"],\r\n ...getColumnSearchProps(\"park\"),\r\n sorter: (a, b) => (a.park?.name ?? \"\").toLocaleLowerCase().localeCompare((b.park?.name ?? \"\").toLocaleLowerCase())\r\n },\r\n {\r\n title: \"Portfolio\",\r\n dataIndex: [\"portfolio\", \"name\"],\r\n ...getColumnSearchProps(\"portfolio\"),\r\n sorter: (a, b) => (a.portfolio?.name ?? \"\").toLocaleLowerCase().localeCompare((b.portfolio?.name ?? \"\").toLocaleLowerCase())\r\n },\r\n {\r\n title: \"Type\",\r\n dataIndex: \"type\",\r\n ...getColumnSearchProps(\"type\"),\r\n sorter: (a, b) => a.type.localeCompare(b.type)\r\n },\r\n {\r\n title: \"Capacity\",\r\n dataIndex: \"capacity\",\r\n render: (capacity) =>
{capacity}KW
,\r\n sorter: (a, b) => a.capacity - b.capacity\r\n },\r\n {\r\n title: \"Action\",\r\n dataIndex: \"action\",\r\n render: (text, record) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n {\r\n confirmDeleteAsset(record);\r\n }}\r\n danger\r\n type=\"primary\"\r\n icon={}\r\n >\r\n \r\n );\r\n }\r\n }\r\n ];\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, []);\r\n\r\n const postRenderCallback = useCallback(\r\n (e) => {\r\n if (mapCentered || data === null || data!.assets.length === 0) {\r\n return;\r\n }\r\n\r\n e.map.getView().fit(boundingExtent(data!.assets.map((x) => fromLonLat([x.longitude, x.latitude]))));\r\n mapCentered = true;\r\n },\r\n [data]\r\n );\r\n\r\n return (\r\n <>\r\n \r\n {hasError && (\r\n \r\n
\r\n \r\n Retry\r\n \r\n ]}\r\n >\r\n \r\n \r\n )}\r\n\r\n {!hasError && (loading || data != null) && (\r\n \r\n \r\n List\r\n \r\n }\r\n key=\"1\"\r\n >\r\n {\r\n let totalWt = 0;\r\n let totalPv = 0;\r\n let totalCapacity = 0;\r\n\r\n data?.assets.forEach((x) => {\r\n totalWt += x.type === \"WindTurbine\" ? 1 : 0;\r\n totalPv += x.type === \"PhotovoltaicArray\" ? 1 : 0;\r\n totalCapacity += x.capacity;\r\n });\r\n\r\n return (\r\n <>\r\n \r\n \r\n
{totalWt} wind turbines
\r\n
{totalPv} PV parks
\r\n
{Math.round(10 * (totalCapacity / 1000)) / 10}MW capacity
\r\n
\r\n \r\n \r\n }\r\n >\r\n Export to Excel\r\n \r\n \r\n
\r\n \r\n \r\n If you have a lot of assets, instead of adding them one by one, you can either send them as an Excel file to{\" \"}\r\n info@meteogen.com or{\" \"}\r\n \r\n use the API\r\n {\" \"}\r\n to add them programmatically.\r\n \r\n \r\n \r\n );\r\n }}\r\n >
\r\n \r\n \r\n Map\r\n \r\n }\r\n key=\"2\"\r\n >\r\n \r\n \r\n \r\n {data?.assets\r\n .filter((x) => x.type === \"WindTurbine\")\r\n .map((x) => {\r\n return (\r\n \r\n // e.map.getView().fit(e.target.getGeometry().getExtent(), {\r\n // duration: 250,\r\n // maxZoom: 15,\r\n // })\r\n // }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n {data?.assets\r\n .filter((x) => x.type === \"PhotovoltaicArray\")\r\n .map((x) => {\r\n return (\r\n \r\n // e.map.getView().fit(e.target.getGeometry().getExtent(), {\r\n // duration: 250,\r\n // maxZoom: 15,\r\n // })\r\n // }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n {data?.assets\r\n .filter((x) => x.type === \"Other\")\r\n .map((x) => {\r\n return (\r\n \r\n // e.map.getView().fit(e.target.getGeometry().getExtent(), {\r\n // duration: 250,\r\n // maxZoom: 15,\r\n // })\r\n // }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n );\r\n })}\r\n \r\n \r\n \r\n \r\n Upload training data\r\n \r\n }\r\n key=\"3\"\r\n >\r\n \r\n \r\n \r\n )}\r\n\r\n {!hasError && !loading && data === null && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Assets;\r\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAADEUlEQVRoge2Yu24TQRSGvxjLCeCGhgaR0IWQAG4gBNNCBTRcGmpqeAkIVBADjwAEiQfgIgESNBGichBRLINELgIhISKhxEEEU8wZebzM7s7Y2Nkk+0uj8fpc5v9ndmfOLjRjALgHfAR+AZ+AEtCPH4Yl7j3wU9o0MAEc8MzVL3GzwKoLp7PAElC3tCXgtMOgvcBdYC0kT11sJfGNwxlfTseBmjg8AEaA/ahV0YE18QtDH/BcfFeA28BRYKe0UdTM6nGexogpWjgNRnHKAjNimAgkuy//f5d+BtgWMvAd8fkMHIwgeBiYCxnP5DTryOmD+HNB/pjl3xm6LLbHRuLzloFHULfMSowIU0xNYmzPzMVWOE3KxRVLwoLYysBVGsschF6NWw4iNEqEr4ovp4egdoE69pnZI7YvYtezFERZbEfcdTBqEAqi4smpCrAsF9stQX00HqodhO9EuuU9hOQd8rlyWs4YDj2WIG2vh9jbQSbexZnTnwxqiQD2WYJ2Sb9k2CuSwGzTYvM57LRv2ZKv4snpawaYkotTlqDd0n8DTsrvtxa/V9JfiiFvQvu+tNjeeXKaArV1uWx1+gE8Z0k+jNpKa6itNQ4FVLmxBgxZ7K5HQhOnLOpQqaO2RBO2wyfsQNTb6VyMmAIwT/R2bR7SLpyy2miWKJPAIdRM+ZQovcAzw7cEHEPtTnlgDHXerIrPEyAXkc/k9Eg42cqmsWBgVIH2A/eicYLoovE3aiXaLRojOemSuYoqN6pyvddhUBNDqKKxTKOML4uAQc9cA6iVrKJWs1VOKTT0rdBRuJyuGwKpkKQhFZI0pEKShi0jJAfcBBaJfy0Naxqtxi8A40QXmLG40QaB/92utyNkQZJEle+dRpHGyrSMrtRJDojl4fuwv6B7t9JrH2Jxn3j0LPQErruF4LihfLNhBscBOgXvCdsy58iGQSokaUiFJA2bRkir50gSypYm+K7Im46wsMOrRInDpi0aE4tUSNKwZYQsSl/sNJEInJC+rVfdcdb/o4Nu19oRkhMx+iPEerR5ERH5Oegvy9DDZi6wyAgAAAAASUVORK5CYII=\"","import { Button, Col, Form, Input, InputNumber, Modal, Result, Row, Select, Skeleton } from \"antd\";\r\nimport React, { useEffect, useState } from \"react\";\r\nimport { Asset as AssetEntity, AssetProps, AssetType } from \"../data/Asset\";\r\nimport { Park } from \"../data/Park\";\r\nimport { Portfolio } from \"../data/Portfolio\";\r\nimport { SyncOutlined } from \"@ant-design/icons\";\r\nimport { useHistory } from \"react-router\";\r\n\r\nconst { Option } = Select;\r\n\r\nconst Asset: React.FC<{ id: string }> = (props) => {\r\n const [portfolios, setPortfolios] = useState>([]);\r\n const [parks, setParks] = useState>([]);\r\n const [asset, setAsset] = useState(null);\r\n const [loadingState, setLoadingState] = useState<{ loading: boolean; hasError: boolean }>({ loading: false, hasError: false });\r\n const [parkModalState, setParkModalState] = useState<{ visible: boolean; loading: boolean }>({ loading: false, visible: false });\r\n const [portfolioModalState, setPortfolioModalState] = useState<{ visible: boolean; loading: boolean }>({ loading: false, visible: false });\r\n const [assetType, setAssetType] = useState(\"Other\");\r\n const [assetProps, setAssetProps] = useState({});\r\n const history = useHistory();\r\n\r\n const renderParksSelect = () => {\r\n return (\r\n \r\n );\r\n };\r\n\r\n const renderPortfoliosSelect = () => {\r\n return (\r\n \r\n \r\n {portfolios.map((x) => (\r\n \r\n ))}\r\n \r\n );\r\n };\r\n\r\n const loadAsset = async () => {\r\n const assetResp = await fetch(`/api/Assets/${props.id}`, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (assetResp.status === 200) {\r\n const a = (await assetResp.json()) as AssetEntity;\r\n setAsset(a);\r\n setAssetType(a.type);\r\n if (a.assetProps !== null) {\r\n const props = JSON.parse(a.assetProps);\r\n setAssetProps(props);\r\n }\r\n\r\n document.title = `Edit ${a.name}`;\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const loadParks = async () => {\r\n const parksResp = await fetch(`/api/Parks`, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (parksResp.status === 200) {\r\n setParks(await parksResp.json());\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const loadPortfolios = async () => {\r\n const portfoliosResp = await fetch(`/api/Portfolios`, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (portfoliosResp.status === 200) {\r\n setPortfolios(await portfoliosResp.json());\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n const loadData = async () => {\r\n setLoadingState({ loading: true, hasError: false });\r\n\r\n if (props.id !== \"\") {\r\n const d1 = await loadAsset();\r\n if (!d1) {\r\n setLoadingState({ loading: false, hasError: true });\r\n return;\r\n }\r\n }\r\n\r\n const d2 = await loadParks();\r\n if (!d2) {\r\n setLoadingState({ loading: false, hasError: true });\r\n return;\r\n }\r\n\r\n const d3 = await loadPortfolios();\r\n if (!d3) {\r\n setLoadingState({ loading: false, hasError: true });\r\n return;\r\n }\r\n\r\n setLoadingState({ loading: false, hasError: false });\r\n };\r\n\r\n const onSaveParkClick = async (values: any) => {\r\n setParkModalState({ visible: true, loading: true });\r\n\r\n const parkResp = await fetch(`/api/Parks`, {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n name: values[\"name\"]\r\n })\r\n });\r\n\r\n if (parkResp.status === 201) {\r\n await loadParks();\r\n setParkModalState({ loading: false, visible: false });\r\n return;\r\n }\r\n\r\n setParkModalState({ loading: false, visible: false });\r\n setLoadingState({ loading: false, hasError: true });\r\n };\r\n\r\n const onSavePortfolioClick = async (values: any) => {\r\n setPortfolioModalState({ visible: true, loading: true });\r\n\r\n const portfolioResp = await fetch(`/api/Portfolios`, {\r\n method: \"POST\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n name: values[\"name\"]\r\n })\r\n });\r\n\r\n if (portfolioResp.status === 201) {\r\n await loadPortfolios();\r\n setPortfolioModalState({ loading: false, visible: false });\r\n return;\r\n }\r\n\r\n setPortfolioModalState({ loading: false, visible: false });\r\n setLoadingState({ loading: false, hasError: true });\r\n };\r\n\r\n const showAddParkModal = () => {\r\n setParkModalState({ visible: true, loading: false });\r\n };\r\n\r\n const showAddPortfolioModal = () => {\r\n setPortfolioModalState({ visible: true, loading: false });\r\n };\r\n\r\n const onFieldsChange = (changedFields: any, allFields: any) => {\r\n setAssetType(allFields[1].value);\r\n };\r\n\r\n const onSaveClick = async (values: any) => {\r\n setLoadingState({ loading: true, hasError: false });\r\n let parkId = values[\"park-id\"];\r\n if (parkId === undefined || parkId === 0) {\r\n parkId = null;\r\n }\r\n\r\n let portfolioId = values[\"portfolio-id\"];\r\n if (portfolioId === undefined || portfolioId === 0) {\r\n portfolioId = null;\r\n }\r\n\r\n const url = props.id === \"\" ? `/api/Assets` : `/api/Assets/${props.id}`;\r\n const method = props.id === \"\" ? \"POST\" : \"PUT\";\r\n const assetId = props.id === \"\" ? 0 : parseInt(props.id);\r\n\r\n const atype: AssetType = values[\"type\"];\r\n let aprops: AssetProps = {};\r\n if (atype === \"WindTurbine\") {\r\n aprops.HubHeight = values[\"hub-height\"];\r\n aprops.SweptArea = values[\"swept-area\"];\r\n } else if (atype === \"PhotovoltaicArray\") {\r\n aprops.Tilt = values[\"tilt\"];\r\n }\r\n\r\n const assetResp = await fetch(url, {\r\n method: method,\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n name: values[\"name\"],\r\n parkId: parkId,\r\n portfolioId: portfolioId,\r\n id: assetId,\r\n organizationId: 0,\r\n type: atype,\r\n externalId: values[\"externalId\"],\r\n longitude: values[\"longitude\"],\r\n latitude: values[\"latitude\"],\r\n capacity: values[\"capacity\"],\r\n AssetProps: `${JSON.stringify(aprops)}`\r\n })\r\n });\r\n\r\n if (assetResp.status >= 400) {\r\n setLoadingState({ loading: false, hasError: true });\r\n return;\r\n }\r\n\r\n history.push(\"/assets\");\r\n };\r\n\r\n const renderForm = () => {\r\n return (\r\n \r\n

{props.id === \"\" ? \"Create\" : \"Edit\"} asset

\r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {renderParksSelect()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n {renderPortfoliosSelect()}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n history.push(\"/assets\");\r\n }}\r\n >\r\n Cancel\r\n \r\n \r\n \r\n \r\n );\r\n };\r\n\r\n useEffect(() => {\r\n loadData();\r\n if (props.id === \"\") {\r\n document.title = `Create asset`;\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <>\r\n {loadingState.loading && }\r\n {!loadingState.loading && !loadingState.hasError && renderForm()}\r\n {!loadingState.loading && loadingState.hasError && (\r\n \r\n \r\n \r\n Retry\r\n \r\n ]}\r\n >\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n setParkModalState({ loading: false, visible: false });\r\n }}\r\n >\r\n Cancel\r\n \r\n \r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n {\r\n setPortfolioModalState({ loading: false, visible: false });\r\n }}\r\n >\r\n Cancel\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Asset;\r\n","export const ForecastFields = {\r\n Radiation: \"Radiation\",\r\n RelativeHumidity: \"RelativeHumidity\",\r\n Temperature2m: \"Temperature2m\",\r\n SeaLevelPressure: \"SeaLevelPressure\",\r\n SurfacePressure: \"SurfacePressure\",\r\n Wind: \"Wind\",\r\n AirDensity: \"AirDensity\",\r\n Power: \"Power\",\r\n Energy: \"Energy\",\r\n CloudCoverLow: \"CloudCoverLow\",\r\n CloudCoverMed: \"CloudCoverMed\",\r\n CloudCoverHigh: \"CloudCoverHigh\",\r\n SnowCover: \"SnowCover\",\r\n Precipitation: \"Precipitation\"\r\n};\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Button, Col, Empty, PageHeader, Result, Row, Select, Space, Table } from \"antd\";\r\nimport { ColumnsType } from \"antd/es/table\";\r\nimport { CloseOutlined, EditOutlined, SaveOutlined, UserOutlined } from \"@ant-design/icons\";\r\n\r\nconst { Option } = Select;\r\n\r\ninterface User {\r\n id: string;\r\n email: string;\r\n userName: string;\r\n organizationId: number;\r\n organization: string;\r\n}\r\n\r\ninterface Organization {\r\n id: number;\r\n name: string;\r\n}\r\n\r\ninterface EditableCellProps {\r\n dataIndex: string;\r\n title: string;\r\n inputType: string;\r\n record: any;\r\n dataSource: Array;\r\n children: React.ReactNode;\r\n}\r\n\r\nconst EditableCell: React.FC = ({ dataIndex, record, dataSource }) => {\r\n const [editing, setEditing] = useState(false);\r\n const [value, setValue] = useState(record[dataIndex]);\r\n\r\n const handleChange = (e: React.ChangeEvent) => {\r\n setValue(e);\r\n };\r\n\r\n const edit = () => {\r\n setEditing(true);\r\n };\r\n\r\n const cancel = () => {\r\n setValue(record[dataIndex]);\r\n setEditing(false);\r\n };\r\n\r\n const save = async () => {\r\n record.organizationId = value;\r\n record.organization = dataSource.find((x) => x.id === value)?.name;\r\n\r\n await fetch(`/api/Admin/User/${record.id}`, {\r\n method: \"PUT\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n organizationId: record.organizationId\r\n })\r\n });\r\n\r\n setEditing(false);\r\n };\r\n\r\n return (\r\n
\r\n {editing ? (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ) : (\r\n \r\n {record.organization}\r\n \r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nconst Users: React.FC = (props) => {\r\n const [loading, setLoading] = useState(true);\r\n const [hasError, setHasError] = useState(false);\r\n const [userList, setUserList] = useState>([]);\r\n const [organizations, setOrganizations] = useState>([]);\r\n\r\n const fetchList = async () => {\r\n setLoading(true);\r\n setHasError(false);\r\n\r\n try {\r\n let response = await fetch(`/api/Admin/Users`, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status !== 200) {\r\n setLoading(false);\r\n setHasError(true);\r\n return;\r\n }\r\n\r\n setUserList(await response.json());\r\n\r\n response = await fetch(`/api/Admin/Organizations`, {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\",\r\n \"Content-type\": \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status !== 200) {\r\n setLoading(false);\r\n setHasError(true);\r\n return;\r\n }\r\n\r\n setOrganizations(await response.json());\r\n } catch (error) {\r\n setHasError(true);\r\n }\r\n\r\n setLoading(false);\r\n };\r\n\r\n const columns: ColumnsType = [\r\n {\r\n title: \"Username\",\r\n dataIndex: \"userName\",\r\n defaultSortOrder: \"ascend\",\r\n sorter: (a, b) => a.userName.toLocaleLowerCase().localeCompare(b.userName.toLocaleLowerCase())\r\n },\r\n {\r\n title: \"Organization\",\r\n dataIndex: \"organizationId\",\r\n sorter: (a, b) => a.organization.toLocaleLowerCase().localeCompare(b.organization.toLocaleLowerCase()),\r\n render: (text: string, record: User) => {\r\n return (\r\n \r\n {record.organization}\r\n \r\n );\r\n }\r\n },\r\n {\r\n title: \"Action\",\r\n dataIndex: \"action\",\r\n render: (text, record) => {\r\n return (\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n ];\r\n\r\n useEffect(() => {\r\n fetchList();\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n {hasError && (\r\n \r\n \r\n \r\n Retry\r\n \r\n ]}\r\n >\r\n \r\n \r\n )}\r\n\r\n {!hasError && (loading || userList.length > 0) &&
}\r\n\r\n {!hasError && !loading && userList.length === 0 && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n \r\n );\r\n};\r\n\r\nexport default Users;\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport { message, Button, Empty, Input, Modal, PageHeader, Result, Space, Table, Form } from \"antd\";\r\nimport { ColumnsType } from \"antd/es/table\";\r\nimport { Park } from \"../data/Park\";\r\nimport { ExclamationCircleOutlined, PlusOutlined, SearchOutlined, DeleteFilled, EditOutlined, FileExcelOutlined } from \"@ant-design/icons\";\r\nimport { FilterConfirmProps, FilterDropdownProps } from \"antd/lib/table/interface\";\r\nimport Highlighter from \"react-highlight-words\";\r\nimport { saveAs } from \"file-saver\";\r\nimport * as XLSX from \"xlsx\";\r\n\r\nconst { confirm } = Modal;\r\n\r\nconst Parks: React.FC = () => {\r\n const [loading, setLoading] = useState(true);\r\n const [hasError, setHasError] = useState(false);\r\n const [data, setData] = useState | null>(null);\r\n const [search, setSearch] = useState<{ text: string; column: React.ReactNode | null }>({ text: \"\", column: null });\r\n const [isModalVisible, setIsModalVisible] = useState(false);\r\n const [editingPark, setEditingPark] = useState(null);\r\n const [form] = Form.useForm();\r\n const searchInput = useRef(null);\r\n\r\n const confirmDelete = (park: Park) => {\r\n confirm({\r\n title: `Are you sure you want to delete ${park.name}?`,\r\n icon: ,\r\n content: \"This action cannot be undone!\",\r\n okText: \"Yes\",\r\n okType: \"danger\",\r\n cancelText: \"No\",\r\n onOk: async () => {\r\n try {\r\n const response = await fetch(`/api/Parks/${park.id}`, {\r\n method: \"DELETE\",\r\n headers: { Accept: \"application/json\" }\r\n });\r\n\r\n if (response.ok) {\r\n message.success(\"Park deleted\");\r\n await fetchData();\r\n }\r\n } catch (error) {\r\n message.error(\"Error deleting park\");\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleExport = () => {\r\n if (!data) return;\r\n\r\n const exportData = data.map((park) => ({\r\n Name: park.name,\r\n ExternalId: park.externalId,\r\n \"Capacity (KW)\": park.capacity,\r\n NumberOfAssets: park.numberOfAssets\r\n }));\r\n\r\n const headers = Object.keys(exportData[0]) as (keyof (typeof exportData)[0])[];\r\n\r\n const columnWidths = headers.map((key) => ({\r\n wch: Math.max(key.length, ...exportData.map((row) => (row[key] ? row[key]!.toString().length : 0))) + 5\r\n }));\r\n\r\n const worksheet = XLSX.utils.json_to_sheet(exportData);\r\n worksheet[\"!cols\"] = columnWidths;\r\n\r\n const workbook = XLSX.utils.book_new();\r\n XLSX.utils.book_append_sheet(workbook, worksheet, \"Parks\");\r\n const excelBuffer = XLSX.write(workbook, { bookType: \"xlsx\", type: \"array\" });\r\n const blob = new Blob([excelBuffer], { type: \"application/octet-stream\" });\r\n saveAs(blob, \"parks.xlsx\");\r\n };\r\n\r\n const showModal = (park: Park | null) => {\r\n setEditingPark(park);\r\n form.setFieldsValue(park || { name: \"\" });\r\n setIsModalVisible(true);\r\n };\r\n\r\n const handleOk = async () => {\r\n try {\r\n const values = await form.validateFields();\r\n if (editingPark) {\r\n const response = await fetch(`/api/Parks/${editingPark.id}`, {\r\n method: \"PUT\",\r\n headers: { Accept: \"application/json\", \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ id: editingPark.id, ...values })\r\n });\r\n\r\n if (response.ok) {\r\n message.success(\"Park updated\");\r\n await fetchData();\r\n }\r\n } else {\r\n const response = await fetch(`/api/Parks`, {\r\n method: \"POST\",\r\n headers: { Accept: \"application/json\", \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(values)\r\n });\r\n\r\n if (response.ok) {\r\n message.success(\"Park created\");\r\n await fetchData();\r\n }\r\n }\r\n form.resetFields();\r\n setIsModalVisible(false);\r\n } catch (error) {\r\n message.error(\"Error saving park\");\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n form.resetFields();\r\n setIsModalVisible(false);\r\n };\r\n\r\n const getColumnSearchProps = (dataIndex: string) => ({\r\n filterDropdown: (props: FilterDropdownProps) => (\r\n
\r\n props.setSelectedKeys(e.target.value ? [e.target.value] : [])}\r\n onPressEnter={() => handleSearch(props.selectedKeys, props.confirm, dataIndex)}\r\n style={{ marginBottom: 8, display: \"block\" }}\r\n />\r\n \r\n handleSearch(props.selectedKeys, props.confirm, dataIndex)}\r\n icon={}\r\n size=\"small\"\r\n style={{ width: 90 }}\r\n >\r\n Search\r\n \r\n \r\n \r\n
\r\n ),\r\n filterIcon: (filtered: boolean) => ,\r\n onFilter: (value: string | number | boolean, record: Park) => {\r\n switch (dataIndex) {\r\n case \"name\":\r\n return record.name.toLowerCase().includes(value.toString().toLowerCase()) as boolean;\r\n case \"externalId\":\r\n return record.externalId?.toLowerCase().includes(value.toString().toLowerCase()) as boolean;\r\n default:\r\n return false;\r\n }\r\n },\r\n onFilterDropdownVisibleChange: (visible: boolean) => {\r\n if (visible) {\r\n setTimeout(() => searchInput.current?.select(), 100);\r\n }\r\n },\r\n render: (text: string) => (\r\n \r\n )\r\n });\r\n\r\n const handleSearch = (selectedKeys: React.Key[], confirm: (param?: FilterConfirmProps) => void, dataIndex: string) => {\r\n confirm();\r\n setSearch({ text: selectedKeys[0] as string, column: dataIndex });\r\n };\r\n\r\n const handleReset = (clearFilters?: () => void) => {\r\n clearFilters?.();\r\n setSearch({ text: \"\", column: null });\r\n };\r\n\r\n const fetchData = async () => {\r\n setLoading(true);\r\n try {\r\n const response = await fetch(\"/api/Parks\", {\r\n headers: { Accept: \"application/json\" }\r\n });\r\n\r\n if (!response.ok) throw new Error();\r\n const parks = await response.json();\r\n setData(parks);\r\n setHasError(false);\r\n } catch (error) {\r\n setHasError(true);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const columns: ColumnsType = [\r\n {\r\n title: \"Name\",\r\n dataIndex: \"name\",\r\n ...getColumnSearchProps(\"name\"),\r\n sorter: (a, b) => a.name.localeCompare(b.name)\r\n },\r\n {\r\n title: \"External ID\",\r\n dataIndex: \"externalId\",\r\n ...getColumnSearchProps(\"externalId\"),\r\n sorter: (a, b) => (a.externalId || \"\").localeCompare(b.externalId || \"\")\r\n },\r\n {\r\n title: \"Capacity\",\r\n dataIndex: \"capacity\",\r\n render: (capacity) =>
{Math.round(10 * (capacity / 1000)) / 10}MW
,\r\n sorter: (a, b) => (a.capacity || 0) - (b.capacity || 0)\r\n },\r\n {\r\n title: \"Number of Assets\",\r\n dataIndex: \"numberOfAssets\",\r\n sorter: (a, b) => (a.numberOfAssets || 0) - (b.numberOfAssets || 0)\r\n },\r\n {\r\n title: \"Action\",\r\n dataIndex: \"action\",\r\n render: (text, record) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n ];\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n }\r\n >\r\n Export to Excel\r\n \r\n \r\n \r\n ]}\r\n />\r\n\r\n {hasError ? (\r\n Retry} />\r\n ) : (\r\n : null\r\n }}\r\n />\r\n )}\r\n\r\n \r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Parks;\r\n","import React, { useEffect, useRef, useState } from \"react\";\r\nimport { message, Button, Empty, Input, Modal, PageHeader, Result, Space, Table, Form } from \"antd\";\r\nimport { ColumnsType } from \"antd/es/table\";\r\nimport { ExclamationCircleOutlined, PlusOutlined, SearchOutlined, DeleteFilled, EditOutlined, FileExcelOutlined } from \"@ant-design/icons\";\r\nimport { FilterConfirmProps, FilterDropdownProps } from \"antd/lib/table/interface\";\r\nimport Highlighter from \"react-highlight-words\";\r\nimport { saveAs } from \"file-saver\";\r\nimport * as XLSX from \"xlsx\";\r\n\r\nconst { confirm } = Modal;\r\n\r\nconst Portfolios: React.FC = () => {\r\n const [loading, setLoading] = useState(true);\r\n const [hasError, setHasError] = useState(false);\r\n const [data, setData] = useState | null>(null);\r\n const [search, setSearch] = useState<{ text: string; column: React.ReactNode | null }>({ text: \"\", column: null });\r\n const [isModalVisible, setIsModalVisible] = useState(false);\r\n const [editingPortfolio, setEditingPortfolio] = useState(null);\r\n const [form] = Form.useForm();\r\n const searchInput = useRef(null);\r\n\r\n const confirmDelete = (portfolio: any) => {\r\n confirm({\r\n title: `Delete ${portfolio.name}?`,\r\n icon: ,\r\n content: \"This action cannot be undone!\",\r\n okText: \"Yes\",\r\n okType: \"danger\",\r\n cancelText: \"No\",\r\n onOk: async () => {\r\n try {\r\n const response = await fetch(`/api/Portfolios/${portfolio.id}`, {\r\n method: \"DELETE\",\r\n headers: { Accept: \"application/json\" }\r\n });\r\n\r\n if (response.ok) {\r\n message.success(\"Portfolio deleted\");\r\n await fetchData();\r\n }\r\n } catch (error) {\r\n message.error(\"Error deleting portfolio\");\r\n }\r\n }\r\n });\r\n };\r\n\r\n const handleExport = () => {\r\n if (!data) return;\r\n\r\n const exportData = data.map((portfolio) => ({\r\n Name: portfolio.name,\r\n \"Capacity (KW)\": portfolio.capacity,\r\n NumberOfAssets: portfolio.numberOfAssets\r\n }));\r\n\r\n const headers = Object.keys(exportData[0]) as (keyof (typeof exportData)[0])[];\r\n\r\n const columnWidths = headers.map((key) => ({\r\n wch: Math.max(key.length, ...exportData.map((row) => (row[key] ? row[key]!.toString().length : 0))) + 5\r\n }));\r\n\r\n const worksheet = XLSX.utils.json_to_sheet(exportData);\r\n worksheet[\"!cols\"] = columnWidths;\r\n\r\n const workbook = XLSX.utils.book_new();\r\n XLSX.utils.book_append_sheet(workbook, worksheet, \"Portfolios\");\r\n const excelBuffer = XLSX.write(workbook, { bookType: \"xlsx\", type: \"array\" });\r\n const blob = new Blob([excelBuffer], { type: \"application/octet-stream\" });\r\n saveAs(blob, \"portfolios.xlsx\");\r\n };\r\n\r\n const showModal = (portfolio: any | null) => {\r\n setEditingPortfolio(portfolio);\r\n form.setFieldsValue(portfolio || { name: \"\" });\r\n setIsModalVisible(true);\r\n };\r\n\r\n const handleOk = async () => {\r\n try {\r\n const values = await form.validateFields();\r\n if (editingPortfolio) {\r\n const response = await fetch(`/api/Portfolios/${editingPortfolio.id}`, {\r\n method: \"PUT\",\r\n headers: { Accept: \"application/json\", \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(values)\r\n });\r\n\r\n if (response.ok) {\r\n message.success(\"Portfolio updated\");\r\n await fetchData();\r\n }\r\n } else {\r\n const response = await fetch(`/api/Portfolios`, {\r\n method: \"POST\",\r\n headers: { Accept: \"application/json\", \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify(values)\r\n });\r\n\r\n if (response.ok) {\r\n message.success(\"Portfolio created\");\r\n await fetchData();\r\n }\r\n }\r\n form.resetFields();\r\n setIsModalVisible(false);\r\n } catch (error) {\r\n message.error(\"Error saving portfolio\");\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n form.resetFields();\r\n setIsModalVisible(false);\r\n };\r\n\r\n const getColumnSearchProps = (dataIndex: string) => ({\r\n filterDropdown: (props: FilterDropdownProps) => (\r\n
\r\n props.setSelectedKeys(e.target.value ? [e.target.value] : [])}\r\n onPressEnter={() => handleSearch(props.selectedKeys, props.confirm, dataIndex)}\r\n style={{ marginBottom: 8, display: \"block\" }}\r\n />\r\n \r\n handleSearch(props.selectedKeys, props.confirm, dataIndex)}\r\n icon={}\r\n size=\"small\"\r\n style={{ width: 90 }}\r\n >\r\n Search\r\n \r\n \r\n \r\n
\r\n ),\r\n filterIcon: (filtered: boolean) => ,\r\n onFilter: (value: string | number | boolean, record: any) => record[dataIndex].toString().toLowerCase().includes(value.toString().toLowerCase()),\r\n onFilterDropdownVisibleChange: (visible: boolean) => {\r\n if (visible) {\r\n setTimeout(() => searchInput.current?.select(), 100);\r\n }\r\n },\r\n render: (text: string) => (\r\n \r\n )\r\n });\r\n\r\n const handleSearch = (selectedKeys: React.Key[], confirm: (param?: FilterConfirmProps) => void, dataIndex: string) => {\r\n confirm();\r\n setSearch({ text: selectedKeys[0] as string, column: dataIndex });\r\n };\r\n\r\n const handleReset = (clearFilters?: () => void) => {\r\n clearFilters?.();\r\n setSearch({ text: \"\", column: null });\r\n };\r\n\r\n const fetchData = async () => {\r\n setLoading(true);\r\n try {\r\n const response = await fetch(\"/api/Portfolios\", {\r\n headers: { Accept: \"application/json\" }\r\n });\r\n\r\n if (!response.ok) throw new Error();\r\n const portfolios = await response.json();\r\n setData(portfolios);\r\n setHasError(false);\r\n } catch (error) {\r\n setHasError(true);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n const columns: ColumnsType = [\r\n {\r\n title: \"Name\",\r\n dataIndex: \"name\",\r\n ...getColumnSearchProps(\"name\"),\r\n sorter: (a, b) => a.name.localeCompare(b.name)\r\n },\r\n {\r\n title: \"Capacity\",\r\n dataIndex: \"capacity\",\r\n render: (capacity) =>
{Math.round(10 * (capacity / 1000)) / 10}MW
,\r\n sorter: (a, b) => (a.capacity || 0) - (b.capacity || 0)\r\n },\r\n {\r\n title: \"Number of Assets\",\r\n dataIndex: \"numberOfAssets\",\r\n sorter: (a, b) => (a.numberOfAssets || 0) - (b.numberOfAssets || 0)\r\n },\r\n {\r\n title: \"Action\",\r\n dataIndex: \"action\",\r\n render: (text, record) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n );\r\n }\r\n }\r\n ];\r\n\r\n useEffect(() => {\r\n fetchData();\r\n }, []);\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n }\r\n >\r\n Export to Excel\r\n \r\n \r\n \r\n ]}\r\n />\r\n\r\n {hasError ? (\r\n Retry} />\r\n ) : (\r\n : null\r\n }}\r\n />\r\n )}\r\n\r\n \r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n \r\n );\r\n};\r\n\r\nexport default Portfolios;\r\n","import \"./App.css\";\r\nimport React, { useContext, useEffect, useState } from \"react\";\r\nimport { AppContext } from \"./state/State\";\r\nimport { Redirect, Route, RouterProps, Switch, useLocation } from \"react-router-dom\";\r\nimport DashboardLayout from \"./pages/DashboardLayout\";\r\nimport Dashboard from \"./pages/Dashboard\";\r\nimport LandingLayout from \"./pages/LandingLayout\";\r\nimport External from \"./pages/External\";\r\nimport Welcome from \"./pages/Welcome\";\r\nimport WelcomeGr from \"./pages/WelcomeGr\";\r\nimport Terms from \"./pages/Terms\";\r\nimport Reports from \"./pages/Reports\";\r\nimport Assets from \"./pages/Assets\";\r\nimport Asset from \"./pages/Asset\";\r\nimport Charts from \"./pages/Charts\";\r\nimport Users from \"./pages/Users\";\r\nimport Parks from \"./pages/Parks\";\r\nimport Portfolios from \"./pages/Portfolios\";\r\n\r\nconst App: React.FC = (props) => {\r\n const context = useContext(AppContext);\r\n const location = useLocation();\r\n const [ready, setReady] = useState(false);\r\n\r\n // ReactGA.initialize('G-GL0JYE1N38');\r\n\r\n // useEffect(() => {\r\n // ReactGA.send({ hitType: \"pageview\", page: location.pathname, title: document.title });\r\n // // eslint-disable-next-line react-hooks/exhaustive-deps\r\n // }, [location]);\r\n\r\n useEffect(() => {\r\n (async () => {\r\n const response = await fetch(\"/api/User\", {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\"\r\n }\r\n });\r\n\r\n if (response.status === 200) {\r\n const info = await response.json();\r\n context.setLoggedIn(true);\r\n context.setUserInfo(info);\r\n } else {\r\n context.setLoggedIn(false);\r\n context.setUserInfo(null);\r\n }\r\n\r\n const responseVersion = await fetch(\"/api/Version\", {\r\n method: \"GET\",\r\n headers: {\r\n Accept: \"application/json\"\r\n }\r\n });\r\n\r\n if (responseVersion.status === 200) {\r\n const version = await responseVersion.json();\r\n context.setVersion(version);\r\n }\r\n\r\n setReady(true);\r\n })();\r\n\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n
\r\n {!ready ? (\r\n
\r\n ) : (\r\n \r\n {\r\n return context.loggedIn ? : ;\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n ) : (\r\n \r\n \r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n ) : (\r\n \r\n \r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n ) : (\r\n \r\n \r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn && context.userInfo?.admin ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n }}\r\n />\r\n {\r\n return context.loggedIn ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n );\r\n }}\r\n />\r\n {\r\n return ;\r\n }}\r\n />\r\n {\r\n return ;\r\n }}\r\n />\r\n \r\n )}\r\n
\r\n );\r\n};\r\n\r\nexport default App;\r\n","import { ReportHandler } from \"web-vitals\";\r\n\r\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import(\"web-vitals\").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from \"react\";\r\nimport ReactDOM from \"react-dom\";\r\nimport App from \"./App\";\r\nimport reportWebVitals from \"./reportWebVitals\";\r\nimport { AppContextProvider } from \"./state/State\";\r\nimport { createBrowserHistory } from \"history\";\r\nimport { BrowserRouter } from \"react-router-dom\";\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById(\"root\")\r\n);\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}