From 656d6dc1951e02c2905967db708005aad2093b56 Mon Sep 17 00:00:00 2001 From: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Date: Fri, 24 Jan 2025 09:26:52 +0000 Subject: [PATCH] feat: Internal Notes for bookings (#18804) * migration + migrate booking limit page to team settings * new pages * use settings toggle for displaying content * get current team presets * update mutation * i18n for settings page * remove redudant await * cancelation UI for select * handle other selection * extract into a util * inital cancelation reason flow * fix i18n to be more readable * add cancel reason logic * nits * improve copy * ensure is teamMember and not isAdmin for getting internalNotes * improvie spacing between elements * fix types * more type fixes * correct types * Update packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts * use input component and remove mb-2 to allign with icon button * Update packages/trpc/server/routers/viewer/teams/updateInternalNotesPresets.handler.ts Co-authored-by: Eunjae Lee * nits * type fixs * fix type * fix type * fix nullable option lost in merge --------- Co-authored-by: Eunjae Lee --- apps/web/app/(use-page-wrapper)/apps/page.tsx | 2 +- .../app/(use-page-wrapper)/signup/page.tsx | 3 +- .../video/meeting-ended/[uid]/page.tsx | 2 +- .../[id]/{bookingLimits => settings}/page.tsx | 13 +- apps/web/components/booking/CancelBooking.tsx | 96 ++++++++- apps/web/lib/booking.ts | 1 + ...ookings-single-view.getServerSideProps.tsx | 15 ++ .../bookings/views/bookings-single-view.tsx | 2 + apps/web/public/static/locales/en/common.json | 10 +- .../bookings/lib/handleCancelBooking.ts | 15 +- .../bookings/lib/handleInternalNote.ts | 82 ++++++++ .../components/InternalNotePresetsView.tsx | 185 ++++++++++++++++++ ...limits-view.tsx => team-settings-view.tsx} | 13 +- .../appDir/SettingsLayoutAppDirClient.tsx | 4 +- .../migration.sql | 52 +++++ packages/prisma/schema.prisma | 41 +++- packages/prisma/zod-utils.ts | 8 + .../server/routers/viewer/teams/_router.tsx | 20 ++ .../teams/getInternalNotesPresets.handler.ts | 33 ++++ .../teams/getInternalNotesPresets.schema.ts | 7 + .../updateInternalNotesPresets.handler.ts | 87 ++++++++ .../updateInternalNotesPresets.schema.ts | 14 ++ 22 files changed, 683 insertions(+), 22 deletions(-) rename apps/web/app/settings/(settings-layout)/teams/[id]/{bookingLimits => settings}/page.tsx (57%) create mode 100644 packages/features/bookings/lib/handleInternalNote.ts create mode 100644 packages/features/ee/teams/components/InternalNotePresetsView.tsx rename packages/features/ee/teams/pages/{team-booking-limits-view.tsx => team-settings-view.tsx} (95%) create mode 100644 packages/prisma/migrations/20250122083420_create_internal_notes_tables/migration.sql create mode 100644 packages/trpc/server/routers/viewer/teams/getInternalNotesPresets.handler.ts create mode 100644 packages/trpc/server/routers/viewer/teams/getInternalNotesPresets.schema.ts create mode 100644 packages/trpc/server/routers/viewer/teams/updateInternalNotesPresets.handler.ts create mode 100644 packages/trpc/server/routers/viewer/teams/updateInternalNotesPresets.schema.ts diff --git a/apps/web/app/(use-page-wrapper)/apps/page.tsx b/apps/web/app/(use-page-wrapper)/apps/page.tsx index 5a5a74cdee..0117c797c9 100644 --- a/apps/web/app/(use-page-wrapper)/apps/page.tsx +++ b/apps/web/app/(use-page-wrapper)/apps/page.tsx @@ -1,5 +1,5 @@ import { withAppDirSsr } from "app/WithAppDirSsr"; -import { PageProps } from "app/_types"; +import type { PageProps } from "app/_types"; import { _generateMetadata } from "app/_utils"; import { cookies, headers } from "next/headers"; diff --git a/apps/web/app/(use-page-wrapper)/signup/page.tsx b/apps/web/app/(use-page-wrapper)/signup/page.tsx index 64005a84f8..afbb38cc80 100644 --- a/apps/web/app/(use-page-wrapper)/signup/page.tsx +++ b/apps/web/app/(use-page-wrapper)/signup/page.tsx @@ -1,7 +1,6 @@ import { withAppDirSsr } from "app/WithAppDirSsr"; -import { PageProps } from "app/_types"; +import type { PageProps } from "app/_types"; import { _generateMetadata } from "app/_utils"; -import { WithLayout } from "app/layoutHOC"; import { cookies, headers } from "next/headers"; import { buildLegacyCtx } from "@lib/buildLegacyCtx"; diff --git a/apps/web/app/(use-page-wrapper)/video/meeting-ended/[uid]/page.tsx b/apps/web/app/(use-page-wrapper)/video/meeting-ended/[uid]/page.tsx index 106a64803d..89d44c95ff 100644 --- a/apps/web/app/(use-page-wrapper)/video/meeting-ended/[uid]/page.tsx +++ b/apps/web/app/(use-page-wrapper)/video/meeting-ended/[uid]/page.tsx @@ -1,5 +1,5 @@ import { withAppDirSsr } from "app/WithAppDirSsr"; -import { PageProps as ServerPageProps } from "app/_types"; +import type { PageProps as ServerPageProps } from "app/_types"; import { _generateMetadata } from "app/_utils"; import { cookies, headers } from "next/headers"; diff --git a/apps/web/app/settings/(settings-layout)/teams/[id]/bookingLimits/page.tsx b/apps/web/app/settings/(settings-layout)/teams/[id]/settings/page.tsx similarity index 57% rename from apps/web/app/settings/(settings-layout)/teams/[id]/bookingLimits/page.tsx rename to apps/web/app/settings/(settings-layout)/teams/[id]/settings/page.tsx index a79b3db1d0..1582b116b7 100644 --- a/apps/web/app/settings/(settings-layout)/teams/[id]/bookingLimits/page.tsx +++ b/apps/web/app/settings/(settings-layout)/teams/[id]/settings/page.tsx @@ -1,23 +1,22 @@ import { _generateMetadata, getTranslate } from "app/_utils"; -import TeamBookingLimitsView from "@calcom/features/ee/teams/pages/team-booking-limits-view"; +import TeamSettingsView from "@calcom/features/ee/teams/pages/team-settings-view"; import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader"; export const generateMetadata = async () => await _generateMetadata( - (t) => t("booking_limits"), - (t) => t("booking_limits_team_description") + (t) => t("settings"), + (t) => t("team_settings_description") ); const Page = async () => { const t = await getTranslate(); - return ( - + ); }; diff --git a/apps/web/components/booking/CancelBooking.tsx b/apps/web/components/booking/CancelBooking.tsx index 7c3021a3a9..63e57532d0 100644 --- a/apps/web/components/booking/CancelBooking.tsx +++ b/apps/web/components/booking/CancelBooking.tsx @@ -5,7 +5,63 @@ import { useLocale } from "@calcom/lib/hooks/useLocale"; import { useRefreshData } from "@calcom/lib/hooks/useRefreshData"; import { collectPageParameters, telemetryEventTypes, useTelemetry } from "@calcom/lib/telemetry"; import type { RecurringEvent } from "@calcom/types/Calendar"; -import { Button, Icon, Label, TextArea } from "@calcom/ui"; +import { Button, Icon, Label, TextArea, Select } from "@calcom/ui"; + +interface InternalNotePresetsSelectProps { + internalNotePresets: { id: number; name: string }[]; + onPresetSelect: ( + option: { + value: number | string; + label: string; + } | null + ) => void; +} + +const InternalNotePresetsSelect = ({ + internalNotePresets, + onPresetSelect, +}: InternalNotePresetsSelectProps) => { + const { t } = useLocale(); + const [showOtherInput, setShowOtherInput] = useState(false); + + if (!internalNotePresets?.length) { + return null; + } + + const handleSelectChange = (option: { value: number | string; label: string } | null) => { + if (option?.value === "other") { + setShowOtherInput(true); + } else { + setShowOtherInput(false); + onPresetSelect && onPresetSelect(option); + } + }; + + return ( +
+ +