support markdown table
|
1 |
<% |
2 |
# API |
|
3 |
my $api = gitprep_api; |
|
4 | ||
5 |
# Parameters |
|
6 |
my $user_id = param('user'); |
|
7 |
my $project_id = param('project'); |
|
8 |
my $issue_number = param('number'); |
|
add new issue feature
|
9 |
|
add labels to issues
|
10 |
unless ($api->logined) { |
11 |
$self->redirect_to("/$user_id/$project_id/issues"); |
|
12 |
return; |
|
13 |
} |
|
14 |
|
|
add new issue feature
|
15 |
my $errors; |
16 |
if (lc $self->req->method eq 'post') { |
|
17 |
my $op = param('op'); |
|
support markdown table
|
18 | |
add new issue feature
|
19 |
if ($op eq 'create') { |
20 |
|
|
21 |
# Parameters |
|
22 |
my $title = param('title'); |
|
23 |
my $message = param('message'); |
|
24 |
|
|
25 |
# Validation |
|
26 |
my $vc = app->vc; |
|
27 |
my $validation = $vc->validation; |
|
28 |
|
|
29 |
# Check title |
|
30 |
if (!(defined $title && length $title)) { |
|
31 |
$validation->add_failed(title => 'title is empty'); |
|
32 |
} |
|
33 |
elsif (length $title > 300) { |
|
34 |
$validation->add_failed(title => 'title is too long'); |
|
35 |
} |
|
36 |
|
|
37 |
# Message |
|
38 |
if (!(defined $message && length $message)) { |
|
39 |
$message = ''; |
|
40 |
if (length $message > 1000) { |
|
41 |
$validation->add_failed(message => 'message is too long'); |
|
42 |
} |
|
43 |
} |
|
44 |
|
|
45 |
if ($validation->is_valid) { |
|
46 |
my $project_row_id = app->dbi->model('project')->select( |
|
47 |
'project.row_id', |
|
48 |
where => {'user.id' => $user_id, 'project.id' => $project_id} |
|
49 |
)->value; |
|
50 |
|
|
51 |
my $issue; |
|
52 |
my $now_tm = Time::Moment->now_utc; |
|
53 |
my $now_epoch = $now_tm->epoch; |
|
54 |
my $session_user_row_id = $api->session_user_row_id; |
|
55 |
my $issue_number; |
|
56 |
|
|
57 |
app->dbi->connector->txn(sub { |
|
58 | ||
59 |
# issue number |
|
60 |
$issue_number = app->dbi->model('issue')->select( |
|
61 |
'max(number)', |
|
62 |
where => {project => $project_row_id}, |
|
63 |
append => 'group by project' |
|
64 |
)->value; |
|
65 |
$issue_number++; |
|
66 |
|
|
67 |
# New issue |
|
68 |
my $new_issue = { |
|
69 |
title => $title, |
|
70 |
open => 1, |
|
71 |
open_time => $now_epoch, |
|
72 |
open_user => $session_user_row_id, |
|
73 |
pull_request => 0, |
|
74 |
project => $project_row_id, |
|
75 |
number => $issue_number |
|
76 |
}; |
|
77 |
app->dbi->model('issue')->insert($new_issue); |
|
78 |
my $new_issue_row_id = app->dbi->execute("select LAST_INSERT_ROWID()")->value; |
|
79 |
|
|
80 |
# New issue message |
|
81 |
my $new_issue_message = { |
|
82 |
issue => $new_issue_row_id, |
|
83 |
number => 1, |
|
84 |
message => $message, |
|
85 |
create_time => $now_epoch, |
|
86 |
update_time => $now_epoch, |
|
87 |
user => $session_user_row_id |
|
88 |
}; |
|
89 |
|
|
90 |
app->dbi->model('issue_message')->insert($new_issue_message); |
|
91 |
}); |
|
92 |
|
|
93 |
$self->redirect_to("/$user_id/$project_id/issues/$issue_number"); |
|
94 |
return; |
|
95 |
} |
|
96 |
else { |
|
97 |
$errors = $validation->messages; |
|
98 |
} |
|
99 |
} |
|
100 |
} |
|
101 |
|
|
support markdown table
|
102 |
layout 'common', title => "New issue - $user_id/$project_id"; |
103 |
%> |
|
add new issue feature
|
104 | |
imrpvoe new issue form
|
105 |
%= javascript begin |
106 |
$(document).ready(function() { |
|
fix new issue js bug
|
107 |
%= include '/include/js/issue'; |
imrpvoe new issue form
|
108 |
}); |
109 |
% end |
|
110 | ||
add new issue feature
|
111 |
%= include '/include/header'; |
112 |
<div class="container"> |
|
113 |
%= include '/include/errors', errors => $errors; |
|
imrpvoe new issue form
|
114 |
<div class="issue-add-comment" style="width:80%"> |
add new issue feature
|
115 |
<form action="<%= url_for %>" method="post"> |
116 |
<%= hidden_field op => 'create' %> |
|
imrpvoe new issue form
|
117 |
<div class="issue-add-comment-header"> |
118 |
<div class="issue-add-comment-title"> |
|
119 |
<%= text_field 'title' %> |
|
120 |
</div> |
|
fix new issue js bug
|
121 |
<div class="issue-message-write-tab issue-add-comment-header-tab"><a href="javascript:void(0)">Write</a></div> |
122 |
<div class="issue-message-preview-tab issue-add-comment-header-tab"><a class="disable" href="javascript:void(0)">Preview</a></div> |
|
123 |
%= include '/include/issue_comment_icon'; |
|
add new issue feature
|
124 |
</div> |
imrpvoe new issue form
|
125 |
<div class="issue-add-comment-body"> |
fix new issue js bug
|
126 |
<div class="issue-message-write-area issue-add-comment-message"> |
imrpvoe new issue form
|
127 |
<%= text_area 'message' %> |
128 |
</div> |
|
fix new issue js bug
|
129 |
<div class="issue-message-preview-area issue-add-comment-preview markdown-body" style="padding:10px"> |
imrpvoe new issue form
|
130 |
</div> |
131 |
<div class="issue-add-comment-bottom"> |
|
132 |
<div class="issue-add-comment-button-left"> |
|
133 |
Styling with Markdown is supported |
|
134 |
</div> |
|
135 |
<div class="issue-add-comment-button"> |
|
rename btn-success to btn-gr...
|
136 |
<input type="submit" value="Submit new issue" class="btn btn-green"> |
imrpvoe new issue form
|
137 |
</div> |
138 |
</div> |
|
add new issue feature
|
139 |
</div> |
140 |
</form> |
|
141 |
</div> |
|
142 |
</div> |
|
143 | ||
144 |
%= include '/include/footer'; |