{"version":3,"file":"FormChipCell.mjs","sources":["../../../src/lib/components/FormChipCell/FormChipCell.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, useCallback, useMemo } from 'react'\nimport lodash, { get, isEmpty, set, isNil } from 'lodash'\nimport classnames from 'classnames'\nimport PropTypes from 'prop-types'\n\nimport FormChipCellView from './FormChipCellView'\n\nimport { CHIP_OPTIONS, VISIBLE_CHIPS_MAX_LENGTH } from '../../types'\nimport { CLICK, TAB, TAB_SHIFT } from '../../constants'\nimport { areArraysEqual } from '../../utils/common.util'\nimport { checkPatternsValidity } from '../../utils/validation.util'\nimport { generateChipsList } from '../../utils/generateChipsList.util'\nimport { uniquenessError } from './formChipCell.util'\nimport { useChipCell } from '../../hooks'\n\nimport './formChipCell.scss'\n\nlet FormChipCell = ({\n  chipOptions = {\n    background: 'purple',\n    boldValue: false,\n    borderRadius: 'primary',\n    borderColor: 'transparent',\n    density: 'dense',\n    font: 'purple'\n  },\n  className = '',\n  children,\n  delimiter = null,\n  formState,\n  initialValues,\n  isDeletable = false,\n  isEditable = false,\n  label = null,\n  name,\n  onClick = () => {},\n  onExitEditModeCallback = null,\n  shortChips = false,\n  validationRules = {},\n  validator = null,\n  visibleChipsMaxLength = null,\n  withInitialParentWidth = false\n}) => {\n  const chipsClassName = classnames('chips', className)\n  const [chipSizeIsRecalculated, setChipSizeIsRecalculated] = useState(false)\n  const {\n    chipsCellRef,\n    chipsWrapperRef,\n    handleShowElements,\n    hiddenChipsCounterRef,\n    hiddenChipsPopUpRef,\n    setChipsSizes,\n    setShowHiddenChips,\n    showChips,\n    showHiddenChips,\n    visibleChipsCount\n  } = useChipCell(isEditable, visibleChipsMaxLength, withInitialParentWidth)\n\n  const [editConfig, setEditConfig] = useState({\n    chipIndex: null,\n    isEdit: false,\n    isKeyFocused: false,\n    isValueFocused: false,\n    isNewChip: false\n  })\n\n  let chips = useMemo(() => {\n    return isEditable || visibleChipsMaxLength === 'all'\n      ? {\n          visibleChips: get(formState.values, name),\n          hiddenChips: []\n        }\n      : generateChipsList(\n          get(formState.values, name),\n          visibleChipsMaxLength ? visibleChipsMaxLength : visibleChipsCount\n        )\n  }, [visibleChipsMaxLength, isEditable, visibleChipsCount, formState.values, name])\n\n  const checkChipsList = useCallback(\n    currentChipsList => {\n      if (areArraysEqual(get(initialValues, name), currentChipsList, ['id'])) {\n        set(formState.initialValues, name, currentChipsList)\n      }\n\n      formState.form.mutators.setFieldState(name, { modified: true })\n      formState.form.mutators.setFieldState(name, { touched: true })\n    },\n    [initialValues, name, formState]\n  )\n\n  const handleAddNewChip = useCallback(\n    (event, fields) => {\n      const fieldsLength = fields.value?.length || 0\n\n      if (!editConfig.isEdit && !editConfig.chipIndex) {\n        formState.form.mutators.push(name, {\n          id: fieldsLength + new Date(),\n          key: '',\n          value: '',\n          delimiter: delimiter\n        })\n      }\n\n      if (showHiddenChips) {\n        setShowHiddenChips(false)\n      }\n\n      setEditConfig({\n        chipIndex: fieldsLength,\n        isEdit: true,\n        isKeyFocused: true,\n        isValueFocused: false,\n        isNewChip: true\n      })\n\n      event && event.preventDefault()\n    },\n    [\n      editConfig.isEdit,\n      editConfig.chipIndex,\n      showHiddenChips,\n      formState.form.mutators,\n      name,\n      delimiter,\n      setShowHiddenChips\n    ]\n  )\n\n  const handleRemoveChip = useCallback(\n    (event, fields, chipIndex, isOutsideClick = false) => {\n      checkChipsList(\n        lodash\n          .chain(formState)\n          .get(['values', name])\n          .filter((_, index) => index !== chipIndex)\n          .value()\n      )\n\n      if (fields.length === 1) {\n        formState.form.change(name, [])\n      } else {\n        fields.remove(chipIndex)\n      }\n\n      onExitEditModeCallback && onExitEditModeCallback()\n      event && !isOutsideClick && event.stopPropagation()\n    },\n    [checkChipsList, formState, name, onExitEditModeCallback]\n  )\n\n  const handleEditChip = useCallback(\n    (event, fields, nameEvent, isOutsideClick) => {\n      const { key, value } = fields.value[editConfig.chipIndex]\n      const isChipNotEmpty = !!(key?.trim() && value?.trim())\n\n      if (nameEvent === CLICK) {\n        if (!isChipNotEmpty) {\n          handleRemoveChip(event, fields, editConfig.chipIndex, isOutsideClick)\n        }\n\n        setEditConfig({\n          chipIndex: null,\n          isEdit: false,\n          isKeyFocused: false,\n          isValueFocused: false,\n          isNewChip: false\n        })\n        isChipNotEmpty && onExitEditModeCallback && onExitEditModeCallback()\n      } else if (nameEvent === TAB) {\n        if (!isChipNotEmpty) {\n          handleRemoveChip(event, fields, editConfig.chipIndex)\n        }\n\n        setEditConfig(prevState => {\n          const lastChipSelected = prevState.chipIndex + 1 > fields.value.length - 1\n\n          isChipNotEmpty && lastChipSelected && onExitEditModeCallback && onExitEditModeCallback()\n\n          return {\n            chipIndex: lastChipSelected ? null : prevState.chipIndex + 1,\n            isEdit: !lastChipSelected,\n            isKeyFocused: !lastChipSelected,\n            isValueFocused: false,\n            isNewChip: false\n          }\n        })\n      } else if (nameEvent === TAB_SHIFT) {\n        if (!isChipNotEmpty) {\n          handleRemoveChip(event, fields, editConfig.chipIndex)\n        }\n\n        setEditConfig(prevState => {\n          const firstChipIsSelected = prevState.chipIndex === 0\n\n          isChipNotEmpty &&\n            firstChipIsSelected &&\n            onExitEditModeCallback &&\n            onExitEditModeCallback()\n\n          return {\n            chipIndex: firstChipIsSelected ? null : prevState.chipIndex - 1,\n            isEdit: !firstChipIsSelected,\n            isKeyFocused: false,\n            isValueFocused: !firstChipIsSelected,\n            isNewChip: false\n          }\n        })\n      }\n\n      checkChipsList(get(formState.values, name))\n\n      if (\n        (editConfig.chipIndex > 0 && editConfig.chipIndex < fields.value.length - 1) ||\n        (fields.value.length > 1 && editConfig.chipIndex === 0 && nameEvent !== TAB_SHIFT) ||\n        (fields.value.length > 1 &&\n          editConfig.chipIndex === fields.value.length - 1 &&\n          nameEvent !== TAB)\n      ) {\n        event && event.preventDefault()\n      }\n    },\n    [\n      editConfig.chipIndex,\n      checkChipsList,\n      formState.values,\n      name,\n      onExitEditModeCallback,\n      handleRemoveChip\n    ]\n  )\n\n  const handleToEditMode = useCallback(\n    (event, chipIndex, keyName) => {\n      if (isEditable) {\n        const { clientX: pointerCoordinateX, clientY: pointerCoordinateY } = event\n        let isKeyClicked = false\n        const isClickedInsideInputElement = (\n          pointerCoordinateX,\n          pointerCoordinateY,\n          inputElement\n        ) => {\n          if (inputElement) {\n            const {\n              top: topPosition,\n              left: leftPosition,\n              right: rightPosition,\n              bottom: bottomPosition\n            } = inputElement.getBoundingClientRect()\n            if (pointerCoordinateX > rightPosition || pointerCoordinateX < leftPosition)\n              return false\n            if (pointerCoordinateY > bottomPosition || pointerCoordinateY < topPosition)\n              return false\n\n            return true\n          }\n        }\n        event.stopPropagation()\n\n        if (event.target.nodeName !== 'INPUT') {\n          if (event.target.firstElementChild) {\n            isKeyClicked = isClickedInsideInputElement(\n              pointerCoordinateX,\n              pointerCoordinateY,\n              event.target.firstElementChild\n            )\n          }\n        } else {\n          isKeyClicked = event.target.name === keyName\n        }\n\n        setEditConfig(preState => ({\n          ...preState,\n          chipIndex,\n          isEdit: true,\n          isKeyFocused: isKeyClicked,\n          isValueFocused: !isKeyClicked\n        }))\n      }\n\n      onClick && onClick()\n    },\n    [isEditable, onClick]\n  )\n\n  const validateFields = fieldsArray => {\n    if (!fieldsArray) return null\n\n    let errorData = []\n\n    const uniquenessValidator = (newValue, idx) => {\n      return !fieldsArray.some(({ key }, index) => {\n        return newValue === key && index !== idx\n      })\n    }\n\n    if (!isEmpty(validationRules)) {\n      errorData = fieldsArray.map(chip => {\n        const [keyValidation, valueValidation] = validateChip(chip)\n\n        if (keyValidation && valueValidation) return { key: keyValidation, value: valueValidation }\n\n        if (keyValidation) return { key: keyValidation }\n\n        if (valueValidation) return { value: valueValidation }\n\n        return null\n      })\n    }\n\n    // uniqueness\n    fieldsArray.forEach((chip, index) => {\n      const isUnique = uniquenessValidator(chip.key, index)\n\n      if (!isUnique) {\n        if (get(errorData, [index, 'key'], false)) {\n          errorData.at(index).key.push(uniquenessError)\n        } else {\n          set(errorData, [index, 'key'], [uniquenessError])\n        }\n      }\n    })\n\n    if (isEmpty(errorData) && validator) {\n      errorData = validator(fieldsArray)\n    }\n\n    if (errorData.every(label => isNil(label))) {\n      return null\n    }\n\n    return errorData\n  }\n\n  const validateChip = ({ key, value, disabled }) => {\n    const validateField = (value, field) => {\n      const [newRules, isValidField] = checkPatternsValidity(\n        validationRules[field].filter(rule => rule.pattern),\n        value\n      )\n\n      if (isValidField) return null\n\n      const invalidRules = newRules.filter(rule => !rule.isValid)\n\n      return invalidRules.map(rule => ({ name: rule.name, label: rule.label }))\n    }\n\n    return disabled ? [null, null] : [validateField(key, 'key'), validateField(value, 'value')]\n  }\n\n  return (\n    <div className={chipsClassName} data-testid={`${name}-chips`}>\n      {label && <div className=\"chips__label\">{label}</div>}\n      <div className={label ? 'chips__wrapper' : ''}>\n        <FormChipCellView\n          chipOptions={chipOptions}\n          chipSizeIsRecalculated={chipSizeIsRecalculated}\n          chips={chips}\n          editConfig={editConfig}\n          formState={formState}\n          handleAddNewChip={handleAddNewChip}\n          handleEditChip={handleEditChip}\n          handleRemoveChip={handleRemoveChip}\n          handleShowElements={handleShowElements}\n          handleToEditMode={handleToEditMode}\n          isDeletable={isDeletable}\n          isEditable={isEditable}\n          name={name}\n          ref={{ chipsCellRef, chipsWrapperRef, hiddenChipsCounterRef, hiddenChipsPopUpRef }}\n          setChipSizeIsRecalculated={setChipSizeIsRecalculated}\n          setChipsSizes={setChipsSizes}\n          setEditConfig={setEditConfig}\n          shortChips={shortChips}\n          showChips={showChips}\n          showHiddenChips={showHiddenChips}\n          validateFields={validateFields}\n          validationRules={validationRules}\n          visibleChipsMaxLength={visibleChipsMaxLength}\n        >\n          {children}\n        </FormChipCellView>\n      </div>\n    </div>\n  )\n}\n\nFormChipCell.propTypes = {\n  chipOptions: CHIP_OPTIONS,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  delimiter: PropTypes.oneOfType([PropTypes.string, PropTypes.element]),\n  formState: PropTypes.object.isRequired,\n  initialValues: PropTypes.object.isRequired,\n  isDeletable: PropTypes.bool,\n  isEditable: PropTypes.bool,\n  label: PropTypes.string,\n  name: PropTypes.string.isRequired,\n  onClick: PropTypes.func,\n  onExitEditModeCallback: PropTypes.func,\n  shortChips: PropTypes.bool,\n  validationRules: PropTypes.object,\n  validator: PropTypes.func,\n  visibleChipsMaxLength: VISIBLE_CHIPS_MAX_LENGTH,\n  withInitialParentWidth: PropTypes.bool\n}\n\nFormChipCell = React.memo(FormChipCell)\n\nexport default FormChipCell\n"],"names":["FormChipCell","chipOptions","className","children","delimiter","formState","initialValues","isDeletable","isEditable","label","name","onClick","onExitEditModeCallback","shortChips","validationRules","validator","visibleChipsMaxLength","withInitialParentWidth","chipsClassName","classnames","chipSizeIsRecalculated","setChipSizeIsRecalculated","useState","chipsCellRef","chipsWrapperRef","handleShowElements","hiddenChipsCounterRef","hiddenChipsPopUpRef","setChipsSizes","setShowHiddenChips","showChips","showHiddenChips","visibleChipsCount","useChipCell","editConfig","setEditConfig","chips","useMemo","get","generateChipsList","checkChipsList","useCallback","currentChipsList","areArraysEqual","set","handleAddNewChip","event","fields","fieldsLength","_a","handleRemoveChip","chipIndex","isOutsideClick","lodash","_","index","handleEditChip","nameEvent","key","value","isChipNotEmpty","CLICK","TAB","prevState","lastChipSelected","TAB_SHIFT","firstChipIsSelected","handleToEditMode","keyName","pointerCoordinateX","pointerCoordinateY","isKeyClicked","isClickedInsideInputElement","inputElement","topPosition","leftPosition","rightPosition","bottomPosition","preState","validateFields","fieldsArray","errorData","uniquenessValidator","newValue","idx","isEmpty","chip","keyValidation","valueValidation","validateChip","uniquenessError","isNil","disabled","validateField","field","newRules","isValidField","checkPatternsValidity","rule","jsx","FormChipCellView","CHIP_OPTIONS","PropTypes","VISIBLE_CHIPS_MAX_LENGTH","React","FormChipCell$1"],"mappings":"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"}