import * as React from 'react'; /** * Number Input Form Component * @param index * @param name * @param step * @param formData * @param formDataArray * @param updateFormDataArray * @constructor */ export const MmuiDynamicNumberInputComponent = ({ index, name, attributes, formDataArray, updateFormDataArray, parseFunc = parseInt, validationFunc = undefined, triggerOnBlur = undefined, }) => { const elmtName = name + `_${index}`, elmtId = `id_${elmtName}`, value = formDataArray[index][name], onChange = (e) => { let newValue = parseFunc(e.target.value); if (isNaN(newValue)) { newValue = e.target.value; } const formDataArrayClone = JSON.parse( JSON.stringify(formDataArray) ); formDataArrayClone[index][name] = newValue; updateFormDataArray(formDataArrayClone); }; let onBlur; if (triggerOnBlur) { onBlur = (e) => { triggerOnBlur(e.target.value); }; } else if (validationFunc) { onBlur = (e) => { const formDataArrayClone = JSON.parse( JSON.stringify(formDataArray) ); formDataArrayClone[index][`${name}_errors`] = validationFunc( e.target.value, attributes ); updateFormDataArray(formDataArrayClone); }; } return ( <> ); }; export const MmuiDynamicChoiceRadioComponent = ({ index, name, options, formDataArray, updateFormDataArray, onChange }) => { const elmtName = name + `_${ index }`, elmtId = `id_${ elmtName }`, value = formDataArray[index][name], onComponentChange = (e) => { let formDataArrayClone = JSON.parse(JSON.stringify(formDataArray)); formDataArrayClone[ index ][name] = e.target.value; updateFormDataArray(formDataArrayClone); onChange(e); } ; const radioSelectOptions = options.map((d: {label:string, value:string}) => { return (
) }); return ( <> { radioSelectOptions } ) } export const MmuiDynamicSelectComponent = ({ index, name, options, formDataArray, updateFormDataArray }) => { const elmtName = name + `_${ index }`, elmtId = `id_${ elmtName }`, value = formDataArray[index][name], onChange = (e) => { let formDataArrayClone = JSON.parse(JSON.stringify(formDataArray)); formDataArrayClone[ index ][name] = e.target.value; updateFormDataArray(formDataArrayClone); } ; const selectOptions = options.map((d: {label:string, value:string}, index) => { let key = `error-${index}`; return ( ) }); return (
) } export const MmuiDynamicTextInputComponent = ({ index, name, attributes, formDataArray, updateFormDataArray, validationFunc = undefined }) => { const elmtName = name + `_${ index }`, elmtId = `id_${ elmtName }`, value = formDataArray[index][name], onChange = (e) => { let formDataArrayClone = JSON.parse(JSON.stringify(formDataArray)); formDataArrayClone[ index ][name] = e.target.value; updateFormDataArray(formDataArrayClone); } ; let onBlur; if(validationFunc){ onBlur = (e) => { let formDataArrayClone = JSON.parse(JSON.stringify(formDataArray)); formDataArrayClone[ index ][`${name}_errors`] = validationFunc(e.target.value, attributes); updateFormDataArray(formDataArrayClone); } } return ( ) } export const MmuiErrorsComponent = ({ fieldId, errors }) => { let errorsOutput = null; if( errors ){ let errorsArrayOutput = errors.map((e, index) => { let key = `error-${index}`; return (
{e}
) }); let id = `${fieldId}_errors`; errorsOutput = (
{errorsArrayOutput}
) } return errorsOutput; } export function parseInputElementAttributes(element: HTMLInputElement){ const attributes:any = {}; if (element.hasAttributes()) { let attrs = element.attributes; for(let i = 0; i < attrs.length; i++) { switch(attrs[i].name){ case "required": attributes[attrs[i].name] = true; break; case "id": case "value": case "min": case "max": case "maxlength": case "step": attributes[attrs[i].name] = attrs[i].value; break; } } } return attributes; } export function getInputElementAttributes(selector:string) { const element = document.querySelector(selector) as HTMLInputElement; return parseInputElementAttributes(element); } export function getChoices(name:string) { const elements = document.getElementsByName(name); let choices: Array = []; for (let i = 0; i < elements.length; i++) { let element = elements[i] as HTMLInputElement; let label = document.querySelector("[for=" + element.id + "]"); choices.push({label: label.textContent, value: element.value}); } return choices } export function getSelectOptions(selector:string) { const element = document.querySelector(selector); let options: Array = []; for (let i = 0; i < element.children.length; i++) { let option = element.children[i] as HTMLInputElement; options.push({label:option.innerText, value:option.value}); } return options }