diff --git a/src/components/pill-selector-dropdown/Pill.js b/src/components/pill-selector-dropdown/Pill.js.flow similarity index 100% rename from src/components/pill-selector-dropdown/Pill.js rename to src/components/pill-selector-dropdown/Pill.js.flow diff --git a/src/components/pill-selector-dropdown/Pill.tsx b/src/components/pill-selector-dropdown/Pill.tsx new file mode 100644 index 0000000000..ddafc521df --- /dev/null +++ b/src/components/pill-selector-dropdown/Pill.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; +import noop from 'lodash/noop'; +import classNames from 'classnames'; + +export interface PillProps { + /** Whether the pill is disabled and cannot be removed */ + isDisabled?: boolean; + /** Whether the pill is currently selected */ + isSelected?: boolean; + /** Whether the pill value is valid */ + isValid?: boolean; + /** Called when the remove control is clicked */ + onRemove: () => void; + /** Display text for the pill */ + text: string; +} + +const Pill = ({ isDisabled = false, isSelected = false, isValid = true, onRemove, text }: PillProps) => { + const styles = classNames('bdl-Pill', 'pill', { + 'is-selected': isSelected && !isDisabled, + 'is-invalid': !isValid, + 'is-disabled': isDisabled, + 'bdl-is-disabled': isDisabled, + }); + const onClick = isDisabled ? noop : onRemove; + + return ( + + {text} + + + ); +}; + +export default Pill; diff --git a/src/components/pill-selector-dropdown/PillSelector.js b/src/components/pill-selector-dropdown/PillSelector.js.flow similarity index 100% rename from src/components/pill-selector-dropdown/PillSelector.js rename to src/components/pill-selector-dropdown/PillSelector.js.flow diff --git a/src/components/pill-selector-dropdown/PillSelector.tsx b/src/components/pill-selector-dropdown/PillSelector.tsx new file mode 100644 index 0000000000..56a118e711 --- /dev/null +++ b/src/components/pill-selector-dropdown/PillSelector.tsx @@ -0,0 +1,345 @@ +import * as React from 'react'; +import classNames from 'classnames'; +import uniqueId from 'lodash/uniqueId'; +import { List } from 'immutable'; + +import Tooltip, { TooltipPosition, TooltipTheme, type TooltipProps } from '../tooltip'; +import { KEYS } from '../../constants'; + +import RoundPill from './RoundPill'; +import Pill from './Pill'; +import SuggestedPillsRow from './SuggestedPillsRow'; +import type { + GetPillImageUrl, + Option, + OptionValue, + RoundOption, + SelectedOptions, + SuggestedPill, + SuggestedPills, + SuggestedPillsFilter, +} from './flowTypes'; + +function stopDefaultEvent(event: React.SyntheticEvent) { + event.preventDefault(); + event.stopPropagation(); +} + +function isImmutableOptions(selectedOptions: SelectedOptions): selectedOptions is List