Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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