1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-02-23 00:22:19 +01:00

feat: frontend initial page for creating release templates (#8732)

This commit is contained in:
David Leek 2024-11-13 11:03:19 +01:00 committed by GitHub
parent b6f573c6b9
commit cb316f012c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 146 additions and 0 deletions

View File

@ -270,6 +270,20 @@ exports[`returns all baseRoutes 1`] = `
"title": "Release management",
"type": "protected",
},
{
"component": [Function],
"enterprise": true,
"flag": "releasePlans",
"menu": {
"mode": [
"enterprise",
],
},
"parent": "/release-management",
"path": "/release-management/create-template",
"title": "Create release plan template",
"type": "protected",
},
{
"component": [Function],
"enterprise": true,

View File

@ -48,6 +48,7 @@ import { Signals } from 'component/signals/Signals';
import { LazyCreateProject } from '../project/Project/CreateProject/LazyCreateProject';
import { PersonalDashboard } from '../personalDashboard/PersonalDashboard';
import { ReleaseManagement } from 'component/releases/ReleaseManagement/ReleaseManagement';
import { CreateReleasePlanTemplate } from 'component/releases/ReleasePlanTemplate/CreateReleasePlanTemplate';
import { EditReleasePlanTemplate } from 'component/releases/ReleasePlanTemplate/EditReleasePlanTemplate';
export const routes: IRoute[] = [
@ -281,6 +282,16 @@ export const routes: IRoute[] = [
flag: 'releasePlans',
enterprise: true,
},
{
path: '/release-management/create-template',
title: 'Create release plan template',
parent: '/release-management',
component: CreateReleasePlanTemplate,
type: 'protected',
menu: { mode: ['enterprise'] },
flag: 'releasePlans',
enterprise: true,
},
{
path: '/release-management/edit/:templateId',
title: 'Edit release plan template',

View File

@ -0,0 +1,102 @@
import FormTemplate from 'component/common/FormTemplate/FormTemplate';
import { usePageTitle } from 'hooks/usePageTitle';
import { Button, styled } from '@mui/material';
import { TemplateForm } from './TemplateForm';
import { useTemplateForm } from '../hooks/useTemplateForm';
import { CreateButton } from 'component/common/CreateButton/CreateButton';
import { ADMIN } from '@server/types/permissions';
import { useNavigate } from 'react-router-dom';
import { GO_BACK } from 'constants/navigate';
import useReleasePlanTemplatesApi from 'hooks/api/actions/useReleasePlanTemplatesApi/useReleasePlanTemplatesApi';
import { scrollToTop } from 'component/common/util';
import useToast from 'hooks/useToast';
import { formatUnknownError } from 'utils/formatUnknownError';
import { useUiFlag } from 'hooks/useUiFlag';
const StyledForm = styled('form')(() => ({
display: 'flex',
flexDirection: 'column',
height: '100%',
}));
const StyledButtonContainer = styled('div')(() => ({
marginTop: 'auto',
display: 'flex',
justifyContent: 'flex-end',
}));
const StyledCancelButton = styled(Button)(({ theme }) => ({
marginLeft: theme.spacing(3),
}));
export const CreateReleasePlanTemplate = () => {
const releasePlansEnabled = useUiFlag('releasePlans');
usePageTitle('Create release plan template');
const { setToastApiError, setToastData } = useToast();
const navigate = useNavigate();
const { createReleasePlanTemplate } = useReleasePlanTemplatesApi();
const {
name,
setName,
description,
setDescription,
errors,
clearErrors,
validate,
getTemplatePayload,
} = useTemplateForm();
const handleCancel = () => {
navigate(GO_BACK);
};
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
clearErrors();
const isValid = validate();
if (isValid) {
const payload = getTemplatePayload();
try {
const template = await createReleasePlanTemplate(payload);
scrollToTop();
setToastData({
type: 'success',
title: 'Release plan template created',
});
navigate(`/release-management/edit/${template.id}`);
} catch (error: unknown) {
setToastApiError(formatUnknownError(error));
}
}
};
if (!releasePlansEnabled) {
return null;
}
return (
<>
<FormTemplate
title='Create release plan template'
description='Create a release plan template to make it easier for you and your team to release features.'
>
<StyledForm onSubmit={handleSubmit}>
<TemplateForm
name={name}
setName={setName}
description={description}
setDescription={setDescription}
errors={errors}
clearErrors={clearErrors}
/>
<StyledButtonContainer>
<CreateButton name='template' permission={ADMIN} />
<StyledCancelButton onClick={handleCancel}>
Cancel
</StyledCancelButton>
</StyledButtonContainer>
</StyledForm>
</FormTemplate>
</>
);
};

View File

@ -21,6 +21,24 @@ export const useReleasePlanTemplatesApi = () => {
return makeRequest(req.caller, req.id);
};
const createReleasePlanTemplate = async (
template: IReleasePlanTemplatePayload,
): Promise<IReleasePlanTemplatePayload> => {
const requestId = 'createReleasePlanTemplate';
const path = 'api/admin/release-plan-templates';
const req = createRequest(
path,
{
method: 'POST',
body: JSON.stringify(template),
},
requestId,
);
const res = await makeRequest(req.caller, req.id);
return res.json();
};
const updateReleasePlanTemplate = async (
template: IReleasePlanTemplatePayload,
) => {
@ -41,6 +59,7 @@ export const useReleasePlanTemplatesApi = () => {
return {
deleteReleasePlanTemplate,
updateReleasePlanTemplate,
createReleasePlanTemplate,
};
};