diff --git a/.github/workflows/todo-to-issue.yml b/.github/workflows/todo-to-issue.yml deleted file mode 100644 index e3fd49d4be..0000000000 --- a/.github/workflows/todo-to-issue.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: TODO to Issue -on: - push: - branches: - - main - workflow_dispatch: - inputs: - MANUAL_COMMIT_REF: - description: "The SHA of the commit to get the diff for" - required: true - MANUAL_BASE_REF: - description: "By default, the commit entered above is compared to the one directly before it; to go back further, enter an earlier SHA here" - required: false -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true -jobs: - todos: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: "Add TODOs to issues" - uses: "alstr/todo-to-issue-action@v4" - env: - MANUAL_COMMIT_REF: ${{ inputs.MANUAL_COMMIT_REF }} - MANUAL_BASE_REF: ${{ inputs.MANUAL_BASE_REF }} - with: - IDENTIFIERS: '[{"name": "TODO", "labels": ["🙋🏻‍♂️help wanted"]}, {"name": "FIXME", "labels": ["🐛 bug"]}]' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 80ca94703f..b1fa0b03e1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -86,7 +86,12 @@ To develop locally: yarn ``` -5. Start developing and watch for code changes: +5. Set up your `.env` file: + + - Use `openssl rand -base64 32` to generate a key and add it under `NEXTAUTH_SECRET` in the `.env` file. + - Use `openssl rand -base64 24` to generate a key and add it under `CALENDSO_ENCRYPTION_KEY` in the `.env` file. + +6. Start developing and watch for code changes: ```sh yarn dev diff --git a/LICENSE b/LICENSE index ce5231ba9b..c68dd776c5 100644 --- a/LICENSE +++ b/LICENSE @@ -2,7 +2,7 @@ Copyright (c) 2020-present Cal.com, Inc. Portions of this software are licensed as follows: -* All content that resides under https://github.com/calcom/cal.com/tree/main/packages/features/ee directory of this repository (Enterprise Edition) is licensed under the license defined in "ee/LICENSE". +* All content that resides under https://github.com/calcom/cal.com/tree/main/packages/features/ee directory of this repository (Commercial License) is licensed under the license defined in "ee/LICENSE". * All third party components incorporated into the Cal.com Software are licensed under the original license provided by the owner of the applicable component. * Content outside of the above mentioned directories or restrictions above is available under the "AGPLv3" license as defined below. diff --git a/apps/web/components/apps/App.tsx b/apps/web/components/apps/App.tsx index 62752ba044..5f2306b2b3 100644 --- a/apps/web/components/apps/App.tsx +++ b/apps/web/components/apps/App.tsx @@ -36,6 +36,7 @@ const Component = ({ tos, privacy, isProOnly, + teamsPlanRequired, descriptionItems, isTemplate, dependencies, @@ -152,6 +153,7 @@ const Component = ({ type={type} isProOnly={isProOnly} disableInstall={disableInstall} + teamsPlanRequired={teamsPlanRequired} render={({ useDefaultComponent, ...props }) => { if (useDefaultComponent) { props = { @@ -192,6 +194,7 @@ const Component = ({ type={type} isProOnly={isProOnly} disableInstall={disableInstall} + teamsPlanRequired={teamsPlanRequired} render={({ useDefaultComponent, ...props }) => { if (useDefaultComponent) { props = { @@ -241,7 +244,9 @@ const Component = ({

{t("pricing")}

- {price === 0 ? ( + {teamsPlanRequired ? ( + t("teams_plan_required") + ) : price === 0 ? ( t("free_to_use_apps") ) : ( <> @@ -358,6 +363,7 @@ export default function App(props: { privacy?: string; licenseRequired: AppType["licenseRequired"]; isProOnly: AppType["isProOnly"]; + teamsPlanRequired: AppType["teamsPlanRequired"]; descriptionItems?: Array }>; isTemplate?: boolean; disableInstall?: boolean; diff --git a/apps/web/components/apps/layouts/AppsLayout.tsx b/apps/web/components/apps/layouts/AppsLayout.tsx index f7a5ec0a7a..34b18cba10 100644 --- a/apps/web/components/apps/layouts/AppsLayout.tsx +++ b/apps/web/components/apps/layouts/AppsLayout.tsx @@ -18,9 +18,9 @@ export default function AppsLayout({ children, actions, emptyStore, ...rest }: A const { t } = useLocale(); const session = useSession(); const router = useRouter(); + const isAdmin = session.data?.user.role === "ADMIN"; if (session.status === "loading") return <>; - return (
@@ -29,8 +29,8 @@ export default function AppsLayout({ children, actions, emptyStore, ...rest }: A router.push("/settings/admin/apps/calendar")} /> ) : ( diff --git a/apps/web/components/booking/AvailableTimes.tsx b/apps/web/components/booking/AvailableTimes.tsx index a48b802d98..4d4eebb6ad 100644 --- a/apps/web/components/booking/AvailableTimes.tsx +++ b/apps/web/components/booking/AvailableTimes.tsx @@ -72,7 +72,7 @@ const AvailableTimes: FC = ({ slotUtcStartDate: slot.time, eventTypeId, slotUtcEndDate: dayjs(slot.time).utc().add(duration, "minutes").format(), - bookingAttendees: bookingAttendees || undefined, + bookingUid: slot.bookingUid, }); }; diff --git a/apps/web/components/booking/BookingListItem.tsx b/apps/web/components/booking/BookingListItem.tsx index 7af2db8944..3dc01a2dcb 100644 --- a/apps/web/components/booking/BookingListItem.tsx +++ b/apps/web/components/booking/BookingListItem.tsx @@ -29,7 +29,7 @@ import { TableActions, TextAreaField, } from "@calcom/ui"; -import { Check, Clock, MapPin, RefreshCcw, Send, Slash, X, CreditCard } from "@calcom/ui/components/icon"; +import { Check, Clock, MapPin, RefreshCcw, Send, Ban, X, CreditCard } from "@calcom/ui/components/icon"; import useMeQuery from "@lib/hooks/useMeQuery"; @@ -119,7 +119,7 @@ function BookingListItem(booking: BookingItemProps) { onClick: () => { setRejectionDialogIsOpen(true); }, - icon: Slash, + icon: Ban, disabled: mutation.isLoading, }, // For bookings with payment, only confirm if the booking is paid for diff --git a/apps/web/components/booking/pages/BookingPage.tsx b/apps/web/components/booking/pages/BookingPage.tsx index 4b208c5951..bb2c42ab83 100644 --- a/apps/web/components/booking/pages/BookingPage.tsx +++ b/apps/web/components/booking/pages/BookingPage.tsx @@ -237,7 +237,7 @@ const BookingPage = ({ eventTypeId: eventType.id, slotUtcStartDate: dayjs(queryDate).utc().format(), slotUtcEndDate: dayjs(queryDate).utc().add(parseInt(queryDuration), "minutes").format(), - bookingAttendees: currentSlotBooking ? currentSlotBooking.attendees.length : undefined, + bookingUid: currentSlotBooking?.uid, }); } }; diff --git a/apps/web/components/eventtype/EventAdvancedTab.tsx b/apps/web/components/eventtype/EventAdvancedTab.tsx index caae6dc9d8..0c9720480c 100644 --- a/apps/web/components/eventtype/EventAdvancedTab.tsx +++ b/apps/web/components/eventtype/EventAdvancedTab.tsx @@ -322,7 +322,6 @@ export const EventAdvancedTab = ({ eventType, team }: Pick{t("seats")}} onChange={(e) => { onChange(Math.abs(Number(e.target.value))); diff --git a/apps/web/components/eventtype/EventLimitsTab.tsx b/apps/web/components/eventtype/EventLimitsTab.tsx index c24315c407..ec067d2a6c 100644 --- a/apps/web/components/eventtype/EventLimitsTab.tsx +++ b/apps/web/components/eventtype/EventLimitsTab.tsx @@ -108,7 +108,7 @@ const MinimumBookingNoticeInput = React.forwardRef< }); export const EventLimitsTab = ({ eventType }: Pick) => { - const { t } = useLocale(); + const { t, i18n } = useLocale(); const formMethods = useFormContext(); const PERIOD_TYPES = [ @@ -149,12 +149,25 @@ export const EventLimitsTab = ({ eventType }: Pick offsetStartValue > 0); + + // Preview how the offset will affect start times + const offsetOriginalTime = new Date(); + offsetOriginalTime.setHours(9, 0, 0, 0); + const offsetAdjustedTime = new Date(offsetOriginalTime.getTime() + offsetStartValue * 60 * 1000); + return (
@@ -432,6 +445,32 @@ export const EventLimitsTab = ({ eventType }: Pick )} /> +
+ { + setOffsetToggle(active); + if (!active) { + formMethods.setValue("offsetStart", 0); + } + }}> + {t("minutes")}} + hint={t("offset_start_description", { + originalTime: offsetOriginalTime.toLocaleTimeString(i18n.language, { timeStyle: "short" }), + adjustedTime: offsetAdjustedTime.toLocaleTimeString(i18n.language, { timeStyle: "short" }), + })} + /> +
); }; diff --git a/apps/web/components/getting-started/steps-views/ConnectCalendars.tsx b/apps/web/components/getting-started/steps-views/ConnectCalendars.tsx index d2e91f7c09..2109f01a4c 100644 --- a/apps/web/components/getting-started/steps-views/ConnectCalendars.tsx +++ b/apps/web/components/getting-started/steps-views/ConnectCalendars.tsx @@ -1,9 +1,8 @@ -import { ArrowRightIcon } from "@heroicons/react/solid"; - import classNames from "@calcom/lib/classNames"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import { List } from "@calcom/ui"; +import { ArrowRight } from "@calcom/ui/components/icon"; import { AppConnectionItem } from "../components/AppConnectionItem"; import { ConnectedCalendarItem } from "../components/ConnectedCalendarItem"; @@ -85,7 +84,7 @@ const ConnectedCalendars = (props: IConnectCalendarsProps) => { onClick={() => nextStep()} disabled={disabledNextButton}> {firstCalendar ? `${t("continue")}` : `${t("next_step_text")}`} -
diff --git a/apps/web/components/getting-started/steps-views/UserProfile.tsx b/apps/web/components/getting-started/steps-views/UserProfile.tsx index 1657da0044..3867c43adb 100644 --- a/apps/web/components/getting-started/steps-views/UserProfile.tsx +++ b/apps/web/components/getting-started/steps-views/UserProfile.tsx @@ -1,4 +1,3 @@ -import { ArrowRightIcon } from "@heroicons/react/solid"; import { useRouter } from "next/router"; import type { FormEvent } from "react"; import { useRef, useState } from "react"; @@ -11,6 +10,7 @@ import turndown from "@calcom/lib/turndownService"; import { trpc } from "@calcom/trpc/react"; import { Button, Editor, ImageUploader, Label, showToast } from "@calcom/ui"; import { Avatar } from "@calcom/ui"; +import { ArrowRight } from "@calcom/ui/components/icon"; import type { IOnboardingPageProps } from "../../../pages/getting-started/[[...step]]"; @@ -159,7 +159,7 @@ const UserProfile = (props: IUserProfileProps) => { type="submit" className="text-inverted mt-8 flex w-full flex-row justify-center rounded-md border border-black bg-black p-2 text-center text-sm"> {t("finish")} -
diff --git a/apps/web/next.config.js b/apps/web/next.config.js index f859499763..3295c7c57c 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -111,12 +111,6 @@ const nextConfig = { transform: "lucide-react/dist/esm/icons/{{ kebabCase member }}", preventFullImport: true, }, - "@heroicons/react/solid": { - transform: "@heroicons/react/solid/esm/{{ member }}", - }, - "@heroicons/react/outline": { - transform: "@heroicons/react/outline/esm/{{ member }}", - }, "@calcom/features/insights/components": { transform: "@calcom/features/insights/components/{{member}}", skipDefaultConversion: true, diff --git a/apps/web/package.json b/apps/web/package.json index da2db5a857..2cbc675838 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@calcom/web", - "version": "2.9.0", + "version": "2.9.1", "private": true, "scripts": { "analyze": "ANALYZE=true next build", @@ -41,7 +41,6 @@ "@daily-co/daily-js": "^0.37.0", "@formkit/auto-animate": "^1.0.0-beta.5", "@glidejs/glide": "^3.5.2", - "@heroicons/react": "^1.0.6", "@hookform/error-message": "^2.0.0", "@hookform/resolvers": "^2.9.7", "@next-auth/prisma-adapter": "^1.0.4", diff --git a/apps/web/pages/[user].tsx b/apps/web/pages/[user].tsx index caa96f6c62..6ef8f4c8b0 100644 --- a/apps/web/pages/[user].tsx +++ b/apps/web/pages/[user].tsx @@ -1,4 +1,3 @@ -import { BadgeCheckIcon } from "@heroicons/react/solid"; import classNames from "classnames"; import type { GetServerSidePropsContext } from "next"; import Link from "next/link"; @@ -28,7 +27,7 @@ import prisma from "@calcom/prisma"; import { baseEventTypeSelect } from "@calcom/prisma/selects"; import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils"; import { Avatar, AvatarGroup, HeadSeo } from "@calcom/ui"; -import { ArrowRight } from "@calcom/ui/components/icon"; +import { Verified, ArrowRight } from "@calcom/ui/components/icon"; import type { inferSSRProps } from "@lib/types/inferSSRProps"; import type { EmbedProps } from "@lib/withEmbedSsr"; @@ -139,7 +138,9 @@ export default function User(props: inferSSRProps & E

{nameOrUsername} - {user.verified && } + {user.verified && ( + + )}

{!isBioEmpty && ( <> diff --git a/apps/web/pages/apps/[slug]/index.tsx b/apps/web/pages/apps/[slug]/index.tsx index 854f022616..841331f5d9 100644 --- a/apps/web/pages/apps/[slug]/index.tsx +++ b/apps/web/pages/apps/[slug]/index.tsx @@ -72,6 +72,7 @@ function SingleAppPage(props: inferSSRProps) { website={data.url} email={data.email} licenseRequired={data.licenseRequired} + teamsPlanRequired={data.teamsPlanRequired} isProOnly={data.isProOnly} descriptionItems={source.data?.items as string[] | undefined} isTemplate={data.isTemplate} diff --git a/apps/web/pages/auth/verify.tsx b/apps/web/pages/auth/verify.tsx index 06433aa783..fa41ad4d5e 100644 --- a/apps/web/pages/auth/verify.tsx +++ b/apps/web/pages/auth/verify.tsx @@ -1,4 +1,3 @@ -import { CheckIcon, MailOpenIcon, ExclamationIcon } from "@heroicons/react/outline"; import { signIn } from "next-auth/react"; import Head from "next/head"; import { useRouter } from "next/router"; @@ -9,6 +8,7 @@ import z from "zod"; import { APP_NAME, WEBAPP_URL } from "@calcom/lib/constants"; import { trpc } from "@calcom/trpc/react"; import { Button, showToast } from "@calcom/ui"; +import { Check, MailOpen, AlertTriangle } from "@calcom/ui/components/icon"; import Loader from "@components/Loader"; import PageWrapper from "@components/PageWrapper"; @@ -118,11 +118,11 @@ export default function Verify() {
{hasPaymentFailed ? ( - + ) : sessionId ? ( - + ) : ( - + )}

diff --git a/apps/web/pages/event-types/[type]/index.tsx b/apps/web/pages/event-types/[type]/index.tsx index 1c22818d1d..f9dff7ea9e 100644 --- a/apps/web/pages/event-types/[type]/index.tsx +++ b/apps/web/pages/event-types/[type]/index.tsx @@ -51,6 +51,7 @@ export type FormValues = { eventName: string; slug: string; length: number; + offsetStart: number; description: string; disableGuests: boolean; requiresConfirmation: boolean; @@ -211,6 +212,7 @@ const EventTypePage = (props: EventTypeSetupProps) => { bookingLimits: eventType.bookingLimits || undefined, durationLimits: eventType.durationLimits || undefined, length: eventType.length, + offsetStart: eventType.offsetStart, hidden: eventType.hidden, periodDates: { startDate: periodDates.startDate, @@ -255,6 +257,7 @@ const EventTypePage = (props: EventTypeSetupProps) => { ) .optional(), length: z.union([z.string().transform((val) => +val), z.number()]).optional(), + offsetStart: z.union([z.string().transform((val) => +val), z.number()]).optional(), bookingFields: eventTypeBookingFields, }) // TODO: Add schema for other fields later. diff --git a/apps/web/pages/new-booker/[user]/[type].tsx b/apps/web/pages/new-booker/[user]/[type].tsx index 807a00cef9..d3003b8afe 100644 --- a/apps/web/pages/new-booker/[user]/[type].tsx +++ b/apps/web/pages/new-booker/[user]/[type].tsx @@ -14,11 +14,22 @@ import PageWrapper from "@components/PageWrapper"; type PageProps = inferSSRProps; -export default function Type({ slug, user, booking, away }: PageProps) { +export default function Type({ slug, user, booking, away, isBrandingHidden }: PageProps) { return (
- - + +
); } @@ -64,6 +75,7 @@ async function getDynamicGroupPageProps(context: GetServerSidePropsContext) { slug, away: false, trpcState: ssr.dehydrate(), + isBrandingHidden: false, }, }; } @@ -80,6 +92,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) { }, select: { away: true, + hideBranding: true, }, }); @@ -103,6 +116,7 @@ async function getUserPageProps(context: GetServerSidePropsContext) { user: username, slug, trpcState: ssr.dehydrate(), + isBrandingHidden: user?.hideBranding, }, }; } diff --git a/apps/web/pages/new-booker/team/[slug]/[type].tsx b/apps/web/pages/new-booker/team/[slug]/[type].tsx index a671cfcbfc..7ebaf2a55a 100644 --- a/apps/web/pages/new-booker/team/[slug]/[type].tsx +++ b/apps/web/pages/new-booker/team/[slug]/[type].tsx @@ -13,11 +13,22 @@ import PageWrapper from "@components/PageWrapper"; type PageProps = inferSSRProps; -export default function Type({ slug, user, booking, away }: PageProps) { +export default function Type({ slug, user, booking, away, isBrandingHidden }: PageProps) { return (
- - + +
); } @@ -41,6 +52,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => }, select: { id: true, + hideBranding: true, }, }); @@ -62,6 +74,7 @@ export const getServerSideProps = async (context: GetServerSidePropsContext) => user: teamSlug, slug: meetingSlug, trpcState: ssr.dehydrate(), + isBrandingHidden: team?.hideBranding, }, }; }; diff --git a/apps/web/pages/settings/security/impersonation.tsx b/apps/web/pages/settings/security/impersonation.tsx index 046526ce30..67b3b8c74c 100644 --- a/apps/web/pages/settings/security/impersonation.tsx +++ b/apps/web/pages/settings/security/impersonation.tsx @@ -50,6 +50,7 @@ const ProfileImpersonationView = () => { setValue, reset, getValues, + watch, } = formMethods; const isDisabled = isSubmitting || !isDirty; @@ -63,11 +64,11 @@ const ProfileImpersonationView = () => { }}>
{ setValue("disableImpersonation", !e, { shouldDirty: true }); }} fitToHeight={true} + checked={!watch("disableImpersonation")} />
diff --git a/apps/web/public/emails/rejectIcon.png b/apps/web/public/emails/rejectIcon.png index da19051177..d69647d871 100644 Binary files a/apps/web/public/emails/rejectIcon.png and b/apps/web/public/emails/rejectIcon.png differ diff --git a/apps/web/public/emails/rejectIcon.svg b/apps/web/public/emails/rejectIcon.svg index bd2446ce30..e6d80a7c89 100644 --- a/apps/web/public/emails/rejectIcon.svg +++ b/apps/web/public/emails/rejectIcon.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/apps/web/public/static/locales/ar/common.json b/apps/web/public/static/locales/ar/common.json index 4c0a2d2605..d5cf3375bf 100644 --- a/apps/web/public/static/locales/ar/common.json +++ b/apps/web/public/static/locales/ar/common.json @@ -1572,7 +1572,7 @@ "sender_name": "اسم المرسل", "already_invited": "تمت دعوة هذا الحاضر بالفعل", "no_recordings_found": "لم يتم العثور على تسجيلات", - "new_workflow_subtitle": "سير عمل جديد من أجل...", + "new_workflow_subtitle": "سير عمل جديد لـ...", "reporting": "تقديم التقارير", "reporting_feature": "عرض جميع البيانات الواردة وتنزيلها كملف CSV", "teams_plan_required": "خطة Teams مطلوبة", diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index de7b68f9f0..b57f17a687 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -756,6 +756,10 @@ "new_event_type_to_book_description": "Create a new event type for people to book times with.", "length": "Length", "minimum_booking_notice": "Minimum Notice", + "offset_toggle": "Offset start times", + "offset_toggle_description": "Offset timeslots shown to bookers by a specified number of minutes", + "offset_start": "Offset by", + "offset_start_description": "e.g. this will show time slots to your bookers at {{ adjustedTime }} instead of {{ originalTime }}", "slot_interval": "Time-slot intervals", "slot_interval_default": "Use event length (default)", "delete_event_type": "Delete event type?", diff --git a/apps/web/test/lib/getSchedule.test.ts b/apps/web/test/lib/getSchedule.test.ts index 78a02098f0..f9aab9ea93 100644 --- a/apps/web/test/lib/getSchedule.test.ts +++ b/apps/web/test/lib/getSchedule.test.ts @@ -151,10 +151,6 @@ const TestData = { }, }; -const ctx = { - prisma: prismaMock, -}; - type App = { slug: string; dirName: string; @@ -186,6 +182,7 @@ type InputEventType = { id: number; title?: string; length?: number; + offsetStart?: number; slotInterval?: number; minimumBookingNotice?: number; users?: { id: number }[]; @@ -711,6 +708,72 @@ describe("getSchedule", () => { ); }); + test("Start times are offset (offsetStart)", async () => { + const { dateString: plus1DateString } = getDate({ dateIncrement: 1 }); + const { dateString: plus2DateString } = getDate({ dateIncrement: 2 }); + + const scenarioData = { + eventTypes: [ + { + id: 1, + length: 25, + offsetStart: 5, + users: [ + { + id: 101, + }, + ], + }, + ], + users: [ + { + ...TestData.users.example, + id: 101, + schedules: [TestData.schedules.IstWorkHours], + credentials: [getGoogleCalendarCredential()], + selectedCalendars: [TestData.selectedCalendars.google], + }, + ], + hosts: [], + apps: [TestData.apps.googleCalendar], + }; + + createBookingScenario(scenarioData); + + const schedule = await getSchedule({ + eventTypeId: 1, + eventTypeSlug: "", + startTime: `${plus1DateString}T18:30:00.000Z`, + endTime: `${plus2DateString}T18:29:59.999Z`, + timeZone: Timezones["+5:30"], + }); + + expect(schedule).toHaveTimeSlots( + [ + `04:05:00.000Z`, + `04:35:00.000Z`, + `05:05:00.000Z`, + `05:35:00.000Z`, + `06:05:00.000Z`, + `06:35:00.000Z`, + `07:05:00.000Z`, + `07:35:00.000Z`, + `08:05:00.000Z`, + `08:35:00.000Z`, + `09:05:00.000Z`, + `09:35:00.000Z`, + `10:05:00.000Z`, + `10:35:00.000Z`, + `11:05:00.000Z`, + `11:35:00.000Z`, + `12:05:00.000Z`, + ], + { + dateString: plus2DateString, + } + ); + }); + test("Check for Date overrides", async () => { const { dateString: plus1DateString } = getDate({ dateIncrement: 1 }); const { dateString: plus2DateString } = getDate({ dateIncrement: 2 }); @@ -1132,6 +1195,7 @@ function addEventTypes(eventTypes: InputEventType[], usersStore: InputUser[]) { seatsPerTimeSlot: null, metadata: {}, minimumBookingNotice: 0, + offsetStart: 0, }; const foundEvents: Record = {}; const eventTypesWithUsers = eventTypes.map((eventType) => { diff --git a/apps/web/test/lib/slots.test.ts b/apps/web/test/lib/slots.test.ts index b2e4349eff..4bc5f2ebc1 100644 --- a/apps/web/test/lib/slots.test.ts +++ b/apps/web/test/lib/slots.test.ts @@ -24,6 +24,7 @@ describe("Tests the slot logic", () => { }, ], eventLength: 60, + offsetStart: 0, organizerTimeZone: "America/Toronto", }) ).toHaveLength(24); @@ -46,6 +47,7 @@ describe("Tests the slot logic", () => { }, ], eventLength: 60, + offsetStart: 0, organizerTimeZone: "America/Toronto", }) ).toHaveLength(12); @@ -66,6 +68,7 @@ describe("Tests the slot logic", () => { }, ], eventLength: 60, + offsetStart: 0, organizerTimeZone: "America/Toronto", }) ).toHaveLength(0); @@ -87,6 +90,7 @@ describe("Tests the slot logic", () => { minimumBookingNotice: 0, workingHours, eventLength: 60, + offsetStart: 0, organizerTimeZone: "America/Toronto", }) ).toHaveLength(0); @@ -108,6 +112,7 @@ describe("Tests the slot logic", () => { }, ], eventLength: 60, + offsetStart: 0, organizerTimeZone: "America/Toronto", }) ).toHaveLength(11); @@ -129,8 +134,30 @@ describe("Tests the slot logic", () => { }, ], eventLength: 20, + offsetStart: 0, organizerTimeZone: "America/Toronto", }) ).toHaveLength(71); }); + + it("can fit 48 25 minute slots with a 5 minute offset for an empty day", async () => { + expect( + getSlots({ + inviteeDate: dayjs.utc().add(1, "day"), + frequency: 25, + minimumBookingNotice: 0, + workingHours: [ + { + userId: 1, + days: Array.from(Array(7).keys()), + startTime: MINUTES_DAY_START, + endTime: MINUTES_DAY_END, + }, + ], + eventLength: 25, + offsetStart: 5, + organizerTimeZone: "America/Toronto", + }) + ).toHaveLength(48); + }); }); diff --git a/package.json b/package.json index e3856d2561..8864cab3f3 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "dependencies": { "city-timezones": "^1.2.1", "eslint": "^8.34.0", - "lucide-react": "^0.130.0", + "lucide-react": "^0.171.0", "turbo": "^1.8.3" }, "resolutions": { diff --git a/packages/app-store/_components/OmniInstallAppButton.tsx b/packages/app-store/_components/OmniInstallAppButton.tsx index 120c2b66ec..e181d4f362 100644 --- a/packages/app-store/_components/OmniInstallAppButton.tsx +++ b/packages/app-store/_components/OmniInstallAppButton.tsx @@ -47,6 +47,7 @@ export default function OmniInstallAppButton({ { if (useDefaultComponent) { diff --git a/packages/app-store/apps.metadata.generated.ts b/packages/app-store/apps.metadata.generated.ts index db829a26f2..093ab0365f 100644 --- a/packages/app-store/apps.metadata.generated.ts +++ b/packages/app-store/apps.metadata.generated.ts @@ -11,6 +11,7 @@ import closecom_config_json from "./closecom/config.json"; import cron_config_json from "./cron/config.json"; import { metadata as dailyvideo__metadata_ts } from "./dailyvideo/_metadata"; import discord_config_json from "./discord/config.json"; +import eightxeight_config_json from "./eightxeight/config.json"; import { metadata as exchange2013calendar__metadata_ts } from "./exchange2013calendar/_metadata"; import { metadata as exchange2016calendar__metadata_ts } from "./exchange2016calendar/_metadata"; import exchangecalendar_config_json from "./exchangecalendar/config.json"; @@ -75,6 +76,7 @@ export const appStoreMetadata = { cron: cron_config_json, dailyvideo: dailyvideo__metadata_ts, discord: discord_config_json, + eightxeight: eightxeight_config_json, exchange2013calendar: exchange2013calendar__metadata_ts, exchange2016calendar: exchange2016calendar__metadata_ts, exchangecalendar: exchangecalendar_config_json, diff --git a/packages/app-store/apps.server.generated.ts b/packages/app-store/apps.server.generated.ts index cabd37632f..b9f0998801 100644 --- a/packages/app-store/apps.server.generated.ts +++ b/packages/app-store/apps.server.generated.ts @@ -11,6 +11,7 @@ export const apiHandlers = { closecom: import("./closecom/api"), cron: import("./cron/api"), discord: import("./discord/api"), + eightxeight: import("./eightxeight/api"), exchange2013calendar: import("./exchange2013calendar/api"), exchange2016calendar: import("./exchange2016calendar/api"), exchangecalendar: import("./exchangecalendar/api"), diff --git a/packages/app-store/components.tsx b/packages/app-store/components.tsx index 5630b56ffd..673fdcea98 100644 --- a/packages/app-store/components.tsx +++ b/packages/app-store/components.tsx @@ -7,6 +7,7 @@ import classNames from "@calcom/lib/classNames"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { CAL_URL } from "@calcom/lib/constants"; import { deriveAppDictKeyFromType } from "@calcom/lib/deriveAppDictKeyFromType"; +import { useHasTeamPlan } from "@calcom/lib/hooks/useHasPaidPlan"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { trpc } from "@calcom/trpc/react"; import type { RouterOutputs } from "@calcom/trpc/react"; @@ -49,14 +50,17 @@ export const InstallAppButtonWithoutPlanCheck = ( export const InstallAppButton = ( props: { isProOnly?: App["isProOnly"]; + teamsPlanRequired?: App["teamsPlanRequired"]; type: App["type"]; wrapperClassName?: string; disableInstall?: boolean; } & InstallAppButtonProps ) => { - const { isLoading, data: user } = trpc.viewer.me.useQuery(); + const { isLoading: isUserLoading, data: user } = trpc.viewer.me.useQuery(); const router = useRouter(); const proProtectionElementRef = useRef(null); + const { isLoading: isTeamPlanStatusLoading, hasTeamPlan } = useHasTeamPlan(); + useEffect(() => { const el = proProtectionElementRef.current; if (!el) { @@ -72,12 +76,19 @@ export const InstallAppButton = ( e.stopPropagation(); return; } + + if (props.teamsPlanRequired && !hasTeamPlan) { + // TODO: I think we should show the UpgradeTip in a Dialog here. This would solve the problem of no way to go back to the App page from the UpgradeTip page(except browser's back button) + router.push(props.teamsPlanRequired.upgradeUrl); + e.stopPropagation(); + return; + } }, true ); - }, [isLoading, user, router, props.isProOnly]); + }, [isUserLoading, user, router, props.isProOnly, hasTeamPlan, props.teamsPlanRequired]); - if (isLoading) { + if (isUserLoading || isTeamPlanStatusLoading) { return null; } diff --git a/packages/app-store/eightxeight/DESCRIPTION.md b/packages/app-store/eightxeight/DESCRIPTION.md new file mode 100644 index 0000000000..4831ab5fd2 --- /dev/null +++ b/packages/app-store/eightxeight/DESCRIPTION.md @@ -0,0 +1,12 @@ +--- +items: + - 1.jpeg + - 2.jpeg +--- + +{DESCRIPTION} +- High definition video conferencing on any device for up to 500 participants +- Rich content sharing and collaboration +- Enterprise grade reliability and availability for a business of five or 50,000 +- 100% secured and encrypted +- Copy your room link and start scheduling calls in 8x8 \ No newline at end of file diff --git a/packages/app-store/eightxeight/api/add.ts b/packages/app-store/eightxeight/api/add.ts new file mode 100644 index 0000000000..9a4afb9b2c --- /dev/null +++ b/packages/app-store/eightxeight/api/add.ts @@ -0,0 +1,16 @@ +import { createDefaultInstallation } from "@calcom/app-store/_utils/installation"; +import type { AppDeclarativeHandler } from "@calcom/types/AppHandler"; + +import appConfig from "../config.json"; + +const handler: AppDeclarativeHandler = { + appType: appConfig.type, + variant: appConfig.variant, + slug: appConfig.slug, + supportsMultipleInstalls: false, + handlerType: "add", + createCredential: ({ appType, user, slug }) => + createDefaultInstallation({ appType, userId: user.id, slug, key: {} }), +}; + +export default handler; diff --git a/packages/app-store/eightxeight/api/index.ts b/packages/app-store/eightxeight/api/index.ts new file mode 100644 index 0000000000..4c0d2ead01 --- /dev/null +++ b/packages/app-store/eightxeight/api/index.ts @@ -0,0 +1 @@ +export { default as add } from "./add"; diff --git a/packages/app-store/eightxeight/config.json b/packages/app-store/eightxeight/config.json new file mode 100644 index 0000000000..781a2a1348 --- /dev/null +++ b/packages/app-store/eightxeight/config.json @@ -0,0 +1,28 @@ +{ + "/*": "Don't modify slug - If required, do it using cli edit command", + "name": "8x8", + "slug": "eightxeight", + "type": "eightxeight_video", + "logo": "icon.svg", + "url": "https://cal.com/apps/eightxeight", + "variant": "conferencing", + "categories": [ + "video" + ], + "publisher": "shivamklr", + "email": "shivamkalra98@gmail.com", + "appData": { + "location": { + "type": "integrations:{SLUG}_video", + "label": "{TITLE}", + "linkType": "static", + "organizerInputPlaceholder": "https://8x8.vc/company", + "urlRegExp": "^(http|https)://(www\\.)?8x8.vc/[a-zA-Z0-9]*" + } + }, + "description": "The best video conferencing solution for businesses of any size. Fully secure, reliable, packed with features and ridiculously simple to use.\r\r", + "isTemplate": false, + "__createdUsingCli": true, + "__template": "event-type-location-video-static", + "dirName": "eightxeight" +} \ No newline at end of file diff --git a/packages/app-store/eightxeight/index.ts b/packages/app-store/eightxeight/index.ts new file mode 100644 index 0000000000..d7f3602204 --- /dev/null +++ b/packages/app-store/eightxeight/index.ts @@ -0,0 +1 @@ +export * as api from "./api"; diff --git a/packages/app-store/eightxeight/package.json b/packages/app-store/eightxeight/package.json new file mode 100644 index 0000000000..9b17d187a1 --- /dev/null +++ b/packages/app-store/eightxeight/package.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json.schemastore.org/package.json", + "private": true, + "name": "@calcom/eightxeight", + "version": "0.0.0", + "main": "./index.ts", + "dependencies": { + "@calcom/lib": "*" + }, + "devDependencies": { + "@calcom/types": "*" + }, + "description": "The best video conferencing solution for businesses of any size. Fully secure, reliable, packed with features and ridiculously simple to use.\r\r" +} diff --git a/packages/app-store/eightxeight/static/1.jpeg b/packages/app-store/eightxeight/static/1.jpeg new file mode 100644 index 0000000000..3d7dfce47c Binary files /dev/null and b/packages/app-store/eightxeight/static/1.jpeg differ diff --git a/packages/app-store/eightxeight/static/2.jpeg b/packages/app-store/eightxeight/static/2.jpeg new file mode 100644 index 0000000000..6d53580982 Binary files /dev/null and b/packages/app-store/eightxeight/static/2.jpeg differ diff --git a/packages/app-store/eightxeight/static/icon.svg b/packages/app-store/eightxeight/static/icon.svg new file mode 100644 index 0000000000..20f3e28854 --- /dev/null +++ b/packages/app-store/eightxeight/static/icon.svg @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/packages/app-store/giphy/components/SearchDialog.tsx b/packages/app-store/giphy/components/SearchDialog.tsx index 17d7e2fc3b..ed38fee5da 100644 --- a/packages/app-store/giphy/components/SearchDialog.tsx +++ b/packages/app-store/giphy/components/SearchDialog.tsx @@ -1,10 +1,10 @@ -import { LinkIcon, SearchIcon } from "@heroicons/react/outline"; import type { Dispatch, SetStateAction } from "react"; import { useState } from "react"; import classNames from "@calcom/lib/classNames"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { Alert, Button, Dialog, DialogClose, DialogContent, DialogFooter, Input } from "@calcom/ui"; +import { Link, Search } from "@calcom/ui/components/icon"; interface ISearchDialog { isOpenDialog: boolean; @@ -118,8 +118,8 @@ export const SearchDialog = (props: ISearchDialog) => {

{t("find_gif_spice_confirmation")}

- {renderTab(SearchIcon, t("search_giphy"), MODE_SEARCH)} - {renderTab(LinkIcon, t("add_link_from_giphy"), MODE_URL)} + {renderTab(Search, t("search_giphy"), MODE_SEARCH)} + {renderTab(Link, t("add_link_from_giphy"), MODE_URL)}
{selectedGif ? ( - ) : ( - )} @@ -37,7 +37,7 @@ export default function SelectGifInput(props: ISelectGifInput) {
diff --git a/packages/features/ee/LICENSE b/packages/features/ee/LICENSE index 60f0a2a1d0..a8c6744758 100644 --- a/packages/features/ee/LICENSE +++ b/packages/features/ee/LICENSE @@ -1,4 +1,4 @@ -The Cal.com Enterprise Edition (EE) license (the “EE License”) +The Cal.com Commercial License (the “Commercial License”) Copyright (c) 2020-present Cal.com, Inc With regard to the Cal.com Software: @@ -6,15 +6,15 @@ With regard to the Cal.com Software: This software and associated documentation files (the "Software") may only be used in production, if you (and any entity that you represent) have agreed to, and are in compliance with, the Cal.com Subscription Terms available -at https://cal.com/terms (the “EE Terms”), or other agreements governing +at https://cal.com/terms, or other agreements governing the use of the Software, as mutually agreed by you and Cal.com, Inc ("Cal.com"), -and otherwise have a valid Cal.com Enterprise Edition subscription ("EE Subscription") -for the correct number of hosts as defined in the EE Terms ("Hosts"). Subject to the foregoing sentence, +and otherwise have a valid Cal.com Enterprise Edition subscription ("Commercial Subscription") +for the correct number of hosts as defined in the "Commercial Terms ("Hosts"). Subject to the foregoing sentence, you are free to modify this Software and publish patches to the Software. You agree that Cal.com and/or its licensors (as applicable) retain all right, title and interest in and to all such modifications and/or patches, and all such modifications and/or patches may only be used, copied, modified, displayed, distributed, or otherwise -exploited with a valid EE Subscription for the correct number of hosts. +exploited with a valid Commercial Subscription for the correct number of hosts. Notwithstanding the foregoing, you may copy and modify the Software for development and testing purposes, without requiring a subscription. You agree that Cal.com and/or its licensors (as applicable) retain all right, title and interest in and to all such @@ -22,11 +22,11 @@ modifications. You are not granted any other rights beyond what is expressly sta Subject to the foregoing, it is forbidden to copy, merge, publish, distribute, sublicense, and/or sell the Software. -This EE License applies only to the part of this Software that is not distributed under +This Commercial License applies only to the part of this Software that is not distributed under the AGPLv3 license. Any part of this Software distributed under the MIT license or which is served client-side as an image, font, cascading stylesheet (CSS), file which produces or is compiled, arranged, augmented, or combined into client-side JavaScript, in whole or -in part, is copyrighted under the AGPLv3 license. The full text of this EE License shall +in part, is copyrighted under the AGPLv3 license. The full text of this Commercial License shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR diff --git a/packages/features/ee/teams/components/TeamAvailabilityTimes.tsx b/packages/features/ee/teams/components/TeamAvailabilityTimes.tsx index e46e555ec7..a2c492546e 100644 --- a/packages/features/ee/teams/components/TeamAvailabilityTimes.tsx +++ b/packages/features/ee/teams/components/TeamAvailabilityTimes.tsx @@ -41,6 +41,7 @@ export default function TeamAvailabilityTimes(props: Props) { inviteeDate: props.selectedDate, workingHours: data?.workingHours || [], minimumBookingNotice: 0, + offsetStart: 0, eventLength: props.frequency, organizerTimeZone: `${data?.timeZone}`, }) diff --git a/packages/features/ee/teams/components/TeamInviteListItem.tsx b/packages/features/ee/teams/components/TeamInviteListItem.tsx index ae5da43829..84d69ed751 100644 --- a/packages/features/ee/teams/components/TeamInviteListItem.tsx +++ b/packages/features/ee/teams/components/TeamInviteListItem.tsx @@ -12,7 +12,7 @@ import { DropdownItem, DropdownMenuTrigger, } from "@calcom/ui"; -import { Slash, Check, MoreHorizontal, X } from "@calcom/ui/components/icon"; +import { Ban, Check, MoreHorizontal, X } from "@calcom/ui/components/icon"; interface Props { team: { @@ -92,7 +92,7 @@ export default function TeamInviteListItem(props: Props) { variant="icon" color="secondary" onClick={declineInvite} - StartIcon={Slash} + StartIcon={Ban} /> )} diff --git a/packages/ui/form/radio-area/Select.tsx b/packages/ui/form/radio-area/Select.tsx index 025235c462..6834d8c9b2 100644 --- a/packages/ui/form/radio-area/Select.tsx +++ b/packages/ui/form/radio-area/Select.tsx @@ -1,10 +1,10 @@ -import { ChevronDownIcon } from "@heroicons/react/solid"; import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@radix-ui/react-collapsible"; import React from "react"; import type { FieldValues, Path, UseFormReturn } from "react-hook-form"; import classNames from "@calcom/lib/classNames"; import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { ChevronDown } from "@calcom/ui/components/icon"; import { RadioArea, RadioAreaGroup } from "./RadioAreaGroup"; @@ -46,7 +46,7 @@ export const Select = function RadioAreaSelect disabled && "bg-emphasis cursor-default focus:ring-0 " )}> {getLabel(props.value) ?? placeholder} - + diff --git a/yarn.lock b/yarn.lock index b4592b7e09..996a9be18d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3929,11 +3929,10 @@ __metadata: bcryptjs: ^2.4.3 jest: ^28.1.0 memory-cache: ^0.2.0 - modify-response-middleware: ^1.1.0 - next: ^13.2.1 + next: ~13.2.1 next-api-middleware: ^1.0.1 next-axiom: ^0.16.0 - next-swagger-doc: ^0.3.4 + next-swagger-doc: ^0.3.6 next-validations: ^0.2.0 node-mocks-http: ^1.11.0 typescript: ^4.9.4 @@ -4039,8 +4038,8 @@ __metadata: "@types/react": 18.0.26 "@types/react-dom": 18.0.9 eslint: ^8.34.0 - eslint-config-next: ^13.2.1 - next: ^13.2.1 + eslint-config-next: ~13.2.1 + next: ~13.2.1 next-auth: ^4.20.1 react: ^18.2.0 react-dom: ^18.2.0 @@ -4127,7 +4126,7 @@ __metadata: chart.js: ^3.7.1 client-only: ^0.0.1 eslint: ^8.34.0 - next: ^13.2.1 + next: ~13.2.1 next-auth: ^4.20.1 next-i18next: ^11.3.0 postcss: ^8.4.18 @@ -4228,6 +4227,15 @@ __metadata: languageName: unknown linkType: soft +"@calcom/eightxeight@workspace:packages/app-store/eightxeight": + version: 0.0.0-use.local + resolution: "@calcom/eightxeight@workspace:packages/app-store/eightxeight" + dependencies: + "@calcom/lib": "*" + "@calcom/types": "*" + languageName: unknown + linkType: soft + "@calcom/emails@*, @calcom/emails@workspace:packages/emails": version: 0.0.0-use.local resolution: "@calcom/emails@workspace:packages/emails" @@ -4917,7 +4925,6 @@ __metadata: "@daily-co/daily-js": ^0.37.0 "@formkit/auto-animate": ^1.0.0-beta.5 "@glidejs/glide": ^3.5.2 - "@heroicons/react": ^1.0.6 "@hookform/error-message": ^2.0.0 "@hookform/resolvers": ^2.9.7 "@microsoft/microsoft-graph-types-beta": 0.15.0-preview @@ -5108,7 +5115,7 @@ __metadata: keen-slider: ^6.8.0 lucide-react: ^0.125.0 micro: ^10.0.1 - next: 13.2.4-canary.5 + next: ~13.2.1 next-auth: ^4.20.1 next-i18next: ^11.3.0 playwright: ^1.31.2 @@ -8319,10 +8326,10 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/env@npm:13.2.4-canary.5" - checksum: d46767ba464334b8487b671a9b366b25e7c1b6bf262bd66afd62b07b17f52066158fe69b14db3abc8219e1e580cd60e0655af6c71550506770780d1ba28ae92d +"@next/env@npm:13.2.4": + version: 13.2.4 + resolution: "@next/env@npm:13.2.4" + checksum: 4123e08a79e66d6144006972027a9ceb8f3fdd782c4a869df1eb3b91b59ad9f4a44082d3f8e421f4df5214c6bc7190b52b94881369452d65eb4580485f33b9e6 languageName: node linkType: hard @@ -8335,6 +8342,15 @@ __metadata: languageName: node linkType: hard +"@next/eslint-plugin-next@npm:13.2.4": + version: 13.2.4 + resolution: "@next/eslint-plugin-next@npm:13.2.4" + dependencies: + glob: 7.1.7 + checksum: 95f9a84922ec1c73aa51b794f9d2dc49c165a1c793db17cab4558097d31aaf65c2e5e3390d0691c056fac105562d6dc974b13b1df79981f8b7faba005f6eb3b5 + languageName: node + linkType: hard + "@next/swc-android-arm-eabi@npm:13.2.3": version: 13.2.3 resolution: "@next/swc-android-arm-eabi@npm:13.2.3" @@ -8342,9 +8358,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-android-arm-eabi@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-android-arm-eabi@npm:13.2.4-canary.5" +"@next/swc-android-arm-eabi@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-android-arm-eabi@npm:13.2.4" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -8356,9 +8372,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-android-arm64@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-android-arm64@npm:13.2.4-canary.5" +"@next/swc-android-arm64@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-android-arm64@npm:13.2.4" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -8370,9 +8386,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-darwin-arm64@npm:13.2.4-canary.5" +"@next/swc-darwin-arm64@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-darwin-arm64@npm:13.2.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -8384,9 +8400,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-darwin-x64@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-darwin-x64@npm:13.2.4-canary.5" +"@next/swc-darwin-x64@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-darwin-x64@npm:13.2.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -8398,9 +8414,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-freebsd-x64@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-freebsd-x64@npm:13.2.4-canary.5" +"@next/swc-freebsd-x64@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-freebsd-x64@npm:13.2.4" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -8412,9 +8428,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-arm-gnueabihf@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-linux-arm-gnueabihf@npm:13.2.4-canary.5" +"@next/swc-linux-arm-gnueabihf@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-linux-arm-gnueabihf@npm:13.2.4" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -8426,9 +8442,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-linux-arm64-gnu@npm:13.2.4-canary.5" +"@next/swc-linux-arm64-gnu@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-linux-arm64-gnu@npm:13.2.4" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard @@ -8440,9 +8456,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-linux-arm64-musl@npm:13.2.4-canary.5" +"@next/swc-linux-arm64-musl@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-linux-arm64-musl@npm:13.2.4" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard @@ -8454,9 +8470,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-linux-x64-gnu@npm:13.2.4-canary.5" +"@next/swc-linux-x64-gnu@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-linux-x64-gnu@npm:13.2.4" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard @@ -8468,9 +8484,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-linux-x64-musl@npm:13.2.4-canary.5" +"@next/swc-linux-x64-musl@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-linux-x64-musl@npm:13.2.4" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard @@ -8482,9 +8498,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-win32-arm64-msvc@npm:13.2.4-canary.5" +"@next/swc-win32-arm64-msvc@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-win32-arm64-msvc@npm:13.2.4" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -8496,9 +8512,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-win32-ia32-msvc@npm:13.2.4-canary.5" +"@next/swc-win32-ia32-msvc@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-win32-ia32-msvc@npm:13.2.4" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -8510,9 +8526,9 @@ __metadata: languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "@next/swc-win32-x64-msvc@npm:13.2.4-canary.5" +"@next/swc-win32-x64-msvc@npm:13.2.4": + version: 13.2.4 + resolution: "@next/swc-win32-x64-msvc@npm:13.2.4" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -16262,7 +16278,7 @@ __metadata: languageName: node linkType: hard -"base64-js@npm:^1.0.2, base64-js@npm:^1.1.2, base64-js@npm:^1.3.0, base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": +"base64-js@npm:^1.0.2, base64-js@npm:^1.3.0, base64-js@npm:^1.3.1, base64-js@npm:^1.5.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 @@ -16656,15 +16672,6 @@ __metadata: languageName: node linkType: hard -"brotli@npm:^1.3.2": - version: 1.3.3 - resolution: "brotli@npm:1.3.3" - dependencies: - base64-js: ^1.1.2 - checksum: 2c97329f4ccb8e4332cedd2f63b85c2e15ffb305b1cbf046df86201434caf93cb7992ca73c0f7053b6a1417f595069ec7783c26e01510cefc10035a0f466e594 - languageName: node - linkType: hard - "browser-assert@npm:^1.2.1": version: 1.2.1 resolution: "browser-assert@npm:1.2.1" @@ -17226,7 +17233,7 @@ __metadata: jest-watch-select-projects: ^2.0.0 jest-watch-typeahead: ^2.0.0 lint-staged: ^12.5.0 - lucide-react: ^0.130.0 + lucide-react: ^0.171.0 prettier: ^2.8.6 ts-jest: ^28.0.8 tsc-absolute: ^1.0.0 @@ -21186,6 +21193,29 @@ __metadata: languageName: node linkType: hard +"eslint-config-next@npm:~13.2.1": + version: 13.2.4 + resolution: "eslint-config-next@npm:13.2.4" + dependencies: + "@next/eslint-plugin-next": 13.2.4 + "@rushstack/eslint-patch": ^1.1.3 + "@typescript-eslint/parser": ^5.42.0 + eslint-import-resolver-node: ^0.3.6 + eslint-import-resolver-typescript: ^3.5.2 + eslint-plugin-import: ^2.26.0 + eslint-plugin-jsx-a11y: ^6.5.1 + eslint-plugin-react: ^7.31.7 + eslint-plugin-react-hooks: ^4.5.0 + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: ">=3.3.1" + peerDependenciesMeta: + typescript: + optional: true + checksum: 84c202db75ec17c8a7fcebb3364f5b66fc9e81199442cb85d9531f284be5e102935f17aec5274da9ea39752ae9fc8a6afaf5a1e06fe4c8cb8695cf9bee8ea24f + languageName: node + linkType: hard + "eslint-config-prettier@npm:^8.6.0": version: 8.6.0 resolution: "eslint-config-prettier@npm:8.6.0" @@ -28544,12 +28574,12 @@ __metadata: languageName: node linkType: hard -"lucide-react@npm:^0.130.0": - version: 0.130.1 - resolution: "lucide-react@npm:0.130.1" +"lucide-react@npm:^0.171.0": + version: 0.171.0 + resolution: "lucide-react@npm:0.171.0" peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 - checksum: 83ba516f60859053380bbe07c23c24695ff479f787aa0e18f2994b63cdf6a48867b7119b10c313a384e301b2521c460c48ebd59a8448ed62cf20a1224839389e + checksum: 768ffe368c52a518ee339203d86ff4479989ab4d79c0716f721900c4bb7392ef6ff7a14807f6a685abd74d27f4c1778170bff77a0ab4c3e06c17944b557d8300 languageName: node linkType: hard @@ -30115,15 +30145,6 @@ __metadata: languageName: node linkType: hard -"modify-response-middleware@npm:^1.1.0": - version: 1.1.0 - resolution: "modify-response-middleware@npm:1.1.0" - dependencies: - brotli: ^1.3.2 - checksum: eeee5c14ae9492f8b3949b10786af35e7ff362c1f54ef2015ee4db770492b1ba41ec8b5ffd08dee6401346c94bffff663ef93187c3487913cd3a79df10379081 - languageName: node - linkType: hard - "module-alias@npm:^2.2.2": version: 2.2.2 resolution: "module-alias@npm:2.2.2" @@ -30584,7 +30605,7 @@ __metadata: languageName: node linkType: hard -"next-swagger-doc@npm:^0.3.4": +"next-swagger-doc@npm:^0.3.6": version: 0.3.6 resolution: "next-swagger-doc@npm:0.3.6" dependencies: @@ -30647,77 +30668,6 @@ __metadata: languageName: node linkType: hard -"next@npm:13.2.4-canary.5": - version: 13.2.4-canary.5 - resolution: "next@npm:13.2.4-canary.5" - dependencies: - "@next/env": 13.2.4-canary.5 - "@next/swc-android-arm-eabi": 13.2.4-canary.5 - "@next/swc-android-arm64": 13.2.4-canary.5 - "@next/swc-darwin-arm64": 13.2.4-canary.5 - "@next/swc-darwin-x64": 13.2.4-canary.5 - "@next/swc-freebsd-x64": 13.2.4-canary.5 - "@next/swc-linux-arm-gnueabihf": 13.2.4-canary.5 - "@next/swc-linux-arm64-gnu": 13.2.4-canary.5 - "@next/swc-linux-arm64-musl": 13.2.4-canary.5 - "@next/swc-linux-x64-gnu": 13.2.4-canary.5 - "@next/swc-linux-x64-musl": 13.2.4-canary.5 - "@next/swc-win32-arm64-msvc": 13.2.4-canary.5 - "@next/swc-win32-ia32-msvc": 13.2.4-canary.5 - "@next/swc-win32-x64-msvc": 13.2.4-canary.5 - "@swc/helpers": 0.4.14 - caniuse-lite: ^1.0.30001406 - postcss: 8.4.14 - styled-jsx: 5.1.1 - peerDependencies: - "@opentelemetry/api": ^1.4.0 - fibers: ">= 3.1.0" - node-sass: ^6.0.0 || ^7.0.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - dependenciesMeta: - "@next/swc-android-arm-eabi": - optional: true - "@next/swc-android-arm64": - optional: true - "@next/swc-darwin-arm64": - optional: true - "@next/swc-darwin-x64": - optional: true - "@next/swc-freebsd-x64": - optional: true - "@next/swc-linux-arm-gnueabihf": - optional: true - "@next/swc-linux-arm64-gnu": - optional: true - "@next/swc-linux-arm64-musl": - optional: true - "@next/swc-linux-x64-gnu": - optional: true - "@next/swc-linux-x64-musl": - optional: true - "@next/swc-win32-arm64-msvc": - optional: true - "@next/swc-win32-ia32-msvc": - optional: true - "@next/swc-win32-x64-msvc": - optional: true - peerDependenciesMeta: - "@opentelemetry/api": - optional: true - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - bin: - next: dist/bin/next - checksum: 47616f1ebbf0e716ca67313d247d56f646e1f663dcfc99125a0e882ed74a6ebc2c776a7e05438b4e928d38d8dae42933c5b314dfb8e4c0a566edd0e26647335a - languageName: node - linkType: hard - "next@npm:^13.2.1": version: 13.2.3 resolution: "next@npm:13.2.3" @@ -30789,6 +30739,77 @@ __metadata: languageName: node linkType: hard +"next@npm:~13.2.1": + version: 13.2.4 + resolution: "next@npm:13.2.4" + dependencies: + "@next/env": 13.2.4 + "@next/swc-android-arm-eabi": 13.2.4 + "@next/swc-android-arm64": 13.2.4 + "@next/swc-darwin-arm64": 13.2.4 + "@next/swc-darwin-x64": 13.2.4 + "@next/swc-freebsd-x64": 13.2.4 + "@next/swc-linux-arm-gnueabihf": 13.2.4 + "@next/swc-linux-arm64-gnu": 13.2.4 + "@next/swc-linux-arm64-musl": 13.2.4 + "@next/swc-linux-x64-gnu": 13.2.4 + "@next/swc-linux-x64-musl": 13.2.4 + "@next/swc-win32-arm64-msvc": 13.2.4 + "@next/swc-win32-ia32-msvc": 13.2.4 + "@next/swc-win32-x64-msvc": 13.2.4 + "@swc/helpers": 0.4.14 + caniuse-lite: ^1.0.30001406 + postcss: 8.4.14 + styled-jsx: 5.1.1 + peerDependencies: + "@opentelemetry/api": ^1.4.0 + fibers: ">= 3.1.0" + node-sass: ^6.0.0 || ^7.0.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + dependenciesMeta: + "@next/swc-android-arm-eabi": + optional: true + "@next/swc-android-arm64": + optional: true + "@next/swc-darwin-arm64": + optional: true + "@next/swc-darwin-x64": + optional: true + "@next/swc-freebsd-x64": + optional: true + "@next/swc-linux-arm-gnueabihf": + optional: true + "@next/swc-linux-arm64-gnu": + optional: true + "@next/swc-linux-arm64-musl": + optional: true + "@next/swc-linux-x64-gnu": + optional: true + "@next/swc-linux-x64-musl": + optional: true + "@next/swc-win32-arm64-msvc": + optional: true + "@next/swc-win32-ia32-msvc": + optional: true + "@next/swc-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@opentelemetry/api": + optional: true + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + bin: + next: dist/bin/next + checksum: 8531dee41b60181b582f5ee80858907b102f083ef8808ff9352d589dd39e6b3a96f7a11b3776a03eef3a28430cff768336fa2e3ff2c6f8fcd699fbc891749051 + languageName: node + linkType: hard + "nextra-theme-docs@npm:^1.2.2": version: 1.2.6 resolution: "nextra-theme-docs@npm:1.2.6"