Files
calendar/packages/ui/components/avatar/AvatarGroup.tsx
T
45db5c0d5e refactor: event types infinite scroll (#15949)
* chore

* chore

* feat: paginated event types

* fix: event types page

* fix: k bar

* fix: event type order

* fix: type error

* chore: remove commented code

* chore: type err

* chore: type err and feedback

* feat: add old component

* chore: missing import

* fix: add isInfiniteScrollEnabled prop

* chore: type err

* chore: type error

* feat: auto fetch next page when button is in view

* Update packages/lib/server/repository/eventType.ts

* Update packages/lib/server/repository/eventType.ts

* chore: feedback

* fix: managed event types

* fix: Review fixes for event-types-infinite-scroll (#16047)

* Review fixes

* chore: missing import

---------

Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
Co-authored-by: Udit Takkar <udit222001@gmail.com>

* chore: type error

* chore

* fix: delete event type

* fix: create event dialog

* fix: create and duplicate dialog

* chore: simplify return type

* fix: type

* chore: invalidate query

* chore: remove query

* fix duplicated event not showing.

---------

Co-authored-by: Peer Richelsen <peeroke@gmail.com>
Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
2024-08-05 16:01:03 +04:00

63 lines
1.9 KiB
TypeScript

import classNames from "@calcom/lib/classNames";
import { Avatar } from "./Avatar";
export type AvatarGroupProps = {
size: "sm" | "lg";
items: {
image: string;
title?: string;
alt?: string;
href?: string | null;
}[];
className?: string;
truncateAfter?: number;
hideTruncatedAvatarsCount?: boolean;
};
export const AvatarGroup = function AvatarGroup(props: AvatarGroupProps) {
const LENGTH = props.items.length;
const truncateAfter = props.truncateAfter || 4;
/**
* First, filter all the avatars object that have image
* Then, slice it until before `truncateAfter` index
*/
const displayedAvatars = props.items.filter((avatar) => avatar.image).slice(0, truncateAfter);
const numTruncatedAvatars = LENGTH - displayedAvatars.length;
if (!displayedAvatars.length) return <></>;
return (
<ul className={classNames("flex items-center", props.className)}>
{displayedAvatars.map((item, idx) => (
<li key={idx} className="-mr-1 inline-block">
<Avatar
data-testid="avatar"
className="border-subtle"
imageSrc={item.image}
title={item.title}
alt={item.alt || ""}
size={props.size}
href={item.href}
/>
</li>
))}
{numTruncatedAvatars > 0 && (
<li
className={classNames(
"bg-inverted relative -mr-1 inline-flex justify-center overflow-hidden rounded-full",
props.size === "sm" ? "min-w-6 h-6" : "min-w-16 h-16"
)}>
<span
className={classNames(
" text-inverted m-auto flex h-full w-full items-center justify-center text-center",
props.size === "sm" ? "text-[12px]" : "text-2xl"
)}>
+{props.hideTruncatedAvatarsCount ? null : numTruncatedAvatars}
</span>
</li>
)}
</ul>
);
};