mirror of
https://github.com/strapi/strapi.git
synced 2025-10-27 16:10:08 +00:00
move to ds accordion
This commit is contained in:
parent
fddb6fffe0
commit
7a68a06082
@ -7,8 +7,6 @@ import styled from 'styled-components';
|
||||
|
||||
const Wrapper = styled.div`
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
padding-right: ${({ theme }) => theme.spaces[6]};
|
||||
|
||||
${({ hasConditions, disabled, theme }) =>
|
||||
hasConditions &&
|
||||
@ -26,12 +24,12 @@ const Wrapper = styled.div`
|
||||
`}
|
||||
`;
|
||||
|
||||
const ConditionsButton = ({ onClick, className, hasConditions }) => {
|
||||
const ConditionsButton = ({ onClick, className, hasConditions, variant }) => {
|
||||
const { formatMessage } = useIntl();
|
||||
|
||||
return (
|
||||
<Wrapper hasConditions={hasConditions} className={className}>
|
||||
<Button variant="secondary" startIcon={<Settings />} onClick={onClick}>
|
||||
<Button variant={variant} startIcon={<Settings />} onClick={onClick}>
|
||||
{formatMessage({ id: 'app.components.LeftMenuLinkContainer.settings' })}
|
||||
</Button>
|
||||
</Wrapper>
|
||||
@ -41,11 +39,13 @@ const ConditionsButton = ({ onClick, className, hasConditions }) => {
|
||||
ConditionsButton.defaultProps = {
|
||||
className: null,
|
||||
hasConditions: false,
|
||||
variant: 'secondary',
|
||||
};
|
||||
ConditionsButton.propTypes = {
|
||||
onClick: PropTypes.func.isRequired,
|
||||
className: PropTypes.string,
|
||||
hasConditions: PropTypes.bool,
|
||||
variant: PropTypes.string,
|
||||
};
|
||||
|
||||
// This is a styled component advanced usage :
|
||||
|
||||
@ -137,7 +137,7 @@ const Collapse = ({
|
||||
<Chevron paddingLeft={2}>{isActive ? <Up /> : <Down />}</Chevron>
|
||||
</RowLabelWithCheckbox>
|
||||
|
||||
<Row>
|
||||
<Row style={{ flex: 1 }}>
|
||||
{checkboxesActions.map(
|
||||
({
|
||||
actionId,
|
||||
@ -196,10 +196,12 @@ const Collapse = ({
|
||||
}
|
||||
)}
|
||||
</Row>
|
||||
<ConditionsButton
|
||||
onClick={handleToggleModalIsOpen}
|
||||
hasConditions={doesConditionButtonHasConditions}
|
||||
/>
|
||||
<Box paddingRight={6}>
|
||||
<ConditionsButton
|
||||
onClick={handleToggleModalIsOpen}
|
||||
hasConditions={doesConditionButtonHasConditions}
|
||||
/>
|
||||
</Box>
|
||||
{modalState.isMounted && (
|
||||
<ConditionsModal
|
||||
headerBreadCrumbs={[label, 'app.components.LeftMenuLinkContainer.settings']}
|
||||
|
||||
@ -1,10 +0,0 @@
|
||||
import styled from 'styled-components';
|
||||
|
||||
const ListWrapper = styled.div`
|
||||
background-color: ${({ theme }) => theme.main.colors.white};
|
||||
border-bottom-left-radius: ${({ theme }) => theme.main.sizes.borderRadius};
|
||||
border-bottom-right-radius: ${({ theme }) => theme.main.sizes.borderRadius};
|
||||
padding: 1.8rem 0;
|
||||
`;
|
||||
|
||||
export default ListWrapper;
|
||||
@ -1,28 +0,0 @@
|
||||
import styled from 'styled-components';
|
||||
import { Text } from '@buffetjs/core';
|
||||
|
||||
const activeStyle = theme => `
|
||||
background-color: ${theme.main.colors.lightestBlue};
|
||||
border: 1px solid ${theme.main.colors.darkBlue};
|
||||
${Text} {
|
||||
color: ${theme.main.colors.mediumBlue};
|
||||
}
|
||||
svg {
|
||||
color: ${theme.main.colors.mediumBlue};
|
||||
}
|
||||
`;
|
||||
|
||||
const RowStyle = styled.div`
|
||||
height: 5.4rem;
|
||||
padding: 1rem 3rem;
|
||||
border: 1px solid transparent;
|
||||
background-color: ${({ theme, isWhite }) => theme.main.colors[isWhite ? 'white' : 'lightGrey']};
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
background-color: ${({ theme }) => theme.main.colors.lightestBlue};
|
||||
${({ theme }) => activeStyle(theme)};
|
||||
}
|
||||
${({ isActive, theme }) => isActive && activeStyle(theme)};
|
||||
`;
|
||||
|
||||
export default RowStyle;
|
||||
@ -1,11 +1,9 @@
|
||||
import React, { useMemo } from 'react';
|
||||
import { Flex, Text } from '@buffetjs/core';
|
||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
||||
import { PermissionsWrapper, RowContainer } from '@strapi/helper-plugin';
|
||||
import { Accordion, AccordionContent, AccordionToggle, Box } from '@strapi/parts';
|
||||
import upperFirst from 'lodash/upperFirst';
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { useMemo } from 'react';
|
||||
import { useIntl } from 'react-intl';
|
||||
import SubCategory from '../SubCategory';
|
||||
import RowStyle from './Wrapper';
|
||||
|
||||
const PermissionRow = ({
|
||||
childrenForm,
|
||||
@ -30,26 +28,18 @@ const PermissionRow = ({
|
||||
}, [name]);
|
||||
|
||||
return (
|
||||
<RowContainer isWhite={isWhite}>
|
||||
<RowStyle isWhite={isWhite} isActive={isOpen} onClick={handleClick}>
|
||||
<Flex alignItems="center" justifyContent="space-between">
|
||||
<div>
|
||||
<Text color="grey" fontWeight="bold" fontSize="xs" textTransform="uppercase">
|
||||
{categoryName}
|
||||
</Text>
|
||||
<Text lineHeight="22px" color="grey">
|
||||
{formatMessage({ id: 'Settings.permissions.category' }, { category: categoryName })}
|
||||
{kind === 'plugins' ? 'plugin' : kind}
|
||||
</Text>
|
||||
</div>
|
||||
<div>
|
||||
<FontAwesomeIcon style={{ width: '11px' }} color="#9EA7B8" icon="chevron-down" />
|
||||
</div>
|
||||
</Flex>
|
||||
</RowStyle>
|
||||
<Accordion expanded={isOpen} toggle={handleClick} id="acc-1">
|
||||
<AccordionToggle
|
||||
title={upperFirst(categoryName)}
|
||||
description={`${formatMessage(
|
||||
{ id: 'Settings.permissions.category' },
|
||||
{ category: categoryName }
|
||||
)} ${kind === 'plugins' ? 'plugin' : kind}`}
|
||||
variant={isWhite ? 'primary' : 'secondary'}
|
||||
/>
|
||||
|
||||
{isOpen && (
|
||||
<PermissionsWrapper isWhite={isWhite}>
|
||||
<AccordionContent>
|
||||
<Box padding={6}>
|
||||
{childrenForm.map(({ actions, subCategoryName, subCategoryId }) => (
|
||||
<SubCategory
|
||||
key={subCategoryName}
|
||||
@ -60,9 +50,9 @@ const PermissionRow = ({
|
||||
pathToData={[...pathToData, subCategoryId]}
|
||||
/>
|
||||
))}
|
||||
</PermissionsWrapper>
|
||||
)}
|
||||
</RowContainer>
|
||||
</Box>
|
||||
</AccordionContent>
|
||||
</Accordion>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@ -1,22 +0,0 @@
|
||||
/* eslint-disable indent */
|
||||
import styled from 'styled-components';
|
||||
|
||||
const CheckboxWrapper = styled.div`
|
||||
min-width: 33%;
|
||||
padding: 0.9rem;
|
||||
height: 3.6rem;
|
||||
position: relative;
|
||||
${({ hasConditions, disabled, theme }) =>
|
||||
hasConditions &&
|
||||
`
|
||||
&:before {
|
||||
content: '•';
|
||||
position: absolute;
|
||||
top: 2px;
|
||||
left: 0px;
|
||||
color: ${disabled ? theme.main.colors.grey : theme.main.colors.mediumBlue};
|
||||
}
|
||||
`}
|
||||
`;
|
||||
|
||||
export default CheckboxWrapper;
|
||||
@ -1,13 +0,0 @@
|
||||
/* eslint-disable indent */
|
||||
import styled from 'styled-components';
|
||||
|
||||
const ConditionsButtonWrapper = styled.div`
|
||||
padding: 0.9rem;
|
||||
${({ hasConditions }) =>
|
||||
hasConditions &&
|
||||
`
|
||||
padding-left: 22px;
|
||||
`}
|
||||
`;
|
||||
|
||||
export default ConditionsButtonWrapper;
|
||||
@ -1,26 +0,0 @@
|
||||
/* eslint-disable indent */
|
||||
import styled from 'styled-components';
|
||||
|
||||
const Wrapper = styled.div`
|
||||
padding-bottom: 2.6rem;
|
||||
input[type='checkbox'] {
|
||||
&:after {
|
||||
color: ${({ theme }) => theme.main.colors.mediumBlue};
|
||||
}
|
||||
}
|
||||
${({ disabled, theme }) =>
|
||||
disabled &&
|
||||
`
|
||||
label {
|
||||
cursor: default !important;
|
||||
color: ${theme.main.colors.grey};
|
||||
}
|
||||
input[type='checkbox'] {
|
||||
&:after {
|
||||
color: ${theme.main.colors.grey};
|
||||
}
|
||||
}
|
||||
`}
|
||||
`;
|
||||
|
||||
export default Wrapper;
|
||||
@ -1,25 +1,39 @@
|
||||
import React, { useMemo, useState } from 'react';
|
||||
import styled from 'styled-components';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Flex, Padded, Text, Checkbox } from '@buffetjs/core';
|
||||
import { Row, Box, TableLabel, Checkbox, Grid, GridItem } from '@strapi/parts';
|
||||
|
||||
import { useIntl } from 'react-intl';
|
||||
import { BaselineAlignment } from '@strapi/helper-plugin';
|
||||
import { get } from 'lodash';
|
||||
import IS_DISABLED from 'ee_else_ce/components/Roles/PluginsAndSettings/SubCategory/utils/constants';
|
||||
import { usePermissionsDataManager } from '../../../../hooks';
|
||||
import { getCheckboxState, removeConditionKeyFromData } from '../../utils';
|
||||
import ConditionsButton from '../../ConditionsButton';
|
||||
import ConditionsModal from '../../ConditionsModal';
|
||||
import CheckboxWrapper from './CheckboxWrapper';
|
||||
import ConditionsButtonWrapper from './ConditionsButtonWrapper';
|
||||
import Wrapper from './Wrapper';
|
||||
import { formatActions, getConditionsButtonState } from './utils';
|
||||
|
||||
const Border = styled.div`
|
||||
flex: 1;
|
||||
align-self: center;
|
||||
border-top: 1px solid #f6f6f6;
|
||||
padding: 0px 10px;
|
||||
border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
|
||||
`;
|
||||
|
||||
const CheckboxWrapper = styled.div`
|
||||
position: relative;
|
||||
${({ hasConditions, disabled, theme }) =>
|
||||
hasConditions &&
|
||||
`
|
||||
&:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -4px;
|
||||
left: -8px;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 20px;
|
||||
background: ${disabled ? theme.colors.neutral100 : theme.colors.primary600};
|
||||
}
|
||||
`}
|
||||
`;
|
||||
|
||||
const SubCategory = ({ categoryName, isFormDisabled, subCategoryName, actions, pathToData }) => {
|
||||
@ -56,61 +70,67 @@ const SubCategory = ({ categoryName, isFormDisabled, subCategoryName, actions, p
|
||||
|
||||
return (
|
||||
<>
|
||||
<Wrapper>
|
||||
<Flex justifyContent="space-between" alignItems="center">
|
||||
<Padded right size="sm">
|
||||
<Text
|
||||
lineHeight="18px"
|
||||
color="#919bae"
|
||||
fontWeight="bold"
|
||||
fontSize="xs"
|
||||
textTransform="uppercase"
|
||||
>
|
||||
{subCategoryName}
|
||||
</Text>
|
||||
</Padded>
|
||||
<Box>
|
||||
<Row justifyContent="space-between" alignItems="center">
|
||||
<Box paddingRight={4}>
|
||||
<TableLabel textColor="neutral600">{subCategoryName}</TableLabel>
|
||||
</Box>
|
||||
<Border />
|
||||
<Padded left size="sm">
|
||||
<BaselineAlignment top size="1px" />
|
||||
<Box paddingLeft={4}>
|
||||
<Checkbox
|
||||
name={pathToData.join('..')}
|
||||
message={formatMessage({ id: 'app.utils.select-all' })}
|
||||
disabled={isFormDisabled || IS_DISABLED}
|
||||
onChange={onChangeParentCheckbox}
|
||||
someChecked={hasSomeActionsSelected}
|
||||
// Keep same signature as packages/core/admin/admin/src/components/Roles/Permissions/index.js l.91
|
||||
onValueChange={value =>
|
||||
onChangeParentCheckbox({
|
||||
target: {
|
||||
name: pathToData.join('..'),
|
||||
value,
|
||||
},
|
||||
})}
|
||||
indeterminate={hasSomeActionsSelected}
|
||||
value={hasAllActionsSelected}
|
||||
/>
|
||||
</Padded>
|
||||
</Flex>
|
||||
<BaselineAlignment top size="1px" />
|
||||
<Padded top size="xs">
|
||||
<Flex flexWrap="wrap">
|
||||
>
|
||||
{formatMessage({ id: 'app.utils.select-all' })}
|
||||
</Checkbox>
|
||||
</Box>
|
||||
</Row>
|
||||
<Row paddingTop={6} paddingBottom={6}>
|
||||
<Grid gap={2} style={{ flex: 1 }}>
|
||||
{formattedActions.map(({ checkboxName, value, action, displayName, hasConditions }) => {
|
||||
return (
|
||||
<CheckboxWrapper
|
||||
disabled={isFormDisabled || IS_DISABLED}
|
||||
hasConditions={hasConditions}
|
||||
key={action}
|
||||
>
|
||||
<Checkbox
|
||||
name={checkboxName}
|
||||
<GridItem col={3} key={action}>
|
||||
<CheckboxWrapper
|
||||
disabled={isFormDisabled || IS_DISABLED}
|
||||
message={displayName}
|
||||
onChange={onChangeSimpleCheckbox}
|
||||
value={value}
|
||||
/>
|
||||
</CheckboxWrapper>
|
||||
hasConditions={hasConditions}
|
||||
>
|
||||
<Checkbox
|
||||
name={checkboxName}
|
||||
disabled={isFormDisabled || IS_DISABLED}
|
||||
// Keep same signature as packages/core/admin/admin/src/components/Roles/Permissions/index.js l.91
|
||||
onValueChange={value =>
|
||||
onChangeSimpleCheckbox({
|
||||
target: {
|
||||
name: checkboxName,
|
||||
value,
|
||||
},
|
||||
})}
|
||||
value={value}
|
||||
>
|
||||
{displayName}
|
||||
</Checkbox>
|
||||
</CheckboxWrapper>
|
||||
</GridItem>
|
||||
);
|
||||
})}
|
||||
</Flex>
|
||||
<ConditionsButtonWrapper disabled={isFormDisabled} hasConditions={doesButtonHasCondition}>
|
||||
<ConditionsButton
|
||||
hasConditions={doesButtonHasCondition}
|
||||
onClick={handleToggleModalIsOpen}
|
||||
/>
|
||||
</ConditionsButtonWrapper>
|
||||
</Padded>
|
||||
</Wrapper>
|
||||
</Grid>
|
||||
<ConditionsButton
|
||||
hasConditions={doesButtonHasCondition}
|
||||
onClick={handleToggleModalIsOpen}
|
||||
variant="tertiary"
|
||||
/>
|
||||
</Row>
|
||||
</Box>
|
||||
{modalState.isMounted && (
|
||||
<ConditionsModal
|
||||
headerBreadCrumbs={[categoryName, subCategoryName]}
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
import React, { useState } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Padded } from '@buffetjs/core';
|
||||
import ListWrapper from './ListWrapper';
|
||||
import { Box } from '@strapi/parts';
|
||||
import PermissionRow from './Row';
|
||||
|
||||
const PluginsAndSettingsPermissions = ({ isFormDisabled, kind, layout }) => {
|
||||
@ -12,25 +11,23 @@ const PluginsAndSettingsPermissions = ({ isFormDisabled, kind, layout }) => {
|
||||
};
|
||||
|
||||
return (
|
||||
<ListWrapper>
|
||||
<Padded left right size="md">
|
||||
{layout.map(({ category, categoryId, childrenForm }, index) => {
|
||||
return (
|
||||
<PermissionRow
|
||||
key={category}
|
||||
childrenForm={childrenForm}
|
||||
kind={kind}
|
||||
isFormDisabled={isFormDisabled}
|
||||
isOpen={openedCategory === category}
|
||||
isWhite={index % 2 === 1}
|
||||
name={category}
|
||||
onOpenCategory={handleOpenCategory}
|
||||
pathToData={[kind, categoryId]}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</Padded>
|
||||
</ListWrapper>
|
||||
<Box padding={6} background="neutral0">
|
||||
{layout.map(({ category, categoryId, childrenForm }, index) => {
|
||||
return (
|
||||
<PermissionRow
|
||||
key={category}
|
||||
childrenForm={childrenForm}
|
||||
kind={kind}
|
||||
isFormDisabled={isFormDisabled}
|
||||
isOpen={openedCategory === category}
|
||||
isWhite={index % 2 === 1}
|
||||
name={category}
|
||||
onOpenCategory={handleOpenCategory}
|
||||
pathToData={[kind, categoryId]}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
import React, { memo } from 'react';
|
||||
import { Box, Checkbox, Text } from '@strapi/parts';
|
||||
import upperFirst from 'lodash/upperFirst';
|
||||
import PropTypes from 'prop-types';
|
||||
import React, { memo } from 'react';
|
||||
import styled from 'styled-components';
|
||||
import { Checkbox, Text, Box } from '@strapi/parts';
|
||||
import CollapseLabel from '../CollapseLabel';
|
||||
import { firstRowWidth } from '../Permissions/utils/constants';
|
||||
|
||||
@ -67,7 +68,7 @@ const RowLabelWithCheckbox = ({
|
||||
role: 'button',
|
||||
})}
|
||||
>
|
||||
<StyledText>{label.charAt(0).toUpperCase() + label.slice(1)}</StyledText>
|
||||
<StyledText>{upperFirst(label)}</StyledText>
|
||||
{children}
|
||||
</CollapseLabel>
|
||||
</Wrapper>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user