{"version":3,"file":"CheckboxGroup.mjs","names":["React","useCallback","useEffect","useMemo","useState","clsx","ChevronDownIcon","FormControlLabel","FormGroup","makeStyles","isEmpty","FluentCheckbox","FluentIconButton","getChildrenObjectsWithNoChildren","useStyles","theme","expand","transform","transition","transitions","create","duration","shortest","expandOpen","iconButtonWrapper","borderRadius","margin","expandedList","marginLeft","spacing","display","flexDirection","checkboxGroup","justifyContent","CheckboxGroup","props","title","options","onChange","defaultExpandedListState","values","valueKey","checkedItems","setCheckedItems","checkedParent","setCheckedParent","expanded","setExpanded","parentIndeterminate","setParentIndeterminate","classes","preCheckedItems","forEach","option","length","value","includes","childrenValues","checkedAll","every","val","Object","checked","some","handleOnClickChildCheckboxOnChange","event","preVal","target","name","filter","handleParentCheckboxOnChange","newItemToAdd","push","childrenList","map"],"sources":["../../../../src/UI/mapLayout/ui/CheckboxGroup.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport clsx from 'clsx';\nimport { ChevronDownIcon } from '@fluentui/react-icons';\nimport { FormControlLabel, FormGroup, makeStyles } from '@material-ui/core';\nimport { isEmpty } from 'lodash-es';\nimport { FluentCheckbox } from '../../inputs/checkbox/FluentCheckbox';\nimport { FluentIconButton } from '../../inputs/buttons/FluentIconButton';\nimport { getChildrenObjectsWithNoChildren } from '../utilities/MapUtilities';\n\nconst useStyles = makeStyles((theme) => ({\n  expand: {\n    transform: 'rotate(0deg)',\n    transition: theme.transitions.create('transform', {\n      duration: theme.transitions.duration.shortest\n    })\n  },\n  expandOpen: {\n    transform: 'rotate(180deg)'\n  },\n  iconButtonWrapper: {\n    borderRadius: 2,\n    margin: 'auto 0px'\n  },\n  expandedList: {\n    marginLeft: theme.spacing(4),\n    display: 'flex',\n    flexDirection: 'column'\n  },\n  checkboxGroup: {\n    display: 'flex',\n    justifyContent: 'space-between'\n  }\n}));\n\nexport const CheckboxGroup = (props) => {\n  const {\n    title,\n    options,\n    onChange,\n    defaultExpandedListState = true,\n    values,\n    valueKey\n  } = props;\n  const [checkedItems, setCheckedItems] = useState({});\n  const [checkedParent, setCheckedParent] = useState(false);\n  const [expanded, setExpanded] = useState(defaultExpandedListState);\n  const [parentIndeterminate, setParentIndeterminate] = useState(false);\n  const classes = useStyles();\n\n  useEffect(() => {\n      let preCheckedItems = {};\n      options?.forEach((option) => {\n        if(!!!option?.options || option?.options?.length === 0) {\n          preCheckedItems[option.value] = values?.includes(option.value);\n        }\n      });\n      setCheckedItems(preCheckedItems);\n  }, [options, values]);\n\n  //get a list of child values\n  const childrenValues = useMemo(() => {\n    return getChildrenObjectsWithNoChildren(options ?? [], 'value');\n  }, [options]);\n\n  useEffect(() => {\n    const checkedAll = isEmpty(checkedItems)\n      ? (childrenValues?.length > 0 &&\n          childrenValues?.every((val) => values.includes(val))) ??\n        false\n      : Object.values(checkedItems)?.every((checked) => checked);\n\n    setCheckedParent(checkedAll);\n\n    setParentIndeterminate(\n      !checkedAll &&\n        (isEmpty(checkedItems)\n          ? childrenValues?.some((val) => values.includes(val))\n          : Object.values(checkedItems)?.some((checked) => checked))\n    );\n  }, [checkedItems, childrenValues, title, values]);\n\n  const handleOnClickChildCheckboxOnChange = useCallback(\n    (event) => {\n      setCheckedItems((preVal) => ({\n        ...preVal,\n        [event?.target?.name]: event?.target?.checked\n      }));\n\n      if (!event?.target?.checked) {\n        onChange(values?.filter((val) => val !== event?.target?.name));\n      } else {\n        onChange([...values, event?.target?.name]);\n      }\n    },\n    [onChange, values]\n  );\n\n  const handleParentCheckboxOnChange = useCallback(\n    (event) => {\n      setCheckedParent(event?.target?.checked);\n      if (!event?.target?.checked) {\n        setCheckedItems({});\n\n        onChange(\n          values?.filter((val) => {\n            return !childrenValues?.includes(val);\n          })\n        );\n      }\n\n      let newItemToAdd = [];\n      childrenValues.forEach((option) => {\n        if (event?.target?.checked && option && !values?.includes(option)) {\n          newItemToAdd.push(option);\n        }\n      });\n\n      if (newItemToAdd.length > 0) {\n        onChange([...values, ...newItemToAdd]);\n      }\n      setExpanded(true);\n      setParentIndeterminate(false);\n    },\n    [childrenValues, onChange, values]\n  );\n\n  const childrenList = useMemo(() => {\n    if (options?.length > 0) {\n      return options?.map((option) => {\n        if (option?.options?.length > 0) {\n          return (\n            <CheckboxGroup\n              key={option?.value}\n              title={option?.title}\n              options={option?.options}\n              values={values}\n              valueKey={option?.value}\n              onChange={onChange}\n            />\n          );\n        }\n\n        return (\n          <FormControlLabel\n            label={option?.title}\n            control={\n              <FluentCheckbox\n                checked={checkedItems[option?.value] || false}\n                onChange={handleOnClickChildCheckboxOnChange}\n              />\n            }\n            name={option?.value}\n          />\n        );\n      });\n    }\n    return [];\n  }, [\n    checkedItems,\n    handleOnClickChildCheckboxOnChange,\n    onChange,\n    options,\n    values\n  ]);\n\n  return (\n    <FormGroup>\n      {options?.length > 0 ? (\n        <div className={classes.checkboxGroup}>\n          <FormControlLabel\n            label={title}\n            control={\n              <FluentCheckbox\n                checked={checkedParent}\n                indeterminate={parentIndeterminate}\n                onChange={handleParentCheckboxOnChange}\n              />\n            }\n          />\n\n          <FluentIconButton\n            className={clsx(\n              classes.expand,\n              {\n                [classes.expandOpen]: expanded\n              },\n              classes.iconButtonWrapper\n            )}\n            onClick={() => setExpanded(!expanded)}\n            icon={ChevronDownIcon}\n          />\n        </div>\n      ) : (\n        <div>\n          <FormControlLabel\n            label={title}\n            control={\n              <FluentCheckbox\n                checked={checkedItems[valueKey] || false}\n                onChange={handleOnClickChildCheckboxOnChange}\n                name={valueKey}\n              />\n            }\n          />\n        </div>\n      )}\n      {expanded && options?.length > 0 && (\n        <div className={classes.expandedList}>{childrenList}</div>\n      )}\n    </FormGroup>\n  );\n};\n"],"mappings":"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"}