From cd479e2f0cedbc7e076d3768b919da7da8f769ba Mon Sep 17 00:00:00 2001 From: Sarah Vaupel Date: Sat, 8 Feb 2020 00:48:07 +0100 Subject: [PATCH] fix(exam-correct): fix result info and response handling --- .../src/utils/exam-correct/exam-correct.js | 91 +++++++++++-------- 1 file changed, 54 insertions(+), 37 deletions(-) diff --git a/frontend/src/utils/exam-correct/exam-correct.js b/frontend/src/utils/exam-correct/exam-correct.js index 8cd9c0268..a7337c9eb 100644 --- a/frontend/src/utils/exam-correct/exam-correct.js +++ b/frontend/src/utils/exam-correct/exam-correct.js @@ -233,19 +233,37 @@ export class ExamCorrect { results[partKey] = parseFloat(input.value); } } - // console.log('results', results); - const result = this._resultSelect && this._resultSelect.value !== 'none' && this._resultSelect.value; + let result; + if (this._resultSelect) { + switch (this._resultSelect.value) { + case 'none': + result = undefined; + break; + case 'delete': + result = null; + break; + case 'passed': + case 'failed': + result = { status: 'attended', result: { Left: this._resultSelect.value } }; + break; + case 'attended': + result = { status: 'attended', result: { Right: this._resultGradeSelect.value } }; + break; + default: + result = { status: this._resultSelect.value }; + } + } // abort send if there are neither part-results nor an exam-result (after validation) - if (Object.keys(results).length <= 0 && (!result || result === 'none')) return; + if (Object.keys(results).length <= 0 && result === undefined) return; const rowInfo = { users: [user], status: STATUS.LOADING, }; if (results && results !== {}) rowInfo.results = results; - if (result && result !== 'none') rowInfo.result = result; + if (result !== undefined) rowInfo.result = result; this._addRow(rowInfo); // clear inputs on validation success @@ -268,7 +286,7 @@ export class ExamCorrect { }); } - _processResponse(request, response, user, targetRow, ...results) { + _processResponse(request, response, user, targetRow, ...results) { // eslint-disable-line no-unused-vars if (response) { if (response.status === 'no-op') { if (response.users) { @@ -324,8 +342,8 @@ export class ExamCorrect { const savedEntries = this._storageManager.load('entries') || []; let newEntry = { users: null, - results: null, - result: null, + results: {}, + result: undefined, status: STATUS.FAILURE, message: null, date: null, @@ -341,12 +359,12 @@ export class ExamCorrect { case 'success': status = STATUS.SUCCESS; if (response.user) { - const timeElem = row.cells.item(0); + const timeElem = row.cells.item(this._cIndices.get('date')); timeElem.innerHTML = moment(response.time).format(this._dateFormat); timeElem.classList.remove('exam-correct--local-time'); newEntry.users = [response.user]; newEntry.results = response.results; - newEntry.result = response.grade; + if (response.grade !== undefined) newEntry.result = response.grade; } else { console.error('Invalid response'); return; @@ -357,16 +375,12 @@ export class ExamCorrect { // TODO set edit button visibility status = STATUS.AMBIGUOUS; newEntry.users = response.users; - newEntry.results = typeof results === 'undefined' ? {} : results; - newEntry.result = typeof result === 'undefined' ? undefined : result; // eslint-disable-line no-undef newEntry.message = response.message || null; break; case 'failure': status = STATUS.FAILURE; newEntry.users = (response.user && [response.user]) || null; - newEntry.results = typeof results === 'undefined' ? {} : results; newEntry.message = response.message || null; - newEntry.result = typeof result === 'undefined' ? undefined : result; // eslint-disable-line no-undef break; default: // TODO show tooltip with 'invalid response' @@ -413,6 +427,14 @@ export class ExamCorrect { } } + if (newEntry.result !== undefined) { + const examResultCell = row.cells.item(this._cIndices.get('result')); + if (examResultCell) { + examResultCell.innerHTML = this._examResultToHTML(newEntry.result); + examResultCell.classList.remove('exam-correct--result-unconfirmed'); + } + } + savedEntries.push(newEntry); this._storageManager.save('entries', savedEntries); return; @@ -426,6 +448,21 @@ export class ExamCorrect { } } + _examResultToHTML(examResult) { + let html = ''; + + if (examResult) { + if (examResult.status === 'attended') + html = examResult.result.Left || examResult.result.Right; + else + html = examResult.status; + } else if (examResult === null) { + html = ''; + } + + return html; + } + // TODO better name _showUserList(row, users, results) { let userElem = row.cells.item(this._cIndices.get('user')); @@ -525,8 +562,8 @@ export class ExamCorrect { const resultCell = document.createElement('TD'); resultCell.colSpan = 2; - if (rowInfo.result) - resultCell.innerHTML = rowInfo.result === 'attended' ? this._resultGradeSelect.value : rowInfo.result; + resultCell.innerHTML = this._examResultToHTML(rowInfo.result); + resultCell.classList.add('exam-correct--result-unconfirmed'); cells.set(this._cIndices.get('result'), resultCell); const statusCell = document.createElement('TD'); @@ -563,28 +600,8 @@ export class ExamCorrect { if (partResults && Object.entries(partResults).length !== 0) body.results = partResults; - if (examResult) { - switch (examResult) { - case 'none': - break; - case 'delete': - body.grade = null; - break; - case 'attended': - body.grade = { status: examResult, result: { Right: this._resultGradeSelect.value } }; - break; - case 'passed': - case 'failed': - body.grade = { status: 'attended', result: { Left: examResult } }; - break; - case 'no-show': - case 'voided': - body.grade = { status: examResult }; - break; - default: - break; // TODO work in progress - } - } + if (examResult !== undefined) + body.grade = examResult; return body; }