diff --git a/src/main/scala/fetchDMI/FetchService.scala b/src/main/scala/fetchDMI/FetchService.scala index 906a5a3..70e223d 100644 --- a/src/main/scala/fetchDMI/FetchService.scala +++ b/src/main/scala/fetchDMI/FetchService.scala @@ -55,7 +55,8 @@ class FetchService(log: Logger[IO]) { for { base <- baseUrl queryParams = Query.fromPairs( - "parameter-name" -> "temperature-2m", + // https://opendatadocs.dmi.govcloud.dk/Data/Forecast_Data_Weather_Model_HARMONIE_DINI_EDR + "parameter-name" -> "temperature-2m,total-precipitation,precipitation-type,wind-speed,gust-wind-speed-10m,wind-10m-u,wind-10m-v", "datetime" -> time.toString, "api-key" -> harmonieServerConfig.api_key, ) diff --git a/web/.vscode/settings.json b/web/.vscode/settings.json index 55712c1..aa7a313 100644 --- a/web/.vscode/settings.json +++ b/web/.vscode/settings.json @@ -1,3 +1,7 @@ { - "typescript.tsdk": "node_modules/typescript/lib" + "typescript.tsdk": "node_modules/typescript/lib", + "javascript.preferences.quoteStyle": "single", + "typescript.preferences.quoteStyle": "single", + "javascript.format.semicolons": "remove", + "typescript.format.semicolons": "remove" } \ No newline at end of file diff --git a/web/package-lock.json b/web/package-lock.json index 30403da..5569adf 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -8,6 +8,7 @@ "name": "weather-tool-web", "version": "0.0.0", "dependencies": { + "@solidjs/router": "^0.15.2", "chart.js": "^4.4.1", "moment": "^2.30.1", "solid-js": "^1.9.4" @@ -1096,6 +1097,15 @@ "win32" ] }, + "node_modules/@solidjs/router": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/@solidjs/router/-/router-0.15.3.tgz", + "integrity": "sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw==", + "license": "MIT", + "peerDependencies": { + "solid-js": "^1.8.6" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3271,6 +3281,12 @@ "dev": true, "optional": true }, + "@solidjs/router": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/@solidjs/router/-/router-0.15.3.tgz", + "integrity": "sha512-iEbW8UKok2Oio7o6Y4VTzLj+KFCmQPGEpm1fS3xixwFBdclFVBvaQVeibl1jys4cujfAK5Kn6+uG2uBm3lxOMw==", + "requires": {} + }, "@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", diff --git a/web/package.json b/web/package.json index b03986f..db6c6a4 100644 --- a/web/package.json +++ b/web/package.json @@ -19,6 +19,7 @@ "dependencies": { "chart.js": "^4.4.1", "moment": "^2.30.1", - "solid-js": "^1.9.4" + "solid-js": "^1.9.4", + "@solidjs/router": "^0.15.2" } } diff --git a/web/src/App.tsx b/web/src/App.tsx index 78c8b1f..763183c 100644 --- a/web/src/App.tsx +++ b/web/src/App.tsx @@ -1,4 +1,5 @@ -import { Component, JSXElement, createSignal } from 'solid-js'; +import { Component, JSXElement, createSignal } from 'solid-js' +import { Route, Router } from '@solidjs/router' import styles from './css/menu.module.css'; import { Country } from './country/Country'; @@ -7,46 +8,35 @@ import { Database } from './database/Database'; import { Station } from './station/Station'; import { apiHost } from './consts'; import { WeatherIconStub } from './components/weatherIcons/WeatherIconStub'; +import { Harmonie } from './harmonie/Harmonie' console.log("env:", import.meta.env.MODE); console.log("api host:", apiHost); const App: Component = () => { - const pages: [string, () => JSXElement][] = [ - ["station", () => ], - ["cities", () => ], - ["latvia", () => ], - ["database", () => ], - ]; - const [getPageTitle, setPageTitle] = createSignal("station"); - - const getPageContent = () => { - const page = pages.find(p => p[0] === getPageTitle()); - return page ? page[1]() :
Page not found!
; - } - - const getActiveCSS = (pageTitle: string) => { - return getPageTitle() === pageTitle ? styles.active : ""; - } - + const pages = ['station', 'cities', 'latvia', 'database', 'harmonie'] return (
    - { pages.map(([pageTitle]) => -
  • setPageTitle(pageTitle)} - > - {pageTitle} + { pages.map(page => +
  • + {page}
  • )}
- { getPageContent() } + + + + + + + +
); }; diff --git a/web/src/harmonie/GribFile.tsx b/web/src/harmonie/GribFile.tsx new file mode 100644 index 0000000..969d1ea --- /dev/null +++ b/web/src/harmonie/GribFile.tsx @@ -0,0 +1,35 @@ +import { Accessor, Component, createSignal } from 'solid-js' + +import styles from './harmonie.module.css' +import { apiHost } from '../consts' + +export const GribFile: Component<{ + name: string, + isActive: Accessor, + onClick: (name: string) => void, +}> = ({ name, isActive, onClick }) => { + const [getStructure, setStructure] = createSignal([]) + + function onFileClick() { + onClick(name) + + if (getStructure().length === 0) { + fetch(`${apiHost}/api/show/grib/${name}`) + .then(re => re.json()) + .then(setStructure) + } + } + + return
  • +
    { name }
    +
      + { getStructure().map(grib => +
    • { grib.title }
    • + )} +
    +
  • + +} \ No newline at end of file diff --git a/web/src/harmonie/Harmonie.tsx b/web/src/harmonie/Harmonie.tsx new file mode 100644 index 0000000..5414d9b --- /dev/null +++ b/web/src/harmonie/Harmonie.tsx @@ -0,0 +1,30 @@ +import { Component, createSignal } from 'solid-js' +import { apiHost } from '../consts' + +import styles from './harmonie.module.css' +import { GribFile } from './GribFile' + +export const Harmonie: Component<{}> = () => { + const [getFileList, setFileList] = createSignal([]) + const [getActiveGrib, setActiveGrib] = createSignal('') + + fetch(`${apiHost}/api/show/grib-list`) + .then(re => re.json()) + .then(fileList => { + fileList.sort((a: string, b: string) => a < b ? 1 : -1) + setFileList(fileList) + }) + + return
    + Harmonie +
      + {getFileList().map(fileName => + getActiveGrib() === fileName} + onClick={() => setActiveGrib(fileName)} + /> + )} +
    +
    +} diff --git a/web/src/harmonie/harmonie.module.css b/web/src/harmonie/harmonie.module.css new file mode 100644 index 0000000..a94b8bf --- /dev/null +++ b/web/src/harmonie/harmonie.module.css @@ -0,0 +1,18 @@ +.fileList li { + padding: 5px 0; +} +.fileList > li:nth-child(odd) { + background-color: #ddd; +} + +.fileList .active .name { + font-weight: bold; +} + +.fileList .meteoParams { + display: none; +} + +.fileList li.active .meteoParams { + display: block; +}