WIP **** WIP

funktioniert nur teilweise: Umschaltung auf en geht seltsamerwesie nicht
This commit is contained in:
rxf
2023-04-12 12:43:03 +02:00
parent c8682aa713
commit bf2aa26952
21 changed files with 370 additions and 57 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
<env name="DEBUG" value="laerm-web-sensorapi:*" />
</envs>
<EXTENSION ID="com.jetbrains.nodejs.run.NodeStartBrowserRunConfigurationExtension">
<browser url="http://localhost:3000/" />
<browser with-js-debugger="true" url="http://localhost:3000/" />
</EXTENSION>
<method v="2" />
</configuration>
+19 -1
View File
@@ -3,7 +3,11 @@ import logger from 'morgan'
import express from 'express'
import cookieParser from 'cookie-parser'
import path from 'path'
import { fileURLToPath } from 'url';
import { fileURLToPath } from 'url'
import i18next from 'i18next'
import i18nextMiddleware from 'i18next-http-middleware'
import Backend from 'i18next-node-fs-backend'
const app = express()
export let url2call
@@ -14,6 +18,20 @@ const __dirname = path.dirname(__filename);
import indexRouter from './routes/index.js'
import apiRouter from './routes/api.js'
i18next
.use(Backend)
.use(i18nextMiddleware.LanguageDetector)
.init({
backend: {
loadPath: __dirname + '/locales/{{lng}}/{{ns}}.json'
},
fallbackLng: 'en',
// debug: true,
preload: ['en', 'de']
});
app.use(i18nextMiddleware.handle(i18next));
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
+3 -3
View File
@@ -9,7 +9,7 @@ import * as utils from '../charts/utilities.js'
* @returns {{options: {plotOptions: {series: {marker: {enabled: boolean}, turboThreshold: number, animation: boolean}}, xAxis: {gridLineWidth: number, type: string, title: {text: string}, labels: {formatter: function(): (string|*)}}, legend: {layout: string, borderWidth: number, align: string, enabled: boolean}, subtitle: {align: string}, tooltip: {backgroundColor: number, valueDecimals: number, borderRadius: number, useHTML: boolean, borderWidth: number}, title: {useHTML: boolean, style: {fontSize: string}, align: string}, chart: {backgroundColor: {linearGradient: number[], stops: [[number,string],[number,string]]}, spacingTop: number, borderWidth: string, spacingLeft: number, type: string, spacingRight: number, events: {selection: function(*): void}, height: number}}, params}}
*
***********************************************/
export const liveData = (params, values) => {
export const liveData = (params, values, req) => {
let series1 = []
let series2 = []
let series3 = []
@@ -38,7 +38,7 @@ export const liveData = (params, values) => {
// InfoTafel füllen
infoTafel =
'<table class="infoTafel"><tr >' +
'<th colspan="3">Aktuelle Werte</th>' +
'<th colspan="3">' + req.t("ActualValues") + '</th>' +
'</tr><tr>' +
'<td>LAeq</td><td>' + (aktVal.LAeq).toFixed(1) + '</td><td>dbA</td>'
infoTafel +=
@@ -137,7 +137,7 @@ export const liveData = (params, values) => {
options.yAxis = []
options.series[0] = series_LAeq
options.series[1] = series_LAMin
options.title.text = 'Noise levels last 24 hours'
options.title.text = req.i18n.t('Noise_levels_last_24_hours')
options.subtitle.useHTML = true
options.subtitle.text = '2.5min log. average values <br /> &nbsp'
options.series[2] = series_LAMax
+20
View File
@@ -0,0 +1,20 @@
{
"Noise_Measurement": "Lärm-Messung",
"Settings": "Einstellungen",
"Info": "Info",
"Start_date": "Start Datum",
"Number_of_days": "Anzahl Tage",
"Only_for_live_chart": "Nur bei 'live' Grafik",
"Count_peaks_over": "Zähle Spitzen über",
"Close": "Schließen",
"Save_changes": "Änderungen speichern",
"Language": "Sprache",
"Map": "Karte",
"Live": "Live",
"Hour_AVG": "Stundenmittel",
"Day_AVG": "Tagesmittel",
"Day_Night": "Tag/Nacht-Werte",
"doReset": "Bitte die Seite neu laden um die Sprache zu übernehmen",
"ActualValues": "Aktuelle Werte",
"Noise_levels_last_24_hours": "Schallpegel der letzten 24 Stunden"
}
+1
View File
@@ -0,0 +1 @@
{"Noise Measurement": "Lärmus messus" }
+21
View File
@@ -0,0 +1,21 @@
{
"Noise_Measurement": "Noise Measurement",
"Settings": "Settings",
"Info": "Info",
"Start_date": "Start date:",
"Number_of_days": "Number of days",
"Only_for_live_chart": "Only for 'live' chart",
"Count_peaks_over": "Count peaks over",
"Close": "Close",
"Save_changes": "Save changes",
"Language": "Language",
"Map": "Map",
"Live": "Live",
"Hour_AVG": "Hour_AVG",
"Day_AVG": "Day_AVG",
"Day_Night": "Day_Night"
"doReset": "Please reload page to change language.",
"ActualValues": "Actual Values",
"Noise_levels_last_24_hours": "Noise levels last 24 hours"
}
+152
View File
@@ -14,6 +14,10 @@
"debug": "~2.6.9",
"express": "^4.18.2",
"http-errors": "~1.6.3",
"i18next": "^22.4.14",
"i18next-express-middleware": "^2.0.0",
"i18next-http-middleware": "^3.3.0",
"i18next-node-fs-backend": "^1.2.1",
"morgan": "~1.9.1",
"pug": "^3.0.2",
"sass": "^1.58.3"
@@ -49,6 +53,17 @@
"node": ">=6.0.0"
}
},
"node_modules/@babel/runtime": {
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
"integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
"dependencies": {
"regenerator-runtime": "^0.13.11"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/types": {
"version": "7.21.3",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz",
@@ -97,6 +112,14 @@
"node": ">= 8"
}
},
"node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dependencies": {
"sprintf-js": "~1.0.2"
}
},
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -297,6 +320,18 @@
"fsevents": "~2.3.2"
}
},
"node_modules/coffeescript": {
"version": "1.12.7",
"resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz",
"integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==",
"bin": {
"cake": "bin/cake",
"coffee": "bin/coffee"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -380,6 +415,18 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
},
"node_modules/cookies": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.1.tgz",
"integrity": "sha512-VX3KKCWrKjPnCwF78P60rnMfy1piVeObnjuKO4rBUyiSRYDgY/EqXbw3jX/uXmmdAPmayVJqdbLfJ0BRSfRZFg==",
"dependencies": {
"depd": "~1.1.1",
"keygrip": "~1.0.2"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/cors": {
"version": "2.8.5",
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
@@ -392,6 +439,14 @@
"node": ">= 0.10"
}
},
"node_modules/cson-parser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cson-parser/-/cson-parser-3.0.0.tgz",
"integrity": "sha512-khmLtNmwe6SSlWz5vrhay9yWd/Fwwyiel+vt+1vIcCT9AsdqNuLXuK9tYhhAw1FdSSHjLc56PW8xa565/x73XQ==",
"dependencies": {
"coffeescript": "^1.10.0"
}
},
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -448,6 +503,18 @@
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"node_modules/esprima": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
"integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==",
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -763,6 +830,53 @@
"node": ">= 0.6"
}
},
"node_modules/i18next": {
"version": "22.4.14",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-22.4.14.tgz",
"integrity": "sha512-VtLPtbdwGn0+DAeE00YkiKKXadkwg+rBUV+0v8v0ikEjwdiJ0gmYChVE4GIa9HXymY6wKapkL93vGT7xpq6aTw==",
"funding": [
{
"type": "individual",
"url": "https://locize.com"
},
{
"type": "individual",
"url": "https://locize.com/i18next.html"
},
{
"type": "individual",
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
}
],
"dependencies": {
"@babel/runtime": "^7.20.6"
}
},
"node_modules/i18next-express-middleware": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/i18next-express-middleware/-/i18next-express-middleware-2.0.0.tgz",
"integrity": "sha512-TGlSkYsQHikggv4mIp5B+CiXsZzwbpHaZgmOkRNGStLOdKHABH5cHr136g2PC1+p2VPMf3y3UoQZ1TfPfVOrgg==",
"deprecated": "replaced by i18next-http-middleware",
"dependencies": {
"cookies": "0.7.1"
}
},
"node_modules/i18next-http-middleware": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/i18next-http-middleware/-/i18next-http-middleware-3.3.0.tgz",
"integrity": "sha512-WX6uqxNwXccdNm/md5VJ+Q47DF2gjqLvygvgNzb2tCJWPM86FCi2LIvKco70EttlpV9IkfkCVNVF07/56EsSEw=="
},
"node_modules/i18next-node-fs-backend": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/i18next-node-fs-backend/-/i18next-node-fs-backend-1.2.1.tgz",
"integrity": "sha512-lMd/tWsdgDFb158FwXHff63WZpTXggO3j8YOFEko+EvzRPzoIWkvfqdU5Oogn/p4nYfOMnCeEns29ksPF6rZBQ==",
"deprecated": "replaced by i18next-fs-backend",
"dependencies": {
"cson-parser": "3.0.0",
"js-yaml": "3.5.4",
"json5": "0.5.0"
}
},
"node_modules/iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -875,6 +989,26 @@
"resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
"integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g=="
},
"node_modules/js-yaml": {
"version": "3.5.4",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.4.tgz",
"integrity": "sha512-XBGnYi4i/XkEeSclkcRmBKOR9t7SLViumIhaIqwHSkO7FU0F3xW/sqAQ1/y+AcYX2EcnwdKFY1nXWzjJHqBRoA==",
"dependencies": {
"argparse": "^1.0.2",
"esprima": "^2.6.0"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/json5": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.0.tgz",
"integrity": "sha512-WDgahySBucTVnQuzQHoVh6BKKg3TFBUExSwYOPwA4it9xtspn3erHYkdEx1AXXkHN38L7O6v6lmqLiXh/GnxhA==",
"bin": {
"json5": "lib/cli.js"
}
},
"node_modules/jstransformer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
@@ -884,6 +1018,14 @@
"promise": "^7.0.1"
}
},
"node_modules/keygrip": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz",
"integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -1260,6 +1402,11 @@
"node": ">=8.10.0"
}
},
"node_modules/regenerator-runtime": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
},
"node_modules/resolve": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
@@ -1422,6 +1569,11 @@
"node": ">=0.10.0"
}
},
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
},
"node_modules/statuses": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
+4
View File
@@ -17,6 +17,10 @@
"debug": "~2.6.9",
"express": "^4.18.2",
"http-errors": "~1.6.3",
"i18next": "^22.4.14",
"i18next-express-middleware": "^2.0.0",
"i18next-http-middleware": "^3.3.0",
"i18next-node-fs-backend": "^1.2.1",
"morgan": "~1.9.1",
"pug": "^3.0.2",
"sass": "^1.58.3"
+5 -2
View File
@@ -162,9 +162,7 @@ export function calcDays(data, isyear) {
};
export async function addSensorID2chart(chart, sensor, width) {
console.log('widht: ',width);
let indoor = sensor.indoor || false
console.log('indoor: ',indoor)
let sens = chart.renderer.label(
`Sensor: ${sensor.sid} ${indoor ? ' (indoor)' : ''}`,
width / 2 - 100, 65,
@@ -184,6 +182,11 @@ export const showError = (err) => {
myModal.show()
}
export const showReset = () => {
let myModal = new bootstrap.Modal(document.getElementById('dialogReset'))
myModal.show()
}
// remove the taps (if shownig the map)
export const removeTabs = () => {
document.querySelector('#navi').style.display = 'none'
+11
View File
@@ -0,0 +1,11 @@
// set correct language
let currentLang
const navLang = navigator.language.slice(0,2)
const selectedLang = localStorage.getItem('curlang')
if (!selectedLang) {
currentLang = navLang
} else {
currentLang = selectedLang
}
window.location.href = '/?lng=' + currentLang
+34 -4
View File
@@ -6,7 +6,7 @@ import * as dt from './datetime.js'
import {logerror, logit} from './logit.js'
import {tabtable, loadAll, showChart} from './showcharts.js'
import { DateTime } from './luxon.min.js'
import {showReset} from "./chart_utilities.js";
(async () => {
@@ -26,30 +26,43 @@ import { DateTime } from './luxon.min.js'
seldate: 'today',
refresh: 0,
}
let currentTab = ''
// END global variables
// Register events
document.querySelector('#btnSave').addEventListener('click', async () => {
const selDate = document.getElementById('startday').value
let starttime
if (selDate === 'today') {
starttime = DateTime.now().toISO()
params.datetime = ''
} else {
starttime = DateTime.fromFormat(selDate, 'yyyy-MM-dd').toISO()
params.datetime = starttime
}
params.seldate = selDate
const span = document.getElementById('nbrofdays').value
const peak = document.getElementById('peaklim').value
console.log(starttime, span, peak)
params.datetime = starttime
if(span < 10) {
params.span = span
}
if(peak < 130 ) {
params.peak = peak
}
await loadAll(params)
let newlng = document.querySelector('#sellan input:checked').id
let oldlng = localStorage.getItem('curlang')
localStorage.setItem('curlang', newlng)
if(newlng !== oldlng) {
location.reload()
}
if(params.sid !== undefined) {
await loadAll(params)
}
})
@@ -66,10 +79,21 @@ import { DateTime } from './luxon.min.js'
myModal.show()
})
// main function:
// show the map if calle w/o any parameter
// show the map if called w/o any parameter
// if called with a sensor-ID, show the live chart for this sensor
async function main() {
// set correct language
const currentLang = localStorage.getItem('curlang')
if(currentLang === 'en') {
document.querySelector('#en').checked = true
} else {
document.querySelector('#de').checked = true
}
console.log(currentLang)
history.pushState({}, '', '/')
// initialise tabs
let triggerTabList = [].slice.call(document.querySelectorAll('.nav-link'))
triggerTabList.forEach(function (triggerEl) {
@@ -78,6 +102,11 @@ import { DateTime } from './luxon.min.js'
triggerEl.addEventListener('click', function (event) {
event.preventDefault()
tabTrigger.show()
currentTab = event.currentTarget.id
if (currentTab === 'maptab') {
map.showMap(params)
document.querySelector('#sellan').style.display = 'inline'
}
})
})
@@ -100,6 +129,7 @@ import { DateTime } from './luxon.min.js'
}
} else {
// show the map
document.querySelector('#sellan').style.display = 'inline'
map.showMap(params)
}
}
+1 -1
View File
File diff suppressed because one or more lines are too long
+7 -4
View File
@@ -12,10 +12,10 @@ let clickedcoords = {}
const colorscale = ['#d53e4f', '#fc8d59', '#fee08b', '#e6f598', '#99d594', '#3288bd', '#808080'];
const dba = [100, 80, 60, 40, 20, 0, -999];
const APIURL = '/api/getmapdata?'
export async function showMap(params) {
utils.removeTabs()
if(map && map.remove) {
map.off();
map.remove();
@@ -58,11 +58,14 @@ export async function showMap(params) {
params.sid = clickedSensor
let triggerEl = document.querySelector('#livetab')
bootstrap.Tab.getInstance(triggerEl).show() // Select tab by name
localStorage.setItem('activeTab', 'livetab')
let ok = await showChart(params, 'live', 'dlive')
if (ok) {
await loadAll(params)
}
map.setView([clickedcoords.lat, clickedcoords.lng]);
params.center = [clickedcoords.lat, clickedcoords.lng]
// map.setView([clickedcoords.lat, clickedcoords.lng]);
document.querySelector('#sellan').style.display = 'none'
})
})
}
@@ -164,7 +167,7 @@ export async function buildMarkers() {
west: bounds.getWest(), south: bounds.getSouth(),
east: bounds.getEast(), north: bounds.getNorth()
}
const url = `/api/getmapdata?type=noise&box=${bounds.toBBoxString()}`
const url = APIURL + `type=noise&box=${bounds.toBBoxString()}`
let ret = await fetch(url)
.catch(e => {
@@ -264,7 +267,7 @@ async function setCenter(adr) {
// Show the last date below tha map grafics
async function showLastDate(ld) {
const url = `/api/getmapdata?type=noise`
const url = APIURL + 'type=noise'
let ret = await fetch(url)
.catch(e => {
console.log(e)
+2 -2
View File
@@ -55,8 +55,8 @@ export async function showChart(params, typ, container) {
return this.axis.defaultLabelFormatter.call(this);
}
}
const url = `/api/getsensordata?sensorid=${params.sid}&data=${typ}&span=${params.span}&datetime=${params.datetime.slice(0,-10)}&peak=${params.peak}`
const curlang = localStorage.getItem('curlang')
const url = `/api/getsensordata?sensorid=${params.sid}&data=${typ}&span=${params.span}&datetime=${params.datetime.slice(0,-10)}&peak=${params.peak}&lng=en`
let ret = await fetch(url)
.catch(e => {
logerror(e)
+4
View File
@@ -244,4 +244,8 @@ footer #author #versn {
background-color: #FFFFFF;
}
#sellan {
display: none;
}
/*# sourceMappingURL=style.css.map */
+1 -1
View File
@@ -1 +1 @@
{"version":3,"sourceRoot":"","sources":["style.sass"],"names":[],"mappings":"AAYA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EAEA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE,kBA9BoB;;AAgCpB;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;;;AAEJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEF;EACE;EACA;;AACA;EACE;;;AAEN;EACE;EAEA;EACA;EACA,eA5Ec;EA6Ed;EACA;EACA;;AAEA;EACE;EACA;EACA;;AACF;EACE;EACA;;;AAEJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AACF;EACE;EACA;;;AAEJ;EACE,kBAhGoB;;AAkGpB;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;;;AAGN;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;;;AAGF;EAEE;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;IACE;;;AAEJ;EACE,kBAnNa;EAoNb;;;AAEF;EACE,OAvNa;EAwNb","file":"style.css"}
{"version":3,"sourceRoot":"","sources":["style.sass"],"names":[],"mappings":"AAYA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAEF;EACE;EACA;EACA;EAEA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE,kBA9BoB;;AAgCpB;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACE;EACA;;;AAEJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAEF;EACE;EACA;;AACA;EACE;;;AAEN;EACE;EAEA;EACA;EACA,eA5Ec;EA6Ed;EACA;EACA;;AAEA;EACE;EACA;EACA;;AACF;EACE;EACA;;;AAEJ;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;AACF;EACE;EACA;;;AAEJ;EACE,kBAhGoB;;AAkGpB;EACE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;;;AAGN;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;;;AAEF;EACE;EACA;;;AAGF;EAEE;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;EACA;;;AAEF;EACE;;;AAEF;EACE;EACA;EACA;EACA;EACA;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;IACE;;;AAEJ;EACE,kBAnNa;EAoNb;;;AAEF;EACE,OAvNa;EAwNb;;;AAEF;EACE","file":"style.css"}
+3
View File
@@ -225,3 +225,6 @@ footer
.nav-tabs .nav-item .nav-link.active
color: $navtab-color
background-color: #FFFFFF
#sellan
display: none
+4 -1
View File
@@ -17,6 +17,9 @@ let APIHOST = process.env.APIHOST || 'http://localhost:3004'
/* GET home page. */
router.get('/:cmd', async function(req, res, next) {
req.i18n.changeLanguage(req.query.lng)
let l = req.i18n.resolvedLanguage
let txt = req.i18n.t('Settings')
const cmd = req.params.cmd
let url = APIHOST
if(isNaN(cmd)) {
@@ -37,7 +40,7 @@ router.get('/:cmd', async function(req, res, next) {
const options = response.data.options
for(let x of disttable) {
if (x.type === options.data) {
let ret = x.func(options, response.data.values)
let ret = x.func(options, response.data.values, req)
res.json(ret)
break;
}
+24 -21
View File
@@ -1,39 +1,42 @@
import express from 'express'
import pkg from '../package.json' assert { type: "json" }
import axios from "axios";
const router = express.Router()
const { name, version, date } = pkg
let APIHOST = process.env.APIHOST || 'http://localhost:3004'
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', {
const renderOpts = (sid) => {
return {
title: name,
version: version,
date: date,
csensor: -1
})
csensor: sid
}
}
/* GET home page. */
router.get('/', function(req, res, next) {
// req.i18n.changeLanguage('de')
if(req.query.lng === undefined) {
res.render('chglang')
} else {
res.render('index', renderOpts(-1))
}
})
//
// router.get('/', function(req, res, next) {
// // req.i18n.changeLanguage('de')
// res.render('index', renderOpts(-1))
// })
router.get('/:sid', async function(req, res, next) {
const sid = req.params.sid
if(!isNaN(sid)) {
res.render('index', {
title: name,
version: version,
date: date,
csensor: sid
})
if(isNaN(sid)) {
res.render('index', renderOpts(-1))
} else {
res.render('index', renderOpts(sid))
}
})
export default router
// ToDo
// Hier : getsensordata und getmapdata unterbringen und damit den externen Server aufrufen
+8
View File
@@ -0,0 +1,8 @@
doctype html
html
head
title= title
meta(name="viewport" content="width=device-width, initial-scale=1" charset="utf-8")
body
h1 Haloole
script(type="module" src="/javascripts/checklang.js")
+45 -16
View File
@@ -1,29 +1,36 @@
extends layout
block content
script.
function chglang(x) {
// localStorage.setItem('curlang', x.slice(-2))
// location.href = x
// history.pushState({}, '', '/')
}
header
#hline1
#h1name Noise Measurement
#h1name #{t("Noise_Measurement")}
#h1datum
#fenster
#navi
ul.nav.nav-tabs#tablist
li.nav-item(role='presentation')
button.nav-link.active#kartentab(data-bs-toggle="tab" data-bs-target="#t_map" type="button" role="tab" aria-controls="map" aria-selected="true") Map
button.nav-link.active#maptab(data-bs-toggle="tab" data-bs-target="#t_map" type="button" role="tab" aria-controls="map" aria-selected="true") #{t("Map")}
li.nav-item(role='presentation')
button.nav-link#livetab(data-bs-toggle="tab" data-bs-target="#t_live" type="button" role="tab" aria-controls="live" aria-selected="true") Live
button.nav-link#livetab(data-bs-toggle="tab" data-bs-target="#t_live" type="button" role="tab" aria-controls="live" aria-selected="true") #{t("Live")}
li.nav-item(role='presentation')
button.nav-link#houravgtab(data-bs-toggle="tab" data-bs-target="#t_houravg" type="button" role="tab" aria-controls="houravg" aria-selected="true") Hour_AVG
button.nav-link#houravgtab(data-bs-toggle="tab" data-bs-target="#t_houravg" type="button" role="tab" aria-controls="houravg" aria-selected="true") #{t("Hour_AVG")}
li.nav-item(role='presentation')
button.nav-link#dayavgtab(data-bs-toggle="tab" data-bs-target="#t_dayavg" type="button" role="tab" aria-controls="dayavg" aria-selected="true") Day_AVG
button.nav-link#dayavgtab(data-bs-toggle="tab" data-bs-target="#t_dayavg" type="button" role="tab" aria-controls="dayavg" aria-selected="true") #{t("Day_AVG")}
li.nav-item(role='presentation')
button.nav-link#daynighttab(data-bs-toggle="tab" data-bs-target="#t_daynight" type="button" role="tab" aria-controls="daynight" aria-selected="true") Day_Night
button.nav-link#daynighttab(data-bs-toggle="tab" data-bs-target="#t_daynight" type="button" role="tab" aria-controls="daynight" aria-selected="true") #{t("Day_Night")}
li.nav-item(role='presentation')
button.nav-link#ldentab(data-bs-toggle="tab" data-bs-target="#t_lden" type="button" role="tab" aria-controls="lden" aria-selected="true") L<sub>DEN</sub>-Index
#buttonsRight
button.btn.btn-primary#btnSet(value='set') Settings
button.btn.btn-primary#btnHelp(value='help') Info
button.btn.btn-primary#btnSet(value='set') #{t("Settings")}
button.btn.btn-primary#btnHelp(value='help') #{t("Info")}
.tab-content#thetabs
.tab-pane.fade.show.active#t_map(role="tabpanel" aria-labelledby="map-tab")
@@ -62,26 +69,48 @@ block content
.modal-dialog.modal-dialog-centered(role="document")
.modal-content
.modal-header
h5.modal-title.dialogErrorTitle Settings
h5.modal-title.dialogErrorTitle #{t("Settings")}
button(type="button" class="close" data-bs-dismiss="modal" aria-label="Close")
span(aria-hidden="true") &times;
.modal-body.settings
.rows
.column
label.thelabels(for='startday')
| Start date:
label.thelabels(for='startday') #{t("Start_date")}:
input.theInputs#startday(name='startday' )
.column
label.thelabels(for='nbrofdays')
| Number of days:<br />
span#klein (Only for live chart)
| #{t("Number_of_days")}:<br />
span#klein (#{t("Only_for_live_chart")})
input.theInputs#nbrofdays(type = 'number' name = 'nbrofdays')
| &nbsp;&nbsp;(max. 10)
.column
label.thelabels(for='peaklim')
| Count peaks over
| #{t("Count_peaks_over")}
input.theInputs#peaklim(type = 'number' name = 'peaklim')
| &nbsp;&nbsp;dbA
.column#sellan
label.thelabels
| #{t("Language")}:
.form-check.form-check-inline
input#en.form-check-input(type="radio" name="lanbut" onchange='chglang("lng/?lng=en")', checked)
label.form-check-label(for="en") English
.form-check.form-check-inline
input#de.form-check-input(type="radio" name="lanbut" onchange='chglang("lng/?lng=de")')
label.form-check-label(for='de') Deutsch
.modal-footer
button.btn.btn-secondary(type="button" data-bs-dismiss="modal") Close
button#btnSave.btn.btn-primary(type="button" data-bs-dismiss="modal") Save changes
button.btn.btn-secondary(type="button" data-bs-dismiss="modal") #{t("Close")}
button#btnSave.btn.btn-primary(type="button" data-bs-dismiss="modal") #{t("Save_changes")}
// Error-Dialog
.modal.fade#dialogReset(tabindex="-1" role="dialog" aria-labelledby="Error" aria-hidden="true")
.modal-dialog.modal-dialog-centered(role="document")
.modal-content
.modal-header
h5.modal-title.dialogErrorTitle Info
button(type="button" class="close" data-bs-dismiss="modal" aria-label="Close")
span(aria-hidden="true") &times;
.modal-body #{t("doReset")}
.modal-footer
//button(type="button" class="btn btn-secondary" data-bs-dismiss="modal") Close
button(type="button" class="btn btn-primary" data-bs-dismiss="modal") OK