| <?cs include:"header.cs" ?> |
| <?cs include:"macros.cs" ?> |
| |
| <div id="ctxtnav" class="nav"><?cs |
| if:query.report_href ?><ul> |
| <li class="first"><a href="<?cs |
| var:query.report_href ?>">Available Reports</a></li> |
| <li class="last">Custom Query</li></ul><?cs |
| /if ?> |
| </div> |
| |
| <?cs def:num_matches(v) ?><span class="numrows">(<?cs |
| alt:v ?>No<?cs /alt ?> match<?cs if:v != 1 ?>es<?cs /if ?>)</span><?cs |
| /def ?> |
| |
| <div id="content" class="query"> |
| <h1><?cs var:title ?> <?cs call:num_matches(query.num_matches) ?></h1> |
| |
| <form id="query" method="post" action="<?cs var:trac.href.query ?>"> |
| <fieldset id="filters"> |
| <legend>Filters</legend> |
| <?cs def:checkbox_checked(constraint, option) ?><?cs |
| set:checked = 0 ?><?cs |
| each:value = constraint.values ?><?cs |
| if:(value == option) == (constraint.mode == '') ?><?cs |
| set:checked = 1 ?><?cs |
| /if ?><?cs |
| /each ?><?cs |
| if:checked ?> checked="checked"<?cs /if ?><?cs |
| /def ?> |
| <table summary="Query filters"> |
| <tbody><tr style="height: 1px"><td colspan="4"></td></tr></tbody><?cs |
| each:field = query.fields ?><?cs |
| each:constraint = query.constraints ?><?cs |
| if:name(field) == name(constraint) ?> |
| <tbody><tr class="<?cs var:name(field) ?>"> |
| <th scope="row"><label><?cs var:field.label ?></label></th><?cs |
| if:field.type != "radio" && field.type != "checkbox" ?> |
| <td class="mode"> |
| <select name="<?cs var:name(field) ?>_mode"><?cs |
| each:mode = query.modes[field.type] ?> |
| <option value="<?cs var:mode.value ?>"<?cs |
| if:mode.value == constraint.mode ?> selected="selected"<?cs |
| /if ?>><?cs var:mode.name ?></option><?cs |
| /each ?> |
| </select> |
| </td><?cs |
| /if ?> |
| <td class="filter"<?cs |
| if:field.type == "radio" || field.type == "checkbox" ?> colspan="2"<?cs |
| /if ?>><?cs |
| if:field.type == "select" ?><?cs |
| each:value = constraint.values ?> |
| <select name="<?cs var:name(constraint) ?>"><option></option><?cs |
| each:option = field.options ?> |
| <option<?cs if:option == value ?> selected="selected"<?cs /if ?>><?cs |
| var:option ?></option><?cs |
| /each ?></select><?cs |
| if:name(value) != len(constraint.values) - 1 ?> |
| </td> |
| <td class="actions"><input type="submit" name="rm_filter_<?cs |
| var:name(field) ?>_<?cs var:name(value) ?>" value="-" /></td> |
| </tr><tr class="<?cs var:name(field) ?>"> |
| <th colspan="2"><label>or</label></th> |
| <td class="filter"><?cs |
| /if ?><?cs |
| /each ?><?cs |
| elif:field.type == "radio" ?><?cs |
| each:option = field.options ?> |
| <input type="checkbox" id="<?cs var:name(field) ?>_<?cs |
| var:option ?>" name="<?cs var:name(field) ?>" value="<?cs |
| var:option ?>"<?cs call:checkbox_checked(constraint, option) ?> /> |
| <label for="<?cs var:name(field) ?>_<?cs var:option ?>"><?cs |
| alt:option ?>none<?cs /alt ?></label><?cs |
| /each ?><?cs |
| elif:field.type == "checkbox" ?> |
| <input type="radio" id="<?cs var:name(field) ?>_on" name="<?cs |
| var:name(field) ?>" value="1"<?cs |
| if:constraint.mode != '!' ?> checked="checked"<?cs /if ?> /> |
| <label for="<?cs var:name(field) ?>_on">yes</label> |
| <input type="radio" id="<?cs var:name(field) ?>_off" name="<?cs |
| var:name(field) ?>" value="!1"<?cs |
| if:constraint.mode == '!' ?> checked="checked"<?cs /if ?> /> |
| <label for="<?cs var:name(field) ?>_off">no</label><?cs |
| elif:field.type == "text" ?><?cs |
| each:value = constraint.values ?> |
| <input type="text" name="<?cs var:name(field) ?>" value="<?cs |
| var:value ?>" size="42" /><?cs |
| if:name(value) != len(constraint.values) - 1 ?> |
| </td> |
| <td class="actions"><input type="submit" name="rm_filter_<?cs |
| var:name(field) ?>_<?cs var:name(value) ?>" value="-" /></td> |
| </tr><tr class="<?cs var:name(field) ?>"> |
| <th colspan="2"><label>or</label></th> |
| <td class="filter"><?cs |
| /if ?><?cs |
| /each ?><?cs |
| /if ?> |
| </td> |
| <td class="actions"><input type="submit" name="rm_filter_<?cs |
| var:name(field) ?><?cs |
| if:field.type != 'radio' ?>_<?cs |
| var:len(constraint.values) - 1 ?><?cs |
| /if ?>" value="-" /></td> |
| </tr></tbody><?cs /if ?><?cs |
| /each ?><?cs |
| /each ?> |
| <tbody><tr class="actions"> |
| <td class="actions" colspan="4" style="text-align: right"> |
| <label for="add_filter">Add filter</label> |
| <select name="add_filter" id="add_filter"> |
| <option></option><?cs |
| each:field = query.fields ?> |
| <option value="<?cs var:name(field) ?>"<?cs |
| if:field.type == "radio" ?><?cs |
| if:len(query.constraints[name(field)]) != 0 ?> disabled="disabled"<?cs |
| /if ?><?cs |
| /if ?>><?cs var:field.label ?></option><?cs |
| /each ?> |
| </select> |
| <input type="submit" name="add" value="+" /> |
| </td> |
| </tr></tbody> |
| </table> |
| </fieldset> |
| <p class="option"> |
| <label for="group">Group results by</label> |
| <select name="group" id="group"> |
| <option></option><?cs |
| each:field = query.fields ?><?cs |
| if:field.type == 'select' || field.type == 'radio' || |
| name(field) == 'owner' ?> |
| <option value="<?cs var:name(field) ?>"<?cs |
| if:name(field) == query.group ?> selected="selected"<?cs /if ?>><?cs |
| var:field.label ?></option><?cs |
| /if ?><?cs |
| /each ?> |
| </select> |
| <input type="checkbox" name="groupdesc" id="groupdesc"<?cs |
| if:query.groupdesc ?> checked="checked"<?cs /if ?> /> |
| <label for="groupdesc">descending</label> |
| <script type="text/javascript"> |
| var group = document.getElementById("group"); |
| var updateGroupDesc = function() { |
| enableControl('groupdesc', group.selectedIndex > 0); |
| } |
| addEvent(window, 'load', updateGroupDesc); |
| addEvent(group, 'change', updateGroupDesc); |
| </script> |
| </p> |
| <p class="option"> |
| <input type="checkbox" name="verbose" id="verbose"<?cs |
| if:query.verbose ?> checked="checked"<?cs /if ?> /> |
| <label for="verbose">Show full description under each result</label> |
| </p> |
| <div class="buttons"> |
| <input type="hidden" name="order" value="<?cs var:query.order ?>" /> |
| <?cs if:query.desc ?><input type="hidden" name="desc" value="1" /><?cs /if ?> |
| <input type="submit" name="update" value="Update" /> |
| </div> |
| <hr /> |
| </form> |
| <script type="text/javascript"><?cs set:idx = 0 ?> |
| var properties={<?cs each:field = query.fields ?><?cs |
| var:name(field) ?>:{type:"<?cs var:field.type ?>",label:"<?cs |
| var:field.label ?>",options:[<?cs |
| each:option = field.options ?>"<?cs var:option ?>"<?cs |
| if:name(option) < len(field.options) -1 ?>,<?cs /if ?><?cs |
| /each ?>]}<?cs |
| set:idx = idx + 1 ?><?cs if:idx < len(query.fields) ?>,<?cs /if ?><?cs |
| /each ?>};<?cs set:idx = 0 ?> |
| var modes = {<?cs each:type = query.modes ?><?cs var:name(type) ?>:[<?cs |
| each:mode = type ?>{text:"<?cs var:mode.name ?>",value:"<?cs var:mode.value ?>"}<?cs |
| if:name(mode) < len(type) -1 ?>,<?cs /if ?><?cs |
| /each ?>]<?cs |
| set:idx = idx + 1 ?><?cs if:idx < len(query.modes) ?>,<?cs /if ?><?cs |
| /each ?>}; |
| initializeFilters(); |
| </script> |
| |
| <?cs def:thead() ?> |
| <thead><tr><?cs each:header = query.headers ?> |
| <th class="<?cs var:header.name ?><?cs if:query.order == header.name ?> <?cs |
| if:query.desc ?>desc<?cs else ?>asc<?cs /if ?><?cs /if ?>"> |
| <a title="Sort by <?cs var:header.label ?><?cs |
| if:query.order == header.name && !query.desc ?> (descending)<?cs |
| /if ?>" href="<?cs var:header.href ?>"><?cs var:header.label ?></a> |
| </th><?cs |
| /each ?></tr></thead> |
| <?cs /def ?> |
| |
| <?cs if:len(query.results) ?><?cs |
| if:!query.group ?> |
| <table class="listing tickets"> |
| <?cs call:thead() ?><tbody><?cs |
| /if ?><?cs |
| each:result = query.results ?><?cs |
| if:result[query.group] != prev_group ?> |
| <?cs if:prev_group ?></tbody></table><?cs /if ?> |
| <h2><?cs |
| each:field = query.fields ?><?cs |
| if:name(field) == query.group ?><?cs |
| var:field.label ?><?cs |
| /if ?><?cs |
| /each ?>: <?cs var:result[query.group] ?> <?cs call:num_matches(query.num_matches_group["_"+result[query.group]+"_"]) ?></h2> |
| <table class="listing tickets"> |
| <?cs call:thead() ?><tbody><?cs |
| /if ?> |
| <tr class="<?cs |
| if:name(result) % 2 ?>odd<?cs else ?>even<?cs /if ?> prio<?cs |
| var:result.priority_value ?><?cs |
| if:result.added ?> added<?cs /if ?><?cs |
| if:result.changed ?> changed<?cs /if ?><?cs |
| if:result.removed ?> removed<?cs /if ?>"><?cs |
| each:header = query.headers ?><?cs |
| if:name(header) == 0 ?><td class="id"><a href="<?cs |
| var:result.href ?>" title="View ticket"><?cs var:result.id ?></a></td><?cs |
| else ?><td class="<?cs var:header.name ?>"><?cs |
| if:header.name == 'summary' ?><a href="<?cs |
| var:result.href ?>" title="View ticket"><?cs |
| var:result.summary ?></a><?cs |
| else ?><span><?cs var:result[header.name] ?></span><?cs |
| /if ?></td><?cs |
| /if ?><?cs |
| /each ?> |
| <?cs if:query.verbose ?> |
| </tr><tr class="fullrow"><td colspan="<?cs var:len(query.headers) ?>"> |
| <p class="meta">Reported by <strong><?cs var:result.reporter ?></strong>, |
| <?cs var:result.time ?><?cs if:result.description ?>:<?cs /if ?></p> |
| <?cs if:result.description ?><p><?cs var:result.description ?></p><?cs /if ?> |
| </td> |
| <?cs /if ?><?cs set:prev_group = result[query.group] ?> |
| </tr><?cs /each ?> |
| </tbody></table><?cs |
| /if ?> |
| |
| <div id="help"> |
| <strong>Note:</strong> See <a href="<?cs var:trac.href.wiki ?>/TracQuery">TracQuery</a> |
| for help on using queries. |
| </div> |
| |
| </div> |
| <?cs include:"footer.cs" ?> |