import React, { useMemo, useState } from 'react'; import PropTypes from 'prop-types'; import { cloneDeep, get, groupBy, set } from 'lodash'; import { Modal, ModalHeader, ModalFooter } from 'strapi-helper-plugin'; import { Button, Text, Padded } from '@buffetjs/core'; import { useIntl } from 'react-intl'; import createDefaultConditionsForm from './utils/createDefaultConditionsForm'; import ActionRow from './ActionRow'; import Separator from './Separator'; import { usePermissionsDataManager } from '../contexts/PermissionsDataManagerContext'; import updateValues from '../Permissions/utils/updateValues'; const ConditionsModal = ({ actions, headerBreadCrumbs, isOpen, onClosed, onToggle }) => { const { formatMessage } = useIntl(); const { availableConditions, modifiedData } = usePermissionsDataManager(); const arrayOfOptionsGroupedByCategory = useMemo(() => { return Object.entries(groupBy(availableConditions, 'category')); }, [availableConditions]); const actionsToDisplay = actions.filter( ({ isDisplayed, hasSomeActionsSelected, hasAllActionsSelected }) => isDisplayed && (hasSomeActionsSelected || hasAllActionsSelected) ); const initState = useMemo(() => { return createDefaultConditionsForm( actionsToDisplay, modifiedData, arrayOfOptionsGroupedByCategory ); }, [actionsToDisplay, modifiedData, arrayOfOptionsGroupedByCategory]); const [state, setState] = useState(initState); const handleCategoryChange = ({ keys, value }) => { setState(prevState => { const updatedState = cloneDeep(prevState); const objToUpdate = get(prevState, keys, {}); const updatedValues = updateValues(objToUpdate, value); set(updatedState, keys, updatedValues); return updatedState; }); }; const handleChange = ({ keys, value }) => { setState(prevState => { const updatedState = cloneDeep(prevState); set(updatedState, keys, value); return updatedState; }); }; return ( {formatMessage({ id: 'Settings.permissions.conditions.define-conditions', })} {actionsToDisplay.length === 0 && ( {formatMessage({ id: 'Settings.permissions.conditions.no-actions' })} )} {actionsToDisplay.map(({ actionId, label, pathToConditionsObject }, index) => { const name = pathToConditionsObject.join('..'); return ( ); })}
); }; ConditionsModal.propTypes = { actions: PropTypes.arrayOf( PropTypes.shape({ actionId: PropTypes.string.isRequired, checkboxName: PropTypes.string, hasSomeActionsSelected: PropTypes.bool.isRequired, hasAllActionsSelected: PropTypes.bool, isDisplayed: PropTypes.bool.isRequired, label: PropTypes.string, }) ).isRequired, headerBreadCrumbs: PropTypes.arrayOf(PropTypes.string).isRequired, isOpen: PropTypes.bool.isRequired, onClosed: PropTypes.func.isRequired, onToggle: PropTypes.func.isRequired, }; export default ConditionsModal;