Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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