Skip to content

Commit 306ae60

Browse files
committed
Refactor preselect logic and address review comments
- Merge rebuild and URL param flow into initPreSelect - Use URLSearchParams consistently - Rename rebuildConfig to preSelectConfig - Unify vehicle/version/board error handling - Remove out-of-scope changes
1 parent 9a111be commit 306ae60

File tree

1 file changed

+98
-106
lines changed

1 file changed

+98
-106
lines changed

web/static/js/add_build.js

Lines changed: 98 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -297,70 +297,80 @@ const Features = (() => {
297297

298298
var init_categories_expanded = false;
299299

300-
var rebuildConfig = {
300+
var preSelectConfig = {
301301
vehicleId: null,
302302
versionId: null,
303303
boardId: null,
304304
selectedFeatures: [],
305-
isRebuildMode: false,
306-
fromUrlParams: false
305+
isRebuildMode: false
307306
};
308307

309308
async function init() {
310-
if (typeof rebuildFromBuildId !== 'undefined') {
311-
await initRebuild(rebuildFromBuildId);
312-
} else {
313-
initFromUrlParams();
314-
}
315-
316-
fetchVehicles();
309+
await initPreSelect();
310+
fetchVehicles();
317311
}
318312

319-
function initFromUrlParams() {
320-
const params = new URLSearchParams(window.location.search);
321-
const hasParams = params.has('vehicle') || params.has('board') || params.has('version');
322-
323-
if (params.has('vehicle')) rebuildConfig.vehicleId = params.get('vehicle');
324-
if (params.has('board')) rebuildConfig.boardId = params.get('board');
325-
if (params.has('version')) rebuildConfig.versionId = params.get('version');
326-
327-
// Set flag to indicate URL parameters were provided
328-
rebuildConfig.fromUrlParams = hasParams;
329-
}
313+
async function initPreSelect() {
314+
const params = new URLSearchParams(window.location.search);
315+
316+
if (params.has("rebuild_from")) {
317+
const rebuildId = params.get("rebuild_from");
330318

331-
async function initRebuild(buildId) {
332319
try {
333-
const buildResponse = await fetch(`/api/v1/builds/${buildId}`);
334-
if (!buildResponse.ok) {
335-
throw new Error('Failed to fetch build details');
336-
}
337-
const buildData = await buildResponse.json();
338-
339-
if (!buildData.vehicle || !buildData.vehicle.id) {
340-
throw new Error('Vehicle information is missing from the build');
341-
}
342-
if (!buildData.version || !buildData.version.id) {
343-
throw new Error('Version information is missing from the build');
344-
}
345-
if (!buildData.board || !buildData.board.id) {
346-
throw new Error('Board information is missing from the build');
347-
}
348-
349-
rebuildConfig.vehicleId = buildData.vehicle.id;
350-
rebuildConfig.versionId = buildData.version.id;
351-
rebuildConfig.boardId = buildData.board.id;
352-
rebuildConfig.selectedFeatures = buildData.selected_features || [];
353-
rebuildConfig.isRebuildMode = true;
354-
355-
} catch (error) {
356-
console.error('Error loading rebuild configuration:', error);
357-
alert('Failed to load build configuration: ' + error.message + '\n\nRedirecting to new build page...');
358-
window.location.href = '/add_build';
359-
throw error;
320+
const res = await fetch(`/api/v1/builds/${rebuildId}`);
321+
if (!res.ok) throw new Error("Failed to fetch build");
322+
323+
const data = await res.json();
324+
325+
if (!data.vehicle || !data.vehicle.id) {
326+
throw new Error("Vehicle information is missing from the build");
327+
}
328+
329+
if (!data.version || !data.version.id) {
330+
throw new Error("Version information is missing from the build");
331+
}
332+
333+
if (!data.board || !data.board.id) {
334+
throw new Error("Board information is missing from the build");
335+
}
336+
337+
preSelectConfig.vehicleId = data.vehicle.id;
338+
preSelectConfig.versionId = data.version.id;
339+
preSelectConfig.boardId = data.board.id;
340+
preSelectConfig.selectedFeatures = data.selected_features || [];
341+
preSelectConfig.isRebuildMode = true;
342+
343+
} catch (err) {
344+
console.error("Error loading rebuild config:", err);
345+
alert(
346+
"Failed to load build configuration: " +
347+
err.message +
348+
"\n\nRedirecting to new build page..."
349+
);
350+
window.location.href = "/add_build";
351+
throw err;
360352
}
353+
354+
return;
355+
}
356+
357+
358+
if (params.has("vehicle_id")) {
359+
preSelectConfig.vehicleId = params.get("vehicle_id");
360+
}
361+
362+
if (params.has("version_id")) {
363+
preSelectConfig.versionId = params.get("version_id");
364+
}
365+
366+
if (params.has("board_id")) {
367+
preSelectConfig.boardId = params.get("board_id");
368+
}
361369
}
362370

363-
function applyRebuildFeatures(featuresList) {
371+
372+
373+
function applyPreSelectedFeatures(featuresList) {
364374
Features.checkUncheckAll(false);
365375

366376
if (featuresList && featuresList.length > 0) {
@@ -370,13 +380,12 @@ function applyRebuildFeatures(featuresList) {
370380
}
371381
}
372382

373-
function clearRebuildConfig() {
374-
rebuildConfig.vehicleId = null;
375-
rebuildConfig.versionId = null;
376-
rebuildConfig.boardId = null;
377-
rebuildConfig.selectedFeatures = [];
378-
rebuildConfig.isRebuildMode = false;
379-
rebuildConfig.fromUrlParams = false;
383+
function clearPreSelectConfig() {
384+
preSelectConfig.vehicleId = null;
385+
preSelectConfig.versionId = null;
386+
preSelectConfig.boardId = null;
387+
preSelectConfig.selectedFeatures = [];
388+
preSelectConfig.isRebuildMode = false;
380389
}
381390

382391
// enables or disables the elements with ids passed as an array
@@ -413,24 +422,18 @@ function fetchVehicles() {
413422
.then((json_response) => {
414423
let all_vehicles = json_response;
415424

416-
if (rebuildConfig.vehicleId) {
417-
const vehicleExists = all_vehicles.some(v => v.id === rebuildConfig.vehicleId);
425+
if (preSelectConfig.vehicleId) {
426+
const vehicleExists = all_vehicles.some(v => v.id === preSelectConfig.vehicleId);
418427
if (!vehicleExists) {
419-
if (rebuildConfig.isRebuildMode) {
420-
console.warn(`Rebuild vehicle '${rebuildConfig.vehicleId}' not found in available vehicles`);
421-
alert(`Warning: The vehicle from the original build is no longer available.\n\nRedirecting to new build page...`);
422-
window.location.href = '/add_build';
423-
return;
424-
} else if (rebuildConfig.fromUrlParams) {
425-
console.warn(`URL parameter vehicle '${rebuildConfig.vehicleId}' not found. Defaulting to first available vehicle.`);
426-
rebuildConfig.vehicleId = null;
427-
} else {
428-
rebuildConfig.vehicleId = null;
429-
}
428+
const msg = `Vehicle '${preSelectConfig.vehicleId}' is no longer listed for building. Redirecting to new build page...`;
429+
console.warn(msg);
430+
alert(msg);
431+
window.location.href = '/add_build';
432+
return;
430433
}
431434
}
432435

433-
let new_vehicle = rebuildConfig.vehicleId ||
436+
let new_vehicle = preSelectConfig.vehicleId ||
434437
(all_vehicles.find(vehicle => vehicle.name === "Copter") ? "copter" : all_vehicles[0].id);
435438
updateVehicles(all_vehicles, new_vehicle);
436439
})
@@ -462,24 +465,19 @@ function onVehicleChange(new_vehicle_id) {
462465
let all_versions = json_response;
463466
all_versions = sortVersions(all_versions);
464467

465-
if (rebuildConfig.versionId) {
466-
const versionExists = all_versions.some(v => v.id === rebuildConfig.versionId);
467-
if (!versionExists) {
468-
if (rebuildConfig.isRebuildMode) {
469-
console.warn(`Rebuild version '${rebuildConfig.versionId}' not found for vehicle '${new_vehicle_id}'`);
470-
alert(`Warning: The version from the original build is no longer available.\n\nRedirecting to new build page...`);
471-
window.location.href = '/add_build';
472-
return;
473-
} else if (rebuildConfig.fromUrlParams) {
474-
console.warn(`URL parameter version '${rebuildConfig.versionId}' not found for vehicle '${new_vehicle_id}'. Defaulting to first available version.`);
475-
rebuildConfig.versionId = null;
476-
} else {
477-
rebuildConfig.versionId = null;
478-
}
479-
}
468+
if (preSelectConfig.versionId) {
469+
const versionExists = all_versions.some(v => v.id === preSelectConfig.versionId);
470+
if (!versionExists) {
471+
const msg = `Version '${preSelectConfig.versionId}' is no longer listed for building. Redirecting to new build page...`;
472+
console.warn(msg);
473+
alert(msg);
474+
window.location.href = '/add_build';
475+
return;
476+
}
477+
480478
}
481479

482-
const new_version = rebuildConfig.versionId || all_versions[0].id;
480+
const new_version = preSelectConfig.versionId || all_versions[0].id;
483481
updateVersions(all_versions, new_version);
484482
})
485483
.catch((message) => {
@@ -525,24 +523,18 @@ function onVersionChange(new_version) {
525523
// Keep full board objects with id and name
526524
let boards = boards_response;
527525

528-
if (rebuildConfig.boardId) {
529-
const boardExists = boards.some(b => b.id === rebuildConfig.boardId);
526+
if (preSelectConfig.boardId) {
527+
const boardExists = boards.some(b => b.id === preSelectConfig.boardId);
530528
if (!boardExists) {
531-
if (rebuildConfig.isRebuildMode) {
532-
console.warn(`Rebuild board '${rebuildConfig.boardId}' not found for version '${version_id}'`);
533-
alert(`Warning: The board from the original build is no longer available.\n\nRedirecting to new build page...`);
534-
window.location.href = '/add_build';
535-
return;
536-
} else if (rebuildConfig.fromUrlParams) {
537-
console.warn(`URL parameter board '${rebuildConfig.boardId}' not found for version '${version_id}'. Defaulting to first available board.`);
538-
rebuildConfig.boardId = null;
539-
} else {
540-
rebuildConfig.boardId = null;
541-
}
542-
}
529+
const msg = `Board '${preSelectConfig.boardId}' is no longer listed for building. Redirecting to new build page...`;
530+
console.warn(msg);
531+
alert(msg);
532+
window.location.href = '/add_build';
533+
return;
534+
}
535+
543536
}
544-
545-
let new_board = rebuildConfig.boardId || (boards.length > 0 ? boards[0].id : null);
537+
let new_board = preSelectConfig.boardId || (boards.length > 0 ? boards[0].id : null);
546538
updateBoards(boards, new_board);
547539
})
548540
.catch((message) => {
@@ -582,9 +574,9 @@ function onBoardChange(new_board) {
582574
fillBuildOptions(features_response);
583575

584576
// TODO: Refactor to use a single method to apply both rebuild and default features
585-
if (rebuildConfig.isRebuildMode) {
586-
applyRebuildFeatures(rebuildConfig.selectedFeatures);
587-
clearRebuildConfig();
577+
if (preSelectConfig.isRebuildMode) {
578+
applyPreSelectedFeatures(preSelectConfig.selectedFeatures);
579+
clearPreSelectConfig();
588580
} else {
589581
Features.applyDefaults();
590582
}

0 commit comments

Comments
 (0)