Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3215 | Rev 3217 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3211 stevensc 1
import React from 'react'
3216 stevensc 2
import { useOutletContext } from 'react-router-dom'
3211 stevensc 3
import { Controller, useForm } from 'react-hook-form'
3214 stevensc 4
import { Button, InputLabel } from '@mui/material'
3211 stevensc 5
import Datetime from 'react-datetime'
6
 
7
import Form from '@components/common/form'
8
import Input from '@components/UI/inputs/Input'
9
import Ckeditor from '@components/UI/Ckeditor'
10
import TagsInput from '@components/UI/TagsInput'
11
import LoadingWrapper from '@components/common/loading-wrapper'
12
import FormErrorFeedback from '@components/UI/form/FormErrorFeedback'
3216 stevensc 13
import { useFetch } from '@hooks'
3211 stevensc 14
 
15
export default function GoalForm({
16
  onSubmit = () => {},
17
  defaultValues = {},
18
  values = {}
19
}) {
3216 stevensc 20
  const context = useOutletContext()
3211 stevensc 21
  const {
3216 stevensc 22
    data: { items: habits }
23
  } = useFetch(context.link_skills, { items: [] })
24
 
25
  const {
3211 stevensc 26
    control,
27
    handleSubmit,
28
    formState: { errors, isSubmitting }
29
  } = useForm({
30
    defaultValues,
31
    values
32
  })
33
 
34
  return (
35
    <Form onSubmit={handleSubmit(onSubmit)}>
36
      <LoadingWrapper loading={isSubmitting}>
37
        <Input
38
          name='name'
39
          label='Nombre'
40
          placeholder='Escribe el nombre de la meta'
41
          control={control}
3215 stevensc 42
          rules={{ required: 'El nombre es requerido' }}
3211 stevensc 43
          error={errors.name?.message}
44
        />
45
 
46
        <Ckeditor
47
          label='Descripción'
48
          name='description'
49
          control={control}
3215 stevensc 50
          rules={{ required: 'La descripción es requerida' }}
3211 stevensc 51
          error={errors.description?.message}
52
        />
53
 
54
        <Input
55
          type='number'
56
          name='value'
57
          label='Valor'
58
          placeholder='Define el valor de la meta'
59
          control={control}
3215 stevensc 60
          rules={{
61
            required: 'El valor es requerido',
62
            min: { value: 1, message: 'El valor debe ser mayor a 1' },
63
            max: { value: 100, message: 'El valor debe ser menor a 100' }
64
          }}
3211 stevensc 65
          error={errors.value?.message}
66
        />
67
 
68
        <Controller
69
          name='skill_id'
70
          control={control}
71
          defaultValue={[]}
3215 stevensc 72
          rules={{ required: 'Selecciona al menos un hábito' }}
3211 stevensc 73
          render={({ field: { name, onChange } }) => (
74
            <>
75
              <TagsInput
76
                name={name}
77
                label='Habitos'
78
                onChange={onChange}
3216 stevensc 79
                suggestions={habits}
3211 stevensc 80
              />
81
              {errors.skill_id && (
82
                <FormErrorFeedback>
83
                  {errors.skill_id?.message}
84
                </FormErrorFeedback>
85
              )}
86
            </>
87
          )}
88
        />
89
 
90
        <Controller
91
          name='start_date'
92
          control={control}
3215 stevensc 93
          rules={{
94
            required: 'La fecha es requerida',
95
            validate: {
96
              beGreaterThanToday: (value) =>
97
                new Date(value) > new Date() ||
98
                'La fecha debe ser mayor a la fecha actual'
99
            }
100
          }}
3213 stevensc 101
          render={({ field: { onChange } }) => (
3214 stevensc 102
            <>
103
              <InputLabel>Fecha de inicio</InputLabel>
104
              <Datetime
105
                dateFormat='DD-MM-YYYY'
106
                onChange={(e) => onChange(e.format('YYYY-MM-DD'))}
107
                timeFormat={false}
108
                inputProps={{ className: 'form-control' }}
109
                closeOnSelect
110
              />
111
              {errors.start_date && (
112
                <FormErrorFeedback>
113
                  {errors.start_date?.message}
114
                </FormErrorFeedback>
115
              )}
116
            </>
3211 stevensc 117
          )}
118
        />
3214 stevensc 119
        <Controller
120
          name='end_date'
121
          control={control}
3215 stevensc 122
          rules={{
123
            required: 'La fecha es requerida',
124
            validate: {
125
              beGreaterThanStartDate: (value, { start_date }) =>
126
                new Date(value) > new Date(start_date) ||
127
                'La fecha debe ser mayor a la fecha de inicio'
128
            }
129
          }}
3214 stevensc 130
          render={({ field: { onChange } }) => (
131
            <>
132
              <InputLabel>Fecha de finalización</InputLabel>
133
              <Datetime
134
                dateFormat='DD-MM-YYYY'
135
                onChange={(e) => onChange(e.format('YYYY-MM-DD'))}
136
                timeFormat={false}
137
                inputProps={{ className: 'form-control' }}
138
                closeOnSelect
139
              />
140
              {errors.end_date && (
141
                <FormErrorFeedback>
142
                  {errors.end_date?.message}
143
                </FormErrorFeedback>
144
              )}
145
            </>
146
          )}
147
        />
3211 stevensc 148
 
149
        <Button type='submit' color='primary'>
150
          Enviar
151
        </Button>
152
      </LoadingWrapper>
153
    </Form>
154
  )
155
}