Proyectos de Subversion LeadersLinked - SPA

Rev

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

import React from 'react'
import { useForm } from 'react-hook-form'
import { Button } from '@mui/material'

import Widget from '@components/UI/Widget'
import Form from '@components/common/form'
import Input from '@components/UI/inputs/Input'
import Select from '@components/UI/inputs/Select'
import Ckeditor from '@components/common/ckeditor/Ckeditor'
import DatetimePicker from '@components/common/inputs/datetime-picker'
import LoadingWrapper from '@components/common/loading-wrapper'

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

  return (
    <Widget styles={{ overflow: 'visible' }}>
      <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 cuantitativo de la Meta a lograr'
              placeholder='Escribe el valor'
              control={control}
              rules={{
                required: { value: true, message: 'El valor es requerido' },
                validate: {
                  positive: (value) =>
                    Number(value) > 0 || 'El valor mayor a cero'
                }
              }}
              error={errors.value?.message}
            />

            <Select
              label='Hábitos y competencias para lograr la Meta'
              name='skill_id'
              control={control}
              options={habits}
              defaultValue={[]}
              rules={{ required: 'Por favor selecciona un hábito' }}
              error={errors.skill_id?.message}
              multiple
            />

            <DatetimePicker
              label='Fecha de inicio'
              name='start_date'
              control={control}
              rules={{
                required: { value: true, message: 'La fecha es requerida' },
                validate: {
                  beEqualOrGreaterThanToday: (date) => {
                    const selectedDate = new Date(date + 'T00:00:00')
                    const selectedDateMs = selectedDate.getTime()
                    const todayMs = new Date().setHours(0, 0, 0, 0)

                    return (
                      selectedDateMs >= todayMs ||
                      'La fecha debe ser mayor o igual a hoy'
                    )
                  }
                }
              }}
            />

            <DatetimePicker
              label='Fecha de finalización'
              name='end_date'
              control={control}
              rules={{
                required: { value: true, message: 'La fecha es requerida' },
                validate: (value, { start_date }) => {
                  const startDate = new Date(start_date + 'T00:00:00')
                  const endDate = new Date(value + 'T00:00:00')
                  const startDateMs = startDate.getTime()
                  const endDateMs = endDate.getTime()

                  return (
                    endDateMs > startDateMs ||
                    'La fecha debe ser mayor a la fecha de inicio'
                  )
                }
              }}
            />

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