UNPKG

strapi-plugin-users-permissions

Version:

Protect your API with a full-authentication process based on JWT

117 lines (105 loc) 3.54 kB
import React, { useCallback, useMemo } from 'react'; import { get } from 'lodash'; import styled from 'styled-components'; import PropTypes from 'prop-types'; import { Flex, Padded, Text, Checkbox } from '@buffetjs/core'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useIntl } from 'react-intl'; import CheckboxWrapper from '../CheckboxWrapper'; import BaselineAlignment from '../BaselineAlignment'; import SubCategoryWrapper from './SubCategoryWrapper'; import { useUsersPermissions } from '../../../../contexts/UsersPermissionsContext'; import PolicyWrapper from './PolicyWrapper'; const Border = styled.div` flex: 1; align-self: center; border-top: 1px solid #f6f6f6; padding: 0px 10px; `; const SubCategory = ({ subCategory }) => { const { formatMessage } = useIntl(); const { onChange, onChangeSelectAll, onSelectedAction, selectedAction, modifiedData, } = useUsersPermissions(); const currentScopedModifiedData = useMemo(() => { return get(modifiedData, subCategory.name, {}); }, [modifiedData, subCategory]); const hasAllActionsSelected = useMemo(() => { return Object.values(currentScopedModifiedData).every(action => action.enabled === true); }, [currentScopedModifiedData]); const hasSomeActionsSelected = useMemo(() => { return ( Object.values(currentScopedModifiedData).some(action => action.enabled === true) && !hasAllActionsSelected ); }, [currentScopedModifiedData, hasAllActionsSelected]); const handleChangeSelectAll = useCallback( ({ target: { name } }) => { onChangeSelectAll({ target: { name, value: !hasAllActionsSelected } }); }, [hasAllActionsSelected, onChangeSelectAll] ); const isActionSelected = useCallback( actionName => { return selectedAction === actionName; }, [selectedAction] ); return ( <SubCategoryWrapper> <Flex justifyContent="space-between" alignItems="center"> <Padded right size="sm"> <Text lineHeight="18px" color="#919bae" fontWeight="bold" fontSize="xs" textTransform="uppercase" > {subCategory.label} </Text> </Padded> <Border /> <Padded left size="sm"> <BaselineAlignment /> <Checkbox name={subCategory.name} message={formatMessage({ id: 'app.utils.select-all' })} onChange={handleChangeSelectAll} someChecked={hasSomeActionsSelected} value={hasAllActionsSelected} /> </Padded> </Flex> <BaselineAlignment /> <Padded top size="xs"> <Flex flexWrap="wrap"> {subCategory.actions.map(action => { const name = `${action.name}.enabled`; return ( <CheckboxWrapper isActive={isActionSelected(action.name)} key={action.name}> <Checkbox value={get(modifiedData, name, false)} name={name} message={action.label} onChange={onChange} /> <PolicyWrapper onClick={() => onSelectedAction(action.name)}> <FontAwesomeIcon icon="cog" /> </PolicyWrapper> </CheckboxWrapper> ); })} </Flex> </Padded> </SubCategoryWrapper> ); }; SubCategory.propTypes = { subCategory: PropTypes.object.isRequired, }; export default SubCategory;