{"version":3,"file":"FormCombobox.mjs","sources":["../../../src/lib/components/FormCombobox/FormCombobox.jsx"],"sourcesContent":["/*\nCopyright 2022 Iguazio Systems Ltd.\nLicensed under the Apache License, Version 2.0 (the \"License\") with\nan addition restriction as set forth herein. You may not use this\nfile except in compliance with the License. You may obtain a copy of\nthe License at http://www.apache.org/licenses/LICENSE-2.0.\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing\npermissions and limitations under the License.\nIn addition, you may not use the software for any purposes that are\nillegal under applicable law, and the grant of the foregoing license\nunder the Apache 2.0 license is conditioned upon your compliance with\nsuch restriction.\n*/\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { Field, useField } from 'react-final-form'\nimport { isEmpty } from 'lodash'\nimport PropTypes from 'prop-types'\nimport classnames from 'classnames'\n\nimport OptionsMenu from '../../elements/OptionsMenu/OptionsMenu'\nimport ValidationTemplate from '../../elements/ValidationTemplate/ValidationTemplate'\nimport PopUpDialog from '../PopUpDialog/PopUpDialog'\nimport TextTooltipTemplate from '../TooltipTemplate/TextTooltipTemplate'\nimport Tooltip from '../Tooltip/Tooltip'\n\nimport { checkPatternsValidity } from '../../utils/validation.util'\nimport { useDetectOutsideClick } from '../../hooks'\nimport { COMBOBOX_SELECT_OPTIONS, COMBOBOX_SUGGESTION_LIST, DENSITY } from '../../types'\n\nimport Arrow from '../../images/arrow.svg?react'\nimport SearchIcon from '../../images/search.svg?react'\nimport WarningIcon from '../../images/warning.svg?react'\nimport ExclamationMarkIcon from '../../images/exclamation-mark.svg?react'\n\nimport './formCombobox.scss'\n\nconst FormCombobox = ({\n  comboboxClassName = '',\n  density = 'normal',\n  disabled = false,\n  hideSearchInput = false,\n  inputDefaultValue = '',\n  inputPlaceholder = '',\n  invalidText = 'Invalid',\n  label = '',\n  maxSuggestedMatches = 1,\n  name,\n  onBlur = null,\n  onChange = null,\n  onFocus = null,\n  required = false,\n  rules = [],\n  selectDefaultValue = {\n    label: '',\n    id: '',\n    className: ''\n  },\n  selectOptions,\n  selectPlaceholder = '',\n  suggestionList = [],\n  validator = null,\n  withoutBorder = false\n}) => {\n  const { input, meta } = useField(name)\n  const [inputValue, setInputValue] = useState(inputDefaultValue)\n  const [selectValue, setSelectValue] = useState(selectDefaultValue)\n  const [dropdownStyle, setDropdownStyle] = useState({\n    left: '0px'\n  })\n  const [showSelectDropdown, setShowSelectDropdown] = useState(false)\n  const [showSuggestionList, setShowSuggestionList] = useState(false)\n  const [dropdownList, setDropdownList] = useState(suggestionList)\n  const [searchIsFocused, setSearchIsFocused] = useState(false)\n  const [isInvalid, setIsInvalid] = useState(false)\n  const [validationRules, setValidationRules] = useState(rules)\n  const [showValidationRules, setShowValidationRules] = useState(false)\n  const comboboxRef = useRef()\n  const selectRef = useRef()\n  const inputRef = useRef()\n  const suggestionListRef = useRef()\n  useDetectOutsideClick(comboboxRef, () => setShowValidationRules(false))\n\n  const labelClassNames = classnames('form-field__label', disabled && 'form-field__label-disabled')\n  const inputClassNames = classnames(\n    'form-field-combobox__input',\n    selectValue.id.length === 0 && 'form-field-combobox__input_hidden'\n  )\n\n  useEffect(() => {\n    setValidationRules(prevState =>\n      prevState.map(rule => ({\n        ...rule,\n        isValid:\n          !meta.error || !Array.isArray(meta.error)\n            ? true\n            : !meta.error.some(err => err.name === rule.name)\n      }))\n    )\n  }, [meta.error])\n\n  useEffect(() => {\n    if (!searchIsFocused) {\n      if (JSON.stringify(dropdownList) !== JSON.stringify(suggestionList)) {\n        setDropdownList(suggestionList)\n      }\n    }\n  }, [dropdownList, suggestionList, searchIsFocused])\n\n  useEffect(() => {\n    setIsInvalid(\n      meta.invalid && (meta.validating || meta.modified || (meta.submitFailed && meta.touched))\n    )\n  }, [meta.invalid, meta.modified, meta.submitFailed, meta.touched, meta.validating])\n\n  const handleOutsideClick = useCallback(\n    event => {\n      if (\n        comboboxRef.current &&\n        !comboboxRef.current.contains(event.target) &&\n        suggestionListRef.current &&\n        !suggestionListRef.current.contains(event.target)\n      ) {\n        setSearchIsFocused(false)\n        setShowSelectDropdown(false)\n        setShowSuggestionList(false)\n        input.onBlur(new Event('blur'))\n        onBlur && onBlur(input.value)\n      }\n    },\n    [input, onBlur]\n  )\n\n  const handleScroll = event => {\n    if (comboboxRef.current && comboboxRef.current.contains(event.target)) return\n\n    if (\n      !event.target.closest('.pop-up-dialog') &&\n      !event.target.classList.contains('form-field-combobox')\n    ) {\n      setShowValidationRules(false)\n      setShowSelectDropdown(false)\n      setShowSuggestionList(false)\n      inputRef.current.blur()\n    }\n  }\n\n  useEffect(() => {\n    window.addEventListener('click', handleOutsideClick)\n\n    return () => {\n      window.removeEventListener('click', handleOutsideClick)\n    }\n  }, [handleOutsideClick])\n\n  useEffect(() => {\n    if (showValidationRules || showSelectDropdown || showSuggestionList) {\n      window.addEventListener('scroll', handleScroll, true)\n    }\n    return () => {\n      window.removeEventListener('scroll', handleScroll, true)\n    }\n  }, [showSelectDropdown, showSuggestionList, showValidationRules])\n\n  const getValidationRules = () => {\n    return validationRules.map(({ isValid = false, label, name }) => {\n      return <ValidationTemplate valid={isValid} validationMessage={label} key={name} />\n    })\n  }\n\n  const handleInputChange = event => {\n    const target = event.target\n\n    setDropdownStyle({\n      left: `${target.selectionStart < 30 ? target.selectionStart : 30}ch`\n    })\n\n    if (searchIsFocused) {\n      setSearchIsFocused(false)\n    }\n\n    setInputValue(target.value)\n    input.onChange(`${selectValue.id}${target.value}`)\n    onChange && onChange(selectValue.id, target.value)\n\n    if (dropdownList.length > 0) {\n      setShowSuggestionList(true)\n    }\n  }\n\n  const handleSelectOptionClick = selectedOption => {\n    if (selectedOption.id !== selectValue.id) {\n      setSelectValue(selectedOption)\n      input.onChange(selectedOption.id)\n      setInputValue('')\n      onChange && onChange(selectedOption.id)\n      setShowSelectDropdown(false)\n      inputRef.current.disabled = false\n      inputRef.current.focus()\n    } else {\n      setShowSelectDropdown(false)\n      inputRef.current.disabled = false\n      inputRef.current.focus()\n    }\n  }\n\n  const handleSuggestionListOptionClick = option => {\n    const inputValueItems = inputValue.split('/')\n    const valueIndex = inputValueItems.length - 1\n    let formattedValue = option.customDelimiter\n      ? inputValueItems[valueIndex].replace(new RegExp(`${option.customDelimiter}.*`), '') +\n        option.id\n      : option.id\n\n    if (inputValueItems.length <= maxSuggestedMatches - 1) formattedValue += '/'\n\n    inputValueItems[valueIndex] = formattedValue\n\n    if (searchIsFocused) {\n      setSearchIsFocused(false)\n    }\n\n    if (inputValueItems.join('/') !== inputValue) {\n      setInputValue(inputValueItems.join('/'))\n      input.onChange(`${selectValue.id}${inputValueItems.join('/')}`)\n      onChange && onChange(selectValue.id, inputValueItems.join('/'))\n    }\n\n    setShowSuggestionList(false)\n    inputRef.current.focus()\n    setDropdownStyle({\n      left: `${inputRef.current.selectionStart < 30 ? inputRef.current.selectionStart : 30}ch`\n    })\n  }\n\n  const inputOnFocus = event => {\n    onFocus && onFocus()\n    input.onFocus(new Event('focus'))\n\n    if (showSelectDropdown) {\n      setShowSelectDropdown(false)\n    }\n\n    // browser need some time to calculate cursor position after onFocus fired\n    if (!inputRef.current.selectionStart) {\n      setTimeout(() => {\n        setDropdownStyle({\n          left: `${event.target.selectionStart < 30 ? event.target.selectionStart : 30}ch`\n        })\n        setShowSuggestionList(true)\n      })\n    } else {\n      setShowSuggestionList(true)\n    }\n  }\n\n  const suggestionListSearchChange = event => {\n    event.persist()\n    setDropdownList(() =>\n      suggestionList.filter(option => {\n        return option.id.startsWith(event.target.value)\n      })\n    )\n  }\n\n  const toggleSelect = useCallback(() => {\n    if (showSelectDropdown) {\n      setShowSelectDropdown(false)\n      input.onBlur(new Event('blur'))\n      onBlur && onBlur(input.value)\n    } else {\n      setShowSuggestionList(false)\n      setShowValidationRules(false)\n      setDropdownStyle({\n        left: '0px'\n      })\n      setShowSelectDropdown(true)\n      input.onFocus(new Event('focus'))\n      onFocus && onFocus(input.value)\n    }\n  }, [input, onBlur, onFocus, showSelectDropdown])\n\n  const validateField = (value = '', allValues) => {\n    const valueToValidate = value.startsWith(selectValue.id)\n      ? value.substring(selectValue.id.length)\n      : (value ?? '')\n    let validationError = null\n\n    if (!isEmpty(validationRules)) {\n      const [newRules, isValidField] = checkPatternsValidity(rules, valueToValidate)\n      const invalidRules = newRules.filter(rule => !rule.isValid)\n\n      if (!isValidField) {\n        validationError = invalidRules.map(rule => ({ name: rule.name, label: rule.label }))\n      }\n    }\n\n    if (isEmpty(validationError)) {\n      if (valueToValidate.startsWith(' ')) {\n        validationError = { name: 'empty', label: invalidText }\n      } else if (required && valueToValidate.trim().length === 0) {\n        validationError = { name: 'required', label: 'This field is required' }\n      }\n    }\n\n    if (!validationError && validator) {\n      validationError = validator(value, allValues)\n    }\n\n    return validationError\n  }\n\n  const warningIconClick = () => {\n    setShowValidationRules(state => !state)\n    setShowSelectDropdown(false)\n  }\n\n  const comboboxClassNames = classnames(\n    comboboxClassName,\n    'form-field-combobox',\n    'form-field',\n    isInvalid && 'form-field-combobox_invalid'\n  )\n  const iconClassNames = classnames(\n    showSelectDropdown && 'form-field-combobox__icon_open',\n    'form-field-combobox__icon'\n  )\n  const selectValueClassNames = classnames(selectValue.className)\n\n  const wrapperClassNames = classnames(\n    'form-field__wrapper',\n    `form-field__wrapper-${density}`,\n    disabled && 'form-field__wrapper-disabled',\n    isInvalid && 'form-field__wrapper-invalid',\n    withoutBorder && 'without-border'\n  )\n\n  return (\n    <Field name={name} validate={validateField}>\n      {({ input, meta }) => (\n        <div\n          className={comboboxClassNames}\n          ref={comboboxRef}\n          data-testid={name ? `${name}-form-combobox` : 'form-combobox'}\n        >\n          {label && (\n            <div className={labelClassNames}>\n              <label data-testid=\"label\" htmlFor={input.name}>\n                {label}\n                {(required || validationRules.find(rule => rule.name === 'required')) && (\n                  <span className=\"form-field__label-mandatory\"> *</span>\n                )}\n              </label>\n            </div>\n          )}\n          <div className={wrapperClassNames}>\n            <div className=\"form-field__icons\">\n              <Arrow className={iconClassNames} onClick={toggleSelect} />\n            </div>\n            <div className=\"form-field-combobox__select form-field__control\" ref={selectRef}>\n              <div className=\"form-field-combobox__select-header\" onClick={toggleSelect}>\n                <span className={selectValueClassNames}>{selectValue.id}</span>\n                {selectValue.id.length === 0 && selectPlaceholder && (\n                  <div className=\"form-field-combobox__placeholder\">\n                    <label>{selectPlaceholder}</label>\n                  </div>\n                )}\n              </div>\n              {showSelectDropdown && (\n                <PopUpDialog\n                  headerIsHidden\n                  customPosition={{\n                    element: selectRef,\n                    position: 'bottom-right'\n                  }}\n                  className=\"form-field-combobox__dropdown form-field-combobox__dropdown-select\"\n                >\n                  <ul className=\"form-field-combobox__dropdown-list\" ref={suggestionListRef}>\n                    {selectOptions.map(option => {\n                      if (!option.hidden) {\n                        const selectOptionClassNames = classnames(\n                          'form-field-combobox__dropdown-list-option',\n                          option.className\n                        )\n\n                        return (\n                          <li\n                            className={selectOptionClassNames}\n                            key={option.id}\n                            onClick={() => handleSelectOptionClick(option)}\n                          >\n                            {option.label}\n                          </li>\n                        )\n                      }\n                    })}\n                  </ul>\n                </PopUpDialog>\n              )}\n            </div>\n            <input\n              autoComplete=\"off\"\n              className={inputClassNames}\n              data-testid={name ? `${name}-form-combobox-input` : 'form-combobox-input'}\n              id={input.name}\n              onChange={handleInputChange}\n              onFocus={inputOnFocus}\n              placeholder={inputPlaceholder}\n              ref={inputRef}\n              required={required}\n              type=\"text\"\n              value={inputValue}\n            />\n            {showSuggestionList && (dropdownList.length > 0 || searchIsFocused) && (\n              <PopUpDialog\n                headerIsHidden\n                customPosition={{\n                  element: selectRef,\n                  position: 'bottom-right'\n                }}\n                className=\"form-field-combobox__dropdown form-field-combobox__dropdown-suggestions\"\n                style={{\n                  ...dropdownStyle\n                }}\n              >\n                <div ref={suggestionListRef}>\n                  {!hideSearchInput && (\n                    <div className=\"form-field-combobox__search-wrapper\">\n                      <input\n                        autoComplete=\"off\"\n                        data-testid={name ? `${name}-form-combobox-search` : 'form-combobox-search'}\n                        className=\"form-field-combobox__search form-field__control\"\n                        onChange={suggestionListSearchChange}\n                        onFocus={() => setSearchIsFocused(true)}\n                        placeholder=\"Type to search\"\n                        type=\"text\"\n                      />\n                      <SearchIcon />\n                    </div>\n                  )}\n                  <ul className=\"form-field-combobox__dropdown-list\">\n                    {searchIsFocused && dropdownList.length === 0 ? (\n                      <li className=\"form-field-combobox__dropdown-list-option\" key=\"no data\">\n                        No data\n                      </li>\n                    ) : (\n                      dropdownList.map(value => (\n                        <li\n                          className=\"form-field-combobox__dropdown-list-option\"\n                          key={value.id}\n                          onClick={() => handleSuggestionListOptionClick(value)}\n                        >\n                          {value.label}\n                        </li>\n                      ))\n                    )}\n                  </ul>\n                </div>\n              </PopUpDialog>\n            )}\n            <div className=\"form-field__icons\">\n              {isInvalid && !Array.isArray(meta.error) && (\n                <Tooltip\n                  className=\"form-field__warning\"\n                  template={<TextTooltipTemplate text={meta.error?.label ?? invalidText} warning />}\n                >\n                  <ExclamationMarkIcon />\n                </Tooltip>\n              )}\n              {isInvalid && Array.isArray(meta.error) && (\n                <button className=\"form-field__warning\" onClick={warningIconClick}>\n                  <WarningIcon />\n                </button>\n              )}\n            </div>\n            {!isEmpty(validationRules) && (\n              <OptionsMenu show={showValidationRules} ref={{ refInputContainer: comboboxRef }}>\n                {getValidationRules()}\n              </OptionsMenu>\n            )}\n          </div>\n        </div>\n      )}\n    </Field>\n  )\n}\n\nFormCombobox.propTypes = {\n  comboboxClassName: PropTypes.string,\n  density: DENSITY,\n  disabled: PropTypes.bool,\n  hideSearchInput: PropTypes.bool,\n  inputDefaultValue: PropTypes.string,\n  inputPlaceholder: PropTypes.string,\n  invalidText: PropTypes.string,\n  label: PropTypes.string,\n  maxSuggestedMatches: PropTypes.number,\n  name: PropTypes.string.isRequired,\n  onBlur: PropTypes.func,\n  onChange: PropTypes.func,\n  onFocus: PropTypes.func,\n  required: PropTypes.bool,\n  rules: PropTypes.array,\n  selectDefaultValue: PropTypes.shape({}),\n  selectOptions: COMBOBOX_SELECT_OPTIONS.isRequired,\n  selectPlaceholder: PropTypes.string,\n  suggestionList: COMBOBOX_SUGGESTION_LIST,\n  validator: PropTypes.func,\n  withoutBorder: PropTypes.bool\n}\n\nexport default FormCombobox\n"],"names":["FormCombobox","comboboxClassName","density","disabled","hideSearchInput","inputDefaultValue","inputPlaceholder","invalidText","label","maxSuggestedMatches","name","onBlur","onChange","onFocus","required","rules","selectDefaultValue","selectOptions","selectPlaceholder","suggestionList","validator","withoutBorder","input","meta","useField","inputValue","setInputValue","useState","selectValue","setSelectValue","dropdownStyle","setDropdownStyle","showSelectDropdown","setShowSelectDropdown","showSuggestionList","setShowSuggestionList","dropdownList","setDropdownList","searchIsFocused","setSearchIsFocused","isInvalid","setIsInvalid","validationRules","setValidationRules","showValidationRules","setShowValidationRules","comboboxRef","useRef","selectRef","inputRef","suggestionListRef","useDetectOutsideClick","labelClassNames","classnames","inputClassNames","useEffect","prevState","rule","err","handleOutsideClick","useCallback","event","handleScroll","getValidationRules","isValid","ValidationTemplate","handleInputChange","target","handleSelectOptionClick","selectedOption","handleSuggestionListOptionClick","option","inputValueItems","valueIndex","formattedValue","inputOnFocus","suggestionListSearchChange","toggleSelect","validateField","value","allValues","valueToValidate","validationError","isEmpty","newRules","isValidField","checkPatternsValidity","invalidRules","warningIconClick","state","comboboxClassNames","iconClassNames","selectValueClassNames","wrapperClassNames","jsx","Field","jsxs","Arrow","PopUpDialog","selectOptionClassNames","SearchIcon","Tooltip","TextTooltipTemplate","ExclamationMarkIcon","WarningIcon","OptionsMenu","PropTypes","DENSITY","COMBOBOX_SELECT_OPTIONS","COMBOBOX_SUGGESTION_LIST"],"mappings":"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"}