Allow pre-selecting vehicle, version, and board via URL parameters#229
Conversation
|
This PR still has huge diff. I will suggest you to get to the root cause instead of resubmitting the PR. Do not close existing PR. The same branch after fixing things in this PR itself. You need to get rid of your last commit I think. Please check diff before pushing. |
f39ece1 to
9a111be
Compare
shiv-tyagi
left a comment
There was a problem hiding this comment.
Thanks for contributing. The direction is correct. It just needs a little more polishing. PTAL.
web/static/js/add_build.js
Outdated
| if (typeof rebuildFromBuildId !== 'undefined') { | ||
| await initRebuild(rebuildFromBuildId); | ||
| } else { | ||
| initFromUrlParams(); |
There was a problem hiding this comment.
Can we rename initRebuild to initPreSelect and do both in same function (and get rid of initFromUrlParams altogether). We first check if rebuild_from param is there, if not we check vehicle_id, board_id and version_id are present, and set those properties.
The only difference would be that we would not be setting selected_features[], in second case.
There was a problem hiding this comment.
I merged the rebuild and URL param logic into a single initPreSelect() function and removed initFromUrlParams().
Thank you
web/static/js/add_build.js
Outdated
| if (params.has('vehicle')) rebuildConfig.vehicleId = params.get('vehicle'); | ||
| if (params.has('board')) rebuildConfig.boardId = params.get('board'); | ||
| if (params.has('version')) rebuildConfig.versionId = params.get('version'); |
There was a problem hiding this comment.
| if (params.has('vehicle')) rebuildConfig.vehicleId = params.get('vehicle'); | |
| if (params.has('board')) rebuildConfig.boardId = params.get('board'); | |
| if (params.has('version')) rebuildConfig.versionId = params.get('version'); | |
| if (params.has('vehicle_id')) rebuildConfig.vehicleId = params.get('vehicle'); | |
| if (params.has('board_id')) rebuildConfig.boardId = params.get('board'); | |
| if (params.has('version_id')) rebuildConfig.versionId = params.get('version'); |
Let us call it vehicle_id and similar at all places.
There was a problem hiding this comment.
Updated to use vehicle_id, version_id and board_id consistently for URL parameters.
Thanks for pointing this out.
web/static/js/add_build.js
Outdated
| if (params.has('version')) rebuildConfig.versionId = params.get('version'); | ||
|
|
||
| // Set flag to indicate URL parameters were provided | ||
| rebuildConfig.fromUrlParams = hasParams; |
There was a problem hiding this comment.
Can this be avoided? This won't be needed if we have a common error handling as described in the other comment.
web/static/js/add_build.js
Outdated
| if (rebuildConfig.isRebuildMode) { | ||
| console.warn(`Rebuild vehicle '${rebuildConfig.vehicleId}' not found in available vehicles`); | ||
| alert(`Warning: The vehicle from the original build is no longer available.\n\nRedirecting to new build page...`); | ||
| window.location.href = '/add_build'; | ||
| return; | ||
| } else if (rebuildConfig.fromUrlParams) { | ||
| console.warn(`URL parameter vehicle '${rebuildConfig.vehicleId}' not found. Defaulting to first available vehicle.`); | ||
| rebuildConfig.vehicleId = null; | ||
| } else { | ||
| rebuildConfig.vehicleId = null; | ||
| } |
There was a problem hiding this comment.
Can we have one common error message for both cases? That way we can also avoid multiple if-else cases.
Maybe something like, "Vehicle XXX is no longer listed for building. Redirecting to new build page...".
There was a problem hiding this comment.
yes added a common error message for both case ! ###
web/static/js/add_build.js
Outdated
| if (rebuildConfig.isRebuildMode) { | ||
| console.warn(`Rebuild board '${rebuildConfig.boardId}' not found for version '${version_id}'`); | ||
| alert(`Warning: The board from the original build is no longer available.\n\nRedirecting to new build page...`); | ||
| window.location.href = '/add_build'; | ||
| return; | ||
| } else if (rebuildConfig.fromUrlParams) { | ||
| console.warn(`URL parameter board '${rebuildConfig.boardId}' not found for version '${version_id}'. Defaulting to first available board.`); | ||
| rebuildConfig.boardId = null; | ||
| } else { | ||
| rebuildConfig.boardId = null; | ||
| } |
There was a problem hiding this comment.
Similar to the other comment for vehicles.
web/static/js/add_build.js
Outdated
| if (rebuildConfig.isRebuildMode) { | ||
| console.warn(`Rebuild version '${rebuildConfig.versionId}' not found for vehicle '${new_vehicle_id}'`); | ||
| alert(`Warning: The version from the original build is no longer available.\n\nRedirecting to new build page...`); | ||
| window.location.href = '/add_build'; | ||
| return; | ||
| } else if (rebuildConfig.fromUrlParams) { | ||
| console.warn(`URL parameter version '${rebuildConfig.versionId}' not found for vehicle '${new_vehicle_id}'. Defaulting to first available version.`); | ||
| rebuildConfig.versionId = null; | ||
| } else { | ||
| rebuildConfig.versionId = null; | ||
| } |
There was a problem hiding this comment.
Similar to the other comment for vehicles.
web/static/js/add_build.js
Outdated
| function updateGlobalCheckboxState() { | ||
| const total_options = Object.keys(features_by_id).length; | ||
| let global_checkbox = document.getElementById("check-uncheck-all"); | ||
| if (!global_checkbox) return; |
There was a problem hiding this comment.
Removed the additional null check
web/static/js/add_build.js
Outdated
| const params = new URLSearchParams(window.location.search); | ||
|
|
||
| // Rebuild flow --- | ||
| if (typeof rebuildFromBuildId !== "undefined") { |
There was a problem hiding this comment.
We can use params.has() and params.get() here as well.
web/static/js/add_build.js
Outdated
| rebuildConfig.vehicleId = data.vehicle?.id || null; | ||
| rebuildConfig.versionId = data.version?.id || null; | ||
| rebuildConfig.boardId = data.board?.id || null; | ||
| rebuildConfig.selectedFeatures = data.selected_features || []; | ||
| rebuildConfig.isRebuildMode = true; |
There was a problem hiding this comment.
We can't just fallback to null like this. See existing pattern and throw similar error to the user.
web/static/js/add_build.js
Outdated
|
|
||
| const data = await res.json(); | ||
|
|
||
| rebuildConfig.vehicleId = data.vehicle?.id || null; |
There was a problem hiding this comment.
We should call it preSelectConfig now.
web/static/js/add_build.js
Outdated
|
|
||
| function createCategoryCard(category_name, features_in_category, expanded) { | ||
| options_html = ""; | ||
| let options_html = ""; |
There was a problem hiding this comment.
Out of scope of this PR. Please remove this.
web/static/js/add_build.js
Outdated
| output.innerHTML = '<label for="vehicle" class="form-label"><strong>Select Vehicle</strong></label>' + | ||
| '<select name="vehicle" id="vehicle" class="form-select" aria-label="Select Vehicle" onchange="onVehicleChange(this.value);"></select>'; | ||
| vehicleList = document.getElementById("vehicle"); | ||
| let vehicleList = document.getElementById("vehicle"); |
web/static/js/add_build.js
Outdated
| let vehicleList = document.getElementById("vehicle"); | ||
| vehicles.forEach(vehicle => { | ||
| opt = document.createElement('option'); | ||
| let opt = document.createElement('option'); |
There was a problem hiding this comment.
Addressed all requested changes and reverted out-of-scope edits
|
Can you squash all your commits into the first commit? Please be careful if this is your first time doing it. |
a9f6dc1 to
306ae60
Compare
|
@ryanbasic1 Just one commit please. Fold second into first. |
- 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
306ae60 to
1253153
Compare
|
LGTM |
|
Thanks |
Adds support for pre-selecting vehicle, version, and board from URL parameters.
Example:
?vehicle=copter&version=stable&board=pixhawk
Details
Frontend-only change
No backend changes required
Safe fallback if parameters are invalid
Does not affect existing behavior
This allows external links to directly open pre-configured build ### ### selections.
Closes #181