Skip to content

Commit bec6a26

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

File tree

4 files changed

+105
-18
lines changed

4 files changed

+105
-18
lines changed
Lines changed: 22 additions & 0 deletions
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+
};
Lines changed: 56 additions & 0 deletions
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

Lines changed: 5 additions & 2 deletions
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

Lines changed: 22 additions & 16 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy