tracktracker/src/front/index.js

142 lines
4.0 KiB
JavaScript
Raw Normal View History

2022-07-05 21:57:21 +00:00
import network from "../data/network.json";
import * as simulation from "../data/simulation.js";
import Map from "./map/index.js";
2020-07-27 19:01:36 +00:00
// Run courses simulation
const simstate = simulation.start();
// Create display panel
const panel = document.querySelector("#panel");
const timeFormat = new Intl.DateTimeFormat("fr-FR", {
timeZone: "Europe/Paris",
timeStyle: "medium",
});
2020-07-27 19:01:36 +00:00
2021-05-14 22:43:45 +00:00
const timeToHTML = time => {
const delta = Math.ceil((time - Date.now()) / 1000);
if (delta <= 0) {
return `Imminent`;
} else if (delta < 60) {
return `${delta} s`;
} else {
return `${Math.floor(delta / 60)} min ${delta % 60} s`;
}
};
const updatePanel = () => {
const vehicleCount = Object.values(simstate.courses).length;
const movingVehicles = Object.values(simstate.courses).filter(
course => course.properties.speed > 0
).length;
2020-07-27 19:01:36 +00:00
let html = `
<dl>
<dt>Heure locale</dt>
<dd>${timeFormat.format(Date.now())}</dd>
</dl>
<dl>
<dt>Véhicules sur la carte</dt>
<dd>
${movingVehicles} en mouvement,
${vehicleCount - movingVehicles} à larrêt
</dd>
2020-07-27 19:01:36 +00:00
</dl>
`;
if (map.selectedCourse !== null && map.selectedCourse in simstate.courses) {
const course = simstate.courses[map.selectedCourse].properties;
2020-07-27 19:01:36 +00:00
2020-07-27 21:48:10 +00:00
const stopToHTML = stopId => stopId in network.stops ?
network.stops[stopId].properties.name :
'<em>Arrêt inconnu</em>';
2020-07-27 19:01:36 +00:00
const passingsToHTML = passings => passings.map(([stopId, time]) => `
<tr>
<td>${stopToHTML(stopId)}</td>
<td>${timeFormat.format(time)}</td>
2020-07-27 19:01:36 +00:00
</tr>
2020-07-27 19:21:07 +00:00
`).join("\n");
2020-07-27 19:01:36 +00:00
2021-05-14 22:43:45 +00:00
const state = (
course.traveledDistance === 0 && course.speed === 0
? "stopped" : "moving"
);
let prevPassings = course.prevPassings;
if (state === "moving") {
prevPassings = prevPassings.concat([[course.departureStop, course.departureTime]]);
}
2020-07-27 19:01:36 +00:00
html += `
<h2>Véhicule</h2>
2020-07-27 19:01:36 +00:00
<dl>
<dt>ID</dt>
<dd>${map.selectedCourse}</dd>
2020-07-27 19:01:36 +00:00
<dt>Ligne</dt>
<dd>${course.line}</dd>
<dt>Destination</dt>
<dd>${stopToHTML(course.finalStop)}</dd>
<dt>État</dt>
2021-05-14 22:43:45 +00:00
<dd>${state === "moving"
2020-07-27 19:21:07 +00:00
? `Entre ${stopToHTML(course.departureStop)}
et ${stopToHTML(course.arrivalStop)}`
2021-05-14 22:43:45 +00:00
: `À larrêt ${stopToHTML(course.departureStop)}`}</dd>
2020-07-27 19:01:36 +00:00
2021-05-14 22:43:45 +00:00
${state === "moving" ? `
2020-07-27 19:01:36 +00:00
<dt>Arrivée dans</dt>
2021-05-14 22:43:45 +00:00
<dd>${timeToHTML(course.arrivalTime - 10000)}</dd>
2020-07-27 19:01:36 +00:00
<dt>Distance parcourue</dt>
<dd>${Math.ceil(course.traveledDistance)} m</dd>
<dt>Vitesse</dt>
<dd>${Math.ceil(course.speed * 3600)} km/h</dd>
` : `
<dt>Départ dans</dt>
2021-05-14 22:43:45 +00:00
<dd>${timeToHTML(course.departureTime)}</dd>
2020-07-27 19:01:36 +00:00
`}
</dl>
<h2>Arrêts précédents</h2>
2021-05-14 22:43:45 +00:00
<table>${passingsToHTML(prevPassings)}</table>
2020-07-27 19:01:36 +00:00
<h2>Arrêts suivants</h2>
<table>${passingsToHTML(course.nextPassings)}</table>
`;
}
panel.innerHTML = html;
};
2020-07-27 19:01:36 +00:00
setInterval(updatePanel, 1000);
const map = new Map("map", simstate, {
onVehicleClick(courses) {
courses = [...courses];
courses.sort();
const index = courses.indexOf(map.selectedCourse);
if (courses.length === 0) {
map.select(null);
} else if (index === -1) {
map.select(courses[0]);
} else {
map.select(courses[(index + 1) % courses.length]);
}
updatePanel();
}
2020-07-27 19:01:36 +00:00
});
// Reference as globals to facilitate debugging
window.__map = map;
window.__simstate = simstate.courses;
window.__network = network;