diff --git a/apps/web/components/availability/ScheduleListItem.tsx b/apps/web/components/availability/ScheduleListItem.tsx
new file mode 100644
index 00000000..f085c0de
--- /dev/null
+++ b/apps/web/components/availability/ScheduleListItem.tsx
@@ -0,0 +1,75 @@
+import { DotsHorizontalIcon, TrashIcon } from "@heroicons/react/solid";
+import Link from "next/link";
+import { Fragment } from "react";
+
+import { availabilityAsString } from "@calcom/lib/availability";
+import { useLocale } from "@calcom/lib/hooks/useLocale";
+import { Availability } from "@calcom/prisma/client";
+import { Button } from "@calcom/ui";
+import Dropdown, { DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@calcom/ui/Dropdown";
+
+import { inferQueryOutput } from "@lib/trpc";
+
+export function ScheduleListItem({
+ schedule,
+ deleteFunction,
+ isDeleting = false,
+}: {
+ schedule: inferQueryOutput<"viewer.availability.list">["schedules"][number];
+ deleteFunction: Function;
+ isDeleting: boolean;
+}) {
+ const { t, i18n } = useLocale();
+
+ return (
+
+
+
+
+
+
+
+
+
+ {
+ deleteFunction({
+ scheduleId: schedule.id,
+ });
+ }}
+ type="button"
+ color="warn"
+ className="w-full font-normal"
+ StartIcon={isDeleting ? undefined : TrashIcon}
+ loading={isDeleting}>
+ {isDeleting ? t("deleting") : t("delete_schedule")}
+
+
+
+
+
+
+ );
+}
diff --git a/apps/web/components/dialog/ConfirmationDialogContent.tsx b/apps/web/components/dialog/ConfirmationDialogContent.tsx
index 9487bf88..6337b41d 100644
--- a/apps/web/components/dialog/ConfirmationDialogContent.tsx
+++ b/apps/web/components/dialog/ConfirmationDialogContent.tsx
@@ -3,15 +3,15 @@ import { CheckIcon } from "@heroicons/react/solid";
import * as DialogPrimitive from "@radix-ui/react-dialog";
import React, { PropsWithChildren, ReactNode } from "react";
+import { useLocale } from "@calcom/lib/hooks/useLocale";
import { Button } from "@calcom/ui/Button";
import { DialogClose, DialogContent } from "@calcom/ui/Dialog";
-import { useLocale } from "@lib/hooks/useLocale";
-
export type ConfirmationDialogContentProps = {
confirmBtn?: ReactNode;
confirmBtnText?: string;
cancelBtnText?: string;
+ isLoading?: boolean;
onConfirm?: (event: React.MouseEvent) => void;
title: string;
variety?: "danger" | "warning" | "success";
@@ -25,6 +25,7 @@ export default function ConfirmationDialogContent(props: PropsWithChildren
-
- {confirmBtn || {confirmBtnText} }
+
+ {confirmBtn || (
+
+ {isLoading ? t("loading") : confirmBtnText}
+
+ )}
-
+
{cancelBtnText}
diff --git a/apps/web/components/team/TeamList.tsx b/apps/web/components/team/TeamList.tsx
index 8c7bc027..f8177700 100644
--- a/apps/web/components/team/TeamList.tsx
+++ b/apps/web/components/team/TeamList.tsx
@@ -1,6 +1,6 @@
import showToast from "@calcom/lib/notification";
-import { trpc, inferQueryOutput } from "@lib/trpc";
+import { inferQueryOutput, trpc } from "@lib/trpc";
import TeamListItem from "./TeamListItem";
@@ -39,7 +39,9 @@ export default function TeamList(props: Props) {
selectAction(action, team?.id as number)}>
+ onActionSelect={(action: string) => selectAction(action, team?.id as number)}
+ isLoading={deleteTeamMutation.isLoading}
+ />
))}
diff --git a/apps/web/components/team/TeamListItem.tsx b/apps/web/components/team/TeamListItem.tsx
index 776a9139..ce05aeb6 100644
--- a/apps/web/components/team/TeamListItem.tsx
+++ b/apps/web/components/team/TeamListItem.tsx
@@ -1,10 +1,10 @@
import { LogoutIcon } from "@heroicons/react/outline";
import {
- ExternalLinkIcon,
- TrashIcon,
- LinkIcon,
DotsHorizontalIcon,
+ ExternalLinkIcon,
+ LinkIcon,
PencilIcon,
+ TrashIcon,
} from "@heroicons/react/solid";
import { MembershipRole } from "@prisma/client";
import Link from "next/link";
@@ -16,14 +16,14 @@ import { Dialog, DialogTrigger } from "@calcom/ui/Dialog";
import Dropdown, {
DropdownMenuContent,
DropdownMenuItem,
- DropdownMenuTrigger,
DropdownMenuSeparator,
+ DropdownMenuTrigger,
} from "@calcom/ui/Dropdown";
import { Tooltip } from "@calcom/ui/Tooltip";
import classNames from "@lib/classNames";
import { getPlaceholderAvatar } from "@lib/getPlaceholderAvatar";
-import { trpc, inferQueryOutput } from "@lib/trpc";
+import { inferQueryOutput, trpc } from "@lib/trpc";
import ConfirmationDialogContent from "@components/dialog/ConfirmationDialogContent";
import Avatar from "@components/ui/Avatar";
@@ -34,6 +34,7 @@ interface Props {
team: inferQueryOutput<"viewer.teams.list">[number];
key: number;
onActionSelect: (text: string) => void;
+ isLoading?: boolean;
}
export default function TeamListItem(props: Props) {
@@ -175,7 +176,10 @@ export default function TeamListItem(props: Props) {
variety="danger"
title={t("disband_team")}
confirmBtnText={t("confirm_disband_team")}
- onConfirm={() => props.onActionSelect("disband")}>
+ isLoading={props.isLoading}
+ onConfirm={() => {
+ props.onActionSelect("disband");
+ }}>
{t("disband_team_confirmation_message")}
diff --git a/apps/web/pages/availability/index.tsx b/apps/web/pages/availability/index.tsx
index 6de76507..ef216396 100644
--- a/apps/web/pages/availability/index.tsx
+++ b/apps/web/pages/availability/index.tsx
@@ -1,13 +1,7 @@
import { ClockIcon } from "@heroicons/react/outline";
-import { DotsHorizontalIcon, TrashIcon } from "@heroicons/react/solid";
-import { Availability } from "@prisma/client";
-import Link from "next/link";
-import { availabilityAsString } from "@calcom/lib/availability";
import { useLocale } from "@calcom/lib/hooks/useLocale";
import showToast from "@calcom/lib/notification";
-import { Button } from "@calcom/ui";
-import Dropdown, { DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@calcom/ui/Dropdown";
import { withQuery } from "@lib/QueryCell";
import { HttpError } from "@lib/core/http/error";
@@ -16,10 +10,11 @@ import { inferQueryOutput, trpc } from "@lib/trpc";
import EmptyScreen from "@components/EmptyScreen";
import Shell from "@components/Shell";
import { NewScheduleButton } from "@components/availability/NewScheduleButton";
+import { ScheduleListItem } from "@components/availability/ScheduleListItem";
import SkeletonLoader from "@components/availability/SkeletonLoader";
export function AvailabilityList({ schedules }: inferQueryOutput<"viewer.availability.list">) {
- const { t, i18n } = useLocale();
+ const { t } = useLocale();
const utils = trpc.useContext();
const deleteMutation = trpc.useMutation("viewer.availability.schedule.delete", {
onSuccess: async () => {
@@ -45,53 +40,12 @@ export function AvailabilityList({ schedules }: inferQueryOutput<"viewer.availab
{schedules.map((schedule) => (
-
-
-
-
-
-
-
-
-
-
- deleteMutation.mutate({
- scheduleId: schedule.id,
- })
- }
- type="button"
- color="warn"
- className="w-full font-normal"
- StartIcon={TrashIcon}>
- {t("delete_schedule")}
-
-
-
-
-
-
+
))}
diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json
index db1a3ded..97556067 100644
--- a/apps/web/public/static/locales/en/common.json
+++ b/apps/web/public/static/locales/en/common.json
@@ -348,6 +348,7 @@
"receive_cal_event_meeting_data": "Receive Cal meeting data at a specified URL, in real-time, when this event is scheduled or cancelled.",
"responsive_fullscreen_iframe": "Responsive full screen iframe",
"loading": "Loading...",
+ "deleting": "Deleting...",
"standard_iframe": "Standard iframe",
"iframe_embed": "iframe Embed",
"embed_calcom": "The easiest way to embed Cal.com on your website.",
diff --git a/apps/web/public/static/locales/pt-BR/common.json b/apps/web/public/static/locales/pt-BR/common.json
index 539276ac..3ff9230c 100644
--- a/apps/web/public/static/locales/pt-BR/common.json
+++ b/apps/web/public/static/locales/pt-BR/common.json
@@ -292,6 +292,7 @@
"receive_cal_meeting_data": "Receba dados da reunião Cal em uma, URL especificada, em tempo real, quando um evento for agendado ou cancelado.",
"responsive_fullscreen_iframe": "Iframe responsivo de tela inteira",
"loading": "Carregando...",
+ "deleting": "Apagando...",
"standard_iframe": "Iframe padrão",
"iframe_embed": "Incorporar iframe",
"embed_calcom": "A maneira mais fácil de incorporar o Cal.com no seu site.",
diff --git a/apps/web/public/static/locales/pt/common.json b/apps/web/public/static/locales/pt/common.json
index 076789f8..1978b9b0 100644
--- a/apps/web/public/static/locales/pt/common.json
+++ b/apps/web/public/static/locales/pt/common.json
@@ -329,6 +329,7 @@
"receive_cal_event_meeting_data": "Receba dados da reunião Cal num URL especificado, em tempo real, assim que o evento for agendado ou cancelado.",
"responsive_fullscreen_iframe": "Iframe responsivo de ecrã inteiro",
"loading": "A carregar...",
+ "deleting": "A remover...",
"standard_iframe": "Iframe padrão",
"iframe_embed": "Incorporar iframe",
"embed_calcom": "A maneira mais fácil de incorporar o Cal.com no seu site.",