mirror of
https://github.com/netbymatt/ws4kp.git
synced 2026-04-23 03:59:30 -07:00
@@ -14,6 +14,7 @@ import {
|
|||||||
import { debugFlag } from './utils/debug.mjs';
|
import { debugFlag } from './utils/debug.mjs';
|
||||||
import { isDataStale, enhanceObservationWithMapClick } from './utils/mapclick.mjs';
|
import { isDataStale, enhanceObservationWithMapClick } from './utils/mapclick.mjs';
|
||||||
import { DateTime } from '../vendor/auto/luxon.mjs';
|
import { DateTime } from '../vendor/auto/luxon.mjs';
|
||||||
|
import settings from './settings.mjs';
|
||||||
|
|
||||||
// some stations prefixed do not provide all the necessary data
|
// some stations prefixed do not provide all the necessary data
|
||||||
const skipStations = ['U', 'C', 'H', 'W', 'Y', 'T', 'S', 'M', 'O', 'L', 'A', 'F', 'B', 'N', 'V', 'R', 'D', 'E', 'I', 'G', 'J'];
|
const skipStations = ['U', 'C', 'H', 'W', 'Y', 'T', 'S', 'M', 'O', 'L', 'A', 'F', 'B', 'N', 'V', 'R', 'D', 'E', 'I', 'G', 'J'];
|
||||||
@@ -192,7 +193,9 @@ class CurrentWeather extends WeatherDisplay {
|
|||||||
const wind = (typeof this.data.WindSpeed === 'number') ? this.data.WindDirection.padEnd(3, '') + this.data.WindSpeed.toString().padStart(3, ' ') : this.data.WindSpeed;
|
const wind = (typeof this.data.WindSpeed === 'number') ? this.data.WindDirection.padEnd(3, '') + this.data.WindSpeed.toString().padStart(3, ' ') : this.data.WindSpeed;
|
||||||
|
|
||||||
// get location (city name) from StationInfo if available (allows for overrides)
|
// get location (city name) from StationInfo if available (allows for overrides)
|
||||||
const location = (StationInfo[this.data.station.properties.stationIdentifier]?.city ?? locationCleanup(this.data.station.properties.name)).substr(0, 20);
|
// longer name allowed if in wide-enhanced
|
||||||
|
const locationLimit = (settings.wide?.value && settings.enhancedScreens?.value) ? 25 : 20;
|
||||||
|
const location = (StationInfo[this.data.station.properties.stationIdentifier]?.city ?? locationCleanup(this.data.station.properties.name)).substr(0, locationLimit);
|
||||||
|
|
||||||
const fill = {
|
const fill = {
|
||||||
temp: this.data.Temperature + String.fromCharCode(176),
|
temp: this.data.Temperature + String.fromCharCode(176),
|
||||||
|
|||||||
@@ -159,12 +159,17 @@ class LatestObservations extends WeatherDisplay {
|
|||||||
const windDirection = directionToNSEW(condition.windDirection.value);
|
const windDirection = directionToNSEW(condition.windDirection.value);
|
||||||
|
|
||||||
const Temperature = temperatureConverter(condition.temperature.value);
|
const Temperature = temperatureConverter(condition.temperature.value);
|
||||||
|
const Like = likeTemperature(condition.heatIndex?.value, condition.windChill?.value, Temperature, temperatureConverter);
|
||||||
const WindSpeed = windConverter(condition.windSpeed.value);
|
const WindSpeed = windConverter(condition.windSpeed.value);
|
||||||
|
|
||||||
|
const locationLimit = (settings.wide?.value && settings.enhancedScreens?.value) ? 20 : 14;
|
||||||
|
const weatherLimit = (settings.wide?.value && settings.enhancedScreens?.value) ? 10 : 9;
|
||||||
|
|
||||||
const fill = {
|
const fill = {
|
||||||
location: locationCleanup(condition.city).substr(0, 14),
|
location: locationCleanup(condition.city).substr(0, locationLimit),
|
||||||
temp: Temperature,
|
temp: Temperature,
|
||||||
weather: shortenCurrentConditions(condition.textDescription).substr(0, 9),
|
like: Like.value,
|
||||||
|
weather: shortenCurrentConditions(condition.textDescription).substr(0, weatherLimit),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (WindSpeed > 0) {
|
if (WindSpeed > 0) {
|
||||||
@@ -175,7 +180,12 @@ class LatestObservations extends WeatherDisplay {
|
|||||||
fill.wind = 'Calm';
|
fill.wind = 'Calm';
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.fillTemplate('observation-row', fill);
|
const filledRow = this.fillTemplate('observation-row', fill);
|
||||||
|
|
||||||
|
// add the feels like class
|
||||||
|
filledRow.querySelector('.like').classList.add(Like.cssClass);
|
||||||
|
|
||||||
|
return filledRow;
|
||||||
});
|
});
|
||||||
|
|
||||||
const linesContainer = this.elem.querySelector('.observation-lines');
|
const linesContainer = this.elem.querySelector('.observation-lines');
|
||||||
@@ -186,6 +196,25 @@ class LatestObservations extends WeatherDisplay {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// generate a "feels like" temperature from heat index and wind chill.
|
||||||
|
const likeTemperature = (heat, wind, actual, converter) => {
|
||||||
|
// figure out the feels like value
|
||||||
|
let value = '';
|
||||||
|
if (heat) value = converter(heat);
|
||||||
|
if (wind) value = converter(wind);
|
||||||
|
|
||||||
|
// determine if there's a red/blue color class to add
|
||||||
|
let cssClass;
|
||||||
|
if (value !== '') {
|
||||||
|
if (value > actual) cssClass = 'heat-index';
|
||||||
|
if (value < actual) cssClass = 'wind-chill';
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
value,
|
||||||
|
cssClass,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
const shortenCurrentConditions = (_condition) => {
|
const shortenCurrentConditions = (_condition) => {
|
||||||
let condition = _condition;
|
let condition = _condition;
|
||||||
condition = condition.replace(/Light/, 'L');
|
condition = condition.replace(/Light/, 'L');
|
||||||
|
|||||||
@@ -14,6 +14,12 @@
|
|||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|
||||||
|
.wide.enhanced & {
|
||||||
|
width: 300px;
|
||||||
|
margin-left: 25px;
|
||||||
|
margin-right: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
@include u.text-shadow();
|
@include u.text-shadow();
|
||||||
|
|
||||||
&.left {
|
&.left {
|
||||||
|
|||||||
@@ -84,11 +84,11 @@
|
|||||||
left: 425px;
|
left: 425px;
|
||||||
|
|
||||||
&.heat-index {
|
&.heat-index {
|
||||||
color: #e00;
|
color: c.$heat-index;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.wind-chill {
|
&.wind-chill {
|
||||||
color: c.$extended-low;
|
color: c.$wind-chill;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,39 @@
|
|||||||
left: 430px;
|
left: 430px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.like {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
// wide and enhanced moves the columns and enables the like column
|
||||||
|
.wide.enhanced & {
|
||||||
|
.temp {
|
||||||
|
left: 320px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.like {
|
||||||
|
left: 380px;
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
&.heat-index {
|
||||||
|
color: c.$heat-index;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.wind-chill {
|
||||||
|
color: c.$wind-chill;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.weather {
|
||||||
|
left: 470px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wind {
|
||||||
|
left: 630px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
.observation-lines {
|
.observation-lines {
|
||||||
min-height: 338px;
|
min-height: 338px;
|
||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
|
|||||||
@@ -13,5 +13,7 @@ $gradient-loading-3: #4f99f9;
|
|||||||
$gradient-loading-4: #8ffdfa;
|
$gradient-loading-4: #8ffdfa;
|
||||||
|
|
||||||
$extended-low: #8080FF;
|
$extended-low: #8080FF;
|
||||||
|
$wind-chill: #8080FF;
|
||||||
|
$heat-index: #e00;
|
||||||
|
|
||||||
$blue-box: #26235a;
|
$blue-box: #26235a;
|
||||||
2
server/styles/ws.min.css
vendored
2
server/styles/ws.min.css
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
|||||||
<%- include('header.ejs', {titleDual:{ top: 'Current' , bottom: 'Conditions' }, noaaLogo: true, hasTime: true}) %>
|
<%- include('header.ejs', {titleDual:{ top: 'Current' , bottom: 'Conditions' }, noaaLogo: true, hasTime: true}) %>
|
||||||
<div class="main has-scroll has-box current-weather">
|
<div class="main has-scroll has-box current-weather can-enhance">
|
||||||
<div class="weather template">
|
<div class="weather template">
|
||||||
<div class="left col">
|
<div class="left col">
|
||||||
<div class="temp center"></div>
|
<div class="temp center"></div>
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
<%- include('header.ejs', {titleDual:{ top: 'Latest' , bottom: 'Observations' }, noaaLogo: true, hasTime: true }) %>
|
<%- include('header.ejs', {titleDual:{ top: 'Latest' , bottom: 'Observations' }, noaaLogo: true, hasTime: true }) %>
|
||||||
<div class="main has-scroll latest-observations has-box">
|
<div class="main has-scroll latest-observations has-box can-enhance">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="column-headers">
|
<div class="column-headers">
|
||||||
<div class="temp english">°F</div>
|
<div class="temp english">°F</div>
|
||||||
<div class="temp metric">°C</div>
|
<div class="temp metric">°C</div>
|
||||||
|
<div class="like">Like</div>
|
||||||
<div class="weather">Weather</div>
|
<div class="weather">Weather</div>
|
||||||
<div class="wind">Wind</div>
|
<div class="wind">Wind</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -11,6 +12,7 @@
|
|||||||
<div class="observation-row template">
|
<div class="observation-row template">
|
||||||
<div class="location"></div>
|
<div class="location"></div>
|
||||||
<div class="temp"></div>
|
<div class="temp"></div>
|
||||||
|
<div class="like"></div>
|
||||||
<div class="weather"></div>
|
<div class="weather"></div>
|
||||||
<div class="wind"></div>
|
<div class="wind"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user