UNPKG

@grafana/ui

Version:
1 lines • 18.3 kB
{"version":3,"file":"Cascader.mjs","sources":["../../../../src/components/Cascader/Cascader.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport RCCascader from '@rc-component/cascader';\nimport { memo, useCallback, useMemo, useState } from 'react';\n\nimport { type SelectableValue } from '@grafana/data';\nimport { t } from '@grafana/i18n';\n\nimport { useStyles2 } from '../../themes/ThemeContext';\nimport { Icon } from '../Icon/Icon';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Input } from '../Input/Input';\nimport { Stack } from '../Layout/Stack/Stack';\nimport { Select } from '../Select/Select';\n\nimport { onChangeCascader } from './optionMappings';\nimport { getCascaderStyles } from './styles';\n\nexport interface CascaderProps {\n /** The separator between levels in the search */\n separator?: string;\n placeholder?: string;\n /** As the onSelect handler reports only the leaf node selected, the leaf nodes should have unique value. */\n options: CascaderOption[];\n /** Changes the value for every selection, including branch nodes. Defaults to true. */\n changeOnSelect?: boolean;\n onSelect(val: string): void;\n /** Sets the width to a multiple of 8px. Should only be used with inline forms. Setting width of the container is preferred in other cases.*/\n width?: number;\n /** Single string that needs to be the same as value of the last item in the selection chain. */\n initialValue?: string;\n allowCustomValue?: boolean;\n /** A function for formatting the message for custom value creation. Only applies when allowCustomValue is set to true*/\n formatCreateLabel?: (val: string) => string;\n /** If true all levels are shown in the input by simple concatenating the labels */\n displayAllSelectedLevels?: boolean;\n onBlur?: () => void;\n /** When mounted focus automatically on the input */\n autoFocus?: boolean;\n /** Keep the dropdown open all the time, useful in case whole cascader visibility is controlled by the parent */\n alwaysOpen?: boolean;\n /** Don't show what is selected in the cascader input/search. Useful when input is used just as search and the\n cascader is hidden after selection. */\n hideActiveLevelLabel?: boolean;\n disabled?: boolean;\n /** ID for the underlying Select/Cascader component */\n id?: string;\n /** Whether you can clear the selected value or not */\n isClearable?: boolean;\n 'data-testid'?: string;\n}\n\nexport interface CascaderOption {\n /**\n * The value used under the hood\n */\n value: string;\n /**\n * The label to display in the UI\n */\n label: string;\n /** Items will be just flattened into the main list of items recursively. */\n items?: CascaderOption[];\n disabled?: boolean;\n /** Avoid using */\n title?: string;\n /** Children will be shown in a submenu. Use 'items' instead, as 'children' exist to ensure backwards compatibility.*/\n children?: CascaderOption[];\n}\n\nconst disableDivFocus = css({\n '&:focus': {\n outline: 'none',\n },\n});\n\nconst DEFAULT_SEPARATOR = ' / ';\n\nconst flattenOptions = (\n options: CascaderOption[],\n optionPath: CascaderOption[] = [],\n separator: CascaderProps['separator']\n) => {\n let selectOptions: Array<SelectableValue<string[]>> = [];\n for (const option of options) {\n const cpy = [...optionPath];\n cpy.push(option);\n if (!option.items || option.items.length === 0) {\n selectOptions.push({\n singleLabel: cpy[cpy.length - 1].label,\n label: cpy.map((o) => o.label).join(separator || DEFAULT_SEPARATOR),\n value: cpy.map((o) => o.value),\n });\n } else {\n selectOptions = [...selectOptions, ...flattenOptions(option.items, cpy, separator)];\n }\n }\n return selectOptions;\n};\n\n/**\n * The cascader component is a Select with a cascading flyout menu. When you have lots of options in your select, they can be hard to navigate from a regular dropdown list. In that case you can use the cascader to organize your options into groups hierarchically. Just like in the Select component, the cascader input doubles as a search field to quickly jump to a selection without navigating the list.\n *\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/inputs-cascader--docs\n */\n\nexport const Cascader = memo(\n ({\n separator,\n placeholder,\n options,\n changeOnSelect = true,\n onSelect,\n width,\n initialValue,\n allowCustomValue,\n formatCreateLabel,\n displayAllSelectedLevels,\n onBlur,\n autoFocus,\n alwaysOpen,\n hideActiveLevelLabel,\n disabled,\n id,\n isClearable,\n 'data-testid': dataTestId,\n }: CascaderProps) => {\n const searchableOptions = useMemo(() => flattenOptions(options, [], separator), [options, separator]);\n const getInitialValue = useCallback(\n (searchableOptions: Array<SelectableValue<string[]>>, initValue?: string) => {\n if (!initValue) {\n return {\n initialRCValue: { value: [], label: '' },\n initialActiveLabel: '',\n };\n }\n for (const option of searchableOptions) {\n const optionPath = option.value || [];\n\n if (optionPath[optionPath.length - 1] === initValue) {\n const label = displayAllSelectedLevels ? option.label : option.singleLabel || '';\n return {\n initialRCValue: { value: optionPath, label },\n initialActiveLabel: label,\n };\n }\n }\n if (allowCustomValue) {\n return {\n initialRCValue: { value: [], label: initValue },\n initialActiveLabel: initValue,\n };\n }\n return {\n initialRCValue: { value: [], label: '' },\n initialActiveLabel: '',\n };\n },\n [allowCustomValue, displayAllSelectedLevels]\n );\n const { initialRCValue, initialActiveLabel } = useMemo(\n () => getInitialValue(searchableOptions, initialValue),\n [getInitialValue, initialValue, searchableOptions]\n );\n const [isSearching, setIsSearching] = useState(false);\n const [focusCascade, setFocusCascade] = useState(false);\n const [rcValue, setRcValue] = useState<SelectableValue<string[]>>(initialRCValue);\n const [activeLabel, setActiveLabel] = useState(initialActiveLabel);\n const [inputValue, setInputValue] = useState('');\n const styles = useStyles2(getCascaderStyles);\n\n // For rc-cascader\n const handleChange = (value: string[], selectedOptions: CascaderOption[]) => {\n const activeLabel = hideActiveLevelLabel\n ? ''\n : displayAllSelectedLevels\n ? selectedOptions.map((option) => option.label).join(separator || DEFAULT_SEPARATOR)\n : selectedOptions[selectedOptions.length - 1].label;\n setRcValue({ value, label: activeLabel });\n setFocusCascade(true);\n setActiveLabel(activeLabel);\n setIsSearching(false);\n setInputValue(activeLabel);\n onSelect(selectedOptions[selectedOptions.length - 1].value);\n };\n\n //For select\n const handleSelect = (obj: SelectableValue<string[]>) => {\n const valueArray = obj.value || [];\n const activeLabel = displayAllSelectedLevels ? obj.label : obj.singleLabel || '';\n setActiveLabel(activeLabel);\n setInputValue(activeLabel);\n setRcValue({ value: valueArray, label: activeLabel });\n setIsSearching(false);\n setFocusCascade(false);\n onSelect(valueArray[valueArray.length - 1]);\n };\n\n const handleCreateOption = (value: string) => {\n setActiveLabel(value);\n setInputValue(value);\n setRcValue({ value: [], label: value });\n setIsSearching(false);\n onSelect(value);\n };\n\n const handleBlur = () => {\n setIsSearching(false);\n setFocusCascade(false);\n if (activeLabel === '') {\n setRcValue({ value: [], label: '' });\n }\n onBlur?.();\n };\n\n const handleBlurCascade = () => {\n setFocusCascade(false);\n onBlur?.();\n };\n\n const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (['ArrowDown', 'ArrowUp', 'Enter', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {\n return;\n }\n\n const selectionStart = e.currentTarget.selectionStart;\n const selectionEnd = e.currentTarget.selectionEnd;\n let inputValue = e.currentTarget.value;\n\n if (selectionStart !== selectionEnd) {\n inputValue = inputValue.substring(0, selectionStart ?? 0) + inputValue.substring(selectionEnd ?? 0);\n }\n\n setFocusCascade(false);\n setIsSearching(true);\n setInputValue(inputValue);\n };\n\n const handleSelectInputChange = (value: string) => {\n setInputValue(value);\n };\n\n return (\n <div data-testid={dataTestId}>\n {isSearching ? (\n <Select\n allowCustomValue={allowCustomValue}\n placeholder={placeholder}\n autoFocus={!focusCascade}\n onChange={handleSelect}\n onBlur={handleBlur}\n options={searchableOptions}\n onCreateOption={handleCreateOption}\n formatCreateLabel={formatCreateLabel}\n width={width}\n onInputChange={handleSelectInputChange}\n disabled={disabled}\n inputValue={inputValue}\n inputId={id}\n />\n ) : (\n <RCCascader\n onChange={onChangeCascader(handleChange)}\n options={options}\n changeOnSelect={changeOnSelect}\n value={rcValue.value}\n fieldNames={{ label: 'label', value: 'value', children: 'items' }}\n expandIcon={null}\n open={alwaysOpen}\n disabled={disabled}\n popupClassName={styles.dropdown}\n >\n <div className={disableDivFocus}>\n <Input\n autoFocus={autoFocus}\n width={width}\n placeholder={placeholder}\n onBlur={handleBlurCascade}\n value={activeLabel}\n onFocus={(e) => {\n e.currentTarget.select();\n }}\n onKeyDown={handleInputKeyDown}\n onChange={() => {}}\n suffix={\n <Stack gap={0.5}>\n {isClearable && activeLabel !== '' && (\n <IconButton\n name=\"times\"\n aria-label={t('grafana-ui.cascader.clear-button', 'Clear selection')}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setRcValue({ value: [], label: '' });\n setActiveLabel('');\n setInputValue('');\n onSelect('');\n }}\n />\n )}\n <Icon name={focusCascade ? 'angle-up' : 'angle-down'} />\n </Stack>\n }\n disabled={disabled}\n id={id}\n />\n </div>\n </RCCascader>\n )}\n </div>\n );\n }\n);\n\nCascader.displayName = 'Cascader';\n"],"names":["searchableOptions","activeLabel","inputValue"],"mappings":"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"}