Skip to content
Snippets Groups Projects
patterns.tsx 3.9 KiB
Newer Older
bruno's avatar
bruno committed
import React from 'react'

brunoravera's avatar
brunoravera committed
import {
  VStack,
  TableContainer,
  Table,
  Thead,
  Tr,
  Th,
  Tbody,
  Td,
  Text,
  TableCaption,
  Tooltip,
  HStack,
  Icon,
  IconButton,
brunoravera's avatar
brunoravera committed
  Spinner,
brunoravera's avatar
brunoravera committed
} from '@chakra-ui/react'
brunoravera's avatar
brunoravera committed
import { FaEdit, FaEye, FaPlus } from 'react-icons/fa'
brunoravera's avatar
brunoravera committed
import { match } from 'ts-pattern'

brunoravera's avatar
brunoravera committed
import { Link, routes } from '@redwoodjs/router'
brunoravera's avatar
brunoravera committed

brunoravera's avatar
brunoravera committed
import { Pattern } from 'src/models'
brunoravera's avatar
brunoravera committed

brunoravera's avatar
brunoravera committed
import { AddPatternButton } from './add-pattern'
brunoravera's avatar
brunoravera committed
import { GetPatternsQuery } from './query-builder'
import { RemovePatternButton } from './remove-pattern'
import { FaTrash } from 'react-icons/fa'
import { AddImplementationButton } from '../implementations/add-implementation'
brunoravera's avatar
brunoravera committed
const tableHeaders = ['Nombre', 'Descripcion', '']
bruno's avatar
bruno committed

brunoravera's avatar
brunoravera committed
export const Patterns: React.FC = () => {
  const patternsQuery = GetPatternsQuery.useQuery({})

bruno's avatar
bruno committed
  return (
brunoravera's avatar
brunoravera committed
    <VStack alignItems="flex-start" spacing="2">
brunoravera's avatar
brunoravera committed
      <Text fontWeight="bold" fontSize="x-large" px="1">
bruno's avatar
bruno committed
        Patrones
brunoravera's avatar
brunoravera committed
      </Text>
brunoravera's avatar
brunoravera committed
      <TableContainer>
brunoravera's avatar
brunoravera committed
        <Table variant="striped" size="lg" minW="80vw">
brunoravera's avatar
brunoravera committed
          <TableCaption>Patrones disponibles</TableCaption>
          <Thead>
            <Tr>
              {tableHeaders.map((header, index) => (
brunoravera's avatar
brunoravera committed
                <Th color="gray.500" key={`th-${index}`}>
                  {header}
                </Th>
brunoravera's avatar
brunoravera committed
              ))}
            </Tr>
          </Thead>
          <Tbody>
brunoravera's avatar
brunoravera committed
            {match(patternsQuery)
              .with({ status: 'success', data: [] }, () => (
                <Text>No se encontraron patrones</Text>
              ))
              .with({ status: 'success' }, ({ data }) =>
                data.map((pattern, index) => (
                  <Tr key={`pattern-${pattern.name}-${index}`}>
brunoravera's avatar
brunoravera committed
                    <Td>
                      <Link to={routes.pattern({ id: pattern.id })}>
                        {pattern.name}
brunoravera's avatar
brunoravera committed
                      </Link>
                    </Td>
                    <Td>
                      <Tooltip label={pattern.description} hasArrow>
                        <Text isTruncated maxW="sm">
                          {pattern.description}
                        </Text>
                      </Tooltip>
                    </Td>
brunoravera's avatar
brunoravera committed

brunoravera's avatar
brunoravera committed
                    <Td>
                      <ActionsRow pattern={pattern} />
                    </Td>
                  </Tr>
                ))
              )
brunoravera's avatar
brunoravera committed
              .with({ status: 'loading' }, () => (
                <Tr>
                  <Td colSpan={tableHeaders.length}>
                    <HStack justifyContent="center">
                      <Spinner />
                    </HStack>
                  </Td>
                </Tr>
              ))
brunoravera's avatar
brunoravera committed
              .otherwise(() => null)}
brunoravera's avatar
brunoravera committed
          </Tbody>
        </Table>
      </TableContainer>
brunoravera's avatar
brunoravera committed
      <HStack w="full" justifyContent="flex-end">
        <AddPatternButton />
      </HStack>
brunoravera's avatar
brunoravera committed
    </VStack>
  )
}

type ActionsRowProps = {
  pattern: Pattern
}
const ActionsRow: React.FC<ActionsRowProps> = ({ pattern }) => {
  return (
brunoravera's avatar
brunoravera committed
    <HStack spacing="0">
brunoravera's avatar
brunoravera committed
      <Link to={routes.pattern({ id: pattern.id })}>
brunoravera's avatar
brunoravera committed
        <Tooltip label={<Text>Ver detalles</Text>}>
          <IconButton
            aria-label="view pattern"
            variant="unstyled"
            icon={<Icon as={FaEye} />}
          />
        </Tooltip>
      </Link>
      <AddImplementationButton pattern={pattern} hasTooltip={true}>
brunoravera's avatar
brunoravera committed
        <IconButton
brunoravera's avatar
brunoravera committed
          aria-label="add implementation"
brunoravera's avatar
brunoravera committed
          variant="unstyled"
brunoravera's avatar
brunoravera committed
          icon={<Icon as={FaPlus} />}
      </AddImplementationButton>
brunoravera's avatar
brunoravera committed
      <Tooltip label={<Text>Editar patron</Text>}>
        <IconButton
          aria-label="edit pattern"
          variant="unstyled"
          icon={<Icon as={FaEdit} />}
        />
      </Tooltip>
      <RemovePatternButton pattern={pattern} hasTooltip={true}>
        <IconButton
          aria-label="remove pattern"
          variant="unstyled"
          icon={<Icon as={FaTrash} />}
        />
      </RemovePatternButton>
brunoravera's avatar
brunoravera committed
    </HStack>
bruno's avatar
bruno committed
  )
}