From 7ae325c16005b875c4f582259848f88cd9ec2787 Mon Sep 17 00:00:00 2001 From: roman Date: Tue, 18 Aug 2026 15:21:07 +0200 Subject: [PATCH] refactor(pill-selector-dropdown): migrate PillSelectorDropdown from Flow to TypeScript --- .../{Pill.js => Pill.js.flow} | 0 .../pill-selector-dropdown/Pill.tsx | 37 ++ .../{PillSelector.js => PillSelector.js.flow} | 0 .../pill-selector-dropdown/PillSelector.tsx | 345 ++++++++++++++++++ ...opdown.js => PillSelectorDropdown.js.flow} | 0 ...es.js => PillSelectorDropdown.stories.tsx} | 81 ++-- .../PillSelectorDropdown.tsx | 329 +++++++++++++++++ ...d.js => PillSelectorDropdownField.js.flow} | 0 .../PillSelectorDropdownField.tsx | 166 +++++++++ .../{RoundPill.js => RoundPill.js.flow} | 0 .../pill-selector-dropdown/RoundPill.tsx | 146 ++++++++ ...SuggestedPill.js => SuggestedPill.js.flow} | 0 .../pill-selector-dropdown/SuggestedPill.tsx | 58 +++ ...dPillsRow.js => SuggestedPillsRow.js.flow} | 0 .../SuggestedPillsRow.tsx | 55 +++ .../__tests__/{Pill.test.js => Pill.test.tsx} | 1 + ...Selector.test.js => PillSelector.test.tsx} | 80 ++-- ....test.js => PillSelectorDropdown.test.tsx} | 115 +++--- ....js => PillSelectorDropdownField.test.tsx} | 57 +-- .../{RoundPill.test.js => RoundPill.test.tsx} | 108 ++++-- ...tedPill.test.js => SuggestedPill.test.tsx} | 7 +- ...lRow.test.js => SuggestedPillRow.test.tsx} | 7 +- .../{Pill.test.js.snap => Pill.test.tsx.snap} | 0 ...est.js.snap => PillSelector.test.tsx.snap} | 0 ...nap => PillSelectorDropdown.test.tsx.snap} | 0 ...> PillSelectorDropdownField.test.tsx.snap} | 0 ...l.test.js.snap => RoundPill.test.tsx.snap} | 0 ...st.js.snap => SuggestedPill.test.tsx.snap} | 0 ...js.snap => SuggestedPillRow.test.tsx.snap} | 0 ...p => defaultDropdownRenderer.test.ts.snap} | 0 ...est.js => defaultDropdownRenderer.test.ts} | 0 ...ser.test.js => defaultInputParser.test.ts} | 5 +- ...rer.js => defaultDropdownRenderer.js.flow} | 0 .../defaultDropdownRenderer.tsx | 10 + ...utParser.js => defaultInputParser.js.flow} | 0 .../defaultInputParser.ts | 43 +++ ....test.js => defaultDropdownFilter.test.ts} | 0 ...ter.test.js => waitForInputFilter.test.ts} | 1 - ...ilter.js => defaultDropdownFilter.js.flow} | 0 .../filters/defaultDropdownFilter.ts | 26 ++ ...utFilter.js => waitForInputFilter.js.flow} | 0 .../filters/waitForInputFilter.ts | 19 + .../{flowTypes.js => flowTypes.js.flow} | 0 .../pill-selector-dropdown/flowTypes.ts | 45 +++ .../{index.js => index.js.flow} | 0 .../pill-selector-dropdown/index.ts | 6 + .../pill-selector-dropdown/types.ts | 9 +- 47 files changed, 1550 insertions(+), 206 deletions(-) rename src/components/pill-selector-dropdown/{Pill.js => Pill.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/Pill.tsx rename src/components/pill-selector-dropdown/{PillSelector.js => PillSelector.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/PillSelector.tsx rename src/components/pill-selector-dropdown/{PillSelectorDropdown.js => PillSelectorDropdown.js.flow} (100%) rename src/components/pill-selector-dropdown/{PillSelectorDropdown.stories.js => PillSelectorDropdown.stories.tsx} (84%) create mode 100644 src/components/pill-selector-dropdown/PillSelectorDropdown.tsx rename src/components/pill-selector-dropdown/{PillSelectorDropdownField.js => PillSelectorDropdownField.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/PillSelectorDropdownField.tsx rename src/components/pill-selector-dropdown/{RoundPill.js => RoundPill.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/RoundPill.tsx rename src/components/pill-selector-dropdown/{SuggestedPill.js => SuggestedPill.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/SuggestedPill.tsx rename src/components/pill-selector-dropdown/{SuggestedPillsRow.js => SuggestedPillsRow.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/SuggestedPillsRow.tsx rename src/components/pill-selector-dropdown/__tests__/{Pill.test.js => Pill.test.tsx} (98%) rename src/components/pill-selector-dropdown/__tests__/{PillSelector.test.js => PillSelector.test.tsx} (87%) rename src/components/pill-selector-dropdown/__tests__/{PillSelectorDropdown.test.js => PillSelectorDropdown.test.tsx} (84%) rename src/components/pill-selector-dropdown/__tests__/{PillSelectorDropdownField.test.js => PillSelectorDropdownField.test.tsx} (81%) rename src/components/pill-selector-dropdown/__tests__/{RoundPill.test.js => RoundPill.test.tsx} (52%) rename src/components/pill-selector-dropdown/__tests__/{SuggestedPill.test.js => SuggestedPill.test.tsx} (91%) rename src/components/pill-selector-dropdown/__tests__/{SuggestedPillRow.test.js => SuggestedPillRow.test.tsx} (95%) rename src/components/pill-selector-dropdown/__tests__/__snapshots__/{Pill.test.js.snap => Pill.test.tsx.snap} (100%) rename src/components/pill-selector-dropdown/__tests__/__snapshots__/{PillSelector.test.js.snap => PillSelector.test.tsx.snap} (100%) rename src/components/pill-selector-dropdown/__tests__/__snapshots__/{PillSelectorDropdown.test.js.snap => PillSelectorDropdown.test.tsx.snap} (100%) rename src/components/pill-selector-dropdown/__tests__/__snapshots__/{PillSelectorDropdownField.test.js.snap => PillSelectorDropdownField.test.tsx.snap} (100%) rename src/components/pill-selector-dropdown/__tests__/__snapshots__/{RoundPill.test.js.snap => RoundPill.test.tsx.snap} (100%) rename src/components/pill-selector-dropdown/__tests__/__snapshots__/{SuggestedPill.test.js.snap => SuggestedPill.test.tsx.snap} (100%) rename src/components/pill-selector-dropdown/__tests__/__snapshots__/{SuggestedPillRow.test.js.snap => SuggestedPillRow.test.tsx.snap} (100%) rename src/components/pill-selector-dropdown/__tests__/__snapshots__/{defaultDropdownRenderer.test.js.snap => defaultDropdownRenderer.test.ts.snap} (100%) rename src/components/pill-selector-dropdown/__tests__/{defaultDropdownRenderer.test.js => defaultDropdownRenderer.test.ts} (100%) rename src/components/pill-selector-dropdown/__tests__/{defaultInputParser.test.js => defaultInputParser.test.ts} (97%) rename src/components/pill-selector-dropdown/{defaultDropdownRenderer.js => defaultDropdownRenderer.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/defaultDropdownRenderer.tsx rename src/components/pill-selector-dropdown/{defaultInputParser.js => defaultInputParser.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/defaultInputParser.ts rename src/components/pill-selector-dropdown/filters/__tests__/{defaultDropdownFilter.test.js => defaultDropdownFilter.test.ts} (100%) rename src/components/pill-selector-dropdown/filters/__tests__/{waitForInputFilter.test.js => waitForInputFilter.test.ts} (99%) rename src/components/pill-selector-dropdown/filters/{defaultDropdownFilter.js => defaultDropdownFilter.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/filters/defaultDropdownFilter.ts rename src/components/pill-selector-dropdown/filters/{waitForInputFilter.js => waitForInputFilter.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/filters/waitForInputFilter.ts rename src/components/pill-selector-dropdown/{flowTypes.js => flowTypes.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/flowTypes.ts rename src/components/pill-selector-dropdown/{index.js => index.js.flow} (100%) create mode 100644 src/components/pill-selector-dropdown/index.ts 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