// Feedback Modal POP-UP on Back Button backButton.addEventListener("click", async function(event){ console.log("Back button clicked"); event.preventDefault(); if(!currentZoneId){ console.log("no configuration selected, going back directly") window.location.href = `/notebook/?effort_id=${effortId}&user_id=${userId}`; return; } console.log("Debug BackBtn:", {userId, notebookId, currentZoneId, effortId}); try { console.log("Checking user feedback eligibility..."); // CHANGED/ADDED: Fetch eligibility data from the server const response = await fetch(`/chat_feature/user_feedback_eligibility?user_id=${userId}¬ebook_id=${notebookId}&zone_id=${currentZoneId}`); const data = await response.json(); if (data.eligible_for_feedback) { console.log("User is eligible for feedback:", data); // CHANGED/ADDED: Initialize the modal here if(data.has_feedback){ document.getElementById("feedbackLevel").value = data.rating ||""; document.getElementById("comment").value = data.comment ||""; document.getElementById("updateNotice").style.display = "block"; } else{ document.getElementById("feedbackLevel").value = data.rating ||""; document.getElementById("comment").value = data.comment ||""; document.getElementById("updateNotice").style.display = "none"; } // CHANGED/ADDED: Now modal will always be initialized and ready here console.log(bootstrapFeedbackModal); if (bootstrapFeedbackModal) { console.log("Showing feedback modal"); bootstrapFeedbackModal.show(); } else { alert("Feedback modal not initialized!"); } } else { console.log("User is not eligible for feedback:", data); window.location.href = `/notebook/?effort_id=${effortId}&user_id=${userId}`; } } catch (error) { console.error('Error checking eligibility:', error); window.location.href = `/notebook/?effort_id=${effortId}&user_id=${userId}`; } }); // Feedback Submit document.getElementById("submitFeedback").addEventListener("click", async function () { const rating = document.getElementById("feedbackLevel").value; const comment = document.getElementById("comment").value; const payload = { user_id: userId, notebook_id: parseInt(notebookId), effort_id: parseInt(effortId), zone_id: parseInt(currentZoneId), rating: rating ? parseInt(rating) : null, comment: comment }; try { const response = await fetch("/chat_feature/submit_feedback", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); if (response.ok) { bootstrapFeedbackModal.hide(); window.location.href = `/notebook/?effort_id=${effortId}&user_id=${userId}`; } else { alert("Error submitting feedback"); } } catch (error) { console.error("Error submitting feedback:", error); alert("Error submitting feedback"); } }); // Skip feedback document.getElementById("skipFeedback").addEventListener("click", function () { bootstrapFeedbackModal.hide(); window.location.href = `/notebook/?effort_id=${effortId}&user_id=${userId}`; }); ------ # #-------to post the feedback data------- @chat_feature_bp.route('/submit_feedback', methods=['POST']) @login_required def submit_feedback(): data = request.json print(data) feedback_payload = { "user_id": data.get("user_id"), "notebook_id": data.get("notebook_id"), "effort_id": data.get("effort_id"), "zone_id": data.get("zone_id"), "rating": data.get("rating"), "comment": data.get("comment"), } response = requests.post("http://localhost:8044/feedback/", json = feedback_payload) print("Recieved Feedback", feedback_payload) return jsonify(response.json()),response.status_code @chat_feature_bp.route("/user_feedback_eligibility", methods=["GET"]) @login_required def user_feedback_eligibility(): user_id = request.args.get("user_id") notebook_id = request.args.get("notebook_id") zone_id = request.args.get("zone_id") if not zone_id: return jsonify({"eligible_for_feedback": False}) try: notebook_response = requests.get(f"http://localhost:8044/user/get_notebook_details/{notebook_id}") notebook_response.raise_for_status() chat_data = notebook_response.json().get('chat', {}).get('message', []) eligible = len(chat_data) > 0 except Exception as e: print(f"Error fetching notebook details: {e}") return jsonify({"eligible_for_feedback": False, "error": "notebook fetch failed"}), 500 try: feedback_response = requests.get( "http://localhost:8044/feedback/", params={"user_id": user_id, "notebook_id": notebook_id, "zone_id": zone_id} ) feedback_data = feedback_response.json() if feedback_response.ok else {"exists": False} except Exception as e: print(f"Error fetching feedback: {e}") feedback_data = {"exists": False} response = { "eligible_for_feedback": eligible, "has_feedback": feedback_data.get("exists", False) } if feedback_data.get("exists"): response.update({ "rating": feedback_data.get("rating"), "comment": feedback_data.get("comment") }) print("User feedback eligibility response:", response) return jsonify(response) ---> this is flask ui python file and #created a api to call that create_feedback function------- @router.post("/feedback/") async def create_feedback_endpoint(feedback: Feedback): try: # result = create_feedback(user_id= feedback.user_id, notebook_id= feedback.notebook_id, effort_id= feedback.effort_id, rating= feedback.rating, comment= feedback.comment) create_or_update_feedback( user_id=feedback.user_id, notebook_id=feedback.notebook_id, effort_id=feedback.effort_id, zone_id=feedback.zone_id, rating=feedback.rating, comment=feedback.comment ) return {"message": "Feedback submitted successfully"} except Exception as e: raise HTTPException(status_code=500, detail="Failed to submit feedback") @router.get("/feedback/") async def get_existing_feedback(user_id: str, notebook_id: str, zone_id: str): try: feedback= get_feedback(user_id, notebook_id, zone_id) if feedback: return{"exists": True, "rating": feedback["rating"], "comment": feedback["comment"]} else: return{"exists": False} except Exception as e: raise HTTPException(status_code=500, details="Failed to fetch feedback") --> this my backend api endpoint with class #feedbackModal class class Feedback(BaseModel): user_id: str notebook_id: str effort_id: str zone_id: str #rating: Optional[str] = None rating: Optional[int] = None comment: Optional[str] = None