Skip to content

Commit

Permalink
feat: add "somewhere else" as a location option (#15108)
Browse files Browse the repository at this point in the history
* feat: add somewhere else as a location

* update

* update

* Update BookingFields.tsx

* update

* update

* chore: changes

* fix
  • Loading branch information
anikdhabal authored and zomars committed Sep 4, 2024
1 parent 33d1457 commit 5fc8085
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 10 deletions.
4 changes: 3 additions & 1 deletion apps/web/components/dialog/EditLocationDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,9 @@ export const EditLocationDialog = (props: ISetLocationDialog) => {
});
if (booking) {
locationOptions.map((location) =>
location.options.filter((l) => !["phone", "attendeeInPerson"].includes(l.value))
location.options.filter(
(l) => !["phone", "attendeeInPerson", "somewhereElse"].includes(l.value)
)
);
}
return (
Expand Down
1 change: 1 addition & 0 deletions apps/web/public/message-pin.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions apps/web/public/static/locales/en/common.json
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,9 @@
"address": "Address",
"enter_address": "Enter address",
"in_person_attendee_address": "In Person (Attendee Address)",
"somewhere_else": "Somewhere Else",
"custom_attendee_location":"Custom attendee location",
"any_location": "Any location",
"yes": "Yes",
"no": "No",
"additional_notes": "Additional notes",
Expand Down
32 changes: 29 additions & 3 deletions packages/app-store/locations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,14 @@ export type DefaultEventLocationType = {
| "locationPhoneNumber"
| "phone"
| "hostDefault";
defaultValueVariable: "address" | "attendeeAddress" | "link" | "hostPhoneNumber" | "hostDefault" | "phone";
defaultValueVariable:
| "address"
| "attendeeAddress"
| "link"
| "hostPhoneNumber"
| "hostDefault"
| "phone"
| "somewhereElse";
} & (
| {
organizerInputType: "phone" | "text" | null;
Expand All @@ -35,7 +42,7 @@ export type DefaultEventLocationType = {
attendeeInputPlaceholder?: null;
}
| {
attendeeInputType: "phone" | "attendeeAddress" | null;
attendeeInputType: "phone" | "attendeeAddress" | "somewhereElse" | null;
attendeeInputPlaceholder: string;
organizerInputType?: null;
organizerInputPlaceholder?: null;
Expand Down Expand Up @@ -78,6 +85,7 @@ export enum DefaultEventLocationTypeEnum {
Link = "link",
// Same as `OrganizerDefaultConferencingAppType`
Conferencing = "conferencing",
SomewhereElse = "somewhereElse",
}

export const defaultLocations: DefaultEventLocationType[] = [
Expand All @@ -94,6 +102,19 @@ export const defaultLocations: DefaultEventLocationType[] = [
iconUrl: "/map-pin-dark.svg",
category: "in person",
},
{
default: true,
type: DefaultEventLocationTypeEnum.SomewhereElse,
label: "custom_attendee_location",
variable: "address",
organizerInputType: null,
messageForOrganizer: "Cal will ask your invitee to enter any location before scheduling.",
attendeeInputType: "somewhereElse",
attendeeInputPlaceholder: "any_location",
defaultValueVariable: "somewhereElse",
iconUrl: "/message-pin.svg",
category: "other",
},
{
default: true,
type: DefaultEventLocationTypeEnum.InPerson,
Expand Down Expand Up @@ -163,6 +184,8 @@ const translateAbleKeys = [
"link_meeting",
"organizer_phone_number",
"organizer_default_conferencing_app",
"somewhere_else",
"custom_attendee_location",
];

export type LocationObject = {
Expand All @@ -171,7 +194,10 @@ export type LocationObject = {
displayLocationPublicly?: boolean;
credentialId?: number;
} & Partial<
Record<"address" | "attendeeAddress" | "link" | "hostPhoneNumber" | "hostDefault" | "phone", string>
Record<
"address" | "attendeeAddress" | "link" | "hostPhoneNumber" | "hostDefault" | "phone" | "somewhereElse",
string
>
>;

// integrations:jitsi | 919999999999 | Delhi | https://manual.meeting.link | Around Video
Expand Down
5 changes: 5 additions & 0 deletions packages/features/bookings/lib/getBookingFields.ts
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,11 @@ export const ensureBookingInputsHaveSystemFields = ({
required: true,
placeholder: "",
},
somewhereElse: {
type: "text",
required: true,
placeholder: "",
},
phone: {
type: "phone",
required: true,
Expand Down
1 change: 1 addition & 0 deletions packages/features/eventtypes/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export type FormValues = {
type: EventLocationType["type"];
address?: string;
attendeeAddress?: string;
somewhereElse?: string;
link?: string;
hostPhoneNumber?: string;
displayLocationPublicly?: boolean;
Expand Down
16 changes: 10 additions & 6 deletions packages/features/form-builder/Components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,9 @@ export const Components: Record<FieldType, Component> = {
checked={value?.value === option.value}
/>
<span className="text-emphasis me-2 ms-2 text-sm">
{getCleanLabel(option.label) ?? ""}
{option.value === "somewhereElse"
? t("somewhere_else")
: getCleanLabel(option.label) ?? ""}
</span>
<span>
{option.value === "phone" && (
Expand All @@ -467,13 +469,15 @@ export const Components: Record<FieldType, Component> = {
) : (
// Use the only option itself to determine if the field is required or not.
<>
<Label className="flex">
<Label className="flex items-center">
{/* We still want to show the label of the field if it is changed by the user otherwise the best label would be the option label */}
{getCleanLabel(
didUserProvideLabel(label, translatedDefaultLabel) ? label : options[0].label
)}
{options[0].value === "somewhereElse"
? translatedDefaultLabel
: getCleanLabel(
didUserProvideLabel(label, translatedDefaultLabel) ? label : options[0].label
)}
{!readOnly && optionsInputs[options[0].value]?.required ? (
<span className="text-default mb-1 ml-1 text-sm font-medium">*</span>
<span className="text-default -mb-2 ml-1 text-sm font-medium">*</span>
) : null}
{options[0].value === "phone" && (
<InfoBadge content={t("number_in_international_format")} />
Expand Down

0 comments on commit 5fc8085

Please sign in to comment.