fix: org admin delete other teams (#11247)
* fix org-admin delete other teams * Fix delete from teams to delete from orgs endpointpull/11314/head^2
parent
75f9f045b8
commit
1c1625d3fc
|
@ -24,10 +24,9 @@ export default function OtherTeamList(props: Props) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const deleteTeamMutation = trpc.viewer.teams.delete.useMutation({
|
const deleteTeamMutation = trpc.viewer.organizations.deleteTeam.useMutation({
|
||||||
async onSuccess() {
|
async onSuccess() {
|
||||||
await utils.viewer.teams.list.invalidate();
|
await utils.viewer.organizations.listOtherTeams.invalidate();
|
||||||
await utils.viewer.teams.hasTeamPlan.invalidate();
|
|
||||||
},
|
},
|
||||||
async onError(err) {
|
async onError(err) {
|
||||||
showToast(err.message, "error");
|
showToast(err.message, "error");
|
||||||
|
|
|
@ -5,6 +5,9 @@ import {
|
||||||
Avatar,
|
Avatar,
|
||||||
Button,
|
Button,
|
||||||
ButtonGroup,
|
ButtonGroup,
|
||||||
|
ConfirmationDialogContent,
|
||||||
|
Dialog,
|
||||||
|
DialogTrigger,
|
||||||
Dropdown,
|
Dropdown,
|
||||||
DropdownItem,
|
DropdownItem,
|
||||||
DropdownMenuContent,
|
DropdownMenuContent,
|
||||||
|
@ -13,7 +16,7 @@ import {
|
||||||
showToast,
|
showToast,
|
||||||
Tooltip,
|
Tooltip,
|
||||||
} from "@calcom/ui";
|
} from "@calcom/ui";
|
||||||
import { Edit2, ExternalLink, Link as LinkIcon, MoreHorizontal } from "@calcom/ui/components/icon";
|
import { Edit2, ExternalLink, Link as LinkIcon, MoreHorizontal, Trash } from "@calcom/ui/components/icon";
|
||||||
|
|
||||||
import { useOrgBranding } from "../../../organizations/context/provider";
|
import { useOrgBranding } from "../../../organizations/context/provider";
|
||||||
|
|
||||||
|
@ -119,6 +122,32 @@ export default function OtherTeamListItem(props: Props) {
|
||||||
</DropdownItem>
|
</DropdownItem>
|
||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
<DropdownMenuItem>
|
||||||
|
<Dialog open={hideDropdown} onOpenChange={setHideDropdown}>
|
||||||
|
<DialogTrigger asChild>
|
||||||
|
<DropdownItem
|
||||||
|
color="destructive"
|
||||||
|
type="button"
|
||||||
|
StartIcon={Trash}
|
||||||
|
onClick={(e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
}}>
|
||||||
|
{t("disband_team")}
|
||||||
|
</DropdownItem>
|
||||||
|
</DialogTrigger>
|
||||||
|
<ConfirmationDialogContent
|
||||||
|
variety="danger"
|
||||||
|
title={t("disband_team")}
|
||||||
|
confirmBtnText={t("confirm_disband_team")}
|
||||||
|
isLoading={props.isLoading}
|
||||||
|
onConfirm={() => {
|
||||||
|
props.onActionSelect("disband");
|
||||||
|
}}>
|
||||||
|
{t("disband_team_confirmation_message")}
|
||||||
|
</ConfirmationDialogContent>
|
||||||
|
</Dialog>
|
||||||
|
</DropdownMenuItem>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
|
|
|
@ -106,9 +106,9 @@ const OtherTeamProfileView = () => {
|
||||||
|
|
||||||
const isBioEmpty = !team || !team.bio || !team.bio.replace("<p><br></p>", "").length;
|
const isBioEmpty = !team || !team.bio || !team.bio.replace("<p><br></p>", "").length;
|
||||||
|
|
||||||
const deleteTeamMutation = trpc.viewer.teams.delete.useMutation({
|
const deleteTeamMutation = trpc.viewer.organizations.deleteTeam.useMutation({
|
||||||
async onSuccess() {
|
async onSuccess() {
|
||||||
await utils.viewer.teams.list.invalidate();
|
await utils.viewer.organizations.listOtherTeams.invalidate();
|
||||||
showToast(t("your_team_disbanded_successfully"), "success");
|
showToast(t("your_team_disbanded_successfully"), "success");
|
||||||
router.push(`${WEBAPP_URL}/teams`);
|
router.push(`${WEBAPP_URL}/teams`);
|
||||||
},
|
},
|
||||||
|
|
|
@ -10,6 +10,7 @@ import { ZAdminVerifyInput } from "./adminVerify.schema";
|
||||||
import { ZBulkUsersDelete } from "./bulkDeleteUsers.schema.";
|
import { ZBulkUsersDelete } from "./bulkDeleteUsers.schema.";
|
||||||
import { ZCreateInputSchema } from "./create.schema";
|
import { ZCreateInputSchema } from "./create.schema";
|
||||||
import { ZCreateTeamsSchema } from "./createTeams.schema";
|
import { ZCreateTeamsSchema } from "./createTeams.schema";
|
||||||
|
import { ZDeleteTeamInputSchema } from "./deleteTeam.schema";
|
||||||
import { ZGetMembersInput } from "./getMembers.schema";
|
import { ZGetMembersInput } from "./getMembers.schema";
|
||||||
import { ZGetOtherTeamInputSchema } from "./getOtherTeam.handler";
|
import { ZGetOtherTeamInputSchema } from "./getOtherTeam.handler";
|
||||||
import { ZGetUserInput } from "./getUser.schema";
|
import { ZGetUserInput } from "./getUser.schema";
|
||||||
|
@ -120,4 +121,8 @@ export const viewerOrganizationsRouter = router({
|
||||||
);
|
);
|
||||||
return handler(opts);
|
return handler(opts);
|
||||||
}),
|
}),
|
||||||
|
deleteTeam: authedOrgAdminProcedure.input(ZDeleteTeamInputSchema).mutation(async (opts) => {
|
||||||
|
const handler = await importHandler(namespaced("deleteTeam"), () => import("./deleteTeam.handler"));
|
||||||
|
return handler(opts);
|
||||||
|
}),
|
||||||
});
|
});
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { prisma } from "@calcom/prisma";
|
||||||
|
|
||||||
|
import type { TDeleteTeamInputSchema } from "./deleteTeam.schema";
|
||||||
|
|
||||||
|
type DeleteOptions = {
|
||||||
|
input: TDeleteTeamInputSchema;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const deleteTeamHandler = async ({ input }: DeleteOptions) => {
|
||||||
|
// delete all memberships
|
||||||
|
await prisma.membership.deleteMany({
|
||||||
|
where: {
|
||||||
|
teamId: input.teamId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
await prisma.team.delete({
|
||||||
|
where: {
|
||||||
|
id: input.teamId,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export default deleteTeamHandler;
|
|
@ -0,0 +1,7 @@
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
export const ZDeleteTeamInputSchema = z.object({
|
||||||
|
teamId: z.number(),
|
||||||
|
});
|
||||||
|
|
||||||
|
export type TDeleteTeamInputSchema = z.infer<typeof ZDeleteTeamInputSchema>;
|
Loading…
Reference in New Issue