@@ -297,70 +297,80 @@ const Features = (() => {
297297
298298var 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
309308async 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