|
@@ -2,10 +2,13 @@ import PropTypes from 'prop-types';
|
|
|
import React from 'react';
|
|
|
import createReactClass from 'create-react-class';
|
|
|
import {Link} from 'react-router';
|
|
|
+import styled from 'react-emotion';
|
|
|
+import {Flex, Box} from 'grid-emotion';
|
|
|
|
|
|
import ProjectState from '../mixins/projectState';
|
|
|
import TimeSince from './timeSince';
|
|
|
import ShortId from './shortId';
|
|
|
+import {t, tct} from '../locale';
|
|
|
|
|
|
const EventOrGroupExtraDetails = createReactClass({
|
|
|
displayName: 'EventOrGroupExtraDetails',
|
|
@@ -14,9 +17,8 @@ const EventOrGroupExtraDetails = createReactClass({
|
|
|
orgId: PropTypes.string.isRequired,
|
|
|
projectId: PropTypes.string.isRequired,
|
|
|
groupId: PropTypes.string.isRequired,
|
|
|
- firstSeen: PropTypes.string,
|
|
|
lastSeen: PropTypes.string,
|
|
|
- shortId: PropTypes.string,
|
|
|
+ firstSeen: PropTypes.string,
|
|
|
subscriptionDetails: PropTypes.shape({
|
|
|
reason: PropTypes.string,
|
|
|
}),
|
|
@@ -27,6 +29,7 @@ const EventOrGroupExtraDetails = createReactClass({
|
|
|
name: PropTypes.string,
|
|
|
}),
|
|
|
showAssignee: PropTypes.bool,
|
|
|
+ shortId: PropTypes.string,
|
|
|
},
|
|
|
|
|
|
mixins: [ProjectState],
|
|
@@ -38,13 +41,13 @@ const EventOrGroupExtraDetails = createReactClass({
|
|
|
groupId,
|
|
|
lastSeen,
|
|
|
firstSeen,
|
|
|
- shortId,
|
|
|
subscriptionDetails,
|
|
|
numComments,
|
|
|
logger,
|
|
|
assignedTo,
|
|
|
annotations,
|
|
|
showAssignee,
|
|
|
+ shortId,
|
|
|
} = this.props;
|
|
|
let styles = {};
|
|
|
if (subscriptionDetails && subscriptionDetails.reason === 'mentioned') {
|
|
@@ -52,32 +55,43 @@ const EventOrGroupExtraDetails = createReactClass({
|
|
|
}
|
|
|
|
|
|
return (
|
|
|
- <div className="event-extra">
|
|
|
- <ul>
|
|
|
- {shortId && (
|
|
|
- <li>
|
|
|
- <ShortId shortId={shortId} />
|
|
|
- </li>
|
|
|
+ <GroupExtra align="center">
|
|
|
+ {shortId && (
|
|
|
+ <Box mr={2}>
|
|
|
+ <GroupShortId shortId={shortId} />
|
|
|
+ </Box>
|
|
|
+ )}
|
|
|
+ <Flex align="center" mr={2}>
|
|
|
+ {lastSeen && (
|
|
|
+ <React.Fragment>
|
|
|
+ <GroupExtraIcon className="icon icon-clock" />
|
|
|
+ <TimeSince date={lastSeen} suffix={t('ago')} />
|
|
|
+ </React.Fragment>
|
|
|
+ )}
|
|
|
+ {firstSeen &&
|
|
|
+ lastSeen && <span className="hidden-xs hidden-sm"> — </span>}
|
|
|
+ {firstSeen && (
|
|
|
+ <TimeSince
|
|
|
+ date={firstSeen}
|
|
|
+ suffix={t('old')}
|
|
|
+ className="hidden-xs hidden-sm"
|
|
|
+ />
|
|
|
)}
|
|
|
- <li>
|
|
|
- <span className="icon icon-clock" />
|
|
|
- {lastSeen && <TimeSince date={lastSeen} />}
|
|
|
- {firstSeen && lastSeen && <span> — </span>}
|
|
|
- {firstSeen && <TimeSince date={firstSeen} suffix="old" />}
|
|
|
- </li>
|
|
|
+ </Flex>
|
|
|
+ <GroupExtraCommentsAndLogger>
|
|
|
{numComments > 0 && (
|
|
|
- <li>
|
|
|
+ <Box mr={2}>
|
|
|
<Link
|
|
|
to={`/${orgId}/${projectId}/issues/${groupId}/activity/`}
|
|
|
className="comments"
|
|
|
>
|
|
|
- <span className="icon icon-comments" style={styles} />
|
|
|
- <span className="tag-count">{numComments}</span>
|
|
|
+ <GroupExtraIcon className="icon icon-comments" style={styles} />
|
|
|
+ <GroupExtraIcon className="tag-count">{numComments}</GroupExtraIcon>
|
|
|
</Link>
|
|
|
- </li>
|
|
|
+ </Box>
|
|
|
)}
|
|
|
{logger && (
|
|
|
- <li className="event-annotation">
|
|
|
+ <Box className="event-annotation" mr={2}>
|
|
|
<Link
|
|
|
to={{
|
|
|
pathname: `/${orgId}/${projectId}/`,
|
|
@@ -88,25 +102,49 @@ const EventOrGroupExtraDetails = createReactClass({
|
|
|
>
|
|
|
{logger}
|
|
|
</Link>
|
|
|
- </li>
|
|
|
+ </Box>
|
|
|
)}
|
|
|
- {annotations &&
|
|
|
- annotations.map((annotation, key) => {
|
|
|
- return (
|
|
|
- <li
|
|
|
- className="event-annotation"
|
|
|
- dangerouslySetInnerHTML={{
|
|
|
- __html: annotation,
|
|
|
- }}
|
|
|
- key={key}
|
|
|
- />
|
|
|
- );
|
|
|
- })}
|
|
|
+ </GroupExtraCommentsAndLogger>
|
|
|
+ {annotations &&
|
|
|
+ annotations.map((annotation, key) => {
|
|
|
+ return (
|
|
|
+ <Box
|
|
|
+ className="event-annotation"
|
|
|
+ dangerouslySetInnerHTML={{
|
|
|
+ __html: annotation,
|
|
|
+ }}
|
|
|
+ key={key}
|
|
|
+ />
|
|
|
+ );
|
|
|
+ })}
|
|
|
|
|
|
- {showAssignee && assignedTo && <li>Assigned to {assignedTo.name}</li>}
|
|
|
- </ul>
|
|
|
- </div>
|
|
|
+ {showAssignee &&
|
|
|
+ assignedTo && <Box>{tct('Assigned to [name]', {name: assignedTo.name})}</Box>}
|
|
|
+ </GroupExtra>
|
|
|
);
|
|
|
},
|
|
|
});
|
|
|
+
|
|
|
+const GroupExtra = styled(Flex)`
|
|
|
+ color: ${p => p.theme.gray3}
|
|
|
+ font-size: 12px;
|
|
|
+ a {
|
|
|
+ color: inherit;
|
|
|
+ }
|
|
|
+`;
|
|
|
+
|
|
|
+const GroupExtraCommentsAndLogger = styled(Flex)`
|
|
|
+ color: ${p => p.theme.gray4};
|
|
|
+`;
|
|
|
+
|
|
|
+const GroupShortId = styled(ShortId)`
|
|
|
+ font-size: 12px;
|
|
|
+ color: ${p => p.theme.gray3};
|
|
|
+`;
|
|
|
+
|
|
|
+const GroupExtraIcon = styled.span`
|
|
|
+ font-size: 11px;
|
|
|
+ margin-right: 4px;
|
|
|
+`;
|
|
|
+
|
|
|
export default EventOrGroupExtraDetails;
|