so on this page I have 2 drop-down and when submit button is clicked it is fetching data from a pocketbase backend. I am making a table component for each raw of data. (Component displays a id, link, a dropdown to change it's status and a submit button that uses form action again to update that particular row of data in the collection). I am using enhance (also tried using prevent default) but still the page is still refreshing. 1 thing to point out is I am using a variable named linkType in main script tag that stores value for what a user have selected from dropdown. It is shared among all components
Any idea how can I prevent it?
<script> import { enhance } from '$app/forms'; export let data; let selectedUser = ''; let selectedCourse = ''; function handleUserChange(event) { selectedUser = event.target.value; selectedCourse = ''; } function handleCourseChange(event) { selectedCourse = event.target.value; } async function showSelection() { console.log('Selected User:', selectedUser); console.log('Selected Course:', selectedCourse); } export let form; let linkType = ''; let linkResult = ''; let linkTypes = ['Type1', 'Type']; let linkResults = ['Result1', 'Result2']; function handleLinkTypeChange(event) { linkType = event.target.value; } function handleLinkResultChange(event) { linkResult = event.target.value; }</script><div><h1 class="text-white-700 text-center text-4xl font-bold">Select Client Data</h1> {#if data}<form action="?/userSelection" method="POST" use:enhance class="flex flex-col items-center space-y-4 p-10"><select name="user" class="select select-accent w-full max-w-xs" value={selectedUser} on:change={handleUserChange}><option disabled selected>Select a User</option> {#each data.userData as user}<option value={user.user}>{user.user}</option> {/each}</select> {#if selectedUser !== ''}<select name="course" class="select select-accent w-full max-w-xs" value={selectedCourse} on:change={handleCourseChange}><option disabled selected>Select a Course</option> {#each data.userData.find((user) => user.user === selectedUser)?.courses || [] as course}<option value={course}>{course}</option> {/each}</select> {/if}<button type="submit" on:click={showSelection} class="btn btn-primary">Get Data</button></form> {:else}<p>Loading...</p> {/if} {#if form && form.response} {#each form.response as row}<div class="overflow-x-auto"><table class="min-w-full divide-y divide-gray-200"><thead class="bg-gray-50"><tr><th scope="col" class="w-1/5 px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500">ID</th><th scope="col" class="w-1/5 px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500">Link</th><th scope="col" class="w-2/5 px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500">Link Type</th><th scope="col" class="w-2/5 px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500">Link Result</th><th scope="col" class="w-2/5 px-6 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500">Update</th></tr></thead><tbody class="divide-y divide-gray-200 bg-white"><tr class="border-b border-gray-200 hover:bg-gray-100"><td class="whitespace-nowrap px-6 py-4">{row.id}</td><td class="whitespace-nowrap px-6 py-4" style="max-width: 300px; overflow-x: auto; width: 100%;"><a href={row.url} class="truncate">{row.url}</a></td><td class="whitespace-nowrap px-6 py-4"><select class="block rounded-md border border-gray-300 bg-white px-3 py-2 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-indigo-500 sm:text-sm"> {#each linkTypes as type}<option value={type}>{type}</option> {/each}</select></td><td class="whitespace-nowrap px-6 py-4"><select class="block rounded-md border border-gray-300 bg-white px-3 py-2 shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-indigo-500 sm:text-sm"> {#each linkResults as result}<option value={result}>{result}</option> {/each}</select></td><td class="whitespace-nowrap px-6 py-4 text-right"><form action="?/update" method="POST" use:enhance on:submit={(event) => event.preventDefault()}><input type="hidden" hidden value={row.id} name="id" /><input type="hidden" hidden value={linkType} name="linkType" /><input type="hidden" hidden value={linkResult} name="linkResult" /><button type="submit" class="rounded bg-blue-500 px-4 py-2 text-white hover:bg-blue-700">Update</button></form></td></tr></tbody></table></div> {/each} {:else}<div><p>Select User First</p></div> {/if}</div>
Also this is my +page.server.js file that has action -->
export async function load({ locals }) { try { const users = await locals.pb.collection('UserData').getFullList(); const userCoursesMap = new Map(); users.forEach(entry => { const userId = entry.user[0]; const courseName = entry.courseName; if (userCoursesMap.has(userId)) { userCoursesMap.get(userId).push(courseName); } else { userCoursesMap.set(userId, [courseName]); } }); const userData = Array.from(userCoursesMap).map(([userId, courses]) => ({ user: userId, courses: courses })); return { userData }; } catch (error) { console.error('Error fetching user data:', error); throw error; }}export const actions = { userSelection: async ({ request, locals }) => { const formData = await request.formData(); // const user = Object.fromEntries(formData); const user = formData.get("user"); // add course name as well. "" try { const response = await locals.pb.collection("Orbittest").getFullList({ filter: `user = "${user}"`, fields: "id, user, url, linkType, linkResult" }); const jsonResponse = JSON.stringify(response); console.log("Fetched data:", jsonResponse); return { response }; } catch (error) { console.error("Error fetching data:", error); return { error }; } }, update: async ({ request }) => { const formData = await request.formData(); const id = formData.get("id") const linkType = formData.get("linkType") const linkResult = formData.get("linkResult") console.log(id, linkType, linkResult) return { status: 200, id } }};
I am getting id, and type for the link I just updated but after that entire page refreshing.