import React, { useState } from 'react'; import { Alert, AlertActionLink, ExpandableSection, List, ListItem, Pagination, Title, Toolbar, ToolbarContent, ToolbarItem, } from '@patternfly/react-core'; import { useFixupBPWithNotification as useFixupBlueprintMutation } from '../../Hooks'; import { useGetBlueprintQuery, useGetBlueprintsQuery, } from '../../store/backendApi'; import { selectBlueprintSearchInput, selectBlueprintVersionFilterAPI, selectSelectedBlueprintId, } from '../../store/BlueprintSlice'; import { useAppSelector } from '../../store/hooks'; import { BlueprintItem, Distributions, GetBlueprintComposesApiArg, useGetBlueprintComposesQuery, } 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'; 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); const blueprintVersionFilterAPI = useAppSelector( selectBlueprintVersionFilterAPI ); const searchParams: GetBlueprintComposesApiArg = { id: selectedBlueprintId as string, limit: perPage, offset: perPage * (page - 1), }; if (blueprintVersionFilterAPI) { searchParams.blueprintVersion = blueprintVersionFilterAPI; } const { data: blueprintsComposes, isFetching: isFetchingBlueprintsCompose, isSuccess: isSuccessBlueprintsCompose, } = useGetBlueprintComposesQuery(searchParams, { skip: !selectedBlueprintId, }); const { selectedBlueprintName, selectedBlueprintVersion } = useGetBlueprintsQuery( { search: blueprintSearchInput as string }, { 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) ); } }; const { data: blueprintDetails } = useGetBlueprintQuery( { id: selectedBlueprintId! }, { skip: !selectedBlueprintId } ); const { trigger: fixupBlueprint } = useFixupBlueprintMutation(); const hasErrors = blueprintDetails?.lint?.errors && blueprintDetails?.lint?.errors.length > 0; const [isLintExp, setIsLintExp] = React.useState(true); const onToggleLintExp = (_event: React.MouseEvent, isExpanded: boolean) => { setIsLintExp(isExpanded); }; return ( <> {itemCount > 0 && isBlueprintOutSync && ( setShowDiffModal(false)} /> )} {selectedBlueprintName ? `${selectedBlueprintName} images` : 'All images'} {hasErrors && ( { await fixupBlueprint({ id: selectedBlueprintId! }); }} id="blueprint_fix_errors_automatically" > Fix errors automatically (updates the blueprint) } > {blueprintDetails?.lint?.errors?.map((err) => ( {err.name}: {err.description} ))} )} {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;