Add modal condition button

This commit is contained in:
bulby97 2021-08-20 14:58:25 +02:00
parent 7a68a06082
commit deb6859a56
6 changed files with 132 additions and 118 deletions

View File

@ -1,12 +0,0 @@
import styled from 'styled-components';
const Wrapper = styled.div`
display: flex;
height: 36px;
border-radius: ${({ theme }) => theme.main.sizes.borderRadius};
margin-bottom: 18px;
background-color: ${({ theme, isGrey }) =>
isGrey ? theme.main.colors.content.background : theme.main.colors.white};
`;
export default Wrapper;

View File

@ -1,10 +1,14 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Text, Padded, Flex } from '@buffetjs/core'; import { Row, TableLabel } from '@strapi/parts';
import { useIntl } from 'react-intl'; import { useIntl } from 'react-intl';
import styled from 'styled-components';
import ConditionsSelect from '../ConditionsSelect'; import ConditionsSelect from '../ConditionsSelect';
import Wrapper from './Wrapper';
const RowWrapper = styled(Row)`
height: 52px;
`;
const ActionRow = ({ const ActionRow = ({
arrayOfOptionsGroupedByCategory, arrayOfOptionsGroupedByCategory,
@ -19,50 +23,27 @@ const ActionRow = ({
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
return ( return (
<Wrapper isGrey={isGrey}> <RowWrapper background={isGrey ? 'neutral100' : 'neutral0'}>
<Padded style={{ width: 200 }} top left right bottom size="sm"> <Row paddingLeft={6} style={{ width: 180 }}>
<Flex> <TableLabel textColor="neutral500">
<Text
lineHeight="19px"
color="grey"
fontSize="xs"
fontWeight="bold"
textTransform="uppercase"
>
{formatMessage({ {formatMessage({
id: 'Settings.permissions.conditions.can', id: 'Settings.permissions.conditions.can',
})} })}
&nbsp; &nbsp;
</Text> </TableLabel>
<Text <TableLabel title={label} textColor="primary600">
title={label}
lineHeight="19px"
fontWeight="bold"
fontSize="xs"
textTransform="uppercase"
color="mediumBlue"
style={{ maxWidth: '60%' }}
ellipsis
>
{formatMessage({ {formatMessage({
id: `Settings.roles.form.permissions.${label.toLowerCase()}`, id: `Settings.roles.form.permissions.${label.toLowerCase()}`,
defaultMessage: label, defaultMessage: label,
})} })}
</Text> </TableLabel>
<Text <TableLabel textColor="neutral500">
lineHeight="19px"
color="grey"
fontSize="xs"
fontWeight="bold"
textTransform="uppercase"
>
&nbsp; &nbsp;
{formatMessage({ {formatMessage({
id: 'Settings.permissions.conditions.when', id: 'Settings.permissions.conditions.when',
})} })}
</Text> </TableLabel>
</Flex> </Row>
</Padded>
<ConditionsSelect <ConditionsSelect
arrayOfOptionsGroupedByCategory={arrayOfOptionsGroupedByCategory} arrayOfOptionsGroupedByCategory={arrayOfOptionsGroupedByCategory}
name={name} name={name}
@ -71,7 +52,7 @@ const ActionRow = ({
onChange={onChange} onChange={onChange}
value={value} value={value}
/> />
</Wrapper> </RowWrapper>
); );
}; };

View File

@ -1,9 +0,0 @@
import styled from 'styled-components';
const Separator = styled.div`
padding-top: 1.4rem;
margin-bottom: 2.8rem;
border-bottom: 1px solid ${({ theme }) => theme.main.colors.brightGrey};
`;
export default Separator;

View File

@ -1,14 +1,38 @@
import React, { useMemo, useState } from 'react'; import { After } from '@strapi/icons';
import {
Box,
Button,
H2,
ModalFooter,
ModalHeader,
ModalLayout,
Stack,
Text,
TextButton,
} from '@strapi/parts';
import { cloneDeep, get, groupBy, set, upperFirst } from 'lodash';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { cloneDeep, get, groupBy, set } from 'lodash'; import React, { useMemo, useState } from 'react';
import { Modal, ModalHeader, ModalFooter } from '@strapi/helper-plugin'; import { FormattedMessage, useIntl } from 'react-intl';
import { Button, Text, Padded } from '@buffetjs/core'; import styled from 'styled-components';
import { useIntl } from 'react-intl';
import { usePermissionsDataManager } from '../../../hooks'; import { usePermissionsDataManager } from '../../../hooks';
import createDefaultConditionsForm from './utils/createDefaultConditionsForm';
import ActionRow from './ActionRow';
import Separator from './Separator';
import updateValues from '../Permissions/utils/updateValues'; import updateValues from '../Permissions/utils/updateValues';
import ActionRow from './ActionRow';
import createDefaultConditionsForm from './utils/createDefaultConditionsForm';
// ! Something needs to be done in the DS parts to avoid doing this
const Icon = styled(Box)`
svg {
width: 6px;
}
* {
fill: ${({ theme }) => theme.colors.neutral300};
}
`;
const Separator = styled.div`
border-bottom: 1px solid ${({ theme }) => theme.main.colors.brightGrey};
`;
const ConditionsModal = ({ const ConditionsModal = ({
actions, actions,
@ -21,6 +45,11 @@ const ConditionsModal = ({
const { formatMessage } = useIntl(); const { formatMessage } = useIntl();
const { availableConditions, modifiedData, onChangeConditions } = usePermissionsDataManager(); const { availableConditions, modifiedData, onChangeConditions } = usePermissionsDataManager();
const translatedHeaders = headerBreadCrumbs.map(headerTrad => ({
key: headerTrad,
element: <FormattedMessage id={headerTrad} defaultMessage={upperFirst(headerTrad)} />,
}));
const arrayOfOptionsGroupedByCategory = useMemo(() => { const arrayOfOptionsGroupedByCategory = useMemo(() => {
return Object.entries(groupBy(availableConditions, 'category')); return Object.entries(groupBy(availableConditions, 'category'));
}, [availableConditions]); }, [availableConditions]);
@ -79,20 +108,41 @@ const ConditionsModal = ({
onToggle(); onToggle();
}; };
if (!isOpen) return null;
return ( return (
<Modal withoverflow="true" onClosed={onClosed} isOpen={isOpen} onToggle={onToggle}> <ModalLayout onClose={onClosed}>
<ModalHeader headerBreadcrumbs={headerBreadCrumbs} /> <ModalHeader>
<Padded top left right bottom size="md"> <Stack horizontal size={3}>
<Text fontSize="lg" fontWeight="bold"> {translatedHeaders.map(({ key, element }, index) => {
const shouldDisplayChevron = index < translatedHeaders.length - 1;
return (
<>
<TextButton textColor="neutral800" key={key}>
{element}
</TextButton>
{shouldDisplayChevron && (
<Icon>
<After />
</Icon>
)}
</>
);
})}
</Stack>
</ModalHeader>
<Box padding={8}>
<Stack size={6}>
<H2>
{formatMessage({ {formatMessage({
id: 'Settings.permissions.conditions.define-conditions', id: 'Settings.permissions.conditions.define-conditions',
})} })}
</Text> </H2>
<Separator /> <Separator />
<Box>
{actionsToDisplay.length === 0 && ( {actionsToDisplay.length === 0 && (
<Text fontSize="md" color="grey"> <Text>{formatMessage({ id: 'Settings.permissions.conditions.no-actions' })}</Text>
{formatMessage({ id: 'Settings.permissions.conditions.no-actions' })}
</Text>
)} )}
{actionsToDisplay.map(({ actionId, label, pathToConditionsObject }, index) => { {actionsToDisplay.map(({ actionId, label, pathToConditionsObject }, index) => {
const name = pathToConditionsObject.join('..'); const name = pathToConditionsObject.join('..');
@ -111,21 +161,24 @@ const ConditionsModal = ({
/> />
); );
})} })}
</Padded> </Box>
<ModalFooter> </Stack>
<section> </Box>
<Button type="button" color="cancel" onClick={onToggle}> <ModalFooter
startActions={
<Button variant="tertiary" onClick={onToggle}>
{formatMessage({ id: 'app.components.Button.cancel' })} {formatMessage({ id: 'app.components.Button.cancel' })}
</Button> </Button>
}
<Button type="button" color="success" onClick={handleSubmit}> endActions={
<Button onClick={handleSubmit}>
{formatMessage({ {formatMessage({
id: 'Settings.permissions.conditions.apply', id: 'Settings.permissions.conditions.apply',
})} })}
</Button> </Button>
</section> }
</ModalFooter> />
</Modal> </ModalLayout>
); );
}; };

View File

@ -64,8 +64,8 @@ const Chevron = styled(Box)`
const TinyDot = styled(Box)` const TinyDot = styled(Box)`
position: absolute; position: absolute;
top: 0; top: -6px;
left: 35px; left: 37px;
width: 6px; width: 6px;
height: 6px; height: 6px;
border-radius: 20px; border-radius: 20px;

View File

@ -23,6 +23,7 @@ const Cell = styled(Box)`
position: relative; position: relative;
`; `;
// ! Something needs to be done in the DS parts to avoid doing this
const Chevron = styled(Box)` const Chevron = styled(Box)`
display: none; display: none;
svg { svg {