add new issue feature
|
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'); |
|
can add new issue message an...
|
9 |
my $op = param('op') // ''; |
add label apply
|
10 | |
11 |
my $project_row_id = $api->get_project_row_id($user_id, $project_id); |
|
add issue message delete fea...
|
12 |
|
13 |
my $session_id = $api->session_user_id; |
|
add new issue feature
|
14 | |
add issue messages page
|
15 |
# Issue |
16 |
my $issue = app->dbi->model('issue')->select( |
|
17 |
[ |
|
18 |
{__MY__ => '*'}, |
|
19 |
{open_user => ['id']} |
|
20 |
], |
|
21 |
where => { |
|
add label apply
|
22 |
project => $project_row_id, |
add issue messages page
|
23 |
'issue.number' => $issue_number |
24 |
} |
|
25 |
)->one; |
|
add label apply
|
26 |
my $issue_row_id = $issue->{row_id}; |
can add new issue message an...
|
27 |
|
28 |
my $errors; |
|
add comment form
|
29 |
if (lc $self->req->method eq 'post') { |
can add new issue message an...
|
30 |
if ($op eq 'reopen-issue') { |
31 |
app->dbi->model('issue')->update({open => 1}, where => {row_id => $issue_row_id}); |
|
32 |
|
|
33 |
$self->redirect_to; |
|
34 |
return; |
|
35 |
} |
|
36 |
elsif ($op eq 'close-issue') { |
|
37 |
app->dbi->model('issue')->update({open => 0}, where => {row_id => $issue_row_id}); |
|
38 |
|
|
39 |
$self->redirect_to; |
|
40 |
return; |
|
41 |
} |
|
42 |
elsif ($op eq 'add-comment') { |
|
43 | ||
44 |
# Parameters |
|
45 |
my $message = param('message'); |
|
46 |
|
|
47 |
# Validation |
|
48 |
my $vc = app->vc; |
|
49 |
my $validation = $vc->validation; |
|
50 |
|
|
51 |
# Check Message |
|
52 |
if (!length $message) { |
|
53 |
$validation->add_failed(message => 'message is empty'); |
|
54 |
} |
|
55 |
elsif (length $message > 1000) { |
|
56 |
$validation->add_failed(message => 'message is too long'); |
|
57 |
} |
|
58 |
|
|
59 |
if ($validation->is_valid) { |
|
60 | ||
improve pull request. add co...
|
61 |
$api->add_issue_message($user_id, $project_id, $number, $message); |
62 |
|
|
63 |
$self->redirect_to; |
|
64 |
return; |
|
can add new issue message an...
|
65 |
} |
66 |
else { |
|
67 |
$errors = $validation->messages; |
|
68 |
} |
|
69 |
} |
|
cleanup issue and pull page
|
70 |
elsif ($op eq 'api-delete-issue-message') { |
add issue message delete fea...
|
71 |
my $issue_message_row_id = param('issue_message_row_id'); |
72 |
|
|
add issue message delete fea...
|
73 |
my $json = $api->api_delete_issue_message($issue_message_row_id, $user_id); |
improve comment delete authe...
|
74 |
|
implement issue comment upda...
|
75 |
$self->render(json => $json); |
76 |
return; |
|
77 |
} |
|
78 |
elsif ($op eq 'api-update-issue-message') { |
|
79 |
|
|
80 |
my $issue_message_row_id = param('issue_message_row_id'); |
|
81 |
my $message = param('message'); |
|
82 |
|
|
83 |
my $json = $api->api_update_issue_message($issue_message_row_id, $message, $user_id); |
|
84 |
|
|
add label apply
|
85 |
$self->render(json => $json); |
86 |
return; |
|
87 |
} |
|
88 |
elsif ($op eq 'api-toggle-label') { |
|
improve label adding design
|
89 |
my $label_row_id = param('popup-label-row-id'); |
add label apply
|
90 |
|
91 |
my $label_checked = app->dbi->model('issue_label')->select( |
|
92 |
where => {issue => $issue_row_id, label => $label_row_id} |
|
93 |
)->one; |
|
94 |
|
|
95 |
my $json = {}; |
|
96 |
if ($label_checked) { |
|
97 |
app->dbi->model('issue_label')->delete(where => {issue => $issue_row_id, label => $label_row_id}); |
|
98 |
$json->{checked} = 0; |
|
99 |
} |
|
100 |
else { |
|
101 |
app->dbi->model('issue_label')->insert({issue => $issue_row_id, label => $label_row_id}); |
|
improve label adding design
|
102 |
my $label = app->dbi->model('label')->select(where => {row_id => $label_row_id})->one; |
103 |
$json->{checked} = 1; |
|
104 |
$json->{id} = $label->{id}; |
|
105 |
$json->{color} = $label->{color}; |
|
add label apply
|
106 |
} |
107 |
$json->{success} = 1; |
|
108 |
|
|
add issue message delete fea...
|
109 |
$self->render(json => $json); |
add issue message delete fea...
|
110 |
return; |
111 |
} |
|
add comment form
|
112 |
} |
113 | ||
add issue messages page
|
114 |
# Issue message |
115 |
my $issue_messages = app->dbi->model('issue_message')->select( |
|
116 |
[ |
|
117 |
{__MY__ => '*'}, |
|
118 |
{user => ['id']} |
|
119 |
], |
|
120 |
where => {issue => $issue->{row_id}}, |
|
121 |
append => 'order by number' |
|
122 |
)->all; |
|
add participates
|
123 |
|
124 |
# Issue message count |
|
add issue messages page
|
125 |
my $issue_messages_count = app->dbi->model('issue_message')->select( |
126 |
'count(*)', |
|
127 |
where => {issue => $issue->{row_id}}, |
|
128 |
)->value; |
|
129 |
|
|
add participates
|
130 |
# Participants |
131 |
my $participants = app->dbi->model('issue_message')->select( |
|
132 |
['distinct user.id'], |
|
133 |
where => {issue => $issue->{row_id}}, |
|
134 |
)->values; |
|
135 |
|
|
add label apply
|
136 |
# Labels |
137 |
my $labels = app->dbi->model('label')->select( |
|
138 |
{__MY__ => '*'}, |
|
139 |
where => {project => $project_row_id} |
|
140 |
)->all; |
|
141 |
|
|
show added labels
|
142 |
# Issue labels |
143 |
my $issue_labels = app->dbi->model('issue_label')->select( |
|
144 |
{label => '*'}, |
|
145 |
where => {'issue_label.issue' => $issue_row_id}, |
|
146 |
appden => 'order by label.id' |
|
147 |
)->all; |
|
148 |
|
|
add new issue feature
|
149 |
layout 'common', title => "Issue - $user_id/$project_id #$issue_number"; |
150 |
%> |
|
151 | ||
add previewãarea
|
152 |
%= javascript begin |
153 |
$(document).ready(function() { |
|
cleanup issue and pull page
|
154 |
%= include '/include/js/issue'; |
add label apply
|
155 |
|
156 |
// Click labels btn |
|
157 |
$('.issue-labels-setting-btn').on('click', function () { |
|
complete label
|
158 |
var popup = $('.issue-labels-popup'); |
159 |
popup.css('display', 'block'); |
|
160 |
|
|
161 |
var top = $('.issue-labels').offset().top; |
|
162 |
var left = $('.issue-labels').offset().left; |
|
163 |
|
|
164 |
popup.css('top', (top + 30) + 'px'); |
|
165 |
popup.css('left', (left - 165) + 'px'); |
|
add label apply
|
166 |
}); |
167 |
|
|
complete label
|
168 |
// Click label check button |
add label apply
|
169 |
$('.issue-labels-popup-body li').on('click', function () { |
170 |
var that = this; |
|
171 |
|
|
improve label adding design
|
172 |
var label_row_id = $(this).attr('popup-label-row-id'); |
173 |
$.post('<%= url_for %>', {'popup-label-row-id' : label_row_id, op : 'api-toggle-label'}, function (result) { |
|
add label apply
|
174 |
if (result.success) { |
175 |
if (result.checked) { |
|
176 |
$(that).find('.issue-labels-popup-check i').css('display', 'block'); |
|
improve label adding design
|
177 |
var li = '<li label-row-id="' + label_row_id + '" style="background:' + result.color + '">' + result.id + '</li>'; |
178 |
$('.issue-labels-setting-pallet').append(li); |
|
add label apply
|
179 |
} |
180 |
else { |
|
181 |
$(that).find('.issue-labels-popup-check i').css('display', 'none'); |
|
improve label adding design
|
182 |
$('.issue-labels-setting-pallet li').each(function () { |
183 |
if ($(this).attr('label-row-id') === label_row_id) { |
|
184 |
$(this).remove(); |
|
185 |
} |
|
186 |
}); |
|
add label apply
|
187 |
} |
188 |
} |
|
189 |
}); |
|
190 |
}); |
|
complete label
|
191 |
|
192 |
// Click label popup close button |
|
193 |
$('.issue-labels-popup-close-btn').on('click', function () { |
|
194 |
$('.issue-labels-popup').hide(); |
|
195 |
}); |
|
add previewãarea
|
196 |
}); |
197 |
% end |
|
198 | ||
add new issue feature
|
199 |
%= include '/include/header'; |
200 | ||
201 |
<div class="container"> |
|
can add new issue message an...
|
202 |
%= include '/include/errors', errors => $errors; |
add participates
|
203 | |
204 |
<div class="issue-title-panel"> |
|
205 |
<div class="issue-title"> |
|
206 |
Some <%= $issue->{title} %> <span style="color:#aaa;">#<%= $issue->{number} %></span> |
|
207 |
</div> |
|
208 |
<div> |
|
209 |
% if ($issue->{open}) { |
|
210 |
<div class="issue-open">Open</div> |
|
211 |
% } else { |
|
212 |
<div class="issue-close">Close</div> |
|
213 |
% } |
|
214 |
<b><%= $issue->{'open_user.id'} %></b> <span style="color:#767676;">opened this issue <%= $api->age_string($issue->{open_time}) %> / <%= $issue_messages_count %> comment</span> |
|
215 |
</div> |
|
216 |
</div> |
|
217 |
|
|
218 |
<div class="issue"> |
|
219 |
<div class="issue-left"> |
|
220 |
<div class="issue-panel"> |
|
add comment form
|
221 |
<div> |
add participates
|
222 |
% for my $issue_message (@$issue_messages) { |
223 |
<% |
|
224 |
my %issue_message_param = ( |
|
225 |
user_id => $user_id, |
|
226 |
issue_message => $issue_message |
|
227 |
); |
|
228 |
%> |
|
229 |
|
|
230 |
%= include '/include/issue_message', %issue_message_param; |
|
add comment form
|
231 |
% } |
add issue messages page
|
232 |
</div> |
233 |
</div> |
|
add participates
|
234 |
|
235 |
% if ($api->logined) { |
|
236 |
<div class="issue-add-comment"> |
|
237 |
<form action="<%= url_for %>" method="post"> |
|
238 |
<%= hidden_field 'op' %> |
|
239 |
<div class="issue-add-comment-header"> |
|
cleanup issue preview
|
240 |
<div class="issue-message-write-tab issue-add-comment-header-tab"><a href="javascript:void(0)">Write</a></div> |
241 |
<div class="issue-message-preview-tab issue-add-comment-header-tab"><a class="disable" href="javascript:void(0)">Preview</a></div> |
|
add id to issue icon
|
242 |
%= include '/include/issue_comment_icon'; |
add comment form
|
243 |
</div> |
add participates
|
244 |
<div class="issue-add-comment-body"> |
cleanup issue preview
|
245 |
<div class="issue-message-write-area issue-add-comment-message"> |
implement issue comment upda...
|
246 |
<%= text_area 'message' => '' %> |
add participates
|
247 |
</div> |
cleanup issue preview
|
248 |
<div class="issue-message-preview-area issue-add-comment-preview markdown-body" style="padding:10px"> |
add write prview tab
|
249 |
</div> |
add participates
|
250 |
<div class="issue-add-comment-bottom"> |
251 |
<div class="issue-add-comment-button-left"> |
|
252 |
Styling with Markdown is supported |
|
253 |
</div> |
|
254 |
<div class="issue-add-comment-button"> |
|
255 |
% if ($issue->{open}) { |
|
256 |
<input type="submit" value="Close issue" onclick="$(this).closest('form').find('[name=op]').val('close-issue'); $(this).closest('form').submit();" class="btn"> |
|
257 |
% } else { |
|
258 |
<input type="submit" value="Reopen issue" onclick="$(this).closest('form').find('[name=op]').val('reopen-issue'); $(this).closest('form').submit();" class="btn"> |
|
259 |
% } |
|
rename btn-success to btn-gr...
|
260 |
<input type="submit" value="Comment" onclick="$(this).closest('form').find('[name=op]').val('add-comment'); $(this).closest('form').submit();" class="btn btn-green"> |
add participates
|
261 |
</div> |
add write prview tab
|
262 |
</div> |
add comment form
|
263 |
</div> |
add participates
|
264 |
</form> |
265 |
</div> |
|
266 |
% } |
|
267 |
</div> |
|
268 |
<div class="issue-right"> |
|
add issue labels btn
|
269 |
<div class="issue-labels"> |
270 |
<div class="issue-labels-title-area"> |
|
271 |
<div class="issue-labels-title"> |
|
272 |
labels |
|
273 |
</div> |
|
274 |
<div class="issue-labels-setting-btn"> |
|
275 |
<a href="javascript:void(0)"><i class="icon icon-cog"></i></a> |
|
276 |
</div> |
|
277 |
</div> |
|
complete label
|
278 |
<div class="issue-labels-popup"> |
279 |
<div class="issue-labels-popup-title-area"> |
|
280 |
<div class="issue-labels-popup-title"> |
|
281 |
Apply labels to this issue |
|
282 |
</div> |
|
283 |
<div class="issue-labels-popup-close-btn"> |
|
284 |
<a href="javascript:void(0)"><i class="icon icon-remove"></i></a> |
|
285 |
</div> |
|
286 |
</div> |
|
287 |
<ul class="issue-labels-popup-body"> |
|
288 |
% for my $label (@$labels) { |
|
289 |
% my $checked = app->dbi->model('issue_label')->select(where => {issue => $issue_row_id, label => $label->{row_id}})->one; |
|
improve label adding design
|
290 |
<li popup-label-row-id="<%= $label->{row_id} %>"> |
complete label
|
291 |
<div class="issue-labels-popup-check"><i class="icon icon-ok" style="display:<%= $checked ? 'block' : 'none' %>"></i></div> |
292 |
<div class="issue-labels-popup-pallet" style="background:<%= $label->{color} %>"></div> |
|
293 |
<div class="issue-labels-popup-pallet-id"><%= $label->{id} %></div> |
|
294 |
</li> |
|
295 |
% } |
|
296 |
</ul> |
|
297 |
</div> |
|
show added labels
|
298 |
% if (@$labels) { |
299 |
<ul class="issue-labels-setting-pallet"> |
|
300 |
% for my $issue_label (@$issue_labels) { |
|
improve label adding design
|
301 |
<li label-row-id="<%= $issue_label->{'label.row_id'} %>" style="background:<%= $issue_label->{'label.color'} %>"> |
show added labels
|
302 |
<%= $issue_label->{'label.id'} %> |
303 |
</li> |
|
304 |
% } |
|
305 |
</ul> |
|
306 |
% } else { |
|
307 |
<ul> |
|
308 |
<li> |
|
309 |
None yet |
|
310 |
</li> |
|
311 |
</ul> |
|
312 |
% } |
|
add issue labels btn
|
313 |
</div> |
add participates
|
314 |
<div style="font-weight:bold;padding-bottom:3px"><%= @$participants %> participants</div> |
315 |
<ul> |
|
316 |
% for my $participant (@$participants) { |
|
317 |
<li> |
|
318 |
<a href="<%= url_for("/$participant") %>"><%= $participant %></a> |
|
319 |
</li> |
|
320 |
% } |
|
321 |
</ul> |
|
322 |
</div> |
|
add issue messages page
|
323 |
</div> |
add new issue feature
|
324 |
</div> |
325 | ||
add label apply
|
326 | |
327 | ||
add new issue feature
|
328 |
%= include '/include/footer'; |