Skip to content

Commit c9aeea6

Browse files
chore(site): remove template version editor xservice (#10490)
Close #9942
1 parent 03045bd commit c9aeea6

File tree

8 files changed

+391
-607
lines changed

8 files changed

+391
-607
lines changed

site/src/api/queries/files.ts

+7
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,10 @@ export const uploadFile = () => {
55
mutationFn: API.uploadFile,
66
};
77
};
8+
9+
export const file = (fileId: string) => {
10+
return {
11+
queryKey: ["files", fileId],
12+
queryFn: () => API.getFile(fileId),
13+
};
14+
};

site/src/api/queries/templates.ts

+16
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,15 @@ export const templateVersionVariables = (versionId: string) => {
129129
};
130130
};
131131

132+
export const createTemplateVersion = (orgId: string) => {
133+
return {
134+
mutationFn: async (request: CreateTemplateVersionRequest) => {
135+
const newVersion = await API.createTemplateVersion(orgId, request);
136+
return newVersion;
137+
},
138+
};
139+
};
140+
132141
export const createAndBuildTemplateVersion = (orgId: string) => {
133142
return {
134143
mutationFn: async (request: CreateTemplateVersionRequest) => {
@@ -216,6 +225,13 @@ export const richParameters = (versionId: string) => {
216225
};
217226
};
218227

228+
export const resources = (versionId: string) => {
229+
return {
230+
queryKey: ["templateVersion", versionId, "resources"],
231+
queryFn: () => API.getTemplateVersionResources(versionId),
232+
};
233+
};
234+
219235
const waitBuildToBeFinished = async (version: TemplateVersion) => {
220236
let data: TemplateVersion;
221237
let jobStatus: ProvisionerJobStatus;

site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.stories.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ type Story = StoryObj<typeof TemplateVersionEditor>;
3434

3535
export const Example: Story = {};
3636

37-
export const Logs = {
37+
export const Logs: Story = {
3838
args: {
39-
isBuildingNewVersion: true,
39+
defaultTab: "logs",
4040
buildLogs: MockWorkspaceBuildLogs,
4141
templateVersion: {
4242
...MockTemplateVersion,
@@ -47,7 +47,7 @@ export const Logs = {
4747

4848
export const Resources: Story = {
4949
args: {
50-
isBuildingNewVersion: true,
50+
defaultTab: "resources",
5151
buildLogs: MockWorkspaceBuildLogs,
5252
resources: [
5353
MockWorkspaceResource,
@@ -60,9 +60,9 @@ export const Resources: Story = {
6060
},
6161
};
6262

63-
export const ManyLogs = {
63+
export const WithError = {
6464
args: {
65-
isBuildingNewVersion: true,
65+
defaultTab: "logs",
6666
templateVersion: {
6767
...MockTemplateVersion,
6868
job: {

site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx

+14-15
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ import AlertTitle from "@mui/material/AlertTitle";
4949
import { DashboardFullPage } from "components/Dashboard/DashboardLayout";
5050
import { type Interpolation, type Theme, useTheme } from "@emotion/react";
5151

52+
type Tab = "logs" | "resources" | undefined; // Undefined is to hide the tab
5253
export interface TemplateVersionEditorProps {
5354
template: Template;
5455
templateVersion: TemplateVersion;
55-
isBuildingNewVersion: boolean;
5656
defaultFileTree: FileTree;
5757
buildLogs?: ProvisionerJobLog[];
5858
resources?: WorkspaceResource[];
@@ -71,6 +71,7 @@ export interface TemplateVersionEditorProps {
7171
missingVariables?: TemplateVersionVariable[];
7272
onSubmitMissingVariableValues: (values: VariableValue[]) => void;
7373
onCancelSubmitMissingVariableValues: () => void;
74+
defaultTab?: Tab;
7475
}
7576

7677
const topbarHeight = 80;
@@ -92,7 +93,6 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
9293
disableUpdate,
9394
template,
9495
templateVersion,
95-
isBuildingNewVersion,
9696
defaultFileTree,
9797
onPreview,
9898
onPublish,
@@ -109,11 +109,10 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
109109
missingVariables,
110110
onSubmitMissingVariableValues,
111111
onCancelSubmitMissingVariableValues,
112+
defaultTab,
112113
}) => {
113114
const theme = useTheme();
114-
// If resources are provided, show them by default!
115-
// This is for Storybook!
116-
const [selectedTab, setSelectedTab] = useState(() => (resources ? 1 : 0));
115+
const [selectedTab, setSelectedTab] = useState<Tab>(defaultTab);
117116
const [fileTree, setFileTree] = useState(defaultFileTree);
118117
const [createFileOpen, setCreateFileOpen] = useState(false);
119118
const [deleteFileOpen, setDeleteFileOpen] = useState<string>();
@@ -125,8 +124,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
125124

126125
const triggerPreview = useCallback(() => {
127126
onPreview(fileTree);
128-
// Switch to the build log!
129-
setSelectedTab(0);
127+
setSelectedTab("logs");
130128
}, [fileTree, onPreview]);
131129

132130
// Stop ctrl+s from saving files and make ctrl+enter trigger a preview.
@@ -159,11 +157,12 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
159157
previousVersion.current = templateVersion;
160158
return;
161159
}
160+
162161
if (
163162
["running", "pending"].includes(previousVersion.current.job.status) &&
164163
templateVersion.job.status === "succeeded"
165164
) {
166-
setSelectedTab(1);
165+
setSelectedTab("resources");
167166
setDirty(false);
168167
}
169168
previousVersion.current = templateVersion;
@@ -218,7 +217,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
218217
)}
219218

220219
<div css={styles.topbarSides}>
221-
{isBuildingNewVersion && (
220+
{buildLogs && (
222221
<TemplateVersionStatusBadge version={templateVersion} />
223222
)}
224223

@@ -358,9 +357,9 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
358357
<div css={styles.tabs}>
359358
<button
360359
css={styles.tab}
361-
className={selectedTab === 0 ? "active" : ""}
360+
className={selectedTab === "logs" ? "active" : ""}
362361
onClick={() => {
363-
setSelectedTab(0);
362+
setSelectedTab("logs");
364363
}}
365364
>
366365
{templateVersion.job.status !== "succeeded" ? (
@@ -374,9 +373,9 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
374373
{!disableUpdate && (
375374
<button
376375
css={styles.tab}
377-
className={selectedTab === 1 ? "active" : ""}
376+
className={selectedTab === "resources" ? "active" : ""}
378377
onClick={() => {
379-
setSelectedTab(1);
378+
setSelectedTab("resources");
380379
}}
381380
>
382381
<PreviewIcon />
@@ -389,7 +388,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
389388
css={[
390389
styles.panel,
391390
{
392-
display: selectedTab !== 0 ? "none" : "flex",
391+
display: selectedTab !== "logs" ? "none" : "flex",
393392
flexDirection: "column",
394393
},
395394
]}
@@ -427,7 +426,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
427426
styles.panel,
428427
{
429428
paddingBottom: theme.spacing(2),
430-
display: selectedTab !== 1 ? "none" : undefined,
429+
display: selectedTab !== "resources" ? "none" : undefined,
431430
},
432431
]}
433432
>

site/src/pages/TemplateVersionEditorPage/TemplateVersionEditorPage.test.tsx

+39-32
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { screen, waitFor, within } from "@testing-library/react";
44
import userEvent from "@testing-library/user-event";
55
import * as api from "api/api";
66
import {
7+
MockTemplate,
78
MockTemplateVersion,
89
MockWorkspaceBuildLogs,
910
} from "testHelpers/entities";
@@ -17,26 +18,37 @@ jest.mock("components/TemplateResourcesTable/TemplateResourcesTable", () => {
1718
};
1819
});
1920

20-
test("Use custom name, message and set it as active when publishing", async () => {
21-
const user = userEvent.setup();
21+
const renderTemplateEditorPage = () => {
2222
renderWithAuth(<TemplateVersionEditorPage />, {
23+
route: `/templates/${MockTemplate.name}/versions/${MockTemplateVersion.name}/edit`,
24+
path: "/templates/:template/versions/:version/edit",
2325
extraRoutes: [
2426
{
2527
path: "/templates/:templateId",
2628
element: <div />,
2729
},
2830
],
2931
});
32+
};
33+
34+
test("Use custom name, message and set it as active when publishing", async () => {
35+
const user = userEvent.setup();
36+
renderTemplateEditorPage();
3037
const topbar = await screen.findByTestId("topbar");
3138

3239
// Build Template
3340
jest.spyOn(api, "uploadFile").mockResolvedValueOnce({ hash: "hash" });
41+
const newTemplateVersion = {
42+
...MockTemplateVersion,
43+
id: "new-version-id",
44+
name: "new-version",
45+
};
3446
jest
3547
.spyOn(api, "createTemplateVersion")
36-
.mockResolvedValueOnce(MockTemplateVersion);
48+
.mockResolvedValue(newTemplateVersion);
3749
jest
38-
.spyOn(api, "getTemplateVersion")
39-
.mockResolvedValue({ ...MockTemplateVersion, id: "new-version-id" });
50+
.spyOn(api, "getTemplateVersionByName")
51+
.mockResolvedValue(newTemplateVersion);
4052
jest
4153
.spyOn(api, "watchBuildLogsByTemplateVersionId")
4254
.mockImplementation((_, options) => {
@@ -52,7 +64,7 @@ test("Use custom name, message and set it as active when publishing", async () =
5264
// Publish
5365
const patchTemplateVersion = jest
5466
.spyOn(api, "patchTemplateVersion")
55-
.mockResolvedValue(MockTemplateVersion);
67+
.mockResolvedValue(newTemplateVersion);
5668
const updateActiveTemplateVersion = jest
5769
.spyOn(api, "updateActiveTemplateVersion")
5870
.mockResolvedValue({ message: "" });
@@ -84,24 +96,22 @@ test("Use custom name, message and set it as active when publishing", async () =
8496

8597
test("Do not mark as active if promote is not checked", async () => {
8698
const user = userEvent.setup();
87-
renderWithAuth(<TemplateVersionEditorPage />, {
88-
extraRoutes: [
89-
{
90-
path: "/templates/:templateId",
91-
element: <div />,
92-
},
93-
],
94-
});
99+
renderTemplateEditorPage();
95100
const topbar = await screen.findByTestId("topbar");
96101

97102
// Build Template
98103
jest.spyOn(api, "uploadFile").mockResolvedValueOnce({ hash: "hash" });
104+
const newTemplateVersion = {
105+
...MockTemplateVersion,
106+
id: "new-version-id",
107+
name: "new-version",
108+
};
99109
jest
100110
.spyOn(api, "createTemplateVersion")
101-
.mockResolvedValueOnce(MockTemplateVersion);
111+
.mockResolvedValue(newTemplateVersion);
102112
jest
103-
.spyOn(api, "getTemplateVersion")
104-
.mockResolvedValue({ ...MockTemplateVersion, id: "new-version-id" });
113+
.spyOn(api, "getTemplateVersionByName")
114+
.mockResolvedValue(newTemplateVersion);
105115
jest
106116
.spyOn(api, "watchBuildLogsByTemplateVersionId")
107117
.mockImplementation((_, options) => {
@@ -117,7 +127,7 @@ test("Do not mark as active if promote is not checked", async () => {
117127
// Publish
118128
const patchTemplateVersion = jest
119129
.spyOn(api, "patchTemplateVersion")
120-
.mockResolvedValue(MockTemplateVersion);
130+
.mockResolvedValue(newTemplateVersion);
121131
const updateActiveTemplateVersion = jest
122132
.spyOn(api, "updateActiveTemplateVersion")
123133
.mockResolvedValue({ message: "" });
@@ -146,30 +156,27 @@ test("Do not mark as active if promote is not checked", async () => {
146156
});
147157

148158
test("Patch request is not send when there are no changes", async () => {
149-
const MockTemplateVersionWithEmptyMessage = {
159+
const newTemplateVersion = {
150160
...MockTemplateVersion,
161+
id: "new-version-id",
162+
name: "new-version",
163+
};
164+
const MockTemplateVersionWithEmptyMessage = {
165+
...newTemplateVersion,
151166
message: "",
152167
};
153168
const user = userEvent.setup();
154-
renderWithAuth(<TemplateVersionEditorPage />, {
155-
extraRoutes: [
156-
{
157-
path: "/templates/:templateId",
158-
element: <div />,
159-
},
160-
],
161-
});
169+
renderTemplateEditorPage();
162170
const topbar = await screen.findByTestId("topbar");
163171

164172
// Build Template
165173
jest.spyOn(api, "uploadFile").mockResolvedValueOnce({ hash: "hash" });
166174
jest
167175
.spyOn(api, "createTemplateVersion")
168-
.mockResolvedValueOnce(MockTemplateVersionWithEmptyMessage);
169-
jest.spyOn(api, "getTemplateVersion").mockResolvedValue({
170-
...MockTemplateVersionWithEmptyMessage,
171-
id: "new-version-id",
172-
});
176+
.mockResolvedValue(MockTemplateVersionWithEmptyMessage);
177+
jest
178+
.spyOn(api, "getTemplateVersionByName")
179+
.mockResolvedValue(MockTemplateVersionWithEmptyMessage);
173180
jest
174181
.spyOn(api, "watchBuildLogsByTemplateVersionId")
175182
.mockImplementation((_, options) => {

0 commit comments

Comments
 (0)