Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3389 stevensc 1
import React, { useState } from 'react'
3391 stevensc 2
import { Controller, useForm } from 'react-hook-form'
3390 stevensc 3
import { Button, styled, Tab, Tabs } from '@mui/material'
3211 stevensc 4
 
3244 stevensc 5
import Widget from '@components/UI/Widget'
3211 stevensc 6
import Form from '@components/common/form'
7
import Input from '@components/UI/inputs/Input'
3389 stevensc 8
import TabPanel from '@components/common/tab-panel'
3269 stevensc 9
import Ckeditor from '@components/common/ckeditor/Ckeditor'
10
import DatetimePicker from '@components/common/inputs/datetime-picker'
3211 stevensc 11
import LoadingWrapper from '@components/common/loading-wrapper'
3391 stevensc 12
import TagsInput from '@components/UI/TagsInput'
3392 stevensc 13
import FormErrorFeedback from '@components/UI/form/FormErrorFeedback'
3211 stevensc 14
 
3389 stevensc 15
const FormTabPanel = styled(TabPanel)(({ theme }) => ({
16
  display: 'flex',
17
  flexDirection: 'column',
18
  width: '100%',
19
  gap: theme.spacing(0.5)
20
}))
21
 
3211 stevensc 22
export default function GoalForm({
23
  onSubmit = () => {},
3217 stevensc 24
  habits = [],
3211 stevensc 25
  defaultValues = {},
26
  values = {}
27
}) {
3389 stevensc 28
  const [currentTab, setCurrentTab] = useState(0)
29
 
3211 stevensc 30
  const {
31
    control,
32
    handleSubmit,
3389 stevensc 33
    formState: { errors, isSubmitting },
34
    trigger
3211 stevensc 35
  } = useForm({
3230 stevensc 36
    defaultValues,
3254 stevensc 37
    values
3211 stevensc 38
  })
39
 
3389 stevensc 40
  const handleChange = async (event, newValue) => {
41
    const valid = await trigger()
42
    if (valid) setCurrentTab(newValue)
43
  }
44
 
45
  const nextStep = async () => {
46
    const valid = await trigger()
47
    if (valid) setCurrentTab(currentTab + 1)
48
  }
49
 
3211 stevensc 50
  return (
3254 stevensc 51
    <Widget styles={{ overflow: 'visible' }}>
3389 stevensc 52
      <Tabs value={currentTab} onChange={handleChange}>
53
        <Tab label='Detalles' />
54
        <Tab label='Frecuencia' />
55
        <Tab label='Valor' />
56
      </Tabs>
57
 
3244 stevensc 58
      <Widget.Body>
59
        <Form onSubmit={handleSubmit(onSubmit)}>
60
          <LoadingWrapper loading={isSubmitting} displayChildren>
3389 stevensc 61
            <FormTabPanel value={0} index={currentTab}>
62
              <Input
63
                name='name'
64
                label='Nombre'
65
                placeholder='Escribe el nombre de la meta'
66
                control={control}
67
                rules={{ required: 'El nombre es requerido' }}
68
                error={errors.name?.message}
69
              />
3211 stevensc 70
 
3389 stevensc 71
              <Ckeditor
72
                label='Descripción'
73
                name='description'
74
                control={control}
75
                rules={{ required: 'La descripción es requerida' }}
76
                error={errors.description?.message}
77
              />
3211 stevensc 78
 
3389 stevensc 79
              <Button color='primary' onClick={nextStep}>
80
                Continuar
81
              </Button>
82
            </FormTabPanel>
3211 stevensc 83
 
3389 stevensc 84
            <FormTabPanel value={1} index={currentTab}>
85
              <Input
86
                type='number'
87
                name='value'
88
                label='Valor cuantitativo de la Meta a lograr'
89
                placeholder='Escribe el valor'
90
                control={control}
91
                rules={{
92
                  required: { value: true, message: 'El valor es requerido' },
93
                  validate: {
94
                    positive: (value) =>
95
                      Number(value) > 0 || 'El valor mayor a cero'
96
                  }
97
                }}
98
                error={errors.value?.message}
99
              />
3211 stevensc 100
 
3391 stevensc 101
              <Controller
3389 stevensc 102
                name='skill_id'
103
                control={control}
104
                defaultValue={[]}
105
                rules={{ required: 'Por favor selecciona un hábito' }}
3392 stevensc 106
                render={({
107
                  field: { onChange, value, name },
108
                  fieldState: { error }
109
                }) => (
3391 stevensc 110
                  <>
111
                    <TagsInput
112
                      label='Hábitos y competencias para lograr la Meta'
113
                      suggestions={habits}
114
                      onChange={onChange}
115
                      defaultValue={value}
116
                      name={name}
117
                    />
3392 stevensc 118
                    {error && (
119
                      <FormErrorFeedback>{error.message}</FormErrorFeedback>
120
                    )}
3391 stevensc 121
                  </>
122
                )}
3389 stevensc 123
              />
3383 stevensc 124
 
3389 stevensc 125
              <Button color='primary' onClick={nextStep}>
126
                Continuar
127
              </Button>
128
            </FormTabPanel>
129
 
130
            <FormTabPanel value={2} index={currentTab}>
131
              <DatetimePicker
132
                label='Fecha de inicio'
133
                name='start_date'
134
                control={control}
135
                rules={{
136
                  required: { value: true, message: 'La fecha es requerida' },
137
                  validate: {
138
                    beEqualOrGreaterThanToday: (date) => {
139
                      const selectedDate = new Date(date + 'T00:00:00')
140
                      const selectedDateMs = selectedDate.getTime()
141
                      const todayMs = new Date().setHours(0, 0, 0, 0)
142
 
143
                      return (
144
                        selectedDateMs >= todayMs ||
145
                        'La fecha debe ser mayor o igual a hoy'
146
                      )
147
                    }
148
                  }
149
                }}
150
              />
151
 
152
              <DatetimePicker
153
                label='Fecha de finalización'
154
                name='end_date'
155
                control={control}
156
                rules={{
157
                  required: { value: true, message: 'La fecha es requerida' },
158
                  validate: (value, { start_date }) => {
159
                    const startDate = new Date(start_date + 'T00:00:00')
160
                    const endDate = new Date(value + 'T00:00:00')
161
                    const startDateMs = startDate.getTime()
162
                    const endDateMs = endDate.getTime()
163
 
3383 stevensc 164
                    return (
3389 stevensc 165
                      endDateMs > startDateMs ||
166
                      'La fecha debe ser mayor a la fecha de inicio'
3383 stevensc 167
                    )
168
                  }
3389 stevensc 169
                }}
170
              />
3223 stevensc 171
 
3389 stevensc 172
              <Button type='submit' color='primary'>
173
                Enviar
174
              </Button>
175
            </FormTabPanel>
3244 stevensc 176
          </LoadingWrapper>
177
        </Form>
178
      </Widget.Body>
179
    </Widget>
3211 stevensc 180
  )
181
}