mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: cr overview title (#3516)
This commit is contained in:
		
							parent
							
								
									5d31d26530
								
							
						
					
					
						commit
						6874df66f0
					
				@ -1,32 +1,42 @@
 | 
			
		||||
import { Box } from '@mui/material';
 | 
			
		||||
import { FC } from 'react';
 | 
			
		||||
import React, { FC, useState } from 'react';
 | 
			
		||||
import { Typography, Tooltip } from '@mui/material';
 | 
			
		||||
import TimeAgo from 'react-timeago';
 | 
			
		||||
import { IChangeRequest } from 'component/changeRequest/changeRequest.types';
 | 
			
		||||
import { ChangeRequestStatusBadge } from 'component/changeRequest/ChangeRequestStatusBadge/ChangeRequestStatusBadge';
 | 
			
		||||
import {
 | 
			
		||||
    StyledPaper,
 | 
			
		||||
    StyledContainer,
 | 
			
		||||
    StyledHeader,
 | 
			
		||||
    StyledInnerContainer,
 | 
			
		||||
    StyledAvatar,
 | 
			
		||||
    StyledCard,
 | 
			
		||||
} from './ChangeRequestHeader.styles';
 | 
			
		||||
import { Separator } from '../../ChangeRequestSidebar/ChangeRequestSidebar';
 | 
			
		||||
import { ChangeRequestTitle } from '../../ChangeRequestSidebar/EnvironmentChangeRequest/ChangeRequestTitle';
 | 
			
		||||
 | 
			
		||||
export const ChangeRequestHeader: FC<{ changeRequest: IChangeRequest }> = ({
 | 
			
		||||
    changeRequest,
 | 
			
		||||
}) => {
 | 
			
		||||
    const [title, setTitle] = useState(changeRequest.title);
 | 
			
		||||
    return (
 | 
			
		||||
        <StyledPaper elevation={0}>
 | 
			
		||||
            <StyledContainer>
 | 
			
		||||
            <ChangeRequestTitle
 | 
			
		||||
                environmentChangeRequest={changeRequest}
 | 
			
		||||
                title={title}
 | 
			
		||||
                setTitle={setTitle}
 | 
			
		||||
            >
 | 
			
		||||
                <StyledHeader variant="h1" sx={{ mr: 1.5 }}>
 | 
			
		||||
                    Change request #{changeRequest.id}
 | 
			
		||||
                    {title}
 | 
			
		||||
                </StyledHeader>
 | 
			
		||||
                <ChangeRequestStatusBadge state={changeRequest.state} />
 | 
			
		||||
            </StyledContainer>
 | 
			
		||||
            </ChangeRequestTitle>
 | 
			
		||||
            <StyledInnerContainer>
 | 
			
		||||
                <Typography variant="body2" sx={{ margin: 'auto 0' }}>
 | 
			
		||||
                <ChangeRequestStatusBadge state={changeRequest.state} />
 | 
			
		||||
                <Typography
 | 
			
		||||
                    variant="body2"
 | 
			
		||||
                    sx={theme => ({
 | 
			
		||||
                        margin: theme.spacing('auto', 0, 'auto', 2),
 | 
			
		||||
                    })}
 | 
			
		||||
                >
 | 
			
		||||
                    Created{' '}
 | 
			
		||||
                    <TimeAgo
 | 
			
		||||
                        minPeriod={60}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
import React, { FC, useState } from 'react';
 | 
			
		||||
import { Box, Button, IconButton, styled } from '@mui/material';
 | 
			
		||||
import { Box, Button, IconButton, styled, Typography } from '@mui/material';
 | 
			
		||||
import Input from 'component/common/Input/Input';
 | 
			
		||||
import { IChangeRequest } from '../../changeRequest.types';
 | 
			
		||||
import { Edit } from '@mui/icons-material';
 | 
			
		||||
@ -14,12 +14,21 @@ const StyledBox = styled(Box)(({ theme }) => ({
 | 
			
		||||
    width: '100%',
 | 
			
		||||
    '& > div': { width: '100%' },
 | 
			
		||||
    justifyContent: 'space-between',
 | 
			
		||||
    marginBottom: theme.spacing(1),
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
export const EnvironmentChangeRequestTitle: FC<{
 | 
			
		||||
export const StyledHeader = styled(Typography)(({ theme }) => ({
 | 
			
		||||
    display: 'flex',
 | 
			
		||||
    alignItems: 'center',
 | 
			
		||||
    marginRight: theme.spacing(1),
 | 
			
		||||
    fontSize: theme.fontSizes.mainHeader,
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
export const ChangeRequestTitle: FC<{
 | 
			
		||||
    environmentChangeRequest: IChangeRequest;
 | 
			
		||||
}> = ({ environmentChangeRequest }) => {
 | 
			
		||||
    const [title, setTitle] = useState(environmentChangeRequest.title);
 | 
			
		||||
    title: string;
 | 
			
		||||
    setTitle: React.Dispatch<React.SetStateAction<string>>;
 | 
			
		||||
}> = ({ environmentChangeRequest, title, setTitle, children }) => {
 | 
			
		||||
    const [isDisabled, setIsDisabled] = useState(true);
 | 
			
		||||
    const { updateTitle } = useChangeRequestApi();
 | 
			
		||||
    const { setToastData, setToastApiError } = useToast();
 | 
			
		||||
@ -46,13 +55,19 @@ export const EnvironmentChangeRequestTitle: FC<{
 | 
			
		||||
    };
 | 
			
		||||
    return (
 | 
			
		||||
        <StyledBox>
 | 
			
		||||
            <Input
 | 
			
		||||
                label="Change request title"
 | 
			
		||||
                id="group-name"
 | 
			
		||||
                value={title}
 | 
			
		||||
                fullWidth
 | 
			
		||||
                onChange={e => setTitle(e.target.value)}
 | 
			
		||||
                disabled={isDisabled}
 | 
			
		||||
            <ConditionallyRender
 | 
			
		||||
                condition={isDisabled}
 | 
			
		||||
                show={children}
 | 
			
		||||
                elseShow={
 | 
			
		||||
                    <Input
 | 
			
		||||
                        label="Change request title"
 | 
			
		||||
                        id="group-name"
 | 
			
		||||
                        value={title}
 | 
			
		||||
                        fullWidth
 | 
			
		||||
                        onChange={e => setTitle(e.target.value)}
 | 
			
		||||
                        disabled={isDisabled}
 | 
			
		||||
                    />
 | 
			
		||||
                }
 | 
			
		||||
            />
 | 
			
		||||
            <ConditionallyRender
 | 
			
		||||
                condition={isDisabled}
 | 
			
		||||
@ -69,7 +84,7 @@ export const EnvironmentChangeRequestTitle: FC<{
 | 
			
		||||
                        <Button
 | 
			
		||||
                            variant="contained"
 | 
			
		||||
                            color="primary"
 | 
			
		||||
                            sx={theme => ({ marginLeft: theme.spacing(4) })}
 | 
			
		||||
                            sx={theme => ({ marginLeft: theme.spacing(2) })}
 | 
			
		||||
                            onClick={() => saveTitle()}
 | 
			
		||||
                        >
 | 
			
		||||
                            Save
 | 
			
		||||
@ -21,7 +21,8 @@ import {
 | 
			
		||||
import { CloudCircle } from '@mui/icons-material';
 | 
			
		||||
import { AddCommentField } from '../../ChangeRequestOverview/ChangeRequestComments/AddCommentField';
 | 
			
		||||
import { useAuthUser } from 'hooks/api/getters/useAuth/useAuthUser';
 | 
			
		||||
import { EnvironmentChangeRequestTitle } from './EnvironmentChangeRequestTitle';
 | 
			
		||||
import Input from 'component/common/Input/Input';
 | 
			
		||||
import { ChangeRequestTitle } from './ChangeRequestTitle';
 | 
			
		||||
 | 
			
		||||
const SubmitChangeRequestButton: FC<{ onClick: () => void; count: number }> = ({
 | 
			
		||||
    onClick,
 | 
			
		||||
@ -43,7 +44,7 @@ const ChangeRequestHeader = styled(Box)(({ theme }) => ({
 | 
			
		||||
}));
 | 
			
		||||
 | 
			
		||||
const ChangeRequestContent = styled(Box)(({ theme }) => ({
 | 
			
		||||
    padding: theme.spacing(0, 3, 3, 3),
 | 
			
		||||
    padding: theme.spacing(3, 3, 3, 3),
 | 
			
		||||
    border: '2px solid',
 | 
			
		||||
    mb: 5,
 | 
			
		||||
    borderColor: theme.palette.divider,
 | 
			
		||||
@ -62,6 +63,7 @@ export const EnvironmentChangeRequest: FC<{
 | 
			
		||||
    const navigate = useNavigate();
 | 
			
		||||
    const [commentText, setCommentText] = useState('');
 | 
			
		||||
    const { user } = useAuthUser();
 | 
			
		||||
    const [title, setTitle] = useState(environmentChangeRequest.title);
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <Box key={environmentChangeRequest.id}>
 | 
			
		||||
@ -94,9 +96,20 @@ export const EnvironmentChangeRequest: FC<{
 | 
			
		||||
                    </Box>
 | 
			
		||||
                </Box>
 | 
			
		||||
                <Divider sx={{ my: 3 }} />
 | 
			
		||||
                <EnvironmentChangeRequestTitle
 | 
			
		||||
                <ChangeRequestTitle
 | 
			
		||||
                    environmentChangeRequest={environmentChangeRequest}
 | 
			
		||||
                />
 | 
			
		||||
                    title={title}
 | 
			
		||||
                    setTitle={setTitle}
 | 
			
		||||
                >
 | 
			
		||||
                    <Input
 | 
			
		||||
                        label="Change request title"
 | 
			
		||||
                        id="group-name"
 | 
			
		||||
                        fullWidth
 | 
			
		||||
                        value={title}
 | 
			
		||||
                        onChange={() => {}}
 | 
			
		||||
                        disabled={true}
 | 
			
		||||
                    />
 | 
			
		||||
                </ChangeRequestTitle>
 | 
			
		||||
            </ChangeRequestHeader>
 | 
			
		||||
            <ChangeRequestContent>
 | 
			
		||||
                <Typography variant="body2" color="text.secondary">
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
import React from 'react';
 | 
			
		||||
import React, { FC, useState } from 'react';
 | 
			
		||||
import { screen } from '@testing-library/react';
 | 
			
		||||
import { EnvironmentChangeRequestTitle } from './EnvironmentChangeRequestTitle';
 | 
			
		||||
import { ChangeRequestTitle } from './ChangeRequestTitle';
 | 
			
		||||
import { ChangeRequestState } from '../../changeRequest.types';
 | 
			
		||||
import userEvent from '@testing-library/user-event';
 | 
			
		||||
import { testServerRoute, testServerSetup } from '../../../../utils/testServer';
 | 
			
		||||
@ -32,14 +32,25 @@ testServerRoute(
 | 
			
		||||
 | 
			
		||||
testServerRoute(server, '/api/admin/ui-config', {});
 | 
			
		||||
 | 
			
		||||
const TestComponent: FC = () => {
 | 
			
		||||
    const [title, setTitle] = useState(changeRequest.title);
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        <ChangeRequestTitle
 | 
			
		||||
            environmentChangeRequest={changeRequest}
 | 
			
		||||
            title={title}
 | 
			
		||||
            setTitle={setTitle}
 | 
			
		||||
        >
 | 
			
		||||
            <h1>{title}</h1>
 | 
			
		||||
        </ChangeRequestTitle>
 | 
			
		||||
    );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
test('can edit and save title', async () => {
 | 
			
		||||
    const user = userEvent.setup();
 | 
			
		||||
 | 
			
		||||
    render(
 | 
			
		||||
        <UIProviderContainer>
 | 
			
		||||
            <EnvironmentChangeRequestTitle
 | 
			
		||||
                environmentChangeRequest={changeRequest}
 | 
			
		||||
            />
 | 
			
		||||
            <TestComponent />
 | 
			
		||||
        </UIProviderContainer>
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
@ -53,6 +64,6 @@ test('can edit and save title', async () => {
 | 
			
		||||
    const saveButton = await screen.findByText('Save');
 | 
			
		||||
    await user.click(saveButton);
 | 
			
		||||
 | 
			
		||||
    const newTitle = await screen.findByDisplayValue('New title');
 | 
			
		||||
    const newTitle = await screen.findByText('New title');
 | 
			
		||||
    expect(newTitle).toBeInTheDocument();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user