39
|
1 <?cs include "header.cs" ?>
|
|
2 <?cs include "macros.cs" ?>
|
|
3
|
|
4 <div id="ctxtnav" class="nav">
|
|
5 <h2>Ticket Navigation</h2><?cs
|
|
6 with:links = chrome.links ?><?cs
|
|
7 if:len(links.prev) || len(links.up) || len(links.next) ?><ul><?cs
|
|
8 if:len(links.prev) ?>
|
|
9 <li class="first<?cs if:!len(links.up) && !len(links.next) ?> last<?cs /if ?>">
|
|
10 ← <a href="<?cs var:links.prev.0.href ?>" title="<?cs
|
|
11 var:links.prev.0.title ?>">Previous Ticket</a>
|
|
12 </li><?cs
|
|
13 /if ?><?cs
|
|
14 if:len(links.up) ?>
|
|
15 <li class="<?cs if:!len(links.prev) ?>first<?cs /if ?><?cs
|
|
16 if:!len(links.next) ?> last<?cs /if ?>">
|
|
17 <a href="<?cs var:links.up.0.href ?>" title="<?cs
|
|
18 var:links.up.0.title ?>">Back to Query</a>
|
|
19 </li><?cs
|
|
20 /if ?><?cs
|
|
21 if:len(links.next) ?>
|
|
22 <li class="<?cs if:!len(links.prev) && !len(links.up) ?>first <?cs /if ?>last">
|
|
23 <a href="<?cs var:links.next.0.href ?>" title="<?cs
|
|
24 var:links.next.0.title ?>">Next Ticket</a> →
|
|
25 </li><?cs
|
|
26 /if ?></ul><?cs
|
|
27 /if ?><?cs
|
|
28 /with ?>
|
|
29 </div>
|
|
30
|
|
31 <div id="content" class="ticket">
|
|
32
|
|
33 <h1>Ticket #<?cs var:ticket.id ?> <span class="status">(<?cs
|
|
34 var:ticket.status ?><?cs
|
|
35 if:ticket.type ?> <?cs var:ticket.type ?><?cs
|
|
36 /if ?><?cs
|
|
37 if:ticket.resolution ?>: <?cs var:ticket.resolution ?><?cs
|
|
38 /if ?>)</span></h1>
|
|
39
|
|
40 <div id="searchable">
|
|
41 <div id="ticket">
|
|
42 <div class="date">
|
|
43 <p title="<?cs var:ticket.opened ?>">Opened <?cs var:ticket.opened_delta ?> ago</p><?cs
|
|
44 if:ticket.lastmod ?>
|
|
45 <p title="<?cs var:ticket.lastmod ?>">Last modified <?cs var:ticket.lastmod_delta ?> ago</p>
|
|
46 <?cs /if ?>
|
|
47 </div>
|
|
48 <h2 class="summary"><?cs var:ticket.summary ?></h2>
|
|
49 <table class="properties">
|
|
50 <tr>
|
|
51 <th id="h_reporter">Reported by:</th>
|
|
52 <td headers="h_reporter"><?cs var:ticket.reporter ?></td>
|
|
53 <th id="h_owner">Assigned to:</th>
|
|
54 <td headers="h_owner"><?cs var:ticket.owner ?><?cs
|
|
55 if:ticket.status == 'assigned' ?> (accepted)<?cs /if ?></td>
|
|
56 </tr><tr><?cs
|
|
57 each:field = ticket.fields ?><?cs
|
|
58 if:!field.skip ?><?cs
|
|
59 set:num_fields = num_fields + 1 ?><?cs
|
|
60 /if ?><?cs
|
|
61 /each ?><?cs
|
|
62 set:idx = 0 ?><?cs
|
|
63 each:field = ticket.fields ?><?cs
|
|
64 if:!field.skip ?><?cs set:fullrow = field.type == 'textarea' ?><?cs
|
|
65 if:fullrow && idx % 2 ?><th></th><td></td></tr><tr><?cs /if ?>
|
|
66 <th id="h_<?cs var:name(field) ?>"><?cs var:field.label ?>:</th>
|
|
67 <td<?cs if:fullrow ?> colspan="3"<?cs /if ?> headers="h_<?cs
|
|
68 var:name(field) ?>"><?cs var:ticket[name(field)] ?></td><?cs
|
|
69 if:idx % 2 || fullrow ?></tr><tr><?cs
|
|
70 elif:idx == num_fields - 1 ?><th></th><td></td><?cs
|
|
71 /if ?><?cs set:idx = idx + #fullrow + 1 ?><?cs
|
|
72 /if ?><?cs
|
|
73 /each ?></tr>
|
|
74 </table>
|
|
75 <?cs if:ticket.description ?><div id="comment:description" class="description">
|
|
76 <?cs var:ticket.description.formatted ?>
|
|
77 <form method="get" action="<?cs var:ticket.href ?>#comment"><div class="inlinebuttons">
|
|
78 <input type="hidden" name="replyto" value="description" />
|
|
79 <input type="submit" value="Reply" title="Reply, quoting this description" /></div>
|
|
80 </form>
|
|
81 </div><?cs /if ?>
|
|
82 </div>
|
|
83
|
|
84 <?cs if:ticket.attach_href || len(ticket.attachments) ?>
|
|
85 <?cs call:list_of_attachments(ticket.attachments, ticket.attach_href) ?>
|
|
86 <?cs /if ?>
|
|
87
|
|
88 <?cs def:commentref(prefix, cnum) ?>
|
|
89 <a href="#comment:<?cs var:cnum ?>"><small><?cs var:prefix ?><?cs var:cnum ?></small></a>
|
|
90 <?cs /def ?>
|
|
91
|
|
92 <?cs if:len(ticket.changes) ?><h2>Change History</h2>
|
|
93 <div id="changelog"><?cs
|
|
94 each:change = ticket.changes ?>
|
|
95 <div class="change">
|
|
96 <h3 <?cs if:change.cnum ?>id="comment:<?cs var:change.cnum ?>"<?cs /if ?>><?cs
|
|
97 if:change.cnum ?>
|
|
98 <span class="threading"><?cs
|
|
99 set:nreplies = len(ticket.replies[change.cnum]) ?><?cs
|
|
100 if:nreplies || change.replyto ?>(<?cs
|
|
101 if:change.replyto ?>in reply to: <?cs
|
|
102 call:commentref('↑ ', change.replyto) ?><?cs if nreplies ?>; <?cs /if ?><?cs
|
|
103 /if ?><?cs
|
|
104 if nreplies ?><?cs
|
|
105 call:plural('follow-up', nreplies) ?>: <?cs
|
|
106 each:reply = ticket.replies[change.cnum] ?><?cs
|
|
107 call:commentref('↓ ', reply) ?><?cs
|
|
108 /each ?><?cs
|
|
109 /if ?>)<?cs
|
|
110 /if ?><form method="get" action="<?cs var:ticket.href ?>#comment"><span class="inlinebuttons">
|
|
111 <input type="hidden" name="replyto" value="<?cs var:change.cnum ?>" />
|
|
112 <input type="submit" value="Reply" title="Reply to comment <?cs var:change.cnum ?>" /></span>
|
|
113 </form>
|
|
114 </span><?cs
|
|
115 /if ?><?cs
|
|
116 var:change.date ?> changed by <?cs var:change.author ?><?cs
|
|
117 if:change.cnum ?> <a href="#comment:<?cs var:change.cnum ?>" class="anchor"
|
|
118 title="Permalink to comment:<?cs var:change.cnum ?>">¶</a><?cs
|
|
119 /if ?>
|
|
120 </h3><?cs
|
|
121 if:len(change.fields) ?>
|
|
122 <ul class="changes"><?cs
|
|
123 each:field = change.fields ?>
|
|
124 <li><strong><?cs var:name(field) ?></strong> <?cs
|
|
125 if:name(field) == 'attachment' ?><em><?cs var:field.new ?></em> added<?cs
|
|
126 elif:field.old && field.new ?>changed from <em><?cs
|
|
127 var:field.old ?></em> to <em><?cs var:field.new ?></em><?cs
|
|
128 elif:!field.old && field.new ?>set to <em><?cs var:field.new ?></em><?cs
|
|
129 elif:field.old && !field.new ?>deleted<?cs
|
|
130 else ?>changed<?cs
|
|
131 /if ?>.</li>
|
|
132 <?cs
|
|
133 /each ?>
|
|
134 </ul><?cs
|
|
135 /if ?>
|
|
136 <div class="comment"><?cs var:change.comment ?></div>
|
|
137 </div><?cs
|
|
138 /each ?>
|
|
139 </div><?cs
|
|
140 /if ?>
|
|
141
|
|
142 <?cs if:trac.acl.TICKET_CHGPROP || trac.acl.TICKET_APPEND ?>
|
|
143 <form action="<?cs var:ticket.href ?>#preview" method="post">
|
|
144 <hr />
|
|
145 <h3><a name="edit" onfocus="document.getElementById('comment').focus()">Add/Change #<?cs
|
|
146 var:ticket.id ?> (<?cs var:ticket.summary ?>)</a></h3>
|
|
147 <?cs if:trac.authname == "anonymous" ?>
|
|
148 <div class="field">
|
|
149 <label for="author">Your email or username:</label><br />
|
|
150 <input type="text" id="author" name="author" size="40"
|
|
151 value="<?cs var:ticket.reporter_id ?>" /><br />
|
|
152 </div>
|
|
153 <?cs /if ?>
|
|
154 <div class="field">
|
|
155 <fieldset class="iefix">
|
|
156 <label for="comment">Comment (you may use <a tabindex="42" href="<?cs
|
|
157 var:trac.href.wiki ?>/WikiFormatting">WikiFormatting</a> here):</label><br />
|
|
158 <p><textarea id="comment" name="comment" class="wikitext" rows="10" cols="78">
|
|
159 <?cs var:ticket.comment ?></textarea></p>
|
|
160 </fieldset><?cs
|
|
161 if ticket.comment_preview ?>
|
|
162 <fieldset id="preview">
|
|
163 <legend>Comment Preview</legend>
|
|
164 <?cs var:ticket.comment_preview ?>
|
|
165 </fieldset><?cs
|
|
166 /if ?>
|
|
167 </div>
|
|
168
|
|
169 <?cs if:trac.acl.TICKET_CHGPROP ?><fieldset id="properties">
|
|
170 <legend>Change Properties</legend>
|
|
171 <table><tr>
|
|
172 <th><label for="summary">Summary:</label></th>
|
|
173 <td class="fullrow" colspan="3"><input type="text" id="summary" name="summary" value="<?cs
|
|
174 var:ticket.summary ?>" size="70" /></td>
|
|
175 </tr><?cs
|
|
176 if:len(ticket.fields.type.options) ?>
|
|
177 <tr>
|
|
178 <th><label for="type">Type:</label></th>
|
|
179 <td><?cs
|
|
180 call:hdf_select(ticket.fields.type.options, 'type', ticket.type, 0) ?>
|
|
181 </td>
|
|
182 </tr><?cs
|
|
183 /if ?><?cs
|
|
184 if:trac.acl.TICKET_ADMIN ?><tr>
|
|
185 <th><label for="description">Description:</label></th>
|
|
186 <td class="fullrow" colspan="3">
|
|
187 <textarea id="description" name="description" class="wikitext" rows="10" cols="68">
|
|
188 <?cs var:ticket.description ?></textarea>
|
|
189 </td>
|
|
190 </tr><tr>
|
|
191 <th><label for="reporter">Reporter:</label></th>
|
|
192 <td class="fullrow" colspan="3"><input type="text" value="<?cs
|
|
193 var:ticket.reporter ?>" id="reporter" name="reporter" size="70" /></td>
|
|
194 </tr><?cs
|
|
195 /if ?>
|
|
196 <tr><?cs set:num_fields = 0 ?><?cs
|
|
197 each:field = ticket.fields ?><?cs
|
|
198 if:!field.skip ?><?cs
|
|
199 set:num_fields = num_fields + 1 ?><?cs
|
|
200 /if ?><?cs
|
|
201 /each ?><?cs set:idx = 0 ?><?cs
|
|
202 each:field = ticket.fields ?><?cs
|
|
203 if:!field.skip ?><?cs set:fullrow = field.type == 'textarea' ?><?cs
|
|
204 if:fullrow && idx % 2 ?><?cs set:idx = idx + 1 ?><th class="col2"></th><td></td></tr><tr><?cs /if ?>
|
|
205 <th class="col<?cs var:idx % 2 + 1 ?>"><?cs
|
|
206 if:field.type != 'radio' ?><label for="<?cs var:name(field) ?>"><?cs
|
|
207 /if ?><?cs alt:field.label ?><?cs var:field.name ?><?cs /alt ?>:<?cs
|
|
208 if:field.type != 'radio' ?></label><?cs /if ?></th>
|
|
209 <td<?cs if:fullrow ?> colspan="3"<?cs /if ?>><?cs
|
|
210 if:field.type == 'text' ?><input type="text" id="<?cs
|
|
211 var:name(field) ?>" name="<?cs
|
|
212 var:name(field) ?>" value="<?cs var:ticket[name(field)] ?>" /><?cs
|
|
213 elif:field.type == 'select' ?><select id="<?cs
|
|
214 var:name(field) ?>" name="<?cs
|
|
215 var:name(field) ?>"><?cs
|
|
216 if:field.optional ?><option></option><?cs /if ?><?cs
|
|
217 each:option = field.options ?><option<?cs
|
|
218 if:option == ticket[name(field)] ?> selected="selected"<?cs /if ?>><?cs
|
|
219 var:option ?></option><?cs
|
|
220 /each ?></select><?cs
|
|
221 elif:field.type == 'checkbox' ?><input type="hidden" name="checkbox_<?cs
|
|
222 var:name(field) ?>" /><input type="checkbox" id="<?cs
|
|
223 var:name(field) ?>" name="<?cs
|
|
224 var:name(field) ?>" value="1"<?cs
|
|
225 if:ticket[name(field)] ?> checked="checked"<?cs /if ?> /><?cs
|
|
226 elif:field.type == 'textarea' ?><textarea id="<?cs
|
|
227 var:name(field) ?>" name="<?cs
|
|
228 var:name(field) ?>"<?cs
|
|
229 if:field.height ?> rows="<?cs var:field.height ?>"<?cs /if ?><?cs
|
|
230 if:field.width ?> cols="<?cs var:field.width ?>"<?cs /if ?>>
|
|
231 <?cs var:ticket[name(field)] ?></textarea><?cs
|
|
232 elif:field.type == 'radio' ?><?cs set:optidx = 0 ?><?cs
|
|
233 each:option = field.options ?><label><input type="radio" id="<?cs
|
|
234 var:name(field) ?>" name="<?cs
|
|
235 var:name(field) ?>" value="<?cs var:option ?>"<?cs
|
|
236 if:ticket[name(field)] == option ?> checked="checked"<?cs /if ?> /> <?cs
|
|
237 var:option ?></label> <?cs set:optidx = optidx + 1 ?><?cs
|
|
238 /each ?><?cs
|
|
239 /if ?></td><?cs
|
|
240 if:idx % 2 || fullrow ?><?cs
|
|
241 if:idx < num_fields - 1 ?></tr><tr><?cs
|
|
242 /if ?><?cs
|
|
243 elif:idx == num_fields - 1 ?><th class="col2"></th><td></td><?cs
|
|
244 /if ?><?cs set:idx = idx + #fullrow + 1 ?><?cs
|
|
245 /if ?><?cs
|
|
246 /each ?></tr>
|
|
247 </table>
|
|
248 </fieldset><?cs /if ?>
|
|
249
|
|
250 <?cs if:ticket.actions.accept || ticket.actions.reopen ||
|
|
251 ticket.actions.resolve || ticket.actions.reassign ?>
|
|
252 <fieldset id="action">
|
|
253 <legend>Action</legend><?cs
|
|
254 if:!ticket.action ?><?cs set:ticket.action = 'leave' ?><?cs
|
|
255 /if ?><?cs
|
|
256 def:action_radio(id) ?>
|
|
257 <input type="radio" id="<?cs var:id ?>" name="action" value="<?cs
|
|
258 var:id ?>"<?cs if:ticket.action == id ?> checked="checked"<?cs
|
|
259 /if ?> /><?cs
|
|
260 /def ?>
|
|
261 <?cs call:action_radio('leave') ?>
|
|
262 <label for="leave">leave as <?cs var:ticket.status ?></label><br /><?cs
|
|
263 if:ticket.actions.accept ?><?cs
|
|
264 call:action_radio('accept') ?>
|
|
265 <label for="accept">accept ticket</label><br /><?cs
|
|
266 /if ?><?cs
|
|
267 if:ticket.actions.reopen ?><?cs
|
|
268 call:action_radio('reopen') ?>
|
|
269 <label for="reopen">reopen ticket</label><br /><?cs
|
|
270 /if ?><?cs
|
|
271 if:ticket.actions.resolve ?><?cs
|
|
272 call:action_radio('resolve') ?>
|
|
273 <label for="resolve">resolve</label><?cs
|
|
274 if:len(ticket.fields.resolution.options) ?>
|
|
275 <label for="resolve_resolution">as:</label>
|
|
276 <?cs call:hdf_select(ticket.fields.resolution.options, "resolve_resolution",
|
|
277 ticket.resolve_resolution, 0) ?><br /><?cs
|
|
278 /if ?><?cs
|
|
279 /if ?><?cs
|
|
280 if:ticket.actions.reassign ?><?cs
|
|
281 call:action_radio('reassign') ?>
|
|
282 <label for="reassign">reassign</label>
|
|
283 <label>to:<?cs
|
|
284 if:len(ticket.fields.owner.options) ?><?cs
|
|
285 call:hdf_select(ticket.fields.owner.options, "reassign_owner",
|
|
286 ticket.reassign_owner, 1) ?><?cs
|
|
287 else ?>
|
|
288 <input type="text" id="reassign_owner" name="reassign_owner" size="40" value="<?cs
|
|
289 var:ticket.reassign_owner ?>" /><?cs
|
|
290 /if ?></label><?cs
|
|
291 /if ?><?cs
|
|
292 if ticket.actions.resolve || ticket.actions.reassign ?>
|
|
293 <script type="text/javascript"><?cs
|
|
294 each:action = ticket.actions ?>
|
|
295 var <?cs var:name(action) ?> = document.getElementById("<?cs var:name(action) ?>");<?cs
|
|
296 /each ?>
|
|
297 var updateActionFields = function() {
|
|
298 <?cs if:ticket.actions.resolve ?> enableControl('resolve_resolution', resolve.checked);<?cs /if ?>
|
|
299 <?cs if:ticket.actions.reassign ?> enableControl('reassign_owner', reassign.checked);<?cs /if ?>
|
|
300 };
|
|
301 addEvent(window, 'load', updateActionFields);<?cs
|
|
302 each:action = ticket.actions ?>
|
|
303 addEvent(<?cs var:name(action) ?>, 'click', updateActionFields);<?cs
|
|
304 /each ?>
|
|
305 </script><?cs
|
|
306 /if ?>
|
|
307 </fieldset><?cs
|
|
308 else ?>
|
|
309 <input type="hidden" name="action" value="leave" /><?cs
|
|
310 /if ?>
|
|
311
|
|
312 <script type="text/javascript" src="<?cs
|
|
313 var:htdocs_location ?>js/wikitoolbar.js"></script>
|
|
314
|
|
315 <div class="buttons">
|
|
316 <input type="hidden" name="ts" value="<?cs var:ticket.ts ?>" />
|
|
317 <input type="hidden" name="replyto" value="<?cs var:ticket.replyto ?>" />
|
|
318 <input type="hidden" name="cnum" value="<?cs var:ticket.cnum ?>" />
|
|
319 <input type="submit" name="preview" value="Preview" accesskey="r" />
|
|
320 <input type="submit" value="Submit changes" />
|
|
321 </div>
|
|
322 </form>
|
|
323 <?cs /if ?>
|
|
324
|
|
325 </div>
|
|
326 </div>
|
|
327 <?cs include "footer.cs"?>
|