Rev 3393 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useState } from 'react';import { Controller, useForm } from 'react-hook-form';import { Button, styled, Tab, Tabs } from '@mui/material';import Widget from '@components/UI/Widget';import Form from '@components/common/form';import Input from '@components/UI/inputs/Input';import TabPanel from '@components/common/tab-panel';import Ckeditor from '@components/common/ckeditor/Ckeditor';import DatetimePicker from '@components/common/inputs/datetime-picker';import LoadingWrapper from '@components/common/loading-wrapper';import TagsInput from '@components/UI/TagsInput';import FormErrorFeedback from '@components/UI/form/FormErrorFeedback';const FormTabPanel = styled(TabPanel)(({ theme }) => ({display: 'flex',flexDirection: 'column',width: '100%',gap: theme.spacing(0.5)}));export default function GoalForm({onSubmit = () => {},habits = [],defaultValues = {},values = {}}) {const [currentTab, setCurrentTab] = useState(0);const {control,handleSubmit,formState: { errors, isSubmitting },trigger} = useForm({defaultValues,values});const handleChange = async (event, newValue) => {const valid = await trigger();if (valid) setCurrentTab(newValue);};const nextStep = async () => {const valid = await trigger();if (valid) setCurrentTab(currentTab + 1);};return (<Widget styles={{ overflow: 'visible' }}><Tabs value={currentTab} onChange={handleChange}><Tab label='Detalles' /><Tab label='Valor' /><Tab label='Fecha' /></Tabs><Widget.Body><Form onSubmit={handleSubmit(onSubmit)}><LoadingWrapper loading={isSubmitting} displayChildren><FormTabPanel value={0} index={currentTab}><Inputname='name'label='Nombre'placeholder='Escribe el nombre de la meta'control={control}rules={{ required: 'El nombre es requerido' }}error={errors.name?.message}/><Ckeditorlabel='Descripción'name='description'control={control}rules={{ required: 'La descripción es requerida' }}error={errors.description?.message}/><Button color='primary' onClick={nextStep}>Continuar</Button></FormTabPanel><FormTabPanel value={1} index={currentTab}><Inputtype='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}/><Controllername='skill_id'control={control}defaultValue={[]}rules={{ required: 'Por favor selecciona un hábito' }}render={({ field: { onChange, value, name }, fieldState: { error } }) => (<><TagsInputlabel='Hábitos y competencias para lograr la Meta'suggestions={habits}onChange={onChange}defaultValue={value}name={name}/>{error && <FormErrorFeedback>{error.message}</FormErrorFeedback>}</>)}/><Button color='primary' onClick={nextStep}>Continuar</Button></FormTabPanel><FormTabPanel value={2} index={currentTab}><DatetimePickerlabel='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';}}}}/><DatetimePickerlabel='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></FormTabPanel></LoadingWrapper></Form></Widget.Body></Widget>);}