Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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