|
201 | 201 | scales: { y: { min: 0, max: 100, title: 'Battery %' }, y1: { position: 'right', min: 3.0, max: 4.2, title: 'Voltage (V)', grid: false } }
|
202 | 202 | },
|
203 | 203 | steps: { filter: d => d.Steps !== undefined && d.Steps !== "", data: d => parseInt(d.Steps) || 0, label: 'Steps per Interval', color: '#36a2eb', title: 'Step Count Over Time', type: 'bar', cumulative: true },
|
204 |
| - elevation: { |
205 |
| - filter: d => (d['Barometer Altitude'] && d['Barometer Altitude'] !== "" && !isNaN(parseFloat(d['Barometer Altitude']))) || (d.Altitude && d.Altitude !== "" && !isNaN(parseFloat(d.Altitude))), |
206 |
| - data: d => { |
207 |
| - if (d['Barometer Altitude'] && d['Barometer Altitude'] !== "" && !isNaN(parseFloat(d['Barometer Altitude']))) { |
208 |
| - return convertElevation(parseFloat(d['Barometer Altitude'])).value; |
209 |
| - } else { |
210 |
| - return convertElevation(parseFloat(d.Altitude)).value; |
211 |
| - } |
212 |
| - }, |
213 |
| - label: () => convertElevation(1).label, |
214 |
| - color: '#8b5cf6', |
| 204 | + elevation: { |
| 205 | + filter: d => (d['Barometer Altitude'] !== undefined && d['Barometer Altitude'] !== "") || (d.Altitude !== undefined && d.Altitude !== ""), |
215 | 206 | title: 'Elevation Profile',
|
216 |
| - getTitle: data => { |
217 |
| - // Check if we have any barometer altitude data |
218 |
| - const hasBarometerAlt = data.some(d => d['Barometer Altitude'] && d['Barometer Altitude'] !== "" && !isNaN(parseFloat(d['Barometer Altitude']))); |
219 |
| - return hasBarometerAlt ? 'Elevation Profile (Barometer)' : 'Elevation Profile (GPS)'; |
220 |
| - } |
| 207 | + datasets: [ |
| 208 | + { key: 'Barometer Altitude', label: () => 'Barometer (' + convertElevation(1).unit + ')', color: '#8b5cf6', yAxis: 'y', convert: convertElevation }, |
| 209 | + { key: 'Altitude', label: () => 'GPS (' + convertElevation(1).unit + ')', color: '#a855f7', yAxis: 'y', convert: convertElevation } |
| 210 | + ], |
| 211 | + scales: { y: { title: () => convertElevation(1).label } } |
221 | 212 | },
|
222 | 213 | speed: { filter: d => d.Latitude && d.Longitude && d.Latitude !== "" && d.Longitude !== "", calculate: true, label: () => convertSpeed(1).label, color: '#f59e0b', title: 'Speed Over Time' },
|
223 | 214 | barometer: {
|
|
252 | 243 | .filter(ds => data.some(pt => pt[ds.key] !== undefined && pt[ds.key] !== ""))
|
253 | 244 | .map(ds => makeDataset(ds.label, data.map(pt => {
|
254 | 245 | const val = parseFloat(pt[ds.key]);
|
255 |
| - return val ? (ds.convert ? ds.convert(val).value : val) : null; |
| 246 | + return val ? (ds.convert ? parseFloat(ds.convert(val).value.toFixed(1)) : val) : null; |
256 | 247 | }), ds.color, { fill: false, yAxisID: ds.yAxis }));
|
257 | 248 | } else if (type === 'speed') {
|
258 | 249 | // Calculate speed from GPS coordinates
|
|
292 | 283 | interaction: { intersect: false, mode: 'point' },
|
293 | 284 | plugins: {
|
294 | 285 | title: { display: true, text: config.getTitle ? config.getTitle(data) : config.title },
|
295 |
| - legend: { display: datasets.length > 1 }, |
| 286 | + legend: { display: true }, |
296 | 287 | tooltip: { mode: 'nearest', intersect: false }
|
297 | 288 | },
|
298 | 289 | scales: {
|
|
520 | 511 | const items = [];
|
521 | 512 | if (pointData.Time) items.push(`<strong>🕐 ${pointData.Time.toLocaleTimeString()}</strong>`);
|
522 | 513 | if (pointData.Heartrate) items.push(`❤️ ${pointData.Heartrate} BPM`);
|
523 |
| - if (pointData.Altitude) { |
| 514 | + if (pointData['Barometer Altitude'] && pointData['Barometer Altitude'] !== "" && !isNaN(parseFloat(pointData['Barometer Altitude']))) { |
| 515 | + const e = convertElevation(parseFloat(pointData['Barometer Altitude'])); |
| 516 | + items.push(`⛰️ ${e.value.toFixed(0)} ${e.unit}`); |
| 517 | + } else if (pointData.Altitude) { |
524 | 518 | const e = convertElevation(parseFloat(pointData.Altitude));
|
525 | 519 | items.push(`⛰️ ${e.value.toFixed(0)} ${e.unit}`);
|
526 | 520 | }
|
|
0 commit comments