Skip to content

Resource Picker

interface ResourcePickerClassNames {
readonly root?: string;
readonly search?: string;
readonly list?: string;
readonly option?: string;
readonly avatar?: string;
readonly details?: string;
readonly muted?: string
}

export type ResourcePickerId = string | number;

interface ResourcePickerItem {
readonly id: Id;
readonly name: string;
readonly avatarUrl?: string;
readonly role?: string;
readonly color?: string
}

interface ResourcePickerText {
readonly groupAriaLabel: string;
readonly searchPlaceholder: string;
readonly searchAriaLabel: string;
readonly emptyResources: string;
readonly emptySearch: string
}

interface ResourcePickerUnassignedOption {
readonly label: string;
readonly dataAttribute?: string
}

interface SharedResourcePickerProps {
readonly resources: readonly Resource[];
readonly selectedResourceIds: readonly Id[];
readonly text: ResourcePickerText;
readonly onChange: (resourceIds: readonly Id[]) => void;
readonly classNames?: ResourcePickerClassNames;
readonly disabled?: boolean;
/** Keeps resources in caller-provided order instead of sorting by name. */
readonly preserveOrder?: boolean;
readonly unassigned?: ResourcePickerUnassignedOption;
readonly resourceDataAttribute?: string;
readonly isResourceDisabled?: (resource: Resource) => boolean;
readonly getAvatarColor?: (resource: Resource) => string | undefined
}

export function SharedResourcePicker<
Id extends ResourcePickerId,
Resource extends ResourcePickerItem<Id>,
>({
resources,
selectedResourceIds,
text,
onChange,
classNames,
disabled = false,
preserveOrder = false,
unassigned,
resourceDataAttribute,
isResourceDisabled,
getAvatarColor,
}: SharedResourcePickerProps<Id, Resource>);

export function getResourcePickerInitials(name: string): string;

export function getResourcePickerColor(id: ResourcePickerId): string;

Chooses readable initials for hex avatar colors. Unknown CSS color formats retain the picker’s dark foreground fallback instead of guessing.

export function getResourcePickerForegroundColor(background: string): string;

export function ResourcePickerAvatar<Id extends ResourcePickerId>({
resource,
className,
color,
}: ResourcePickerAvatarProps<Id>);

interface ResourcePickerAvatarProps {
readonly resource: ResourcePickerItem<Id>;
readonly className?: string;
readonly color?: string
}

export function ResourcePickerOption<
Id extends ResourcePickerId,
Resource extends ResourcePickerItem<Id>,
>({
resource,
selected,
selectedResourceIds,
disabled,
resourceDataAttribute,
classNames,
isResourceDisabled,
getAvatarColor,
onChange,
}: ResourcePickerOptionProps<Id, Resource>);

interface ResourcePickerOptionProps {
readonly resource: Resource;
readonly selected: boolean;
readonly selectedResourceIds: readonly Id[];
readonly disabled: boolean;
readonly resourceDataAttribute?: string;
readonly classNames?: ResourcePickerClassNames;
readonly isResourceDisabled?: (resource: Resource) => boolean;
readonly getAvatarColor?: (resource: Resource) => string | undefined;
readonly onChange: (resourceIds: readonly Id[]) => void
}

export function resourcePickerIdKey(id: ResourcePickerId): string;

export function uniqueResourcePickerIds<Id extends ResourcePickerId>(
ids: readonly Id[],
): readonly Id[];

export function resourcePickerDataAttribute(
attribute: string | undefined,
value: string,
): Record<string, string>;

export function resourcePickerClasses(
...values: readonly (string | undefined)[]
): string;