Ecco un esempio di integrazione in WebFlow. Questa integrazione è valida anche per un sito web classico.
Copy
document.querySelector('#form-submit-button').addEventListener('click', function() { var formElement = document.querySelector('.inscription-candidat-form'); var formData = new FormData(formElement); var formDataAsObject = {} for (var [key, value] of formData.entries()) { console.log(key, value); formDataAsObject[key] = value } if(!formDataAsObject.linkedinUrl) console.error("linkedinUrl is mandatory"); const data = { "referenceId":"PROJECT-REFERENCE-ID", ...formDataAsObject } console.log("data to send",data) fetch('https://functions.prod.jarvi.tech/v1/public-api/rest/applicants', { method: 'POST', mode:'cors', headers: { 'Content-Type': 'application/json', 'X-Api-Key': 'JARVI_PRIVATE_API_KEY' }, body: JSON.stringify(data) }) .then(response => response.json()) .then(data => console.log("data sent",data)) .catch((error) => { console.error('Error:', error); }); });
Webflow (CON CV)
Ecco un esempio di integrazione in WebFlow. Questa integrazione è valida anche per un sito web classico.
Copy
// Compila queste costanti con i tuoi valoriconst FORM_SELECTOR = "#candidature-form";const SUBMIT_BUTTON_SELECTOR = "#form-submit-button";const RESUME_INPUT_NAME = "resumesFiles";const PROJECT_REFERENCE_ID = "PROJECT-REFERENCE-ID";const JARVI_PRIVATE_API_KEY = "YOUR JARVI PRIVATE API KEY";// Funzione di supporto per leggere il file come base64const readFileAsBase64 = (file) => {return new Promise((resolve, reject) => {const reader = new FileReader();reader.onload = (event) => resolve(event.target.result);reader.onerror = (error) => reject(error);reader.readAsDataURL(file);});};// Funzione di supporto per validare i dati del moduloconst validateFormData = (formData) => {if (!formData.linkedinUrl) {throw new Error("LinkedIn URL is mandatory");}return true;};// Gestore principale dell'invio del modulodocument.querySelector(SUBMIT_BUTTON_SELECTOR).addEventListener("click", async function (event) {event.preventDefault(); // Impedisce l'invio predefinito del modulotry {const formElement = document.querySelector(FORM_SELECTOR);if (!formElement) {throw new Error("Form element not found");}// Converte FormData in oggettoconst formData = new FormData(formElement);const formDataAsObject = Object.fromEntries(formData.entries());// Valida i dati del modulovalidateFormData(formDataAsObject);// Ottiene e valida il fileconst fileInput = formElement.querySelector(`input[name="${RESUME_INPUT_NAME}"]`);if (!fileInput) { throw new Error("Resume input field not found");}const file = fileInput.files[0];if (!file) { throw new Error("No file uploaded");}// Legge il file e prepara i daticonst base64Data = await readFileAsBase64(file);const resumesFiles = [ { fileName: file.name, data: base64Data, },];const data = { referenceId: "PROJECT-REFERENCE-ID", // Aggiorna con il tuo ID di riferimento del progetto ...formDataAsObject, resumesFiles,};console.log("Sending data:", data);// Invia dati all'APIconst response = await fetch("https://functions.prod.jarvi.tech/v1/public-api/rest/v2/applicants", { method: "POST", mode: "cors", headers: { "Content-Type": "application/json", "X-Api-Key": JARVI_PRIVATE_API_KEY, }, body: JSON.stringify(data),});if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`);}const responseData = await response.json();console.log("Data sent successfully:", responseData);// Opzionale: Mostra un messaggio di successo all'utentealert("Application submitted successfully!");} catch (error) {console.error("Error:", error);alert(`Error: ${error.message}`);}});