Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7b8aec2

Browse files
committed
Merge branch 'main' ofhttps://github.com/coder/coder into bq/display-ws-status-on-tasks
2 parents2a22e3e +718f712 commit7b8aec2

File tree

8 files changed

+730
-643
lines changed

8 files changed

+730
-643
lines changed

‎site/package.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,10 @@
145145
"@types/jest":"29.5.14",
146146
"@types/lodash":"4.17.15",
147147
"@types/node":"20.17.16",
148-
"@types/react":"19.1.13",
148+
"@types/react":"19.1.17",
149149
"@types/react-color":"3.0.13",
150150
"@types/react-date-range":"1.4.4",
151-
"@types/react-dom":"19.1.9",
151+
"@types/react-dom":"19.1.11",
152152
"@types/react-syntax-highlighter":"15.5.13",
153153
"@types/react-virtualized-auto-sizer":"1.0.4",
154154
"@types/react-window":"1.8.8",

‎site/pnpm-lock.yaml‎

Lines changed: 538 additions & 534 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import{MockTasks,MockWorkspace}from"testHelpers/entities";
2+
import{withGlobalSnackbar}from"testHelpers/storybook";
3+
importtype{Meta,StoryObj}from"@storybook/react-vite";
4+
import{API}from"api/api";
5+
import{expect,spyOn,userEvent,waitFor,within}from"storybook/test";
6+
import{TaskDeleteDialog}from"./TaskDeleteDialog";
7+
8+
constmeta:Meta<typeofTaskDeleteDialog>={
9+
title:"modules/tasks/TaskDeleteDialog",
10+
component:TaskDeleteDialog,
11+
decorators:[withGlobalSnackbar],
12+
};
13+
14+
exportdefaultmeta;
15+
typeStory=StoryObj<typeofTaskDeleteDialog>;
16+
17+
exportconstDeleteTaskSuccess:Story={
18+
decorators:[withGlobalSnackbar],
19+
args:{
20+
open:true,
21+
task:{prompt:"My Task",workspace:MockWorkspace},
22+
onClose:()=>{},
23+
},
24+
parameters:{
25+
chromatic:{
26+
disableSnapshot:false,
27+
},
28+
},
29+
beforeEach:()=>{
30+
spyOn(API.experimental,"deleteTask").mockResolvedValue();
31+
},
32+
play:async({ canvasElement, step})=>{
33+
constbody=within(canvasElement.ownerDocument.body);
34+
35+
awaitstep("Confirm delete",async()=>{
36+
constconfirmButton=awaitbody.findByRole("button",{
37+
name:/delete/i,
38+
});
39+
awaituserEvent.click(confirmButton);
40+
awaitstep("Confirm delete",async()=>{
41+
awaitwaitFor(()=>{
42+
expect(API.experimental.deleteTask).toHaveBeenCalledWith(
43+
MockTasks[0].workspace.owner_name,
44+
MockTasks[0].workspace.id,
45+
);
46+
});
47+
});
48+
});
49+
},
50+
};
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import{API}from"api/api";
2+
import{getErrorDetail,getErrorMessage}from"api/errors";
3+
import{ConfirmDialog}from"components/Dialogs/ConfirmDialog/ConfirmDialog";
4+
import{displayError,displaySuccess}from"components/GlobalSnackbar/utils";
5+
importtype{FC}from"react";
6+
import{QueryClient,useMutation}from"react-query";
7+
importtype{Task}from"../tasks";
8+
9+
typeTaskDeleteDialogProps={
10+
open:boolean;
11+
task:Task;
12+
onClose:()=>void;
13+
onSuccess?:()=>void;
14+
};
15+
16+
exportconstTaskDeleteDialog:FC<TaskDeleteDialogProps>=({
17+
task,
18+
onSuccess,
19+
...props
20+
})=>{
21+
constqueryClient=newQueryClient();
22+
constdeleteTaskMutation=useMutation({
23+
mutationFn:()=>
24+
API.experimental.deleteTask(task.workspace.owner_name,task.workspace.id),
25+
onSuccess:async()=>{
26+
awaitqueryClient.invalidateQueries({queryKey:["tasks"]});
27+
},
28+
});
29+
30+
return(
31+
<ConfirmDialog
32+
{...props}
33+
type="delete"
34+
confirmLoading={deleteTaskMutation.isPending}
35+
title="Delete task"
36+
onConfirm={async()=>{
37+
try{
38+
awaitdeleteTaskMutation.mutateAsync();
39+
displaySuccess("Task deleted successfully");
40+
onSuccess?.();
41+
}catch(error){
42+
displayError(
43+
getErrorMessage(error,"Failed to delete task"),
44+
getErrorDetail(error),
45+
);
46+
}finally{
47+
props.onClose();
48+
}
49+
}}
50+
description={
51+
<p>
52+
This action is irreversible and removes all workspace resources and
53+
data.
54+
</p>
55+
}
56+
/>
57+
);
58+
};

‎site/src/modules/tasks/TasksSidebar/TasksSidebar.stories.tsx‎

Lines changed: 3 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import{MockTasks,MockUserOwner,mockApiError}from"testHelpers/entities";
2-
import{withAuthProvider,withGlobalSnackbar}from"testHelpers/storybook";
2+
import{withAuthProvider}from"testHelpers/storybook";
33
importtype{Meta,StoryObj}from"@storybook/react-vite";
44
import{API}from"api/api";
55
import{MockUsers}from"pages/UsersPage/storybookData/users";
6-
import{expect,spyOn,userEvent,waitFor,within}from"storybook/test";
6+
import{spyOn,userEvent,within}from"storybook/test";
77
import{reactRouterParameters}from"storybook-addon-remix-react-router";
88
import{TasksSidebar}from"./TasksSidebar";
99

@@ -93,7 +93,7 @@ export const OpenOptionsMenu: Story = {
9393
},
9494
};
9595

96-
exportconstDeleteTaskDialog:Story={
96+
exportconstOpenDeleteDialog:Story={
9797
beforeEach:()=>{
9898
spyOn(API.experimental,"getTasks").mockResolvedValue(MockTasks);
9999
},
@@ -114,49 +114,3 @@ export const DeleteTaskDialog: Story = {
114114
});
115115
},
116116
};
117-
118-
exportconstDeleteTaskSuccess:Story={
119-
decorators:[withGlobalSnackbar],
120-
parameters:{
121-
chromatic:{
122-
disableSnapshot:false,
123-
},
124-
},
125-
beforeEach:()=>{
126-
spyOn(API.experimental,"getTasks").mockResolvedValue(MockTasks);
127-
spyOn(API.experimental,"deleteTask").mockResolvedValue();
128-
},
129-
play:async({ canvasElement, step})=>{
130-
constbody=within(canvasElement.ownerDocument.body);
131-
constcanvas=within(canvasElement);
132-
133-
awaitstep("Open menu",async()=>{
134-
constoptionButtons=awaitcanvas.findAllByRole("button",{
135-
name:/taskoptions/i,
136-
});
137-
awaituserEvent.click(optionButtons[0]);
138-
});
139-
140-
awaitstep("Open delete dialog",async()=>{
141-
constdeleteButton=awaitbody.findByRole("menuitem",{
142-
name:/delete/i,
143-
});
144-
awaituserEvent.click(deleteButton);
145-
});
146-
147-
awaitstep("Confirm delete",async()=>{
148-
constconfirmButton=awaitbody.findByRole("button",{
149-
name:/delete/i,
150-
});
151-
awaituserEvent.click(confirmButton);
152-
awaitstep("Confirm delete",async()=>{
153-
awaitwaitFor(()=>{
154-
expect(API.experimental.deleteTask).toHaveBeenCalledWith(
155-
MockTasks[0].workspace.owner_name,
156-
MockTasks[0].workspace.id,
157-
);
158-
});
159-
});
160-
});
161-
},
162-
};

‎site/src/modules/tasks/TasksSidebar/TasksSidebar.tsx‎

Lines changed: 9 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
import{API}from"api/api";
2-
import{getErrorDetail,getErrorMessage}from"api/errors";
2+
import{getErrorMessage}from"api/errors";
33
import{cva}from"class-variance-authority";
44
import{Button}from"components/Button/Button";
5-
import{ConfirmDialog}from"components/Dialogs/ConfirmDialog/ConfirmDialog";
65
import{
76
DropdownMenu,
87
DropdownMenuContent,
98
DropdownMenuGroup,
109
DropdownMenuItem,
1110
DropdownMenuTrigger,
1211
}from"components/DropdownMenu/DropdownMenu";
13-
import{displayError,displaySuccess}from"components/GlobalSnackbar/utils";
1412
import{CoderIcon}from"components/Icons/CoderIcon";
1513
import{ScrollArea}from"components/ScrollArea/ScrollArea";
1614
import{Skeleton}from"components/Skeleton/Skeleton";
@@ -25,9 +23,10 @@ import { useSearchParamsKey } from "hooks/useSearchParamsKey";
2523
import{EditIcon,EllipsisIcon,PanelLeftIcon,TrashIcon}from"lucide-react";
2624
importtype{Task}from"modules/tasks/tasks";
2725
import{typeFC,useState}from"react";
28-
import{QueryClient,useMutation,useQuery}from"react-query";
26+
import{useQuery}from"react-query";
2927
import{LinkasRouterLink,useNavigate,useParams}from"react-router";
3028
import{cn}from"utils/cn";
29+
import{TaskDeleteDialog}from"../TaskDeleteDialog/TaskDeleteDialog";
3130
import{UserCombobox}from"./UserCombobox";
3231

3332
exportconstTasksSidebar:FC=()=>{
@@ -180,14 +179,6 @@ const TaskSidebarMenuItem: FC<TaskSidebarMenuItemProps> = ({ task }) => {
180179
constisActive=task.workspace.name===workspace;
181180
const[isDeleteDialogOpen,setIsDeleteDialogOpen]=useState(false);
182181
constnavigate=useNavigate();
183-
constqueryClient=newQueryClient();
184-
constdeleteTaskMutation=useMutation({
185-
mutationFn:()=>
186-
API.experimental.deleteTask(task.workspace.owner_name,task.workspace.id),
187-
onSuccess:async()=>{
188-
awaitqueryClient.invalidateQueries({queryKey:["tasks"]});
189-
},
190-
});
191182

192183
return(
193184
<>
@@ -249,36 +240,17 @@ const TaskSidebarMenuItem: FC<TaskSidebarMenuItemProps> = ({ task }) => {
249240
</RouterLink>
250241
</Button>
251242

252-
<ConfirmDialog
253-
type="delete"
254-
confirmLoading={deleteTaskMutation.isPending}
243+
<TaskDeleteDialog
255244
open={isDeleteDialogOpen}
256-
title="Deletetask"
257-
onClose={():void=>{
245+
task={task}
246+
onClose={()=>{
258247
setIsDeleteDialogOpen(false);
259248
}}
260-
onConfirm={async()=>{
261-
try{
262-
awaitdeleteTaskMutation.mutateAsync();
263-
displaySuccess("Task deleted successfully");
264-
if(isActive){
265-
navigate("/tasks");
266-
}
267-
}catch(error){
268-
displayError(
269-
getErrorMessage(error,"Failed to delete task"),
270-
getErrorDetail(error),
271-
);
272-
}finally{
273-
setIsDeleteDialogOpen(false);
249+
onSuccess={()=>{
250+
if(isActive){
251+
navigate("/tasks");
274252
}
275253
}}
276-
description={
277-
<p>
278-
This action is irreversible and removes all workspace resources and
279-
data.
280-
</p>
281-
}
282254
/>
283255
</>
284256
);

‎site/src/pages/TasksPage/TasksPage.stories.tsx‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,3 +424,17 @@ export const NonAdmin: Story = {
424424
});
425425
},
426426
};
427+
428+
exportconstOpenDeleteDialog:Story={
429+
beforeEach:()=>{
430+
spyOn(API,"getTemplates").mockResolvedValue([MockTemplate]);
431+
spyOn(API.experimental,"getTasks").mockResolvedValue(MockTasks);
432+
},
433+
play:async({ canvasElement})=>{
434+
constcanvas=within(canvasElement);
435+
constdeleteButtons=awaitcanvas.findAllByRole("button",{
436+
name:/deletetask/i,
437+
});
438+
awaituserEvent.click(deleteButtons[0]);
439+
},
440+
};

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp