Skip to content

Commit 5604a0d

Browse files
committed
feat: add delete-intercept functionality
1 parent 3349176 commit 5604a0d

File tree

1 file changed

+61
-11
lines changed

1 file changed

+61
-11
lines changed

site/src/pages/TemplatePage/TemplatePageHeader.tsx

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import { type FC, useRef, useState } from "react";
22
import { Link as RouterLink, useNavigate } from "react-router-dom";
33
import { useDeleteTemplate } from "./deleteTemplate";
44

5+
import { useQuery } from "react-query";
6+
import { workspacesByQuery } from "api/queries/workspaces";
7+
import { ConfirmDialog } from "components/Dialogs/ConfirmDialog/ConfirmDialog";
58
import {
69
AuthorizationResponse,
710
Template,
@@ -33,7 +36,6 @@ type TemplateMenuProps = {
3336
templateName: string;
3437
templateVersion: string;
3538
onDelete: () => void;
36-
onMenuOpen?: () => void;
3739
};
3840

3941
const TemplateMenu: FC<TemplateMenuProps> = ({
@@ -120,8 +122,16 @@ export const TemplatePageHeader: FC<TemplatePageHeaderProps> = ({
120122
permissions,
121123
onDeleteTemplate,
122124
}) => {
125+
const navigate = useNavigate();
126+
const deletionState = useDeleteTemplate(template, onDeleteTemplate);
127+
128+
const queryText = `template:${template.name}`;
129+
const workspaceCountQuery = useQuery({
130+
...workspacesByQuery(queryText),
131+
select: (res) => res.count,
132+
});
133+
123134
const hasIcon = template.icon && template.icon !== "";
124-
const deleteTemplate = useDeleteTemplate(template, onDeleteTemplate);
125135

126136
return (
127137
<Margins>
@@ -141,7 +151,7 @@ export const TemplatePageHeader: FC<TemplatePageHeaderProps> = ({
141151
<TemplateMenu
142152
templateVersion={activeVersion.name}
143153
templateName={template.name}
144-
onDelete={deleteTemplate.openDeleteConfirmation}
154+
onDelete={deletionState.openDeleteConfirmation}
145155
/>
146156
)}
147157
</>
@@ -170,14 +180,54 @@ export const TemplatePageHeader: FC<TemplatePageHeaderProps> = ({
170180
</Stack>
171181
</PageHeader>
172182

173-
<DeleteDialog
174-
isOpen={deleteTemplate.isDeleteDialogOpen}
175-
confirmLoading={deleteTemplate.state.status === "deleting"}
176-
onConfirm={deleteTemplate.confirmDelete}
177-
onCancel={deleteTemplate.cancelDeleteConfirmation}
178-
entity="template"
179-
name={template.name}
180-
/>
183+
{workspaceCountQuery.status === "success" &&
184+
workspaceCountQuery.data === 0 ? (
185+
<DeleteDialog
186+
isOpen={deletionState.isDeleteDialogOpen}
187+
onConfirm={deletionState.confirmDelete}
188+
onCancel={deletionState.cancelDeleteConfirmation}
189+
entity="template"
190+
name={template.name}
191+
/>
192+
) : (
193+
<ConfirmDialog
194+
type="info"
195+
title="Unable to delete"
196+
hideCancel={false}
197+
open={deletionState.isDeleteDialogOpen}
198+
onClose={deletionState.cancelDeleteConfirmation}
199+
confirmText="See workspaces"
200+
onConfirm={() => {
201+
navigate({
202+
pathname: "/workspaces",
203+
search: new URLSearchParams({ filter: queryText }).toString(),
204+
});
205+
}}
206+
description={
207+
<>
208+
{workspaceCountQuery.isSuccess && (
209+
<>
210+
This template is used by{" "}
211+
<strong>
212+
{workspaceCountQuery.data} workspace
213+
{workspaceCountQuery.data === 1 ? "" : "s"}
214+
</strong>
215+
. Please delete all related workspaces before deleting this
216+
template.
217+
</>
218+
)}
219+
220+
{workspaceCountQuery.isLoading && (
221+
<>Loading information about workspaces used by this template.</>
222+
)}
223+
224+
{workspaceCountQuery.isError && (
225+
<>Unable to determine workspaces used by this template.</>
226+
)}
227+
</>
228+
}
229+
/>
230+
)}
181231
</Margins>
182232
);
183233
};

0 commit comments

Comments
 (0)