debian-image-builder-frontend/src/Components/ImagesTable/ImagesTableToolbar.tsx
Gianluca Zuccarelli 4125a9cd3b multiple: set pagination defaults
Set pagination defaults, otherwise these might be `undefined`.
2024-12-06 12:02:34 -06:00

194 lines
6 KiB
TypeScript

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<imagesTableToolbarProps> = ({
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 = (
<Pagination
itemCount={itemCount}
perPage={perPage}
page={page}
onSetPage={(_, page) => 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 (
<>
<DeleteBlueprintModal
setShowDeleteModal={setShowDeleteModal}
isOpen={showDeleteModal}
/>
{itemCount > 0 && isBlueprintOutSync && (
<BlueprintDiffModal
baseVersion={latestImageVersion}
blueprintName={selectedBlueprintName}
isOpen={showDiffModal}
onClose={() => setShowDiffModal(false)}
/>
)}
<Toolbar>
<ToolbarContent>
<Title headingLevel="h2">
{selectedBlueprintName
? `${selectedBlueprintName} images`
: 'All images'}
</Title>
</ToolbarContent>
{itemCount > 0 && isBlueprintOutSync && (
<Alert
style={{
margin:
'0 var(--pf-v5-c-toolbar__content--PaddingRight) 0 var(--pf-v5-c-toolbar__content--PaddingLeft)',
}}
isInline
title={`The selected blueprint is at version ${selectedBlueprintVersion}, the latest images are at version ${latestImageVersion}. Build images to synchronize with the latest version.`}
ouiaId="blueprint-out-of-sync-alert"
actionLinks={
<AlertActionLink
onClick={() => setShowDiffModal(true)}
id="blueprint_view_version_difference"
>
View the difference
</AlertActionLink>
}
/>
)}
{blueprintsComposes &&
blueprintsComposes.data.length > 0 &&
isBlueprintDistroCentos8() && (
<Alert
style={{
margin:
'0 var(--pf-v5-c-toolbar__content--PaddingRight) 0 var(--pf-v5-c-toolbar__content--PaddingLeft)',
}}
isInline
variant="warning"
title="CentOS Stream 8 is no longer supported, building images from this blueprint will fail. Edit blueprint to update the release to CentOS Stream 9."
ouiaId="centos-8-blueprint-alert"
/>
)}
<ToolbarContent>
{selectedBlueprintId && (
<>
<ToolbarItem>
<BlueprintVersionFilter onFilterChange={() => setPage(1)} />
</ToolbarItem>
<ToolbarItem>
<BuildImagesButton />
</ToolbarItem>
<ToolbarItem>
<EditBlueprintButton />
</ToolbarItem>
<ToolbarItem>
<BlueprintActionsMenu setShowDeleteModal={setShowDeleteModal} />
</ToolbarItem>
</>
)}
<ToolbarItem variant="pagination" align={{ default: 'alignRight' }}>
{pagination}
</ToolbarItem>
</ToolbarContent>
</Toolbar>
</>
);
};
export default ImagesTableToolbar;