Showing 3 changed files with 103 additions and 18 deletions
+2 -1
lib/Gitprep.pm
... ...
@@ -205,6 +205,7 @@ sub startup {
205 205
       table => 'issue',
206 206
       join => [
207 207
         'left join project on issue.project = project.row_id',
208
+        'left join user as project__user on project.user = project__user.row_id',
208 209
         'left join pull_request on issue.pull_request = pull_request.row_id',
209 210
         'left join user as open_user on issue.open_user = open_user.row_id',
210 211
         'left join project as pull_request__base_project on pull_request.base_project = pull_request__base_project.row_id',
... ...
@@ -432,7 +433,7 @@ sub startup {
432 433
 
433 434
             # New issue
434 435
             $r->any('/issues/new' => sub { shift->render_maybe('/issues/new') })->to(tab => 'issues');
435
-            $r->get('/issues/:number' => sub { shift->render_maybe('/issue') })->to(tab => 'issues');
436
+            $r->any('/issues/:number' => sub { shift->render_maybe('/issue') })->to(tab => 'issues');
436 437
             
437 438
             # Pull requests
438 439
             $r->get('/pulls' => sub { shift->render_maybe('/pulls') })->to(tab => 'pulls');
+1
public/css/common.css
... ...
@@ -79,6 +79,7 @@
79 79
 .issue-message {
80 80
   border-radius:3px;
81 81
   border:1px solid #ddd;
82
+  margin-bottom:15px;
82 83
 }
83 84
 
84 85
 .issue-message-header {
+100 -17
templates/issue.html.ep
... ...
@@ -6,6 +6,7 @@
6 6
   my $user_id = param('user');
7 7
   my $project_id = param('project');
8 8
   my $issue_number = param('number');
9
+  my $op = param('op') // '';
9 10
 
10 11
   # Issue
11 12
   my $issue = app->dbi->model('issue')->select(
... ...
@@ -18,22 +19,99 @@
18 19
       'issue.number' => $issue_number
19 20
     }
20 21
   )->one;
21
-
22
-=pod
22
+  
23
+  my $errors;
23 24
   if (lc $self->req->method eq 'post') {
24
-    # New issue message
25
-    my $new_issue_message = {
26
-      issue => $new_issue_row_id,
27
-      number => 1,
28
-      message => $message,
29
-      create_time => $now_epoch,
30
-      update_time => $now_epoch,
31
-      user => $session_user_row_id
32
-    };
33
-    
34
-    app->dbi->model('issue_message')->insert($new_issue_message);
25
+    if ($op eq 'reopen-issue') {
26
+      my $issue_row_id = app->dbi->model('issue')->select(
27
+        'issue.row_id',
28
+        where => {
29
+          'project__user.id' => $user_id,
30
+          'project.id' => $project_id,
31
+          number => $number
32
+        }
33
+      )->value;
34
+      
35
+      app->dbi->model('issue')->update({open => 1}, where => {row_id => $issue_row_id});
36
+      
37
+      $self->redirect_to;
38
+      return;
39
+    }
40
+    elsif ($op eq 'close-issue') {
41
+      my $issue_row_id = app->dbi->model('issue')->select(
42
+        'issue.row_id',
43
+        where => {
44
+          'project__user.id' => $user_id,
45
+          'project.id' => $project_id,
46
+          number => $number
47
+        }
48
+      )->value;
49
+            
50
+      app->dbi->model('issue')->update({open => 0}, where => {row_id => $issue_row_id});
51
+      
52
+      $self->redirect_to;
53
+      return;
54
+    }
55
+    elsif ($op eq 'add-comment') {
56
+
57
+      # Parameters
58
+      my $message = param('message');
59
+      
60
+      # Validation
61
+      my $vc = app->vc;
62
+      my $validation = $vc->validation;
63
+      
64
+      # Check Message
65
+      if (!length $message) {
66
+        $validation->add_failed(message => 'message is empty');
67
+      }
68
+      elsif (length $message > 1000) {
69
+        $validation->add_failed(message => 'message is too long');
70
+      }
71
+      
72
+      if ($validation->is_valid) {
73
+        app->dbi->connector->txn(sub {
74
+          my $issue_row_id = app->dbi->model('issue')->select(
75
+            'issue.row_id',
76
+            where => {
77
+              'project__user.id' => $user_id,
78
+              'project.id' => $project_id,
79
+              number => $number
80
+            }
81
+          )->value;
82
+
83
+          # issue number
84
+          $issue_number = app->dbi->model('issue')->select(
85
+            'max(number)',
86
+            where => {row_id => $issue_row_id},
87
+            append => 'group by project'
88
+          )->value;
89
+          $issue_number++;
90
+
91
+          # New issue message
92
+          my $now_tm = Time::Moment->now_utc;
93
+          my $now_epoch = $now_tm->epoch;
94
+          my $session_user_row_id = $api->session_user_row_id;
95
+          my $new_issue_message = {
96
+            issue => $issue_row_id,
97
+            number => $issue_number,
98
+            message => $message,
99
+            create_time => $now_epoch,
100
+            update_time => $now_epoch,
101
+            user => $session_user_row_id
102
+          };
103
+          
104
+          app->dbi->model('issue_message')->insert($new_issue_message);
105
+ 
106
+          $self->redirect_to;
107
+          return;
108
+        });
109
+      }
110
+      else {
111
+        $errors = $validation->messages;
112
+      }
113
+    }
35 114
   }
36
-=cut
37 115
 
38 116
   # Issue message
39 117
   my $issue_messages = app->dbi->model('issue_message')->select(
... ...
@@ -56,6 +134,7 @@
56 134
 %= include '/include/header';
57 135
 
58 136
 <div class="container">
137
+  %= include '/include/errors', errors => $errors;
59 138
   <div class="issue-left">
60 139
     <div class="issue-panel">
61 140
       <div class="issue-title-panel">
... ...
@@ -88,7 +167,7 @@
88 167
     % if ($api->logined) {
89 168
       <div class="issue-add-comment">
90 169
         <form action="<%= url_for %>" method="post">
91
-          <%= hidden_field op => 'comment' %>
170
+          <%= hidden_field 'op' %>
92 171
           <div class="issue-add-comment-message">
93 172
             <%= text_area 'message' %>
94 173
           </div>
... ...
@@ -97,8 +176,12 @@
97 176
               Styling with Markdown is supported
98 177
             </div>
99 178
             <div class="issue-add-comment-button">
100
-              <%= submit_button 'Close issue', class => 'btn' %>
101
-              <%= submit_button 'Comment', class => 'btn btn-success' %>
179
+              % if ($issue->{open}) {
180
+                <input type="submit" value="Close issue" onclick="$(this).closest('form').find('[name=op]').val('close-issue'); $(this).closest('form').submit();" class="btn">
181
+              % } else {
182
+                <input type="submit" value="Reopen issue" onclick="$(this).closest('form').find('[name=op]').val('reopen-issue'); $(this).closest('form').submit();" class="btn">
183
+              % }
184
+              <input type="submit" value="Comment" onclick="$(this).closest('form').find('[name=op]').val('add-comment'); $(this).closest('form').submit();" class="btn btn-success">
102 185
             </div>
103 186
           </div>
104 187
         </form>