From 77ed01f7c7cbbf9cd1bec0ad66d1b36ef8c20dea Mon Sep 17 00:00:00 2001 From: Ben Whitmore <ben.whitmore0@gmail.com> Date: Tue, 23 Mar 2021 20:45:22 +1300 Subject: [PATCH] refactor(form-builder): remove redundant code --- .../src/components/FormTemplate.js | 261 ++++++------------ 1 file changed, 77 insertions(+), 184 deletions(-) diff --git a/app/components/component-submit/src/components/FormTemplate.js b/app/components/component-submit/src/components/FormTemplate.js index dcdd6c90d7..f98350c1e2 100644 --- a/app/components/component-submit/src/components/FormTemplate.js +++ b/app/components/component-submit/src/components/FormTemplate.js @@ -1,8 +1,7 @@ import React from 'react' import PropTypes from 'prop-types' import styled from 'styled-components' -import { unescape, groupBy, isArray, get, set, cloneDeep } from 'lodash' -import { FieldArray } from 'formik' +import { unescape, get, set } from 'lodash' import { TextField, RadioGroup, @@ -133,100 +132,6 @@ const composeValidate = (vld = [], valueField = {}) => value => { return errors.length > 0 ? errors[0] : undefined } -const groupElements = els => { - // TODO is grouping ever used? Can we get rid of this function? Ordering is now redundant - const grouped = groupBy(els, n => n.group || 'default') - - Object.keys(grouped).forEach(element => { - grouped[element].sort( - (obj1, obj2) => - parseInt(obj1.order || '0', 10) - parseInt(obj2.order || '0', 10), - ) - }) - - let startArr = grouped.default - delete grouped.default - - Object.keys(grouped).forEach(element => { - const order = grouped[element][0].order ?? '0' - const first = startArr.findIndex(elem => elem.order === order) - startArr = startArr - .slice(0, first) - .concat([grouped[element]]) - .concat(startArr.slice(first)) - }) - return startArr -} - -const renderArray = (elementsComponentArray, onChange) => ({ - form: { values, setTouched }, - replace, - name, -}) => - get(values, name).map((elValues, index) => { - const element = elementsComponentArray.find(elv => - Object.values(elValues).includes(elv.type), - ) - - return ( - <Section - cssOverrides={JSON.parse(element.sectioncss || '{}')} - key={`${element.id}`} - > - <Legend dangerouslySetInnerHTML={createMarkup(element.title)} /> - {/* <p>{JSON.stringify(values)}</p> */} - <ValidatedFieldFormik - {...rejectProps(element, [ - 'component', - 'title', - 'sectioncss', - 'parse', - 'format', - 'validate', - 'validateValue', - 'description', - 'order', - 'value', - 'shortDescription', - ])} - aria-label={element.shortDescription} - component={elements[element.component]} - data-testid={element.name} - key={`notes-validate-${element.id}`} - name={`${name}.${index}.content`} - onChange={value => { - const data = { - notesType: element.type, - content: value, - } - - replace(index, data, `${name}.[${index}]`, true) - const notes = cloneDeep(values) - set(notes, `${name}.[${index}]`, data) - onChange(notes.meta.notes, `${name}`) - }} - readonly={false} - setTouched={setTouched} - validate={composeValidate(element.validate, element.validateValue)} - values={values} - /> - <SubNote dangerouslySetInnerHTML={createMarkup(element.description)} /> - </Section> - ) - }) - -const ElementComponentArray = ({ elementsComponentArray, onChange }) => ( - <FieldArray - name={elementsComponentArray[0].group} - render={renderArray(elementsComponentArray, onChange)} - /> -) - -ElementComponentArray.propTypes = { - elementsComponentArray: PropTypes.arrayOf(PropTypes.object).isRequired, - onChange: PropTypes.func.isRequired, -} - const FormTemplate = ({ form, handleSubmit, @@ -278,95 +183,83 @@ const FormTemplate = ({ )} /> <form onSubmit={handleSubmit}> - {groupElements(form.children || []).map((element, i) => - !isArray(element) ? ( - <Section - cssOverrides={JSON.parse(element.sectioncss || '{}')} - key={`${element.id}`} - > - {/* <p>{JSON.stringify(element)}</p> */} - <Legend dangerouslySetInnerHTML={createMarkup(element.title)} /> - {element.component === 'SupplementaryFiles' && ( - <FilesUpload - containerId={manuscript.id} - containerName="manuscript" - fileType="supplementary" - onChange={onChange} - /> - )} - {element.component === 'VisualAbstract' && ( - <FilesUpload - accept="image/*" - containerId={manuscript.id} - containerName="manuscript" - fileType="visualAbstract" - multiple={false} - onChange={onChange} + {(form.children || []).map((element, i) => ( + <Section + cssOverrides={JSON.parse(element.sectioncss || '{}')} + key={`${element.id}`} + > + <Legend dangerouslySetInnerHTML={createMarkup(element.title)} /> + {element.component === 'SupplementaryFiles' && ( + <FilesUpload + containerId={manuscript.id} + containerName="manuscript" + fileType="supplementary" + onChange={onChange} + /> + )} + {element.component === 'VisualAbstract' && ( + <FilesUpload + accept="image/*" + containerId={manuscript.id} + containerName="manuscript" + fileType="visualAbstract" + multiple={false} + onChange={onChange} + /> + )} + {element.component === 'AuthorsInput' && ( + <AuthorsInput data-testid={element.name} onChange={onChange} /> + )} + {element.component !== 'AuthorsInput' && + element.component !== 'SupplementaryFiles' && + element.component !== 'VisualAbstract' && ( + <ValidatedFieldFormik + aria-label={element.placeholder || element.title} + component={elements[element.component]} + data-testid={element.name} // TODO: Improve this + key={`validate-${element.id}`} + name={element.name} + onChange={value => { + // TODO: Perhaps split components remove conditions here + let val + + if (value.target) { + val = value.target.value + } else if (value.value) { + val = value.value + } else { + val = value + } + + setFieldValue(element.name, val, true) + onChange(val, element.name) + }} + readonly={false} + setTouched={setTouched} + {...rejectProps(element, [ + 'component', + 'title', + 'sectioncss', + 'parse', + 'format', + 'validate', + 'validateValue', + 'description', + 'shortDescription', + 'order', + ])} + validate={composeValidate( + element.validate, + element.validateValue, + )} + values={values} /> )} - {element.component === 'AuthorsInput' && ( - <AuthorsInput data-testid={element.name} onChange={onChange} /> - )} - {element.component !== 'AuthorsInput' && - element.component !== 'SupplementaryFiles' && - element.component !== 'VisualAbstract' && ( - <ValidatedFieldFormik - aria-label={element.placeholder || element.title} - component={elements[element.component]} - data-testid={element.name} // TODO: Improve this - key={`validate-${element.id}`} - name={element.name} - onChange={value => { - // TODO: Perhaps split components remove conditions here - let val - - if (value.target) { - val = value.target.value - } else if (value.value) { - val = value.value - } else { - val = value - } - - setFieldValue(element.name, val, true) - onChange(val, element.name) - }} - readonly={false} - setTouched={setTouched} - {...rejectProps(element, [ - 'component', - 'title', - 'sectioncss', - 'parse', - 'format', - 'validate', - 'validateValue', - 'description', - 'shortDescription', - 'order', - ])} - validate={composeValidate( - element.validate, - element.validateValue, - )} - values={values} - /> - )} - <SubNote - dangerouslySetInnerHTML={createMarkup(element.description)} - /> - </Section> - ) : ( - <ElementComponentArray - elementsComponentArray={element} - // eslint-disable-next-line - key={i} - onChange={onChange} - setFieldValue={setFieldValue} - setTouched={setTouched} + <SubNote + dangerouslySetInnerHTML={createMarkup(element.description)} /> - ), - )} + </Section> + ))} {filterFileManuscript(values.files || []).length > 0 ? ( <Section id="files.manuscript"> @@ -430,8 +323,8 @@ FormTemplate.propTypes = { ), }).isRequired, ).isRequired, - popuptitle: PropTypes.string.isRequired, - popupdescription: PropTypes.string.isRequired, + popuptitle: PropTypes.string, + popupdescription: PropTypes.string, haspopup: PropTypes.string.isRequired, // bool as string }).isRequired, handleSubmit: PropTypes.func.isRequired, -- GitLab