{"version":3,"file":"FormSelect.mjs","sources":["../../../src/lib/components/FormSelect/FormSelect.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, { useState, useEffect, useCallback, useMemo, useRef } from 'react'\nimport PropTypes from 'prop-types'\nimport classNames from 'classnames'\nimport { Field, useField } from 'react-final-form'\n\nimport ConfirmDialog from '../ConfirmDialog/ConfirmDialog'\nimport PopUpDialog from '../PopUpDialog/PopUpDialog'\nimport SelectOption from '../../elements/SelectOption/SelectOption'\nimport TextTooltipTemplate from '../TooltipTemplate/TextTooltipTemplate'\nimport Tooltip from '../Tooltip/Tooltip'\n\nimport { DENSITY, SELECT_OPTIONS } from '../../types'\nimport { TERTIARY_BUTTON } from '../../constants'\n\nimport Caret from '../../images/dropdown.svg?react'\n\nimport './formSelect.scss'\n\nlet FormSelect = ({\n  className = '',\n  density = 'normal',\n  disabled = false,\n  hideSelectedOption = false,\n  label = '',\n  multiple = false,\n  name,\n  onChange = null,\n  options,\n  placeholder = '',\n  preventWidthOverflow = false,\n  required = false,\n  scrollToView = true,\n  search = false,\n  selectedItemAction = null,\n  tooltip = '',\n  withSelectedIcon = true,\n  withoutBorder = false\n}) => {\n  const { input, meta } = useField(name)\n  const [isInvalid, setIsInvalid] = useState(false)\n  const [isConfirmDialogOpen, setConfirmDialogOpen] = useState(false)\n  const [isOpen, setIsOpen] = useState(false)\n  const [searchValue, setSearchValue] = useState('')\n  const optionsListRef = useRef()\n  const popUpRef = useRef()\n  const selectRef = useRef()\n  const searchRef = useRef()\n  const { width: selectWidth } = selectRef?.current?.getBoundingClientRect() || {}\n\n  const selectWrapperClassNames = classNames(\n    'form-field__wrapper',\n    `form-field__wrapper-${density}`,\n    disabled && 'form-field__wrapper-disabled',\n    isOpen && 'form-field__wrapper-active',\n    isInvalid && 'form-field__wrapper-invalid',\n    withoutBorder && 'without-border'\n  )\n\n  const selectLabelClassName = classNames(\n    'form-field__label',\n    disabled && 'form-field__label-disabled'\n  )\n\n  const selectValueClassName = classNames(\n    'form-field__select-value',\n    !input.value && 'form-field__select-placeholder'\n  )\n\n  const selectedOption = options.find(option => option.id === input.value)\n\n  const getFilteredOptions = useCallback(\n    options => {\n      return options.filter(option => {\n        return !search || option.label.toLowerCase().includes(searchValue.toLowerCase())\n      })\n    },\n    [search, searchValue]\n  )\n\n  const sortedOptionsList = useMemo(() => {\n    if (scrollToView) {\n      return getFilteredOptions(options)\n    }\n\n    const optionsList = [...options]\n\n    const selectedOption = optionsList.filter((option, idx, arr) => {\n      if (option.id === input.value) {\n        arr.splice(idx, 1)\n        return true\n      }\n      return false\n    })\n\n    return getFilteredOptions([...selectedOption, ...optionsList])\n  }, [input.value, getFilteredOptions, options, scrollToView])\n\n  const getSelectValue = () => {\n    if (!input.value || !input.value.length) {\n      return `Select Option${multiple ? 's' : ''}`\n    }\n\n    const multipleValue =\n      multiple && input.value.includes('all') && input.value.length > 1\n        ? options\n            .filter(option => option.id !== 'all')\n            .filter(option => input.value.includes(option.id))\n            .map(option => option.label)\n            .join(', ')\n        : options\n            .filter(option => input.value.includes(option.id))\n            .map(option => option.label)\n            .join(', ')\n\n    return !multiple\n      ? selectedOption?.label\n      : input.value.length <= 2\n        ? multipleValue\n        : `${input.value.length} items selected`\n  }\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 openMenu = useCallback(() => {\n    if (!isOpen) {\n      setIsOpen(true)\n      input.onFocus(new Event('focus'))\n    }\n  }, [input, isOpen])\n\n  const closeMenu = useCallback(() => {\n    if (isOpen) {\n      setIsOpen(false)\n      input.onBlur(new Event('blur'))\n    }\n  }, [input, isOpen])\n\n  const clickHandler = useCallback(\n    event => {\n      if (selectRef.current !== event.target.closest('.form-field-select')) {\n        closeMenu()\n      }\n    },\n    [closeMenu]\n  )\n\n  const handleScroll = useCallback(\n    event => {\n      if (!event.target.closest('.options-list__body')) {\n        closeMenu()\n      }\n    },\n    [closeMenu]\n  )\n\n  useEffect(() => {\n    if (isOpen) {\n      window.addEventListener('scroll', handleScroll, true)\n    }\n\n    window.addEventListener('click', clickHandler)\n\n    return () => {\n      window.removeEventListener('click', clickHandler)\n      window.removeEventListener('scroll', handleScroll, true)\n    }\n  }, [clickHandler, handleScroll, isOpen])\n\n  const scrollOptionToView = useCallback(() => {\n    const selectedOptionEl = optionsListRef.current.querySelector(\n      `[data-custom-id=\"${input.value}\"]`\n    )\n\n    if (!selectedOptionEl) return\n\n    searchValue\n      ? optionsListRef.current.scrollTo({ top: 0, left: 0, behavior: 'smooth' })\n      : setTimeout(() => {\n          selectedOptionEl.scrollIntoView({\n            behavior: 'smooth',\n            block: 'center'\n          })\n        }, 0)\n  }, [input.value, searchValue])\n\n  useEffect(() => {\n    if (isOpen && optionsListRef.current && scrollToView) {\n      scrollOptionToView()\n    }\n  }, [isOpen, scrollOptionToView, scrollToView])\n\n  useEffect(() => {\n    if (isOpen && search && searchRef.current) {\n      searchRef.current.focus()\n    }\n  }, [isOpen, search])\n\n  const toggleOpen = () => {\n    if (isOpen) {\n      closeMenu()\n    } else {\n      !disabled && openMenu()\n    }\n  }\n\n  const handleCloseSelectBody = useCallback(\n    event => {\n      event.stopPropagation()\n      if (multiple) return\n\n      if (\n        !event.target.classList.contains('disabled') &&\n        !event.target.closest('.options-list__search')\n      ) {\n        closeMenu()\n        setSearchValue('')\n      }\n    },\n    [closeMenu, multiple]\n  )\n\n  const handleSelectOptionClick = (selectedOption, option) => {\n    if (selectedOption !== input.value) {\n      option.handler && option.handler()\n      onChange && onChange(selectedOption)\n\n      setTimeout(() => {\n        input.onChange(selectedOption)\n      })\n    }\n  }\n\n  const validateField = value => {\n    if (required) {\n      return value ? undefined : 'Required'\n    }\n  }\n\n  return (\n    <Field name={name} validate={validateField}>\n      {({ input, meta }) => (\n        <Tooltip\n          className=\"select-tooltip\"\n          template={<TextTooltipTemplate text={tooltip} />}\n          hidden={!tooltip}\n        >\n          <div\n            data-testid={name ? `${name}-form-field-select` : 'form-field-select'}\n            ref={selectRef}\n            className={`form-field-select ${className}`}\n            onClick={toggleOpen}\n          >\n            {label && (\n              <div className={selectLabelClassName}>\n                <label data-testid={name ? `${name}-form-select-label` : 'form-select-label'}>\n                  {label}\n                  {meta.error && <span className=\"form-field__label-mandatory\"> *</span>}\n                </label>\n              </div>\n            )}\n            <div data-testid=\"select-header\" className={selectWrapperClassNames}>\n              <div className=\"form-field__control\">\n                {!hideSelectedOption && (\n                  <div data-testid=\"selected-option\" className=\"form-field__select\">\n                    <span className={selectValueClassName}>{getSelectValue() || placeholder}</span>\n                  </div>\n                )}\n              </div>\n              <div className=\"form-field__icons\">\n                {input.value && selectedItemAction && (\n                  <>\n                    {selectedItemAction.handler ? (\n                      <Tooltip template={<TextTooltipTemplate text={selectedItemAction.tooltip} />}>\n                        <button\n                          onClick={event => {\n                            if (selectedItemAction.confirm) {\n                              setConfirmDialogOpen(true)\n                            } else {\n                              selectedItemAction.handler(input.value)\n                            }\n\n                            event.stopPropagation()\n                          }}\n                        >\n                          {selectedItemAction.icon}\n                        </button>\n                      </Tooltip>\n                    ) : (\n                      <span>{selectedItemAction.icon}</span>\n                    )}\n                  </>\n                )}\n                <span>\n                  <Caret className=\"form-field__caret\" />\n                </span>\n              </div>\n            </div>\n            {isConfirmDialogOpen && (\n              <ConfirmDialog\n                cancelButton={{\n                  handler: () => {\n                    setConfirmDialogOpen(false)\n                  },\n                  label: 'Cancel',\n                  variant: TERTIARY_BUTTON\n                }}\n                closePopUp={() => {\n                  setConfirmDialogOpen(false)\n                }}\n                confirmButton={{\n                  handler: () => {\n                    selectedItemAction.handler(input.value)\n                    setConfirmDialogOpen(false)\n                  },\n                  label: selectedItemAction.confirm.btnConfirmLabel,\n                  variant: selectedItemAction.confirm.btnConfirmType\n                }}\n                header={selectedItemAction.confirm.title}\n                isOpen={isConfirmDialogOpen}\n                message={selectedItemAction.confirm.message}\n              />\n            )}\n            {isOpen && (\n              <PopUpDialog\n                className=\"form-field form-field-select__options-list\"\n                headerIsHidden\n                ref={popUpRef}\n                customPosition={{\n                  element: selectRef,\n                  position: 'bottom-right',\n                  autoHorizontalPosition: true\n                }}\n                style={{\n                  maxWidth: `${selectWidth < 500 && !preventWidthOverflow ? 500 : selectWidth}px`,\n                  minWidth: `${selectWidth}px`\n                }}\n              >\n                <div\n                  data-testid=\"select-body\"\n                  className=\"options-list__body\"\n                  onClick={handleCloseSelectBody}\n                >\n                  {search && (\n                    <div className=\"options-list__search\">\n                      <input\n                        type=\"text\"\n                        placeholder=\"Search...\"\n                        value={searchValue}\n                        onChange={event => setSearchValue(event.target.value)}\n                        ref={searchRef}\n                        autoFocus\n                      />\n                    </div>\n                  )}\n                  <ul className=\"options-list\" ref={optionsListRef}>\n                    {sortedOptionsList.map(option => {\n                      return (\n                        <SelectOption\n                          item={option}\n                          key={option.id}\n                          name={name}\n                          onClick={selectedOption => {\n                            handleSelectOptionClick(selectedOption, option)\n                          }}\n                          multiple={multiple}\n                          selectedId={!multiple ? input.value : ''}\n                          withSelectedIcon={withSelectedIcon}\n                        />\n                      )\n                    })}\n                  </ul>\n                </div>\n              </PopUpDialog>\n            )}\n            <input {...input} type=\"hidden\" />\n          </div>\n        </Tooltip>\n      )}\n    </Field>\n  )\n}\n\nFormSelect.propTypes = {\n  className: PropTypes.string,\n  density: DENSITY,\n  disabled: PropTypes.bool,\n  hideSelectedOption: PropTypes.bool,\n  label: PropTypes.string,\n  multiple: PropTypes.bool,\n  name: PropTypes.string.isRequired,\n  onChange: PropTypes.func,\n  options: SELECT_OPTIONS.isRequired,\n  placeholder: PropTypes.string,\n  preventWidthOverflow: PropTypes.bool,\n  required: PropTypes.bool,\n  scrollToView: PropTypes.bool,\n  search: PropTypes.bool,\n  selectedItemAction: PropTypes.object,\n  tooltip: PropTypes.string,\n  withSelectedIcon: PropTypes.bool,\n  withoutBorder: PropTypes.bool\n}\n\nFormSelect = React.memo(FormSelect)\n\nexport default FormSelect\n"],"names":["FormSelect","className","density","disabled","hideSelectedOption","label","multiple","name","onChange","options","placeholder","preventWidthOverflow","required","scrollToView","search","selectedItemAction","tooltip","withSelectedIcon","withoutBorder","input","meta","useField","isInvalid","setIsInvalid","useState","isConfirmDialogOpen","setConfirmDialogOpen","isOpen","setIsOpen","searchValue","setSearchValue","optionsListRef","useRef","popUpRef","selectRef","searchRef","selectWidth","_a","selectWrapperClassNames","classNames","selectLabelClassName","selectValueClassName","selectedOption","option","getFilteredOptions","useCallback","sortedOptionsList","useMemo","optionsList","idx","arr","getSelectValue","multipleValue","useEffect","openMenu","closeMenu","clickHandler","event","handleScroll","scrollOptionToView","selectedOptionEl","toggleOpen","handleCloseSelectBody","handleSelectOptionClick","jsx","Field","value","Tooltip","TextTooltipTemplate","jsxs","Fragment","Caret","ConfirmDialog","TERTIARY_BUTTON","PopUpDialog","SelectOption","PropTypes","DENSITY","SELECT_OPTIONS","React","FormSelect$1"],"mappings":"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"}