diff --git a/src/ecm_control/web/__init__.py b/src/ecm_control/web/__init__.py index fbee640..449c4ee 100644 --- a/src/ecm_control/web/__init__.py +++ b/src/ecm_control/web/__init__.py @@ -260,26 +260,76 @@ async def create_button( logger.error(f"Full traceback: {traceback.format_exc()}") raise HTTPException(status_code=400, detail="Failed to create button") -@app.put("/buttons/{button_id}") +@app.put("/buttons/{button_id}", response_class=HTMLResponse) async def update_button( + request: Request, button_id: int, recipe_id: str = Form(""), + gpio_pin: Optional[int] = Form(None), db: DatabaseManager = Depends(get_db) ): - """Update button recipe mapping""" + """Update button recipe mapping and/or GPIO pin""" try: # Convert empty string to None, otherwise convert to int recipe_id_value = None if recipe_id == "" else int(recipe_id) - db.execute_update( - "UPDATE buttons SET recipe_id = ? WHERE id = ?", - (recipe_id_value, button_id) - ) - return {"status": "success"} + if gpio_pin is not None: + # Update both recipe and GPIO pin + db.execute_update( + "UPDATE buttons SET recipe_id = ?, gpio_pin = ? WHERE id = ?", + (recipe_id_value, gpio_pin, button_id) + ) + else: + # Update only recipe + db.execute_update( + "UPDATE buttons SET recipe_id = ? WHERE id = ?", + (recipe_id_value, button_id) + ) + + # Return updated button list + buttons = db.execute_query(""" + SELECT b.*, r.name as recipe_name + FROM buttons b + LEFT JOIN recipes r ON b.recipe_id = r.id + ORDER BY b.name + """) + recipes = db.execute_query("SELECT * FROM recipes ORDER BY name") + return templates.TemplateResponse("partials/button_list.html", { + "request": request, + "buttons": buttons, + "recipes": recipes + }) except Exception as e: logger.error(f"Error updating button: {e}") raise HTTPException(status_code=400, detail="Failed to update button") +@app.delete("/buttons/{button_id}", response_class=HTMLResponse) +async def delete_button( + request: Request, + button_id: int, + db: DatabaseManager = Depends(get_db) +): + """Delete a button""" + try: + db.execute_update("DELETE FROM buttons WHERE id = ?", (button_id,)) + + # Return updated button list + buttons = db.execute_query(""" + SELECT b.*, r.name as recipe_name + FROM buttons b + LEFT JOIN recipes r ON b.recipe_id = r.id + ORDER BY b.name + """) + recipes = db.execute_query("SELECT * FROM recipes ORDER BY name") + return templates.TemplateResponse("partials/button_list.html", { + "request": request, + "buttons": buttons, + "recipes": recipes + }) + except Exception as e: + logger.error(f"Error deleting button: {e}") + raise HTTPException(status_code=400, detail="Failed to delete button") + # Shot history routes @app.get("/shots", response_class=HTMLResponse) async def list_shots(request: Request, db: DatabaseManager = Depends(get_db)): diff --git a/templates/partials/button_list.html b/templates/partials/button_list.html index 690d0d3..9e8b846 100644 --- a/templates/partials/button_list.html +++ b/templates/partials/button_list.html @@ -5,6 +5,7 @@