import React, { useState } from 'react'; import { Alert, AlertActionLink, Pagination, Toolbar, ToolbarContent, ToolbarItem, Title, } from '@patternfly/react-core'; import { selectSelectedBlueprintId, selectBlueprintSearchInput, selectBlueprintVersionFilterAPI, } from '../../store/BlueprintSlice'; import { useAppSelector } from '../../store/hooks'; import { BlueprintItem, useGetBlueprintsQuery, useGetBlueprintComposesQuery, Distributions, } from '../../store/imageBuilderApi'; import { BlueprintActionsMenu } from '../Blueprints/BlueprintActionsMenu'; import BlueprintDiffModal from '../Blueprints/BlueprintDiffModal'; import BlueprintVersionFilter from '../Blueprints/BlueprintVersionFilter'; import { BuildImagesButton } from '../Blueprints/BuildImagesButton'; import { DeleteBlueprintModal } from '../Blueprints/DeleteBlueprintModal'; import { EditBlueprintButton } from '../Blueprints/EditBlueprintButton'; import { SEARCH_INPUT } from '../../constants'; interface imagesTableToolbarProps { itemCount: number; perPage: number; page: number; setPage: (page: number) => void; onPerPageSelect: (event: React.MouseEvent, perPage: number) => void; } const ImagesTableToolbar: React.FC = ({ itemCount, perPage, page, setPage, onPerPageSelect, }: imagesTableToolbarProps) => { const [showDeleteModal, setShowDeleteModal] = useState(false); const [showDiffModal, setShowDiffModal] = useState(false); const selectedBlueprintId = useAppSelector(selectSelectedBlueprintId); const blueprintSearchInput = useAppSelector(selectBlueprintSearchInput) || SEARCH_INPUT; const { data: blueprintsComposes, isFetching: isFetchingBlueprintsCompose, isSuccess: isSuccessBlueprintsCompose, } = useGetBlueprintComposesQuery( { id: selectedBlueprintId as string, limit: perPage, offset: perPage * (page - 1), blueprintVersion: useAppSelector(selectBlueprintVersionFilterAPI), }, { skip: !selectedBlueprintId } ); const { selectedBlueprintName, selectedBlueprintVersion } = useGetBlueprintsQuery( { search: blueprintSearchInput }, { selectFromResult: ({ data }) => { const bp = data?.data?.find( (blueprint: BlueprintItem) => blueprint.id === selectedBlueprintId ); return { selectedBlueprintName: bp?.name, selectedBlueprintVersion: bp?.version, }; }, } ); const latestImageVersion = blueprintsComposes?.data[0]?.blueprint_version; const isBlueprintOutSync = selectedBlueprintId && !isFetchingBlueprintsCompose && latestImageVersion !== selectedBlueprintVersion; const pagination = ( setPage(page)} onPerPageSelect={onPerPageSelect} widgetId="compose-pagination-top" data-testid="images-pagination-top" isCompact /> ); const isBlueprintDistroCentos8 = () => { if (isSuccessBlueprintsCompose) { return ( blueprintsComposes.data[0].request.distribution === ('centos-8' as Distributions) ); } }; return ( <> {itemCount > 0 && isBlueprintOutSync && ( setShowDiffModal(false)} /> )} {selectedBlueprintName ? `${selectedBlueprintName} images` : 'All images'} {itemCount > 0 && isBlueprintOutSync && ( setShowDiffModal(true)} id="blueprint_view_version_difference" > View the difference } /> )} {blueprintsComposes && blueprintsComposes.data.length > 0 && isBlueprintDistroCentos8() && ( )} {selectedBlueprintId && ( <> setPage(1)} /> )} {pagination} ); }; export default ImagesTableToolbar;