proto-form
Version:
A typescript base library for managing native javascript forms. Handles onChange events, and normalizing data flow. Leverages native javascript events.
55 lines (51 loc) • 2.75 kB
text/typescript
export function populateForm(formElement: HTMLFormElement, values: any) {
// ... (initial checks for formElement and values) ...
for (const name in values) {
if (values.hasOwnProperty(name)) {
const element = formElement.elements[name];
const dataValue = values[name]; // The value from your data object for this name
if (element) {
// Check for RadioNodeList (common for radios and checkboxes)
// Note: instanceof RadioNodeList might not be universally reliable,
// checking type/length is often safer.
if (element.length && typeof element.length === 'number' && typeof element[0] !== 'undefined' && element[0].type) { // Check if it behaves like a list of elements
const elementType = element[0].type; // Get type from the first element
if (elementType === 'radio') {
const valueToSelect = String(dataValue); // Data should be single value
element.forEach(radio => {
radio.checked = (radio.value === valueToSelect);
});
} else if (elementType === 'checkbox') {
const valuesToCheck = Array.isArray(dataValue) ? dataValue : [dataValue]; // Ensure data is array
element.forEach(checkbox => {
checkbox.checked = valuesToCheck.includes(checkbox.value);
});
} else {
// Handle multiple text inputs etc. (like Scenario 4)
const valuesToSet = Array.isArray(dataValue) ? dataValue : [];
const len = Math.min(element.length, valuesToSet.length);
for (let i = 0; i < len; i++) {
if(element[i]) element[i].value = valuesToSet[i]; // Check element exists
}
for (let i = len; i < element.length; i++) { // Clear extras
if(element[i]) element[i].value = '';
}
}
} else if (element.type === 'select-multiple') {
const valuesToSelect = Array.isArray(dataValue) ? dataValue : [dataValue]; // Ensure data is array
for (let i = 0; i < element.options.length; i++) {
element.options[i].selected = valuesToSelect.includes(element.options[i].value);
}
} else if (element.type === 'checkbox') { // Single checkbox
element.checked = Boolean(dataValue);
} else if (element.type === 'select-one') {
element.value = dataValue;
} else { // Default for text, email, number, hidden, textarea, etc.
element.value = dataValue;
}
} else {
console.warn(`No form element found with name: ${name}`);
}
}
}
}