Skip to content

Commit 94d511e

Browse files
committed
feat(archived-instances): allow instances (jobs/apps) to be archived such that they won't be deleted automatically deleted
1 parent acdfc81 commit 94d511e

File tree

4 files changed

+68
-0
lines changed

4 files changed

+68
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { useState } from "react";
2+
import { useQueryClient } from "react-query";
3+
4+
import type { InstanceSummary } from "@squonk/data-manager-client";
5+
import {
6+
getGetInstanceQueryKey,
7+
getGetInstancesQueryKey,
8+
usePatchInstance,
9+
} from "@squonk/data-manager-client/instance";
10+
11+
import { Button, Tooltip } from "@mui/material";
12+
13+
export interface ArchiveInstanceProps {
14+
instanceId: InstanceSummary["id"];
15+
archived: boolean;
16+
}
17+
18+
export const ArchiveInstance = ({ instanceId, archived }: ArchiveInstanceProps) => {
19+
const { mutateAsync: patchInstance } = usePatchInstance();
20+
const queryClient = useQueryClient();
21+
const [archiving, setArchiving] = useState(false);
22+
23+
const archiveInstance = async () => {
24+
setArchiving(true);
25+
await patchInstance({ instanceId, params: { archive: !archived } });
26+
await Promise.allSettled([
27+
queryClient.invalidateQueries(getGetInstanceQueryKey(instanceId)),
28+
queryClient.invalidateQueries(getGetInstancesQueryKey()),
29+
]);
30+
setArchiving(false);
31+
};
32+
33+
return (
34+
<Tooltip title="Toggle whether an instance will be deleted automatically">
35+
<span>
36+
<Button disabled={archiving} onClick={archiveInstance}>
37+
{archived ? "Unarchive" : "Archive"}
38+
</Button>
39+
</span>
40+
</Tooltip>
41+
);
42+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import InventoryIcon from "@mui/icons-material/Inventory";
2+
import { ListItem, ListItemIcon, Tooltip } from "@mui/material";
3+
4+
export interface ArchivedStatusProps {
5+
archived: boolean;
6+
}
7+
8+
export const ArchivedStatus = ({ archived }: ArchivedStatusProps) => {
9+
return archived ? (
10+
<Tooltip title="This instance won't be deleted automatically">
11+
<ListItem>
12+
<ListItemIcon sx={{ minWidth: "40px" }}>
13+
<InventoryIcon />
14+
</ListItemIcon>
15+
</ListItem>
16+
</Tooltip>
17+
) : null;
18+
};

components/instances/ResultApplicationCard.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import { useProjectFromId } from "../../hooks/projectHooks";
99
import { ProjectListItem } from "../projects/ProjectListItem";
1010
import { ResultCard } from "../results/ResultCard";
1111
import { ApplicationDetails } from "./ApplicationDetails";
12+
import { ArchivedStatus } from "./ArchivedStatus";
13+
import { ArchiveInstance } from "./ArchiveInstance";
1214
import { TerminateInstance } from "./TerminateInstance";
1315
import { useInstanceRouterQuery } from "./useInstanceRouterQuery";
1416

@@ -62,6 +64,7 @@ export const ResultApplicationCard = ({
6264
Open
6365
</HrefButton>
6466
)}
67+
<ArchiveInstance archived={instance.archived} instanceId={instanceId} />
6568
</>
6669
)}
6770
collapsed={
@@ -82,6 +85,7 @@ export const ResultApplicationCard = ({
8285
<ListItemText primary={instance.name} />
8386
</ListItem>
8487
<ProjectListItem projectName={associatedProject?.name || "loading..."} />
88+
<ArchivedStatus archived={instance.archived} />
8589
</ResultCard>
8690
);
8791
};

components/instances/ResultJobCard.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { RerunJobButton } from "../../components/results/RerunJobButton";
77
import { ResultCard } from "../../components/results/ResultCard";
88
import { useProjectFromId } from "../../hooks/projectHooks";
99
import { ProjectListItem } from "../projects/ProjectListItem";
10+
import { ArchivedStatus } from "./ArchivedStatus";
11+
import { ArchiveInstance } from "./ArchiveInstance";
1012
import { JobDetails } from "./JobDetails";
1113
import { TerminateInstance } from "./TerminateInstance";
1214
import { useInstanceRouterQuery } from "./useInstanceRouterQuery";
@@ -54,6 +56,7 @@ export const ResultJobCard = ({
5456
/>
5557
<RerunJobButton instance={instance} />
5658
<LogsButton instance={instance} instanceId={instanceId} />
59+
<ArchiveInstance archived={instance.archived} instanceId={instanceId} />
5760
</>
5861
)}
5962
collapsed={
@@ -74,6 +77,7 @@ export const ResultJobCard = ({
7477
<ListItemText primary={instance.name} secondary={instance.job_name} />
7578
</ListItem>
7679
<ProjectListItem projectName={associatedProject?.name || "loading..."} />
80+
<ArchivedStatus archived={instance.archived} />
7781
</ResultCard>
7882
);
7983
};

0 commit comments

Comments
 (0)