2.9.6
Update table/profiles to match the at a glance box Add edit columns toggle for mobile
This commit is contained in:
+37
-30
@@ -363,8 +363,9 @@ export function computeWhyFeelsLike(row, env) {
|
||||
// variant - active sub-variant key e.g. "running", "beach" (or null)
|
||||
// skinType - Fitzpatrick skin type key for UV burn time
|
||||
// ------------------------------------------------------------------------
|
||||
export function computeGlanceSummary(todayRows, profile, variant, skinType) {
|
||||
export function computeGlanceSummary(todayRows, profile, variant, skinType, cols = null) {
|
||||
if (!todayRows || todayRows.length === 0) return [];
|
||||
const show = (key) => !cols || !!cols[key];
|
||||
|
||||
const hhmm = (iso) => iso ? iso.slice(11, 16) : null;
|
||||
const dayRows = todayRows.filter(r => r.elev > 0);
|
||||
@@ -437,20 +438,20 @@ export function computeGlanceSummary(todayRows, profile, variant, skinType) {
|
||||
: 'No suitable window',
|
||||
alert: !fieldWindow,
|
||||
},
|
||||
{
|
||||
...(show('soilT') ? [{
|
||||
icon: '🌱',
|
||||
label: 'Soil warms to 10°C by',
|
||||
value: soilWarmRow ? hhmm(soilWarmRow.iso) : 'Not today',
|
||||
alert: !soilWarmRow,
|
||||
},
|
||||
rainItem,
|
||||
{
|
||||
}] : []),
|
||||
...(show('precipProb') ? [rainItem] : []),
|
||||
...(show('soilM') ? [{
|
||||
icon: '💧',
|
||||
label: 'Soil moisture',
|
||||
value: moistureLabel(soilM) ?? '-',
|
||||
alert: soilM != null && (soilM < 0.10 || soilM > 0.50),
|
||||
},
|
||||
...(maxPollen >= 10 ? [{
|
||||
}] : []),
|
||||
...(show('pollen') && maxPollen >= 10 ? [{
|
||||
icon: '🌿',
|
||||
label: 'Grass pollen',
|
||||
value: pollenLabel(maxPollen),
|
||||
@@ -465,19 +466,18 @@ export function computeGlanceSummary(todayRows, profile, variant, skinType) {
|
||||
const dangerFrom = todayRows.find(r => r.vehicleT != null && r.vehicleT >= 35);
|
||||
|
||||
return [
|
||||
{
|
||||
...(show('vehicleT') ? [{
|
||||
icon: '🌡',
|
||||
label: 'Peak cabin temp',
|
||||
value: peakCabin ? `${Math.round(peakCabin.vehicleT)}° at ${hhmm(peakCabin.iso)}` : '-',
|
||||
alert: !!(peakCabin && peakCabin.vehicleT >= 35),
|
||||
},
|
||||
{
|
||||
}, {
|
||||
icon: '🧒',
|
||||
label: 'Children/pets in car',
|
||||
value: dangerFrom ? `Unsafe from ${hhmm(dangerFrom.iso)}` : 'Safe all day',
|
||||
alert: !!dangerFrom,
|
||||
},
|
||||
rainItem,
|
||||
}] : []),
|
||||
...(show('precipProb') ? [rainItem] : []),
|
||||
{
|
||||
icon: '🌤',
|
||||
label: 'Best travel comfort',
|
||||
@@ -502,33 +502,33 @@ export function computeGlanceSummary(todayRows, profile, variant, skinType) {
|
||||
const maxPollen = Math.max(0, ...todayRows.map(r => r.grassPollen ?? 0));
|
||||
|
||||
return [
|
||||
{
|
||||
...(show('indoorT') ? [{
|
||||
icon: '🌡',
|
||||
label: 'Peak indoor (unmanaged)',
|
||||
value: peakIndoor ? `${Math.round(peakIndoor.indoorT)}° at ${hhmm(peakIndoor.iso)}` : '-',
|
||||
alert: !!(peakIndoor && peakIndoor.indoorT >= 28),
|
||||
},
|
||||
{
|
||||
}] : []),
|
||||
...(show('managedT') ? [{
|
||||
icon: '🌡',
|
||||
label: 'Peak indoor (managed)',
|
||||
value: peakManaged ? `${Math.round(peakManaged.managedT)}°` : '-',
|
||||
alert: !!(peakManaged && peakManaged.managedT >= 28),
|
||||
},
|
||||
{
|
||||
}] : []),
|
||||
...(show('indoorT') ? [{
|
||||
icon: '🪟',
|
||||
label: 'Open windows',
|
||||
value: ventWindow
|
||||
? `${hhmm(ventWindow.start.iso)} – ${hhmm(ventWindow.end.iso)}`
|
||||
: 'Keep closed',
|
||||
alert: false,
|
||||
},
|
||||
{
|
||||
}] : []),
|
||||
...(show('aqi') ? [{
|
||||
icon: '💨',
|
||||
label: 'Air quality',
|
||||
value: peakAqi > 0 ? aqiLabel(peakAqi) : '-',
|
||||
alert: peakAqi >= 60,
|
||||
},
|
||||
...(maxPollen >= 10 ? [{
|
||||
}] : []),
|
||||
...(show('pollen') && maxPollen >= 10 ? [{
|
||||
icon: '🌼',
|
||||
label: 'Pollen',
|
||||
value: pollenLabel(maxPollen),
|
||||
@@ -558,20 +558,20 @@ export function computeGlanceSummary(todayRows, profile, variant, skinType) {
|
||||
: 'No cool window today',
|
||||
alert: !coolWindow,
|
||||
},
|
||||
rainItem,
|
||||
...(burnMins ? [{
|
||||
...(show('precipProb') ? [rainItem] : []),
|
||||
...(show('burn') && burnMins ? [{
|
||||
icon: '☀',
|
||||
label: 'UV burn time (peak)',
|
||||
value: burnMins,
|
||||
alert: !!(peakUvRow && peakUvRow.uv >= 6),
|
||||
}] : []),
|
||||
{
|
||||
...(show('aqi') ? [{
|
||||
icon: '💨',
|
||||
label: 'Air quality',
|
||||
value: peakAqi > 0 ? aqiLabel(peakAqi) : '-',
|
||||
alert: peakAqi >= 60,
|
||||
},
|
||||
...(maxPollen >= 10 ? [{
|
||||
}] : []),
|
||||
...(show('pollen') && maxPollen >= 10 ? [{
|
||||
icon: '🌿',
|
||||
label: 'Pollen',
|
||||
value: pollenLabel(maxPollen),
|
||||
@@ -587,6 +587,7 @@ export function computeGlanceSummary(todayRows, profile, variant, skinType) {
|
||||
const peakFelt = peakRow('utciAdj');
|
||||
const peakUvRow = peakRow('uv');
|
||||
const peakAqi = Math.max(0, ...todayRows.map(r => r.aqi ?? 0));
|
||||
const maxPollen = Math.max(0, ...todayRows.map(r => r.grassPollen ?? 0));
|
||||
const burnMins = peakUvRow && peakUvRow.uv > 0
|
||||
? burnLabel(sunburnMinutes(peakUvRow.uv, skinType))
|
||||
: null;
|
||||
@@ -606,18 +607,24 @@ export function computeGlanceSummary(todayRows, profile, variant, skinType) {
|
||||
value: peakFelt ? `${Math.round(peakFelt.utciAdj)}° at ${hhmm(peakFelt.iso)}` : '-',
|
||||
alert: !!(peakFelt && (peakFelt.utciAdj >= 32 || peakFelt.utciAdj < 0)),
|
||||
},
|
||||
...(burnMins ? [{
|
||||
...((show('burn') || show('uvA')) && burnMins ? [{
|
||||
icon: '☀',
|
||||
label: 'UV burn time (peak)',
|
||||
value: burnMins,
|
||||
alert: !!(peakUvRow && peakUvRow.uv >= 6),
|
||||
}] : []),
|
||||
rainItem,
|
||||
{
|
||||
...(show('precipProb') ? [rainItem] : []),
|
||||
...(show('aqi') ? [{
|
||||
icon: '💨',
|
||||
label: 'Air quality',
|
||||
value: peakAqi > 0 ? aqiLabel(peakAqi) : '-',
|
||||
alert: peakAqi >= 60,
|
||||
},
|
||||
}] : []),
|
||||
...(show('pollen') && maxPollen >= 10 ? [{
|
||||
icon: '🌿',
|
||||
label: 'Pollen',
|
||||
value: pollenLabel(maxPollen),
|
||||
alert: maxPollen >= 50,
|
||||
}] : []),
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user