Skip to content

Commit bec6a26

Browse files
authored
fix: re-add original create template context menu (coder#14326)
1 parent 8c4d726 commit bec6a26

File tree

4 files changed

+105
-18
lines changed

4 files changed

+105
-18
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { Meta, StoryObj } from "@storybook/react";
2+
import { screen, userEvent } from "@storybook/test";
3+
import { CreateTemplateButton } from "./CreateTemplateButton";
4+
5+
const meta: Meta<typeof CreateTemplateButton> = {
6+
title: "pages/TemplatesPage/CreateTemplateButton",
7+
component: CreateTemplateButton,
8+
};
9+
10+
export default meta;
11+
type Story = StoryObj<typeof CreateTemplateButton>;
12+
13+
export const Close: Story = {};
14+
15+
export const Open: Story = {
16+
play: async ({ step }) => {
17+
const user = userEvent.setup();
18+
await step("click on trigger", async () => {
19+
await user.click(screen.getByRole("button"));
20+
});
21+
},
22+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import AddIcon from "@mui/icons-material/AddOutlined";
2+
import Inventory2 from "@mui/icons-material/Inventory2";
3+
import NoteAddOutlined from "@mui/icons-material/NoteAddOutlined";
4+
import UploadOutlined from "@mui/icons-material/UploadOutlined";
5+
import Button from "@mui/material/Button";
6+
import {
7+
MoreMenu,
8+
MoreMenuContent,
9+
MoreMenuItem,
10+
MoreMenuTrigger,
11+
} from "components/MoreMenu/MoreMenu";
12+
import type { FC } from "react";
13+
14+
type CreateTemplateButtonProps = {
15+
onNavigate: (path: string) => void;
16+
};
17+
18+
export const CreateTemplateButton: FC<CreateTemplateButtonProps> = ({
19+
onNavigate,
20+
}) => {
21+
return (
22+
<MoreMenu>
23+
<MoreMenuTrigger>
24+
<Button startIcon={<AddIcon />} variant="contained">
25+
Create Template
26+
</Button>
27+
</MoreMenuTrigger>
28+
<MoreMenuContent>
29+
<MoreMenuItem
30+
onClick={() => {
31+
onNavigate("/templates/new?exampleId=scratch");
32+
}}
33+
>
34+
<NoteAddOutlined />
35+
From scratch
36+
</MoreMenuItem>
37+
<MoreMenuItem
38+
onClick={() => {
39+
onNavigate("/templates/new");
40+
}}
41+
>
42+
<UploadOutlined />
43+
Upload template
44+
</MoreMenuItem>
45+
<MoreMenuItem
46+
onClick={() => {
47+
onNavigate("/starter-templates");
48+
}}
49+
>
50+
<Inventory2 />
51+
Choose a starter template
52+
</MoreMenuItem>
53+
</MoreMenuContent>
54+
</MoreMenu>
55+
);
56+
};

site/src/pages/TemplatesPage/TemplatesPage.test.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ test("create template from scratch", async () => {
1717
element: <TemplatesPage />,
1818
},
1919
{
20-
path: "/starter-templates",
20+
path: "/templates/new",
2121
element: <div data-testid="new-template-page" />,
2222
},
2323
],
@@ -34,6 +34,9 @@ test("create template from scratch", async () => {
3434
name: "Create Template",
3535
});
3636
await user.click(createTemplateButton);
37+
const fromScratchMenuItem = await screen.findByText("From scratch");
38+
await user.click(fromScratchMenuItem);
3739
await screen.findByTestId("new-template-page");
38-
expect(router.state.location.pathname).toBe("/starter-templates");
40+
expect(router.state.location.pathname).toBe("/templates/new");
41+
expect(router.state.location.search).toBe("?exampleId=scratch");
3942
});

site/src/pages/TemplatesPage/TemplatesPageView.tsx

+22-16
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import {
3737
TableRowSkeleton,
3838
} from "components/TableLoader/TableLoader";
3939
import { useClickableTableRow } from "hooks/useClickableTableRow";
40+
import { useDashboard } from "modules/dashboard/useDashboard";
4041
import { linkToTemplate, useLinks } from "modules/navigation";
4142
import type { FC } from "react";
4243
import { useNavigate } from "react-router-dom";
@@ -46,6 +47,7 @@ import {
4647
formatTemplateActiveDevelopers,
4748
formatTemplateBuildTime,
4849
} from "utils/templates";
50+
import { CreateTemplateButton } from "./CreateTemplateButton";
4951
import { EmptyTemplates } from "./EmptyTemplates";
5052
import { TemplatesFilter } from "./TemplatesFilter";
5153

@@ -190,27 +192,31 @@ export const TemplatesPageView: FC<TemplatesPageViewProps> = ({
190192
examples,
191193
templates,
192194
}) => {
195+
const { experiments } = useDashboard();
193196
const isLoading = !templates;
194197
const isEmpty = templates && templates.length === 0;
195198
const navigate = useNavigate();
199+
const multiOrgExperimentEnabled = experiments.includes("multi-organization");
200+
201+
const createTemplateAction = () => {
202+
return multiOrgExperimentEnabled ? (
203+
<Button
204+
startIcon={<AddIcon />}
205+
variant="contained"
206+
onClick={() => {
207+
navigate("/starter-templates");
208+
}}
209+
>
210+
Create Template
211+
</Button>
212+
) : (
213+
<CreateTemplateButton onNavigate={navigate} />
214+
);
215+
};
196216

197217
return (
198218
<Margins>
199-
<PageHeader
200-
actions={
201-
canCreateTemplates && (
202-
<Button
203-
startIcon={<AddIcon />}
204-
variant="contained"
205-
onClick={() => {
206-
navigate("/starter-templates");
207-
}}
208-
>
209-
Create Template
210-
</Button>
211-
)
212-
}
213-
>
219+
<PageHeader actions={canCreateTemplates && createTemplateAction()}>
214220
<PageHeaderTitle>
215221
<Stack spacing={1} direction="row" alignItems="center">
216222
Templates
@@ -237,7 +243,7 @@ export const TemplatesPageView: FC<TemplatesPageViewProps> = ({
237243
</TableCell>
238244
<TableCell width="10%">{Language.buildTimeLabel}</TableCell>
239245
<TableCell width="15%">{Language.lastUpdatedLabel}</TableCell>
240-
<TableCell width="1%"></TableCell>
246+
<TableCell width="1%" />
241247
</TableRow>
242248
</TableHead>
243249
<TableBody>

0 commit comments

Comments
 (0)