<% # 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') // ''; my $project_row_id = $api->get_project_row_id($user_id, $project_id); my $session_id = $api->session_user_id; # Issue my $issue = app->dbi->model('issue')->select( [ {__MY__ => '*'}, {open_user => ['id']} ], where => { project => $project_row_id, 'issue.number' => $issue_number } )->one; my $issue_row_id = $issue->{row_id}; my $errors; if (lc $self->req->method eq 'post') { if ($op eq 'reopen-issue') { app->dbi->model('issue')->update({open => 1}, where => {row_id => $issue_row_id}); $self->redirect_to; return; } elsif ($op eq 'close-issue') { 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) { $api->add_issue_message($user_id, $project_id, $number, $message); $self->redirect_to; return; } else { $errors = $validation->messages; } } elsif ($op eq 'api-delete-issue-message') { my $issue_message_row_id = param('issue_message_row_id'); my $json = $api->api_delete_issue_message($issue_message_row_id, $user_id); $self->render(json => $json); return; } elsif ($op eq 'api-update-issue-message') { my $issue_message_row_id = param('issue_message_row_id'); my $message = param('message'); my $json = $api->api_update_issue_message($issue_message_row_id, $message, $user_id); $self->render(json => $json); return; } elsif ($op eq 'api-toggle-label') { my $label_row_id = param('popup-label-row-id'); my $label_checked = app->dbi->model('issue_label')->select( where => {issue => $issue_row_id, label => $label_row_id} )->one; my $json = {}; if ($label_checked) { app->dbi->model('issue_label')->delete(where => {issue => $issue_row_id, label => $label_row_id}); $json->{checked} = 0; } else { app->dbi->model('issue_label')->insert({issue => $issue_row_id, label => $label_row_id}); my $label = app->dbi->model('label')->select(where => {row_id => $label_row_id})->one; $json->{checked} = 1; $json->{id} = $label->{id}; $json->{color} = $label->{color}; } $json->{success} = 1; $self->render(json => $json); return; } } # Issue message my $issue_messages = app->dbi->model('issue_message')->select( [ {__MY__ => '*'}, {user => ['id']} ], where => {issue => $issue->{row_id}}, append => 'order by number' )->all; # Issue message count my $issue_messages_count = app->dbi->model('issue_message')->select( 'count(*)', where => {issue => $issue->{row_id}}, )->value; # Participants my $participants = app->dbi->model('issue_message')->select( ['distinct user.id'], where => {issue => $issue->{row_id}}, )->values; # Labels my $labels = app->dbi->model('label')->select( {__MY__ => '*'}, where => {project => $project_row_id} )->all; # Issue labels my $issue_labels = app->dbi->model('issue_label')->select( {label => '*'}, where => {'issue_label.issue' => $issue_row_id}, appden => 'order by label.id' )->all; layout 'common', title => "Issue - $user_id/$project_id #$issue_number"; %> %= javascript begin $(document).ready(function() { %= include '/include/js/issue'; // Click labels btn $('.issue-labels-setting-btn').on('click', function () { var popup = $('.issue-labels-popup'); popup.css('display', 'block'); var top = $('.issue-labels').offset().top; var left = $('.issue-labels').offset().left; popup.css('top', (top + 30) + 'px'); popup.css('left', (left - 165) + 'px'); }); // Click label check button $('.issue-labels-popup-body li').on('click', function () { var that = this; var label_row_id = $(this).attr('popup-label-row-id'); $.post('<%= url_for %>', {'popup-label-row-id' : label_row_id, op : 'api-toggle-label'}, function (result) { if (result.success) { if (result.checked) { $(that).find('.issue-labels-popup-check i').css('display', 'block'); var li = '
  • ' + result.id + '
  • '; $('.issue-labels-setting-pallet').append(li); } else { $(that).find('.issue-labels-popup-check i').css('display', 'none'); $('.issue-labels-setting-pallet li').each(function () { if ($(this).attr('label-row-id') === label_row_id) { $(this).remove(); } }); } } }); }); // Click label popup close button $('.issue-labels-popup-close-btn').on('click', function () { $('.issue-labels-popup').hide(); }); }); % end %= include '/include/header';
    %= include '/include/errors', errors => $errors;
    Some <%= $issue->{title} %> #<%= $issue->{number} %>
    % if ($issue->{open}) {
    Open
    % } else {
    Close
    % } <%= $issue->{'open_user.id'} %> opened this issue <%= $api->age_string($issue->{open_time}) %> / <%= $issue_messages_count %> comment
    % for my $issue_message (@$issue_messages) { <% my %issue_message_param = ( user_id => $user_id, issue_message => $issue_message ); %> %= include '/include/issue_message', %issue_message_param; % }
    % if ($api->logined) {
    <%= hidden_field 'op' %>
    %= include '/include/issue_comment_icon';
    <%= text_area 'message' => '' %>
    Styling with Markdown is supported
    % if ($issue->{open}) { % } else { % }
    % }
    labels
    Apply labels to this issue
      % for my $label (@$labels) { % my $checked = app->dbi->model('issue_label')->select(where => {issue => $issue_row_id, label => $label->{row_id}})->one;
    • <%= $label->{id} %>
    • % }
    % if (@$labels) {
      % for my $issue_label (@$issue_labels) {
    • <%= $issue_label->{'label.id'} %>
    • % }
    % } else {
    • None yet
    % }
    <%= @$participants %> participants
    %= include '/include/footer';