Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
7046 stevensc 1
import React, { useEffect, useState } from 'react'
2
import { useForm } from 'react-hook-form'
7033 stevensc 3
import { CKEditor } from 'ckeditor4-react'
4
import { Button, Form, Modal } from 'react-bootstrap'
5
import { useDispatch, useSelector } from 'react-redux'
6
import { CKEDITOR_OPTIONS, axios } from '../../utils'
7
import { addNotification } from '../../redux/notification/notification.actions'
8
 
7046 stevensc 9
import FormErrorFeedback from '../UI/FormErrorFeedback'
10
import Spinner from '../UI/Spinner'
11
 
7033 stevensc 12
const KnowledgeEditModal = ({
13
  show,
14
  categories = [],
15
  url,
16
  onComplete,
17
  onClose,
7045 stevensc 18
  isEdit,
7033 stevensc 19
}) => {
20
  const [loading, setLoading] = useState(false)
21
  const labels = useSelector(({ intl }) => intl.labels)
22
  const dispatch = useDispatch()
23
 
7053 stevensc 24
  const { handleSubmit, register, setValue, errors, getValues, watch } =
25
    useForm()
7033 stevensc 26
 
7053 stevensc 27
  const watchDescription = watch('description', '<p></p>')
28
 
7033 stevensc 29
  const onSubmit = handleSubmit((data) => {
30
    setLoading(true)
31
    const formData = new FormData()
7046 stevensc 32
    Object.entries(data).map(([key, value]) => {
7053 stevensc 33
      if (['attachment', 'image'].includes(key) && value) {
7046 stevensc 34
        formData.append(key, value[0])
35
        return
36
      }
37
      formData.append(key, value)
38
    })
7033 stevensc 39
 
40
    axios
41
      .post(url, formData)
42
      .then((response) => {
43
        const { data, success } = response.data
44
        if (!success) {
45
          if (typeof data === 'string') {
46
            dispatch(addNotification({ style: 'danger', msg: data }))
47
            return
48
          }
49
 
50
          Object.entries(data).map(([key, value]) => {
51
            key in getValues() &&
52
              dispatch(
53
                addNotification({
54
                  style: 'danger',
55
                  msg: `${key}: ${Array.isArray(value) ? value[0] : value}`,
56
                })
57
              )
58
          })
59
          return
60
        }
61
 
62
        onComplete()
63
        onClose()
64
      })
65
      .finally(() => setLoading(false))
66
  })
67
 
68
  useEffect(() => {
69
    register('description', { required: true })
70
  }, [])
71
 
72
  useEffect(() => {
7045 stevensc 73
    if (!url || !show || !isEdit) return
7038 stevensc 74
 
7033 stevensc 75
    axios.get(url).then((response) => {
7038 stevensc 76
      const { data, success } = response.data
7033 stevensc 77
 
78
      if (!success) {
79
        const errorMessage =
80
          typeof data === 'string' ? data : 'Ha ocurrido un error'
81
 
7037 stevensc 82
        dispatch(
83
          addNotification({
84
            style: 'danger',
85
            msg: errorMessage,
86
          })
87
        )
88
        return
7033 stevensc 89
      }
90
 
91
      setValue('category_id', data.category_id)
92
      setValue('description', data.description)
93
      setValue('title', data.title)
94
    })
7045 stevensc 95
  }, [url, show])
7044 stevensc 96
 
97
  useEffect(() => {
98
    if (!show) {
99
      setValue('category_id', '')
100
      setValue('description', '')
101
      setValue('title', '')
102
    }
7033 stevensc 103
  }, [show])
104
 
105
  return (
106
    <Modal show={show}>
7037 stevensc 107
      <Modal.Header className="pb-0">
7054 stevensc 108
        <Modal.Title>
109
          {isEdit ? labels.edit : labels.add} conocimiento
110
        </Modal.Title>
7033 stevensc 111
      </Modal.Header>
112
      <Modal.Body>
7046 stevensc 113
        {loading && <Spinner />}
7033 stevensc 114
        <Form onSubmit={onSubmit}>
115
          <Form.Group>
116
            <Form.Label>{labels.category}</Form.Label>
7038 stevensc 117
            <Form.Control
118
              as="select"
119
              ref={register({ required: true })}
120
              name="category_id"
121
            >
7033 stevensc 122
              {categories.map(({ name, uuid }) => (
7039 stevensc 123
                <option value={uuid} key={uuid}>
124
                  {name}
125
                </option>
7033 stevensc 126
              ))}
127
            </Form.Control>
7037 stevensc 128
            {errors.category_id && (
7033 stevensc 129
              <FormErrorFeedback>{labels.error_field_empty}</FormErrorFeedback>
130
            )}
131
          </Form.Group>
132
 
133
          <Form.Group>
134
            <Form.Label>{labels.title}</Form.Label>
7038 stevensc 135
            <Form.Control
136
              type="text"
137
              name="title"
138
              ref={register({ required: true })}
139
            />
7037 stevensc 140
            {errors.title && (
7033 stevensc 141
              <FormErrorFeedback>{labels.error_field_empty}</FormErrorFeedback>
142
            )}
143
          </Form.Group>
144
 
7049 stevensc 145
          {show && (
146
            <CKEditor
147
              onChange={(e) => setValue('description', e.editor.getData())}
7054 stevensc 148
              onInstanceReady={(e) => e.editor.setData(watchDescription)}
7049 stevensc 149
              config={CKEDITOR_OPTIONS}
150
            />
151
          )}
7033 stevensc 152
          {errors.description && (
153
            <FormErrorFeedback>{labels.error_field_empty}</FormErrorFeedback>
154
          )}
155
 
7045 stevensc 156
          <Form.Group>
157
            <Form.File
158
              label={labels.image}
159
              name="image"
160
              ref={register({ required: true })}
161
            />
162
            {errors.image && (
163
              <FormErrorFeedback>{labels.error_field_empty}</FormErrorFeedback>
164
            )}
165
          </Form.Group>
166
 
167
          <Form.Group>
168
            <Form.File
169
              label={labels.attachment}
170
              name="attachment"
171
              ref={register}
172
            />
173
          </Form.Group>
174
 
7038 stevensc 175
          <Button className="mt-3 mr-2" variant="primary" type="submit">
7033 stevensc 176
            {labels.accept}
177
          </Button>
7035 stevensc 178
          <Button className="btn-secondary mt-3" onClick={onClose}>
179
            {labels.cancel}
7033 stevensc 180
          </Button>
181
        </Form>
182
      </Modal.Body>
183
    </Modal>
184
  )
185
}
186
 
187
export default KnowledgeEditModal