From d4c2bd45ae3998707acc4ca10e7478e6e6eabe52 Mon Sep 17 00:00:00 2001 From: Aditya Khatri Date: Thu, 23 Nov 2023 14:11:06 +0545 Subject: [PATCH] Add icon and title selector in badge inputs --- src/components/BadgeInput/index.tsx | 8 ++++++++ src/components/MultiBadgeInput/index.tsx | 8 ++++++++ storybook/stories/BadgeInput.stories.tsx | 8 ++++++++ 3 files changed, 24 insertions(+) diff --git a/src/components/BadgeInput/index.tsx b/src/components/BadgeInput/index.tsx index d9ca557b..27c1878a 100644 --- a/src/components/BadgeInput/index.tsx +++ b/src/components/BadgeInput/index.tsx @@ -18,6 +18,8 @@ export interface Props { options: O[] | null | undefined; keySelector: (datum: O) => K; labelSelector: (datum: O) => string; + titleSelector?: (datum: O) => string | undefined; + iconSelector?: (datum: O) => React.ReactNode | undefined; onChange?: (value: K | undefined, name: N) => void; disabled?: boolean | undefined; selectedButtonVariant?: ButtonVariant; @@ -46,6 +48,8 @@ function BadgeInput(props: Props(props: Props ({ name: keySelector(data), children: labelSelector(data), + title: titleSelector ? titleSelector(data) : undefined, + icons: iconSelector ? iconSelector(data) : undefined, disabled, variant: value === key ? selectedButtonVariant : buttonVariant, onClick: handleOptionClick, @@ -87,6 +93,8 @@ function BadgeInput(props: Props { options: O[] | null | undefined; keySelector: (datum: O) => K; labelSelector: (datum: O) => string; + titleSelector?: (datum: O) => string | undefined; + iconSelector?: (datum: O) => React.ReactNode | undefined; onChange?: (value: K[] | undefined, name: N) => void; disabled?: boolean | undefined; selectedButtonVariant?: ButtonVariant; @@ -48,6 +50,8 @@ function MultiBadgeInput(props: Prop disabled, labelSelector, keySelector, + titleSelector, + iconSelector, value, listClassName, containerClassName, @@ -96,6 +100,8 @@ function MultiBadgeInput(props: Prop const rendererParams = useCallback((key: K, data: O) => ({ name: keySelector(data), children: labelSelector(data), + title: titleSelector ? titleSelector(data) : undefined, + icons: iconSelector ? iconSelector(data) : undefined, disabled, variant: valueMap?.[key] ? selectedButtonVariant : buttonVariant, onClick: handleOptionClick, @@ -107,6 +113,8 @@ function MultiBadgeInput(props: Prop ), }), [ smallButtons, + titleSelector, + iconSelector, valueMap, selectedButtonVariant, buttonClassName, diff --git a/storybook/stories/BadgeInput.stories.tsx b/storybook/stories/BadgeInput.stories.tsx index a2e58e55..66308dda 100644 --- a/storybook/stories/BadgeInput.stories.tsx +++ b/storybook/stories/BadgeInput.stories.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { Story } from '@storybook/react/types-6-0'; +import { IoBugOutline } from 'react-icons/io5'; import { useArgs } from '@storybook/client-api'; import BadgeInput, { Props as BadgeInputProps } from '../../src/components/BadgeInput'; @@ -21,14 +22,19 @@ const Template: Story> = (args) => { { key: 'cats', label: 'Cats', + title: 'Meow!', + icon: undefined, }, { key: 'dogs', label: 'Dogs', + title: 'Bhow Bhow!', + icon: undefined, }, { key: 'monkeys', label: 'Monkeys', + icon: (), }, ]; @@ -40,6 +46,8 @@ const Template: Story> = (args) => { options={suggestionOptions} keySelector={(s) => s.key} labelSelector={(s) => s.label} + titleSelector={(s) => s.title} + iconSelector={(s) => s.icon} onChange={handleChange} /> );