Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 11684 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

import React, { useState, useEffect } from 'react'
import { Button, Modal } from 'react-bootstrap'
import axios from 'axios'
import Datetime from 'react-datetime'
import { useForm } from 'react-hook-form'
import { useDispatch } from 'react-redux'
import { addNotification } from '../../../redux/notification/notification.actions'
import 'react-datetime/css/react-datetime.css'

const EditAndAddModal = ({ action_link, closeModal, type, onComplete }) => {

        //Hooks
        const { register, handleSubmit, errors, setValue, clearErrors, watch, reset } = useForm()
        const [isActive, setIsActive] = useState(false)
        const [usersSelected, setUsersSelected] = useState([])
        const [allUsers, setAllUsers] = useState([])
        const [year, setYear] = useState(new Intl.DateTimeFormat('en-CA').format(new Date()))
        const dispatch = useDispatch()

        const deleteUserSelected = (uuid) => {
                const newUsersSelected = usersSelected.filter((user) => user.uuid !== uuid)
                setUsersSelected(newUsersSelected)
        }

        const addUser = () => {
                const newUser = allUsers.find(userOption => userOption.uuid === watch('user'))
                setUsersSelected(prev => [...prev, { uuid: newUser.uuid }])
        }

        const onClose = () => {
                reset()
                setUsersSelected([])
                closeModal()
        }

        const onSubmit = (data) => {
                const submitData = new FormData()

                submitData.append('status', isActive ? 'a' : 'i')
                submitData.append('date', year)
                usersSelected.map((user) => submitData.append('who[]', user.uuid))
                Object.entries(data).map(([key, value]) => {
                        submitData.append(key, value)
                })

                axios.post(action_link, submitData)
                        .then(({ data }) => {
                                if (!data.success) {
                                        typeof data.data === 'string'
                                                ?
                                                dispatch(addNotification({
                                                        style: 'danger',
                                                        msg: data.data
                                                }))
                                                : Object.entries(data.data).map(([key, value]) =>
                                                        value.map(err =>
                                                                dispatch(addNotification({
                                                                        style: 'danger',
                                                                        msg: `${key}: ${err}`
                                                                }))
                                                        )
                                                )
                                        return
                                }

                                clearErrors()
                                closeModal()
                                reset()
                                onComplete()
                                dispatch(addNotification({
                                        style: 'success',
                                        msg: 'Registro guardadof'
                                }))
                        })
        }

        useEffect(() => {
                if (type === 'edit') {
                        axios.get(action_link)
                                .then(({ data }) => {
                                        if (!data.success) {
                                                return dispatch(addNotification({
                                                        style: 'danger',
                                                        msg: 'Ha ocurrido un error'
                                                }))
                                        }

                                        setAllUsers(data.all_users)
                                        setValue('title', data.data.title)
                                        setValue('description', data.data.description)
                                        setValue('how', data.data.how)
                                        setValue('place', data.data.place)
                                        setValue('date', data.data.date)
                                        setValue('cost', data.data.time)
                                        setValue('priority', data.data.time)
                                        setValue('urgent', data.data.time)
                                        setValue('indicator', data.data.indicator)
                                        setIsActive(data.data.status === 'a' ? true : false)
                                        setUsersSelected(data.users)
                                })
                }
        }, [type])

        useEffect(() => {
                if (type === 'add') {
                        axios.get(action_link)
                                .then(({ data }) => {
                                        if (!data.success) {
                                                return dispatch(addNotification({
                                                        style: 'danger',
                                                        msg: 'Ha ocurrido un error'
                                                }))
                                        }

                                        setAllUsers(data.data)
                                })
                }
        }, [type])

        return (
                <Modal size="md" onHide={onClose} show={type === 'add' || type === ('edit')}>
                        <Modal.Header closeButton>
                                <Modal.Title>
                                        {
                                                type === 'add'
                                                        ? 'Agregar Tarea'
                                                        : 'Editar Tarea'
                                        }
                                </Modal.Title>
                        </Modal.Header>
                        <form onSubmit={handleSubmit(onSubmit)}>
                                <Modal.Body>
                                        <div className='form-group'>
                                                <label className="form-label">Título</label>
                                                <input type="text" name='title' className='form-control' ref={register({ required: true })} />
                                                {errors.title && <p>{errors.title.message}</p>}
                                        </div>
                                        <div className='form-group'>
                                                <label className="form-label">Descripción de la tarea</label>
                                                <input type="text" name='description' className='form-control' ref={register({ required: true })} />
                                                {errors.description && <p>{errors.description.message}</p>}
                                        </div>
                                        <div className='form-group'>
                                                <label className="form-label">Como se implementara</label>
                                                <input type="text" name='how' className='form-control' ref={register({ required: true })} />
                                                {errors.how && <p>{errors.how.message}</p>}
                                        </div>
                                        <div className="w-100">
                                                <table className='table'>
                                                        <thead>
                                                                <tr>
                                                                        <th>Usuario</th>
                                                                        <th>Acciones</th>
                                                                </tr>
                                                        </thead>
                                                        <tbody>
                                                                {
                                                                        usersSelected.map((user) => {
                                                                                const renderUser = allUsers.find(userOption => userOption.uuid === user.uuid)

                                                                                return (
                                                                                        <tr key={renderUser.uuid}>
                                                                                                <td>{`${renderUser.first_name} ${renderUser.last_name}`}</td>
                                                                                                <td>
                                                                                                        <div className="d-flex">
                                                                                                                <button className='btn btn-danger' onClick={() => deleteUserSelected(renderUser.uuid)}>
                                                                                                                        Eliminar
                                                                                                                </button>
                                                                                                        </div>
                                                                                                </td>
                                                                                        </tr>
                                                                                )
                                                                        })
                                                                }
                                                        </tbody>
                                                </table>
                                        </div>
                                        <div className="d-flex align-items-center">
                                                <select name='user' ref={register} className='form-control'>
                                                        <option value=''>Seleccione</option>
                                                        {
                                                                allUsers.map((user) => (
                                                                        <option key={user.uuid} value={user.uuid}>{`${user.first_name} ${user.last_name}`}</option>
                                                                ))
                                                        }
                                                </select>
                                                <button className='d-flex align-items-center btn btn-primary ml-2' onClick={addUser}>
                                                        <i className='fa fa-plus' />
                                                        Agregar
                                                </button>
                                        </div>
                                        <div className="d-flex align-items-centers" style={{ gap: '5px' }}>
                                                <div className='form-group'>
                                                        <label className="form-label">Donde se realizara:</label>
                                                        <input type="text" name='place' className='form-control' ref={register({ required: true })} />
                                                        {errors.place && <p>{errors.place.message}</p>}
                                                </div>
                                                <div className='form-group'>
                                                        <label className="form-label">Fecha:</label>
                                                        <Datetime
                                                                dateFormat="DD-MM-YYYY"
                                                                timeFormat={false}
                                                                onChange={(e) =>
                                                                        setYear(new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: 'numeric', day: 'numeric' }).format(e.toDate()))
                                                                }
                                                                inputProps={{ className: 'form-control' }}
                                                                initialValue={Date.parse(year)}
                                                                closeOnSelect
                                                                value={year}
                                                        />
                                                </div>
                                                <div className='form-group'>
                                                        <label className="form-label">Horas:</label>
                                                        <input type="number" name='time' className='form-control' ref={register} defaultValue='1' />
                                                        {errors.time && <p>{errors.time.message}</p>}
                                                </div>
                                        </div>
                                        <div className="d-flex align-items-centers" style={{ gap: '5px' }}>
                                                <div className='form-group'>
                                                        <label className="form-label">Costo:</label>
                                                        <input type="number" name='cost' className='form-control' defaultValue='1' ref={register} />
                                                </div>
                                                <div className='form-group'>
                                                        <label className="form-label">Prioridad:</label>
                                                        <select name="priority" ref={register({ required: true })}>
                                                                <option selected={watch('priority') === ''} value="">Seleccione</option>
                                                                <option selected={watch('priority') === 'i'} value="i">Importante</option>
                                                                <option selected={watch('priority') === 'ni'} value="ni">No importante</option>
                                                        </select>
                                                </div>
                                                <div className='form-group'>
                                                        <label className="form-label">Urgencia:</label>
                                                        <select name="urgent" ref={register({ required: true })}>
                                                                <option selected={watch('urgent') === ''} value="">Seleccione</option>
                                                                <option selected={watch('urgent') === 'u'} value="u">Urgente</option>
                                                                <option selected={watch('urgent') === 'nu'} value="nu">No urgente</option>
                                                        </select>
                                                </div>
                                        </div>
                                        <div className="form-row">
                                                <div className="col-md-9 mb-3">
                                                        <label>Indicador de progreso:</label>
                                                        <div className="d-flex justify-content-between align-items-center">
                                                                <input type="range" name="indicator" min='1' max='100' className="form-control" ref={register} />
                                                                <span className="ml-2" id="spanIndicator">{watch('indicator')}</span>
                                                        </div>
                                                </div>
                                                <div className="col-md-3 mb-3 text-center">
                                                        <label htmlFor="status">Estatus:</label>
                                                        <div
                                                                className={`toggle d-block btn btn-primary ${!isActive && 'off'}`}
                                                                data-toggle="toggle"
                                                                role="button"
                                                                style={{ width: '130px' }}
                                                                onClick={() => setIsActive(!isActive)}
                                                        >
                                                                <input
                                                                        type="checkbox"
                                                                        checked={isActive}
                                                                />
                                                                <div className="toggle-group">
                                                                        <label htmlFor="status" className="btn btn-primary toggle-on">Activo</label>
                                                                        <label htmlFor="status" className="btn btn-light toggle-off">Inactivo</label>
                                                                        <span className="toggle-handle btn btn-light"></span>
                                                                </div>
                                                        </div>
                                                </div>
                                        </div>
                                </Modal.Body>
                                <Modal.Footer>
                                        <Button variant="primary" type='submit'>
                                                Enviar
                                        </Button>
                                        <Button variant="danger" onClick={closeModal}>
                                                Cancelar
                                        </Button>
                                </Modal.Footer>
                        </form>
                </Modal >
        )
}

export default EditAndAddModal