import "./linq.js"; import { Template } from "./template.js"; export function formToObject(form) { const data = new FormData(form); const object = {}; data.forEach((value, key) => { setNestedValue(object, key, value); }); return object; } function setNestedValue(obj, path, value) { path .split(".") .asEnumerable() .isLast() .forEach((key, isLast) => { if (isLast) { obj[key] = value; } else { if (!obj[key]) { obj[key] = {}; } obj = obj[key]; } }); } export async function sendFormAsync(form, url, method) { url = url || form.action; method = method || form.method || "post"; const data = formToObject(form); const response = await sendJsonAsync(url, data, method); if (response.ok && response.redirected) { window.location.href = response.url; return null; } const responseText = await response.text(); if ( response.ok == false && handleValidationError(response, responseText, form) ) { return null; } if (response.ok == false) { handleGenericFormError(response, responseText, form); return null; } else { return responseText.length == 0 ? null : JSON.parse(responseText); } } export async function sendJsonAsync(url, data, method = "post") { const response = await fetch(url, { method: method.toUpperCase(), headers: { "Content-Type": "application/json", }, body: JSON.stringify(data), }); return response; } export async function postAndRenderAsync(url, data, template, targetElement) { const response = await sendJsonAsync(url, data); if (response.ok) { const responseText = await response.text(); targetElement.innerHTML = template.render( responseText.length == 0 ? undefined : JSON.parse(responseText), ); } } export async function postFormAndRenderAsync( url, form, template, targetElement, ) { const object = formToObject(form); const data = await postFormAsync(url, object, template, targetElement); if (data) { targetElement.innerHTML = template.render(data); } } const genericFormErrorTemplate = new Template(`
An error occurred with the following fields:
@for(field, errors of Object.entries($this)) {