Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
7015 stevensc 1
import React, { useEffect, useState } from 'react'
7025 stevensc 2
import { useDispatch, useSelector } from 'react-redux'
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'
7015 stevensc 12
 
7024 stevensc 13
const KnowledgeCategories = styled(WidgetLayout)`
14
  padding: 1rem;
15
  gap: 0.5rem;
16
`
17
 
18
const KnowledgeSearch = styled(SearchInput)`
19
  background-color: var(--bg-color);
20
`
21
 
7020 stevensc 22
const KnowledgeAreaPage = () => {
7015 stevensc 23
  const [knowledges, setKnowledges] = useState([])
24
  const [knowledgesCategories, setKnowledgesCategories] = useState([])
7020 stevensc 25
  const [search, setSearch] = useState('')
7023 stevensc 26
  const [category, setCategory] = useState('')
7020 stevensc 27
  const [currentPage, setCurrentPage] = useState(1)
28
  const [totalPages, setTotalPages] = useState(1)
29
  const [allowAdd, setAllowAdd] = useState(false)
7015 stevensc 30
  const labels = useSelector(({ intl }) => intl.labels)
31
  const dispatch = useDispatch()
32
 
7023 stevensc 33
  const getKnowledgesInfo = (search, page, category) => {
34
    const urlParams = { search, page, category }
7015 stevensc 35
    axios
7021 stevensc 36
      .get(`/knowledge-area?${jsonToParams(urlParams)}`, {
7015 stevensc 37
        headers: {
38
          'Content-Type': 'application/json',
39
        },
40
      })
41
      .then((response) => {
7019 stevensc 42
        const { data, success } = response.data
43
 
44
        if (!success) {
45
          const errorMessage =
46
            typeof data === 'string'
47
              ? data
48
              : 'Ha ocurrido un error, por favor intente más tarde.'
49
 
50
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
51
          return
52
        }
53
 
54
        setKnowledges(data.items)
7020 stevensc 55
        setKnowledgesCategories(data.categories)
56
        setCurrentPage(data.page)
57
        setTotalPages(data.total_pages)
58
        setAllowAdd(Boolean(data.link_add))
7015 stevensc 59
      })
60
      .catch((error) => {
61
        dispatch(
62
          addNotification({
63
            style: 'danger',
64
            msg: 'Ha ocurrido un error, por favor intente más tarde.',
65
          })
66
        )
67
        throw new Error(error)
68
      })
7020 stevensc 69
  }
7015 stevensc 70
 
7022 stevensc 71
  const handleInputChange = debounce((e) => setSearch(e.target.value), 500)
7020 stevensc 72
 
73
  useEffect(() => {
7023 stevensc 74
    getKnowledgesInfo(search, currentPage, category)
7020 stevensc 75
  }, [search, currentPage])
76
 
7015 stevensc 77
  return (
7020 stevensc 78
    <Container as="section" className="companies-info px-0">
7015 stevensc 79
      <div className="company-title">
80
        <h1 className="title mx-auto">{labels.knowledge_area_title}</h1>
7020 stevensc 81
        {allowAdd && (
7021 stevensc 82
          <h2 className="title cursor-pointer">{labels.knowledge_area_add}</h2>
7015 stevensc 83
        )}
84
      </div>
85
 
7020 stevensc 86
      <Row className="gap-3">
87
        <Col md="3">
7025 stevensc 88
          <KnowledgeCategories>
7021 stevensc 89
            <li className="knowledge-category-li knowledge-category-li-selected">
7023 stevensc 90
              <input
91
                type="radio"
92
                id="category-all"
93
                value="user"
94
                onChange={(e) => setCategory(e.target.value)}
95
                hidden
96
              />
97
              <label htmlFor="category-all">
7021 stevensc 98
                {labels.knowledge_area_category_all}
7023 stevensc 99
              </label>
7021 stevensc 100
            </li>
7023 stevensc 101
            {knowledgesCategories.map(({ uuid, name }) => (
102
              <li className="knowledge-category-li" key={uuid}>
103
                <input
104
                  type="radio"
105
                  id={`category-${name}`}
106
                  value={uuid}
107
                  onChange={(e) => setCategory(e.target.value)}
108
                  hidden
109
                />
110
                <label htmlFor={`category-${name}`}>{name}</label>
7015 stevensc 111
              </li>
112
            ))}
7024 stevensc 113
          </KnowledgeCategories>
7020 stevensc 114
        </Col>
7015 stevensc 115
 
7020 stevensc 116
        <Col className="px-0">
7024 stevensc 117
          <KnowledgeSearch
7020 stevensc 118
            onChange={handleInputChange}
119
            placeholder={labels.search}
120
          />
7015 stevensc 121
 
7019 stevensc 122
          <div className="knowledge-record-list mt-3">
123
            {knowledges.length ? (
124
              knowledges.map((knowledge, index) => (
125
                <Item key={index} {...knowledge} />
126
              ))
127
            ) : (
128
              <EmptySection
129
                message={labels.error_no_record_matched_your_query}
130
              />
131
            )}
132
          </div>
7020 stevensc 133
          <PaginationComponent
134
            onChangePage={(newPage) => setCurrentPage(newPage)}
135
            currentActivePage={currentPage}
136
            pages={totalPages}
137
            isRow
138
          />
139
        </Col>
140
      </Row>
141
    </Container>
7015 stevensc 142
  )
143
}
144
 
7019 stevensc 145
const Item = ({
146
  link_delete,
147
  link_view,
148
  link_edit,
149
  category,
150
  description,
151
  image,
152
  title,
153
}) => {
154
  return (
7023 stevensc 155
    <WidgetLayout>
7019 stevensc 156
      <a
157
        href={link_view}
158
        target="_blank"
159
        className="knowledge-record-card-actions-view"
160
        rel="noreferrer"
161
      >
162
        <img src={image} alt={`${title} image`} />
163
      </a>
164
      <div className="d-flex align-items-center justify-content-between">
165
        {link_edit && (
166
          <button data-link="{{>link_edit}}" className="btn-knowledge-edit">
167
            <i className="fa fa-pencil" aria-hidden="true" />
168
          </button>
169
        )}
170
 
171
        {link_delete && (
172
          <button data-link="{{>link_delete}}" className="btn-knowledge-delete">
173
            <i className="fa fa-trash" aria-hidden="true" />
174
          </button>
175
        )}
176
      </div>
177
      <h3>{category}</h3>
178
      <a href={link_view} target="_blank" rel="noreferrer">
179
        <h2>{title}</h2>
180
      </a>
181
      <p>{description}</p>
7023 stevensc 182
    </WidgetLayout>
7019 stevensc 183
  )
184
}
185
 
7015 stevensc 186
export default KnowledgeAreaPage