From ee286a600f3b0104d8862cf7db9470a9eb087f8a Mon Sep 17 00:00:00 2001 From: Syed Ali Shahbaz <52925846+alishaz-polymath@users.noreply.github.com> Date: Fri, 16 Feb 2024 02:44:20 +0400 Subject: [PATCH] refactor: Only send dirty fields for event type update call (#13292) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * init * typefix maybe * fix type * fix e2e * Extract delete dialog to its own function to optimise rerender * wip * Delete isEqual * adds eslint tsignore comment * only update changed fields * fix type err * --WIP * fix type err isLoading—>isPending * isLoading—>isPending * post conflict resoution fix * shouldDirty minimumBookingNotice * adds shouldDirty to setValues * reset form to ensure updated default values * shouldDirty changes and fixed deep check of dirty * --WIP * should dirty recurring * shouldDirty team tab * multiple-fixes * adding console log to test something in e2e * shouldDirty apps tab * fixes managed event type children association * fixed managed events update * dirty managed fix * fixes some onChange versus setValue and periodCountCalendarDays * Seeing different behaviour explicitly unwrapping formState * only mutate if at least 1 field dirty * fix type error * bunch of fixes * --WIP * update only dirtyFields for Managed Events existing children * Fixes update old managed event type tests --WIP * Fix unit tests A bunch of unit test fixes which started failing due to update fields only requiring actual updated fields. some other small fixes also included * type fix * remove unnecessary comment * Adds dirtyField to instant event * fix: add shouldDirty * fixes availability and team tabs, and disable save button unless dirty * fix for hosts and bookerLayout * add shouldDirty when resetting hosts after changing schedulingType * add missing shouldDirty to useEventTypeDestinationCalendarEmail --------- Co-authored-by: Alex van Andel Co-authored-by: Udit Takkar Co-authored-by: CarinaWolli --- .../components/eventtype/EventAdvancedTab.tsx | 18 +- .../web/components/eventtype/EventAppsTab.tsx | 12 +- .../eventtype/EventAvailabilityTab.tsx | 8 +- .../components/eventtype/EventLimitsTab.tsx | 73 ++++--- .../components/eventtype/EventSetupTab.tsx | 18 +- .../web/components/eventtype/EventTeamTab.tsx | 31 +-- .../eventtype/EventTypeSingleLayout.tsx | 112 +++++----- .../eventtype/InstantEventController.tsx | 4 +- .../eventtype/RecurringEventController.tsx | 10 +- .../RequiresConfirmationController.tsx | 21 +- .../views/event-types-single-view.tsx | 199 ++++++++++++++---- .../test/lib/handleChildrenEventTypes.test.ts | 33 +-- .../lib/handleChildrenEventTypes.ts | 25 +-- .../features/form-builder/FormBuilder.tsx | 6 +- .../viewer/eventTypes/update.handler.ts | 8 + 15 files changed, 382 insertions(+), 196 deletions(-) diff --git a/apps/web/components/eventtype/EventAdvancedTab.tsx b/apps/web/components/eventtype/EventAdvancedTab.tsx index 8a023b8bbe..d45247eb24 100644 --- a/apps/web/components/eventtype/EventAdvancedTab.tsx +++ b/apps/web/components/eventtype/EventAdvancedTab.tsx @@ -59,7 +59,6 @@ export const EventAdvancedTab = ({ eventType, team }: Pick { bookingFields[name] = `${name} input`; }); @@ -101,7 +100,8 @@ export const EventAdvancedTab = ({ eventType, team }: Pick { setUseEventTypeDestinationCalendarEmail(val); - formMethods.setValue("useEventTypeDestinationCalendarEmail", val); + formMethods.setValue("useEventTypeDestinationCalendarEmail", val, { shouldDirty: true }); }} /> @@ -319,7 +319,7 @@ export const EventAdvancedTab = ({ eventType, team }: Pick { - formMethods.setValue("hashedLink", e ? hashedUrl : undefined); + formMethods.setValue("hashedLink", e ? hashedUrl : undefined, { shouldDirty: true }); setHashedLinkVisible(e); }}>
@@ -383,10 +383,12 @@ export const EventAdvancedTab = ({ eventType, team }: Pick formMethods.setValue("eventName", val)} + setValue={(val: string) => formMethods.setValue("eventName", val, { shouldDirty: true })} defaultValue={formMethods.getValues("eventName")} placeHolder={eventNamePlaceholder} event={eventNameObject} diff --git a/apps/web/components/eventtype/EventAppsTab.tsx b/apps/web/components/eventtype/EventAppsTab.tsx index 3246a54198..3612bc827a 100644 --- a/apps/web/components/eventtype/EventAppsTab.tsx +++ b/apps/web/components/eventtype/EventAppsTab.tsx @@ -31,10 +31,14 @@ export const EventAppsTab = ({ eventType }: { eventType: EventType }) => { const allAppsData = formMethods.watch("metadata")?.apps || {}; const setAllAppsData = (_allAppsData: typeof allAppsData) => { - formMethods.setValue("metadata", { - ...formMethods.getValues("metadata"), - apps: _allAppsData, - }); + formMethods.setValue( + "metadata", + { + ...formMethods.getValues("metadata"), + apps: _allAppsData, + }, + { shouldDirty: true } + ); }; const getAppDataGetter = (appId: EventTypeAppsList): GetAppData => { diff --git a/apps/web/components/eventtype/EventAvailabilityTab.tsx b/apps/web/components/eventtype/EventAvailabilityTab.tsx index de6dc35fbf..a992bf4942 100644 --- a/apps/web/components/eventtype/EventAvailabilityTab.tsx +++ b/apps/web/components/eventtype/EventAvailabilityTab.tsx @@ -230,7 +230,7 @@ const EventTypeSchedule = ({ eventType }: { eventType: EventTypeSetup }) => { : option.value === schedules.find((schedule) => schedule.isDefault)?.id ); - setValue("availability", value); + setValue("availability", value, { shouldDirty: true }); }, [data] ); @@ -238,7 +238,7 @@ const EventTypeSchedule = ({ eventType }: { eventType: EventTypeSetup }) => { useEffect(() => { if (!availabilityValue?.value) return; - setValue("schedule", availabilityValue.value); + setValue("schedule", availabilityValue.value, { shouldDirty: true }); }, [availabilityValue, setValue]); return ( @@ -260,7 +260,7 @@ const EventTypeSchedule = ({ eventType }: { eventType: EventTypeSetup }) => { isSearchable={false} onChange={(selected) => { field.onChange(selected?.value || null); - if (selected?.value) setValue("availability", selected); + if (selected?.value) setValue("availability", selected, { shouldDirty: true }); }} className="block w-full min-w-0 flex-1 rounded-sm text-sm" value={availabilityValue} @@ -298,7 +298,7 @@ const UseCommonScheduleSettingsToggle = ({ eventType }: { eventType: EventTypeSe onCheckedChange={(checked) => { onChange(!checked); if (!checked) { - setValue("schedule", null); + setValue("schedule", null, { shouldDirty: true }); } }} title={t("choose_common_schedule_team_event")} diff --git a/apps/web/components/eventtype/EventLimitsTab.tsx b/apps/web/components/eventtype/EventLimitsTab.tsx index 1c1d35b421..12ba08738e 100644 --- a/apps/web/components/eventtype/EventLimitsTab.tsx +++ b/apps/web/components/eventtype/EventLimitsTab.tsx @@ -61,7 +61,8 @@ const MinimumBookingNoticeInput = React.forwardRef< minimumBookingNoticeDisplayValues.type, "minutes", minimumBookingNoticeDisplayValues.value - ) + ), + { shouldDirty: true } ); }, [minimumBookingNoticeDisplayValues, setValue, passThroughProps.name]); @@ -230,7 +231,9 @@ export const EventLimitsTab = () => {