Browse Source

fix(releases) Fix empty assignee lists on org releases (#11836)

We need to fetch and index org members into their repspective projects
much like on org issue list.

Fixes APP-1071
Mark Story 6 years ago
parent
commit
1c90bbbd0f

+ 16 - 0
src/sentry/static/sentry/app/actionCreators/members.jsx

@@ -14,6 +14,22 @@ export function fetchOrgMembers(api, orgId) {
   });
 }
 
+/**
+ * Convert a list of members with user & project data
+ * into a object that maps project slugs : users in that project.
+ */
+export function indexMembersByProject(members) {
+  return members.reduce((acc, member) => {
+    for (const project of member.projects) {
+      if (acc[project] === undefined) {
+        acc[project] = [];
+      }
+      acc[project].push(member.user);
+    }
+    return acc;
+  }, {});
+}
+
 export function updateMember(api, params) {
   MemberActions.update(params.memberId, params.data);
 

+ 17 - 3
src/sentry/static/sentry/app/components/groupList.jsx

@@ -7,6 +7,7 @@ import qs from 'query-string';
 
 import SentryTypes from 'app/sentryTypes';
 import ApiMixin from 'app/mixins/apiMixin';
+import {fetchOrgMembers, indexMembersByProject} from 'app/actionCreators/members';
 import GroupListHeader from 'app/components/groupListHeader';
 import GroupStore from 'app/stores/groupStore';
 import LoadingError from 'app/components/loadingError';
@@ -80,6 +81,10 @@ const GroupList = createReactClass({
       error: false,
     });
 
+    fetchOrgMembers(this.api, this.props.orgId).then(members => {
+      this.setState({memberList: indexMembersByProject(members)});
+    });
+
     this.api.request(this.getGroupListEndpoint(), {
       success: (data, _, jqXHR) => {
         this._streamManager.push(data);
@@ -138,9 +143,11 @@ const GroupList = createReactClass({
   },
 
   render() {
-    if (this.state.loading) return <LoadingIndicator />;
-    else if (this.state.error) return <LoadingError onRetry={this.fetchData} />;
-    else if (this.state.groups.length === 0)
+    if (this.state.loading) {
+      return <LoadingIndicator />;
+    } else if (this.state.error) {
+      return <LoadingError onRetry={this.fetchData} />;
+    } else if (this.state.groups.length === 0) {
       return (
         <Panel>
           <PanelBody>
@@ -150,6 +157,7 @@ const GroupList = createReactClass({
           </PanelBody>
         </Panel>
       );
+    }
 
     const {orgId} = this.props;
 
@@ -158,12 +166,18 @@ const GroupList = createReactClass({
         <GroupListHeader />
         <PanelBody>
           {this.state.groups.map(({id, project}) => {
+            let members = null;
+            if (this.state.memberList) {
+              members = this.state.memberList[project.slug] || null;
+            }
+
             return (
               <StreamGroup
                 key={id}
                 id={id}
                 orgId={orgId}
                 canSelect={this.props.canSelectGroups}
+                memberList={members}
               />
             );
           })}

+ 2 - 11
src/sentry/static/sentry/app/views/organizationStream/overview.jsx

@@ -18,7 +18,7 @@ import Pagination from 'app/components/pagination';
 import {Panel, PanelBody} from 'app/components/panels';
 import StreamGroup from 'app/components/stream/group';
 import {fetchTags} from 'app/actionCreators/tags';
-import {fetchOrgMembers} from 'app/actionCreators/members';
+import {fetchOrgMembers, indexMembersByProject} from 'app/actionCreators/members';
 import {fetchSavedSearches} from 'app/actionCreators/savedSearches';
 import ConfigStore from 'app/stores/configStore';
 import GroupStore from 'app/stores/groupStore';
@@ -96,16 +96,7 @@ const OrganizationStream = createReactClass({
 
     fetchTags(this.props.organization.slug);
     fetchOrgMembers(this.api, this.props.organization.slug).then(members => {
-      const memberList = members.reduce((acc, member) => {
-        for (const project of member.projects) {
-          if (acc[project] === undefined) {
-            acc[project] = [];
-          }
-          acc[project].push(member.user);
-        }
-        return acc;
-      }, {});
-      this.setState({memberList});
+      this.setState({memberList: indexMembersByProject(members)});
     });
 
     // Start by getting searches first so if the user is on a saved search