1 contributor
<%
# API
my $api = gitprep_api;
# Parameters
my $user_id = param('user');
my $project_id = param('project');
my $issue_number = param('number');
my $op = param('op') // '';
# Issue
my $issue = app->dbi->model('issue')->select(
[
{__MY__ => '*'},
{open_user => ['id']}
],
where => {
'project.id' => $project_id,
'issue.number' => $issue_number
}
)->one;
my $errors;
if (lc $self->req->method eq 'post') {
if ($op eq 'reopen-issue') {
my $issue_row_id = app->dbi->model('issue')->select(
'issue.row_id',
where => {
'project__user.id' => $user_id,
'project.id' => $project_id,
number => $number
}
)->value;
app->dbi->model('issue')->update({open => 1}, where => {row_id => $issue_row_id});
$self->redirect_to;
return;
}
elsif ($op eq 'close-issue') {
my $issue_row_id = app->dbi->model('issue')->select(
'issue.row_id',
where => {
'project__user.id' => $user_id,
'project.id' => $project_id,
number => $number
}
)->value;
app->dbi->model('issue')->update({open => 0}, where => {row_id => $issue_row_id});
$self->redirect_to;
return;
}
elsif ($op eq 'add-comment') {
# Parameters
my $message = param('message');
# Validation
my $vc = app->vc;
my $validation = $vc->validation;
# Check Message
if (!length $message) {
$validation->add_failed(message => 'message is empty');
}
elsif (length $message > 1000) {
$validation->add_failed(message => 'message is too long');
}
if ($validation->is_valid) {
app->dbi->connector->txn(sub {
my $issue_row_id = app->dbi->model('issue')->select(
'issue.row_id',
where => {
'project__user.id' => $user_id,
'project.id' => $project_id,
number => $number
}
)->value;
# issue number
$issue_number = app->dbi->model('issue')->select(
'max(number)',
where => {row_id => $issue_row_id},
append => 'group by project'
)->value;
$issue_number++;
# New issue message
my $now_tm = Time::Moment->now_utc;
my $now_epoch = $now_tm->epoch;
my $session_user_row_id = $api->session_user_row_id;
my $new_issue_message = {
issue => $issue_row_id,
number => $issue_number,
message => $message,
create_time => $now_epoch,
update_time => $now_epoch,
user => $session_user_row_id
};
app->dbi->model('issue_message')->insert($new_issue_message);
$self->redirect_to;
return;
});
}
else {
$errors = $validation->messages;
}
}
}
# Issue message
my $issue_messages = app->dbi->model('issue_message')->select(
[
{__MY__ => '*'},
{user => ['id']}
],
where => {issue => $issue->{row_id}},
append => 'order by number'
)->all;
my $issue_messages_count = app->dbi->model('issue_message')->select(
'count(*)',
where => {issue => $issue->{row_id}},
)->value;
layout 'common', title => "Issue - $user_id/$project_id #$issue_number";
%>
%= include '/include/header';
<div class="container">
%= include '/include/errors', errors => $errors;
<div class="issue-left">
<div class="issue-panel">
<div class="issue-title-panel">
<div class="issue-title">
Some <%= $issue->{title} %> <span style="color:#aaa;">#<%= $issue->{number} %></span>
</div>
<div>
% if ($issue->{open}) {
<div class="issue-open">Open</div>
% } else {
<div class="issue-close">Close</div>
% }
<b><%= $issue->{'open_user.id'} %></b> <span style="color:#767676;">opened this issue <%= $api->age_string($issue->{open_time}) %> / <%= $issue_messages_count %> comment</span>
</div>
</div>
<div>
% for my $issue_message (@$issue_messages) {
<div class="issue-message">
<div class="issue-message-header">
<b><%= $issue_message->{'user.id'} %></b> <span style="color:#767676;">commented <%= $api->age_string($issue_message->{create_time}) %></span>
</div>
<div class="issue-message-body">
<%= $issue_message->{message} %>
</div>
</div>
% }
</div>
</div>
% if ($api->logined) {
<div class="issue-add-comment">
<form action="<%= url_for %>" method="post">
<%= hidden_field 'op' %>
<div class="issue-add-comment-message">
<%= text_area 'message' %>
</div>
<div class="issue-add-comment-bottom">
<div class="issue-add-comment-button-left">
Styling with Markdown is supported
</div>
<div class="issue-add-comment-button">
% if ($issue->{open}) {
<input type="submit" value="Close issue" onclick="$(this).closest('form').find('[name=op]').val('close-issue'); $(this).closest('form').submit();" class="btn">
% } else {
<input type="submit" value="Reopen issue" onclick="$(this).closest('form').find('[name=op]').val('reopen-issue'); $(this).closest('form').submit();" class="btn">
% }
<input type="submit" value="Comment" onclick="$(this).closest('form').find('[name=op]').val('add-comment'); $(this).closest('form').submit();" class="btn btn-success">
</div>
</div>
</form>
</div>
% }
</div>
</div>
%= include '/include/footer';