diff --git a/assets/javascripts/openqa.js b/assets/javascripts/openqa.js index 6021400ad1c..70cddfbc2bb 100644 --- a/assets/javascripts/openqa.js +++ b/assets/javascripts/openqa.js @@ -238,7 +238,12 @@ function forceJobRestartViaRestartLink(restartLink) { restartLink.click(); } -function restartJob(ajaxUrl, jobId) { +function restartJob(ajaxUrl, jobIds, comment) { + let singleJobId; + if (!Array.isArray(jobIds)) { + singleJobId = jobIds; + jobIds = [jobIds]; + } var showError = function (reason) { var errorMessage = 'Unable to restart job'; if (reason) { @@ -248,8 +253,11 @@ function restartJob(ajaxUrl, jobId) { } addFlash('danger', errorMessage); }; - - return fetchWithCSRF(ajaxUrl, {method: 'POST'}) + const body = { + jobs: jobIds, + comment: comment + }; + return fetchWithCSRF(ajaxUrl, {method: 'POST', body: JSON.stringify(body)}) .then(response => { if (!response.ok) throw `Server returned ${response.status}: ${response.statusText}`; return response.json(); @@ -257,7 +265,14 @@ function restartJob(ajaxUrl, jobId) { .then(responseJSON => { var newJobUrl; try { - newJobUrl = responseJSON.test_url[0][jobId]; + if (singleJobId) { + newJobUrl = responseJSON.test_url[0][singleJobId]; + } else { + var testUrlData = responseJSON.test_url; + if (testUrlData && Array.isArray(testUrlData)) { + newJobUrl = testUrlData.map(item => Object.values(item)[0]); + } + } } catch { // Intentionally ignore all errors } @@ -265,13 +280,20 @@ function restartJob(ajaxUrl, jobId) { showJobRestartResults( responseJSON, newJobUrl, - restartJob.bind(undefined, addParam(ajaxUrl, 'force', '1'), jobId) + restartJob.bind(undefined, addParam(ajaxUrl, 'force', '1'), jobIds, comment) ) ) { return; } if (newJobUrl) { - window.location.replace(newJobUrl); + if (Array.isArray(newJobUrl)) { + addFlash('info', 'Overview will be reloaded'); + setTimeout(() => { + window.location.reload(); + }, 2000); + } else { + window.location.replace(newJobUrl); + } } else { throw 'URL for new job not available'; } diff --git a/assets/javascripts/overview.js b/assets/javascripts/overview.js index 8f1d5322aa1..6e68c415547 100644 --- a/assets/javascripts/overview.js +++ b/assets/javascripts/overview.js @@ -287,49 +287,57 @@ function showAddCommentsDialog() { modal.show(); } -function restartOrCommentJobs(form) { +function restartJobs(btn) { + const form = btn.closest('form'); const text = form.elements.text.value; + const jobs = btn.dataset.jobs + .split(',') + .map(Number) + .filter(n => !isNaN(n)); + const apiUrl = btn.dataset.url; if (!text.length) { return window.alert("The comment text mustn't be empty."); } - const actionBtn = form.clickedButton ? form.clickedButton.value : null; - console.log(actionBtn); - let reqUrl = form.clickedButton.getAttribute('formaction'); - console.log(form.clickedButton.getAttribute('formaction')); - const progressIndication = document.getElementById('add-comments-progress-indication'); + + const progressIndication = document.getElementById('add-comments-progress-indication'); const controls = document.getElementById('add-comments-controls'); progressIndication.style.display = 'flex'; controls.style.display = 'none'; - const done = () => { + restartJob(apiUrl, jobs, text); + setTimeout(() => { progressIndication.style.display = 'none'; controls.style.display = 'inline'; window.addCommentsModal.hide(); - }; + }, 500); +} - let infoText = - 'The comments have been created. Reload the page to show changes.'; - let errText = 'The comments could not be added:'; - if (actionBtn === 'restartAndCommentJobs') { - infoText = 'Reload the page to show restarted jobs.'; - errText = 'Failed to restart jobs: '; +function addComments(btn) { + const form = btn.closest('form'); + const text = form.elements.text.value; + const apiUrl = btn.dataset.url; + if (!text.length) { + return window.alert("The comment text mustn't be empty."); } - fetchWithCSRF(reqUrl, {method: 'POST', body: new FormData(form)}) + const progressIndication = document.getElementById('add-comments-progress-indication'); + const controls = document.getElementById('add-comments-controls'); + progressIndication.style.display = 'flex'; + controls.style.display = 'none'; + const done = () => { + progressIndication.style.display = 'none'; + controls.style.display = 'inline'; + window.addCommentsModal.hide(); + }; + fetchWithCSRF(apiUrl, {method: 'POST', body: new FormData(form)}) .then(response => { if (!response.ok) throw `Server returned ${response.status}: ${response.statusText}`; - addFlash('info', infoText); + addFlash( + 'info', + 'The comments have been created. Reload the page to show changes.' + ); done(); - return response.json(); - }) - .then(resData => { - console.log(resData); - if (resData.errors && resData.errors.length > 0) { - for (let i in resData.errors) { - addFlash('warning', 'Warning: Errors found in Response:\n' + resData.errors[i].trim()); - } - } }) .catch(error => { - addFlash('danger', `${errText} ${error}`); + addFlash('danger', `The comments could not be added: ${error}`); done(); }); } diff --git a/t/ui/10-tests_overview.t b/t/ui/10-tests_overview.t index 9ba9199e105..b973462880a 100644 --- a/t/ui/10-tests_overview.t +++ b/t/ui/10-tests_overview.t @@ -592,7 +592,7 @@ subtest 'add comments' => sub { is $submit_button->get_text, 'Restart and comment on 2 jobs', 'submit button displayed with number of jobs'; $submit_button->click; wait_for_ajax msg => 'comments created'; - like $driver->find_element_by_id('flash-messages')->get_text, qr/Reload the page to show restarted jobs/, + like $driver->find_element_by_id('flash-messages')->get_text, qr/Overview will be reloaded/, 'info about successful restart shown'; my @failed_job_ids = map { $_->id } $jobs->search({result => FAILED})->all; is $comments->search({job_id => {-not_in => \@failed_job_ids}, text => $comment_text})->count, 0, diff --git a/templates/webapi/test/overview.html.ep b/templates/webapi/test/overview.html.ep index b0a9e10f672..760d635bdaa 100644 --- a/templates/webapi/test/overview.html.ep +++ b/templates/webapi/test/overview.html.ep @@ -221,7 +221,7 @@