diff --git a/assets/js/Components/App.js b/assets/js/Components/App.js index be967bcb6..17022492e 100644 --- a/assets/js/Components/App.js +++ b/assets/js/Components/App.js @@ -173,9 +173,9 @@ class App extends React.Component { }) } - handleManualScan() { + handleManualScan(issueId) { let api = new Api(this.settings) - api.getReport() + api.scanIssue(issueId) .then((response) => response.json()) .then((data) => { if (data.messages) { @@ -186,7 +186,11 @@ class App extends React.Component { }); } if (data.data && data.data.id) { - this.setState({ report: data.data, hasNewReport: true }); + const report = {...this.state.report } + // doing this to prevent mutating the report in the state + report.issues = {...report.issues} + report.issues[data.data.id] = data.data + this.setState({ report, hasNewReport: true }); } }); } diff --git a/assets/js/Components/ContentPage.js b/assets/js/Components/ContentPage.js index bbaf1bf6a..cb12c2969 100644 --- a/assets/js/Components/ContentPage.js +++ b/assets/js/Components/ContentPage.js @@ -64,6 +64,17 @@ class ContentPage extends React.Component { } } + static getDerivedStateFromProps(props, state) { + const stateActiveIssue = state.activeIssue + const propsActiveIssue = stateActiveIssue && props.report.issues[stateActiveIssue.id] + if(propsActiveIssue && propsActiveIssue.status !== stateActiveIssue.status) { + return { + activeIssue: propsActiveIssue + } + } + return null + } + handleSearchTerm = (e, val) => { this.setState({searchTerm: val, filteredIssues: []}); } diff --git a/assets/js/Components/Forms/Video.js b/assets/js/Components/Forms/Video.js index d90b5e0e1..35f916a7e 100644 --- a/assets/js/Components/Forms/Video.js +++ b/assets/js/Components/Forms/Video.js @@ -2,24 +2,39 @@ import React from 'react' import { View } from '@instructure/ui-view' import { Button } from '@instructure/ui-buttons' import { Spinner } from '@instructure/ui-spinner' +import { Text } from '@instructure/ui-text' export default class Video extends React.Component { - constructor(props) { super(props) } render() { - const pending = (this.props.activeIssue && (this.props.activeIssue.pending == '1')) - const buttonLabel = (pending) ? 'form.processing' : 'form.scan' + const pending = + this.props.activeIssue && this.props.activeIssue.pending == '1' + const buttonLabel = pending ? 'form.processing' : 'form.scan' + + if (this.props.activeIssue.status == 1) { + return ( + + Issue has been resolved. + + ) + } return ( - - ); + ) } -} \ No newline at end of file +} diff --git a/assets/js/Services/Api.js b/assets/js/Services/Api.js index 82d4fe7ec..3147cb0a8 100644 --- a/assets/js/Services/Api.js +++ b/assets/js/Services/Api.js @@ -12,6 +12,7 @@ export default class Api { reportPdf: '/download/courses/{course}/reports/pdf', adminCourses: '/api/admin/courses/account/{account}/term/{term}', scanCourse: '/api/sync/{course}', + scanIssue: '/api/issues/{issue}/scan', adminReport: '/api/admin/courses/{course}/reports/latest', adminReportHistory: '/api/admin/reports/account/{account}/term/{term}', adminUser: '/api/admin/users', @@ -221,4 +222,19 @@ export default class Api { }, }) } + + scanIssue(issueId) + { + const authToken = this.getAuthToken() + let url = `${this.apiUrl}${this.endpoints.scanIssue}` + url = url.replace('{issue}', issueId) + + return fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'X-AUTH-TOKEN': authToken, + }, + }) + } } diff --git a/src/Controller/IssuesController.php b/src/Controller/IssuesController.php index 1ae16f874..9ccfeaea3 100644 --- a/src/Controller/IssuesController.php +++ b/src/Controller/IssuesController.php @@ -177,6 +177,7 @@ public function scanIssue(Issue $issue, PhpAllyService $phpAlly, UtilityService $issue->setFixedBy($this->getUser()); $issue->setFixedOn($util->getCurrentTime()); $this->getDoctrine()->getManager()->flush(); + $apiResponse->addMessage('form.msg.success_resolved', 'success'); } // Add messages to response