diff --git a/frontend/src/lib/components/InputField.svelte b/frontend/src/lib/components/InputField.svelte index 88a7315..89ac750 100644 --- a/frontend/src/lib/components/InputField.svelte +++ b/frontend/src/lib/components/InputField.svelte @@ -8,12 +8,21 @@ /** @type {string} */ export let type = "text"; - /** @type {string} */ - export let value = ""; + /** @type {string|Number|null} */ + export let value; /** @type {string} */ export let placeholder = ""; + /** @type {Number} */ + export let rows = 4; + + /** @type {Array<{value: string | number, label: string, color?:string}>} */ + export let options = []; + + /** @type {Boolean} */ + export let required = false; + /** @type {string} */ export let label = ""; @@ -23,8 +32,6 @@ /** @type {boolean} */ export let toUpperCase = false; - const dispatch = createEventDispatcher(); - /** * @param {Event} event - The input event */ @@ -38,60 +45,68 @@ target.value = inputValue; // Update the input field value } value = inputValue; - // dispatch("input", { name, value: inputValue }); } } /** * Validates the field * @param {string} name - The name of the field - * @param {string} value - The value of the field + * @param {string|Number|null} value - The value of the field + * @param {Boolean} required - The requirements of the field * @returns {string|null} The error message or null if valid */ - function validateField(name, value) { + function validateField(name, value, required) { + if ( + value === null || + (typeof value === "string" && !value.trim() && !required) + ) + return null; switch (name) { - case "first_name": - case "last_name": - case "address": - case "city": - case "account_holder_name": - case "bank": - return value.trim() ? null : $t("required"); - case "birth_date": case "membership_start_date": - return value.trim() ? null : $t("required_date"); + return typeof value === "string" && value.trim() + ? null + : $t("validation.date"); case "email": - return /^\S+@\S+\.\S+$/.test(value) ? null : $t("invalid_email"); + return typeof value === "string" && /^\S+@\S+\.\S+$/.test(value) + ? null + : $t("validation.email"); case "password": case "password2": - if (!value.trim()) { - return null; - } - if (value.length < 8) { - return $t("required_password"); + if (typeof value === "string" && value.length < 8) { + return $t("validation.password"); } if (otherPasswordValue && value !== otherPasswordValue) { - return $t("required_password_match"); + return $t("validation.password_match"); } return null; case "phone": - return /^\+?[0-9\s()-]{7,}$/.test(value) ? null : $t("invalid_phone"); + return typeof value === "string" && /^\+?[0-9\s()-]{7,}$/.test(value) + ? null + : $t("validation.phone"); case "zip_code": - return /^\d{5}$/.test(value) ? null : $t("invalid_zip_code"); + return typeof value === "string" && /^\d{5}$/.test(value) + ? null + : $t("validation.zip_code"); case "iban": - return /^[A-Z]{2}\d{2}[A-Z0-9]{1,30}$/.test(value) + return typeof value === "string" && + /^[A-Z]{2}\d{2}[A-Z0-9]{1,30}$/.test(value) ? null - : $t("invalid_iban"); + : $t("validation.iban"); case "bic": - return /^[A-Z]{6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3})?$/.test(value) + return typeof value === "string" && + /^[A-Z]{6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3})?$/.test(value) ? null - : $t("invalid_bic"); + : $t("validation.bic"); default: - return null; + return typeof value === "string" && !value.trim() && required + ? $t("validation.required") + : null; } } - $: error = validateField(name, value); + $: error = validateField(name, value, required); + $: selectedOption = options.find((option) => option.value == value); + $: selectedColor = selectedOption ? selectedOption.color : "";