{"version":3,"file":"FormInput.mjs","sources":["../../../src/lib/components/FormInput/FormInput.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, useRef, forwardRef } from 'react'\nimport PropTypes from 'prop-types'\nimport classNames from 'classnames'\nimport { isEmpty, isNil } from 'lodash'\nimport { Field, useField } from 'react-final-form'\n\nimport InputNumberButtons from './InputNumberButtons/InputNumberButtons'\nimport OptionsMenu from '../../elements/OptionsMenu/OptionsMenu'\nimport ValidationTemplate from '../../elements/ValidationTemplate/ValidationTemplate'\nimport { TextTooltipTemplate, Tip, Tooltip } from '../../components'\n\nimport { DENSITY, INPUT_LINK, INPUT_VALIDATION_RULES } from '../../types'\nimport { checkPatternsValidity, checkPatternsValidityAsync } from '../../utils/validation.util'\nimport { useDetectOutsideClick, useDebounce } from '../../hooks'\nimport { validation as ValidationConstants } from '../../constants'\n\nimport ExclamationMarkIcon from '../../images/exclamation-mark.svg?react'\nimport Popout from '../../images/popout.svg?react'\nimport WarningIcon from '../../images/warning.svg?react'\n\nimport './formInput.scss'\n\nconst defaultProps = {\n  iconClick: () => {},\n  link: { show: '', value: '' },\n  onBlur: () => {},\n  onKeyDown: () => {},\n  onValidationError: () => {},\n  validator: () => {},\n  rules: []\n}\n\nlet FormInput = (\n  {\n    async = false,\n    className = '',\n    customRequiredLabel = '',\n    density = 'normal',\n    disabled = false,\n    focused = false,\n    iconClass = '',\n    iconClick = defaultProps.iconClick,\n    inputIcon = null,\n    invalidText = 'This field is invalid',\n    label = '',\n    link = defaultProps.link,\n    name,\n    onBlur = defaultProps.onBlur,\n    onFocus,\n    onKeyDown = defaultProps.onKeyDown,\n    pattern = null,\n    required = false,\n    onValidationError = defaultProps.onValidationError,\n    suggestionList = [],\n    step = '1',\n    tip = '',\n    type = 'text',\n    validationRules: rules = defaultProps.rules,\n    validator = defaultProps.validator,\n    withoutBorder = false,\n    ...inputProps\n  },\n  ref\n) => {\n  const { input, meta } = useField(name)\n  const [isInvalid, setIsInvalid] = useState(false)\n  const [isFocused, setIsFocused] = useState(false)\n  const [typedValue, setTypedValue] = useState('')\n  const [validationPattern] = useState(RegExp(pattern))\n  const [validationRules, setValidationRules] = useState(rules)\n  const [showValidationRules, setShowValidationRules] = useState(false)\n  const wrapperRef = useRef()\n  ref ??= wrapperRef\n  const inputRef = useRef()\n  const errorsRef = useRef()\n  const isRequiredRulePresentRef = useRef(false)\n  useDetectOutsideClick(ref, () => setShowValidationRules(false))\n  const debounceAsync = useDebounce()\n\n  const formFieldClassNames = classNames('form-field-input', className)\n\n  const inputWrapperClassNames = 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  const labelClassNames = classNames('form-field__label', disabled && 'form-field__label-disabled')\n\n  useEffect(() => {\n    setTypedValue(String(input.value)) // convert from number to string\n  }, [input.value])\n\n  useEffect(() => {\n    const isInputInvalid =\n      errorsRef.current &&\n      meta.invalid &&\n      (meta.validating || meta.modified || (meta.submitFailed && meta.touched))\n    setIsInvalid(isInputInvalid)\n    onValidationError(isInputInvalid)\n  }, [\n    meta.invalid,\n    meta.modified,\n    meta.submitFailed,\n    meta.touched,\n    meta.validating,\n    onValidationError\n  ])\n\n  useEffect(() => {\n    if (!errorsRef.current) {\n      if (meta.valid && showValidationRules) {\n        setShowValidationRules(false)\n      }\n    }\n  }, [meta.valid, showValidationRules])\n\n  useEffect(() => {\n    if (showValidationRules) {\n      window.addEventListener('scroll', handleScroll, true)\n    }\n    return () => {\n      window.removeEventListener('scroll', handleScroll, true)\n    }\n  }, [showValidationRules])\n\n  useEffect(() => {\n    if (focused) {\n      inputRef.current.focus()\n    }\n  }, [focused])\n\n  useEffect(() => {\n    setValidationRules(() => {\n      isRequiredRulePresentRef.current = false\n\n      return rules.map(rule => {\n        if (rule.name === ValidationConstants.REQUIRED.NAME) {\n          isRequiredRulePresentRef.current = true\n        }\n\n        return {\n          ...rule,\n          isValid:\n            !errorsRef.current || !Array.isArray(errorsRef.current)\n              ? true\n              : !errorsRef.current.some(err => err.name === rule.name)\n        }\n      })\n    })\n  }, [rules])\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 isValueEmptyAndValid = value => {\n    return (!value && !required) || disabled\n  }\n\n  const handleInputBlur = event => {\n    input.onBlur && input.onBlur(event)\n\n    if (!event.relatedTarget || !event.relatedTarget?.closest('.form-field__suggestion-list')) {\n      setIsFocused(false)\n      onBlur && onBlur(event)\n    }\n  }\n  const handleInputFocus = event => {\n    input.onFocus && input.onFocus(event)\n    onFocus && onFocus(event)\n    setIsFocused(true)\n  }\n\n  const handleInputKeyDown = event => {\n    input.onKeyDown && input.onKeyDown(event)\n    onKeyDown && onKeyDown(event)\n  }\n\n  const handleScroll = event => {\n    if (inputRef.current && inputRef.current.contains(event.target)) return\n\n    if (\n      !event.target.closest('.options-menu') &&\n      !event.target.classList.contains('form-field-input')\n    ) {\n      setShowValidationRules(false)\n    }\n  }\n\n  const handleSuggestionClick = item => {\n    input.onChange && input.onChange(item)\n    setIsFocused(false)\n    onBlur()\n  }\n\n  const toggleValidationRulesMenu = () => {\n    inputRef.current.focus()\n    setShowValidationRules(state => !state)\n  }\n\n  const validateField = (value, allValues) => {\n    let valueToValidate = isNil(value) ? '' : String(value)\n\n    if (isValueEmptyAndValid(valueToValidate)) return\n\n    let validationError = null\n\n    if (required && valueToValidate.trim().length === 0 && !isRequiredRulePresentRef.current) {\n      validationError = {\n        name: 'required',\n        label: customRequiredLabel || 'This field is required'\n      }\n    } else if (!isEmpty(rules) && !async) {\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 (type === 'number') {\n        if (inputProps.max && +valueToValidate > +inputProps.max) {\n          validationError = {\n            name: 'maxValue',\n            label: `The maximum value must be ${inputProps.max}`\n          }\n        }\n\n        if (inputProps.min && +valueToValidate < +inputProps.min) {\n          validationError = {\n            name: 'minValue',\n            label: `The minimum value must be ${inputProps.min}`\n          }\n        }\n      }\n      if (pattern && !validationPattern.test(valueToValidate)) {\n        validationError = { name: 'pattern', label: invalidText }\n      } else if (valueToValidate.startsWith(' ')) {\n        validationError = { name: 'empty', label: invalidText }\n      }\n    }\n\n    if (!validationError && validator) {\n      validationError = validator(value, allValues)\n    }\n\n    errorsRef.current = validationError\n\n    return validationError\n  }\n\n  const validateFieldAsync = debounceAsync(async (value, allValues) => {\n    let valueToValidate = isNil(value) ? '' : String(value)\n\n    if (isValueEmptyAndValid(valueToValidate)) return\n\n    let validationError = validateField(valueToValidate, allValues)\n\n    if (!isEmpty(rules)) {\n      const [newRules, isValidField] = await checkPatternsValidityAsync(rules, valueToValidate)\n\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    errorsRef.current = validationError\n\n    return validationError\n  }, 400)\n\n  const parseField = val => {\n    return type === 'number' && val ? parseFloat(val) || val : val\n  }\n\n  return (\n    <Field validate={async ? validateFieldAsync : validateField} name={name} parse={parseField}>\n      {({ input }) => {\n        return (\n          <div\n            ref={ref}\n            className={formFieldClassNames}\n            data-testid={name ? `${name}-form-field-input` : 'form-field-input'}\n          >\n            {label && (\n              <div className={labelClassNames}>\n                <label\n                  data-testid={name ? `${name}-form-label` : 'form-label'}\n                  htmlFor={input.name}\n                >\n                  {label}\n                  {(required || validationRules.find(rule => rule.name === 'required')) && (\n                    <span className=\"form-field__label-mandatory\"> *</span>\n                  )}\n                </label>\n                {link && link.show && typedValue.trim() && (\n                  <div className=\"form-field__label-icon\">\n                    <Tooltip template={<TextTooltipTemplate text={link.url || typedValue} />}>\n                      <a\n                        href={link.url || typedValue}\n                        onClick={event => event.stopPropagation()}\n                        target=\"_blank\"\n                        rel=\"noreferrer\"\n                      >\n                        <Popout />\n                      </a>\n                    </Tooltip>\n                  </div>\n                )}\n              </div>\n            )}\n            <div className={inputWrapperClassNames}>\n              <div className=\"form-field__control\">\n                <input\n                  data-testid={name ? `${name}-form-input` : 'form-input'}\n                  id={input.name}\n                  ref={inputRef}\n                  required={isInvalid || required}\n                  {...{\n                    disabled,\n                    pattern,\n                    type,\n                    ...inputProps,\n                    ...input\n                  }}\n                  autoComplete={inputProps.autocomplete ?? 'off'}\n                  onBlur={handleInputBlur}\n                  onKeyDown={handleInputKeyDown}\n                  onFocus={handleInputFocus}\n                />\n              </div>\n              <div className=\"form-field__icons\">\n                {isInvalid && !Array.isArray(errorsRef.current) && (\n                  <Tooltip\n                    className=\"form-field__warning\"\n                    template={\n                      <TextTooltipTemplate text={errorsRef.current?.label ?? invalidText} warning />\n                    }\n                  >\n                    <ExclamationMarkIcon />\n                  </Tooltip>\n                )}\n                {isInvalid && Array.isArray(errorsRef.current) && (\n                  <button className=\"form-field__warning\" onClick={toggleValidationRulesMenu}>\n                    <WarningIcon />\n                  </button>\n                )}\n                {tip && <Tip text={tip} className=\"form-field__tip\" />}\n                {inputIcon && (\n                  <span data-testid=\"input-icon\" className={iconClass} onClick={iconClick}>\n                    {inputIcon}\n                  </span>\n                )}\n              </div>\n              {type === 'number' && (\n                <InputNumberButtons {...{ ...inputProps, step: +step, ...input, disabled }} />\n              )}\n            </div>\n            {suggestionList?.length > 0 && isFocused && (\n              <ul className=\"form-field__suggestion-list\">\n                {suggestionList.map((item, index) => {\n                  return (\n                    <li\n                      className=\"suggestion-item\"\n                      key={`${item}${index}`}\n                      onClick={() => {\n                        handleSuggestionClick(item)\n                      }}\n                      tabIndex={index}\n                      dangerouslySetInnerHTML={{\n                        __html: item.replace(new RegExp(typedValue, 'gi'), match =>\n                          match ? `<b>${match}</b>` : match\n                        )\n                      }}\n                    />\n                  )\n                })}\n              </ul>\n            )}\n            {!isEmpty(validationRules) && isInvalid && Array.isArray(errorsRef.current) && (\n              <OptionsMenu show={showValidationRules} ref={{ refInputContainer: ref }}>\n                {getValidationRules()}\n              </OptionsMenu>\n            )}\n          </div>\n        )\n      }}\n    </Field>\n  )\n}\n\nFormInput = React.memo(forwardRef(FormInput))\n\nFormInput.displayName = 'FormInput'\n\nFormInput.propTypes = {\n  async: PropTypes.bool,\n  className: PropTypes.string,\n  customRequiredLabel: PropTypes.string,\n  density: DENSITY,\n  disabled: PropTypes.bool,\n  focused: PropTypes.bool,\n  iconClass: PropTypes.string,\n  iconClick: PropTypes.func,\n  inputIcon: PropTypes.element,\n  invalidText: PropTypes.string,\n  label: PropTypes.string,\n  link: INPUT_LINK,\n  max: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  min: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  name: PropTypes.string.isRequired,\n  onBlur: PropTypes.func,\n  onFocus: PropTypes.func,\n  onKeyDown: PropTypes.func,\n  onValidationError: PropTypes.func,\n  pattern: PropTypes.string,\n  placeholder: PropTypes.string,\n  required: PropTypes.bool,\n  step: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  suggestionList: PropTypes.arrayOf(PropTypes.string),\n  tip: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n  type: PropTypes.string,\n  validationRules: INPUT_VALIDATION_RULES,\n  validator: PropTypes.func,\n  value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  withoutBorder: PropTypes.bool\n}\n\nexport default React.memo(FormInput)\n"],"names":["defaultProps","FormInput","async","className","customRequiredLabel","density","disabled","focused","iconClass","iconClick","inputIcon","invalidText","label","link","name","onBlur","onFocus","onKeyDown","pattern","required","onValidationError","suggestionList","step","tip","type","rules","validator","withoutBorder","inputProps","ref","input","meta","useField","isInvalid","setIsInvalid","useState","isFocused","setIsFocused","typedValue","setTypedValue","validationPattern","validationRules","setValidationRules","showValidationRules","setShowValidationRules","wrapperRef","useRef","inputRef","errorsRef","isRequiredRulePresentRef","useDetectOutsideClick","debounceAsync","useDebounce","formFieldClassNames","classNames","inputWrapperClassNames","labelClassNames","useEffect","isInputInvalid","handleScroll","rule","ValidationConstants","err","getValidationRules","isValid","ValidationTemplate","isValueEmptyAndValid","value","handleInputBlur","event","_a","handleInputFocus","handleInputKeyDown","handleSuggestionClick","item","toggleValidationRulesMenu","state","validateField","allValues","valueToValidate","isNil","validationError","isEmpty","newRules","isValidField","checkPatternsValidity","invalidRules","validateFieldAsync","checkPatternsValidityAsync","jsx","Field","val","jsxs","Tooltip","TextTooltipTemplate","Popout","ExclamationMarkIcon","WarningIcon","Tip","InputNumberButtons","index","match","OptionsMenu","React","forwardRef","PropTypes","DENSITY","INPUT_LINK","INPUT_VALIDATION_RULES","FormInput$1"],"mappings":"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"}