mirror of
https://github.com/strapi/strapi.git
synced 2025-11-14 17:19:01 +00:00
Design pencil control
Signed-off-by: soupette <cyril.lpz@gmail.com>
This commit is contained in:
parent
1a4ca1fcec
commit
f82aaeb6fd
@ -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;
|
||||||
@ -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;
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
import styled from 'styled-components';
|
||||||
|
|
||||||
|
const CardControlsWrapper = styled.div`
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
right: 10px;
|
||||||
|
display: flex;
|
||||||
|
`;
|
||||||
|
|
||||||
|
export default CardControlsWrapper;
|
||||||
@ -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 = {
|
||||||
|
|||||||
@ -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;
|
||||||
@ -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>
|
||||||
|
|||||||
@ -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>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@ -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 && (
|
||||||
|
|||||||
@ -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: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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',
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user