From 3ba56ca23261f3d03fcf8affd6bda21b1383c778 Mon Sep 17 00:00:00 2001 From: Mohamad Date: Fri, 27 Dec 2024 15:40:42 +0100 Subject: [PATCH] frontend changes --- frontend/src/lib/api.ts | 95 +++++++++++++++++----- frontend/src/routes/+page.svelte | 6 +- frontend/src/routes/create/+page.svelte | 30 +++++-- frontend/src/routes/form/[id]/+page.svelte | 22 +++-- frontend/src/routes/form/[id]/+page.ts | 5 ++ 5 files changed, 120 insertions(+), 38 deletions(-) create mode 100644 frontend/src/routes/form/[id]/+page.ts diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 7944fd7..9f62858 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -1,28 +1,85 @@ -import axios from 'axios'; -import type { Form, Submission } from './types'; +// api.ts +const API_BASE_URL = 'http://127.0.0.1:8080'; -const API_BASE = 'http://localhost:8080'; // Backend URL +/** + * Create a new form. + * @param name The name of the form. + * @param fields The fields of the form in JSON format. + * @returns The ID of the created form. + */ +export async function createForm(name: string, fields: unknown): Promise { + const response = await fetch(`${API_BASE_URL}/forms`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ name, fields }) + }); -// Fetch all forms -export async function fetchForms(): Promise { - const response = await axios.get(`${API_BASE}/forms`); - return response.data; + if (!response.ok) { + throw new Error(`Error creating form: ${response.statusText}`); + } + + return await response.json(); } -// Create a new form -export async function createForm(form: Omit): Promise { - const response = await axios.post(`${API_BASE}/forms`, form); - return response.data; // Returns the created form's ID +/** + * Get all forms. + * @returns An array of forms. + */ +export async function getForms(): Promise { + const response = await fetch(`${API_BASE_URL}/forms`, { + method: 'GET', + headers: { + Accept: 'application/json' + } + }); + + if (!response.ok) { + throw new Error(`Error fetching forms: ${response.statusText}`); + } + + return await response.json(); } -// Fetch form submissions -export async function fetchSubmissions(formId: string): Promise { - const response = await axios.get(`${API_BASE}/forms/${formId}/submissions`); - return response.data; +/** + * Submit a form. + * @param formId The ID of the form to submit. + * @param data The submission data in JSON format. + * @returns The ID of the created submission. + */ +export async function submitForm(formId: string, data: unknown): Promise { + const response = await fetch(`${API_BASE_URL}/forms/${formId}/submissions`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }); + + if (!response.ok) { + throw new Error(`Error submitting form: ${response.statusText}`); + } + + return await response.json(); } -// Submit a form -export async function submitForm(formId: string, data: Record): Promise { - const response = await axios.post(`${API_BASE}/forms/${formId}/submissions`, data); - return response.data; // Returns the submission ID +/** + * Get all submissions for a specific form. + * @param formId The ID of the form. + * @returns An array of submissions for the form. + */ +export async function getSubmissions(formId: string): Promise { + const response = await fetch(`${API_BASE_URL}/forms/${formId}/submissions`, { + method: 'GET', + headers: { + Accept: 'application/json' + } + }); + + if (!response.ok) { + throw new Error(`Error fetching submissions: ${response.statusText}`); + } + + return await response.json(); } diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index 81e59d8..06b4093 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -1,12 +1,12 @@ diff --git a/frontend/src/routes/create/+page.svelte b/frontend/src/routes/create/+page.svelte index 95fd010..0eaa638 100644 --- a/frontend/src/routes/create/+page.svelte +++ b/frontend/src/routes/create/+page.svelte @@ -6,13 +6,24 @@ let fields: FormField[] = []; function addField() { - fields.push({ label: '', name: '', field_type: 'text' }); + // Use a new array assignment to trigger reactivity + fields = [...fields, { label: '', name: '', field_type: 'text' }]; + } + + function removeField(index: number) { + // Reassign to trigger reactivity + fields = fields.filter((_, i) => i !== index); } async function saveForm() { - await createForm({ name, fields }); - alert('Form created successfully!'); - location.href = '/'; + try { + await createForm(name, fields); + alert('Form created successfully!'); + location.href = '/'; + } catch (error) { + console.error('Failed to create form:', error); + alert('An error occurred while creating the form.'); + } } @@ -20,7 +31,7 @@

Fields

@@ -28,11 +39,11 @@
- +
{/each} + - + diff --git a/frontend/src/routes/form/[id]/+page.svelte b/frontend/src/routes/form/[id]/+page.svelte index e7b6f33..6bd206f 100644 --- a/frontend/src/routes/form/[id]/+page.svelte +++ b/frontend/src/routes/form/[id]/+page.svelte @@ -1,22 +1,30 @@ diff --git a/frontend/src/routes/form/[id]/+page.ts b/frontend/src/routes/form/[id]/+page.ts new file mode 100644 index 0000000..fcbefb4 --- /dev/null +++ b/frontend/src/routes/form/[id]/+page.ts @@ -0,0 +1,5 @@ +export function load({ params }) { + return { + params + }; +}