Add focal points support in the composer
This commit is contained in:
@@ -13,6 +13,7 @@ export default function ComposerUploadForm ({
|
||||
intl,
|
||||
media,
|
||||
onChangeDescription,
|
||||
onOpenFocalPointModal,
|
||||
onRemove,
|
||||
progress,
|
||||
uploading,
|
||||
@@ -31,8 +32,12 @@ export default function ComposerUploadForm ({
|
||||
key={item.get('id')}
|
||||
id={item.get('id')}
|
||||
intl={intl}
|
||||
focusX={item.getIn(['meta', 'focus', 'x'])}
|
||||
focusY={item.getIn(['meta', 'focus', 'y'])}
|
||||
mediaType={item.get('type')}
|
||||
preview={item.get('preview_url')}
|
||||
onChangeDescription={onChangeDescription}
|
||||
onOpenFocalPointModal={onOpenFocalPointModal}
|
||||
onRemove={onRemove}
|
||||
/>
|
||||
))}
|
||||
@@ -46,8 +51,8 @@ export default function ComposerUploadForm ({
|
||||
ComposerUploadForm.propTypes = {
|
||||
intl: PropTypes.object.isRequired,
|
||||
media: ImmutablePropTypes.list,
|
||||
onChangeDescription: PropTypes.func,
|
||||
onRemove: PropTypes.func,
|
||||
onChangeDescription: PropTypes.func.isRequired,
|
||||
onRemove: PropTypes.func.isRequired,
|
||||
progress: PropTypes.number,
|
||||
uploading: PropTypes.bool,
|
||||
};
|
||||
|
@@ -25,6 +25,10 @@ const messages = defineMessages({
|
||||
defaultMessage: 'Describe for the visually impaired',
|
||||
id: 'upload_form.description',
|
||||
},
|
||||
crop: {
|
||||
defaultMessage: 'Crop',
|
||||
id: 'upload_form.focus',
|
||||
},
|
||||
});
|
||||
|
||||
// Handlers.
|
||||
@@ -77,6 +81,17 @@ const handlers = {
|
||||
onRemove(id);
|
||||
}
|
||||
},
|
||||
|
||||
// Opens the focal point modal.
|
||||
handleFocalPointClick () {
|
||||
const {
|
||||
id,
|
||||
onOpenFocalPointModal,
|
||||
} = this.props;
|
||||
if (id && onOpenFocalPointModal) {
|
||||
onOpenFocalPointModal(id);
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
// The component.
|
||||
@@ -102,11 +117,15 @@ export default class ComposerUploadFormItem extends React.PureComponent {
|
||||
handleMouseEnter,
|
||||
handleMouseLeave,
|
||||
handleRemove,
|
||||
handleFocalPointClick,
|
||||
} = this.handlers;
|
||||
const {
|
||||
description,
|
||||
intl,
|
||||
preview,
|
||||
focusX,
|
||||
focusY,
|
||||
mediaType,
|
||||
} = this.props;
|
||||
const {
|
||||
focused,
|
||||
@@ -114,6 +133,8 @@ export default class ComposerUploadFormItem extends React.PureComponent {
|
||||
dirtyDescription,
|
||||
} = this.state;
|
||||
const computedClass = classNames('composer--upload_form--item', { active: hovered || focused });
|
||||
const x = ((focusX / 2) + .5) * 100;
|
||||
const y = ((focusY / -2) + .5) * 100;
|
||||
|
||||
// The result.
|
||||
return (
|
||||
@@ -136,15 +157,15 @@ export default class ComposerUploadFormItem extends React.PureComponent {
|
||||
style={{
|
||||
transform: `scale(${scale})`,
|
||||
backgroundImage: preview ? `url(${preview})` : null,
|
||||
backgroundPosition: `${x}% ${y}%`
|
||||
}}
|
||||
>
|
||||
<IconButton
|
||||
className='close'
|
||||
icon='times'
|
||||
onClick={handleRemove}
|
||||
size={36}
|
||||
title={intl.formatMessage(messages.undo)}
|
||||
/>
|
||||
<div className={classNames('composer--upload_form--actions', { active: hovered || focused })}>
|
||||
<button className='icon-button' onClick={handleRemove}>
|
||||
<i className='fa fa-times' /> <FormattedMessage {...messages.undo} />
|
||||
</button>
|
||||
{mediaType === 'image' && <button className='icon-button' onClick={handleFocalPointClick}><i className='fa fa-crosshairs' /> <FormattedMessage {...messages.crop} /></button>}
|
||||
</div>
|
||||
<label>
|
||||
<span style={{ display: 'none' }}><FormattedMessage {...messages.description} /></span>
|
||||
<input
|
||||
@@ -171,7 +192,11 @@ ComposerUploadFormItem.propTypes = {
|
||||
description: PropTypes.string,
|
||||
id: PropTypes.string,
|
||||
intl: PropTypes.object.isRequired,
|
||||
onChangeDescription: PropTypes.func,
|
||||
onRemove: PropTypes.func,
|
||||
onChangeDescription: PropTypes.func.isRequired,
|
||||
onOpenFocalPointModal: PropTypes.func.isRequired,
|
||||
onRemove: PropTypes.func.isRequired,
|
||||
focusX: PropTypes.number,
|
||||
focusY: PropTypes.number,
|
||||
mediaType: PropTypes.string,
|
||||
preview: PropTypes.string,
|
||||
};
|
||||
|
Reference in New Issue
Block a user