fix/event-type-location-select (#5692)

* Fixed dialog components usage

* Fix styles
This commit is contained in:
alannnc 2022-11-25 13:19:08 -07:00 committed by Alex van Andel
parent b188368e8f
commit c2614885d1

View File

@ -17,7 +17,7 @@ import {
import { classNames } from "@calcom/lib"; import { classNames } from "@calcom/lib";
import { useLocale } from "@calcom/lib/hooks/useLocale"; import { useLocale } from "@calcom/lib/hooks/useLocale";
import { RouterOutputs, trpc } from "@calcom/trpc/react"; import { RouterOutputs, trpc } from "@calcom/trpc/react";
import { Button, Dialog, DialogContent, Form, Icon, PhoneInput } from "@calcom/ui"; import { Button, Dialog, DialogClose, DialogContent, DialogFooter, Form, Icon, PhoneInput } from "@calcom/ui";
import { QueryCell } from "@lib/QueryCell"; import { QueryCell } from "@lib/QueryCell";
@ -212,13 +212,13 @@ export const EditLocationDialog = (props: ISetLocationDialog) => {
return ( return (
<Dialog open={isOpenDialog}> <Dialog open={isOpenDialog}>
<DialogContent asChild> <DialogContent useOwnActionButtons>
<div className="inline-block transform rounded-sm bg-white px-4 pt-5 pb-4 text-left align-bottom shadow-xl transition-all sm:my-8 sm:w-full sm:max-w-lg sm:p-6 sm:align-middle"> <div className="flex flex-row space-x-3">
<div className="mb-4 sm:flex sm:items-start"> <div className="bg-secondary-100 mx-auto flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-full sm:mx-0 sm:h-10 sm:w-10">
<div className="bg-secondary-100 mx-auto flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-full sm:mx-0 sm:h-10 sm:w-10"> <Icon.FiMapPin className="text-primary-600 h-6 w-6" />
<Icon.FiMapPin className="text-primary-600 h-6 w-6" /> </div>
</div> <div className="w-full">
<div className="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left"> <div className="mt-3 text-center sm:mt-0 sm:text-left">
<h3 className="text-lg font-medium leading-6 text-gray-900" id="modal-title"> <h3 className="text-lg font-medium leading-6 text-gray-900" id="modal-title">
{t("edit_location")} {t("edit_location")}
</h3> </h3>
@ -226,148 +226,152 @@ export const EditLocationDialog = (props: ISetLocationDialog) => {
<p className="text-sm text-gray-400">{t("this_input_will_shown_booking_this_event")}</p> <p className="text-sm text-gray-400">{t("this_input_will_shown_booking_this_event")}</p>
)} )}
</div> </div>
<div className="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left" /> <div className="mt-3 text-center sm:mt-0 sm:text-left" />
</div>
{booking && (
<>
<p className="mt-6 mb-2 ml-1 text-sm font-bold text-black">{t("current_location")}:</p>
<p className="mb-2 ml-1 text-sm text-black">
{getHumanReadableLocationValue(booking.location, t)}
</p>
</>
)}
<Form
form={locationFormMethods}
handleSubmit={async (values) => {
const { locationType: newLocation, displayLocationPublicly } = values;
let details = {}; {booking && (
if (newLocation === LocationType.InPerson) { <>
details = { <p className="mt-6 mb-2 ml-1 text-sm font-bold text-black">{t("current_location")}:</p>
address: values.locationAddress, <p className="mb-2 ml-1 text-sm text-black">
}; {getHumanReadableLocationValue(booking.location, t)}
} </p>
const eventLocationType = getEventLocationType(newLocation); </>
)}
<Form
form={locationFormMethods}
handleSubmit={async (values) => {
const { locationType: newLocation, displayLocationPublicly } = values;
// TODO: There can be a property that tells if it is to be saved in `link` let details = {};
if ( if (newLocation === LocationType.InPerson) {
newLocation === LocationType.Link || details = {
(!eventLocationType?.default && eventLocationType?.linkType === "static") address: values.locationAddress,
) { };
details = { link: values.locationLink };
}
if (newLocation === LocationType.UserPhone) {
details = { hostPhoneNumber: values.locationPhoneNumber };
}
if (eventLocationType?.organizerInputType) {
details = {
...details,
displayLocationPublicly,
};
}
saveLocation(newLocation, details);
setShowLocationModal(false);
setSelectedLocation?.(undefined);
locationFormMethods.unregister([
"locationType",
"locationLink",
"locationAddress",
"locationPhoneNumber",
]);
}}>
<QueryCell
query={locationsQuery}
success={({ data: locationOptions }) => {
if (!locationOptions.length) return null;
if (booking) {
locationOptions.forEach((location) => {
if (location.label === "phone") {
location.options.filter((l) => l.value !== "phone");
} else if (location.label === "in person") {
location.options.filter((l) => l.value !== "attendeeInPerson");
}
});
} }
return ( const eventLocationType = getEventLocationType(newLocation);
<Controller
name="locationType" // TODO: There can be a property that tells if it is to be saved in `link`
control={locationFormMethods.control} if (
render={() => ( newLocation === LocationType.Link ||
<Select<{ label: string; value: string; icon?: string }> (!eventLocationType?.default && eventLocationType?.linkType === "static")
maxMenuHeight={150} ) {
name="location" details = { link: values.locationLink };
defaultValue={selection} }
options={locationOptions}
components={{ if (newLocation === LocationType.UserPhone) {
Option: (props) => ( details = { hostPhoneNumber: values.locationPhoneNumber };
<components.Option {...props}> }
<div className="flex items-center gap-3">
{props.data.icon && ( if (eventLocationType?.organizerInputType) {
<img src={props.data.icon} alt="cover" className="h-3.5 w-3.5" /> details = {
)} ...details,
<span displayLocationPublicly,
className={classNames( };
"text-sm font-medium", }
props.isSelected ? "text-white" : "text-gray-900"
)}> saveLocation(newLocation, details);
{props.data.label} setShowLocationModal(false);
</span> setSelectedLocation?.(undefined);
</div> locationFormMethods.unregister([
</components.Option> "locationType",
), "locationLink",
}} "locationAddress",
formatOptionLabel={(e) => ( "locationPhoneNumber",
<div className="flex items-center gap-3"> ]);
{e.icon && <img src={e.icon} alt="app-icon" className="h-5 w-5" />} }}>
<span>{e.label}</span> <QueryCell
</div> query={locationsQuery}
)} success={({ data: locationOptions }) => {
formatGroupLabel={(e) => ( if (!locationOptions.length) return null;
<p className="text-xs font-medium text-gray-600">{e.label}</p> if (booking) {
)} locationOptions.forEach((location) => {
isSearchable if (location.label === "phone") {
className="my-4 block w-full min-w-0 flex-1 rounded-sm border border-gray-300 text-sm" location.options.filter((l) => l.value !== "phone");
onChange={(val) => { } else if (location.label === "in person") {
if (val) { location.options.filter((l) => l.value !== "attendeeInPerson");
locationFormMethods.setValue("locationType", val.value); }
locationFormMethods.unregister([ });
"locationLink", }
"locationAddress", return (
"locationPhoneNumber", <Controller
]); name="locationType"
locationFormMethods.clearErrors([ control={locationFormMethods.control}
"locationLink", render={() => (
"locationPhoneNumber", <Select<{ label: string; value: string; icon?: string }>
"locationAddress", maxMenuHeight={150}
]); name="location"
setSelectedLocation?.(val); defaultValue={selection}
} options={locationOptions}
}} components={{
/> Option: (props) => (
)} <components.Option {...props}>
/> <div className="flex items-center gap-3">
); {props.data.icon && (
}} <img src={props.data.icon} alt="cover" className="h-3.5 w-3.5" />
/> )}
{selectedLocation && LocationOptions} <span
<div className="mt-4 flex justify-end space-x-2"> className={classNames(
<Button "text-sm font-medium",
onClick={() => { props.isSelected ? "text-white" : "text-gray-900"
setShowLocationModal(false); )}>
setSelectedLocation?.(undefined); {props.data.label}
setEditingLocationType?.(""); </span>
locationFormMethods.unregister("locationType"); </div>
</components.Option>
),
}}
formatOptionLabel={(e) => (
<div className="flex items-center gap-3">
{e.icon && <img src={e.icon} alt="app-icon" className="h-5 w-5" />}
<span>{e.label}</span>
</div>
)}
formatGroupLabel={(e) => (
<p className="text-xs font-medium text-gray-600">{e.label}</p>
)}
isSearchable
className="my-4 block w-full min-w-0 flex-1 rounded-sm border border-gray-300 text-sm"
onChange={(val) => {
if (val) {
locationFormMethods.setValue("locationType", val.value);
locationFormMethods.unregister([
"locationLink",
"locationAddress",
"locationPhoneNumber",
]);
locationFormMethods.clearErrors([
"locationLink",
"locationPhoneNumber",
"locationAddress",
]);
setSelectedLocation?.(val);
}
}}
/>
)}
/>
);
}} }}
type="button" />
color="secondary"> {selectedLocation && LocationOptions}
{t("cancel")} <DialogFooter>
</Button> <div className="mt-4 flex justify-end space-x-2">
<Button type="submit">{t("update")}</Button> <Button
</div> onClick={() => {
</Form> setShowLocationModal(false);
setSelectedLocation?.(undefined);
setEditingLocationType?.("");
locationFormMethods.unregister("locationType");
}}
type="button"
color="secondary">
{t("cancel")}
</Button>
<Button type="submit">{t("update")}</Button>
</div>
</DialogFooter>
</Form>
</div>
</div> </div>
</DialogContent> </DialogContent>
</Dialog> </Dialog>