2023-06-22 21:11:10 +07:00
import { useMemo , useState } from 'react' ;
import { useTags } from '@/portainer/tags/queries' ;
2024-06-02 15:43:37 +03:00
import { useGroups } from '@/react/portainer/environments/environment-groups/queries' ;
2023-06-22 21:11:10 +07:00
import { EnvironmentsQueryParams } from '@/react/portainer/environments/environment.service' ;
2024-06-02 15:43:37 +03:00
import { useEnvironmentList } from '@/react/portainer/environments/queries' ;
2025-03-28 15:16:05 +01:00
import { EdgeTypes , Environment } from '@/react/portainer/environments/types' ;
2023-06-22 21:11:10 +07:00
import { AutomationTestingProps } from '@/types' ;
2025-03-28 15:16:05 +01:00
import {
columns ,
DecoratedEnvironment ,
} from '@/react/edge/components/associationTableColumnHelper' ;
2023-06-22 21:11:10 +07:00
import { Datatable , TableRow } from '@@/datatables' ;
2024-06-02 15:43:37 +03:00
import { useTableStateWithoutStorage } from '@@/datatables/useTableState' ;
2023-06-22 21:11:10 +07:00
export function EdgeGroupAssociationTable ( {
title ,
query ,
2024-06-02 15:43:37 +03:00
onClickRow = ( ) = > { } ,
2025-03-28 15:16:05 +01:00
addEnvironments = [ ] ,
excludeEnvironments = [ ] ,
2023-06-22 21:11:10 +07:00
'data-cy' : dataCy ,
} : {
title : string ;
query : EnvironmentsQueryParams ;
2024-06-02 15:43:37 +03:00
onClickRow ? : ( env : Environment ) = > void ;
2025-03-28 15:16:05 +01:00
addEnvironments? : Environment [ ] ;
excludeEnvironments? : Environment [ ] ;
2023-06-22 21:11:10 +07:00
} & AutomationTestingProps ) {
const tableState = useTableStateWithoutStorage ( 'Name' ) ;
2023-08-22 09:36:31 +03:00
const [ page , setPage ] = useState ( 0 ) ;
2023-06-22 21:11:10 +07:00
const environmentsQuery = useEnvironmentList ( {
pageLimit : tableState.pageSize ,
2023-08-22 09:36:31 +03:00
page : page + 1 ,
2023-06-22 21:11:10 +07:00
search : tableState.search ,
2023-09-04 10:33:07 +01:00
sort : tableState.sortBy?.id as 'Group' | 'Name' ,
order : tableState.sortBy?.desc ? 'desc' : 'asc' ,
2025-03-28 15:16:05 +01:00
types : EdgeTypes ,
excludeIds : excludeEnvironments?.map ( ( env ) = > env . Id ) ,
2023-06-22 21:11:10 +07:00
. . . query ,
} ) ;
2025-03-28 15:16:05 +01:00
2023-06-22 21:11:10 +07:00
const groupsQuery = useGroups ( {
enabled : environmentsQuery.environments.length > 0 ,
} ) ;
const tagsQuery = useTags ( {
enabled : environmentsQuery.environments.length > 0 ,
} ) ;
2025-03-28 15:16:05 +01:00
const memoizedEnvironments : Array < DecoratedEnvironment > = useMemo (
2023-06-22 21:11:10 +07:00
( ) = >
2023-08-16 12:24:37 +03:00
environmentsQuery . environments . map ( ( env ) = > ( {
. . . env ,
Group : groupsQuery.data?.find ( ( g ) = > g . Id === env . GroupId ) ? . Name || '' ,
Tags : env.TagIds.map (
( tagId ) = > tagsQuery . data ? . find ( ( t ) = > t . ID === tagId ) ? . Name || ''
) ,
} ) ) ,
[ environmentsQuery . environments , groupsQuery . data , tagsQuery . data ]
2023-06-22 21:11:10 +07:00
) ;
2023-08-16 12:24:37 +03:00
const { totalCount } = environmentsQuery ;
2023-06-22 21:11:10 +07:00
2025-03-28 15:16:05 +01:00
const memoizedAddEnvironments : Array < DecoratedEnvironment > = useMemo (
( ) = >
addEnvironments . map ( ( env ) = > ( {
. . . env ,
Group : groupsQuery.data?.find ( ( g ) = > g . Id === env . GroupId ) ? . Name || '' ,
Tags : env.TagIds.map (
( tagId ) = > tagsQuery . data ? . find ( ( t ) = > t . ID === tagId ) ? . Name || ''
) ,
} ) ) ,
[ addEnvironments , groupsQuery . data , tagsQuery . data ]
) ;
// Filter out environments that are already in the table, this is to prevent duplicates, which can happen when an environment is associated and then disassociated
const filteredAddEnvironments = memoizedAddEnvironments . filter (
( env ) = > ! memoizedEnvironments . some ( ( e ) = > e . Id === env . Id )
) ;
2023-06-22 21:11:10 +07:00
return (
< Datatable < DecoratedEnvironment >
title = { title }
columns = { columns }
settingsManager = { tableState }
2025-03-28 15:16:05 +01:00
dataset = { memoizedEnvironments . concat ( filteredAddEnvironments ) }
2023-08-22 09:36:31 +03:00
isServerSidePagination
page = { page }
2023-06-22 21:11:10 +07:00
onPageChange = { setPage }
2023-08-22 09:36:31 +03:00
totalCount = { totalCount }
2023-06-22 21:11:10 +07:00
renderRow = { ( row ) = > (
< TableRow < DecoratedEnvironment >
cells = { row . getVisibleCells ( ) }
onClick = { ( ) = > onClickRow ( row . original ) }
/ >
) }
data - cy = { dataCy }
disableSelect
/ >
) ;
}