mirror of
https://github.com/Unleash/unleash.git
synced 2025-04-01 01:18:10 +02:00
* refactor: update mui packages * refactor: run mui codemods * refactor: format files after codemods * refactor: fix broken types * refactor: clean up theme * refactor: fix broken tests * refactor: replace @mui/styles with tss-react * refactor: move breakpoints into classes for tss * refactor: fix crash on missing feature description * refactor: remove void classNames * refactor: adjust styles to new defaults * refactor: remove broken rollout slider e2e test * refactor: fix duplicate e2e testid * refactor: update makeStyles after rebase * refactor: add missing snapshot after rebase * refactor: fix TableCellSortable focus styles * refactor: use 1.4 as the default line-height * refactor: hide webkit search field icons * refactor: fix select box label * refactor: make AutocompleteBox smaller * refactor: make heading smaller * refactor: fix toast close icon color * refactor: update snapshots * refactor: add missing test event awaits * refactor: fix default button line-height
75 lines
2.3 KiB
TypeScript
75 lines
2.3 KiB
TypeScript
import React, { MouseEventHandler, useMemo, VFC } from 'react';
|
|
import { MenuItem, Typography } from '@mui/material';
|
|
import DropdownMenu, { IDropdownMenuProps } from '../DropdownMenu/DropdownMenu';
|
|
import useProjects from 'hooks/api/getters/useProjects/useProjects';
|
|
import { IProjectCard } from 'interfaces/project';
|
|
|
|
const ALL_PROJECTS = { id: '*', name: '> All projects' };
|
|
|
|
interface IProjectSelectProps {
|
|
currentProjectId: string;
|
|
updateCurrentProject: (id: string) => void;
|
|
}
|
|
|
|
const ProjectSelect: VFC<IProjectSelectProps & Partial<IDropdownMenuProps>> = ({
|
|
currentProjectId,
|
|
updateCurrentProject,
|
|
...rest
|
|
}) => {
|
|
const { projects } = useProjects();
|
|
|
|
const setProject = (value?: string | null) => {
|
|
const id = value && typeof value === 'string' ? value.trim() : '*';
|
|
updateCurrentProject(id);
|
|
};
|
|
|
|
const currentProject = useMemo(() => {
|
|
const project = projects.find(i => i.id === currentProjectId);
|
|
return project || ALL_PROJECTS;
|
|
}, [currentProjectId, projects]);
|
|
|
|
const handleChangeProject: MouseEventHandler = event => {
|
|
const target = (event.target as Element).getAttribute('data-target');
|
|
setProject(target);
|
|
};
|
|
|
|
const renderProjectItem = (selectedId: string, item: IProjectCard) => (
|
|
<MenuItem
|
|
disabled={selectedId === item.id}
|
|
data-target={item.id}
|
|
key={item.id}
|
|
style={{ fontSize: '14px' }}
|
|
>
|
|
{item.name}
|
|
</MenuItem>
|
|
);
|
|
|
|
const renderProjectOptions = () => [
|
|
<MenuItem
|
|
disabled={currentProject === ALL_PROJECTS}
|
|
data-target={ALL_PROJECTS.id}
|
|
key={ALL_PROJECTS.id}
|
|
>
|
|
<Typography variant="body2">{ALL_PROJECTS.name}</Typography>
|
|
</MenuItem>,
|
|
...projects.map(project =>
|
|
renderProjectItem(currentProjectId, project)
|
|
),
|
|
];
|
|
|
|
return (
|
|
<React.Fragment>
|
|
<DropdownMenu
|
|
id={'project'}
|
|
title="Select project"
|
|
label={`${currentProject.name}`}
|
|
callback={handleChangeProject}
|
|
renderOptions={renderProjectOptions}
|
|
{...rest}
|
|
/>
|
|
</React.Fragment>
|
|
);
|
|
};
|
|
|
|
export default ProjectSelect;
|