Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7062 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
7033 stevensc 1
import React, { useEffect, useRef, useState } from 'react'
7025 stevensc 2
import { useDispatch, useSelector } from 'react-redux'
7065 stevensc 3
import { Col, Container, Row } from 'react-bootstrap'
7020 stevensc 4
import { axios, debounce, jsonToParams } from '../../utils'
7015 stevensc 5
import { addNotification } from '../../redux/notification/notification.actions'
7025 stevensc 6
import styled from 'styled-components'
7
 
8
import SearchInput from '../../components/UI/SearchInput'
7019 stevensc 9
import EmptySection from '../../components/UI/EmptySection'
7025 stevensc 10
import WidgetLayout from '../../components/widgets/WidgetLayout'
7020 stevensc 11
import PaginationComponent from '../../components/UI/PaginationComponent'
7065 stevensc 12
 
7033 stevensc 13
import KnowledgeEditModal from '../../components/knowledge/KnowledgeEditModal'
7043 stevensc 14
import ConfirmModal from '../../components/modals/ConfirmModal'
7065 stevensc 15
import KnowledgeItem from './KnowledgeItem'
7015 stevensc 16
 
7024 stevensc 17
const KnowledgeCategories = styled(WidgetLayout)`
18
  padding: 1rem;
7027 stevensc 19
  ul {
20
    display: flex;
21
    flex-direction: column;
7040 stevensc 22
    gap: 1rem;
7039 stevensc 23
    li,
24
    label {
7033 stevensc 25
      cursor: pointer;
26
    }
7039 stevensc 27
    .selected label {
7033 stevensc 28
      font-weight: 600;
29
    }
7027 stevensc 30
  }
7024 stevensc 31
`
32
 
7026 stevensc 33
const KnowledgeGrid = styled.div`
34
  display: grid;
7058 stevensc 35
  grid-template-columns: repeat(auto-fit, 250px);
7026 stevensc 36
  gap: 1rem;
37
`
38
 
7024 stevensc 39
const KnowledgeSearch = styled(SearchInput)`
40
  background-color: var(--bg-color);
41
`
42
 
7020 stevensc 43
const KnowledgeAreaPage = () => {
7015 stevensc 44
  const [knowledges, setKnowledges] = useState([])
45
  const [knowledgesCategories, setKnowledgesCategories] = useState([])
7020 stevensc 46
  const [search, setSearch] = useState('')
7023 stevensc 47
  const [category, setCategory] = useState('')
7020 stevensc 48
  const [currentPage, setCurrentPage] = useState(1)
49
  const [totalPages, setTotalPages] = useState(1)
50
  const [allowAdd, setAllowAdd] = useState(false)
7033 stevensc 51
  const [modalShow, setModalShow] = useState(null)
7045 stevensc 52
  const addUrl = useRef('')
7034 stevensc 53
  const actionUrl = useRef('')
7015 stevensc 54
  const labels = useSelector(({ intl }) => intl.labels)
55
  const dispatch = useDispatch()
56
 
7033 stevensc 57
  const getKnowledgesInfo = (search = '', page = 1, category_id = '') => {
58
    const urlParams = { search, page, category_id }
7015 stevensc 59
    axios
7021 stevensc 60
      .get(`/knowledge-area?${jsonToParams(urlParams)}`, {
7015 stevensc 61
        headers: {
62
          'Content-Type': 'application/json',
63
        },
64
      })
65
      .then((response) => {
7019 stevensc 66
        const { data, success } = response.data
67
 
68
        if (!success) {
69
          const errorMessage =
70
            typeof data === 'string'
71
              ? data
72
              : 'Ha ocurrido un error, por favor intente más tarde.'
73
 
74
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
75
          return
76
        }
77
 
7051 stevensc 78
        const categories = Object.entries(data.categories).map(
79
          (values) => values[1]
80
        )
81
 
82
        setKnowledges(data.items)
83
        setKnowledgesCategories(categories)
7020 stevensc 84
        setCurrentPage(data.page)
85
        setTotalPages(data.total_pages)
86
        setAllowAdd(Boolean(data.link_add))
7045 stevensc 87
        addUrl.current = data.link_add
7015 stevensc 88
      })
89
      .catch((error) => {
90
        dispatch(
91
          addNotification({
92
            style: 'danger',
93
            msg: 'Ha ocurrido un error, por favor intente más tarde.',
94
          })
95
        )
96
        throw new Error(error)
97
      })
7020 stevensc 98
  }
7015 stevensc 99
 
7043 stevensc 100
  const confirmDelete = () => {
101
    axios
102
      .post(actionUrl.current)
103
      .then((response) => {
104
        const { data, success } = response.data
105
 
106
        if (!success) {
107
          const errorMessage =
108
            typeof data === 'string'
109
              ? data
110
              : 'Ha ocurrido un error, por favor intente más tarde.'
111
 
112
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
113
          return
114
        }
115
 
116
        dispatch(addNotification({ style: 'success', msg: data }))
7044 stevensc 117
        getKnowledgesInfo()
118
        closeModal()
7043 stevensc 119
      })
120
      .catch((error) => {
121
        dispatch(
122
          addNotification({
123
            style: 'danger',
124
            msg: 'Ha ocurrido un error, por favor intente más tarde.',
125
          })
126
        )
127
        throw new Error(error)
128
      })
129
  }
130
 
7045 stevensc 131
  const addKnowledge = (url) => {
132
    actionUrl.current = url
133
    setModalShow('add')
134
  }
135
 
7033 stevensc 136
  const editKnowledge = (url) => {
137
    actionUrl.current = url
138
    setModalShow('edit')
139
  }
140
 
7043 stevensc 141
  const deleteKnowledge = (url) => {
142
    actionUrl.current = url
143
    setModalShow('delete')
144
  }
145
 
7033 stevensc 146
  const closeModal = () => {
7036 stevensc 147
    actionUrl.current = ''
7033 stevensc 148
    setModalShow(null)
149
  }
150
 
7022 stevensc 151
  const handleInputChange = debounce((e) => setSearch(e.target.value), 500)
7020 stevensc 152
 
153
  useEffect(() => {
7023 stevensc 154
    getKnowledgesInfo(search, currentPage, category)
7030 stevensc 155
  }, [search, currentPage, category])
7020 stevensc 156
 
7015 stevensc 157
  return (
7033 stevensc 158
    <>
7058 stevensc 159
      <Container as="section" className="companies-info">
7033 stevensc 160
        <div className="company-title">
161
          <h1 className="title mx-auto">{labels.knowledge_area_title}</h1>
162
          {allowAdd && (
7045 stevensc 163
            <h2
164
              className="title cursor-pointer"
165
              onClick={() => addKnowledge(addUrl.current)}
166
            >
7033 stevensc 167
              {labels.knowledge_area_add}
168
            </h2>
169
          )}
170
        </div>
7015 stevensc 171
 
7033 stevensc 172
        <Row className="gap-3">
173
          <Col md="3">
174
            <KnowledgeCategories>
175
              <ul>
7039 stevensc 176
                <li className={!category && 'selected'}>
7026 stevensc 177
                  <input
178
                    type="radio"
7033 stevensc 179
                    id="category-all"
180
                    value=""
7043 stevensc 181
                    name="category"
7026 stevensc 182
                    onChange={(e) => setCategory(e.target.value)}
183
                    hidden
184
                  />
7039 stevensc 185
                  <label htmlFor="category-all">
7033 stevensc 186
                    {labels.knowledge_area_category_all}
187
                  </label>
7026 stevensc 188
                </li>
7033 stevensc 189
                {knowledgesCategories.map(({ uuid, name }) => (
7039 stevensc 190
                  <li className={category === uuid && 'selected'} key={uuid}>
7033 stevensc 191
                    <input
192
                      type="radio"
193
                      id={`category-${name}`}
7042 stevensc 194
                      name="category"
7033 stevensc 195
                      value={uuid}
196
                      onChange={(e) => setCategory(e.target.value)}
197
                      hidden
198
                    />
7039 stevensc 199
                    <label htmlFor={`category-${name}`}>{name}</label>
7033 stevensc 200
                  </li>
201
                ))}
202
              </ul>
203
            </KnowledgeCategories>
204
          </Col>
7015 stevensc 205
 
7033 stevensc 206
          <Col className="px-0">
207
            <KnowledgeSearch
208
              onChange={handleInputChange}
209
              placeholder={labels.search}
210
            />
7015 stevensc 211
 
7033 stevensc 212
            <KnowledgeGrid className="mt-3">
213
              {knowledges.length ? (
214
                knowledges.map((knowledge, index) => (
7065 stevensc 215
                  <KnowledgeItem
7043 stevensc 216
                    key={index}
217
                    {...knowledge}
218
                    onEdit={editKnowledge}
219
                    onDelete={deleteKnowledge}
220
                  />
7033 stevensc 221
                ))
222
              ) : (
223
                <EmptySection
224
                  message={labels.error_no_record_matched_your_query}
225
                />
226
              )}
227
            </KnowledgeGrid>
228
            <PaginationComponent
229
              onChangePage={(newPage) => setCurrentPage(newPage)}
230
              currentActivePage={currentPage}
231
              pages={totalPages}
232
              isRow
233
            />
234
          </Col>
235
        </Row>
236
      </Container>
237
      <KnowledgeEditModal
238
        show={modalShow === 'edit'}
239
        url={actionUrl.current}
240
        categories={knowledgesCategories}
241
        onComplete={getKnowledgesInfo}
242
        onClose={closeModal}
7045 stevensc 243
        isEdit
7033 stevensc 244
      />
7045 stevensc 245
      <KnowledgeEditModal
246
        show={modalShow === 'add'}
247
        url={actionUrl.current}
248
        categories={knowledgesCategories}
249
        onComplete={getKnowledgesInfo}
250
        onClose={closeModal}
251
      />
7043 stevensc 252
      <ConfirmModal
253
        show={modalShow === 'delete'}
254
        onClose={closeModal}
255
        onAccept={confirmDelete}
256
      />
7033 stevensc 257
    </>
7015 stevensc 258
  )
259
}
260
 
261
export default KnowledgeAreaPage