Design pencil control

Signed-off-by: soupette <cyril.lpz@gmail.com>
This commit is contained in:
soupette 2020-02-20 16:16:01 +01:00
parent 1a4ca1fcec
commit f82aaeb6fd
11 changed files with 101 additions and 33 deletions

View File

@ -0,0 +1,16 @@
import styled from 'styled-components';
const Wrapper = styled.div`
display: flex;
width: 24px;
height: 24px;
background-color: #ffffff;
border: 1px solid #e3e9f3;
border-radius: 2px;
cursor: pointer;
> svg {
margin: auto;
}
`;
export default Wrapper;

View File

@ -0,0 +1,13 @@
import React from 'react';
import { Pencil } from '@buffetjs/icons';
import Wrapper from './Wrapper';
const CardControl = () => {
return (
<Wrapper>
<Pencil fill="#b3b5b9" />
</Wrapper>
);
};
export default CardControl;

View File

@ -0,0 +1,10 @@
import styled from 'styled-components';
const CardControlsWrapper = styled.div`
position: absolute;
top: 10px;
right: 10px;
display: flex;
`;
export default CardControlsWrapper;

View File

@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
const CardImgWrapper = styled.div` const CardImgWrapper = styled.div`
position: relative; position: relative;
height: ${({ isSmall }) => (isSmall ? '127px' : '156px')}; height: ${({ isSmall }) => (isSmall ? '127px' : '156px')};
min-width: ${({ isSmall }) => (isSmall ? '200px' : '245px')}; min-width: ${({ isSmall }) => (isSmall ? '100%' : '245px')};
border-radius: 2px; border-radius: 2px;
background: ${({ withOverlay }) => (withOverlay ? '#F6F6F6' : '#333740')}; background: ${({ withOverlay }) => (withOverlay ? '#F6F6F6' : '#333740')};
@ -18,6 +18,16 @@ const CardImgWrapper = styled.div`
return ''; return '';
}} }}
.card-control-wrapper {
display: none;
}
&:hover {
.card-control-wrapper {
display: block;
}
}
`; `;
CardImgWrapper.defaultProps = { CardImgWrapper.defaultProps = {

View File

@ -0,0 +1,12 @@
import styled from 'styled-components';
import ContainerFluid from '../ContainerFluid';
const Container = styled(ContainerFluid)`
margin-bottom: 4px;
padding-top: 14px;
max-height: 350px;
overflow: auto;
overflow-x: hidden;
`;
export default Container;

View File

@ -1,5 +1,7 @@
import React from 'react'; import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import CardControl from '../CardControl';
import CardControlsWrapper from '../CardControlsWrapper';
import CardImgWrapper from '../CardImgWrapper'; import CardImgWrapper from '../CardImgWrapper';
import InfiniteLoadingIndicator from '../InfiniteLoadingIndicator'; import InfiniteLoadingIndicator from '../InfiniteLoadingIndicator';
@ -20,6 +22,11 @@ const RowItem = ({
<div> <div>
<CardImgWrapper isSmall hasError={hasError}> <CardImgWrapper isSmall hasError={hasError}>
{isUploading && <InfiniteLoadingIndicator onClick={handleClick} />} {isUploading && <InfiniteLoadingIndicator onClick={handleClick} />}
{!isUploading && (
<CardControlsWrapper className="card-control-wrapper">
<CardControl />
</CardControlsWrapper>
)}
</CardImgWrapper> </CardImgWrapper>
<p style={{ marginBottom: 14 }}>{errorMessage || file.name}</p> <p style={{ marginBottom: 14 }}>{errorMessage || file.name}</p>
</div> </div>

View File

@ -4,13 +4,12 @@ import { FormattedMessage } from 'react-intl';
import { Button } from '@buffetjs/core'; import { Button } from '@buffetjs/core';
import createMatrix from '../../utils/createMatrix'; import createMatrix from '../../utils/createMatrix';
import getTrad from '../../utils/getTrad'; import getTrad from '../../utils/getTrad';
import ContainerFluid from '../ContainerFluid';
import ModalSection from '../ModalSection'; import ModalSection from '../ModalSection';
import Text from '../Text'; import Text from '../Text';
import Container from './Container';
import ButtonWrapper from './ButtonWrapper'; import ButtonWrapper from './ButtonWrapper';
import TextWrapper from './TextWrapper'; import TextWrapper from './TextWrapper';
import RowItem from './RowItem'; import RowItem from './RowItem';
import ListWrapper from './ListWrapper';
const UploadList = ({ const UploadList = ({
filesToUpload, filesToUpload,
@ -56,23 +55,21 @@ const UploadList = ({
</ModalSection> </ModalSection>
<ModalSection> <ModalSection>
<ContainerFluid> <Container>
<ListWrapper> {matrix.map(({ key, rowContent }) => {
{matrix.map(({ key, rowContent }) => { return (
return ( <div className="row" key={key}>
<div className="row" key={key}> {rowContent.map(data => (
{rowContent.map(data => ( <RowItem
<RowItem {...data}
{...data} onClick={onClickCancelUpload}
onClick={onClickCancelUpload} key={data.originalIndex}
key={data.originalIndex} />
/> ))}
))} </div>
</div> );
); })}
})} </Container>
</ListWrapper>
</ContainerFluid>
</ModalSection> </ModalSection>
</> </>
); );

View File

@ -20,7 +20,7 @@ const ModalStepper = ({ isOpen, onToggle }) => {
const { formatMessage } = useGlobalContext(); const { formatMessage } = useGlobalContext();
const [reducerState, dispatch] = useReducer(reducer, initialState, init); const [reducerState, dispatch] = useReducer(reducer, initialState, init);
const { currentStep, filesToUpload } = reducerState.toJS(); const { currentStep, filesToUpload } = reducerState.toJS();
const { Component, headerTradId, next, prev } = stepper[currentStep]; const { Component, headers, next, prev } = stepper[currentStep];
const filesToUploadLength = filesToUpload.length; const filesToUploadLength = filesToUpload.length;
const toggleRef = useRef(); const toggleRef = useRef();
toggleRef.current = onToggle; toggleRef.current = onToggle;
@ -28,7 +28,7 @@ const ModalStepper = ({ isOpen, onToggle }) => {
useEffect(() => { useEffect(() => {
if (currentStep === 'upload' && filesToUploadLength === 0) { if (currentStep === 'upload' && filesToUploadLength === 0) {
// Close modal when file uploading is over // Close modal when file uploading is over
toggleRef.current(); // toggleRef.current();
} }
}, [filesToUploadLength, currentStep]); }, [filesToUploadLength, currentStep]);
@ -141,12 +141,10 @@ const ModalStepper = ({ isOpen, onToggle }) => {
<Modal isOpen={isOpen} onToggle={onToggle} onClosed={handleClosed}> <Modal isOpen={isOpen} onToggle={onToggle} onClosed={handleClosed}>
{/* header title */} {/* header title */}
<ModalHeader <ModalHeader
headers={[ headers={headers.map(headerTrad => ({
{ key: headerTrad,
key: headerTradId, element: <FormattedMessage id={headerTrad} />,
element: <FormattedMessage id={headerTradId} />, }))}
},
]}
/> />
{/* body of the modal */} {/* body of the modal */}
{Component && ( {Component && (

View File

@ -2,7 +2,8 @@ import { fromJS } from 'immutable';
import createNewFilesToUploadArray from './utils/createNewFilesToUploadArray'; import createNewFilesToUploadArray from './utils/createNewFilesToUploadArray';
const initialState = fromJS({ const initialState = fromJS({
currentStep: 'browse', // currentStep: 'browse',
currentStep: 'upload',
filesToUpload: [], filesToUpload: [],
}); });

View File

@ -5,19 +5,22 @@ import getTrad from '../../../utils/getTrad';
const stepper = { const stepper = {
browse: { browse: {
Component: UploadForm, Component: UploadForm,
headerTradId: getTrad('modal.header.browse'), headers: [getTrad('modal.header.browse')],
prev: null, prev: null,
next: 'upload', next: 'upload',
}, },
upload: { upload: {
Component: UploadList, Component: UploadList,
headerTradId: getTrad('modal.header.select-files'), headers: [getTrad('modal.header.select-files')],
next: null, next: null,
prev: 'browse', prev: 'browse',
}, },
'edit-new': { 'edit-new': {
Component: null, Component: () => null,
headerTradId: 'coming soon', headers: [
getTrad('modal.header.select-files'),
getTrad('modal.header.file-detail'),
],
next: null, next: null,
prev: 'upload', prev: 'upload',
}, },

View File

@ -10,6 +10,7 @@
"list.assets-empty.subtitle": "Add a first one to the list.", "list.assets-empty.subtitle": "Add a first one to the list.",
"modal.header.browse": "Upload assets", "modal.header.browse": "Upload assets",
"modal.header.select-files": "Selected files", "modal.header.select-files": "Selected files",
"modal.header.file-detail": "Details",
"modal.nav.computer": "from computer", "modal.nav.computer": "from computer",
"modal.nav.url": "from url", "modal.nav.url": "from url",
"modal.upload-list.sub-header-title.plural": "{number} assets selected", "modal.upload-list.sub-header-title.plural": "{number} assets selected",