diff --git a/packages/features/ee/package.json b/packages/features/ee/package.json
index 7244d62522..33aae3a963 100644
--- a/packages/features/ee/package.json
+++ b/packages/features/ee/package.json
@@ -14,7 +14,7 @@
"@sendgrid/mail": "^7.6.2",
"libphonenumber-js": "^1.10.12",
"twilio": "^3.80.1",
- "zod": "^3.20.2"
+ "zod": "^3.22.2"
},
"devDependencies": {
"@calcom/tsconfig": "*"
diff --git a/packages/features/ee/payments/api/paypal-webhook.ts b/packages/features/ee/payments/api/paypal-webhook.ts
index 493626200b..06708fe0fd 100644
--- a/packages/features/ee/payments/api/paypal-webhook.ts
+++ b/packages/features/ee/payments/api/paypal-webhook.ts
@@ -149,7 +149,11 @@ export async function handlePaymentSuccess(
},
attendees: attendeesList,
uid: booking.uid,
- destinationCalendar: booking.destinationCalendar || user.destinationCalendar,
+ destinationCalendar: booking.destinationCalendar
+ ? [booking.destinationCalendar]
+ : user.destinationCalendar
+ ? [user.destinationCalendar]
+ : [],
recurringEvent: parseRecurringEvent(eventTypeRaw?.recurringEvent),
};
diff --git a/packages/features/ee/payments/api/webhook.ts b/packages/features/ee/payments/api/webhook.ts
index deb8f6e993..c6b563a071 100644
--- a/packages/features/ee/payments/api/webhook.ts
+++ b/packages/features/ee/payments/api/webhook.ts
@@ -98,7 +98,7 @@ async function getBooking(bookingId: number) {
});
const attendeesList = await Promise.all(attendeesListPromises);
-
+ const selectedDestinationCalendar = booking.destinationCalendar || user.destinationCalendar;
const evt: CalendarEvent = {
type: booking.title,
title: booking.title,
@@ -116,7 +116,7 @@ async function getBooking(bookingId: number) {
},
attendees: attendeesList,
uid: booking.uid,
- destinationCalendar: booking.destinationCalendar || user.destinationCalendar,
+ destinationCalendar: selectedDestinationCalendar ? [selectedDestinationCalendar] : [],
recurringEvent: parseRecurringEvent(eventType?.recurringEvent),
};
@@ -204,7 +204,7 @@ async function handlePaymentSuccess(event: Stripe.Event) {
});
const attendeesList = await Promise.all(attendeesListPromises);
-
+ const selectedDestinationCalendar = booking.destinationCalendar || user.destinationCalendar;
const evt: CalendarEvent = {
type: booking.title,
title: booking.title,
@@ -226,7 +226,7 @@ async function handlePaymentSuccess(event: Stripe.Event) {
attendees: attendeesList,
location: booking.location,
uid: booking.uid,
- destinationCalendar: booking.destinationCalendar || user.destinationCalendar,
+ destinationCalendar: selectedDestinationCalendar ? [selectedDestinationCalendar] : [],
recurringEvent: parseRecurringEvent(eventTypeRaw?.recurringEvent),
};
diff --git a/packages/features/ee/teams/components/MemberInvitationModal.tsx b/packages/features/ee/teams/components/MemberInvitationModal.tsx
index f6fad884f0..b72ace316f 100644
--- a/packages/features/ee/teams/components/MemberInvitationModal.tsx
+++ b/packages/features/ee/teams/components/MemberInvitationModal.tsx
@@ -32,6 +32,7 @@ import { GoogleWorkspaceInviteButton } from "./GoogleWorkspaceInviteButton";
type MemberInvitationModalProps = {
isOpen: boolean;
+ justEmailInvites?: boolean;
onExit: () => void;
orgMembers?: RouterOutputs["viewer"]["organizations"]["getMembers"];
onSubmit: (values: NewMemberForm, resetFields: () => void) => void;
@@ -206,7 +207,7 @@ export default function MemberInvitationModal(props: MemberInvitationModalProps)
render={({ field: { onChange }, fieldState: { error } }) => (
<>
{props.text}
diff --git a/packages/features/ee/teams/components/TeamsListing.tsx b/packages/features/ee/teams/components/TeamsListing.tsx
index 12613a90a8..6560880f9e 100644
--- a/packages/features/ee/teams/components/TeamsListing.tsx
+++ b/packages/features/ee/teams/components/TeamsListing.tsx
@@ -65,7 +65,7 @@ export function TeamsListing() {
{
icon: ,
title: t("sms_attendee_action"),
- description: t("make_it_easy_to_book"),
+ description: t("send_reminder_sms"),
},
{
icon: ,
diff --git a/packages/features/ee/teams/lib/payments.ts b/packages/features/ee/teams/lib/payments.ts
index 6171f159ae..5a0b50f31b 100644
--- a/packages/features/ee/teams/lib/payments.ts
+++ b/packages/features/ee/teams/lib/payments.ts
@@ -117,10 +117,8 @@ export const updateQuantitySubscriptionFromStripe = async (teamId: number) => {
return;
}
- const newQuantity = membershipCount - subscriptionQuantity;
-
await stripe.subscriptions.update(subscriptionId, {
- items: [{ quantity: membershipCount + newQuantity, id: subscriptionItemId }],
+ items: [{ quantity: membershipCount, id: subscriptionItemId }],
});
console.info(
`Updated subscription ${subscriptionId} for team ${teamId} to ${team.members.length} seats.`
diff --git a/packages/features/ee/workflows/components/WorkflowListPage.tsx b/packages/features/ee/workflows/components/WorkflowListPage.tsx
index 9131e69979..5f9a3b9507 100644
--- a/packages/features/ee/workflows/components/WorkflowListPage.tsx
+++ b/packages/features/ee/workflows/components/WorkflowListPage.tsx
@@ -1,3 +1,4 @@
+import { useAutoAnimate } from "@formkit/auto-animate/react";
import type { Workflow, WorkflowStep, Membership } from "@prisma/client";
import Link from "next/link";
import { useRouter } from "next/navigation";
@@ -19,6 +20,7 @@ import {
Tooltip,
Badge,
Avatar,
+ ArrowButton,
} from "@calcom/ui";
import { Edit2, Link as LinkIcon, MoreHorizontal, Trash2 } from "@calcom/ui/components/icon";
@@ -56,192 +58,240 @@ export default function WorkflowListPage({ workflows }: Props) {
const utils = trpc.useContext();
const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
const [workflowToDeleteId, setwWorkflowToDeleteId] = useState(0);
+ const [parent] = useAutoAnimate();
const router = useRouter();
const orgBranding = useOrgBranding();
const urlPrefix = orgBranding ? `${orgBranding.slug}.${subdomainSuffix()}` : CAL_URL;
+ const mutation = trpc.viewer.workflowOrder.useMutation({
+ onError: async (err) => {
+ console.error(err.message);
+ await utils.viewer.workflows.filteredList.cancel();
+ await utils.viewer.workflows.filteredList.invalidate();
+ },
+ onSettled: () => {
+ utils.viewer.workflows.filteredList.invalidate();
+ },
+ });
+
+ async function moveWorkflow(index: number, increment: 1 | -1) {
+ const types = workflows!;
+
+ const newList = [...types];
+
+ const type = types[index];
+ const tmp = types[index + increment];
+ if (tmp) {
+ newList[index] = tmp;
+ newList[index + increment] = type;
+ }
+
+ await utils.viewer.appRoutingForms.forms.cancel();
+
+ mutation.mutate({
+ ids: newList?.map((type) => type.id),
+ });
+ }
+
return (
<>
{workflows && workflows.length > 0 ? (
-
- {workflows.map((workflow) => (
- -
-
-
-
-
-
- {workflow.name
- ? workflow.name
- : workflow.steps[0]
- ? "Untitled (" +
- `${t(`${workflow.steps[0].action.toLowerCase()}_action`)}`
- .charAt(0)
- .toUpperCase() +
- `${t(`${workflow.steps[0].action.toLowerCase()}_action`)}`.slice(1) +
- ")"
- : "Untitled"}
+
+ {workflows.map((workflow, index) => {
+ const firstItem = workflows[0];
+ const lastItem = workflows[workflows.length - 1];
+ return (
+ -
+ {!(firstItem && firstItem.id === workflow.id) && (
+ moveWorkflow(index, -1)} arrowDirection="up" />
+ )}
+ {!(lastItem && lastItem.id === workflow.id) && (
+ moveWorkflow(index, 1)} arrowDirection="down" />
+ )}
+
+
+
+
+
+ {workflow.name
+ ? workflow.name
+ : workflow.steps[0]
+ ? "Untitled (" +
+ `${t(`${workflow.steps[0].action.toLowerCase()}_action`)}`
+ .charAt(0)
+ .toUpperCase() +
+ `${t(`${workflow.steps[0].action.toLowerCase()}_action`)}`.slice(1) +
+ ")"
+ : "Untitled"}
+
+
+ {workflow.readOnly && (
+
+ {t("readonly")}
+
+ )}
+
-
- {workflow.readOnly && (
-
- {t("readonly")}
+
+
+ -
+
+
+ {getActionIcon(workflow.steps)}
+
+ {t("triggers")}
+ {workflow.timeUnit && workflow.time && (
+
+ {t(`${workflow.timeUnit.toLowerCase()}`, { count: workflow.time })}
+
+ )}
+ {t(`${workflow.trigger.toLowerCase()}_trigger`)}
+
- )}
-
-
-
-
+
+
+
+
+ {workflow.team?.name && (
+
+
+ {workflow.team.name}
-
-
- {workflow.team?.name && (
- -
-
- <>{workflow.team.name}>
-
-
- )}
-
-
+ )}
+
-
-
-
- {workflow.team?.name && (
-
-
- {workflow.team.name}
-
+
+
+
+
+
+
+
+
+
+
+ {!workflow.readOnly && (
+
+
+
+
+
+
+
+ await router.replace("/workflows/" + workflow.id)}>
+ {t("edit")}
+
+
+
+ {
+ setDeleteDialogOpen(true);
+ setwWorkflowToDeleteId(workflow.id);
+ }}>
+ {t("delete")}
+
+
+
+
+
)}
-
-
-
-
-
-
-
-
-
-
- {!workflow.readOnly && (
-
-
-
-
-
-
-
- await router.replace("/workflows/" + workflow.id)}>
- {t("edit")}
-
-
-
- {
- setDeleteDialogOpen(true);
- setwWorkflowToDeleteId(workflow.id);
- }}>
- {t("delete")}
-
-
-
-
-
- )}
-
-
-
- ))}
+
+ );
+ })}
{t("select_date")}
setSelectedDate(date ? date.format("YYYY-MM-DD") : date)}
- onMonthChange={(date) => {
+ onChange={(date: Dayjs | null) => {
+ setSelectedDate(date === null ? date : date.format("YYYY-MM-DD"));
+ }}
+ onMonthChange={(date: Dayjs) => {
setMonth(date.format("YYYY-MM"));
setSelectedDate(date.format("YYYY-MM-DD"));
}}
@@ -245,36 +248,24 @@ const EmailEmbed = ({ eventType, username }: { eventType?: EventType; username:
{selectedDate ? (
-
-
- setSelectTime((prev) => !prev)}>
- {t("select_time")} {" "}
- <>
- {!selectedDate || !selectTime ? : }
- >
-
- {selectTime && selectedDate ? (
-
- ) : null}
-
-
+ {selectTime && selectedDate ? (
+
+ ) : null}
) : null}
diff --git a/packages/features/schedules/components/DateOverrideInputDialog.tsx b/packages/features/schedules/components/DateOverrideInputDialog.tsx
index f908d35c99..b4f50a19eb 100644
--- a/packages/features/schedules/components/DateOverrideInputDialog.tsx
+++ b/packages/features/schedules/components/DateOverrideInputDialog.tsx
@@ -51,11 +51,7 @@ const DateOverrideForm = ({
const [selectedDates, setSelectedDates] = useState (value ? [dayjs.utc(value[0].start)] : []);
- const onDateChange = (newDate: Dayjs | null) => {
- // If no date is selected, do nothing
- if (!newDate) {
- return;
- }
+ const onDateChange = (newDate: Dayjs) => {
// If clicking on a selected date unselect it
if (selectedDates.some((date) => yyyymmdd(date) === yyyymmdd(newDate))) {
setSelectedDates(selectedDates.filter((date) => yyyymmdd(date) !== yyyymmdd(newDate)));
@@ -154,7 +150,9 @@ const DateOverrideForm = ({
excludedDates={excludedDates}
weekStart={0}
selected={selectedDates}
- onChange={(day) => onDateChange(day)}
+ onChange={(day) => {
+ if (day) onDateChange(day);
+ }}
onMonthChange={(newMonth) => {
setBrowsingDate(newMonth);
}}
diff --git a/packages/features/shell/Shell.tsx b/packages/features/shell/Shell.tsx
index 0b4e5b881a..6a6b353749 100644
--- a/packages/features/shell/Shell.tsx
+++ b/packages/features/shell/Shell.tsx
@@ -369,7 +369,7 @@ function UserDropdown({ small }: UserDropdownProps) {
{item.icon && (
@@ -906,7 +906,7 @@ function SideBar({ bannersHeight, user }: SideBarProps) {
diff --git a/packages/features/users/components/UserTable/EditSheet/SheetFooterControls.tsx b/packages/features/users/components/UserTable/EditSheet/SheetFooterControls.tsx
index faa6499654..2f5ffc5aac 100644
--- a/packages/features/users/components/UserTable/EditSheet/SheetFooterControls.tsx
+++ b/packages/features/users/components/UserTable/EditSheet/SheetFooterControls.tsx
@@ -35,7 +35,7 @@ function MoreInfoFooter() {
return (
<>
-
diff --git a/packages/features/users/components/UserTable/InviteMemberModal.tsx b/packages/features/users/components/UserTable/InviteMemberModal.tsx
index 9b92bdf1ef..cead1d6775 100644
--- a/packages/features/users/components/UserTable/InviteMemberModal.tsx
+++ b/packages/features/users/components/UserTable/InviteMemberModal.tsx
@@ -60,6 +60,7 @@ export function InviteMemberModal(props: Props) {
});
}}
teamId={orgId}
+ justEmailInvites={!!orgId}
isLoading={inviteMemberMutation.isLoading}
onSubmit={(values) => {
inviteMemberMutation.mutate({
diff --git a/packages/lib/CalendarService.ts b/packages/lib/CalendarService.ts
index c18dec7332..da4a32f7fd 100644
--- a/packages/lib/CalendarService.ts
+++ b/packages/lib/CalendarService.ts
@@ -153,12 +153,14 @@ export default abstract class BaseCalendarService implements Calendar {
if (error || !iCalString)
throw new Error(`Error creating iCalString:=> ${error?.message} : ${error?.name} `);
+ const [mainHostDestinationCalendar] = event.destinationCalendar ?? [];
+
// We create the event directly on iCal
const responses = await Promise.all(
calendars
.filter((c) =>
- event.destinationCalendar?.externalId
- ? c.externalId === event.destinationCalendar.externalId
+ mainHostDestinationCalendar?.externalId
+ ? c.externalId === mainHostDestinationCalendar.externalId
: true
)
.map((calendar) =>
@@ -504,13 +506,13 @@ export default abstract class BaseCalendarService implements Calendar {
return calendars.reduce((newCalendars, calendar) => {
if (!calendar.components?.includes("VEVENT")) return newCalendars;
-
+ const [mainHostDestinationCalendar] = event?.destinationCalendar ?? [];
newCalendars.push({
externalId: calendar.url,
/** @url https://github.com/calcom/cal.com/issues/7186 */
name: typeof calendar.displayName === "string" ? calendar.displayName : "",
- primary: event?.destinationCalendar?.externalId
- ? event.destinationCalendar.externalId === calendar.url
+ primary: mainHostDestinationCalendar?.externalId
+ ? mainHostDestinationCalendar.externalId === calendar.url
: false,
integration: this.integrationName,
email: this.credentials.username ?? "",
diff --git a/packages/lib/payment/handlePayment.ts b/packages/lib/payment/handlePayment.ts
index 3cbb6a224b..90155a56bd 100644
--- a/packages/lib/payment/handlePayment.ts
+++ b/packages/lib/payment/handlePayment.ts
@@ -59,7 +59,8 @@ const handlePayment = async (
},
booking.id,
bookerEmail,
- paymentOption
+ paymentOption,
+ evt.title
);
}
diff --git a/packages/lib/server/queries/teams/index.ts b/packages/lib/server/queries/teams/index.ts
index bfac687cbe..35e8cfe248 100644
--- a/packages/lib/server/queries/teams/index.ts
+++ b/packages/lib/server/queries/teams/index.ts
@@ -1,10 +1,9 @@
import { Prisma } from "@prisma/client";
import { getAppFromSlug } from "@calcom/app-store/utils";
-import { getCalendarCredentials, getConnectedCalendars } from "@calcom/core/CalendarManager";
import { getSlugOrRequestedSlug } from "@calcom/ee/organizations/lib/orgDomains";
import prisma, { baseEventTypeSelect } from "@calcom/prisma";
-import { AppCategories, SchedulingType } from "@calcom/prisma/enums";
+import { SchedulingType } from "@calcom/prisma/enums";
import { EventTypeMetaDataSchema, teamMetadataSchema } from "@calcom/prisma/zod-utils";
import { WEBAPP_URL } from "../../../constants";
@@ -32,7 +31,17 @@ export async function getTeamWithMembers(args: {
selectedCalendars: true,
credentials: {
include: {
- app: true,
+ app: {
+ select: {
+ slug: true,
+ categories: true,
+ },
+ },
+ destinationCalendars: {
+ select: {
+ externalId: true,
+ },
+ },
},
},
});
@@ -124,43 +133,39 @@ export async function getTeamWithMembers(args: {
});
if (!team) return null;
- const members = await Promise.all(
- team.members.map(async (obj) => {
- const calendarCredentials = getCalendarCredentials(obj.user.credentials);
- const { connectedCalendars } = await getConnectedCalendars(
- calendarCredentials,
- obj.user.selectedCalendars,
- obj.user.destinationCalendar?.externalId
- );
- const connectedApps = obj.user.credentials
- .map(({ app, id }) => {
- const appMetaData = getAppFromSlug(app?.slug);
+ // This should improve performance saving already app data found.
+ const appDataMap = new Map();
+
+ const members = team.members.map((obj) => {
+ return {
+ ...obj.user,
+ role: obj.role,
+ accepted: obj.accepted,
+ disableImpersonation: obj.disableImpersonation,
+ avatar: `${WEBAPP_URL}/${obj.user.username}/avatar.png`,
+ connectedApps: obj.user.credentials.map((cred) => {
+ const appSlug = cred.app?.slug;
+ let appData = appDataMap.get(appSlug);
+
+ if (!appData) {
+ appData = getAppFromSlug(appSlug);
+ appDataMap.set(appSlug, appData);
+ }
+
+ const isCalendar = cred?.app?.categories.includes("calendar");
+ const externalId = isCalendar ? cred.destinationCalendars[0]?.externalId : undefined;
+
+ return {
+ name: appData?.name,
+ logo: appData?.logo,
+ app: cred.app,
+ externalId,
+ };
+ }),
+ };
+ });
- if (app?.categories.includes(AppCategories.calendar)) {
- const externalId = connectedCalendars.find((cal) => cal.credentialId == id)?.primary?.email;
- return { name: appMetaData?.name, logo: appMetaData?.logo, slug: appMetaData?.slug, externalId };
- }
- return { name: appMetaData?.name, logo: appMetaData?.logo, slug: appMetaData?.slug };
- })
- .sort((a, b) => (a.slug ?? "").localeCompare(b.slug ?? ""));
- // Prevent credentials from leaking to frontend
- const {
- credentials: _credentials,
- destinationCalendar: _destinationCalendar,
- selectedCalendars: _selectedCalendars,
- ...rest
- } = {
- ...obj.user,
- role: obj.role,
- accepted: obj.accepted,
- disableImpersonation: obj.disableImpersonation,
- avatar: `${WEBAPP_URL}/${obj.user.username}/avatar.png`,
- connectedApps,
- };
- return rest;
- })
- );
const eventTypes = team.eventTypes.map((eventType) => ({
...eventType,
metadata: EventTypeMetaDataSchema.parse(eventType.metadata),
diff --git a/packages/lib/telemetry.ts b/packages/lib/telemetry.ts
index 863196ef11..385aaa4266 100644
--- a/packages/lib/telemetry.ts
+++ b/packages/lib/telemetry.ts
@@ -19,9 +19,6 @@ export const telemetryEventTypes = {
onboardingStarted: "onboarding_started",
signup: "signup",
team_created: "team_created",
- website: {
- pageView: "website_page_view",
- },
slugReplacementAction: "slug_replacement_action",
org_created: "org_created",
};
diff --git a/packages/prisma/migrations/20230815131901_add_position_column_to_routing_forms_and_workflows/migration.sql b/packages/prisma/migrations/20230815131901_add_position_column_to_routing_forms_and_workflows/migration.sql
new file mode 100644
index 0000000000..5866660892
--- /dev/null
+++ b/packages/prisma/migrations/20230815131901_add_position_column_to_routing_forms_and_workflows/migration.sql
@@ -0,0 +1,5 @@
+-- AlterTable
+ALTER TABLE "App_RoutingForms_Form" ADD COLUMN "position" INTEGER NOT NULL DEFAULT 0;
+
+-- AlterTable
+ALTER TABLE "Workflow" ADD COLUMN "position" INTEGER NOT NULL DEFAULT 0;
diff --git a/packages/prisma/package.json b/packages/prisma/package.json
index 1a5a5edbe2..ad29c2234e 100644
--- a/packages/prisma/package.json
+++ b/packages/prisma/package.json
@@ -28,7 +28,7 @@
"@prisma/generator-helper": "^5.0.0",
"prisma": "^5.0.0",
"ts-node": "^10.9.1",
- "zod": "^3.20.2",
+ "zod": "^3.22.2",
"zod-prisma": "^0.5.4"
},
"main": "index.ts",
diff --git a/packages/prisma/schema.prisma b/packages/prisma/schema.prisma
index 5e066435d7..80a4c25478 100644
--- a/packages/prisma/schema.prisma
+++ b/packages/prisma/schema.prisma
@@ -662,6 +662,7 @@ model App {
model App_RoutingForms_Form {
id String @id @default(cuid())
description String?
+ position Int @default(0)
routes Json?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@ -746,6 +747,7 @@ model WorkflowStep {
model Workflow {
id Int @id @default(autoincrement())
+ position Int @default(0)
name String
userId Int?
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
diff --git a/packages/prisma/zod-utils.ts b/packages/prisma/zod-utils.ts
index 61ef2c6fa0..1b62e2e1d3 100644
--- a/packages/prisma/zod-utils.ts
+++ b/packages/prisma/zod-utils.ts
@@ -4,6 +4,7 @@ import z, { ZodNullable, ZodObject, ZodOptional } from "zod";
/* eslint-disable no-underscore-dangle */
import type {
+ AnyZodObject,
objectInputType,
objectOutputType,
ZodNullableDef,
@@ -528,11 +529,13 @@ export const optionToValueSchema = (valueSchema: T) =>
* @url https://github.com/colinhacks/zod/discussions/1655#discussioncomment-4367368
*/
export const getParserWithGeneric =
- (valueSchema: T) =>
+ (valueSchema: T) =>
(data: Data) => {
- type Output = z.infer;
+ type Output = z.infer;
+ type SimpleFormValues = string | number | null | undefined;
return valueSchema.parse(data) as {
- [key in keyof Data]: key extends keyof Output ? Output[key] : Data[key];
+ // TODO: Invesitage why this broke on zod 3.22.2 upgrade
+ [key in keyof Data]: Data[key] extends SimpleFormValues ? Data[key] : Output[key];
};
};
export const sendDailyVideoRecordingEmailsSchema = z.object({
diff --git a/packages/trpc/package.json b/packages/trpc/package.json
index 1abd5d0dfc..fa90e639d0 100644
--- a/packages/trpc/package.json
+++ b/packages/trpc/package.json
@@ -17,6 +17,6 @@
"@trpc/react-query": "^10.13.0",
"@trpc/server": "^10.13.0",
"superjson": "1.9.1",
- "zod": "^3.20.2"
+ "zod": "^3.22.2"
}
}
diff --git a/packages/trpc/server/routers/loggedInViewer/_router.tsx b/packages/trpc/server/routers/loggedInViewer/_router.tsx
index 53b16704bb..1c96204997 100644
--- a/packages/trpc/server/routers/loggedInViewer/_router.tsx
+++ b/packages/trpc/server/routers/loggedInViewer/_router.tsx
@@ -11,10 +11,12 @@ import { ZGetCalVideoRecordingsInputSchema } from "./getCalVideoRecordings.schem
import { ZGetDownloadLinkOfCalVideoRecordingsInputSchema } from "./getDownloadLinkOfCalVideoRecordings.schema";
import { ZIntegrationsInputSchema } from "./integrations.schema";
import { ZLocationOptionsInputSchema } from "./locationOptions.schema";
+import { ZRoutingFormOrderInputSchema } from "./routingFormOrder.schema";
import { ZSetDestinationCalendarInputSchema } from "./setDestinationCalendar.schema";
import { ZSubmitFeedbackInputSchema } from "./submitFeedback.schema";
import { ZUpdateProfileInputSchema } from "./updateProfile.schema";
import { ZUpdateUserDefaultConferencingAppInputSchema } from "./updateUserDefaultConferencingApp.schema";
+import { ZWorkflowOrderInputSchema } from "./workflowOrder.schema";
type AppsRouterHandlerCache = {
me?: typeof import("./me.handler").meHandler;
@@ -31,6 +33,8 @@ type AppsRouterHandlerCache = {
stripeCustomer?: typeof import("./stripeCustomer.handler").stripeCustomerHandler;
updateProfile?: typeof import("./updateProfile.handler").updateProfileHandler;
eventTypeOrder?: typeof import("./eventTypeOrder.handler").eventTypeOrderHandler;
+ routingFormOrder?: typeof import("./routingFormOrder.handler").routingFormOrderHandler;
+ workflowOrder?: typeof import("./workflowOrder.handler").workflowOrderHandler;
submitFeedback?: typeof import("./submitFeedback.handler").submitFeedbackHandler;
locationOptions?: typeof import("./locationOptions.handler").locationOptionsHandler;
deleteCredential?: typeof import("./deleteCredential.handler").deleteCredentialHandler;
@@ -230,6 +234,34 @@ export const loggedInViewerRouter = router({
return UNSTABLE_HANDLER_CACHE.eventTypeOrder({ ctx, input });
}),
+ routingFormOrder: authedProcedure.input(ZRoutingFormOrderInputSchema).mutation(async ({ ctx, input }) => {
+ if (!UNSTABLE_HANDLER_CACHE.routingFormOrder) {
+ UNSTABLE_HANDLER_CACHE.routingFormOrder = (
+ await import("./routingFormOrder.handler")
+ ).routingFormOrderHandler;
+ }
+
+ // Unreachable code but required for type safety
+ if (!UNSTABLE_HANDLER_CACHE.routingFormOrder) {
+ throw new Error("Failed to load handler");
+ }
+
+ return UNSTABLE_HANDLER_CACHE.routingFormOrder({ ctx, input });
+ }),
+
+ workflowOrder: authedProcedure.input(ZWorkflowOrderInputSchema).mutation(async ({ ctx, input }) => {
+ if (!UNSTABLE_HANDLER_CACHE.workflowOrder) {
+ UNSTABLE_HANDLER_CACHE.workflowOrder = (await import("./workflowOrder.handler")).workflowOrderHandler;
+ }
+
+ // Unreachable code but required for type safety
+ if (!UNSTABLE_HANDLER_CACHE.workflowOrder) {
+ throw new Error("Failed to load handler");
+ }
+
+ return UNSTABLE_HANDLER_CACHE.workflowOrder({ ctx, input });
+ }),
+
//Comment for PR: eventTypePosition is not used anywhere
submitFeedback: authedProcedure.input(ZSubmitFeedbackInputSchema).mutation(async ({ ctx, input }) => {
if (!UNSTABLE_HANDLER_CACHE.submitFeedback) {
diff --git a/packages/trpc/server/routers/loggedInViewer/deleteCredential.handler.ts b/packages/trpc/server/routers/loggedInViewer/deleteCredential.handler.ts
index 716f3cf843..71867572a1 100644
--- a/packages/trpc/server/routers/loggedInViewer/deleteCredential.handler.ts
+++ b/packages/trpc/server/routers/loggedInViewer/deleteCredential.handler.ts
@@ -287,7 +287,11 @@ export const deleteCredentialHandler = async ({ ctx, input }: DeleteCredentialOp
uid: booking.uid,
recurringEvent: parseRecurringEvent(booking.eventType?.recurringEvent),
location: booking.location,
- destinationCalendar: booking.destinationCalendar || booking.user?.destinationCalendar,
+ destinationCalendar: booking.destinationCalendar
+ ? [booking.destinationCalendar]
+ : booking.user?.destinationCalendar
+ ? [booking.user?.destinationCalendar]
+ : [],
cancellationReason: "Payment method removed by organizer",
seatsPerTimeSlot: booking.eventType?.seatsPerTimeSlot,
seatsShowAttendees: booking.eventType?.seatsShowAttendees,
diff --git a/packages/trpc/server/routers/loggedInViewer/routingFormOrder.handler.ts b/packages/trpc/server/routers/loggedInViewer/routingFormOrder.handler.ts
new file mode 100644
index 0000000000..de6da5c966
--- /dev/null
+++ b/packages/trpc/server/routers/loggedInViewer/routingFormOrder.handler.ts
@@ -0,0 +1,72 @@
+import { prisma } from "@calcom/prisma";
+import type { TrpcSessionUser } from "@calcom/trpc/server/trpc";
+
+import { TRPCError } from "@trpc/server";
+
+import type { TRoutingFormOrderInputSchema } from "./routingFormOrder.schema";
+
+type RoutingFormOrderOptions = {
+ ctx: {
+ user: NonNullable;
+ };
+ input: TRoutingFormOrderInputSchema;
+};
+
+export const routingFormOrderHandler = async ({ ctx, input }: RoutingFormOrderOptions) => {
+ const { user } = ctx;
+
+ const forms = await prisma.app_RoutingForms_Form.findMany({
+ where: {
+ OR: [
+ {
+ userId: user.id,
+ },
+ {
+ team: {
+ members: {
+ some: {
+ userId: user.id,
+ accepted: true,
+ },
+ },
+ },
+ },
+ ],
+ },
+ orderBy: {
+ createdAt: "desc",
+ },
+ include: {
+ team: {
+ include: {
+ members: true,
+ },
+ },
+ _count: {
+ select: {
+ responses: true,
+ },
+ },
+ },
+ });
+
+ const allFormIds = new Set(forms.map((form) => form.id));
+ if (input.ids.some((id) => !allFormIds.has(id))) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ });
+ }
+
+ await Promise.all(
+ input.ids.reverse().map((id, position) => {
+ return prisma.app_RoutingForms_Form.update({
+ where: {
+ id: id,
+ },
+ data: {
+ position,
+ },
+ });
+ })
+ );
+};
diff --git a/packages/trpc/server/routers/loggedInViewer/routingFormOrder.schema.ts b/packages/trpc/server/routers/loggedInViewer/routingFormOrder.schema.ts
new file mode 100644
index 0000000000..014a14859d
--- /dev/null
+++ b/packages/trpc/server/routers/loggedInViewer/routingFormOrder.schema.ts
@@ -0,0 +1,7 @@
+import { z } from "zod";
+
+export const ZRoutingFormOrderInputSchema = z.object({
+ ids: z.array(z.string()),
+});
+
+export type TRoutingFormOrderInputSchema = z.infer;
diff --git a/packages/trpc/server/routers/loggedInViewer/workflowOrder.handler.ts b/packages/trpc/server/routers/loggedInViewer/workflowOrder.handler.ts
new file mode 100644
index 0000000000..552ebb1f6f
--- /dev/null
+++ b/packages/trpc/server/routers/loggedInViewer/workflowOrder.handler.ts
@@ -0,0 +1,173 @@
+import type { TFormSchema } from "@calcom/app-store/routing-forms/trpc/forms.schema";
+import { hasFilter } from "@calcom/features/filters/lib/hasFilter";
+import { prisma } from "@calcom/prisma";
+import type { Prisma } from "@calcom/prisma/client";
+import { entries } from "@calcom/prisma/zod-utils";
+import type { TrpcSessionUser } from "@calcom/trpc/server/trpc";
+
+import { TRPCError } from "@trpc/server";
+
+import type { TWorkflowOrderInputSchema } from "./workflowOrder.schema";
+
+type RoutingFormOrderOptions = {
+ ctx: {
+ user: NonNullable;
+ };
+ input: TWorkflowOrderInputSchema;
+};
+
+export const workflowOrderHandler = async ({ ctx, input }: RoutingFormOrderOptions) => {
+ const { user } = ctx;
+
+ const includedFields = {
+ activeOn: {
+ select: {
+ eventType: {
+ select: {
+ id: true,
+ title: true,
+ parentId: true,
+ _count: {
+ select: {
+ children: true,
+ },
+ },
+ },
+ },
+ },
+ },
+ steps: true,
+ team: {
+ select: {
+ id: true,
+ slug: true,
+ name: true,
+ members: true,
+ logo: true,
+ },
+ },
+ };
+
+ const allWorkflows = await prisma.workflow.findMany({
+ where: {
+ OR: [
+ {
+ userId: user.id,
+ },
+ {
+ team: {
+ members: {
+ some: {
+ userId: user.id,
+ accepted: true,
+ },
+ },
+ },
+ },
+ ],
+ },
+ include: includedFields,
+ orderBy: [
+ {
+ position: "desc",
+ },
+ {
+ id: "asc",
+ },
+ ],
+ });
+
+ const allWorkflowIds = new Set(allWorkflows.map((workflow) => workflow.id));
+ if (input.ids.some((id) => !allWorkflowIds.has(id))) {
+ throw new TRPCError({
+ code: "UNAUTHORIZED",
+ });
+ }
+
+ await Promise.all(
+ input.ids.reverse().map((id, position) => {
+ return prisma.workflow.update({
+ where: {
+ id: id,
+ },
+ data: {
+ position,
+ },
+ });
+ })
+ );
+};
+
+export function getPrismaWhereFromFilters(
+ user: {
+ id: number;
+ },
+ filters: NonNullable["filters"]
+) {
+ const where = {
+ OR: [] as Prisma.App_RoutingForms_FormWhereInput[],
+ };
+
+ const prismaQueries: Record<
+ keyof NonNullable,
+ (...args: [number[]]) => Prisma.App_RoutingForms_FormWhereInput
+ > & {
+ all: () => Prisma.App_RoutingForms_FormWhereInput;
+ } = {
+ userIds: (userIds: number[]) => ({
+ userId: {
+ in: userIds,
+ },
+ teamId: null,
+ }),
+ teamIds: (teamIds: number[]) => ({
+ team: {
+ id: {
+ in: teamIds ?? [],
+ },
+ members: {
+ some: {
+ userId: user.id,
+ accepted: true,
+ },
+ },
+ },
+ }),
+ all: () => ({
+ OR: [
+ {
+ userId: user.id,
+ },
+ {
+ team: {
+ members: {
+ some: {
+ userId: user.id,
+ accepted: true,
+ },
+ },
+ },
+ },
+ ],
+ }),
+ };
+
+ if (!filters || !hasFilter(filters)) {
+ where.OR.push(prismaQueries.all());
+ } else {
+ for (const entry of entries(filters)) {
+ if (!entry) {
+ continue;
+ }
+ const [filterName, filter] = entry;
+ const getPrismaQuery = prismaQueries[filterName];
+ // filter might be accidentally set undefined as well
+ if (!getPrismaQuery || !filter) {
+ continue;
+ }
+ where.OR.push(getPrismaQuery(filter));
+ }
+ }
+
+ return where;
+}
diff --git a/packages/trpc/server/routers/loggedInViewer/workflowOrder.schema.ts b/packages/trpc/server/routers/loggedInViewer/workflowOrder.schema.ts
new file mode 100644
index 0000000000..695c0a56e1
--- /dev/null
+++ b/packages/trpc/server/routers/loggedInViewer/workflowOrder.schema.ts
@@ -0,0 +1,7 @@
+import { z } from "zod";
+
+export const ZWorkflowOrderInputSchema = z.object({
+ ids: z.array(z.number()),
+});
+
+export type TWorkflowOrderInputSchema = z.infer;
diff --git a/packages/trpc/server/routers/viewer/bookings/confirm.handler.ts b/packages/trpc/server/routers/viewer/bookings/confirm.handler.ts
index 8d32d64c15..d3182bdfc0 100644
--- a/packages/trpc/server/routers/viewer/bookings/confirm.handler.ts
+++ b/packages/trpc/server/routers/viewer/bookings/confirm.handler.ts
@@ -172,7 +172,11 @@ export const confirmHandler = async ({ ctx, input }: ConfirmOptions) => {
attendees: attendeesList,
location: booking.location ?? "",
uid: booking.uid,
- destinationCalendar: booking?.destinationCalendar || user.destinationCalendar,
+ destinationCalendar: booking?.destinationCalendar
+ ? [booking.destinationCalendar]
+ : user.destinationCalendar
+ ? [user.destinationCalendar]
+ : [],
requiresConfirmation: booking?.eventType?.requiresConfirmation ?? false,
eventTypeId: booking.eventType?.id,
};
diff --git a/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts b/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts
index 19695fd445..e4110f2405 100644
--- a/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts
+++ b/packages/trpc/server/routers/viewer/bookings/editLocation.handler.ts
@@ -82,7 +82,11 @@ export const editLocationHandler = async ({ ctx, input }: EditLocationOptions) =
recurringEvent: parseRecurringEvent(booking.eventType?.recurringEvent),
location,
conferenceCredentialId: details?.credentialId,
- destinationCalendar: booking?.destinationCalendar || booking?.user?.destinationCalendar,
+ destinationCalendar: booking?.destinationCalendar
+ ? [booking?.destinationCalendar]
+ : booking?.user?.destinationCalendar
+ ? [booking?.user?.destinationCalendar]
+ : [],
seatsPerTimeSlot: booking.eventType?.seatsPerTimeSlot,
seatsShowAttendees: booking.eventType?.seatsShowAttendees,
};
diff --git a/packages/trpc/server/routers/viewer/bookings/requestReschedule.handler.ts b/packages/trpc/server/routers/viewer/bookings/requestReschedule.handler.ts
index 096f229200..7d1de17503 100644
--- a/packages/trpc/server/routers/viewer/bookings/requestReschedule.handler.ts
+++ b/packages/trpc/server/routers/viewer/bookings/requestReschedule.handler.ts
@@ -237,7 +237,9 @@ export const requestRescheduleHandler = async ({ ctx, input }: RequestReschedule
),
uid: bookingToReschedule?.uid,
location: bookingToReschedule?.location,
- destinationCalendar: bookingToReschedule?.destinationCalendar || bookingToReschedule?.destinationCalendar,
+ destinationCalendar: bookingToReschedule?.destinationCalendar
+ ? [bookingToReschedule?.destinationCalendar]
+ : [],
cancellationReason: `Please reschedule. ${cancellationReason}`, // TODO::Add i18-next for this
};
diff --git a/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts b/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts
index da8109abdb..dc0f28781a 100644
--- a/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts
+++ b/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts
@@ -260,6 +260,9 @@ export const updateHandler = async ({ ctx, input }: UpdateOptions) => {
const { default_currency } = stripeDataSchema.parse(paymentCredential.key);
data.currency = default_currency;
}
+ if (paymentCredential?.type === "paypal_payment" && input.metadata?.apps?.paypal?.currency) {
+ data.currency = input.metadata?.apps?.paypal?.currency.toLowerCase();
+ }
}
const connectedLink = await ctx.prisma.hashedLink.findFirst({
diff --git a/packages/trpc/server/routers/viewer/organizations/create.handler.ts b/packages/trpc/server/routers/viewer/organizations/create.handler.ts
index 2cfabcf5fe..c80deb4774 100644
--- a/packages/trpc/server/routers/viewer/organizations/create.handler.ts
+++ b/packages/trpc/server/routers/viewer/organizations/create.handler.ts
@@ -148,9 +148,9 @@ export const createHandler = async ({ input, ctx }: CreateOptions) => {
organization: {
create: {
name,
- ...(!IS_TEAM_BILLING_ENABLED && { slug }),
+ ...(IS_TEAM_BILLING_ENABLED ? { slug } : {}),
metadata: {
- ...(IS_TEAM_BILLING_ENABLED && { requestedSlug: slug }),
+ ...(IS_TEAM_BILLING_ENABLED ? { requestedSlug: slug } : {}),
isOrganization: true,
isOrganizationVerified: false,
isOrganizationConfigured,
diff --git a/packages/trpc/server/routers/viewer/organizations/update.handler.ts b/packages/trpc/server/routers/viewer/organizations/update.handler.ts
index ec8d1fad92..85cf437a47 100644
--- a/packages/trpc/server/routers/viewer/organizations/update.handler.ts
+++ b/packages/trpc/server/routers/viewer/organizations/update.handler.ts
@@ -24,11 +24,12 @@ export const updateHandler = async ({ ctx, input }: UpdateOptions) => {
// A user can only have one org so we pass in their currentOrgId here
const currentOrgId = ctx.user?.organization?.id || input.orgId;
- if (!currentOrgId || ctx.user.role !== UserPermissionRole.ADMIN)
- throw new TRPCError({ code: "UNAUTHORIZED" });
+ const isUserOrganizationAdmin = currentOrgId && (await isOrganisationAdmin(ctx.user?.id, currentOrgId));
+ const isUserRoleAdmin = ctx.user.role === UserPermissionRole.ADMIN;
- if (!(await isOrganisationAdmin(ctx.user?.id, currentOrgId)) || ctx.user.role !== UserPermissionRole.ADMIN)
- throw new TRPCError({ code: "UNAUTHORIZED" });
+ const isUserAuthorizedToUpdate = !!(isUserOrganizationAdmin || isUserRoleAdmin);
+
+ if (!currentOrgId || !isUserAuthorizedToUpdate) throw new TRPCError({ code: "UNAUTHORIZED" });
if (input.slug) {
const userConflict = await prisma.team.findMany({
diff --git a/packages/trpc/server/routers/viewer/teams/inviteMember/inviteMember.handler.ts b/packages/trpc/server/routers/viewer/teams/inviteMember/inviteMember.handler.ts
index 79536c7547..39b4356e36 100644
--- a/packages/trpc/server/routers/viewer/teams/inviteMember/inviteMember.handler.ts
+++ b/packages/trpc/server/routers/viewer/teams/inviteMember/inviteMember.handler.ts
@@ -56,7 +56,7 @@ export const inviteMemberHandler = async ({ ctx, input }: InviteMemberOptions) =
});
const invitee = await getUserToInviteOrThrowIfExists({
usernameOrEmail,
- orgId: input.teamId,
+ teamId: input.teamId,
isOrg: input.isOrg,
});
diff --git a/packages/trpc/server/routers/viewer/teams/inviteMember/utils.ts b/packages/trpc/server/routers/viewer/teams/inviteMember/utils.ts
index 744349e7c3..e4142789fa 100644
--- a/packages/trpc/server/routers/viewer/teams/inviteMember/utils.ts
+++ b/packages/trpc/server/routers/viewer/teams/inviteMember/utils.ts
@@ -66,17 +66,21 @@ export async function getEmailsToInvite(usernameOrEmail: string | string[]) {
export async function getUserToInviteOrThrowIfExists({
usernameOrEmail,
- orgId,
+ teamId,
isOrg,
}: {
usernameOrEmail: string;
- orgId: number;
+ teamId: number;
isOrg?: boolean;
}) {
// Check if user exists in ORG or exists all together
+
+ const orgWhere = isOrg && {
+ organizationId: teamId,
+ };
const invitee = await prisma.user.findFirst({
where: {
- OR: [{ username: usernameOrEmail, organizationId: orgId }, { email: usernameOrEmail }],
+ OR: [{ username: usernameOrEmail, ...orgWhere }, { email: usernameOrEmail }],
},
});
diff --git a/packages/trpc/server/routers/viewer/workflows/filteredList.handler.tsx b/packages/trpc/server/routers/viewer/workflows/filteredList.handler.tsx
index fc8197ed71..ef117f3241 100644
--- a/packages/trpc/server/routers/viewer/workflows/filteredList.handler.tsx
+++ b/packages/trpc/server/routers/viewer/workflows/filteredList.handler.tsx
@@ -70,9 +70,14 @@ export const filteredListHandler = async ({ ctx, input }: FilteredListOptions) =
],
},
include: includedFields,
- orderBy: {
- id: "asc",
- },
+ orderBy: [
+ {
+ position: "desc",
+ },
+ {
+ id: "asc",
+ },
+ ],
});
if (!filtered) {
diff --git a/packages/types/Calendar.d.ts b/packages/types/Calendar.d.ts
index a7e3ba70a9..c5714c2c0d 100644
--- a/packages/types/Calendar.d.ts
+++ b/packages/types/Calendar.d.ts
@@ -8,6 +8,7 @@ import type z from "zod";
import type { bookingResponse } from "@calcom/features/bookings/lib/getBookingResponsesSchema";
import type { Calendar } from "@calcom/features/calendars/weeklyview";
import type { TimeFormat } from "@calcom/lib/timeFormat";
+import type { SchedulingType } from "@calcom/prisma/enums";
import type { Frequency } from "@calcom/prisma/zod-utils";
import type { CredentialPayload } from "@calcom/types/Credential";
@@ -167,7 +168,7 @@ export interface CalendarEvent {
videoCallData?: VideoCallData;
paymentInfo?: PaymentInfo | null;
requiresConfirmation?: boolean | null;
- destinationCalendar?: DestinationCalendar | null;
+ destinationCalendar?: DestinationCalendar[] | null;
cancellationReason?: string | null;
rejectionReason?: string | null;
hideCalendarNotes?: boolean;
@@ -178,6 +179,7 @@ export interface CalendarEvent {
seatsShowAttendees?: boolean | null;
attendeeSeatId?: string;
seatsPerTimeSlot?: number | null;
+ schedulingType?: SchedulingType | null;
iCalUID?: string | null;
// It has responses to all the fields(system + user)
@@ -216,7 +218,7 @@ export interface IntegrationCalendar extends Ensure, "
}
export interface Calendar {
- createEvent(event: CalendarEvent): Promise;
+ createEvent(event: CalendarEvent, credentialId: number): Promise;
updateEvent(
uid: string,
diff --git a/packages/types/EventManager.d.ts b/packages/types/EventManager.d.ts
index d93069f63e..14209e0b41 100644
--- a/packages/types/EventManager.d.ts
+++ b/packages/types/EventManager.d.ts
@@ -23,6 +23,7 @@ export interface EventResult {
calError?: string;
calWarnings?: string[];
credentialId?: number;
+ externalId?: string | null;
}
export interface CreateUpdateResult {
diff --git a/packages/types/PaymentService.d.ts b/packages/types/PaymentService.d.ts
index 26994b1bd3..43c4b29678 100644
--- a/packages/types/PaymentService.d.ts
+++ b/packages/types/PaymentService.d.ts
@@ -14,7 +14,8 @@ export interface IAbstractPaymentService {
payment: Pick,
bookingId: Booking["id"],
bookerEmail: string,
- paymentOption: PaymentOption
+ paymentOption: PaymentOption,
+ eventTitle?: string
): Promise;
/* This method is to collect card details to charge at a later date ex. no-show fees */
collectCard(
diff --git a/packages/ui/components/arrow-button/ArrowButton.tsx b/packages/ui/components/arrow-button/ArrowButton.tsx
new file mode 100644
index 0000000000..0abe2a8cfd
--- /dev/null
+++ b/packages/ui/components/arrow-button/ArrowButton.tsx
@@ -0,0 +1,26 @@
+import { ArrowUp, ArrowDown } from "@calcom/ui/components/icon";
+
+export type ArrowButtonProps = {
+ arrowDirection: "up" | "down";
+ onClick: () => void;
+};
+
+export function ArrowButton(props: ArrowButtonProps) {
+ return (
+ <>
+ {props.arrowDirection === "up" ? (
+
+
+
+ ) : (
+
+
+
+ )}
+ >
+ );
+}
diff --git a/packages/ui/components/arrow-button/index.ts b/packages/ui/components/arrow-button/index.ts
new file mode 100644
index 0000000000..d1912265db
--- /dev/null
+++ b/packages/ui/components/arrow-button/index.ts
@@ -0,0 +1,2 @@
+export { ArrowButton } from "./ArrowButton";
+export type { ArrowButtonProps } from "./ArrowButton";
diff --git a/packages/ui/components/avatar/Avatar.tsx b/packages/ui/components/avatar/Avatar.tsx
index 572e9a2f19..4377f0fd22 100644
--- a/packages/ui/components/avatar/Avatar.tsx
+++ b/packages/ui/components/avatar/Avatar.tsx
@@ -40,7 +40,7 @@ export function Avatar(props: AvatarProps) {
let avatar = (
diff --git a/packages/ui/components/button/Button.tsx b/packages/ui/components/button/Button.tsx
index 75473ce2c4..74b17bbdff 100644
--- a/packages/ui/components/button/Button.tsx
+++ b/packages/ui/components/button/Button.tsx
@@ -52,7 +52,7 @@ export const buttonClasses = cva(
minimal:
"text-emphasis hover:bg-subtle focus-visible:bg-subtle focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-empthasis disabled:border-subtle disabled:bg-opacity-30 disabled:text-muted disabled:hover:bg-transparent disabled:hover:text-muted disabled:hover:border-subtle",
destructive:
- "border border-default text-emphasis hover:text-red-700 focus-visible:text-red-700 hover:border-red-100 focus-visible:border-red-100 hover:bg-error focus-visible:bg-error focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-red-700 disabled:bg-red-100 disabled:border-red-200 disabled:text-red-700 disabled:hover:border-red-200 disabled:opacity-40",
+ "border border-default text-emphasis hover:text-red-700 dark:hover:text-red-100 focus-visible:text-red-700 hover:border-red-100 focus-visible:border-red-100 hover:bg-error focus-visible:bg-error focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset focus-visible:ring-red-700 disabled:bg-red-100 disabled:border-red-200 disabled:text-red-700 disabled:hover:border-red-200 disabled:opacity-40",
},
size: {
sm: "px-3 py-2 leading-4 rounded-sm" /** For backwards compatibility */,
diff --git a/packages/ui/components/button/button.stories.mdx b/packages/ui/components/button/button.stories.mdx
index c4cafd4e95..4ee81d5b30 100644
--- a/packages/ui/components/button/button.stories.mdx
+++ b/packages/ui/components/button/button.stories.mdx
@@ -1,3 +1,4 @@
+import { TooltipProvider } from "@radix-ui/react-tooltip";
import { Canvas, Meta, Story, ArgsTable } from "@storybook/addon-docs";
import {
@@ -17,7 +18,7 @@ import { Button } from "./Button";
-
+
## Definition
@@ -170,6 +171,15 @@ Button are clickable elements that initiates user actions. Labels in the button
{
+ const darkVariantContainer = canvasElement.querySelector('[data-mode="dark"]');
+ const buttonElement = darkVariantContainer.querySelector("button");
+ buttonElement?.addEventListener("mouseover", () => {
+ setTimeout(() => {
+ document.querySelector('[data-testid="tooltip"]').classList.add("dark");
+ }, 55);
+ });
+ }}
args={{
color: "primary",
size: "base",
@@ -177,6 +187,7 @@ Button are clickable elements that initiates user actions. Labels in the button
disabled: false,
children: "Button text",
className: "",
+ tooltip: "tooltip",
}}
argTypes={{
color: {
@@ -212,19 +223,20 @@ Button are clickable elements that initiates user actions. Labels in the button
options: ["", "sb-pseudo--hover", "sb-pseudo--focus"],
},
},
+ tooltip: {
+ control: {
+ type: "text",
+ },
+ },
}}>
- {({ color, size, loading, disabled, children, className }) => (
+ {({ children, ...args }) => (
-
- {children}
-
+
+
+ {children}
+
+
)}
diff --git a/packages/ui/components/dialog/ConfirmationDialogContent.tsx b/packages/ui/components/dialog/ConfirmationDialogContent.tsx
index a9dabddd63..b25fbbc9c9 100644
--- a/packages/ui/components/dialog/ConfirmationDialogContent.tsx
+++ b/packages/ui/components/dialog/ConfirmationDialogContent.tsx
@@ -41,7 +41,7 @@ export function ConfirmationDialogContent(props: PropsWithChildren
{variety === "danger" && (
)}
{variety === "warning" && (
diff --git a/packages/ui/components/errorBoundary/errorboundary.stories.mdx b/packages/ui/components/errorBoundary/errorboundary.stories.mdx
new file mode 100644
index 0000000000..3c3745522e
--- /dev/null
+++ b/packages/ui/components/errorBoundary/errorboundary.stories.mdx
@@ -0,0 +1,64 @@
+import { Canvas, Meta, Story } from "@storybook/addon-docs";
+
+import {
+ Examples,
+ Example,
+ Title,
+ VariantsTable,
+ CustomArgsTable,
+ VariantRow,
+} from "@calcom/storybook/components";
+
+import ErrorBoundary from "./ErrorBoundary";
+import { Tooltip } from "../tooltip";
+
+
+
+
+
+## Definition
+
+ErrorBoundary is an element that catches JavaScript errors in their child component tree, log those errors and display a fallback UI.
+
+## Structure
+
+ErrorBoundary offers a flexible component capable of catching JavaScript errors and displaying it in the UI.
+
+
+
+
+
+
+ Child Component
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/ui/components/form/color-picker/colorpicker.stories.mdx b/packages/ui/components/form/color-picker/colorpicker.stories.mdx
new file mode 100644
index 0000000000..39398708b3
--- /dev/null
+++ b/packages/ui/components/form/color-picker/colorpicker.stories.mdx
@@ -0,0 +1,84 @@
+import { TooltipProvider } from "@radix-ui/react-tooltip";
+import { Canvas, Meta, Story } from "@storybook/addon-docs";
+
+import {
+ Example,
+ Title,
+ CustomArgsTable,
+ VariantRow,
+ VariantsTable,
+} from "@calcom/storybook/components";
+
+import ColorPicker from "./colorpicker";
+
+
+
+
+
+## Definitions
+
+`Color Picker` is used to select custom hex colors for from a range of values.
+
+## Structure
+
+The `Color Picker` takes in several props
+
+
+
+## Default:
+
+
+
+
+
+## ColorPicker Story
+
+
diff --git a/packages/ui/components/form/dropdown/Dropdown.tsx b/packages/ui/components/form/dropdown/Dropdown.tsx
index a91ef6a42d..50edacf4bb 100644
--- a/packages/ui/components/form/dropdown/Dropdown.tsx
+++ b/packages/ui/components/form/dropdown/Dropdown.tsx
@@ -138,7 +138,9 @@ export const DropdownItem = (props: DropdownItemProps) => {
{...rest}
className={classNames(
"hover:text-emphasis text-default inline-flex w-full items-center space-x-2 px-3 py-2 disabled:cursor-not-allowed",
- color === "destructive" ? "hover:bg-error hover:text-red-700" : "hover:bg-subtle",
+ color === "destructive"
+ ? "hover:bg-error hover:text-red-700 dark:hover:text-red-100"
+ : "hover:bg-subtle",
props.className
)}>
<>
diff --git a/packages/ui/components/form/dropdown/dropdown.stories.mdx b/packages/ui/components/form/dropdown/dropdown.stories.mdx
new file mode 100644
index 0000000000..e4ae5d0100
--- /dev/null
+++ b/packages/ui/components/form/dropdown/dropdown.stories.mdx
@@ -0,0 +1,361 @@
+import { Canvas, Story, Meta } from "@storybook/addon-docs";
+import { Button } from "@calcom/ui";
+
+import {
+ Examples,
+ Example,
+ Title,
+ CustomArgsTable,
+ VariantRow,
+ VariantsTable,
+} from "@calcom/storybook/components";
+
+import { Plus, Trash, Copy } from "@calcom/ui/components/icon";
+import {
+ Dropdown,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+} from "./Dropdown";
+
+
+
+
+
+## Definition
+
+`Dropdown` is an element that displays a menu to the user—such as a set of actions or functions.
+
+## Structure
+
+The `Dropdown` component can be used to display a menu to the user.
+
+
+
+### Dropdown components that have arguments:
+
+#### DropdownMenuTrigger
+
+
+
+#### DropdownMenuContent
+
+
+
+#### DropdownMenuItem
+
+
+
+#### DropdownMenuSeparator
+
+
+
+## Examples
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+
+
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+
+ Third
+
+
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+
+ more
+
+
+
+ First
+
+
+ Second
+
+
+
+ Third
+
+
+
+
+
+
+
+
+
+ more
+
+
+ Number
+
+ First
+
+
+ Second
+
+
+ Third
+
+
+
+
+
+
+## Dropdown Story
+
+
diff --git a/packages/ui/components/form/select/select.stories.mdx b/packages/ui/components/form/select/select.stories.mdx
index 80bda8d100..e2cc37c11f 100644
--- a/packages/ui/components/form/select/select.stories.mdx
+++ b/packages/ui/components/form/select/select.stories.mdx
@@ -1,9 +1,8 @@
-import { Canvas, Meta, Story, ArgsTable } from "@storybook/addon-docs";
+import { Canvas, Meta, Story } from "@storybook/addon-docs";
import {
Examples,
Example,
- Note,
Title,
CustomArgsTable,
VariantRow,
@@ -15,7 +14,7 @@ import { SelectField } from "./Select";
-
+
## Definition
@@ -101,11 +100,31 @@ const GoodSelect = (props) => ;
## Select Story
diff --git a/packages/ui/components/form/switch/switch.stories.mdx b/packages/ui/components/form/switch/switch.stories.mdx
new file mode 100644
index 0000000000..cef02ba66c
--- /dev/null
+++ b/packages/ui/components/form/switch/switch.stories.mdx
@@ -0,0 +1,97 @@
+import { TooltipProvider } from "@radix-ui/react-tooltip";
+import { Canvas, Meta, Story, ArgsTable } from "@storybook/addon-docs";
+
+import {
+ Examples,
+ Example,
+ Title,
+ VariantsTable,
+ CustomArgsTable,
+ VariantRow,
+} from "@calcom/storybook/components";
+
+import Switch from "./Switch";
+
+
+
+
+
+## Definition
+
+Switch is a customizable toggle switch component that allows users to change between two states.
+
+## Structure
+
+The `Switch` component can be used to create toggle switches for various purposes. It provides options for adding labels, icons, and tooltips.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/ui/components/form/timezone-select/timezoneSelect.stories.mdx b/packages/ui/components/form/timezone-select/timezoneSelect.stories.mdx
new file mode 100644
index 0000000000..ea5ecb5744
--- /dev/null
+++ b/packages/ui/components/form/timezone-select/timezoneSelect.stories.mdx
@@ -0,0 +1,83 @@
+import { TooltipProvider } from "@radix-ui/react-tooltip";
+import { Canvas, Meta, Story } from "@storybook/addon-docs";
+
+import {
+ CustomArgsTable,
+ Examples,
+ Example,
+ Title,
+ VariantsTable,
+ VariantRow,
+} from "@calcom/storybook/components";
+
+import { StorybookTrpcProvider } from "../../mocks/trpc";
+import { TimezoneSelect } from "./TimezoneSelect";
+
+
+
+
+
+## Definition
+
+The `TimezoneSelect` component is used to display timezone options.
+
+## Structure
+
+The `TimezoneSelect` component can be used to display timezone options.
+
+
+
+## Examples
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## TimezoneSelect Story
+
+
diff --git a/packages/ui/components/form/toggleGroup/ToggleGroup.tsx b/packages/ui/components/form/toggleGroup/ToggleGroup.tsx
index 5df1d7e616..1247830d40 100644
--- a/packages/ui/components/form/toggleGroup/ToggleGroup.tsx
+++ b/packages/ui/components/form/toggleGroup/ToggleGroup.tsx
@@ -49,6 +49,7 @@ export const ToggleGroup = ({ options, onValueChange, isFullWidth, ...props }: T
+
+
+
+## Definition
+
+The `ToggleGroup` component is used to create a group of toggle items with optional tooltips.
+
+## Structure
+
+
+
+## Examples
+
+
+
+
+ },
+ { value: "option2", label: "Option 2", iconLeft: },
+ { value: "option3", label: "Option 3", iconLeft: },
+ {
+ value: "option4",
+ label: "Option 4",
+ tooltip: "Tooltip for Option 4",
+ iconLeft: ,
+ },
+ { value: "option5", label: "Option 5", iconLeft: , disabled: true },
+ ]}
+ />
+
+
+
+
+## ToggleGroup Story
+
+
diff --git a/packages/ui/components/list/list.stories.mdx b/packages/ui/components/list/list.stories.mdx
index 805d7d95c2..a5cef93c14 100644
--- a/packages/ui/components/list/list.stories.mdx
+++ b/packages/ui/components/list/list.stories.mdx
@@ -10,20 +10,88 @@ import {
VariantRow,
} from "@calcom/storybook/components";
-import { List, ListItem } from "./List";
+import { List, ListItem, ListItemTitle, ListItemText } from "./List";
+
+export const listItems = [
+ { title: "Title 1", description: "Description 1" },
+ { title: "Title 2", description: "Description 2" },
+ { title: "Title 3", description: "Description 3" },
+];
-
+
## Definition
-Sums it up nicely.
+The List component is used to render an unordered list with default styling
+
+## Structure
+
+List takes an array of objects to display a list in the UI
+### List
+
+
+### ListItem
+
+
+
+
+
+ {listItems.map((item) => (
+
+ {item.title}
+ {item.description}
+
+ ))}
+
+
+
+
+ {listItems.map((item) => (
+
+ {item.title}
+ {item.description}
+
+ ))}
+
+
+
+
+ {listItems.map((item) => (
+
+ {item.title}
+ {item.description}
+
+ ))}
+
+
+
+
+
diff --git a/packages/ui/components/logo/Logo.tsx b/packages/ui/components/logo/Logo.tsx
index 872e9ffb9c..1f8d301687 100644
--- a/packages/ui/components/logo/Logo.tsx
+++ b/packages/ui/components/logo/Logo.tsx
@@ -5,23 +5,25 @@ export default function Logo({
icon,
inline = true,
className,
+ src = "/api/logo",
}: {
small?: boolean;
icon?: boolean;
inline?: boolean;
className?: string;
+ src?: string;
}) {
return (
{icon ? (
-
+
) : (
)}
diff --git a/packages/ui/components/logo/logo.stories.mdx b/packages/ui/components/logo/logo.stories.mdx
index 4cd54ee5d6..2da4324560 100644
--- a/packages/ui/components/logo/logo.stories.mdx
+++ b/packages/ui/components/logo/logo.stories.mdx
@@ -1,9 +1,8 @@
-import { Canvas, Meta, Story, ArgsTable } from "@storybook/addon-docs";
+import { Canvas, Meta, Story } from "@storybook/addon-docs";
import {
Examples,
Example,
- Note,
Title,
CustomArgsTable,
VariantsTable,
@@ -14,7 +13,7 @@ import Logo from "./Logo";
-
+
## Definition
@@ -22,15 +21,34 @@ Main Cal.com brand logo
+## Examples
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/ui/components/mocks/trpc.tsx b/packages/ui/components/mocks/trpc.tsx
new file mode 100644
index 0000000000..b44c08b5af
--- /dev/null
+++ b/packages/ui/components/mocks/trpc.tsx
@@ -0,0 +1,25 @@
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import { useState, type PropsWithChildren } from "react";
+
+import { httpBatchLink } from "@calcom/trpc";
+import type { AppRouter } from "@calcom/trpc/server/routers/_app";
+
+import { createTRPCReact } from "@trpc/react-query";
+
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+export const mockedTrpc: any = createTRPCReact();
+export const StorybookTrpcProvider = ({ children }: PropsWithChildren) => {
+ const [queryClient] = useState(new QueryClient({ defaultOptions: { queries: { staleTime: Infinity } } }));
+
+ const [trpcClient] = useState(() =>
+ mockedTrpc.createClient({
+ links: [httpBatchLink({ url: "" })],
+ })
+ );
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/packages/ui/components/popover/AnimatedPopover.tsx b/packages/ui/components/popover/AnimatedPopover.tsx
index 3803d8405a..33735a68f8 100644
--- a/packages/ui/components/popover/AnimatedPopover.tsx
+++ b/packages/ui/components/popover/AnimatedPopover.tsx
@@ -59,10 +59,13 @@ export const AnimatedPopover = ({
) : (
-
+
{text}
{count && count > 0 && (
- {count}
+
+
+ {count}
+
)}
diff --git a/packages/ui/components/popover/popover.stories.mdx b/packages/ui/components/popover/popover.stories.mdx
new file mode 100644
index 0000000000..0a3681a6e9
--- /dev/null
+++ b/packages/ui/components/popover/popover.stories.mdx
@@ -0,0 +1,138 @@
+import { TooltipProvider } from "@radix-ui/react-tooltip";
+import { Canvas, Meta, Story } from "@storybook/addon-docs";
+import { Fragment } from "react";
+
+import { FilterCheckboxFieldsContainer } from "@calcom/features/filters/components/TeamsFilter";
+import {
+ CustomArgsTable,
+ Examples,
+ Example,
+ Title,
+ VariantsTable,
+ VariantRow,
+} from "@calcom/storybook/components";
+import { Button, CheckboxField } from "@calcom/ui";
+
+import { List, ListItem } from "../list";
+import { AnimatedPopover } from "./AnimatedPopover";
+
+
+
+
+
+## Definition
+
+The `Popover` component is used to display rich content in a portal.
+
+## Structure
+
+The `Popover` component can be used to display a rich content in a portal.
+
+
+
+## Examples
+
+
+
+
+
+
+ {["First", "Second", "Third"]?.map((eventType) => (
+
+ {
+ console.log("changed ", e);
+ }}
+ description={eventType}
+ />
+
+ ))}
+
+
+
+
+
+
+ click here}>
+
+ {["First", "Second", "Third"]?.map((eventType) => (
+
+ {
+ console.log("changed ", e);
+ }}
+ description={eventType}
+ />
+
+ ))}
+
+
+
+
+
+
+
+
+ {["First", "Second", "Third"]?.map((eventType) => (
+
+ {
+ console.log("changed ", e);
+ }}
+ description={eventType}
+ />
+
+ ))}
+
+
+
+
+
+
+## Popover Story
+
+
diff --git a/packages/ui/components/sheet/sheet.tsx b/packages/ui/components/sheet/sheet.tsx
index 1addd8ab4e..5c362fed82 100644
--- a/packages/ui/components/sheet/sheet.tsx
+++ b/packages/ui/components/sheet/sheet.tsx
@@ -39,7 +39,7 @@ const SheetOverlay = React.forwardRef<
>(({ className, children, ...props }, ref) => (
=9.0.0
- react: ">=16.0.0"
- react-dom: ">=16.0.0"
- checksum: c725138f2b0a17a4b09afddeeb6d4e1b291220bbd083e8855f7c7646dfb14a742c8dd5a9fd8d5abea4e5a7b978675746b9ce54b119b7d6ceb060a880aace5db8
- languageName: node
- linkType: hard
-
"next-seo@npm:^6.0.0":
version: 6.1.0
resolution: "next-seo@npm:6.1.0"
@@ -30342,13 +28921,6 @@ __metadata:
languageName: node
linkType: hard
-"node-releases@npm:^2.0.2":
- version: 2.0.2
- resolution: "node-releases@npm:2.0.2"
- checksum: da858bf86b4d512842379749f5a5e4196ddab05ba18ffcf29f05bf460beceaca927f070f4430bb5046efec18941ddbc85e4c5fdbb83afc28a38dd6069a2f255e
- languageName: node
- linkType: hard
-
"node-releases@npm:^2.0.5, node-releases@npm:^2.0.6":
version: 2.0.6
resolution: "node-releases@npm:2.0.6"
@@ -30671,7 +29243,7 @@ __metadata:
languageName: node
linkType: hard
-"object.assign@npm:^4.1.0, object.assign@npm:^4.1.2":
+"object.assign@npm:^4.1.2":
version: 4.1.2
resolution: "object.assign@npm:4.1.2"
dependencies:
@@ -32656,18 +31228,6 @@ __metadata:
languageName: node
linkType: hard
-"prisma@npm:^4.13.0":
- version: 4.16.2
- resolution: "prisma@npm:4.16.2"
- dependencies:
- "@prisma/engines": 4.16.2
- bin:
- prisma: build/index.js
- prisma2: build/index.js
- checksum: 1d0ed616abd7f8de22441e333b976705f1cb05abcb206965df3fc6a7ea03911ef467dd484a4bc51fdc6cff72dd9857b9852be5f232967a444af0a98c49bfdb76
- languageName: node
- linkType: hard
-
"prisma@npm:^5.0.0":
version: 5.0.0
resolution: "prisma@npm:5.0.0"
@@ -34401,12 +32961,12 @@ __metadata:
languageName: node
linkType: hard
-"regenerate-unicode-properties@npm:^10.0.1":
- version: 10.0.1
- resolution: "regenerate-unicode-properties@npm:10.0.1"
+"regenerate-unicode-properties@npm:^10.1.0":
+ version: 10.1.0
+ resolution: "regenerate-unicode-properties@npm:10.1.0"
dependencies:
regenerate: ^1.4.2
- checksum: 1b638b7087d8143e5be3e20e2cda197ea0440fa0bc2cc49646b2f50c5a2b1acdc54b21e4215805a5a2dd487c686b2291accd5ad00619534098d2667e76247754
+ checksum: b1a8929588433ab8b9dc1a34cf3665b3b472f79f2af6ceae00d905fc496b332b9af09c6718fb28c730918f19a00dc1d7310adbaa9b72a2ec7ad2f435da8ace17
languageName: node
linkType: hard
@@ -34417,14 +32977,7 @@ __metadata:
languageName: node
linkType: hard
-"regenerator-runtime@npm:^0.13.11":
- version: 0.13.11
- resolution: "regenerator-runtime@npm:0.13.11"
- checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4
- languageName: node
- linkType: hard
-
-"regenerator-runtime@npm:^0.13.2, regenerator-runtime@npm:^0.13.3, regenerator-runtime@npm:^0.13.4, regenerator-runtime@npm:^0.13.7":
+"regenerator-runtime@npm:^0.13.2, regenerator-runtime@npm:^0.13.3, regenerator-runtime@npm:^0.13.7":
version: 0.13.9
resolution: "regenerator-runtime@npm:0.13.9"
checksum: 65ed455fe5afd799e2897baf691ca21c2772e1a969d19bb0c4695757c2d96249eb74ee3553ea34a91062b2a676beedf630b4c1551cc6299afb937be1426ec55e
@@ -34438,12 +32991,12 @@ __metadata:
languageName: node
linkType: hard
-"regenerator-transform@npm:^0.15.0":
- version: 0.15.0
- resolution: "regenerator-transform@npm:0.15.0"
+"regenerator-transform@npm:^0.15.2":
+ version: 0.15.2
+ resolution: "regenerator-transform@npm:0.15.2"
dependencies:
"@babel/runtime": ^7.8.4
- checksum: 86e54849ab1167618d28bb56d214c52a983daf29b0d115c976d79840511420049b6b42c9ebdf187defa8e7129bdd74b6dd266420d0d3868c9fa7f793b5d15d49
+ checksum: 20b6f9377d65954980fe044cfdd160de98df415b4bff38fbade67b3337efaf078308c4fed943067cd759827cc8cfeca9cb28ccda1f08333b85d6a2acbd022c27
languageName: node
linkType: hard
@@ -34492,35 +33045,28 @@ __metadata:
languageName: node
linkType: hard
-"regexpu-core@npm:^5.1.0":
- version: 5.1.0
- resolution: "regexpu-core@npm:5.1.0"
+"regexpu-core@npm:^5.3.1":
+ version: 5.3.2
+ resolution: "regexpu-core@npm:5.3.2"
dependencies:
+ "@babel/regjsgen": ^0.8.0
regenerate: ^1.4.2
- regenerate-unicode-properties: ^10.0.1
- regjsgen: ^0.6.0
- regjsparser: ^0.8.2
+ regenerate-unicode-properties: ^10.1.0
+ regjsparser: ^0.9.1
unicode-match-property-ecmascript: ^2.0.0
- unicode-match-property-value-ecmascript: ^2.0.0
- checksum: 7b4eb8d182d9d10537a220a93138df5bc7eaf4ed53e36b95e8427d33ed8a2b081468f1a15d3e5fcee66517e1df7f5ca180b999e046d060badd97150f2ffe87b2
+ unicode-match-property-value-ecmascript: ^2.1.0
+ checksum: 95bb97088419f5396e07769b7de96f995f58137ad75fac5811fb5fe53737766dfff35d66a0ee66babb1eb55386ef981feaef392f9df6d671f3c124812ba24da2
languageName: node
linkType: hard
-"regjsgen@npm:^0.6.0":
- version: 0.6.0
- resolution: "regjsgen@npm:0.6.0"
- checksum: c5158ebd735e75074e41292ade1ff05d85566d205426cc61501e360c450a63baced8512ee3ae238e5c0a0e42969563c7875b08fa69d6f0402daf36bcb3e4d348
- languageName: node
- linkType: hard
-
-"regjsparser@npm:^0.8.2":
- version: 0.8.4
- resolution: "regjsparser@npm:0.8.4"
+"regjsparser@npm:^0.9.1":
+ version: 0.9.1
+ resolution: "regjsparser@npm:0.9.1"
dependencies:
jsesc: ~0.5.0
bin:
regjsparser: bin/parser
- checksum: d069b932491761cda127ce11f6bd2729c3b1b394a35200ec33f1199e937423db28ceb86cf33f0a97c76ecd7c0f8db996476579eaf0d80a1f74c1934f4ca8b27a
+ checksum: 5e1b76afe8f1d03c3beaf9e0d935dd467589c3625f6d65fb8ffa14f224d783a0fed4bf49c2c1b8211043ef92b6117313419edf055a098ed8342e340586741afc
languageName: node
linkType: hard
@@ -35529,7 +34075,7 @@ __metadata:
languageName: node
linkType: hard
-"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0":
+"semver@npm:^6.0.0, semver@npm:^6.1.2, semver@npm:^6.3.0":
version: 6.3.0
resolution: "semver@npm:6.3.0"
bin:
@@ -37110,6 +35656,24 @@ __metadata:
languageName: node
linkType: hard
+"superjson@npm:^1.9.1":
+ version: 1.13.1
+ resolution: "superjson@npm:1.13.1"
+ dependencies:
+ copy-anything: ^3.0.2
+ checksum: 9c8c664a924ce097250112428805ccc8b500018b31a91042e953d955108b8481c156005d836b413940c9fa5f124a3195f55f3a518fe76510a254a59f9151a204
+ languageName: node
+ linkType: hard
+
+"supports-color@npm:8.1.1, supports-color@npm:^8.0.0, supports-color@npm:^8.1.0":
+ version: 8.1.1
+ resolution: "supports-color@npm:8.1.1"
+ dependencies:
+ has-flag: ^4.0.0
+ checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406
+ languageName: node
+ linkType: hard
+
"supports-color@npm:^2.0.0":
version: 2.0.0
resolution: "supports-color@npm:2.0.0"
@@ -37135,15 +35699,6 @@ __metadata:
languageName: node
linkType: hard
-"supports-color@npm:^8.0.0, supports-color@npm:^8.1.0":
- version: 8.1.1
- resolution: "supports-color@npm:8.1.1"
- dependencies:
- has-flag: ^4.0.0
- checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406
- languageName: node
- linkType: hard
-
"supports-color@npm:^9.2.2":
version: 9.2.2
resolution: "supports-color@npm:9.2.2"
@@ -38917,10 +37472,10 @@ __metadata:
languageName: node
linkType: hard
-"unicode-match-property-value-ecmascript@npm:^2.0.0":
- version: 2.0.0
- resolution: "unicode-match-property-value-ecmascript@npm:2.0.0"
- checksum: 8fe6a09d9085a625cabcead5d95bdbc1a2d5d481712856092ce0347231e81a60b93a68f1b69e82b3076a07e415a72c708044efa2aa40ae23e2e7b5c99ed4a9ea
+"unicode-match-property-value-ecmascript@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "unicode-match-property-value-ecmascript@npm:2.1.0"
+ checksum: 8d6f5f586b9ce1ed0e84a37df6b42fdba1317a05b5df0c249962bd5da89528771e2d149837cad11aa26bcb84c35355cb9f58a10c3d41fa3b899181ece6c85220
languageName: node
linkType: hard
@@ -39256,20 +37811,6 @@ __metadata:
languageName: node
linkType: hard
-"update-browserslist-db@npm:^1.0.5":
- version: 1.0.5
- resolution: "update-browserslist-db@npm:1.0.5"
- dependencies:
- escalade: ^3.1.1
- picocolors: ^1.0.0
- peerDependencies:
- browserslist: ">= 4.21.0"
- bin:
- browserslist-lint: cli.js
- checksum: 7e425fe5dbbebdccf72a84ce70ec47fc74dce561d28f47bc2b84a1c2b84179a862c2261b18ab66a5e73e261c7e2ef9e11c6129112989d4d52e8f75a56bb923f8
- languageName: node
- linkType: hard
-
"update-browserslist-db@npm:^1.0.9":
version: 1.0.10
resolution: "update-browserslist-db@npm:1.0.10"
@@ -41480,14 +40021,7 @@ __metadata:
languageName: node
linkType: hard
-"zod@npm:^3.20.2":
- version: 3.20.2
- resolution: "zod@npm:3.20.2"
- checksum: 04172f7e9350372684ccd298d4716908edc9113751295b6c4e1b3ea84e2af8997e504b33ba36f4741417bb2a5dc90bfd40501f6b0e7389df10e42a63d6d8366c
- languageName: node
- linkType: hard
-
-"zod@npm:^3.21.4":
+"zod@npm:^3.21.4, zod@npm:^3.22.2":
version: 3.22.2
resolution: "zod@npm:3.22.2"
checksum: 231e2180c8eabb56e88680d80baff5cf6cbe6d64df3c44c50ebe52f73081ecd0229b1c7215b9552537f537a36d9e36afac2737ddd86dc14e3519bdbc777e82b9
|