Skip to content

Commit

Permalink
Add option to restart jobs upon comment submission
Browse files Browse the repository at this point in the history
- Renamed `addComments` to `bulkJobsAction` to handle both commenting and
restarting jobs.
- Added button-specific actions using `form.clickedButton`.
- Updated `fetchWithCSRF` logic to dynamically determine request URLs based on
the button clicked.
- Introduced separate success and error messages for restarting and commenting
actions.
- Updated HTML to include "Restart and Comment" and "Comment" buttons with
individual data URLs. Let "comments" be `btn-danger` and "restart" show less
dangerous operation using `btn-warning`.
- Adjusted modal to allow submission of comments or restarts through the
correct action handlers.

These updates enhance the user experience by allowing users to either comment
on jobs, or perform restart with a comment simultaneously from the
overview page. Comments always add to the original job of the overview
page. By integrating this functionality we provide a workflow for
users managing multiple jobs on the overview page using the already existing
API implementations.

https://progress.opensuse.org/issues/166559

Signed-off-by: Ioannis Bonatakis <[email protected]>
  • Loading branch information
b10n1k committed Oct 14, 2024
1 parent fc5ba82 commit e188f9e
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 36 deletions.
21 changes: 14 additions & 7 deletions assets/javascripts/overview.js
Original file line number Diff line number Diff line change
Expand Up @@ -287,11 +287,13 @@ function showAddCommentsDialog() {
modal.show();
}

function addComments(form) {
function bulkJobsAction(form) {
const text = form.elements.text.value;
if (!text.length) {
return window.alert("The comment text mustn't be empty.");
}
const actionBtn = form.clickedButton ? form.clickedButton.value : null;
let reqUrl = form.clickedButton ? (form.clickedButton.dataset.url ?? form.action) : form.action;
const progressIndication = document.getElementById('add-comments-progress-indication');
const controls = document.getElementById('add-comments-controls');
progressIndication.style.display = 'flex';
Expand All @@ -301,17 +303,22 @@ function addComments(form) {
controls.style.display = 'inline';
window.addCommentsModal.hide();
};
fetchWithCSRF(form.action, {method: 'POST', body: new FormData(form)})

let infoText =
'The comments have been created. <a href="javascript: location.reload()">Reload</a> the page to show changes.';
let errText = 'The comments could not be added:';
if (actionBtn === 'restartAndCommentJobs') {
infoText = '<a href="javascript: location.reload()">Reload</a> the page to show restarted jobs.';
errText = 'Failed to restart jobs: ';
}
fetchWithCSRF(reqUrl, {method: 'POST', body: new FormData(form)})
.then(response => {
if (!response.ok) throw `Server returned ${response.status}: ${response.statusText}`;
addFlash(
'info',
'The comments have been created. <a href="javascript: location.reload()">Reload</a> the page to show changes.'
);
addFlash('info', infoText);
done();
})
.catch(error => {
addFlash('danger', `The comments could not be added: ${error}`);
addFlash('danger', `${errText} ${error}`);
done();
});
}
63 changes: 41 additions & 22 deletions t/ui/10-tests_overview.t
Original file line number Diff line number Diff line change
Expand Up @@ -543,18 +543,35 @@ subtest 'filter by result and state' => sub {
ok !$driver->find_element_by_id('filter-failed')->is_selected, 'other checkbox not checked';
};


subtest "job template names displayed on 'Test result overview' page" => sub {
$driver->get('/group_overview/1002');
is($driver->find_element('.progress-bar-unfinished')->get_text(),
'1 unfinished', 'The number of unfinished jobs is right');

$driver->get('/tests/overview?distri=opensuse&version=13.1&build=0091&groupid=1002');
my @tds = $driver->find_elements('#results_DVD tbody tr .name');
is($tds[0]->get_text(), 'kde_variant', 'job template name kde_variant displayed correctly');

my @descriptions = $driver->find_elements('td.name a', 'css');
is(scalar @descriptions, 2, 'only test suites with description content are shown as links');
disable_bootstrap_animations;
$descriptions[0]->click();
is(wait_for_element(selector => '.popover-header')->get_text, 'kde_variant', 'description popover shows content');
};

subtest 'add comments' => sub {
my @buttons = $driver->find_elements('button[title="Add comments"]');
my @buttons = $driver->find_elements('button[title="Restart or comment jobs"]');
is @buttons, 0, 'button for adding comments not present if not logged-in';

$driver->find_element_by_link_text('Login')->click;
$driver->get('/tests/overview?state=done&result=failed');
disable_bootstrap_animations;
$driver->find_element('button[title="Add comments"]')->click;
$driver->find_element('button[title="Restart or comment jobs"]')->click;
my $comment_text = 'comment via add-comments';
my $submit_button = $driver->find_element('#add-comments-controls button[type="submit"]');
$driver->find_element_by_id('text')->send_keys($comment_text);
is $submit_button->get_text, 'Submit comment on all 2 jobs', 'submit button displayed with number of jobs';
my $submit_button = $driver->find_element('#add-comments-controls button[id="commentJobsBtn"]');
$driver->find_element_by_id('text')->send_keys($comment_text); #sleep(300);
is $submit_button->get_text, 'Comment on all 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/The comments have been created. Reload/,
Expand All @@ -565,23 +582,25 @@ subtest 'add comments' => sub {
'comments created on all relevant jobs';
is $comments->search({job_id => {-not_in => \@failed_job_ids}, text => $comment_text})->count, 0,
'comments not created on other jobs';
};

subtest "job template names displayed on 'Test result overview' page" => sub {
$driver->get('/group_overview/1002');
is($driver->find_element('.progress-bar-failed')->get_text(), '1 failed', 'The number of failed jobs is right');
is($driver->find_element('.progress-bar-unfinished')->get_text(),
'1 unfinished', 'The number of unfinished jobs is right');

$driver->get('/tests/overview?distri=opensuse&version=13.1&build=0091&groupid=1002');
my @tds = $driver->find_elements('#results_DVD tbody tr .name');
is($tds[0]->get_text(), 'kde_variant', 'job template name kde_variant displayed correctly');

my @descriptions = $driver->find_elements('td.name a', 'css');
is(scalar @descriptions, 2, 'only test suites with description content are shown as links');
disable_bootstrap_animations;
$descriptions[0]->click();
is(wait_for_element(selector => '.popover-header')->get_text, 'kde_variant', 'description popover shows content');
subtest 'restart jobs with comment' => sub {
$driver->get('/tests/overview?state=done&result=failed');
disable_bootstrap_animations;
$driver->find_element('button[title="Restart or comment jobs"]')->click;
my $comment_text = 'comment current jobs and restart';
my $submit_button = $driver->find_element('#add-comments-controls button[id="restartAndCommentJobsBtn"]');
$driver->find_element_by_id('text')->send_keys($comment_text);
is $submit_button->get_text, 'Restart and Comment 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/,
'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,
'comments not created on other jobs';
my $running_job_ids = map { $_->id } $jobs->search({state => RUNNING})->all;
is $running_job_ids, 2, 'all relevant jobs restarted';
};
};

subtest "job dependencies displayed on 'Test result overview' page" => sub {
Expand All @@ -591,7 +610,7 @@ subtest "job dependencies displayed on 'Test result overview' page" => sub {
my @child_elements = $driver->find_child_elements($deps, 'a');
my $details = $child_elements[0];
like $details->get_attribute('href'), qr{tests/99963\#dependencies}, 'job href is shown correctly';
is $details->get_attribute('title'), "1 parallel parent\ndependency passed", 'dependency is shown correctly';
is $details->get_attribute('title'), "1 parallel parent\ndependency failed", 'dependency is shown correctly';

my $parent_ele = $driver->find_element('td#res_DVD_i586_kde .parents_children');
$driver->move_to(element => $parent_ele);
Expand Down
26 changes: 19 additions & 7 deletions templates/webapi/test/overview.html.ep
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,12 @@
<div class="card-body">
% my $allow_commenting = @$job_ids && current_user;
% if ($allow_commenting) {
<button type="button" class="btn btn-secondary btn-circle btn-sm trigger-edit-button" onclick="showAddCommentsDialog()" title="Add comments">
<i class="fa fa-comment" aria-hidden="true"></i>
<button type="button" class="btn btn-secondary btn-circle btn-sm
trigger-edit-button" onclick="showAddCommentsDialog()" title="Restart or comment jobs">
<span class="fa-stack" style="font-size: 0.9em" >
<i class="fa fa-comment fa-stack-2x text-danger-info" aria-hidden="true"></i>
<i class="fa fa-undo fa-stack-1x fa-inverse text-danger" aria-hidden="true"></i>
</span>
</button>
% }
% my @badges = qw(success secondary warning danger info primary light light);
Expand Down Expand Up @@ -217,7 +221,7 @@
<div class="modal fade" id="add-comments-modal">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form action="<%= url_for('apiv1_post_comments')->query(job_id => $job_ids) %>" method="post" onsubmit="addComments(this); return false;">
<form action="<%= url_for('apiv1_restart_jobs')->query(jobs => $job_ids) %>" method="post" onsubmit="bulkJobsAction(this); return false;">
<div class="modal-header">
<h4 class="modal-title">Add comment on all currently shown jobs</h4>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
Expand All @@ -231,10 +235,18 @@
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
<div id="add-comments-controls">
<button type="submit" class="btn btn-danger">
<i class="fa fa-comment"></i> Submit comment on all <%= scalar @$job_ids %> jobs
</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Discard</button>
<button type="submit" name="bulkAction" class="btn btn-warning"
value="restartAndCommentJobs"
id="restartAndCommentJobsBtn" onclick="form.clickedButton = this;">
<i class="fa fa-play-circle-o"></i> Restart and Comment <%= scalar @$job_ids %> jobs
</button>
<button type="submit" name="bulkAction" class="btn btn-danger"
value="commentJobs" id="commentJobsBtn"
data-url="<%= url_for('apiv1_post_comments')->query(job_id=>$job_ids) %>"
onclick="form.clickedButton = this;">
<i class="fa fa-comment"></i> Comment on all <%= scalar @$job_ids %> jobs
</button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Discard</button>
</div>
</div>
</form>
Expand Down

0 comments on commit e188f9e

Please sign in to comment.