Skip to content
Snippets Groups Projects
patterns.tsx 4.79 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
  useDisclosure,
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'
brunoravera's avatar
brunoravera committed
import { RemovePatternButton } from './remove-pattern'
import { FaTrash } from 'react-icons/fa'
brunoravera's avatar
brunoravera committed
import { EditPatternModal } from './edit-pattern'
brunoravera's avatar
brunoravera committed
import { AddImplementationModal } 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) => (
brunoravera's avatar
brunoravera committed
                  <Tr key={`pattern-${pattern.name}-${index}`}>
brunoravera's avatar
brunoravera committed
                    <Td>
brunoravera's avatar
brunoravera committed
                      {/* @ts-ignore -- TODO */}
brunoravera's avatar
brunoravera committed
                      <Link to={routes.pattern({ id: pattern.id })}>
brunoravera's avatar
brunoravera committed
                        {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 }) => {
brunoravera's avatar
brunoravera committed
  const editPatternDisclosure = useDisclosure()
brunoravera's avatar
brunoravera committed
  const addImplementationDisclosure = useDisclosure()
brunoravera's avatar
brunoravera committed
  return (
brunoravera's avatar
brunoravera committed
    <>
      <HStack spacing="0">
brunoravera's avatar
brunoravera committed
        {/* @ts-ignore -- TODO */}
brunoravera's avatar
brunoravera committed
        <Link to={routes.pattern({ id: pattern.id })}>
brunoravera's avatar
brunoravera committed
          <Tooltip
            hasArrow
            shouldWrapChildren
            label={<Text>Ver detalles</Text>}
          >
brunoravera's avatar
brunoravera committed
            <IconButton
              aria-label="view pattern"
              variant="unstyled"
              icon={<Icon as={FaEye} />}
            />
          </Tooltip>
        </Link>
brunoravera's avatar
brunoravera committed

        <Tooltip
          hasArrow
          shouldWrapChildren
          label={<Text>Agregar implementacion</Text>}
        >
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
            onClick={addImplementationDisclosure.onOpen}
brunoravera's avatar
brunoravera committed
            icon={<Icon as={FaPlus} />}
          />
brunoravera's avatar
brunoravera committed
        </Tooltip>

        <Tooltip hasArrow shouldWrapChildren label={<Text>Editar</Text>}>
brunoravera's avatar
brunoravera committed
          <IconButton
            aria-label="edit pattern"
            variant="unstyled"
brunoravera's avatar
brunoravera committed
            onClick={editPatternDisclosure.onOpen}
brunoravera's avatar
brunoravera committed
            icon={<Icon as={FaEdit} />}
brunoravera's avatar
brunoravera committed
          />
        </Tooltip>
brunoravera's avatar
brunoravera committed
        <RemovePatternButton pattern={pattern} hasTooltip={true}>
          <IconButton
            aria-label="remove pattern"
            variant="unstyled"
            icon={<Icon as={FaTrash} />}
          />
        </RemovePatternButton>
      </HStack>
      {editPatternDisclosure.isOpen && (
        <EditPatternModal
          disclosure={editPatternDisclosure}
          pattern={pattern}
brunoravera's avatar
brunoravera committed
      )}
brunoravera's avatar
brunoravera committed
      {addImplementationDisclosure.isOpen && (
        <AddImplementationModal
          disclosure={addImplementationDisclosure}
          pattern={pattern}
        />
      )}
brunoravera's avatar
brunoravera committed
    </>
bruno's avatar
bruno committed
  )
}