Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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