diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ActionRow/Wrapper.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ActionRow/Wrapper.js new file mode 100644 index 0000000000..58e1dd827d --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ActionRow/Wrapper.js @@ -0,0 +1,11 @@ +import styled from 'styled-components'; + +const Wrapper = styled.div` + display: flex; + height: 36px; + border-radius: 2px; + margin-bottom: 18px; + background-color: ${({ theme, isGrey }) => (isGrey ? '#fafafb' : theme.main.colors.white)}; +`; + +export default Wrapper; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ActionRow/index.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ActionRow/index.js new file mode 100644 index 0000000000..d890cbf2a9 --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ActionRow/index.js @@ -0,0 +1,83 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { Text, Padded, Flex } from '@buffetjs/core'; +import { useIntl } from 'react-intl'; +// import { usePermissionsDataManager } from '../contexts/PermissionsDataManagerContext'; + +import ConditionsSelect from '../ConditionsSelect'; +import Wrapper from './Wrapper'; + +const ActionRow = ({ + arrayOfOptionsGroupedByCategory, + isGrey, + label, + name, + onCategoryChange, + onChange, + value, +}) => { + const { formatMessage } = useIntl(); + + return ( + + + + + {formatMessage({ + id: 'Settings.permissions.conditions.can', + })} +   + + + {label} + + +   + {formatMessage({ + id: 'Settings.permissions.conditions.when', + })} + + + + + + ); +}; + +ActionRow.propTypes = { + arrayOfOptionsGroupedByCategory: PropTypes.array.isRequired, + isGrey: PropTypes.bool.isRequired, + label: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + value: PropTypes.object.isRequired, + onCategoryChange: PropTypes.func.isRequired, + onChange: PropTypes.func.isRequired, +}; +export default ActionRow; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/ClearIndicator.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/ClearIndicator.js new file mode 100644 index 0000000000..b24f77bdd6 --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/ClearIndicator.js @@ -0,0 +1,15 @@ +import React from 'react'; +import { Remove } from '@buffetjs/icons'; +import { components } from 'react-select'; + +const ClearIndicator = props => { + const Component = components.ClearIndicator; + + return ( + + + + ); +}; + +export default ClearIndicator; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/CustomDropdownIndicator.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/CustomDropdownIndicator.js new file mode 100644 index 0000000000..628b29aa46 --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/CustomDropdownIndicator.js @@ -0,0 +1,39 @@ +import React from 'react'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { Flex } from '@buffetjs/core'; +import styled from 'styled-components'; +import PropTypes from 'prop-types'; + +const Wrapper = styled(Flex)` + height: 100%; + width: 32px; + background: #fafafb; + > svg { + align-self: center; + font-size: 11px; + color: #b3b5b9; + } +`; + +const DropdownIndicator = ({ selectProps: { menuIsOpen } }) => { + const icon = menuIsOpen ? 'caret-up' : 'caret-down'; + + return ( + + + + ); +}; + +DropdownIndicator.propTypes = { + selectProps: PropTypes.shape({ + menuIsOpen: PropTypes.bool.isRequired, + }).isRequired, +}; + +Wrapper.defaultProps = { + flexDirection: 'column', + justifyContent: 'center', +}; + +export default DropdownIndicator; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/IndicatorSeparator.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/IndicatorSeparator.js new file mode 100644 index 0000000000..458dd41265 --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/IndicatorSeparator.js @@ -0,0 +1,3 @@ +const IndicatorSeparator = () => null; + +export default IndicatorSeparator; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/SubUl.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/SubUl.js new file mode 100644 index 0000000000..283d99db4b --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/SubUl.js @@ -0,0 +1,48 @@ +/* eslint-disable jsx-a11y/click-events-have-key-events */ +import React from 'react'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; +import { Collapse } from 'reactstrap'; + +const ToggleUl = styled(Collapse)` + font-size: 13px; + padding: 12px 15px 0 15px; + list-style: none; + background-color: #fff; + > li { + padding-top: 5px; + label { + cursor: pointer; + } + + .check-wrapper { + z-index: 9; + > input { + z-index: 1; + } + } + } + > li:not(:last-child) { + padding-bottom: 12px; + } +`; + +const SubUl = ({ children, isOpen }) => { + return ( + + {children} + + ); +}; + +SubUl.defaultProps = { + children: null, + isOpen: false, +}; + +SubUl.propTypes = { + children: PropTypes.node, + isOpen: PropTypes.bool, +}; + +export default SubUl; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/Ul.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/Ul.js new file mode 100644 index 0000000000..f94b2bce92 --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/Ul.js @@ -0,0 +1,80 @@ +/* eslint-disable indent */ +/* eslint-disable jsx-a11y/click-events-have-key-events */ +import styled from 'styled-components'; + +const Ul = styled.ul` + max-height: 150px; + font-size: 13px; + padding: 0 15px; + margin-bottom: 0px; + list-style: none; + background-color: #fff; + > li { + label { + flex-shrink: 1; + width: fit-content !important; + cursor: pointer; + margin-bottom: 0px; + } + + .check-wrapper { + z-index: 9; + > input { + z-index: 1; + } + } + .chevron { + margin: auto; + + font-size: 11px; + color: #919bae; + } + } + .li-multi-menu { + margin-bottom: -3px; + } + .li { + line-height: 27px; + position: relative; + > p { + margin: 0; + } + + &:hover { + > p::after { + content: attr(datadescr); + position: absolute; + left: 0; + color: #007eff; + font-weight: 700; + z-index: 100; + } + &::after { + content: ''; + position: absolute; + z-index: 1; + top: 0; + left: -30px; + right: -30px; + bottom: 0; + background-color: #e6f0fb; + } + } + } + ${({ disabled, theme }) => + disabled && + ` + label { + cursor: not-allowed !important; + } + input[type='checkbox'] { + cursor: not-allowed; + &:after { + cursor: not-allowed; + color: ${theme.main.colors.grey}; + } + } + `} +`; + +export default Ul; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/UpperFirst.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/UpperFirst.js new file mode 100644 index 0000000000..33905c788c --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/UpperFirst.js @@ -0,0 +1,6 @@ +/* eslint-disable jsx-a11y/click-events-have-key-events */ +import { upperFirst } from 'lodash'; + +const UpperFirst = ({ content }) => upperFirst(content); + +export default UpperFirst; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/index.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/index.js new file mode 100644 index 0000000000..3551e9a000 --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/index.js @@ -0,0 +1,139 @@ +/* eslint-disable jsx-a11y/click-events-have-key-events */ +import React, { useState, useMemo } from 'react'; +import PropTypes from 'prop-types'; +import { components } from 'react-select'; +import { get } from 'lodash'; +import { Checkbox, Flex } from '@buffetjs/core'; +import { Label } from '@buffetjs/styles'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import SubUl from './SubUl'; +import Ul from './Ul'; +import UpperFirst from './UpperFirst'; +import { getCheckboxState } from '../../../utils'; +import createCollapsesObject from './utils/createCollapsesObject'; + +/* eslint-disable jsx-a11y/no-static-element-interactions */ + +const MenuList = ({ selectProps, ...rest }) => { + const Component = components.MenuList; + const { arrayOfOptionsGroupedByCategory } = selectProps; + + const initCollapses = useMemo(() => createCollapsesObject(arrayOfOptionsGroupedByCategory), [ + arrayOfOptionsGroupedByCategory, + ]); + const [collapses, setCollapses] = useState(initCollapses); + + const toggleCollapse = collapseName => { + setCollapses(prevState => ({ ...prevState, [collapseName]: !collapses[collapseName] })); + }; + + return ( + + + + ); +}; + +MenuList.propTypes = { + selectProps: PropTypes.shape({ + arrayOfOptionsGroupedByCategory: PropTypes.array.isRequired, + name: PropTypes.string.isRequired, + onCategoryChange: PropTypes.func.isRequired, + onChange: PropTypes.func.isRequired, + value: PropTypes.object.isRequired, + }).isRequired, +}; +export default MenuList; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/utils/createCollapsesObject.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/utils/createCollapsesObject.js new file mode 100644 index 0000000000..d4415243a4 --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/MenuList/utils/createCollapsesObject.js @@ -0,0 +1,8 @@ +const createCollapsesObject = arrayOfCategories => + arrayOfCategories.reduce((acc, current, index) => { + acc[current[0]] = index === 0; + + return acc; + }, {}); + +export default createCollapsesObject; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/SingleValue.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/SingleValue.js new file mode 100644 index 0000000000..9706264aaa --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/SingleValue.js @@ -0,0 +1,46 @@ +/* eslint-disable indent */ +import React from 'react'; +import PropTypes from 'prop-types'; +import { components } from 'react-select'; +import { Text } from '@buffetjs/core'; +import { useIntl } from 'react-intl'; +import { createArrayOfValues } from '../../utils'; + +const Value = ({ children, selectProps, ...props }) => { + const { formatMessage } = useIntl(); + const SingleValue = components.SingleValue; + const valuesArray = createArrayOfValues(selectProps.value).filter(val => val); + + return ( + + + {valuesArray.length === 0 + ? 'Anytime' + : formatMessage( + { + id: `Settings.permissions.conditions.selected.${ + selectProps.value.length > 1 ? 'plural' : 'singular' + }`, + }, + { number: valuesArray.length } + )} + + + ); +}; + +Value.defaultProps = { + children: null, + selectProps: { + value: [], + }, +}; + +Value.propTypes = { + children: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]), + selectProps: PropTypes.shape({ + value: PropTypes.object, + }), +}; + +export default Value; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/StyledOption.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/StyledOption.js new file mode 100644 index 0000000000..ab93a6ffbd --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/StyledOption.js @@ -0,0 +1,11 @@ +import styled from 'styled-components'; +import { Option } from '@buffetjs/core'; + +const StyledOption = styled(Option)` + > span { + display: block !important; + color: #007eff !important; + } +`; + +export default StyledOption; diff --git a/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/index.js b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/index.js new file mode 100644 index 0000000000..fa31243220 --- /dev/null +++ b/packages/strapi-admin/ee/admin/containers/Roles/CreatePage/ConditionsModal/ConditionsSelect/index.js @@ -0,0 +1,69 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; +import Select from 'react-select'; +import { useIntl } from 'react-intl'; +import MenuList from './MenuList'; +import ClearIndicator from './ClearIndicator'; +import DropdownIndicator from './CustomDropdownIndicator'; +import IndicatorSeparator from './IndicatorSeparator'; +import SingleValue from './SingleValue'; +import selectStyle from '../utils/selectStyle'; + +const Wrapper = styled.div` + padding-left: 30px; + width: 60%; + cursor: ${({ disabled }) => (disabled ? 'not-allowed' : 'default')}; +`; + +const ConditionsSelect = ({ + arrayOfOptionsGroupedByCategory, + name, + onCategoryChange, + onChange, + value, +}) => { + const { formatMessage } = useIntl(); + + return ( + +