Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit 0d0cd52

Browse files
committed
Merge remote-tracking branch 'origin/master' into pr-2100/atom/ku-handle-ghost-users
2 parents 5a06437 + cf10092 commit 0d0cd52

23 files changed

+412
-115
lines changed

lib/containers/__generated__/userMentionTooltipContainer_repositoryOwner.graphql.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/containers/current-pull-request-container.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ export default class CurrentPullRequestContainer extends React.Component {
3838
pushInProgress: PropTypes.bool.isRequired,
3939

4040
workspace: PropTypes.object.isRequired,
41-
workingDirectory: PropTypes.string.isRequired,
4241

4342
// Actions
4443
onOpenIssueish: PropTypes.func.isRequired,
44+
onOpenReviews: PropTypes.func.isRequired,
4545
onCreatePr: PropTypes.func.isRequired,
4646
}
4747

@@ -147,7 +147,6 @@ export default class CurrentPullRequestContainer extends React.Component {
147147
results={associatedPullRequests.nodes}
148148
isLoading={false}
149149
workspace={this.props.workspace}
150-
workingDirectory={this.props.workingDirectory}
151150
endpoint={this.props.endpoint}
152151
resultFilter={issueish => issueish.getHeadRepositoryID() === this.props.repository.id}
153152
{...this.controllerProps()}
@@ -176,9 +175,9 @@ export default class CurrentPullRequestContainer extends React.Component {
176175
return {
177176
title: 'Checked out pull request',
178177
onOpenIssueish: this.props.onOpenIssueish,
178+
onOpenReviews: this.props.onOpenReviews,
179179
emptyComponent: this.renderEmptyTile,
180180
needReviewsButton: true,
181-
workingDirectory: this.props.workingDirectory,
182181
};
183182
}
184183
}

lib/containers/issueish-search-container.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export default class IssueishSearchContainer extends React.Component {
2222
// Action methods
2323
onOpenIssueish: PropTypes.func.isRequired,
2424
onOpenSearch: PropTypes.func.isRequired,
25+
onOpenReviews: PropTypes.func.isRequired,
2526
}
2627

2728
static defaultProps = {
@@ -116,6 +117,7 @@ export default class IssueishSearchContainer extends React.Component {
116117
title: this.props.search.getName(),
117118

118119
onOpenIssueish: this.props.onOpenIssueish,
120+
onOpenReviews: this.props.onOpenReviews,
119121
onOpenMore: () => this.props.onOpenSearch(this.props.search),
120122
};
121123
}

lib/containers/user-mention-tooltip-container.js

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import PropTypes from 'prop-types';
44

55
import Octicon from '../atom/octicon';
66

7-
class UserMentionTooltip extends React.Component {
7+
export class BareUserMentionTooltipContainer extends React.Component {
88
static propTypes = {
99
repositoryOwner: PropTypes.shape({
1010
login: PropTypes.string.isRequired,
@@ -17,15 +17,15 @@ class UserMentionTooltip extends React.Component {
1717
company: PropTypes.string,
1818

1919
// Organizations
20-
members: PropTypes.shape({
20+
membersWithRole: PropTypes.shape({
2121
totalCount: PropTypes.number.isRequired,
2222
}),
2323
}).isRequired,
2424
}
2525

2626
render() {
2727
const owner = this.props.repositoryOwner;
28-
const {login, company, repositories, members} = owner;
28+
const {login, company, repositories, membersWithRole} = owner;
2929
return (
3030
<div className="github-UserMentionTooltip">
3131
<div className="github-UserMentionTooltip-avatar">
@@ -36,7 +36,9 @@ class UserMentionTooltip extends React.Component {
3636
<Octicon icon="mention" /><strong>{login}</strong>
3737
</div>
3838
{company && <div><Octicon icon="briefcase" /><span>{company}</span></div>}
39-
{members && <div><Octicon icon="organization" /><span>{members.totalCount} members</span></div>}
39+
{membersWithRole && (
40+
<div><Octicon icon="organization" /><span>{membersWithRole.totalCount} members</span></div>
41+
)}
4042
<div><Octicon icon="repo" /><span>{repositories.totalCount} repositories</span></div>
4143
</div>
4244
<div style={{clear: 'both'}} />
@@ -45,12 +47,20 @@ class UserMentionTooltip extends React.Component {
4547
}
4648
}
4749

48-
export default createFragmentContainer(UserMentionTooltip, {
50+
export default createFragmentContainer(BareUserMentionTooltipContainer, {
4951
repositoryOwner: graphql`
5052
fragment userMentionTooltipContainer_repositoryOwner on RepositoryOwner {
51-
login avatarUrl repositories { totalCount }
52-
... on User { company }
53-
... on Organization { members { totalCount } }
53+
login
54+
avatarUrl
55+
repositories { totalCount }
56+
... on User {
57+
company
58+
}
59+
... on Organization {
60+
membersWithRole {
61+
totalCount
62+
}
63+
}
5464
}
5565
`,
5666
});

lib/controllers/issueish-list-controller.js

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import {graphql, createFragmentContainer} from 'react-relay';
44
import {EndpointPropType} from '../prop-types';
55
import IssueishListView from '../views/issueish-list-view';
66
import Issueish from '../models/issueish';
7-
import ReviewsItem from '../items/reviews-item';
7+
import {shell, remote} from 'electron';
8+
const {Menu, MenuItem} = remote;
89
import {addEvent} from '../reporter-proxy';
910

1011
const StatePropType = PropTypes.oneOf(['EXPECTED', 'PENDING', 'SUCCESS', 'ERROR', 'FAILURE']);
@@ -51,12 +52,12 @@ export class BareIssueishListController extends React.Component {
5152

5253
resultFilter: PropTypes.func,
5354
onOpenIssueish: PropTypes.func.isRequired,
55+
onOpenReviews: PropTypes.func.isRequired,
5456
onOpenMore: PropTypes.func,
5557

5658
emptyComponent: PropTypes.func,
5759
workspace: PropTypes.object,
5860
endpoint: EndpointPropType,
59-
workingDirectory: PropTypes.string,
6061
needReviewsButton: PropTypes.bool,
6162
};
6263

@@ -90,21 +91,31 @@ export class BareIssueishListController extends React.Component {
9091
return null;
9192
}
9293

93-
openReviews = async () => {
94-
/* istanbul ignore next */
95-
if (this.props.results.length < 1) {
96-
return;
97-
}
98-
const result = this.props.results[0];
99-
const uri = ReviewsItem.buildURI({
100-
host: this.props.endpoint.getHost(),
101-
owner: result.repository.owner.login,
102-
repo: result.repository.name,
103-
number: result.number,
104-
workdir: this.props.workingDirectory,
94+
openOnGitHub = url => {
95+
return new Promise((resolve, reject) => {
96+
shell.openExternal(url, {}, err => {
97+
if (err) { reject(err); } else {
98+
resolve();
99+
addEvent('open-issueish-in-browser', {package: 'github', component: this.constructor.name});
100+
}
101+
});
105102
});
106-
await this.props.workspace.open(uri);
107-
addEvent('open-reviews-tab', {package: 'github', from: this.constructor.name});
103+
}
104+
105+
showActionsMenu = /* istanbul ignore next */ issueish => {
106+
const menu = new Menu();
107+
108+
menu.append(new MenuItem({
109+
label: 'See reviews',
110+
click: () => this.props.onOpenReviews(issueish),
111+
}));
112+
113+
menu.append(new MenuItem({
114+
label: 'Open on GitHub',
115+
click: () => this.openOnGitHub(issueish.getGitHubURL()),
116+
}));
117+
118+
menu.popup(remote.getCurrentWindow());
108119
}
109120

110121
render() {
@@ -118,7 +129,9 @@ export class BareIssueishListController extends React.Component {
118129
needReviewsButton={this.props.needReviewsButton}
119130
onIssueishClick={this.props.onOpenIssueish}
120131
onMoreClick={this.props.onOpenMore}
121-
openReviews={this.openReviews}
132+
openReviews={this.props.onOpenReviews}
133+
openOnGitHub={this.openOnGitHub}
134+
showActionsMenu={this.showActionsMenu}
122135
emptyComponent={this.props.emptyComponent}
123136
/>
124137
);

lib/controllers/issueish-searches-controller.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import Search from '../models/search';
99
import IssueishSearchContainer from '../containers/issueish-search-container';
1010
import CurrentPullRequestContainer from '../containers/current-pull-request-container';
1111
import IssueishDetailItem from '../items/issueish-detail-item';
12+
import ReviewsItem from '../items/reviews-item';
1213
import {addEvent} from '../reporter-proxy';
1314

1415
export default class IssueishSearchesController extends React.Component {
@@ -68,6 +69,7 @@ export default class IssueishSearchesController extends React.Component {
6869
workspace={this.props.workspace}
6970
workingDirectory={this.props.workingDirectory}
7071
onOpenIssueish={this.onOpenIssueish}
72+
onOpenReviews={this.onOpenReviews}
7173
onCreatePr={this.props.onCreatePr}
7274
/>
7375
{this.state.searches.map(search => (
@@ -81,12 +83,26 @@ export default class IssueishSearchesController extends React.Component {
8183

8284
onOpenIssueish={this.onOpenIssueish}
8385
onOpenSearch={this.onOpenSearch}
86+
onOpenReviews={this.onOpenReviews}
8487
/>
8588
))}
8689
</div>
8790
);
8891
}
8992

93+
onOpenReviews = issueish => {
94+
const uri = ReviewsItem.buildURI({
95+
host: this.props.endpoint.getHost(),
96+
owner: this.props.remote.getOwner(),
97+
repo: this.props.remote.getRepo(),
98+
number: issueish.getNumber(),
99+
workdir: this.props.workingDirectory,
100+
});
101+
return this.props.workspace.open(uri).then(() => {
102+
addEvent('open-reviews-tab', {package: 'github', from: this.constructor.name});
103+
});
104+
}
105+
90106
onOpenIssueish = issueish => {
91107
return this.props.workspace.open(
92108
IssueishDetailItem.buildURI({

lib/items/__generated__/userMentionTooltipItemQuery.graphql.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/items/changed-file-item.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ export default class ChangedFileItem extends React.Component {
4545

4646
this.refEditor = new RefHolder();
4747
this.refEditor.observe(editor => {
48-
this.emitter.emit('did-change-embedded-text-editor', editor);
48+
if (editor.isAlive()) {
49+
this.emitter.emit('did-change-embedded-text-editor', editor);
50+
}
4951
});
5052
}
5153

@@ -94,7 +96,7 @@ export default class ChangedFileItem extends React.Component {
9496
}
9597

9698
observeEmbeddedTextEditor(cb) {
97-
this.refEditor.map(editor => cb(editor));
99+
this.refEditor.map(editor => editor.isAlive() && cb(editor));
98100
return this.emitter.on('did-change-embedded-text-editor', cb);
99101
}
100102

lib/items/commit-detail-item.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ export default class CommitDetailItem extends React.Component {
3030

3131
this.refEditor = new RefHolder();
3232
this.refEditor.observe(editor => {
33-
this.emitter.emit('did-change-embedded-text-editor', editor);
33+
if (editor.isAlive()) {
34+
this.emitter.emit('did-change-embedded-text-editor', editor);
35+
}
3436
});
3537
}
3638

@@ -81,7 +83,7 @@ export default class CommitDetailItem extends React.Component {
8183
}
8284

8385
observeEmbeddedTextEditor(cb) {
84-
this.refEditor.map(editor => cb(editor));
86+
this.refEditor.map(editor => editor.isAlive() && cb(editor));
8587
return this.emitter.on('did-change-embedded-text-editor', cb);
8688
}
8789

lib/items/commit-preview-item.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ export default class CommitPreviewItem extends React.Component {
3232

3333
this.refEditor = new RefHolder();
3434
this.refEditor.observe(editor => {
35-
this.emitter.emit('did-change-embedded-text-editor', editor);
35+
if (editor.isAlive()) {
36+
this.emitter.emit('did-change-embedded-text-editor', editor);
37+
}
3638
});
3739
}
3840

@@ -83,7 +85,7 @@ export default class CommitPreviewItem extends React.Component {
8385
}
8486

8587
observeEmbeddedTextEditor(cb) {
86-
this.refEditor.map(editor => cb(editor));
88+
this.refEditor.map(editor => editor.isAlive() && cb(editor));
8789
return this.emitter.on('did-change-embedded-text-editor', cb);
8890
}
8991

0 commit comments

Comments
 (0)