Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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