diff --git a/client/views/Exam.jsx b/client/views/Exam.jsx index 593cf78e0e77632e37dc50ab714b74e5977d6959..f01f5fda3af505a8a321c5499a5ada6afb69809e 100644 --- a/client/views/Exam.jsx +++ b/client/views/Exam.jsx @@ -63,17 +63,7 @@ class Exams extends React.Component { previewing: false } } - if (prevState.problemIdToEditFeedbackOf && !prevState.editActive) { - if (prevState.waitForNextRender) { - var problem = newProps.exam.problems.find(w => { - return w.widget.id === prevState.problemIdToEditFeedbackOf - }) - prevState.widgets[problem.widget.id].problem.feedback = problem.feedback - prevState.waitForNextRender = false - if (!prevState.editActive) prevState.problemIdToEditFeedbackOf = null - } else prevState.waitForNextRender = true - } - return prevState + return null } componentDidUpdate = (prevProps, prevState) => { @@ -111,6 +101,20 @@ class Exams extends React.Component { problemIdToEditFeedbackOf: this.state.selectedWidgetId }) } + + updateFeedback = (feedback) => { + var widgets = this.state.widgets + const idx = widgets[this.state.selectedWidgetId].problem.feedback.findIndex(e => { return e.id == feedback.id }) + if(idx == -1) widgets[this.state.selectedWidgetId].problem.feedback.push(feedback) + else { + if(feedback.deleted) widgets[this.state.selectedWidgetId].problem.feedback.splice(idx, 1) + else widgets[this.state.selectedWidgetId].problem.feedback[idx] = feedback + } + this.setState({ + widgets:widgets + }) + } + backToFeedback = () => { this.props.updateExam(this.props.exam.id) this.setState({ @@ -351,7 +355,7 @@ class Exams extends React.Component { </div> {this.isProblemWidget(selectedWidgetId) && (this.state.editActive ? <EditPanel problemID={props.problem.id} feedback={this.state.feedbackToEdit} - goBack={this.backToFeedback} /> + goBack={this.backToFeedback} updateCallback={this.updateFeedback} /> : <FeedbackPanel examID={this.props.examID} problem={props.problem} editFeedback={this.editFeedback} showTooltips={this.state.showTooltips} grading={false} diff --git a/client/views/grade/EditPanel.jsx b/client/views/grade/EditPanel.jsx index 920145241ec3a5e65b22c24d70790f2ac1cf41ef..94161b1da690ded9b4a22206163e9b093cffa7eb 100644 --- a/client/views/grade/EditPanel.jsx +++ b/client/views/grade/EditPanel.jsx @@ -40,16 +40,19 @@ class EditPanel extends React.Component { } static getDerivedStateFromProps (nextProps, prevState) { + // In case nothing is set, use an empty function that no-ops + const updateCallback = nextProps.updateCallback || ( _ => {}) if (nextProps.feedback && prevState.id !== nextProps.feedback.id) { const fb = nextProps.feedback return { id: fb.id, name: fb.name, description: fb.description, - score: fb.score + score: fb.score, + updateCallback: updateCallback } } - return null + return {updateCallback: updateCallback} } changeText = (event) => { @@ -84,10 +87,15 @@ class EditPanel extends React.Component { if (this.state.id) { fb.id = this.state.id api.put(uri, fb) - .then(() => this.props.goBack()) + .then(() => { + this.state.updateCallback(fb) + this.props.goBack() + }) } else { api.post(uri, fb) - .then(() => { + .then((response) => { + // Response is the feedback option + this.state.updateCallback(response) this.setState({ id: null, name: '', @@ -101,7 +109,13 @@ class EditPanel extends React.Component { deleteFeedback = () => { if (this.state.id) { api.del('feedback/' + this.props.problemID + '/' + this.state.id) - .then(() => this.props.goBack()) + .then(() => { + this.state.updateCallback({ + id: this.state.id, + deleted: true + }) + this.props.goBack() + }) } }