r71585 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r71584‎ | r71585 | r71586 >
Date:21:10, 24 August 2010
Author:pdhanda
Status:ok
Tags:
Comment:
moved the comment box tot he bottom of the edit page... again
Modified paths:
  • /trunk/tools/bugzilla-3.6.2/template/en/custom/bug/edit.html.tmpl (added) (history)

Diff [purge]

Index: trunk/tools/bugzilla-3.6.2/template/en/custom/bug/edit.html.tmpl
@@ -0,0 +1,1164 @@
 2+[%# The contents of this file are subject to the Mozilla Public
 3+ # License Version 1.1 (the "License"); you may not use this file
 4+ # except in compliance with the License. You may obtain a copy of
 5+ # the License at http://www.mozilla.org/MPL/
 6+ #
 7+ # Software distributed under the License is distributed on an "AS
 8+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 9+ # implied. See the License for the specific language governing
 10+ # rights and limitations under the License.
 11+ #
 12+ # The Original Code is the Bugzilla Bug Tracking System.
 13+ #
 14+ # The Initial Developer of the Original Code is Netscape Communications
 15+ # Corporation. Portions created by Netscape are
 16+ # Copyright (C) 1998 Netscape Communications Corporation. All
 17+ # Rights Reserved.
 18+ #
 19+ # Contributor(s): Gervase Markham <gerv@gerv.net>
 20+ # Vaskin Kissoyan <vkissoyan@yahoo.com>
 21+ # Max Kanat-Alexander <mkanat@bugzilla.org>
 22+ # Frédéric Buclin <LpSolit@gmail.com>
 23+ # Olav Vitters <olav@bkor.dhs.org>
 24+ # Guy Pyrzak <guy.pyrzak@gmail.com>
 25+ # Elliotte Martin <emartin@everythingsolved.com>
 26+ #%]
 27+[%### The only customization to this template is to move the comment_box below the comments --pdhanda ###%]
 28+
 29+[% PROCESS global/variables.none.tmpl %]
 30+
 31+[% PROCESS "global/field-descs.none.tmpl" %]
 32+
 33+[% PROCESS bug/time.html.tmpl %]
 34+
 35+[% USE Bugzilla %]
 36+[% SET select_fields = {} %]
 37+[% FOREACH field = Bugzilla.get_fields(
 38+ { type => constants.FIELD_TYPE_SINGLE_SELECT, custom => 0 })
 39+%]
 40+ [% select_fields.${field.name} = field %]
 41+[% END %]
 42+
 43+ <script type="text/javascript">
 44+ <!--
 45+
 46+ /* Outputs a link to call replyToComment(); used to reduce HTML output */
 47+ function addReplyLink(id, real_id) {
 48+ /* XXX this should really be updated to use the DOM Core's
 49+ * createElement, but finding a container isn't trivial.
 50+ */
 51+ [% IF user.settings.quote_replies.value != 'off' %]
 52+ document.write('[<a href="#add_comment" onclick="replyToComment(' +
 53+ id + ',' + real_id + '); return false;">reply<' + '/a>]');
 54+ [% END %]
 55+ }
 56+
 57+ /* Adds the reply text to the `comment' textarea */
 58+ function replyToComment(id, real_id) {
 59+ var prefix = "(In reply to comment #" + id + ")\n";
 60+ var replytext = "";
 61+ [% IF user.settings.quote_replies.value == 'quoted_reply' %]
 62+ /* pre id="comment_name_N" */
 63+ var text_elem = document.getElementById('comment_text_'+id);
 64+ var text = getText(text_elem);
 65+
 66+ /* make sure we split on all newlines -- IE or Moz use \r and \n
 67+ * respectively.
 68+ */
 69+ text = text.split(/\r|\n/);
 70+
 71+ for (var i=0; i < text.length; i++) {
 72+ replytext += "> " + text[i] + "\n";
 73+ }
 74+
 75+ replytext = prefix + replytext + "\n";
 76+ [% ELSIF user.settings.quote_replies.value == 'simple_reply' %]
 77+ replytext = prefix;
 78+ [% END %]
 79+
 80+ [% IF user.is_insider %]
 81+ if (document.getElementById('isprivate_' + real_id).checked) {
 82+ document.getElementById('newcommentprivacy').checked = 'checked';
 83+ }
 84+ [% END %]
 85+
 86+ /* <textarea id="comment"> */
 87+ var textarea = document.getElementById('comment');
 88+ textarea.value += replytext;
 89+
 90+ textarea.focus();
 91+ }
 92+
 93+ if (typeof Node == 'undefined') {
 94+ /* MSIE doesn't define Node, so provide a compatibility object */
 95+ window.Node = {
 96+ TEXT_NODE: 3,
 97+ ENTITY_REFERENCE_NODE: 5
 98+ };
 99+ }
 100+
 101+ /* Concatenates all text from element's childNodes. This is used
 102+ * instead of innerHTML because we want the actual text (and
 103+ * innerText is non-standard).
 104+ */
 105+ function getText(element) {
 106+ var child, text = "";
 107+ for (var i=0; i < element.childNodes.length; i++) {
 108+ child = element.childNodes[i];
 109+ var type = child.nodeType;
 110+ if (type == Node.TEXT_NODE || type == Node.ENTITY_REFERENCE_NODE) {
 111+ text += child.nodeValue;
 112+ } else {
 113+ /* recurse into nodes of other types */
 114+ text += getText(child);
 115+ }
 116+ }
 117+ return text;
 118+ }
 119+
 120+[% IF user.is_timetracker %]
 121+ var fRemainingTime = [% bug.remaining_time %]; // holds the original value
 122+ function adjustRemainingTime() {
 123+ // subtracts time spent from remaining time
 124+ var new_time;
 125+
 126+ // prevent negative values if work_time > fRemainingTime
 127+ new_time =
 128+ Math.max(fRemainingTime - document.changeform.work_time.value, 0.0);
 129+ // get upto 2 decimal places
 130+ document.changeform.remaining_time.value =
 131+ Math.round(new_time * 100)/100;
 132+ }
 133+
 134+ function updateRemainingTime() {
 135+ // if the remaining time is changed manually, update fRemainingTime
 136+ fRemainingTime = document.changeform.remaining_time.value;
 137+ }
 138+
 139+[% END %]
 140+
 141+ //-->
 142+ </script>
 143+
 144+<form name="changeform" method="post" action="process_bug.cgi">
 145+
 146+ <input type="hidden" name="delta_ts" value="[% bug.delta_ts %]">
 147+ <input type="hidden" name="longdesclength" value="[% bug.comments.size %]">
 148+ <input type="hidden" name="id" value="[% bug.bug_id %]">
 149+ <input type="hidden" name="token" value="[% issue_hash_token([bug.id, bug.delta_ts]) FILTER html %]">
 150+
 151+ [% PROCESS section_title %]
 152+ <table class="edit_form">
 153+ <tr>
 154+ [%# 1st Column %]
 155+ <td id="bz_show_bug_column_1" class="bz_show_bug_column">
 156+ <table>
 157+ [%# *** ID, product, component, status, resolution, Hardware, and OS *** %]
 158+ [% PROCESS section_status %]
 159+
 160+ [% PROCESS section_spacer %]
 161+
 162+ [% PROCESS section_details1 %]
 163+
 164+ [% PROCESS section_spacer %]
 165+
 166+ [%# *** severity, priority, version and milestone *** %]
 167+ [% PROCESS section_details2 %]
 168+
 169+ [%# *** assigned to and qa contact *** %]
 170+ [% PROCESS section_people %]
 171+
 172+ [% PROCESS section_spacer %]
 173+
 174+ [% PROCESS section_url_keyword_whiteboard %]
 175+
 176+ [% PROCESS section_spacer %]
 177+
 178+ [%# *** Dependencies *** %]
 179+ [% PROCESS section_dependson_blocks %]
 180+
 181+ </table>
 182+ </td>
 183+ <td>
 184+ <div class="bz_column_spacer">&nbsp;</div>
 185+ </td>
 186+ [%# 2nd Column %]
 187+ <td id="bz_show_bug_column_2" class="bz_show_bug_column">
 188+ <table cellpadding="3" cellspacing="1">
 189+ [%# *** Reported and modified dates *** %]
 190+ [% PROCESS section_dates %]
 191+
 192+ [% PROCESS section_cclist %]
 193+
 194+ [% PROCESS section_spacer %]
 195+
 196+ [% PROCESS section_see_also %]
 197+
 198+ [% PROCESS section_customfields %]
 199+
 200+ [% PROCESS section_spacer %]
 201+
 202+ [% Hook.process("after_custom_fields") %]
 203+
 204+ [% PROCESS section_flags %]
 205+
 206+ </table>
 207+ </td>
 208+ </tr>
 209+ <tr>
 210+ <td colspan="3">
 211+ <hr id="bz_top_half_spacer">
 212+ </td>
 213+ </tr>
 214+ </table>
 215+
 216+ <table id="bz_big_form_parts" cellspacing="0" cellpadding="0"><tr>
 217+ <td>
 218+ [% IF user.is_timetracker %]
 219+ [% PROCESS section_timetracking %]
 220+ [% END %]
 221+
 222+ [%# *** Attachments *** %]
 223+
 224+ [% PROCESS attachment/list.html.tmpl
 225+ attachments = bug.attachments
 226+ bugid = bug.bug_id
 227+ num_attachment_flag_types = bug.num_attachment_flag_types
 228+ show_attachment_flags = bug.show_attachment_flags
 229+ %]
 230+
 231+ </td>
 232+ <td>
 233+ [% PROCESS section_restrict_visibility %]
 234+ </td>
 235+ </tr></table>
 236+
 237+ [%# *** Additional Comments *** %]
 238+ <div id="comments">
 239+ [% PROCESS bug/comments.html.tmpl
 240+ comments = bug.comments
 241+ mode = user.id ? "edit" : "show"
 242+ %]
 243+ </div>
 244+
 245+[%### The only customization to this template is to move the comment_box below the comments --pdhanda ###%]
 246+[% PROCESS comment_box %]
 247+
 248+</form>
 249+
 250+[%############################################################################%]
 251+[%# Block for the Title (alias and short desc) #%]
 252+[%############################################################################%]
 253+
 254+[% BLOCK section_title %]
 255+ [%# That's the main table, which contains all editable fields. %]
 256+ <div class="bz_alias_short_desc_container edit_form">
 257+ [% PROCESS commit_button id="_top"%]
 258+ <a href="show_bug.cgi?id=[% bug.bug_id %]">
 259+ [%-# %]<b>[% terms.Bug %]&nbsp;[% bug.bug_id FILTER html %]</b>
 260+ [%-# %]</a> -<span id="summary_alias_container" class="bz_default_hidden">
 261+ [% IF Param("usebugaliases") %]
 262+ [% IF bug.alias != "" %]
 263+ (<span id="alias_nonedit_display">[% bug.alias FILTER html %]</span>)
 264+ [% END %]
 265+ [% END %]
 266+ <span id="short_desc_nonedit_display">[% bug.short_desc FILTER quoteUrls(bug) %]</span>
 267+ [% IF bug.check_can_change_field('short_desc', 0, 1) ||
 268+ bug.check_can_change_field('alias', 0, 1) %]
 269+ <small class="editme">(<a href="#" id="editme_action">edit</a>)</small>
 270+ [% END %]
 271+ </span>
 272+
 273+
 274+ <div id="summary_alias_input">
 275+ <table id="summary">
 276+ [% IF Param("usebugaliases") %]
 277+ <tr>
 278+ [% IF bug.check_can_change_field('alias', 0, 1) %]
 279+ <td>
 280+ <label
 281+ for="alias"
 282+ title="a name for the
 283+ [% terms.bug %] that can be used in place of its ID number,
 284+ [%%] e.g. when adding it to a list of dependencies"
 285+ >Alias</label>:</td><td>
 286+ [% ELSIF bug.alias %]
 287+ <td colspan="2">(
 288+ [% ELSE %]
 289+ <td colspan="2">
 290+ [% END %]
 291+ [% PROCESS input inputname => "alias"
 292+ size => "20"
 293+ maxlength => "20"
 294+ no_td => 1
 295+ %][% ")" IF NOT bug.check_can_change_field('alias', 0, 1)
 296+ && bug.alias %]
 297+ </td>
 298+ </tr>
 299+ [% END %]
 300+ [%# *** Summary *** %]
 301+ <tr>
 302+ <td>
 303+ <label accesskey="s" for="short_desc"><u>S</u>ummary</label>:
 304+ </td>
 305+ <td>
 306+ [% PROCESS input inputname => "short_desc" size => "80" colspan => 2
 307+ maxlength => 255 spellcheck => "true" no_td => 1 %]
 308+ </td>
 309+ </tr>
 310+ </table>
 311+ </div>
 312+ </div>
 313+ <script type="text/javascript">
 314+ hideAliasAndSummary('[% bug.short_desc FILTER js %]', '[% bug.alias FILTER js %]');
 315+ </script>
 316+[% END %]
 317+
 318+[%############################################################################%]
 319+[%# Block for the first table in the "Details" section #%]
 320+[%############################################################################%]
 321+
 322+[% BLOCK section_details1 %]
 323+
 324+ [%#############%]
 325+ [%# PRODUCT #%]
 326+ [%#############%]
 327+
 328+ <tr>
 329+ [% INCLUDE bug/field.html.tmpl
 330+ bug = bug, field = select_fields.product,
 331+ override_legal_values = bug.choices.product
 332+ desc_url = 'describecomponents.cgi', value = bug.product
 333+ editable = bug.check_can_change_field('product', 0, 1) %]
 334+ </tr>
 335+ [%###############%]
 336+ [%# Component #%]
 337+ [%###############%]
 338+ <tr>
 339+ <td class="field_label">
 340+ <label for="component" accesskey="m">
 341+ <b><a href="describecomponents.cgi?product=[% bug.product FILTER url_quote %]">
 342+ Co<u>m</u>ponent</a>:
 343+ </b>
 344+ </label>
 345+ </td>
 346+ [% PROCESS select selname => "component" %]
 347+ </tr>
 348+ <tr>
 349+ <td class="field_label">
 350+ <label for="version"><b>Version</b></label>:
 351+ </td>
 352+
 353+ [% PROCESS select selname => "version" %]
 354+ </tr>
 355+ [%############%]
 356+ [%# PLATFORM #%]
 357+ [%############%]
 358+ <tr>
 359+ <td class="field_label">
 360+ <label for="rep_platform" accesskey="h"><b>Platform</b></label>:
 361+ </td>
 362+ <td class="field_value">
 363+ [% INCLUDE bug/field.html.tmpl
 364+ bug = bug, field = select_fields.rep_platform,
 365+ no_tds = 1, value = bug.rep_platform
 366+ editable = bug.check_can_change_field('rep_platform', 0, 1) %]
 367+ [%+ INCLUDE bug/field.html.tmpl
 368+ bug = bug, field = select_fields.op_sys,
 369+ no_tds = 1, value = bug.op_sys
 370+ editable = bug.check_can_change_field('op_sys', 0, 1) %]
 371+ <script type="text/javascript">
 372+ assignToDefaultOnChange(['product', 'component']);
 373+ </script>
 374+ </td>
 375+ </tr>
 376+
 377+
 378+
 379+[% END %]
 380+
 381+[%############################################################################%]
 382+[%# Block for the status section #%]
 383+[%############################################################################%]
 384+
 385+[% BLOCK section_status %]
 386+ <tr>
 387+ <td class="field_label">
 388+ <b><a href="page.cgi?id=fields.html#status">Status</a></b>:
 389+ </td>
 390+ <td id="bz_field_status">
 391+ <span id="static_bug_status">
 392+ [% display_value("bug_status", bug.bug_status) FILTER html %]
 393+ [% IF bug.resolution %]
 394+ [%+ display_value("resolution", bug.resolution) FILTER html %]
 395+ [% IF bug.dup_id %]
 396+ of [% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]
 397+ [% END %]
 398+ [% END %]
 399+ [% IF bug.user.canedit || bug.user.isreporter %]
 400+ (<a href="#add_comment"
 401+ onclick="window.setTimeout(function() { document.getElementById('bug_status').focus(); }, 10)">edit</a>)
 402+ [% END %]
 403+ </span>
 404+ </td>
 405+ </tr>
 406+[% END %]
 407+
 408+[%############################################################################%]
 409+[%# Block for the second table in the "Details" section #%]
 410+[%############################################################################%]
 411+
 412+[% BLOCK section_details2 %]
 413+
 414+ [%###############################################################%]
 415+ [%# Importance (priority, severity and votes) #%]
 416+ [%###############################################################%]
 417+ <tr>
 418+ <td class="field_label">
 419+ <label for="priority" accesskey="i">
 420+ <b><a href="page.cgi?id=fields.html#importance"><u>I</u>mportance</a></b></label>:
 421+ </td>
 422+ <td>
 423+ [% INCLUDE bug/field.html.tmpl
 424+ bug = bug, field = select_fields.priority,
 425+ no_tds = 1, value = bug.priority
 426+ editable = bug.check_can_change_field('priority', 0, 1) %]
 427+ [%+ INCLUDE bug/field.html.tmpl
 428+ bug = bug, field = select_fields.bug_severity,
 429+ no_tds = 1, value = bug.bug_severity
 430+ editable = bug.check_can_change_field('bug_severity', 0, 1) %]
 431+ [% IF bug.use_votes %]
 432+ <span id="votes_container">
 433+ [% IF bug.votes %]
 434+ with
 435+ <a href="votes.cgi?action=show_bug&amp;bug_id=[% bug.bug_id %]">
 436+ [% bug.votes %]
 437+ [% IF bug.votes == 1 %]
 438+ vote
 439+ [% ELSE %]
 440+ votes
 441+ [% END %]</a>
 442+ [% END %]
 443+ (<a href="votes.cgi?action=show_user&amp;bug_id=
 444+ [% bug.bug_id %]#vote_[% bug.bug_id %]">vote</a>)
 445+ </span>
 446+ [% END %]
 447+ </td>
 448+ </tr>
 449+
 450+ [% IF Param("usetargetmilestone") && bug.target_milestone %]
 451+ <tr>
 452+ <td class="field_label">
 453+ <label for="target_milestone">
 454+ <a href="page.cgi?id=fields.html#target_milestone">
 455+ Target&nbsp;Milestone</a></label>:
 456+ </td>
 457+ [% PROCESS select selname = "target_milestone" %]
 458+ </tr>
 459+ [% END %]
 460+
 461+[% END %]
 462+
 463+[%############################################################################%]
 464+[%# Block for the table in the "People" section #%]
 465+[%############################################################################%]
 466+
 467+[% BLOCK section_people %]
 468+
 469+ <tr>
 470+ <td class="field_label">
 471+ <b><a href="page.cgi?id=fields.html#assigned_to">Assigned To</a></b>:
 472+ </td>
 473+ <td>
 474+ [% IF bug.check_can_change_field("assigned_to", 0, 1) %]
 475+ <div id="bz_assignee_edit_container" class="bz_default_hidden">
 476+ <span>
 477+ [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
 478+ (<a href="#" id="bz_assignee_edit_action">edit</a>)
 479+ </span>
 480+ </div>
 481+ <div id="bz_assignee_input">
 482+ [% INCLUDE global/userselect.html.tmpl
 483+ id => "assigned_to"
 484+ name => "assigned_to"
 485+ value => bug.assigned_to.login
 486+ size => 30
 487+ %]
 488+ <br>
 489+ <input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1">
 490+ <label id="set_default_assignee_label" for="set_default_assignee">Reset Assignee to default</label>
 491+ </div>
 492+ <script type="text/javascript">
 493+ hideEditableField('bz_assignee_edit_container',
 494+ 'bz_assignee_input',
 495+ 'bz_assignee_edit_action',
 496+ 'assigned_to',
 497+ '[% bug.assigned_to.login FILTER js %]' );
 498+ initDefaultCheckbox('assignee');
 499+ </script>
 500+ [% ELSE %]
 501+ [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
 502+ [% END %]
 503+ </td>
 504+ </tr>
 505+
 506+ [% IF Param('useqacontact') %]
 507+ <tr>
 508+ <td class="field_label">
 509+ <label for="qa_contact" accesskey="q"><b><u>Q</u>A Contact</b></label>:
 510+ </td>
 511+ <td>
 512+ [% IF bug.check_can_change_field("qa_contact", 0, 1) %]
 513+ [% IF bug.qa_contact != "" %]
 514+ <div id="bz_qa_contact_edit_container" class="bz_default_hidden">
 515+ <span>
 516+ <span id="bz_qa_contact_edit_display">
 517+ [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]</span>
 518+ (<a href="#" id="bz_qa_contact_edit_action">edit</a>)
 519+ </span>
 520+ </div>
 521+ [% END %]
 522+ <div id="bz_qa_contact_input">
 523+ [% INCLUDE global/userselect.html.tmpl
 524+ id => "qa_contact"
 525+ name => "qa_contact"
 526+ value => bug.qa_contact.login
 527+ size => 30
 528+ emptyok => 1
 529+ %]
 530+ <br>
 531+ <input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1">
 532+ <label for="set_default_qa_contact" id="set_default_qa_contact_label">Reset QA Contact to default</label>
 533+ </div>
 534+ <script type="text/javascript">
 535+ [% IF bug.qa_contact != "" %]
 536+ hideEditableField('bz_qa_contact_edit_container',
 537+ 'bz_qa_contact_input',
 538+ 'bz_qa_contact_edit_action',
 539+ 'qa_contact',
 540+ '[% bug.qa_contact.login FILTER js %]');
 541+ [% END %]
 542+ initDefaultCheckbox('qa_contact');
 543+ </script>
 544+ [% ELSE %]
 545+ [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
 546+ [% END %]
 547+ </td>
 548+ </tr>
 549+ [% END %]
 550+[% END %]
 551+
 552+[%############################################################################%]
 553+[%# Block for URL Keyword and Whiteboard #%]
 554+[%############################################################################%]
 555+[% BLOCK section_url_keyword_whiteboard %]
 556+[%# *** URL Whiteboard Keywords *** %]
 557+ <tr>
 558+ <td class="field_label">
 559+ <label for="bug_file_loc" accesskey="u"><b>
 560+ [% IF bug.bug_file_loc
 561+ AND NOT bug.bug_file_loc.match("^(javascript|data)") %]
 562+ <a href="[% bug.bug_file_loc FILTER html %]"><u>U</u>RL</a>
 563+ [% ELSE %]
 564+ <u>U</u>RL
 565+ [% END %]
 566+ [%%]</b></label>:
 567+ </td>
 568+ <td>
 569+ [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
 570+ <span id="bz_url_edit_container" class="bz_default_hidden">
 571+ [% IF bug.bug_file_loc
 572+ AND NOT bug.bug_file_loc.match("^(javascript|data)") %]
 573+ <a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
 574+ title="[% bug.bug_file_loc FILTER html %]">
 575+ [% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a>
 576+ [% ELSE %]
 577+ [% bug.bug_file_loc FILTER html %]
 578+ [% END %]
 579+ (<a href="#" id="bz_url_edit_action">edit</a>)</span>
 580+ [% END %]
 581+ <span id="bz_url_input_area">
 582+ [% url_output = PROCESS input no_td=1 inputname => "bug_file_loc" size => "40" colspan => 2 %]
 583+ [% IF NOT bug.check_can_change_field("bug_file_loc", 0, 1) %]
 584+ <a href="[% bug.bug_file_loc FILTER html %]">[% url_output FILTER none %]</a>
 585+ [% ELSE %]
 586+ [% url_output FILTER none %]
 587+ [% END %]
 588+ </span>
 589+ [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
 590+ <script type="text/javascript">
 591+ hideEditableField('bz_url_edit_container',
 592+ 'bz_url_input_area',
 593+ 'bz_url_edit_action',
 594+ 'bug_file_loc',
 595+ "[% bug.bug_file_loc FILTER js %]");
 596+ </script>
 597+ [% END %]
 598+ </td>
 599+ </tr>
 600+
 601+ [% IF Param('usestatuswhiteboard') %]
 602+ <tr>
 603+ <td class="field_label">
 604+ <label for="status_whiteboard" accesskey="w"><b><u>W</u>hiteboard</b></label>:
 605+ </td>
 606+ [% PROCESS input inputname => "status_whiteboard" size => "40" colspan => 2 %]
 607+ </tr>
 608+ [% END %]
 609+
 610+ [% IF use_keywords %]
 611+ <tr>
 612+ <td class="field_label">
 613+ <label for="keywords" accesskey="k">
 614+ <b><a href="describekeywords.cgi"><u>K</u>eywords</a></b></label>:
 615+ </td>
 616+ [% PROCESS input inputname => "keywords" size => 40 colspan => 2
 617+ value => bug.keywords.join(', ') %]
 618+ </tr>
 619+ [% END %]
 620+[% END %]
 621+
 622+[%############################################################################%]
 623+[%# Block for Depends On / Blocks #%]
 624+[%############################################################################%]
 625+[% BLOCK section_dependson_blocks %]
 626+ <tr>
 627+ [% PROCESS dependencies
 628+ dep = { title => "Depends&nbsp;on", fieldname => "dependson" } %]
 629+ </tr>
 630+
 631+ <tr>
 632+ [% PROCESS dependencies accesskey = "b"
 633+ dep = { title => "<u>B</u>locks", fieldname => "blocked" } %]
 634+
 635+ <tr>
 636+ <th>&nbsp;</th>
 637+
 638+ <td colspan="2" align="left" id="show_dependency_tree_or_graph">
 639+ Show dependency <a href="showdependencytree.cgi?id=[% bug.bug_id %]&amp;hide_resolved=1">tree</a>
 640+
 641+ [% IF Param('webdotbase') %]
 642+ /&nbsp;<a href="showdependencygraph.cgi?id=[% bug.bug_id %]">graph</a>
 643+ [% END %]
 644+ </td>
 645+ </tr>
 646+[% END %]
 647+
 648+
 649+[%############################################################################%]
 650+[%# Block for Restricting Visibility #%]
 651+[%############################################################################%]
 652+
 653+[% BLOCK section_restrict_visibility %]
 654+ [% RETURN UNLESS bug.groups.size %]
 655+
 656+ <div class="bz_group_visibility_section">
 657+ [% inallgroups = 1 %]
 658+ [% inagroup = 0 %]
 659+ [% emitted_description = 0 %]
 660+
 661+ [% FOREACH group = bug.groups %]
 662+ [% SET inallgroups = 0 IF NOT group.ingroup %]
 663+ [% SET inagroup = 1 IF group.ison %]
 664+
 665+ [% NEXT IF group.mandatory %]
 666+
 667+ [% IF NOT emitted_description %]
 668+ [% emitted_description = 1 %]
 669+ <div id="bz_restrict_group_visibility_help">
 670+ <b>Only users in all of the selected groups can view this
 671+ [%+ terms.bug %]:</b>
 672+ <p class="instructions">
 673+ Unchecking all boxes makes this a more public [% terms.bug %].
 674+ </p>
 675+ </div>
 676+ [% END %]
 677+
 678+ [% IF group.ingroup %]
 679+ <input type="hidden" name="defined_bit-[% group.bit %]" value="1">
 680+ [% END %]
 681+
 682+ <input type="checkbox" value="1" name="bit-[% group.bit %]"
 683+ id="bit-[% group.bit %]"
 684+ [% ' checked="checked"' IF group.ison %]
 685+ [% ' disabled="disabled"' IF NOT group.ingroup %]>
 686+ <label for="bit-[% group.bit %]">
 687+ [%- group.description FILTER html_light %]</label>
 688+ <br>
 689+ [% END %]
 690+
 691+ [% IF emitted_description %]
 692+ [% IF NOT inallgroups %]
 693+ <p class="instructions">Only members of a group can change the
 694+ visibility of [% terms.abug %] for that group.</p>
 695+ [% END %]
 696+ [% END %]
 697+
 698+ [% IF inagroup %]
 699+ <div id="bz_enable_role_visibility_help">
 700+ <b>Users in the roles selected below can always view
 701+ this [% terms.bug %]:</b>
 702+ </div>
 703+ <div id="bz_enable_role_visibility">
 704+ <div>
 705+ [% user_can_edit_accessible =
 706+ bug.check_can_change_field("reporter_accessible", 0, 1)
 707+ %]
 708+ [% IF user_can_edit_accessible %]
 709+ <input type="hidden" name="defined_reporter_accessible" value="1">
 710+ [% END %]
 711+ <input type="checkbox" value="1"
 712+ name="reporter_accessible" id="reporter_accessible"
 713+ [% " checked" IF bug.reporter_accessible %]
 714+ [% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
 715+ <label for="reporter_accessible">Reporter</label>
 716+ </div>
 717+ <div>
 718+ [% user_can_edit_accessible =
 719+ bug.check_can_change_field("cclist_accessible", 0, 1)
 720+ %]
 721+ [% IF user_can_edit_accessible %]
 722+ <input type="hidden" name="defined_cclist_accessible" value="1">
 723+ [% END %]
 724+ <input type="checkbox" value="1"
 725+ name="cclist_accessible" id="cclist_accessible"
 726+ [% " checked" IF bug.cclist_accessible %]
 727+ [% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
 728+ <label for="cclist_accessible">CC List</label>
 729+ </div>
 730+ <p class="instructions">
 731+ The assignee
 732+ [% IF (Param('useqacontact')) %]
 733+ and QA contact
 734+ [% END %]
 735+ can always see [% terms.abug %], and this section does not
 736+ take effect unless the [% terms.bug %] is restricted to at
 737+ least one group.
 738+ </p>
 739+ </div>
 740+ [% END %]
 741+ </div> [%# bz_group_visibility_section %]
 742+[% END %]
 743+
 744+[%############################################################################%]
 745+[%# Block for Dates #%]
 746+[%############################################################################%]
 747+
 748+[% BLOCK section_dates %]
 749+ <tr>
 750+ <td class="field_label">
 751+ <b>Reported</b>:
 752+ </td>
 753+ <td>
 754+ [% bug.creation_ts FILTER time %] by [% INCLUDE global/user.html.tmpl who = bug.reporter %]
 755+ </td>
 756+ </tr>
 757+
 758+ <tr>
 759+ <td class="field_label">
 760+ <b> Modified</b>:
 761+ </td>
 762+ <td>
 763+ [% bug.delta_ts FILTER time FILTER replace(':\d\d$', '') FILTER replace(':\d\d ', ' ')%]
 764+ (<a href="show_activity.cgi?id=[% bug.bug_id %]">[%# terms.Bug %]History</a>)
 765+ </td>
 766+
 767+ </tr>
 768+[% END %]
 769+
 770+[%############################################################################%]
 771+[%# Block for CC LIST #%]
 772+[%############################################################################%]
 773+[% BLOCK section_cclist %]
 774+ <tr>
 775+ <td class="field_label">
 776+ <label for="newcc" accesskey="a"><b>CC List</b>:</label>
 777+ </td>
 778+ <td>
 779+ [% IF user.id %]
 780+ [% IF NOT bug.cc || NOT bug.cc.contains(user.login) %]
 781+ [% has_role = bug.user.isreporter
 782+ || bug.assigned_to.id == user.id
 783+ || (Param('useqacontact')
 784+ && bug.qa_contact
 785+ && bug.qa_contact.id == user.id) %]
 786+ <input type="checkbox" id="addselfcc" name="addselfcc"
 787+ [% " checked=\"checked\""
 788+ IF user.settings.state_addselfcc.value == 'always'
 789+ || (!has_role
 790+ && user.settings.state_addselfcc.value == 'cc_unless_role') %]>
 791+ <label for="addselfcc">Add me to CC list</label>
 792+ <br>
 793+ [% END %]
 794+ [% END %]
 795+ [% bug.cc.size || 0 FILTER html %]
 796+ [% IF bug.cc.size == 1 %]
 797+ user
 798+ [% ELSE %]
 799+ users
 800+ [% END %]
 801+ [% IF user.id %]
 802+ [% IF bug.cc.contains( user.email ) %]
 803+ including you
 804+ [% END %]
 805+ [% END %]
 806+ <span id="cc_edit_area_showhide_container" class="bz_default_hidden">
 807+ (<a href="#" id="cc_edit_area_showhide">[% IF user.id %]edit[% ELSE %]show[% END %]</a>)
 808+ </span>
 809+ <div id="cc_edit_area">
 810+ <br>
 811+ [% IF user.id %]
 812+ <div>
 813+ <div><label for="cc"><b>Add</b></label></div>
 814+ [% INCLUDE global/userselect.html.tmpl
 815+ id => "newcc"
 816+ name => "newcc"
 817+ value => ""
 818+ size => 30
 819+ multiple => 5
 820+ %]
 821+ </div>
 822+ [% END %]
 823+ [% IF bug.cc %]
 824+ <select id="cc" name="cc" multiple="multiple" size="5">
 825+ [% FOREACH c = bug.cc %]
 826+ <option value="[% c FILTER email FILTER html %]">
 827+ [% c FILTER email FILTER html %]</option>
 828+ [% END %]
 829+ </select>
 830+ [% IF user.id %]
 831+ <br>
 832+ <input type="checkbox" id="removecc" name="removecc">
 833+ [%%]<label for="removecc">Remove selected CCs</label>
 834+ <br>
 835+ [% END %]
 836+ [% END %]
 837+ </div>
 838+ <script type="text/javascript">
 839+ hideEditableField( 'cc_edit_area_showhide_container',
 840+ 'cc_edit_area',
 841+ 'cc_edit_area_showhide',
 842+ '',
 843+ '');
 844+ </script>
 845+ </td>
 846+ </tr>
 847+[% END %]
 848+
 849+[%############################################################################%]
 850+[%# Block for See Also #%]
 851+[%############################################################################%]
 852+[% BLOCK section_see_also %]
 853+ [% IF Param('use_see_also') || bug.see_also.size %]
 854+ <tr>
 855+ [% INCLUDE bug/field.html.tmpl
 856+ field = bug_fields.see_also
 857+ value = bug.see_also
 858+ editable = bug.check_can_change_field('see_also', 0, 1)
 859+ %]
 860+ </tr>
 861+ [% END %]
 862+[% END %]
 863+
 864+[%############################################################################%]
 865+[%# Block for FLAGS #%]
 866+[%############################################################################%]
 867+
 868+[% BLOCK section_flags %]
 869+ [%# *** Flags *** %]
 870+ [% show_bug_flags = 0 %]
 871+ [% FOREACH type = bug.flag_types %]
 872+ [% IF (type.flags && type.flags.size > 0) || (user.id && type.is_active) %]
 873+ [% show_bug_flags = 1 %]
 874+ [% LAST %]
 875+ [% END %]
 876+ [% END %]
 877+ [% IF show_bug_flags %]
 878+ <tr>
 879+ <td class="field_label flags_label">
 880+ <label><b>Flags:</b></label>
 881+ </td>
 882+ <td></td>
 883+ </tr>
 884+ <tr>
 885+ <td colspan="2">
 886+ [% IF bug.flag_types.size > 0 %]
 887+ [% PROCESS "flag/list.html.tmpl" flag_no_header = 1
 888+ flag_types = bug.flag_types
 889+ any_flags_requesteeble = bug.any_flags_requesteeble %]
 890+ [% END %]
 891+ </td>
 892+ </tr>
 893+ [% END %]
 894+[% END %]
 895+
 896+[%############################################################################%]
 897+[%# Block for Custom Fields #%]
 898+[%############################################################################%]
 899+
 900+[% BLOCK section_customfields %]
 901+[%# *** Custom Fields *** %]
 902+
 903+ [% FOREACH field = Bugzilla.active_custom_fields %]
 904+ <tr>
 905+ [% PROCESS bug/field.html.tmpl value=bug.${field.name}
 906+ editable = bug.check_can_change_field(field.name, 0, 1)
 907+ value_span = 2 %]
 908+ </tr>
 909+ [% END %]
 910+[% END %]
 911+
 912+[%############################################################################%]
 913+[%# Block for Section Spacer #%]
 914+[%############################################################################%]
 915+
 916+[% BLOCK section_spacer %]
 917+ <tr>
 918+ <td colspan="2" class="bz_section_spacer"></td>
 919+ </tr>
 920+[% END %]
 921+
 922+
 923+
 924+
 925+[%############################################################################%]
 926+[%# Block for dependencies #%]
 927+[%############################################################################%]
 928+
 929+[% BLOCK dependencies %]
 930+
 931+ <th class="field_label">
 932+ <label for="[% dep.fieldname %]"[% " accesskey=\"$accesskey\"" IF accesskey %]>
 933+ [% dep.title %]</label>:
 934+ </th>
 935+ <td>
 936+ <span id="[% dep.fieldname %]_input_area">
 937+ [% IF bug.check_can_change_field(dep.fieldname, 0, 1) %]
 938+ <input name="[% dep.fieldname %]" id="[% dep.fieldname %]"
 939+ class="text_input"
 940+ value="[% bug.${dep.fieldname}.join(', ') %]">
 941+ [% END %]
 942+ </span>
 943+
 944+ [% FOREACH depbug = bug.${dep.fieldname} %]
 945+ [% depbug FILTER bug_link(depbug, use_alias => 1) FILTER none %][% " " %]
 946+ [% END %]
 947+ [% IF bug.check_can_change_field(dep.fieldname, 0, 1) %]
 948+ <span id="[% dep.fieldname %]_edit_container" class="edit_me bz_default_hidden" >
 949+ (<a href="#" id="[% dep.fieldname %]_edit_action">edit</a>)
 950+ </span>
 951+ <script type="text/javascript">
 952+ hideEditableField('[% dep.fieldname %]_edit_container',
 953+ '[% dep.fieldname %]_input_area',
 954+ '[% dep.fieldname %]_edit_action',
 955+ '[% dep.fieldname %]',
 956+ "[% bug.${dep.fieldname}.join(', ') %]");
 957+ </script>
 958+ [% END %]
 959+ </td>
 960+
 961+ [% accesskey = undef %]
 962+
 963+[% END %]
 964+
 965+[%############################################################################%]
 966+[%# Block for Time Tracking Group #%]
 967+[%############################################################################%]
 968+
 969+[% BLOCK section_timetracking %]
 970+ <table class="bz_time_tracking_table">
 971+ <tr>
 972+ <th>
 973+ <label for="estimated_time">Orig. Est.</label>
 974+ </th>
 975+ <th>
 976+ Current Est.
 977+ </th>
 978+ <th>
 979+ <label for="work_time">Hours Worked</label>
 980+ </th>
 981+ <th>
 982+ <label for="remaining_time">Hours Left</label>
 983+ </th>
 984+ <th>
 985+ %Complete
 986+ </th>
 987+ <th>
 988+ Gain
 989+ </th>
 990+ <th>
 991+ <label for="deadline">Deadline</label>
 992+ </th>
 993+ </tr>
 994+ <tr>
 995+ <td>
 996+ <input name="estimated_time" id="estimated_time"
 997+ value="[% PROCESS formattimeunit
 998+ time_unit=bug.estimated_time %]"
 999+ size="6" maxlength="6">
 1000+ </td>
 1001+ <td>
 1002+ [% PROCESS formattimeunit
 1003+ time_unit=(bug.actual_time + bug.remaining_time) %]
 1004+ </td>
 1005+ <td>
 1006+ [% PROCESS formattimeunit time_unit=bug.actual_time %] +
 1007+ <input name="work_time" id="work_time"
 1008+ value="0" size="3" maxlength="6"
 1009+ onchange="adjustRemainingTime();">
 1010+ </td>
 1011+ <td>
 1012+ <input name="remaining_time" id="remaining_time"
 1013+ value="[% PROCESS formattimeunit
 1014+ time_unit=bug.remaining_time %]"
 1015+ size="6" maxlength="6" onchange="updateRemainingTime();">
 1016+ </td>
 1017+ <td>
 1018+ [% PROCESS calculatepercentage act=bug.actual_time
 1019+ rem=bug.remaining_time %]
 1020+ </td>
 1021+ <td>
 1022+ [% PROCESS formattimeunit time_unit=bug.estimated_time - (bug.actual_time + bug.remaining_time) %]
 1023+ </td>
 1024+ <td>
 1025+ <input name="deadline" id="deadline" value="[% bug.deadline %]"
 1026+ size="10" maxlength="10"><br />
 1027+ <small>(YYYY-MM-DD)</small>
 1028+ </td>
 1029+ </tr>
 1030+ <tr>
 1031+ <td colspan="7" class="bz_summarize_time">
 1032+ <a href="summarize_time.cgi?id=[% bug.bug_id %]&amp;do_depends=1">
 1033+ Summarize time (including time for [% terms.bugs %]
 1034+ blocking this [% terms.bug %])</a>
 1035+ </td>
 1036+ </tr>
 1037+ </table>
 1038+[% END %]
 1039+
 1040+[%############################################################################%]
 1041+[%# Block for the Additional Comments box #%]
 1042+[%############################################################################%]
 1043+
 1044+[% BLOCK comment_box %]
 1045+ <div class="bz_section_additional_comments">
 1046+ <a name="add_comment"></a>
 1047+ [% IF user.id %]
 1048+ <label for="comment" accesskey="c"><b>Additional
 1049+ <u>C</u>omments</b></label>:
 1050+
 1051+ [% IF user.is_insider %]
 1052+ <input type="checkbox" name="commentprivacy" value="1"
 1053+ id="newcommentprivacy"
 1054+ onClick="updateCommentTagControl(this, form)">
 1055+ <label for="newcommentprivacy">
 1056+ Make comment private (visible only to members of the
 1057+ <strong>[% Param('insidergroup') FILTER html %]</strong> group)
 1058+ </label>
 1059+ [% END %]
 1060+
 1061+ <!-- This table keeps the submit button aligned with the box. -->
 1062+ <table><tr><td>
 1063+ [% INCLUDE global/textarea.html.tmpl
 1064+ name = 'comment'
 1065+ id = 'comment'
 1066+ minrows = 10
 1067+ maxrows = 25
 1068+ cols = constants.COMMENT_COLS
 1069+ %]
 1070+ [% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %]
 1071+ <br>
 1072+ [% PROCESS commit_button id=""%]
 1073+
 1074+ <table class="status" cellspacing="0" cellpadding="0">
 1075+ <tr>
 1076+ <td class="field_label">
 1077+ <b><a href="page.cgi?id=fields.html#status">Status</a></b>:
 1078+ </td>
 1079+ <td>
 1080+ <a name="bug_status_bottom"></a>
 1081+ [% PROCESS bug/knob.html.tmpl %]
 1082+ </td>
 1083+ </tr>
 1084+ </table>
 1085+ </td></tr></table>
 1086+
 1087+ [%# For logged-out users %]
 1088+ [% ELSE %]
 1089+ <table><tr><td><fieldset>
 1090+ <legend>Note</legend>
 1091+ You need to
 1092+ <a href="show_bug.cgi?id=
 1093+ [%- bug.bug_id %]&amp;GoAheadAndLogIn=1">log in</a>
 1094+ before you can comment on or make changes to this [% terms.bug %].
 1095+ </fieldset></table><tr></td>
 1096+ [% END %]
 1097+ </div>
 1098+[% END %]
 1099+
 1100+[%############################################################################%]
 1101+[%# Block for SELECT fields #%]
 1102+[%############################################################################%]
 1103+
 1104+[% BLOCK select %]
 1105+ <td>
 1106+ [% IF bug.check_can_change_field(selname, 0, 1)
 1107+ AND bug.choices.${selname}.size > 1 %]
 1108+ <select id="[% selname %]" name="[% selname %]">
 1109+ [% FOREACH x = bug.choices.${selname} %]
 1110+ <option value="[% x.name FILTER html %]"
 1111+ [% " selected" IF x.name == bug.${selname} %]>
 1112+ [%- x.name FILTER html %]
 1113+ </option>
 1114+ [% END %]
 1115+ </select>
 1116+ [% ELSE %]
 1117+ [% bug.${selname} FILTER html %]
 1118+ [% END %]
 1119+ </td>
 1120+[% END %]
 1121+
 1122+[%############################################################################%]
 1123+[%# Block for INPUT fields #%]
 1124+[%############################################################################%]
 1125+
 1126+[% BLOCK input %]
 1127+ [% IF no_td != 1 %]
 1128+ <td[% " colspan=\"$colspan\"" IF colspan %]>
 1129+ [% END %]
 1130+ [% val = value ? value : bug.$inputname %]
 1131+ [% IF bug.check_can_change_field(inputname, 0, 1) %]
 1132+ <input id="[% inputname %]" name="[% inputname %]" class="text_input"
 1133+ value="[% val FILTER html %]"[% " size=\"$size\"" IF size %]
 1134+ [% " maxlength=\"$maxlength\"" IF maxlength %]
 1135+ [% " spellcheck=\"$spellcheck\"" IF spellcheck %]>
 1136+ [% ELSE %]
 1137+ [% IF size && val.length > size %]
 1138+ <span title="[% val FILTER html %]">
 1139+ [% val FILTER truncate(size) FILTER html %]
 1140+ </span>
 1141+ [% ELSE %]
 1142+ [% val FILTER html %]
 1143+ [% END %]
 1144+ [% END %]
 1145+ [% IF no_td != 1 %]
 1146+ </td>
 1147+ [% END %]
 1148+ [% no_td = 0 %]
 1149+ [% maxlength = 0 %]
 1150+ [% colspan = 0 %]
 1151+ [% size = 0 %]
 1152+ [% value = undef %]
 1153+ [% spellcheck = undef %]
 1154+[% END %]
 1155+[% BLOCK commit_button %]
 1156+ [% IF user.id %]
 1157+ <div class="knob-buttons">
 1158+ <input type="submit" value="Save Changes"
 1159+ id="commit[% id FILTER css_class_quote %]">
 1160+ [% IF bug.user.canmove %]
 1161+ <input type="submit" name="action" id="action[% id FILTER css_class_quote %]" value="[% Param("move-button-text") %]">
 1162+ [% END %]
 1163+ </div>
 1164+ [% END %]
 1165+[% END %]

Status & tagging log