Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7027 | Rev 7029 | 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;
7027 stevensc 15
  ul {
16
    display: flex;
17
    flex-direction: column;
18
    gap: 0.5rem;
19
  }
7024 stevensc 20
`
21
 
7026 stevensc 22
const KnowledgeGrid = styled.div`
23
  display: grid;
24
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
25
  gap: 1rem;
26
`
27
 
7028 stevensc 28
const KnowledgeCard = styled(WidgetLayout)`
7027 stevensc 29
  & > {
30
    a {
31
      width: fit-content;
32
 
33
      img {
34
        width: 100%;
35
        height: auto;
36
      }
37
 
38
      h2 {
39
        color: $title-color;
40
        font-weight: 800;
41
      }
42
    }
43
 
44
    h3 {
45
      color: $subtitle-color;
46
      font-weight: 400;
47
    }
48
 
49
    p {
50
      color: $font-color;
51
      font-weight: 400;
52
      text-align: justify;
53
      text-justify: inter-word;
54
    }
55
  }
56
 
57
  .knowledge-record-card-actions {
58
    display: flex;
59
    align-items: center;
60
    gap: 0.5rem;
61
 
62
    & > * {
63
      flex: 1;
64
      max-width: calc(100% / 3);
65
    }
66
  }
67
 
68
  .reaction-btn {
69
    align-items: center;
70
    border-radius: 10px;
71
    display: inline-flex;
72
    gap: 0.5rem;
73
    justify-content: center;
74
    padding: 10px;
75
    position: relative;
76
    width: -webkit-fill-available;
77
    transition: background-color 200ms ease;
78
 
79
    &:hover {
80
      background-color: #f5f5f5;
81
    }
82
  }
83
 
84
  .reactions {
85
    position: absolute;
86
    bottom: calc(100% + 0.5rem);
87
    background-color: $bg-color;
88
    box-shadow: 0px 0px 3px #000;
89
    gap: 0.5rem;
90
    left: 50%;
91
    display: none;
92
    padding: 0.2rem;
93
    width: fit-content;
94
    border-radius: 20px;
95
    transform: translateX(-50%);
96
 
97
    &.active {
98
      display: flex;
99
    }
100
  }
101
`
102
 
7024 stevensc 103
const KnowledgeSearch = styled(SearchInput)`
104
  background-color: var(--bg-color);
105
`
106
 
7020 stevensc 107
const KnowledgeAreaPage = () => {
7015 stevensc 108
  const [knowledges, setKnowledges] = useState([])
109
  const [knowledgesCategories, setKnowledgesCategories] = useState([])
7020 stevensc 110
  const [search, setSearch] = useState('')
7023 stevensc 111
  const [category, setCategory] = useState('')
7020 stevensc 112
  const [currentPage, setCurrentPage] = useState(1)
113
  const [totalPages, setTotalPages] = useState(1)
114
  const [allowAdd, setAllowAdd] = useState(false)
7015 stevensc 115
  const labels = useSelector(({ intl }) => intl.labels)
116
  const dispatch = useDispatch()
117
 
7023 stevensc 118
  const getKnowledgesInfo = (search, page, category) => {
119
    const urlParams = { search, page, category }
7015 stevensc 120
    axios
7021 stevensc 121
      .get(`/knowledge-area?${jsonToParams(urlParams)}`, {
7015 stevensc 122
        headers: {
123
          'Content-Type': 'application/json',
124
        },
125
      })
126
      .then((response) => {
7019 stevensc 127
        const { data, success } = response.data
128
 
129
        if (!success) {
130
          const errorMessage =
131
            typeof data === 'string'
132
              ? data
133
              : 'Ha ocurrido un error, por favor intente más tarde.'
134
 
135
          dispatch(addNotification({ style: 'danger', msg: errorMessage }))
136
          return
137
        }
138
 
139
        setKnowledges(data.items)
7020 stevensc 140
        setKnowledgesCategories(data.categories)
141
        setCurrentPage(data.page)
142
        setTotalPages(data.total_pages)
143
        setAllowAdd(Boolean(data.link_add))
7015 stevensc 144
      })
145
      .catch((error) => {
146
        dispatch(
147
          addNotification({
148
            style: 'danger',
149
            msg: 'Ha ocurrido un error, por favor intente más tarde.',
150
          })
151
        )
152
        throw new Error(error)
153
      })
7020 stevensc 154
  }
7015 stevensc 155
 
7022 stevensc 156
  const handleInputChange = debounce((e) => setSearch(e.target.value), 500)
7020 stevensc 157
 
158
  useEffect(() => {
7023 stevensc 159
    getKnowledgesInfo(search, currentPage, category)
7020 stevensc 160
  }, [search, currentPage])
161
 
7015 stevensc 162
  return (
7020 stevensc 163
    <Container as="section" className="companies-info px-0">
7015 stevensc 164
      <div className="company-title">
165
        <h1 className="title mx-auto">{labels.knowledge_area_title}</h1>
7020 stevensc 166
        {allowAdd && (
7021 stevensc 167
          <h2 className="title cursor-pointer">{labels.knowledge_area_add}</h2>
7015 stevensc 168
        )}
169
      </div>
170
 
7020 stevensc 171
      <Row className="gap-3">
172
        <Col md="3">
7025 stevensc 173
          <KnowledgeCategories>
7026 stevensc 174
            <ul>
175
              <li className="knowledge-category-li knowledge-category-li-selected">
7023 stevensc 176
                <input
177
                  type="radio"
7026 stevensc 178
                  id="category-all"
7027 stevensc 179
                  value=""
7023 stevensc 180
                  onChange={(e) => setCategory(e.target.value)}
181
                  hidden
182
                />
7026 stevensc 183
                <label htmlFor="category-all">
184
                  {labels.knowledge_area_category_all}
185
                </label>
7015 stevensc 186
              </li>
7026 stevensc 187
              {knowledgesCategories.map(({ uuid, name }) => (
188
                <li className="knowledge-category-li" key={uuid}>
189
                  <input
190
                    type="radio"
191
                    id={`category-${name}`}
192
                    value={uuid}
193
                    onChange={(e) => setCategory(e.target.value)}
194
                    hidden
195
                  />
196
                  <label htmlFor={`category-${name}`}>{name}</label>
197
                </li>
198
              ))}
199
            </ul>
7024 stevensc 200
          </KnowledgeCategories>
7020 stevensc 201
        </Col>
7015 stevensc 202
 
7020 stevensc 203
        <Col className="px-0">
7024 stevensc 204
          <KnowledgeSearch
7020 stevensc 205
            onChange={handleInputChange}
206
            placeholder={labels.search}
207
          />
7015 stevensc 208
 
7026 stevensc 209
          <KnowledgeGrid className="mt-3">
7019 stevensc 210
            {knowledges.length ? (
211
              knowledges.map((knowledge, index) => (
212
                <Item key={index} {...knowledge} />
213
              ))
214
            ) : (
215
              <EmptySection
216
                message={labels.error_no_record_matched_your_query}
217
              />
218
            )}
7026 stevensc 219
          </KnowledgeGrid>
7020 stevensc 220
          <PaginationComponent
221
            onChangePage={(newPage) => setCurrentPage(newPage)}
222
            currentActivePage={currentPage}
223
            pages={totalPages}
224
            isRow
225
          />
226
        </Col>
227
      </Row>
228
    </Container>
7015 stevensc 229
  )
230
}
231
 
7019 stevensc 232
const Item = ({
233
  link_delete,
234
  link_view,
235
  link_edit,
236
  category,
237
  description,
238
  image,
239
  title,
240
}) => {
241
  return (
7027 stevensc 242
    <KnowledgeCard>
7019 stevensc 243
      <a
244
        href={link_view}
245
        target="_blank"
246
        className="knowledge-record-card-actions-view"
247
        rel="noreferrer"
248
      >
249
        <img src={image} alt={`${title} image`} />
250
      </a>
251
      <div className="d-flex align-items-center justify-content-between">
252
        {link_edit && (
253
          <button data-link="{{>link_edit}}" className="btn-knowledge-edit">
254
            <i className="fa fa-pencil" aria-hidden="true" />
255
          </button>
256
        )}
257
 
258
        {link_delete && (
259
          <button data-link="{{>link_delete}}" className="btn-knowledge-delete">
260
            <i className="fa fa-trash" aria-hidden="true" />
261
          </button>
262
        )}
263
      </div>
264
      <h3>{category}</h3>
265
      <a href={link_view} target="_blank" rel="noreferrer">
266
        <h2>{title}</h2>
267
      </a>
268
      <p>{description}</p>
7027 stevensc 269
    </KnowledgeCard>
7019 stevensc 270
  )
271
}
272
 
7015 stevensc 273
export default KnowledgeAreaPage