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)) {