Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7039 | Rev 7042 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

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