Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3230 | Rev 3254 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React from 'react'
import { Controller, useForm } from 'react-hook-form'
import { Button, InputLabel } from '@mui/material'
import Datetime from 'react-datetime'

import Widget from '@components/UI/Widget'
import Form from '@components/common/form'
import Input from '@components/UI/inputs/Input'
import Ckeditor from '@components/UI/Ckeditor'
import TagsInput from '@components/UI/TagsInput'
import LoadingWrapper from '@components/common/loading-wrapper'
import FormErrorFeedback from '@components/UI/form/FormErrorFeedback'

import 'react-datetime/css/react-datetime.css'

export default function GoalForm({
  onSubmit = () => {},
  habits = [],
  defaultValues = {},
  values = {}
}) {
  const {
    control,
    handleSubmit,
    formState: { errors, isSubmitting }
  } = useForm({
    defaultValues,
    values,
    mode: 'all'
  })

  return (
    <Widget>
      <Widget.Body>
        <Form onSubmit={handleSubmit(onSubmit)}>
          <LoadingWrapper loading={isSubmitting} displayChildren>
            <Input
              name='name'
              label='Nombre'
              placeholder='Escribe el nombre de la meta'
              control={control}
              rules={{ required: 'El nombre es requerido' }}
              error={errors.name?.message}
            />

            <Ckeditor
              label='Descripción'
              name='description'
              control={control}
              rules={{ required: 'La descripción es requerida' }}
              error={errors.description?.message}
            />

            <Input
              type='number'
              name='value'
              label='Valor'
              placeholder='Define el valor de la meta'
              control={control}
              rules={{
                required: { value: true, message: 'El valor es requerido' },
                validate: {
                  positive: (value) =>
                    Number(value) > 0 || 'El valor mayor a cero',
                  max: (value) =>
                    Number(value) <= 100 ||
                    'El valor debe ser menor o igual a 100'
                }
              }}
              error={errors.value?.message}
            />

            <Controller
              name='skill_id'
              control={control}
              defaultValue={[]}
              render={({ field: { name, onChange } }) => (
                <>
                  <TagsInput
                    name={name}
                    label='Habitos'
                    onChange={onChange}
                    suggestions={habits}
                  />
                  {errors.skill_id && (
                    <FormErrorFeedback>
                      {errors.skill_id?.message}
                    </FormErrorFeedback>
                  )}
                </>
              )}
            />

            <Controller
              name='start_date'
              control={control}
              rules={{
                required: { value: true, message: 'La fecha es requerida' },
                validate: {
                  beGreaterThanToday: (value) =>
                    new Date(value) > new Date() ||
                    'La fecha debe ser mayor a la fecha actual'
                }
              }}
              render={({ field: { onChange, ref, value, name } }) => (
                <>
                  <InputLabel>Fecha de inicio</InputLabel>
                  <Datetime
                    dateFormat='DD-MM-YYYY'
                    onChange={(e) => onChange(e.format('YYYY-MM-DD'))}
                    timeFormat={false}
                    inputProps={{ className: 'form-control', ref, name }}
                    value={value}
                    closeOnSelect
                  />
                  {errors.start_date && (
                    <FormErrorFeedback>
                      {errors.start_date?.message}
                    </FormErrorFeedback>
                  )}
                </>
              )}
            />

            <Controller
              name='end_date'
              control={control}
              rules={{
                required: { value: true, message: 'La fecha es requerida' },
                validate: (value, { start_date }) =>
                  new Date(value) > new Date(start_date) ||
                  'La fecha debe ser mayor a la fecha de inicio'
              }}
              render={({ field: { onChange, name, ref, value } }) => (
                <>
                  <InputLabel>Fecha de finalización</InputLabel>
                  <Datetime
                    dateFormat='DD-MM-YYYY'
                    onChange={(e) => onChange(e.format('YYYY-MM-DD'))}
                    timeFormat={false}
                    inputProps={{ className: 'form-control', ref, name }}
                    value={value}
                    closeOnSelect
                  />
                  {errors.end_date && (
                    <FormErrorFeedback>
                      {errors.end_date?.message}
                    </FormErrorFeedback>
                  )}
                </>
              )}
            />

            <Button type='submit' color='primary'>
              Enviar
            </Button>
          </LoadingWrapper>
        </Form>
      </Widget.Body>
    </Widget>
  )
}