From af51ce18908b304a80bc35170cd32ebb8a078d6a Mon Sep 17 00:00:00 2001
From: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com>
Date: Tue, 1 Apr 2025 20:00:02 -0400
Subject: [PATCH] chore: Salesforce - handle checkbox type fields (#20490)
* Add checkbox field type
* Handle accepting booleans under value field when saving writing to field settings
* UI saving settings to write to checkbox field
* Prepare update body to pass boolean value to checkbox field
* Type fixes
* Type fix
---
.../incomplete-booking/[...appPages].tsx | 4 +-
.../components/EventTypeAppCardInterface.tsx | 53 ++++++++++++++++---
.../app-store/salesforce/lib/CrmService.ts | 6 ++-
packages/app-store/salesforce/lib/enums.ts | 1 +
packages/app-store/salesforce/zod.ts | 4 +-
5 files changed, 55 insertions(+), 13 deletions(-)
diff --git a/packages/app-store/routing-forms/pages/incomplete-booking/[...appPages].tsx b/packages/app-store/routing-forms/pages/incomplete-booking/[...appPages].tsx
index 557ebc8bed..cdd17b45c4 100644
--- a/packages/app-store/routing-forms/pages/incomplete-booking/[...appPages].tsx
+++ b/packages/app-store/routing-forms/pages/incomplete-booking/[...appPages].tsx
@@ -10,10 +10,10 @@ import { useLocale } from "@calcom/lib/hooks/useLocale";
import { IncompleteBookingActionType } from "@calcom/prisma/enums";
import { trpc } from "@calcom/trpc/react";
import type { inferSSRProps } from "@calcom/types/inferSSRProps";
+import { Button } from "@calcom/ui/components/button";
import { Switch } from "@calcom/ui/components/form";
import { InputField } from "@calcom/ui/components/form";
import { Select } from "@calcom/ui/components/form";
-import { Button } from "@calcom/ui/components/button";
import { showToast } from "@calcom/ui/components/toast";
import SingleForm, {
@@ -158,7 +158,7 @@ function Page({ form }: { form: RoutingFormWithResponseCount }) {
/>
-
+
@@ -380,6 +400,9 @@ const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({
...newOnBookingWriteToPersonObjectField,
fieldType: e.value,
...(e.value === SalesforceFieldType.DATE && { value: dateFieldValue.value }),
+ ...(e.value === SalesforceFieldType.CHECKBOX && {
+ value: checkboxFieldValue.value,
+ }),
});
}
}}
@@ -400,9 +423,23 @@ const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({
}
}}
/>
+ ) : writeToPersonObjectFieldType.value === SalesforceFieldType.CHECKBOX ? (
+ {
+ if (e) {
+ setCheckboxFieldValue(e);
+ setNewOnBookingWriteToPersonObjectField({
+ ...newOnBookingWriteToPersonObjectField,
+ value: e.value,
+ });
+ }
+ }}
+ />
) : (
setNewOnBookingWriteToPersonObjectField({
...newOnBookingWriteToPersonObjectField,
@@ -436,7 +473,7 @@ const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({
!(
newOnBookingWriteToPersonObjectField.field &&
newOnBookingWriteToPersonObjectField.fieldType &&
- newOnBookingWriteToPersonObjectField.value &&
+ newOnBookingWriteToPersonObjectField.value !== "" &&
newOnBookingWriteToPersonObjectField.whenToWrite
)
}
diff --git a/packages/app-store/salesforce/lib/CrmService.ts b/packages/app-store/salesforce/lib/CrmService.ts
index 3bb9732c32..d2ba2f6337 100644
--- a/packages/app-store/salesforce/lib/CrmService.ts
+++ b/packages/app-store/salesforce/lib/CrmService.ts
@@ -1059,7 +1059,6 @@ export default class SalesforceCRMService implements CRM {
// Search the fields and ensure 1. they exist 2. they're the right type
const fieldsToWriteOn = Object.keys(onBookingWriteToRecordFields);
const existingFields = await this.ensureFieldsExistOnObject(fieldsToWriteOn, personRecordType);
-
if (!existingFields.length) {
this.log.warn(`No fields found for record type ${personRecordType}`);
return;
@@ -1193,6 +1192,11 @@ export default class SalesforceCRMService implements CRM {
writeOnRecordBody[field.name] = picklistValue;
continue;
}
+ } else if (field.type === SalesforceFieldType.CHECKBOX) {
+ // If the checkbox field value is not a boolean for some reason, default to if it's a falsely value
+ const checkboxValue = !!fieldConfig.value;
+ writeOnRecordBody[field.name] = checkboxValue;
+ continue;
}
}
diff --git a/packages/app-store/salesforce/lib/enums.ts b/packages/app-store/salesforce/lib/enums.ts
index 7839e23fbd..b55c2af2a2 100644
--- a/packages/app-store/salesforce/lib/enums.ts
+++ b/packages/app-store/salesforce/lib/enums.ts
@@ -15,6 +15,7 @@ export enum SalesforceFieldType {
PHONE = "phone",
CUSTOM = "custom",
PICKLIST = "picklist",
+ CHECKBOX = "boolean",
}
export enum DateFieldTypeData {
diff --git a/packages/app-store/salesforce/zod.ts b/packages/app-store/salesforce/zod.ts
index 2354728e35..0329802db2 100644
--- a/packages/app-store/salesforce/zod.ts
+++ b/packages/app-store/salesforce/zod.ts
@@ -4,7 +4,7 @@ import { eventTypeAppCardZod } from "../eventTypeAppCardZod";
import { SalesforceRecordEnum, WhenToWriteToRecord, SalesforceFieldType } from "./lib/enums";
const writeToBookingEntry = z.object({
- value: z.string(),
+ value: z.union([z.string(), z.boolean()]),
fieldType: z.nativeEnum(SalesforceFieldType),
whenToWrite: z.nativeEnum(WhenToWriteToRecord),
});
@@ -12,7 +12,7 @@ const writeToBookingEntry = z.object({
export const writeToRecordEntrySchema = z.object({
field: z.string(),
fieldType: z.nativeEnum(SalesforceFieldType),
- value: z.string(),
+ value: z.union([z.string(), z.boolean()]),
whenToWrite: z.nativeEnum(WhenToWriteToRecord),
});