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

brunoravera's avatar
brunoravera committed
import {
  Text,
  TableContainer,
  Table,
  TableCaption,
  Thead,
  Tr,
  Th,
  Tbody,
  Td,
  Tooltip,
  HStack,
  IconButton,
  Icon,
brunoravera's avatar
brunoravera committed
  VStack,
  Button,
brunoravera's avatar
brunoravera committed
  useDisclosure,
brunoravera's avatar
brunoravera committed
} from '@chakra-ui/react'
brunoravera's avatar
brunoravera committed
import { FaEdit, FaPlay, FaTrash, FaVial } from 'react-icons/fa'
brunoravera's avatar
brunoravera committed

brunoravera's avatar
brunoravera committed
import { Implementation, Pattern } from 'src/models'
brunoravera's avatar
brunoravera committed
import { GetPatternQuery } from '../patterns/query-builder'
brunoravera's avatar
brunoravera committed
import { GetImplementationsByPatternIdQuery } from './query-builder/get-implementations-by-pattern-id-query'
brunoravera's avatar
brunoravera committed
import { DateUtils } from 'src/utils/date-utils'
brunoravera's avatar
brunoravera committed
import { AddImplementationButton } from './add-implementation'
brunoravera's avatar
brunoravera committed
import { RunTestsButton } from './run-tests'
brunoravera's avatar
brunoravera committed
import { DeleteImplementationMutation } from './query-builder/delete-implementation-mutation'
import { useQueryClient } from 'react-query'
brunoravera's avatar
brunoravera committed
import { navigate, routes } from '@redwoodjs/router'
brunoravera's avatar
brunoravera committed
import { EditImplementationModal } from './edit-implementation'
brunoravera's avatar
brunoravera committed

brunoravera's avatar
brunoravera committed
const tableHeaders = [
  'Nombre',
  ' Imagen',
  'Descripcion',
  'Fecha de creacion',
  '',
]
brunoravera's avatar
brunoravera committed

export type ImplementationsProps = {
  patternId: Pattern['id']
}
export const Implementations: React.FC<ImplementationsProps> = ({
  patternId,
}) => {
brunoravera's avatar
brunoravera committed
  const queryClient = useQueryClient()
brunoravera's avatar
brunoravera committed
  const patternQuery = GetPatternQuery.useQuery({ id: patternId })
brunoravera's avatar
brunoravera committed
  const implementationsQuery = GetImplementationsByPatternIdQuery.useQuery({
    patternId,
  })
brunoravera's avatar
brunoravera committed
  const tableCaption =
brunoravera's avatar
brunoravera committed
    implementationsQuery.data?.length === 0
      ? `No hay implementaciones disponibles de ${patternQuery.data?.name}`
      : `Implementaciones disponibles de ${patternQuery.data?.name}`
brunoravera's avatar
brunoravera committed
  const deleteImplementationMutation = DeleteImplementationMutation.useMutation(
    {
      onSuccess: () => {
        queryClient.invalidateQueries(
          GetImplementationsByPatternIdQuery.getKey({ patternId })
        )
      },
    }
  )

  const onDeleteImplementation = (id: Implementation['id']) => {
    deleteImplementationMutation.mutate({ id })
  }

brunoravera's avatar
brunoravera committed
  const onViewReports = (id: Implementation['id']) => {
    navigate(routes.reports({ implementationId: id }))
  }

brunoravera's avatar
brunoravera committed
  return (
brunoravera's avatar
brunoravera committed
    <VStack spacing="2">
      <TableContainer>
        <Table variant="striped" size="lg" minW="80vw">
          <TableCaption>{tableCaption}</TableCaption>
          <Thead>
            <Tr>
              {tableHeaders.map((header, index) => (
                <Th key={`th-${index}`}>{header}</Th>
              ))}
brunoravera's avatar
brunoravera committed
            </Tr>
brunoravera's avatar
brunoravera committed
          </Thead>
          <Tbody>
            {implementationsQuery.data?.map((implementation, index) => (
              <Tr key={`implementation-${implementation.name}-${index}`}>
                <Td>{implementation.name}</Td>
brunoravera's avatar
brunoravera committed
                <Td>{implementation.dockerhubImageName}</Td>
brunoravera's avatar
brunoravera committed
                <Td>
                  <Tooltip label={implementation.description} hasArrow>
                    <Text isTruncated maxW="sm">
                      {implementation.description}
                    </Text>
                  </Tooltip>
                </Td>
                <Td>
                  {DateUtils.formatLocalDateTime(implementation.createdDate)}
                </Td>
                <Td>
brunoravera's avatar
brunoravera committed
                  <ActionsRow
                    implementation={implementation}
                    pattern={patternQuery.data}
brunoravera's avatar
brunoravera committed
                    handleOnDeleteImplementation={onDeleteImplementation}
brunoravera's avatar
brunoravera committed
                    handleOnViewReport={onViewReports}
brunoravera's avatar
brunoravera committed
                  />
brunoravera's avatar
brunoravera committed
                </Td>
              </Tr>
            ))}
          </Tbody>
        </Table>
      </TableContainer>
      <HStack w="full" justifyContent="flex-end">
        {patternQuery.data && (
          <AddImplementationButton
            pattern={patternQuery.data}
            hasTooltip={true}
          >
            <Button variant="solid" colorScheme="blue">
brunoravera's avatar
brunoravera committed
              Crear Implementacion
brunoravera's avatar
brunoravera committed
            </Button>
          </AddImplementationButton>
        )}
      </HStack>
    </VStack>
brunoravera's avatar
brunoravera committed
  )
}
type ActionsRowProps = {
brunoravera's avatar
brunoravera committed
  implementation: Implementation
  pattern: Pattern
brunoravera's avatar
brunoravera committed
  handleOnDeleteImplementation: (id: Implementation['id']) => void
brunoravera's avatar
brunoravera committed
  handleOnViewReport: (id: Implementation['id']) => void
brunoravera's avatar
brunoravera committed
const ActionsRow: React.FC<ActionsRowProps> = ({
  implementation,
  pattern,
  handleOnDeleteImplementation,
brunoravera's avatar
brunoravera committed
  handleOnViewReport,
brunoravera's avatar
brunoravera committed
}) => {
brunoravera's avatar
brunoravera committed
  const editImplementationDisclosure = useDisclosure()

bruno's avatar
bruno committed
  return (
brunoravera's avatar
brunoravera committed
    <>
      <HStack>
        <Tooltip shouldWrapChildren hasArrow label={<Text>Editar</Text>}>
          <IconButton
            aria-label="edit implementation"
            variant="unstyled"
            onClick={() => editImplementationDisclosure.onOpen()}
            icon={<Icon as={FaEdit} />}
          />
        </Tooltip>
        <RunTestsButton
          implementation={implementation}
          pattern={pattern}
          hasTooltip
        >
          <IconButton
            aria-label="test implementation"
            variant="unstyled"
            icon={<Icon as={FaPlay} />}
          />
        </RunTestsButton>
        <Tooltip
          shouldWrapChildren
          hasArrow
          label={<Text>Eliminar implementacion</Text>}
        >
          <IconButton
            onClick={() => handleOnDeleteImplementation(implementation.id)}
            aria-label="delete implementation"
            variant="unstyled"
            icon={<Icon as={FaTrash} />}
          />
        </Tooltip>
        <Tooltip shouldWrapChildren hasArrow label={<Text>Ver reportes</Text>}>
          <IconButton
            onClick={() => handleOnViewReport(implementation.id)}
            aria-label="view reports"
            variant="unstyled"
            icon={<Icon as={FaVial} />}
          />
        </Tooltip>
      </HStack>
      {editImplementationDisclosure.isOpen && (
        <EditImplementationModal
          disclosure={editImplementationDisclosure}
          implementation={implementation}
          patternId={pattern.id}
brunoravera's avatar
brunoravera committed
        />
brunoravera's avatar
brunoravera committed
      )}
    </>
bruno's avatar
bruno committed
  )
}