From e252be2fef3732f04b333a909860df985b786fd5 Mon Sep 17 00:00:00 2001 From: Sarah Vaupel Date: Tue, 21 Jan 2020 18:49:53 +0100 Subject: [PATCH] feat(exam-correct): resend option on ambiguous entries (TODO refactor) --- .../src/utils/exam-correct/exam-correct.js | 67 +++++++++++++++---- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/frontend/src/utils/exam-correct/exam-correct.js b/frontend/src/utils/exam-correct/exam-correct.js index 426a7952e..a7b7612a2 100644 --- a/frontend/src/utils/exam-correct/exam-correct.js +++ b/frontend/src/utils/exam-correct/exam-correct.js @@ -162,7 +162,10 @@ export class ExamCorrect { } const partKey = input.getAttribute(EXAM_CORRECT_PART_INPUT_ATTR); - if (!partKey) throw new Error('Exam part input without part attribute!'); + if (!partKey) { + console.error('Error while parsing results: Could not detect exam part key attribute'); + return; + } results[partKey] = parseFloat(input.value); } } @@ -215,13 +218,13 @@ export class ExamCorrect { }).then( (response) => response.json() ).then( - (response) => this._processResponse(response, user) + (response) => this._processResponse(response, user, results) ).catch((error) => { console.error('Error while processing response', error); }); } - _processResponse(response, user) { + _processResponse(response, user, results) { if (response) { if (response.status === 'no-op') { if (response.users) { @@ -247,7 +250,7 @@ export class ExamCorrect { setStatus(this._userInputStatus, STATUS.AMBIGUOUS); // TODO how to destroy candidate handlers? response.users.forEach((userCandidate) => { - const candidateItem = document.createElement('li'); + const candidateItem = document.createElement('LI'); candidateItem.innerHTML = userToHTML(userCandidate); candidateItem.setAttribute(EXAM_CORRECT_USER_ATTR, userCandidate.id); @@ -298,7 +301,7 @@ export class ExamCorrect { // TODO set edit button visibility status = STATUS.AMBIGUOUS; if (response.users) { - this._showUserList(userElem, response.users); + this._showUserList(row, response.users, results); } break; case 'failure': @@ -327,9 +330,10 @@ export class ExamCorrect { } // TODO better name - _showUserList(elem, users) { + _showUserList(row, users, results) { + const userElem = row.cells.item(1); if (users) { - removeAllChildren(elem); + removeAllChildren(userElem); const list = document.createElement('UL'); for (const user of users) { const listItem = document.createElement('LI'); @@ -337,18 +341,57 @@ export class ExamCorrect { listItem.setAttribute(EXAM_CORRECT_USER_ATTR, user.id); listItem.setAttribute(EXAM_CORRECT_USER_DNAME_ATTR, user['display-name']); // TODO destroy event handler - //const acceptCandidateHandler = () => { - // elem.innerHTML = userToHTML(user); - //}; - //listItem.addEventListener('click', acceptCandidateHandler); + const acceptCandidateHandler = () => { + userElem.innerHTML = userToHTML(user); + this._rowToRequest(row, listItem, results); + }; + listItem.addEventListener('click', acceptCandidateHandler); list.appendChild(listItem); } - elem.appendChild(list); + userElem.appendChild(list); } else { console.error('Unable to show users from invalid response'); } } + _rowToRequest(row, listItem, results) { + const now = moment(); + const timeElem = row.cells.item(0); + timeElem.innerHTML = now.format(MOMENT_FORMAT); + timeElem.classList.add('exam-correct--local-time'); + const userElem = row.cells.item(1); + const statusElem = row.querySelector('.exam-correct--ambiguous'); + + setStatus(statusElem, STATUS.LOADING); + + const body = { + user: listItem.getAttribute(EXAM_CORRECT_USER_ATTR), + results: results, + }; + + this._app.httpClient.post({ + url: EXAM_CORRECT_URL_POST, + headers: EXAM_CORRECT_HEADERS, + body: JSON.stringify(body), + }).then( + (response) => response.json() + ).then((response) => { + switch (response.status) { + case 'success': + userElem.innerHTML = userToHTML(response.user); + // TODO replace part results with results from server + timeElem.innerHTML = moment(response.time).format(MOMENT_FORMAT); + timeElem.classList.remove('exam-correct--local-time'); + setStatus(statusElem, STATUS.SUCCESS); + break; + default: + // non-success response on request with a uuid => panic and ignore for now + } + }).catch((error) => { + console.error(error); + }); + } + _clearUserInput() { removeAllChildren(this._userInputCandidates); clearInput(this._userInput);