@launchpad-ui/filter 0.3.2 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.es.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/index.es.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/AppliedFilterButton.tsx","../src/FilterMenu.tsx","../src/AppliedFilter.tsx","../src/FilterButton.tsx","../src/Filter.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { ExpandMore, IconSize } from '@launchpad-ui/icons';\nimport { cx } from 'classix';\nimport { Children, forwardRef } from 'react';\n\nimport './styles/Filter.css';\n\ntype AppliedFilterButtonProps = {\n name?: ReactNode;\n className?: string;\n isSelected?: boolean;\n children: ReactNode;\n onClickFilterButton?(): void;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst AppliedFilterButton = forwardRef<Ref, AppliedFilterButtonProps>((props, ref) => {\n const { name, className, isSelected, children, onClickFilterButton } = props;\n\n const hasDescription = Children.count(children) !== 0;\n\n return (\n <div className=\"AppliedFilter-buttonContainer\">\n <button\n aria-haspopup\n className={cx('AppliedFilter-button', isSelected && 'isSelected', className)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {name && (\n <span className=\"AppliedFilter-name\">\n {name}\n {hasDescription && ':'}\n </span>\n )}\n {hasDescription && <span className=\"AppliedFilter-description\">{children}</span>}\n <ExpandMore size={IconSize.SMALL} />\n </button>\n </div>\n );\n});\n\nAppliedFilterButton.displayName = 'AppliedFilterButton';\n\nexport type { AppliedFilterButtonProps };\nexport { AppliedFilterButton };\n","import type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Button, ButtonKind } from '@launchpad-ui/button';\nimport { Check } from '@launchpad-ui/icons';\nimport { Menu, MenuDivider, MenuItem, MenuSearch } from '@launchpad-ui/menu';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FilterOption<T = any> = {\n name?: ReactNode;\n isDisabled?: boolean;\n isDivider?: boolean;\n isChecked?: boolean;\n value: T | null;\n projKey?: string;\n nested?: boolean;\n groupHeader?: boolean;\n};\n\ntype FilterMenuProps = Pick<MenuProps<string>, 'enableVirtualization' | 'size'> & {\n options: FilterOption[];\n onClearFilter?(): void;\n enableSearch?: boolean;\n searchValue?: string;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onSelect?(): void;\n isLoading?: boolean;\n disabledOptionTooltip?: string;\n};\n\nconst FilterMenu = ({\n options,\n onClearFilter,\n enableSearch,\n searchValue,\n searchPlaceholder,\n searchAriaLabel,\n onSelect,\n onSearchChange,\n isLoading = false,\n disabledOptionTooltip,\n enableVirtualization,\n size,\n}: FilterMenuProps) => {\n const filterOptions = isLoading\n ? [{ name: 'loading...', value: 'loading...', isDisabled: true }]\n : options;\n\n return (\n <>\n {onClearFilter && (\n <Button tabIndex={0} className=\"Menu-clear\" onClick={onClearFilter} kind={ButtonKind.LINK}>\n CLEAR FILTER\n </Button>\n )}\n <Menu enableVirtualization={enableVirtualization} size={size} onSelect={onSelect}>\n {enableSearch && (\n <MenuSearch\n value={searchValue}\n placeholder={searchPlaceholder}\n onChange={onSearchChange}\n ariaLabel={searchAriaLabel}\n />\n )}\n {filterOptions.map((option, index) => {\n if (option.isDivider) {\n return <MenuDivider key={`divider-${index}`} />;\n }\n return (\n <MenuItem\n item={option}\n disabled={option.isDisabled}\n icon={option.isChecked ? Check : null}\n key={option.value}\n role=\"menuitemradio\"\n aria-checked={option.isChecked ? 'true' : undefined}\n nested={option.nested}\n groupHeader={option.groupHeader}\n tooltip={\n option.isDisabled && disabledOptionTooltip ? disabledOptionTooltip : undefined\n }\n tooltipPlacement=\"right\"\n >\n {option.name}\n </MenuItem>\n );\n })}\n </Menu>\n </>\n );\n};\n\nexport { FilterMenu };\nexport type { FilterOption, FilterMenuProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { AppliedFilterButton } from './AppliedFilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype AppliedFilterProps = {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onClearFilter?(): void;\n searchPlaceholder?: string;\n name?: ReactNode;\n description: ReactNode;\n options: FilterOption[];\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n searchAriaLabel?: string;\n};\n\nconst AppliedFilter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n name,\n description,\n options,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n onClearFilter,\n searchAriaLabel,\n ...props\n}: AppliedFilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx('Filter-target', className);\n return (\n <Dropdown\n targetClassName={dropdownClasses}\n placement=\"bottom-start\"\n enableArrow={false}\n {...props}\n >\n <AppliedFilterButton name={name} onClickFilterButton={onClickFilterButton}>\n {description}\n </AppliedFilterButton>\n\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n enableSearch={enableSearch}\n searchAriaLabel={searchAriaLabel}\n onSearchChange={onSearchChange}\n onClearFilter={onClearFilter}\n isLoading={isLoading}\n />\n </Dropdown>\n );\n};\n\nexport type { AppliedFilterProps };\nexport { AppliedFilter };\n","import type { ReactNode, SyntheticEvent } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { Close, ExpandMore, IconSize } from '@launchpad-ui/icons';\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { VisuallyHidden } from '@react-aria/visually-hidden';\nimport { cx } from 'classix';\nimport { Children, forwardRef, useId } from 'react';\n\nimport './styles/Filter.css';\n\ntype FilterButtonProps = {\n name: ReactNode;\n hideName?: boolean;\n isClearable?: boolean;\n onClear?(event: SyntheticEvent): void;\n className?: string;\n isSelected?: boolean;\n clearTooltip?: string | JSX.Element;\n children?: ReactNode;\n onClickFilterButton?(): void;\n testId?: string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst FilterButton = forwardRef<Ref, FilterButtonProps>((props, ref) => {\n const {\n children,\n name,\n hideName,\n isClearable,\n clearTooltip,\n onClear,\n isSelected,\n onClickFilterButton,\n className,\n testId,\n ...rest\n } = props;\n const nameId = useId();\n const descriptionId = useId();\n\n const hasDescription = Children.count(children) !== 0;\n\n const nameElement = (\n <span className=\"Filter-name\">\n {name}\n {hasDescription && ':'}\n </span>\n );\n\n return (\n <div className=\"Filter-buttonContainer\" data-test-id={testId}>\n <button\n {...rest}\n aria-labelledby={`${nameId} ${hasDescription ? descriptionId : ''}`}\n aria-haspopup\n className={cx('Filter-button', className, (isClearable || isSelected) && 'is-clearable')}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {hideName ? (\n <VisuallyHidden id={nameId}>{nameElement}</VisuallyHidden>\n ) : (\n <span id={nameId}>{nameElement}</span>\n )}\n {hasDescription && (\n <span id={descriptionId} className=\"Filter-description\">\n {children}\n </span>\n )}\n {!isClearable && <ExpandMore size={IconSize.SMALL} />}\n </button>\n {isClearable && (\n <Tooltip targetClassName=\"Filter-clearTooltip\" content={clearTooltip}>\n <IconButton\n aria-label=\"Clear filter\"\n className=\"Filter-clear\"\n icon={<Close size={IconSize.TINY} />}\n onClick={onClear}\n />\n </Tooltip>\n )}\n </div>\n );\n});\n\nFilterButton.defaultProps = {\n clearTooltip: 'Clear filter',\n};\n\nFilterButton.displayName = 'FilterButton';\n\nexport { FilterButton };\nexport type { FilterButtonProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode, SyntheticEvent } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { FilterButton } from './FilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype FilterProps = Pick<MenuProps<string>, 'size' | 'enableVirtualization'> & {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n name: ReactNode;\n hideName?: boolean;\n description: ReactNode;\n options: FilterOption[];\n isClearable?: boolean;\n onClear?(): void;\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n disabledOptionTooltip?: string;\n testId?: string;\n};\n\nconst Filter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n searchAriaLabel,\n name,\n hideName,\n description,\n options,\n isClearable,\n onClear,\n isSelected,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n disabledOptionTooltip,\n testId,\n size,\n enableVirtualization,\n ...props\n}: FilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx('Filter', 'Filter-target', className);\n\n const handleClear = (event: SyntheticEvent) => {\n event.preventDefault();\n onClear?.();\n };\n\n return (\n <Dropdown targetClassName={dropdownClasses} {...props}>\n <FilterButton\n isClearable={isClearable}\n onClear={handleClear}\n name={name}\n hideName={hideName}\n isSelected={isSelected}\n onClickFilterButton={onClickFilterButton}\n testId={testId}\n >\n {description}\n </FilterButton>\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n searchAriaLabel={searchAriaLabel}\n enableSearch={enableSearch}\n onSearchChange={onSearchChange}\n isLoading={isLoading}\n disabledOptionTooltip={disabledOptionTooltip}\n size={size}\n enableVirtualization={enableVirtualization}\n />\n </Dropdown>\n );\n};\n\nexport { Filter };\nexport type { FilterProps };\n"],"names":["AppliedFilterButton","forwardRef","props","ref","name","className","isSelected","children","onClickFilterButton","hasDescription","Children","count","cx","_jsxs","_jsx","IconSize","SMALL","displayName","FilterMenu","options","onClearFilter","enableSearch","searchValue","searchPlaceholder","searchAriaLabel","onSelect","onSearchChange","isLoading","disabledOptionTooltip","enableVirtualization","size","filterOptions","value","isDisabled","_Fragment","ButtonKind","LINK","map","option","index","isDivider","isChecked","Check","undefined","nested","groupHeader","SEARCH_INPUT_THRESHOLD","AppliedFilter","description","isEmpty","length","dropdownClasses","FilterButton","hideName","isClearable","clearTooltip","onClear","testId","rest","nameId","useId","descriptionId","nameElement","TINY","defaultProps","Filter","handleClear","event","preventDefault"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/AppliedFilterButton.tsx","../src/FilterMenu.tsx","../src/AppliedFilter.tsx","../src/FilterButton.tsx","../src/Filter.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { ExpandMore, IconSize } from '@launchpad-ui/icons';\nimport { cx } from 'classix';\nimport { Children, forwardRef } from 'react';\n\nimport './styles/Filter.css';\n\ntype AppliedFilterButtonProps = {\n name?: ReactNode;\n className?: string;\n isSelected?: boolean;\n children: ReactNode;\n onClickFilterButton?(): void;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst AppliedFilterButton = forwardRef<Ref, AppliedFilterButtonProps>((props, ref) => {\n const { name, className, isSelected, children, onClickFilterButton } = props;\n\n const hasDescription = Children.count(children) !== 0;\n\n return (\n <div className=\"AppliedFilter-buttonContainer\">\n <button\n aria-haspopup\n className={cx('AppliedFilter-button', isSelected && 'isSelected', className)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {name && (\n <span className=\"AppliedFilter-name\">\n {name}\n {hasDescription && ':'}\n </span>\n )}\n {hasDescription && <span className=\"AppliedFilter-description\">{children}</span>}\n <ExpandMore size={IconSize.SMALL} />\n </button>\n </div>\n );\n});\n\nAppliedFilterButton.displayName = 'AppliedFilterButton';\n\nexport type { AppliedFilterButtonProps };\nexport { AppliedFilterButton };\n","import type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Button, ButtonKind } from '@launchpad-ui/button';\nimport { Check } from '@launchpad-ui/icons';\nimport { Menu, MenuDivider, MenuItem, MenuSearch } from '@launchpad-ui/menu';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FilterOption<T = any> = {\n name?: ReactNode;\n isDisabled?: boolean;\n isDivider?: boolean;\n isChecked?: boolean;\n value: T | null;\n projKey?: string;\n nested?: boolean;\n groupHeader?: boolean;\n};\n\ntype FilterMenuProps = Pick<MenuProps<string>, 'enableVirtualization' | 'size'> & {\n options: FilterOption[];\n onClearFilter?(): void;\n enableSearch?: boolean;\n searchValue?: string;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onSelect?(): void;\n isLoading?: boolean;\n disabledOptionTooltip?: string;\n};\n\nconst FilterMenu = ({\n options,\n onClearFilter,\n enableSearch,\n searchValue,\n searchPlaceholder,\n searchAriaLabel,\n onSelect,\n onSearchChange,\n isLoading = false,\n disabledOptionTooltip,\n enableVirtualization,\n size,\n}: FilterMenuProps) => {\n const filterOptions = isLoading\n ? [{ name: 'loading...', value: 'loading...', isDisabled: true }]\n : options;\n\n return (\n <>\n {onClearFilter && (\n <Button tabIndex={0} className=\"Menu-clear\" onClick={onClearFilter} kind={ButtonKind.LINK}>\n CLEAR FILTER\n </Button>\n )}\n <Menu enableVirtualization={enableVirtualization} size={size} onSelect={onSelect}>\n {enableSearch && (\n <MenuSearch\n value={searchValue}\n placeholder={searchPlaceholder}\n onChange={onSearchChange}\n ariaLabel={searchAriaLabel}\n />\n )}\n {filterOptions.map((option, index) => {\n if (option.isDivider) {\n return <MenuDivider key={`divider-${index}`} />;\n }\n return (\n <MenuItem\n item={option}\n disabled={option.isDisabled}\n icon={option.isChecked ? Check : null}\n key={option.value}\n role=\"menuitemradio\"\n aria-checked={option.isChecked ? 'true' : undefined}\n nested={option.nested}\n groupHeader={option.groupHeader}\n tooltip={\n option.isDisabled && disabledOptionTooltip ? disabledOptionTooltip : undefined\n }\n tooltipPlacement=\"right\"\n >\n {option.name}\n </MenuItem>\n );\n })}\n </Menu>\n </>\n );\n};\n\nexport { FilterMenu };\nexport type { FilterOption, FilterMenuProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { AppliedFilterButton } from './AppliedFilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype AppliedFilterProps = {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onClearFilter?(): void;\n searchPlaceholder?: string;\n name?: ReactNode;\n description: ReactNode;\n options: FilterOption[];\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n searchAriaLabel?: string;\n};\n\nconst AppliedFilter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n name,\n description,\n options,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n onClearFilter,\n searchAriaLabel,\n ...props\n}: AppliedFilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx('Filter-target', className);\n return (\n <Dropdown\n targetClassName={dropdownClasses}\n placement=\"bottom-start\"\n enableArrow={false}\n {...props}\n >\n <AppliedFilterButton name={name} onClickFilterButton={onClickFilterButton}>\n {description}\n </AppliedFilterButton>\n\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n enableSearch={enableSearch}\n searchAriaLabel={searchAriaLabel}\n onSearchChange={onSearchChange}\n onClearFilter={onClearFilter}\n isLoading={isLoading}\n />\n </Dropdown>\n );\n};\n\nexport type { AppliedFilterProps };\nexport { AppliedFilter };\n","import type { ReactNode, SyntheticEvent } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { Close, ExpandMore, IconSize } from '@launchpad-ui/icons';\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { VisuallyHidden } from '@react-aria/visually-hidden';\nimport { cx } from 'classix';\nimport { Children, forwardRef, useId } from 'react';\n\nimport './styles/Filter.css';\n\ntype FilterButtonProps = {\n name: ReactNode;\n hideName?: boolean;\n isClearable?: boolean;\n onClear?(event: SyntheticEvent): void;\n className?: string;\n isSelected?: boolean;\n clearTooltip?: string | JSX.Element;\n children?: ReactNode;\n onClickFilterButton?(): void;\n testId?: string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst FilterButton = forwardRef<Ref, FilterButtonProps>((props, ref) => {\n const {\n children,\n name,\n hideName,\n isClearable,\n clearTooltip,\n onClear,\n isSelected,\n onClickFilterButton,\n className,\n testId,\n ...rest\n } = props;\n const nameId = useId();\n const descriptionId = useId();\n\n const hasDescription = Children.count(children) !== 0;\n\n const nameElement = (\n <span className=\"Filter-name\">\n {name}\n {hasDescription && ':'}\n </span>\n );\n\n return (\n <div className=\"Filter-buttonContainer\" data-test-id={testId}>\n <button\n {...rest}\n aria-labelledby={`${nameId} ${hasDescription ? descriptionId : ''}`}\n aria-haspopup\n className={cx('Filter-button', className, (isClearable || isSelected) && 'is-clearable')}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {hideName ? (\n <VisuallyHidden id={nameId}>{nameElement}</VisuallyHidden>\n ) : (\n <span id={nameId}>{nameElement}</span>\n )}\n {hasDescription && (\n <span id={descriptionId} className=\"Filter-description\">\n {children}\n </span>\n )}\n {!isClearable && <ExpandMore size={IconSize.SMALL} />}\n </button>\n {isClearable && (\n <Tooltip targetClassName=\"Filter-clearTooltip\" content={clearTooltip}>\n <IconButton\n aria-label=\"Clear filter\"\n className=\"Filter-clear\"\n icon={<Close size={IconSize.TINY} />}\n onClick={onClear}\n />\n </Tooltip>\n )}\n </div>\n );\n});\n\nFilterButton.defaultProps = {\n clearTooltip: 'Clear filter',\n};\n\nFilterButton.displayName = 'FilterButton';\n\nexport { FilterButton };\nexport type { FilterButtonProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode, SyntheticEvent } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { FilterButton } from './FilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype FilterProps = Pick<MenuProps<string>, 'size' | 'enableVirtualization'> & {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n name: ReactNode;\n hideName?: boolean;\n description: ReactNode;\n options: FilterOption[];\n isClearable?: boolean;\n onClear?(): void;\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n disabledOptionTooltip?: string;\n testId?: string;\n};\n\nconst Filter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n searchAriaLabel,\n name,\n hideName,\n description,\n options,\n isClearable,\n onClear,\n isSelected,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n disabledOptionTooltip,\n testId,\n size,\n enableVirtualization,\n ...props\n}: FilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx('Filter', 'Filter-target', className);\n\n const handleClear = (event: SyntheticEvent) => {\n event.preventDefault();\n onClear?.();\n };\n\n return (\n <Dropdown targetClassName={dropdownClasses} {...props}>\n <FilterButton\n isClearable={isClearable}\n onClear={handleClear}\n name={name}\n hideName={hideName}\n isSelected={isSelected}\n onClickFilterButton={onClickFilterButton}\n testId={testId}\n >\n {description}\n </FilterButton>\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n searchAriaLabel={searchAriaLabel}\n enableSearch={enableSearch}\n onSearchChange={onSearchChange}\n isLoading={isLoading}\n disabledOptionTooltip={disabledOptionTooltip}\n size={size}\n enableVirtualization={enableVirtualization}\n />\n </Dropdown>\n );\n};\n\nexport { Filter };\nexport type { FilterProps };\n"],"names":["AppliedFilterButton","forwardRef","props","ref","name","className","isSelected","children","onClickFilterButton","hasDescription","Children","count","cx","_jsxs","_jsx","IconSize","SMALL","displayName","FilterMenu","options","onClearFilter","enableSearch","searchValue","searchPlaceholder","searchAriaLabel","onSelect","onSearchChange","isLoading","disabledOptionTooltip","enableVirtualization","size","filterOptions","value","isDisabled","_Fragment","ButtonKind","LINK","map","option","index","isDivider","isChecked","Check","undefined","nested","groupHeader","SEARCH_INPUT_THRESHOLD","AppliedFilter","description","isEmpty","length","dropdownClasses","FilterButton","hideName","isClearable","clearTooltip","onClear","testId","rest","nameId","useId","descriptionId","nameElement","TINY","defaultProps","Filter","handleClear","event","preventDefault"],"mappings":"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"}
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/AppliedFilterButton.tsx","../src/FilterMenu.tsx","../src/AppliedFilter.tsx","../src/FilterButton.tsx","../src/Filter.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { ExpandMore, IconSize } from '@launchpad-ui/icons';\nimport { cx } from 'classix';\nimport { Children, forwardRef } from 'react';\n\nimport './styles/Filter.css';\n\ntype AppliedFilterButtonProps = {\n name?: ReactNode;\n className?: string;\n isSelected?: boolean;\n children: ReactNode;\n onClickFilterButton?(): void;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst AppliedFilterButton = forwardRef<Ref, AppliedFilterButtonProps>((props, ref) => {\n const { name, className, isSelected, children, onClickFilterButton } = props;\n\n const hasDescription = Children.count(children) !== 0;\n\n return (\n <div className=\"AppliedFilter-buttonContainer\">\n <button\n aria-haspopup\n className={cx('AppliedFilter-button', isSelected && 'isSelected', className)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {name && (\n <span className=\"AppliedFilter-name\">\n {name}\n {hasDescription && ':'}\n </span>\n )}\n {hasDescription && <span className=\"AppliedFilter-description\">{children}</span>}\n <ExpandMore size={IconSize.SMALL} />\n </button>\n </div>\n );\n});\n\nAppliedFilterButton.displayName = 'AppliedFilterButton';\n\nexport type { AppliedFilterButtonProps };\nexport { AppliedFilterButton };\n","import type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Button, ButtonKind } from '@launchpad-ui/button';\nimport { Check } from '@launchpad-ui/icons';\nimport { Menu, MenuDivider, MenuItem, MenuSearch } from '@launchpad-ui/menu';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FilterOption<T = any> = {\n name?: ReactNode;\n isDisabled?: boolean;\n isDivider?: boolean;\n isChecked?: boolean;\n value: T | null;\n projKey?: string;\n nested?: boolean;\n groupHeader?: boolean;\n};\n\ntype FilterMenuProps = Pick<MenuProps<string>, 'enableVirtualization' | 'size'> & {\n options: FilterOption[];\n onClearFilter?(): void;\n enableSearch?: boolean;\n searchValue?: string;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onSelect?(): void;\n isLoading?: boolean;\n disabledOptionTooltip?: string;\n};\n\nconst FilterMenu = ({\n options,\n onClearFilter,\n enableSearch,\n searchValue,\n searchPlaceholder,\n searchAriaLabel,\n onSelect,\n onSearchChange,\n isLoading = false,\n disabledOptionTooltip,\n enableVirtualization,\n size,\n}: FilterMenuProps) => {\n const filterOptions = isLoading\n ? [{ name: 'loading...', value: 'loading...', isDisabled: true }]\n : options;\n\n return (\n <>\n {onClearFilter && (\n <Button tabIndex={0} className=\"Menu-clear\" onClick={onClearFilter} kind={ButtonKind.LINK}>\n CLEAR FILTER\n </Button>\n )}\n <Menu enableVirtualization={enableVirtualization} size={size} onSelect={onSelect}>\n {enableSearch && (\n <MenuSearch\n value={searchValue}\n placeholder={searchPlaceholder}\n onChange={onSearchChange}\n ariaLabel={searchAriaLabel}\n />\n )}\n {filterOptions.map((option, index) => {\n if (option.isDivider) {\n return <MenuDivider key={`divider-${index}`} />;\n }\n return (\n <MenuItem\n item={option}\n disabled={option.isDisabled}\n icon={option.isChecked ? Check : null}\n key={option.value}\n role=\"menuitemradio\"\n aria-checked={option.isChecked ? 'true' : undefined}\n nested={option.nested}\n groupHeader={option.groupHeader}\n tooltip={\n option.isDisabled && disabledOptionTooltip ? disabledOptionTooltip : undefined\n }\n tooltipPlacement=\"right\"\n >\n {option.name}\n </MenuItem>\n );\n })}\n </Menu>\n </>\n );\n};\n\nexport { FilterMenu };\nexport type { FilterOption, FilterMenuProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { AppliedFilterButton } from './AppliedFilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype AppliedFilterProps = {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onClearFilter?(): void;\n searchPlaceholder?: string;\n name?: ReactNode;\n description: ReactNode;\n options: FilterOption[];\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n searchAriaLabel?: string;\n};\n\nconst AppliedFilter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n name,\n description,\n options,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n onClearFilter,\n searchAriaLabel,\n ...props\n}: AppliedFilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx('Filter-target', className);\n return (\n <Dropdown\n targetClassName={dropdownClasses}\n placement=\"bottom-start\"\n enableArrow={false}\n {...props}\n >\n <AppliedFilterButton name={name} onClickFilterButton={onClickFilterButton}>\n {description}\n </AppliedFilterButton>\n\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n enableSearch={enableSearch}\n searchAriaLabel={searchAriaLabel}\n onSearchChange={onSearchChange}\n onClearFilter={onClearFilter}\n isLoading={isLoading}\n />\n </Dropdown>\n );\n};\n\nexport type { AppliedFilterProps };\nexport { AppliedFilter };\n","import type { ReactNode, SyntheticEvent } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { Close, ExpandMore, IconSize } from '@launchpad-ui/icons';\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { VisuallyHidden } from '@react-aria/visually-hidden';\nimport { cx } from 'classix';\nimport { Children, forwardRef, useId } from 'react';\n\nimport './styles/Filter.css';\n\ntype FilterButtonProps = {\n name: ReactNode;\n hideName?: boolean;\n isClearable?: boolean;\n onClear?(event: SyntheticEvent): void;\n className?: string;\n isSelected?: boolean;\n clearTooltip?: string | JSX.Element;\n children?: ReactNode;\n onClickFilterButton?(): void;\n testId?: string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst FilterButton = forwardRef<Ref, FilterButtonProps>((props, ref) => {\n const {\n children,\n name,\n hideName,\n isClearable,\n clearTooltip,\n onClear,\n isSelected,\n onClickFilterButton,\n className,\n testId,\n ...rest\n } = props;\n const nameId = useId();\n const descriptionId = useId();\n\n const hasDescription = Children.count(children) !== 0;\n\n const nameElement = (\n <span className=\"Filter-name\">\n {name}\n {hasDescription && ':'}\n </span>\n );\n\n return (\n <div className=\"Filter-buttonContainer\" data-test-id={testId}>\n <button\n {...rest}\n aria-labelledby={`${nameId} ${hasDescription ? descriptionId : ''}`}\n aria-haspopup\n className={cx('Filter-button', className, (isClearable || isSelected) && 'is-clearable')}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {hideName ? (\n <VisuallyHidden id={nameId}>{nameElement}</VisuallyHidden>\n ) : (\n <span id={nameId}>{nameElement}</span>\n )}\n {hasDescription && (\n <span id={descriptionId} className=\"Filter-description\">\n {children}\n </span>\n )}\n {!isClearable && <ExpandMore size={IconSize.SMALL} />}\n </button>\n {isClearable && (\n <Tooltip targetClassName=\"Filter-clearTooltip\" content={clearTooltip}>\n <IconButton\n aria-label=\"Clear filter\"\n className=\"Filter-clear\"\n icon={<Close size={IconSize.TINY} />}\n onClick={onClear}\n />\n </Tooltip>\n )}\n </div>\n );\n});\n\nFilterButton.defaultProps = {\n clearTooltip: 'Clear filter',\n};\n\nFilterButton.displayName = 'FilterButton';\n\nexport { FilterButton };\nexport type { FilterButtonProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode, SyntheticEvent } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { FilterButton } from './FilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype FilterProps = Pick<MenuProps<string>, 'size' | 'enableVirtualization'> & {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n name: ReactNode;\n hideName?: boolean;\n description: ReactNode;\n options: FilterOption[];\n isClearable?: boolean;\n onClear?(): void;\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n disabledOptionTooltip?: string;\n testId?: string;\n};\n\nconst Filter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n searchAriaLabel,\n name,\n hideName,\n description,\n options,\n isClearable,\n onClear,\n isSelected,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n disabledOptionTooltip,\n testId,\n size,\n enableVirtualization,\n ...props\n}: FilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx('Filter', 'Filter-target', className);\n\n const handleClear = (event: SyntheticEvent) => {\n event.preventDefault();\n onClear?.();\n };\n\n return (\n <Dropdown targetClassName={dropdownClasses} {...props}>\n <FilterButton\n isClearable={isClearable}\n onClear={handleClear}\n name={name}\n hideName={hideName}\n isSelected={isSelected}\n onClickFilterButton={onClickFilterButton}\n testId={testId}\n >\n {description}\n </FilterButton>\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n searchAriaLabel={searchAriaLabel}\n enableSearch={enableSearch}\n onSearchChange={onSearchChange}\n isLoading={isLoading}\n disabledOptionTooltip={disabledOptionTooltip}\n size={size}\n enableVirtualization={enableVirtualization}\n />\n </Dropdown>\n );\n};\n\nexport { Filter };\nexport type { FilterProps };\n"],"names":["AppliedFilterButton","forwardRef","props","ref","name","className","isSelected","children","onClickFilterButton","hasDescription","Children","count","cx","_jsxs","_jsx","ExpandMore","IconSize","SMALL","displayName","FilterMenu","options","onClearFilter","enableSearch","searchValue","searchPlaceholder","searchAriaLabel","onSelect","onSearchChange","isLoading","disabledOptionTooltip","enableVirtualization","size","filterOptions","value","isDisabled","_Fragment","Button","ButtonKind","LINK","Menu","MenuSearch","map","option","index","isDivider","MenuDivider","MenuItem","isChecked","Check","undefined","nested","groupHeader","SEARCH_INPUT_THRESHOLD","AppliedFilter","description","isEmpty","length","dropdownClasses","Dropdown","FilterButton","hideName","isClearable","clearTooltip","onClear","testId","rest","nameId","useId","descriptionId","nameElement","VisuallyHidden","Tooltip","IconButton","Close","TINY","defaultProps","Filter","handleClear","event","preventDefault"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/AppliedFilterButton.tsx","../src/FilterMenu.tsx","../src/AppliedFilter.tsx","../src/FilterButton.tsx","../src/Filter.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { ExpandMore, IconSize } from '@launchpad-ui/icons';\nimport { cx } from 'classix';\nimport { Children, forwardRef } from 'react';\n\nimport './styles/Filter.css';\n\ntype AppliedFilterButtonProps = {\n name?: ReactNode;\n className?: string;\n isSelected?: boolean;\n children: ReactNode;\n onClickFilterButton?(): void;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst AppliedFilterButton = forwardRef<Ref, AppliedFilterButtonProps>((props, ref) => {\n const { name, className, isSelected, children, onClickFilterButton } = props;\n\n const hasDescription = Children.count(children) !== 0;\n\n return (\n <div className=\"AppliedFilter-buttonContainer\">\n <button\n aria-haspopup\n className={cx('AppliedFilter-button', isSelected && 'isSelected', className)}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {name && (\n <span className=\"AppliedFilter-name\">\n {name}\n {hasDescription && ':'}\n </span>\n )}\n {hasDescription && <span className=\"AppliedFilter-description\">{children}</span>}\n <ExpandMore size={IconSize.SMALL} />\n </button>\n </div>\n );\n});\n\nAppliedFilterButton.displayName = 'AppliedFilterButton';\n\nexport type { AppliedFilterButtonProps };\nexport { AppliedFilterButton };\n","import type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Button, ButtonKind } from '@launchpad-ui/button';\nimport { Check } from '@launchpad-ui/icons';\nimport { Menu, MenuDivider, MenuItem, MenuSearch } from '@launchpad-ui/menu';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype FilterOption<T = any> = {\n name?: ReactNode;\n isDisabled?: boolean;\n isDivider?: boolean;\n isChecked?: boolean;\n value: T | null;\n projKey?: string;\n nested?: boolean;\n groupHeader?: boolean;\n};\n\ntype FilterMenuProps = Pick<MenuProps<string>, 'enableVirtualization' | 'size'> & {\n options: FilterOption[];\n onClearFilter?(): void;\n enableSearch?: boolean;\n searchValue?: string;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onSelect?(): void;\n isLoading?: boolean;\n disabledOptionTooltip?: string;\n};\n\nconst FilterMenu = ({\n options,\n onClearFilter,\n enableSearch,\n searchValue,\n searchPlaceholder,\n searchAriaLabel,\n onSelect,\n onSearchChange,\n isLoading = false,\n disabledOptionTooltip,\n enableVirtualization,\n size,\n}: FilterMenuProps) => {\n const filterOptions = isLoading\n ? [{ name: 'loading...', value: 'loading...', isDisabled: true }]\n : options;\n\n return (\n <>\n {onClearFilter && (\n <Button tabIndex={0} className=\"Menu-clear\" onClick={onClearFilter} kind={ButtonKind.LINK}>\n CLEAR FILTER\n </Button>\n )}\n <Menu enableVirtualization={enableVirtualization} size={size} onSelect={onSelect}>\n {enableSearch && (\n <MenuSearch\n value={searchValue}\n placeholder={searchPlaceholder}\n onChange={onSearchChange}\n ariaLabel={searchAriaLabel}\n />\n )}\n {filterOptions.map((option, index) => {\n if (option.isDivider) {\n return <MenuDivider key={`divider-${index}`} />;\n }\n return (\n <MenuItem\n item={option}\n disabled={option.isDisabled}\n icon={option.isChecked ? Check : null}\n key={option.value}\n role=\"menuitemradio\"\n aria-checked={option.isChecked ? 'true' : undefined}\n nested={option.nested}\n groupHeader={option.groupHeader}\n tooltip={\n option.isDisabled && disabledOptionTooltip ? disabledOptionTooltip : undefined\n }\n tooltipPlacement=\"right\"\n >\n {option.name}\n </MenuItem>\n );\n })}\n </Menu>\n </>\n );\n};\n\nexport { FilterMenu };\nexport type { FilterOption, FilterMenuProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { AppliedFilterButton } from './AppliedFilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype AppliedFilterProps = {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n onClearFilter?(): void;\n searchPlaceholder?: string;\n name?: ReactNode;\n description: ReactNode;\n options: FilterOption[];\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n searchAriaLabel?: string;\n};\n\nconst AppliedFilter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n name,\n description,\n options,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n onClearFilter,\n searchAriaLabel,\n ...props\n}: AppliedFilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx('Filter-target', className);\n return (\n <Dropdown\n targetClassName={dropdownClasses}\n placement=\"bottom-start\"\n enableArrow={false}\n {...props}\n >\n <AppliedFilterButton name={name} onClickFilterButton={onClickFilterButton}>\n {description}\n </AppliedFilterButton>\n\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n enableSearch={enableSearch}\n searchAriaLabel={searchAriaLabel}\n onSearchChange={onSearchChange}\n onClearFilter={onClearFilter}\n isLoading={isLoading}\n />\n </Dropdown>\n );\n};\n\nexport type { AppliedFilterProps };\nexport { AppliedFilter };\n","import type { ReactNode, SyntheticEvent } from 'react';\n\nimport { IconButton } from '@launchpad-ui/button';\nimport { Close, ExpandMore, IconSize } from '@launchpad-ui/icons';\nimport { Tooltip } from '@launchpad-ui/tooltip';\nimport { VisuallyHidden } from '@react-aria/visually-hidden';\nimport { cx } from 'classix';\nimport { Children, forwardRef, useId } from 'react';\n\nimport './styles/Filter.css';\n\ntype FilterButtonProps = {\n name: ReactNode;\n hideName?: boolean;\n isClearable?: boolean;\n onClear?(event: SyntheticEvent): void;\n className?: string;\n isSelected?: boolean;\n clearTooltip?: string | JSX.Element;\n children?: ReactNode;\n onClickFilterButton?(): void;\n testId?: string;\n};\n\ntype Ref = HTMLButtonElement;\n\nconst FilterButton = forwardRef<Ref, FilterButtonProps>((props, ref) => {\n const {\n children,\n name,\n hideName,\n isClearable,\n clearTooltip,\n onClear,\n isSelected,\n onClickFilterButton,\n className,\n testId,\n ...rest\n } = props;\n const nameId = useId();\n const descriptionId = useId();\n\n const hasDescription = Children.count(children) !== 0;\n\n const nameElement = (\n <span className=\"Filter-name\">\n {name}\n {hasDescription && ':'}\n </span>\n );\n\n return (\n <div className=\"Filter-buttonContainer\" data-test-id={testId}>\n <button\n {...rest}\n aria-labelledby={`${nameId} ${hasDescription ? descriptionId : ''}`}\n aria-haspopup\n className={cx('Filter-button', className, (isClearable || isSelected) && 'is-clearable')}\n ref={ref}\n onClick={onClickFilterButton}\n >\n {hideName ? (\n <VisuallyHidden id={nameId}>{nameElement}</VisuallyHidden>\n ) : (\n <span id={nameId}>{nameElement}</span>\n )}\n {hasDescription && (\n <span id={descriptionId} className=\"Filter-description\">\n {children}\n </span>\n )}\n {!isClearable && <ExpandMore size={IconSize.SMALL} />}\n </button>\n {isClearable && (\n <Tooltip targetClassName=\"Filter-clearTooltip\" content={clearTooltip}>\n <IconButton\n aria-label=\"Clear filter\"\n className=\"Filter-clear\"\n icon={<Close size={IconSize.TINY} />}\n onClick={onClear}\n />\n </Tooltip>\n )}\n </div>\n );\n});\n\nFilterButton.defaultProps = {\n clearTooltip: 'Clear filter',\n};\n\nFilterButton.displayName = 'FilterButton';\n\nexport { FilterButton };\nexport type { FilterButtonProps };\n","import type { FilterOption } from './FilterMenu';\nimport type { MenuProps } from '@launchpad-ui/menu';\nimport type { ChangeEvent, ReactNode, SyntheticEvent } from 'react';\n\nimport { Dropdown } from '@launchpad-ui/dropdown';\nimport { cx } from 'classix';\n\nimport { FilterButton } from './FilterButton';\nimport { FilterMenu } from './FilterMenu';\n\nconst SEARCH_INPUT_THRESHOLD = 4;\n\ntype FilterProps = Pick<MenuProps<string>, 'size' | 'enableVirtualization'> & {\n searchValue?: string;\n onSearchChange?(event: ChangeEvent<HTMLInputElement>): void;\n searchPlaceholder?: string;\n searchAriaLabel?: string;\n name: ReactNode;\n hideName?: boolean;\n description: ReactNode;\n options: FilterOption[];\n isClearable?: boolean;\n onClear?(): void;\n className?: string;\n onStateChange?({ isOpen }: { isOpen?: boolean }): void;\n isSelected?: boolean;\n onSelect?(item: FilterOption): void;\n isEmpty?: boolean;\n isLoading?: boolean;\n onClickFilterButton?(): void;\n disabledOptionTooltip?: string;\n testId?: string;\n};\n\nconst Filter = ({\n searchValue,\n onSearchChange,\n searchPlaceholder,\n searchAriaLabel,\n name,\n hideName,\n description,\n options,\n isClearable,\n onClear,\n isSelected,\n className,\n isEmpty,\n isLoading,\n onClickFilterButton,\n disabledOptionTooltip,\n testId,\n size,\n enableVirtualization,\n ...props\n}: FilterProps) => {\n const enableSearch =\n onSearchChange && (!!searchValue || options.length > SEARCH_INPUT_THRESHOLD || !isEmpty);\n\n const dropdownClasses = cx('Filter', 'Filter-target', className);\n\n const handleClear = (event: SyntheticEvent) => {\n event.preventDefault();\n onClear?.();\n };\n\n return (\n <Dropdown targetClassName={dropdownClasses} {...props}>\n <FilterButton\n isClearable={isClearable}\n onClear={handleClear}\n name={name}\n hideName={hideName}\n isSelected={isSelected}\n onClickFilterButton={onClickFilterButton}\n testId={testId}\n >\n {description}\n </FilterButton>\n <FilterMenu\n options={options}\n searchValue={searchValue}\n searchPlaceholder={searchPlaceholder}\n searchAriaLabel={searchAriaLabel}\n enableSearch={enableSearch}\n onSearchChange={onSearchChange}\n isLoading={isLoading}\n disabledOptionTooltip={disabledOptionTooltip}\n size={size}\n enableVirtualization={enableVirtualization}\n />\n </Dropdown>\n );\n};\n\nexport { Filter };\nexport type { FilterProps };\n"],"names":["AppliedFilterButton","forwardRef","props","ref","name","className","isSelected","children","onClickFilterButton","hasDescription","Children","count","cx","_jsxs","_jsx","ExpandMore","IconSize","SMALL","displayName","FilterMenu","options","onClearFilter","enableSearch","searchValue","searchPlaceholder","searchAriaLabel","onSelect","onSearchChange","isLoading","disabledOptionTooltip","enableVirtualization","size","filterOptions","value","isDisabled","_Fragment","Button","ButtonKind","LINK","Menu","MenuSearch","map","option","index","isDivider","MenuDivider","MenuItem","isChecked","Check","undefined","nested","groupHeader","SEARCH_INPUT_THRESHOLD","AppliedFilter","description","isEmpty","length","dropdownClasses","Dropdown","FilterButton","hideName","isClearable","clearTooltip","onClear","testId","rest","nameId","useId","descriptionId","nameElement","VisuallyHidden","Tooltip","IconButton","Close","TINY","defaultProps","Filter","handleClear","event","preventDefault"],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@launchpad-ui/filter",
|
3
|
-
"version": "0.3.
|
3
|
+
"version": "0.3.5",
|
4
4
|
"status": "beta",
|
5
5
|
"publishConfig": {
|
6
6
|
"access": "public"
|
@@ -26,12 +26,12 @@
|
|
26
26
|
},
|
27
27
|
"source": "src/index.ts",
|
28
28
|
"dependencies": {
|
29
|
-
"@launchpad-ui/button": "~0.6.
|
30
|
-
"@launchpad-ui/dropdown": "~0.4.
|
29
|
+
"@launchpad-ui/button": "~0.6.3",
|
30
|
+
"@launchpad-ui/dropdown": "~0.4.5",
|
31
31
|
"@launchpad-ui/icons": "~0.4.0",
|
32
|
-
"@launchpad-ui/menu": "~0.5.
|
32
|
+
"@launchpad-ui/menu": "~0.5.4",
|
33
33
|
"@launchpad-ui/tokens": "~0.1.5",
|
34
|
-
"@launchpad-ui/tooltip": "~0.5.
|
34
|
+
"@launchpad-ui/tooltip": "~0.5.4",
|
35
35
|
"@react-aria/visually-hidden": "^3.4.0",
|
36
36
|
"classix": "^2.1.13"
|
37
37
|
},
|