{"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 { 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}\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  }: 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>\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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"}