Skip to content

Commit 60fefa2

Browse files
committed
refactor handling of vehicle models and depots
1 parent 0cbc25d commit 60fefa2

File tree

7 files changed

+71
-37
lines changed

7 files changed

+71
-37
lines changed

data/depots.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,11 @@ export const depots_data = [
8585
type: ['tram', 'bus'],
8686
name: 'Красно село',
8787
inv_number_ranges: [
88-
[25010, 25050],
88+
[2501, 2505],
8989
],
90+
extra_check: (vehicle) => {
91+
return vehicle.cgm_id.startsWith('TB');
92+
},
9093
geometry: [
9194
[
9295
[42.6761833, 23.2797674],
@@ -285,6 +288,9 @@ export const depots_data = [
285288
inv_number_ranges: [
286289
[2000, 2999]
287290
],
291+
extra_check: (vehicle) => {
292+
return vehicle.cgm_id.startsWith('A');
293+
},
288294
geometry: [
289295
[
290296
[42.7144709, 23.3583078],
@@ -361,12 +367,20 @@ function is_inv_number_in_range(inv_number, range) {
361367
}
362368
}
363369

364-
export function get_vehicle_depot(type, inv_number) {
370+
export function get_vehicle_depot(vehicle) {
371+
let { inv_number } = vehicle;
372+
if(typeof inv_number === 'string') {
373+
inv_number = Number(inv_number.split('/')[0]);
374+
}
375+
const { type } = vehicle;
365376
const elligible_depots = depots_data.filter(depot =>
366377
typeof depot.type === 'string' && depot.type === type ||
367378
typeof depot.type === 'object' && depot.type.includes(type));
368379

369380
for(const depot of elligible_depots) {
381+
if(depot.extra_check && !depot.extra_check(vehicle)) {
382+
continue;
383+
}
370384
for(const range of depot.inv_number_ranges) {
371385
if(typeof range[0] === 'string' && range[0] === type) {
372386
if (is_inv_number_in_range(inv_number, range[1])) {

data/expected_models.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1184,15 +1184,17 @@ const expected_models_per_line = [
11841184
}
11851185
];
11861186

1187-
export function is_vehicle_expected_on_line(type, route_ref, inv_number) {
1187+
export function is_vehicle_expected_on_line(vehicle) {
1188+
let { inv_number } = vehicle;
1189+
const { type, route_ref } = vehicle;
11881190
if(typeof inv_number === 'string') {
11891191
inv_number = parseInt(inv_number.split('/')[0]);
11901192
}
11911193
const line = expected_models_per_line.find(line =>
11921194
line.type === type
11931195
&& line.route_ref == route_ref);
1194-
const model = get_vehicle_model(type, inv_number);
1195-
const depot = get_vehicle_depot(type, inv_number);
1196+
const model = get_vehicle_model(vehicle);
1197+
const depot = get_vehicle_depot(vehicle);
11961198
if(!line || !model && model.id || !depot) {
11971199
return true;
11981200
}

data/models.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ const models = {
187187
[3400, 3499],
188188
[7041, 7171]
189189
],
190+
extra_check: (vehicle) => {
191+
return vehicle.cgm_id.startsWith('A');
192+
},
190193
extras: ['ac', 'low_floor']
191194
},
192195
{
@@ -211,8 +214,11 @@ const models = {
211214
name: 'Karsan e-JEST',
212215
inv_number_ranges: [
213216
[1010, 1099],
214-
[25010, 25050]
217+
[2501, 2505]
215218
],
219+
extra_check: (vehicle) => {
220+
return vehicle.cgm_id.startsWith('TB');
221+
},
216222
extras: ['ac', 'low_floor']
217223
},
218224
{
@@ -309,13 +315,17 @@ const models = {
309315
]
310316
};
311317

312-
export function get_vehicle_model(type, inv_number) {
318+
export function get_vehicle_model(vehicle) {
319+
const { type, cgm_id } = vehicle;
320+
let { inv_number } = vehicle;
313321
if(typeof inv_number === 'string') {
314322
inv_number = parseInt(inv_number.split('/')[0]);
315323
}
316-
317324
for (const model of models[type]) {
318325
for (const range of model.inv_number_ranges) {
326+
if(model.extra_check && !model.extra_check(vehicle)) {
327+
continue;
328+
}
319329
if(typeof range === 'object') {
320330
const [lb, rb] = range;
321331
if (lb <= inv_number && inv_number <= rb) {
@@ -332,8 +342,8 @@ export function get_vehicle_model(type, inv_number) {
332342
return { name: "Неизвестен модел" };
333343
}
334344

335-
export function get_vehicle_model_name(type, inv_number) {
336-
const model = get_vehicle_model(type, inv_number);
345+
export function get_vehicle_model_name(vehicle) {
346+
const model = get_vehicle_model(vehicle);
337347
return get_model_name(model);
338348
}
339349

src/js/app.js

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,16 @@ function generate_route_table(type, route_ref) {
251251
tr.appendChild(th);
252252
tbody.appendChild(tr);
253253
}
254+
{
255+
const tr = document.createElement('tr');
256+
const td = document.createElement('td');
257+
tr.appendChild(td);
258+
tbody.appendChild(tr);
259+
}
254260
return tbody;
255261
}
256262

257-
function populate_route_table(relevant_vehicles, tbody) {
263+
function populate_route_table(relevant_vehicles, tbody, table_cell) {
258264
relevant_vehicles.sort((a, b) => proper_inv_number_for_sorting(a.inv_number)-proper_inv_number_for_sorting(b.inv_number));
259265
const tr = document.createElement('tr');
260266
const td = document.createElement('td');
@@ -263,20 +269,21 @@ function populate_route_table(relevant_vehicles, tbody) {
263269
const btn = document.createElement('button');
264270
btn.classList.add('vehicle-btn', 'btn', 'btn-outline-dark', 'btn-sm');
265271
btn.addEventListener('click', (e) => {
266-
zoom_to_vehicle(vehicle.type, vehicle.inv_number);
272+
zoom_to_vehicle(vehicle.cgm_id);
267273
});
268274
const vehicle_inv_number = typeof vehicle.inv_number == 'string' ? vehicle.inv_number.split('/')[0] : vehicle.inv_number;
269-
const depot = get_vehicle_depot(vehicle.type, vehicle_inv_number);
275+
const depot = get_vehicle_depot(vehicle);
270276
if(!depot) console.log(depot, vehicle.type, vehicle.inv_number);
271277
btn.setAttribute('data-depot-id', depot.id);
272278
btn.setAttribute('data-inv-number', vehicle.full_inv_number ?? vehicle.inv_number);
279+
btn.setAttribute('data-cgm-id', vehicle.cgm_id);
273280
if(vehicle.is_unexpected) {
274281
btn.classList.add('btn-warning');
275282
btn.classList.remove('btn-outline-dark');
276283
btn.setAttribute('data-is-unexpected', 'true');
277284
tbody.setAttribute('data-unexpected', 'true');
278285
}
279-
const model = get_vehicle_model(vehicle.type, vehicle_inv_number);
286+
const model = get_vehicle_model(vehicle);
280287
if(model.extras && model.extras.includes('double_decker')) {
281288
btn.dataset.doubleDecker = 'true';
282289
tbody.setAttribute('data-double-decker', 'true');
@@ -287,25 +294,26 @@ function populate_route_table(relevant_vehicles, tbody) {
287294
btns.push(btn);
288295
}
289296
btns.sort((a, b) => a.dataset.car - b.dataset.car);
290-
btns.forEach(btn => td.appendChild(btn));
291-
tr.appendChild(td);
292-
tbody.appendChild(tr);
297+
table_cell.replaceChildren(...btns);
298+
// btns.forEach(btn => td.appendChild(btn));
299+
// tr.appendChild(td);
300+
// tbody.appendChild(tr);
293301
}
294302

295303
export function is_screen_width_lg_or_less() {
296304
return window.innerWidth <= 992;
297305
}
298306

299-
export function zoom_to_vehicle(type, inv_number) {
300-
const vehicle = cache.find(v => v.type === type && v.inv_number === inv_number);
307+
export function zoom_to_vehicle(cgm_id) {
308+
const vehicle = cache.find(v => v.cgm_id === cgm_id);
301309
const marker = vehicle.marker;
302310
const vehicles_panel = document.querySelector('#vehicles-panel');
303311
if(is_screen_width_lg_or_less()) {
304312
vehicles_panel.classList.add('d-none');
305313
}
306314
map.flyTo(vehicle.coords, 17, { animate: false });
307315
marker.fireEvent('click');
308-
register_vehicle_view(type, inv_number);
316+
register_vehicle_view(vehicle.type, vehicle.inv_number);
309317
}
310318

311319
function update_route_tables(route_tables) {
@@ -315,20 +323,18 @@ function update_route_tables(route_tables) {
315323
route_ref = null;
316324
}
317325

318-
const old_tbody = document.querySelector(`#${type}_${route_ref}`);
326+
const tbody = document.querySelector(`#${type}_${route_ref}`);
327+
const vehicles_cell = tbody.querySelector('tr > td');
319328
try {
320329
const cgm_route_id = routes.find(route => route.type === type && route.route_ref === route_ref).cgm_id;
321330
const relevant_vehicles = cache.filter(vehicle => vehicle.type === type && vehicle.cgm_route_id === cgm_route_id && vehicle.hidden !== true);
322331
for(const v of relevant_vehicles) {
323-
v.is_unexpected = !is_vehicle_expected_on_line(type, route_ref, v.inv_number);
332+
v.is_unexpected = !is_vehicle_expected_on_line(v);
324333
}
325-
const new_tbody = old_tbody.cloneNode();
326-
new_tbody.appendChild(old_tbody.children[0]);
327-
populate_route_table(relevant_vehicles, new_tbody)
328-
old_tbody.replaceWith(new_tbody);
334+
populate_route_table(relevant_vehicles, tbody, vehicles_cell)
329335
}
330-
catch (err){
331-
console.error(err)
336+
catch (err) {
337+
console.error(err);
332338
console.log(type, route_ref,`#${type}_${route_ref}`, table);
333339
}
334340
}

src/js/cache.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export function handle_tram_compositions(cache, data_source) {
5858
const copy = JSON.parse(JSON.stringify(first_wagon_entry));
5959
copy.inv_number = composition_inv_number;
6060
copy.full_inv_number = `${first_wagon}+${second_wagon}`;
61+
copy.cgm_id = `composition_${first_wagon}_${second_wagon}`;
6162
cache.push(copy);
6263
}
6364
else {
@@ -89,7 +90,7 @@ export function handle_tram_compositions(cache, data_source) {
8990

9091
export function add_to_cache(vehicle, tables_to_update, cache) {
9192
let cache_entry = cache.find(entry =>
92-
entry.type === vehicle.type && entry.inv_number === vehicle.inv_number);
93+
entry.cgm_id === vehicle.cgm_id);
9394

9495
const same_timestamp = cache_entry && cache_entry.timestamp === vehicle.timestamp;
9596
const same_coords = cache_entry && cache_entry.coords[0] === vehicle.coords[0] && cache_entry.coords[1] === vehicle.coords[1];

src/js/map_stops.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ function display_stop_times(stop_routes) {
178178
for(const { actual_time, scheduled_time, occupancy: vehicle_occupancy, inv_number, next_stop } of route.times) {
179179
const td = document.createElement('td');
180180
const r = display_hours(scheduled_time, actual_time);
181-
const model = inv_number ? get_vehicle_model(type, inv_number) : null;
181+
const vehicle = cache.find(v => v.inv_number == inv_number && v.type == type);
182+
const model = inv_number ? get_vehicle_model(vehicle) : null;
182183

183184
let popover_content = ``;
184185
popover_content += `${BG_TYPES[type]} ${inv_number ?? 'неизвестен'}<br>`;

src/js/map_vehicles.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ function generate_vehicle_popup_text(vehicle, cache) {
2323
const correctInvNumber = proper_inv_number(inv_number);
2424
const classes = get_route_classes(type, route_ref).join(' ');
2525
const destinationStopName = destination_stop ? stops.get(destination_stop)?.names.bg : null;
26-
const modelText = get_vehicle_model_name(type, inv_number);
26+
const modelText = get_vehicle_model_name(vehicle);
2727

2828
const allCarsOnLine = cache
2929
.filter(v => v.type === type && v.route_ref === route_ref)
@@ -57,10 +57,10 @@ function generate_vehicle_popup_text(vehicle, cache) {
5757
const i = document.createElement('i');
5858
i.className = 'bi bi-arrow-left';
5959
prev_btn.appendChild(i);
60-
const prevInvNumber = allCarsOnLine.findLast(v => v.car < car && v.marker)?.inv_number;
61-
if (prevInvNumber) {
60+
const prev_cgm_id = allCarsOnLine.findLast(v => v.car < car && v.marker)?.cgm_id;
61+
if (prev_cgm_id) {
6262
prev_btn.addEventListener('click', () => {
63-
zoom_to_vehicle(type, prevInvNumber);
63+
zoom_to_vehicle(prev_cgm_id);
6464
});
6565
first_row.insertBefore(prev_btn, first_row.firstChild);
6666
}
@@ -72,10 +72,10 @@ function generate_vehicle_popup_text(vehicle, cache) {
7272
const i = document.createElement('i');
7373
i.className = 'bi bi-arrow-right';
7474
next_btn.appendChild(i);
75-
const nextInvNumber = allCarsOnLine.find(v => v.car > car && v.marker)?.inv_number;
76-
if (nextInvNumber) {
75+
const next_cgm_id = allCarsOnLine.find(v => v.car > car && v.marker)?.cgm_id;
76+
if (next_cgm_id) {
7777
next_btn.addEventListener('click', () => {
78-
zoom_to_vehicle(type, nextInvNumber);
78+
zoom_to_vehicle(next_cgm_id);
7979
});
8080
first_row.appendChild(next_btn);
8181
}

0 commit comments

Comments
 (0)