Rev 7025 | Rev 7027 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import React, { useEffect, useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { Col, Container, Row } from 'react-bootstrap'
import { axios, debounce, jsonToParams } from '../../utils'
import { addNotification } from '../../redux/notification/notification.actions'
import styled from 'styled-components'
import SearchInput from '../../components/UI/SearchInput'
import EmptySection from '../../components/UI/EmptySection'
import WidgetLayout from '../../components/widgets/WidgetLayout'
import PaginationComponent from '../../components/UI/PaginationComponent'
const KnowledgeCategories = styled(WidgetLayout)`
display: flex;
flex-direction: column;
padding: 1rem;
gap: 0.5rem;
`
const KnowledgeGrid = styled.div`
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1rem;
`
const KnowledgeSearch = styled(SearchInput)`
background-color: var(--bg-color);
`
const KnowledgeAreaPage = () => {
const [knowledges, setKnowledges] = useState([])
const [knowledgesCategories, setKnowledgesCategories] = useState([])
const [search, setSearch] = useState('')
const [category, setCategory] = useState('')
const [currentPage, setCurrentPage] = useState(1)
const [totalPages, setTotalPages] = useState(1)
const [allowAdd, setAllowAdd] = useState(false)
const labels = useSelector(({ intl }) => intl.labels)
const dispatch = useDispatch()
const getKnowledgesInfo = (search, page, category) => {
const urlParams = { search, page, category }
axios
.get(`/knowledge-area?${jsonToParams(urlParams)}`, {
headers: {
'Content-Type': 'application/json',
},
})
.then((response) => {
const { data, success } = response.data
if (!success) {
const errorMessage =
typeof data === 'string'
? data
: 'Ha ocurrido un error, por favor intente más tarde.'
dispatch(addNotification({ style: 'danger', msg: errorMessage }))
return
}
setKnowledges(data.items)
setKnowledgesCategories(data.categories)
setCurrentPage(data.page)
setTotalPages(data.total_pages)
setAllowAdd(Boolean(data.link_add))
})
.catch((error) => {
dispatch(
addNotification({
style: 'danger',
msg: 'Ha ocurrido un error, por favor intente más tarde.',
})
)
throw new Error(error)
})
}
const handleInputChange = debounce((e) => setSearch(e.target.value), 500)
useEffect(() => {
getKnowledgesInfo(search, currentPage, category)
}, [search, currentPage])
return (
<Container as="section" className="companies-info px-0">
<div className="company-title">
<h1 className="title mx-auto">{labels.knowledge_area_title}</h1>
{allowAdd && (
<h2 className="title cursor-pointer">{labels.knowledge_area_add}</h2>
)}
</div>
<Row className="gap-3">
<Col md="3">
<KnowledgeCategories>
<ul>
<li className="knowledge-category-li knowledge-category-li-selected">
<input
type="radio"
id="category-all"
value="user"
onChange={(e) => setCategory(e.target.value)}
hidden
/>
<label htmlFor="category-all">
{labels.knowledge_area_category_all}
</label>
</li>
{knowledgesCategories.map(({ uuid, name }) => (
<li className="knowledge-category-li" key={uuid}>
<input
type="radio"
id={`category-${name}`}
value={uuid}
onChange={(e) => setCategory(e.target.value)}
hidden
/>
<label htmlFor={`category-${name}`}>{name}</label>
</li>
))}
</ul>
</KnowledgeCategories>
</Col>
<Col className="px-0">
<KnowledgeSearch
onChange={handleInputChange}
placeholder={labels.search}
/>
<KnowledgeGrid className="mt-3">
{knowledges.length ? (
knowledges.map((knowledge, index) => (
<Item key={index} {...knowledge} />
))
) : (
<EmptySection
message={labels.error_no_record_matched_your_query}
/>
)}
</KnowledgeGrid>
<PaginationComponent
onChangePage={(newPage) => setCurrentPage(newPage)}
currentActivePage={currentPage}
pages={totalPages}
isRow
/>
</Col>
</Row>
</Container>
)
}
const Item = ({
link_delete,
link_view,
link_edit,
category,
description,
image,
title,
}) => {
return (
<WidgetLayout>
<a
href={link_view}
target="_blank"
className="knowledge-record-card-actions-view"
rel="noreferrer"
>
<img src={image} alt={`${title} image`} />
</a>
<div className="d-flex align-items-center justify-content-between">
{link_edit && (
<button data-link="{{>link_edit}}" className="btn-knowledge-edit">
<i className="fa fa-pencil" aria-hidden="true" />
</button>
)}
{link_delete && (
<button data-link="{{>link_delete}}" className="btn-knowledge-delete">
<i className="fa fa-trash" aria-hidden="true" />
</button>
)}
</div>
<h3>{category}</h3>
<a href={link_view} target="_blank" rel="noreferrer">
<h2>{title}</h2>
</a>
<p>{description}</p>
</WidgetLayout>
)
}
export default KnowledgeAreaPage