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:
parent
b6f573c6b9
commit
cb316f012c
@ -270,6 +270,20 @@ exports[`returns all baseRoutes 1`] = `
|
|||||||
"title": "Release management",
|
"title": "Release management",
|
||||||
"type": "protected",
|
"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],
|
"component": [Function],
|
||||||
"enterprise": true,
|
"enterprise": true,
|
||||||
|
@ -48,6 +48,7 @@ import { Signals } from 'component/signals/Signals';
|
|||||||
import { LazyCreateProject } from '../project/Project/CreateProject/LazyCreateProject';
|
import { LazyCreateProject } from '../project/Project/CreateProject/LazyCreateProject';
|
||||||
import { PersonalDashboard } from '../personalDashboard/PersonalDashboard';
|
import { PersonalDashboard } from '../personalDashboard/PersonalDashboard';
|
||||||
import { ReleaseManagement } from 'component/releases/ReleaseManagement/ReleaseManagement';
|
import { ReleaseManagement } from 'component/releases/ReleaseManagement/ReleaseManagement';
|
||||||
|
import { CreateReleasePlanTemplate } from 'component/releases/ReleasePlanTemplate/CreateReleasePlanTemplate';
|
||||||
import { EditReleasePlanTemplate } from 'component/releases/ReleasePlanTemplate/EditReleasePlanTemplate';
|
import { EditReleasePlanTemplate } from 'component/releases/ReleasePlanTemplate/EditReleasePlanTemplate';
|
||||||
|
|
||||||
export const routes: IRoute[] = [
|
export const routes: IRoute[] = [
|
||||||
@ -281,6 +282,16 @@ export const routes: IRoute[] = [
|
|||||||
flag: 'releasePlans',
|
flag: 'releasePlans',
|
||||||
enterprise: true,
|
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',
|
path: '/release-management/edit/:templateId',
|
||||||
title: 'Edit release plan template',
|
title: 'Edit release plan template',
|
||||||
|
@ -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>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
@ -21,6 +21,24 @@ export const useReleasePlanTemplatesApi = () => {
|
|||||||
return makeRequest(req.caller, req.id);
|
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 (
|
const updateReleasePlanTemplate = async (
|
||||||
template: IReleasePlanTemplatePayload,
|
template: IReleasePlanTemplatePayload,
|
||||||
) => {
|
) => {
|
||||||
@ -41,6 +59,7 @@ export const useReleasePlanTemplatesApi = () => {
|
|||||||
return {
|
return {
|
||||||
deleteReleasePlanTemplate,
|
deleteReleasePlanTemplate,
|
||||||
updateReleasePlanTemplate,
|
updateReleasePlanTemplate,
|
||||||
|
createReleasePlanTemplate,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user