| 1 | <?cs set:html.stylesheet = 'css/ticket.css' ?> |
|---|
| 2 | <?cs include "header.cs" ?> |
|---|
| 3 | <?cs include "macros.cs" ?> |
|---|
| 4 | |
|---|
| 5 | <div id="ctxtnav" class="nav"> |
|---|
| 6 | <h2>Ticket Navigation</h2> |
|---|
| 7 | <ul><?cs |
|---|
| 8 | if:len(links.prev) ?> |
|---|
| 9 | <li class="first<?cs if:!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.next) ?> |
|---|
| 15 | <li class="<?cs if:len(links.prev) ?>first <?cs /if ?>last"> |
|---|
| 16 | <a href="<?cs var:links.next.0.href ?>" title="<?cs |
|---|
| 17 | var:links.next.0.title ?>">Next Ticket</a> |
|---|
| 18 | </li><?cs |
|---|
| 19 | /if ?> |
|---|
| 20 | </ul> |
|---|
| 21 | </div> |
|---|
| 22 | |
|---|
| 23 | <div id="content" class="ticket"> |
|---|
| 24 | <div id="searchable"> |
|---|
| 25 | <?cs def:ticketprop(label, name, value, fullrow) ?> |
|---|
| 26 | <th id="h_<?cs var:name ?>"><?cs var:$label ?>:</th> |
|---|
| 27 | <td headers="h_<?cs var:name ?>"<?cs if:fullrow ?> colspan="3"<?cs /if ?>><?cs |
|---|
| 28 | if:$value ?><?cs var:$value ?><?cs else ?> <?cs |
|---|
| 29 | /if ?></td><?cs if numprops % #2 && !$last_prop || fullrow ?> |
|---|
| 30 | </tr><tr><?cs /if ?><?cs set numprops = $numprops + #1 - fullrow ?><?cs |
|---|
| 31 | /def ?> |
|---|
| 32 | |
|---|
| 33 | <div id="ticket"> |
|---|
| 34 | <div class="date"><?cs var:ticket.opened ?></div> |
|---|
| 35 | <h1>Ticket #<?cs var:ticket.id ?> <?cs |
|---|
| 36 | if:ticket.status == 'closed' ?>(Closed: <?cs var:ticket.resolution ?>)<?cs |
|---|
| 37 | elif:ticket.status != 'new' ?>(<?cs var:ticket.status ?>)<?cs |
|---|
| 38 | /if ?></h1> |
|---|
| 39 | <h2><?cs var:ticket.summary ?></h2> |
|---|
| 40 | <hr /> |
|---|
| 41 | <table><tr><?cs |
|---|
| 42 | call:ticketprop("Priority", "priority", ticket.priority, 0) ?><?cs |
|---|
| 43 | call:ticketprop("Reporter", "reporter", ticket.reporter, 0) ?><?cs |
|---|
| 44 | call:ticketprop("Severity", "severity", ticket.severity, 0) ?><?cs |
|---|
| 45 | if ticket.status == "assigned"?><?cs |
|---|
| 46 | call:ticketprop("Assigned to", "assignee", ticket.owner + " (accepted)", 0) ?><?cs |
|---|
| 47 | else ?><?cs |
|---|
| 48 | call:ticketprop("Assigned to", "assignee", ticket.owner, 0) ?><?cs |
|---|
| 49 | /if ?><?cs |
|---|
| 50 | call:ticketprop("Component", "component", ticket.component, 0) ?><?cs |
|---|
| 51 | call:ticketprop("Status", "status", ticket.status, 0) ?><?cs |
|---|
| 52 | call:ticketprop("Version", "version", ticket.version, 0) ?><?cs |
|---|
| 53 | call:ticketprop("Resolution", "resolution", ticket.resolution, 0) ?><?cs |
|---|
| 54 | call:ticketprop("Milestone", "milestone", ticket.milestone, 0) ?><?cs |
|---|
| 55 | set:last_prop = #1 ?><?cs |
|---|
| 56 | call:ticketprop("Keywords", "keywords", ticket.keywords, 0) ?><?cs |
|---|
| 57 | set:last_prop = #0 ?> |
|---|
| 58 | </tr></table><?cs if ticket.custom.0.name ?> |
|---|
| 59 | <hr /> |
|---|
| 60 | <table><tr><?cs each:prop = ticket.custom ?><?cs |
|---|
| 61 | if:prop.type == "textarea" ?><?cs |
|---|
| 62 | call:ticketprop(prop.label, prop.name, prop.value, 1) ?><?cs |
|---|
| 63 | else ?><?cs |
|---|
| 64 | call:ticketprop(prop.label, prop.name, prop.value, 0) ?><?cs |
|---|
| 65 | /if?><?cs |
|---|
| 66 | /each ?> |
|---|
| 67 | </tr></table><?cs /if ?> |
|---|
| 68 | <hr /> |
|---|
| 69 | <h3>Description<?cs if:ticket.reporter ?> by <?cs |
|---|
| 70 | var:ticket.reporter ?><?cs /if ?>:</h3> |
|---|
| 71 | <div class="description"> |
|---|
| 72 | <?cs var:ticket.description.formatted ?> |
|---|
| 73 | </div> |
|---|
| 74 | </div> |
|---|
| 75 | |
|---|
| 76 | <?cs if trac.acl.TICKET_MODIFY || ticket.attachments.0.name ?> |
|---|
| 77 | <h2>Attachments</h2><?cs |
|---|
| 78 | if ticket.attachments.0.name ?><div id="attachments"> |
|---|
| 79 | <ul class="attachments"><?cs each:a = ticket.attachments ?> |
|---|
| 80 | <li><a href="<?cs var:a.href ?>" title="View attachment"><?cs |
|---|
| 81 | var:a.name ?></a> (<?cs var:a.size ?>) - <?cs |
|---|
| 82 | if:a.descr ?><q><?cs var:a.descr ?></q>,<?cs |
|---|
| 83 | /if ?> added by <em><?cs |
|---|
| 84 | var:a.author ?></em> on <em><?cs |
|---|
| 85 | var:a.time ?></em>.</li><?cs |
|---|
| 86 | /each ?></ul><?cs |
|---|
| 87 | /if ?><?cs |
|---|
| 88 | if trac.acl.TICKET_MODIFY ?> |
|---|
| 89 | <form method="get" action="<?cs var:cgi_location?>/attachment/ticket/<?cs |
|---|
| 90 | var:ticket.id ?>"> |
|---|
| 91 | <div><input type="submit" value="Attach File" /></div> |
|---|
| 92 | </form><?cs |
|---|
| 93 | /if ?><?cs if ticket.attachments.0.name ?></div><?cs /if ?> |
|---|
| 94 | <?cs /if ?> |
|---|
| 95 | |
|---|
| 96 | <?cs if ticket.changes.0.time ?><h2>Changelog</h2> |
|---|
| 97 | <div id="changelog"> |
|---|
| 98 | <?cs set:comment = "" ?> |
|---|
| 99 | <?cs set:curr_time = "" ?> |
|---|
| 100 | <?cs set:curr_author = "" ?> |
|---|
| 101 | <?cs each:change = ticket.changes ?><?cs |
|---|
| 102 | if $change.time != $curr_time || $change.author != $curr_author ?><?cs |
|---|
| 103 | if:name(change) > 0 ?></ul><?cs /if ?><?cs |
|---|
| 104 | if $comment != "" ?> |
|---|
| 105 | <div class="comment"><?cs var:$comment ?></div><?cs set:comment = "" ?><?cs |
|---|
| 106 | /if ?> |
|---|
| 107 | <?cs set:curr_time = $change.time ?> |
|---|
| 108 | <?cs set:curr_author = $change.author ?> |
|---|
| 109 | <h3 id="change_<?cs var:name(change) ?>" class="change"><?cs |
|---|
| 110 | var:change.date ?>: Modified by <?cs var:curr_author ?></h3> |
|---|
| 111 | <ul class="changes"><?cs |
|---|
| 112 | /if ?><?cs |
|---|
| 113 | if $change.field == "comment" ?><?cs |
|---|
| 114 | set:$comment = $change.new ?><?cs |
|---|
| 115 | elif $change.new == "" ?> |
|---|
| 116 | <li><strong><?cs var:change.field ?></strong> cleared</li><?cs |
|---|
| 117 | elif $change.field == "attachment" ?> |
|---|
| 118 | <li><strong>attachment</strong> added: <?cs var:change.new ?></li><?cs |
|---|
| 119 | elif $change.field == "description" ?> |
|---|
| 120 | <li><strong><?cs var:change.field ?></strong> changed.</li><?cs |
|---|
| 121 | elif $change.old == "" ?> |
|---|
| 122 | <li><strong><?cs var:change.field ?></strong> set to <em><?cs var:change.new ?></em></li><?cs |
|---|
| 123 | else ?> |
|---|
| 124 | <li><strong><?cs var:change.field ?></strong> changed from <em><?cs |
|---|
| 125 | var:change.old ?></em> to <em><?cs var:change.new ?></em></li><?cs |
|---|
| 126 | /if ?><?cs |
|---|
| 127 | /each ?></ul><?cs |
|---|
| 128 | if $comment != "" ?> |
|---|
| 129 | <div class="comment"><?cs var:$comment ?></div><?cs |
|---|
| 130 | /if ?> |
|---|
| 131 | </div><?cs /if ?> |
|---|
| 132 | |
|---|
| 133 | <?cs if $trac.acl.TICKET_MODIFY ?> |
|---|
| 134 | <form action="<?cs var:cgi_location ?>#preview" method="post"> |
|---|
| 135 | <hr /> |
|---|
| 136 | <h3><a name="edit" onfocus="document.getElementById('comment').focus()">Add/Change #<?cs |
|---|
| 137 | var:ticket.id ?> (<?cs var:ticket.summary ?>)</a></h3> |
|---|
| 138 | <div class="field"> |
|---|
| 139 | <input type="hidden" name="mode" value="ticket" /> |
|---|
| 140 | <input type="hidden" name="id" value="<?cs var:ticket.id ?>" /> |
|---|
| 141 | <label for="author">Your email or username:</label><br /> |
|---|
| 142 | <input type="text" id="author" name="author" size="40" |
|---|
| 143 | value="<?cs var:ticket.reporter_id ?>" /><br /> |
|---|
| 144 | </div> |
|---|
| 145 | <div class="field"> |
|---|
| 146 | <fieldset class="iefix"> |
|---|
| 147 | <label for="comment">Comment (you may use <a tabindex="42" href="<?cs |
|---|
| 148 | var:$trac.href.wiki ?>/WikiFormatting">WikiFormatting</a> here):</label><br /> |
|---|
| 149 | <p><textarea id="comment" name="comment" rows="10" cols="78"><?cs |
|---|
| 150 | var:ticket.comment ?></textarea></p><?cs |
|---|
| 151 | call:wiki_toolbar('comment') ?> |
|---|
| 152 | </fieldset><?cs |
|---|
| 153 | if ticket.comment_preview ?> |
|---|
| 154 | <fieldset id="preview"> |
|---|
| 155 | <legend>Comment Preview</legend> |
|---|
| 156 | <?cs var:ticket.comment_preview ?> |
|---|
| 157 | </fieldset><?cs |
|---|
| 158 | /if ?> |
|---|
| 159 | </div> |
|---|
| 160 | |
|---|
| 161 | <fieldset id="properties"> |
|---|
| 162 | <legend>Change Properties</legend> |
|---|
| 163 | <div class="main"> |
|---|
| 164 | <label for="summary">Summary:</label> |
|---|
| 165 | <input id="summary" type="text" name="summary" size="70" value="<?cs |
|---|
| 166 | var:ticket.summary ?>" /><?cs |
|---|
| 167 | if $trac.acl.TICKET_ADMIN ?> |
|---|
| 168 | <br /> |
|---|
| 169 | <label for="description">Description:</label> |
|---|
| 170 | <div style="float: left"> |
|---|
| 171 | <textarea id="description" name="description" rows="10" cols="68"><?cs |
|---|
| 172 | var:ticket.description ?></textarea> |
|---|
| 173 | <?cs call:wiki_toolbar('description') ?> |
|---|
| 174 | </div> |
|---|
| 175 | <br style="clear: left" /> |
|---|
| 176 | <label for="reporter">Reporter:</label> |
|---|
| 177 | <input id="reporter" type="text" name="reporter" size="70" |
|---|
| 178 | value="<?cs var:ticket.reporter ?>" /><?cs |
|---|
| 179 | /if ?> |
|---|
| 180 | </div> |
|---|
| 181 | <div class="col1"> |
|---|
| 182 | <label for="component">Component:</label><?cs |
|---|
| 183 | call:hdf_select(ticket.components, "component", ticket.component) ?> |
|---|
| 184 | <br /> |
|---|
| 185 | <label for="version">Version:</label><?cs |
|---|
| 186 | call:hdf_select(ticket.versions, "version", ticket.version) ?> |
|---|
| 187 | <br /> |
|---|
| 188 | <label for="severity">Severity:</label><?cs |
|---|
| 189 | call:hdf_select(enums.severity, "severity", ticket.severity) ?> |
|---|
| 190 | <br /> |
|---|
| 191 | <label for="keywords">Keywords:</label> |
|---|
| 192 | <input type="text" id="keywords" name="keywords" size="20" |
|---|
| 193 | value="<?cs var:ticket.keywords ?>" /> |
|---|
| 194 | </div> |
|---|
| 195 | <div class="col2"> |
|---|
| 196 | <label for="priority">Priority:</label><?cs |
|---|
| 197 | call:hdf_select(enums.priority, "priority", ticket.priority) ?><br /> |
|---|
| 198 | <label for="milestone">Milestone:</label><?cs |
|---|
| 199 | call:hdf_select(ticket.milestones, "milestone", ticket.milestone) ?><br /> |
|---|
| 200 | <label for="owner">Assigned to:</label> |
|---|
| 201 | <input type="text" id="owner" name="owner" size="20" value="<?cs |
|---|
| 202 | var:ticket.owner ?>" disabled="disabled" /><br /> |
|---|
| 203 | <label for="cc">Cc:</label> |
|---|
| 204 | <input type="text" id="cc" name="cc" size="30" value="<?cs var:ticket.cc ?>" /> |
|---|
| 205 | </div> |
|---|
| 206 | <?cs if:len(ticket.custom) ?><div class="custom"> |
|---|
| 207 | <?cs call:ticket_custom_props(ticket) ?> |
|---|
| 208 | </div><?cs /if ?> |
|---|
| 209 | </fieldset> |
|---|
| 210 | |
|---|
| 211 | <fieldset id="action"> |
|---|
| 212 | <legend>Action</legend><?cs |
|---|
| 213 | if:!ticket.action ?><?cs set:ticket.action = 'leave' ?><?cs |
|---|
| 214 | /if ?><?cs |
|---|
| 215 | def:action_radio(id) ?> |
|---|
| 216 | <input type="radio" id="<?cs var:id ?>" name="action" value="<?cs |
|---|
| 217 | var:id ?>"<?cs if:$ticket.action == $id ?> checked="checked"<?cs |
|---|
| 218 | /if ?> /><?cs |
|---|
| 219 | /def ?> |
|---|
| 220 | <?cs call:action_radio('leave') ?> |
|---|
| 221 | <label for="leave">leave as <?cs var:ticket.status ?></label><br /><?cs |
|---|
| 222 | if $ticket.status == "new" ?> |
|---|
| 223 | <?cs call:action_radio('accept') ?> |
|---|
| 224 | <label for="accept">accept ticket</label><br /><?cs |
|---|
| 225 | /if ?><?cs |
|---|
| 226 | if $ticket.status == "closed" ?> |
|---|
| 227 | <?cs call:action_radio('reopen') ?> |
|---|
| 228 | <label for="reopen">reopen ticket</label><br /><?cs |
|---|
| 229 | /if ?><?cs |
|---|
| 230 | if $ticket.status == "new" || $ticket.status == "assigned" || $ticket.status == "reopened" ?> |
|---|
| 231 | <?cs call:action_radio('resolve') ?> |
|---|
| 232 | <label for="resolve">resolve</label> |
|---|
| 233 | <label for="resolve_resolution">as:</label> |
|---|
| 234 | <?cs call:hdf_select(enums.resolution, "resolve_resolution", args.resolve_resolution) ?><br /> |
|---|
| 235 | <?cs call:action_radio('reassign') ?> |
|---|
| 236 | <label for="reassign">reassign</label> |
|---|
| 237 | <label for="reassign_owner">to:</label> |
|---|
| 238 | <input type="text" id="reassign_owner" name="reassign_owner" size="40" value="<?cs |
|---|
| 239 | if:args.reassign_to ?><?cs var:args.reassign_to ?><?cs |
|---|
| 240 | else ?><?cs var:trac.authname ?><?cs /if ?>" /><?cs |
|---|
| 241 | /if ?><?cs |
|---|
| 242 | if $ticket.status == "new" || $ticket.status == "assigned" || $ticket.status == "reopened" ?> |
|---|
| 243 | <script type="text/javascript"> |
|---|
| 244 | var resolve = document.getElementById("resolve"); |
|---|
| 245 | var reassign = document.getElementById("reassign"); |
|---|
| 246 | var updateActionFields = function() { |
|---|
| 247 | enableControl('resolve_resolution', resolve.checked); |
|---|
| 248 | enableControl('reassign_owner', reassign.checked); |
|---|
| 249 | }; |
|---|
| 250 | addEvent(window, 'load', updateActionFields); |
|---|
| 251 | addEvent(document.getElementById("leave"), 'click', updateActionFields);<?cs |
|---|
| 252 | if $ticket.status == "new" ?> |
|---|
| 253 | addEvent(document.getElementById("accept"), 'click', updateActionFields);<?cs |
|---|
| 254 | /if ?> |
|---|
| 255 | addEvent(resolve, 'click', updateActionFields); |
|---|
| 256 | addEvent(reassign, 'click', updateActionFields); |
|---|
| 257 | </script><?cs |
|---|
| 258 | /if ?> |
|---|
| 259 | </fieldset> |
|---|
| 260 | |
|---|
| 261 | <div class="buttons"> |
|---|
| 262 | <input type="reset" value="Reset" /> |
|---|
| 263 | <input type="submit" name="preview" value="Preview" /> |
|---|
| 264 | <input type="submit" value="Submit changes" /> |
|---|
| 265 | </div> |
|---|
| 266 | </form> |
|---|
| 267 | <?cs /if ?> |
|---|
| 268 | |
|---|
| 269 | </div> |
|---|
| 270 | </div> |
|---|
| 271 | <?cs include "footer.cs"?> |
|---|