All files / modules/70-pipeline/components/RbacResourceModals/EnvironmentResourceModal EnvironmentResourceModal.tsx

91.67% Statements 22/24
72.73% Branches 48/66
80% Functions 4/5
95.65% Lines 22/23

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111              1x 1x 1x   1x     1x   1x 1x     1x 1x   1x                     1x 1x   1x                             1x 1x 1x   1x       1x 1x     1x   1x                                                                                     1x  
/*
 * Copyright 2021 Harness Inc. All rights reserved.
 * Use of this source code is governed by the PolyForm Shield 1.0.0 license
 * that can be found in the licenses directory at the root of this repository, also available at
 * https://polyformproject.org/wp-content/uploads/2020/06/PolyForm-Shield-1.0.0.txt.
 */
 
import React, { useState } from 'react'
import { Container, Layout, Text, Icon } from '@wings-software/uicore'
import { Color } from '@harness/design-system'
import type { CellProps, Renderer } from 'react-table'
import ResourceHandlerTable, {
  ResourceHandlerTableData
} from '@rbac/components/ResourceHandlerTable/ResourceHandlerTable'
import { PageSpinner } from '@common/components'
import type { RbacResourceModalProps } from '@rbac/factories/RbacFactory'
import { useStrings } from 'framework/strings'
import { EnvironmentResponseDTO, useGetEnvironmentList } from 'services/cd-ng'
 
// eslint-disable-next-line react/function-component-definition
const RenderColumnPipeline: Renderer<CellProps<EnvironmentResponseDTO>> = ({ row }) => {
  const rowdata = row.original
 
  return (
    <Layout.Vertical spacing="small" data-testid={rowdata.identifier}>
      <Text color={Color.GREY_800} iconProps={{ size: 16 }}>
        {rowdata.name}
      </Text>
      <Text color={Color.GREY_400}>{rowdata.description}</Text>
    </Layout.Vertical>
  )
}
 
// eslint-disable-next-line react/function-component-definition
const RenderEnvType: Renderer<CellProps<EnvironmentResponseDTO>> = ({ row }) => {
  const rowdata = row.original
 
  return (
    <Layout.Vertical spacing="small">
      <Text color={Color.GREY_800} iconProps={{ size: 16 }}>
        {rowdata.type}
      </Text>
    </Layout.Vertical>
  )
}
 
function EnvironmentResourceModal({
  searchTerm,
  onSelectChange,
  selectedData,
  resourceScope
}: RbacResourceModalProps): React.ReactElement {
  const { accountIdentifier, orgIdentifier = '', projectIdentifier = '' } = resourceScope
  const { getString } = useStrings()
  const [page, setPage] = useState(0)
 
  const { data: environmentsResponse, loading: isFetchingEnvironments } = useGetEnvironmentList({
    queryParams: { accountIdentifier, orgIdentifier, projectIdentifier, searchTerm, page, size: 10 }
  })
 
  const environmentsData = environmentsResponse?.data?.content?.map(
    environmentContent => environmentContent.environment
  )
 
  Iif (isFetchingEnvironments) return <PageSpinner />
 
  return environmentsData?.length ? (
    <Container>
      <ResourceHandlerTable
        data={environmentsData as ResourceHandlerTableData[]}
        selectedData={selectedData}
        columns={[
          {
            Header: getString('environment'),
            id: 'name',
            accessor: 'name' as any,
            Cell: RenderColumnPipeline,
            width: '60%',
            disableSortBy: true
          },
          {
            Header: getString('envType'),
            id: 'type',
            accessor: 'type',
            Cell: RenderEnvType,
            width: '20%',
            disableSortBy: true
          }
        ]}
        pagination={{
          itemCount: environmentsResponse?.data?.totalItems || 0,
          pageSize: environmentsResponse?.data?.pageSize || 10,
          pageCount: environmentsResponse?.data?.totalPages ?? 1,
          pageIndex: environmentsResponse?.data?.pageIndex ?? 0,
          gotoPage: pageNumber => setPage(pageNumber)
        }}
        onSelectChange={onSelectChange}
      />
    </Container>
  ) : (
    <Layout.Vertical flex={{ align: 'center-center' }} spacing="small">
      <Icon name="resources-icon" size={20} />
      <Text font="medium" color={Color.BLACK}>
        {getString('noData')}
      </Text>
    </Layout.Vertical>
  )
}
 
export default EnvironmentResourceModal