* use booking.uid instead of booking.id for url param * show timezone on calendar * fix type * restore horizontal tab and remove header and subtitle * clean up sidebar items * fix event propagation from attendees * fetch all statuses except for cancelled on calendar view * clean up styles of the badges on BookingListItem * fix useMediaQuery * add close button to the header * add assignment reason to the details sheet * use separator row * use ToggleGroup for the top bookings tab * move ViewToggleButton * resize the action button * remove wrong prop * fix type error * fix type error * hide view toggle button on mobile (and fix the breakpoint) * remove unused e2e tests * fix e2e tests * hide toggle button when feature flag is off * update skeleton * improve attendees on booking list item and slide over * improve attendee dropdown * fix type error * move query to containers * select attendee email * infinite fetching for calendar view * update styles * fix compatibility * fix: add backward compatibility for status field in getAllUserBookings * increase calendar height * fix type error * support Member filter only for admin / owners * add debug log (TEMP) * add event border color * show Reject / Accept buttons on BookingDetailsSheet * move description section to the top * update When section * update style of Who section * add CancelBookingDialog WIP * fix CancelBookingDialog * increase clickable area * add schedule info section WIP * fix flaky reject button * fixing reschedule info WIP * add fromReschedule index to Booking * improve rescheduled information * improve reassignment * fix type error * fix unit test * respect user's weekStart value on the booking calendar view * update debug log * improve payment section * clean up * fix log message * reposition filters on list view * fix bookings controller api2 e2e test * clean up file by extracting logic into custom hooks * rename files * merge BookingCalendar into its container * extract logic into separate hook files * remove redundant logic * rearrange items on calendar view * add WeekPicker * extract filter button * responsive header on list view * horizontal scroll for ToggleGroup WIP * fix type error * fix cancelling recurring event * address feedback * fix e2e tests * fix unit test * fix e2e tests * make hover style more visible for ToggleGroup * fix margin on CancelBookingDialog * update styles on the slide over (mostly font weight) * update style of CancelBookingDialog * update styles * update margin top for the header * refactor getBookingDetails handler * fix gap in who section * auto-filter the current user on the calendar view * calculate calendar height considering top banners * improve booking details sheet interaction without overlay * update calendar event styles * update reject dialog style * put uid first in the query params * fix class name * memoize functions in useMediaQuery * query attendee with id instead of email * update margins * replace TRPCError with ErrorWithCode * move calculation outside loop * remove dead code
97 lines
3.2 KiB
TypeScript
97 lines
3.2 KiB
TypeScript
import * as RadixToggleGroup from "@radix-ui/react-toggle-group";
|
|
import type { ReactNode } from "react";
|
|
|
|
import classNames from "@calcom/ui/classNames";
|
|
|
|
import { Tooltip } from "../../tooltip/Tooltip";
|
|
|
|
interface ToggleGroupProps extends Omit<RadixToggleGroup.ToggleGroupSingleProps, "type"> {
|
|
options: {
|
|
value: string;
|
|
label: string | ReactNode;
|
|
disabled?: boolean;
|
|
tooltip?: string;
|
|
iconLeft?: ReactNode;
|
|
dataTestId?: string;
|
|
onClick?: VoidFunction;
|
|
}[];
|
|
isFullWidth?: boolean;
|
|
orientation?: "horizontal" | "vertical";
|
|
}
|
|
|
|
const OptionalTooltipWrapper = ({
|
|
children,
|
|
tooltipText,
|
|
}: {
|
|
children: ReactNode;
|
|
tooltipText?: ReactNode;
|
|
}) => {
|
|
if (tooltipText) {
|
|
return (
|
|
<Tooltip delayDuration={150} sideOffset={12} side="bottom" content={tooltipText}>
|
|
{children}
|
|
</Tooltip>
|
|
);
|
|
}
|
|
return <>{children}</>;
|
|
};
|
|
|
|
export const ToggleGroup = ({
|
|
options,
|
|
onValueChange,
|
|
isFullWidth,
|
|
orientation = "horizontal",
|
|
customClassNames,
|
|
...props
|
|
}: ToggleGroupProps & { customClassNames?: string }) => {
|
|
return (
|
|
<>
|
|
<RadixToggleGroup.Root
|
|
type="single"
|
|
{...props}
|
|
orientation={orientation}
|
|
onValueChange={onValueChange}
|
|
style={{
|
|
// @ts-expect-error --toggle-group-shadow is not a valid CSS property but can be a variable
|
|
"--toggle-group-shadow":
|
|
"0px 2px 3px 0px rgba(0, 0, 0, 0.03), 0px 2px 2px -1px rgba(0, 0, 0, 0.03)",
|
|
}}
|
|
className={classNames(
|
|
`bg-muted rounded-[10px] p-0.5`,
|
|
orientation === "horizontal" && "inline-flex gap-0.5 rtl:flex-row-reverse",
|
|
orientation === "vertical" && "flex w-fit flex-col gap-0.5",
|
|
props.className,
|
|
isFullWidth && "w-full",
|
|
customClassNames
|
|
)}>
|
|
{options.map((option) => (
|
|
<OptionalTooltipWrapper key={option.value} tooltipText={option.tooltip}>
|
|
<RadixToggleGroup.Item
|
|
disabled={option.disabled}
|
|
onClick={option?.onClick}
|
|
value={option.value}
|
|
data-testid={option.dataTestId ?? `toggle-group-item-${option.value}`}
|
|
className={classNames(
|
|
"aria-checked:bg-default aria-checked:border-subtle rounded-lg border border-transparent p-1.5 text-sm leading-none transition aria-checked:shadow-[0px_2px_3px_0px_rgba(0,0,0,0.03),0px_2px_2px_-1px_rgba(0,0,0,0.03)]",
|
|
option.disabled
|
|
? "text-gray-400 hover:cursor-not-allowed"
|
|
: "text-default [&[aria-checked='false']]:hover:text-emphasis [&[aria-checked='false']]:hover:bg-subtle cursor-pointer",
|
|
isFullWidth && "w-full"
|
|
)}>
|
|
<div
|
|
className={classNames(
|
|
"flex items-center gap-1",
|
|
orientation === "horizontal" && "justify-center",
|
|
orientation === "vertical" && "justify-start"
|
|
)}>
|
|
{option.iconLeft && <span className="flex h-4 w-4 items-center">{option.iconLeft}</span>}
|
|
{option.label}
|
|
</div>
|
|
</RadixToggleGroup.Item>
|
|
</OptionalTooltipWrapper>
|
|
))}
|
|
</RadixToggleGroup.Root>
|
|
</>
|
|
);
|
|
};
|