Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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