mirror of
https://github.com/Unleash/unleash.git
synced 2025-04-19 01:17:18 +02:00
- reorganized dashboard components - added share link - health chart aggregated data - refactored chart placeholders
115 lines
3.3 KiB
TypeScript
115 lines
3.3 KiB
TypeScript
import { ComponentProps, Dispatch, SetStateAction, VFC } from 'react';
|
|
import { Autocomplete, SxProps, TextField } from '@mui/material';
|
|
import { renderOption } from 'component/playground/Playground/PlaygroundForm/renderOption';
|
|
import useProjects from 'hooks/api/getters/useProjects/useProjects';
|
|
|
|
interface IOption {
|
|
label: string;
|
|
id: string;
|
|
}
|
|
|
|
export const allOption = { label: 'ALL', id: '*' };
|
|
|
|
interface IProjectSelectProps {
|
|
selectedProjects: string[];
|
|
onChange:
|
|
| Dispatch<SetStateAction<string[]>>
|
|
| ((projects: string[]) => void);
|
|
dataTestId?: string;
|
|
sx?: SxProps;
|
|
disabled?: boolean;
|
|
}
|
|
|
|
function findAllIndexes(arr: string[], name: string): number[] {
|
|
const indexes: number[] = [];
|
|
arr.forEach((currentValue, index) => {
|
|
if (currentValue === name) {
|
|
indexes.push(index);
|
|
}
|
|
});
|
|
return indexes;
|
|
}
|
|
|
|
export const ProjectSelect: VFC<IProjectSelectProps> = ({
|
|
selectedProjects,
|
|
onChange,
|
|
dataTestId,
|
|
sx,
|
|
disabled,
|
|
}) => {
|
|
const { projects: availableProjects } = useProjects();
|
|
|
|
const projectNames = availableProjects.map(({ name }) => name);
|
|
|
|
const projectsOptions = [
|
|
allOption,
|
|
...availableProjects.map(({ name, id }) => {
|
|
const indexes = findAllIndexes(projectNames, name);
|
|
const isDuplicate = indexes.length > 1;
|
|
|
|
return {
|
|
label: isDuplicate ? `${name} - (${id})` : name,
|
|
id,
|
|
};
|
|
}),
|
|
];
|
|
|
|
const isAllProjects =
|
|
selectedProjects &&
|
|
(selectedProjects.length === 0 ||
|
|
(selectedProjects.length === 1 && selectedProjects[0] === '*'));
|
|
|
|
const onProjectsChange: ComponentProps<typeof Autocomplete>['onChange'] = (
|
|
event,
|
|
value,
|
|
reason,
|
|
) => {
|
|
const newProjects = value as IOption | IOption[];
|
|
if (reason === 'clear' || newProjects === null) {
|
|
return onChange([allOption.id]);
|
|
}
|
|
if (Array.isArray(newProjects)) {
|
|
if (newProjects.length === 0) {
|
|
return onChange([allOption.id]);
|
|
}
|
|
if (
|
|
newProjects.find(({ id }) => id === allOption.id) !== undefined
|
|
) {
|
|
return onChange([allOption.id]);
|
|
}
|
|
return onChange(newProjects.map(({ id }) => id));
|
|
}
|
|
if (newProjects.id === allOption.id) {
|
|
return onChange([allOption.id]);
|
|
}
|
|
|
|
return onChange([newProjects.id]);
|
|
};
|
|
|
|
return (
|
|
<Autocomplete
|
|
disablePortal
|
|
id='projects'
|
|
limitTags={3}
|
|
multiple={!isAllProjects}
|
|
options={projectsOptions}
|
|
sx={sx}
|
|
renderInput={(params) => <TextField {...params} label='Projects' />}
|
|
renderOption={renderOption}
|
|
getOptionLabel={({ label }) => label}
|
|
disableCloseOnSelect
|
|
size='small'
|
|
disabled={disabled}
|
|
value={
|
|
isAllProjects
|
|
? allOption
|
|
: projectsOptions.filter(({ id }) =>
|
|
selectedProjects.includes(id),
|
|
)
|
|
}
|
|
onChange={onProjectsChange}
|
|
data-testid={dataTestId ? dataTestId : 'PROJECT_SELECT'}
|
|
/>
|
|
);
|
|
};
|