src/pages/component-list/components/ComponentList/index.tsx (137 lines of code) (raw):
import { Router } from '@kinvolk/headlamp-plugin/lib';
import React from 'react';
import { useHistory } from 'react-router-dom';
import { EmptyList } from '../../../../components/EmptyList';
import { Table } from '../../../../components/Table';
import { CODEBASE_TYPES } from '../../../../constants/codebaseTypes';
import { Resources } from '../../../../icons/sprites/Resources';
import { CodebaseKubeObjectInterface } from '../../../../k8s/groups/EDP/Codebase/types';
import { useDialogContext } from '../../../../providers/Dialog/hooks';
import { ManageCodebaseDialog } from '../../../../widgets/dialogs/ManageCodebase';
import { routeGitServerList } from '../../../configuration/pages/gitservers/route';
import { usePageFilterContext } from '../../hooks/usePageFilterContext';
import { useTypedPermissions } from '../../hooks/useTypedPermissions';
import { useDynamicDataContext } from '../../providers/DynamicData/hooks';
import { ComponentMultiDeletion } from './components/ComponentMultiDeletion';
import { useColumns } from './hooks/useColumns';
import { useUpperColumns } from './hooks/useUpperColumns';
import { ComponentListProps } from './types';
export const ComponentList = ({ noGitServers }: ComponentListProps) => {
const columns = useColumns();
const { codebases } = useDynamicDataContext();
const gitServersConfigurationPageRoute = Router.createRouteURL(routeGitServerList.path);
const history = useHistory();
const { setDialog } = useDialogContext();
const { filterFunction } = usePageFilterContext();
const [selected, setSelected] = React.useState<string[]>([]);
const handleSelectAllClick = React.useCallback(
(event: React.ChangeEvent<HTMLInputElement>, paginatedItems: CodebaseKubeObjectInterface[]) => {
if (event.target.checked) {
const newSelected = paginatedItems
.map(({ metadata: { name }, spec: { type } }) =>
type === CODEBASE_TYPES.SYSTEM ? null : name
)
.filter(Boolean);
setSelected(newSelected);
return;
}
setSelected([]);
},
[]
);
const handleSelectRowClick = React.useCallback(
(event: React.MouseEvent<unknown>, row: CodebaseKubeObjectInterface) => {
const isSystemCodebase = row.spec.type === CODEBASE_TYPES.SYSTEM;
if (isSystemCodebase) {
return;
}
const name = row.metadata.name;
const selectedIndex = selected.indexOf(name);
let newSelected: string[] = [];
if (selectedIndex === -1) {
newSelected = newSelected.concat(selected, name);
} else if (selectedIndex === 0) {
newSelected = newSelected.concat(selected.slice(1));
} else if (selectedIndex === selected.length - 1) {
newSelected = newSelected.concat(selected.slice(0, -1));
} else if (selectedIndex > 0) {
newSelected = newSelected.concat(
selected.slice(0, selectedIndex),
selected.slice(selectedIndex + 1)
);
}
setSelected(newSelected);
},
[selected]
);
const [deleteDialogOpen, setDeleteDialogOpen] = React.useState(false);
const permissions = useTypedPermissions();
const upperColumns = useUpperColumns({
selected,
onUninstallClick: () => {
setDeleteDialogOpen(true);
},
permissions,
});
const renderEmptyListComponent = React.useCallback(() => {
const componentsAreLoaded = codebases.data !== null;
if (!permissions?.create?.Codebase.allowed) {
return <EmptyList customText={permissions?.create?.Codebase.reason} />;
}
if (componentsAreLoaded && noGitServers) {
return (
<EmptyList
customText={'No Git Servers Connected.'}
linkText={'Click here to add a Git Server.'}
handleClick={() => history.push(gitServersConfigurationPageRoute)}
/>
);
}
return (
<EmptyList
customText={"Let's kickstart the application onboarding!"}
linkText={'Click here to add a new application and integrate with the platform.'}
handleClick={() => {
setDialog(ManageCodebaseDialog, { codebaseData: null });
}}
/>
);
}, [
codebases.data,
gitServersConfigurationPageRoute,
history,
noGitServers,
permissions?.create?.Codebase.allowed,
permissions?.create?.Codebase.reason,
setDialog,
]);
return (
<>
<Resources />
<Table<CodebaseKubeObjectInterface>
isLoading={codebases.isLoading && (!codebases.errors || !codebases.errors.length)}
data={codebases.data}
errors={codebases.errors}
columns={columns}
upperColumns={upperColumns}
filterFunction={filterFunction}
handleSelectRowClick={handleSelectRowClick}
handleSelectAllClick={handleSelectAllClick}
selected={selected}
isSelected={(row) => selected.indexOf(row.metadata.name) !== -1}
canBeSelected={(row) => row.spec.type !== CODEBASE_TYPES.SYSTEM}
emptyListComponent={renderEmptyListComponent()}
/>
{deleteDialogOpen && (
<ComponentMultiDeletion
open={deleteDialogOpen}
handleClose={() => setDeleteDialogOpen(false)}
onDelete={() => {
setDeleteDialogOpen(false);
setSelected([]);
}}
components={codebases.data}
selected={selected}
/>
)}
</>
);
};