UNPKG

design-comuni-plone-theme

Version:
342 lines (323 loc) 11.5 kB
/*Customizatinos: - usati i componenti di design-react-kit - disabilitato il captcha se nelle siteProperties del config è stato disabilitato. - aggiunta legenda per i campi obbligatori */ import React from 'react'; import { useIntl, defineMessages } from 'react-intl'; import { Card, CardBody, Row, Col, Alert, Progress } from 'design-react-kit'; import { getFieldName } from 'volto-form-block/components/utils'; import Field from 'volto-form-block/components/Field'; import { OTPWidget, OTP_FIELDNAME_EXTENDER, Button, } from 'volto-form-block/components/Widget'; import config from '@plone/volto/registry'; import { FormResult } from 'volto-form-block/components'; import { evaluateAllConditions } from 'volto-form-block/helpers/conditions-list'; /* Style */ import 'volto-form-block/components/FormView.css'; const messages = defineMessages({ default_submit_label: { id: 'form_default_submit_label', defaultMessage: 'Invia', }, default_cancel_label: { id: 'form_default_cancel_label', defaultMessage: 'Annulla', }, error: { id: 'Error', defaultMessage: 'Errore', }, success: { id: 'Email Success', defaultMessage: 'Form inviato correttamente', }, form_errors: { id: 'form_errors_validation', defaultMessage: 'Attenzione! Alcuni campi inseriti sono da controllare.', }, reset: { id: 'form_reset', defaultMessage: 'Ricomincia', }, legend_required: { id: 'legend_required', defaultMessage: 'I campi contrassegnati da (*) sono obbligatori.', }, }); const FormView = ({ formState, formErrors, formData, onChangeFormData, data, onSubmit, resetFormState, resetFormOnError, captcha, id, getErrorMessage, path, block_id, }) => { const intl = useIntl(); const alertTransition = { appear: true, baseClass: 'fade', baseClassActive: 'show', enter: true, exit: true, in: true, mountOnEnter: false, tag: 'div', timeout: 150, unmountOnExit: true, }; const enableCaptcha = config.settings.siteProperties.enableVoltoFormBlockCaptcha; const isValidField = (field) => { return formErrors?.filter((e) => e.field === field).length === 0; }; var FieldSchema = config.blocks.blocksConfig.form.fieldSchema; var fieldSchemaProperties = FieldSchema()?.properties; var fields_to_send = []; for (var key in fieldSchemaProperties) { if (fieldSchemaProperties[key].send_to_backend) { fields_to_send.push(key); } } const submit = (e) => { resetFormOnError(); onSubmit(e); }; const getFieldsToSendWithValue = (subblock) => { var fields_to_send = []; var fieldSchemaProperties = FieldSchema(subblock)?.properties; for (var key in fieldSchemaProperties) { if (fieldSchemaProperties[key].send_to_backend) { fields_to_send.push(key); } } var fields_to_send_with_value = Object.assign( {}, ...fields_to_send.map((field) => { return { [field]: subblock[field], }; }), ); return fields_to_send_with_value; }; return ( <div className="block form"> <div className="public-ui"> {data?.title && <h2>{data.title}</h2>} {data?.description && ( <div className="block-description">{data.description}</div> )} <Card className="card-bg rounded py-3" noWrapper={false} tag="div"> <CardBody tag="div"> {formState.result ? ( <FormResult formState={formState} data={data} resetFormState={resetFormState} /> ) : ( <form onSubmit={submit} noValidate autoComplete="off" method="post" > {/* Controlla che ci siano campi obbligatori al suo interno e applica una legenda */} {data.subblocks.some((item) => item.required === true) && ( <legend className="text-muted text-end mb-3"> <small> {intl.formatMessage(messages.legend_required)} </small> </legend> )} {data.static_fields && ( <fieldset disabled> {data.static_fields?.map((field) => ( <Row key={field.field_id} className="static-field"> <Col className="py-2"> <Field {...field} field_type={field.field_type || 'text'} name={ 'static_field_' + (field.field_id ?? field.name?.toLowerCase()?.replace(' ', '')) } value={field.value} onChange={() => {}} valid disabled formHasErrors={formErrors.length > 0} /> </Col> </Row> ))} </fieldset> )} {data.subblocks.map((subblock, index) => { let name = getFieldName(subblock.label, subblock.id); const fields_to_send_with_value = getFieldsToSendWithValue(subblock); return ( (!config.blocks.blocksConfig.form.enableConditionalFields || evaluateAllConditions( subblock?.visibility_conditions, formData, )) && ( <Row key={'row' + index}> <Col className="py-2"> <Field {...subblock} name={name} onChange={(field, value) => onChangeFormData( subblock.id, field, value, fields_to_send_with_value, ) } value={ subblock.field_type === 'static_text' ? subblock.value : formData[name]?.value } valid={isValidField(name)} errorMessage={getErrorMessage(name)} formHasErrors={formErrors.length > 0} /> </Col> </Row> ) ); })} {/*OTP*/} {data.email_otp_verification ? ( data.subblocks .filter((subblock) => subblock.use_as_bcc) .map((subblock, index) => { const fieldName = getFieldName( subblock.label, subblock.id, ); const name = fieldName + OTP_FIELDNAME_EXTENDER; const fieldValue = formData[fieldName]?.value; const value = formData[fieldName]?.otp; const fields_to_send_with_value = getFieldsToSendWithValue(subblock); return ( <Row key={'row_otp' + index}> <Col className="py-2"> <OTPWidget {...subblock} fieldValue={fieldValue} onChange={(field, value) => { onChangeFormData( subblock.id, fieldName, fieldValue, { ...fields_to_send_with_value, otp: value, }, ); }} value={value} valid={isValidField(name)} errorMessage={getErrorMessage(name)} formHasErrors={formErrors?.length > 0} path={path} block_id={block_id} /> </Col> </Row> ); }) ) : ( <></> )} {enableCaptcha && <>{captcha.render()}</>} {formErrors.length > 0 && ( <Alert color="danger" fade isOpen tag="div" transition={alertTransition} > <h4>{intl.formatMessage(messages.error)}</h4> <p>{intl.formatMessage(messages.form_errors)}</p> </Alert> )} {formState.error && ( <Alert color="danger" fade isOpen tag="div" transition={alertTransition} > <h4>{intl.formatMessage(messages.error)}</h4> <p>{formState.error}</p> </Alert> )} <Row> <Col align="center"> {data?.show_cancel && ( <Button color="secondary" type="button" onClick={(e) => { e.preventDefault(); e.stopPropagation(); resetFormState(); }} className="me-2" > {data.cancel_label || intl.formatMessage(messages.default_cancel_label)} </Button> )} <Button color="primary" type="submit" disabled={ (enableCaptcha && !captcha?.props?.captchaToken?.current) || formState.loading } > {data.submit_label || intl.formatMessage(messages.default_submit_label)} {formState.loading && ( <span> <Progress indeterminate={true} role="progressbar" tag="div" /> </span> )} </Button> </Col> </Row> </form> )} </CardBody> </Card> </div> </div> ); }; export default FormView;