diff --git a/src/sentry/static/sentry/app/components/idBadge/userBadge.jsx b/src/sentry/static/sentry/app/components/idBadge/userBadge.jsx
index 482f75afe2d784..c38175c4f79e0b 100644
--- a/src/sentry/static/sentry/app/components/idBadge/userBadge.jsx
+++ b/src/sentry/static/sentry/app/components/idBadge/userBadge.jsx
@@ -6,6 +6,7 @@ import Link from 'app/components/links/link';
import overflowEllipsis from 'app/styles/overflowEllipsis';
import space from 'app/styles/space';
import SentryTypes from 'app/sentryTypes';
+import {omit} from 'lodash';
const UserBadge = ({
displayName,
@@ -31,6 +32,7 @@ const UserBadge = ({
{displayName ||
userFromPropsOrMember.name ||
userFromPropsOrMember.email ||
+ userFromPropsOrMember.username ||
userFromPropsOrMember.ipAddress ||
/**
* Because this can be used to render EventUser models, or User *interface*
@@ -87,9 +89,10 @@ const StyledEmail = styled('div')`
${overflowEllipsis};
`;
-const StyledName = styled(({useLink, hideEmail, to, ...props}) =>
- useLink ? :
-)`
+const StyledName = styled(({useLink, to, ...props}) => {
+ const forwardProps = omit(props, 'hideEmail');
+ return useLink ? : ;
+})`
font-weight: ${p => (p.hideEmail ? 'inherit' : 'bold')};
line-height: 1.15em;
${overflowEllipsis};
diff --git a/src/sentry/static/sentry/app/views/organizationEventsV2/data.jsx b/src/sentry/static/sentry/app/views/organizationEventsV2/data.jsx
index 7b9218e8f86887..e0178eb93f8c72 100644
--- a/src/sentry/static/sentry/app/views/organizationEventsV2/data.jsx
+++ b/src/sentry/static/sentry/app/views/organizationEventsV2/data.jsx
@@ -122,16 +122,20 @@ export const SPECIAL_FIELDS = {
},
},
user: {
- fields: ['user', 'user.name', 'user.email', 'user.ip'],
+ fields: ['user', 'user.name', 'user.username', 'user.email', 'user.ip', 'user.id'],
sortField: 'user',
renderFunc: (data, {organization, location}) => {
const userObj = {
+ id: data['user.id'],
name: data['user.name'],
email: data['user.email'],
- ip: data['user.ip'],
+ username: data['user.username'],
+ ip_address: data['user.ip'],
};
- const badge = ;
+ const badge = (
+
+ );
if (!data.user) {
return {badge};
diff --git a/tests/js/spec/components/idBadge/userBadge.spec.jsx b/tests/js/spec/components/idBadge/userBadge.spec.jsx
index a5f7d5cbd72455..add384035273a7 100644
--- a/tests/js/spec/components/idBadge/userBadge.spec.jsx
+++ b/tests/js/spec/components/idBadge/userBadge.spec.jsx
@@ -38,6 +38,31 @@ describe('UserBadge', function() {
expect(wrapper.find('StyledEmail').prop('children')).toBe('Other Display Email');
});
+ it('can coalesce using username', function() {
+ const username = TestStubs.User({
+ name: null,
+ email: null,
+ username: 'the-batman',
+ });
+ const wrapper = shallow();
+
+ expect(wrapper.find('StyledName').prop('children')).toBe(username.username);
+ expect(wrapper.find('StyledEmail').prop('children')).toBe(null);
+ });
+
+ it('can coalesce using ipaddress', function() {
+ const ipUser = TestStubs.User({
+ name: null,
+ email: null,
+ username: null,
+ ipAddress: '127.0.0.1',
+ });
+ const wrapper = shallow();
+
+ expect(wrapper.find('StyledName').prop('children')).toBe(ipUser.ipAddress);
+ expect(wrapper.find('StyledEmail').prop('children')).toBe(null);
+ });
+
it('does not use a link for member name', function() {
const wrapper = mount();
diff --git a/tests/js/spec/views/organizationEventsV2/utils.spec.jsx b/tests/js/spec/views/organizationEventsV2/utils.spec.jsx
index 884e7378f6db1c..2f814b453e09ac 100644
--- a/tests/js/spec/views/organizationEventsV2/utils.spec.jsx
+++ b/tests/js/spec/views/organizationEventsV2/utils.spec.jsx
@@ -35,8 +35,10 @@ describe('getQuery()', function() {
'project.name',
'user',
'user.name',
+ 'user.username',
'user.email',
'user.ip',
+ 'user.id',
'issue.id',
]);
});