Proyectos de Subversion LeadersLinked - SPA

Rev

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