Skip to content

Commit

Permalink
Merge pull request #584 from rwblair/564_neurovault_integration
Browse files Browse the repository at this point in the history
[WIP] Link to neurovault uploads.
  • Loading branch information
adelavega committed Jun 6, 2019
2 parents 24b801b + f123612 commit d2ae958
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 4 deletions.
66 changes: 62 additions & 4 deletions neuroscout/frontend/src/Status.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import * as React from 'react';
import { Button, Card, Checkbox, Modal, Tag, Icon, Tooltip, Switch } from 'antd';
import { Alert, Button, Card, Checkbox, Modal, Tag, Icon, Tooltip, Switch } from 'antd';
import { config } from './config';
import { displayError, jwtFetch, alphaSort, timeout } from './utils';
import { ApiAnalysis, Analysis } from './coretypes';
import { api } from './api';

const domainRoot = config.server_url;

Expand Down Expand Up @@ -158,13 +159,24 @@ export class Submit extends React.Component<submitProps, {tosAgree: boolean, val
}
}

export class StatusTab extends React.Component<submitProps, {compileTraceback: string}> {
type statusTabState = {
compileTraceback: string,
nvUploads?: any
};
export class StatusTab extends React.Component<submitProps, statusTabState> {
constructor(props) {
super(props);
this.state = {
compileTraceback: '',
};
this.getTraceback(this.props.analysisId);
if ((this.props.analysisId !== undefined)) {
this.getTraceback(this.props.analysisId);
api.getNVUploads(this.props.analysisId).then(nvUploads => {
if (nvUploads !== null) {
this.setState({nvUploads: nvUploads});
}
});
}
}

getTraceback(id) {
Expand All @@ -183,11 +195,25 @@ export class StatusTab extends React.Component<submitProps, {compileTraceback: s
if ((nextProps.status !== this.props.status) && (nextProps.status === 'FAILED')) {
this.getTraceback(nextProps.analysisId);
}
if ((nextProps.analysisId !== this.props.analysisId)) {
if ((nextProps.analysisId !== this.props.analysisId && nextProps.analysisId !== undefined)) {
this.getTraceback(nextProps.analysisId);
api.getNVUploads(nextProps.analysisId).then(nvUploads => {
if (nvUploads !== null) {
this.setState({nvUploads: nvUploads});
}
});
}
}

nvLink(collection_id: any) {
let url = `https://neurovault.org/collections/${collection_id}`;
return (
<a href={url}>
https://neurovault.org/collections/{collection_id}/
</a>
);
}

render() {
return(
<div>
Expand Down Expand Up @@ -247,6 +273,38 @@ export class StatusTab extends React.Component<submitProps, {compileTraceback: s
<p>Analysis generation may take some time. This page will update when complete.</p>
</div>
}
{(this.state.nvUploads) &&
<div>
<h3>NeuroVault Uploads</h3>
{(this.state.nvUploads.pending) &&
<Alert
message="Latest Attempted Upload:"
description={`${this.state.nvUploads.pending.uploaded_at}`}
type="warning"
/>
}
{(this.state.nvUploads.ok) &&
this.state.nvUploads.ok.map((x, i) => {
return (<Alert
key={x.collection_id}
message={this.nvLink(x.collection_id)}
description={`Uploaded at: ${x.uploaded_at}`}
type="success"
/>);
})
}
{(this.state.nvUploads.failed) &&
<p>
<Alert
message="Last failed upload:"
description={`Failed at ${this.state.nvUploads.failed.uploaded_at}
<br/>${this.state.nvUploads.failed.traceback}`}
type="error"
/>
</p>
}
</div>
}
{this.props.children}
</div>
);
Expand Down
32 changes: 32 additions & 0 deletions neuroscout/frontend/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,5 +40,37 @@ export const api = {
displayError(error);
return null;
});
},
getNVUploads: (analysisId: (string)): Promise<(any | null)> => {
return jwtFetch(domainRoot + `/api/analyses/${analysisId}/upload`)
.then(data => {
let uploads = {
'last_failed': null as any,
'pending': null as any,
'ok': [] as any[]
};
if (data.length === 0) {
return null;
}
data.map(x => x.uploaded_at = x.uploaded_at.replace('T', ' '));
let failed = data.filter(x => x.status === 'FAILED');
if (failed.length > 0) {
failed.sort((a, b) => b.uploaded_at.localeCompare(a.uploaded_at));
uploads.last_failed = failed[0];
}
uploads.ok = data.filter(x => x.status === 'OK');
if (uploads.ok.length === 0) {
let pending = data.filter(x => x.status === 'PENDING');
if (pending.length > 0) {
failed.sort((a, b) => b.uploaded_at.localeCompare(a.uploaded_at));
uploads.pending = pending[0];
}
}
return uploads;
})
.catch((error) => {
displayError(error);
return null;
});
}
};

0 comments on commit d2ae958

Please sign in to comment.