summaryrefslogtreecommitdiffstats
path: root/template
diff options
context:
space:
mode:
Diffstat (limited to 'template')
-rw-r--r--template/en/default/account/auth/login-small.html.tmpl115
-rw-r--r--template/en/default/account/auth/login.html.tmpl121
-rw-r--r--template/en/default/account/cancel-token.txt.tmpl106
-rw-r--r--template/en/default/account/create.html.tmpl79
-rw-r--r--template/en/default/account/created.html.tmpl40
-rw-r--r--template/en/default/account/email/change-new.txt.tmpl41
-rw-r--r--template/en/default/account/email/change-old.txt.tmpl46
-rw-r--r--template/en/default/account/email/confirm-new.html.tmpl76
-rw-r--r--template/en/default/account/email/confirm.html.tmpl47
-rw-r--r--template/en/default/account/email/request-new.txt.tmpl56
-rw-r--r--template/en/default/account/password/forgotten-password.txt.tmpl40
-rw-r--r--template/en/default/account/password/set-forgotten-password.html.tmpl55
-rw-r--r--template/en/default/account/prefs/account.html.tmpl99
-rw-r--r--template/en/default/account/prefs/email.html.tmpl309
-rw-r--r--template/en/default/account/prefs/permissions.html.tmpl93
-rw-r--r--template/en/default/account/prefs/prefs.html.tmpl112
-rw-r--r--template/en/default/account/prefs/saved-searches.html.tmpl209
-rw-r--r--template/en/default/account/prefs/settings.html.tmpl77
-rw-r--r--template/en/default/account/profile-activity.html.tmpl86
-rw-r--r--template/en/default/admin/admin.html.tmpl135
-rw-r--r--template/en/default/admin/classifications/add.html.tmpl56
-rw-r--r--template/en/default/admin/classifications/del.html.tmpl63
-rw-r--r--template/en/default/admin/classifications/edit.html.tmpl85
-rw-r--r--template/en/default/admin/classifications/footer.html.tmpl24
-rw-r--r--template/en/default/admin/classifications/reclassify.html.tmpl90
-rw-r--r--template/en/default/admin/classifications/select.html.tmpl66
-rw-r--r--template/en/default/admin/components/confirm-delete.html.tmpl160
-rw-r--r--template/en/default/admin/components/create.html.tmpl103
-rw-r--r--template/en/default/admin/components/edit.html.tmpl134
-rw-r--r--template/en/default/admin/components/footer.html.tmpl54
-rw-r--r--template/en/default/admin/components/list.html.tmpl128
-rw-r--r--template/en/default/admin/components/select-product.html.tmpl70
-rw-r--r--template/en/default/admin/confirm-action.html.tmpl98
-rw-r--r--template/en/default/admin/custom_fields/cf-js.js.tmpl59
-rw-r--r--template/en/default/admin/custom_fields/confirm-delete.html.tmpl66
-rw-r--r--template/en/default/admin/custom_fields/create.html.tmpl149
-rw-r--r--template/en/default/admin/custom_fields/edit.html.tmpl161
-rw-r--r--template/en/default/admin/custom_fields/list.html.tmpl102
-rw-r--r--template/en/default/admin/fieldvalues/confirm-delete.html.tmpl161
-rw-r--r--template/en/default/admin/fieldvalues/create.html.tmpl97
-rw-r--r--template/en/default/admin/fieldvalues/edit.html.tmpl107
-rw-r--r--template/en/default/admin/fieldvalues/footer.html.tmpl55
-rw-r--r--template/en/default/admin/fieldvalues/list.html.tmpl99
-rw-r--r--template/en/default/admin/fieldvalues/select-field.html.tmpl47
-rw-r--r--template/en/default/admin/flag-type/confirm-delete.html.tmpl63
-rw-r--r--template/en/default/admin/flag-type/edit.html.tmpl253
-rw-r--r--template/en/default/admin/flag-type/list.html.tmpl174
-rw-r--r--template/en/default/admin/groups/confirm-remove.html.tmpl66
-rw-r--r--template/en/default/admin/groups/create.html.tmpl102
-rw-r--r--template/en/default/admin/groups/delete.html.tmpl187
-rw-r--r--template/en/default/admin/groups/edit.html.tmpl249
-rw-r--r--template/en/default/admin/groups/list.html.tmpl168
-rw-r--r--template/en/default/admin/keywords/confirm-delete.html.tmpl53
-rw-r--r--template/en/default/admin/keywords/create.html.tmpl58
-rw-r--r--template/en/default/admin/keywords/edit.html.tmpl73
-rw-r--r--template/en/default/admin/keywords/list.html.tmpl70
-rw-r--r--template/en/default/admin/milestones/confirm-delete.html.tmpl98
-rw-r--r--template/en/default/admin/milestones/create.html.tmpl58
-rw-r--r--template/en/default/admin/milestones/edit.html.tmpl63
-rw-r--r--template/en/default/admin/milestones/footer.html.tmpl67
-rw-r--r--template/en/default/admin/milestones/list.html.tmpl108
-rw-r--r--template/en/default/admin/milestones/select-product.html.tmpl70
-rw-r--r--template/en/default/admin/params/admin.html.tmpl41
-rw-r--r--template/en/default/admin/params/advanced.html.tmpl50
-rw-r--r--template/en/default/admin/params/attachment.html.tmpl76
-rw-r--r--template/en/default/admin/params/auth.html.tmpl129
-rw-r--r--template/en/default/admin/params/authenv.html.tmpl29
-rw-r--r--template/en/default/admin/params/bugchange.html.tmpl51
-rw-r--r--template/en/default/admin/params/bugfields.html.tmpl66
-rw-r--r--template/en/default/admin/params/bugmove.html.tmpl49
-rw-r--r--template/en/default/admin/params/common.html.tmpl150
-rw-r--r--template/en/default/admin/params/core.html.tmpl48
-rw-r--r--template/en/default/admin/params/dependencygraph.html.tmpl49
-rw-r--r--template/en/default/admin/params/editparams.html.tmpl121
-rw-r--r--template/en/default/admin/params/general.html.tmpl86
-rw-r--r--template/en/default/admin/params/groupsecurity.html.tmpl56
-rw-r--r--template/en/default/admin/params/index.html.tmpl51
-rw-r--r--template/en/default/admin/params/ldap.html.tmpl58
-rw-r--r--template/en/default/admin/params/mta.html.tmpl86
-rw-r--r--template/en/default/admin/params/patchviewer.html.tmpl64
-rw-r--r--template/en/default/admin/params/query.html.tmpl58
-rw-r--r--template/en/default/admin/params/radius.html.tmpl54
-rw-r--r--template/en/default/admin/params/shadowdb.html.tmpl49
-rw-r--r--template/en/default/admin/params/usermatch.html.tmpl39
-rw-r--r--template/en/default/admin/products/confirm-delete.html.tmpl266
-rw-r--r--template/en/default/admin/products/create.html.tmpl69
-rw-r--r--template/en/default/admin/products/edit-common.html.tmpl112
-rw-r--r--template/en/default/admin/products/edit.html.tmpl149
-rw-r--r--template/en/default/admin/products/footer.html.tmpl86
-rw-r--r--template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl58
-rw-r--r--template/en/default/admin/products/groupcontrol/edit.html.tmpl325
-rw-r--r--template/en/default/admin/products/groupcontrol/updated.html.tmpl50
-rw-r--r--template/en/default/admin/products/list-classifications.html.tmpl72
-rw-r--r--template/en/default/admin/products/list.html.tmpl121
-rw-r--r--template/en/default/admin/products/updated.html.tmpl185
-rw-r--r--template/en/default/admin/sanitycheck/list.html.tmpl37
-rw-r--r--template/en/default/admin/sanitycheck/messages.html.tmpl352
-rw-r--r--template/en/default/admin/settings/edit.html.tmpl101
-rw-r--r--template/en/default/admin/sudo.html.tmpl105
-rw-r--r--template/en/default/admin/table.html.tmpl194
-rw-r--r--template/en/default/admin/users/confirm-delete.html.tmpl486
-rw-r--r--template/en/default/admin/users/create.html.tmpl58
-rw-r--r--template/en/default/admin/users/edit.html.tmpl168
-rw-r--r--template/en/default/admin/users/list.html.tmpl115
-rw-r--r--template/en/default/admin/users/listselectvars.html.tmpl33
-rw-r--r--template/en/default/admin/users/responsibilities.html.tmpl61
-rw-r--r--template/en/default/admin/users/search.html.tmpl78
-rw-r--r--template/en/default/admin/users/userdata.html.tmpl98
-rw-r--r--template/en/default/admin/versions/confirm-delete.html.tmpl101
-rw-r--r--template/en/default/admin/versions/create.html.tmpl52
-rw-r--r--template/en/default/admin/versions/edit.html.tmpl57
-rw-r--r--template/en/default/admin/versions/footer.html.tmpl65
-rw-r--r--template/en/default/admin/versions/list.html.tmpl89
-rw-r--r--template/en/default/admin/versions/select-product.html.tmpl70
-rw-r--r--template/en/default/admin/workflow/comment.html.tmpl92
-rw-r--r--template/en/default/admin/workflow/edit.html.tmpl110
-rw-r--r--template/en/default/attachment/cancel-create-dupe.html.tmpl48
-rw-r--r--template/en/default/attachment/choose.html.tmpl43
-rw-r--r--template/en/default/attachment/confirm-delete.html.tmpl92
-rw-r--r--template/en/default/attachment/content-types.html.tmpl27
-rw-r--r--template/en/default/attachment/create.html.tmpl135
-rw-r--r--template/en/default/attachment/created.html.tmpl67
-rw-r--r--template/en/default/attachment/createformcontents.html.tmpl106
-rw-r--r--template/en/default/attachment/delete_reason.txt.tmpl32
-rw-r--r--template/en/default/attachment/diff-file.html.tmpl177
-rw-r--r--template/en/default/attachment/diff-footer.html.tmpl35
-rw-r--r--template/en/default/attachment/diff-header.html.tmpl153
-rw-r--r--template/en/default/attachment/edit.html.tmpl289
-rw-r--r--template/en/default/attachment/list.html.tmpl151
-rw-r--r--template/en/default/attachment/midair.html.tmpl78
-rw-r--r--template/en/default/attachment/show-multiple.html.tmpl102
-rw-r--r--template/en/default/attachment/updated.html.tmpl46
-rw-r--r--template/en/default/bug/activity/show.html.tmpl49
-rw-r--r--template/en/default/bug/activity/table.html.tmpl113
-rw-r--r--template/en/default/bug/choose.html.tmpl35
-rw-r--r--template/en/default/bug/comments.html.tmpl235
-rw-r--r--template/en/default/bug/create/comment-guided.txt.tmpl54
-rw-r--r--template/en/default/bug/create/comment.txt.tmpl32
-rw-r--r--template/en/default/bug/create/confirm-create-dupe.html.tmpl57
-rw-r--r--template/en/default/bug/create/create-guided.html.tmpl523
-rw-r--r--template/en/default/bug/create/create.html.tmpl705
-rw-r--r--template/en/default/bug/create/created.html.tmpl61
-rw-r--r--template/en/default/bug/create/make-template.html.tmpl46
-rw-r--r--template/en/default/bug/create/user-message.html.tmpl36
-rw-r--r--template/en/default/bug/dependency-graph.html.tmpl106
-rw-r--r--template/en/default/bug/dependency-tree.html.tmpl266
-rw-r--r--template/en/default/bug/edit.html.tmpl1161
-rw-r--r--template/en/default/bug/field-events.js.tmpl40
-rw-r--r--template/en/default/bug/field.html.tmpl215
-rw-r--r--template/en/default/bug/format_comment.txt.tmpl68
-rw-r--r--template/en/default/bug/knob.html.tmpl100
-rw-r--r--template/en/default/bug/navigate.html.tmpl87
-rw-r--r--template/en/default/bug/process/bugmail.html.tmpl60
-rw-r--r--template/en/default/bug/process/confirm-duplicate.html.tmpl75
-rw-r--r--template/en/default/bug/process/header.html.tmpl46
-rw-r--r--template/en/default/bug/process/midair.html.tmpl109
-rw-r--r--template/en/default/bug/process/results.html.tmpl58
-rw-r--r--template/en/default/bug/process/verify-new-product.html.tmpl205
-rw-r--r--template/en/default/bug/show-header.html.tmpl50
-rw-r--r--template/en/default/bug/show-multiple.html.tmpl366
-rw-r--r--template/en/default/bug/show.html.tmpl53
-rw-r--r--template/en/default/bug/show.xml.tmpl157
-rw-r--r--template/en/default/bug/summarize-time.html.tmpl335
-rw-r--r--template/en/default/bug/time.html.tmpl47
-rw-r--r--template/en/default/bug/votes/delete-all.html.tmpl51
-rw-r--r--template/en/default/bug/votes/list-for-bug.html.tmpl60
-rw-r--r--template/en/default/bug/votes/list-for-user.html.tmpl185
-rw-r--r--template/en/default/config.js.tmpl142
-rw-r--r--template/en/default/config.rdf.tmpl262
-rw-r--r--template/en/default/email/lockout.txt.tmpl39
-rw-r--r--template/en/default/email/newchangedmail.txt.tmpl88
-rw-r--r--template/en/default/email/sanitycheck.txt.tmpl36
-rw-r--r--template/en/default/email/sudo.txt.tmpl43
-rw-r--r--template/en/default/email/votes-removed.txt.tmpl55
-rw-r--r--template/en/default/email/whine.txt.tmpl65
-rw-r--r--template/en/default/extensions/config.pm.tmpl41
-rw-r--r--template/en/default/extensions/extension.pm.tmpl46
-rw-r--r--template/en/default/extensions/hook-readme.txt.tmpl27
-rw-r--r--template/en/default/extensions/license.txt.tmpl47
-rw-r--r--template/en/default/extensions/name-readme.txt.tmpl38
-rw-r--r--template/en/default/extensions/util.pm.tmpl42
-rw-r--r--template/en/default/filterexceptions.pl531
-rw-r--r--template/en/default/flag/list.html.tmpl213
-rw-r--r--template/en/default/global/banner.html.tmpl26
-rw-r--r--template/en/default/global/choose-classification.html.tmpl63
-rw-r--r--template/en/default/global/choose-product.html.tmpl75
-rw-r--r--template/en/default/global/code-error.html.tmpl574
-rw-r--r--template/en/default/global/common-links.html.tmpl116
-rw-r--r--template/en/default/global/confirm-action.html.tmpl63
-rw-r--r--template/en/default/global/confirm-user-match.html.tmpl202
-rw-r--r--template/en/default/global/docslinks.html.tmpl52
-rw-r--r--template/en/default/global/field-descs.none.tmpl176
-rw-r--r--template/en/default/global/footer.html.tmpl49
-rw-r--r--template/en/default/global/header.html.tmpl324
-rw-r--r--template/en/default/global/help.html.tmpl32
-rw-r--r--template/en/default/global/hidden-fields.html.tmpl58
-rw-r--r--template/en/default/global/initialize.none.tmpl32
-rw-r--r--template/en/default/global/js-products.html.tmpl34
-rw-r--r--template/en/default/global/message.html.tmpl42
-rw-r--r--template/en/default/global/message.txt.tmpl25
-rw-r--r--template/en/default/global/messages.html.tmpl858
-rw-r--r--template/en/default/global/per-bug-queries.html.tmpl100
-rw-r--r--template/en/default/global/select-menu.html.tmpl64
-rw-r--r--template/en/default/global/setting-descs.none.tmpl51
-rw-r--r--template/en/default/global/site-navigation.html.tmpl101
-rw-r--r--template/en/default/global/tabs.html.tmpl56
-rw-r--r--template/en/default/global/textarea.html.tmpl50
-rw-r--r--template/en/default/global/useful-links.html.tmpl81
-rw-r--r--template/en/default/global/user-error.html.tmpl1806
-rw-r--r--template/en/default/global/user.html.tmpl39
-rw-r--r--template/en/default/global/userselect.html.tmpl83
-rw-r--r--template/en/default/global/variables.none.tmpl42
-rw-r--r--template/en/default/index.html.tmpl178
-rw-r--r--template/en/default/index.html.tmpl~182
-rw-r--r--template/en/default/list/change-columns.html.tmpl127
-rw-r--r--template/en/default/list/edit-multiple.html.tmpl424
-rw-r--r--template/en/default/list/list-simple.html.tmpl53
-rw-r--r--template/en/default/list/list.atom.tmpl101
-rw-r--r--template/en/default/list/list.csv.tmpl46
-rw-r--r--template/en/default/list/list.html.tmpl291
-rw-r--r--template/en/default/list/list.ics.tmpl103
-rw-r--r--template/en/default/list/list.js.tmpl37
-rw-r--r--template/en/default/list/list.rdf.tmpl56
-rw-r--r--template/en/default/list/quips.html.tmpl168
-rw-r--r--template/en/default/list/server-push.html.tmpl47
-rw-r--r--template/en/default/list/table.html.tmpl260
-rw-r--r--template/en/default/pages/bug-writing.html.tmpl181
-rw-r--r--template/en/default/pages/fields.html.tmpl331
-rw-r--r--template/en/default/pages/linked.html.tmpl55
-rw-r--r--template/en/default/pages/linkify.html.tmpl42
-rw-r--r--template/en/default/pages/quicksearch.html.tmpl274
-rw-r--r--template/en/default/pages/release-notes.html.tmpl3240
-rw-r--r--template/en/default/pages/sudo.html.tmpl68
-rw-r--r--template/en/default/pages/voting.html.tmpl69
-rw-r--r--template/en/default/reports/chart.csv.tmpl44
-rw-r--r--template/en/default/reports/chart.html.tmpl67
-rw-r--r--template/en/default/reports/chart.png.tmpl60
-rw-r--r--template/en/default/reports/components.html.tmpl105
-rw-r--r--template/en/default/reports/create-chart.html.tmpl271
-rw-r--r--template/en/default/reports/delete-series.html.tmpl59
-rw-r--r--template/en/default/reports/duplicates-simple.html.tmpl47
-rw-r--r--template/en/default/reports/duplicates-table.html.tmpl125
-rw-r--r--template/en/default/reports/duplicates.html.tmpl179
-rw-r--r--template/en/default/reports/edit-series.html.tmpl73
-rw-r--r--template/en/default/reports/keywords.html.tmpl87
-rw-r--r--template/en/default/reports/menu.html.tmpl85
-rw-r--r--template/en/default/reports/old-charts.html.tmpl71
-rw-r--r--template/en/default/reports/report-bar.png.tmpl64
-rw-r--r--template/en/default/reports/report-line.png.tmpl67
-rw-r--r--template/en/default/reports/report-pie.png.tmpl39
-rw-r--r--template/en/default/reports/report-simple.html.tmpl35
-rw-r--r--template/en/default/reports/report-table.csv.tmpl77
-rw-r--r--template/en/default/reports/report-table.html.tmpl164
-rw-r--r--template/en/default/reports/report.csv.tmpl25
-rw-r--r--template/en/default/reports/report.html.tmpl180
-rw-r--r--template/en/default/reports/series-common.html.tmpl119
-rw-r--r--template/en/default/reports/series.html.tmpl97
-rw-r--r--template/en/default/request/email.txt.tmpl86
-rw-r--r--template/en/default/request/queue.html.tmpl248
-rw-r--r--template/en/default/search/boolean-charts.html.tmpl136
-rw-r--r--template/en/default/search/form.html.tmpl643
-rw-r--r--template/en/default/search/knob.html.tmpl85
-rw-r--r--template/en/default/search/search-advanced.html.tmpl82
-rw-r--r--template/en/default/search/search-create-series.html.tmpl68
-rw-r--r--template/en/default/search/search-help.html.tmpl107
-rw-r--r--template/en/default/search/search-plugin.xml.tmpl28
-rw-r--r--template/en/default/search/search-report-graph.html.tmpl141
-rw-r--r--template/en/default/search/search-report-select.html.tmpl54
-rw-r--r--template/en/default/search/search-report-table.html.tmpl94
-rw-r--r--template/en/default/search/search-specific.html.tmpl129
-rw-r--r--template/en/default/search/tabs.html.tmpl36
-rw-r--r--template/en/default/search/type-select.html.tmpl29
-rw-r--r--template/en/default/setup/strings.txt.pl160
-rw-r--r--template/en/default/sidebar.xul.tmpl131
-rw-r--r--template/en/default/welcome-admin.html.tmpl86
-rw-r--r--template/en/default/whine/mail.html.tmpl92
-rw-r--r--template/en/default/whine/mail.txt.tmpl65
-rw-r--r--template/en/default/whine/multipart-mime.txt.tmpl53
-rw-r--r--template/en/default/whine/schedule.html.tmpl448
279 files changed, 37521 insertions, 0 deletions
diff --git a/template/en/default/account/auth/login-small.html.tmpl b/template/en/default/account/auth/login-small.html.tmpl
new file mode 100644
index 0000000..34e5ff9
--- /dev/null
+++ b/template/en/default/account/auth/login-small.html.tmpl
@@ -0,0 +1,115 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Jacob Steenhagen <jake@bugzilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[%# Use the current script name. If an empty name is returned,
+ # then we are accessing the home page. %]
+
+[% login_target = cgi.url("-relative" => 1, "-query" => 1) %]
+[% IF !login_target OR login_target.match("^token.cgi") %]
+ [% login_target = "index.cgi" %]
+[% END %]
+
+[% login_target = urlbase _ login_target %]
+
+<li id="mini_login_container[% qs_suffix %]">
+ <span class="separator">| </span>
+ <a id="login_link[% qs_suffix %]" href="?GoAheadAndLogIn=1"
+ onclick="return show_mini_login_form('[% qs_suffix %]')">Log In</a>
+ <form action="[% login_target FILTER html %]" method="POST"
+ class="mini_login bz_default_hidden"
+ id="mini_login[% qs_suffix FILTER html %]"
+ onsubmit="return check_mini_login_fields( '[% qs_suffix FILTER html %]' );"
+ >
+ <input id="Bugzilla_login[% qs_suffix FILTER html %]"
+ class="bz_login"
+ name="Bugzilla_login"
+ onfocus="mini_login_on_focus('[% qs_suffix FILTER js %]')"
+ >
+ <input class="bz_password"
+ id="Bugzilla_password[% qs_suffix FILTER html %]"
+ name="Bugzilla_password"
+ type="password"
+ >
+ <input class="bz_password bz_default_hidden bz_mini_login_help" type="text"
+ id="Bugzilla_password_dummy[% qs_suffix %]" value="password"
+ onfocus="mini_login_on_focus('[% qs_suffix FILTER js %]')"
+ >
+ [% IF Param('rememberlogin') == 'defaulton' ||
+ Param('rememberlogin') == 'defaultoff'
+ %]
+ <input type="checkbox" id="Bugzilla_remember[% qs_suffix %]"
+ name="Bugzilla_remember" value="on" class="bz_remember"
+ [%+ "checked" IF Param('rememberlogin') == "defaulton" %]>
+ <label for="Bugzilla_remember[% qs_suffix %]">Remember</label>
+ [% END %]
+ <input type="submit" name="GoAheadAndLogIn" value="Log in"
+ id="log_in[% qs_suffix %]">
+ <script type="text/javascript">
+ mini_login_constants = {
+ "login" : "login",
+ "warning" : "You must set the login and password before logging in."
+ };
+ [%# We need this event to fire after autocomplete, because it does
+ # something different depending on whether or not there's already
+ # data in the login and password box.
+ # However, autocomplete happens at all sorts of different times in
+ # different browsers (before or after onDOMReady, before or after
+ # window.onload, in almost all combinations you can imagine).
+ # The only good solution I found is to time the event 200
+ # milliseconds after window.onload for WebKit (doing it immediately
+ # at onload works in Chrome but not in Safari, but I can't detect
+ # them separately using YUI), and right after onDOMReady in Gecko.
+ # The WebKit solution is also fairly guaranteed to work on any
+ # browser (it's just strange, since the fields only populate 200 ms
+ # after the page loads), so it's the default. IE doesn't even
+ # recognize our forms as login forms, so I made it use the Gecko
+ # method also (since it's nicer visually). Opera never autocompletes
+ # forms without user interaction, so it also uses the Gecko method.
+ #%]
+ if (YAHOO.env.ua.gecko || YAHOO.env.ua.ie || YAHOO.env.ua.opera) {
+ YAHOO.util.Event.onDOMReady(function() {
+ init_mini_login_form('[% qs_suffix FILTER html %]');
+ });
+ }
+ else {
+ YAHOO.util.Event.on(window, 'load', function () {
+ window.setTimeout(function() {
+ init_mini_login_form('[% qs_suffix FILTER html %]');
+ }, 200);
+ });
+ }
+ </script>
+ <a href="#" onclick="return hide_mini_login_form('[% qs_suffix %]')">[x]</a>
+ </form>
+</li>
+<li id="forgot_container[% qs_suffix %]">
+ <span class="separator">| </span>
+ <a href="http://identity.mageia.org/">Forgot Password</a>
+ <form action="token.cgi" method="post" id="forgot_form[% qs_suffix %]"
+ class="mini_forgot bz_default_hidden">
+ <label>Login: <input type="text" name="loginname" size="20"></label>
+ <input id="forgot_button[% qs_suffix %]" value="Reset Password"
+ type="submit">
+ <input type="hidden" name="a" value="reqpw">
+ <a href="#" onclick="return hide_forgot_form('[% qs_suffix %]')">[x]</a>
+ </form>
+</li>
diff --git a/template/en/default/account/auth/login.html.tmpl b/template/en/default/account/auth/login.html.tmpl
new file mode 100644
index 0000000..9a043e4
--- /dev/null
+++ b/template/en/default/account/auth/login.html.tmpl
@@ -0,0 +1,121 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Toms Baugis <toms@myrealbox.com>
+ #%]
+
+[%# INTERFACE:
+ # target: string. URL to go to after login.
+ #%]
+
+[% IF !target %]
+ [% target = "index.cgi" %]
+[% END %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Log in to $terms.Bugzilla",
+ onload = "document.forms['login'].Bugzilla_login.focus()"
+%]
+
+[% USE Bugzilla %]
+
+<p>
+ I need a legitimate login and password to continue.
+</p>
+
+<form name="login" action="[% target FILTER html %]" method="POST"
+[%- IF Bugzilla.cgi.param("data") %] enctype="multipart/form-data"[% END %]>
+ <table>
+ <tr>
+ <th align="right"><label for="Bugzilla_login">Login:</label></th>
+ <td>
+ <input size="35" id="Bugzilla_login" name="Bugzilla_login">
+ [% Param('emailsuffix') FILTER html %]
+ </td>
+ </tr>
+ <tr>
+ <th align="right"><label for="Bugzilla_password">Password:</label></th>
+ <td>
+ <input type="password" size="35" id="Bugzilla_password" name="Bugzilla_password">
+ </td>
+ </tr>
+
+ [% IF Param('rememberlogin') == 'defaulton' ||
+ Param('rememberlogin') == 'defaultoff' %]
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <input type="checkbox" id="Bugzilla_remember" name="Bugzilla_remember" value="on"
+ [%+ "checked" IF Param('rememberlogin') == "defaulton" %]>
+ <label for="Bugzilla_remember">Remember my Login</label>
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <input type="checkbox" id="Bugzilla_restrictlogin" name="Bugzilla_restrictlogin"
+ checked="checked">
+ <label for="Bugzilla_restrictlogin">Restrict this session to this IP address
+ (using this option improves security)</label>
+ </td>
+ </tr>
+ </table>
+
+ [% PROCESS "global/hidden-fields.html.tmpl"
+ exclude="^Bugzilla_(login|password|restrictlogin)$" %]
+
+ <input type="submit" name="GoAheadAndLogIn" value="Log in" id="log_in">
+
+ <p>
+ (Note: you should make sure cookies are enabled for this site.
+ Otherwise, you will be required to log in frequently.)
+ </p>
+</form>
+
+[%# Allow the user to create a new account, or request a token to change
+ # their password, assuming that our auth method allows that.
+ #%]
+
+ [% IF Param("createemailregexp") && user.authorizer.user_can_create_account %]
+ <hr>
+
+ <p>
+ If you don't have a [% terms.Bugzilla %] account, you can
+ <a href="createaccount.cgi">create a new account</a>.
+ </p>
+ [% END %]
+
+ [% IF user.authorizer.can_change_password %]
+ <hr>
+
+ <a name="forgot"></a>
+ <form method="get" action="token.cgi">
+ <input type="hidden" name="a" value="reqpw">
+ If you have an account, but have forgotten your password,
+ enter your login name below and submit a request
+ to change your password.<br>
+ <input size="35" name="loginname">
+ <input type="submit" id="request" value="Reset Password">
+ </form>
+ [% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/cancel-token.txt.tmpl b/template/en/default/account/cancel-token.txt.tmpl
new file mode 100644
index 0000000..6619ded
--- /dev/null
+++ b/template/en/default/account/cancel-token.txt.tmpl
@@ -0,0 +1,106 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): John Vandenberg <zeroj@null.net>
+ # Tobias Burnus <burnus@net-b.de>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+From: [% Param('mailfrom') %]
+To: [% emailaddress %]
+Subject: [% PROCESS subject %]
+X-Bugzilla-Type: admin
+
+A request was canceled from [% remoteaddress %].
+
+If you did not request this, it could be either an honest
+mistake or someone attempting to break into your [% terms.Bugzilla %] account.
+
+Take a look at the information below and forward this email
+to [% Param('maintainer') %] if you suspect foul play.
+
+ Token: [% token %]
+ Token Type: [% tokentype %]
+ User: [% emailaddress %]
+ Issue Date: [% issuedate FILTER time("%Y-%m-%d %H:%M:%S %Z", timezone) %]
+ Event Data: [% eventdata %]
+Canceled Because: [% PROCESS cancelactionmessage %]
+
+[% BLOCK subject %]
+ [% IF tokentype == 'new_account' %]
+ User account creation request canceled
+ [% ELSIF tokentype == 'password' %]
+ Password change request canceled
+ [% ELSIF tokentype == 'emailnew' OR tokentype == 'emailold' %]
+ Email change request canceled
+ [% ELSE %]
+ [% tokentype %] token canceled
+ [% END %]
+[% END %]
+
+[% BLOCK cancelactionmessage %]
+ [% IF cancelaction == 'account_exists' %]
+ Account [% email %] already exists.
+
+ [% ELSIF cancelaction == 'email_change_canceled' %]
+ The request to change the email address for
+ the [% old_email %] account to [% new_email %] has
+ been canceled.
+
+ [% ELSIF cancelaction == 'email_change_canceled_reinstated' %]
+ The request to change the email address for your account
+ to [% new_email %] has been canceled. Your old account
+ settings have been reinstated.
+
+ [% ELSIF cancelaction == 'emailold_change_canceled' %]
+ The request to change the email address for your account
+ to [% new_email %] has been canceled.
+
+ [% ELSIF cancelaction == 'password_change_canceled' %]
+ You have requested cancellation.
+
+ [% ELSIF cancelaction == 'account_creation_canceled' %]
+ The creation of the user account [% emailaddress %]
+ has been canceled.
+
+ [% ELSIF cancelaction == 'user_logged_in' %]
+ You have logged in.
+
+ [% ELSIF cancelaction == 'wrong_token_for_changing_passwd' %]
+ You have tried to use the token to change the password.
+
+ [% ELSIF cancelaction == 'wrong_token_for_cancelling_email_change' %]
+ You have tried to use the token to cancel the email address change.
+
+ [% ELSIF cancelaction == 'wrong_token_for_confirming_email_change' %]
+ You have tried to use the token to confirm the email address change.
+
+ [% ELSIF cancelaction == 'wrong_token_for_creating_account' %]
+ You have tried to use the token to create a user account.
+
+ [% ELSE %]
+ [%# Give sensible error if the cancel-token function is used incorrectly.
+ #%]
+ You are using [% terms.Bugzilla %]'s cancel-token function incorrectly. You
+ passed in the string '[% cancelaction %]'. The correct use is to pass
+ in a tag, and define that tag in the file cancel-token.txt.tmpl.
+
+ If you are a [% terms.Bugzilla %] end-user seeing this message, please forward this
+ email to [% Param('maintainer') %].
+ [% END %]
+[% END %]
diff --git a/template/en/default/account/create.html.tmpl b/template/en/default/account/create.html.tmpl
new file mode 100644
index 0000000..5b82201
--- /dev/null
+++ b/template/en/default/account/create.html.tmpl
@@ -0,0 +1,79 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE
+ # none
+ #
+ # Param("maintainer") is used to display the maintainer's email.
+ # Param("emailsuffix") is used to pre-fill the email field.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]
+ Create a new [% terms.Bugzilla %] account
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ onload = "document.forms['account_creation_form'].login.focus();" %]
+
+<p>
+ To create a [% terms.Bugzilla %] account, all you need to do is to enter
+[% IF Param('emailsuffix') == '' %]
+ a legitimate email address.
+[% ELSE %]
+ an account name which when combined with [% Param('emailsuffix') %]
+ corresponds to an address where you receive email.
+[% END %]
+ You will receive an email at this address to confirm the creation of your
+ account. <b>You will not be able to log in until you receive the email.</b>
+ If it doesn't arrive within a reasonable amount of time, you may contact
+ the maintainer of this [% terms.Bugzilla %] installation
+ at <a href="mailto:[% Param("maintainer") %]">[% Param("maintainer") %]</a>.
+</p>
+
+[% IF Param('createemailregexp') == '.*' && Param('emailsuffix') == '' %]
+<p>
+ <b>PRIVACY NOTICE:</b> [% terms.Bugzilla %] is an open [% terms.bug %]
+ tracking system. Activity on most [% terms.bugs %], including email
+ addresses, will be visible to the public. We <b>recommend</b> using a
+ secondary account or free web email service (such as Gmail, Yahoo,
+ Hotmail, or similar) to avoid receiving spam at your primary email address.
+</p>
+[% END %]
+
+<form id="account_creation_form" method="get" action="createaccount.cgi">
+ <table>
+ <tr>
+ <td align="right">
+ <b>Email address:</b>
+ </td>
+ <td>
+ <input size="35" id="login" name="login">
+ [% Param('emailsuffix') FILTER html %]
+ </td>
+ </tr>
+ </table>
+ <br>
+ <input type="submit" id="send" value="Send">
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/created.html.tmpl b/template/en/default/account/created.html.tmpl
new file mode 100644
index 0000000..d794198
--- /dev/null
+++ b/template/en/default/account/created.html.tmpl
@@ -0,0 +1,40 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # login: string. The user's Bugzilla login email address.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]
+ Request for new user account '[% login FILTER html %]' submitted
+[% END %]
+
+[% PROCESS global/header.html.tmpl title = title %]
+
+<p>
+ A confirmation email has been sent containing a link to continue
+ creating an account. The link will expire if an account is not
+ created within [% constants.MAX_TOKEN_AGE FILTER html %] days.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/email/change-new.txt.tmpl b/template/en/default/account/email/change-new.txt.tmpl
new file mode 100644
index 0000000..5803b02
--- /dev/null
+++ b/template/en/default/account/email/change-new.txt.tmpl
@@ -0,0 +1,41 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): John Vandenberg <zeroj@null.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+From: [% Param('mailfrom') %]
+To: [% emailaddress %]
+Subject: [% terms.Bugzilla %] Change Email Address Request
+X-Bugzilla-Type: admin
+
+[%+ terms.Bugzilla %] has received a request to change the email address
+for the account [% oldemailaddress %] to your address.
+
+To confirm the change, visit the following link:
+
+[%+ urlbase %]token.cgi?t=[% token FILTER url_quote %]&a=cfmem
+
+If you are not the person who made this request, or you wish to cancel
+this request, visit the following link:
+
+[%+ urlbase %]token.cgi?t=[% token FILTER url_quote %]&a=cxlem
+
+If you do nothing, the request will lapse after [% constants.MAX_TOKEN_AGE %] days
+(on [% expiration_ts FILTER time("%B %e, %Y at %H:%M %Z") %]).
diff --git a/template/en/default/account/email/change-old.txt.tmpl b/template/en/default/account/email/change-old.txt.tmpl
new file mode 100644
index 0000000..6b77744
--- /dev/null
+++ b/template/en/default/account/email/change-old.txt.tmpl
@@ -0,0 +1,46 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): John Vandenberg <zeroj@null.net>
+ #%]
+[%# INTERFACE:
+ # emailaddress: string. The user's old Bugzilla login email address.
+ # newemailaddress: string. The user's new Bugzilla login email address.
+ # token: string. The token associated with this change.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+From: [% Param('mailfrom') %]
+To: [% emailaddress %]
+Subject: [% terms.Bugzilla %] Change Email Address Request
+Importance: High
+X-MSMail-Priority: High
+X-Priority: 1
+X-Bugzilla-Type: admin
+
+[%+ terms.Bugzilla %] has received a request to change the email address
+for your account to [%+ newemailaddress %].
+
+If you are not the person who made this request, or you wish to cancel
+this request, visit the following link:
+
+[%+ urlbase %]token.cgi?t=[% token FILTER url_quote %]&a=cxlem
+
+If you do nothing, and [%+ newemailaddress %] confirms this request,
+the change will be made permanent after [% constants.MAX_TOKEN_AGE %] days
+(on [% expiration_ts FILTER time("%B %e, %Y at %H:%M %Z") %]).
diff --git a/template/en/default/account/email/confirm-new.html.tmpl b/template/en/default/account/email/confirm-new.html.tmpl
new file mode 100644
index 0000000..ed0ff34
--- /dev/null
+++ b/template/en/default/account/email/confirm-new.html.tmpl
@@ -0,0 +1,76 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # token: string. The token to be used in the user account creation.
+ # email: email address of the user account.
+ # expiration_ts: expiration date of the token.
+ #%]
+
+[% title = BLOCK %]Create a new user account for '[% email FILTER html %]'[% END %]
+[% PROCESS "global/header.html.tmpl"
+ title = title
+ onload = "document.forms['confirm_account_form'].realname.focus();" %]
+
+<div>
+ To create your account, you must enter a password in the form below.
+ Your email address and Real Name (if provided) will be shown with
+ changes you make.
+</div>
+
+<form id="confirm_account_form" method="post" action="token.cgi">
+ <input type="hidden" name="t" value="[% token FILTER html %]">
+ <input type="hidden" name="a" value="confirm_new_account">
+ <table>
+ <tr>
+ <th align="right">Email Address:</th>
+ <td>[% email FILTER html %]</td>
+ </tr>
+ <tr>
+ <th align="right"><small><i>(OPTIONAL)</i></small> <label for="realname">Real Name</label>:</th>
+ <td><input type="text" id="realname" name="realname" value=""></td>
+ </tr>
+ <tr>
+ <th align="right"><label for="passwd1">Type your password</label>:</th>
+ <td><input type="password" id="passwd1" name="passwd1" value=""></td>
+ </tr>
+ <tr>
+ <th align="right"><label for="passwd2">Confirm your password</label>:</th>
+ <td><input type="password" id="passwd2" name="passwd2" value=""></td>
+ </tr>
+ <tr>
+ <th align="right">&nbsp;</th>
+ <td><input type="submit" id="confirm" value="Send"></td>
+ </tr>
+ </table>
+</form>
+
+<p>
+ This account will not be created if this form is not completed by
+ <u>[% expiration_ts FILTER time("%B %e, %Y at %H:%M %Z") %]</u>.
+</p>
+
+<p>
+ If you do not wish to create an account with this email click the
+ cancel account button below and your details will be forgotten.
+</p>
+
+<form id="cancel_account_form" method="post" action="token.cgi">
+ <input type="hidden" name="t" value="[% token FILTER html %]">
+ <input type="hidden" name="a" value="cancel_new_account">
+ <input type="submit" id="confirm" value="Cancel Account">
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/email/confirm.html.tmpl b/template/en/default/account/email/confirm.html.tmpl
new file mode 100644
index 0000000..39add32
--- /dev/null
+++ b/template/en/default/account/email/confirm.html.tmpl
@@ -0,0 +1,47 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): John Vandenberg <zeroj@null.net>
+ #%]
+
+[%# INTERFACE:
+ # token: string. The token to be used in this address change.
+ #%]
+
+[% title = "Confirm Change Email" %]
+[% PROCESS global/header.html.tmpl %]
+
+<p>
+ To change your email address, please enter the old email address:
+</p>
+
+<form method="post" action="token.cgi">
+ <input type="hidden" name="t" value="[% token FILTER html %]">
+ <input type="hidden" name="a" value="chgem">
+ <table>
+ <tr>
+ <th align="right">Old Email Address:</th>
+ <td><input type="text" name="email" size="36"></td>
+ </tr>
+ <tr>
+ <th align="right">&nbsp;</th>
+ <td><input type="submit" id="confirm" value="Submit"></td>
+ </tr>
+ </table>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/email/request-new.txt.tmpl b/template/en/default/account/email/request-new.txt.tmpl
new file mode 100644
index 0000000..c56054b
--- /dev/null
+++ b/template/en/default/account/email/request-new.txt.tmpl
@@ -0,0 +1,56 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # token: random string used to authenticate the transaction.
+ # expiration_ts: expiration date of the token.
+ # email: email address of the new account.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+From: [% Param('mailfrom') %]
+To: [% email %]
+Subject: [% terms.Bugzilla %]: confirm account creation
+X-Bugzilla-Type: admin
+
+[%+ terms.Bugzilla %] has received a request to create a user account
+using your email address ([% email %]).
+
+To continue creating an account using this email address, visit the
+following link by [% expiration_ts FILTER time("%B %e, %Y at %H:%M %Z") %]:
+
+[%+ urlbase %]token.cgi?t=[% token FILTER url_quote %]&a=request_new_account
+
+If you did not receive this email before [% expiration_ts FILTER time("%B %e, %Y at %H:%M %Z") %] or
+you wish to create an account using a different email address you can begin
+again by going to:
+
+[%+ urlbase %]createaccount.cgi
+
+[% IF Param('createemailregexp') == '.*' && Param('emailsuffix') == '' %]
+PRIVACY NOTICE: [% terms.Bugzilla %] is an open [% terms.bug %] tracking system. Activity on most
+[%+ terms.bugs %], including email addresses, will be visible to the public. We recommend
+using a secondary account or free web email service (such as Gmail, Yahoo,
+Hotmail, or similar) to avoid receiving spam at your primary email address.
+[% END %]
+
+If you do not wish to create an account, or if this request was made in
+error you can do nothing or visit the following link:
+
+[%+ urlbase %]token.cgi?t=[% token FILTER url_quote %]&a=cancel_new_account
+
+If the above links do not work, or you have any other issues regarding
+your account, please contact administration at [% Param('maintainer') %].
diff --git a/template/en/default/account/password/forgotten-password.txt.tmpl b/template/en/default/account/password/forgotten-password.txt.tmpl
new file mode 100644
index 0000000..574975c
--- /dev/null
+++ b/template/en/default/account/password/forgotten-password.txt.tmpl
@@ -0,0 +1,40 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): John Vandenberg <zeroj@null.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+From: [% Param('mailfrom') %]
+To: [% emailaddress %]
+Subject: [% terms.Bugzilla %] Change Password Request
+X-Bugzilla-Type: admin
+
+You have (or someone impersonating you has) requested to change your
+[%+ terms.Bugzilla %] password. To complete the change, visit the following link:
+
+[%+ urlbase %]token.cgi?t=[% token FILTER url_quote %]&a=cfmpw
+
+If you are not the person who made this request, or you wish to cancel
+this request, visit the following link:
+
+[%+ urlbase %]token.cgi?t=[% token FILTER url_quote %]&a=cxlpw
+
+If you do nothing, the request will lapse after [% constants.MAX_TOKEN_AGE %] days
+(on [% expiration_ts FILTER time("%B %e, %Y at %H:%M %Z", timezone) %]) or when you
+log in successfully.
diff --git a/template/en/default/account/password/set-forgotten-password.html.tmpl b/template/en/default/account/password/set-forgotten-password.html.tmpl
new file mode 100644
index 0000000..ca134a4
--- /dev/null
+++ b/template/en/default/account/password/set-forgotten-password.html.tmpl
@@ -0,0 +1,55 @@
+ [%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% title = "Change Password" %]
+[% PROCESS global/header.html.tmpl %]
+
+<p>
+ To change your password, enter a new password twice:
+</p>
+
+<form method="post" action="token.cgi">
+ <input type="hidden" name="t" value="[% token FILTER html %]">
+ <input type="hidden" name="a" value="chgpw">
+ <table>
+ <tr>
+ <th align="right">New Password:</th>
+ <td>
+ <input type="password" name="password">
+ </td>
+ </tr>
+
+ <tr>
+ <th align="right">New Password Again:</th>
+ <td>
+ <input type="password" name="matchpassword">
+ </td>
+ </tr>
+
+ <tr>
+ <th align="right">&nbsp;</th>
+ <td>
+ <input type="submit" id="update" value="Submit">
+ </td>
+ </tr>
+ </table>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/prefs/account.html.tmpl b/template/en/default/account/prefs/account.html.tmpl
new file mode 100644
index 0000000..0457ff8
--- /dev/null
+++ b/template/en/default/account/prefs/account.html.tmpl
@@ -0,0 +1,99 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # realname: string. The user's real name, if any.
+ # login_change_date: string. The date the email change will be complete. (optional)
+ # new_login_name: string. The user's new Bugzilla login whilst not confirmed. (optional)
+ #%]
+
+<table>
+ <tr>
+ <td colspan="3">
+ Please enter your existing password to confirm account changes.
+ </td>
+ </tr>
+ <tr>
+ <th align="right">Password:</th>
+ <td>
+ <input type="hidden" name="old_login" value="[% user.login FILTER html %]">
+ <input type="password" name="old_password">
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2"><hr></td>
+ </tr>
+ [% IF user.authorizer.can_change_password %]
+ <tr>
+ <th align="right">New password:</th>
+ <td>
+ <input type="password" name="new_password1">
+ </td>
+ </tr>
+
+ <tr>
+ <th align="right">Confirm new password:</th>
+ <td>
+ <input type="password" name="new_password2">
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <th align="right">Your real name (optional, but encouraged):</th>
+ <td>
+ <input size="35" name="realname" value="[% realname FILTER html %]">
+ </td>
+ </tr>
+
+ [% IF user.authorizer.can_change_email && Param('allowemailchange') %]
+ [% IF login_change_date %]
+ [% IF new_login_name %]
+ <tr>
+ <th align="right">Pending email address:</th>
+ <td>[% new_login_name FILTER html %]</td>
+ </tr>
+ <tr>
+ <th align="right">Change request expires:</th>
+ <td>[% login_change_date FILTER time %]</td>
+ </tr>
+ [% ELSE %]
+ <tr>
+ <th align="right">Confirmed email address:</th>
+ <td>[% user.login FILTER html %]</td>
+ </tr>
+ <tr>
+ <th align="right">Completion date:</th>
+ <td>[% login_change_date FILTER time %]</td>
+ </tr>
+ [% END %]
+ [% ELSE %]
+ <tr>
+ <th align="right">New email address:</th>
+ <td>
+ <input size="35" name="new_login_name">
+ </td>
+ </tr>
+ [% END %]
+ [% END %]
+
+ [% Hook.process('field') %]
+
+</table>
diff --git a/template/en/default/account/prefs/email.html.tmpl b/template/en/default/account/prefs/email.html.tmpl
new file mode 100644
index 0000000..a4d22db
--- /dev/null
+++ b/template/en/default/account/prefs/email.html.tmpl
@@ -0,0 +1,309 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Myk Melez <myk@mozilla.org>
+ # Shane H. W. Travis <travis@sedsystems.ca>
+ #%]
+
+[%# INTERFACE:
+ # watchedusers: string.
+ # Comma-separated list of email addresses this user watches.
+ # watchers: array.
+ # Array of users watching this user's account.
+ # excludeself: boolean.
+ # True if user is not receiving self-generated mail.
+ # <rolename>: Multiple hashes, one for each rolename (e.g. assignee; see
+ # below), keyed by reasonname (e.g. comments; again, see
+ # below). The value is a boolean - true if the user is
+ # receiving mail for that reason when in that role.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% useqacontact = Param('useqacontact') %]
+[% usevotes = Param('usevotes') %]
+
+<p>
+ If you don't like getting a notification for "trivial"
+ changes to [% terms.bugs %], you can use the settings below to
+ filter some or all notifications.
+</p>
+
+<script type="text/javascript">
+<!--
+function SetCheckboxes(setting) {
+ for (var count = 0; count < document.userprefsform.elements.length; count++) {
+ var theinput = document.userprefsform.elements[count];
+ if (theinput.type == "checkbox" && !theinput.disabled) {
+ if (theinput.name.match("neg")) {
+ theinput.checked = false;
+ }
+ else {
+ theinput.checked = setting;
+ }
+ }
+ }
+}
+
+document.write('<input type="button" value="Enable All Mail" onclick="SetCheckboxes(true); return false;">\n');
+document.write('<input type="button" value="Disable All Mail" onclick="SetCheckboxes(false); return false;">\n');
+// -->
+</script>
+
+<hr>
+
+<table>
+ <tr>
+ <td colspan="2">
+ <b>Global options:</b>
+ </td>
+ </tr>
+
+ <tr>
+ <td width="150"></td>
+ <td>
+ [% prefname = "email-$constants.REL_ANY-$constants.EVT_FLAG_REQUESTED" %]
+ <input type="checkbox" name="[% prefname %]" id="[% prefname %]"
+ value="1"
+ [% " checked" IF
+ mail.${constants.REL_ANY}.${constants.EVT_FLAG_REQUESTED} %]>
+ <label for="[% prefname %]">Email me when someone asks me to set a flag</label>
+ <br>
+ </td>
+ </tr>
+ <tr>
+ <td width="150"></td>
+ <td>
+ [% prefname = "email-$constants.REL_ANY-$constants.EVT_REQUESTED_FLAG" %]
+ <input type="checkbox" name="[% prefname %]" id="[% prefname %]"
+ value="1"
+ [% " checked" IF
+ mail.${constants.REL_ANY}.${constants.EVT_REQUESTED_FLAG} %]>
+ <label for="[% prefname %]">Email me when someone sets a flag I asked for</label>
+ <br>
+ </td>
+ </tr>
+[% IF user.is_global_watcher %]
+ <tr>
+ <td width="150"></td>
+ <td>
+ You are watching all [% terms.bugs %]. To be removed from this role,
+ contact
+ <a href="mailto:[% Param("maintainer") %]">[% Param("maintainer") %]</a>.
+ </td>
+ </tr>
+[% END %]
+</table>
+
+<hr>
+<b>Field/recipient specific options:</b>
+<br>
+<br>
+
+[% events = [
+ { id = constants.EVT_ADDED_REMOVED,
+ description = "I'm added to or removed from this capacity" },
+ { id = constants.EVT_BUG_CREATED,
+ description = "A new $terms.bug is created" },
+ { id = constants.EVT_OPENED_CLOSED,
+ description = "The $terms.bug is resolved or reopened" },
+ { id = constants.EVT_PROJ_MANAGEMENT,
+ description = "The priority, status, severity, or milestone changes" },
+ { id = constants.EVT_COMMENT,
+ description = "New comments are added" },
+ { id = constants.EVT_ATTACHMENT,
+ description = "New attachments are added" },
+ { id = constants.EVT_ATTACHMENT_DATA,
+ description = "Some attachment data changes" },
+ { id = constants.EVT_KEYWORD,
+ description = "The keywords field changes" },
+ { id = constants.EVT_CC,
+ description = "The CC field changes" },
+ { id = constants.EVT_DEPEND_BLOCK,
+ description = "The dependency tree changes" },
+ { id = constants.EVT_OTHER,
+ description = "Any field not mentioned above changes" },
+] %]
+
+[% neg_events = [
+ { id = constants.EVT_UNCONFIRMED,
+ description = "The $terms.bug is in the UNCONFIRMED state" },
+ { id = constants.EVT_CHANGED_BY_ME,
+ description = "The change was made by me" },
+] %]
+
+[% relationships = [
+ { id = constants.REL_ASSIGNEE,
+ description = "Assignee" },
+ { id = constants.REL_QA,
+ description = "QA Contact" },
+ { id = constants.REL_REPORTER,
+ description = "Reporter" },
+ { id = constants.REL_CC,
+ description = "CCed" },
+ { id = constants.REL_VOTER,
+ description = "Voter" },
+] %]
+
+<table class="bz_emailprefs" border="1">
+ <tr>
+ <td colspan="[% (useqacontact AND usevotes) ? '5' :
+ ((useqacontact OR usevotes) ? '4' : '3') %]"
+ align="center" width="50%">
+ <b>When my relationship to this [% terms.bug %] is:</b>
+ </td>
+ <td rowspan="2" width="40%">
+ <b>I want to receive mail when:</b>
+ </td>
+ </tr>
+
+ <tr>
+ [% FOREACH relationship = relationships %]
+ [% NEXT IF (relationship.id == constants.REL_QA AND NOT useqacontact) OR
+ (relationship.id == constants.REL_VOTER AND NOT usevotes) %]
+ <th align="center" width="9%">
+ [% relationship.description FILTER html %]
+ </th>
+ [% END %]
+ </tr>
+
+ [% FOREACH event = events %]
+ [% count = loop.count() %]
+ <tr class="bz_row_[% count % 2 == 1 ? "odd" : "even" %]">
+ [% FOREACH relationship = relationships %]
+ [% NEXT IF (relationship.id == constants.REL_QA AND NOT useqacontact) OR
+ (relationship.id == constants.REL_VOTER AND NOT usevotes) %]
+ <td align="center">
+ <input type="checkbox"
+ name="email-[% relationship.id %]-[% event.id %]"
+ value="1"
+ [%# The combinations don't always make sense; disable a couple %]
+ [% IF event.id == constants.EVT_ADDED_REMOVED AND
+ (relationship.id == constants.REL_REPORTER OR
+ relationship.id == constants.REL_VOTER) %]
+ disabled
+ [% ELSIF mail.${relationship.id}.${event.id} %]
+ checked
+ [% END %]>
+ </td>
+ [% END %]
+ <td>
+ [% event.description FILTER html %]
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <td colspan="[% (useqacontact AND usevotes) ? '5' :
+ ((useqacontact OR usevotes) ? '4' : '3') %]"
+ align="center" width="50%">
+ &nbsp;
+ </td>
+ <td width="40%">
+ <b>but not when (overrides above):</b>
+ </td>
+ </tr>
+
+ [% FOREACH event = neg_events %]
+ [% count = loop.count() %]
+ <tr class="bz_row_[% count % 2 == 1 ? "odd" : "even" %]">
+ [% FOREACH relationship = relationships %]
+ [% NEXT IF (relationship.id == constants.REL_QA AND NOT useqacontact) OR
+ (relationship.id == constants.REL_VOTER AND NOT usevotes) %]
+ <td align="center">
+ <input type="checkbox"
+ name="neg-email-[% relationship.id %]-[% event.id %]"
+ value="1"
+ [% " checked" IF NOT mail.${relationship.id}.${event.id} %]>
+ </td>
+ [% END %]
+ <td>
+ [% event.description FILTER html %]
+ </td>
+ </tr>
+ [% END %]
+
+</table>
+
+[%# Add hidden form fields for fields not used %]
+[% FOREACH event = events %]
+ [% FOREACH relationship = relationships %]
+ [% IF (relationship.id == constants.REL_QA AND NOT useqacontact) OR
+ (relationship.id == constants.REL_VOTER AND NOT usevotes) %]
+ <input type="hidden"
+ name="email-[% relationship.id %]-[% event.id %]"
+ value="[% mail.${relationship.id}.${event.id} ? "1" : "0" %]">
+ [% END %]
+ [% END %]
+[% END %]
+
+[% FOREACH event = neg_events %]
+ [% FOREACH relationship = relationships %]
+ [% IF (relationship.id == constants.REL_QA AND NOT useqacontact) OR
+ (relationship.id == constants.REL_VOTER AND NOT usevotes) %]
+ <input type="hidden"
+ name="neg-email-[% relationship.id %]-[% event.id %]"
+ value="[% mail.${relationship.id}.${event.id} ? "0" : "1" %]">
+ [% END %]
+ [% END %]
+[% END %]
+
+<hr>
+<b>User Watching</b>
+
+<p>
+If you watch a user, it is as if you are standing in their shoes for the
+purposes of getting email. Email is sent or not according to <u>your</u>
+preferences for <u>their</u> relationship to the [% terms.bug %]
+(e.g. Assignee).
+</p>
+
+<p>
+[% IF watchedusers.size %]
+You are watching everyone in the following list:
+ </p>
+ <p>
+ <select id="watched_by_you" name="watched_by_you" multiple="multiple" size="5">
+ [% FOREACH w = watchedusers %]
+ <option value="[% w FILTER html %]">[% w FILTER html %]</option>
+ [% END %]
+ </select> <br />
+ <input type="checkbox" id="remove_watched_users" name="remove_watched_users">
+ <label for="remove_watched_users">Remove selected users from my watch list</label>
+[% ELSE %]
+You are currently not watching any users.
+[% END %]
+</p>
+
+<p><a name="new_watched_by_you" id="new_watched_by_you">Add users to my watch list (comma separated list)</a>:
+ <input size="60" name="new_watchedusers" value="">
+</p>
+
+<p><a name="watching_you" id="watching_you">Users watching you</a>:<br>
+ [% IF watchers.size %]
+ [% FOREACH watcher = watchers %]
+ [% watcher FILTER html %] <br>
+ [% END %]
+ [% ELSE %]
+ <i>No one</i>
+ [% END %]
+</p>
+
+<hr>
+
+<br>
diff --git a/template/en/default/account/prefs/permissions.html.tmpl b/template/en/default/account/prefs/permissions.html.tmpl
new file mode 100644
index 0000000..5e8dc9c
--- /dev/null
+++ b/template/en/default/account/prefs/permissions.html.tmpl
@@ -0,0 +1,93 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # has_bits: array of hashes. May be empty.
+ # name => Names of the permissions the user has.
+ # desc => Descriptions of the permissions the user has.
+ # set_bits: array of hashes. May be empty.
+ # name => Names of the permissions the user can set for
+ # other people.
+ # desc => Descriptions of the permissions the user can set for
+ # other people.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+<table align="center">
+ <tr>
+ <td>
+ [% IF has_bits.size %]
+ You have the following permission bits set on your account:
+ <table align="center">
+ [% FOREACH bit_description = has_bits %]
+ <tr>
+ <td>[% bit_description.name FILTER html %]</td>
+ <td>[% bit_description.desc FILTER html_light %]</td>
+ </tr>
+ [% END %]
+ </table>
+
+ [% FOREACH privs = ["editcomponents", "canconfirm", "editbugs"] %]
+ [% SET products = ${"local_$privs"} %]
+ [% IF products && products.size %]
+ <br>
+ <p>
+ You also have local '[% privs FILTER html %]' privileges
+ for the following products:
+ </p>
+ <p>
+ [% FOREACH product = products %]
+ [% product.name FILTER html %]<br>
+ [% END %]
+ </p>
+ [% END %]
+ [% END %]
+
+ [% ELSE %]
+ There are no permission bits set on your account.
+ [% END %]
+
+ [% IF user.in_group('editusers') %]
+ <br>
+ You have editusers privileges. You can turn on and off
+ all permissions for all users.
+ [% ELSIF set_bits.size %]
+ <br>
+ And you can turn on or off the following bits for
+ <a href="editusers.cgi">other users</a>:
+ <table align="center">
+ [% FOREACH bit_description = set_bits %]
+ <tr>
+ <td>[% bit_description.name FILTER html %]</td>
+ <td>[% bit_description.desc FILTER html_light %]</td>
+ </tr>
+ [% END %]
+ </table>
+ [% END %]
+
+ [% IF user.in_group('bz_sudoers') %]
+ <br>
+ You are a member of the <b>bz_sudoers</b> group, so you can
+ <a href="relogin.cgi?action=prepare-sudo">impersonate someone else</a>.
+ [% END %]
+ </td>
+ </tr>
+</table>
diff --git a/template/en/default/account/prefs/prefs.html.tmpl b/template/en/default/account/prefs/prefs.html.tmpl
new file mode 100644
index 0000000..71e411d
--- /dev/null
+++ b/template/en/default/account/prefs/prefs.html.tmpl
@@ -0,0 +1,112 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # tabs: List of hashes. May not be empty. Each hash has three members:
+ # name: string. Name of the tab (used internally.)
+ # description: string. Description of the tab (used in tab title).
+ # saveable: boolean. True if tab has a form which can be submitted.
+ # True if user is not receiving self-generated mail.
+ # Note: For each tab name, a template "prefs/${tab.name}.tmpl" must exist,
+ # and its interface must be fulfilled.
+ # current_tab: A direct reference to one of the hashes in the tabs list.
+ # This tab will be displayed.
+ # changes_saved: boolean/string. True if the CGI processed form data before
+ # displaying anything, and can contain an optional custom
+ # message if required (which Perl still evaluates as True).
+ # dont_show_button: boolean. Prevent the display of the "Submit Changes" button.
+ #%]
+
+[% filtered_login = user.login FILTER html %]
+[% PROCESS global/header.html.tmpl
+ title = "User Preferences"
+ subheader = filtered_login
+ style_urls = ['skins/standard/admin.css']
+ javascript_urls = ['js/util.js']
+ doc_section = "userpreferences.html"
+ %]
+
+[% tabs = [{ name => "settings", label => "General Preferences",
+ link => "userprefs.cgi?tab=settings", saveable => "1" },
+ { name => "email", label => "Email Preferences",
+ link => "userprefs.cgi?tab=email", saveable => "1" },
+ { name => "saved-searches", label => "Saved Searches",
+ link => "userprefs.cgi?tab=saved-searches", saveable => "1" },
+ { name => "account", label => "Name and Password",
+ link => "userprefs.cgi?tab=account", saveable => "1" },
+ { name => "permissions", label => "Permissions",
+ link => "userprefs.cgi?tab=permissions", saveable => "0" } ] %]
+
+[% FOREACH tab IN tabs %]
+ [% IF tab.name == current_tab_name %]
+ [% current_tab = tab %]
+ [% LAST %]
+ [% END %]
+[% END %]
+
+[% WRAPPER global/tabs.html.tmpl
+ tabs = tabs
+ current_tab = current_tab
+%]
+
+[% IF changes_saved %]
+ <div id="message">
+ The changes to your [% current_tab.label FILTER lower %] have been saved.
+
+ [% IF email_changes_saved %]
+ <p>
+ An email has been sent to both old and new email
+ addresses to confirm the change of email address.
+ </p>
+ [% END %]
+ </div>
+[% END %]
+
+<h3>[% current_tab.label %]</h3>
+
+[% IF current_tab.saveable %]
+ <form name="userprefsform" method="post" action="userprefs.cgi">
+ <input type="hidden" name="tab" value="[% current_tab.name %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+[% END %]
+
+[% PROCESS "account/prefs/${current_tab.name}.html.tmpl"
+ IF current_tab.name.defined %]
+
+[% IF current_tab.saveable %]
+ <input type="hidden" name="dosave" value="1">
+
+ [% UNLESS dont_show_button %]
+ <table>
+ <tr>
+ <td width="150">&nbsp;</td>
+ <td>
+ <input type="submit" id="update" value="Submit Changes">
+ </td>
+ </tr>
+ </table>
+ [% END %]
+ </form>
+[% END %]
+
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/prefs/saved-searches.html.tmpl b/template/en/default/account/prefs/saved-searches.html.tmpl
new file mode 100644
index 0000000..f128613
--- /dev/null
+++ b/template/en/default/account/prefs/saved-searches.html.tmpl
@@ -0,0 +1,209 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # queryshare_groups: list of groups the user may share queries with
+ # (id, name).
+ # bless_group_ids: list of group ids the user may bless.
+ #%]
+
+[% IF user.can_bless %]
+ <script type="text/javascript"><!--
+ function update_checkbox(group) {
+ var bless_groups = [[% bless_group_ids.join(",") FILTER js %]];
+ var checkbox = document.getElementById(group.name.replace(/share_(\d+)/, "force_$1"));
+
+ if (bz_isValueInArray(bless_groups, group.value)) {
+ checkbox.disabled = false;
+ } else {
+ checkbox.disabled = true;
+ checkbox.checked = false;
+ }
+ } //-->
+ </script>
+[% END %]
+
+<p>Your saved searches are as follows:</p>
+
+<blockquote>
+ <table border="1" cellpadding="3">
+ <tr>
+ <th>
+ Search
+ </th>
+ <th>
+ Run
+ </th>
+ <th>
+ Edit
+ </th>
+ <th>
+ Forget
+ </th>
+ <th>
+ Show in
+ Footer
+ </th>
+ [% may_share = user.in_group(Param('querysharegroup')) && queryshare_groups.size %]
+ [% IF may_share %]
+ <th>
+ Share With a Group
+ </th>
+ [% END %]
+ </tr>
+ <tr>
+ <td>My [% terms.Bugs %]</td>
+ <td>
+ [% filtered_username = user.login FILTER url_quote %]
+ <a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">Run</a>
+ </td>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+ &nbsp;
+ </td>
+ <td align="center">
+ <input type="checkbox"
+ name="showmybugslink"
+ value="1"
+ [% " checked" IF user.showmybugslink %]>
+ </td>
+ [% IF may_share %]
+ <td>
+ &mdash;
+ </td>
+ [% END %]
+ </tr>
+ [% FOREACH q = user.queries %]
+ <tr>
+ <td>[% q.name FILTER html %]</td>
+ <td>
+ <a href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=[% q.name FILTER url_quote %]
+ [% IF q.shared_with_group.id %]&amp;sharer_id=[% user.id FILTER url_quote %][% END %]">Run</a>
+ </td>
+ <td>
+ <a href="query.cgi?[% q.edit_link FILTER html %]&amp;known_name=
+ [% q.name FILTER url_quote %]">Edit</a>
+ </td>
+ <td>
+ [% IF q.used_in_whine %]
+ Remove from <a href="editwhines.cgi">whining</a> first
+ [% ELSE %]
+ <a href="buglist.cgi?cmdtype=dorem&amp;remaction=forget&amp;namedcmd=
+ [% q.name FILTER url_quote %]&amp;token=
+ [% issue_hash_token([q.id, q.name]) FILTER url_quote %]">Forget</a>
+ [% END %]
+ </td>
+ <td align="center">
+ <input type="checkbox"
+ name="link_in_footer_[% q.id FILTER html %]"
+ value="1"
+ alt="[% q.name FILTER html %]"
+ [% " checked" IF q.link_in_footer %]>
+ </td>
+ [% IF may_share %]
+ <td>
+ <select name="share_[% q.id FILTER html %]"
+ [% IF user.can_bless %] onchange="update_checkbox(this);"[% END %]>
+ <option value="">Don't share</option>
+ [% FOREACH group = queryshare_groups %]
+ <option value="[% group.id %]"
+ [% ' selected="selected"'
+ IF q.shared_with_group.id == group.id %]
+ >[% group.name FILTER html %]</option>
+ [% END %]
+ </select>
+ [% IF user.can_bless %]
+ <input type="checkbox" id="force_[% q.id FILTER html %]"
+ name="force_[% q.id FILTER html %]" value="1"
+ [% " disabled"
+ IF !bless_group_ids.grep("^$q.shared_with_group.id\$").0
+ %]>
+ <label for="force_[% q.id FILTER html %]">Add to footer</label>
+ [% END %]
+ [% IF q.shared_with_users %]
+ (shared with [% q.shared_with_users FILTER html %]
+ [%+ q.shared_with_users > 1 ? "users" : "user" %])
+ [% END %]
+ </td>
+ [% END %]
+ </tr>
+ [% END %]
+ </table>
+[% IF user.can_bless %]
+ <p>Note that for every search that has the "Add to footer" selected, a
+ link to the shared search is added to the footer of every user that is
+ a direct member of the group at the time you click Submit Changes.</p>
+[% END %]
+</blockquote>
+
+[% IF user.queries_available.size %]
+ <p>You may use these searches saved and shared by others:</p>
+
+ <table border="1" cellpadding="3">
+ <tr>
+ <th>
+ Search
+ </th>
+ <th>
+ Shared By
+ </th>
+ <th>
+ Shared To
+ </th>
+ <th>
+ Run
+ </th>
+ <th>
+ Edit
+ </th>
+ <th>
+ Show in
+ Footer
+ </th>
+ </tr>
+ [% FOREACH q = user.queries_available %]
+ <tr>
+ <td>[% q.name FILTER html %]</td>
+ <td>[% q.user.identity FILTER html %]</td>
+ <td>[% q.shared_with_group.name FILTER html %]</td>
+ <td>
+ <a href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=
+ [% q.name FILTER url_quote %]&amp;sharer_id=
+ [% q.user.id FILTER url_quote %]">Run</a>
+ </td>
+ <td>
+ <a href="query.cgi?[% q.edit_link FILTER html %]&amp;known_name=
+ [% q.name FILTER url_quote %]">Edit</a>
+ </td>
+ <td align="center">
+ <input type="checkbox"
+ name="link_in_footer_[% q.id FILTER html %]"
+ value="1"
+ alt="[% q.name FILTER html %]"
+ [% " checked" IF q.link_in_footer %]>
+ </td>
+ </tr>
+ [% END %]
+ </table>
+[% ELSE %]
+ <p>No searches are shared with you by other users.</p>
+[% END %]
diff --git a/template/en/default/account/prefs/settings.html.tmpl b/template/en/default/account/prefs/settings.html.tmpl
new file mode 100644
index 0000000..f8b6ba4
--- /dev/null
+++ b/template/en/default/account/prefs/settings.html.tmpl
@@ -0,0 +1,77 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Shane H. W. Travis <travis@sedsystems.ca>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #
+ #%]
+
+[%# INTERFACE:
+ # setting_names: an array of strings
+ # settings: a hash of hashes, keyed by setting_name.
+ # Each hash contains:
+ # is_enabled - boolean
+ # default_value - string (global default for this setting)
+ # value - string (user-defined preference)
+ # is_default - boolean (true if user has no preference)
+ # has_settings_enabled : boolean; is true if there is at least one user pref
+ # enabled by the maintainer.
+ #%]
+
+[% PROCESS "global/setting-descs.none.tmpl" %]
+
+[% IF settings.size %]
+ [% UNLESS has_settings_enabled %]
+ <p class="criticalmessages">
+ All user preferences have been disabled by the
+ <a href="mailto:[% Param("maintainer") %]">maintainer</a>
+ of this installation, and so you cannot customize any.
+ </p>
+ [% END %]
+
+ <table border="0" cellpadding="8">
+ [% FOREACH name = setting_names %]
+ [% default_name = name _ '-isdefault' %]
+ [% default_val = settings.${name}.default_value %]
+ <tr>
+ <td align="right">
+ [% setting_descs.$name OR name FILTER html %]
+ </td>
+ <td>
+ [% IF settings.${name}.is_enabled %]
+ <select name="[% name FILTER html %]" id="[% name FILTER html %]">
+ <option value="[% default_name FILTER html %]"
+ [% ' selected="selected"' IF settings.${name}.is_default %]>
+ Site Default ([% setting_descs.${default_val} OR default_val FILTER html %])
+ </option>
+ [% FOREACH x = settings.${name}.legal_values %]
+ <option value="[% x FILTER html %]"
+ [% ' selected="selected"'
+ IF x == settings.${name}.value
+ AND NOT settings.${name}.is_default %]>
+ [% setting_descs.${x} OR x FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ [% ELSE %]
+ <select name="[% name FILTER html %]" id="[% name FILTER html %]" disabled="disabled">
+ <option value="[% default_name FILTER html %]">
+ Site Default ([% setting_descs.${default_val} OR default_val FILTER html %])
+ </option>
+ </select>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+ </table>
+[% END %]
+<br>
diff --git a/template/en/default/account/profile-activity.html.tmpl b/template/en/default/account/profile-activity.html.tmpl
new file mode 100644
index 0000000..c6fd45c
--- /dev/null
+++ b/template/en/default/account/profile-activity.html.tmpl
@@ -0,0 +1,86 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Vlad Dascalu <jocuri@softhome.net>
+ # Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # otheruser: Bugzilla User Object; The user whose profile activity
+ # we are viewing.
+ #
+ # listselectionvalues: selection values to recreate the current user list.
+ #
+ # profile_changes: An array of hashes containing the following fields:
+ #
+ # who: string; login name of who made the change
+ # activity_when: string; when the change was made
+ # what: string; the description of the field which was changed
+ # removed: string; the removed value (maybe empty string)
+ # added: string; the added value (maybe empty string)
+ #%]
+
+[% title = BLOCK %]
+ Account History for '[% otheruser.login FILTER html %]'
+[% END %]
+
+
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+[% PROCESS admin/users/listselectvars.html.tmpl
+ listselectionvalues = listselectionvalues
+%]
+
+[% columns =
+ [{name => 'who'
+ heading => 'Who'
+ }
+ {name => 'activity_when'
+ heading => 'When'
+ }
+ {name => 'what'
+ heading => 'What'
+ content_use_field => 1
+ }
+ {name => 'removed'
+ heading => 'Removed'
+ }
+ {name => 'added'
+ heading => 'Added'
+ }
+ ]
+%]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = profile_changes
+%]
+
+<p><a href="editusers.cgi?action=edit&amp;userid=
+ [%- otheruser.id FILTER url_quote %]"
+ title="Edit user '[% otheruser.login FILTER html %]'">Edit this user</a> or
+ <a title="Search For Users" href="editusers.cgi">search for other accounts</a>
+ [% IF listselectionvalues.matchtype != 'exact' %]
+ or go <a title="Return to the user list"
+ href="editusers.cgi?action=list[% INCLUDE listselectionurlparams %]">back
+ to the user list</a>
+ [% END %]
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/admin.html.tmpl b/template/en/default/admin/admin.html.tmpl
new file mode 100644
index 0000000..145360b
--- /dev/null
+++ b/template/en/default/admin/admin.html.tmpl
@@ -0,0 +1,135 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]
+ Administer your installation ([% terms.Bugzilla %]
+ [%+ constants.BUGZILLA_VERSION FILTER html %])
+[% END %]
+
+[% PROCESS global/header.html.tmpl title = title
+ style_urls = ['skins/standard/admin.css']
+ doc_section = "administration.html"
+%]
+
+<div>
+ This page is only accessible to empowered users. You can access administrative pages
+ from here (based on your privileges), letting you configure different aspects of
+ this installation. Note: some sections may not be accessible to you and are marked
+ using a lighter color.
+</div>
+
+<table>
+ <tr>
+ <td class="admin_links">
+ <dl>
+ [% class = user.in_group('tweakparams') ? "" : "forbidden" %]
+ <dt id="parameters" class="[% class %]"><a href="editparams.cgi">Parameters</a></dt>
+ <dd class="[% class %]">Set core parameters of the installation. That's the
+ place where you specify the URL to access this installation, determine how
+ users authenticate, choose which [% terms.bug %] fields to display, select
+ the mail transfer agent to send email notifications, choose which group of
+ users can use charts and share queries, and much more.</dd>
+
+ <dt id="preferences" class="[% class %]"><a href="editsettings.cgi">Default Preferences</a></dt>
+ <dd class="[% class %]">Set the default user preferences. These are the values
+ which will be used by default for all users. Users will be able to edit their
+ own preferences from the <a href="userprefs.cgi?tab=settings">Preferences</a>.</dd>
+
+ [% class = user.in_group('editcomponents') ? "" : "forbidden" %]
+ <dt id="sanitycheck" class="[% class %]"><a href="sanitycheck.cgi">Sanity Check</a></dt>
+ <dd class="[% class %]">Run sanity checks to locate problems in your database.
+ This may take several tens of minutes depending on the size of your installation.
+ You can also automate this check by running <tt>sanitycheck.pl</tt> from a cron job.
+ A notification will be sent per email to the specified user if errors are detected.</dd>
+
+ [% class = (user.in_group('editusers') || user.can_bless) ? "" : "forbidden" %]
+ <dt id="users" class="[% class %]"><a href="editusers.cgi">Users</a></dt>
+ <dd class="[% class %]">Create new user accounts or edit existing ones. You can
+ also add and remove users from groups (also known as "user privileges").</dd>
+
+ [% class = (Param('useclassification') && user.in_group('editclassifications')) ? "" : "forbidden" %]
+ <dt id="classifications" class="[% class %]"><a href="editclassifications.cgi">Classifications</a></dt>
+ <dd class="[% class %]">If your installation has to manage many products at once,
+ it's a good idea to group these products into distinct categories. This lets users
+ find information more easily when doing searches or when filing new [% terms.bugs %].</dd>
+
+ [% class = (user.in_group('editcomponents')
+ || user.get_products_by_permission("editcomponents").size) ? "" : "forbidden" %]
+ <dt id="products" class="[% class %]"><a href="editproducts.cgi">Products</a></dt>
+ <dd class="[% class %]">Edit all aspects of products, including group restrictions
+ which let you define who can access [% terms.bugs %] being in these products. You
+ can also edit some specific attributes of products such as
+ <a href="editcomponents.cgi">components</a>, <a href="editversions.cgi">versions</a>
+ and <a href="editmilestones.cgi">milestones</a> directly.</dd>
+
+ [% class = user.in_group('editcomponents') ? "" : "forbidden" %]
+ <dt id="flags" class="[% class %]"><a href="editflagtypes.cgi">Flags</a></dt>
+ <dd class="[% class %]">A flag is a custom 4-states attribute of [% terms.bugs %]
+ and/or attachments. These states are: granted, denied, requested and undefined.
+ You can set as many flags as desired per [% terms.bug %], and define which users
+ are allowed to edit them.</dd>
+
+ [% Hook.process('end_links_left') %]
+ </dl>
+ </td>
+
+ <td class="admin_links">
+ <dl>
+ [% class = user.in_group('admin') ? "" : "forbidden" %]
+ <dt id="custom_fields" class="[% class %]"><a href="editfields.cgi">Custom Fields</a></dt>
+ <dd class="[% class %]">[% terms.Bugzilla %] lets you define fields which are
+ not implemented by default, based on your local and specific requirements.
+ These fields can then be used as any other field, meaning that you can set
+ them in [% terms.bugs %] and run any search involving them.<br>
+ Before creating new fields, keep in mind that too many fields may make the user
+ interface more complex and harder to use. Be sure you have investigated other ways
+ to satisfy your needs before doing this.</dd>
+
+ <dt id="field_values" class="[% class %]"><a href="editvalues.cgi">Field Values</a></dt>
+ <dd class="[% class %]">Define legal values for fields whose values must belong
+ to some given list. This is also the place where you define legal values for some
+ types of custom fields.</dd>
+
+ <dt id="status_workflow" class="[% class %]"><a href="editworkflow.cgi">[%terms.Bug %] Status Workflow</a></dt>
+ <dd class="[% class %]">Customize your workflow and choose initial [% terms.bug %]
+ statuses available on [% terms.bug %] creation and allowed [% terms.bug %] status
+ transitions when editing existing [% terms.bugs %].</dd>
+
+ [% class = user.in_group('creategroups') ? "" : "forbidden" %]
+ <dt id="groups" class="[% class %]"><a href="editgroups.cgi">Groups</a></dt>
+ <dd class="[% class %]">Define groups which will be used in the installation.
+ They can either be used to define new user privileges or to restrict the access
+ to some [% terms.bugs %].</dd>
+
+ [% class = user.in_group('editkeywords') ? "" : "forbidden" %]
+ <dt id="keywords" class="[% class %]"><a href="editkeywords.cgi">Keywords</a></dt>
+ <dd class="[% class %]">Set keywords to be used with [% terms.bugs %]. Keywords
+ are an easy way to "tag" [% terms.bugs %] to let you find them more easily later.</dd>
+
+ [% class = user.in_group('bz_canusewhines') ? "" : "forbidden" %]
+ <dt id="whining" class="[% class %]"><a href="editwhines.cgi">Whining</a></dt>
+ <dd class="[% class %]">Set queries which will be run at some specified date
+ and time, and get the result of these queries directly per email. This is a
+ good way to create reminders and to keep track of the activity in your installation.</dd>
+
+ [% Hook.process('end_links_right') %]
+ </dl>
+ </td>
+ </tr>
+</table>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/classifications/add.html.tmpl b/template/en/default/admin/classifications/add.html.tmpl
new file mode 100644
index 0000000..cd949f2
--- /dev/null
+++ b/template/en/default/admin/classifications/add.html.tmpl
@@ -0,0 +1,56 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Albert Ting <alt@sonic.net>
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Add new classification"
+%]
+
+<form method=post action="editclassifications.cgi">
+ <table border=0 cellpadding=4 cellspacing=0>
+ <tr>
+ <th align="right">Classification:</th>
+ <td><input size=64 maxlength=64 name="classification"></td>
+ </tr>
+ <tr>
+ <th align="right">Description:</th>
+ <td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'description'
+ minrows = 4
+ cols = 64
+ wrap = 'virtual'
+ %]
+ </td>
+ </tr>
+ <tr>
+ <th align="right"><label for="sortkey">Sortkey:</label></th>
+ <td><input id="sortkey" size="20" maxlength="20" name="sortkey"
+ value=""></td>
+ </tr>
+ </table>
+ <hr>
+ <input type=submit value="Add">
+ <input type=hidden name="action" value="new">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</FORM>
+
+[% PROCESS admin/classifications/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/classifications/del.html.tmpl b/template/en/default/admin/classifications/del.html.tmpl
new file mode 100644
index 0000000..5a3800f
--- /dev/null
+++ b/template/en/default/admin/classifications/del.html.tmpl
@@ -0,0 +1,63 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Albert Ting <alt@sonic.net>
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Delete classification"
+%]
+
+<table border=1 cellpadding=4 cellspacing=0>
+<tr bgcolor="#6666ff">
+ <th valign="top" align="left">Part</th>
+ <th valign="top" align="left">Value</th>
+
+</tr><tr>
+ <td valign="top">Classification:</td>
+ <td valign="top">[% classification.name FILTER html %]</td>
+
+</tr><tr>
+ <td valign="top">Description:</td>
+ <td valign="top">
+ [% IF classification.description %]
+ [% classification.description FILTER html_light %]
+ [% ELSE %]
+ <font color="red">description missing</font>
+ [% END %]
+ </td>
+
+</tr><tr>
+ <td valign="top">Sortkey:</td>
+ <td valign="top">[% classification.sortkey FILTER html %]</td>
+
+</tr>
+</table>
+
+<h2>Confirmation</h2>
+
+<p>Do you really want to delete this classification?</p>
+<form method=post action="editclassifications.cgi">
+ <input type=submit value="Yes, delete">
+ <input type=hidden name="action" value="delete">
+ <input type=hidden name="classification" value="[% classification.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+[% PROCESS admin/classifications/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/classifications/edit.html.tmpl b/template/en/default/admin/classifications/edit.html.tmpl
new file mode 100644
index 0000000..80d7f98
--- /dev/null
+++ b/template/en/default/admin/classifications/edit.html.tmpl
@@ -0,0 +1,85 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Albert Ting <alt@sonic.net>
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Edit classification"
+%]
+
+<form method=post action="editclassifications.cgi">
+ <table border=0 cellpadding=4 cellspacing=0>
+ <tr>
+ <th align="right">Classification:</th>
+ <td><input size=64 maxlength=64 name="classification"
+ value="[% classification.name FILTER html %]"></td>
+ </tr>
+ <tr>
+ <th align="right">Description:</th>
+ <td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'description'
+ minrows = 4
+ cols = 64
+ defaultcontent = classification.description
+ %]
+ </td>
+ </tr>
+ <tr>
+ <th align="right"><label for="sortkey">Sortkey:</label></th>
+ <td><input id="sortkey" size="20" maxlength="20" name="sortkey" value="
+ [%- classification.sortkey FILTER html %]"></td>
+ </tr>
+ <tr valign=top>
+ <th align="right">
+ <a href="editproducts.cgi?classification=[% classification.name FILTER url_quote %]">
+ Edit Products</a>:
+ </th>
+ <td>
+ [% IF classification.products.size > 0 %]
+ <table>
+ [% FOREACH product = classification.products %]
+ <tr>
+ <th align=right valign=top>[% product.name FILTER html %]</th>
+ <td valign=top>
+ [% IF product.description %]
+ [% product.description FILTER html_light %]
+ [% ELSE %]
+ <font color="red">description missing</font>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+ </table>
+ [% ELSE %]
+ <font color="red">none</font>
+ [% END %]
+ </td>
+ </tr>
+ </table>
+
+ <input type=hidden name="classificationold"
+ value="[% classification.name FILTER html %]">
+ <input type=hidden name="action" value="update">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type=submit value="Update">
+</form>
+
+[% PROCESS admin/classifications/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/classifications/footer.html.tmpl b/template/en/default/admin/classifications/footer.html.tmpl
new file mode 100644
index 0000000..db983aa
--- /dev/null
+++ b/template/en/default/admin/classifications/footer.html.tmpl
@@ -0,0 +1,24 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Nitish Bezzala <nbezzala@yahoo.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+<p>Back to the <a href="./">main [% terms.bugs %] page</a>
+or <a href="editclassifications.cgi"> edit</a> more classifications.</p>
diff --git a/template/en/default/admin/classifications/reclassify.html.tmpl b/template/en/default/admin/classifications/reclassify.html.tmpl
new file mode 100644
index 0000000..146a1ac
--- /dev/null
+++ b/template/en/default/admin/classifications/reclassify.html.tmpl
@@ -0,0 +1,90 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Albert Ting <alt@sonic.net>
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Reclassify products"
+%]
+
+<form method=post action="editclassifications.cgi">
+ <table border=0 cellpadding=4 cellspacing=0>
+ <tr>
+ <td valign="top">Classification:</td>
+ <td valign="top" colspan=3>[% classification.name FILTER html %]</td>
+
+ </tr><tr>
+ <td valign="top">Description:</td>
+ <td valign="top" colspan=3>
+ [% IF classification.description %]
+ [% classification.description FILTER html_light %]
+ [% ELSE %]
+ <font color="red">description missing</font>
+ [% END %]
+ </td>
+
+ </tr><tr>
+ <td valign="top">Sortkey:</td>
+ <td valign="top" colspan=3>[% classification.sortkey FILTER html %]</td>
+
+ </tr><tr>
+ <td valign="top">Products:</td>
+ <td valign="top">Other Classifications</td>
+ <td></td>
+ <td valign="top">This Classification</td>
+
+ </tr><tr>
+ <td></td>
+ <td valign="top">
+ <select name="prodlist" id="prodlist" multiple="multiple" size="20">
+ [% FOREACH class = classifications %]
+ [% IF class.id != classification.id %]
+ [% FOREACH product = class.products %]
+ <option value="[% product.name FILTER html %]">
+ [[% class.name FILTER html %]]&nbsp;[% product.name FILTER html %]
+ </option>
+ [% END %]
+ [% END %]
+ [% END %]
+ </select></td>
+
+ <td align="center">
+ <input type=submit value=" Add &gt;&gt; " name="add_products"><br><br>
+ <input type=submit value="&lt;&lt; Remove" name="remove_products">
+ </td>
+
+ <td valign="middle" rowspan=2>
+ <select name="myprodlist" id="myprodlist" multiple="multiple" size="20">
+ [% FOREACH product = classification.products %]
+ <option value="[% product.name FILTER html %]">
+ [% product.name FILTER html %]
+ </option>
+ [% END %]
+ </select></td>
+ </tr>
+ </table>
+
+ <input type=hidden name="action" value="reclassify">
+ <input type=hidden name="classification" value="[% classification.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+[% PROCESS admin/classifications/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
+
diff --git a/template/en/default/admin/classifications/select.html.tmpl b/template/en/default/admin/classifications/select.html.tmpl
new file mode 100644
index 0000000..d6b352d
--- /dev/null
+++ b/template/en/default/admin/classifications/select.html.tmpl
@@ -0,0 +1,66 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Albert Ting <alt@sonic.net>
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Select classification"
+%]
+
+<table border=1 cellpadding=4 cellspacing=0>
+ <tr bgcolor="#6666ff">
+ <th align="left">Edit Classification ...</th>
+ <th align="left">Description</th>
+ <th align="left">Sortkey</th>
+ <th align="left">Products</th>
+ <th align="left">Action</th>
+ </tr>
+
+ [% FOREACH cl = classifications %]
+ <tr>
+ <td valign="top"><a href="editclassifications.cgi?action=edit&amp;classification=[% cl.name FILTER url_quote %]"><b>[% cl.name FILTER html %]</b></a></td>
+ <td valign="top">
+ [% IF cl.description %]
+ [% cl.description FILTER html_light %]
+ [% ELSE %]
+ <font color="red">none</font>
+ [% END %]
+ </td>
+ <td valign="top">[% cl.sortkey FILTER html %]</td>
+ [% IF (cl.id == 1) %]
+ <td valign="top">[% cl.product_count FILTER html %]</td>
+ [% ELSE %]
+ <td valign="top"><a href="editclassifications.cgi?action=reclassify&amp;classification=[% cl.name FILTER url_quote %]">reclassify ([% cl.product_count FILTER html %])</a></td>
+ [% END %]
+
+ [%# don't allow user to delete the default id. %]
+ [% IF (cl.id == 1) %]
+ <td valign="top">&nbsp;</td>
+ [% ELSE %]
+ <td valign="top"><a href="editclassifications.cgi?action=del&amp;classification=[% cl.name FILTER url_quote %]">delete</a></td>
+ [% END %]
+ </tr>
+ [% END %]
+
+ <tr>
+ <td valign="top" colspan=4>Add a new classification</td>
+ <td valign="top" align="center"><a href="editclassifications.cgi?action=add">Add</a></td>
+ </tr>
+</table>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/components/confirm-delete.html.tmpl b/template/en/default/admin/components/confirm-delete.html.tmpl
new file mode 100644
index 0000000..d0a1385
--- /dev/null
+++ b/template/en/default/admin/components/confirm-delete.html.tmpl
@@ -0,0 +1,160 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # comp: object; Bugzilla::Component object representing the component the
+ # user wants to delete.
+ # product: object; Bugzilla::Product object representing the product to
+ # which the component belongs.
+ #%]
+
+[% title = BLOCK %]Delete component '[% comp.name FILTER html %]'
+from '[% product.name FILTER html %]' product
+ [% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+<table border="1" cellpadding="4" cellspacing="0">
+<tr bgcolor="#6666FF">
+ <th valign="top" align="left">Field</th>
+ <th valign="top" align="left">Value</th>
+</tr>
+<tr>
+ <td valign="top">Component:</td>
+ <td valign="top">[% comp.name FILTER html %]</td>
+</tr>
+<tr>
+ <td valign="top">Component Description:</td>
+ <td valign="top">[% comp.description FILTER html_light %]</td>
+</tr>
+<tr>
+ <td valign="top">Default assignee:</td>
+ <td valign="top">[% comp.default_assignee.login FILTER html %]</td>
+
+[% IF Param('useqacontact') %]
+</tr>
+<tr>
+ <td valign="top">Default QA contact:</td>
+ <td valign="top">[% comp.default_qa_contact.login FILTER html %]</td>
+[% END %]
+
+</tr>
+<tr>
+ <td valign="top">Component of Product:</td>
+ <td valign="top">[% product.name FILTER html %]</td>
+
+[% IF product.description %]
+</tr>
+<tr>
+ <td valign="top">Product Description:</td>
+ <td valign="top">[% product.description FILTER html_light %]</td>
+[% END %]
+
+[% IF Param('usetargetmilestone') %]
+</tr>
+<tr>
+ <td valign="top">Product Milestone URL:</td>
+ <td valign="top">
+ <a href="[% product.milestone_url FILTER html %]">
+ [% product.milestone_url FILTER html %]
+ </a>
+ </td>
+[% END %]
+
+</tr>
+<tr>
+ <TD VALIGN="top">Open for [% terms.bugs %]:</TD>
+ <TD VALIGN="top">[% IF product.is_active %]Yes[% ELSE %]No[% END %]</td>
+</tr>
+<tr>
+ <td valign="top">[% terms.Bugs %]:</td>
+ <td valign="top">
+[% IF comp.bug_count %]
+ <a title="List of [% terms.bugs %] for component '[% comp.name FILTER html %]'"
+ href="buglist.cgi?component=[% comp.name FILTER url_quote %]&amp;product=
+ [%- product.name FILTER url_quote %]">[% comp.bug_count %]</a>
+[% ELSE %]
+ None
+[% END %]
+ </td>
+</tr>
+</table>
+
+<h2>Confirmation</h2>
+
+[% IF comp.bug_count %]
+
+ [% IF !Param("allowbugdeletion") %]
+ <p>
+ Sorry, there
+
+ [% IF comp.bug_count > 1 %]
+ are [% comp.bug_count %] [%+ terms.bugs %]
+ [% ELSE %]
+ is [% comp.bug_count %] [%+ terms.bug %]
+ [% END %]
+
+ outstanding for this component. You must reassign
+
+ [% IF comp.bug_count > 1 %]
+ those [% terms.bugs %]
+ [% ELSE %]
+ that [% terms.bug %]
+ [% END %]
+
+ to another component before you can delete this one.
+ </p>
+ [% ELSE %]
+
+ <table border="0" cellpadding="20" width="70%" bgcolor="red"><tr><td>
+
+ There [% IF comp.bug_count > 1 %]
+ are [% comp.bug_count %] [%+ terms.bugs %]
+ [% ELSE %]
+ is 1 [% terms.bug %]
+ [% END %]
+ entered for this component! When you delete this
+ component, <b><blink>ALL</blink></b> stored [% terms.bugs %] and
+ their history will be deleted too.
+ </td></tr></table>
+
+ [% END %]
+
+[% END %]
+
+[% IF comp.bug_count == 0 || Param('allowbugdeletion') %]
+
+ <p>Do you really want to delete this component?</p>
+
+ <form method="post" action="editcomponents.cgi">
+ <input type="submit" id="delete" value="Yes, delete">
+ <input type="hidden" name="action" value="delete">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ <input type="hidden" name="component" value="[% comp.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ </form>
+
+[% END %]
+
+[% PROCESS admin/components/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/components/create.html.tmpl b/template/en/default/admin/components/create.html.tmpl
new file mode 100644
index 0000000..86411ad
--- /dev/null
+++ b/template/en/default/admin/components/create.html.tmpl
@@ -0,0 +1,103 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Akamai Technologies <bugzilla-dev@akamai.com>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the component belongs.
+ #%]
+
+[% title = BLOCK %]Add component to the [% product.name FILTER html %] product[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+<form method="post" action="editcomponents.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <th align="right">Component:</th>
+ <td><input size="64" maxlength="64" name="component" value=""></td>
+ </tr>
+ <tr>
+ <th align="right">Description:</th>
+ <td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'description'
+ minrows = 4
+ cols = 64
+ wrap = 'virtual'
+ %]
+ </td>
+ </tr>
+ <tr>
+ <th align="right"><label for="initialowner">Default Assignee:</label></th>
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ name => "initialowner"
+ id => "initialowner"
+ value => ""
+ size => 64
+ %]
+ </td>
+ </tr>
+[% IF Param('useqacontact') %]
+ <tr>
+ <th align="right">
+ <label for="initialqacontact">Default QA Contact:</label></th>
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ name => "initialqacontact"
+ id => "initialqacontact"
+ value => ""
+ size => 64
+ emptyok => 1
+ %]
+ </td>
+ </tr>
+[% END %]
+ <tr>
+ <th align="right">
+ <label for="initialcc">Default CC List:</label>
+ </th>
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ name => "initialcc"
+ id => "initialcc"
+ value => ""
+ size => 64
+ multiple => 5
+ %]
+ <br>
+ [% IF !Param("usemenuforusers") %]
+ <em>Enter user names for the CC list as a comma-separated list.</em>
+ [% END %]
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <input type="submit" id="create" value="Add">
+ <input type="hidden" name="action" value="new">
+ <input type="hidden" name='product' value="[% product.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+[% PROCESS admin/components/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/components/edit.html.tmpl b/template/en/default/admin/components/edit.html.tmpl
new file mode 100644
index 0000000..9ddb8ca
--- /dev/null
+++ b/template/en/default/admin/components/edit.html.tmpl
@@ -0,0 +1,134 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Akamai Technologies <bugzilla-dev@akamai.com>
+ #%]
+
+[%# INTERFACE:
+ # comp: object; Bugzilla::Component object representing the component the
+ # user wants to edit.
+ # product: object; Bugzilla::Product object representing the product to
+ # which the component belongs.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]
+ Edit component '[% comp.name FILTER html %]' of product '[% product.name FILTER html %]'
+[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+<form method="post" action="editcomponents.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+
+ <tr>
+ <td valign="top">Component:</td>
+ <td><input size="64" maxlength="64" name="component" value="
+ [%- comp.name FILTER html %]"></td>
+ </tr>
+ <tr>
+ <td valign="top">Component Description:</td>
+ <td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'description'
+ minrows = 4
+ cols = 64
+ wrap = 'virtual'
+ defaultcontent = comp.description
+ %]
+ </td>
+ </tr>
+ <tr>
+ <td valign="top"><label for="initialowner">Default Assignee:</label></td>
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ name => "initialowner"
+ id => "initialowner"
+ value => comp.default_assignee.login
+ size => 64
+ %]
+ </td>
+
+[% IF Param('useqacontact') %]
+ </tr>
+ <tr>
+ <td valign="top"><label for="initialqacontact">Default QA contact:</label></td>
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ name => "initialqacontact"
+ id => "initialqacontact"
+ value => comp.default_qa_contact.login
+ size => 64
+ emptyok => 1
+ %]
+ </td>
+[% END %]
+
+ </tr>
+ <tr>
+ <td valign="top">
+ <label for="initialcc">Default CC List:</label>
+ </td>
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ name => "initialcc"
+ id => "initialcc"
+ value => initial_cc_names
+ size => 64
+ multiple => 5
+ %]
+ <br>
+ [% IF !Param("usemenuforusers") %]
+ <em>Enter user names for the CC list as a comma-separated list.</em>
+ [% END %]
+ </td>
+ </tr>
+ <tr>
+ <td>[% terms.Bugs %]:</td>
+ <td>
+[% IF comp.bug_count > 0 %]
+ <a title="[% terms.Bugs %] in component '[% comp.name FILTER html %]'"
+ href="buglist.cgi?component=
+ [%- comp.name FILTER url_quote %]&amp;product=
+ [%- product.name FILTER url_quote %]">[% comp.bug_count %]</a>
+[% ELSE %]
+ None
+[% END %]
+ </td>
+ </tr>
+
+ </table>
+
+ <input type="hidden" name="action" value="update">
+ <input type="hidden" name="componentold" value="[% comp.name FILTER html %]">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" value="Save Changes" id="update"> or <a
+ href="editcomponents.cgi?action=del&amp;product=
+ [%- product.name FILTER url_quote %]&amp;component=
+ [%- comp.name FILTER url_quote %]">Delete</a> this component.
+
+</form>
+
+[% PROCESS admin/components/footer.html.tmpl
+ no_edit_component_link = 1
+%]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/components/footer.html.tmpl b/template/en/default/admin/components/footer.html.tmpl
new file mode 100644
index 0000000..b2e105e
--- /dev/null
+++ b/template/en/default/admin/components/footer.html.tmpl
@@ -0,0 +1,54 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # comp: object; Bugzilla::Component object representing the component
+ # product: object; Bugzilla::Product object representing the product to
+ # which the component belongs.
+ #%]
+
+<hr>
+
+<p>
+Edit
+
+[% IF comp && !no_edit_component_link %]
+ component <a
+ title="Edit Component '[% comp.name FILTER html %]'"
+ href="editcomponents.cgi?action=edit&amp;product=
+ [%- product.name FILTER url_quote %]&amp;component=[% comp.name FILTER url_quote %]">
+ '[% comp.name FILTER html %]'</a>
+ or edit
+[% END %]
+
+[% IF !no_edit_other_components_link %]
+other components of product <a
+ title="Choose a component from product '[% product.name FILTER html %]' to edit"
+ href="editcomponents.cgi?product=
+ [%- product.name FILTER url_quote %]">'[% product.name FILTER html %]'</a>,
+ or edit
+[% END %]
+
+product <a
+ title="Edit Product '[% product.name FILTER html %]'"
+ href="editproducts.cgi?action=edit&amp;product=
+ [%- product.name FILTER url_quote %]">'[% product.name FILTER html %]'</a>.
+
+</p>
diff --git a/template/en/default/admin/components/list.html.tmpl b/template/en/default/admin/components/list.html.tmpl
new file mode 100644
index 0000000..632d47e
--- /dev/null
+++ b/template/en/default/admin/components/list.html.tmpl
@@ -0,0 +1,128 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # showbugcounts: if defined, then bug counts should be included in the table
+ # product: object; Bugzilla::Product object representing the product to
+ # which the component belongs.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]Select component of product
+ '[% product.name FILTER html %]'[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+[% edit_contentlink = BLOCK %]editcomponents.cgi?action=edit&amp;product=
+ [%- product.name FILTER url_quote %]&amp;component=%%name%%[% END %]
+[% delete_contentlink = BLOCK %]editcomponents.cgi?action=del&amp;product=
+ [%- product.name FILTER url_quote %]&amp;component=%%name%%[% END %]
+[% bug_count_contentlink = BLOCK %]buglist.cgi?component=%%name%%&amp;product=
+ [%- product.name FILTER url_quote %][% END %]
+
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit component..."
+ contentlink => edit_contentlink
+ },
+ {
+ name => "description"
+ heading => "Description"
+ allow_html_content => 1
+ },
+ {
+ name => "initialowner"
+ heading => "Default Assignee"
+ },
+ ]
+%]
+
+[% IF Param('useqacontact') %]
+
+ [% columns.push({
+ name => 'initialqacontact'
+ heading => 'QA Contact'
+ }) %]
+
+[% END %]
+
+[% IF showbugcounts %]
+
+ [% columns.push({
+ name => 'bug_count'
+ heading => "$terms.Bugs"
+ align => "right"
+ contentlink => bug_count_contentlink
+ }) %]
+
+[% END %]
+
+[% columns.push({
+ heading => "Action"
+ content => "Delete"
+ contentlink => delete_contentlink
+ }) %]
+
+[%# Overrides the initialowner and the initialqacontact with right values %]
+[% overrides.initialowner = {} %]
+[% overrides.initialqacontact = {} %]
+
+[%# "component" is a reserved word in Template Toolkit. %]
+[% FOREACH my_component = product.components %]
+ [% overrides.initialowner.name.${my_component.name} = {
+ override_content => 1
+ content => my_component.default_assignee.login
+ }
+ %]
+ [% overrides.initialqacontact.name.${my_component.name} = {
+ override_content => 1
+ content => my_component.default_qa_contact.login
+ }
+ %]
+[% END %]
+
+[% Hook.process('before_table') %]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = product.components
+ overrides = overrides
+%]
+
+<p><a href="editcomponents.cgi?action=add&amp;product=[% product.name FILTER url_quote %]">Add</a>
+ a new component to product '[% product.name FILTER html %]'</p>
+
+[% IF ! showbugcounts %]
+
+ <p><a href="editcomponents.cgi?product=[% product.name FILTER url_quote %]&amp;showbugcounts=1">
+ Redisplay table with [% terms.bug %] counts (slower)</a></p>
+
+[% END %]
+
+[% PROCESS admin/components/footer.html.tmpl
+ no_edit_other_components_link = 1
+ %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/components/select-product.html.tmpl b/template/en/default/admin/components/select-product.html.tmpl
new file mode 100644
index 0000000..0910f98
--- /dev/null
+++ b/template/en/default/admin/components/select-product.html.tmpl
@@ -0,0 +1,70 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #
+ #%]
+
+[%# INTERFACE:
+ # products: array of product objects
+ # showbugcounts: if defined, then bug counts should be included in the table
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Edit components for which product?"
+%]
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit components of..."
+ contentlink => "editcomponents.cgi?product=%%name%%"
+ },
+ {
+ name => "description"
+ heading => "Description"
+ allow_html_content => 1
+ }
+ ]
+%]
+
+[% IF showbugcounts %]
+
+ [% columns.push({
+ name => 'bug_count'
+ heading => "$terms.Bugs"
+ align => "right"
+ contentlink => "buglist.cgi?product=%%name%%"
+ })
+ %]
+
+[% END %]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = products
+%]
+
+[% IF !showbugcounts %]
+ <p><a href="editcomponents.cgi?showbugcounts=1">
+ Redisplay table with [% terms.bug %] counts (slower)</a></p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/confirm-action.html.tmpl b/template/en/default/admin/confirm-action.html.tmpl
new file mode 100644
index 0000000..521d2d1
--- /dev/null
+++ b/template/en/default/admin/confirm-action.html.tmpl
@@ -0,0 +1,98 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Frédéric Buclin.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # abuser: identity of the user who created the (invalid?) token.
+ # token_action: the action the token was supposed to serve.
+ # expected_action: the action the user was going to do.
+ # script_name: the script generating this warning.
+ # alternate_script: the suggested script to redirect the user to
+ # if he declines submission.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS global/header.html.tmpl title = "Suspicious Action"
+ style_urls = ['skins/standard/global.css'] %]
+
+[% IF abuser %]
+ <div class="throw_error">
+ <p>When you view an administrative form in [% terms.Bugzilla %], a token string
+ is randomly generated and stored both in the database and in the form you loaded,
+ to make sure that the requested changes are being made as a result of submitting
+ a form generated by [% terms.Bugzilla %]. Unfortunately, the token used right now
+ is incorrect, meaning that it looks like you didn't come from the right page.
+ The following token has been used :</p>
+
+ <table border="0" cellpadding="5" cellspacing="0">
+ [% IF token_action != expected_action %]
+ <tr>
+ <th>Action&nbsp;stored:</th>
+ <td>[% token_action FILTER html %]</td>
+ </tr>
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ This action doesn't match the one expected ([% expected_action FILTER html %]).
+ </td>
+ </tr>
+ [% END %]
+
+ [% IF abuser != user.identity %]
+ <tr>
+ <th>Generated&nbsp;by:</th>
+ <td>[% abuser FILTER html %]</td>
+ </tr>
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ This token has not been generated by you. It is possible that someone
+ tried to trick you!
+ </td>
+ </tr>
+ [% END %]
+ </table>
+
+ <p>Please report this problem to [%+ Param("maintainer") FILTER html %].</p>
+ </div>
+[% ELSE %]
+ <div class="throw_error">
+ It looks like you didn't come from the right page (you have no valid token for
+ the <em>[% expected_action FILTER html %]</em> action while processing the
+ '[% script_name FILTER html%]' script). The reason could be one of:<br>
+ <ul>
+ <li>You clicked the "Back" button of your web browser after having successfully
+ submitted changes, which is generally not a good idea (but harmless).</li>
+ <li>You entered the URL in the address bar of your web browser directly,
+ which should be safe.</li>
+ <li>You clicked on a URL which redirected you here <b>without your consent</b>,
+ in which case this action is much more critical.</li>
+ </ul>
+ Are you sure you want to commit these changes anyway? This may result in
+ unexpected and undesired results.
+ </div>
+
+ <form name="check" id="check" method="post" action="[% script_name FILTER html %]">
+ [% PROCESS "global/hidden-fields.html.tmpl"
+ exclude="^(Bugzilla_login|Bugzilla_password)$" %]
+ <input type="submit" id="confirm" value="Confirm Changes">
+ </form>
+ <p>Or throw away these changes and go back to <a href="[% alternate_script FILTER html %]">
+ [%- alternate_script FILTER html %]</a>.</p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/custom_fields/cf-js.js.tmpl b/template/en/default/admin/custom_fields/cf-js.js.tmpl
new file mode 100644
index 0000000..5ece96e
--- /dev/null
+++ b/template/en/default/admin/custom_fields/cf-js.js.tmpl
@@ -0,0 +1,59 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is NASA.
+ # Portions created by NASA are Copyright (C) 2008
+ # San Jose State University Foundation. All Rights Reserved.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+// Disable a checkbox based on the state of another one.
+function toggleCheckbox(this_checkbox, other_checkbox_id) {
+ var other_checkbox = document.getElementById(other_checkbox_id);
+ other_checkbox.disabled = !this_checkbox.checked;
+}
+
+var select_values = new Array();
+[% USE Bugzilla %]
+[% FOREACH sel_field = Bugzilla.get_fields({ is_select => 1 }) %]
+ select_values[[% sel_field.id FILTER js %]] = [
+ [% FOREACH legal_value = sel_field.legal_values %]
+ [[% legal_value.id FILTER js %], '[% display_value(sel_field.name, legal_value.name) FILTER js %]'][% ',' UNLESS loop.last %]
+ [% END %]
+ ];
+[% END %]
+
+function onChangeType(type_field) {
+ var value_field = document.getElementById('value_field_id');
+ if (type_field.value == [% constants.FIELD_TYPE_SINGLE_SELECT %]
+ || type_field.value == [% constants.FIELD_TYPE_MULTI_SELECT %])
+ {
+ value_field.disabled = false;
+ }
+ else {
+ value_field.disabled = true;
+ }
+}
+
+function onChangeVisibilityField() {
+ var vis_field = document.getElementById('visibility_field_id');
+ var vis_value = document.getElementById('visibility_value_id');
+
+ if (vis_field.value) {
+ var values = select_values[vis_field.value];
+ bz_populateSelectFromArray(vis_value, values);
+ }
+ else {
+ bz_clearOptions(vis_value);
+ }
+}
diff --git a/template/en/default/admin/custom_fields/confirm-delete.html.tmpl b/template/en/default/admin/custom_fields/confirm-delete.html.tmpl
new file mode 100644
index 0000000..c936836
--- /dev/null
+++ b/template/en/default/admin/custom_fields/confirm-delete.html.tmpl
@@ -0,0 +1,66 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Alexander Eiser <alexe@ed.ca>
+ #%]
+
+[%# INTERFACE:
+ # field: object; the field object that you are trying to delete.
+ # token: string; the delete_field token required to complete deletion.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% title = BLOCK %]
+ Delete the Custom Field '[% field.name FILTER html %]' ([% field.description FILTER html %])
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ doc_section = "custom-fields.html#delete-custom-fields"
+%]
+
+<table border="1" cellpadding="4" cellspacing="0">
+<tr bgcolor="#6666FF">
+ <th valign="top" align="left">Field</th>
+ <th valign="top" align="left">Value</th>
+</tr>
+<tr>
+ <td valign="top">Custom Field:</td>
+ <td valign="top">[% field.name FILTER html %]</td>
+</tr>
+<tr>
+ <td valign="top">Description:</td>
+ <td valign="top">[% field.description FILTER html %]</td>
+</tr>
+<tr>
+ <td valign="top">Type:</td>
+ <td valign="top">[% field_types.${field.type} FILTER html %]</td>
+</tr>
+</table>
+
+<h2>Confirmation</h2>
+
+<p>
+ Are you sure you want to remove this field from the database?<br>
+ <em>This action will only be successful if the field is obsolete,
+ and has never been used in [% terms.abug FILTER html %].</em>
+</p>
+
+<a href="editfields.cgi?action=delete&amp;name=[% field.name FILTER html %]&amp;token=[% token FILTER html %]">
+ Delete field '[% field.description FILTER html %]'</a>
+
+<p>
+ <a href="editfields.cgi">Back to the list of existing custom fields</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/custom_fields/create.html.tmpl b/template/en/default/admin/custom_fields/create.html.tmpl
new file mode 100644
index 0000000..a2db470
--- /dev/null
+++ b/template/en/default/admin/custom_fields/create.html.tmpl
@@ -0,0 +1,149 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # none
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% javascript = BLOCK %]
+ [% INCLUDE "admin/custom_fields/cf-js.js.tmpl" %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Add a new Custom Field"
+ onload = "document.getElementById('new_bugmail').disabled = true;"
+ javascript_urls = [ 'js/util.js' ]
+ doc_section = "custom-fields.html#add-custom-fields"
+%]
+
+<p>
+ Adding custom fields can make the interface of [% terms.Bugzilla %] very
+ complicated. Many admins who are new to [% terms.Bugzilla %] start off
+ adding many custom fields, and then their users complain that the interface
+ is "too complex". Please think carefully before adding any custom fields.
+ It may be the case that [% terms.Bugzilla %] already does what you need,
+ and you just haven't enabled the correct feature yet.
+</p>
+
+<ul>
+ <li>Custom field names must begin with "cf_" to distinguish them from
+ standard fields. If you omit "cf_" from the beginning of the name, it
+ will be added for you.</li>
+ <li>Descriptions are a very short string describing the field and will be
+ used as the label for this field in the user interface.</li>
+</ul>
+
+<form id="add_field" action="editfields.cgi" method="GET">
+ <table border="0" cellspacing="0" cellpadding="5">
+ <tr>
+ <th align="right"><label for="name">Name:</label></th>
+ <td>
+ <input type="text" id="name" name="name" value="cf_" size="40" maxlength="64">
+ </td>
+
+ <th align="right">
+ <label for="enter_bug">Can be set on [% terms.bug %] creation:</label>
+ </th>
+ <td>
+ <input type="checkbox" id="enter_bug" name="enter_bug" value="1"
+ onchange="toggleCheckbox(this, 'new_bugmail');">
+ </td>
+ </tr>
+ <tr>
+ <th align="right"><label for="desc">Description:</label></th>
+ <td><input type="text" id="desc" name="desc" value="" size="40"></td>
+
+ <th align="right">
+ <label for="new_bugmail">Displayed in [% terms.bug %]mail for new [% terms.bugs %]:</label>
+ </th>
+ <td><input type="checkbox" id="new_bugmail" name="new_bugmail" value="1"></td>
+ </tr>
+ <tr>
+ <th align="right"><label for="type">Type:</label></th>
+ <td>
+ <select id="type" name="type" onchange="onChangeType(this)">
+ [% FOREACH type = field_types.keys %]
+ [% NEXT IF type == constants.FIELD_TYPE_UNKNOWN %]
+ <option value="[% type FILTER html %]">[% field_types.$type FILTER html %]</option>
+ [% END %]
+ </select>
+ </td>
+
+ <th align="right"><label for="obsolete">Is obsolete:</label></th>
+ <td><input type="checkbox" id="obsolete" name="obsolete" value="1"></td>
+ </tr>
+ <tr>
+ <th align="right"><label for="sortkey">Sortkey:</label></th>
+ <td>
+ <input type="text" id="sortkey" name="sortkey" size="6" maxlength="6">
+ </td>
+
+ <th align="right">
+ <label for="visibility_field_id">Field only appears when:</label>
+ </th>
+ <td>
+ <select name="visibility_field_id" id="visibility_field_id"
+ onchange="onChangeVisibilityField()">
+ <option></option>
+ [% FOREACH sel_field = Bugzilla.get_fields({ is_select => 1 }) %]
+ <option value="[% sel_field.id FILTER html %]">
+ [% sel_field.description FILTER html %]
+ ([% sel_field.name FILTER html %])
+ </option>
+ [% END %]
+ </select>
+ <label for="visibility_value_id"><strong>is set to:</strong></label>
+ <select name="visibility_value_id" id="visibility_value_id">
+ <option value=""></option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2">&nbsp;</td>
+ <th>
+ <label for="value_field_id">
+ Field that controls the values<br>
+ that appear in this field:
+ </label>
+ </th>
+
+ <td>
+ <select disabled="disabled" name="value_field_id" id="value_field_id">
+ <option></option>
+ [% FOREACH sel_field = Bugzilla.get_fields({ is_select => 1 }) %]
+ <option value="[% sel_field.id FILTER html %]">
+ [% sel_field.description FILTER html %]
+ ([% sel_field.name FILTER html %])
+ </option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ </table>
+ <p>
+ <input type="hidden" name="action" value="new">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" id="create" value="Create">
+ </p>
+</form>
+
+<p>
+ <a href="editfields.cgi">Back to the list of existing custom fields</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/custom_fields/edit.html.tmpl b/template/en/default/admin/custom_fields/edit.html.tmpl
new file mode 100644
index 0000000..c5ac53d
--- /dev/null
+++ b/template/en/default/admin/custom_fields/edit.html.tmpl
@@ -0,0 +1,161 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # field: Bugzila::Field; the current field being edited
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% title = BLOCK %]
+ Edit the Custom Field '[% field.name FILTER html %]' ([% field.description FILTER html %])
+[% END %]
+
+[% javascript = BLOCK %]
+ [% INCLUDE "admin/custom_fields/cf-js.js.tmpl" %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ onload = "toggleCheckbox(document.getElementById('enter_bug'), 'new_bugmail');"
+ javascript_urls = [ 'js/util.js' ]
+ doc_section = "custom-fields.html#edit-custom-fields"
+%]
+
+<p>
+ Descriptions are a very short string describing the field and will be used as
+ the label for this field in the user interface.
+</p>
+
+<form id="edit_field" action="editfields.cgi" method="GET">
+ <table border="0" cellspacing="0" cellpadding="5">
+ <tr>
+ <th align="right">Name:</th>
+ <td>[% field.name FILTER html %]</td>
+
+ <th align="right">
+ <label for="enter_bug">Can be set on [% terms.bug %] creation:</label>
+ </th>
+ <td><input type="checkbox" id="enter_bug" name="enter_bug" value="1"
+ [%- " checked" IF field.enter_bug %]
+ onchange="toggleCheckbox(this, 'new_bugmail');"></td>
+ </tr>
+ <tr>
+ <th align="right"><label for="desc">Description:</label></th>
+ <td><input type="text" id="desc" name="desc" size="40"
+ value="[% field.description FILTER html %]"></td>
+
+ <th align="right">
+ <label for="new_bugmail">Displayed in [% terms.bug %]mail for new [% terms.bugs %]:</label>
+ </th>
+ <td><input type="checkbox" id="new_bugmail" name="new_bugmail" value="1"
+ [%- " checked" IF field.mailhead %]></td>
+ </tr>
+ <tr>
+ <th align="right">Type:</th>
+ <td>[% field_types.${field.type} FILTER html %]</td>
+
+ <th align="right"><label for="obsolete">Is obsolete:</label></th>
+ <td><input type="checkbox" id="obsolete" name="obsolete" value="1"
+ [%- " checked" IF field.obsolete %]></td>
+ </tr>
+ <tr>
+ <th align="right"><label for="sortkey">Sortkey:</label></th>
+ <td>
+ <input type="text" id="sortkey" name="sortkey" size="6" maxlength="6"
+ value="[% field.sortkey FILTER html %]">
+ </td>
+ <th align="right">
+ <label for="visibility_field_id">Field only appears when:</label>
+ </th>
+ <td>
+ <select name="visibility_field_id" id="visibility_field_id"
+ onchange="onChangeVisibilityField()">
+ <option></option>
+ [% FOREACH sel_field = Bugzilla.get_fields({ is_select => 1 }) %]
+ [% NEXT IF sel_field.id == field.id %]
+ <option value="[% sel_field.id FILTER html %]"
+ [% ' selected="selected"'
+ IF sel_field.id == field.visibility_field.id %]>
+ [% sel_field.description FILTER html %]
+ ([% sel_field.name FILTER html %])
+ </option>
+ [% END %]
+ </select>
+ <label for="visibility_value_id"><strong>is set to:</strong></label>
+ <select name="visibility_value_id" id="visibility_value_id">
+ [% FOREACH value = field.visibility_field.legal_values %]
+ <option value="[% value.id FILTER html %]"
+ [% ' selected="selected"'
+ IF field.visibility_value.id == value.id %]>
+ [% display_value(field.visibility_field.name, value.name) FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ [% IF field.is_select %]
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <a href="editvalues.cgi?field=[% field.name FILTER url_quote %]">Edit
+ legal values for this field</a>.
+ </td>
+
+ <th>
+ <label for="value_field_id">
+ Field that controls the values<br>
+ that appear in this field:
+ </label>
+ </th>
+
+ <td>
+ <select name="value_field_id" id="value_field_id">
+ <option></option>
+ [% FOREACH sel_field = Bugzilla.get_fields({ is_select => 1 }) %]
+ [% NEXT IF sel_field.id == field.id %]
+ <option value="[% sel_field.id FILTER html %]"
+ [% ' selected="selected"'
+ IF sel_field.id == field.value_field.id %]>
+ [% sel_field.description FILTER html %]
+ ([% sel_field.name FILTER html %])
+ </option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ [% END %]
+ </table>
+ <br>
+ <input type="hidden" name="action" value="update">
+ <input type="hidden" name="name" value="[% field.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" id="edit" value="Submit">
+</form>
+
+[% IF field.obsolete %]
+<p>
+ <a href="editfields.cgi?action=del&amp;name=[% field.name FILTER html %]">Remove
+ this custom field from the database.</a><br>
+ This action will only be successful if the custom field has never been used
+ in [% terms.abug %].<br>
+</p>
+[% END %]
+
+<p>
+ <a href="editfields.cgi">Back to the list of existing custom fields</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/custom_fields/list.html.tmpl b/template/en/default/admin/custom_fields/list.html.tmpl
new file mode 100644
index 0000000..dd266c7
--- /dev/null
+++ b/template/en/default/admin/custom_fields/list.html.tmpl
@@ -0,0 +1,102 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # custom_fields: a list of Bugzilla::Field objects, representing custom fields.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Custom Fields"
+ doc_section = "custom-fields.html"
+%]
+
+[% delete_contentlink = BLOCK %]editfields.cgi?action=del&amp;name=%%name%%[% END %]
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit custom field..."
+ contentlink => "editfields.cgi?action=edit&amp;name=%%name%%"
+ },
+ {
+ name => "description"
+ heading => "Description"
+ },
+ {
+ name => "sortkey"
+ heading => "Sortkey"
+ },
+ {
+ name => "type"
+ heading => "Type"
+ },
+ {
+ name => "enter_bug"
+ heading => "Editable on $terms.Bug Creation"
+ },
+ {
+ name => "mailhead"
+ heading => "In ${terms.Bug}mail on $terms.Bug Creation"
+ },
+ {
+ name => "obsolete"
+ heading => "Is Obsolete"
+ },
+ {
+ name => "action"
+ heading => "Action"
+ content => ""
+ }
+ ]
+%]
+
+[% USE Bugzilla %]
+[% custom_fields = Bugzilla.get_fields({ custom => 1 }) %]
+
+[%# We want to display the type name of fields, not their type ID. %]
+[% overrides.type = {} %]
+
+[% FOREACH field_type = field_types.keys %]
+ [% overrides.type.type.$field_type = {
+ override_content => 1
+ content => field_types.$field_type
+ }
+ %]
+[% END %]
+
+
+[% overrides.action.obsolete = {
+ "1" => {
+ override_content => 1
+ content => "Delete"
+ override_contentlink => 1
+ contentlink => delete_contentlink
+ }
+ }
+%]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ overrides = overrides
+ data = custom_fields
+%]
+
+<p>
+ <a href="editfields.cgi?action=add">Add a new custom field</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl
new file mode 100644
index 0000000..2ea7c2f
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl
@@ -0,0 +1,161 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # value: Bugzilla::Field::Choice; The field value being deleted.
+ # value_count: number; The number of values available for this field.
+ # field: object; the field the value is being deleted from.
+ #%]
+
+[% title = BLOCK %]
+ Delete Value '[% value.name FILTER html %]' from the
+ '[% field.description FILTER html %]' ([% field.name FILTER html %]) field
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ style_urls = ['skins/standard/admin.css']
+%]
+
+<table border="1" cellpadding="4" cellspacing="0">
+<tr bgcolor="#6666FF">
+ <th valign="top" align="left">Field</th>
+ <th valign="top" align="left">Value</th>
+</tr>
+<tr>
+ <td valign="top">Field Name:</td>
+ <td valign="top">[% field.description FILTER html %]</td>
+</tr>
+<tr>
+ <td valign="top">Field Value:</td>
+ <td valign="top">[% value.name FILTER html %]</td>
+</tr>
+<tr>
+ <td valign="top">[% terms.Bugs %]:</td>
+ <td valign="top">
+[% IF value.bug_count %]
+ <a title="List of [% terms.bugs %] where '
+ [%- field.description FILTER html %]' is '
+ [%- value.name FILTER html %]'"
+ href="buglist.cgi?[% field.name FILTER url_quote %]=
+ [%- value.name FILTER url_quote %]">
+ [%- value.bug_count FILTER html %]</a>
+[% ELSE %]
+ None
+[% END %]
+ </td>
+</tr>
+</table>
+
+<h2>Confirmation</h2>
+
+[% IF value.is_default || value.bug_count || (value_count == 1)
+ || value.controls_visibility_of_fields.size
+ || value.controlled_values_array.size
+%]
+
+ <p>Sorry, but the '[% value.name FILTER html %]' value cannot be deleted
+ from the '[% field.description FILTER html %]' field for the following
+ reason(s):</p>
+
+ <ul class="warningmessages">
+ [% IF value.is_default %]
+ <li>'[% value.name FILTER html %]' is the default value for
+ the '[% field.description FILTER html %]' field.
+ [% IF user.in_group('tweakparams') %]
+ You first have to <a href="editparams.cgi?section=bugfields">change
+ the default value</a> for this field before you can delete
+ this value.
+ [% END %]
+ </li>
+ [% END %]
+
+ [% IF value.bug_count %]
+ <li>
+ [% IF value.bug_count > 1 %]
+ There are [% value.bug_count FILTER html %] [%+ terms.bugs %]
+ with this field value.
+ [% ELSE %]
+ There is 1 [% terms.bug %] with this field value.
+ [% END %]
+ You must change the field value on
+ <a title="List of [% terms.bugs %] where '
+ [%- field.description FILTER html %]' is '
+ [%- value.name FILTER html %]'"
+ href="buglist.cgi?[% field.name FILTER url_quote %]=
+ [%- value.name FILTER url_quote %]">
+ [% IF value.bug_count > 1 %]
+ those [% terms.bugs %]
+ [% ELSE %]
+ that [% terms.bug %]
+ [% END %]
+ </a>
+ to another value before you can delete this value.
+ </li>
+ [% END %]
+
+ [% IF value_count == 1 %]
+ <li>'[% value.name FILTER html %]' is the last value for
+ '[%- field.description FILTER html %]', and so it can not be deleted.
+ </li>
+ [% END %]
+
+ [% IF value.controls_visibility_of_fields.size %]
+ <li>This value controls the visibility of the following fields:<br>
+ [% FOREACH field = value.controls_visibility_of_fields %]
+ <a href="editfields.cgi?action=edit&name=
+ [%- field.name FILTER url_quote %]">
+ [%- field.description FILTER html %]
+ ([% field.name FILTER html %])</a><br>
+ [% END %]
+ </li>
+ [% END %]
+
+ [% IF value.controlled_values_array.size %]
+ <li>This value controls the visibility of the following values in
+ other fields:<br>
+ [% FOREACH field_name = value.controlled_values.keys %]
+ [% FOREACH controlled = value.controlled_values.${field_name} %]
+ <a href="editvalues.cgi?action=edit&field=
+ [%- controlled.field.name FILTER url_quote %]&value=
+ [%- controlled.name FILTER url_quote %]">
+ [% controlled.field.description FILTER html %]
+ ([% controlled.field.name FILTER html %]):
+ [%+ controlled.name FILTER html %]</a><br>
+ [% END %]
+ [% END %]
+ </li>
+ [% END %]
+ </ul>
+
+[% ELSE %]
+
+ <p>Do you really want to delete this value?</p>
+
+ <form method="post" action="editvalues.cgi">
+ <input type="submit" value="Yes, delete" id="delete">
+ <input type="hidden" name="action" value="delete">
+ <input type="hidden" name="field" value="[% field.name FILTER html %]">
+ <input type="hidden" name="value" value="[% value.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ </form>
+
+[% END %]
+
+[% PROCESS admin/fieldvalues/footer.html.tmpl
+ no_edit_link = 1
+ +%]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/fieldvalues/create.html.tmpl b/template/en/default/admin/fieldvalues/create.html.tmpl
new file mode 100644
index 0000000..f1eec1a
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/create.html.tmpl
@@ -0,0 +1,97 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # field: object; the field the value is being created for
+ #%]
+
+[% title = BLOCK %]
+ Add Value for the '[% field.description FILTER html %]' ([% field.name FILTER html %]) field
+[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+<p>
+ This page allows you to add a new value for the
+ '[% field.description FILTER html %]' field.
+</p>
+
+<form method="post" action="editvalues.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <th align="right"><label for="value">Value:</label></th>
+ <td>
+ <input id="value" name="value" size="30"
+ maxlength="[% constants.MAX_FIELD_VALUE_SIZE FILTER none %]">
+ </td>
+ </tr>
+ <tr>
+ <th align="right"><label for="sortkey">Sortkey:</label></th>
+ <td><input id="sortkey" name="sortkey" size="6" maxlength="6"></td>
+ </tr>
+ [% IF field.name == "bug_status" %]
+ <tr>
+ <th align="right"><label for="is_open">Status Type:</label></th>
+ <td>
+ <input type="radio" id="open_status" name="is_open" value="1"
+ checked="checked">
+ <label for="open_status">Open</label><br>
+ <input type="radio" id="closed_status" name="is_open" value="0">
+ <label for="closed_status">Closed (requires a Resolution)</label>
+ </td>
+ </tr>
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ Note: The open/close attribute can only be set now, when you create
+ the status. It cannot be edited later.
+ </td>
+ </tr>
+ [% END %]
+ [% IF field.value_field %]
+ <tr>
+ <th align="right">
+ <label for="visibility_value_id">Only appears when
+ [%+ field.value_field.description FILTER html %] is set to:
+ </label>
+ </th>
+ <td>
+ <select name="visibility_value_id" id="visibility_value_id">
+ <option></option>
+ [% FOREACH field_value = field.value_field.legal_values %]
+ [% NEXT IF field_value.name == '' %]
+ <option value="[% field_value.id FILTER none %]">
+ [%- field_value.name FILTER html -%]
+ </option>
+ [% END %]
+ </select>
+ <small>(Leave unset to have this value always appear.)</small>
+ </td>
+ </tr>
+ [% END %]
+ </table>
+ <input type="submit" id="create" value="Add">
+ <input type="hidden" name="action" value="new">
+ <input type="hidden" name='field' value="[% field.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+[% PROCESS admin/fieldvalues/footer.html.tmpl
+ no_add_link = 1
+ %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/fieldvalues/edit.html.tmpl b/template/en/default/admin/fieldvalues/edit.html.tmpl
new file mode 100644
index 0000000..5650ee8
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/edit.html.tmpl
@@ -0,0 +1,107 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # value: Bugzilla::Field::Choice; The field value we are editing.
+ # field: Bugzilla::Field; The field this value belongs to.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]
+ Edit Value '[% value.name FILTER html %]' for the
+ '[% field.description FILTER html %]' ([% field.name FILTER html %]) field
+[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+<form method="post" action="editvalues.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+
+ <tr>
+ <th valign="top" align="right">
+ <label for="value_new">Field Value:</label>
+ </th>
+ <td>
+ [% IF value.is_static %]
+ <input type="hidden" name="value_new" id="value_new"
+ value="[% value.name FILTER html %]">
+ [%- value.name FILTER html %]
+ [% ELSE %]
+ <input id="value_new" name="value_new" size="20"
+ maxlength="[% constants.MAX_FIELD_VALUE_SIZE FILTER none %]"
+ value="[% value.name FILTER html %]">
+ [% END %]
+ </td>
+ </tr>
+ <tr>
+ <th align="right"><label for="sortkey">Sortkey:</label></th>
+ <td><input id="sortkey" size="6" maxlength="6" name="sortkey"
+ value="[%- value.sortkey FILTER html %]"></td>
+ </tr>
+ [% IF field.name == "bug_status" %]
+ <tr>
+ <th align="right"><label for="is_open">Status Type:</label></th>
+ <td>[% IF value.is_open %]Open[% ELSE %]Closed[% END %]</td>
+ </tr>
+ [% END %]
+ [% IF field.value_field %]
+ <tr>
+ <th align="right">
+ <label for="visibility_value_id">Only appears when
+ [%+ field.value_field.description FILTER html %] is set to:
+ </label>
+ </th>
+ <td>
+ <select name="visibility_value_id" id="visibility_value_id">
+ <option></option>
+ [% FOREACH field_value = field.value_field.legal_values %]
+ [% NEXT IF field_value.name == '' %]
+ <option value="[% field_value.id FILTER none %]"
+ [% ' selected="selected"'
+ IF field_value.id == value.visibility_value.id %]>
+ [%- field_value.name FILTER html -%]
+ </option>
+ [% END %]
+ </select>
+ <small>(Leave unset to have this value always appear.)</small>
+ </td>
+ </tr>
+ [% END %]
+ <tr>
+ <th align="right"><label for="is_active">Enabled for [% terms.bugs %]:</label></th>
+ <td><input id="is_active" name="is_active" type="checkbox" value="1"
+ [%+ 'checked="checked"' IF value.is_active %]
+ [%+ 'disabled="disabled"' IF value.is_default OR value.is_static %]>
+ [% IF value.is_default %]
+ This value is selected as default in the parameters for this field. It cannot be disabled.
+ [% ELSIF value.is_static %]
+ This value is non-deletable and cannot be disabled.
+ [% END %]
+ </td>
+ </tr>
+ </table>
+ <input type="hidden" name="value" value="[% value.name FILTER html %]">
+ <input type="hidden" name="action" value="update">
+ <input type="hidden" name="field" value="[% field.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" id="update" value="Save Changes">
+</form>
+
+[% PROCESS admin/fieldvalues/footer.html.tmpl
+ no_edit_link = 1 %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/fieldvalues/footer.html.tmpl b/template/en/default/admin/fieldvalues/footer.html.tmpl
new file mode 100644
index 0000000..288612d
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/footer.html.tmpl
@@ -0,0 +1,55 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # value: string; the value being inserted/edited.
+ # field: object; the field which the value belongs/belonged to.
+ #
+ # no_XXX_link: boolean; if defined, then don't show the corresponding
+ # link. Supported parameters are:
+ #
+ # no_edit_link
+ # no_edit_other_link
+ # no_add_link
+ #%]
+
+<hr>
+
+<p>
+
+[% UNLESS no_add_link %]
+ <a title="Add a value for the '[% field.description FILTER html %]' field."
+ href="editvalues.cgi?action=add&amp;field=
+ [%- field.name FILTER url_quote %]">Add</a> a value.
+[% END %]
+
+[% IF value.defined && !no_edit_link %]
+ Edit value <a
+ title="Edit value '[% value.name FILTER html %]' for the '
+ [%- field.name FILTER html %]' field"
+ href="editvalues.cgi?action=edit&amp;field=
+ [%- field.name FILTER url_quote %]&amp;value=
+ [%- value.name FILTER url_quote %]">
+ '[% value.name FILTER html %]'</a>.
+[% END %]
+
+[% UNLESS no_edit_other_link %]
+ Edit other values for the <a
+ href="editvalues.cgi?field=
+ [%- field.name FILTER url_quote %]">'[% field.description FILTER html %]'</a> field.
+
+[% END %]
+
+</p>
diff --git a/template/en/default/admin/fieldvalues/list.html.tmpl b/template/en/default/admin/fieldvalues/list.html.tmpl
new file mode 100644
index 0000000..3f750eb
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/list.html.tmpl
@@ -0,0 +1,99 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # values: array of hashes having the following properties:
+ # - name: string; The value.
+ # - sortkey: number; The sortkey used to order the value when
+ # displayed to the user in a list.
+ #
+ # field: object; the field we are editing values for.
+ # static: array; list of values which cannot be renamed nor deleted.
+ #%]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]Select value for the '[% field.description FILTER html %]'
+ ([% field.name FILTER html %]) field[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+[% edit_contentlink = BLOCK %]editvalues.cgi?action=edit&amp;field=
+ [%- field.name FILTER url_quote %]&amp;value=%%name%%[% END %]
+[% delete_contentlink = BLOCK %]editvalues.cgi?action=del&amp;field=
+ [%- field.name FILTER url_quote %]&amp;value=%%name%%[% END %]
+
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit field value..."
+ contentlink => edit_contentlink
+ },
+ {
+ name => "sortkey"
+ heading => "Sortkey"
+ },
+ {
+ name => "isactive"
+ heading => "Enabled for $terms.bugs"
+ yesno_field => 1
+ },
+ {
+ name => "action"
+ heading => "Action"
+ content => "Delete"
+ contentlink => delete_contentlink
+ } ]
+%]
+
+
+[% SET overrides.action = {} %]
+[% FOREACH check_value = values %]
+ [% IF check_value.is_static %]
+ [% overrides.action.name.${check_value.name} = {
+ override_content => 1
+ content => "(Non-deletable value)"
+ override_contentlink => 1
+ contentlink => undef
+ }
+ %]
+ [% ELSIF check_value.is_default %]
+ [% overrides.action.name.${check_value.name} = {
+ override_content => 1
+ content => "(Default value)"
+ override_contentlink => 1
+ contentlink => undef
+ }
+ %]
+ [% END %]
+
+[% END %]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = values
+ overrides = overrides
+%]
+
+[% PROCESS admin/fieldvalues/footer.html.tmpl
+ no_edit_other_link = 1
+ %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/fieldvalues/select-field.html.tmpl b/template/en/default/admin/fieldvalues/select-field.html.tmpl
new file mode 100644
index 0000000..3704d42
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/select-field.html.tmpl
@@ -0,0 +1,47 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ #
+ #%]
+
+[%# INTERFACE:
+ # fields: Array of hashes. Each hash contains only one key, "name."
+ # The names are the same as the keys from field_descs
+ # (see global/field-descs.html.tmpl).
+ #%]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Edit values for which field?"
+%]
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit field values for..."
+ content_use_field = 1
+ contentlink => "editvalues.cgi?field=%%name%%"
+ }
+ ]
+%]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = fields
+%]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/flag-type/confirm-delete.html.tmpl b/template/en/default/admin/flag-type/confirm-delete.html.tmpl
new file mode 100644
index 0000000..ed90941
--- /dev/null
+++ b/template/en/default/admin/flag-type/confirm-delete.html.tmpl
@@ -0,0 +1,63 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]Confirm Deletion of Flag Type '[% flag_type.name FILTER html %]'[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ doc_section = "flags-overview.html#flags-delete"
+%]
+
+<p>
+ [% IF flag_type.flag_count %]
+ There are [% flag_type.flag_count %] flags of type [% flag_type.name FILTER html %].
+ If you delete this type, those flags will also be deleted.
+ [% END %]
+
+ Note that instead of deleting the type you can
+ <a href="editflagtypes.cgi?action=deactivate&amp;id=[% flag_type.id %]&amp;token=
+ [%- token FILTER html %]">deactivate it</a>,
+ in which case the type [% IF flag_type.flag_count %] and its flags [% END %] will remain
+ in the database but will not appear in the [% terms.Bugzilla %] UI.
+</p>
+
+<table>
+ <tr>
+ <td colspan="2">
+ Do you really want to delete this type?
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <a href="editflagtypes.cgi?action=delete&amp;id=[% flag_type.id %]&amp;token=
+ [%- token FILTER html %]">Yes, delete
+ </a>
+ </td>
+ <td align="right">
+ <a href="editflagtypes.cgi">
+ No, don't delete
+ </a>
+ </td>
+ </tr>
+</table>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/flag-type/edit.html.tmpl b/template/en/default/admin/flag-type/edit.html.tmpl
new file mode 100644
index 0000000..ebebf50
--- /dev/null
+++ b/template/en/default/admin/flag-type/edit.html.tmpl
@@ -0,0 +1,253 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Mark Bickford <markhb@maine.rr.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS "global/js-products.html.tmpl" %]
+
+[% IF type.target_type == "bug" %]
+ [% title = BLOCK %]Create Flag Type for [% terms.Bugs %][% END %]
+ [% typeLabelLowerPlural = BLOCK %][% terms.bugs %][% END %]
+ [% typeLabelLowerSingular = BLOCK %][% terms.bug %][% END %]
+[% ELSE %]
+ [% title = "Create Flag Type for Attachments" %]
+ [% typeLabelLowerPlural = BLOCK %]attachments[% END %]
+ [% typeLabelLowerSingular = BLOCK %]attachment[% END %]
+[% END %]
+
+[% doc_section = "flags-overview.html#flags-create" %]
+[% IF last_action == "copy" %]
+ [% title = BLOCK %]Create Flag Type Based on [% type.name FILTER html %][% END %]
+[% ELSIF last_action == "edit" %]
+ [% title = BLOCK %]Edit Flag Type [% type.name FILTER html %][% END %]
+ [% doc_section = "flags-overview.html#flags-edit" %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ style = "
+ table#form th { text-align: right; vertical-align: baseline; white-space: nowrap; }
+ table#form td { text-align: left; vertical-align: baseline; }
+ "
+ onload="var f = document.forms[0]; selectProduct(f.product, f.component, null, null, '__Any__');"
+ javascript_urls=["js/productform.js"]
+ doc_section = doc_section
+%]
+
+<form method="post" action="editflagtypes.cgi">
+ <input type="hidden" name="action" value="[% action %]">
+ <input type="hidden" name="id" value="[% type.id %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="hidden" name="target_type" value="[% type.target_type %]">
+ [% FOREACH category = type.inclusions %]
+ <input type="hidden" name="inclusions" value="[% category.value FILTER html %]">
+ [% END %]
+ [% FOREACH category = type.exclusions %]
+ <input type="hidden" name="exclusions" value="[% category.value FILTER html %]">
+ [% END %]
+
+ [%# Add a hidden button at the top of the form so that the user pressing "return"
+ # really submit the form, as expected. %]
+ <input type="submit" id="commit" value="Submit" style="display: none;">
+
+ <table id="form" cellspacing="0" cellpadding="4" border="0">
+ <tr>
+ <th>Name:</th>
+ <td>
+ a short name identifying this type<br>
+ <input type="text" name="name" value="[% type.name FILTER html %]"
+ size="50" maxlength="50">
+ </td>
+ </tr>
+
+ <tr>
+ <th>Description:</th>
+ <td>
+ a comprehensive description of this type<br>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'description'
+ minrows = 4
+ cols = 80
+ defaultcontent = type.description
+ %]
+ </td>
+ </tr>
+
+ <tr>
+ <th>Category:</th>
+
+ <td>
+ the products/components to which [% typeLabelLowerPlural %] must
+ (inclusions) or must not (exclusions) belong in order for users
+ to be able to set flags of this type for them
+ <table>
+ <tr>
+ <td style="vertical-align: top;">
+ <b>Product/Component:</b><br>
+ <select name="product" onchange="selectProduct(this, this.form.component, null, null, '__Any__');">
+ <option value="">__Any__</option>
+ [% FOREACH prod = products %]
+ <option value="[% prod.name FILTER html %]"
+ [% "selected" IF type.product.name == prod.name %]>
+ [% prod.name FILTER html %]</option>
+ [% END %]
+ </select><br>
+ <select name="component">
+ <option value="">__Any__</option>
+ [% FOREACH comp = components %]
+ <option value="[% comp FILTER html %]"
+ [% "selected" IF type.component.name == comp %]>
+ [% comp FILTER html %]</option>
+ [% END %]
+ </select><br>
+ <input type="submit" name="categoryAction-include" value="Include">
+ <input type="submit" name="categoryAction-exclude" value="Exclude">
+ </td>
+ <td style="vertical-align: top;">
+ <b>Inclusions:</b><br>
+ [% PROCESS "global/select-menu.html.tmpl" name="inclusion_to_remove" multiple="1" size="7" options=type.inclusions %]<br>
+ <input type="submit" name="categoryAction-removeInclusion" value="Remove Inclusion">
+ </td>
+ <td style="vertical-align: top;">
+ <b>Exclusions:</b><br>
+ [% PROCESS "global/select-menu.html.tmpl" name="exclusion_to_remove" multiple="1" size="7" options=type.exclusions %]<br>
+ <input type="submit" name="categoryAction-removeExclusion" value="Remove Exclusion">
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <th>Sort Key:</th>
+ <td>
+ a number between 1 and 32767 by which this type will be sorted
+ when displayed to users in a list; ignore if you don't care
+ what order the types appear in or if you want them to appear
+ in alphabetical order<br>
+ <input type="text" name="sortkey" value="[% type.sortkey || 1 %]" size="5" maxlength="5">
+ </td>
+ </tr>
+
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <input type="checkbox" id="is_active" name="is_active"
+ [% " checked" IF type.is_active || !type.is_active.defined %]>
+ <label for="is_active">active (flags of this type appear in the UI and can be set)</label>
+ </td>
+ </tr>
+
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <input type="checkbox" id="is_requestable" name="is_requestable"
+ [% " checked" IF type.is_requestable || !type.is_requestable.defined %]>
+ <label for="is_requestable">requestable (users can ask for flags of this type to be set)</label>
+ </td>
+ </tr>
+
+ <tr>
+ <th>CC List:</th>
+ <td>
+ if requestable, who should get carbon copied on email notification of requests.
+ This is a comma-separated list of full e-mail addresses which do not
+ need to be [% terms.Bugzilla %] logins.
+ [% IF Param('emailsuffix') %]
+ Note that the configured emailsuffix
+ <kbd>[% Param('emailsuffix') %]</kbd> will <em>not</em> be appended
+ to these addresses, so you should add it explicitly if so desired.
+ [% END %]<br>
+ <input type="text" name="cc_list" value="[% type.cc_list FILTER html %]" size="80" maxlength="200">
+ </td>
+ </tr>
+
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <input type="checkbox" id="is_requesteeble" name="is_requesteeble"
+ [% " checked" IF type.is_requesteeble || !type.is_requesteeble.defined %]>
+ <label for="is_requesteeble">specifically requestable (users can ask specific other users
+ to set flags of this type as opposed to just asking the wind)</label>
+ </td>
+ </tr>
+
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <input type="checkbox" id="is_multiplicable" name="is_multiplicable"
+ [% " checked" IF type.is_multiplicable || !type.is_multiplicable.defined %]>
+ <label for="is_multiplicable">multiplicable (multiple flags of this type can be set on
+ the same [% typeLabelLowerSingular %])</label>
+ </td>
+ </tr>
+
+ <tr>
+ <th>Grant Group:</th>
+ <td>
+ the group allowed to grant/deny flags of this type
+ (to allow all users to grant/deny these flags, select no group)<br>
+ [% PROCESS select selname = "grant_group" %]
+ </td>
+ </tr>
+
+ <tr>
+ <th>Request Group:</th>
+ <td>
+ if flags of this type are requestable, the group allowed to request them
+ (to allow all users to request these flags, select no group)<br>
+ Note that the request group alone has no effect if the grant group is not defined!<br>
+ [% PROCESS select selname = "request_group" %]
+ </td>
+ </tr>
+
+ <tr>
+ <th></th>
+ <td>
+ <input type="submit" id="save" value="
+ [%- IF (last_action == "enter" || last_action == "copy") %]Create
+ [%- ELSE %]Save Changes
+ [%- END %]">
+ </td>
+ </tr>
+
+ </table>
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
+
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+ <select name="[% selname %]" id="[% selname %]">
+ <option value="">(no group)</option>
+ [% FOREACH group = groups %]
+ <option value="[% group.name FILTER html %]"
+ [% " selected" IF (type.${selname} && type.${selname}.name == group.name) %]>
+ [%- group.name FILTER html %]
+ </option>
+ [% END %]
+ </select>
+[% END %]
diff --git a/template/en/default/admin/flag-type/list.html.tmpl b/template/en/default/admin/flag-type/list.html.tmpl
new file mode 100644
index 0000000..220db89
--- /dev/null
+++ b/template/en/default/admin/flag-type/list.html.tmpl
@@ -0,0 +1,174 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS "global/js-products.html.tmpl" %]
+
+[% PROCESS global/header.html.tmpl
+ title = 'Administer Flag Types'
+ style = "
+ table#flag_types_bugs tr th,
+ table#flag_types_attachments tr th { text-align: left; }
+ .inactive { color: #787878; }
+ .multiplicable { display: block; }
+ "
+ onload="var f = document.flagtype_form; selectProduct(f.product, f.component, null, null, '__All__');"
+ javascript_urls=["js/productform.js"]
+ doc_section = "flags-overview.html#flag-types"
+%]
+
+<p>
+ Flags are markers that identify whether [% terms.abug %] or attachment has been granted
+ or denied some status. Flags appear in the UI as a name and a status symbol
+ ("+" for granted, "-" for denied, and "?" for statuses requested by users).
+</p>
+
+<p>
+ For example, you might define a "review" status for users to request review
+ for their patches. When a patch writer requests review, the string "review?"
+ will appear in the attachment. When a patch reviewer reviews the patch,
+ either the string "review+" or the string "review-" will appear in the patch,
+ depending on whether the patch passed or failed review.
+</p>
+
+<p>
+ You can restrict the list of flag types to those available for a given product
+ and component. If a product is selected with no component, only flag types
+ which are available to at least one component of the product are shown.
+</p>
+
+<form id="flagtype_form" name="flagtype_form" action="editflagtypes.cgi" method="get">
+ <table>
+ <tr>
+ <th><label for="product">Product:</label></th>
+ <td>
+ <select name="product" onchange="selectProduct(this, this.form.component, null, null, '__Any__');">
+ <option value="">__Any__</option>
+ [% FOREACH prod = products %]
+ <option value="[% prod.name FILTER html %]"
+ [% " selected" IF selected_product == prod.name %]>
+ [% prod.name FILTER html %]</option>
+ [% END %]
+ </select>
+ </td>
+ <th><label for="component">Component:</label></th>
+ <td>
+ <select name="component">
+ <option value="">__Any__</option>
+ [% FOREACH comp = components %]
+ <option value="[% comp FILTER html %]"
+ [% " selected" IF selected_component == comp %]>
+ [% comp FILTER html %]</option>
+ [% END %]
+ </select>
+ </td>
+ <td>
+ <input type="checkbox" id="show_flag_counts" name="show_flag_counts" value="1"
+ [%+ 'checked="checked"' IF show_flag_counts %]>
+ <label for="show_flag_counts">Show flag counts</label>
+ </td>
+ <td><input type="submit" id="submit" value="Filter"></td>
+ </tr>
+ </table>
+</form>
+
+<h3>Flag Types for [% terms.Bugs %]</h3>
+
+[% PROCESS display_flag_types types=bug_types types_id='bugs' %]
+
+<p>
+ <a href="editflagtypes.cgi?action=enter&amp;target_type=bug">Create Flag Type for [% terms.Bugs %]</a>
+</p>
+
+<h3>Flag Types for Attachments</h3>
+
+[% PROCESS display_flag_types types=attachment_types types_id='attachments' %]
+
+<p>
+ <a href="editflagtypes.cgi?action=enter&amp;target_type=attachment">Create Flag Type For Attachments</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
+
+
+[% BLOCK display_flag_types %]
+ <table id="flag_types_[% types_id FILTER html %]" cellspacing="0" cellpadding="4" border="1">
+
+ <tr>
+ <th>Edit name ...</th>
+ <th>Description</th>
+ <th>Sortkey</th>
+ <th>Properties</th>
+ <th>Grant group</th>
+ <th>Request group</th>
+ [% IF show_flag_counts %]
+ <th>Flags</th>
+ [%# Note to translators: translate the strings in quotes only. %]
+ [% state_desc = {granted = 'granted' denied = 'denied' pending = 'pending'} %]
+ [% END %]
+ <th>Actions</th>
+ </tr>
+
+ [% FOREACH type = types %]
+
+ <tr class="[% IF type.is_active %]active[% ELSE %]inactive[% END %]">
+ <td><a href="editflagtypes.cgi?action=edit&amp;id=[% type.id %]">[% type.name FILTER html FILTER no_break %]</a></td>
+ <td>[% type.description FILTER html %]</td>
+ <td align="right">[% type.sortkey FILTER html %]</td>
+ <td>
+ [% IF type.is_requestable %]
+ <span class="requestable">requestable</span>
+ [% END %]
+ [% IF type.is_requestable && type.is_requesteeble %]
+ <span class="requesteeble">(specifically)</span>
+ [% END %]
+ [% IF type.is_multiplicable %]
+ <span class="multiplicable">multiplicable</span>
+ [% END %]
+ </td>
+ <td>[% IF type.grant_group %][% type.grant_group.name FILTER html %][% END %]</td>
+ <td>[% IF type.request_group %][% type.request_group.name FILTER html %][% END %]</td>
+ [% IF show_flag_counts %]
+ <td>
+ [% FOREACH state = ['granted', 'pending', 'denied'] %]
+ [% bug_list = bug_lists.${type.id}.$state || [] %]
+ [% IF bug_list.size %]
+ <a href="buglist.cgi?bug_id=[% bug_list.unique.nsort.join(",") FILTER html %]">
+ [% bug_list.size FILTER html %] [%+ state_desc.$state FILTER html %]
+ </a>
+ <br>
+ [% ELSE %]
+ 0 [% state_desc.$state FILTER html %]<br>
+ [% END %]
+ [% END %]
+ </td>
+ [% END %]
+ <td>
+ <a href="editflagtypes.cgi?action=copy&amp;id=[% type.id %]">Copy</a>
+ | <a href="editflagtypes.cgi?action=confirmdelete&amp;id=[% type.id %]">Delete</a>
+ </td>
+ </tr>
+
+ [% END %]
+
+ </table>
+[% END %]
diff --git a/template/en/default/admin/groups/confirm-remove.html.tmpl b/template/en/default/admin/groups/confirm-remove.html.tmpl
new file mode 100644
index 0000000..cdb070d
--- /dev/null
+++ b/template/en/default/admin/groups/confirm-remove.html.tmpl
@@ -0,0 +1,66 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@syndicomm.com>
+ # Joel Peshkin <bugreport@peshkin.net>
+ # Jacob Steenhagen <jake@bugzilla.org>
+ # Vlad Dascalu <jocuri@softhome.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # group: The Bugzilla::Group being changed.
+ # regexp: the regexp according to which the update is performed.
+ #%]
+
+[% IF regexp %]
+ [% title = "Confirm: Remove Explicit Members in the Regular Expression?" %]
+[% ELSE %]
+ [% title = "Confirm: Remove All Explicit Members?" %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ doc_section = "groups.html"
+%]
+
+[% IF regexp %]
+ <p>This option will remove all users from '[% group.name FILTER html %]'
+ whose login names match the regular expression:
+ '[% regexp FILTER html %]'</p>
+[% ELSE %]
+ <p>This option will remove all explicitly defined users
+ from '[% group.name FILTER html %].'</p>
+[% END %]
+
+<p>Generally, you will only need to do this when upgrading groups
+ created with [% terms.Bugzilla %] versions 2.16 and earlier. Use
+ this option with <b>extreme care</b> and consult the documentation
+ for further information.
+</p>
+
+<form method="post" action="editgroups.cgi">
+ <input type="hidden" name="group_id" value="[% group.id FILTER html %]">
+ <input type="hidden" name="regexp" value="[% regexp FILTER html %]">
+ <input type="hidden" name="action" value="remove_regexp">
+
+ <input name="token" type="hidden" value="[% token FILTER html %]">
+ <input name="confirm" type="submit" value="Confirm">
+ <p>Or <a href="editgroups.cgi">return to the Edit Groups page</a>.</p>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/groups/create.html.tmpl b/template/en/default/admin/groups/create.html.tmpl
new file mode 100644
index 0000000..b3ac723
--- /dev/null
+++ b/template/en/default/admin/groups/create.html.tmpl
@@ -0,0 +1,102 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@syndicomm.com>
+ # Joel Peshkin <bugreport@peshkin.net>
+ # Jacob Steenhagen <jake@bugzilla.org>
+ # Vlad Dascalu <jocuri@softhome.net>
+ #%]
+
+[%# INTERFACE:
+ # none
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Add group"
+ subheader = "This page allows you to define a new user group."
+ doc_section = "groups.html#create-groups"
+%]
+
+<form method="post" action="editgroups.cgi">
+ <table border="1" cellpadding="4" cellspacing="0"><tr>
+ <th>New Name</th>
+ <th>New Description</th>
+ <th>New User RegExp</th>
+ <th>Use For [% terms.Bugs %]</th>
+ </tr><tr>
+ <td><input size="20" name="name"></td>
+ <td><input size="40" name="desc"></td>
+ <td><input size="30" name="regexp"></td>
+ <td><input type="checkbox" name="isactive" value="1" checked></td>
+ </tr>
+ <tr>
+ <th>Icon URL:</th>
+ <td colspan="3"><input type="text" size="70" maxlength="255" id="icon_url" name="icon_url"></td>
+ </tr>
+ [% Hook.process('field') %]
+ </table>
+
+ <hr>
+
+ <input type="checkbox" id="insertnew" name="insertnew" value="1"
+ [% IF Param("makeproductgroups") %] checked[% END %]>
+ <label for="insertnew">Insert new group into all existing products.</label>
+ <p>
+ <input type="submit" id="create" value="Add">
+ <input type="hidden" name="action" value="new">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+<p><b>Name</b> is what is used with the B<!-- blah -->ugzilla->user->in_group()
+function in any customized cgi files you write that use a given group.
+It can also be used by people submitting [% terms.bugs %] by email to
+limit [% terms.abug %] to a certain set of groups.</p>
+
+<p><b>Description</b> is what will be shown in the [% terms.bug %] reports
+to members of the group where they can choose whether
+the [% terms.bug %] will be restricted to others in the same group.</p>
+
+<p>The <b>Use For [% terms.Bugs %]</b> flag determines whether or not the
+group is eligible to be used for [% terms.bugs %]. If you clear this, it will
+no longer be possible for users to add [% terms.bugs %] to this group,
+although [% terms.bugs %] already in the group will remain in the group.
+Doing so is a much less drastic way to stop a group from growing
+than deleting the group would be. <b>Note: If you are creating
+a group, you probably want it to be usable for [% terms.bugs %], in which
+case you should leave this checked.</b></p>
+
+<p><b>User RegExp</b> is optional, and if filled in, will
+automatically grant membership to this group to anyone with an
+email address that matches this regular expression.</p>
+
+<p>
+ <b>Icon URL</b> is optional, and is the URL pointing to the icon
+ used to identify the group. It may be either a relative URL to the base URL
+ of this installation or an absolute URL. This icon will be displayed
+ in comments in [% terms.bugs %] besides the name of the author of comments.
+</p>
+
+<p>By default, the new group will be associated with existing
+products. Unchecking the "Insert new group into all existing
+products" option will prevent this and make the group become
+visible only when its controls have been added to a product.</p>
+
+<p>Back to the <a href="./">main [% terms.bugs %] page</a>
+
+or to the <a href="editgroups.cgi">group list</a>.
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/groups/delete.html.tmpl b/template/en/default/admin/groups/delete.html.tmpl
new file mode 100644
index 0000000..9d32da4
--- /dev/null
+++ b/template/en/default/admin/groups/delete.html.tmpl
@@ -0,0 +1,187 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@syndicomm.com>
+ # Joel Peshkin <bugreport@peshkin.net>
+ # Jacob Steenhagen <jake@bugzilla.org>
+ # Vlad Dascalu <jocuri@softhome.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # group: A Bugzilla::Group object representing the group that is
+ # about to be deleted.
+ # shared_queries: int; The number of queries being shared with this
+ # group.
+ #%]
+
+
+[% PROCESS global/header.html.tmpl
+ title = "Delete group"
+ doc_section = "groups.html"
+%]
+
+<table border="1">
+ <tr>
+ <th>Id</th>
+ <th>Name</th>
+ <th>Description</th>
+ </tr>
+ <tr>
+ <td>[% group.id FILTER html %]</td>
+ <td>[% group.name FILTER html %]</td>
+ <td>[% group.description FILTER html_light %]</td>
+ </tr>
+</table>
+
+<form method="post" action="editgroups.cgi">
+ [% IF group.members_non_inherited.size %]
+ <p><b>[% group.members_non_inherited.size FILTER html %] users belong
+ directly to this group. You cannot delete this group while there are
+ users in it.</b>
+
+ <br><a href="editusers.cgi?action=list&amp;groupid=
+ [%- group.id FILTER url_quote %]&amp;grouprestrict=1">Show
+ me which users</a> - <label><input type="checkbox" name="removeusers">Remove
+ all users from this group for me.</label></p>
+ [% END %]
+
+ [% IF group.granted_by_direct(constants.GROUP_MEMBERSHIP).size %]
+ <p><b>Members of this group inherit membership in the following groups:</b></p>
+ <ul>
+ [% FOREACH grantor = group.granted_by_direct(constants.GROUP_MEMBERSHIP) %]
+ <li>[% grantor.name FILTER html %]</li>
+ [% END %]
+ </ul>
+ [% END %]
+
+ [% IF group.bugs.size %]
+ <p><b>[% group.bugs.size FILTER html %] [%+ terms.bug %] reports are
+ visible only to this group. You cannot delete this group while any
+ [%+ terms.bugs %] are using it.</b>
+
+ <br><a href="buglist.cgi?field0-0-0=bug_group&amp;type0-0-0=equals&amp;value0-0-0=
+ [%- group.name FILTER url_quote %]">Show me
+ which [% terms.bugs %]</a> -
+ <label><input type="checkbox" name="removebugs">Remove
+ all [% terms.bugs %] from this group restriction for me.</label></p>
+
+ <p><b>NOTE:</b> It's quite possible to make confidential [% terms.bugs %]
+ public by checking this box. It is <B>strongly</B> suggested
+ that you review the [% terms.bugs %] in this group before checking
+ the box.</p>
+ [% END %]
+
+ [% IF group.products.size %]
+ <p><b>This group is tied to the following products:</b></p>
+ [% SET any_hidden = 0 %]
+ <ul>
+ [% FOREACH data = group.products %]
+
+ [% SET active = [] %]
+ [% FOREACH control = data.controls.keys.sort %]
+ [% NEXT IF !data.controls.$control %]
+ [% IF control == 'othercontrol' OR control == 'membercontrol' %]
+ [% SWITCH data.controls.$control %]
+ [% CASE constants.CONTROLMAPMANDATORY %]
+ [% SET type = "Mandatory" %]
+ [% CASE constants.CONTROLMAPSHOWN %]
+ [% SET type = "Shown" %]
+ [% CASE constants.CONTROLMAPDEFAULT %]
+ [% SET type = "Default" %]
+ [% END %]
+ [% active.push("$control: $type") %]
+ [% ELSE %]
+ [% active.push(control) %]
+ [% END %]
+ [% END %]
+
+ [% SET hidden = 0 %]
+ [% IF data.controls.othercontrol == constants.CONTROLMAPMANDATORY
+ AND data.controls.membercontrol == constants.CONTROLMAPMANDATORY
+ AND data.controls.entry
+ %]
+ [% SET hidden = 1 %]
+ [% END %]
+
+ <li><a href="editproducts.cgi?action=editgroupcontrols&amp;product=
+ [%- data.product.name FILTER url_quote %]">
+ [%- data.product.name FILTER html %]</a>
+ ([% active.join(', ') FILTER html %])
+ [% IF hidden %]
+ <strong>WARNING: This product is currently hidden.
+ Deleting this group will make this product publicly visible.
+ </strong>
+ [% END %]</li>
+ [% END %]
+ </ul>
+
+ <p><label><input type="checkbox" name="unbind">Delete this group anyway,
+ and remove these controls.</label></p>
+ [% END %]
+
+ [% IF group.flag_types.size %]
+ <p><b>This group restricts who can make changes to flags of certain types.
+ You cannot delete this group while there are flag types using it.</b>
+
+ <br><a href="editflagtypes.cgi?action=list&amp;group=
+ [%- group.id FILTER url_quote %]">Show
+ me which types</a> -
+ <label><input type="checkbox" name="removeflags">Remove all
+ flag types from this group for me.</label></p>
+ [% END %]
+
+ [% IF shared_queries %]
+ <p>
+ <b>There
+ [% IF shared_queries > 1 %]
+ are [% shared_queries %] saved searches
+ [% ELSE %]
+ is a saved search
+ [% END %]
+ being shared with this group.</b>
+ If you delete this group,
+ [% IF shared_queries > 1 %]
+ these saved searches
+ [% ELSE %]
+ this saved search
+ [% END %]
+ will fall back to being private again.
+ </p>
+ [% END %]
+
+ <h2>Confirmation</h2>
+
+ <p>Do you really want to delete this group?</p>
+ [% IF group.users.size || group.bugs.size || group.products.size
+ || group.flags.size
+ %]
+ <p><b>You must check all of the above boxes or correct the
+ indicated problems first before you can proceed.</b></p>
+ [% END %]
+
+ <p>
+ <input type="submit" id="delete" value="Yes, delete">
+ <input type="hidden" name="action" value="delete">
+ <input type="hidden" name="group" value="[% group.id FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ </p>
+</form>
+
+Go back to the <a href="editgroups.cgi">group list</a>.
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/groups/edit.html.tmpl b/template/en/default/admin/groups/edit.html.tmpl
new file mode 100644
index 0000000..f7fd308
--- /dev/null
+++ b/template/en/default/admin/groups/edit.html.tmpl
@@ -0,0 +1,249 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@syndicomm.com>
+ # Joel Peshkin <bugreport@peshkin.net>
+ # Jacob Steenhagen <jake@bugzilla.org>
+ # Vlad Dascalu <jocuri@softhome.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # group - A Bugzilla::Group representing the group being edited.
+ # *_current - Arrays of Bugzilla::Group objects that show the current
+ # values for this group, as far as grants.
+ # *_available - Arrays of Bugzilla::Group objects that show the current
+ # available values for each grant.
+ #%]
+
+[% title = BLOCK %]Change Group: [% group.name FILTER html %][% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ doc_section = "groups.html#edit-groups"
+ style = "
+ .grant_table { border-collapse: collapse; }
+ .grant_table td, .grant_table th {
+ padding-left: .5em;
+ }
+ .grant_table td.one, .grant_table th.one {
+ border-right: 1px solid black;
+ padding-right: .5em;
+ }
+ "
+%]
+
+<form method="post" action="editgroups.cgi">
+ <input type="hidden" name="action" value="postchanges">
+ <input type="hidden" name="group_id" value="[% group.id FILTER html %]">
+
+ <table border="1" cellpadding="4">
+ <tr>
+ <th>Group:</th>
+ <td>
+ [% IF group.is_bug_group %]
+ <input type="text" name="name" size="60"
+ value="[% group.name FILTER html %]">
+ [% ELSE %]
+ [% group.name FILTER html %]
+ [% END %]
+ </td>
+ </tr>
+
+ <tr>
+ <th>Description:</th>
+ <td>
+ [% IF group.is_bug_group %]
+ <input type="text" name="desc" size="70"
+ value="[% group.description FILTER html %]">
+ [% ELSE %]
+ [% group.description FILTER html %]
+ [% END %]
+ </td>
+ </tr>
+
+ <tr>
+ <th>User Regexp:</th>
+ <td>
+ <input type="text" name="regexp" size="40"
+ value="[% group.user_regexp FILTER html %]">
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ Icon URL:
+ [% IF group.icon_url %]
+ <img src="[% group.icon_url FILTER html %]" alt="[% group.name FILTER html %]">
+ [% END %]
+ </th>
+ <td>
+ <input type="text" name="icon_url" size="70" maxlength="255"
+ value="[% group.icon_url FILTER html %]">
+ </td>
+ </tr>
+
+ [% IF group.is_bug_group %]
+ <tr>
+ <th>Use For [% terms.Bugs %]:</th>
+ <td>
+ <input type="checkbox" name="isactive"
+ value="1" [% 'checked="checked"' IF group.is_active %]>
+ </td>
+ </tr>
+ [% END %]
+ [% Hook.process('field') %]
+ </table>
+
+ <h4>Group Permissions</h4>
+
+ <table class="grant_table">
+ <tr>
+ <th class="one">Groups That Are a Member of This Group<br>
+ (&quot;Users in <var>X</var> are automatically in
+ [%+ group.name FILTER html %]&quot;)</th>
+ <th>Groups That This Group Is a Member Of<br>
+ (&quot;If you are in [% group.name FILTER html %], you are
+ automatically also in...&quot;)</th>
+ </tr>
+ <tr>
+ <td class="one">
+ [% PROCESS select_pair name = "members" size = 10
+ items_available = members_available
+ items_current = members_current %]
+ </td>
+
+ <td>[% PROCESS select_pair name = "member_of" size = 10
+ items_available = member_of_available
+ items_current = member_of_current %]</td>
+ </tr>
+ </table>
+
+ <table class="grant_table">
+ <tr>
+ <th class="one">
+ Groups That Can Grant Membership in This Group<br>
+ (&quot;Users in <var>X</var> can add other users to
+ [%+ group.name FILTER html %]&quot;)
+
+ </th>
+ <th>Groups That This Group Can Grant Membership In<br>
+ (&quot;Users in [% group.name FILTER html %] can add users to...&quot;)
+ </th>
+ </tr>
+ <tr>
+ <td class="one">
+ [% PROCESS select_pair name = "bless_from" size = 10
+ items_available = bless_from_available
+ items_current = bless_from_current %]
+ </td>
+ <td>[% PROCESS select_pair name = "bless_to" size = 10
+ items_available = bless_to_available
+ items_current = bless_to_current %]
+ </td>
+ </tr>
+ </table>
+
+ [% IF Param('usevisibilitygroups') %]
+ <table class="grant_table">
+ <tr>
+ <th class="one">
+ Groups That Can See This Group<br>
+ (&quot;Users in <var>X</var> can see users in
+ [%+ group.name FILTER html %]&quot;)
+ </th>
+ <th>Groups That This Group Can See<br>
+ (&quot;Users in [% group.name FILTER html %] can see users in...&quot;)
+ </th>
+ </tr>
+ <tr>
+ <td class="one">
+ [% PROCESS select_pair name = "visible_from" size = 10
+ items_available = visible_from_available
+ items_current = visible_from_current %]
+ </td>
+ <td>[% PROCESS select_pair name = "visible_to_me" size = 10
+ items_available = visible_to_me_available
+ items_current = visible_to_me_current %]
+ </td>
+ </tr>
+ </table>
+ [% END %]
+
+ <input type="submit" value="Update Group">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+<h4>Mass Remove</h4>
+
+<p>You can use this form to do mass-removal of users from groups.
+ This is often very useful if you upgraded from [% terms.Bugzilla %]
+ 2.16.</p>
+
+<table><tr><td>
+<form method="post" action="editgroups.cgi">
+ <fieldset>
+ <legend>Remove all explicit memberships from users whose login names
+ match the following regular expression:</legend>
+ <input type="text" size="20" name="regexp">
+ <input type="submit" value="Remove Memberships">
+
+ <p>If you leave the field blank, all explicit memberships in
+ this group will be removed.</p>
+
+ <input type="hidden" name="action" value="confirm_remove">
+ <input type="hidden" name="group_id" value="[% group.id FILTER html %]">
+ </fieldset>
+</form>
+</td></tr></table>
+
+<p>Back to the <a href="editgroups.cgi">group list</a>.</p>
+
+[% PROCESS global/footer.html.tmpl %]
+
+[% BLOCK select_pair %]
+ <table class="select_pair">
+ <tr>
+ <th><label for="[% "${name}_add" FILTER html %]">Add<br>
+ (select to add)</label></th>
+ <th><label for="[% "${name}_remove" FILTER html %]">Current<br>
+ (select to remove)</label></th>
+ </tr>
+ <tr>
+ <td>
+ <select multiple="multiple" size="[% size FILTER html %]"
+ name="[% "${name}_add" FILTER html %]"
+ id="[% "${name}_add" FILTER html %]">
+ [% FOREACH item = items_available %]
+ <option value="[% item.id FILTER html %]">
+ [% item.name FILTER html %]</option>
+ [% END %]
+ </select>
+ </td>
+ <td>
+ <select multiple="multiple" size="[% size FILTER html %]"
+ name="[% "${name}_remove" FILTER html %]"
+ id="[% "${name}_remove" FILTER html %]">
+ [% FOREACH item = items_current %]
+ <option value="[% item.id FILTER html %]">
+ [% item.name FILTER html %]</option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ </table>
+[% END %]
diff --git a/template/en/default/admin/groups/list.html.tmpl b/template/en/default/admin/groups/list.html.tmpl
new file mode 100644
index 0000000..1d137dc
--- /dev/null
+++ b/template/en/default/admin/groups/list.html.tmpl
@@ -0,0 +1,168 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@syndicomm.com>
+ # Joel Peshkin <bugreport@peshkin.net>
+ # Jacob Steenhagen <jake@bugzilla.org>
+ # Vlad Dascalu <jocuri@softhome.net>
+ #%]
+
+[%# INTERFACE:
+ # groups: array with group objects having the properties:
+ # - id: number. The ID of the group.
+ # - name: string. The name of the group.
+ # - description: string. The description of the group.
+ # - userregexp: string. The user regexp for the given group.
+ # - isactive: boolean int. Specifies if the group is active or not.
+ # - isbuggroup: boolean int. Specifies if it can be used for bugs.
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Edit Groups"
+ subheader = "This lets you edit the groups available to put users in."
+ doc_section = "groups.html"
+%]
+
+[% edit_contentlink = "editgroups.cgi?action=changeform&amp;group=%%id%%" %]
+[% del_contentlink = "editgroups.cgi?action=del&amp;group=%%id%%" %]
+
+[% columns =
+ [{name => 'name'
+ heading => 'Name'
+ contentlink => edit_contentlink
+ }
+ {name => 'description'
+ heading => 'Description'
+ allow_html_content => 1
+ }
+ {name => 'userregexp'
+ heading => 'User RegExp'
+ }
+ {name => 'is_active_bug_group'
+ heading => "Use For $terms.Bugs"
+ align => 'center'
+ }
+ {name => 'type'
+ heading => 'Type'
+ align => 'center'
+ }
+ {name => 'action'
+ heading => 'Action'
+ }
+ ]
+%]
+
+[% overrides.is_active_bug_group = {
+ 'is_active_bug_group' => {
+ "0" => {
+ override_content => 1
+ content => "&nbsp;"
+ }
+ "1" => {
+ override_content => 1
+ content => "X"
+ }
+ }
+ }
+
+ overrides.userregexp = {
+ 'userregexp' => {
+ "" => {
+ override_content => 1
+ content => "&nbsp;"
+ }
+ }
+ }
+%]
+
+[% FOREACH group IN ["chartgroup", "insidergroup", "timetrackinggroup", "querysharegroup"] %]
+ [% special_group = Param(group) %]
+
+ [% IF special_group %]
+ [% overrides.action.name.$special_group = {
+ override_content => 1
+ content => "(used as the '$group')"
+ }
+ %]
+ [% END %]
+[% END %]
+
+[% overrides.action.isbuggroup = {
+ "1" => {
+ override_content => 1
+ content => "Delete"
+ override_contentlink => 1
+ contentlink => del_contentlink
+ }
+ }
+
+ overrides.type.isbuggroup = {
+ "0" => {
+ override_content => 1
+ content => "system"
+ }
+ "1" => {
+ override_content => 1
+ content => "user"
+ }
+ }
+%]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = groups
+ overrides = overrides
+%]
+
+<p><a href="editgroups.cgi?action=add">Add Group</a></p>
+
+<p>
+ <b>Name</b> is what is used with the B<!-- blah -->ugzilla->user->in_group()
+function in any customized cgi files you write that use a given group.
+It can also be used by people submitting [% terms.bugs %] by email to
+limit [% terms.abug %] to a certain set of groups.
+</p>
+
+<p>
+ <b>Description</b> is what will be shown in the [% terms.bug %] reports
+to members of the group where they can choose whether the [% terms.bug %]
+will be restricted to others in the same group.
+</p>
+
+<p>
+ <b>User RegExp</b> is optional, and if filled in, will automatically
+grant membership to this group to anyone with an email address
+that matches this perl regular expression. Do not forget
+the trailing '$'. Example '@mycompany\.com$'
+</p>
+
+<p>
+ The <b>Use For [% terms.Bugs %]</b> flag determines whether or not
+the group is eligible to be used for [% terms.bugs %]. If you remove
+this flag, it will no longer be possible for users to add [% terms.bugs %]
+to this group, although [% terms.bugs %] already in the group will remain
+in the group. Doing so is a much less drastic way to stop a group
+from growing than deleting the group as well as a way to maintain
+lists of users without cluttering the lists of groups used
+for [% terms.bug %] restrictions.
+</p>
+
+<p>
+ The <b>Type</b> field identifies system groups.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/keywords/confirm-delete.html.tmpl b/template/en/default/admin/keywords/confirm-delete.html.tmpl
new file mode 100644
index 0000000..20a6dee
--- /dev/null
+++ b/template/en/default/admin/keywords/confirm-delete.html.tmpl
@@ -0,0 +1,53 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Terry Weissman <terry@mozilla.org>
+ # Vlad Dascalu <jocuri@softhome.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # keyword: A Bugzilla::Keyword object.
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Delete Keyword"
+%]
+
+<p>
+ [% IF keyword.bug_count == 1 %]
+ There is one [% terms.bug %] with this keyword set.
+ [% ELSIF keyword.bug_count > 1 %]
+ There are [% keyword.bug_count FILTER html %] [%+ terms.bugs %] with
+ this keyword set.
+ [% END %]
+
+ Are you <b>sure</b> you want to delete
+ the <code>[% keyword.name FILTER html %]</code> keyword?
+</p>
+
+<form method="post" action="editkeywords.cgi">
+ <input type="hidden" name="id" value="[% keyword.id FILTER html %]">
+ <input type="hidden" name="action" value="delete">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" id="delete"
+ value="Yes, really delete the keyword">
+</form>
+
+<p><a href="editkeywords.cgi">Edit other keywords</a>.</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/keywords/create.html.tmpl b/template/en/default/admin/keywords/create.html.tmpl
new file mode 100644
index 0000000..e5d6aa0
--- /dev/null
+++ b/template/en/default/admin/keywords/create.html.tmpl
@@ -0,0 +1,58 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Terry Weissman <terry@mozilla.org>
+ # Vlad Dascalu <jocuri@softhome.net>
+ #%]
+
+[%# INTERFACE:
+ # none
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Add keyword"
+ subheader = "This page allows you to add a new keyword."
+%]
+
+<form method="post" action="editkeywords.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <th align="right">Name:</th>
+ <td><input size="64" maxlength="64" name="name" value=""></td>
+ </tr>
+ <tr>
+ <th align="right">Description:</th>
+ <td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'description'
+ minrows = 4
+ cols = 64
+ wrap = 'virtual'
+ %]
+ </td>
+ </tr>
+ </table>
+ <hr>
+ <input type="hidden" name="id" value="-1">
+ <input type="submit" id="create" value="Add">
+ <input type="hidden" name="action" value="new">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+<p><a href="editkeywords.cgi">Edit other keywords</a>.</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/keywords/edit.html.tmpl b/template/en/default/admin/keywords/edit.html.tmpl
new file mode 100644
index 0000000..c4b9a64
--- /dev/null
+++ b/template/en/default/admin/keywords/edit.html.tmpl
@@ -0,0 +1,73 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Terry Weissman <terry@mozilla.org>
+ # Vlad Dascalu <jocuri@softhome.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # keyword: A Bugzilla::Keyword object.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Edit keyword"
+%]
+
+<form method="post" action="editkeywords.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <th align="right">Name:</th>
+ <td><input size="64" maxlength="64" name="name"
+ value="[% keyword.name FILTER html %]"></td>
+ </tr>
+ <tr>
+ <th align="right">Description:</th>
+ <td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'description'
+ minrows = 4
+ cols = 64
+ wrap = 'virtual'
+ defaultcontent = keyword.description
+ %]
+ </td>
+ </tr>
+ <tr>
+ <th align="right">[% terms.Bugs %]:</th>
+ <td>
+ [% IF keyword.bug_count > 0 %]
+ <a href="buglist.cgi?keywords=[% keyword.name FILTER url_quote %]">
+ [% keyword.bug_count FILTER html %]</a>
+ [% ELSE %]
+ none
+ [% END %]
+ </td>
+ </tr>
+ </table>
+
+ <input type="submit" id="update" value="Save Changes">
+ <input type="hidden" name="action" value="update">
+ <input type="hidden" name="id" value="[% keyword.id FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+<p><a href="editkeywords.cgi">Edit other keywords</a>.</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/keywords/list.html.tmpl b/template/en/default/admin/keywords/list.html.tmpl
new file mode 100644
index 0000000..c400a23
--- /dev/null
+++ b/template/en/default/admin/keywords/list.html.tmpl
@@ -0,0 +1,70 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Terry Weissman <terry@mozilla.org>
+ # Vlad Dascalu <jocuri@softhome.net>
+ # Jouni Heikniemi <jouni@heikniemi.net>
+ #%]
+
+[%# INTERFACE:
+ # keywords: array keyword objects having the properties:
+ # - id: number. The ID of the keyword.
+ # - name: string. The name of the keyword.
+ # - description: string. The description of the keyword.
+ # - bug_count: number. The number of bugs with the keyword.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Select keyword"
+%]
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit keyword..."
+ contentlink => "editkeywords.cgi?action=edit&amp;id=%%id%%"
+ },
+ {
+ name => "description"
+ heading => "Description"
+ allow_html_content => 1
+ },
+ {
+ name => "bug_count"
+ heading => "$terms.Bugs"
+ align => "right"
+ contentlink => "buglist.cgi?keywords=%%name%%"
+ },
+ {
+ heading => "Action"
+ content => "Delete"
+ contentlink => "editkeywords.cgi?action=del&amp;id=%%id%%"
+ }
+ ]
+%]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = keywords
+ footer = footer_row
+%]
+
+<p><a href="editkeywords.cgi?action=add">Add a new keyword</a></p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/milestones/confirm-delete.html.tmpl b/template/en/default/admin/milestones/confirm-delete.html.tmpl
new file mode 100644
index 0000000..ea89b80
--- /dev/null
+++ b/template/en/default/admin/milestones/confirm-delete.html.tmpl
@@ -0,0 +1,98 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the milestone belongs.
+ # milestone: object; Bugzilla::Milestone object representing the
+ # milestone the user wants to delete.
+ #%]
+
+[% title = BLOCK %]Delete Milestone of Product '[% product.name FILTER html %]'
+ [% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+<table border="1" cellpadding="4" cellspacing="0">
+<tr bgcolor="#6666FF">
+ <th valign="top" align="left">Field</th>
+ <th valign="top" align="left">Value</th>
+</tr>
+<tr>
+ <td valign="top">Milestone:</td>
+ <td valign="top">[% milestone.name FILTER html %]</td>
+</tr>
+<tr>
+ <td valign="top">Milestone of Product:</td>
+ <td valign="top">[% product.name FILTER html %]</td>
+</tr>
+<tr>
+ <td valign="top">[% terms.Bugs %]:</td>
+ <td valign="top">
+[% IF milestone.bug_count %]
+ <a title="List of [% terms.bugs %] targetted at milestone '
+ [% milestone.name FILTER html %]'"
+ href="buglist.cgi?target_milestone=[% milestone.name FILTER url_quote %]&amp;product=
+ [%- product.name FILTER url_quote %]">
+ [% milestone.bug_count FILTER none %]</a>
+[% ELSE %]
+ None
+[% END %]
+ </td>
+</tr>
+</table>
+
+<h2>Confirmation</h2>
+
+[% IF milestone.bug_count %]
+
+ <table border="0" cellpadding="20" width="70%" bgcolor="red">
+ <tr><td>
+ There
+ [% IF milestone.bug_count > 1 %]
+ are [% milestone.bug_count FILTER none %] [%+ terms.bugs %]
+ [% ELSE %]
+ is 1 [% terms.bug %]
+ [% END %]
+ entered for this milestone! When you delete this milestone,
+ <b><blink>ALL</blink></b> of these [% terms.bugs %] will be retargeted
+ to [% product.default_milestone FILTER html %], the default milestone for
+ the [% product.name FILTER html %] product.
+ </td></tr>
+ </table>
+
+[% END %]
+
+<p>Do you really want to delete this milestone?<p>
+
+<form method="post" action="editmilestones.cgi">
+ <input type="submit" id="delete" value="Yes, delete">
+ <input type="hidden" name="action" value="delete">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ <input type="hidden" name="milestone" value="[% milestone.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+[% PROCESS admin/milestones/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/milestones/create.html.tmpl b/template/en/default/admin/milestones/create.html.tmpl
new file mode 100644
index 0000000..d7c2f58
--- /dev/null
+++ b/template/en/default/admin/milestones/create.html.tmpl
@@ -0,0 +1,58 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the milestone belongs.
+ #%]
+
+[% title = BLOCK %]Add Milestone to Product '[% product.name FILTER html %]'[% END %]
+[% subheader = BLOCK %]This page allows you to add a new milestone to product
+ '[% product.name FILTER html %]'.[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+ subheader = subheader
+ onload = "document.forms['f'].milestone.focus()"
+%]
+
+<form name="f" method="post" action="editmilestones.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <th align="right"><label for="milestone">Milestone:</label></th>
+ <td><input id="milestone" size="20" maxlength="20" name="milestone"
+ value=""></td>
+ </tr>
+ <tr>
+ <th align="right"><label for="sortkey">Sortkey:</label></th>
+ <td><input id="sortkey" size="20" maxlength="20" name="sortkey"
+ value=""></td>
+ </tr>
+ </table>
+ <input type="submit" id="create" value="Add">
+ <input type="hidden" name="action" value="new">
+ <input type="hidden" name='product' value="[% product.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+[% PROCESS admin/milestones/footer.html.tmpl
+ no_add_milestone_link = 1
+ %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/milestones/edit.html.tmpl b/template/en/default/admin/milestones/edit.html.tmpl
new file mode 100644
index 0000000..dfe9d1b
--- /dev/null
+++ b/template/en/default/admin/milestones/edit.html.tmpl
@@ -0,0 +1,63 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the milestone belongs.
+ # milestone: object; Bugzilla::Milestone object representing the
+ # milestone the user wants to edit.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]Edit Milestone '[% milestone.name FILTER html %]' of product '
+ [%- product.name FILTER html %]'[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+ onload = "document.forms['f'].milestone.select()"
+%]
+
+<form name="f" method="post" action="editmilestones.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+
+ <tr>
+ <th valign="top"><label for="milestone">Milestone:</label></th>
+ <td><input id="milestone" size="20" maxlength="20" name="milestone" value="
+ [%- milestone.name FILTER html %]"></td>
+ </tr>
+ <tr>
+ <th align="right"><label for="sortkey">Sortkey:</label></th>
+ <td><input id="sortkey" size="20" maxlength="20" name="sortkey" value="
+ [%- milestone.sortkey FILTER html %]"></td>
+ </tr>
+
+ </table>
+
+ <input type="hidden" name="milestoneold" value="[% milestone.name FILTER html %]">
+ <input type="hidden" name="action" value="update">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ <input type="submit" id="update" value="Save Changes">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+[% PROCESS admin/milestones/footer.html.tmpl
+ no_edit_milestone_link = 1 %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/milestones/footer.html.tmpl b/template/en/default/admin/milestones/footer.html.tmpl
new file mode 100644
index 0000000..e91e5f9
--- /dev/null
+++ b/template/en/default/admin/milestones/footer.html.tmpl
@@ -0,0 +1,67 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the milestone belongs.
+ #
+ # milestone: object; Bugzilla::Milestone object representing the
+ # milestone.
+ #
+ # no_XXX_link: boolean; if defined, then don't show the corresponding
+ # link. Supported parameters are:
+ #
+ # no_edit_milestone_link
+ # no_edit_other_milestones_link
+ # no_add_milestone_link
+ #%]
+
+<hr>
+
+<p>
+
+[% UNLESS no_add_milestone_link %]
+ <a title="Add a milestone to product '[% product.name FILTER html %]'"
+ href="editmilestones.cgi?action=add&amp;product=
+ [%- product.name FILTER url_quote %]">Add</a> a milestone.
+[% END %]
+
+[% IF milestone.name && !no_edit_milestone_link %]
+ Edit milestone <a
+ title="Edit Milestone '[% milestone.name FILTER html %]' of product '
+ [%- product.name FILTER html %]'"
+ href="editmilestones.cgi?action=edit&amp;product=
+ [%- product.name FILTER url_quote %]&amp;milestone=
+ [%- milestone.name FILTER url_quote %]">
+ '[% milestone.name FILTER html %]'</a>.
+[% END %]
+
+[% UNLESS no_edit_other_milestones_link %]
+ Edit other milestones of product <a
+ href="editmilestones.cgi?product=
+ [%- product.name FILTER url_quote %]">'[% product.name FILTER html %]'</a>.
+
+[% END %]
+
+ Edit product <a
+ href="editproducts.cgi?action=edit&amp;product=
+ [%- product.name FILTER url_quote %]">'[% product.name FILTER html %]'</a>.
+
+</p>
diff --git a/template/en/default/admin/milestones/list.html.tmpl b/template/en/default/admin/milestones/list.html.tmpl
new file mode 100644
index 0000000..9422855
--- /dev/null
+++ b/template/en/default/admin/milestones/list.html.tmpl
@@ -0,0 +1,108 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the milestones belongs.
+ # showbugcounts: if defined, then bug counts should be included in the table
+ #%]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]Select milestone of product
+ '[% product.name FILTER html %]'[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+[% edit_contentlink = BLOCK %]editmilestones.cgi?action=edit&amp;product=
+ [%- product.name FILTER url_quote %]&amp;milestone=%%name%%[% END %]
+[% delete_contentlink = BLOCK %]editmilestones.cgi?action=del&amp;product=
+ [%- product.name FILTER url_quote %]&amp;milestone=%%name%%[% END %]
+[% bug_count_contentlink = BLOCK %]buglist.cgi?target_milestone=%%name%%&amp;product=
+ [%- product.name FILTER url_quote %][% END %]
+
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit milestone..."
+ contentlink => edit_contentlink
+ },
+ {
+ name => "sortkey"
+ heading => "Sortkey"
+ }
+ ]
+%]
+
+[% IF showbugcounts %]
+
+ [% columns.push({
+ name => "bug_count"
+ heading => "$terms.Bugs"
+ align => "right"
+ contentlink => bug_count_contentlink
+ })
+ %]
+
+[% END %]
+
+[% columns.push({
+ name => "action"
+ heading => "Action"
+ content => "Delete"
+ contentlink => delete_contentlink
+ })
+%]
+
+[%# We want to override the usual 'Delete' link for the default milestone %]
+[% overrides.action.name.${product.default_milestone} = {
+ override_content => 1
+ content => "(Default milestone)"
+ override_contentlink => 1
+ contentlink => undef
+ }
+%]
+
+[% Hook.process('before_table') %]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = product.milestones
+ overrides = overrides
+%]
+
+[% IF ! showbugcounts %]
+
+ <p><a href="editmilestones.cgi?product=[% product.name FILTER url_quote %]&amp;showbugcounts=1">
+ Redisplay table with [% terms.bug %] counts (slower)</a></p>
+
+[% END %]
+
+[% PROCESS admin/milestones/footer.html.tmpl
+ no_edit_other_milestones_link = 1
+%]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/milestones/select-product.html.tmpl b/template/en/default/admin/milestones/select-product.html.tmpl
new file mode 100644
index 0000000..587db6d
--- /dev/null
+++ b/template/en/default/admin/milestones/select-product.html.tmpl
@@ -0,0 +1,70 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #
+ #%]
+
+[%# INTERFACE:
+ # products: array of product objects
+ # showbugcounts: if defined, then bug counts should be included in the table
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Edit milestones for which product?"
+%]
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit milestones of..."
+ contentlink => "editmilestones.cgi?product=%%name%%"
+ },
+ {
+ name => "description"
+ heading => "Description"
+ allow_html_content => 1
+ }
+ ]
+%]
+
+[% IF showbugcounts %]
+
+ [% columns.push({
+ name => 'bug_count'
+ heading => "$terms.Bugs"
+ align => "right"
+ contentlink => "buglist.cgi?product=%%name%%"
+ })
+ %]
+
+[% END %]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = products
+%]
+
+[% IF !showbugcounts %]
+ <p><a href="editmilestones.cgi?showbugcounts=1">
+ Redisplay table with [% terms.bug %] counts (slower)</a></p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/params/admin.html.tmpl b/template/en/default/admin/params/admin.html.tmpl
new file mode 100644
index 0000000..dd83ebb
--- /dev/null
+++ b/template/en/default/admin/params/admin.html.tmpl
@@ -0,0 +1,41 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "Administrative Policies"
+ desc = "Set up account policies"
+%]
+
+[% param_descs = {
+ allowbugdeletion => "The pages to edit products and components can delete all " _
+ "associated $terms.bugs when you delete a product (or component). " _
+ "Since that is a pretty scary idea, you have to turn on " _
+ "this option before any such deletions will ever happen.",
+
+ allowemailchange => "Users can change their own email address through the preferences. " _
+ "Note that the change is validated by emailing both addresses, so " _
+ "switching this option on will not let users use an invalid address.",
+
+ allowuserdeletion => "The user editing pages are capable of letting you delete user accounts. " _
+ "$terms.Bugzilla will issue a warning in case you'd run into inconsistencies " _
+ "when you're about to do so, but such deletions remain kinda scary. " _
+ "So, you have to turn on this option before any such deletions " _
+ "will ever happen." }
+%] \ No newline at end of file
diff --git a/template/en/default/admin/params/advanced.html.tmpl b/template/en/default/admin/params/advanced.html.tmpl
new file mode 100644
index 0000000..4caa2f1
--- /dev/null
+++ b/template/en/default/admin/params/advanced.html.tmpl
@@ -0,0 +1,50 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%
+ title = "Advanced"
+ desc = "Settings for advanced configurations."
+%]
+
+[% param_descs = {
+ cookiedomain =>
+ "If your website is at 'www.foo.com', setting this to"
+ _ " '.foo.com' will also allow 'bar.foo.com' to access"
+ _ " $terms.Bugzilla cookies. This is useful if you have more than"
+ _ " one hostname pointing at the same web server, and you"
+ _ " want them to share the $terms.Bugzilla cookie.",
+
+ inbound_proxies =>
+ "When inbound traffic to $terms.Bugzilla goes through a proxy,"
+ _ " $terms.Bugzilla thinks that the IP address of every single"
+ _ " user is the IP address of the proxy. If you enter a comma-separated"
+ _ " list of IPs in this parameter, then $terms.Bugzilla will trust any"
+ _ " <code>X-Forwarded-For</code> header sent from those IPs,"
+ _ " and use the value of that header as the end user's IP address.",
+
+ proxy_url =>
+ "$terms.Bugzilla may have to access the web to get notifications about"
+ _ " new releases (see the <tt>upgrade_notification</tt> parameter)."
+ _ " If your $terms.Bugzilla server is behind a proxy, it may be"
+ _ " necessary to enter its URL if the web server cannot access the"
+ _ " HTTP_PROXY environment variable. If you have to authenticate,"
+ _ " use the <code>http://user:pass@proxy_url/</code> syntax.",
+} %]
diff --git a/template/en/default/admin/params/attachment.html.tmpl b/template/en/default/admin/params/attachment.html.tmpl
new file mode 100644
index 0000000..7d1e29f
--- /dev/null
+++ b/template/en/default/admin/params/attachment.html.tmpl
@@ -0,0 +1,76 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "Attachments"
+ desc = "Set up attachment options"
+%]
+
+[% param_descs = {
+ allow_attachment_display =>
+ "If this option is on, users will be able to view attachments from"
+ _ " their browser, if their browser supports the attachment's MIME type."
+ _ " If this option is off, users are forced to download attachments,"
+ _ " even if the browser is able to display them."
+ _ "<p>This is a security restriction for installations where untrusted"
+ _ " users may upload attachments that could be potentially damaging if"
+ _ " viewed directly in the browser.</p>"
+ _ "<p>It is highly recommended that you set the <tt>attachment_base</tt>"
+ _ " parameter if you turn this parameter on.",
+
+ attachment_base =>
+ "When the <tt>allow_attachment_display</tt> parameter is on, it is "
+ _ " possible for a malicious attachment to steal your cookies or"
+ _ " perform an attack on $terms.Bugzilla using your credentials."
+ _ "<p>If you would like additional security on attachments to avoid"
+ _ " this, set this parameter to an alternate URL for your $terms.Bugzilla"
+ _ " that is not the same as <tt>urlbase</tt> or <tt>sslbase</tt>."
+ _ " That is, a different domain name that resolves to this exact"
+ _ " same $terms.Bugzilla installation.</p>"
+ _ "<p>Note that if you have set the"
+ _ " <a href=\"editparams.cgi?section=advanced#cookiedomain\"><tt>cookiedomain</tt>"
+ _" parameter</a>, you should set <tt>attachment_base</tt> to use a"
+ _ " domain that would <em>not</em> be matched by"
+ _ " <tt>cookiedomain</tt>.</p>"
+ _ "<p>For added security, you can insert <tt>%bugid%</tt> into the URL,"
+ _ " which will be replaced with the ID of the current $terms.bug that"
+ _ " the attachment is on, when you access an attachment. This will limit"
+ _ " attachments to accessing only other attachments on the same"
+ _ " ${terms.bug}. Remember, though, that all those possible domain names "
+ _ " (such as <tt>1234.your.domain.com</tt>) must point to this same"
+ _ " $terms.Bugzilla instance.",
+
+ allow_attachment_deletion => "If this option is on, administrators will be able to delete " _
+ "the content of attachments.",
+
+ allow_attach_url => "If this option is on, it will be possible to " _
+ "specify a URL when creating an attachment and " _
+ "treat the URL itself as if it were an attachment.",
+
+ maxattachmentsize => "The maximum size (in kilobytes) of attachments. " _
+ "$terms.Bugzilla will not accept attachments greater than this number " _
+ "of kilobytes in size. Setting this parameter to 0 will prevent " _
+ "attaching files to ${terms.bugs}.",
+
+ maxlocalattachment => "The maximum size (in megabytes) of attachments identified by " _
+ "the user as 'Big Files' to be stored locally on the webserver. " _
+ "If set to zero, attachments will never be kept on the local " _
+ "filesystem." }
+%]
diff --git a/template/en/default/admin/params/auth.html.tmpl b/template/en/default/admin/params/auth.html.tmpl
new file mode 100644
index 0000000..d2cb3e5
--- /dev/null
+++ b/template/en/default/admin/params/auth.html.tmpl
@@ -0,0 +1,129 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ # Marc Schumann <wurblzap@gmail.com>
+ #%]
+[%
+ title = "User Authentication"
+ desc = "Set up your authentication policies"
+%]
+
+[% param_descs = {
+ auth_env_id => "Environment variable used by external authentication system " _
+ "to store a unique identifier for each user. Leave it blank " _
+ "if there isn't one or if this method of authentication " _
+ "is not being used.",
+
+ auth_env_email => "Environment variable used by external authentication system " _
+ "to store each user's email address. This is a required " _
+ "field for environmental authentication. Leave it blank " _
+ "if you are not going to use this feature.",
+
+ auth_env_realname => "Environment variable used by external authentication system " _
+ "to store the user's real name. Leave it blank if there " _
+ "isn't one or if this method of authentication is not being " _
+ "used.",
+
+ user_info_class => "Mechanism(s) to be used for gathering a user's login information.
+ More than one may be selected. If the first one returns nothing,
+ the second is tried, and so on.<br>
+ The types are:
+ <dl>
+ <dt>CGI</dt>
+ <dd>
+ Asks for username and password via CGI form interface.
+ </dd>
+ <dt>Env</dt>
+ <dd>
+ Info for a pre-authenticated user is passed in system
+ environment variables.
+ </dd>
+ </dl>",
+
+ user_verify_class => "Mechanism(s) to be used for verifying (authenticating) information
+ gathered by user_info_class.
+ More than one may be selected. If the first one cannot find the
+ user, the second is tried, and so on.<br>
+ The types are:
+ <dl>
+ <dt>DB</dt>
+ <dd>
+ ${terms.Bugzilla}'s built-in authentication. This is the most common
+ choice.
+ </dd>
+ <dt>RADIUS</dt>
+ <dd>
+ RADIUS authentication using a RADIUS server.
+ This method is experimental; please see the
+ $terms.Bugzilla documentation for more information.
+ Using this method requires
+ <a href=\"?section=radius\">additional
+ parameters</a> to be set.
+ </dd>
+ <dt>LDAP</dt>
+ <dd>
+ LDAP authentication using an LDAP server.
+ Please see the $terms.Bugzilla documentation
+ for more information. Using this method requires
+ <a href=\"?section=ldap\">additional
+ parameters</a> to be set.
+ </dd>
+ </dl>",
+
+ rememberlogin => "Controls management of session cookies
+ <ul>
+ <li>
+ on - Session cookies never expire (the user has to login only
+ once per browser).
+ </li>
+ <li>
+ off - Session cookies last until the users session ends (the user
+ will have to login in each new browser session).
+ </li>
+ <li>
+ defaulton/defaultoff - Default behavior as described
+ above, but user can choose whether $terms.Bugzilla will remember his
+ login or not.
+ </li>
+ </ul>",
+
+ requirelogin => "If this option is set, all access to the system beyond the " _
+ "front page will require a login. No anonymous users will " _
+ "be permitted.",
+
+ emailregexp => "This defines the regexp to use for legal email addresses. The " _
+ "default tries to match fully qualified email addresses. Another " _
+ "popular value to put here is <tt>^[^@]+$</tt>, which means " _
+ "'local usernames, no @ allowed.'",
+
+ emailregexpdesc => "This describes in English words what kinds of legal addresses " _
+ "are allowed by the <tt>emailregexp</tt> param.",
+
+ emailsuffix => "This is a string to append to any email addresses when actually " _
+ "sending mail to that address. It is useful if you have changed " _
+ "the <tt>emailregexp</tt> param to only allow local usernames, " _
+ "but you want the mail to be delivered to username@my.local.hostname.",
+
+ createemailregexp => "This defines the regexp to use for email addresses that are " _
+ "permitted to self-register using a 'New Account' feature. The " _
+ "default (.*) permits any account matching the emailregexp " _
+ "to be created. If this parameter is left blank, no users " _
+ "will be permitted to create their own accounts and all accounts " _
+ "will have to be created by an administrator." }
+%]
diff --git a/template/en/default/admin/params/authenv.html.tmpl b/template/en/default/admin/params/authenv.html.tmpl
new file mode 100644
index 0000000..b57aae3
--- /dev/null
+++ b/template/en/default/admin/params/authenv.html.tmpl
@@ -0,0 +1,29 @@
+[%# 1.0@bugzilla.org %]
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "AuthEnv Extension"
+ desc = "Set up your Bugzilla::AuthEnv extension"
+%]
+
+[% param_descs = {
+ allowloginid => "Enable or disable maintenance of the login ID." }
+%]
diff --git a/template/en/default/admin/params/bugchange.html.tmpl b/template/en/default/admin/params/bugchange.html.tmpl
new file mode 100644
index 0000000..9f456ee
--- /dev/null
+++ b/template/en/default/admin/params/bugchange.html.tmpl
@@ -0,0 +1,51 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "$terms.Bug Change Policies"
+ desc = "Set up $terms.bug change policies"
+%]
+
+[% param_descs = {
+ duplicate_or_move_bug_status => "When $terms.abug is marked as a duplicate of another one " _
+ "or is moved to another installation, use this $terms.bug status."
+
+ letsubmitterchoosepriority => "If this is on, then people submitting $terms.bugs can " _
+ "choose an initial priority for that ${terms.bug}. " _
+ "If off, then all $terms.bugs initially have the default " _
+ "priority selected below.",
+
+ letsubmitterchoosemilestone => "If this is on, then people submitting $terms.bugs can " _
+ "choose the Target Milestone for that ${terms.bug}. " _
+ "If off, then all $terms.bugs initially have the default " _
+ "milestone for the product being filed in.",
+
+ musthavemilestoneonaccept => "If you are using Target Milestone, do you want to require that " _
+ "the milestone be set in order for a user to ACCEPT a ${terms.bug}?",
+
+ commentonchange_resolution => "If this option is on, the user needs to enter a short " _
+ "comment if the resolution of the $terms.bug changes.",
+
+ commentonduplicate => "If this option is on, the user needs to enter a short comment " _
+ "if the $terms.bug is marked as duplicate.",
+
+ noresolveonopenblockers => "Don\'t allow $terms.bugs to be resolved as fixed " _
+ "if they have unresolved dependencies." }
+%]
diff --git a/template/en/default/admin/params/bugfields.html.tmpl b/template/en/default/admin/params/bugfields.html.tmpl
new file mode 100644
index 0000000..794f925
--- /dev/null
+++ b/template/en/default/admin/params/bugfields.html.tmpl
@@ -0,0 +1,66 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "$terms.Bug Fields"
+ desc = "Choose fields you want to display"
+%]
+
+[% param_descs = {
+ useclassification => "If this is on, $terms.Bugzilla will associate each product with a " _
+ "specific classification. But you must have 'editclassification' " _
+ "permissions enabled in order to edit classifications.",
+
+ usetargetmilestone => "Do you wish to use the Target Milestone field?",
+
+ useqacontact => "Do you wish to use the QA Contact field?",
+
+ usestatuswhiteboard => "Do you wish to use the Status Whiteboard field?",
+
+ usevotes => "Do you wish to allow users to vote for ${terms.bugs}? Note that in order " _
+ "for this to be effective, you will have to change the maximum " _
+ "votes allowed in a product to be non-zero in " _
+ "<a href=\"editproducts.cgi\">the product edit page</a>.",
+
+ usebugaliases => "Do you wish to use $terms.bug aliases, which allow you to assign " _
+ "$terms.bugs an easy-to-remember name by which you can refer to them?",
+
+ use_see_also =>
+ "Do you wish to use the See Also field? It allows you refer to"
+ _ " $terms.bugs in other installations. Even if you disable this field,"
+ _ " $terms.bug relationships (URLs) already set on $terms.bugs will"
+ _ " still appear and can be removed.",
+
+ defaultpriority => "This is the priority that newly entered $terms.bugs are set to.",
+
+ defaultseverity => "This is the severity that newly entered $terms.bugs are set to.",
+
+ defaultplatform => "This is the platform that is preselected on the $terms.bug " _
+ "entry form.<br> " _
+ "You can leave this empty: " _
+ "$terms.Bugzilla will then use the platform that the browser " _
+ "reports to be running on as the default.",
+
+ defaultopsys => "This is the operating system that is preselected on the $terms.bug " _
+ "entry form.<br> " _
+ "You can leave this empty: " _
+ "$terms.Bugzilla will then use the operating system that the browser " _
+ "reports to be running on as the default." }
+%]
diff --git a/template/en/default/admin/params/bugmove.html.tmpl b/template/en/default/admin/params/bugmove.html.tmpl
new file mode 100644
index 0000000..911bc33
--- /dev/null
+++ b/template/en/default/admin/params/bugmove.html.tmpl
@@ -0,0 +1,49 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "$terms.Bug Moving"
+ desc = "Set up parameters to move $terms.bugs to/from another installation"
+%]
+
+[% param_descs = {
+ "move-enabled" => "If this is on, $terms.Bugzilla will allow certain people " _
+ "to move $terms.bugs to the defined database.",
+
+ "move-button-text" => "The text written on the Move button. Explain where the $terms.bug is " _
+ "being moved to.",
+
+ "move-to-url" => "The URL of the database we allow some of our $terms.bugs to be moved to.",
+
+ "move-to-address" => "To move ${terms.bugs}, an email is sent to the target database. This is " _
+ "the email address that database uses to listen for incoming ${terms.bugs}.",
+
+ "moved-from-address" => "To move ${terms.bugs}, an email is sent to the target database. This is " _
+ "the email address from which this mail, and error messages are sent.",
+
+ movers => "A list of people with permission to move $terms.bugs and reopen moved " _
+ "${terms.bugs} (in case the move operation fails).",
+
+ "moved-default-product" => "$terms.Bugs moved from other databases to here are assigned " _
+ "to this product.",
+
+ "moved-default-component" => "$terms.Bugs moved from other databases to here are assigned " _
+ "to this component." }
+%]
diff --git a/template/en/default/admin/params/common.html.tmpl b/template/en/default/admin/params/common.html.tmpl
new file mode 100644
index 0000000..18aa1fb
--- /dev/null
+++ b/template/en/default/admin/params/common.html.tmpl
@@ -0,0 +1,150 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ # Marc Schumann <wurblzap@gmail.com>
+ #%]
+[%# INTERFACE:
+ # panel: hash representing the current panel.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% sortlist_separator = '---' %]
+
+<dl>
+ [% FOREACH param = panel.param_list %]
+ <dt><a name="[% param.name FILTER html %]">[% param.name FILTER html %]</a></dt>
+ <dd>[% panel.param_descs.${param.name} FILTER none %]
+ <p>
+ [% IF param.type == "t" %]
+ <input type="text" size="80" name="[% param.name FILTER html %]"
+ id="[% param.name FILTER html %]" value="[% Param(param.name) FILTER html %]">
+ [% ELSIF param.type == "p" %]
+ <input type="password" size="80" name="[% param.name FILTER html %]"
+ id="[% param.name FILTER html %]" value="[% Param(param.name) FILTER html %]"
+ autocomplete="off">
+ [% ELSIF param.type == "l" %]
+ <textarea name="[% param.name FILTER html %]" id="[% param.name FILTER html %]"
+ rows="10" cols="80">[% Param(param.name) FILTER html %]</textarea>
+ [% ELSIF param.type == "b" %]
+ <input type="radio" name="[% param.name FILTER html %]" id="[% param.name FILTER html %]-on"
+ value=1 [% "checked=\"checked\"" IF Param(param.name) %]>
+ <label for="[% param.name FILTER html %]-on">On</label>
+ <input type="radio" name="[% param.name FILTER html %]" id="[% param.name FILTER html %]-off"
+ value=0 [% "checked=\"checked\"" IF !Param(param.name) %]>
+ <label for="[% param.name FILTER html %]-off">Off</label>
+ [% ELSIF param.type == "m" %]
+ [% boxSize = 5 %]
+ [% boxSize = param.choices.size IF param.choices.size < 5 %]
+
+ <select multiple="multiple" size="[% boxSize FILTER html %]"
+ name="[% param.name FILTER html %]" id="[% param.name FILTER html %]">
+ [% FOREACH item = param.choices %]
+ <option value="[% item FILTER html %]"
+ [% " selected=\"selected\"" IF lsearch(Param(param.name), item) != -1 %]>
+ [% item FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ [% ELSIF param.type == "o" %]
+ <script type="text/javascript"><!--
+ document.write("<span style=\"display: none\">");
+ // -->
+ </script>
+ <input id="input_[% param.name FILTER html %]" size="80"
+ name="[% param.name FILTER html %]"
+ value="[% Param(param.name) FILTER html %]"><br>
+ <script type="text/javascript"><!--
+ document.write("<\/span>");
+ // -->
+ </script>
+ [% boxSize = 7 %]
+ [% boxSize = 3 + param.choices.size IF param.choices.size < 7 %]
+ [% plist = Param(param.name).split(',') %]
+
+ <script type="text/javascript"><!--
+ document.write(
+ '<table>' +
+ ' <tr>' +
+ ' <td rowspan="2">' +
+ ' <select id="select_[% param.name FILTER html %]"' +
+ ' size="[% boxSize FILTER html %]"' +
+ ' name="select_[% param.name FILTER html %]">' +
+ [% FOREACH item = plist %]
+ ' <option value="[% item FILTER html %]">[% item FILTER html %]<\/option>' +
+ [% END %]
+ ' <option class="sortlist_separator"' +
+ ' disabled="disabled"' +
+ ' value="[% sortlist_separator %]">active&uarr;&nbsp;&darr;inactive<\/option>' +
+ [% FOREACH item = param.choices %]
+ [% IF lsearch(plist, item) == -1 %]
+ ' <option value="[% item FILTER html %]">[% item FILTER html %]<\/option>' +
+ [% END %]
+ [% END %]
+ ' <\/select>' +
+ ' <\/td>' +
+ ' <td style="vertical-align: bottom">' +
+ ' <button type="button"' +
+ ' onClick="sortedList_moveItem(\'[% param.name FILTER html %]\', -1, \'[% sortlist_separator %]\');">&uarr;<\/button>' +
+ ' <\/td>' +
+ ' <\/tr>' +
+ ' <tr>' +
+ ' <td style="vertical-align: top">' +
+ ' <button type="button"' +
+ ' onClick="sortedList_moveItem(\'[% param.name FILTER html %]\', +1, \'[% sortlist_separator %]\');">&darr;<\/button>' +
+ ' <\/td>' +
+ ' <\/tr>' +
+ '<\/table>');
+ // -->
+ </script>
+ [% ELSIF param.type == "s" %]
+ <select name="[% param.name FILTER html %]" id="[% param.name FILTER html %]">
+ [% FOREACH item = param.choices %]
+ <option value="[% item FILTER html %]"
+ [% " selected=\"selected\"" IF item == Param(param.name) %]>
+ [% IF param.name == "defaultseverity" %]
+ [% display_value("bug_severity", item) FILTER html %]
+ [% ELSIF param.name == "defaultplatform" %]
+ [% display_value("rep_platform", item) FILTER html %]
+ [% ELSIF param.name == "defaultopsys" %]
+ [% display_value("op_sys", item) FILTER html %]
+ [% ELSIF param.name == "duplicate_or_move_bug_status" %]
+ [% display_value("bug_status", item) FILTER html %]
+ [% ELSE %]
+ [% item FILTER html %]
+ [% END %]
+ </option>
+ [% END %]
+ </select>
+ [% ELSE %]
+ <font color="red">
+ <blink>Unknown param type [% param.type FILTER html %]!!!</blink>
+ </font>
+ [% END %]
+ </p>
+ [% UNLESS param.no_reset %]
+ <p>
+ <input type="checkbox" name="reset-[% param.name FILTER html %]"
+ id="reset-[% param.name FILTER html %]">
+ <label for="reset-[% param.name FILTER html %]">Reset</label>
+ </p>
+ [% END %]
+ <hr>
+ </dd>
+ [% END %]
+</dl>
diff --git a/template/en/default/admin/params/core.html.tmpl b/template/en/default/admin/params/core.html.tmpl
new file mode 100644
index 0000000..b1578f4
--- /dev/null
+++ b/template/en/default/admin/params/core.html.tmpl
@@ -0,0 +1,48 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%
+ title = "Required Settings"
+ desc = "Settings that are required for proper operation of $terms.Bugzilla"
+%]
+
+[% param_descs = {
+ urlbase => "The URL that is the common initial leading part of all $terms.Bugzilla " _
+ "URLs.",
+
+ sslbase => "The URL that is the common initial leading part of all HTTPS " _
+ "(SSL) $terms.Bugzilla URLs.",
+
+ ssl_redirect =>
+ "When this is enabled, $terms.Bugzilla will ensure that every page is"
+ _ " accessed over SSL, by redirecting any plain HTTP requests to HTTPS"
+ _ " using the <tt>sslbase</tt> parameter. Also, when this is enabled,"
+ _ " $terms.Bugzilla will send out links using <tt>sslbase</tt> in emails"
+ _ " instead of <tt>urlbase</tt>.",
+
+ cookiepath => "Path, relative to your web document root, to which to restrict " _
+ "$terms.Bugzilla cookies. Normally this is the URI portion of your URL " _
+ "base. Begin with a / (single slash mark). For instance, if " _
+ "$terms.Bugzilla serves from 'http://www.somedomain.com/bugzilla/', set " _
+ "this parameter to /bugzilla/. Setting it to / will allow " _
+ "all sites served by this web server or virtual host to read " _
+ "$terms.Bugzilla cookies.",
+} %]
diff --git a/template/en/default/admin/params/dependencygraph.html.tmpl b/template/en/default/admin/params/dependencygraph.html.tmpl
new file mode 100644
index 0000000..181cced
--- /dev/null
+++ b/template/en/default/admin/params/dependencygraph.html.tmpl
@@ -0,0 +1,49 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "Dependency Graphs"
+ desc = "Optional setup for dependency graphing"
+%]
+
+[% param_descs = {
+ webdotbase => "It is possible to show graphs of dependent ${terms.bugs}. You may set
+ this parameter to any of the following:
+ <ul>
+ <li>
+ A complete file path to 'dot' (part of
+ <a href=\"http://www.graphviz.org\">GraphViz</a>) will
+ generate the graphs locally.
+ </li>
+ <li>
+ A URL prefix pointing to an installation of the
+ <a href=\"http://www.research.att.com/~north/cgi-bin/webdot.cgi\">webdot
+ package</a> will generate the graphs remotely.
+ </li>
+ <li>
+ A blank value will disable dependency graphing.
+ </li>
+ </ul>
+ The default value is a publicly-accessible webdot server. If you change
+ this value, make certain that the webdot server can read files from your
+ webdot directory. On Apache you do this by editing the .htaccess file,
+ for other systems the needed measures may vary. You can run checksetup.pl
+ to recreate the .htaccess file if it has been lost."}
+%] \ No newline at end of file
diff --git a/template/en/default/admin/params/editparams.html.tmpl b/template/en/default/admin/params/editparams.html.tmpl
new file mode 100644
index 0000000..21fa9fa
--- /dev/null
+++ b/template/en/default/admin/params/editparams.html.tmpl
@@ -0,0 +1,121 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%# INTERFACE:
+ # panels: array of hashes representing the panels available.
+ # param_changed: array of parameters which have been changed.
+ # shutdown_is_active: boolean; is true when 'shutdownhtml' has been turned on.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% curpanel = -1 %]
+[% panels = panels.nsort('sortkey') %]
+
+[% FOREACH panel = panels %]
+ [% PROCESS "admin/params/${panel.name}.html.tmpl"
+ params = panel.param_list %]
+ [% panel.title = title %]
+ [% panel.desc = desc %]
+ [% panel.param_descs = param_descs %]
+ [% IF panel.current %][% curpanel = loop.index %][% END %]
+[% END %]
+
+[% current_panel = panels.$curpanel %]
+
+[%# We cannot call header.html.tmpl earlier as we have to know
+ which panel is active first, in order to get its title %]
+
+[% title = BLOCK %]
+ [% IF curpanel == -1 %]
+ Parameters: Index
+ [% ELSE %]
+ Configuration:
+ [%+ current_panel.title FILTER html %]
+ [% END %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ message = message
+ style_urls = ['skins/standard/params.css']
+ javascript_urls = ['js/params.js']
+ doc_section = "parameters.html"
+%]
+
+<table border="0" width="100%">
+ <tr>
+ <td>
+ [%# NAVIGATION BAR %]
+ <table id="menu">
+ <tr>
+ <td class="index">
+ <a href="editparams.cgi?section=index" title="Show all parameters">Index</a>
+ </td>
+ </tr>
+ [% FOREACH panel = panels %]
+ <tr>
+ [% IF panel.current %]
+ <td class="selected_section">
+ <span title="[% panel.desc FILTER html %]">[% panel.title FILTER html %]</span>
+ </td>
+ [% ELSE %]
+ <td>
+ <a href="editparams.cgi?section=[% panel.name FILTER url_quote %]"
+ title="[% panel.desc FILTER html %]">[% panel.title FILTER html %]</a>
+ </td>
+ [% END %]
+ </tr>
+ [% END %]
+ </table>
+ </td>
+ <td>
+ [% IF curpanel == -1 %]
+ [% PROCESS admin/params/index.html.tmpl panels = panels %]
+ [% ELSE %]
+
+ <div class="contribute"><strong>Note:</strong>
+ [%+ terms.Bugzilla %] is developed entirely by volunteers. The
+ best way to give back to the [% terms.Bugzilla %] project is
+ to <a href="http://www.bugzilla.org/contribute/">contribute</a>
+ yourself! You don't have to be a programmer to contribute, there are
+ lots of things that we need.
+ </div>
+
+ <p>
+ This lets you edit the basic operating parameters of [% terms.Bugzilla %].
+ Be careful!<br>
+ Any item you check "Reset" on will get reset to its default value.
+ </p>
+
+ [%# CONTENT PANEL %]
+ <form method="post" action="editparams.cgi">
+ [% PROCESS admin/params/common.html.tmpl panel = current_panel %]
+ <input type="hidden" name="section" value="[% current_panel.name FILTER html %]">
+ <input type="hidden" name="action" value="save">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" name="action" value="Save Changes">
+ </form>
+ [% END %]
+ </td>
+ </tr>
+</table>
+
+[% INCLUDE global/footer.html.tmpl %]
diff --git a/template/en/default/admin/params/general.html.tmpl b/template/en/default/admin/params/general.html.tmpl
new file mode 100644
index 0000000..b8c0c77
--- /dev/null
+++ b/template/en/default/admin/params/general.html.tmpl
@@ -0,0 +1,86 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%
+ title = "General"
+ desc = "Miscellaneous general settings that are not required."
+%]
+
+[% param_descs = {
+ maintainer =>
+ "The email address of the person who maintains this installation "
+ _ " of ${terms.Bugzilla}.",
+
+ docs_urlbase =>
+ "The URL that is the common initial leading part of all"
+ _ " $terms.Bugzilla documentation URLs. It may be an absolute URL,"
+ _ " or a URL relative to the <tt>urlbase</tt> parameter. Leave this"
+ _ " empty to suppress links to the documentation."
+ _ "'%lang%' will be replaced by user's preferred language (if"
+ _ " documentation is available in that language).",
+
+ utf8 =>
+ "Use UTF-8 (Unicode) encoding for all text in ${terms.Bugzilla}. New"
+ _ " installations should set this to true to avoid character encoding"
+ _ " problems. <strong>Existing databases should set this to true"
+ _ " only after the data has been converted from existing legacy"
+ _ " character encodings to UTF-8, using the <kbd>contrib/recode.pl</kbd>"
+ _ " script</strong>."
+ _ " <p>Note that if you turn this parameter from &quot;off&quot; to"
+ _ " &quot;on&quot;, you must re-run checksetup.pl immediately"
+ _ " afterward.</p>",
+
+ shutdownhtml =>
+ "If this field is non-empty, then $terms.Bugzilla will be completely"
+ _ " disabled and this text will be displayed instead of all the"
+ _ " $terms.Bugzilla pages.",
+
+ announcehtml =>
+ "If this field is non-empty, then $terms.Bugzilla will"
+ _ " display whatever is in this field at the top of every"
+ _ " HTML page. The HTML you put in this field is not wrapped or"
+ _ " enclosed in anything. You might want to wrap it inside a"
+ _ "<tt>&lt;div&gt;</tt>. Give the div <em>id=\"message\"</em> to get"
+ _ " green text inside a red box, or <em>class=\"bz_private\"</em> for"
+ _ " dark red on a red background. Anything defined in "
+ _ " <tt>skins/standard/global.css</tt> or <tt>skins/custom/global.css</tt>"
+ _ " will work. To get centered text, use <em>style=\"text-align: "
+ _ " center;\"</em>.",
+
+ upgrade_notification =>
+ "$terms.Bugzilla can inform you when a new release is available."
+ _ " The notification will appear on the $terms.Bugzilla homepage,"
+ _ " for administrators only."
+ _ " <ul><li>'development_snapshot' notifies you about the development "
+ _ " snapshot that has been released.</li>"
+ _ " <li>'latest_stable_release' notifies you about the most recent"
+ _ " release available on the most recent stable branch. This branch"
+ _ " may be different from the branch your installation is based on.</li>"
+ _ " <li>'stable_branch_release' notifies you only about new releases"
+ _ " corresponding to the branch your installation is based on."
+ _ " If you are running a release candidate, you will get a notification"
+ _ " for newer release candidates too.</li>"
+ _ " <li>'disabled' will never notify you about new releases and no"
+ _ " connection will be established to a remote server.</li></ul>"
+ _ " <p>Note that if your $terms.Bugzilla server requires a proxy to"
+ _ " access the Internet, you may also need to set the <tt>proxy_url</tt>"
+ _ " parameter in the Advanced section.</p>",
+} %]
diff --git a/template/en/default/admin/params/groupsecurity.html.tmpl b/template/en/default/admin/params/groupsecurity.html.tmpl
new file mode 100644
index 0000000..ab39a91
--- /dev/null
+++ b/template/en/default/admin/params/groupsecurity.html.tmpl
@@ -0,0 +1,56 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "Group Security"
+ desc = "Decide how you will use Security Groups"
+%]
+
+[% param_descs = {
+ makeproductgroups => "If this is on, $terms.Bugzilla will associate $terms.abug group " _
+ "with each product in the database, and use it for querying ${terms.bugs}.",
+
+ chartgroup => "The name of the group of users who can use the 'New Charts' " _
+ "feature. Administrators should ensure that the public categories " _
+ "and series definitions do not divulge confidential information " _
+ "before enabling this for an untrusted population. If left blank, " _
+ "no users will be able to use New Charts.",
+
+ insidergroup => "The name of the group of users who can see/change private " _
+ "comments and attachments.",
+
+ timetrackinggroup => "The name of the group of users who can see/change time tracking " _
+ "information.",
+
+ querysharegroup => "The name of the group of users who can share their " _
+ "saved searches with others.",
+
+ usevisibilitygroups => "Do you wish to restrict visibility of users to members of " _
+ "specific groups?",
+
+ strict_isolation => "Don't allow users to be assigned to, " _
+ "be qa-contacts on, " _
+ "be added to CC list, " _
+ "or make or remove dependencies " _
+ "involving any bug that is in a product on which that " _
+ "user is forbidden to edit.",
+
+ }
+%]
diff --git a/template/en/default/admin/params/index.html.tmpl b/template/en/default/admin/params/index.html.tmpl
new file mode 100644
index 0000000..1629c8c
--- /dev/null
+++ b/template/en/default/admin/params/index.html.tmpl
@@ -0,0 +1,51 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ # Nitish Bezzala <nbezzala@yahoo.com>
+ #%]
+
+<p>
+ All parameters are displayed below, per section.
+ If you cannot find one from here, then the parameter does not exist.
+</p>
+
+<div align="center">
+ <table>
+ <tr>
+ <th>Parameter</th>
+ <th>Section</th>
+ </tr>
+ [% FOREACH panel = panels %]
+ [% FOREACH param = panel.param_list.sort('name') %]
+ <tr>
+ <td>
+ <a href="editparams.cgi?section=
+ [%- panel.name FILTER url_quote %]#[% param.name FILTER url_quote %]">
+ [% param.name FILTER html %]</a>
+ </td>
+ <td>
+ [% panel.title FILTER html %]
+ </td>
+ </tr>
+ [% END %]
+ <tr>
+ <td>&nbsp;</td><td>&nbsp;</td>
+ </tr>
+ [% END %]
+ </table>
+</div>
diff --git a/template/en/default/admin/params/ldap.html.tmpl b/template/en/default/admin/params/ldap.html.tmpl
new file mode 100644
index 0000000..cdc585d
--- /dev/null
+++ b/template/en/default/admin/params/ldap.html.tmpl
@@ -0,0 +1,58 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "LDAP"
+ desc = "Configure this first before choosing LDAP as an authentication method"
+%]
+
+[% param_descs = {
+ LDAPserver => "The name (and optionally port) of your LDAP server " _
+ "(e.g. ldap.company.com, or ldap.company.com:portnum). " _
+ "URI syntax can also be used, such as "_
+ "ldaps://ldap.company.com (for a secure connection) or " _
+ "ldapi://%2fvar%2flib%2fldap_sock (for a socket-based " _
+ "local connection. Multiple hostnames or URIs can be comma " _
+ "separated; each will be tried in turn until a connection is " _
+ "established.",
+
+ LDAPstarttls => "Whether to require encrypted communication once a normal " _
+ "LDAP connection is achieved with the server.",
+
+ LDAPbinddn => "If your LDAP server requires that you use a binddn and password " _
+ "instead of binding anonymously, enter it here " _
+ "(e.g. cn=default,cn=user:password). " _
+ "Leave this empty for the normal case of an anonymous bind.",
+
+ LDAPBaseDN => "The BaseDN for authenticating users against " _
+ "(e.g. ou=People,o=Company).",
+
+ LDAPuidattribute => "The name of the attribute containing the user's login name.",
+
+ LDAPmailattribute => "The name of the attribute of a user in your " _
+ "directory that contains the email address, to be " _
+ "used as $terms.Bugzilla username. If this parameter " _
+ "is empty, $terms.Bugzilla will use the LDAP username"_
+ " as the $terms.Bugzilla username. You may also want" _
+ " to set the \"emailsuffix\" parameter, in this case.",
+
+ LDAPfilter => "LDAP filter to AND with the <tt>LDAPuidattribute</tt> for " _
+ "filtering the list of valid users." }
+%]
diff --git a/template/en/default/admin/params/mta.html.tmpl b/template/en/default/admin/params/mta.html.tmpl
new file mode 100644
index 0000000..8533257
--- /dev/null
+++ b/template/en/default/admin/params/mta.html.tmpl
@@ -0,0 +1,86 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "Email"
+ desc = "How will outgoing mail be delivered?"
+%]
+
+[% param_descs = {
+ mail_delivery_method => "Defines how email is sent, or if it is sent at all.<br>
+ <ul>
+ <li>
+ 'Sendmail', 'SMTP' and 'Qmail' are all MTAs.
+ You need to install a third-party sendmail replacement if
+ you want to use sendmail on Windows.
+ </li>
+ <li>
+ 'Test' is useful for debugging: all email is stored
+ in 'data/mailer.testfile' instead of being sent.
+ </li>
+ <li>
+ 'none' will completely disable email. $terms.Bugzilla continues
+ to act as though it is sending mail, but nothing is sent or
+ stored.
+ </li>
+ </ul>",
+
+ mailfrom => "The email address of the $terms.Bugzilla mail daemon. Some email systems " _
+ "require this to be a valid email address.",
+
+ use_mailer_queue => "In a large $terms.Bugzilla installation, updating"
+ _ " $terms.bugs can be very slow, because $terms.Bugzilla sends all"
+ _ " email at once. If you enable this parameter, $terms.Bugzilla will"
+ _ " queue all mail and then send it in the background. This requires"
+ _ " that you have installed certain Perl modules (as listed by"
+ _ " <code>checksetup.pl</code> for this feature), and that you are"
+ _ " running the <code>jobqueue.pl</code> daemon (otherwise your mail"
+ _ " won't get sent). This affects all mail sent by $terms.Bugzilla,"
+ _ " not just $terms.bug updates.",
+
+ sendmailnow => "Sites using anything older than version 8.12 of 'sendmail' " _
+ "can achieve a significant performance increase in the " _
+ "UI -- at the cost of delaying the sending of mail -- by " _
+ "disabling this parameter. Sites using 'sendmail' 8.12 or " _
+ "higher should leave this on, as they will see no benefit from " _
+ "turning it off. Sites using an MTA other than 'sendmail' " _
+ "<b>must</b> leave it on, or no $terms.bug mail will be sent.",
+
+ smtpserver => "The SMTP server address (if using SMTP for mail delivery).",
+
+ smtp_username => "The username to pass to the SMTP server for SMTP authentication. " _
+ "Leave this field empty if your SMTP server doesn't require authentication.",
+
+ smtp_password => "The password to pass to the SMTP server for SMTP authentication. " _
+ "This field has no effect if the smtp_username parameter is left empty.",
+
+ smtp_debug => "If enabled, this will print detailed information to your" _
+ " web server's error log about the communication between" _
+ " $terms.Bugzilla and your SMTP server. You can use this to" _
+ " troubleshoot email problems.",
+
+ whinedays => "The number of days that we'll let a $terms.bug sit untouched in a NEW " _
+ "state before our cronjob will whine at the owner.<br> " _
+ "Set to 0 to disable whining.",
+
+ globalwatchers => "A comma-separated list of users who should receive a " _
+ "copy of every notification mail the system sends." }
+
+%]
diff --git a/template/en/default/admin/params/patchviewer.html.tmpl b/template/en/default/admin/params/patchviewer.html.tmpl
new file mode 100644
index 0000000..389acc1
--- /dev/null
+++ b/template/en/default/admin/params/patchviewer.html.tmpl
@@ -0,0 +1,64 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "Patch Viewer"
+ desc = "Set up third-party applications to run with PatchViewer"
+%]
+
+[% param_descs = {
+ cvsroot => "The <a href=\"http://www.cvshome.org\">CVS</a> root that most " _
+ "users of your system will be using for 'cvs diff'. Used in " _
+ "Patch Viewer ('Diff' option on patches) to figure out where " _
+ "patches are rooted even if users did the 'cvs diff' from " _
+ "different places in the directory structure. (NOTE: if your " _
+ "CVS repository is remote and requires a password, you must " _
+ "either ensure the $terms.Bugzilla user has done a 'cvs login' or " _
+ "specify the password " _
+ "<a href=\"http://www.cvshome.org/docs/manual/cvs_2.html#SEC26\">as " _
+ "part of the CVS root</a>.) Leave this blank if you have no " _
+ "CVS repository.",
+
+ cvsroot_get => "The CVS root $terms.Bugzilla will be using to get patches from. " _
+ "Some installations may want to mirror their CVS repository on " _
+ "the $terms.Bugzilla server or even have it on that same server, and " _
+ "thus the repository can be the local file system (and much " _
+ "faster). Make this the same as cvsroot if you don't " _
+ "understand what this is (if cvsroot is blank, make this blank too).",
+
+ bonsai_url => "The URL to a <a href=\"http://www.mozilla.org/bonsai.html\">Bonsai</a> " _
+ "server containing information about your CVS repository. " _
+ "Patch Viewer will use this information to create links to " _
+ "bonsai's blame for each section of a patch (it will append " _
+ "'/cvsblame.cgi?...' to this url). Leave this blank if you " _
+ "don't understand what this is.",
+
+ lxr_url => "The URL to an <a href=\"http://sourceforge.net/projects/lxr\">LXR</a> server " _
+ "that indexes your CVS repository. Patch Viewer will use this " _
+ "information to create links to LXR for each file in a patch. " _
+ "Leave this blank if you don't understand what this is.",
+
+ lxr_root => "Some LXR installations do not index the CVS repository from the root -- " _
+ "<a href=\"http://lxr.mozilla.org/mozilla\">Mozilla's</a>, for " _
+ "example, starts indexing under <code>mozilla/</code>. This " _
+ "means URLs are relative to that extra path under the root. " _
+ "Enter this if you have a similar situation. Leave it blank " _
+ "if you don't know what this is." }
+%]
diff --git a/template/en/default/admin/params/query.html.tmpl b/template/en/default/admin/params/query.html.tmpl
new file mode 100644
index 0000000..34ea043
--- /dev/null
+++ b/template/en/default/admin/params/query.html.tmpl
@@ -0,0 +1,58 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "Query Defaults"
+ desc = "Default options for query and $terms.bug lists"
+%]
+
+[% param_descs = {
+ quip_list_entry_control => "Controls how easily users can add entries to the quip list.
+ <ul>
+ <li>
+ open - Users may freely add to the quip list, and
+ their entries will immediately be available for viewing.
+ </li>
+ <li>
+ moderated - quips can be entered, but need to be approved
+ by an admin before they will be shown.
+ </li>
+ <li>
+ closed - no new additions to the quips list are allowed.
+ </li>
+ </ul>",
+
+ mostfreqthreshold => "The minimum number of duplicates $terms.abug needs to show up on the " _
+ "<a href=\"duplicates.cgi\">most frequently reported $terms.bugs page</a>. " _
+ "If you have a large database and this page takes a long time to " _
+ "load, try increasing this number.",
+
+ mybugstemplate => "This is the URL to use to bring up a simple 'all of my $terms.bugs' " _
+ "list for a user. %userid% will get replaced with the login name of a user.",
+
+ defaultquery => "This is the default query that initially comes up when you " _
+ "access the advanced query page. It's in URL parameter " _
+ "format, which makes it hard to read. Sorry!",
+
+ specific_search_allow_empty_words =>
+ "Whether to allow a search on the 'Simple Search' page with an empty"
+ _ " 'Words' field.",
+
+} %]
diff --git a/template/en/default/admin/params/radius.html.tmpl b/template/en/default/admin/params/radius.html.tmpl
new file mode 100644
index 0000000..ef2282d
--- /dev/null
+++ b/template/en/default/admin/params/radius.html.tmpl
@@ -0,0 +1,54 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Marc Schumann.
+ # Portions created by Marc Schumann are Copyright (c) 2007 Marc Schumann.
+ # All rights reserved.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+[%
+ title = "RADIUS"
+ desc = "Configure this first before choosing RADIUS as an authentication method"
+%]
+
+[% param_descs = {
+ RADIUS_server => "The name (and optionally port) of your RADIUS server " _
+ "(e.g. <code>radius.company.com</code>, or " _
+ "<code>radius.company.com:portnum</code>).<br>" _
+ "Required only if " _
+ "<a href=\"?section=auth#user_verify_class\">the " _
+ "<code>user_verify_class</code> parameter</a> contains " _
+ "<code>RADIUS</code>.",
+
+ RADIUS_secret => "Your RADIUS server's secret.<br>" _
+ "Required only if " _
+ "<a href=\"?section=auth#user_verify_class\">the " _
+ "<code>user_verify_class</code> parameter</a> contains " _
+ "<code>RADIUS</code>.",
+
+ RADIUS_NAS_IP => "The NAS-IP-Address attribute to be used when exchanging " _
+ "data with your RADIUS server. " _
+ "If unspecified, <code>127.0.0.1</code> will be used.<br>" _
+ "Useful only if " _
+ "<a href=\"?section=auth#user_verify_class\">the " _
+ "<code>user_verify_class</code> parameter</a> " _
+ "contains <code>RADIUS</code>.",
+
+ RADIUS_email_suffix => "Suffix to append to a RADIUS user name to form an " _
+ "e-mail address.<br>" _
+ "Useful only if " _
+ "<a href=\"?section=auth#user_verify_class\">the " _
+ "<code>user_verify_class</code> parameter</a> " _
+ "contains <code>RADIUS</code>.",
+ }
+%]
diff --git a/template/en/default/admin/params/shadowdb.html.tmpl b/template/en/default/admin/params/shadowdb.html.tmpl
new file mode 100644
index 0000000..c812284
--- /dev/null
+++ b/template/en/default/admin/params/shadowdb.html.tmpl
@@ -0,0 +1,49 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "Shadow Database"
+ desc = "An optional hack to increase database performance"
+%]
+
+[% param_descs = {
+ shadowdbhost => "The host the shadow database is on.",
+
+ shadowdbport => "The port the shadow database is on. Ignored if " _
+ "<tt>shadowdbhost</tt> is blank. Note: if the host is the local " _
+ "machine, then MySQL will ignore this setting, and you must " _
+ "specify a socket below.",
+
+ shadowdbsock => "The socket used to connect to the shadow database, if the host " _
+ "is the local machine. This setting is required because MySQL " _
+ "ignores the port specified by the client and connects using " _
+ "its compiled-in socket path (on unix machines) when connecting " _
+ "from a client to a local server. If you leave this blank, and " _
+ "have the database on localhost, then the <tt>shadowdbport</tt> " _
+ "will be ignored.",
+
+ shadowdb => "If non-empty, then this is the name of another database in " _
+ "which $terms.Bugzilla will use as a read-only copy of everything. " _
+ "This is done so that long slow read-only operations can be used " _
+ "against this db, and not lock up things for everyone else. This " _
+ "database is on the <tt>shadowdbhost</tt>, and must exist. " _
+ "$terms.Bugzilla does not update it, if you use this parameter, then " _
+ "you need to set up replication for your database." }
+%]
diff --git a/template/en/default/admin/params/usermatch.html.tmpl b/template/en/default/admin/params/usermatch.html.tmpl
new file mode 100644
index 0000000..54f1509
--- /dev/null
+++ b/template/en/default/admin/params/usermatch.html.tmpl
@@ -0,0 +1,39 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Miller <justdave@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+[%
+ title = "User Matching"
+ desc = "Set up your user matching policies"
+%]
+
+[% param_descs = {
+ usemenuforusers => "If this option is set, $terms.Bugzilla will offer you a list " _
+ "to select from (instead of a text entry field) where a user " _
+ "needs to be selected. This option should not be enabled on " _
+ "sites where there are a large number of users.",
+
+ maxusermatches => "Search for no more than this many matches.<br> " _
+ "If set to '1', no users will be displayed on ambiguous matches. " _
+ "This is useful for user privacy purposes.<br> " _
+ "A value of zero means no limit.",
+
+ confirmuniqueusermatch => "Whether a confirmation screen should be displayed when only " _
+ "one user matches a search entry." }
+%]
diff --git a/template/en/default/admin/products/confirm-delete.html.tmpl b/template/en/default/admin/products/confirm-delete.html.tmpl
new file mode 100644
index 0000000..f4a04b8
--- /dev/null
+++ b/template/en/default/admin/products/confirm-delete.html.tmpl
@@ -0,0 +1,266 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # product: Bugzilla::Product object; The product
+ #
+ # (classification fields available if Param('useclassification') is enabled:)
+ #
+ # classification: Bugzilla::Classification object; The classification
+ # the product is in
+ #
+ #%]
+
+[% title = BLOCK %]Delete Product '[% product.name FILTER html %]'
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ style_urls = ['skins/standard/admin.css']
+%]
+
+<table border="1" cellpadding="4" cellspacing="0">
+ <tr bgcolor="#6666FF">
+ <th valign="top" align="left">Field</th>
+ <th valign="top" align="left">Value</th>
+ </tr>
+
+ [% IF Param('useclassification') %]
+ <tr>
+ <td>Classification:</td>
+ <td>[% classification.name FILTER html %]</td>
+ </tr>
+ <tr>
+ <td>Classification Description:</td>
+ [%# descriptions are intentionally not filtered to allow html content %]
+ <td>
+ [% IF classification.description %]
+ [% classification.description FILTER html_light %]
+ [% ELSE %]
+ <span style="color: red">missing</span>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <td valign="top">Product:</td>
+ <td valign="top">
+ <a href="editproducts.cgi?product=[% product.name FILTER url_quote %]">
+ [% product.name FILTER html %]
+ </a>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">Description:</td>
+ [%# descriptions are intentionally not filtered to allow html content %]
+ <td valign="top">
+ [% IF product.description %]
+ [% product.description FILTER html_light %]
+ [% ELSE %]
+ <span style="color: red">missing</span>
+ [% END %]
+ </td>
+ </tr>
+
+ [% IF Param('usetargetmilestone') %]
+ <tr>
+ <td>Milestone URL:</td>
+ <td>
+ [% IF product.milestone_url %]
+ <a href="[% product.milestone_url FILTER html %]">
+ [%- product.milestone_url FILTER html %]
+ </a>
+ [% ELSE %]
+ none
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <td>Closed for [% terms.bugs %]:</td>
+ <td>
+ [% IF product.is_active %]
+ open
+ [% ELSE %]
+ closed
+ [% END %]
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ [% IF product.components.size > 0 %]
+ <a href="editcomponents.cgi?product=[% product.name FILTER url_quote %]"
+ title="Edit components for product '[% product.name FILTER html %]'">
+ Components:
+ </a>
+ [% ELSE %]
+ Components:
+ [% END %]
+ </td>
+ <td>
+ [% IF product.components.size > 0 %]
+ <table>
+ [% FOREACH c = product.components %]
+ <tr>
+ <th align="right">[% c.name FILTER html %]:</th>
+ [%# descriptions are intentionally not filtered to allow html content %]
+ <td>
+ [% IF c.description %]
+ [% c.description FILTER html_light %]
+ [% ELSE %]
+ <span style="color: red">missing</span>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+ </table>
+ [% ELSE %]
+ none
+ [% END %]
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ [% IF product.versions.size > 0 %]
+ <a href="editversions.cgi?product=[%- product.name FILTER url_quote %]">
+ Versions:
+ </a>
+ [% ELSE %]
+ Versions:
+ [% END %]
+ </td>
+ <td>
+ [% IF product.versions.size > 0 %]
+ [% FOREACH v = product.versions %]
+ [% v.name FILTER html %]<br>
+ [% END %]
+ [% ELSE %]
+ none
+ [% END %]
+ </td>
+ </tr>
+
+
+ [% IF Param('usetargetmilestone') %]
+ <tr>
+ <td valign="top">
+ [% IF product.milestones.size > 0 %]
+ <a href="editmilestones.cgi?product=[%- product.name FILTER url_quote %]">
+ Milestones:
+ </a>
+ [% ELSE %]
+ Milestones:
+ [% END %]
+ </td>
+ <td>
+ [% IF product.milestones.size > 0 %]
+ [% FOREACH m = product.milestones %]
+ [% m.name FILTER html %]<br>
+ [% END %]
+ [% ELSE %]
+ none
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <td>[% terms.Bugs %]:</td>
+ <td>
+ [% IF product.bug_count %]
+ <a href="buglist.cgi?product=[% product.name FILTER url_quote %]"
+ title="List of [% terms.bugs %] for product '[% product.name FILTER html %]'">
+ [% product.bug_count FILTER html %]
+ </a>
+ [% ELSE %]
+ none
+ [% END %]
+ </td>
+ </tr>
+</table>
+
+<h2>Confirmation</h2>
+
+[% IF product.bug_count %]
+
+ [% IF !Param("allowbugdeletion") %]
+
+ <p>Sorry, there
+
+ [% IF product.bug_count > 1 %]
+ are [% product.bug_count FILTER html %] [%+ terms.bugs %]
+ [% ELSE %]
+ is 1 [% terms.bug %]
+ [% END %]
+
+ outstanding for this product. You must reassign
+
+ [% IF product.bug_count > 1 %]
+ those [% terms.bugs %]
+ [% ELSE %]
+ that [% terms.bug %]
+ [% END %]
+
+ to another product before you can delete this one.</p>
+
+ [% ELSE %]
+
+ <table border="0" cellpadding="20" width="70%" bgcolor="red">
+ <tr>
+ <td>
+ There
+ [% IF product.bug_count > 1 %]
+ are [% product.bug_count FILTER html %] [%+ terms.bugs %]
+ [% ELSE %]
+ is 1 [% terms.bug %]
+ [% END %]
+ entered for this product! When you delete this
+ product, <b><blink>ALL</blink></b> stored [% terms.bugs %] and
+ their history will be deleted, too.
+ </td>
+ </tr>
+ </table>
+
+ [% END %]
+
+[% END %]
+
+[% Hook.process("confirmation") %]
+
+[% IF product.bug_count == 0 || Param('allowbugdeletion') %]
+
+ <p>Do you really want to delete this product?</p>
+
+ <form method="post" action="editproducts.cgi">
+ <input type="checkbox" id="delete_series" name="delete_series" value=1>
+ <label for="delete_series">
+ Delete all related series (you can also delete them later, by visiting
+ the <a href="chart.cgi?category=[% product.name FILTER html %]">New Charts page</a>.)
+ </label><p>
+ <input type="submit" id="delete" value="Yes, delete">
+ <input type="hidden" name="action" value="delete">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ </form>
+
+[% END %]
+
+[% PROCESS admin/products/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/products/create.html.tmpl b/template/en/default/admin/products/create.html.tmpl
new file mode 100644
index 0000000..f4a2161
--- /dev/null
+++ b/template/en/default/admin/products/create.html.tmpl
@@ -0,0 +1,69 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Gabriel S. Oliveira <gabriel@async.com.br>
+ #%]
+
+[%# INTERFACE:
+ # classification: Bugzilla::Classification object; If classifications
+ # are enabled, then this is
+ # the currently selected classification
+ #
+ #%]
+
+[% title = BLOCK %]Add Product[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ style_urls = ['skins/standard/admin.css']
+ javascript_urls = ['js/util.js']
+%]
+
+[% DEFAULT
+ product.votesperuser = "0",
+ product.maxvotesperbug = "10000",
+ product.votes_to_confirm = "0",
+ product.is_active = 1,
+ version = "unspecified",
+ product.defaultmilestone = constants.DEFAULT_MILESTONE
+ product.allows_unconfirmed = 0
+%]
+
+<form method="post" action="editproducts.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+
+ [% PROCESS "admin/products/edit-common.html.tmpl" %]
+
+ <tr>
+ <th align="right">Version:</th>
+ <td><input size="64" maxlength="255" name="version"
+ value="[% version FILTER html %]">
+ </td>
+ </tr>
+ <tr>
+ <th align="right">Create chart datasets for this product:</th>
+ <td><input type="checkbox" name="createseries" value="1"></td>
+ </tr>
+ </table>
+
+ <input type="submit" value="Add">
+ <input type="hidden" name="action" value="new">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="hidden" name="classification"
+ value="[% classification.name FILTER html %]">
+</form>
+
+[% PROCESS "admin/products/footer.html.tmpl"
+ no_add_product_link = 1
+ no_edit_product_link = 1 %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/products/edit-common.html.tmpl b/template/en/default/admin/products/edit-common.html.tmpl
new file mode 100644
index 0000000..2c94402
--- /dev/null
+++ b/template/en/default/admin/products/edit-common.html.tmpl
@@ -0,0 +1,112 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Jack Nerad <jnerad@bellsouth.net>
+ # Tiago R. Mello <tiago@async.com.br>
+ # Gabriel S. Oliveira <gabriel@async.com.br>
+ #%]
+
+[%# INTERFACE:
+ # product: Bugzilla::Product object; The product
+ #
+ # classification: Bugzilla::Classifiation object; classification product is in.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% IF Param('useclassification') %]
+ <tr>
+ <th align="right"><b>Classification:</b></th>
+ <td><b>[% classification.name FILTER html %]</b></td>
+ </tr>
+[% END %]
+
+<tr>
+ <th align="right">Product:</th>
+ <td><input size="64" maxlength="64" name="product"
+ value="[% product.name FILTER html %]">
+ </td>
+</tr>
+<tr>
+ <th align="right">Description:</th>
+ <td><textarea rows="4" cols="64" wrap="virtual" name="description">
+ [% product.description FILTER html %]</textarea>
+ </td>
+</tr>
+
+[% IF Param('usetargetmilestone') -%]
+ <tr>
+ <th align="right">Default milestone:</th>
+ <td>
+ [% IF product.milestones.size %]
+ <select name="defaultmilestone">
+ [% FOREACH m = product.milestones %]
+ <option value="[% m.name FILTER html %]"
+ [% " selected=\"selected\"" IF m.name == product.defaultmilestone %]>
+ [%- m.name FILTER html -%]</option>
+ [% END %]
+ </select>
+ [% ELSE %]
+ <input type="text" size="20" maxlength="20" name="defaultmilestone"
+ value="[% product.defaultmilestone FILTER html %]">
+ [% END %]
+ </td>
+ </tr>
+[% END %]
+
+<tr>
+ <th align="right">Open for [% terms.bug %] entry:</th>
+ <td><input type="checkbox" name="is_active" value="1"
+ [% ' checked="checked"' IF product.is_active %]>
+ </td>
+</tr>
+<tr>
+ <th align="right">
+ <label for="allows_unconfirmed">Enable the
+ [%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %] status
+ in this product:</label>
+ </th>
+ <td><input type="checkbox" id="allows_unconfirmed" name="allows_unconfirmed"
+ [% ' checked="checked"' IF product.allows_unconfirmed %]
+ [% IF Param('usevotes') %]
+ onchange="bz_toggleClass('votes_to_confirm_container',
+ 'bz_default_hidden')"
+ [% END %]>
+ [% IF Param('usevotes') %]
+ <span id="votes_to_confirm_container"
+ [% ' class="bz_default_hidden"' IF !product.allows_unconfirmed %]>
+ ...and automatically confirm [% terms.bugs %] if they get
+ <input size="3" maxlength="5" name="votestoconfirm" id="votestoconfirm"
+ value="[% product.votes_to_confirm FILTER html %]">
+ votes. (Setting this to 0 disables auto-confirming [% terms.bugs %]
+ by vote.)
+ </span>
+ [% END %]
+ </td>
+</tr>
+
+[% IF Param('usevotes') %]
+ <tr>
+ <th align="right">Maximum votes per person:</th>
+ <td><input size="5" maxlength="5" name="votesperuser" id="votesperuser"
+ value="[% product.votesperuser FILTER html %]">
+ </td>
+ </tr>
+ <tr>
+ <th align="right">
+ Maximum votes a person can put on a single [% terms.bug %]:
+ </th>
+ <td><input size="5" maxlength="5" name="maxvotesperbug" id="maxvotesperbug"
+ value="[% product.maxvotesperbug FILTER html %]">
+ </td>
+ </tr>
+[% END %]
diff --git a/template/en/default/admin/products/edit.html.tmpl b/template/en/default/admin/products/edit.html.tmpl
new file mode 100644
index 0000000..976739f
--- /dev/null
+++ b/template/en/default/admin/products/edit.html.tmpl
@@ -0,0 +1,149 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Jack Nerad <jnerad@bellsouth.net>
+ # Tiago R. Mello <tiago@async.com.br>
+ # Gabriel S. Oliveira <gabriel@async.com.br>
+ #%]
+
+[%# INTERFACE:
+ # product: Bugzilla::Product object; The product
+ #
+ # (classification fields available if Param('useclassification') is enabled:)
+ #
+ # classification: Bugzilla::Classification object; The classification
+ # the product is in
+ #%]
+
+[% title = BLOCK %]Edit Product '[% product.name FILTER html %]'[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ style_urls = ['skins/standard/admin.css']
+ javascript_urls = ['js/util.js']
+%]
+
+[% group_control = {${constants.CONTROLMAPNA} => 'NA',
+ ${constants.CONTROLMAPSHOWN} => 'Shown',
+ ${constants.CONTROLMAPDEFAULT} => 'Default',
+ ${constants.CONTROLMAPMANDATORY} => 'Mandatory'}
+ %]
+
+<form method="post" action="editproducts.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+
+ [% PROCESS "admin/products/edit-common.html.tmpl" %]
+
+ <tr>
+ <th align="right" valign="top">
+ <a href="editcomponents.cgi?product=[% product.name FILTER url_quote %]">
+ Edit components:
+ </a>
+ </th>
+ <td>
+ [% IF product.components.size -%]
+ [% FOREACH component = product.components %]
+ <b>[% component.name FILTER html %]:</b>&nbsp;
+ [% IF component.description %]
+ [% component.description FILTER html_light %]
+ [% ELSE %]
+ <font color="red">description missing</font>
+ [% END %]
+ <br>
+ [% END %]
+ [% ELSE %]
+ <font color="red">missing</font>
+ [% END %]
+ </td>
+ </tr>
+ <tr>
+ <th align="right" valign="top">
+ <a href="editversions.cgi?product=[% product.name FILTER url_quote %]">Edit
+versions:</a>
+ </th>
+ <td>
+ [%- IF product.versions.size -%]
+ [% FOREACH v = product.versions %]
+ [% v.name FILTER html %]
+ <br>
+ [% END %]
+ [% ELSE %]
+ <font color="red">missing</font>
+ [% END %]
+ </td>
+ </tr>
+ [% IF Param('usetargetmilestone') %]
+ <tr>
+ <th align="right" valign="top">
+ <a href="editmilestones.cgi?product=[% product.name FILTER url_quote %]">
+ Edit milestones:</a>
+ </th>
+ <td>
+ [%- IF product.milestones.size -%]
+ [%- FOREACH m = product.milestones -%]
+ [% m.name FILTER html %]
+ <br>
+ [% END %]
+ [% ELSE %]
+ <font color="red">missing</font>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+ <tr>
+ <th align="right" valign="top">
+ <a href="editproducts.cgi?action=editgroupcontrols&product=
+ [%- product.name FILTER url_quote %]">
+ Edit Group Access Controls:
+ </a>
+ </th>
+ <td>
+ [% IF product.group_controls.size %]
+ [% FOREACH g = product.group_controls.values.sort("name") %]
+ <b>[% g.group.name FILTER html %]:</b>&nbsp;
+ [% IF g.group.isactive %]
+ [% group_control.${g.membercontrol} FILTER html %]/
+ [% group_control.${g.othercontrol} FILTER html %]
+ [% IF g.entry %], ENTRY[% END %]
+ [% IF g.canedit %], CANEDIT[% END %]
+ [% IF g.editcomponents %], editcomponents[% END %]
+ [% IF g.canconfirm %], canconfirm[% END %]
+ [% IF g.editbugs %], editbugs[% END %]
+ [% ELSE %]
+ DISABLED
+ [% END %]
+ <br>
+ [% END %]
+ [% ELSE %]
+ no groups
+ [% END %]
+ </td>
+ </tr>
+ <tr>
+ <th align="right">[% terms.Bugs %]:</th>
+ <td><a href="buglist.cgi?product=[% product.name FILTER url_quote %]">
+ [% product.bug_count FILTER html %]</a></td>
+ </tr>
+ </table>
+
+ <input type="hidden" name="product_old_name"
+ value="[% product.name FILTER html %]">
+ <input type="hidden" name="action" value="update">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" name="submit" value="Save Changes">
+</form>
+
+[% PROCESS "admin/products/footer.html.tmpl"
+ no_add_product_link = 1
+ no_edit_product_link = 1 %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/products/footer.html.tmpl b/template/en/default/admin/products/footer.html.tmpl
new file mode 100644
index 0000000..661829b
--- /dev/null
+++ b/template/en/default/admin/products/footer.html.tmpl
@@ -0,0 +1,86 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # product: Bugzilla::Product Object; the product
+ #
+ # classification: Bugzilla::Classification object ; If classifications
+ # are enabled, then this is the currently
+ # selected classification
+ #
+ # no_XXX_link: boolean; if defined, then don't show the corresponding
+ # link. Supported parameters are:
+ #
+ # no_edit_product_link
+ # no_edit_other_products_link
+ # no_add_product_link
+ #%]
+
+[% IF Param('useclassification') && classification %]
+ [% classification_url_part = BLOCK %]&amp;classification=
+ [%- classification.name FILTER url_quote %]
+ [% END %]
+ [% classification_url_part_start = BLOCK %]classification=
+ [%- classification.name FILTER url_quote %]
+ [% END %]
+ [% classification_text = BLOCK %]
+ of classification '[% classification.name FILTER html %]'
+ [% END %]
+[% END %]
+
+<hr>
+
+<p>
+[% UNLESS no_add_product_link || !user.in_group("editcomponents") %]
+ <a title="Add a product"
+ href="editproducts.cgi?action=add">Add</a> a product[% -%]
+[%# Strictly speaking, we should not have to check for a
+ classification if they are enabled, but I'm just being paranoid %]
+ [% IF Param('useclassification') && classification %]
+ (<a title="Add a product to classification '
+ [%- classification.name FILTER html %]'"
+ href="editproducts.cgi?action=add
+ [%- classification_url_part %]">to
+ classification '[% classification.name FILTER html %]'</a>)
+ [% END %].
+[% END %]
+
+[% IF product && !no_edit_product_link %]
+ Edit product <a
+ title="Edit Product '[% product.name FILTER html %]'
+ [%- classification_text %]"
+ href="editproducts.cgi?action=edit&amp;product=[% product.name FILTER url_quote %]">
+ '[% product.name FILTER html %]'</a>.
+[% END %]
+
+
+[%# Edit other products (in a classification if specified): %]
+[% UNLESS no_edit_other_products_link %]
+ Edit <a
+ href="editproducts.cgi?
+ [%- classification_url_part_start FILTER none %]">other products
+ [% classification_text %]</a>.
+
+[% END %]
+
+[% IF Param('useclassification') && classification
+ && user.in_group('editclassifications') %]
+ Edit classification <a href="editclassifications.cgi?action=edit
+ [%- classification_url_part %]">'
+ [%- classification.name FILTER html %]'</a>.
+
+[% END %]
+
+</p>
diff --git a/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl b/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl
new file mode 100644
index 0000000..1fc92c9
--- /dev/null
+++ b/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl
@@ -0,0 +1,58 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Joel Peshkin <bugreport@peshkin.net>
+ #
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% title = BLOCK %]
+ Confirm Group Control Change for product '[%- product.name FILTER html %]'
+[% END %]
+
+[% PROCESS global/header.html.tmpl title = title %]
+[% FOREACH group = mandatory_groups %]
+<P>
+group '[% group.name FILTER html %]' impacts [% group.count %]
+[%+ terms.bugs %] for
+which the group is newly mandatory and will be added.
+[% END %]
+
+[% FOREACH group = na_groups %]
+<P>
+group '[% group.name FILTER html %]' impacts [% group.count %]&nbsp;
+[% terms.bugs %] for which the group is no longer applicable and will
+be removed.[% END %]
+<form action="editproducts.cgi" method="post" >
+
+ [% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %]
+
+ <br>
+ Click "Continue" to proceed with the change including the changes
+ indicated above. If you do not want these changes, use "back" to
+ return to the previous page.
+ <p>
+ <input type="hidden" name="confirmed" value="confirmed">
+ <input type="submit" id="update" value="Continue">
+ </p>
+
+</form>
+
+
+[% PROCESS global/footer.html.tmpl %]
+
+
diff --git a/template/en/default/admin/products/groupcontrol/edit.html.tmpl b/template/en/default/admin/products/groupcontrol/edit.html.tmpl
new file mode 100644
index 0000000..8c634eb
--- /dev/null
+++ b/template/en/default/admin/products/groupcontrol/edit.html.tmpl
@@ -0,0 +1,325 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Joel Peshkin <bugreport@peshkin.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]
+ Edit Group Controls for [% product.name FILTER html %]
+[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+<form method="post" action="editproducts.cgi">
+ <input type="hidden" name="action" value="updategroupcontrols">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+
+ <table id="form" cellspacing="0" cellpadding="4" border="1">
+ <tr bgcolor="#6666ff">
+ <th>Group</th>
+ <th>Entry</th>
+ <th>MemberControl</th>
+ <th>OtherControl</th>
+ <th>Canedit</th>
+ <th>editcomponents</th>
+ <th>canconfirm</th>
+ <th>editbugs</th>
+ <th>[% terms.Bugs %]</th>
+ </tr>
+ [% FOREACH group = product.group_controls(1).values.sort("name") %]
+ [% IF !group.group.isactive AND group.bug_count %]
+ <tr bgcolor="#bbbbbb">
+ <td>
+ [% group.group.name FILTER html %]
+ </td>
+ <td align="center" colspan=7>
+ Disabled
+ </td>
+ <td>
+ [% group.bug_count FILTER html %]
+ </td>
+ <tr>
+ [% ELSIF group.group.is_active %]
+ <tr>
+ <td>
+ [% group.group.name FILTER html %]
+ </td>
+ <td>
+ <input type=checkbox value=1 name=entry_[% group.id %]
+ [% " checked=\"checked\"" IF group.entry %]>
+ </td>
+ <td>
+ <select name="membercontrol_[% group.id %]">
+ <option value=[% constants.CONTROLMAPNA %]
+ [% " selected=\"selected\""
+ IF group.membercontrol == constants.CONTROLMAPNA %]
+ >NA
+ </option>
+ <option value=[% constants.CONTROLMAPSHOWN %]
+ [% " selected=\"selected\""
+ IF group.membercontrol == constants.CONTROLMAPSHOWN %]
+ >Shown
+ </option>
+ <option value=[% constants.CONTROLMAPDEFAULT %]
+ [% " selected=\"selected\""
+ IF group.membercontrol == constants.CONTROLMAPDEFAULT %]
+ >Default
+ </option>
+ <option value=[% constants.CONTROLMAPMANDATORY %]
+ [% " selected=\"selected\""
+ IF group.membercontrol == constants.CONTROLMAPMANDATORY %]
+ >Mandatory
+ </option>
+ </select>
+ </td>
+ <td>
+ <select name="othercontrol_[% group.id %]">
+ <option value=[% constants.CONTROLMAPNA %]
+ [% " selected=\"selected\""
+ IF group.othercontrol == constants.CONTROLMAPNA %]
+ >NA
+ </option>
+ <option value=[% constants.CONTROLMAPSHOWN %]
+ [% " selected=\"selected\""
+ IF group.othercontrol == constants.CONTROLMAPSHOWN %]
+ >Shown
+ </option>
+ <option value=[% constants.CONTROLMAPDEFAULT %]
+ [% " selected=\"selected\""
+ IF group.othercontrol == constants.CONTROLMAPDEFAULT %]
+ >Default
+ </option>
+ <option value=[% constants.CONTROLMAPMANDATORY %]
+ [% " selected=\"selected\""
+ IF group.othercontrol == constants.CONTROLMAPMANDATORY %]
+ >Mandatory
+ </option>
+ </select>
+ </td>
+ <td>
+ <input type=checkbox value=1 name=canedit_[% group.id %]
+ [% " checked=\"checked\"" IF group.canedit %]>
+ </td>
+ <td>
+ <input type=checkbox value=1 name=editcomponents_[% group.id %]
+ [% " checked=\"checked\"" IF group.editcomponents %]>
+ </td>
+ <td>
+ <input type=checkbox value=1 name=canconfirm_[% group.id %]
+ [% " checked=\"checked\"" IF group.canconfirm %]>
+ </td>
+ <td>
+ <input type=checkbox value=1 name=editbugs_[% group.id %]
+ [% " checked=\"checked\"" IF group.editbugs %]>
+ </td>
+ <td>
+ [% group.bug_count || 0 FILTER html %]
+ </td>
+ </tr>
+ [% END %]
+ [% END %]
+
+ </table>
+ <br>
+ <input type=submit name="submit" value="submit">
+ <br>
+</form>
+
+
+<p>
+These settings control the relationship of the groups to this
+product.
+</p>
+<p>
+If any group has <b>Entry</b> selected, then this product will
+restrict [% terms.bug %] entry to only those users who are members of all the
+groups with entry selected.
+</p>
+<p>
+If any group has <b>Canedit</b> selected, then this product
+will be read-only for any users who are not members of all of
+the groups with Canedit selected. ONLY users who are members of
+all the canedit groups will be able to edit. This is an additional
+restriction that further restricts what can be edited by a user.
+</p>
+<p>
+The following settings control let you choose privileges on a <b>per-product basis</b>.
+This is a convenient way to give privileges to some users for some products
+only, without having to give them global privileges which would affect all
+products:
+</p>
+<p>
+Any group having <b>editcomponents</b> selected allows users who are
+in this group to edit all aspects of this product, including components,
+milestones and versions.
+</p>
+<p>
+Any group having <b>canconfirm</b> selected allows users who are
+in this group to confirm [% terms.bugs %] in this product.
+</p>
+<p>
+Any group having <b>editbugs</b> selected allows users who are
+in this group to edit all fields of [% terms.bugs %] in this product.
+</p>
+<p>
+The <b>MemberControl</b> and <b>OtherControl</b> fields
+indicate which [% terms.bugs %] will be placed in
+this group according to the following definitions.
+</p>
+
+<table border=1>
+ <tr>
+ <th>
+ MemberControl
+ </th>
+ <th>
+ OtherControl
+ </th>
+ <th>
+ Interpretation
+ </th>
+ </tr>
+ <tr>
+ <td>
+ NA
+ </td>
+ <td>
+ NA
+ </td>
+ <td>
+ [% terms.Bugs %] in this product are never associated with this group.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ Shown
+ </td>
+ <td>
+ NA
+ </td>
+ <td>
+ [% terms.Bugs %] in this product are permitted to be restricted to this
+ group. Users who are members of this group will be able to place [% terms.bugs %] in
+ this group.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ Shown
+ </td>
+ <td>
+ Shown
+ </td>
+ <td>
+ [% terms.Bugs %] in this product can be placed in this group by anyone
+ with permission to edit the [% terms.bug %] even if they are not a member
+ of this group.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ Shown
+ </td>
+ <td>
+ Default
+ </td>
+ <td>
+ [% terms.Bugs %] in this product can be placed in this group by anyone
+ with permission to edit the [% terms.bug %] even if they are not a member
+ of this group. Non-members place [% terms.bugs %] in this group by default.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ Shown
+ </td>
+ <td>
+ Mandatory
+ </td>
+ <td>
+ [% terms.Bugs %] in this product are permitted to be restricted to this
+ group. Users who are members of this group will be able to place [% terms.bugs %]
+ in this group. Non-members will be forced to restrict [% terms.bugs %] to
+ this group when they initially enter [% terms.abug %] in this product.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ Default
+ </td>
+ <td>
+ NA
+ </td>
+ <td>
+ [% terms.Bugs %] in this product are permitted to be restricted to this
+ group and are placed in this group by default. Users who are members of this
+ group will be able to place [% terms.bugs %] in this group.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ Default
+ </td>
+ <td>
+ Default
+ </td>
+ <td>
+ [% terms.Bugs %] in this product are permitted to be restricted to this
+ group and are placed in this group by default. Users who are members of this group
+ will be able to place [% terms.bugs %] in this group. Non-members will be
+ able to restrict [% terms.bugs %] to this group on entry and will do so by default.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ Default
+ </td>
+ <td>
+ Mandatory
+ </td>
+ <td>
+ [% terms.Bugs %] in this product are permitted to be restricted to this
+ group and are placed in this group by default. Users who are members of this group
+ will be able to place [% terms.bugs %] in this group. Non-members will be forced
+ to place [% terms.bugs %] in this group on entry.
+ </td>
+ </tr>
+ <tr>
+ <td>
+ Mandatory
+ </td>
+ <td>
+ Mandatory
+ </td>
+ <td>
+ [% terms.Bugs %] in this product are required to be restricted to this
+ group. Users are not given any option.
+ </td>
+ </tr>
+</table>
+<p>
+Please note that the above table delineates the only allowable combinations
+for the <b>MemberControl</b> and <b>OtherControl</b> field settings.
+Attempting to submit a combination not listed there (e.g. Mandatory/NA,
+Default/Shown, etc.) will produce an error message.
+</p>
+[% PROCESS global/footer.html.tmpl %]
+
diff --git a/template/en/default/admin/products/groupcontrol/updated.html.tmpl b/template/en/default/admin/products/groupcontrol/updated.html.tmpl
new file mode 100644
index 0000000..2f59cae
--- /dev/null
+++ b/template/en/default/admin/products/groupcontrol/updated.html.tmpl
@@ -0,0 +1,50 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): André Batosti <batosti@async.com.br>
+ #
+ #%]
+
+[%# INTERFACE:
+ # product: Bugzilla::Product object; the product.
+ # changes: Hashref with changes made to the product group controls.
+ #%]
+
+[% title = BLOCK %]
+ Update group access controls for [% product.name FILTER html %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+<p>
+[% IF changes.group_controls.now_na.size %]
+ [% FOREACH g = changes.group_controls.now_na %]
+ Removing [% terms.bugs %] from group '[% g.name FILTER html %]' which
+ no longer applies to this product<p>
+ [% g.bug_count FILTER html %] [%+ terms.bugs %] removed<p>
+ [% END %]
+[% END %]
+
+[% IF changes.group_controls.now_mandatory.size %]
+ [% FOREACH g = changes.group_controls.now_mandatory %]
+ Adding [% terms.bugs %] to group '[% g.name FILTER html %]' which is
+ mandatory for this product<p>
+ [% g.bug_count FILTER html %] [%+ terms.bugs %] added<p>
+ [% END %]
+[% END %]
+
+Group control updates done<p>
+
+[% PROCESS admin/products/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/products/list-classifications.html.tmpl b/template/en/default/admin/products/list-classifications.html.tmpl
new file mode 100644
index 0000000..4eddad3
--- /dev/null
+++ b/template/en/default/admin/products/list-classifications.html.tmpl
@@ -0,0 +1,72 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # classifications: array of hashes having the following properties:
+ # - name: string; The name of the classification
+ # - description: string; The classification description (html allowed)
+ # - product_count: number; The number of products in this classification
+ #
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Select Classification"
+%]
+
+[% edit_contentlink = BLOCK %]
+ editproducts.cgi?classification=%%name%%
+[% END %]
+[% add_contentlink = BLOCK %]
+ editproducts.cgi?action=add&amp;classification=%%name%%
+[% END %]
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit products of..."
+ contentlink => edit_contentlink
+ },
+ {
+ name => "description"
+ heading => "Description"
+ allow_html_content => 1
+ },
+ {
+ name => "product_count"
+ align => "right"
+ heading => "Product Count"
+ }
+ ]
+%]
+
+[% IF user.in_group('editcomponents') %]
+ [% columns.push({
+ heading => "Action..."
+ content => "Add product"
+ contentlink => add_contentlink })
+ %]
+[% END %]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = classifications
+%]
+
+[%# No need for the standard edit products footer, as we have an 'add'
+ link in the table %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/products/list.html.tmpl b/template/en/default/admin/products/list.html.tmpl
new file mode 100644
index 0000000..57d75d8
--- /dev/null
+++ b/template/en/default/admin/products/list.html.tmpl
@@ -0,0 +1,121 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # products: array of Bugzilla::Product objects
+ #
+ # classification: Bugzilla::Classification object; If classifications
+ # are enabled, then this is
+ # the currently selected classification
+ # showbugcounts: boolean; true if bug counts should be included in the table
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% IF classification %]
+ [% classification_url_part = BLOCK %]&amp;classification=
+ [%- classification.name FILTER url_quote %]
+ [%- END %]
+ [% classification_title = BLOCK %]
+ in classification '[% classification.name FILTER html %]'
+ [% END %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Select product $classification_title"
+%]
+
+[% edit_contentlink = BLOCK %]
+ editproducts.cgi?action=edit&amp;product=%%name%%
+[% END %]
+[% delete_contentlink = BLOCK %]
+ editproducts.cgi?action=del&amp;product=%%name%%
+[% END %]
+[% bug_count_contentlink = BLOCK %]
+ buglist.cgi?product=%%name%%
+[% END %]
+
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit product..."
+ contentlink => edit_contentlink
+ },
+ {
+ name => "description"
+ heading => "Description"
+ allow_html_content => 1
+ },
+ {
+ name => "is_active"
+ heading => "Open For New $terms.Bugs"
+ yesno_field => 1
+ },
+ {
+ name => "votesperuser"
+ heading => "Votes Per User"
+ align => 'right'
+ },
+ {
+ name => "maxvotesperbug"
+ heading => "Maximum Votes Per $terms.Bug"
+ align => 'right'
+ },
+ {
+ name => "votestoconfirm"
+ heading => "Votes To Confirm"
+ align => 'right'
+ } ]
+%]
+
+[% IF showbugcounts %]
+
+ [% columns.push({
+ name => "bug_count"
+ heading => "$terms.Bug Count"
+ align => 'right'
+ contentlink => bug_count_contentlink
+ })
+ %]
+
+[% END %]
+
+[% columns.push({
+ heading => "Action"
+ content => "Delete"
+ contentlink => delete_contentlink
+ })
+%]
+
+[% Hook.process('before_table') %]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = products
+%]
+
+[% IF !showbugcounts %]
+
+ <p><a href="editproducts.cgi?showbugcounts=1[% classification_url_part %]">
+ Redisplay table with [% terms.bug %] counts (slower)</a></p>
+
+[% END %]
+
+[% PROCESS admin/products/footer.html.tmpl
+ no_edit_other_products_link = 1
+ %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/products/updated.html.tmpl b/template/en/default/admin/products/updated.html.tmpl
new file mode 100644
index 0000000..c6e8710
--- /dev/null
+++ b/template/en/default/admin/products/updated.html.tmpl
@@ -0,0 +1,185 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # product : Bugzilla::Product Object; new product.
+ # classification: Bugzilla::Classification Object; The product classification (may be empty or missing)
+ # changes: hashref with all changes made to the product. Each key is an edited field,
+ # and its value is an arrayref of the form [old values, new values].
+ #%]
+
+[% IF classification %]
+ [% classification_text = BLOCK %]
+ of classification '[% classification.name FILTER html %]'
+ [% END %]
+[% END %]
+
+[% title = BLOCK %]Updating Product '[% product.name FILTER html %]'
+ [% classification_text FILTER none %][% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+ style_urls = ['skins/standard/admin.css']
+%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% IF changes.name.defined %]
+ <p>
+ Updated product name from '[% changes.name.0 FILTER html %]' to
+ '<a href="editproducts.cgi?action=edit&amp;product=
+ [%- product.name FILTER url_quote %]">[% product.name FILTER html %]</a>'.
+ </p>
+[% END %]
+
+
+[% IF changes.description.defined %]
+ <p>
+ Updated description to:
+ </p>
+ <p style="margin: 1em 3em 1em 3em">[% product.description FILTER html_light %]</p>
+[% END %]
+
+[% IF changes.isactive.defined %]
+ <p>
+ Product is now
+ [% IF product.is_active %]
+ open for
+ [% ELSE %]
+ closed to
+ [% END %]
+ new [% terms.bugs %].
+ </p>
+[% END %]
+
+[% IF changes.defaultmilestone.defined %]
+ <p>
+ Updated default milestone from '[% changes.defaultmilestone.0 FILTER html %]' to
+ '[% product.default_milestone FILTER html %]'.
+ </p>
+[% END %]
+
+[% IF changes.votesperuser.defined %]
+ <p>
+ Updated votes per user from
+ [%+ changes.votesperuser.0 FILTER html %] to
+ [%+ product.votes_per_user FILTER html %].
+ </p>
+ [% checkvotes = 1 %]
+[% END %]
+
+[% IF changes.maxvotesperbug.defined %]
+ <p>
+ Updated maximum votes per [% terms.bug %] from
+ [%+ changes.maxvotesperbug.0 FILTER html %] to
+ [%+ product.max_votes_per_bug FILTER html %].
+ </p>
+ [% checkvotes = 1 %]
+[% END %]
+
+[% IF changes.votestoconfirm.defined %]
+ <p>
+ Updated number of votes needed to confirm a [% terms.bug %] from
+ [%+ changes.votestoconfirm.0 FILTER html %] to
+ [%+ product.votes_to_confirm FILTER html %].
+ </p>
+ [% checkvotes = 1 %]
+[% END %]
+
+[% IF changes.allows_unconfirmed.defined %]
+ <p>
+ [% IF product.allows_unconfirmed %]
+ The product now allows the
+ [%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %] status.
+ [% ELSE %]
+ The product no longer allows the
+ [%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %] status.
+ Note that any
+ <a href="buglist.cgi?product=
+ [%- product.name FILTER url_quote %]&amp;bug_status=UNCONFIRMED">
+ [%- terms.bugs %] that currently have the
+ [%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %] status</a>
+ will remain in that status until they are edited.
+ [% END %]
+ </p>
+[% END %]
+
+[% IF !changes.keys.size %]
+ <p>Nothing changed for product '[% product.name FILTER html %]'.</p>
+[% END %]
+
+[%# Note that this display of changed votes and/or confirmed bugs is
+ not very scalable. We could have a _lot_, and we just list them all.
+ One day we should limit this perhaps, or have a more scalable display %]
+
+
+[% IF checkvotes %]
+ <hr>
+
+ <p>Checking existing votes in this product for anybody who now
+ has too many votes for [% terms.abug %]...<br>
+ [% IF changes.too_many_votes.size %]
+ [% FOREACH detail = changes.too_many_votes %]
+ &rarr;removed votes for [% terms.bug %] <a href="show_bug.cgi?id=
+ [%- detail.id FILTER url_quote %]">
+ [%- detail.id FILTER html %]</a> from [% detail.name FILTER html %]<br>
+ [% END %]
+ [% ELSE %]
+ &rarr;there were none.
+ [% END %]
+ </p>
+
+ <p>Checking existing votes in this product for anybody
+ who now has too many total votes...<br>
+ [% IF changes.too_many_total_votes.size %]
+ [% FOREACH detail = changes.too_many_total_votes %]
+ &rarr;removed votes for [% terms.bug %] <a href="show_bug.cgi?id=
+ [%- detail.id FILTER url_quote %]">
+ [%- detail.id FILTER html %]</a> from [% detail.name FILTER html %]<br>
+ [% END %]
+ [% ELSE %]
+ &rarr;there were none.
+ [% END %]
+ </p>
+
+ <p>Checking unconfirmed [% terms.bugs %] in this product for any which now have
+ sufficient votes...<br>
+ [% IF changes.confirmed_bugs.size %]
+ [% FOREACH id = changes.confirmed_bugs %]
+
+ [%# This is INCLUDED instead of PROCESSED to avoid variables getting
+ overwritten, which happens otherwise %]
+ [% INCLUDE bug/process/results.html.tmpl
+ type = 'votes'
+ header_done = 1
+ sent_bugmail = changes.confirmed_bugs_sent_bugmail.$id
+ id = id
+ %]
+ [% END %]
+ [% ELSE %]
+ &rarr;there were none.
+ [% END %]
+ </p>
+
+[% END %]
+
+[% PROCESS admin/products/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/sanitycheck/list.html.tmpl b/template/en/default/admin/sanitycheck/list.html.tmpl
new file mode 100644
index 0000000..4642972
--- /dev/null
+++ b/template/en/default/admin/sanitycheck/list.html.tmpl
@@ -0,0 +1,37 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Frédéric Buclin.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl title = "Sanity Check"
+ style_urls = ['skins/standard/admin.css'] %]
+
+<div>
+ <p>
+ [% terms.Bugzilla %] is checking the referential integrity of your database.
+ This may take several minutes to complete.
+ </p>
+
+ <p>
+ Errors, if any, will be <span class="alert">emphasized like this</span>.
+ Depending on the errors found, some links will be displayed allowing you
+ to easily fix them. Fixing these errors will automatically run this script
+ again (so be aware that it may take an even longer time than the first run).
+ </p>
+</div>
+
+<hr>
diff --git a/template/en/default/admin/sanitycheck/messages.html.tmpl b/template/en/default/admin/sanitycheck/messages.html.tmpl
new file mode 100644
index 0000000..c3d5daa
--- /dev/null
+++ b/template/en/default/admin/sanitycheck/messages.html.tmpl
@@ -0,0 +1,352 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Frédéric Buclin.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% san_message = BLOCK %]
+ [% IF san_tag == "checks_start" %]
+ OK, now running sanity checks.
+
+ [% ELSIF san_tag == "checks_completed" %]
+ Sanity check completed.
+
+ [% ELSIF san_tag == "attachment_reference_deletion_start" %]
+ OK, now removing all references to deleted attachments.
+
+ [% ELSIF san_tag == "attachment_reference_deletion_end" %]
+ All references to deleted attachments have been removed.
+
+ [% ELSIF san_tag == "bug_check_alert" %]
+ [% errortext FILTER html %]: [% INCLUDE bug_list badbugs = badbugs %]
+
+ [% ELSIF san_tag == "bug_check_repair" %]
+ <a href="sanitycheck.cgi?[% param FILTER url_quote %]=1">[% text FILTER html %]</a>.
+
+ [% ELSIF san_tag == "bug_check_creation_date" %]
+ Checking for [% terms.bugs %] with no creation date (which makes them invisible).
+
+ [% ELSIF san_tag == "bug_check_creation_date_error_text" %]
+ [% terms.Bugs %] with no creation date
+
+ [% ELSIF san_tag == "bug_check_creation_date_repair_text" %]
+ Repair missing creation date for these [% terms.bugs %]
+
+ [% ELSIF san_tag == "bug_check_bugs_fulltext" %]
+ Checking for [% terms.bugs %] with no entry for full text searching.
+
+ [% ELSIF san_tag == "bug_check_bugs_fulltext_error_text" %]
+ [% terms.Bugs %] with no entry for full text searching
+
+ [% ELSIF san_tag == "bug_check_bugs_fulltext_repair_text" %]
+ Repair missing full text search entries for these [% terms.bugs %]
+
+ [% ELSIF san_tag == "bug_check_res_dupl" %]
+ Checking resolution/duplicates
+
+ [% ELSIF san_tag == "bug_check_res_dupl_error_text" %]
+ [% terms.Bugs %] found on duplicates table that are not marked duplicate
+
+ [% ELSIF san_tag == "bug_check_res_dupl_error_text2" %]
+ [% terms.Bugs %] found marked resolved duplicate and not on duplicates table
+
+ [% ELSIF san_tag == "bug_check_status_res" %]
+ Checking statuses/resolutions
+
+ [% ELSIF san_tag == "bug_check_status_res_error_text" %]
+ [% terms.Bugs %] with open status and a resolution
+
+ [% ELSIF san_tag == "bug_check_status_res_error_text2" %]
+ [% terms.Bugs %] with non-open status and no resolution
+
+ [% ELSIF san_tag == "bug_check_status_everconfirmed" %]
+ Checking statuses/everconfirmed
+
+ [% ELSIF san_tag == "bug_check_status_everconfirmed_error_text" %]
+ [% terms.Bugs %] that are UNCONFIRMED but have everconfirmed set
+
+ [% ELSIF san_tag == "bug_check_status_everconfirmed_error_text2" %]
+ [% terms.Bugs %] with confirmed status but don't have everconfirmed set
+
+ [% ELSIF san_tag == "bug_check_votes_everconfirmed" %]
+ Checking votes/everconfirmed
+
+ [% ELSIF san_tag == "bug_check_votes_everconfirmed_error_text" %]
+ [% terms.Bugs %] that have enough votes to be confirmed but haven't been
+
+ [% ELSIF san_tag == "bug_check_control_values" %]
+ Checking for bad values in group_control_map
+
+ [% ELSIF san_tag == "bug_check_control_values_alert" %]
+ Found [% entries FILTER html %] bad group_control_map entries
+
+ [% ELSIF san_tag == "bug_check_control_values_violation" %]
+ Checking for [% terms.bugs %] with groups violating their product's group controls
+
+ [% ELSIF san_tag == "bug_check_control_values_error_text" %]
+ Have groups not permitted for their products
+
+ [% ELSIF san_tag == "bug_check_control_values_repair_text" %]
+ Permit the missing groups for the affected products
+ (set member control to <code>SHOWN</code>)
+
+ [% ELSIF san_tag == "bug_check_control_values_error_text2" %]
+ Are missing groups required for their products
+
+ [% ELSIF san_tag == "bug_creation_date_start" %]
+ OK, now fixing missing [% terms.bug %] creation dates.
+
+ [% ELSIF san_tag == "bug_creation_date_fixed" %]
+ [% bug_count FILTER html %] [%+ terms.bugs %] have been fixed.
+
+ [% ELSIF san_tag == "bugs_fulltext_start" %]
+ OK, now fixing [% terms.bug %] entries for full text searching.
+
+ [% ELSIF san_tag == "bugs_fulltext_fixed" %]
+ [% bug_count FILTER html %] [%+ terms.bugs %] have been fixed.
+
+ [% ELSIF san_tag == "bug_reference_deletion_start" %]
+ OK, now removing all references to deleted [% terms.bugs %].
+
+ [% ELSIF san_tag == "bug_reference_deletion_end" %]
+ All references to deleted [% terms.bugs %] have been removed.
+
+ [% ELSIF san_tag == "cross_check_to" %]
+ Checking references to [% table FILTER html %].[% field FILTER html %]...
+
+ [% ELSIF san_tag == "cross_check_from" %]
+ ... from [% table FILTER html %].[% field FILTER html %].
+
+ [% ELSIF san_tag == "cross_check_alert" %]
+ Bad value '[% value FILTER html %]' found in
+ [%+ table FILTER html %].[% field FILTER html %]
+ [% IF keyname %]
+ [% IF keyname == "bug_id" %]
+ ([% PROCESS bug_link bug_id = key %])
+ [% ELSE %]
+ ([% keyname FILTER html %] == '[% key FILTER html %]')
+ [% END %]
+ [% END %]
+
+ [% ELSIF san_tag == "cross_check_attachment_has_references" %]
+ <a href="sanitycheck.cgi?remove_invalid_attach_references=1">Remove
+ invalid references to non existent attachments.</a>
+
+ [% ELSIF san_tag == "cross_check_bug_has_references" %]
+ <a href="sanitycheck.cgi?remove_invalid_bug_references=1">Remove
+ invalid references to non existent [% terms.bugs %].</a>
+
+ [% ELSIF san_tag == "double_cross_check_to" %]
+ Checking references to [% table FILTER html %].[% field1 FILTER html %] /
+ [%+ table FILTER html %].[% field2 FILTER html %]...
+
+ [% ELSIF san_tag == "double_cross_check_from" %]
+ ... from [% table FILTER html %].[% field1 FILTER html %] /
+ [%+ table FILTER html %].[% field2 FILTER html %].
+
+ [% ELSIF san_tag == "double_cross_check_alert" %]
+ Bad values '[% value1 FILTER html %]', '[% value2 FILTER html %]' found
+ in [% table FILTER html %].[% field1 FILTER html %] /
+ [%+ table FILTER html %].[% field2 FILTER html %].
+ [% IF keyname %]
+ [% IF keyname == "bug_id" %]
+ ([% PROCESS bug_link bug_id = key %])
+ [% ELSE %]
+ ([% keyname FILTER html %] == '[% key FILTER html %]')
+ [% END %]
+ [% END %]
+
+ [% ELSIF san_tag == "everconfirmed_start" %]
+ OK, now fixing everconfirmed.
+
+ [% ELSIF san_tag == "everconfirmed_end" %]
+ everconfirmed fixed.
+
+ [% ELSIF san_tag == "flag_check_start" %]
+ Checking for flags being in the wrong product/component.
+
+ [% ELSIF san_tag == "flag_deletion_start" %]
+ OK, now deleting invalid flags.
+
+ [% ELSIF san_tag == "flag_deletion_end" %]
+ Invalid flags deleted.
+
+ [% ELSIF san_tag == "flag_alert" %]
+ Invalid flag [% flag_id FILTER html %] for
+ [% IF attach_id %]
+ attachment [% attach_id FILTER html %] in
+ [% END %]
+ [%+ PROCESS bug_link bug_id = bug_id %].
+
+ [% ELSIF san_tag == "flag_fix" %]
+ <a href="sanitycheck.cgi?remove_invalid_flags=1">Click
+ here to delete invalid flags</a>
+
+ [% ELSIF san_tag == "group_control_map_entries_creation" %]
+ OK, now creating <code>SHOWN</code> member control entries
+ for product/group combinations lacking one.
+
+ [% ELSIF san_tag == "group_control_map_entries_update" %]
+ Updating <code>NA/<em>xxx</em></code> group control setting
+ for group <em>[% group_name FILTER html %]</em> to
+ <code>SHOWN/<em>xxx</em></code> in product
+ <em>[% product_name FILTER html %]</em>.
+
+ [% ELSIF san_tag == "group_control_map_entries_generation" %]
+ Generating <code>SHOWN/NA</code> group control setting
+ for group <em>[% group_name FILTER html %]</em> in product
+ <em>[% product_name FILTER html %]</em>.
+
+ [% ELSIF san_tag == "group_control_map_entries_repaired" %]
+ Repaired [% counter FILTER html %] defective group control settings.
+
+ [% ELSIF san_tag == "keyword_check_start" %]
+ Checking keywords table.
+
+ [% ELSIF san_tag == "keyword_check_alert" %]
+ Duplicate entry in keyworddefs for id [% id FILTER html %].
+
+ [% ELSIF san_tag == "keyword_check_invalid_name" %]
+ Bogus name in keyworddefs for id [% id FILTER html %].
+
+ [% ELSIF san_tag == "keyword_check_invalid_id" %]
+ Bogus keywordids [% id FILTER html %] found in keywords table.
+
+ [% ELSIF san_tag == "keyword_check_duplicated_ids" %]
+ Duplicate keyword IDs found in [% PROCESS bug_link bug_id = id %].
+
+ [% ELSIF san_tag == "keyword_cache_start" %]
+ Checking cached keywords.
+
+ [% ELSIF san_tag == "keyword_cache_alert" %]
+ [% badbugs.size FILTER none %] [%+ terms.bugs %] found with
+ incorrect keyword cache: [% INCLUDE bug_list badbugs = badbugs %]
+
+ [% ELSIF san_tag == "keyword_cache_fixing" %]
+ OK, now fixing keyword cache.
+
+ [% ELSIF san_tag == "keyword_cache_fixed" %]
+ Keyword cache fixed.
+
+ [% ELSIF san_tag == "keyword_cache_rebuild" %]
+ <a href="sanitycheck.cgi?rebuildkeywordcache=1">Click here to
+ rebuild the keyword cache</a>.
+
+ [% ELSIF san_tag == "profile_login_start" %]
+ Checking profile logins.
+
+ [% ELSIF san_tag == "profile_login_alert" %]
+ Bad profile email address, id=[% id FILTER html %],
+ &lt;[% email FILTER html %]&gt;.
+
+ [% ELSIF san_tag == "repair_bugs" %]
+ Repair these [% terms.bugs %].
+
+ [% ELSIF san_tag == "send_bugmail_start" %]
+ OK, now attempting to send unsent mail.
+
+ [% ELSIF san_tag == "send_bugmail_status" %]
+ [% bug_count FILTER html %] [%+ terms.bugs %] found with
+ possibly unsent mail.
+
+ [% ELSIF san_tag == "send_bugmail_end" %]
+ Unsent mail has been sent.
+
+ [% ELSIF san_tag == "unsent_bugmail_check" %]
+ Checking for unsent mail
+
+ [% ELSIF san_tag == "unsent_bugmail_alert" %]
+ [% terms.Bugs %] that have changes but no mail sent for at least
+ half an hour: [% INCLUDE bug_list badbugs = badbugs %]
+
+ [% ELSIF san_tag == "unsent_bugmail_fix" %]
+ <a href="sanitycheck.cgi?rescanallBugMail=1">Send these mails</a>.
+
+ [% ELSIF san_tag == "vote_cache_rebuild_start" %]
+ OK, now rebuilding vote cache.
+
+ [% ELSIF san_tag == "vote_cache_rebuild_end" %]
+ Vote cache has been rebuilt.
+
+ [% ELSIF san_tag == "vote_cache_rebuild_fix" %]
+ <a href="sanitycheck.cgi?rebuildvotecache=1">Click here to
+ rebuild the vote cache</a>
+
+ [% ELSIF san_tag == "vote_cache_alert" %]
+ Bad vote cache for [% PROCESS bug_link bug_id = id %]
+
+ [% ELSIF san_tag == "vote_count_start" %]
+ Checking cached vote counts.
+
+ [% ELSIF san_tag == "vote_count_alert" %]
+ Bad vote sum for [% terms.bug %] [%+ id FILTER html %].
+
+ [% ELSIF san_tag == "whines_obsolete_target_deletion_start" %]
+ OK, now removing non-existent users/groups from whines.
+
+ [% ELSIF san_tag == "whines_obsolete_target_deletion_end" %]
+ Non-existent users/groups have been removed from whines.
+
+ [% ELSIF san_tag == "whines_obsolete_target_start" %]
+ Checking for whines with non-existent users/groups.
+
+ [% ELSIF san_tag == "whines_obsolete_target_alert" %]
+ [% FOREACH schedule = schedules %]
+ Non-existent [% (type == constants.MAILTO_USER) ? "user" : "group" FILTER html %]
+ [%+ schedule.1 FILTER html %] for whine schedule [% schedule.0 FILTER html %]<br>
+ [% END %]
+
+ [% ELSIF san_tag == "whines_obsolete_target_fix" %]
+ <a href="sanitycheck.cgi?remove_old_whine_targets=1">Click here to
+ remove old users/groups</a>
+
+ [% ELSE %]
+ [% message = Hook.process("statuses") %]
+
+ [% IF message %]
+ [% message FILTER none %]
+ [% ELSE %]
+ The status message string <code>[% san_tag FILTER html %]</code>
+ was not found. Please send email to [% Param("maintainer") %] describing
+ the steps taken to obtain this message.
+ [% END %]
+
+ [% END %]
+[% END %]
+
+[% USE Bugzilla %]
+[% IF Bugzilla.usage_mode == constants.USAGE_MODE_CMDLINE %]
+ [% san_message FILTER none %]
+[% ELSE %]
+ [%# Avoid the txt filter in message.txt.tmpl. %]
+ [% san_message FILTER html %]
+[% END %]
+
+[% BLOCK bug_list %]
+ [% FOREACH bug_id = badbugs %]
+ [%# Do not use FILTER bug_link() here, because bug_link() calls get_text()
+ # which itself calls this template again, generating a recursion error.
+ # I doubt having a tooltip with the bug status and summary is so
+ # important here anyway, as you can click the "(as buglist)" link. %]
+ <a href="show_bug.cgi?id=[% bug_id FILTER url_quote %]">[% bug_id FILTER html %]</a>
+ [% ", " IF !loop.last %]
+ [% END %]
+ (<a href="buglist.cgi?bug_id=[% badbugs.join(",") FILTER url_quote %]">as [% terms.bug %] list</a>).
+[% END %]
+
+[% BLOCK bug_link %]
+ <a href="show_bug.cgi?id=[% bug_id FILTER url_quote %]">[% terms.bug %] [%+ bug_id FILTER html %]</a>
+[% END %]
diff --git a/template/en/default/admin/settings/edit.html.tmpl b/template/en/default/admin/settings/edit.html.tmpl
new file mode 100644
index 0000000..7f95f88
--- /dev/null
+++ b/template/en/default/admin/settings/edit.html.tmpl
@@ -0,0 +1,101 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Shane H. W. Travis <travis@sedsystems.ca>
+ #
+ #%]
+
+[%# INTERFACE:
+ # settings: a hash of hashes, keyed by setting name.
+ # Each hash contains:
+ # is_enabled - boolean
+ # default_value - string (global default for this setting)
+ # value - string (user-defined preference)
+ # is_default - boolean (true if user has no preference)
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Default Preferences"
+ %]
+
+[% PROCESS "global/setting-descs.none.tmpl" %]
+
+<p>
+This lets you edit the default preferences values.
+</p>
+<p>
+The Default Value displayed for each preference will apply to all users who
+do not choose their own value, and to anyone who is not logged in.
+</p>
+<p>
+The 'Enabled' checkbox controls whether or not this preference is available
+to users.<br>
+If it is checked, users will see this preference on their User Preferences page,
+and will be allowed to choose their own value if they desire.<br>
+If it is not checked, this preference will not appear on the User Preference
+page, and the Default Value will automatically apply to everyone.
+</p>
+<hr>
+
+[% IF settings.size %]
+ <form name="adminsettingform" method="post" action="editsettings.cgi">
+ <table border="1" cellpadding="4">
+ <tr>
+ <th>Preference Text</th>
+ <th>Default Value</th>
+ <th>Enabled</th>
+ </tr>
+
+ [% FOREACH name = settings.keys %]
+ [% checkbox_name = name _ '-enabled' %]
+ <tr>
+ <td align="right">
+ [% setting_descs.$name OR name FILTER html %]
+ </td>
+ <td>
+ <select name="[% name FILTER html %]" id="[% name FILTER html %]">
+ [% FOREACH x = settings.${name}.legal_values %]
+ <option value="[% x FILTER html %]"
+ [% " selected=\"selected\"" IF x == settings.${name}.default_value %]>
+ [% setting_descs.${x} OR x FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ </td>
+ <td align="center">
+ <input type="checkbox"
+ name="[% checkbox_name FILTER html %]"
+ id="[% checkbox_name FILTER html %]"
+ [% " checked=\"checked\"" IF settings.${name}.is_enabled %]>
+ <br>
+ </td>
+ </tr>
+ [% END %]
+ </table>
+
+ <input type="hidden" name="action" value="update">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <table>
+ <tr>
+ <td width="150"></td>
+ <td>
+ <input type="submit" id="update" value="Submit Changes">
+ </td>
+ </tr>
+ </table>
+
+ </form>
+[% ELSE %]
+ There are no preferences to edit.
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/sudo.html.tmpl b/template/en/default/admin/sudo.html.tmpl
new file mode 100644
index 0000000..680bcfb
--- /dev/null
+++ b/template/en/default/admin/sudo.html.tmpl
@@ -0,0 +1,105 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 2005 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): A. Karl Kornel <karl@kornel.name>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Begin sudo session"
+ style_urls = ['skins/standard/admin.css']
+ doc_section = "useradmin.html#impersonatingusers"
+ %]
+
+[% DEFAULT target_login = "" %]
+
+<p>
+ The <b>sudo</b> feature of [% terms.Bugzilla %] allows you to impersonate a
+ user for a short time While an sudo session is in progress, every action you
+ perform will be taking place as if you had logged in as the user whom will be
+ impersonating.
+</p>
+
+<p class="areyoureallyreallysure">
+ This is a very powerful feature; you should be very careful while using it.
+ Your actions may be logged more carefully than normal.
+</p>
+
+<form action="relogin.cgi" method="POST">
+ <p>
+ To begin,
+ [% IF Param('usemenuforusers') %]
+ select
+ [% ELSE %]
+ enter the login of
+ [% END %]
+ <label for="target_login">the <u>u</u>ser to impersonate</label>:
+ [% INCLUDE global/userselect.html.tmpl
+ id => "target_login"
+ name => "target_login"
+ value => target_login_default
+ accesskey => "u"
+ size => 30
+ %]
+ </p>
+
+ [% IF !Param('usemenuforusers') %]
+ <p>
+ The username must be entered exactly. No matching will be performed.
+ </p>
+ [% END %]
+
+ <p>
+ Next, please take a moment to explain <label for="reason">why you are doing
+ this:<br>
+ <input type="text" id="reason" name="reason" size="80" maxlength="200"
+ value="[% reason_default FILTER html %]">
+ </p>
+
+ <p>
+ The message you enter here will be sent to the impersonated user by email.
+ You may leave this empty if you wish, but they will still know that you
+ are impersonating them.
+ </p>
+
+ [% IF user.authorizer.can_login %]
+ <p>
+ Finally, enter <label for="Bugzilla_password">your [% terms.Bugzilla %]
+ password</label>:
+ <input type="hidden" name="Bugzilla_login" value="
+ [%- user.login FILTER html %]">
+ <input type="password" id="Bugzilla_password" name="Bugzilla_password"
+ maxlength="20" size="20">
+ <br>
+ This is done for two reasons. First of all, it is done to reduce
+ the chances of someone doing large amounts of damage using your
+ already-logged-in account. Second, it is there to force you to take the
+ time to consider if you really need to use this feature.
+ </p>
+ [% END %]
+
+ <p>
+ Click the button to begin the session:
+ <input type="submit" value="Begin Session">
+ <input type="hidden" name="action" value="begin-sudo">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ </p>
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/table.html.tmpl b/template/en/default/admin/table.html.tmpl
new file mode 100644
index 0000000..ce5e985
--- /dev/null
+++ b/template/en/default/admin/table.html.tmpl
@@ -0,0 +1,194 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Jouni Heikniemi <jouni@heikniemi.net>
+ #
+ #%]
+
+[%# INTERFACE:
+ #
+ # columns:
+ # array of hashes representing the columns in the table.
+ # Each hash contains data for a single column. Hash keys:
+ # name: Name of the field in the data param
+ # heading: The text to print at the header cell
+ # contentlink: URI to which the content of a data cell shall be linked to.
+ # Expressions of format %%xxx%% are replaced with value
+ # with the key xxx in data hash of the current row.
+ # content: If specified, the content of this variable is used
+ # instead of the data pulled from the current row.
+ # NOTE: This value is only partially HTML filtered!
+ # content_use_field: If defined and true, then each value in the
+ # column corresponds with a key in the
+ # field_descs field, and that value from the
+ # field_descs hash will be used instead of "content."
+ # See fieldvalues/select-field for an example of use.
+ # This content WILL be HTML-filtered in this case.
+ # align: left/center/right. Controls the horizontal alignment of the
+ # text in the column.
+ # allow_html_content: if defined, then this column allows some html content
+ # and so it will be only partially filtered.
+ # yesno_field: Turn the data from 0/!0 into Yes/No
+ #
+ # data:
+ # array of hashes representing the data for the table.
+ # Each hash contains data for a single row of data. The
+ # keys are column names from columns subhashes name field.
+ #
+ # overrides:
+ # Example:
+ # overrides { # first hash
+ # column_name_to_be_overwriten => { # second hash
+ # name_of_row_to_match_against => { # third hash
+ # value_to_match_against => { # fourth hash
+ # content => "some contents"
+ # override_content => 1
+ # }
+ # }
+ # }
+ # }
+ #
+ # Provides a method for overriding individual table cells. This is a hash
+ # (1), whose key is the column name, so the column must be named for
+ # one of it's cells to be overwritten. The hash value is another hash
+ # (2). The keys of that second hash are the name of the row to match
+ # against. The second hash then again points to another hash. Within this
+ # third hash (3), the keys represent values to match against. The item
+ # contains a fourth hash (4) specifying overridden values.
+ #
+ # Each column value mentioned in the 'columns' documentation above
+ # can be overwritten (apart from name and heading). To override a
+ # table-cell value 'xxx', specify a new 'xxx' value, and specify a
+ # 'override_xxx' value as well. See
+ # admin/milestones/list.html.tmpl for example
+ #
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[%################### TABLE HEADER ######################%]
+
+<table id="admin_table" border="1" cellpadding="4" cellspacing="0">
+ <tr bgcolor="#6666FF">
+ [% FOREACH c = columns %]
+ [%# Default to align left for headers %]
+ <th align="[% (c.align || 'left') FILTER html %]">
+ [% c.heading FILTER html %]
+ </th>
+ [% END %]
+ </tr>
+
+
+[%################### TABLE CONTENT ######################%]
+
+[% FOREACH row = data %]
+
+ <tr>
+ [% FOREACH c = columns %]
+
+ [%# Copy to local variables, as we may update these %]
+ [% contentlink = c.contentlink
+ content = c.content
+ content_use_field = c.content_use_field
+ align = c.align
+ class = c.class
+ allow_html_content = c.allow_html_content
+ yesno_field = c.yesno_field
+ %]
+
+ [%# Get any specific "important" overrides for this c.name and row.name ? %]
+ [% SET important = overrides.${c.name}.name.${row.name} %]
+
+ [% IF important %]
+
+ [% FOREACH key IN important.keys %]
+ [% SET ${key} = important.${key} %]
+ [% END %]
+
+ [% ELSE %]
+
+ [%# Are there any specific overrides for this column? %]
+ [% FOREACH match_field = overrides.${c.name}.keys %]
+
+ [% override = overrides.${c.name}.${match_field}.${row.$match_field} %]
+ [% NEXT UNLESS override %]
+
+ [% FOREACH key IN override.keys %]
+ [% SET ${key} = override.${key} %]
+ [% END %]
+
+ [% LAST %]
+
+ [% END %]
+ [% END %]
+
+ <td [% IF align %] align="[% align FILTER html %]" [% END %]
+ [% IF class %] class="[% class FILTER html %]" [% END %]>
+
+ [% IF contentlink %]
+ [% link_uri = contentlink %]
+ [% WHILE link_uri.search('%%(.+?)%%')%]
+ [% FOREACH m = link_uri.match('%%(.+?)%%') %]
+ [% IF row.$m %]
+ [% replacement_value = FILTER url_quote; row.$m; END %]
+ [% ELSE %]
+ [% replacement_value = "" %]
+ [% END %]
+ [% link_uri = link_uri.replace("%%$m%%", replacement_value) %]
+ [% END %]
+ [% END %]
+ <a href="[% link_uri %]">
+ [% END %]
+
+ [% IF content_use_field %]
+ [% colname = row.${c.name} %]
+ [% field_descs.${colname} FILTER html %]
+ [% ELSIF content %]
+ [% content FILTER html_light %]
+ [% ELSE %]
+ [% IF yesno_field %]
+ [% IF row.${c.name} %]
+ Yes
+ [% ELSE %]
+ No
+ [% END %]
+ [% ELSE %]
+ [% IF allow_html_content %]
+ [% row.${c.name} FILTER html_light %]
+ [% ELSE %]
+ [% row.${c.name} FILTER html %]
+ [% END %]
+ [% END %]
+ [% END %]
+
+ [% IF contentlink %]
+ </a>
+ [% END %]
+
+ </td>
+ [% END %]
+ </tr>
+[% END %]
+
+[% IF data.size == 0 %]
+ <tr><td colspan="[% columns.size %]" align="center"><i>&lt;none&gt;</i></td></tr>
+[% END %]
+
+
+[%################### TABLE FOOTER ######################%]
+
+</table>
diff --git a/template/en/default/admin/users/confirm-delete.html.tmpl b/template/en/default/admin/users/confirm-delete.html.tmpl
new file mode 100644
index 0000000..b61a995
--- /dev/null
+++ b/template/en/default/admin/users/confirm-delete.html.tmpl
@@ -0,0 +1,486 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ #
+ # listselectionvalues: selection values to recreate the current user
+ # list.
+ # editusers: is viewing user member of editusers?
+ # otheruser: Bugzilla::User object of the viewed user.
+ # reporter: number of bugs reported by the user
+ # assignee_or_qa: number of bugs the user is either the assignee
+ # or the QA contact
+ # bugs_activity: number of bugs the viewed user has activity
+ # entries on
+ # cc number of bugs the viewed user is cc list member
+ # of
+ # flags.requestee: number of flags the viewed user is being asked for
+ # flags.setter: number of flags the viewed user has set
+ # longdescs: number of bug comments the viewed user has written
+ # namedqueries: number of named queries the user has created
+ # namedquery_group_map: number of named queries the user has shared
+ # profiles_activity: number of changes made to other users' profiles
+ # series: number of series the viewed user has created
+ # votes: number of bugs the viewed user has voted on
+ # watch.watched: number of users the viewed user is being watched
+ # by
+ # watch.watcher: number of users the viewed user is watching
+ # whine_events: number of whine events the viewed user has created
+ # whine_schedules: number of whine schedules the viewed user has
+ # created
+ #%]
+
+[% title = BLOCK %]Confirm deletion of user [% otheruser.login FILTER html %][% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ style_urls = ['skins/standard/admin.css',
+ 'skins/standard/editusers.css']
+ doc_section = "useradmin.html#user-account-deletion"
+%]
+
+[% PROCESS admin/users/listselectvars.html.tmpl
+ listselectionvalues = listselectionvalues
+%]
+
+<table class="main">
+ <tr>
+ <th>Login name:</th>
+ <td>[% otheruser.login FILTER html %]</td>
+ </tr>
+ <tr>
+ <th>Real name:</th>
+ <td>[% otheruser.name FILTER html %]</td>
+ </tr>
+ <tr>
+ <th>Group set:</th>
+ <td>
+ [% IF otheruser.groups.size %]
+ <ul>
+ [% FOREACH group = otheruser.groups %]
+ <li>[% group.name FILTER html %]</li>
+ [% END %]
+ </ul>
+ [% ELSE %]
+ None
+ [% END %]
+ </td>
+ </tr>
+ [% IF otheruser.product_responsibilities.size %]
+ <tr>
+ <th>Product responsibilities:</th>
+ <td>
+ [% PROCESS admin/users/responsibilities.html.tmpl otheruser = otheruser %]
+ </td>
+ </tr>
+ [% END %]
+</table>
+
+[% IF otheruser.product_responsibilities.size %]
+ <p>
+ You can't delete this user at this time because
+ [%+ otheruser.login FILTER html %] has got responsibilities for at least
+ one product.
+ </p>
+ <p>
+ [% IF user.in_group("editcomponents", component.product_id) %]
+ Change this by clicking the product editing links above,
+ [% ELSE %]
+ For now, you can
+ [% END %]
+[% ELSE %]
+ [% accept_deletion = 1 %]
+
+ [% IF attachments || reporter || bugs_activity || flags.setter || longdescs || profiles_activity %]
+ <div class="criticalmessages">
+ <p>The following deletions are <b>unsafe</b> and would generate referential
+ integrity inconsistencies!</p>
+
+ <ul>
+ [% IF attachments %]
+ <li>
+ [% otheruser.login FILTER html %]
+ <a href="buglist.cgi?field0-0-0=attachments.submitter&type0-0-0=equals&value0-0-0=
+ [%- otheruser.login FILTER url_quote %]">has submitted
+ [% IF attachments == 1 %]
+ one attachment
+ [% ELSE %]
+ [%+ attachments %] attachments
+ [% END %]</a>.
+ If you delete the user account, the database records will be
+ inconsistent, resulting in
+ [% IF attachments == 1 %]
+ this attachment
+ [% ELSE %]
+ these attachments
+ [% END %]
+ not appearing in [% terms.bugs %] any more.
+ </li>
+ [% END %]
+ [% IF reporter %]
+ <li>
+ [% otheruser.login FILTER html %]
+ <a href="buglist.cgi?emailreporter1=1&amp;emailtype1=exact&amp;email1=
+ [%- otheruser.login FILTER url_quote %]">has reported
+ [% IF reporter == 1 %]
+ one [% terms.bug %]
+ [% ELSE %]
+ [%+ reporter %] [%+ terms.bugs %]
+ [% END %]</a>.
+ If you delete the user account, the database records will be
+ inconsistent, resulting in
+ [% IF reporter == 1 %]
+ this [% terms.bug %]
+ [% ELSE %]
+ these [% terms.bugs %]
+ [% END %]
+ not appearing in [% terms.bug %] lists any more.
+ </li>
+ [% END %]
+ [% IF bugs_activity %]
+ <li>
+ [% otheruser.login FILTER html %] has made
+ [% IF bugs_activity == 1 %]
+ a change on [% terms.abug %]
+ [% ELSE %]
+ changes on [% terms.bugs %]
+ [% END %].
+ If you delete the user account, the [% terms.bugs %] activity table in
+ the database will be inconsistent, resulting in
+ [% IF bugs_activity == 1 %]
+ this change
+ [% ELSE %]
+ these changes
+ [% END %]
+ not showing up in [% terms.bug %] activity logs any more.
+ </li>
+ [% END %]
+ [% IF flags.setter %]
+ <li>
+ [% otheruser.login FILTER html %] has
+ <a href="buglist.cgi?field0-0-0=setters.login_name&amp;type0-0-0=equals&amp;value0-0-0=
+ [%- otheruser.login FILTER url_quote %]">set
+ or requested
+ [% IF flags.setter == 1 %]
+ a flag
+ [% ELSE %]
+ [%+ flags.setter %] flags
+ [% END %]</a>.
+ If you delete the user account, the flags table in the database
+ will be inconsistent, resulting in
+ [% IF flags.setter == 1 %]
+ this flag
+ [% ELSE %]
+ these flags
+ [% END %]
+ not displaying correctly any more.
+ </li>
+ [% END %]
+ [% IF longdescs %]
+ <li>
+ [% otheruser.login FILTER html %] has
+ <a href="buglist.cgi?emaillongdesc1=1&amp;emailtype1=exact&amp;email1=
+ [%- otheruser.login FILTER url_quote %]">commented
+ [% IF longdescs == 1 %]
+ once on [% terms.abug %]
+ [% ELSE %]
+ [%+ longdescs %] times on [% terms.bugs %]
+ [% END %]</a>.
+ If you delete the user account, the comments table in the database
+ will be inconsistent, resulting in
+ [% IF longdescs == 1 %]
+ this comment
+ [% ELSE %]
+ these comments
+ [% END %]
+ not being visible any more.
+ </li>
+ [% END %]
+ [% IF profiles_activity %]
+ <li>
+ [% otheruser.login FILTER html %] has made
+ [% IF bugs_activity == 1 %]
+ a change on a other user's profile
+ [% ELSE %]
+ changes on other users' profiles
+ [% END %].
+ If you delete the user account, the user profiles activity table in
+ the database will be inconsistent.
+ </li>
+ [% END %]
+ </ul>
+ </div>
+ [% accept_deletion = 0 %]
+ [% END %]
+
+ [% IF assignee_or_qa || cc || component_cc || email_setting || flags.requestee ||
+ namedqueries || profile_setting || quips || series || votes || watch.watched ||
+ watch.watcher || whine_events || whine_schedules %]
+ <div class="warningmessages">
+ <p>The following deletions are <b>safe</b> and will not generate
+ referential integrity inconsistencies.</p>
+
+ <ul>
+ [% IF assignee_or_qa %]
+ <li>
+ [% otheruser.login FILTER html %]
+ <a href="buglist.cgi?emailassigned_to1=1&amp;emailqa_contact1=1&amp;emailtype1=exact&amp;email1=
+ [%- otheruser.login FILTER url_quote %]">is
+ the assignee or the QA contact of
+ [% IF assignee_or_qa == 1 %]
+ one [% terms.bug %]
+ [% ELSE %]
+ [%+ assignee_or_qa %] [%+ terms.bugs %]
+ [% END %]</a>.
+ If you delete the user account, these roles will fall back to
+ the default assignee or default QA contact.
+ </li>
+ [% END %]
+ [% IF cc %]
+ <li>
+ [% otheruser.login FILTER html %]
+ <a href="buglist.cgi?emailcc1=1&amp;emailtype1=exact&amp;email1=
+ [%- otheruser.login FILTER url_quote %]">is
+ on the CC list of
+ [% IF cc == 1 %]
+ [%+ terms.abug %]
+ [% ELSE %]
+ [%+ cc %] [%+ terms.bugs %]
+ [% END %]</a>.
+ If you delete the user account, it will be removed from these CC lists.
+ </li>
+ [% END %]
+ [% IF component_cc %]
+ <li>
+ [% otheruser.login FILTER html %] is on the default CC list of
+ [% IF component_cc == 1 %]
+ one component
+ [% ELSE %]
+ [%+ component_cc %] components
+ [% END %].
+ If you delete the user account, it will be removed from these CC lists.
+ </li>
+ [% END %]
+ [% IF email_setting %]
+ <li>
+ The user's e-mail settings will be deleted along with the user
+ account.
+ </li>
+ [% END %]
+ [% IF flags.requestee %]
+ <li>
+ [% otheruser.login FILTER html %] has been
+ <a href="buglist.cgi?field0-0-0=requestees.login_name&amp;type0-0-0=equals&amp;value0-0-0=
+ [%- otheruser.login FILTER url_quote %]">asked
+ to set
+ [% IF flags.requestee == 1 %]
+ a flag
+ [% ELSE %]
+ [% flags.requestee %] flags
+ [% END %]</a>.
+ If you delete the user account,
+ [% IF flags.requestee == 1 %]
+ this flag
+ [% ELSE %]
+ these flags
+ [% END %]
+ will change to be unspecifically requested.
+ </li>
+ [% END %]
+ [% IF namedqueries %]
+ <li>
+ [% otheruser.login FILTER html %] has
+ [% IF namedqueries == 1 %]
+ a [% 'shared' IF namedquery_group_map %] named search
+ [% ELSE %]
+ [%+ namedqueries FILTER html %] named searches
+ [% END %].
+ [% IF namedqueries == 1 %]
+ This named search
+ [% ELSE %]
+ These named searches
+ [% END %]
+ will be deleted along with the user account.
+ [% IF namedquery_group_map %]
+ [% IF namedqueries > 1 %]
+ Of these,
+ [% IF namedquery_group_map > 1 %]
+ [%+ namedquery_group_map FILTER html %] are
+ [% ELSE %]
+ one is
+ [% END %]
+ shared.
+ [% END %]
+ Other users will not be able to use
+ [% IF namedquery_group_map > 1 %]
+ these shared named searches
+ [% ELSE %]
+ this shared named search
+ [% END %]
+ any more.
+ [% END %]
+ </li>
+ [% END %]
+ [% IF profile_setting %]
+ <li>
+ The user's preference settings will be deleted along with the user
+ account.
+ </li>
+ [% END %]
+ [% IF series %]
+ <li>
+ [% otheruser.login FILTER html %] has created
+ [% IF series == 1 %]
+ a series
+ [% ELSE %]
+ [%+ series %] series
+ [% END %].
+ [% IF series == 1 %]
+ This series
+ [% ELSE %]
+ These series
+ [% END %]
+ will be deleted along with the user account.
+ </li>
+ [% END %]
+ [% IF quips %]
+ <li>
+ [% otheruser.login FILTER html %] has submitted
+ [% IF quips == 1 %]
+ a quip
+ [% ELSE %]
+ [%+ quips %] quips
+ [% END %].
+ If you delete the user account,
+ [% IF quips == 1 %]
+ this quip
+ [% ELSE %]
+ these quips
+ [% END %]
+ will have no author anymore, but will remain available.
+ </li>
+ [% END %]
+ [% IF votes %]
+ <li>
+ [% otheruser.login FILTER html %] has voted on
+ [% IF votes == 1 %]
+ [%+ terms.abug %]
+ [% ELSE %]
+ [%+ votes %] [%+ terms.bugs %]
+ [% END %].
+ If you delete the user account,
+ [% IF votes == 1 %]
+ this vote
+ [% ELSE %]
+ these votes
+ [% END %]
+ will be deleted along with the user account.
+ </li>
+ [% END %]
+ [% IF watch.watched || watch.watcher %]
+ <li>
+ [% otheruser.login FILTER html %]
+ [% IF watch.watched %]
+ is being watched by
+ [% IF watch.watched == 1 %]
+ a user
+ [% ELSE %]
+ [%+ watch.watched %] users
+ [% END %]
+ [% END %]
+ [% IF watch.watcher %]
+ [%+ 'and' IF watch.watched %]
+ watches
+ [% IF watch.watcher == 1 %]
+ a user
+ [% ELSE %]
+ [%+ watch.watcher %] users
+ [% END %]
+ [% END %].
+ [% IF watch.watched + watch.watcher == 1 %]
+ This watching
+ [% ELSE %]
+ These watchings
+ [% END %]
+ will cease along with the deletion of the user account.
+ </li>
+ [% END %]
+ [% IF whine_events %]
+ <li>
+ [% otheruser.login FILTER html %] has scheduled
+ [% IF whine_events == 1 %]
+ a whine
+ [% ELSE %]
+ [%+ whine_events %] whines
+ [% END %].
+ [% IF whine_events == 1 %]
+ This whine
+ [% ELSE %]
+ These whines
+ [% END %]
+ will be deleted along with the user account.
+ </li>
+ [% END %]
+ [% IF whine_schedules %]
+ <li>
+ [% otheruser.login FILTER html %] is on the receiving end of
+ [% IF whine_schedules == 1 %]
+ a whine
+ [% ELSE %]
+ [%+ whine_schedules %] whines
+ [% END %].
+ The corresponding schedules will be deleted along with the user account,
+ but the whines themselves will be left unaltered.
+ </li>
+ [% END %]
+ </ul>
+ </div>
+
+ [% IF accept_deletion %]
+ <p class="areyoureallyreallysure">
+ Please be aware of the consequences of this before continuing.
+ </p>
+ <p>Do you really want to delete this user account?</p>
+
+ <form method="post" action="editusers.cgi">
+ <p>
+ <input type="submit" id="delete" value="Yes, delete"/>
+ <input type="hidden" name="action" value="delete" />
+ <input type="hidden" name="userid" value="[% otheruser.id %]" />
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ [% INCLUDE listselectionhiddenfields %]
+ </p>
+ </form>
+ <p>If you do not want to delete the user account at this time,
+ [% ELSE %]
+ <p><b>You cannot delete this user account</b> due to unsafe actions reported above. You can
+ [% END %]
+
+ [% END %]
+[% END %]
+
+ <a href="editusers.cgi?action=edit&amp;userid=[% otheruser.id %]
+ [% INCLUDE listselectionurlparams %]">edit the user</a>,
+ go
+ <a href="editusers.cgi?action=list[% INCLUDE listselectionurlparams %]">back
+ to the user list</a>,
+ [% IF editusers %]
+ <a href="editusers.cgi?action=add[% INCLUDE listselectionurlparams %]">add
+ a new user</a>,
+ [% END %]
+ or <a href="editusers.cgi">find other users</a>.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/users/create.html.tmpl b/template/en/default/admin/users/create.html.tmpl
new file mode 100644
index 0000000..6fd5b67
--- /dev/null
+++ b/template/en/default/admin/users/create.html.tmpl
@@ -0,0 +1,58 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ #
+ # listselectionvalues: selection values to recreate the current user list.
+ # editusers: is viewing user member of editusers?
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Add user"
+ style_urls = ['skins/standard/editusers.css']
+ onload = "document.forms['f'].login.focus()"
+ doc_section = "useradmin.html#createnewusers"
+%]
+
+[% PROCESS admin/users/listselectvars.html.tmpl
+ listselectionvalues = listselectionvalues
+%]
+
+<form name="f" method="post" action="editusers.cgi">
+<table class="main">
+ [% PROCESS admin/users/userdata.html.tmpl
+ editform = 0
+ editusers = editusers
+ otheruser = []
+ %]
+</table>
+<p>
+ <input type="submit" id="add" value="Add"/>
+ <input type="hidden" name="action" value="new" />
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ [% INCLUDE listselectionhiddenfields %]
+</p>
+</form>
+
+<p>
+ You can also <a href="editusers.cgi">find a user</a>
+ [% IF listselectionvalues %],
+ or
+ <a href="editusers.cgi?action=list[% INCLUDE listselectionurlparams %]">go
+ back to the user list</a>
+ [% END %].
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/users/edit.html.tmpl b/template/en/default/admin/users/edit.html.tmpl
new file mode 100644
index 0000000..3efa4b8
--- /dev/null
+++ b/template/en/default/admin/users/edit.html.tmpl
@@ -0,0 +1,168 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ #
+ # message: message tag specifying a global/messages.html.tmpl
+ # message
+ # listselectionvalues: selection values to recreate the current user list.
+ # editusers: is viewing user member of editusers?
+ # otheruser: Bugzilla::User object of viewed user.
+ # groups: array of group information (name, grant type,
+ # canbless) for viewed user.
+ #%]
+
+[% title = BLOCK %]Edit user [% otheruser.identity FILTER html %][% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ message = message
+ style_urls = ['skins/standard/admin.css', 'skins/standard/editusers.css']
+ doc_section = "useradmin.html#modifyusers"
+%]
+
+[% PROCESS admin/users/listselectvars.html.tmpl
+ listselectionvalues = listselectionvalues
+%]
+
+<form method="post" action="editusers.cgi">
+<table class="main">
+ [% PROCESS admin/users/userdata.html.tmpl
+ editform = 1
+ editusers = editusers
+ otheruser = otheruser
+ %]
+ [% IF groups.size %]
+ <tr>
+ <th>Group access:</th>
+ <td>
+ <table class="groups">
+ <tr>
+ [% IF editusers %]
+ <th colspan="3">
+ Can turn these bits on for other users
+ </th>
+ [% END %]
+ </tr>
+ <tr>
+ [% IF editusers %]
+ <td style="text-align: center; font-weight: bold">|</td>
+ [% END %]
+ <th colspan="2">User is a member of these groups</th>
+ </tr>
+ [% FOREACH group = groups %]
+ [% perms = permissions.${group.id} %]
+ <tr class="[% 'in' IF perms.regexpmember || perms.derivedmember %]direct">
+ [% IF editusers %]
+ <td class="checkbox">
+ [% '[' IF perms.indirectbless %]
+ [% %]<input type="checkbox"
+ name="bless_[% group.id %]"
+ value="1"
+ [% ' checked="checked"' IF perms.directbless %] />
+ [% ']' IF perms.indirectbless %]</td>
+ [% END %]
+ <td class="checkbox">
+ [% '[' IF perms.derivedmember %]
+ [% '*' IF perms.regexpmember %]
+ [%%]<input type="checkbox"
+ id="group_[% group.id %]"
+ name="group_[% group.id %]"
+ value="1"
+ [% ' checked="checked"' IF perms.directmember %] />
+ [% '*' IF perms.regexpmember %]
+ [% ']' IF perms.derivedmember %]</td>
+ <td class="groupname">
+ <label for="group_[% group.id %]">
+ <strong>[% group.name FILTER html %]:</strong>
+ [%+ group.description FILTER html_light %]
+ </label>
+ </td>
+ </tr>
+ [% END %]
+ </table>
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <th>Product responsibilities:</th>
+ <td>
+ [% IF otheruser.product_responsibilities.size %]
+ [% PROCESS admin/users/responsibilities.html.tmpl otheruser = otheruser %]
+ [% ELSE %]
+ <em>none</em>
+ [% END %]
+ </td>
+ </tr>
+</table>
+
+<p>
+ <input type="submit" id="update" value="Save Changes" />
+ <input type="hidden" name="userid" value="[% otheruser.id %]" />
+ <input type="hidden" name="action" value="update" />
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ [% INCLUDE listselectionhiddenfields %]
+
+ or <a href="editusers.cgi?action=activity&amp;userid=[% otheruser.id %]"
+ title="View Account History for '
+ [%- otheruser.login FILTER html %]'">View Account History</a>
+</p>
+</form>
+<p>
+ User is a member of any groups shown with a check or grey bar.
+ A grey bar indicates indirect membership, either derived from other
+ groups (marked with square brackets) or via regular expression
+ (marked with '*').
+</p>
+[% IF editusers %]
+ <p>
+ Square brackets around the bless checkbox indicate the ability
+ to bless users (grant them membership in the group) as a result
+ of membership in another group.
+ </p>
+[% END %]
+
+[% IF Param('allowuserdeletion') && editusers %]
+ <form method="post" action="editusers.cgi">
+ <p>
+ <input type="submit" id="delete" value="Delete User" />
+ <input type="hidden" name="action" value="del" />
+ <input type="hidden" name="userid" value="[% otheruser.id %]" />
+ [% INCLUDE listselectionhiddenfields %]
+ </p>
+ </form>
+[% END %]
+
+<p>
+ You can also
+ [% IF editusers %]
+ <a href="editusers.cgi?action=add[% INCLUDE listselectionurlparams %]">add
+ a new user</a>
+ [% IF listselectionvalues %],
+ [% END %]
+ [% END %]
+ [% IF listselectionvalues.matchtype != 'exact' %]
+ go
+ <a href="editusers.cgi?action=list[% INCLUDE listselectionurlparams %]">back
+ to the user list</a>,
+ [% END %]
+ [% IF editusers OR listselectionvalues %]
+ or
+ [% END %]
+ <a href="editusers.cgi">find other users</a>.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/users/list.html.tmpl b/template/en/default/admin/users/list.html.tmpl
new file mode 100644
index 0000000..cb05e82
--- /dev/null
+++ b/template/en/default/admin/users/list.html.tmpl
@@ -0,0 +1,115 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ #
+ # listselectionvalues: selection values to recreate the current user list.
+ # editusers: is viewing user member of editusers?
+ # users: list of user information (id, login_name, realname,
+ # disabledtext).
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Select user"
+ style_urls = ['skins/standard/editusers.css']
+ doc_section = "useradmin.html"
+%]
+
+[% PROCESS admin/users/listselectvars.html.tmpl
+ listselectionvalues = listselectionvalues
+%]
+
+[% listselectionurlparams = INCLUDE listselectionurlparams %]
+
+[% columns =
+ [{name => 'login_name'
+ heading => 'Edit user...'
+ contentlink => 'editusers.cgi?action=edit&amp;userid=%%userid%%' _
+ listselectionurlparams
+ }
+ {name => 'realname'
+ heading => 'Real name'
+ }
+ {heading => 'Account History'
+ content => 'View'
+ contentlink => 'editusers.cgi?action=activity' _
+ '&amp;userid=%%userid%%' _
+ listselectionurlparams
+ }
+ ]
+%]
+
+[% IF Param('allowuserdeletion') && editusers %]
+ [% columns.push({heading => 'Action'
+ content => 'Delete'
+ contentlink => 'editusers.cgi?action=del' _
+ '&amp;userid=%%userid%%' _
+ listselectionurlparams
+ }
+ )
+ %]
+[% END %]
+
+[%# Disabled users are crossed out. Missing realnames are noticed in red. %]
+[% overrides.login_name = {} %]
+[% overrides.realname = {} %]
+
+[% FOREACH thisuser = users %]
+ [% IF !thisuser.realname %]
+ [%# We cannot pass one class now and one class later. %]
+ [% SET classes = (thisuser.disabledtext ? "bz_inactive missing" : "missing") %]
+ [% overrides.realname.login_name.${thisuser.login_name} = {
+ content => "missing"
+ override_content => 1
+ class => "$classes"
+ override_class => 1
+ }
+ %]
+ [% ELSIF thisuser.disabledtext %]
+ [% overrides.realname.login_name.${thisuser.login_name} = {
+ class => "bz_inactive"
+ override_class => 1
+ }
+ %]
+ [% END %]
+
+ [% IF thisuser.disabledtext %]
+ [% overrides.login_name.login_name.${thisuser.login_name} = {
+ class => "bz_inactive"
+ override_class => 1
+ }
+ %]
+ [% END %]
+[% END %]
+
+<p>[% users.size %] user[% "s" UNLESS users.size == 1 %] found.</p>
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = users
+ overrides = overrides
+%]
+
+<p>
+ If you do not wish to modify a user account at this time, you can
+ <a href="editusers.cgi">find other users</a>
+ [% IF editusers %]
+ or
+ <a href="editusers.cgi?action=add[% INCLUDE listselectionurlparams %]">add
+ a new user</a>
+ [% END %].
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/users/listselectvars.html.tmpl b/template/en/default/admin/users/listselectvars.html.tmpl
new file mode 100644
index 0000000..a6eae57
--- /dev/null
+++ b/template/en/default/admin/users/listselectvars.html.tmpl
@@ -0,0 +1,33 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ #
+ # listselectionvalues: selection values to recreate the current user list.
+ #%]
+
+[% BLOCK listselectionurlparams %]
+ [% FOREACH field = listselectionvalues.keys %]&amp;
+ [% field FILTER url_quote %]=
+ [% listselectionvalues.$field FILTER url_quote %]
+ [% END %]
+[% END %]
+
+[% BLOCK listselectionhiddenfields %]
+ [% FOREACH field = listselectionvalues.keys %]
+ <input type="hidden" name="[% field FILTER html %]"
+ value="[% listselectionvalues.$field FILTER html %]" />
+ [% END %]
+[% END %]
diff --git a/template/en/default/admin/users/responsibilities.html.tmpl b/template/en/default/admin/users/responsibilities.html.tmpl
new file mode 100644
index 0000000..bbf121a
--- /dev/null
+++ b/template/en/default/admin/users/responsibilities.html.tmpl
@@ -0,0 +1,61 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% hidden_products = 0 %]
+<table id="user_responsibilities" border="0">
+ [% FOREACH item = otheruser.product_responsibilities %]
+ [% IF !user.can_see_product(item.product.name) %]
+ [% hidden_products = 1 %]
+ [% NEXT %]
+ [% END %]
+ <tbody>
+ <tr>
+ <th colspan="3" class="product">Product: [% item.product.name FILTER html %]</th>
+ </tr>
+ <tr>
+ <th>Component</th>
+ <th>Default Assignee</th>
+ <th>Default QA Contact</th>
+ </tr>
+ [% FOREACH component = item.components %]
+ <tr>
+ <td>
+ [% IF user.in_group("editcomponents", component.product_id) %]
+ <a href="editcomponents.cgi?action=edit&amp;product=
+ [% item.product.name FILTER url_quote %]&amp;component=
+ [% component.name FILTER url_quote %]">
+ [% END %]
+ [% component.name FILTER html %]
+ [% IF user.in_group("editcomponents", component.product_id) %]
+ </a>
+ [% END %]
+ </td>
+ [% FOREACH responsibility = ['default_assignee', 'default_qa_contact'] %]
+ <td class="center">
+ [% component.$responsibility.id == otheruser.id ? "X" : "&nbsp;" %]
+ </td>
+ [% END %]
+ </tr>
+ [% END %]
+ </tbody>
+ [% END %]
+</table>
+
+[% IF hidden_products %]
+ <p class="criticalmessages">The user is involved in at least one product which you cannot
+ see (and so is not listed above). You have to ask an administrator with enough
+ privileges to edit this user's roles for these products.</p>
+[% END %]
diff --git a/template/en/default/admin/users/search.html.tmpl b/template/en/default/admin/users/search.html.tmpl
new file mode 100644
index 0000000..82e0afd
--- /dev/null
+++ b/template/en/default/admin/users/search.html.tmpl
@@ -0,0 +1,78 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ # David Lawrence <dkl@redhat.com>
+ #%]
+
+[%# INTERFACE:
+ #
+ # editusers: is viewing user member of editusers?
+ # restrictablegroups: list of groups visible to the user:
+ # id: group id
+ # name: group name
+ #%]
+
+
+[% PROCESS global/header.html.tmpl
+ title = "Search users"
+ style_urls = ['skins/standard/editusers.css']
+ onload = "document.forms['f'].matchstr.focus()"
+ doc_section = "useradmin.html#user-account-search"
+%]
+
+[% PROCESS admin/users/listselectvars.html.tmpl
+ listselectionvalues = listselectionvalues
+%]
+
+<form name="f" method="get" action="editusers.cgi">
+<input type="hidden" name="action" value="list" />
+<p><label for="matchvalue">List users with</label>
+<select id="matchvalue" name="matchvalue">
+ <option value="login_name">login name</option>
+ <option value="realname">real name</option>
+ <option value="userid">user id</option>
+</select>
+<label for="matchstr">matching</label>
+<input size="32" name="matchstr" id="matchstr" />
+<select name="matchtype">
+ <option value="substr" selected="selected">case-insensitive substring</option>
+ <option value="regexp">case-insensitive regexp</option>
+ <option value="notregexp">not (case-insensitive regexp)</option>
+ <option value="exact">exact (find this user)</option>
+</select>
+<input type="submit" id="search" value="Search" /></p>
+
+[% IF restrictablegroups.size %]
+ <p><input type="checkbox" name="grouprestrict" value="1" id="grouprestrict" />
+ <label for="grouprestrict">Restrict to users belonging to group</label>
+ <select name="groupid"
+ onchange="document.forms['f'].grouprestrict.checked=true">
+ [% FOREACH group = restrictablegroups %]
+ <option value="[% group.id FILTER html %]">[% group.name FILTER html %]</option>
+ [% END %]
+ </select></p>
+[% END %]
+</form>
+
+[% IF editusers %]
+ <p>
+ You can also <a href="editusers.cgi?action=add">add a new user</a>
+ [%- IF listselectionvalues %],
+ or
+ <a href="editusers.cgi?action=list[% INCLUDE listselectionurlparams %]">show
+ the user list again</a>
+ [%- END %].
+ </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/users/userdata.html.tmpl b/template/en/default/admin/users/userdata.html.tmpl
new file mode 100644
index 0000000..f23aa1b
--- /dev/null
+++ b/template/en/default/admin/users/userdata.html.tmpl
@@ -0,0 +1,98 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ #
+ # editform: is this an edit form? (It's a create form otherwise)
+ # editusers: is viewing user member of editusers?
+ # otheruser: Bugzilla::User object of user to edit
+ #%]
+
+<tr>
+ <th><label for="login">Login name:</label></th>
+ <td>
+ [% IF editusers %]
+ <input size="64" maxlength="255" name="login"
+ id="login" value="[% otheruser.login FILTER html %]" />
+ [% IF editform %]
+ [% IF !otheruser.in_group('bz_sudo_protect') %]
+ <br />
+ <a href="relogin.cgi?action=prepare-sudo&amp;target_login=
+ [%- otheruser.login FILTER url_quote %]">Impersonate this user</a>
+ [% END %]
+ [% END %]
+ [% ELSE %]
+ [% otheruser.login FILTER html %]
+ [% END %]
+ </td>
+</tr>
+<tr>
+ <th><label for="name">Real name:</label></th>
+ <td>
+ [% IF editusers %]
+ <input size="64" maxlength="255" name="name"
+ autocomplete="off"
+ id="name" value="[% otheruser.name FILTER html %]" />
+ [% ELSE %]
+ [% otheruser.name FILTER html %]
+ [% END %]
+ </td>
+</tr>
+
+[%# XXX This condition (can_change_password) will cause a problem
+ # if we ever have a login system that can create accounts through
+ # createaccount.cgi but can't change passwords.
+ #%]
+
+[% IF editusers %]
+ [% IF user.authorizer.can_change_password %]
+ <tr>
+ <th><label for="password">Password:</label></th>
+ <td>
+ <input type="password" size="16" maxlength="16" name="password"
+ autocomplete="off"
+ id="password" value="" />
+ [% IF editform %]<br />
+ (Enter new password to change.)
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+ <tr>
+ <th><label for="disable_mail">[% terms.Bug %]mail Disabled:</label></th>
+ <td>
+ <input type="checkbox" name="disable_mail" id="disable_mail" value="1"
+ [% IF otheruser.email_disabled %] checked="checked" [% END %] />
+ (This affects [% terms.bug %]mail and whinemail, not password-reset or other
+ non-[% terms.bug %]-related emails)
+ </td>
+ </tr>
+ <tr>
+ <th><label for="disabledtext">Disable text:</label></th>
+ <td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'disabledtext'
+ id = 'disabledtext'
+ minrows = 2
+ maxrows = 10
+ defaultrows = 10
+ cols = 60
+ defaultcontent = otheruser.disabledtext
+ %]<br>
+ (If non-empty, then the account will be disabled, and this text should
+ explain why.)
+ </td>
+ </tr>
+[% END %]
diff --git a/template/en/default/admin/versions/confirm-delete.html.tmpl b/template/en/default/admin/versions/confirm-delete.html.tmpl
new file mode 100644
index 0000000..88ffceb
--- /dev/null
+++ b/template/en/default/admin/versions/confirm-delete.html.tmpl
@@ -0,0 +1,101 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the version belongs.
+ # version: object; Bugzilla::Version object representing the
+ # version the user wants to delete.
+ #%]
+
+[% title = BLOCK %]Delete Version of Product '[% product.name FILTER html %]'
+ [% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+<table border="1" cellpadding="4" cellspacing="0">
+<tr bgcolor="#6666FF">
+ <th valign="top" align="left">Field</th>
+ <th valign="top" align="left">Value</th>
+</tr>
+<tr>
+ <td valign="top">Version:</td>
+ <td valign="top">[% version.name FILTER html %]</td>
+</tr>
+<tr>
+ <td valign="top">Version of Product:</td>
+ <td valign="top">[% product.name FILTER html %]</td>
+</tr>
+<tr>
+ <td valign="top">[% terms.Bugs %]:</td>
+ <td valign="top">
+[% IF version.bug_count %]
+ <a title="List of [% terms.bugs %] targetted at version '
+ [%- version.name FILTER html %]'"
+ href="buglist.cgi?version=[% version.name FILTER url_quote %]&amp;product=
+ [%- product.name FILTER url_quote %]">
+ [%- version.bug_count FILTER none %]</a>
+[% ELSE %]
+ None
+[% END %]
+ </td>
+</tr>
+</table>
+
+<h2>Confirmation</h2>
+
+[% IF version.bug_count %]
+ <p>
+ Sorry, there
+ [% IF version.bug_count > 1 %]
+ are [% version.bug_count FILTER none %] [%+ terms.bugs %]
+ [% ELSE %]
+ is [% version.bug_count FILTER none %] [%+ terms.bug %]
+ [% END %]
+
+ outstanding for this version. You must move
+
+ [% IF version.bug_count > 1 %]
+ those [% terms.bugs %]
+ [% ELSE %]
+ that [% terms.bug %]
+ [% END %]
+ to another version before you can delete this one.
+ </p>
+[% ELSE %]
+
+ <p>Do you really want to delete this version?</p>
+
+ <form method="post" action="editversions.cgi">
+ <input type="submit" id="delete" value="Yes, delete">
+ <input type="hidden" name="action" value="delete">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ <input type="hidden" name="version" value="[% version.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ </form>
+
+[% END %]
+
+[% PROCESS admin/versions/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/versions/create.html.tmpl b/template/en/default/admin/versions/create.html.tmpl
new file mode 100644
index 0000000..8b4ba64
--- /dev/null
+++ b/template/en/default/admin/versions/create.html.tmpl
@@ -0,0 +1,52 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the version is being created for
+ #%]
+
+[% title = BLOCK %]Add Version to Product '[% product.name FILTER html %]'[% END %]
+[% subheader = BLOCK %]This page allows you to add a new version to product
+ '[% product.name FILTER html %]'.[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+ subheader = subheader
+%]
+
+<form method="post" action="editversions.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+ <tr>
+ <th align="right"><label for="version">Version:</label></th>
+ <td><input id="version" size="64" maxlength="64" name="version"
+ value=""></td>
+ </tr>
+ </table>
+ <input type="submit" id="create" value="Add">
+ <input type="hidden" name="action" value="new">
+ <input type="hidden" name='product' value="[% product.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+[% PROCESS admin/versions/footer.html.tmpl
+ no_add_version_link = 1
+ %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/versions/edit.html.tmpl b/template/en/default/admin/versions/edit.html.tmpl
new file mode 100644
index 0000000..2a7c784
--- /dev/null
+++ b/template/en/default/admin/versions/edit.html.tmpl
@@ -0,0 +1,57 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the version belongs.
+ # version: object; Bugzilla::Version object representing the
+ # version the user wants to edit.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]Edit Version '[% version.name FILTER html %]' of product '
+ [%- product.name FILTER html %]'[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+<form method="post" action="editversions.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+
+ <tr>
+ <th valign="top"><label for="version">Version:</label></th>
+ <td><input id="version" size="64" maxlength="64" name="version" value="
+ [%- version.name FILTER html %]"></td>
+ </tr>
+
+ </table>
+
+ <input type="hidden" name="versionold" value="[% version.name FILTER html %]">
+ <input type="hidden" name="action" value="update">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" id="update" value="Save Changes">
+</form>
+
+[% PROCESS admin/versions/footer.html.tmpl
+ no_edit_version_link = 1 %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/versions/footer.html.tmpl b/template/en/default/admin/versions/footer.html.tmpl
new file mode 100644
index 0000000..8d96a12
--- /dev/null
+++ b/template/en/default/admin/versions/footer.html.tmpl
@@ -0,0 +1,65 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the version belongs.
+ # version: object; Bugzilla::Version object representing the version
+ #
+ # no_XXX_link: boolean; if defined, then don't show the corresponding
+ # link. Supported parameters are:
+ #
+ # no_edit_version_link
+ # no_edit_other_versions_link
+ # no_add_version_link
+ #%]
+
+<hr>
+
+<p>
+
+[% UNLESS no_add_version_link %]
+ <a title="Add a version to product '[% product.name FILTER html %]'"
+ href="editversions.cgi?action=add&amp;product=
+ [%- product.name FILTER url_quote %]">Add</a> a version.
+[% END %]
+
+[% IF version.name && !no_edit_version_link %]
+ Edit version <a
+ title="Edit Version '[% version.name FILTER html %]' of product '
+ [%- product.name FILTER html %]'"
+ href="editversions.cgi?action=edit&amp;product=
+ [%- product.name FILTER url_quote %]&amp;version=
+ [%- version.name FILTER url_quote %]">
+ '[% version.name FILTER html %]'</a>.
+[% END %]
+
+[% UNLESS no_edit_other_versions_link %]
+ Edit other versions of product <a
+ href="editversions.cgi?product=
+ [%- product.name FILTER url_quote %]">'[% product.name FILTER html %]'</a>.
+
+[% END %]
+
+ Edit product <a
+ href="editproducts.cgi?action=edit&amp;product=
+ [%- product.name FILTER url_quote %]">'[% product.name FILTER html %]'</a>.
+
+</p>
diff --git a/template/en/default/admin/versions/list.html.tmpl b/template/en/default/admin/versions/list.html.tmpl
new file mode 100644
index 0000000..401ee51
--- /dev/null
+++ b/template/en/default/admin/versions/list.html.tmpl
@@ -0,0 +1,89 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the versions belongs.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]Select version of product
+ '[% product.name FILTER html %]'[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+[% edit_contentlink = BLOCK %]editversions.cgi?action=edit&amp;product=
+ [%- product.name FILTER url_quote %]&amp;version=%%name%%[% END %]
+[% delete_contentlink = BLOCK %]editversions.cgi?action=del&amp;product=
+ [%- product.name FILTER url_quote %]&amp;version=%%name%%[% END %]
+[% bug_count_contentlink = BLOCK %]buglist.cgi?version=%%name%%&amp;product=
+ [%- product.name FILTER url_quote %][% END %]
+
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit version..."
+ contentlink => edit_contentlink
+ }
+ ]
+%]
+
+[% IF showbugcounts %]
+
+ [% columns.push({
+ name => "bug_count"
+ heading => "$terms.Bugs"
+ align => "right"
+ contentlink => bug_count_contentlink
+ })
+ %]
+
+[% END %]
+
+[% columns.push({
+ heading => "Action"
+ content => "Delete"
+ contentlink => delete_contentlink
+ })
+%]
+
+[% Hook.process('before_table') %]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = product.versions
+%]
+
+[% IF ! showbugcounts %]
+
+ <p><a href="editversions.cgi?product=[% product.name FILTER url_quote %]&amp;showbugcounts=1">
+ Redisplay table with [% terms.bug %] counts (slower)</a></p>
+
+[% END %]
+
+[% PROCESS admin/versions/footer.html.tmpl
+ no_edit_other_versions_link = 1
+ %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/versions/select-product.html.tmpl b/template/en/default/admin/versions/select-product.html.tmpl
new file mode 100644
index 0000000..7fded47
--- /dev/null
+++ b/template/en/default/admin/versions/select-product.html.tmpl
@@ -0,0 +1,70 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #
+ #%]
+
+[%# INTERFACE:
+ # products: array of product objects
+ # showbugcounts: if defined, then bug counts should be included in the table
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Edit versions for which product?"
+%]
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit versions of..."
+ contentlink => "editversions.cgi?product=%%name%%"
+ },
+ {
+ name => "description"
+ heading => "Description"
+ allow_html_content => 1
+ }
+ ]
+%]
+
+[% IF showbugcounts %]
+
+ [% columns.push({
+ name => 'bug_count'
+ heading => "$terms.Bugs"
+ align => "right"
+ contentlink => "buglist.cgi?product=%%name%%"
+ })
+ %]
+
+[% END %]
+
+[% PROCESS admin/table.html.tmpl
+ columns = columns
+ data = products
+%]
+
+[% IF !showbugcounts %]
+ <p><a href="editversions.cgi?showbugcounts=1">
+ Redisplay table with [% terms.bug %] counts (slower)</a></p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/workflow/comment.html.tmpl b/template/en/default/admin/workflow/comment.html.tmpl
new file mode 100644
index 0000000..a7a6a74
--- /dev/null
+++ b/template/en/default/admin/workflow/comment.html.tmpl
@@ -0,0 +1,92 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ # Gervase Markham <gerv@mozilla.org>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% INCLUDE global/header.html.tmpl
+ title = "Comments Required on Status Transitions"
+ style_urls = ['skins/standard/admin.css']
+%]
+
+<script type="text/javascript">
+<!--
+ function toggle_cell(cell) {
+ if (cell.checked)
+ cell.parentNode.className = "checkbox-cell checked";
+ else
+ cell.parentNode.className = "checkbox-cell";
+ }
+//-->
+</script>
+
+<p>
+ This page allows you to define which status transitions require a comment
+ by the user doing the change.
+</p>
+
+<form id="workflow_form" method="POST" action="editworkflow.cgi">
+<table>
+ <tr>
+ <th colspan="2">&nbsp;</th>
+ <th colspan="[% statuses.size FILTER html %]" class="title">To</th>
+ </tr>
+
+ <tr>
+ <th rowspan="[% statuses.size + 2 FILTER html %]" class="title">From</th>
+ <th>&nbsp;</th>
+ [% FOREACH status = statuses %]
+ <th class="col-header[% status.is_open ? " open-status" : " closed-status" %]">
+ [% display_value("bug_status", status.name) FILTER html %]
+ </th>
+ [% END %]
+ </tr>
+
+ [%# This defines the entry point in the workflow %]
+ [% p = [{id => 0, name => "{Start}", is_open => 1}] %]
+ [% FOREACH status = p.merge(statuses) %]
+ <tr class="highlight">
+ <th align="right" class="[% status.is_open ? "open-status" : "closed-status" %]">
+ [% display_value("bug_status", status.name) FILTER html %]
+ </th>
+
+ [% FOREACH new_status = statuses %]
+ [% IF workflow.${status.id}.${new_status.id}.defined %]
+ <td align="center" class="checkbox-cell
+ [% " checked" IF workflow.${status.id}.${new_status.id} %]"
+ title="From [% status.name FILTER html %] to [% new_status.name FILTER html %]">
+ <input type="checkbox" name="c_[% status.id %]_[% new_status.id %]"
+ id="c_[% status.id %]_[% new_status.id %]" onclick="toggle_cell(this)"
+ [% " checked='checked'" IF workflow.${status.id}.${new_status.id} %]>
+ </td>
+ [% ELSE %]
+ <td class="checkbox-cell forbidden">&nbsp;</td>
+ [% END %]
+ [% END %]
+ </tr>
+ [% END %]
+</table>
+
+<p align="center">
+ <input type="hidden" name="action" value="update_comment">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" value="Commit Changes"> -
+ <a href="editworkflow.cgi?action=edit_comment">Cancel Changes</a> -
+ <a href="editworkflow.cgi">View Current Workflow</a>
+</p>
+
+</form>
+
+[% INCLUDE global/footer.html.tmpl %]
diff --git a/template/en/default/admin/workflow/edit.html.tmpl b/template/en/default/admin/workflow/edit.html.tmpl
new file mode 100644
index 0000000..406c08a
--- /dev/null
+++ b/template/en/default/admin/workflow/edit.html.tmpl
@@ -0,0 +1,110 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ # Gervase Markham <gerv@mozilla.org>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% INCLUDE global/header.html.tmpl
+ title = "Edit Workflow"
+ style_urls = ['skins/standard/admin.css']
+%]
+
+<script type="text/javascript">
+<!--
+ function toggle_cell(cell) {
+ if (cell.checked)
+ cell.parentNode.className = "checkbox-cell checked";
+ else
+ cell.parentNode.className = "checkbox-cell";
+ }
+//-->
+</script>
+
+<p>
+ This page allows you to define which status transitions are valid in your workflow.
+ For compatibility with older versions of [% terms.Bugzilla %], reopening [% terms.abug %]
+ will only display either [% display_value("bug_status", "UNCONFIRMED") FILTER html %] or
+ [%+ display_value("bug_status", "REOPENED") FILTER html %] (if allowed by your workflow) but not
+ both. The decision depends on whether the [% terms.bug %] has ever been confirmed or not.
+ So it is a good idea to allow both transitions and let [% terms.Bugzilla %] select the
+ correct one.
+</p>
+
+<form id="workflow_form" method="POST" action="editworkflow.cgi">
+<table>
+ <tr>
+ <th colspan="2">&nbsp;</th>
+ <th colspan="[% statuses.size FILTER html %]" class="title">To</th>
+ </tr>
+
+ <tr>
+ <th rowspan="[% statuses.size + 2 FILTER html %]" class="title">From</th>
+ <th>&nbsp;</th>
+ [% FOREACH status = statuses %]
+ <th class="col-header[% status.is_open ? " open-status" : " closed-status" %]">
+ [% display_value("bug_status", status.name) FILTER html %]
+ </th>
+ [% END %]
+ </tr>
+
+ [%# This defines the entry point in the workflow %]
+ [% p = [{id => 0, name => "{Start}", is_open => 1}] %]
+ [% FOREACH status = p.merge(statuses) %]
+ <tr class="highlight">
+ <th align="right" class="[% status.is_open ? "open-status" : "closed-status" %]">
+ [% display_value("bug_status", status.name) FILTER html %]
+ </th>
+
+ [% FOREACH new_status = statuses %]
+ [% IF status.id != new_status.id && (status.id || new_status.is_open) %]
+ [% checked = workflow.${status.id}.${new_status.id}.defined ? 1 : 0 %]
+ [% mandatory = (status.id && new_status.name == Param("duplicate_or_move_bug_status")) ? 1 : 0 %]
+ <td align="center" class="checkbox-cell[% " checked" IF checked || mandatory %]"
+ title="From [% status.name FILTER html %] to [% new_status.name FILTER html %]">
+ <input type="checkbox" name="w_[% status.id %]_[% new_status.id %]"
+ id="w_[% status.id %]_[% new_status.id %]" onclick="toggle_cell(this)"
+ [%+ "checked='checked'" IF checked || mandatory %]
+ [%+ "disabled='disabled'" IF mandatory %]>
+ </td>
+ [% ELSE %]
+ <td class="checkbox-cell forbidden">&nbsp;</td>
+ [% END %]
+ [% END %]
+ </tr>
+ [% END %]
+</table>
+
+<p>
+ When [% terms.abug %] is marked as a duplicate of another one or is moved
+ to another installation, the [% terms.bug %] status is automatically set to
+ <b>[% display_value("bug_status", Param("duplicate_or_move_bug_status")) FILTER html %]</b>. All transitions to
+ this [% terms.bug %] status must then be valid (this is the reason why you cannot edit
+ them above).<br>
+ Note: you can change this setting by visiting the
+ <a href="editparams.cgi?section=bugchange#duplicate_or_move_bug_status">Parameters</a>
+ page and editing the <i>duplicate_or_move_bug_status</i> parameter.
+</p>
+
+<p align="center">
+ <input type="hidden" name="action" value="update">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" value="Commit Changes"> -
+ <a href="editworkflow.cgi">Cancel Changes</a> -
+ <a href="editworkflow.cgi?action=edit_comment">View Comments Required on Status Transitions</a>
+</p>
+
+</form>
+
+[% INCLUDE global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/cancel-create-dupe.html.tmpl b/template/en/default/attachment/cancel-create-dupe.html.tmpl
new file mode 100644
index 0000000..f838955
--- /dev/null
+++ b/template/en/default/attachment/cancel-create-dupe.html.tmpl
@@ -0,0 +1,48 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Olav Vitters.
+ #
+ # Contributor(s): Olav Vitters <olav@bkor.dhs.org>
+ # David Lawrence <dkl@redhat.com>
+ #%]
+
+[%# INTERFACE:
+ # bugid: integer. ID of the bug report that this attachment relates to.
+ # attachid: integer. ID of the previous attachment recently created.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Already filed attachment"
+%]
+
+[% USE Bugzilla %]
+
+<table cellpadding="20">
+ <tr>
+ <td bgcolor="#ff0000">
+ <font size="+2">
+ You already used the form to file
+ <a href="[% urlbase FILTER html %]attachment.cgi?id=[% attachid FILTER url_quote %]&action=edit">attachment [% attachid FILTER url_quote %]</a>.
+ </font>
+ </td>
+ </tr>
+</table>
+
+<p>
+ You can either <a href="[% urlbase FILTER html %]attachment.cgi?bugid=[% bugid FILTER url_quote %]&action=enter">
+ create a new attachment</a> or [% "go back to $terms.bug $bugid" FILTER bug_link(bugid) FILTER none %].
+<p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/choose.html.tmpl b/template/en/default/attachment/choose.html.tmpl
new file mode 100644
index 0000000..700abb4
--- /dev/null
+++ b/template/en/default/attachment/choose.html.tmpl
@@ -0,0 +1,43 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gavin Shelley <bugzilla@chimpychompy.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Locate attachment",
+ onload = "document.forms['choose-id'].id.focus()"
+ %]
+
+<form name="choose-id" method="get" action="attachment.cgi">
+ <p>Access an attachment by entering its ID into the form below:</p>
+ <p>Attachment ID: <input name="id" size="6">
+ <button name="action" value="edit" id="edit">Details</button>
+ <button name="action" value="view" id="view">View</button>
+ </p>
+</form>
+
+<form method="get" action="show_bug.cgi">
+ <p>Or, access it from the list of attachments in its associated [% terms.bug %] report:</p>
+ <p>[% terms.Bug %] ID: <input name="id" size="6">
+ <input type="submit" name="action" value="View" id="action">
+ </p>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/confirm-delete.html.tmpl b/template/en/default/attachment/confirm-delete.html.tmpl
new file mode 100644
index 0000000..14c76c3
--- /dev/null
+++ b/template/en/default/attachment/confirm-delete.html.tmpl
@@ -0,0 +1,92 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # a: attachment object; attachment the user wants to delete.
+ # token: string; The token used to identify the session.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]
+ Delete Attachment [% a.id FILTER html %] of [% terms.Bug %] [%+ a.bug_id FILTER html %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ doc_section = "attachments.html"
+%]
+
+<table border="1" cellpadding="4" cellspacing="0">
+ <tr bgcolor="#6666FF">
+ <th valign="top" align="left">Field</th>
+ <th valign="top" align="left">Value</th>
+ </tr>
+ <tr>
+ <td valign="top">Attachment ID:</td>
+ <td valign="top">
+ <a href="attachment.cgi?id=[% a.id FILTER html %]">[% a.id FILTER html %]</a>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">File name:</td>
+ <td valign="top">[% a.filename FILTER html %]</td>
+ </tr>
+ <tr>
+ <td valign="top">Description:</td>
+ <td valign="top">[% a.description FILTER html %]</td>
+ </tr>
+ <tr>
+ <td valign="top">Contained in [% terms.Bug %]:</td>
+ <td valign="top">[% a.bug_id FILTER bug_link(a.bug_id) FILTER none %]</td>
+ </tr>
+ <tr>
+ <td valign="top">Creator:</td>
+ <td valign="top">[% a.attacher.identity FILTER html %]</td>
+ </tr>
+ <tr>
+ <td valign="top">Creation Date:</td>
+ <td valign="top">[% a.attached FILTER time %]</td>
+ </tr>
+</table>
+
+<h2>Confirmation</h2>
+
+<table border="0" cellpadding="20" width="70%" bgcolor="red">
+ <tr>
+ <td>
+ The content of this attachment will be deleted in an <b>irreversible</b> way.
+ </td>
+ </tr>
+</table>
+
+<p>Do you really want to delete this attachment?</p>
+
+<form action="attachment.cgi" method="POST">
+ <label for="reason">Reason of the deletion:</label>
+ <input type="text" id="reason" name="reason" value="" size="80" maxlength="200">
+ <br>
+ <input type="submit" value="Yes, delete" id="delete">
+ <input type="hidden" name="action" value="delete">
+ <input type="hidden" name="id" value="[% a.id FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+</form>
+
+<p>
+ No, cancel this deletion and return to
+ [%+ "$terms.bug " _ a.bug_id FILTER bug_link(a.bug_id) FILTER none %].
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/content-types.html.tmpl b/template/en/default/attachment/content-types.html.tmpl
new file mode 100644
index 0000000..471222a
--- /dev/null
+++ b/template/en/default/attachment/content-types.html.tmpl
@@ -0,0 +1,27 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+ <option value="text/plain">plain text (text/plain)</option>
+ <option value="text/html">HTML source (text/html)</option>
+ <option value="application/xml">XML source (application/xml)</option>
+ <option value="image/gif">GIF image (image/gif)</option>
+ <option value="image/jpeg">JPEG image (image/jpeg)</option>
+ <option value="image/png">PNG image (image/png)</option>
+ <option value="application/octet-stream">binary file (application/octet-stream)</option>
diff --git a/template/en/default/attachment/create.html.tmpl b/template/en/default/attachment/create.html.tmpl
new file mode 100644
index 0000000..f00a0ad
--- /dev/null
+++ b/template/en/default/attachment/create.html.tmpl
@@ -0,0 +1,135 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Joel Peshkin <bugreport@peshkin.net>
+ # Erik Stambaugh <erik@dasbistro.com>
+ # Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[%# Define strings that will serve as the title and header of this page %]
+[% title = BLOCK %]Create New Attachment for [% terms.Bug %] #[% bug.bug_id %][% END %]
+[% header = BLOCK %]Create New Attachment for
+ [%+ "$terms.Bug $bug.bug_id" FILTER bug_link(bug) FILTER none %][% END %]
+[% subheader = BLOCK %][% bug.short_desc FILTER html %][% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ header = header
+ subheader = subheader
+ style_urls = [ 'skins/standard/create_attachment.css' ]
+ javascript_urls = [ "js/attachment.js", "js/util.js" ]
+ doc_section = "attachments.html"
+%]
+
+<form name="entryform" method="post" action="attachment.cgi"
+ enctype="multipart/form-data"
+ onsubmit="return validateAttachmentForm(this)">
+ <input type="hidden" name="bugid" value="[% bug.bug_id %]">
+ <input type="hidden" name="action" value="insert">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+
+ <table class="attachment_entry">
+ [% PROCESS attachment/createformcontents.html.tmpl %]
+
+ [%# Additional fields for attachments on existing bugs: %]
+ <tr>
+ <th>Obsoletes:</th>
+ <td>
+ <em>(optional) Check each existing attachment made obsolete by your new attachment.</em><br>
+ [% IF attachments.size %]
+ [% FOREACH attachment = attachments %]
+ [% IF ((attachment.isprivate == 0) || user.is_insider) %]
+ <input type="checkbox" id="[% attachment.id %]"
+ name="obsolete" value="[% attachment.id %]">
+ <a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">[% attachment.id %]: [% attachment.description FILTER html %]</a><br>
+ [% END %]
+ [% END %]
+ [% ELSE %]
+ [no attachments can be made obsolete]
+ [% END %]
+ </td>
+ </tr>
+
+ [% IF (user.id != bug.assigned_to.id) AND user.in_group("editbugs", bug.product_id) %]
+ <tr>
+ <th>Reassignment:</th>
+ <td>
+ <em>If you want to assign this [% terms.bug %] to yourself,
+ check the box below.</em><br>
+ <input type="checkbox" id="takebug" name="takebug" value="1">
+ <label for="takebug">take [% terms.bug %]</label>
+ [% bug_statuses = [] %]
+ [% FOREACH bug_status = bug.status.can_change_to %]
+ [% NEXT IF bug_status.name == "UNCONFIRMED"
+ && !bug.product_obj.allows_unconfirmed %]
+ [% bug_statuses.push(bug_status) IF bug_status.is_open %]
+ [% END %]
+ [% IF bug_statuses.size %]
+ <label for="takebug">and set the [% terms.bug %] status to</label>
+ <select id="bug_status" name="bug_status">
+ <option value="[% bug.status.name FILTER html %]">[% display_value("bug_status", bug.status.name) FILTER html %] (current)</option>
+ [% FOREACH bug_status = bug_statuses %]
+ [% NEXT IF bug_status.id == bug.status.id %]
+ <option value="[% bug_status.name FILTER html %]">[% display_value("bug_status", bug_status.name) FILTER html %]</option>
+ [% END %]
+ </select>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+ <tr>
+ <th><label for="comment">Comment:</label></th>
+ <td>
+ <em>(optional) Add a comment about this attachment to the [% terms.bug %].</em><br>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'comment'
+ id = 'comment'
+ minrows = 6
+ maxrows = 15
+ cols = constants.COMMENT_COLS
+ wrap = 'soft'
+ %]
+ </td>
+ </tr>
+ [% IF user.is_insider %]
+ <tr>
+ <th>Privacy:</th>
+ <td>
+ <input type="checkbox" name="isprivate" id="isprivate"
+ value="1" onClick="updateCommentPrivacy(this)">
+ <label for="isprivate">
+ Make attachment and comment private (visible only to members of
+ the <strong>[% Param('insidergroup') FILTER html %]</strong>
+ group)
+ </label>
+ </td>
+ </tr>
+ [% END %]
+ <tr>
+ <th>&nbsp;</th>
+ <td><input type="submit" id="create" value="Submit"></td>
+ </tr>
+ </table>
+
+</form>
+
+[% Hook.process('end') %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/created.html.tmpl b/template/en/default/attachment/created.html.tmpl
new file mode 100644
index 0000000..da2fec8
--- /dev/null
+++ b/template/en/default/attachment/created.html.tmpl
@@ -0,0 +1,67 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # attachment: object of the attachment just created.
+ # contenttypemethod: string. How we got the content type of the attachment.
+ # Possible values: autodetect, list, manual.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% bug = bugs.0 %]
+[% PROCESS "bug/show-header.html.tmpl" %]
+[% PROCESS global/header.html.tmpl
+ title = "Attachment $attachment.id added to $terms.Bug $attachment.bug_id"
+%]
+
+<dl>
+ <dt>
+ <a title="[% attachment.description FILTER html %]"
+ href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">Attachment #[% attachment.id %]</a>
+ to [% "$terms.bug $attachment.bug_id" FILTER bug_link(attachment.bug_id) FILTER none %] created
+ </dt>
+ <dd>
+ [% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = attachment.bug_id %]
+ [% IF convertedbmp %]
+ <p>
+ <b>Note:</b> [% terms.Bugzilla %] automatically converted your BMP image file to a
+ compressed PNG format.
+ </p>
+ [% END %]
+ [% IF contenttypemethod == 'autodetect' %]
+ <p>
+ <b>Note:</b> [% terms.Bugzilla %] automatically detected the content type
+ <em>[% attachment.contenttype FILTER html %]</em> for this attachment. If this is
+ incorrect, correct the value by editing the attachment's
+ <a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">details</a>.
+ </p>
+ [% END %]
+
+ [%# Links to more information about the changed bug. %]
+ [% Hook.process("links") %]
+ </dd>
+</dl>
+
+<p>
+<a href="attachment.cgi?bugid=[% attachment.bug_id %]&amp;action=enter">Create
+ Another Attachment to [% terms.Bug %] [%+ attachment.bug_id %]</a>
+</p>
+
+[% PROCESS bug/show.html.tmpl %]
diff --git a/template/en/default/attachment/createformcontents.html.tmpl b/template/en/default/attachment/createformcontents.html.tmpl
new file mode 100644
index 0000000..2cef632
--- /dev/null
+++ b/template/en/default/attachment/createformcontents.html.tmpl
@@ -0,0 +1,106 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Joel Peshkin <bugreport@peshkin.net>
+ # Erik Stambaugh <erik@dasbistro.com>
+ # Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+<tr>
+ <th><label for="data">File</label>:</th>
+ <td>
+ <em>Enter the path to the file on your computer.</em><br>
+ <input type="file" id="data" name="data" size="50"
+ [% IF Param("allow_attach_url") %]
+ onchange="DataFieldHandler()"
+ [% END %]
+ >
+ </td>
+</tr>
+[% IF Param("maxlocalattachment") %]
+<tr class="expert_fields">
+ <th>BigFile:</th>
+ <td>
+ <input type="checkbox" id="bigfile"
+ name="bigfile" value="bigfile">
+ <label for="bigfile">
+ Big File - Stored locally and may be purged
+ </label>
+ </td>
+</tr>
+[% END %]
+[% IF Param("allow_attach_url") %]
+<tr class="expert_fields">
+ <th><label for="attachurl">AttachURL</label>:</th>
+ <td>
+ <em>URL to be attached instead.</em><br>
+ <input type="text" id="attachurl" name="attachurl" size="60"
+ maxlength="2000"
+ onkeyup="URLFieldHandler()" onblur="URLFieldHandler()">
+ </td>
+</tr>
+</tbody>
+[% END %]
+<tr>
+ <th><label for="description">Description</label>:</th>
+ <td>
+ <em>Describe the attachment briefly.</em><br>
+ <input type="text" id="description" name="description" size="60" maxlength="200">
+ </td>
+</tr>
+<tr class="expert_fields">
+ <th>Content Type:</th>
+ <td>
+ <em>If the attachment is a patch, check the box below.</em><br>
+ <input type="checkbox" id="ispatch" name="ispatch" value="1"
+ onchange="setContentTypeDisabledState(this.form);">
+ <label for="ispatch">patch</label><br><br>
+ [%# Reset this whenever the page loads so that the JS state is up to date %]
+ <script type="text/javascript">
+ YAHOO.util.Event.onDOMReady(function() {
+ bz_fireEvent(document.getElementById('ispatch'), 'change');
+ });
+ </script>
+
+ <em>Otherwise, choose a method for determining the content type.</em><br>
+ <input type="radio" id="autodetect"
+ name="contenttypemethod" value="autodetect" checked="checked">
+ <label for="autodetect">auto-detect</label><br>
+ <input type="radio" id="list"
+ name="contenttypemethod" value="list">
+ <label for="list">select from list</label>:
+ <select name="contenttypeselection" id="contenttypeselection"
+ onchange="this.form.contenttypemethod[1].checked = true;">
+ [% PROCESS "attachment/content-types.html.tmpl" %]
+ </select><br>
+ <input type="radio" id="manual"
+ name="contenttypemethod" value="manual">
+ <label for="manual">enter manually</label>:
+ <input type="text" name="contenttypeentry" id="contenttypeentry"
+ size="30" maxlength="200"
+ onchange="if (this.value) this.form.contenttypemethod[2].checked = true;">
+ </td>
+</tr>
+<tr class="expert_fields">
+ <td> </td>
+ <td>
+ [% IF flag_types && flag_types.size > 0 %]
+ [% PROCESS "flag/list.html.tmpl" bug_id=bugid attach_id=attachid %]<br>
+ [% END %]
+ </td>
+</tr>
diff --git a/template/en/default/attachment/delete_reason.txt.tmpl b/template/en/default/attachment/delete_reason.txt.tmpl
new file mode 100644
index 0000000..e4a1fc4
--- /dev/null
+++ b/template/en/default/attachment/delete_reason.txt.tmpl
@@ -0,0 +1,32 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # attachment: object of the attachment the user wants to delete.
+ # reason: string; The reason provided by the user.
+ # date: the date when the request to delete the attachment was made.
+ #%]
+
+The content of attachment [% attachment.id %] has been deleted by
+ [%+ user.identity %]
+[% IF reason %]
+who provided the following reason:
+
+[%+ reason %]
+[% ELSE %]
+without providing any reason.
+[% END %]
+
+The token used to delete this attachment was generated at [% date FILTER time %].
diff --git a/template/en/default/attachment/diff-file.html.tmpl b/template/en/default/attachment/diff-file.html.tmpl
new file mode 100644
index 0000000..9392ca1
--- /dev/null
+++ b/template/en/default/attachment/diff-file.html.tmpl
@@ -0,0 +1,177 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): John Keiser <jkeiser@netscape.com>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# This line is really long for a reason: to get rid of any possible textnodes
+ # between the elements. This is necessary because DOM parent-child-sibling
+ # relations can change and screw up the javascript for restoring, collapsing
+ # and expanding. Do not change without testing all three of those.
+ # Also, the first empty row is required because 'table-layout: fixed' only
+ # considers the first row to determine column widths. If a colspan is found,
+ # it then share the width equally among all columns, which we don't want.
+ #%]
+<table class="file_table"><thead><tr><td class="num"></td><td></td><td class="num"></td><td></td></tr><tr><td class="file_head" colspan="4"><a href="#" onclick="return twisty_click(this)">[% collapsed ? '(+)' : '(-)' %]</a><input type="checkbox" name="[% file.filename FILTER html %]"[% collapsed ? '' : ' checked' %] style="display: none">
+ [% IF lxr_prefix && !file.is_add %]
+ <a href="[% lxr_prefix %]">[% file.filename FILTER html %]</a>
+ [% ELSE %]
+ [% file.filename FILTER html %]
+ [% END %]
+ [% IF file.plus_lines %]
+ [% IF file.minus_lines %]
+ (-[% file.minus_lines %]&nbsp;/&nbsp;+[% file.plus_lines %]&nbsp;lines)
+ [% ELSE %]
+ (+[% file.plus_lines %]&nbsp;lines)
+ [% END %]
+ [% ELSE %]
+ [% IF file.minus_lines %]
+ (-[% file.minus_lines %]&nbsp;lines)
+ [% END %]
+ [% END %]
+</td></tr></thead><tbody class="[% collapsed ? 'file_collapse' : 'file' %]">
+<script type="text/javascript">
+incremental_restore()
+</script>
+
+[% section_num = 0 %]
+[% FOREACH section = sections %]
+ [% section_num = section_num + 1 %]
+ <tr><th colspan="4" class="section_head">
+ <table cellpadding="0" cellspacing="0">
+ <tr><th width="95%" align="left">
+ [% IF file.is_add %]
+ Added
+ [% ELSIF file.is_remove %]
+ [% IF bonsai_prefix %]
+ <a href="[% bonsai_prefix %]">Removed</a>
+ [% ELSE %]
+ Removed
+ [% END %]
+ [% ELSE %]
+ [% IF bonsai_prefix %]
+ <a href="[% bonsai_prefix %]#[% section.old_start %]">
+ [% END %]
+ [% IF section.old_lines > 1 %]
+ &nbsp;Lines&nbsp;[% section.old_start %]-[% section.old_start +
+ section.old_lines - 1 %]
+ [% ELSE %]
+ Line&nbsp;[% section.old_start %]
+ [% END %]
+ [% IF bonsai_prefix %]
+ </a>
+ [% END %]
+ &nbsp;&nbsp;[% section.func_info FILTER html IF section.func_info %]
+ [% END %]
+ </th><th>
+ <a name="[% file.filename FILTER html %]_sec[% section_num %]" href="#[% file.filename FILTER html %]_sec[% section_num %]">Link&nbsp;Here</a>&nbsp;
+ </th></tr></table>
+ </th></tr>
+ [% current_line_old = section.old_start %]
+ [% current_line_new = section.new_start %]
+ [% FOREACH group = section.groups %]
+ [% IF group.context %]
+ [% FOREACH line = group.context %]
+ <tr>
+ <td class="num">[% current_line_old %]</td>
+ <td><pre>[% line FILTER html %]</pre></td>
+ <td class="num">[% current_line_new %]</td>
+ <td><pre>[% line FILTER html %]</pre></td>
+ </tr>
+ [% current_line_old = current_line_old + 1 %]
+ [% current_line_new = current_line_new + 1 %]
+ [% END %]
+ [% END %]
+ [% IF group.plus.size %]
+ [% IF group.minus.size %]
+ [% i = 0 %]
+ [% WHILE (i < group.plus.size || i < group.minus.size) %]
+ [%# WHILE cannot loop more than 1000 times by default, so we break it every 500 times. %]
+ [% currentloop = 0 %]
+ [% WHILE currentloop < 500 && (i < group.plus.size || i < group.minus.size) %]
+ <tr>
+ [% IF i < group.minus.size %]
+ <td class="num">[% current_line_old + i %]</td>
+ <td class="changed"><pre>[% group.minus.$i FILTER html %]</pre></td>
+ [% ELSIF i == group.minus.size %]
+ [% rowspan = group.plus.size - group.minus.size %]
+ <td class="num"[% IF rowspan > 1 %] rowspan="[% rowspan FILTER none %]"[% END %]></td>
+ <td class="changed"[% IF rowspan > 1 %] rowspan="[% rowspan FILTER none %]"[% END %]></td>
+ [% END %]
+
+ [% IF i < group.plus.size %]
+ <td class="num">[% current_line_new + i %]</td>
+ <td class="changed"><pre>[% group.plus.$i FILTER html %]</pre></td>
+ [% ELSIF i == group.plus.size %]
+ [% rowspan = group.minus.size - group.plus.size %]
+ <td class="num"[% IF rowspan > 1 %] rowspan="[% rowspan FILTER none %]"[% END %]></td>
+ <td class="changed"[% IF rowspan > 1 %] rowspan="[% rowspan FILTER none %]"[% END %]></td>
+ [% END %]
+ </tr>
+ [% currentloop = currentloop + 1 %]
+ [% i = i + 1 %]
+ [% END %]
+ [% END %]
+ [% current_line_old = current_line_old + group.minus.size %]
+ [% current_line_new = current_line_new + group.plus.size %]
+ [% ELSE %]
+ [% FOREACH line = group.plus %]
+ [% IF file.is_add %]
+ <tr>
+ <td class="num">[% current_line_new %]</td>
+ <td class="added" colspan="3"><pre>[% line FILTER html %]</pre></td>
+ </tr>
+ [% ELSE %]
+ <tr>
+ [% IF loop.first %]
+ <td class="num"[% IF group.plus.size > 1 %] rowspan="[% group.plus.size %]"[% END %]></td>
+ <td[% IF group.plus.size > 1 %] rowspan="[% group.plus.size %]"[% END %]></td>
+ [% END %]
+ <td class="num">[% current_line_new %]</td>
+ <td class="added"><pre>[% line FILTER html %]</pre></td>
+ </tr>
+ [% END %]
+ [% current_line_new = current_line_new + 1 %]
+ [% END %]
+ [% END %]
+ [% ELSE %]
+ [% IF group.minus.size %]
+ [% FOREACH line = group.minus %]
+ [% IF file.is_remove %]
+ <tr>
+ <td class="num">[% current_line_old %]</td>
+ <td class="removed" colspan="3"><pre>[% line FILTER html %]</pre></td>
+ </tr>
+ [% ELSE %]
+ <tr>
+ <td class="num">[% current_line_old %]</td>
+ <td class="removed"><pre>[% line FILTER html %]</pre></td>
+ [% IF loop.first %]
+ <td class="num"[% IF group.minus.size > 1 %] rowspan="[% group.minus.size %]"[% END %]></td>
+ <td[% IF group.minus.size > 1 %] rowspan="[% group.minus.size %]"[% END %]></td>
+ [% END %]
+ </tr>
+ [% END %]
+ [% current_line_old = current_line_old + 1 %]
+ [% END %]
+ [% END %]
+ [% END %]
+ [% END %]
+[% END %]
+
+</table>
diff --git a/template/en/default/attachment/diff-footer.html.tmpl b/template/en/default/attachment/diff-footer.html.tmpl
new file mode 100644
index 0000000..49c662a
--- /dev/null
+++ b/template/en/default/attachment/diff-footer.html.tmpl
@@ -0,0 +1,35 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): John Keiser <jkeiser@netscape.com>
+ #%]
+
+</form>
+
+[% IF headers %]
+
+ <br>
+
+ [% PROCESS global/variables.none.tmpl %]
+ <span>Return to [% "$terms.bug $bugid" FILTER bug_link(bugid) FILTER none %]</span>
+
+ [% PROCESS global/footer.html.tmpl %]
+
+[% ELSE %]
+</body>
+</html>
+[% END %]
diff --git a/template/en/default/attachment/diff-header.html.tmpl b/template/en/default/attachment/diff-header.html.tmpl
new file mode 100644
index 0000000..663d9b7
--- /dev/null
+++ b/template/en/default/attachment/diff-header.html.tmpl
@@ -0,0 +1,153 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): John Keiser <jkeiser@netscape.com>
+ #%]
+
+[%# Define strings that will serve as the title and header of this page %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]
+ [% IF attachid %]
+Attachment #[% attachid %] for [% terms.bug %] #[% bugid %]
+ [% ELSE %]
+Interdiff of #[% oldid %] and #[% newid %] for [% terms.bug %] #[% bugid %]
+ [% END %]
+[% END %]
+
+[% onload = 'restore_all(); document.checkboxform.restore_indicator.checked = true' %]
+
+[% BLOCK viewurl %]attachment.cgi?id=[% id %][% END %]
+[% BLOCK editurl %][% PROCESS viewurl %]&amp;action=edit[% END %]
+[% BLOCK diffurl %][% PROCESS viewurl %]&amp;action=diff[% END %]
+
+[% IF headers %]
+ [% header = BLOCK %]
+ [% IF attachid %]
+ Attachment #[% attachid %]: [% description FILTER html %]
+ [% ELSE %]
+ Diff Between
+ #[% oldid %]: <a href="[% PROCESS diffurl id=oldid %]">[% old_desc FILTER html %]</a>
+ and
+ #[% newid %]: <a href="[% PROCESS diffurl id=newid %]">[% new_desc FILTER html %]</a>
+ [% END %]
+ for <a href="show_bug.cgi?id=[% bugid %]">[% terms.bug %] #[% bugid %]</a>
+ [% END %]
+ [% subheader = BLOCK %]
+ [% bugsummary FILTER html %]
+ [% END %]
+ [% PROCESS global/header.html.tmpl doc_section = "attachments.html#patchviewer"
+ javascript_urls = "js/attachment.js"
+ style_urls = ['skins/standard/create_attachment.css'] %]
+[% ELSE %]
+ <html>
+ <head>
+ <link href="skins/standard/create_attachment.css" rel="stylesheet" type="text/css">
+ <script src="js/attachment.js" type="text/javascript"></script>
+ </head>
+ <body onload="[% onload FILTER html %]">
+[% END %]
+
+[%# If we have attachid, we are in diff, otherwise we're in interdiff %]
+[% IF attachid %]
+ [%# HEADER %]
+ [% IF headers %]
+ <a href="[% PROCESS viewurl id=attachid %]">View</a>
+ | <a href="[% PROCESS editurl id=attachid %]">Details</a>
+ | <a href="[% PROCESS diffurl id=attachid %]&amp;context=[% context FILTER url_quote %]&amp;collapsed=[% collapsed FILTER url_quote %]&amp;headers=[% headers FILTER url_quote %]&amp;format=raw">Raw&nbsp;Unified</a>
+ | Return to [% "$terms.bug $bugid" FILTER bug_link(bugid) FILTER none %]
+ [% END %]
+ [% IF other_patches.size > 0 %]
+ [% IF headers %] |[%END%]
+ Differences between
+ <form style="display: inline" action="attachment.cgi">
+ <select name="oldid">
+ [% FOREACH patch = other_patches %]
+ <option value="[% patch.id %]"
+ [% IF patch.selected %] selected[% END %]
+ >[% patch.desc FILTER html %]</option>
+ [% END %]
+ </select>
+ and this patch
+ <input type="submit" id="diff" value="Diff">
+ <input type="hidden" name="action" value="interdiff">
+ <input type="hidden" name="newid" value="[% attachid %]">
+ <input type="hidden" name="headers" value="[% headers FILTER html %]">
+ </form>
+ [% END %]
+ <br>
+[% ELSE %]
+ [% IF headers %]
+ <a href="attachment.cgi?oldid=[% oldid %]&amp;newid=[% newid %]&amp;action=interdiff&amp;format=raw">Raw Unified</a>
+ | Return to [% "$terms.bug $bugid" FILTER bug_link(bugid) FILTER none %]
+ |
+ [% END %]
+[% END %]
+
+[%# Collapse / Expand %]
+<a href="#"
+ onmouseover="lastStatus = window.status; window.status='Collapse All'; return true"
+ onmouseout="window.status = lastStatus; return true"
+ onclick="return collapse_all()">Collapse All</a> |
+<a href="#"
+ onmouseover="lastStatus = window.status; window.status='Expand All'; return true"
+ onmouseout="window.status = lastStatus; return true"
+ onclick="return expand_all()">Expand All</a>
+
+[% IF do_context %]
+ [%# only happens for normal viewing, not interdiff %]
+ | <span style='font-weight: bold'>Context:</span>
+ [% IF context == "patch" %]
+ (<strong>Patch</strong> /
+ [% ELSE %]
+ (<a href="[% PROCESS diffurl id=attachid %]&amp;headers=[% headers FILTER url_quote %]">Patch</a> /
+ [% END %]
+ [% IF context == "file" %]
+ <strong>File</strong> /
+ [% ELSE %]
+ <a href="[% PROCESS diffurl id=attachid %]&amp;headers=[% headers FILTER url_quote %]&amp;context=file">File</a> /
+ [% END %]
+
+ [% IF context == "patch" || context == "file" %]
+ [% context = 3 %]
+ [% END %]
+ [%# textbox for context %]
+ <form style="display: inline" action="attachment.cgi"><input type="hidden" name="action" value="diff"><input type="hidden" name="id" value="[% attachid %]"><input type="hidden" name="collapsed" value="[% collapsed FILTER html %]"><input type="hidden" name="headers" value="[% headers FILTER html %]"><input type="text" name="context" value="[% context FILTER html %]" size="3"></form>)
+[% END %]
+
+[% IF warning %]
+<h2 class="warning">Warning:
+ [% IF warning == "interdiff1" %]
+ this difference between two patches may show things in the wrong places due
+ to a limitation in [% terms.Bugzilla %] when comparing patches with different
+ sets of files.
+ [% END %]
+ [% IF warning == "interdiff2" %]
+ this difference between two patches may be inaccurate due to a limitation in
+ [%+ terms.Bugzilla %] when comparing patches made against different revisions.
+ [% END %]
+</h2>
+[% ELSE %]
+ <br><br>
+[% END %]
+
+[%# Restore Stuff %]
+<form name="checkboxform" action="attachment.cgi">
+<input type="checkbox" name="restore_indicator" style="display: none">
+
+
diff --git a/template/en/default/attachment/edit.html.tmpl b/template/en/default/attachment/edit.html.tmpl
new file mode 100644
index 0000000..fa8a53a
--- /dev/null
+++ b/template/en/default/attachment/edit.html.tmpl
@@ -0,0 +1,289 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[%# Define strings that will serve as the title and header of this page %]
+[% title = BLOCK %]
+ Attachment [% attachment.id %] Details for [% terms.Bug %] [%+ attachment.bug_id %]
+[% END %]
+[% header = BLOCK %]
+ Attachment [% attachment.id %] Details for
+ [%+ "$terms.Bug ${attachment.bug_id}" FILTER bug_link(attachment.bug_id) FILTER none %]
+[% END %]
+[% subheader = BLOCK %][% attachment.bug.short_desc FILTER html %][% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ header = header
+ subheader = subheader
+ doc_section = "attachments.html"
+ javascript_urls = ['js/attachment.js']
+ style_urls = ['skins/standard/create_attachment.css']
+%]
+
+[%# No need to display the Diff button and iframe if the attachment is not a patch. %]
+[% use_patchviewer = (feature_enabled('patch_viewer') && attachment.ispatch) %]
+[% can_edit = attachment.validate_can_edit %]
+[% editable_or_hide = can_edit ? "" : " bz_hidden_option" %]
+
+<form method="post" action="attachment.cgi" onsubmit="normalizeComments();">
+ <input type="hidden" name="id" value="[% attachment.id %]">
+ <input type="hidden" name="action" value="update">
+ <input type="hidden" name="contenttypemethod" value="manual">
+ <input type="hidden" name="delta_ts" value="[% attachment.modification_time FILTER html %]">
+ [% IF user.id %]
+ <input type="hidden" name="token" value="[% issue_hash_token([attachment.id, attachment.modification_time]) FILTER html %]">
+ [% END %]
+
+ <table class="attachment_info" width="100%">
+
+ <tr>
+ <td id="attachment_attributes">
+ <div id="attachment_description">
+ <label for="description">Description:</label>
+ [% INCLUDE global/textarea.html.tmpl
+ id = 'description'
+ name = 'description'
+ minrows = 3
+ cols = 25
+ wrap = 'soft'
+ classes = 'block' _ editable_or_hide
+ defaultcontent = attachment.description
+ %]
+ [% IF !can_edit %]
+ [%+ attachment.description FILTER wrap_comment(25) FILTER html %]
+ [% END %]
+ </div>
+
+ [% IF attachment.isurl %]
+ <input type="hidden" name="filename"
+ value="[% attachment.filename FILTER html %]">
+ <input type="hidden" name="contenttypeentry"
+ value="[% attachment.contenttype FILTER html %]">
+ [% ELSE %]
+ <div id="attachment_filename">
+ <label for="filename">Filename:</label>
+ <input type="text" size="20" class="block[% editable_or_hide %]"
+ id="filename" name="filename"
+ value="[% attachment.filename FILTER html %]">
+ [% IF !can_edit %]
+ [%+ attachment.filename FILTER truncate(25) FILTER html %]
+ [% END %]
+ </div>
+
+ <div id="attachment_mimetype">
+ <label for="contenttypeentry">MIME Type:</label>
+ <input type="text" size="20" class="block[% editable_or_hide %]"
+ id="contenttypeentry" name="contenttypeentry"
+ value="[% attachment.contenttype FILTER html %]">
+ [% IF !can_edit %]
+ [%+ attachment.contenttype FILTER truncate(25) FILTER html %]
+ [% END %]
+ </div>
+
+ <div id="attachment_size">
+ <span class="label">Size:</span>
+ [% IF attachment.datasize %]
+ [%+ attachment.datasize FILTER unitconvert %]
+ [% ELSE %]
+ <em>deleted</em>
+ [% END %]
+ </div>
+
+ <div id="attachment_creator">
+ <span class="label">Creator:</span>
+ [%+ INCLUDE global/user.html.tmpl who = attachment.attacher %]
+ </div>
+
+ <div id="attachment_ispatch">
+ <input type="checkbox" id="ispatch" name="ispatch" value="1"
+ [%+ IF !can_edit %]class="bz_hidden_option"[% END %]
+ [%+ 'checked="checked"' IF attachment.ispatch %]>
+ [% IF can_edit %]
+ <label for="ispatch">patch</label>
+ [% ELSE %]
+ <span class="label">Is Patch:</span>
+ [%+ attachment.ispatch ? "yes" : "no" %]
+ [% END %]
+ </div>
+ [% END %]
+
+ <div id="attachment_isobsolete">
+ <input type="checkbox" id="isobsolete" name="isobsolete" value="1"
+ [%+ IF !can_edit %]class="bz_hidden_option"[% END %]
+ [%+ 'checked="checked"' IF attachment.isobsolete %]>
+ [% IF can_edit %]
+ <label for="isobsolete">obsolete</label>
+ [% ELSE %]
+ <span class="label">Is Obsolete:</span>
+ [%+ attachment.isobsolete ? "yes" : "no" %]
+ [% END %]
+ </div>
+
+ [% IF user.is_insider %]
+ <div id="attachment_isprivate">
+ <input type="checkbox" id="isprivate" name="isprivate" value="1"
+ [%+ IF !can_edit %]class="bz_hidden_option"[% END %]
+ [%+ 'checked="checked"' IF attachment.isprivate %]>
+ [% IF can_edit %]
+ <label for="isprivate">private (only visible to
+ <strong>[% Param('insidergroup') FILTER html %]</strong>)
+ </label>
+ [% ELSE %]
+ <span class="label">Is Private:</span>
+ [%+ attachment.isprivate ? "yes" : "no" %]
+ [% END %]
+ </div>
+ [% END %]
+
+ [% IF attachment.flag_types.size > 0 %]
+ <div id="attachment_flags">
+ [% PROCESS "flag/list.html.tmpl" bug_id = attachment.bug_id
+ attach_id = attachment.id
+ flag_types = attachment.flag_types
+ read_only_flags = !can_edit
+ %]
+ </div>
+ [% END %]
+
+ [% IF user.id %]
+ <div id="smallCommentFrame">
+ <label for="comment">Comment (on the [% terms.bug %]):</label>
+ [% INCLUDE global/textarea.html.tmpl
+ id = 'comment'
+ name = 'comment'
+ minrows = 5
+ cols = 25
+ wrap = 'soft'
+ classes = 'block'
+ %]
+ </div>
+
+ <input type="submit" value="Submit" id="update"><br><br>
+ [% END %]
+ </td>
+
+ [% IF !attachment.datasize %]
+ <td width="75%"><b>The content of this attachment has been deleted.</b></td>
+ [% ELSIF attachment.isurl %]
+ <td width="75%">
+ <a href="[% attachment.data FILTER html %]">
+ [% IF attachment.datasize < 120 %]
+ [% attachment.data FILTER html %]
+ [% ELSE %]
+ [% attachment.data FILTER truncate(80) FILTER html %]
+ &nbsp;...
+ [% attachment.data.match(".*(.{20})$").0 FILTER html %]
+ [% END %]
+ </a>
+ </td>
+ [% ELSIF !Param("allow_attachment_display") %]
+ <td id="view_disabled" width="50%">
+ <p><b>
+ The attachment is not viewable in your browser due to security
+ restrictions enabled by [% terms.Bugzilla %].
+ </b></p>
+ <p><b>
+ In order to view the attachment, you first have to
+ <a href="attachment.cgi?id=[% attachment.id %]">download it</a>.
+ </b></p>
+ </td>
+ [% ELSIF attachment.is_viewable %]
+ <td width="75%">
+ [% INCLUDE global/textarea.html.tmpl
+ id = 'editFrame'
+ name = 'comment'
+ style = 'height: 400px; width: 100%; display: none'
+ minrows = 10
+ cols = 80
+ wrap = 'soft'
+ defaultcontent = (attachment.contenttype.match('^text\/')) ?
+ attachment.data.replace('(.*\n|.+)', '>$1') : undef
+ %]
+ <iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %]" style="height: 400px; width: 100%;">
+ <b>You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
+ <a href="attachment.cgi?id=[% attachment.id %]">View the attachment on a separate page</a>.</b>
+ </iframe>
+ <script type="text/javascript">
+ <!--
+ var patchviewerinstalled = 0;
+ var attachment_id = [% attachment.id %];
+ if (typeof document.getElementById == "function") {
+[% IF use_patchviewer %]
+ var patchviewerinstalled = 1;
+ document.write('<iframe id="viewDiffFrame" style="height: 400px; width: 100%; display: none;"><\/iframe>');
+[% END %]
+ document.write('<button type="button" id="editButton" onclick="editAsComment(patchviewerinstalled);">Edit Attachment As Comment<\/button>');
+ document.write('<button type="button" id="undoEditButton" onclick="undoEditAsComment(patchviewerinstalled);" style="display: none;">Undo Edit As Comment<\/button>');
+ document.write('<button type="button" id="redoEditButton" onclick="redoEditAsComment(patchviewerinstalled);" style="display: none;">Redo Edit As Comment<\/button>');
+[% IF use_patchviewer %]
+ document.write('<button type="button" id="viewDiffButton" onclick="viewDiff(attachment_id, patchviewerinstalled);">View Attachment As Diff<\/button>');
+[% END %]
+ document.write('<button type="button" id="viewRawButton" onclick="viewRaw(patchviewerinstalled);" style="display: none;">View Attachment As Raw<\/button>');
+ }
+ //-->
+ </script>
+ </td>
+ [% ELSE %]
+ <td id="noview" width="50%">
+ <p><b>
+ Attachment is not viewable in your browser because its MIME type
+ ([% attachment.contenttype FILTER html %]) is not one that your browser is
+ able to display.
+ </b></p>
+ <p><b>
+ <a href="attachment.cgi?id=[% attachment.id %]">Download the attachment</a>.
+ </b></p>
+ </td>
+ [% END %]
+ </tr>
+ </table>
+</form>
+
+<div id="attachment_actions">
+ <span class="label">Actions:</span>
+ <a href="attachment.cgi?id=[% attachment.id %]">View</a>
+ [% IF use_patchviewer %]
+ | <a href="attachment.cgi?id=[% attachment.id %]&amp;action=diff">Diff</a>
+ [% END %]
+ [% IF Param("allow_attachment_deletion")
+ && user.in_group('admin')
+ && attachment.datasize > 0 %]
+ | <a href="attachment.cgi?id=[% attachment.id %]&amp;action=delete">Delete</a>
+ [% END %]
+</div>
+
+<div id="attachment_list">
+ Attachments on [% "$terms.bug ${attachment.bug_id}" FILTER bug_link(attachment.bug_id) FILTER none %]:
+ [% FOREACH a = attachments %]
+ [% IF a == attachment.id %]
+ [%+ a %]
+ [% ELSE %]
+ <a href="attachment.cgi?id=[% a %]&amp;action=edit">[% a %]</a>
+ [% END %]
+ [% " |" UNLESS loop.last() %]
+ [% END %]
+</div>
+
+[% Hook.process('end') %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/list.html.tmpl b/template/en/default/attachment/list.html.tmpl
new file mode 100644
index 0000000..6453b4e
--- /dev/null
+++ b/template/en/default/attachment/list.html.tmpl
@@ -0,0 +1,151 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+<script type="text/javascript">
+<!--
+function toggle_display(link) {
+ var table = document.getElementById("attachment_table");
+ // Store current height for scrolling later
+ var originalHeight = table.offsetHeight;
+ var rows = YAHOO.util.Dom.getElementsByClassName(
+ 'bz_tr_obsolete', 'tr', table);
+
+ for (var i = 0; i < rows.length; i++) {
+ bz_toggleClass(rows[i], 'bz_default_hidden');
+ }
+
+ if (YAHOO.util.Dom.hasClass(rows[0], 'bz_default_hidden')) {
+ link.innerHTML = "Show Obsolete";
+ }
+ else {
+ link.innerHTML = "Hide Obsolete";
+ }
+
+ var newHeight = table.offsetHeight;
+ // This scrolling makes the window appear to not move at all.
+ window.scrollBy(0, newHeight - originalHeight);
+
+ return false;
+}
+//-->
+</script>
+
+<br>
+<table id="attachment_table" cellspacing="0" cellpadding="4">
+ <tr>
+ <th colspan="[% show_attachment_flags ? 3 : 2 %]" align="left">
+ <a name="a0" id="a0">Attachments</a>
+ </th>
+ </tr>
+
+ [% count = 0 %]
+ [% obsolete_attachments = 0 %]
+
+ [% FOREACH attachment = attachments %]
+ [% count = count + 1 %]
+ [% IF !attachment.isprivate || user.is_insider || attachment.attacher.id == user.id %]
+ [% IF attachment.isobsolete %]
+ [% obsolete_attachments = obsolete_attachments + 1 %]
+ [% END %]
+ <tr class="[% "bz_contenttype_" _ attachment.contenttype
+ FILTER css_class_quote UNLESS attachment.isurl %]
+ [% " bz_patch" IF attachment.ispatch %]
+ [% " bz_url" IF attachment.isurl %]
+ [% " bz_private" IF attachment.isprivate %]
+ [% " bz_tr_obsolete bz_default_hidden"
+ IF attachment.isobsolete %]">
+ <td valign="top">
+ [% IF attachment.datasize %]
+ <a name="a[% count %]" href="attachment.cgi?id=[% attachment.id %]"
+ title="View the content of the attachment">
+ [% END %]
+ <b>[% attachment.description FILTER html FILTER obsolete(attachment.isobsolete) %]</b>
+ [% "</a>" IF attachment.datasize %]
+
+ <span class="bz_attach_extra_info">
+ [% IF attachment.datasize %]
+ ([% attachment.datasize FILTER unitconvert %],
+ [% IF attachment.ispatch %]
+ patch)
+ [% ELSIF attachment.isurl %]
+ url)
+ [% ELSE %]
+ [%+ attachment.contenttype FILTER html %])
+ [% END %]
+ [% ELSE %]
+ (<em>deleted</em>)
+ [% END %]
+
+ <br>
+ <a href="#attach_[% attachment.id %]"
+ title="Go to the comment associated with the attachment">
+ [%- attachment.attached FILTER time %]</a>,
+
+ [% INCLUDE global/user.html.tmpl who = attachment.attacher %]
+ </span>
+ </td>
+
+ [% IF show_attachment_flags %]
+ <td class="bz_attach_flags" valign="top">
+ [% IF attachment.flags.size == 0 %]
+ <i>no flags</i>
+ [% ELSE %]
+ [% FOREACH flag = attachment.flags %]
+ [% flag.setter.nick FILTER html %]:
+ [%+ flag.type.name FILTER html FILTER no_break %][% flag.status %]
+ [%+ IF flag.status == "?" && flag.requestee %]
+ ([% flag.requestee.nick FILTER html %])
+ [% END %]<br>
+ [% END %]
+ [% END %]
+ </td>
+ [% END %]
+
+ <td valign="top">
+ <a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">Details</a>
+ [% IF attachment.ispatch && feature_enabled('patch_viewer') %]
+ | <a href="attachment.cgi?id=[% attachment.id %]&amp;action=diff">Diff</a>
+ [% END %]
+ [% Hook.process("action") %]
+ </td>
+ </tr>
+ [% END %]
+ [% END %]
+
+ <tr class="bz_attach_footer">
+ <td colspan="[% show_attachment_flags ? 3 : 2 %]">
+ [% IF attachments.size %]
+ <span class="bz_attach_view_hide">
+ [% IF obsolete_attachments %]
+ <a href="#a0" onclick="return toggle_display(this);">Show
+ Obsolete</a> ([% obsolete_attachments %])
+ [% END %]
+ [% IF Param("allow_attachment_display") %]
+ <a href="attachment.cgi?bugid=[% bugid %]&amp;action=viewall">View All</a>
+ [% END %]
+ </span>
+ [% END %]
+ <a href="attachment.cgi?bugid=[% bugid %]&amp;action=enter">Add an attachment</a>
+ (proposed patch, testcase, etc.)
+ </td>
+ </tr>
+</table>
+<br>
diff --git a/template/en/default/attachment/midair.html.tmpl b/template/en/default/attachment/midair.html.tmpl
new file mode 100644
index 0000000..f0883b5
--- /dev/null
+++ b/template/en/default/attachment/midair.html.tmpl
@@ -0,0 +1,78 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # operations: array; bug activity since the user last displayed the attachment form,
+ # used by bug/activity/table.html.tmpl to display recent changes that will
+ # be overwritten if the user submits these changes. See that template
+ # for further documentation.
+ # attachment: object; the attachment being changed.
+ #%]
+
+[%# The global Bugzilla->cgi object is used to obtain form variable values. %]
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% PROCESS global/variables.none.tmpl %]
+[% PROCESS global/header.html.tmpl title = "Mid-air collision!" %]
+
+<h1>Mid-air collision detected!</h1>
+
+<p>
+ Someone else has made changes to
+ <a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">attachment [% attachment.id %]</a>
+ of [% "$terms.bug $attachment.bug_id" FILTER bug_link(attachment.bug_id) FILTER none %]
+ at the same time you were trying to. The changes made were:
+</p>
+
+<p>
+ [% PROCESS "bug/activity/table.html.tmpl" incomplete_data=0 %]
+</p>
+
+[% IF cgi.param("comment") %]
+<p>
+ Your comment was:<br>
+ <blockquote><pre class="bz_comment_text">
+ [% cgi.param("comment") FILTER wrap_comment FILTER html %]
+ </pre></blockquote>
+</p>
+[% END %]
+
+<p>
+You have the following choices:
+</p>
+
+<ul>
+ <li>
+ <form method="post" action="attachment.cgi">
+ [% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %]
+ <input type="submit" id="process" value="Submit my changes anyway">
+ This will cause all of the above changes to be overwritten.
+ </form>
+ </li>
+ <li>
+ Throw away my changes, and
+ <a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">revisit
+ attachment [% attachment.id %]</a>
+ </li>
+</ul>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/show-multiple.html.tmpl b/template/en/default/attachment/show-multiple.html.tmpl
new file mode 100644
index 0000000..bcc2977
--- /dev/null
+++ b/template/en/default/attachment/show-multiple.html.tmpl
@@ -0,0 +1,102 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% filtered_summary = bugsummary FILTER html %]
+[% header = BLOCK %]View All Attachments for
+ [%+ "$terms.Bug $bug.id" FILTER bug_link(bug) FILTER none %][% END %]
+
+[% title = BLOCK %]
+ View All Attachments for [% terms.Bug %] [%+ bug.bug_id FILTER html %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ header = header
+ subheader = filtered_summary
+ style_urls = ['skins/standard/create_attachment.css']
+%]
+
+<br>
+
+[% FOREACH a = attachments %]
+
+ <div align="center">
+ <table class="attachment_info" cellspacing="0" cellpadding="4" border="1" width="75%">
+ <tr>
+ <td valign="top" bgcolor="#cccccc" colspan="6">
+ <big><b>Attachment #[% a.id %]</b></big>
+ </td>
+ </tr>
+ <tr>
+ <td valign="top">
+ [% a.description FILTER html FILTER obsolete(a.isobsolete) %]
+ </td>
+
+ <td valign="top">
+ [% IF a.ispatch %]
+ <i>patch</i>
+ [% ELSE %]
+ [% a.contenttype FILTER html %]
+ [% END %]
+ </td>
+
+ <td valign="top">[% a.attached FILTER time %]</td>
+ <td valign="top">[% a.datasize FILTER unitconvert %]</td>
+
+ <td valign="top">
+ [% IF a.flags.size == 0 %]
+ <i>no flags</i>
+ [% ELSE %]
+ [% FOREACH flag = a.flags %]
+ [% flag.setter.nick FILTER html %]:
+ [%+ flag.type.name FILTER html %][% flag.status %]
+ [% IF flag.status == "?" && flag.requestee %]
+ ([% flag.requestee.nick FILTER html %])
+ [% END %]
+ [% ", " IF !loop.last %]
+ [% END %]
+ [% END %]
+ </td>
+
+ <td valign="top">
+ <a href="attachment.cgi?id=[% a.id %]&amp;action=edit">Details</a>
+ </td>
+ </tr>
+ </table>
+
+ [% IF a.is_viewable %]
+ <iframe src="attachment.cgi?id=[% a.id %]" width="75%" height="350">
+ <b>You cannot view the attachment on this page because your browser does not support IFRAMEs.
+ <a href="attachment.cgi?id=[% a.id %]">View the attachment on a separate page</a>.</b>
+ </iframe>
+ [% ELSE %]
+ <p><b>
+ Attachment cannot be viewed because its MIME type is not text/*, image/*, or application/vnd.mozilla.*.
+ <a href="attachment.cgi?id=[% a.id %]">Download the attachment instead</a>.
+ </b></p>
+ [% END %]
+ </div>
+
+ <br><br>
+
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/attachment/updated.html.tmpl b/template/en/default/attachment/updated.html.tmpl
new file mode 100644
index 0000000..9a74f5c
--- /dev/null
+++ b/template/en/default/attachment/updated.html.tmpl
@@ -0,0 +1,46 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # attachment: object of the attachment we just attached.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% bug = bugs.0 %]
+
+[% PROCESS "bug/show-header.html.tmpl" %]
+[% PROCESS global/header.html.tmpl
+ title = "Changes Submitted to Attachment $attachment.id of $terms.Bug $attachment.bug_id"
+%]
+
+<dl>
+ <dt>Changes to
+ <a href="attachment.cgi?id=[% attachment.id %]&amp;action=edit">attachment [% attachment.id %]</a>
+ of [% "$terms.bug $attachment.bug_id" FILTER bug_link(attachment.bug_id) FILTER none %] submitted
+ </dt>
+ <dd>
+ [% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = attachment.bug_id %]
+ [%# Links to more information about the changed bug. %]
+ [% Hook.process("links") %]
+ </dd>
+</dl>
+
+[% PROCESS bug/show.html.tmpl %]
diff --git a/template/en/default/bug/activity/show.html.tmpl b/template/en/default/bug/activity/show.html.tmpl
new file mode 100644
index 0000000..67ac689
--- /dev/null
+++ b/template/en/default/bug/activity/show.html.tmpl
@@ -0,0 +1,49 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # bug: object. The bug whose activity is being displayed.
+ # operations: array of hashes, see activity/table.html.tmpl.
+ #
+ # This template also needs to be called with the interface to the
+ # activity/table.html.tmpl template fulfilled.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% filtered_desc = bug.short_desc FILTER html %]
+[% PROCESS global/header.html.tmpl
+ title = "Changes made to $terms.bug $bug.bug_id"
+ header = "Activity log for $terms.bug $bug.bug_id: $filtered_desc"
+ %]
+
+<p>
+ [% "Back to $terms.bug $bug.bug_id" FILTER bug_link(bug) FILTER none %]
+</p>
+
+[% PROCESS bug/activity/table.html.tmpl %]
+
+[% IF operations.size > 0 %]
+ <p>
+ [% "Back to $terms.bug $bug.bug_id" FILTER bug_link(bug) FILTER none %]
+ </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/activity/table.html.tmpl b/template/en/default/bug/activity/table.html.tmpl
new file mode 100644
index 0000000..2492534
--- /dev/null
+++ b/template/en/default/bug/activity/table.html.tmpl
@@ -0,0 +1,113 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # David D. Kilzer <ddkilzer@kilzer.net>
+ # Reed Loden <reed@reedloden.com>
+ #%]
+
+[%# INTERFACE:
+ # operations: array of hashes. May be empty. Each has has three members:
+ # who: string. who performed the operation
+ # when: string. when they performed it
+ # changes: hash. Details of what they changed. This hash has three
+ # compulsory and one optional member:
+ # field: string. The name of the field
+ # removed: string. What was removed from the field
+ # added: string. What was added to the field
+ # attach_id: integer. If the change was adding an attachment, its id.
+ # incomplete_data: boolean. True if some of the data is incomplete (because
+ # it was affected by an old Bugzilla bug.)
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS bug/time.html.tmpl %]
+
+[% IF incomplete_data %]
+ <p>
+ There used to be an issue in <a href="http://www.bugzilla.org/">Bugzilla</a>
+ which caused activity data to be lost if there were a large number of cc's
+ or dependencies. That has been fixed, but some data was already lost in
+ your activity table that could not be regenerated. The changes that the
+ script could not reliably determine are prefixed by '?'.
+ </p>
+[% END %]
+
+[% IF operations.size > 0 %]
+ <table border cellpadding="4">
+ <tr>
+ <th>Who</th>
+ <th>When</th>
+ <th>What</th>
+ <th>Removed</th>
+ <th>Added</th>
+ </tr>
+
+ [% FOREACH operation = operations %]
+ <tr>
+ <td rowspan="[% operation.changes.size %]" valign="top">
+ [% operation.who FILTER email FILTER html %]
+ </td>
+ <td rowspan="[% operation.changes.size %]" valign="top">
+ [% operation.when FILTER time %]
+ </td>
+ [% FOREACH change = operation.changes %]
+ [% "</tr><tr>" IF loop.index > 0 %]
+ <td>
+ [% IF change.attachid %]
+ <a href="attachment.cgi?id=[% change.attachid %]">
+ Attachment #[% change.attachid %]</a>
+ [% END %]
+ [%+ field_descs.${change.fieldname} FILTER html %]
+ </td>
+ [% PROCESS change_column change_type = change.removed %]
+ [% PROCESS change_column change_type = change.added %]
+ [% END %]
+ </tr>
+ [% END %]
+ </table>
+[% ELSE %]
+ <p>
+ No changes have been made to this [% terms.bug %] yet.
+ </p>
+[% END %]
+
+[% BLOCK change_column %]
+ <td>
+ [% IF change_type.defined %]
+ [% IF change.fieldname == 'estimated_time' ||
+ change.fieldname == 'remaining_time' ||
+ change.fieldname == 'work_time' %]
+ [% PROCESS formattimeunit time_unit=change_type %]
+ [% ELSIF change.fieldname == 'blocked' ||
+ change.fieldname == 'dependson' %]
+ [% change_type FILTER bug_list_link FILTER none %]
+ [% ELSIF change.fieldname == 'assigned_to' ||
+ change.fieldname == 'reporter' ||
+ change.fieldname == 'qa_contact' ||
+ change.fieldname == 'cc' ||
+ change.fieldname == 'flagtypes.name' %]
+ [% display_value(change.fieldname, change_type) FILTER email FILTER html %]
+ [% ELSE %]
+ [% display_value(change.fieldname, change_type) FILTER html %]
+ [% END %]
+ [% ELSE %]
+ &nbsp;
+ [% END %]
+ </td>
+[% END %]
diff --git a/template/en/default/bug/choose.html.tmpl b/template/en/default/bug/choose.html.tmpl
new file mode 100644
index 0000000..9009d38
--- /dev/null
+++ b/template/en/default/bug/choose.html.tmpl
@@ -0,0 +1,35 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Search by $terms.bug number"
+ %]
+
+<form method="get" action="show_bug.cgi">
+ <p>
+ You may find a single [% terms.bug %] by entering its [% terms.bug %] id here:
+ <input name="id" size="6">
+ <input type="submit" id="show" value="Show Me This [% terms.Bug %]">
+ </p>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/comments.html.tmpl b/template/en/default/bug/comments.html.tmpl
new file mode 100644
index 0000000..41b91d7
--- /dev/null
+++ b/template/en/default/bug/comments.html.tmpl
@@ -0,0 +1,235 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Shane H. W. Travis <travis@sedsystems.ca>
+ #%]
+
+[% PROCESS bug/time.html.tmpl %]
+
+ <script type="text/javascript">
+ <!--
+ function updateCommentPrivacy(checkbox, id) {
+ var comment_elem = document.getElementById('comment_text_'+id).parentNode;
+ if (checkbox.checked) {
+ if (!comment_elem.className.match('bz_private')) {
+ comment_elem.className = comment_elem.className.concat(' bz_private');
+ }
+ }
+ else {
+ comment_elem.className =
+ comment_elem.className.replace(/(\s*|^)bz_private(\s*|$)/, '$2');
+ }
+ }
+
+ /* The functions below expand and collapse comments */
+
+ function toggle_comment_display(link, comment_id) {
+ var comment = document.getElementById('comment_text_' + comment_id);
+ var re = new RegExp(/\bcollapsed\b/);
+ if (comment.className.match(re))
+ expand_comment(link, comment);
+ else
+ collapse_comment(link, comment);
+ }
+
+ function toggle_all_comments(action) {
+ var num_comments = [% comments.size FILTER html %];
+
+ // If for some given ID the comment doesn't exist, this doesn't mean
+ // there are no more comments, but that the comment is private and
+ // the user is not allowed to view it.
+
+ for (var id = 0; id < num_comments; id++) {
+ var comment = document.getElementById('comment_text_' + id);
+ if (!comment)
+ continue;
+
+ var link = document.getElementById('comment_link_' + id);
+ if (action == 'collapse')
+ collapse_comment(link, comment);
+ else
+ expand_comment(link, comment);
+ }
+ }
+
+ function collapse_comment(link, comment) {
+ link.innerHTML = "[+]";
+ link.title = "Expand the comment.";
+ YAHOO.util.Dom.addClass(comment, 'collapsed');
+ }
+
+ function expand_comment(link, comment) {
+ link.innerHTML = "[-]";
+ link.title = "Collapse the comment";
+ YAHOO.util.Dom.removeClass(comment, 'collapsed');
+ }
+
+ /* This way, we are sure that browsers which do not support JS
+ * won't display this link */
+
+ function addCollapseLink(count) {
+ document.write(' <a href="#" class="bz_collapse_comment"' +
+ ' id="comment_link_' + count +
+ '" onclick="toggle_comment_display(this, ' + count +
+ '); return false;" title="Collapse the comment.">[-]<\/a> ');
+ }
+ //-->
+ </script>
+
+
+[% DEFAULT start_at = 0 mode = "show" %]
+[% sort_order = user.settings.comment_sort_order.value %]
+
+[%# NOTE: (start_at > 0) means we came here from a midair collision,
+ # in which case we don't care what the user's preference is.
+ %]
+[% IF (start_at > 0) %]
+ [% sort_order = "oldest_to_newest" %]
+[% END %]
+
+
+[%# Set up the variables as needed, depending on the sort order %]
+[% IF sort_order == "oldest_to_newest" %]
+ [% count = 0 %]
+ [% description = 0 %]
+ [% increment = 1 %]
+[% ELSE %]
+ [% increment = -1 %]
+ [% IF sort_order == "newest_to_oldest" %]
+ [% count = comments.size - 1 %]
+ [% description = 0 %]
+ [% ELSIF sort_order == "newest_to_oldest_desc_first" %]
+ [% count = comments.size %]
+ [% description = comments.size %]
+ [% END %]
+[% END %]
+
+<!-- This auto-sizes the comments and positions the collapse/expand links
+ to the right. -->
+<table class="bz_comment_table" cellpadding="0" cellspacing="0"><tr>
+<td>
+
+[% FOREACH comment = comments %]
+ [% IF count >= start_at %]
+ [% PROCESS a_comment %]
+ [% END %]
+
+ [% count = count + increment %]
+[% END %]
+
+[%# Note: this template is used in multiple places; if you use this hook,
+ # make sure you are aware of this fact.
+ #%]
+[% Hook.process("aftercomments") %]
+
+</td>
+<td>
+ [% IF mode == "edit" %]
+ <ul class="bz_collapse_expand_comments">
+ <li><a href="#" onclick="toggle_all_comments('collapse');
+ return false;">Collapse All Comments</a></li>
+ <li><a href="#" onclick="toggle_all_comments('expand');
+ return false;">Expand All Comments</a></li>
+ </ul>
+ [% END %]
+</td>
+</tr></table>
+
+[%############################################################################%]
+[%# Block for individual comments #%]
+[%############################################################################%]
+
+[% BLOCK a_comment %]
+ [% RETURN IF comment.is_private AND ! user.is_insider %]
+
+ <div class="bz_comment[% " bz_private" IF comment.is_private %]
+ [% " bz_comment_hilite" IF marks.$count %]
+ [% " bz_first_comment" IF count == description %]">
+ [% IF count == description %]
+ [% class_name = "bz_first_comment_head" %]
+ [% comment_label = "Description" %]
+ [% ELSE %]
+ [% class_name = "bz_comment_head" %]
+ [% comment_label = "Comment " _ count %]
+ [% END %]
+
+ <div class="[% class_name FILTER html %]">
+
+ [% IF mode == "edit" %]
+ <span class="bz_comment_actions">
+ <script type="text/javascript"><!--
+ addReplyLink([% count %], [% comment.id %]);
+ addCollapseLink([% count %]); // -->
+ </script>
+ </span>
+ [% END %]
+
+ [% IF mode == "edit" && user.is_insider %]
+ <div class="bz_private_checkbox">
+ <input type="hidden" value="1"
+ name="defined_isprivate_[% comment.id %]">
+ <input type="checkbox"
+ name="isprivate_[% comment.id %]" value="1"
+ id="isprivate_[% comment.id %]"
+ onClick="updateCommentPrivacy(this, [% count %])"
+ [% " checked=\"checked\"" IF comment.is_private %]>
+ <label for="isprivate_[% comment.id %]">Private</label>
+ </div>
+ [% END %]
+
+ <span class="bz_comment_number">
+ <a name="c[% count %]"
+ href="show_bug.cgi?id=[% bug.bug_id %]#c[% count %]">
+ [%- comment_label FILTER html %]</a>
+ </span>
+
+ <span class="bz_comment_user">
+ [% INCLUDE global/user.html.tmpl who = comment.author %]
+ </span>
+
+ <span class="bz_comment_user_images">
+ [% FOREACH group = comment.author.direct_group_membership %]
+ [% NEXT UNLESS group.icon_url %]
+ <img src="[% group.icon_url FILTER html %]"
+ alt="[% group.name FILTER html %]"
+ title="[% group.name FILTER html %] - [% group.description FILTER html %]">
+ [% END %]
+ </span>
+
+ <span class="bz_comment_time">
+ [%+ comment.creation_ts FILTER time %]
+ </span>
+ </div>
+
+ [% IF user.is_timetracker &&
+ (comment.work_time > 0 || comment.work_time < 0) %]
+ <br>
+ Additional hours worked:
+ [% PROCESS formattimeunit time_unit=comment.work_time %]
+ [% END %]
+
+[%# Don't indent the <pre> block, since then the spaces are displayed in the
+ # generated HTML
+ #%]
+<pre class="bz_comment_text"
+ [% ' id="comment_text_' _ count _ '"' IF mode == "edit" %]>
+ [%- comment.body_full({ wrap => 1 }) FILTER quoteUrls(bug, comment) -%]
+</pre>
+ </div>
+[% END %]
diff --git a/template/en/default/bug/create/comment-guided.txt.tmpl b/template/en/default/bug/create/comment-guided.txt.tmpl
new file mode 100644
index 0000000..df04d8f
--- /dev/null
+++ b/template/en/default/bug/create/comment-guided.txt.tmpl
@@ -0,0 +1,54 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+[%# INTERFACE:
+ # This template has no interface.
+ #
+ # Form variables from a bug submission (i.e. the fields on a template from
+ # enter_bug.cgi) can be access via Bugzilla.cgi.param. It can be used to
+ # pull out various custom fields and format an initial Description entry
+ # from them.
+ #%]
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+User-Agent: [%+ cgi.user_agent() %]
+Build Identifier: [%+ cgi.param("buildid") %]
+
+[%+ cgi.param("comment") IF cgi.param("comment") %]
+
+[%+ IF cgi.param("reproducible") != "Choose one..." -%]
+Reproducible: [%+ cgi.param("reproducible") %]
+[% END %]
+
+[% IF !(cgi.param("reproduce_steps").match('^1\.\s*2\.\s*3\.\s*$') || cgi.param("reproduce_steps").match('^\s*$')) %]
+Steps to Reproduce:
+[%+ cgi.param("reproduce_steps") %]
+[% END %]
+
+[% IF cgi.param("actual_results") -%]
+Actual Results:
+[%+ cgi.param("actual_results") %]
+[% END %]
+
+[% IF cgi.param("expected_results") %]
+Expected Results:
+[%+ cgi.param("expected_results") %]
+[% END %]
+
+[%+ cgi.param("additional_info") %]
diff --git a/template/en/default/bug/create/comment.txt.tmpl b/template/en/default/bug/create/comment.txt.tmpl
new file mode 100644
index 0000000..e7339d3
--- /dev/null
+++ b/template/en/default/bug/create/comment.txt.tmpl
@@ -0,0 +1,32 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+[%# INTERFACE:
+ # This template has no interface.
+ #
+ # Form variables from a bug submission (i.e. the fields on a template from
+ # enter_bug.cgi) can be access via Bugzilla.cgi.param. It can be used to
+ # pull out various custom fields and format an initial Description entry
+ # from them.
+ #%]
+[% USE Bugzilla %]
+[% Hook.process("form") %]
+
+
+[% Bugzilla.cgi.param("comment") %]
diff --git a/template/en/default/bug/create/confirm-create-dupe.html.tmpl b/template/en/default/bug/create/confirm-create-dupe.html.tmpl
new file mode 100644
index 0000000..b0a5cdd
--- /dev/null
+++ b/template/en/default/bug/create/confirm-create-dupe.html.tmpl
@@ -0,0 +1,57 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Olav Vitters.
+ #
+ # Contributor(s): Olav Vitters <olav@bkor.dhs.org>
+ #%]
+
+[%# INTERFACE:
+ # bugid: integer. ID of the bug previously used to create a bug.
+ # allow_override: boolean int. Is 1 if the user may submit the bug again.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Already filed $terms.bug"
+%]
+
+[% USE Bugzilla %]
+
+<table cellpadding="20">
+ <tr>
+ <td bgcolor="#ff0000">
+ <font size="+2">
+ You already used the form to file [% "$terms.bug $bugid" FILTER bug_link(bugid) FILTER none %].
+ </font>
+ </td>
+ </tr>
+</table>
+
+<p><font size="big">You are highly encouraged to visit [% "$terms.bug $bugid"
+FILTER bug_link(bugid) FILTER none %].</font></p>
+
+[% IF allow_override %]
+ <p>If you are sure you used the same form to submit a new [% terms.bug %],
+ click 'File [% terms.bug %] again'.<p>
+
+ <form name="create" id="create" method="post" action="post_bug.cgi"
+ [%- IF Bugzilla.cgi.param("data") %] enctype="multipart/form-data"[% END %]>
+ [% PROCESS "global/hidden-fields.html.tmpl"
+ exclude="^(Bugzilla_login|Bugzilla_password|ignore_token)$" %]
+ <input type="hidden" name="ignore_token" value="[% bugid FILTER html %]">
+ <input type="submit" value="File [% terms.bug %] again" id="file_bug_again">
+ </form>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/create/create-guided.html.tmpl b/template/en/default/bug/create/create-guided.html.tmpl
new file mode 100644
index 0000000..9f2a21b
--- /dev/null
+++ b/template/en/default/bug/create/create-guided.html.tmpl
@@ -0,0 +1,523 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Christine Begle <cbegle@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # This template has the same interface as create.html.tmpl
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Enter $terms.ABug"
+ onload = "PutDescription()"
+ style = "#somebugs { width: 100%; height: 500px }"
+ %]
+
+<p>
+ <font color="red">
+ This is a template used on mozilla.org. This template, and the
+ comment-guided.txt.tmpl template that formats the data submitted via
+ the form in this template, are included as a demo of what it's
+ possible to do with custom templates in general, and custom [% terms.bug %]
+ entry templates in particular. As much of the text will not apply,
+ you should alter it
+ if you want to use this form on your [% terms.Bugzilla %] installation.
+ </font>
+</p>
+
+[% tablecolour = "#FFFFCC" %]
+
+[%# This script displays the descriptions for selected components. %]
+<script type="text/javascript">
+var descriptions = [
+[% FOREACH c = product.components %]
+ '[% c.description FILTER js %]',
+[% END %]
+];
+
+function PutDescription() {
+ if ((document.getElementById) && (document.body.innerHTML)) {
+ var componentIndex = document.getElementById('component').selectedIndex;
+ if (componentIndex != -1) {
+ var description = document.getElementById('description');
+ description.innerHTML = descriptions[componentIndex];
+ }
+ }
+}
+</script>
+
+<a name="step1"></a>
+<h3>Step 1 of 3 - has your [% terms.bug %] already been reported?</h3>
+
+<p>
+ <font color="red">Please don't skip this step - half of all
+ [% terms.bugs %] filed are
+ reported already.</font>
+ Check the two lists of frequently-reported [% terms.bugs %]:
+</p>
+
+[%# Include other products if sensible %]
+[% IF product.name == "Firefox" %]
+ [% productstring = "product=Mozilla%20Application%20Suite&amp;product=Firefox" %]
+[% ELSIF product.name == "Thunderbird" %]
+ [% productstring = "product=Mozilla%20Application%20Suite&amp;product=Thunderbird" %]
+[% ELSE %]
+ [% productstring = BLOCK %]product=[% product.name FILTER url_quote %][% END %]
+[% END %]
+
+<p>
+ <a href="duplicates.cgi?[% productstring %]&amp;format=simple" target="somebugs">All-time Top 100</a> (loaded initially) |
+ <a href="duplicates.cgi?[% productstring %]&amp;format=simple&amp;sortby=delta&amp;reverse=1&amp;maxrows=100&amp;changedsince=14" target="somebugs">Hot in the last two weeks</a>
+</p>
+
+<iframe name="somebugs" id="somebugs"
+ style="border: 2px black solid"
+ src="duplicates.cgi?[% productstring %]&amp;format=simple">
+</iframe>
+
+<p>
+ If your [% terms.bug %] isn't there, search [% terms.Bugzilla %] by entering
+ a few key words having to do with your [% terms.bug %] in this box.
+ For example: <tt><b>pop3 mail</b></tt> or <tt><b>copy paste</b></tt>.
+ The results will appear above.
+ </p>
+
+[%# All bugs opened inside the past six months %]
+ <form action="buglist.cgi" method="get" target="somebugs">
+ <input type="hidden" name="format" value="simple">
+ <input type="hidden" name="order" value="relevance desc">
+ <input type="hidden" name="bug_status" value="__all__">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ [% IF product.name == "Firefox" OR
+ product.name == "Thunderbird" OR
+ product.name == "Mozilla Application Suite" OR
+ product.name == "Camino" %]
+ <input type="hidden" name="product" value="Core">
+ <input type="hidden" name="product" value="Toolkit">
+ <input type="hidden" name="product" value="PSM">
+ <input type="hidden" name="product" value="NSPR">
+ <input type="hidden" name="product" value="NSS">
+ [% END %]
+ <input type="hidden" name="chfieldfrom" value="-6m">
+ <input type="hidden" name="chfieldto" value="Now">
+ <input type="hidden" name="chfield" value="[Bug creation]">
+ <input type="text" name="content" size="40">
+ <input type="submit" id="search" value="Search">
+ </form>
+
+<p>
+ Look through the search results. If you get the
+ <tt><b>[% terms.zeroSearchResults %]</b></tt> message, [% terms.Bugzilla %]
+ found no [% terms.bugs %] that
+ match. Check for typing mistakes, or try fewer or different keywords.
+ If you find [% terms.abug %] that looks the same as yours, please add
+ any useful extra information you have to it, rather than opening a new one.
+</p>
+
+
+<a name="step2"></a>
+<h3>Step 2 of 3 - give information</h3>
+
+<p>
+ If you've tried a few searches and your [% terms.bug %] really isn't in
+ there, tell us all about it.
+</p>
+
+<form method="post" action="post_bug.cgi">
+ <input type="hidden" name="format" value="guided">
+ <input type="hidden" name="assigned_to" value="">
+ <input type="hidden" name="priority"
+ value="[% default.priority FILTER html %]">
+ <input type="hidden" name="version"
+ value="[% default.version FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+
+<table valign="top" cellpadding="5" cellspacing="5" border="0">
+
+ <tr bgcolor="[% tablecolour %]">
+ <td align="right" valign="top">
+ <b>Product</b>
+ </td>
+ <td valign="top">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ [% product.name FILTER html %]
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b>Component</b>
+ </td>
+ <td valign="top">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td valign="top">
+ <select name="component" id="component"
+ size="5" onchange="PutDescription()">
+ [% IF NOT default.component_ %]
+ [%# Various b.m.o. products have a "General" component,
+ which is a useful default. %]
+ [% default.component_ = "General" %]
+ [% END %]
+ [% FOREACH c = product.components %]
+ <option value="[% c.name FILTER html %]"
+ [% " selected=\"selected\"" IF c.name == default.component_ %]>
+ [% c.name FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ </td>
+ <td valign="top" width="100%">
+ <div id="description" style="color: green; margin-left: 10px;
+ height: 5em; overflow: auto;">
+ <script type="text/javascript">
+ if ((document.getElementById) && (document.body.innerHTML)) {
+ document.write("\
+ Select a component to see its description here.");
+ }
+ </script>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <p>
+ The area where the problem occurs.
+ To pick the right component, you could use the same one as
+ similar [% terms.bugs %] you found in your search, or read the full list of
+ <a target="_blank" href="describecomponents.cgi?product=
+ [% product.name FILTER url_quote %]">component
+ descriptions</a> (opens in new window) if you need more help.
+ </p>
+ </td>
+ </tr>
+
+ [%# We override rep_platform and op_sys for simplicity. The values chosen
+ are based on which are most common in the b.m.o database %]
+ [% rep_platform = [ "PC", "Macintosh", "All", "Other" ] %]
+
+ <tr bgcolor="[% tablecolour %]">
+ <td align="right" valign="top">
+ <b>Hardware Platform</b>
+ </td>
+ <td valign="top">
+ [% PROCESS select sel = 'rep_platform' %]
+ </td>
+ </tr>
+
+ [% op_sys = [ "Windows 2000", "Windows XP", "Windows Vista", "Windows 7",
+ "Mac OS X", "Linux", "All", "Other" ] %]
+
+ <tr>
+ <td align="right" valign="top">
+ <b>Operating System</b>
+ </td>
+ <td valign="top">
+ [% PROCESS select sel = 'op_sys' %]
+ </td>
+ </tr>
+
+ [% IF product.name.match("Firefox|Camino|Mozilla Application Suite") %]
+ [% matches = cgi.user_agent('Gecko/(\d+)') %]
+ [% buildid = cgi.user_agent() IF matches %]
+ [% END %]
+
+ [%# Accept URL parameter build ID for non-browser products %]
+ [% IF cgi.param("buildid") %]
+ [% buildid = cgi.param("buildid") %]
+ [% END %]
+
+ <tr bgcolor="[% tablecolour %]">
+ <td align="right" valign="top">
+ <b>Build Identifier</b>
+ </td>
+ <td valign="top">
+ <input type="text" size="80" name="buildid" value="[% buildid FILTER html %]">
+ <p>
+ This should identify the exact version of the product you were using.
+ If the above field is blank or you know it is incorrect, copy the
+ version text from the product's Help |
+ About menu (for browsers this will begin with "Mozilla/5.0...").
+ If the product won't start, instead paste the complete URL you downloaded
+ it from.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b>URL</b>
+ </td>
+ <td valign="top">
+ <input type="text" size="80" name="bug_file_loc" value="http://">
+ <p>
+ URL that demonstrates the problem you are seeing (optional).<br>
+ <b>IMPORTANT</b>: if the problem is with a broken web page, you need
+ to report it
+ <a href="https://bugzilla.mozilla.org/page.cgi?id=broken-website.html">a different way</a>.
+ </p>
+ </td>
+ </tr>
+
+ <tr bgcolor="[% tablecolour %]">
+ <td align="right" valign="top">
+ <b>Summary</b>
+ </td>
+ <td valign="top">
+ <input type="text" size="80" name="short_desc" id="short_desc"
+ maxlength="255" spellcheck="true">
+ <p>
+ A sentence which summarises the problem.
+ Please be descriptive and use lots of keywords.
+ </p>
+ <p>
+ <tt>
+ <font color="#990000">Bad example</font>: mail crashed
+ </tt>
+ <br>
+ <tt>
+ <font color="#009900">Good example</font>:
+ crash if I close the mail window while checking for new POP mail
+ </tt>
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b>Details</b>
+ </td>
+ <td valign="top">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'comment'
+ minrows = 6
+ cols = constants.COMMENT_COLS
+ %]
+ <p>
+ Expand on the Summary. Please be
+ as specific as possible about what is wrong.
+ </p>
+ <p>
+ <tt>
+ <font color="#990000">Bad example</font>: Mozilla crashed.
+ You suck!
+ </tt>
+ <br>
+ <tt>
+ <font color="#009900">Good example</font>: After a crash which
+ happened when I was sorting in the Bookmark Manager,<br> all of my
+ top-level bookmark folders beginning with the letters Q to Z are
+ no longer present.
+ </tt>
+ </p>
+ </td>
+ </tr>
+
+ <tr bgcolor="[% tablecolour %]">
+ <td align="right" valign="top">
+ <b>Reproducibility</b>
+ </td>
+ <td valign="top">
+ <select name="reproducible">
+ <option name="AlwaysReproducible" value="Always">
+ Happens every time.
+ </option>
+ <option name="Sometimes" value="Sometimes">
+ Happens sometimes, but not always.
+ </option>
+ <option name="DidntTry" value="Didn't try">
+ Haven't tried to reproduce it.
+ </option>
+ <option name="NotReproducible" value="Couldn't Reproduce">
+ Tried, but couldn't reproduce it.
+ </option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b>Steps to Reproduce</b>
+ </td>
+ <td valign="top">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'reproduce_steps'
+ minrows = 4
+ cols = constants.COMMENT_COLS
+ defaultcontent = "1.\n2.\n3."
+ %]
+ <p>
+ Describe how to reproduce the problem, step by
+ step. Include any special setup steps.
+ </p>
+ </td>
+ </tr>
+
+ <tr bgcolor="[% tablecolour %]">
+ <td valign="top" align="right">
+ <b>Actual Results</b>
+ </td>
+ <td valign="top">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'actual_results'
+ minrows = 4
+ cols = constants.COMMENT_COLS
+ %]
+ <p>
+ What happened after you performed the steps above?
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign="top" align="right">
+ <b>Expected Results</b>
+ </td>
+ <td valign="top">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'expected_results'
+ minrows = 4
+ cols = constants.COMMENT_COLS
+ %]
+ <p>
+ What should the software have done instead?
+ </p>
+ </td>
+ </tr>
+
+ <tr bgcolor="[% tablecolour %]">
+ <td valign="top" align="right">
+ <b>Additional Information</b>
+ </td>
+ <td valign="top">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'additional_info'
+ minrows = 8
+ cols = constants.COMMENT_COLS
+ %]
+ <p>
+ Add any additional information you feel may be
+ relevant to this [% terms.bug %], such as the <b>theme</b> you were
+ using (does the [% terms.bug %] still occur
+ with the default theme?), a
+ <b><a href="http://kb.mozillazine.org/Quality_Feedback_Agent">Talkback crash ID</a></b>, or special
+ information about <b>your computer's configuration</b>. Any information
+ longer than a few lines, such as a <b>stack trace</b> or <b>HTML
+ testcase</b>, should be added
+ using the "Add an Attachment" link on the [% terms.bug %], after
+ it is filed. If you believe that it's relevant, please also include
+ your build configuration, obtained by typing <tt>about:buildconfig</tt>
+ into your URL bar.
+ <br>
+ <br>
+ If you are reporting a crash, note the module in
+ which the software crashed (e.g., <tt>Application Violation in
+ gkhtml.dll</tt>).
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign="top" align="right">
+ <b>Severity</b>
+ </td>
+ <td valign="top">
+ <select name="bug_severity">
+ <option name="critical" value="critical">
+ Critical: The software crashes, hangs, or causes you to
+ lose data.
+ </option>
+ <option name="major" value="major">
+ Major: A major feature is broken.
+ </option>
+ <option name="normal" value="normal" selected="selected">
+ Normal: It's [% terms.abug %] that should be fixed.
+ </option>
+ <option name="minor" value="minor">
+ Minor: Minor loss of function, and there's an easy workaround.
+ </option>
+ <option name="trivial" value="trivial">
+ Trivial: A cosmetic problem, such as a misspelled word or
+ misaligned text.
+ </option>
+ <option name="enhancement" value="enhancement">
+ Enhancement: Request for new feature or enhancement.
+ </option>
+ </select>
+ <p>
+ Say how serious the problem is, or if your [% terms.bug %] is a
+ request for a new feature.
+ </p>
+ </td>
+ </tr>
+</table>
+
+
+<a name="step3"></a>
+<h3>Step 3 of 3 - submit the [% terms.bug %] report</h3>
+
+<p>
+ <input type="submit" id="report" value=" Submit [% terms.Bug %] Report "
+ onclick="if (this.form.comment.value == '')
+ { alert('Please enter some details about this [% terms.bug %].');
+ this.form.comment.focus();
+ return false; } return true;">
+</p>
+
+<p>
+ That's it! Thanks very much. You'll be notified by email about any
+ progress that is made on fixing your [% terms.bug %].
+
+<p>
+ Please be warned
+ that we get a lot of [% terms.bug %] reports filed - it may take quite a
+ while to get around to yours. You can help the process by making sure your
+ [%+ terms.bug %] is
+ complete and easy to understand, and by quickly replying to any questions
+ which may arrive by email.
+</p>
+
+ </form>
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+ <select name="[% sel %]">
+ [%- IF default.$sel %]
+ <option value="[% default.$sel FILTER html %]" selected="selected">
+ [% default.$sel FILTER html -%]
+ </option>
+ [% END %]
+ [%- FOREACH x = $sel %]
+ [% NEXT IF x == default.$sel %]
+ <option value="[% x FILTER html %]">
+ [% x FILTER html -%]
+ </option>
+ [%- END %]
+ </select>
+[% END %]
diff --git a/template/en/default/bug/create/create.html.tmpl b/template/en/default/bug/create/create.html.tmpl
new file mode 100644
index 0000000..4b17457
--- /dev/null
+++ b/template/en/default/bug/create/create.html.tmpl
@@ -0,0 +1,705 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Ville Skyttä <ville.skytta@iki.fi>
+ # Shane H. W. Travis <travis@sedsystems.ca>
+ # Marc Schumann <wurblzap@gmail.com>
+ # Akamai Technologies <bugzilla-dev@akamai.com>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% title = BLOCK %]Enter [% terms.Bug %]: [% product.name FILTER html %][% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ style_urls = [ 'skins/standard/create_attachment.css',
+ 'skins/standard/yui/calendar.css' ]
+ javascript_urls = [ "js/attachment.js", "js/util.js", "js/yui/calendar.js",
+ "js/field.js", "js/TUI.js" ]
+ onload = 'set_assign_to();'
+%]
+
+<script type="text/javascript">
+<!--
+
+var initialowners = new Array([% product.components.size %]);
+var last_initialowner;
+var initialccs = new Array([% product.components.size %]);
+var components = new Array([% product.components.size %]);
+var comp_desc = new Array([% product.components.size %]);
+var flags = new Array([% product.components.size %]);
+[% IF Param("useqacontact") %]
+ var initialqacontacts = new Array([% product.components.size %]);
+ var last_initialqacontact;
+[% END %]
+[% count = 0 %]
+[%- FOREACH c = product.components %]
+ components[[% count %]] = "[% c.name FILTER js %]";
+ comp_desc[[% count %]] = "[% c.description FILTER html_light FILTER js %]";
+ initialowners[[% count %]] = "[% c.default_assignee.login FILTER js %]";
+ [% flag_list = [] %]
+ [% FOREACH f = c.flag_types.bug %]
+ [% NEXT UNLESS f.is_active %]
+ [% flag_list.push(f.id) %]
+ [% END %]
+ [% FOREACH f = c.flag_types.attachment %]
+ [% NEXT UNLESS f.is_active %]
+ [% flag_list.push(f.id) %]
+ [% END %]
+ flags[[% count %]] = [[% flag_list.join(",") FILTER js %]];
+ [% IF Param("useqacontact") %]
+ initialqacontacts[[% count %]] = "[% c.default_qa_contact.login FILTER js %]";
+ [% END %]
+
+ [% SET initial_cc_list = [] %]
+ [% FOREACH cc_user = c.initial_cc %]
+ [% initial_cc_list.push(cc_user.login) %]
+ [% END %]
+ initialccs[[% count %]] = "[% initial_cc_list.join(', ') FILTER js %]";
+
+ [% count = count + 1 %]
+[%- END %]
+
+function set_assign_to() {
+ // Based on the selected component, fill the "Assign To:" field
+ // with the default component owner, and the "QA Contact:" field
+ // with the default QA Contact. It also selectively enables flags.
+ var form = document.Create;
+ var assigned_to = form.assigned_to.value;
+
+[% IF Param("useqacontact") %]
+ var qa_contact = form.qa_contact.value;
+[% END %]
+
+ var index = -1;
+ if (form.component.type == 'select-one') {
+ index = form.component.selectedIndex;
+ } else if (form.component.type == 'hidden') {
+ // Assume there is only one component in the list
+ index = 0;
+ }
+ if (index != -1) {
+ var owner = initialowners[index];
+ var component = components[index];
+ if (assigned_to == last_initialowner
+ || assigned_to == owner
+ || assigned_to == '') {
+ form.assigned_to.value = owner;
+ last_initialowner = owner;
+ }
+
+ document.getElementById('initial_cc').innerHTML = initialccs[index];
+ document.getElementById('comp_desc').innerHTML = comp_desc[index];
+
+ [% IF Param("useqacontact") %]
+ var contact = initialqacontacts[index];
+ if (qa_contact == last_initialqacontact
+ || qa_contact == contact
+ || qa_contact == '') {
+ form.qa_contact.value = contact;
+ last_initialqacontact = contact;
+ }
+ [% END %]
+
+ // First, we disable all flags. Then we re-enable those
+ // which are available for the selected component.
+ var inputElements = document.getElementsByTagName("select");
+ var inputElement, flagField;
+ for ( var i=0 ; i<inputElements.length ; i++ ) {
+ inputElement = inputElements.item(i);
+ if (inputElement.name.search(/^flag_type-(\d+)$/) != -1) {
+ var id = inputElement.name.replace(/^flag_type-(\d+)$/, "$1");
+ inputElement.disabled = true;
+ // Also disable the requestee field, if it exists.
+ inputElement = document.getElementById("requestee_type-" + id);
+ if (inputElement) inputElement.disabled = true;
+ }
+ }
+ // Now enable flags available for the selected component.
+ for (var i = 0; i < flags[index].length; i++) {
+ flagField = document.getElementById("flag_type-" + flags[index][i]);
+ // Do not enable flags the user cannot set nor request.
+ if (flagField && flagField.options.length > 1) {
+ flagField.disabled = false;
+ // Re-enabling the requestee field depends on the status
+ // of the flag.
+ toggleRequesteeField(flagField, 1);
+ }
+ }
+ }
+}
+
+function handleWantsAttachment(wants_attachment) {
+ if (wants_attachment) {
+ document.getElementById('attachment_false').style.display = 'none';
+ document.getElementById('attachment_true').style.display = 'block';
+ }
+ else {
+ document.getElementById('attachment_false').style.display = 'block';
+ document.getElementById('attachment_true').style.display = 'none';
+ clearAttachmentFields();
+ }
+}
+
+
+TUI_alternates['expert_fields'] = 'Show Advanced Fields';
+// Hide the Advanced Fields by default, unless the user has a cookie
+// that specifies otherwise.
+TUI_hide_default('expert_fields');
+
+-->
+</script>
+
+[% USE Bugzilla %]
+[% SET select_fields = {} %]
+[% FOREACH field = Bugzilla.get_fields(
+ { type => constants.FIELD_TYPE_SINGLE_SELECT, custom => 0 })
+%]
+ [% select_fields.${field.name} = field %]
+[% END %]
+
+<form name="Create" id="Create" method="post" action="post_bug.cgi"
+ enctype="multipart/form-data">
+<input type="hidden" name="product" value="[% product.name FILTER html %]">
+<input type="hidden" name="token" value="[% token FILTER html %]">
+
+<table cellspacing="4" cellpadding="2" border="0">
+<tbody>
+ <tr>
+ <td colspan="4">
+ [%# Migration note: The following file corresponds to the old Param
+ # 'entryheaderhtml'
+ #%]
+ [% PROCESS 'bug/create/user-message.html.tmpl' %]
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2">
+ <a id="expert_fields_controller" class="controller bz_default_hidden"
+ href="javascript:TUI_toggle_class('expert_fields')">Hide
+ Advanced Fields</a>
+ [%# Show the link if the browser supports JS %]
+ <script type="text/javascript">
+ YAHOO.util.Dom.removeClass('expert_fields_controller',
+ 'bz_default_hidden');
+ </script>
+ </td>
+ <td colspan="2">
+ (<span class="required_star">*</span> =
+ <span class="required_explanation">Required Field</span>)
+ </td>
+ </tr>
+
+ <tr>
+ <th>Product:</th>
+ <td width="10%">[% product.name FILTER html %]</td>
+
+ <th>Reporter:</th>
+ <td width="100%">[% user.login FILTER html %]</td>
+ </tr>
+
+ [%# We can't use the select block in these two cases for various reasons. %]
+ <tr>
+ <th class="required">
+ <a href="describecomponents.cgi?product=[% product.name FILTER url_quote %]">
+ Component</a>:
+ </th>
+ <td>
+ <select name="component" onchange="set_assign_to();" size="7"
+ aria-required="true" class="required">
+ [%# Build the lists of assignees and QA contacts if "usemenuforusers" is enabled. %]
+ [% IF Param("usemenuforusers") %]
+ [% assignees_list = user.get_userlist.clone %]
+ [% qa_contacts_list = user.get_userlist.clone %]
+ [% END %]
+
+ [%- FOREACH c = product.components %]
+ <option value="[% c.name FILTER html %]"
+ [% " selected=\"selected\"" IF c.name == default.component_ %]>
+ [% c.name FILTER html -%]
+ </option>
+ [% IF Param("usemenuforusers") %]
+ [% INCLUDE build_userlist default_user = c.default_assignee,
+ userlist = assignees_list %]
+ [% INCLUDE build_userlist default_user = c.default_qa_contact,
+ userlist = qa_contacts_list %]
+ [% END %]
+ [%- END %]
+ </select>
+ </td>
+
+ <td colspan="2">
+ [%# Enclose the fieldset in a nested table so that its width changes based
+ # on the length on the component description. %]
+ <table>
+ <tr>
+ <td>
+ <fieldset>
+ <legend>Component Description</legend>
+ <div id="comp_desc" class="comment">Select a component to read its description.</div>
+ </fieldset>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <th rowspan="3">Version:</th>
+ <td rowspan="3">
+ <select name="version" size="5">
+ [%- FOREACH v = version %]
+ <option value="[% v FILTER html %]"
+ [% ' selected="selected"' IF v == default.version %]>[% v FILTER html -%]
+ </option>
+ [%- END %]
+ </select>
+ </td>
+
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = select_fields.bug_severity, editable = 1,
+ value = default.bug_severity %]
+ </tr>
+
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = select_fields.rep_platform, editable = 1,
+ value = default.rep_platform %]
+ </tr>
+
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = select_fields.op_sys, editable = 1,
+ value = default.op_sys %]
+ </tr>
+</tbody>
+
+<tbody class="expert_fields">
+ <tr>
+ [% IF Param('usetargetmilestone') && Param('letsubmitterchoosemilestone') %]
+ [% sel = { description => 'Target Milestone', name => 'target_milestone' } %]
+ [% INCLUDE select %]
+ [% ELSE %]
+ <td colspan="2">&nbsp;</td>
+ [% END %]
+
+ [% IF Param('letsubmitterchoosepriority') %]
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = select_fields.priority, editable = 1,
+ value = default.priority %]
+ [% ELSE %]
+ <td colspan="2">&nbsp;</td>
+ [% END %]
+ </tr>
+</tbody>
+
+[% IF !Param('defaultplatform') || !Param('defaultopsys') %]
+ <tbody>
+ <tr>
+ <th>&nbsp;</th>
+ <td colspan="3" class="comment">
+ We've made a guess at your
+ [% IF Param('defaultplatform') %]
+ operating system. Please check it
+ [% ELSIF Param('defaultopsys') %]
+ platform. Please check it
+ [% ELSE %]
+ operating system and platform. Please check them
+ [% END %]
+ and make any corrections if necessary.
+ </td>
+ </tr>
+ </tbody>
+[% END %]
+
+<tbody class="expert_fields">
+ <tr>
+ <td colspan="4">&nbsp;</td>
+ </tr>
+
+ <tr>
+[% IF bug_status.size <= 1 %]
+ <input type="hidden" name="bug_status"
+ value="[% default.bug_status FILTER html %]">
+ <th>Initial State:</th>
+ <td>[% display_value("bug_status", default.bug_status) FILTER html %]</td>
+[% ELSE %]
+ [% sel = { description => 'Initial State', name => 'bug_status' } %]
+ [% INCLUDE select %]
+[% END %]
+
+ <td>&nbsp;</td>
+ [%# Calculate the number of rows we can use for flags %]
+ [% num_rows = 6 + (Param("useqacontact") ? 1 : 0) +
+ (user.is_timetracker ? 3 : 0) +
+ (Param("usebugaliases") ? 1 : 0)
+ %]
+
+ <td rowspan="[% num_rows FILTER html %]">
+ [% IF product.flag_types.bug.size > 0 %]
+ [% display_flag_headers = 0 %]
+ [% any_flags_requesteeble = 0 %]
+
+ [% FOREACH flag_type = product.flag_types.bug %]
+ [% NEXT UNLESS flag_type.is_active %]
+ [% display_flag_headers = 1 %]
+ [% SET any_flags_requesteeble = 1 IF flag_type.is_requestable && flag_type.is_requesteeble %]
+ [% END %]
+
+ [% IF display_flag_headers %]
+ [% PROCESS "flag/list.html.tmpl" flag_types = product.flag_types.bug
+ any_flags_requesteeble = any_flags_requesteeble
+ flag_table_id = "bug_flags"
+ %]
+ [% END %]
+ [% END %]
+ </td>
+ </tr>
+
+ <tr>
+ <th><a href="page.cgi?id=fields.html#assigned_to">Assign To</a>:</th>
+ <td colspan="2">
+ [% INCLUDE global/userselect.html.tmpl
+ name => "assigned_to"
+ value => assigned_to
+ disabled => assigned_to_disabled
+ size => 30
+ emptyok => 1
+ custom_userlist => assignees_list
+ %]
+ <noscript>(Leave blank to assign to component's default assignee)</noscript>
+ </td>
+ </tr>
+
+[% IF Param("useqacontact") %]
+ <tr>
+ <th>QA Contact:</th>
+ <td colspan="2">
+ [% INCLUDE global/userselect.html.tmpl
+ name => "qa_contact"
+ value => qa_contact
+ disabled => qa_contact_disabled
+ size => 30
+ emptyok => 1
+ custom_userlist => qa_contacts_list
+ %]
+ <noscript>(Leave blank to assign to default qa contact)</noscript>
+ </td>
+ </tr>
+[% END %]
+
+ <tr>
+ <th>CC:</th>
+ <td colspan="2">
+ [% INCLUDE global/userselect.html.tmpl
+ name => "cc"
+ value => cc
+ disabled => cc_disabled
+ size => 30
+ multiple => 5
+ %]
+ </td>
+ </tr>
+
+ <tr>
+ <th>Default CC:</th>
+ <td colspan="2">
+ <div id="initial_cc">
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="3">&nbsp;</td>
+ </tr>
+
+[% IF user.is_timetracker %]
+ <tr>
+ <th>Estimated Hours:</th>
+ <td colspan="2">
+ <input name="estimated_time" size="6" maxlength="6" value="[% estimated_time FILTER html %]">
+ </td>
+ </tr>
+ <tr>
+ <th>Deadline:</th>
+ <td colspan="2">
+ <input name="deadline" size="10" maxlength="10" value="[% deadline FILTER html %]">
+ <small>(YYYY-MM-DD)</small>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="3">&nbsp;</td>
+ </tr>
+[% END %]
+
+[% IF Param("usebugaliases") %]
+ <tr>
+ <th>Alias:</th>
+ <td colspan="2">
+ <input name="alias" size="20" value="[% alias FILTER html %]">
+ </td>
+ </tr>
+[% END %]
+
+ <tr>
+ <th>URL:</th>
+ <td colspan="2">
+ <input name="bug_file_loc" size="40"
+ value="[% bug_file_loc FILTER html %]">
+ </td>
+ </tr>
+</tbody>
+
+<tbody class="expert_fields">
+ [% USE Bugzilla %]
+
+ [% FOREACH field = Bugzilla.active_custom_fields %]
+ [% NEXT UNLESS field.enter_bug %]
+ [% SET value = ${field.name}.defined ? ${field.name} : "" %]
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = field, value = value, editable = 1,
+ value_span = 3 %]
+ </tr>
+ [% END %]
+</tbody>
+
+<tbody>
+
+ <tr>
+ <th class="required">Summary:</th>
+ <td colspan="3">
+ <input name="short_desc" size="70" value="[% short_desc FILTER html %]"
+ maxlength="255" spellcheck="true" aria-required="true"
+ class="required">
+ </td>
+ </tr>
+
+ <tr>
+ <th>Description:</th>
+ <td colspan="3">
+ [% defaultcontent = BLOCK %]
+ [% IF cloned_bug_id %]
++++ This [% terms.bug %] was initially created as a clone of [% terms.Bug %] #[% cloned_bug_id %] +++
+
+
+ [% END %]
+ [%-# We are within a BLOCK. The comment will be correctly HTML-escaped
+ # by global/textarea.html.tmpl. So we must not escape the comment here. %]
+ [% comment FILTER none %]
+ [%- END %]
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'comment'
+ id = 'comment'
+ minrows = 10
+ maxrows = 25
+ cols = constants.COMMENT_COLS
+ defaultcontent = defaultcontent
+ %]
+ <br>
+ </td>
+ </tr>
+
+ [% IF user.is_insider %]
+ <tr class="expert_fields">
+ <th>&nbsp;</th>
+ <td colspan="3">
+ &nbsp;&nbsp;
+ <input type="checkbox" id="commentprivacy" name="commentprivacy"
+ [% " checked=\"checked\"" IF commentprivacy %]>
+ <label for="commentprivacy">
+ Make description private (visible only to members of the
+ <strong>[% Param('insidergroup') FILTER html %]</strong> group)
+ </label>
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <th>Attachment:</th>
+ <td colspan="3">
+ <script type="text/javascript">
+ <!--
+ document.write( '<div id="attachment_false">'
+ + '<input type="button" value="Add an attachment" '
+ + 'onClick="handleWantsAttachment(true)"> '
+ + '<em style="display: none">This button has no '
+ + 'functionality for you because your browser does '
+ + 'not support CSS or does not use it.<\/em>'
+ + '<\/div>'
+ + '<div id="attachment_true" style="display: none">'
+ + '<input type="button" '
+ + 'value="Don\'t add an attachment " '
+ + 'onClick="handleWantsAttachment(false)">');
+ //-->
+ </script>
+ <fieldset>
+ <legend>Add an attachment</legend>
+ <table class="attachment_entry">
+ [% PROCESS attachment/createformcontents.html.tmpl
+ flag_types = product.flag_types.attachment
+ any_flags_requesteeble = 1
+ flag_table_id ="attachment_flags" %]
+ </table>
+ </fieldset>
+ <script type="text/javascript">
+ <!--
+ document.write('<\/div>');
+ //-->
+ </script>
+ </td>
+ </tr>
+</tbody>
+
+<tbody class="expert_fields">
+ [% IF user.in_group('editbugs', product.id) %]
+ [% IF use_keywords %]
+ <tr>
+ <th><a href="describekeywords.cgi">Keywords</a>:</th>
+ <td colspan="3">
+ <input id="keywords" name="keywords" size="40"
+ value="[% keywords FILTER html %]"> (optional)
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <th>Depends on:</th>
+ <td colspan="3">
+ <input name="dependson" accesskey="d" value="[% dependson FILTER html %]">
+ </td>
+ </tr>
+ <tr>
+ <th>Blocks:</th>
+ <td colspan="3">
+ <input name="blocked" accesskey="b" value="[% blocked FILTER html %]">
+ </td>
+ </tr>
+ [% END %]
+</tbody>
+
+<tbody class="expert_fields">
+ [% IF group.size %]
+ <tr>
+ <th>&nbsp;</th>
+ <td colspan="3">
+ <br>
+ <strong>
+ Only users in all of the selected groups can view this [% terms.bug %]:
+ </strong>
+ <br>
+ <font size="-1">
+ (Leave all boxes unchecked to make this a public [% terms.bug %].)
+ </font>
+ <br>
+ <br>
+
+ <!-- Checkboxes -->
+ [% FOREACH g = group %]
+ &nbsp;&nbsp;&nbsp;&nbsp;
+ <input type="checkbox" id="bit-[% g.bit %]"
+ name="bit-[% g.bit %]" value="1"
+ [% " checked=\"checked\"" IF g.checked %]>
+ <label for="bit-[% g.bit %]">[% g.description FILTER html_light %]</label><br>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+</tbody>
+
+<tbody>
+ [%# Form controls for entering additional data about the bug being created. %]
+ [% Hook.process("form") %]
+
+ <tr>
+ <th>&nbsp;</th>
+ <td colspan="3">
+ <input type="submit" id="commit" value="Submit [% terms.Bug %]"
+ onclick="if (this.form.short_desc.value == '')
+ { alert('Please enter a summary sentence for this [% terms.bug %].');
+ return false; } return true;">
+ &nbsp;&nbsp;&nbsp;&nbsp;
+ <input type="submit" name="maketemplate" id="maketemplate"
+ value="Remember values as bookmarkable template"
+ class="expert_fields">
+ </td>
+ </tr>
+</tbody>
+ </table>
+ <input type="hidden" name="form_name" value="enter_bug">
+</form>
+
+[%# Links or content with more information about the bug being created. %]
+[% Hook.process("end") %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+ [% IF sel.description %]
+ <th>
+ <a href="page.cgi?id=fields.html#[% sel.name %]">[% sel.description %]</a>:
+ </th>
+ [% END %]
+
+ <td>
+ <select name="[% sel.name %]" id="[% sel.name %]">
+ [%- FOREACH x = ${sel.name} %]
+ <option value="[% x FILTER html %]"
+ [% " selected=\"selected\"" IF x == default.${sel.name} %]>
+ [% display_value(sel.name, x) FILTER html %]
+ </option>
+ [% END %]
+ </select>
+
+ [% IF sel.name == "bug_status" %]
+ <script type="text/javascript">
+ <!--
+ [%+ INCLUDE "bug/field-events.js.tmpl"
+ field = select_fields.bug_status %]
+ //-->
+ </script>
+ [% END %]
+ </td>
+[% END %]
+
+[% BLOCK build_userlist %]
+ [% user_found = 0 %]
+ [% default_login = default_user.login %]
+ [% RETURN UNLESS default_login %]
+
+ [% FOREACH user = userlist %]
+ [% IF user.login == default_login %]
+ [% user_found = 1 %]
+ [% LAST %]
+ [% END %]
+ [% END %]
+
+ [% userlist.push({login => default_login,
+ identity => default_user.identity,
+ visible => 1})
+ UNLESS user_found %]
+[% END %]
diff --git a/template/en/default/bug/create/created.html.tmpl b/template/en/default/bug/create/created.html.tmpl
new file mode 100644
index 0000000..d9eaccb
--- /dev/null
+++ b/template/en/default/bug/create/created.html.tmpl
@@ -0,0 +1,61 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # id: number; the ID of the bug that was created.
+ # sentmail: array of hash; bugs for which BugMail should be sent, contains:
+ # type: string; type of change for this bug, either 'created' if this bug
+ # was created or 'dep' if it was added as a dependent/blocker
+ # id: integer; the ID of the bug
+ # bug: object; Bugzilla::Bug object of the bug that was created (used in
+ # template bug/edit.html.tmpl
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS "bug/show-header.html.tmpl" %]
+[% PROCESS global/header.html.tmpl
+ title = "$terms.Bug $id Submitted &ndash; $filtered_desc"
+ header = "$terms.Bug&nbsp;$id Submitted"
+%]
+
+[% header_done = 1 %]
+
+[% FOREACH item = sentmail %]
+ [% PROCESS bug/process/results.html.tmpl
+ type = item.type
+ id = item.id
+ sent_bugmail = item
+ %]
+[% END %]
+
+<br>
+
+<hr>
+
+[% PROCESS bug/edit.html.tmpl %]
+
+<hr>
+
+[% PROCESS bug/navigate.html.tmpl bottom_navigator => 1 %]
+
+<br>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/create/make-template.html.tmpl b/template/en/default/bug/create/make-template.html.tmpl
new file mode 100644
index 0000000..1397483
--- /dev/null
+++ b/template/en/default/bug/create/make-template.html.tmpl
@@ -0,0 +1,46 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # url: URL to a pre-filled bug entry form.
+ # short_desc: Bug summary as entered in the form.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Bookmarks are your friend"
+ header = "Template constructed"
+%]
+
+<p>
+ You can bookmark this link:
+ &ldquo;<a href="enter_bug.cgi?[% url FILTER html %]">
+ [% IF short_desc %]
+ [% short_desc FILTER html %]
+ [% ELSE %]
+ [% terms.Bug %] entry template
+ [% END %]</a>&rdquo;.
+ This bookmark will bring up the <em>Enter [% terms.Bug %]</em> page with the
+ fields initialized as you've requested.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/create/user-message.html.tmpl b/template/en/default/bug/create/user-message.html.tmpl
new file mode 100644
index 0000000..ac2cc29
--- /dev/null
+++ b/template/en/default/bug/create/user-message.html.tmpl
@@ -0,0 +1,36 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Matthew Tuck <matty@chariot.net.au>
+ #%]
+
+[%# Migration note: this file corresponds to the old Param
+ # 'entryheaderhtml'
+ #%]
+
+[%# You can make the output of this template product-specific by using
+ # Template Toolkit IF statements. The current product name is stored in
+ # the 'product' variable.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+Before reporting [% terms.abug %], please read the
+<a href="page.cgi?id=bug-writing.html">
+[% terms.bug %] writing guidelines</a>, please look at the list of
+<a href="duplicates.cgi">most frequently reported [% terms.bugs %]</a>, and please
+<a href="query.cgi">search</a> for the [% terms.bug %].
diff --git a/template/en/default/bug/dependency-graph.html.tmpl b/template/en/default/bug/dependency-graph.html.tmpl
new file mode 100644
index 0000000..37dcde0
--- /dev/null
+++ b/template/en/default/bug/dependency-graph.html.tmpl
@@ -0,0 +1,106 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # bug_id: integer. The number of the bug(s).
+ # multiple_bugs: boolean. True if bug_id contains > 1 bug number.
+ # doall: boolean. True if we are displaying every bug in the database.
+ # showsummary: boolean. True if we are showing bug summaries.
+ # rankdir: string. "TB" if we are ranking top-to-bottom,
+ "LR" if left-to-right.
+ # image_url: string. The URL of the graphic showing the dependencies.
+ # map_url: string. The URL of the map file for the image. (Optional)
+ # image_map: string. The image map for the graphic showing the
+ dependencies. (Optional)
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = "Dependency Graph"
+ header = title
+ %]
+
+[% IF NOT multiple_bugs AND NOT doall %]
+ [% filtered_desc = short_desc FILTER html %]
+ [% title = "$title for $terms.bug $bug_id"
+ header = "$header for $terms.bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>"
+ subheader = filtered_desc
+ %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl %]
+
+[% image_map %]
+
+<p>
+ Green circles represent open [% terms.bugs %].
+</p>
+
+[% IF image_map %]
+ <img src="[% image_url %]" alt="Dependency graph" usemap="#imagemap">
+[% ELSE %]
+ <a href="[% map_url %]">
+ <img src="[% image_url %]" alt="Dependency graph" ismap="ismap">
+ </a>
+[% END %]
+
+<hr>
+
+<form action="showdependencygraph.cgi" method="GET">
+ <table>
+ <tr>
+ <th align="left"><label for="id">[% terms.Bug %] numbers</label>:</th>
+ <td><input id="id" name="id" value="[% bug_id %]"></td>
+ <td>
+ <input type="checkbox" id="showsummary" name="showsummary" [% " checked" IF showsummary %]>
+ <label for="showsummary">Show the summaries of all displayed [% terms.bugs %]</label>
+ </td>
+ </tr>
+
+ <tr>
+ <th align="left"><label for="display">Display:</label></th>
+ <td colspan="2">
+ <select id="display" name="display">
+ <option value="tree"[% 'selected="selected"' IF (!display || display == "tree") %]>
+ Restrict to [% terms.bugs %] having a direct relationship with entered [% terms.bugs %]</option>
+ <option value="web" [% 'selected="selected"' IF display == "web" %]>
+ Show all [% terms.bugs %] having any relationship with entered [% terms.bugs %]</option>
+ <option value="doall" [% 'selected="selected"' IF display == "doall" %]>
+ Show every [% terms.bug %] in the system with dependencies</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <th align="left"><label for="rankdir">Orientation:</label></th>
+ <td colspan="2">
+ <select id="rankdir" name="rankdir">
+ <option value="TB"[% " selected" IF rankdir == "TB" %]>Top to bottom</option>
+ <option value="BT"[% " selected" IF rankdir == "BT" %]>Bottom to top</option>
+ <option value="LR"[% " selected" IF rankdir == "LR" %]>Left to right</option>
+ <option value="RL"[% " selected" IF rankdir == "RL" %]>Right to left</option>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <input type="submit" id="change" value="Change Parameters">
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/dependency-tree.html.tmpl b/template/en/default/bug/dependency-tree.html.tmpl
new file mode 100644
index 0000000..c42c3c4
--- /dev/null
+++ b/template/en/default/bug/dependency-tree.html.tmpl
@@ -0,0 +1,266 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Tobias Burnus <burnus@net-b.de>
+ # Ville Skyttä <ville.skytta@iki.fi>
+ # Myk Melez <myk@mozilla.org>
+ # André Batosti <batosti@async.com.br>
+ #%]
+
+[% PROCESS 'global/field-descs.none.tmpl' %]
+
+[% filtered_desc = blocked_tree.$bugid.short_desc FILTER html %]
+[% PROCESS global/header.html.tmpl
+ title = "Dependency tree for $terms.Bug $bugid"
+ header = "Dependency tree for
+ <a href=\"show_bug.cgi?id=$bugid\">$terms.Bug $bugid</a>"
+ javascript_urls = ["js/expanding-tree.js"]
+ style_urls = ["skins/standard/dependency-tree.css"]
+ subheader = filtered_desc
+ doc_section = "hintsandtips.html#dependencytree"
+%]
+
+[% PROCESS depthControlToolbar %]
+
+[% INCLUDE tree_section ids=dependson_ids type=1 %]
+
+[% INCLUDE tree_section ids=blocked_ids type=2 %]
+
+[% PROCESS depthControlToolbar %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%###########################################################################%]
+[%# Tree-drawing blocks #%]
+[%###########################################################################%]
+
+[% BLOCK tree_section %]
+ [%# INTERFACE
+ # - ids: a list of bug IDs to be displayed as children
+ # - type: the type of tree. 1 = depends on, 2 = blockeds
+ # GLOBALS
+ # - seen: Maintains a global hash of bugs that have been displayed
+ #%]
+ [% global.seen = {} %]
+ [%# Display the tree of bugs that this bug depends on. %]
+ <h3>
+ <a href="show_bug.cgi?id=[% bugid %]">[% terms.Bug %] [%+ bugid %]</a>
+ [% IF type == 1 %]
+ [% tree_name = "dependson_tree" %]
+ [% IF ids.size %]
+ depends on
+ [% ELSE %]
+ does not depend on any [% terms.bugs %].
+ [% END %]
+ [% ELSIF type == 2 %]
+ [% tree_name = "blocked_tree" %]
+ [% IF ids.size %]
+ blocks
+ [% ELSE %]
+ does not block any [% terms.bugs %].
+ [% END %]
+ [% END %]
+ [% IF ids.size %]
+ [%+ (ids.size == 1) ? "one" : ids.size %]
+ [%+ IF hide_resolved %]open[% END %]
+ [%+ (ids.size == 1) ? terms.bug : terms.bugs %]:
+ [% END %]
+ </h3>
+ [% IF ids.size %]
+ ([% IF maxdepth -%]Up to [% maxdepth %] level[% "s" IF maxdepth > 1 %] deep | [% END -%]
+ <a href="buglist.cgi?bug_id=[% ids.join(",") %]">view as [% terms.bug %] list</a>
+ [% IF user.in_group('editbugs') && ids.size > 1 %]
+ | <a href="buglist.cgi?bug_id=[% ids.join(",") %]&amp;tweak=1">change several</a>
+ [% END %])
+ <ul class="tree">
+ [% INCLUDE display_tree tree=$tree_name %]
+ </ul>
+ [% END %]
+[% END %]
+
+
+[% BLOCK display_tree %]
+ [%# INTERFACE
+ # - bugid: the ID of the bug being displayed
+ # - tree: a hash of bug objects and of bug dependencies
+ #%]
+ [% bug = tree.$bugid %]
+ <li>
+ [%- INCLUDE bullet bugid=bugid tree=tree -%]
+ <span class="summ[% "_deep" IF tree.dependencies.$bugid.size %]"
+ id="[% bugid FILTER html %]"
+ [% IF global.seen.$bugid %]
+ onMouseover="duplicatedover('[% bugid FILTER html %]')"
+ onMouseout="duplicatedout('[% bugid FILTER html %]')"
+ [% END %]>
+ [%- INCLUDE buglink bug=bug bugid=bugid %]
+ </span>
+ [% IF global.seen.$bugid %]
+ <b><a title="Already displayed above; click to locate"
+ onclick="duplicated('[% bugid FILTER html %]')"
+ href="#b[% bugid %]">(*)</a></b>
+ [% ELSIF tree.dependencies.$bugid.size %]
+ <ul>
+ [% FOREACH depid = tree.dependencies.$bugid %]
+ [% INCLUDE display_tree bugid=depid %]
+ [% END %]
+ </ul>
+ [% END %]
+ </li>
+ [% global.seen.$bugid = 1 %]
+[% END %]
+
+[% BLOCK bullet %]
+ [% IF tree.dependencies.$bugid.size && ! global.seen.$bugid %]
+ [% extra_class = " b_open" %]
+ [% extra_args = 'onclick="return doToggle(this, event)"' %]
+ [% END %]
+ <a name="b[% bugid %]"
+ class="b [%+ extra_class FILTER none %]"
+ title="Click to expand or contract this portion of the tree. Hold down the Ctrl key while clicking to expand or contract all subtrees."
+ [% extra_args FILTER none %]>&nbsp;&nbsp;</a>
+[% END %]
+
+[% BLOCK buglink %]
+ [% isclosed = !bug.isopened %]
+ [% FILTER closed(isclosed) -%]
+ <a title="[% INCLUDE buginfo bug=bug %]"
+ href="show_bug.cgi?id=[% bugid %]">
+ <b>[%- bugid %]:</b>
+ <span class="summ_text">[%+ bug.short_desc FILTER html %]</span>
+ <span class="summ_info">[[% INCLUDE buginfo %]]</span>
+ </a>
+ <a href="showdependencytree.cgi?id=[% bugid FILTER url_quote %]"
+ class="tree_link">
+ <img src="skins/standard/dependency-tree/tree.png"
+ title="See dependency tree for [% terms.bug %] [%+ bugid FILTER html %]">
+ </a>
+ [% END %]
+[% END %]
+
+[% BLOCK buginfo %]
+ [% display_value("bug_status", bug.bug_status) FILTER html -%] [%+ display_value("resolution", bug.resolution) FILTER html %];
+ [%-%] assigned to [% bug.assigned_to.login FILTER email FILTER html %]
+ [%-%][% "; Target: " _ bug.target_milestone IF bug.target_milestone %]
+[% END %]
+
+[%###########################################################################%]
+[%# Block for depth control toolbar #%]
+[%###########################################################################%]
+
+[% BLOCK depthControlToolbar %]
+ <table cellpadding="3" border="0" cellspacing="0" bgcolor="#e0e0e0">
+ <tr>
+ [%# Hide/show resolved button
+ Swaps text depending on the state of hide_resolved %]
+ <td align="center">
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ <input name="id" type="hidden" value="[% bugid %]">
+ [% IF maxdepth %]
+ <input name="maxdepth" type="hidden" value="[% maxdepth %]">
+ [% END %]
+ <input type="hidden" name="hide_resolved" value="[% hide_resolved ? 0 : 1 %]">
+ <input type="submit" id="toggle_visibility"
+ value="[% IF hide_resolved %]Show[% ELSE %]Hide[% END %] Resolved">
+ </form>
+ </td>
+
+ <td>
+ Max Depth:
+ </td>
+
+ <td>
+ &nbsp;
+ </td>
+
+ <td>
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ [%# set to one form %]
+ <input type="submit" id="change_maxdepth"
+ value="&nbsp;1&nbsp;"
+ [% "disabled" IF realdepth < 2 || maxdepth == 1 %]>
+ <input name="id" type="hidden" value="[% bugid %]">
+ <input name="maxdepth" type="hidden" value="1">
+ <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+ </form>
+ </td>
+
+ <td>
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ [%# Minus one form
+ Allow subtracting only when realdepth and maxdepth > 1 %]
+ <input name="id" type="hidden" value="[% bugid %]">
+ <input name="maxdepth" type="hidden" value="[%
+ maxdepth == 1 ? 1
+ : ( maxdepth ? maxdepth - 1 : realdepth - 1 )
+ %]">
+ <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+ <input type="submit" id="decrease_depth" value="&nbsp;&lt;&nbsp;"
+ [% "disabled" IF realdepth < 2 || ( maxdepth && maxdepth < 2 ) %]>
+ </form>
+ </td>
+
+ <td>
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ [%# Limit entry form: the button can not do anything when total depth
+ is less than two, so disable it %]
+ <input name="maxdepth" size="4" maxlength="4" value="[%
+ maxdepth > 0 && maxdepth <= realdepth ? maxdepth : ""
+ %]">
+ <input name="id" type="hidden" value="[% bugid %]">
+ <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+ <noscript>
+ <input type="submit" id="change_depth" value="Change"
+ [% "disabled" IF realdepth < 2 %]>
+ </noscript>
+ </form>
+ </td>
+
+ <td>
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ [%# plus one form
+ Disable button if total depth < 2, or if depth set to unlimited %]
+ <input name="id" type="hidden" value="[% bugid %]">
+ [% IF maxdepth %]
+ <input name="maxdepth" type="hidden" value="[% maxdepth + 1 %]">
+ [% END %]
+ <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+ <input type="submit" id="increase_depth" value="&nbsp;&gt;&nbsp;"
+ [% "disabled" IF realdepth < 2 || !maxdepth || maxdepth >= realdepth %]>
+ </form>
+ </td>
+
+ <td>
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ [%# Unlimited button %]
+ <input name="id" type="hidden" value="[% bugid %]">
+ <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+ <input type="submit" id="remove_limit"
+ value="&nbsp;Unlimited&nbsp;"
+ [% "disabled" IF maxdepth == 0 || maxdepth == realdepth %]>
+ </form>
+ </td>
+ </tr>
+</table>
+
+[% END %]
diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl
new file mode 100644
index 0000000..80c6fcd
--- /dev/null
+++ b/template/en/default/bug/edit.html.tmpl
@@ -0,0 +1,1161 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Vaskin Kissoyan <vkissoyan@yahoo.com>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ # Olav Vitters <olav@bkor.dhs.org>
+ # Guy Pyrzak <guy.pyrzak@gmail.com>
+ # Elliotte Martin <emartin@everythingsolved.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS bug/time.html.tmpl %]
+
+[% USE Bugzilla %]
+[% SET select_fields = {} %]
+[% FOREACH field = Bugzilla.get_fields(
+ { type => constants.FIELD_TYPE_SINGLE_SELECT, custom => 0 })
+%]
+ [% select_fields.${field.name} = field %]
+[% END %]
+
+ <script type="text/javascript">
+ <!--
+
+ /* Outputs a link to call replyToComment(); used to reduce HTML output */
+ function addReplyLink(id, real_id) {
+ /* XXX this should really be updated to use the DOM Core's
+ * createElement, but finding a container isn't trivial.
+ */
+ [% IF user.settings.quote_replies.value != 'off' %]
+ document.write('[<a href="#add_comment" onclick="replyToComment(' +
+ id + ',' + real_id + '); return false;">reply<' + '/a>]');
+ [% END %]
+ }
+
+ /* Adds the reply text to the `comment' textarea */
+ function replyToComment(id, real_id) {
+ var prefix = "(In reply to comment #" + id + ")\n";
+ var replytext = "";
+ [% IF user.settings.quote_replies.value == 'quoted_reply' %]
+ /* pre id="comment_name_N" */
+ var text_elem = document.getElementById('comment_text_'+id);
+ var text = getText(text_elem);
+
+ /* make sure we split on all newlines -- IE or Moz use \r and \n
+ * respectively.
+ */
+ text = text.split(/\r|\n/);
+
+ for (var i=0; i < text.length; i++) {
+ replytext += "> " + text[i] + "\n";
+ }
+
+ replytext = prefix + replytext + "\n";
+ [% ELSIF user.settings.quote_replies.value == 'simple_reply' %]
+ replytext = prefix;
+ [% END %]
+
+ [% IF user.is_insider %]
+ if (document.getElementById('isprivate_' + real_id).checked) {
+ document.getElementById('newcommentprivacy').checked = 'checked';
+ }
+ [% END %]
+
+ /* <textarea id="comment"> */
+ var textarea = document.getElementById('comment');
+ textarea.value += replytext;
+
+ textarea.focus();
+ }
+
+ if (typeof Node == 'undefined') {
+ /* MSIE doesn't define Node, so provide a compatibility object */
+ window.Node = {
+ TEXT_NODE: 3,
+ ENTITY_REFERENCE_NODE: 5
+ };
+ }
+
+ /* Concatenates all text from element's childNodes. This is used
+ * instead of innerHTML because we want the actual text (and
+ * innerText is non-standard).
+ */
+ function getText(element) {
+ var child, text = "";
+ for (var i=0; i < element.childNodes.length; i++) {
+ child = element.childNodes[i];
+ var type = child.nodeType;
+ if (type == Node.TEXT_NODE || type == Node.ENTITY_REFERENCE_NODE) {
+ text += child.nodeValue;
+ } else {
+ /* recurse into nodes of other types */
+ text += getText(child);
+ }
+ }
+ return text;
+ }
+
+[% IF user.is_timetracker %]
+ var fRemainingTime = [% bug.remaining_time %]; // holds the original value
+ function adjustRemainingTime() {
+ // subtracts time spent from remaining time
+ var new_time;
+
+ // prevent negative values if work_time > fRemainingTime
+ new_time =
+ Math.max(fRemainingTime - document.changeform.work_time.value, 0.0);
+ // get upto 2 decimal places
+ document.changeform.remaining_time.value =
+ Math.round(new_time * 100)/100;
+ }
+
+ function updateRemainingTime() {
+ // if the remaining time is changed manually, update fRemainingTime
+ fRemainingTime = document.changeform.remaining_time.value;
+ }
+
+[% END %]
+
+ //-->
+ </script>
+
+<form name="changeform" method="post" action="process_bug.cgi">
+
+ <input type="hidden" name="delta_ts" value="[% bug.delta_ts %]">
+ <input type="hidden" name="longdesclength" value="[% bug.comments.size %]">
+ <input type="hidden" name="id" value="[% bug.bug_id %]">
+ <input type="hidden" name="token" value="[% issue_hash_token([bug.id, bug.delta_ts]) FILTER html %]">
+
+ [% PROCESS section_title %]
+ <table class="edit_form">
+ <tr>
+ [%# 1st Column %]
+ <td id="bz_show_bug_column_1" class="bz_show_bug_column">
+ <table>
+ [%# *** ID, product, component, status, resolution, Hardware, and OS *** %]
+ [% PROCESS section_status %]
+
+ [% PROCESS section_spacer %]
+
+ [% PROCESS section_details1 %]
+
+ [% PROCESS section_spacer %]
+
+ [%# *** severity, priority, version and milestone *** %]
+ [% PROCESS section_details2 %]
+
+ [%# *** assigned to and qa contact *** %]
+ [% PROCESS section_people %]
+
+ [% PROCESS section_spacer %]
+
+ [% PROCESS section_url_keyword_whiteboard %]
+
+ [% PROCESS section_spacer %]
+
+ [%# *** Dependencies *** %]
+ [% PROCESS section_dependson_blocks %]
+
+ </table>
+ </td>
+ <td>
+ <div class="bz_column_spacer">&nbsp;</div>
+ </td>
+ [%# 2nd Column %]
+ <td id="bz_show_bug_column_2" class="bz_show_bug_column">
+ <table cellpadding="3" cellspacing="1">
+ [%# *** Reported and modified dates *** %]
+ [% PROCESS section_dates %]
+
+ [% PROCESS section_cclist %]
+
+ [% PROCESS section_spacer %]
+
+ [% PROCESS section_see_also %]
+
+ [% PROCESS section_customfields %]
+
+ [% PROCESS section_spacer %]
+
+ [% Hook.process("after_custom_fields") %]
+
+ [% PROCESS section_flags %]
+
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <hr id="bz_top_half_spacer">
+ </td>
+ </tr>
+ </table>
+
+ <table id="bz_big_form_parts" cellspacing="0" cellpadding="0"><tr>
+ <td>
+ [% IF user.is_timetracker %]
+ [% PROCESS section_timetracking %]
+ [% END %]
+
+ [%# *** Attachments *** %]
+
+ [% PROCESS attachment/list.html.tmpl
+ attachments = bug.attachments
+ bugid = bug.bug_id
+ num_attachment_flag_types = bug.num_attachment_flag_types
+ show_attachment_flags = bug.show_attachment_flags
+ %]
+
+ [% PROCESS comment_box %]
+ </td>
+ <td>
+ [% PROCESS section_restrict_visibility %]
+ </td>
+ </tr></table>
+
+ [%# *** Additional Comments *** %]
+ <div id="comments">
+ [% PROCESS bug/comments.html.tmpl
+ comments = bug.comments
+ mode = user.id ? "edit" : "show"
+ %]
+ </div>
+
+</form>
+
+[%############################################################################%]
+[%# Block for the Title (alias and short desc) #%]
+[%############################################################################%]
+
+[% BLOCK section_title %]
+ [%# That's the main table, which contains all editable fields. %]
+ <div class="bz_alias_short_desc_container edit_form">
+ [% PROCESS commit_button id="_top"%]
+ <a href="show_bug.cgi?id=[% bug.bug_id %]">
+ [%-# %]<b>[% terms.Bug %]&nbsp;[% bug.bug_id FILTER html %]</b>
+ [%-# %]</a> -<span id="summary_alias_container" class="bz_default_hidden">
+ [% IF Param("usebugaliases") %]
+ [% IF bug.alias != "" %]
+ (<span id="alias_nonedit_display">[% bug.alias FILTER html %]</span>)
+ [% END %]
+ [% END %]
+ <span id="short_desc_nonedit_display">[% bug.short_desc FILTER quoteUrls(bug) %]</span>
+ [% IF bug.check_can_change_field('short_desc', 0, 1) ||
+ bug.check_can_change_field('alias', 0, 1) %]
+ <small class="editme">(<a href="#" id="editme_action">edit</a>)</small>
+ [% END %]
+ </span>
+
+
+ <div id="summary_alias_input">
+ <table id="summary">
+ [% IF Param("usebugaliases") %]
+ <tr>
+ [% IF bug.check_can_change_field('alias', 0, 1) %]
+ <td>
+ <label
+ for="alias"
+ title="a name for the
+ [% terms.bug %] that can be used in place of its ID number,
+ [%%] e.g. when adding it to a list of dependencies"
+ >Alias</label>:</td><td>
+ [% ELSIF bug.alias %]
+ <td colspan="2">(
+ [% ELSE %]
+ <td colspan="2">
+ [% END %]
+ [% PROCESS input inputname => "alias"
+ size => "20"
+ maxlength => "20"
+ no_td => 1
+ %][% ")" IF NOT bug.check_can_change_field('alias', 0, 1)
+ && bug.alias %]
+ </td>
+ </tr>
+ [% END %]
+ [%# *** Summary *** %]
+ <tr>
+ <td>
+ <label accesskey="s" for="short_desc"><u>S</u>ummary</label>:
+ </td>
+ <td>
+ [% PROCESS input inputname => "short_desc" size => "80" colspan => 2
+ maxlength => 255 spellcheck => "true" no_td => 1 %]
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ <script type="text/javascript">
+ hideAliasAndSummary('[% bug.short_desc FILTER js %]', '[% bug.alias FILTER js %]');
+ </script>
+[% END %]
+
+[%############################################################################%]
+[%# Block for the first table in the "Details" section #%]
+[%############################################################################%]
+
+[% BLOCK section_details1 %]
+
+ [%#############%]
+ [%# PRODUCT #%]
+ [%#############%]
+
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.product,
+ override_legal_values = bug.choices.product
+ desc_url = 'describecomponents.cgi', value = bug.product
+ editable = bug.check_can_change_field('product', 0, 1) %]
+ </tr>
+ [%###############%]
+ [%# Component #%]
+ [%###############%]
+ <tr>
+ <td class="field_label">
+ <label for="component" accesskey="m">
+ <b><a href="describecomponents.cgi?product=[% bug.product FILTER url_quote %]">
+ Co<u>m</u>ponent</a>:
+ </b>
+ </label>
+ </td>
+ [% PROCESS select selname => "component" %]
+ </tr>
+ <tr>
+ <td class="field_label">
+ <label for="version"><b>Version</b></label>:
+ </td>
+
+ [% PROCESS select selname => "version" %]
+ </tr>
+ [%############%]
+ [%# PLATFORM #%]
+ [%############%]
+ <tr>
+ <td class="field_label">
+ <label for="rep_platform" accesskey="h"><b>Platform</b></label>:
+ </td>
+ <td class="field_value">
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.rep_platform,
+ no_tds = 1, value = bug.rep_platform
+ editable = bug.check_can_change_field('rep_platform', 0, 1) %]
+ [%+ INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.op_sys,
+ no_tds = 1, value = bug.op_sys
+ editable = bug.check_can_change_field('op_sys', 0, 1) %]
+ <script type="text/javascript">
+ assignToDefaultOnChange(['product', 'component']);
+ </script>
+ </td>
+ </tr>
+
+
+
+[% END %]
+
+[%############################################################################%]
+[%# Block for the status section #%]
+[%############################################################################%]
+
+[% BLOCK section_status %]
+ <tr>
+ <td class="field_label">
+ <b><a href="page.cgi?id=fields.html#status">Status</a></b>:
+ </td>
+ <td id="bz_field_status">
+ <span id="static_bug_status">
+ [% display_value("bug_status", bug.bug_status) FILTER html %]
+ [% IF bug.resolution %]
+ [%+ display_value("resolution", bug.resolution) FILTER html %]
+ [% IF bug.dup_id %]
+ of [% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]
+ [% END %]
+ [% END %]
+ [% IF bug.user.canedit || bug.user.isreporter %]
+ (<a href="#add_comment"
+ onclick="window.setTimeout(function() { document.getElementById('bug_status').focus(); }, 10)">edit</a>)
+ [% END %]
+ </span>
+ </td>
+ </tr>
+[% END %]
+
+[%############################################################################%]
+[%# Block for the second table in the "Details" section #%]
+[%############################################################################%]
+
+[% BLOCK section_details2 %]
+
+ [%###############################################################%]
+ [%# Importance (priority, severity and votes) #%]
+ [%###############################################################%]
+ <tr>
+ <td class="field_label">
+ <label for="priority" accesskey="i">
+ <b><a href="page.cgi?id=fields.html#importance"><u>I</u>mportance</a></b></label>:
+ </td>
+ <td>
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.priority,
+ no_tds = 1, value = bug.priority
+ editable = bug.check_can_change_field('priority', 0, 1) %]
+ [%+ INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.bug_severity,
+ no_tds = 1, value = bug.bug_severity
+ editable = bug.check_can_change_field('bug_severity', 0, 1) %]
+ [% IF bug.use_votes %]
+ <span id="votes_container">
+ [% IF bug.votes %]
+ with
+ <a href="votes.cgi?action=show_bug&amp;bug_id=[% bug.bug_id %]">
+ [% bug.votes %]
+ [% IF bug.votes == 1 %]
+ vote
+ [% ELSE %]
+ votes
+ [% END %]</a>
+ [% END %]
+ (<a href="votes.cgi?action=show_user&amp;bug_id=
+ [% bug.bug_id %]#vote_[% bug.bug_id %]">vote</a>)
+ </span>
+ [% END %]
+ </td>
+ </tr>
+
+ [% IF Param("usetargetmilestone") && bug.target_milestone %]
+ <tr>
+ <td class="field_label">
+ <label for="target_milestone">
+ <a href="page.cgi?id=fields.html#target_milestone">
+ Target&nbsp;Milestone</a></label>:
+ </td>
+ [% PROCESS select selname = "target_milestone" %]
+ </tr>
+ [% END %]
+
+[% END %]
+
+[%############################################################################%]
+[%# Block for the table in the "People" section #%]
+[%############################################################################%]
+
+[% BLOCK section_people %]
+
+ <tr>
+ <td class="field_label">
+ <b><a href="page.cgi?id=fields.html#assigned_to">Assigned To</a></b>:
+ </td>
+ <td>
+ [% IF bug.check_can_change_field("assigned_to", 0, 1) %]
+ <div id="bz_assignee_edit_container" class="bz_default_hidden">
+ <span>
+ [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
+ (<a href="#" id="bz_assignee_edit_action">edit</a>)
+ </span>
+ </div>
+ <div id="bz_assignee_input">
+ [% INCLUDE global/userselect.html.tmpl
+ id => "assigned_to"
+ name => "assigned_to"
+ value => bug.assigned_to.login
+ size => 30
+ %]
+ <br>
+ <input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1">
+ <label id="set_default_assignee_label" for="set_default_assignee">Reset Assignee to default</label>
+ </div>
+ <script type="text/javascript">
+ hideEditableField('bz_assignee_edit_container',
+ 'bz_assignee_input',
+ 'bz_assignee_edit_action',
+ 'assigned_to',
+ '[% bug.assigned_to.login FILTER js %]' );
+ initDefaultCheckbox('assignee');
+ </script>
+ [% ELSE %]
+ [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
+ [% END %]
+ </td>
+ </tr>
+
+ [% IF Param('useqacontact') %]
+ <tr>
+ <td class="field_label">
+ <label for="qa_contact" accesskey="q"><b><u>Q</u>A Contact</b></label>:
+ </td>
+ <td>
+ [% IF bug.check_can_change_field("qa_contact", 0, 1) %]
+ [% IF bug.qa_contact != "" %]
+ <div id="bz_qa_contact_edit_container" class="bz_default_hidden">
+ <span>
+ <span id="bz_qa_contact_edit_display">
+ [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]</span>
+ (<a href="#" id="bz_qa_contact_edit_action">edit</a>)
+ </span>
+ </div>
+ [% END %]
+ <div id="bz_qa_contact_input">
+ [% INCLUDE global/userselect.html.tmpl
+ id => "qa_contact"
+ name => "qa_contact"
+ value => bug.qa_contact.login
+ size => 30
+ emptyok => 1
+ %]
+ <br>
+ <input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1">
+ <label for="set_default_qa_contact" id="set_default_qa_contact_label">Reset QA Contact to default</label>
+ </div>
+ <script type="text/javascript">
+ [% IF bug.qa_contact != "" %]
+ hideEditableField('bz_qa_contact_edit_container',
+ 'bz_qa_contact_input',
+ 'bz_qa_contact_edit_action',
+ 'qa_contact',
+ '[% bug.qa_contact.login FILTER js %]');
+ [% END %]
+ initDefaultCheckbox('qa_contact');
+ </script>
+ [% ELSE %]
+ [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for URL Keyword and Whiteboard #%]
+[%############################################################################%]
+[% BLOCK section_url_keyword_whiteboard %]
+[%# *** URL Whiteboard Keywords *** %]
+ <tr>
+ <td class="field_label">
+ <label for="bug_file_loc" accesskey="u"><b>
+ [% IF bug.bug_file_loc
+ AND NOT bug.bug_file_loc.match("^(javascript|data)") %]
+ <a href="[% bug.bug_file_loc FILTER html %]"><u>U</u>RL</a>
+ [% ELSE %]
+ <u>U</u>RL
+ [% END %]
+ [%%]</b></label>:
+ </td>
+ <td>
+ [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
+ <span id="bz_url_edit_container" class="bz_default_hidden">
+ [% IF bug.bug_file_loc
+ AND NOT bug.bug_file_loc.match("^(javascript|data)") %]
+ <a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
+ title="[% bug.bug_file_loc FILTER html %]">
+ [% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a>
+ [% ELSE %]
+ [% bug.bug_file_loc FILTER html %]
+ [% END %]
+ (<a href="#" id="bz_url_edit_action">edit</a>)</span>
+ [% END %]
+ <span id="bz_url_input_area">
+ [% url_output = PROCESS input no_td=1 inputname => "bug_file_loc" size => "40" colspan => 2 %]
+ [% IF NOT bug.check_can_change_field("bug_file_loc", 0, 1) %]
+ <a href="[% bug.bug_file_loc FILTER html %]">[% url_output FILTER none %]</a>
+ [% ELSE %]
+ [% url_output FILTER none %]
+ [% END %]
+ </span>
+ [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
+ <script type="text/javascript">
+ hideEditableField('bz_url_edit_container',
+ 'bz_url_input_area',
+ 'bz_url_edit_action',
+ 'bug_file_loc',
+ "[% bug.bug_file_loc FILTER js %]");
+ </script>
+ [% END %]
+ </td>
+ </tr>
+
+ [% IF Param('usestatuswhiteboard') %]
+ <tr>
+ <td class="field_label">
+ <label for="status_whiteboard" accesskey="w"><b><u>W</u>hiteboard</b></label>:
+ </td>
+ [% PROCESS input inputname => "status_whiteboard" size => "40" colspan => 2 %]
+ </tr>
+ [% END %]
+
+ [% IF use_keywords %]
+ <tr>
+ <td class="field_label">
+ <label for="keywords" accesskey="k">
+ <b><a href="describekeywords.cgi"><u>K</u>eywords</a></b></label>:
+ </td>
+ [% PROCESS input inputname => "keywords" size => 40 colspan => 2
+ value => bug.keywords.join(', ') %]
+ </tr>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for Depends On / Blocks #%]
+[%############################################################################%]
+[% BLOCK section_dependson_blocks %]
+ <tr>
+ [% PROCESS dependencies
+ dep = { title => "Depends&nbsp;on", fieldname => "dependson" } %]
+ </tr>
+
+ <tr>
+ [% PROCESS dependencies accesskey = "b"
+ dep = { title => "<u>B</u>locks", fieldname => "blocked" } %]
+
+ <tr>
+ <th>&nbsp;</th>
+
+ <td colspan="2" align="left" id="show_dependency_tree_or_graph">
+ Show dependency <a href="showdependencytree.cgi?id=[% bug.bug_id %]&amp;hide_resolved=1">tree</a>
+
+ [% IF Param('webdotbase') %]
+ /&nbsp;<a href="showdependencygraph.cgi?id=[% bug.bug_id %]">graph</a>
+ [% END %]
+ </td>
+ </tr>
+[% END %]
+
+
+[%############################################################################%]
+[%# Block for Restricting Visibility #%]
+[%############################################################################%]
+
+[% BLOCK section_restrict_visibility %]
+ [% RETURN UNLESS bug.groups.size %]
+
+ <div class="bz_group_visibility_section">
+ [% inallgroups = 1 %]
+ [% inagroup = 0 %]
+ [% emitted_description = 0 %]
+
+ [% FOREACH group = bug.groups %]
+ [% SET inallgroups = 0 IF NOT group.ingroup %]
+ [% SET inagroup = 1 IF group.ison %]
+
+ [% NEXT IF group.mandatory %]
+
+ [% IF NOT emitted_description %]
+ [% emitted_description = 1 %]
+ <div id="bz_restrict_group_visibility_help">
+ <b>Only users in all of the selected groups can view this
+ [%+ terms.bug %]:</b>
+ <p class="instructions">
+ Unchecking all boxes makes this a more public [% terms.bug %].
+ </p>
+ </div>
+ [% END %]
+
+ [% IF group.ingroup %]
+ <input type="hidden" name="defined_bit-[% group.bit %]" value="1">
+ [% END %]
+
+ <input type="checkbox" value="1" name="bit-[% group.bit %]"
+ id="bit-[% group.bit %]"
+ [% ' checked="checked"' IF group.ison %]
+ [% ' disabled="disabled"' IF NOT group.ingroup %]>
+ <label for="bit-[% group.bit %]">
+ [%- group.description FILTER html_light %]</label>
+ <br>
+ [% END %]
+
+ [% IF emitted_description %]
+ [% IF NOT inallgroups %]
+ <p class="instructions">Only members of a group can change the
+ visibility of [% terms.abug %] for that group.</p>
+ [% END %]
+ [% END %]
+
+ [% IF inagroup %]
+ <div id="bz_enable_role_visibility_help">
+ <b>Users in the roles selected below can always view
+ this [% terms.bug %]:</b>
+ </div>
+ <div id="bz_enable_role_visibility">
+ <div>
+ [% user_can_edit_accessible =
+ bug.check_can_change_field("reporter_accessible", 0, 1)
+ %]
+ [% IF user_can_edit_accessible %]
+ <input type="hidden" name="defined_reporter_accessible" value="1">
+ [% END %]
+ <input type="checkbox" value="1"
+ name="reporter_accessible" id="reporter_accessible"
+ [% " checked" IF bug.reporter_accessible %]
+ [% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
+ <label for="reporter_accessible">Reporter</label>
+ </div>
+ <div>
+ [% user_can_edit_accessible =
+ bug.check_can_change_field("cclist_accessible", 0, 1)
+ %]
+ [% IF user_can_edit_accessible %]
+ <input type="hidden" name="defined_cclist_accessible" value="1">
+ [% END %]
+ <input type="checkbox" value="1"
+ name="cclist_accessible" id="cclist_accessible"
+ [% " checked" IF bug.cclist_accessible %]
+ [% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
+ <label for="cclist_accessible">CC List</label>
+ </div>
+ <p class="instructions">
+ The assignee
+ [% IF (Param('useqacontact')) %]
+ and QA contact
+ [% END %]
+ can always see [% terms.abug %], and this section does not
+ take effect unless the [% terms.bug %] is restricted to at
+ least one group.
+ </p>
+ </div>
+ [% END %]
+ </div> [%# bz_group_visibility_section %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for Dates #%]
+[%############################################################################%]
+
+[% BLOCK section_dates %]
+ <tr>
+ <td class="field_label">
+ <b>Reported</b>:
+ </td>
+ <td>
+ [% bug.creation_ts FILTER time %] by [% INCLUDE global/user.html.tmpl who = bug.reporter %]
+ </td>
+ </tr>
+
+ <tr>
+ <td class="field_label">
+ <b> Modified</b>:
+ </td>
+ <td>
+ [% bug.delta_ts FILTER time FILTER replace(':\d\d$', '') FILTER replace(':\d\d ', ' ')%]
+ (<a href="show_activity.cgi?id=[% bug.bug_id %]">[%# terms.Bug %]History</a>)
+ </td>
+
+ </tr>
+[% END %]
+
+[%############################################################################%]
+[%# Block for CC LIST #%]
+[%############################################################################%]
+[% BLOCK section_cclist %]
+ <tr>
+ <td class="field_label">
+ <label for="newcc" accesskey="a"><b>CC List</b>:</label>
+ </td>
+ <td>
+ [% IF user.id %]
+ [% IF NOT bug.cc || NOT bug.cc.contains(user.login) %]
+ [% has_role = bug.user.isreporter
+ || bug.assigned_to.id == user.id
+ || (Param('useqacontact')
+ && bug.qa_contact
+ && bug.qa_contact.id == user.id) %]
+ <input type="checkbox" id="addselfcc" name="addselfcc"
+ [% " checked=\"checked\""
+ IF user.settings.state_addselfcc.value == 'always'
+ || (!has_role
+ && user.settings.state_addselfcc.value == 'cc_unless_role') %]>
+ <label for="addselfcc">Add me to CC list</label>
+ <br>
+ [% END %]
+ [% END %]
+ [% bug.cc.size || 0 FILTER html %]
+ [% IF bug.cc.size == 1 %]
+ user
+ [% ELSE %]
+ users
+ [% END %]
+ [% IF user.id %]
+ [% IF bug.cc.contains( user.email ) %]
+ including you
+ [% END %]
+ [% END %]
+ <span id="cc_edit_area_showhide_container" class="bz_default_hidden">
+ (<a href="#" id="cc_edit_area_showhide">[% IF user.id %]edit[% ELSE %]show[% END %]</a>)
+ </span>
+ <div id="cc_edit_area">
+ <br>
+ [% IF user.id %]
+ <div>
+ <div><label for="cc"><b>Add</b></label></div>
+ [% INCLUDE global/userselect.html.tmpl
+ id => "newcc"
+ name => "newcc"
+ value => ""
+ size => 30
+ multiple => 5
+ %]
+ </div>
+ [% END %]
+ [% IF bug.cc %]
+ <select id="cc" name="cc" multiple="multiple" size="5">
+ [% FOREACH c = bug.cc %]
+ <option value="[% c FILTER email FILTER html %]">
+ [% c FILTER email FILTER html %]</option>
+ [% END %]
+ </select>
+ [% IF user.id %]
+ <br>
+ <input type="checkbox" id="removecc" name="removecc">
+ [%%]<label for="removecc">Remove selected CCs</label>
+ <br>
+ [% END %]
+ [% END %]
+ </div>
+ <script type="text/javascript">
+ hideEditableField( 'cc_edit_area_showhide_container',
+ 'cc_edit_area',
+ 'cc_edit_area_showhide',
+ '',
+ '');
+ </script>
+ </td>
+ </tr>
+[% END %]
+
+[%############################################################################%]
+[%# Block for See Also #%]
+[%############################################################################%]
+[% BLOCK section_see_also %]
+ [% IF Param('use_see_also') || bug.see_also.size %]
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ field = bug_fields.see_also
+ value = bug.see_also
+ editable = bug.check_can_change_field('see_also', 0, 1)
+ %]
+ </tr>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for FLAGS #%]
+[%############################################################################%]
+
+[% BLOCK section_flags %]
+ [%# *** Flags *** %]
+ [% show_bug_flags = 0 %]
+ [% FOREACH type = bug.flag_types %]
+ [% IF (type.flags && type.flags.size > 0) || (user.id && type.is_active) %]
+ [% show_bug_flags = 1 %]
+ [% LAST %]
+ [% END %]
+ [% END %]
+ [% IF show_bug_flags %]
+ <tr>
+ <td class="field_label flags_label">
+ <label><b>Flags:</b></label>
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ [% IF bug.flag_types.size > 0 %]
+ [% PROCESS "flag/list.html.tmpl" flag_no_header = 1
+ flag_types = bug.flag_types
+ any_flags_requesteeble = bug.any_flags_requesteeble %]
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for Custom Fields #%]
+[%############################################################################%]
+
+[% BLOCK section_customfields %]
+[%# *** Custom Fields *** %]
+
+ [% FOREACH field = Bugzilla.active_custom_fields %]
+ <tr>
+ [% PROCESS bug/field.html.tmpl value=bug.${field.name}
+ editable = bug.check_can_change_field(field.name, 0, 1)
+ value_span = 2 %]
+ </tr>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for Section Spacer #%]
+[%############################################################################%]
+
+[% BLOCK section_spacer %]
+ <tr>
+ <td colspan="2" class="bz_section_spacer"></td>
+ </tr>
+[% END %]
+
+
+
+
+[%############################################################################%]
+[%# Block for dependencies #%]
+[%############################################################################%]
+
+[% BLOCK dependencies %]
+
+ <th class="field_label">
+ <label for="[% dep.fieldname %]"[% " accesskey=\"$accesskey\"" IF accesskey %]>
+ [% dep.title %]</label>:
+ </th>
+ <td>
+ <span id="[% dep.fieldname %]_input_area">
+ [% IF bug.check_can_change_field(dep.fieldname, 0, 1) %]
+ <input name="[% dep.fieldname %]" id="[% dep.fieldname %]"
+ class="text_input"
+ value="[% bug.${dep.fieldname}.join(', ') %]">
+ [% END %]
+ </span>
+
+ [% FOREACH depbug = bug.${dep.fieldname} %]
+ [% depbug FILTER bug_link(depbug, use_alias => 1) FILTER none %][% " " %]
+ [% END %]
+ [% IF bug.check_can_change_field(dep.fieldname, 0, 1) %]
+ <span id="[% dep.fieldname %]_edit_container" class="edit_me bz_default_hidden" >
+ (<a href="#" id="[% dep.fieldname %]_edit_action">edit</a>)
+ </span>
+ <script type="text/javascript">
+ hideEditableField('[% dep.fieldname %]_edit_container',
+ '[% dep.fieldname %]_input_area',
+ '[% dep.fieldname %]_edit_action',
+ '[% dep.fieldname %]',
+ "[% bug.${dep.fieldname}.join(', ') %]");
+ </script>
+ [% END %]
+ </td>
+
+ [% accesskey = undef %]
+
+[% END %]
+
+[%############################################################################%]
+[%# Block for Time Tracking Group #%]
+[%############################################################################%]
+
+[% BLOCK section_timetracking %]
+ <table class="bz_time_tracking_table">
+ <tr>
+ <th>
+ <label for="estimated_time">Orig. Est.</label>
+ </th>
+ <th>
+ Current Est.
+ </th>
+ <th>
+ <label for="work_time">Hours Worked</label>
+ </th>
+ <th>
+ <label for="remaining_time">Hours Left</label>
+ </th>
+ <th>
+ %Complete
+ </th>
+ <th>
+ Gain
+ </th>
+ <th>
+ <label for="deadline">Deadline</label>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <input name="estimated_time" id="estimated_time"
+ value="[% PROCESS formattimeunit
+ time_unit=bug.estimated_time %]"
+ size="6" maxlength="6">
+ </td>
+ <td>
+ [% PROCESS formattimeunit
+ time_unit=(bug.actual_time + bug.remaining_time) %]
+ </td>
+ <td>
+ [% PROCESS formattimeunit time_unit=bug.actual_time %] +
+ <input name="work_time" id="work_time"
+ value="0" size="3" maxlength="6"
+ onchange="adjustRemainingTime();">
+ </td>
+ <td>
+ <input name="remaining_time" id="remaining_time"
+ value="[% PROCESS formattimeunit
+ time_unit=bug.remaining_time %]"
+ size="6" maxlength="6" onchange="updateRemainingTime();">
+ </td>
+ <td>
+ [% PROCESS calculatepercentage act=bug.actual_time
+ rem=bug.remaining_time %]
+ </td>
+ <td>
+ [% PROCESS formattimeunit time_unit=bug.estimated_time - (bug.actual_time + bug.remaining_time) %]
+ </td>
+ <td>
+ <input name="deadline" id="deadline" value="[% bug.deadline %]"
+ size="10" maxlength="10"><br />
+ <small>(YYYY-MM-DD)</small>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="7" class="bz_summarize_time">
+ <a href="summarize_time.cgi?id=[% bug.bug_id %]&amp;do_depends=1">
+ Summarize time (including time for [% terms.bugs %]
+ blocking this [% terms.bug %])</a>
+ </td>
+ </tr>
+ </table>
+[% END %]
+
+[%############################################################################%]
+[%# Block for the Additional Comments box #%]
+[%############################################################################%]
+
+[% BLOCK comment_box %]
+ <div class="bz_section_additional_comments">
+ <a name="add_comment"></a>
+ [% IF user.id %]
+ <label for="comment" accesskey="c"><b>Additional
+ <u>C</u>omments</b></label>:
+
+ [% IF user.is_insider %]
+ <input type="checkbox" name="commentprivacy" value="1"
+ id="newcommentprivacy"
+ onClick="updateCommentTagControl(this, form)">
+ <label for="newcommentprivacy">
+ Make comment private (visible only to members of the
+ <strong>[% Param('insidergroup') FILTER html %]</strong> group)
+ </label>
+ [% END %]
+
+ <!-- This table keeps the submit button aligned with the box. -->
+ <table><tr><td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'comment'
+ id = 'comment'
+ minrows = 10
+ maxrows = 25
+ cols = constants.COMMENT_COLS
+ %]
+ [% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %]
+ <br>
+ [% PROCESS commit_button id=""%]
+
+ <table class="status" cellspacing="0" cellpadding="0">
+ <tr>
+ <td class="field_label">
+ <b><a href="page.cgi?id=fields.html#status">Status</a></b>:
+ </td>
+ <td>
+ <a name="bug_status_bottom"></a>
+ [% PROCESS bug/knob.html.tmpl %]
+ </td>
+ </tr>
+ </table>
+ </td></tr></table>
+
+ [%# For logged-out users %]
+ [% ELSE %]
+ <table><tr><td><fieldset>
+ <legend>Note</legend>
+ You need to
+ <a href="show_bug.cgi?id=
+ [%- bug.bug_id %]&amp;GoAheadAndLogIn=1">log in</a>
+ before you can comment on or make changes to this [% terms.bug %].
+ </fieldset></table><tr></td>
+ [% END %]
+ </div>
+[% END %]
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+ <td>
+ [% IF bug.check_can_change_field(selname, 0, 1)
+ AND bug.choices.${selname}.size > 1 %]
+ <select id="[% selname %]" name="[% selname %]">
+ [% FOREACH x = bug.choices.${selname} %]
+ <option value="[% x.name FILTER html %]"
+ [% " selected" IF x.name == bug.${selname} %]>
+ [%- x.name FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ [% ELSE %]
+ [% bug.${selname} FILTER html %]
+ [% END %]
+ </td>
+[% END %]
+
+[%############################################################################%]
+[%# Block for INPUT fields #%]
+[%############################################################################%]
+
+[% BLOCK input %]
+ [% IF no_td != 1 %]
+ <td[% " colspan=\"$colspan\"" IF colspan %]>
+ [% END %]
+ [% val = value ? value : bug.$inputname %]
+ [% IF bug.check_can_change_field(inputname, 0, 1) %]
+ <input id="[% inputname %]" name="[% inputname %]" class="text_input"
+ value="[% val FILTER html %]"[% " size=\"$size\"" IF size %]
+ [% " maxlength=\"$maxlength\"" IF maxlength %]
+ [% " spellcheck=\"$spellcheck\"" IF spellcheck %]>
+ [% ELSE %]
+ [% IF size && val.length > size %]
+ <span title="[% val FILTER html %]">
+ [% val FILTER truncate(size) FILTER html %]
+ </span>
+ [% ELSE %]
+ [% val FILTER html %]
+ [% END %]
+ [% END %]
+ [% IF no_td != 1 %]
+ </td>
+ [% END %]
+ [% no_td = 0 %]
+ [% maxlength = 0 %]
+ [% colspan = 0 %]
+ [% size = 0 %]
+ [% value = undef %]
+ [% spellcheck = undef %]
+[% END %]
+[% BLOCK commit_button %]
+ [% IF user.id %]
+ <div class="knob-buttons">
+ <input type="submit" value="Save Changes"
+ id="commit[% id FILTER css_class_quote %]">
+ [% IF bug.user.canmove %]
+ <input type="submit" name="action" id="action[% id FILTER css_class_quote %]" value="[% Param("move-button-text") %]">
+ [% END %]
+ </div>
+ [% END %]
+[% END %]
diff --git a/template/en/default/bug/field-events.js.tmpl b/template/en/default/bug/field-events.js.tmpl
new file mode 100644
index 0000000..06fba12
--- /dev/null
+++ b/template/en/default/bug/field-events.js.tmpl
@@ -0,0 +1,40 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is the San Jose State
+ # University Foundation. Portions created by the Initial Developer
+ # are Copyright (C) 2008 the Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # field: a Bugzilla::Field object
+ #%]
+
+[% FOREACH controlled_field = field.controls_visibility_of %]
+ showFieldWhen('[% controlled_field.name FILTER js %]',
+ '[% field.name FILTER js %]',
+ '[% controlled_field.visibility_value.name FILTER js %]');
+[% END %]
+[% FOREACH legal_value = field.legal_values %]
+ [% FOREACH controlled_field = legal_value.controlled_values.keys %]
+ [% SET cont_ids = [] %]
+ [% FOREACH val = legal_value.controlled_values.$controlled_field %]
+ [% cont_ids.push(val.id) %]
+ [% END %]
+ showValueWhen('[% controlled_field FILTER js %]',
+ [[% cont_ids.join(',') FILTER js %]],
+ '[% field.name FILTER js %]',
+ [% legal_value.id FILTER js %]);
+ [% END %]
+[% END %]
diff --git a/template/en/default/bug/field.html.tmpl b/template/en/default/bug/field.html.tmpl
new file mode 100644
index 0000000..bb678d7
--- /dev/null
+++ b/template/en/default/bug/field.html.tmpl
@@ -0,0 +1,215 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Elliotte Martin <elliotte_martin@yahoo.com>
+ #%]
+
+[%# INTERFACE:
+ # field: a Bugzilla::Field object
+ # value: The value of the field for this bug.
+ # override_legal_values (optional): The list of legal values, for select fields.
+ # editable: Whether the field should be displayed as an editable
+ # <input> or as just the plain text of its value.
+ # allow_dont_change: display the --do_not_change-- option for select fields.
+ # value_span: A colspan for the table cell containing
+ # the field value.
+ # no_tds: boolean; if true, don't display the label <th> or the
+ # wrapping <td> for the field.
+ # desc_url: string; Normally the label of a non-custom field links to
+ # fields.html. If you want it to link elsewhere, specify the
+ # relative URL you want to link to, here. Remember to call
+ # url_quote on any query string arguments.
+ # bug (optional): The current Bugzilla::Bug being displayed, or a hash
+ # with default field values being displayed on a page.
+ #%]
+
+[% SET hidden = 0 %]
+[% IF field.visibility_field.defined %]
+ [% IF !bug.${field.visibility_field.name}
+ .contains(field.visibility_value.name)
+ %]
+ [% SET hidden = 1 %]
+ [% END %]
+[% END %]
+
+[% IF NOT no_tds %]
+ <th class="field_label [% ' bz_hidden_field' IF hidden %]"
+ id="field_label_[% field.name FILTER html %]">
+ [% IF editable %]
+ <label for="[% field.name FILTER html %]">
+ [% END %]
+ [% IF desc_url %]
+ <a href="[% desc_url FILTER html %]">
+ [% ELSIF !field.custom %]
+ <a href="page.cgi?id=fields.html#[% field.name FILTER url_quote %]">
+ [% END -%]
+ [% field_descs.${field.name} FILTER html %]:
+ [%- '</a>' IF (!field.custom || desc_url) %]
+ [% '</label>' IF editable %]
+ </th>
+[% END %]
+
+[% IF NOT no_tds %]
+<td class="field_value [% ' bz_hidden_field' IF hidden %]"
+ id="field_container_[% field.name FILTER html %]"
+ [% " colspan=\"$value_span\"" FILTER none IF value_span %]>
+[% END %]
+[% Hook.process('start_field_column') %]
+[% IF editable %]
+ [% SWITCH field.type %]
+ [% CASE constants.FIELD_TYPE_FREETEXT %]
+ <input id="[% field.name FILTER html %]" class="text_input"
+ name="[% field.name FILTER html %]"
+ value="[% value FILTER html %]" size="40"
+ maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]">
+ [% CASE constants.FIELD_TYPE_DATETIME %]
+ <input name="[% field.name FILTER html %]" size="20"
+ id="[% field.name FILTER html %]"
+ value="[% value FILTER html %]"
+ onchange="updateCalendarFromField(this)">
+ <button type="button" class="calendar_button"
+ id="button_calendar_[% field.name FILTER html %]"
+ onclick="showCalendar('[% field.name FILTER js %]')">
+ <span>Calendar</span>
+ </button>
+
+ <div id="con_calendar_[% field.name FILTER html %]"
+ class="yui-skin-sam"></div>
+
+ <script type="text/javascript">
+ createCalendar('[% field.name FILTER js %]')
+ </script>
+ [% CASE constants.FIELD_TYPE_BUG_ID %]
+ <span id="[% field.name FILTER html %]_input_area">
+ <input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]"
+ value="[% value FILTER html %]" size="7">
+ </span>
+
+ [% IF bug.${field.name} %]
+ [% bug.${field.name} FILTER bug_link(bug.${field.name}) FILTER none %]
+ [% END %]
+ <span id="[% field.name FILTER html %]_edit_container" class="edit_me bz_default_hidden">
+ (<a href="#" id="[% field.name FILTER html %]_edit_action">edit</a>)
+ </span>
+ <script type="text/javascript">
+ hideEditableField('[% field.name FILTER js %]_edit_container',
+ '[% field.name FILTER js %]_input_area',
+ '[% field.name FILTER js %]_edit_action',
+ '[% field.name FILTER js %]',
+ "[% bug.${field.name} FILTER js %]");
+ </script>
+ [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
+ constants.FIELD_TYPE_MULTI_SELECT ] %]
+ <select id="[% field.name FILTER html %]"
+ name="[% field.name FILTER html %]"
+ [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
+ [% SET field_size = 5 %]
+ [% IF field.legal_values.size < 5 %]
+ [% SET field_size = field.legal_values.size %]
+ [% END %]
+ size="[% field_size FILTER html %]" multiple="multiple"
+ [% END %]
+ >
+ [% IF allow_dont_change %]
+ <option value="[% dontchange FILTER html %]"
+ [% ' selected="selected"' IF value == dontchange %]>
+ [% dontchange FILTER html %]
+ </option>
+ [% END %]
+ [% IF override_legal_values %]
+ [% legal_values = override_legal_values %]
+ [% ELSE %]
+ [% legal_values = field.legal_values %]
+ [% END %]
+ [% FOREACH legal_value = legal_values %]
+ [% SET control_value = legal_value.visibility_value %]
+ [% SET control_field = field.value_field %]
+ <option value="[% legal_value.name FILTER html %]"
+ id="v[% legal_value.id FILTER html %]_
+ [%- field.name FILTER html %]"
+ [%# We always show selected values, even if they should be
+ # hidden %]
+ [% IF value.contains(legal_value.name).size %]
+ selected="selected"
+ [% ELSIF (control_field && control_value
+ && !bug.${control_field.name}.contains(control_value.name))
+ || !legal_value.is_active
+ %]
+ class="bz_hidden_option" disabled="disabled"
+ [% END %]>
+ [%- display_value(field.name, legal_value.name) FILTER html ~%]
+ </option>
+ [% END %]
+ </select>
+ [%# When you pass an empty multi-select in the web interface,
+ # it doesn't appear at all in the CGI object. Instead of
+ # forcing all users of process_bug to always specify every
+ # multi-select, we have this field defined if the multi-select
+ # field is defined, and then if this is passed but the multi-select
+ # isn't, we know that the multi-select was emptied.
+ %]
+ [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
+ <input type="hidden" name="defined_[% field.name FILTER html %]">
+ [% END %]
+
+ <script type="text/javascript">
+ <!--
+ initHidingOptionsForIE('[% field.name FILTER js %]');
+ [%+ INCLUDE "bug/field-events.js.tmpl" field = field %]
+ //-->
+ </script>
+
+ [% CASE constants.FIELD_TYPE_TEXTAREA %]
+ [% INCLUDE global/textarea.html.tmpl
+ id = field.name name = field.name minrows = 4 maxrows = 8
+ cols = 60 defaultcontent = value %]
+ [% CASE constants.FIELD_TYPE_BUG_URLS %]
+ [% '<ul class="bug_urls">' IF value.size %]
+ [% FOREACH url = value %]
+ <li>
+ <a href="[% url FILTER html %]">[% url FILTER html %]</a>
+ [% IF editable %]
+ <label><input type="checkbox" value="[% url FILTER html %]"
+ name="remove_[% field.name FILTER html %]">
+ Remove</label>
+ [% END %]
+ </li>
+ [% END %]
+ [% '</ul>' IF value.size %]
+
+ [% IF editable && Param('use_see_also') %]
+ <label for="[% field.name FILTER html %]">
+ <strong>Add [% terms.Bug %] URLs:</strong>
+ </label><br>
+ <input type="text" id="[% field.name FILTER html %]" size="40"
+ class="text_input" name="[% field.name FILTER html %]">
+ [% END %]
+ [% END %]
+[% ELSIF field.type == constants.FIELD_TYPE_TEXTAREA %]
+ <div class="uneditable_textarea">[% value FILTER wrap_comment(60)
+ FILTER html %]</div>
+[% ELSIF field.type == constants.FIELD_TYPE_BUG_ID %]
+ [% IF bug.${field.name} %]
+ [% bug.${field.name} FILTER bug_link(bug.${field.name}) FILTER none %]
+ [% END %]
+[% ELSE %]
+ [% value.join(', ') FILTER html %]
+[% END %]
+[% Hook.process('end_field_column') %]
+[% '</td>' IF NOT no_tds %]
diff --git a/template/en/default/bug/format_comment.txt.tmpl b/template/en/default/bug/format_comment.txt.tmpl
new file mode 100644
index 0000000..7d33c23
--- /dev/null
+++ b/template/en/default/bug/format_comment.txt.tmpl
@@ -0,0 +1,68 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Marc Schumann.
+ # Portions created by Marc Schumann are Copyright (c) 2008 Marc Schumann.
+ # All rights reserved.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# NOTE: Everywhere you use this template, you must call
+ # "FILTER remove('^X')" on the result. This is unfortunately the only way
+ # to preserve leading whitespace in comments.
+ #%]
+
+[%# INTERFACE:
+ # comment: A Bugzilla::Comment object.
+ # is_bugmail: boolean; True if this comment is going into a plain-text
+ # bugmail.
+ #%]
+
+[%# Please don't use field-descs here. It can slow down Bugzilla. %]
+[% PROCESS 'global/variables.none.tmpl' %]
+
+[% SET comment_body = comment.body %]
+
+[% IF comment.type == constants.CMT_DUPE_OF %]
+X[% comment_body %]
+
+*** This [% terms.bug %] has been marked as a duplicate of [% terms.bug %] [%+ comment.extra_data %] ***
+[% ELSIF comment.type == constants.CMT_HAS_DUPE %]
+*** [% terms.Bug %] [%+ comment.extra_data %] has been marked as a duplicate of this [% terms.bug %]. ***
+[% ELSIF comment.type == constants.CMT_POPULAR_VOTES %]
+*** This [% terms.bug %] has been confirmed by popular vote. ***
+[% ELSIF comment.type == constants.CMT_MOVED_TO %]
+X[% comment_body %]
+
+[%+ terms.Bug %] moved to [% Param("move-to-url") %].
+If the move succeeded, [% comment.extra_data %] will receive a mail containing
+the number of the new [% terms.bug %] in the other database.
+If all went well, please paste in a link to the new [% terms.bug %].
+Otherwise, reopen this [% terms.bug %].
+[% ELSIF comment.type == constants.CMT_ATTACHMENT_CREATED %]
+Created attachment [% comment.extra_data %]
+[% IF is_bugmail %]
+ --> [% urlbase _ "attachment.cgi?id=" _ comment.extra_data %]
+[% END %]
+[%+ comment.attachment.description %]
+
+[%+ comment.body %]
+[% ELSIF comment.type == constants.CMT_ATTACHMENT_UPDATED %]
+Comment on attachment [% comment.extra_data %]
+[% IF is_bugmail %]
+ --> [% urlbase _ "attachment.cgi?id=" _ comment.extra_data %]
+[% END %]
+[%+ comment.attachment.description %]
+
+[%+ comment.body %]
+[% END %]
diff --git a/template/en/default/bug/knob.html.tmpl b/template/en/default/bug/knob.html.tmpl
new file mode 100644
index 0000000..ac14e6d
--- /dev/null
+++ b/template/en/default/bug/knob.html.tmpl
@@ -0,0 +1,100 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Vaskin Kissoyan <vkissoyan@yahoo.com>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ # Guy Pyrzak <guy.pyrzak@gmail.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+<div id="status">
+ [% PROCESS bug/field.html.tmpl
+ no_tds = 1
+ field = bug_fields.bug_status
+ value = bug.bug_status
+ override_legal_values = bug.choices.bug_status
+ editable = bug.choices.bug_status.size > 1
+ %]
+
+ [% IF bug.resolution
+ OR bug.check_can_change_field('resolution', bug.resolution, 1)
+ %]
+ <noscript><br>resolved&nbsp;as&nbsp;</noscript>
+ [% END %]
+
+ <span id="resolution_settings">
+ [% PROCESS bug/field.html.tmpl
+ no_tds = 1
+ field = bug_fields.resolution
+ value = bug.resolution
+ override_legal_values = bug.choices.resolution
+ editable = bug.check_can_change_field('resolution', bug.resolution, 1)
+ %]
+ </span>
+
+ [% IF bug.check_can_change_field('dup_id', 0, 1) %]
+ <noscript><br> duplicate</noscript>
+ <span id="duplicate_settings">of
+ <span id="dup_id_container" class="bz_default_hidden">
+ [% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]
+ (<a href="#" id="dup_id_edit_action">edit</a>)
+ </span
+ ><input id="dup_id" name="dup_id" size="6"
+ value="[% bug.dup_id FILTER html %]">
+ </span>
+ [% IF bug.dup_id %]
+ <noscript>[% bug.dup_id FILTER bug_link(bug.dup_id) FILTER none %]</noscript>
+ [% END %]
+ <div id="dup_id_discoverable" class="bz_default_hidden">
+ <a href="#" id="dup_id_discoverable_action">Mark as Duplicate</a>
+ </div>
+ [% ELSIF bug.dup_id %]
+ <noscript><br> duplicate</noscript>
+ <span id="duplicate_display">of
+ [% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]</span>
+ [% END %]
+</div>
+
+<script type="text/javascript">
+ var close_status_array = [
+ [% FOREACH status = bug.choices.bug_status %]
+ [% NEXT IF status.is_open %]
+ '[% status.name FILTER js %]'[% ',' UNLESS loop.last %]
+ [% END %]
+ ];
+ YAHOO.util.Dom.removeClass('dup_id_discoverable', 'bz_default_hidden');
+ hideEditableField( "dup_id_container", "dup_id", 'dup_id_edit_action',
+ 'dup_id', '[% bug.dup_id FILTER js %]' )
+ showHideStatusItems( "", ['[% "is_duplicate" IF bug.dup_id %]',
+ '[% bug.bug_status FILTER js %]']);
+ YAHOO.util.Event.addListener( 'bug_status', "change", showHideStatusItems,
+ ['[% "is_duplicate" IF bug.dup_id %]',
+ '[% bug.bug_status FILTER js %]']);
+ YAHOO.util.Event.addListener( 'resolution', "change", showDuplicateItem);
+ YAHOO.util.Event.addListener( 'dup_id_discoverable_action',
+ 'click',
+ setResolutionToDuplicate,
+ '[% Param('duplicate_or_move_bug_status')
+ FILTER js %]');
+ YAHOO.util.Event.addListener( window, 'load', showHideStatusItems,
+ ['[% "is_duplicate" IF bug.dup_id %]',
+ '[% bug.bug_status FILTER js %]'] );
+
+ [% INCLUDE "bug/field-events.js.tmpl" field = select_fields.bug_status %]
+ [% INCLUDE "bug/field-events.js.tmpl" field = select_fields.resolution %]
+</script>
diff --git a/template/en/default/bug/navigate.html.tmpl b/template/en/default/bug/navigate.html.tmpl
new file mode 100644
index 0000000..4a3d063
--- /dev/null
+++ b/template/en/default/bug/navigate.html.tmpl
@@ -0,0 +1,87 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% IF bottom_navigator == 1 %]
+ <ul class="related_actions">
+ <li><a href="show_bug.cgi?format=multiple&amp;id=
+ [% bug.bug_id FILTER url_quote %]">Format For Printing</a></li>
+ <li>&nbsp;-&nbsp;<a href="show_bug.cgi?ctype=xml&amp;id=
+ [% bug.bug_id FILTER url_quote %]">XML</a></li>
+ <li>&nbsp;-&nbsp;<a href="enter_bug.cgi?cloned_bug_id=
+ [% bug.bug_id FILTER url_quote %]">Clone This
+ [% terms.Bug %]</a></li>
+ [%# Links to more things users can do with this bug. %]
+ [% Hook.process("links") %]
+ <li>&nbsp;-&nbsp;<a href="#">Top of page </a></li>
+ </ul>
+[% END %]
+
+
+<div class="navigation">
+[% IF last_bug_list.size > 0 %]
+ [% this_bug_idx = lsearch(last_bug_list, bug.id) %]
+ <b>[% terms.Bug %] List:</b>
+ [% IF this_bug_idx != -1 %]
+ ([% this_bug_idx + 1 %] of [% last_bug_list.size %])
+ [% END %]
+
+ [% IF this_bug_idx != -1 %]
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.first FILTER url_quote %]">First</a>
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.last FILTER url_quote %]">Last</a>
+ [% END %]
+
+ [% IF bug.bug_id %]
+ [% IF this_bug_idx != -1 %]
+ [% IF this_bug_idx > 0 %]
+ [% prev_bug = this_bug_idx - 1 %]
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.$prev_bug FILTER url_quote %]">Prev</a>
+ [% ELSE %]
+ <i><font color="#777777">Prev</font></i>
+ [% END %]
+
+ [% IF this_bug_idx + 1 < last_bug_list.size %]
+ [% next_bug = this_bug_idx + 1 %]
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.$next_bug FILTER url_quote %]">Next</a>
+ [% ELSE %]
+ <i><font color="#777777">Next</font></i>
+ [% END %]
+ [% ELSE %]
+ (This [% terms.bug %] is not in your last search results)
+ [% END %]
+ [% ELSE %]
+ &nbsp;&nbsp;
+ [% END %]
+
+ &nbsp;&nbsp;<a href="buglist.cgi?regetlastlist=1">Show last search results</a>
+[% ELSE %]
+ [%# With no list, don't show link to search results %]
+ <i><font color="#777777">First</font></i>
+ <i><font color="#777777">Last</font></i>
+ <i><font color="#777777">Prev</font></i>
+ <i><font color="#777777">Next</font></i>
+ &nbsp;&nbsp;
+ <i><font color="#777777">No search results available</font></i>
+[% END %]
+</div>
diff --git a/template/en/default/bug/process/bugmail.html.tmpl b/template/en/default/bug/process/bugmail.html.tmpl
new file mode 100644
index 0000000..b0132a2
--- /dev/null
+++ b/template/en/default/bug/process/bugmail.html.tmpl
@@ -0,0 +1,60 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Bradley Baetz <bbaetz@student.usyd.edu.au>
+ # J. Paul Reed <preed@sigkill.com>
+ #%]
+
+[%# INTERFACE:
+ # mailing_bugid: The bug ID that email is being sent for.
+ # sent_bugmail: The results of Bugzilla::BugMail::Send().
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+<dl>
+[% PROCESS emails
+ description = "Email sent to"
+ names = sent_bugmail.sent
+%]
+
+[% PROCESS emails
+ description = "Excluding"
+ names = sent_bugmail.excluded
+%]
+</dl>
+
+[%############################################################################%]
+[%# Block for a set of email addresses #%]
+[%############################################################################%]
+
+[% BLOCK emails %]
+ <dt>[% description FILTER html %]:</dt>
+ <dd>
+ [% IF user.can_see_bug(mailing_bugid) %]
+ [% IF names.size > 0 %]
+ [%+ FOREACH name = names %]
+ <code>[% name FILTER html %]</code>[% ", " UNLESS loop.last() %]
+ [% END %]
+ [% ELSE %]
+ no one
+ [% END %]
+ [% ELSE %]
+ (list of e-mails not available)
+ [% END %]
+ </dd>
+[% END %]
diff --git a/template/en/default/bug/process/confirm-duplicate.html.tmpl b/template/en/default/bug/process/confirm-duplicate.html.tmpl
new file mode 100644
index 0000000..d89c8da
--- /dev/null
+++ b/template/en/default/bug/process/confirm-duplicate.html.tmpl
@@ -0,0 +1,75 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # original_bug_id: number; the bug number for the bug
+ # against which a bug is being duped
+ # duplicate_bug_id: number; the bug number for the bug
+ # being duped
+ # cclist_accessible: boolean; whether or not users on the cc: list
+ # of the original bug can access that bug.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% PROCESS global/header.html.tmpl title="Duplicate Warning" %]
+[% orig_bug = "$terms.bug $original_bug_id"
+ FILTER bug_link(original_bug_id) %]
+
+<p>
+ When marking [% terms.abug %] as a duplicate, the reporter of the duplicate
+ is normally added to the CC list of the original. The permissions
+ on [% orig_bug FILTER none %] (the original) are currently set
+ such that the reporter would not normally be able to see it.
+</p>
+
+<p>
+ <b>Adding the reporter to the CC list of [% orig_bug FILTER none %]
+ [% IF cclist_accessible %]
+ will immediately
+ [% ELSE %]
+ might, in the future,
+ [% END %]
+ allow him/her access to view this [% terms.bug %].</b>
+ Do you wish to do this?
+</p>
+
+<form method="post" action="process_bug.cgi">
+
+[% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %]
+
+<p>
+ <input type="radio" name="confirm_add_duplicate" value="1">
+ Yes, add the reporter to CC list on [% orig_bug FILTER none %]
+</p>
+<p>
+ <input type="radio" name="confirm_add_duplicate" value="0" checked="checked">
+ No, do not add the reporter to CC list on [% orig_bug FILTER none %]
+</p>
+<p>
+ [% "Throw away my changes, and revisit $terms.bug $duplicate_bug_id"
+ FILTER bug_link(duplicate_bug_id) FILTER none %]
+</p>
+<p>
+ <input type="submit" id="process" value="Submit">
+</p>
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/process/header.html.tmpl b/template/en/default/bug/process/header.html.tmpl
new file mode 100644
index 0000000..79f0126
--- /dev/null
+++ b/template/en/default/bug/process/header.html.tmpl
@@ -0,0 +1,46 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # As global/header.html.tmpl.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% USE Bugzilla %]
+
+[% PROCESS "bug/show-header.html.tmpl" %]
+
+[% IF title_tag == "bug_processed" %]
+ [% title = BLOCK %]
+ [% IF Bugzilla.cgi.param('id') %]
+ [% terms.Bug %] [%+ id FILTER html %]
+ [% ELSE %]
+ [% terms.Bugs %]
+ [% END %]
+ processed
+ [% END %]
+[% ELSIF title_tag == "mid_air" %]
+ [% title = "Mid-air collision!" %]
+[% ELSIF title_tag == "change_votes" %]
+ [% title = "Change Votes" %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl %]
diff --git a/template/en/default/bug/process/midair.html.tmpl b/template/en/default/bug/process/midair.html.tmpl
new file mode 100644
index 0000000..34031fc
--- /dev/null
+++ b/template/en/default/bug/process/midair.html.tmpl
@@ -0,0 +1,109 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # operations: array; bug activity since the user last displayed the bug form,
+ # used by bug/activity/table.html.tmpl to display recent changes that will
+ # be overwritten if the user submits these changes. See that template
+ # for further documentation.
+ # start_at: number; the comment at which show/comments.tmpl should begin
+ # displaying comments, either the index of the last comment (if the user
+ # entered a comment along with their change) or a number less than that
+ # (if they didn't), in which case no comments are displayed.
+ # comments: array; all the comments on the bug.
+ # bug: Bugzilla::Bug; the bug being changed.
+ #%]
+
+[%# The global Bugzilla->cgi object is used to obtain form variable values. %]
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% UNLESS header_done %]
+ [% PROCESS bug/process/header.html.tmpl %]
+[% END %]
+
+<h1>Mid-air collision detected!</h1>
+
+<p>
+ Someone else has made changes to
+ [%+ "$terms.bug $bug.id" FILTER bug_link(bug) FILTER none %]
+ at the same time you were trying to.
+ The changes made were:
+</p>
+
+<p>
+ [% PROCESS "bug/activity/table.html.tmpl" incomplete_data=0 %]
+</p>
+
+[% IF comments.size > start_at %]
+<p>
+ Added the comment(s):
+ <blockquote>
+ [% PROCESS "bug/comments.html.tmpl" %]
+ </blockquote>
+</p>
+[% END %]
+
+[% IF cgi.param("comment") %]
+<p>
+ Your comment was:<br>
+ <blockquote><pre class="bz_comment_text">
+ [% cgi.param("comment") FILTER wrap_comment FILTER html %]
+ </pre></blockquote>
+</p>
+[% END %]
+
+<p>
+You have the following choices:
+</p>
+
+<ul>
+ <li>
+ <form method="post" action="process_bug.cgi">
+ <input type="hidden" name="delta_ts"
+ value="[% bug.delta_ts FILTER html %]">
+ [% PROCESS "global/hidden-fields.html.tmpl"
+ exclude="^Bugzilla_login|Bugzilla_password|delta_ts$" %]
+ <input type="submit" id="process" value="Submit my changes anyway">
+ This will cause all of the above changes to be overwritten
+ [% ", except for the added comment(s)" IF comments.size > start_at %].
+ </form>
+ </li>
+ [% IF cgi.param("comment") %]
+ <li>
+ <form method="post" action="process_bug.cgi">
+ <input type="hidden" name="id" value="[% cgi.param("id") FILTER html %]">
+ <input type="hidden" name="delta_ts" value="[% bug.delta_ts FILTER html %]">
+ <input type="hidden" name="comment" value="[% cgi.param("comment") FILTER html %]">
+ <input type="hidden" name="commentprivacy" value="[% cgi.param("commentprivacy") FILTER html %]">
+ <input type="hidden" name="token" value="[% cgi.param("token") FILTER html %]">
+ <input type="submit" id="process_comment" value="Submit only my new comment">
+ </form>
+ </li>
+ [% END %]
+ <li>
+ Throw away my changes, and
+ [%+ "revisit $terms.bug $bug.id" FILTER bug_link(bug) FILTER none %]
+ </li>
+</ul>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/process/results.html.tmpl b/template/en/default/bug/process/results.html.tmpl
new file mode 100644
index 0000000..ee218d4
--- /dev/null
+++ b/template/en/default/bug/process/results.html.tmpl
@@ -0,0 +1,58 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # id: number; the ID of the bug that was changed/checked.
+ #
+ # type: string; the type of change/check that was made: "bug" when a bug
+ # is changed, "dupe" when a duplication notation is added to a bug,
+ # and "dep" when a bug is checked for changes to its dependencies.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% UNLESS header_done %]
+ [% PROCESS bug/process/header.html.tmpl %]
+[% END %]
+
+[% DEFAULT type="bug" %]
+
+[% Link = BLOCK %][% "$terms.Bug $id" FILTER bug_link(id) %][% END %]
+[% link = BLOCK %][% "$terms.bug $id" FILTER bug_link(id) %][% END %]
+
+[%
+ title = {
+ 'bug' => "Changes submitted for $link" ,
+ 'dupe' => "Duplicate notation added to $link" ,
+ 'dep' => "Checking for dependency changes on $link" ,
+ 'votes' => "$Link confirmed by number of votes" ,
+ 'created' => "$Link has been added to the database" ,
+ 'move' => "$Link has been moved to another database" ,
+ }
+%]
+
+<dl>
+ <dt>[% title.$type %]</dt>
+ <dd>
+ [% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = id %]
+ [%# Links to more information about the changed bug. %]
+ [% Hook.process("links") %]
+ </dd>
+</dl>
diff --git a/template/en/default/bug/process/verify-new-product.html.tmpl b/template/en/default/bug/process/verify-new-product.html.tmpl
new file mode 100644
index 0000000..1cc186c
--- /dev/null
+++ b/template/en/default/bug/process/verify-new-product.html.tmpl
@@ -0,0 +1,205 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # product: object; the new product.
+ # versions: array; versions for the new product.
+ # components: array; components for the new product.
+ # milestones: array; milestones for the new product.
+ # defaults: hash; keys are names of fields, values are defaults for
+ # those fields
+ #
+ # verify_bug_groups: If groups need to be confirmed in addition to fields.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = 'Verify New Product Details...' %]
+
+<form action="process_bug.cgi" method="post">
+
+[% SET exclude_items = ['version', 'component', 'target_milestone'] %]
+[% IF verify_bug_groups %]
+ [% exclude_items.push('bit-\d+') %]
+[% END %]
+[% Hook.process('exclude') %]
+
+[% PROCESS "global/hidden-fields.html.tmpl"
+ exclude = '^' _ exclude_items.join('|') _ '$' %]
+
+<input type="hidden" name="confirm_product_change" value="1">
+
+[%# Verify the version, component, and target milestone fields. %]
+<h3>Verify Version, Component
+ [%- ", Target Milestone"
+ IF Param("usetargetmilestone")
+ && bug.check_can_change_field('target_milestone', 0, 1) %]</h3>
+
+<p>
+[% IF Param("usetargetmilestone")
+ && bug.check_can_change_field('target_milestone', 0, 1)
+%]
+ You are moving the [% terms.bug %](s) to the product
+ <b>[% product.name FILTER html %]</b>,
+ and the version, component, and/or target milestone fields are no longer
+ correct. Please set the correct version, component, and target milestone now:
+[% ELSE %]
+ You are moving the [% terms.bug %](s) to the product
+ <b>[% product.name FILTER html %]</b>,
+ and the version and component fields are no longer correct.
+ Please set the correct version and component now:
+[% END %]
+</p>
+
+<table>
+ <tr>
+ <td>
+ <b>Version:</b><br>
+ [% IF versions.size == 1 %]
+ [% SET default_version = versions.0 %]
+ [% ELSE %]
+ [% SET default_version = defaults.version %]
+ [% END %]
+ [% PROCESS "global/select-menu.html.tmpl"
+ name="version"
+ options=versions
+ default=default_version
+ size=10 %]
+ </td>
+ <td>
+ <b>Component:</b><br>
+ [% IF components.size == 1 %]
+ [% SET default_component = components.0 %]
+ [% ELSE %]
+ [% SET default_component = defaults.component %]
+ [% END %]
+ [% PROCESS "global/select-menu.html.tmpl"
+ name="component"
+ options=components
+ default=default_component
+ size=10 %]
+ </td>
+ [% IF Param("usetargetmilestone")
+ && bug.check_can_change_field('target_milestone', 0, 1)
+ %]
+ <td>
+ <b>Target Milestone:</b><br>
+ [% PROCESS "global/select-menu.html.tmpl"
+ name="target_milestone"
+ options=milestones
+ default=defaults.milestone
+ size=10 %]
+ </td>
+ [% END %]
+ [% Hook.process('field') %]
+ </tr>
+</table>
+
+[% IF verify_bug_groups %]
+ <h3>Verify [% terms.Bug %] Group</h3>
+
+ [% IF old_groups.size %]
+ <p>These groups are not legal for the '[% product.name FILTER html %]'
+ product or you are not allowed to restrict [% terms.bugs %] to these groups.
+ [%+ terms.Bugs %] will no longer be restricted to these groups and may become
+ public if no other group applies:<br>
+ [% FOREACH group = old_groups %]
+ <input type="checkbox" id="bit-[% group.id FILTER html %]"
+ name="bit-[% group.id FILTER html %]" disabled="disabled" value="1">
+ <label for="bit-[% group.id FILTER html %]">
+ [% group.name FILTER html %]: [% group.description FILTER html %]
+ </label>
+ <br>
+ [% END %]
+ </p>
+ [% END %]
+
+ [% mandatory_groups = [] %]
+ [% optional_groups = [] %]
+
+ [% FOREACH gid = product.group_controls.keys %]
+ [% group = product.group_controls.$gid %]
+ [% NEXT UNLESS group.group.is_active %]
+
+ [% IF group.membercontrol == constants.CONTROLMAPMANDATORY
+ || (group.othercontrol == constants.CONTROLMAPMANDATORY && !user.in_group(group.group.name)) %]
+ [% mandatory_groups.push(group) %]
+ [% ELSIF (group.membercontrol != constants.CONTROLMAPNA && user.in_group(group.group.name))
+ || group.othercontrol != constants.CONTROLMAPNA %]
+ [% optional_groups.push(group) %]
+ [% END %]
+ [% END %]
+
+ [% IF optional_groups.size %]
+ <p>These groups are optional. You can decide to restrict [% terms.bugs %] to
+ one or more of the following groups:<br>
+ [% FOREACH group = optional_groups %]
+ <input type="hidden" name="defined_bit-[% group.group.id FILTER html %]"
+ value="1">
+ <input type="checkbox" id="bit-[% group.group.id FILTER html %]"
+ name="bit-[% group.group.id FILTER html %]"
+ [%+ ((group.membercontrol == constants.CONTROLMAPDEFAULT && user.in_group(group.group.name))
+ || (group.othercontrol == constants.CONTROLMAPDEFAULT && !user.in_group(group.group.name))
+ || cgi.param("bit-$group.group.id") == 1) ?
+ 'checked="checked"' : ''
+ %] value="1">
+ <label for="bit-[% group.group.id FILTER html %]">
+ [% group.group.name FILTER html %]: [% group.group.description FILTER html %]
+ </label>
+ <br>
+ [% END %]
+ </p>
+ [% END %]
+
+ [% IF mandatory_groups.size %]
+ <p>These groups are mandatory and [% terms.bugs %] will be automatically
+ restricted to these groups:<br>
+ [% FOREACH group = mandatory_groups %]
+ <input type="checkbox" id="bit-[% group.group.id FILTER html %]" checked="checked"
+ name="bit-[% group.group.id FILTER html %]" value="1" disabled="disabled">
+ <label for="bit-[% group.group.id FILTER html %]">
+ [% group.group.name FILTER html %]: [% group.group.description FILTER html %]
+ </label>
+ <br>
+ [% END %]
+ </p>
+ [% END %]
+[% END %]
+
+<input type="submit" id="change_product" value="Commit">
+
+</form>
+<hr>
+
+[%# If 'id' is defined, then we are editing a single bug.
+ # Else we are editing several bugs at once. %]
+
+[% IF cgi.param('id') AND cgi.param('id').match('^\d+$') %]
+ [% id = cgi.param('id') %]
+ Cancel and Return to [% "$terms.bug $id" FILTER bug_link(id) FILTER none %]
+[% ELSE %]
+ Cancel and Return to <a href="buglist.cgi?regetlastlist=1">the last search results</a>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
+
diff --git a/template/en/default/bug/show-header.html.tmpl b/template/en/default/bug/show-header.html.tmpl
new file mode 100644
index 0000000..3f81e57
--- /dev/null
+++ b/template/en/default/bug/show-header.html.tmpl
@@ -0,0 +1,50 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Vaskin Kissoyan <vkissoyan@yahoo.com>
+ # Bradley Baetz <bbaetz@student.usyd.edu.au>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# This template should be called with PROCESS before processing
+ # "global/header.html.tmpl" in any template that is going to load the
+ # bug form. It expects only a "bug" object, and can even manage to get
+ # along without that. Some of these variables are just defaults that will
+ # be overridden by the calling templates.
+ #%]
+
+[% filtered_desc = bug.short_desc FILTER html %]
+[% subheader = filtered_desc %]
+[% filtered_timestamp = bug.delta_ts FILTER time %]
+[% title = "$terms.Bug $bug.bug_id &ndash; $filtered_desc" %]
+[% header = "$terms.Bug&nbsp;$bug.bug_id" %]
+[% header_addl_info = "Last modified: $filtered_timestamp" %]
+[% javascript_urls = [ "js/util.js", "js/field.js", "js/yui/calendar.js" ] %]
+[% style_urls = [ "skins/standard/yui/calendar.css",
+ "skins/standard/show_bug.css" ] %]
+[% doc_section = "bug_page.html" %]
+
+[% bodyclasses = ['bz_bug',
+ "bz_status_$bug.bug_status",
+ "bz_product_$bug.product",
+ "bz_component_$bug.component",
+ "bz_bug_$bug.bug_id",
+ ] %]
+[% FOREACH group = bug.groups_in %]
+ [% bodyclasses.push("bz_group_$group.name") %]
+[% END %]
diff --git a/template/en/default/bug/show-multiple.html.tmpl b/template/en/default/bug/show-multiple.html.tmpl
new file mode 100644
index 0000000..177bea1
--- /dev/null
+++ b/template/en/default/bug/show-multiple.html.tmpl
@@ -0,0 +1,366 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Terry Weissman <terry@mozilla.org>
+ # Gervase Markham <gerv@gerv.net>
+ # Toms Baugis <toms@myrealbox.com>
+ # Olav Vitters <olav@bkor.dhs.org>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Elliotte Martin <emartin@everythingsolved.com>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Full Text $terms.Bug Listing"
+ h1 = ""
+ style_urls = ["skins/standard/show_multiple.css",
+ "skins/standard/buglist.css"]
+ doc_section = "bug_page.html"
+%]
+[% PROCESS bug/time.html.tmpl %]
+[% IF bugs.first %]
+ [% ids = [] %]
+ [% FOREACH bug = bugs %]
+ [% PROCESS bug_display %]
+ [% ids.push(bug.bug_id) UNLESS bug.error %]
+ [% END %]
+ [% IF ids.size > 1 %]
+ <div class="bz_query_buttons">
+ <form method="post" action="buglist.cgi">
+ <input type="hidden" name="bug_id" value="[% ids.join(",") FILTER html %]">
+ <input type="submit" id="short_format" value="Short Format">
+ </form>
+ </div>
+ [% END %]
+[% ELSE %]
+ <p>
+ You'd have more luck if you gave me some [% terms.bug %] numbers.
+ </p>
+[% END %]
+
+
+[% PROCESS global/footer.html.tmpl %]
+
+
+[%###########################################################################%]
+[%# Block for an individual bug #%]
+[%###########################################################################%]
+
+[% BLOCK bug_display %]
+ <h1>
+ [% terms.Bug %]
+ <a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]">[% bug.bug_id FILTER html %]</a>
+ [% IF Param("usebugaliases") AND bug.alias AND NOT bug.error %]
+ (<a href="show_bug.cgi?id=[% bug.alias FILTER url_quote %]">
+ [% bug.alias FILTER html %]</a>)
+ [% END %]
+ </h1>
+
+ <table class="bugfields">
+ [% IF bug.error %]
+ <tr>
+ <td class="error">
+ [% IF bug.error == "InvalidBugId" %]
+ '[%+ bug.bug_id FILTER html %]' is not a valid [% terms.bug %] number
+ [%- IF Param("usebugaliases") %] nor a known [% terms.bug %] alias[% END %].
+ [% ELSIF bug.error == "NotPermitted" %]
+ You are not allowed to view this [% terms.bug %].
+ [% ELSIF bug.error == "NotFound" %]
+ This [% terms.bug %] cannot be found.
+ [% ELSE %]
+ [%+ bug.error FILTER html %]
+ [% END %]
+ </td>
+ </tr>
+ [% ELSE %]
+ [%# The rightcell block (also called by the row block) automatically shows
+ # the fields from rightcells %]
+ [% rightcells = ['reporter', 'assigned_to'] %]
+ [% IF Param('useqacontact') %]
+ [% rightcells.push('qa_contact') %]
+ [% END %]
+ [% rightcells.push('') %]
+ [% IF bug.cc %]
+ [% rightcells.push('cc') %]
+ [% END %]
+ [% IF bug.keywords %]
+ [% rightcells.push('keywords') %]
+ [% END %]
+
+ [%# Determine if the bug has a flag %]
+ [% FOREACH type = bug.flag_types %]
+ [% IF type.flags.size %]
+ [% rightcells.push('flags') %]
+ [% LAST %]
+ [% END %]
+ [% END %]
+
+ [% PROCESS row cell = "short_desc" fullrow = 1 %]
+
+ <tr>
+ <th>[% field_descs.product FILTER html %]:</th>
+ <td>
+ [% IF Param("useclassification") && bug.classification_id != 1 %]
+ [[% bug.classification FILTER html %]]&nbsp;
+ [% END %]
+ [% bug.product FILTER html %]
+ </td>
+
+ [% PROCESS rightcell %]
+ </tr>
+
+ [% PROCESS row cell = "component" %]
+
+ <tr>
+ <th>[% field_descs.bug_status FILTER html %]:</th>
+ <td>
+ [% display_value("bug_status", bug.bug_status) FILTER html %]
+ [%+ display_value("resolution", bug.resolution) FILTER html %]
+ </td>
+
+ [% PROCESS rightcell %]
+ </tr>
+
+ <tr>
+ <th>[% field_descs.bug_severity FILTER html %]:</th>
+ <td class="bz_[% bug.bug_severity FILTER css_class_quote -%]">
+ [% display_value("bug_severity", bug.bug_severity) FILTER html %]
+ </td>
+
+ [% PROCESS rightcell %]
+ </tr>
+
+ <tr>
+ <th>[% field_descs.priority FILTER html %]:</th>
+ <td class="bz_[% bug.priority FILTER css_class_quote -%]">
+ [% bug.priority FILTER html %]
+ </td>
+
+ [% PROCESS rightcell %]
+ </tr>
+
+ [% PROCESS row cell = "version" %]
+ [% PROCESS row cell = "target_milestone" IF Param('usetargetmilestone') %]
+ [% PROCESS row cell = "rep_platform" %]
+ [% PROCESS row cell = "op_sys" %]
+
+ [% IF bug.bug_file_loc %]
+ <tr>
+ <th>[% field_descs.bug_file_loc FILTER html %]:</th>
+ <td colspan="3">
+ [% IF bug.bug_file_loc.match("^(javascript|data)") %]
+ [% bug.bug_file_loc FILTER html %]
+ [% ELSE %]
+ <a href="[% bug.bug_file_loc FILTER html %]">
+ [% bug.bug_file_loc FILTER html %]</a>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+
+ [% IF Param("usestatuswhiteboard") %]
+ [% PROCESS row cell = "status_whiteboard" fullrow = 1 %]
+ [% END %]
+
+ [% USE Bugzilla %]
+ [% field_counter = 0 %]
+ [% FOREACH field = Bugzilla.active_custom_fields %]
+ [% field_counter = field_counter + 1 %]
+ [%# Odd-numbered fields get an opening <tr> %]
+ [% '<tr>' IF field_counter % 2 %]
+ [% PROCESS bug/field.html.tmpl value=bug.${field.name} editable=0 %]
+ [%# Even-numbered fields get a closing <tr> %]
+ [% '</tr>' IF !(field_counter % 2) %]
+ [% END %]
+ [%# And we have to finish the row if we ended on an odd number. %]
+ [% '<th></th><td></td></tr>' IF field_counter % 2 %]
+
+ [% IF (bug.dependson.size || bug.blocked.size) %]
+ [% PROCESS dependencies name = "dependson" %]
+ [% PROCESS dependencies name = "blocked" %]
+ [% END %]
+
+ [% IF user.is_timetracker %]
+ <tr>
+ <th>Time tracking:</th>
+ <td colspan="3">
+ <table class="timetracking">
+ <tr>
+ <th>[% field_descs.estimated_time FILTER html %]</th>
+ <th>[% field_descs.actual_time FILTER html %]</th>
+ <th>[% field_descs.work_time FILTER html %]</th>
+ <th>[% field_descs.remaining_time FILTER html %]</th>
+ <th>[% field_descs.percentage_complete FILTER html %]</th>
+ <th>Gain</th>
+ </tr>
+ <tr>
+ <td>
+ [% PROCESS formattimeunit time_unit = bug.estimated_time %]
+ </td>
+ <td>
+ [% PROCESS formattimeunit
+ time_unit=(bug.remaining_time + bug.actual_time) %]
+ </td>
+ <td>[% PROCESS formattimeunit time_unit = bug.actual_time %]</td>
+ <td>
+ [% PROCESS formattimeunit time_unit = bug.remaining_time %]
+ </td>
+ <td>
+ [% PROCESS calculatepercentage act = bug.actual_time
+ rem = bug.remaining_time %]
+ </td>
+ <td>
+ [% PROCESS formattimeunit
+ time_unit=bug.estimated_time -
+ (bug.actual_time + bug.remaining_time) %]
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ [% PROCESS row cell="deadline" %]
+ [% END %]
+
+ [% IF bug.attachments.size %]
+ <tr>
+ <th>Attachments:</th>
+ <td colspan="3">
+ [% IF bug.show_attachment_flags %]
+ <table>
+ <tr>
+ <th>Description</th>
+ <th>Flags</th>
+ </tr>
+ [% FOREACH attachment = bug.attachments %]
+ <tr>
+ <td>
+ <a href="attachment.cgi?id=[% attachment.id %]">
+ [% attachment.description FILTER html %]
+ </a>[% "<br>" IF not loop.last() %]
+ </td>
+ <td>
+ [% IF attachment.flags.size == 0 %]
+ <i>none</i>
+ [% ELSE %]
+ [% FOREACH flag = attachment.flags %]
+ [% flag.setter.nick FILTER html %]:
+ [%+ flag.type.name FILTER html FILTER no_break %][% flag.status %]
+ [% IF flag.status == "?" && flag.requestee %]
+ ([% flag.requestee.nick FILTER html %])
+ [% END %][% ", " IF not loop.last() %]
+ [% END %]
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+ </table>
+ [% ELSE %]
+ [% FOREACH attachment = bug.attachments %]
+ <a href="attachment.cgi?id=[% attachment.id %]">
+ [% attachment.description FILTER html %]
+ </a>[% "<br>" IF not loop.last() %]
+ [% END %]
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+ [% END %]
+
+ [% Hook.process("last_row", "bug/show-multiple.html.tmpl") %]
+
+ </table>
+
+
+ <br>
+
+ [% PROCESS bug/comments.html.tmpl
+ comments = bug.comments %]
+
+[% END %]
+
+
+[%###########################################################################%]
+[%# Block for standard table rows #%]
+[%###########################################################################%]
+
+[% BLOCK row %]
+ <tr>
+ <th>[% field_descs.${cell} FILTER html %]:</th>
+ <td[% " colspan=3" IF fullrow %]>[% display_value(cell, bug.${cell}) FILTER html %]</td>
+ [% PROCESS rightcell IF !fullrow %]
+ </tr>
+ [% fullrow = 0 %]
+[% END %]
+
+
+[%############################################################################%]
+[%# Block for dependencies #%]
+[%############################################################################%]
+
+[% BLOCK dependencies %]
+ <tr>
+ <th>[% terms.Bug %] [%+ field_descs.${name} FILTER html %]:</th>
+ <td>
+ [% FOREACH depbug = bug.${name} %]
+ [% depbug FILTER bug_link(depbug) FILTER none %][% ", " IF not loop.last() %]
+ [% END %]
+ </td>
+
+ [% PROCESS rightcell %]
+ </tr>
+[% END %]
+
+[%############################################################################%]
+[%# Block for cells shown right of the table #%]
+[%############################################################################%]
+
+[% BLOCK rightcell %]
+ [% IF rightcells %]
+ [% name = rightcells.shift %]
+ [% IF name == "cc" %]
+ <th class="rightcell">[% field_descs.cc FILTER html %]:</th>
+ <td>
+ [% FOREACH c = bug.cc %]
+ [% c FILTER email FILTER html %][% ", " IF not loop.last() %]
+ [% END %]
+ [% ELSIF name == "reporter" || name == "assigned_to"
+ || name == "qa_contact" %]
+ <th class="rightcell">[% field_descs.${name} FILTER html %]:</th>
+ <td>[% bug.${name}.identity FILTER email FILTER html %]</td>
+ [% ELSIF name == "flags" %]
+ <th class="rightcell">Flags:</th>
+ <td>
+ [% FOREACH type = bug.flag_types %]
+ [% FOREACH flag = type.flags %]
+ [% flag.setter.nick FILTER html %]:
+ [%+ flag.type.name FILTER html FILTER no_break %][% flag.status %]
+ [%+ IF flag.status == "?" && flag.requestee %]
+ ([% flag.requestee.nick FILTER html %])
+ [% END %]<br>
+ [% END %]
+ [% END %]
+ </td>
+ [% ELSIF name != "" %]
+ <th class="rightcell">[% field_descs.${name} FILTER html %]:</th>
+ <td>[% display_value(name, bug.${name}) FILTER html %]</td>
+ [% ELSE %]
+ <td>&nbsp;</td>
+ <td>&nbsp;</td>
+ [% END %]
+ [% END %]
+[% END %]
diff --git a/template/en/default/bug/show.html.tmpl b/template/en/default/bug/show.html.tmpl
new file mode 100644
index 0000000..8d8e63a
--- /dev/null
+++ b/template/en/default/bug/show.html.tmpl
@@ -0,0 +1,53 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Vaskin Kissoyan <vkissoyan@yahoo.com>
+ # Bradley Baetz <bbaetz@student.usyd.edu.au>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[%# This script/template only handles one bug #%]
+[% bug = bugs.0 %]
+
+[% IF !header_done %]
+ [% PROCESS "bug/show-header.html.tmpl" %]
+ [% PROCESS global/header.html.tmpl %]
+[% END %]
+
+[% IF nextbug %]
+ <hr>
+ <p>
+ The next [% terms.bug %] in your list is [% terms.bug %]
+ <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>:
+ </p>
+ <hr>
+[% END %]
+
+[% PROCESS bug/navigate.html.tmpl %]
+
+[% PROCESS bug/edit.html.tmpl %]
+
+<hr>
+
+[% PROCESS bug/navigate.html.tmpl bottom_navigator => 1%]
+
+<br>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/show.xml.tmpl b/template/en/default/bug/show.xml.tmpl
new file mode 100644
index 0000000..2349602
--- /dev/null
+++ b/template/en/default/bug/show.xml.tmpl
@@ -0,0 +1,157 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Bradley Baetz <bbaetz@student.usyd.edu.au>
+ # Colin Ogilvie <mozilla@colinogilvie.co.uk>
+ #
+ #%]
+[% PROCESS bug/time.html.tmpl %]
+<?xml version="1.0" [% IF Param('utf8') %]encoding="UTF-8" [% END %]standalone="yes" ?>
+<!DOCTYPE bugzilla SYSTEM "[% urlbase FILTER html %]bugzilla.dtd">
+
+<bugzilla version="[% constants.BUGZILLA_VERSION %]"
+ urlbase="[% urlbase FILTER xml %]"
+ [%# Note that the maintainer's email is not filtered,
+ # intentionally. Even logged-out users should be able
+ # to see that, since it will be in error messages anyway.
+ %]
+ maintainer="[% Param('maintainer') FILTER xml %]"
+[% IF user.id %]
+ exporter="[% user.email FILTER email FILTER xml %]"
+[% END %]
+>
+
+[% FOREACH bug = bugs %]
+ [% IF bug.error %]
+ <bug error="[% bug.error FILTER xml %]">
+ <bug_id>[% bug.bug_id FILTER xml %]</bug_id>
+ </bug>
+ [% ELSE %]
+ <bug>
+ [% FOREACH field = bug.fields %]
+ [% IF displayfields.$field %]
+ [%+ PROCESS bug_field %]
+ [% END %]
+ [% END %]
+
+ [%# This is here so automated clients can still use process_bug.cgi %]
+ [% IF displayfields.token && user.id %]
+ <token>[% issue_hash_token([bug.id, bug.delta_ts]) FILTER xml %]</token>
+ [% END %]
+
+ [%# Now handle 'special' fields #%]
+ [% IF displayfields.group %]
+ [% FOREACH g = bug.groups %]
+ [% NEXT UNLESS g.ison %]
+ <group id="[% g.bit FILTER xml %]">[% g.name FILTER xml %]</group>
+ [% END %]
+ [% END %]
+
+ [%# Bug Flags %]
+ [% PROCESS section_flags obj => bug %]
+
+ [% IF displayfields.long_desc %]
+ [% FOREACH c = bug.comments %]
+ [% NEXT IF c.is_private && !user.is_insider %]
+ <long_desc isprivate="[% c.is_private FILTER xml %]">
+ <commentid>[% c.id FILTER xml %]</commentid>
+ [% IF c.is_about_attachment %]
+ <attachid>[% c.extra_data FILTER xml %]</attachid>
+ [% END %]
+ <who name="[% c.author.name FILTER xml %]">[% c.author.email FILTER email FILTER xml %]</who>
+ <bug_when>[% c.creation_ts FILTER time("%Y-%m-%d %T %z") FILTER xml %]</bug_when>
+ [% IF user.is_timetracker && (c.work_time - 0 != 0) %]
+ <work_time>[% PROCESS formattimeunit time_unit = c.work_time FILTER xml %]</work_time>
+ [% END %]
+ <thetext>[% c.body_full FILTER xml %]</thetext>
+ </long_desc>
+ [% END %]
+ [% END %]
+
+ [% IF displayfields.attachment %]
+ [% FOREACH a = bug.attachments %]
+ [% NEXT IF a.isprivate && !user.is_insider %]
+ <attachment
+ isobsolete="[% a.isobsolete FILTER xml %]"
+ ispatch="[% a.ispatch FILTER xml %]"
+ isprivate="[% a.isprivate FILTER xml %]"
+ isurl="[% a.isurl FILTER xml %]"
+ >
+ <attachid>[% a.id %]</attachid>
+ <date>[% a.attached FILTER time("%Y-%m-%d %T %z") FILTER xml %]</date>
+ <delta_ts>[% a.modification_time FILTER time("%Y-%m-%d %T %z") FILTER xml %]</delta_ts>
+ <desc>[% a.description FILTER xml %]</desc>
+ <filename>[% a.filename FILTER xml %]</filename>
+ <type>[% a.contenttype FILTER xml %]</type>
+ <size>[% a.datasize FILTER xml %]</size>
+ <attacher>[% a.attacher.email FILTER email FILTER xml %]</attacher>
+ [%# This is here so automated clients can still use attachment.cgi %]
+ [% IF displayfields.token && user.id %]
+ <token>[% issue_hash_token([a.id, a.modification_time]) FILTER xml %]</token>
+ [% END %]
+ [% IF displayfields.attachmentdata %]
+ <data encoding="base64">[% a.data FILTER base64 %]</data>
+ [% END %]
+
+ [% PROCESS section_flags obj => a %]
+ </attachment>
+ [% END %]
+ [% END %]
+
+ [% Hook.process("bug_end") %]
+
+ </bug>
+ [% END %]
+[% END %]
+
+</bugzilla>
+
+[% BLOCK bug_field %]
+ [% FOREACH val = bug.$field %]
+ [%# We need to handle some fields differently. This should become
+ # nicer once we have custfields, and a type attribute for the fields
+ #%]
+ [% name = '' %]
+ [% IF field == 'reporter' OR field == 'assigned_to' OR
+ field == 'qa_contact' %]
+ [% name = val.name %]
+ [% val = val.email FILTER email %]
+ [% ELSIF field == 'cc' %]
+ [% val = val FILTER email %]
+ [% ELSIF field == 'creation_ts' OR field == 'delta_ts' %]
+ [% val = val FILTER time("%Y-%m-%d %T %z") %]
+ [% END %]
+ <[% field %][% IF name != '' %] name="[% name FILTER xml %]"[% END -%]>
+ [%- val FILTER xml %]</[% field %]>
+ [% END %]
+[% END %]
+
+[% BLOCK section_flags %]
+ [% RETURN UNLESS displayfields.flag %]
+
+ [% FOREACH flag = obj.flags %]
+ <flag name="[% flag.type.name FILTER xml %]"
+ id="[% flag.id FILTER xml %]"
+ type_id="[% flag.type_id FILTER xml %]"
+ status="[% flag.status FILTER xml %]"
+ setter="[% flag.setter.email FILTER email FILTER xml %]"
+ [% IF flag.status == "?" && flag.requestee %]
+ requestee="[% flag.requestee.email FILTER email FILTER xml %]"
+ [% END %]
+ />
+ [% END %]
+[% END %]
diff --git a/template/en/default/bug/summarize-time.html.tmpl b/template/en/default/bug/summarize-time.html.tmpl
new file mode 100644
index 0000000..eb5ba7a
--- /dev/null
+++ b/template/en/default/bug/summarize-time.html.tmpl
@@ -0,0 +1,335 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Christian Reis <kiko@async.com.br>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% title = "Time Summary " %]
+[% IF do_depends %]
+ [% title = title _ "for " %]
+ [% header = "$terms.Bug $ids.0" FILTER bug_link(ids.0) FILTER none %]
+ [% header = title _ header _ " (and $terms.bugs blocking it)" %]
+ [% title = title _ "$terms.Bug $ids.0" %]
+[% ELSE %]
+ [% title = title _ "($ids.size $terms.bugs selected)" %]
+ [% header = title %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ header = header
+ style_urls = ["skins/standard/summarize-time.css"]
+ doc_section = "timetracking.html"
+ %]
+
+[% INCLUDE query_form %]
+
+[% IF do_report %]
+
+ [% global.grand_total = 0 global.estimated = 0 global.remaining = 0 %]
+
+ [% FOREACH workdata = part_list %]
+ [%# parts contains date ranges (from, to). %]
+ [% part = parts.shift %]
+ <div align="right">
+ <h4 style="padding-right: 2em; margin: 0;">
+ [% IF part.0 or part.1 %]
+ [% part.0 OR "Up" FILTER html %] to [% part.1 OR "now" FILTER html %]
+ [% ELSE %]
+ Full summary (no period specified)
+ [% END %]
+ </h4>
+ </div>
+ [% IF group_by == "number" %]
+ [% INCLUDE number_report %]
+ [% ELSE %]
+ [% INCLUDE owner_report %]
+ [% END %]
+ [% END %]
+
+ [% IF detailed %]
+ <h4 style="margin: 0">
+ Total of [% global.remaining FILTER format("%.2f") %]h remains from
+ original estimate of [% global.estimated FILTER format("%.2f") %]h
+ [% IF global.deadline %]
+ (deadline [% global.deadline FILTER html %])
+ [% END %]
+ </h4>
+ [% END %]
+
+ [% IF monthly %]
+ <h4 style="margin: 0">Total of [% global.grand_total FILTER format("%.2f") %] hours worked</h4>
+ <hr noshade size="1">
+ [% END %]
+
+ [% IF null.size > 0 %]
+ [% INCLUDE inactive_report %]
+ <h4 style="margin: 0">Total of [% null.size %] inactive [% terms.bugs %]</h4>
+ [% END %]
+
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%#
+ #
+ # Developer reporting
+ #
+ #%]
+
+[% BLOCK owner_report %]
+ [% global.total = 0 global.bug_count = {} global.owner_count = {} %]
+ <table cellpadding="4" cellspacing="0" width="90%" class="realitems owner">
+ [% FOREACH owner = workdata.keys.sort %]
+ [% INCLUDE do_one_owner owner=owner ownerdata=workdata.$owner
+ detailed=detailed %]
+ [% END %]
+
+ [% additional = "$global.owner_count.size developers @
+ $global.bug_count.size $terms.bugs" %]
+ [% INCLUDE section_total colspan=3 additional=additional %]
+ </table>
+[% END %]
+
+[% BLOCK do_one_owner %]
+ [% global.owner_count.$owner = 1 %]
+ <tr><td colspan="5" class="owner_header">
+ <b>[% owner FILTER html %]</b>
+ </td></tr>
+ [% col = 0 subtotal = 0%]
+ [% FOREACH bugdata=ownerdata.nsort("bug_id") %]
+ [% bug_id = bugdata.bug_id %]
+ [% INCLUDE calc_bug_total id=bug_id %]
+ [% global.bug_count.$bug_id = 1 %]
+ [% IF detailed %]
+ [% INCLUDE bug_header cid=col id=bug_id bugdata=bugdata extra=1 %]
+ [% col = col + 1 %]
+ [% END %]
+ [% subtotal = subtotal + bugdata.total_time %]
+ [% END %]
+ <tr>
+ <td colspan="4" align="right"><b>Total</b>:</td>
+ <td align="right" class="subtotal" width="100">
+ <b>[% subtotal FILTER format("%.2f") %]</b></td>
+ [% global.total = global.total + subtotal %]
+ </tr>
+[% END %]
+
+[%#
+ #
+ # Bug Number reporting
+ #
+ #%]
+
+[% BLOCK number_report %]
+ [% global.total = 0 global.owner_count = {} global.bug_count = {} %]
+
+ <table cellpadding="4" cellspacing="0" width="90%" class="realitems number">
+ [% FOREACH bug = workdata.keys.nsort %]
+ [% INCLUDE do_one_bug id=bug bugdata=workdata.$bug
+ detailed=detailed %]
+ [% END %]
+
+ [% additional = "$global.bug_count.size $terms.bugs &
+ $global.owner_count.size developers" %]
+ [% INCLUDE section_total additional=additional colspan=2 %]
+ </table>
+[% END %]
+
+[% BLOCK do_one_bug %]
+ [% subtotal = 0.00 cid = 0 %]
+ [% INCLUDE calc_bug_total id=id %]
+ [% global.bug_count.$id = 1 %]
+ [% INCLUDE bug_header id=id %]
+
+ [% FOREACH owner = bugdata.sort("login_name") %]
+ [% work_time = owner.total_time %]
+ [% subtotal = subtotal + work_time %]
+ [% login_name = owner.login_name %]
+ [% global.owner_count.$login_name = 1 %]
+ [% IF detailed %]
+ [% cid = cid + 1 %]
+ <tr class="owner_header[% 2 FILTER none IF cid % 2 %]">
+ <td>&nbsp;</td>
+ <td colspan="2"><b>[% login_name FILTER html %]</b></td>
+ <td align="right">
+ [% work_time FILTER format("%.2f") %]</td>
+ </tr>
+ [% END %]
+ [% END %]
+ <tr>
+ <td colspan="2">&nbsp;</td>
+ <td align="right">
+ <b>Total</b>:
+ </td>
+ <td align="right" class="subtotal" width="100">
+ <b>[% subtotal FILTER format("%.2f") %]</b>
+ </td>
+ </tr>
+ [% global.total = global.total + subtotal %]
+[% END %]
+
+[% BLOCK bug_header %]
+ <tr class="bug_header[% '2' IF cid % 2 %]">
+ <td width="80" valign="top">
+ <b>[% "$terms.Bug $id" FILTER bug_link(id) FILTER none %]</b>
+ </td>
+ <td width="100"><b>[% display_value("bug_status", bugs.$id.bug_status) FILTER html %]</b></td>
+ <td colspan="2">[% bugs.$id.short_desc FILTER html %]</td>
+ [% IF extra %]
+ <td align="right" valign="top">[% bugdata.total_time FILTER html %]</td>
+ [% END %]
+ </tr>
+ [% IF detailed %]
+ <tr class="bug_header[% '2' IF cid % 2 %]">
+ <td>&nbsp;</td>
+ <td colspan="3">
+ <table width="100%" cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="33%">
+ Estimated: [% bugs.$id.estimated_time FILTER format("%.2f") %]h
+ </td>
+ <td width="33%">
+ Remaining: [% bugs.$id.remaining_time FILTER format("%.2f") %]h
+ </td>
+ <td width="33%">
+ Deadline: [% bugs.$id.deadline || "<b>Not set</b>" %]
+ </td>
+ </tr>
+ </table>
+ </td>
+ [% IF extra %]
+ <td>&nbsp;</td>
+ [% END %]
+ </tr>
+ [% END %]
+[% END %]
+
+[% BLOCK calc_bug_total %]
+ [% IF !global.bug_count.$id %]
+ [% global.estimated = global.estimated + bugs.$id.estimated_time %]
+ [% global.remaining = global.remaining + bugs.$id.remaining_time %]
+ [% IF !global.deadline || bugs.$id.deadline &&
+ global.deadline.replace("-", "") < bugs.$id.deadline.replace("-", "") %]
+ [% SET global.deadline = bugs.$id.deadline %]
+ [% END %]
+ [% END %]
+[% END %]
+
+[% BLOCK inactive_report %]
+ <h3>Inactive [% terms.bugs %]</h3>
+ <table cellpadding="4" cellspacing="0" width="90%" class="zeroitems">
+ [% cid = 0 %]
+ [% FOREACH bug_id = null.nsort %]
+ [% INCLUDE bug_header id=bug_id cid=cid %]
+ [% cid = cid + 1 %]
+ [% END %]
+ </table>
+[% END %]
+
+
+[% BLOCK section_total %]
+ [% IF global.total > 0 %]
+ <tr class="section_total">
+ <td><b>Totals</b></td>
+ <td colspan="[% colspan FILTER html %]" align="right"><b>[% additional FILTER html %]</b></td>
+ <td align="right"><b>[% global.total FILTER format("%.2f") %]</b></td>
+ </tr>
+ [% ELSE %]
+ <tr>
+ <td>No time allocated during the specified period.</td>
+ </tr>
+ [% END %]
+ [% global.grand_total = global.grand_total + global.total %]
+[% END %]
+
+[%#
+ #
+ # The query form
+ #
+ #%]
+
+[% BLOCK query_form %]
+<hr noshade size=1>
+<form method="post" name="summary" style="display: inline" action="summarize_time.cgi">
+<input type="hidden" name="do_depends" value="[% do_depends FILTER html %]">
+<input type="hidden" name="id" value="[% ids.join(",") FILTER html %]">
+<input type="hidden" name="do_report" value="1">
+
+[% IF warn_swap_dates %]
+ <h4 style="border: 1px solid red; margin: 1em; padding: 0.5em">The
+ end date specified occurs before the start date, which doesn't
+ make sense; the dates below have therefore been swapped.</h4>
+[% END %]
+
+<table>
+<tr>
+<td align="right">
+ <b><label accesskey="s"
+ for="start_date">Period <u>s</u>tarting</label></b>:
+</td><td colspan="3">
+ <input type="text" id="start_date" name="start_date" size="11"
+ align="right" value="[% start_date FILTER html %]" maxlength="10">
+ &nbsp;
+ <b>and <label accesskey="e" for="end_date"><u>e</u>nding</label></b>:
+ <input type="text" name="end_date" size="11" id="end_date"
+ align="right" value ="[% end_date FILTER html %]" maxlength="10">
+</td><td align="right">
+ <input type="submit" id="summarize" value="Summarize">
+</td></tr>
+<tr>
+<td>&nbsp;</td><td colspan="4">
+ <small>(Dates are optional, and in YYYY-MM-DD format)</small>
+</td>
+<tr><td align="right">
+ <b>Group by</b>:
+</td><td colspan="2">
+ <input type="radio" name="group_by" id="number" value="number" [%+
+ 'checked="checked"' IF group_by == "number"
+ %]><label
+ for="number" accesskey="n">[% terms.Bug %] <u>N</u>umber</label>
+ <input type="radio" name="group_by" id="owner" value="owner" [%+
+ 'checked="checked"' IF group_by == "owner"
+ %]><label
+ for="owner" accesskey="d"><u>D</u>eveloper</label>
+</td><td colspan="2">
+ <label for="ctype"><b>Format</b></label>: <select name="ctype" id="ctype">
+ <option value="html">HTML Report</option>
+ </select>
+</td></tr><tr>
+<td>&nbsp;</td><td colspan="4">
+ <input type="checkbox" name="monthly" [% 'checked="checked"' IF
+ monthly %] id="monthly">
+ <label for="monthly" accesskey="m">Split by <u>m</u>onth</label>
+ [%# XXX: allow splitting by other intervals %]
+ &nbsp;
+ <input type="checkbox" name="detailed" [% 'checked="checked"' IF
+ detailed %] id="detailed">
+ <label for="detailed" accesskey="t">De<u>t</u>ailed summaries</label>
+ &nbsp;
+ <input type="checkbox" name="inactive" [% 'checked="checked"' IF
+ inactive %] id="inactive">
+ <label for="inactive" accesskey="i">Also show <u>i</u>nactive
+ [%+ terms.bugs %]</label>
+</td>
+</tr></table>
+
+</form>
+<script type="text/javascript">
+<!--
+ document.forms['summary'].start_date.focus()
+//--></script>
+<hr noshade size=1>
+[% END %]
diff --git a/template/en/default/bug/time.html.tmpl b/template/en/default/bug/time.html.tmpl
new file mode 100644
index 0000000..e070e7d
--- /dev/null
+++ b/template/en/default/bug/time.html.tmpl
@@ -0,0 +1,47 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Jeff Hedlund <jeff.hedlund@matrixsi.com>
+ #
+ #%]
+
+[% BLOCK formattimeunit %]
+ [%# INTERFACE:
+ # time_unit: the number converting, converts to 2 decimal places
+ # unless the last character is a 0, then it truncates to
+ # 1 decimal place
+ #%]
+ [% time_unit = time_unit FILTER format('%.2f') %]
+ [% IF time_unit.match('0\Z') %]
+ [% time_unit FILTER format('%.1f') %]
+ [% ELSE %]
+ [% time_unit FILTER format('%.2f') %]
+ [% END %]
+[% END %]
+
+[% BLOCK calculatepercentage %]
+ [%# INTERFACE:
+ # act: actual time
+ # rem: remaining time
+ # %]
+ [% IF (act + rem) > 0 %]
+ [% (act / (act + rem)) * 100
+ FILTER format("%d") %]
+ [% ELSE %]
+ 0
+ [% END %]
+[% END %]
diff --git a/template/en/default/bug/votes/delete-all.html.tmpl b/template/en/default/bug/votes/delete-all.html.tmpl
new file mode 100644
index 0000000..41b7512
--- /dev/null
+++ b/template/en/default/bug/votes/delete-all.html.tmpl
@@ -0,0 +1,51 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # This template has no interface.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Remove your votes?"
+ %]
+
+<p>
+ You are about to remove all of your [% terms.bug %] votes. Are you sure you wish to
+ remove your vote from every [% terms.bug %] you've voted on?
+</p>
+
+<form action="votes.cgi" method="post">
+ <input type="hidden" name="action" value="vote">
+ <p>
+ <input type="radio" name="delete_all_votes" value="1">
+ Yes, delete all my votes
+ </p>
+ <p>
+ <input type="radio" name="delete_all_votes" value="0" checked="checked">
+ No, go back and review my votes
+ </p>
+ <p>
+ <input type="submit" id="vote" value="Submit">
+ </p>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/votes/list-for-bug.html.tmpl b/template/en/default/bug/votes/list-for-bug.html.tmpl
new file mode 100644
index 0000000..a599dc0
--- /dev/null
+++ b/template/en/default/bug/votes/list-for-bug.html.tmpl
@@ -0,0 +1,60 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # bug_id: integer. ID of the bug we are listing the votes for.
+ # users: list of hashes. May be empty. Each hash has two members:
+ # login_name: string. The login name of the user whose vote is attached
+ # vote_count: integer. The number of times that user has votes for this bug.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Show Votes"
+ subheader = "$terms.Bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>"
+ %]
+
+[% total = 0 %]
+<table cellspacing="4">
+ <tr>
+ <th>Who</th>
+ <th>Number of votes</th>
+ </tr>
+
+ [% FOREACH voter = users %]
+ [% total = total + voter.vote_count %]
+ <tr>
+ <td>
+ <a href="votes.cgi?action=show_user&amp;user_id=
+ [%- voter.id FILTER url_quote %]">
+ [% voter.login_name FILTER email FILTER html %]
+ </a>
+ </td>
+ <td align="right">
+ [% voter.vote_count %]
+ </td>
+ </tr>
+ [% END %]
+</table>
+
+<p>Total votes: [% total %]</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/votes/list-for-user.html.tmpl b/template/en/default/bug/votes/list-for-user.html.tmpl
new file mode 100644
index 0000000..2f97616
--- /dev/null
+++ b/template/en/default/bug/votes/list-for-user.html.tmpl
@@ -0,0 +1,185 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # voting_user: hash containing a 'login' field
+ #
+ # products: list of hashes containing details of products relating to
+ # voting:
+ # name: name of product
+ # bugs: list of bugs the user has voted for
+ # bug_ids: list of bug ids the user has voted for
+ # onevoteonly: one or more votes allowed per bug?
+ # total: users current vote count for the product
+ # maxvotes: max votes allowed for a user in this product
+ # maxperbug: max votes per bug allowed for a user in this product
+ #
+ # bug_id: number; if the user is voting for a bug, this is the bug id
+ #
+ # canedit: boolean; Should the votes be presented in a form, or readonly?
+ #
+ # all_bug_ids: List of all bug ids the user has voted for, across all products
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% IF !header_done %]
+ [% subheader = voting_user.login FILTER html %]
+ [% IF canedit %]
+ [% title = "Change Votes" %]
+ [% IF bug_id %]
+ [%# We .select and .focus the input so it works for textbox and
+ checkbox %]
+ [% onload = "document.forms['voting_form'].bug_" _ bug_id _
+ ".select();document.forms['voting_form'].bug_" _ bug_id _
+ ".focus()" %]
+ [% END %]
+ [% ELSE %]
+ [% title = "Show Votes" %]
+ [% END %]
+ [% PROCESS global/header.html.tmpl
+ style_urls = [ "skins/standard/voting.css" ]
+ %]
+[% ELSE %]
+ <hr>
+[% END %]
+
+[% IF votes_recorded %]
+ <p>
+ <font color="red">
+ The changes to your votes have been saved.
+ </font>
+ </p>
+[% ELSE %]
+ <br>
+[% END %]
+
+[% IF products.size %]
+ <form name="voting_form" method="post" action="votes.cgi">
+ <input type="hidden" name="action" value="vote">
+ <table cellspacing="4">
+ <tr>
+ <td></td>
+ <th>Votes</th>
+ <th>[% terms.Bug %] #</th>
+ <th>Summary</th>
+ </tr>
+
+ [% onevoteproduct = 0 %]
+ [% multivoteproduct = 0 %]
+ [% FOREACH product = products %]
+ [% IF product.onevoteonly %]
+ [% onevoteproduct = 1 %]
+ [% ELSE %]
+ [% multivoteproduct = 1 %]
+ [% END %]
+ <tr>
+ <th>[% product.name FILTER html %]</th>
+ <td colspan="2" ><a href="buglist.cgi?bug_id=
+ [%- product.bug_ids.join(",") FILTER url_quote %]">([% terms.bug %] list)</a>
+ </td>
+ <td>
+ [% IF product.maxperbug < product.maxvotes AND
+ product.maxperbug > 1 %]
+ <font size="-1">
+ (Note: only [% product.maxperbug %] vote
+ [% "s" IF product.maxperbug != 1 %] allowed per [% terms.bug %] in
+ this product.)
+ </font>
+ [% END %]
+ </td>
+ </tr>
+
+ [% FOREACH bug = product.bugs %]
+ <tr [% IF bug.id == bug_id && canedit %]
+ class="bz_bug_being_voted_on" [% END %]>
+ <td>[% IF bug.id == bug_id && canedit %]Enter New Vote here &rarr;
+ [%- END %]</td>
+ <td align="right"><a name="vote_[% bug.id %]">
+ [% IF canedit %]
+ [% IF product.onevoteonly %]
+ <input type="checkbox" name="[% bug.id %]" value="1"
+ [% " checked" IF bug.count %] id="bug_[% bug.id %]">
+ [% ELSE %]
+ <input name="[% bug.id %]" value="[% bug.count %]"
+ size="2" id="bug_[% bug.id %]">
+ [% END %]
+ [% ELSE %]
+ [% bug.count %]
+ [% END %]
+ </a></td>
+ <td align="center">
+ [% bug.id FILTER bug_link(bug) FILTER none %]
+ </td>
+ <td>
+ [% bug.summary FILTER html %]
+ (<a href="votes.cgi?action=show_bug&amp;bug_id=[% bug.id %]">Show Votes</a>)
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <td></td>
+ <td colspan="3">[% product.total %] vote
+ [% "s" IF product.total != 1 %] used out of [% product.maxvotes %]
+ allowed.
+ <br>
+ <br>
+ </td>
+ </tr>
+ [% END %]
+ </table>
+
+ [% IF canedit %]
+ <input type="submit" value="Change My Votes" id="change"> or
+ <a href="buglist.cgi?bug_id=[% all_bug_ids.join(",") FILTER url_quote %]">view all
+ as [% terms.bug %] list</a>
+ <br>
+ <br>
+ To change your votes,
+ [% IF multivoteproduct %]
+ type in new numbers (using zero to mean no votes)
+ [% " or " IF onevoteproduct %]
+ [% END %]
+ [% IF onevoteproduct %]
+ change the checkbox
+ [% END %]
+ and then click <b>Change My Votes</b>.
+ [% ELSE %]
+ <a href="buglist.cgi?bug_id=[% all_bug_ids.join(",") FILTER url_quote %]">View all
+ as [% terms.bug %] list</a>
+ [% END %]
+ </form>
+[% ELSE %]
+ <p>
+ [% IF canedit %]
+ You are
+ [% ELSE %]
+ This user is
+ [% END %]
+ currently not voting on any [% terms.bugs %].
+ </p>
+[% END %]
+
+<p>
+ <a href="page.cgi?id=voting.html">Help with voting</a>.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/config.js.tmpl b/template/en/default/config.js.tmpl
new file mode 100644
index 0000000..0d63583
--- /dev/null
+++ b/template/en/default/config.js.tmpl
@@ -0,0 +1,142 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+//
+// This file contains installation specific values for third-party clients.
+//
+// Note: this interface is experimental and under development.
+// We may and probably will make breaking changes to it in the future.
+
+// the global bugzilla url
+var installation = {
+ base_url : '[% urlbase FILTER js %]',
+ install_version : '[% constants.BUGZILLA_VERSION FILTER js %]',
+ maintainer : '[% Param('maintainer') FILTER js %]'
+};
+
+
+// Status and Resolution
+// =====================
+var status = [ [% FOREACH x = status %]'[% x FILTER js %]', [% END %] ];
+var status_open = [ [% FOREACH x = open_status %]'[% x FILTER js %]', [% END %] ];
+var status_closed = [ [% FOREACH x = closed_status %]'[% x FILTER js %]', [% END %] ];
+var resolution = [ [% FOREACH x = resolution %]'[% x FILTER js %]', [% END %] ];
+
+
+// Keywords
+// ========
+
+var keyword = [ [% FOREACH x = keyword %]'[% x FILTER js %]', [% END %] ];
+
+
+// Platforms
+// =========
+
+var platform = [ [% FOREACH x = platform %]'[% x FILTER js %]', [% END %] ];
+
+
+// Severities
+// ==========
+
+var severity = [ [% FOREACH x = severity %]'[% x FILTER js %]', [% END %] ];
+
+
+// Custom Fields
+// =============
+
+[% FOREACH cf = custom_fields %]
+var [% cf.name FILTER js %] = [ [% FOREACH x = cf.legal_values %]'[% x.name FILTER js %]', [% END %] ];
+[% END %]
+
+
+// Products and Components
+// =======================
+//
+// It is not necessary to list all products and components here.
+// Instead, you can define a "blacklist" for some commonly used words
+// or word fragments that occur in a product or component name
+// but should _not_ trigger product/component search.
+
+
+// A list of all products and their components, versions, and target milestones:
+
+var component = new Object();
+var version = new Object();
+var target_milestone = new Object();
+
+[% FOREACH p = products %]
+ component['[% p.name FILTER js %]'] = [ [% FOREACH x = p.components %]'[% x.name FILTER js %]', [% END %] ];
+ version['[% p.name FILTER js %]'] = [ [% FOREACH x = p.versions %]'[% x.name FILTER js %]', [% END %] ];
+ target_milestone['[% p.name FILTER js %]'] = [ [% FOREACH x = p.milestones %]'[% x.name FILTER js %]', [% END %] ];
+[% END %]
+
+// Product and Component Exceptions
+// ================================
+//
+// A blacklist for some commonly used words or word fragments
+// that occur in a product or component name but should *not*
+// trigger product/component search in QuickSearch.
+
+var product_exceptions = new Array(
+ // Example:
+ //"row" // [Browser]
+ // // ^^^
+ //,"new" // [MailNews]
+ // // ^^^
+);
+
+var component_exceptions = new Array(
+ // Example:
+ //"hang" // [mozilla.org] Bugzilla: Component/Keyword Changes
+ // // ^^^^
+);
+
+// Queryable Fields
+// ================
+[% PROCESS "global/field-descs.none.tmpl" %]
+var field = [
+[% FOREACH x = field %]
+ { name: '[% x.name FILTER js %]',
+ description: '[% (field_descs.${x.name} OR x.description) FILTER js %]',
+ [%-# These values are meaningful for custom fields only. %]
+ [% IF x.custom %]
+ type: '[% x.type FILTER js %]',
+ type_desc: '[% field_types.${x.type} FILTER js %]',
+ enter_bug: '[% x.enter_bug FILTER js %]',
+ [% END %]
+ },
+[% END %]
+];
+
+// Deprecated Variables
+// ====================
+//
+// Other names for various variables. These are deprecated
+// and could go away at any time. Use them at your own risk!
+
+var bugzilla = installation.base_url;
+var statuses = status;
+var statuses_resolved = status_closed;
+var resolutions = resolution;
+var keywords = keyword;
+var platforms = platform;
+var severities = severity;
+var cpts = component;
+var vers = version;
+var tms = target_milestone;
diff --git a/template/en/default/config.rdf.tmpl b/template/en/default/config.rdf.tmpl
new file mode 100644
index 0000000..ec80f76
--- /dev/null
+++ b/template/en/default/config.rdf.tmpl
@@ -0,0 +1,262 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+<?xml version="1.0"[% IF Param('utf8') %] encoding="UTF-8"[% END %]?>
+<!-- Note: this interface is experimental and under development.
+ - We may and probably will make breaking changes to it in the future. -->
+
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:bz="http://www.bugzilla.org/rdf#">
+
+<bz:installation rdf:about="[% urlbase FILTER xml %]">
+ <bz:install_version>[% constants.BUGZILLA_VERSION FILTER html %]</bz:install_version>
+ <bz:maintainer>[% Param('maintainer') FILTER html %]</bz:maintainer>
+
+ <bz:status>
+ <Seq>
+ [% FOREACH item = status %]
+ <li>[% item FILTER html %]</li>
+ [% END %]
+ </Seq>
+ </bz:status>
+
+ <bz:status_open>
+ <Seq>
+ [% FOREACH item = open_status %]
+ <li>[% item FILTER html %]</li>
+ [% END %]
+ </Seq>
+ </bz:status_open>
+
+ <bz:status_closed>
+ <Seq>
+ [% FOREACH item = closed_status %]
+ <li>[% item FILTER html %]</li>
+ [% END %]
+ </Seq>
+ </bz:status_closed>
+
+ <bz:resolution>
+ <Seq>
+ [% FOREACH item = resolution %]
+ <li>[% item FILTER html %]</li>
+ [% END %]
+ </Seq>
+ </bz:resolution>
+
+ <bz:keyword>
+ <Seq>
+ [% FOREACH item = keyword %]
+ <li>[% item FILTER html %]</li>
+ [% END %]
+ </Seq>
+ </bz:keyword>
+
+ <bz:platform>
+ <Seq>
+ [% FOREACH item = platform %]
+ <li>[% item FILTER html %]</li>
+ [% END %]
+ </Seq>
+ </bz:platform>
+
+ <bz:op_sys>
+ <Seq>
+ [% FOREACH item = op_sys %]
+ <li>[% item FILTER html %]</li>
+ [% END %]
+ </Seq>
+ </bz:op_sys>
+
+ <bz:priority>
+ <Seq>
+ [% FOREACH item = priority %]
+ <li>[% item FILTER html %]</li>
+ [% END %]
+ </Seq>
+ </bz:priority>
+
+ <bz:severity>
+ <Seq>
+ [% FOREACH item = severity %]
+ <li>[% item FILTER html %]</li>
+ [% END %]
+ </Seq>
+ </bz:severity>
+
+[% FOREACH cf = custom_fields %]
+ <bz:[% cf.name FILTER html %]>
+ <Seq>
+ [% FOREACH item = cf.legal_values %]
+ <li>[% item.name FILTER html %]</li>
+ [% END %]
+ </Seq>
+ </bz:[% cf.name FILTER html %]>
+
+[% END %]
+
+ <bz:products>
+ <Seq>
+ [% FOREACH product = products %]
+ <li>
+ <bz:product rdf:about="[% urlbase FILTER xml %]product.cgi?name=[% product.name FILTER url_quote %]">
+ <bz:name>[% product.name FILTER html %]</bz:name>
+
+ <bz:components>
+ <Seq>
+ [% FOREACH component = product.components %]
+ <li resource="[% urlbase FILTER xml %]component.cgi?name=[% component.name FILTER url_quote
+ %]&amp;product=[% product.name FILTER url_quote %]"/>
+ [% END %]
+ </Seq>
+ </bz:components>
+
+ <bz:versions>
+ <Seq>
+ [% FOREACH version = product.versions %]
+ <li resource="[% urlbase FILTER xml %]version.cgi?name=[% version.name FILTER url_quote %]"/>
+ [% END %]
+ </Seq>
+ </bz:versions>
+
+ [% IF Param('usetargetmilestone') %]
+ <bz:target_milestones>
+ <Seq>
+ [% FOREACH milestone = product.milestones %]
+ <li resource="[% urlbase FILTER xml %]milestone.cgi?name=[% milestone.name FILTER url_quote %]"/>
+ [% END %]
+ </Seq>
+ </bz:target_milestones>
+ [% END %]
+
+ </bz:product>
+ </li>
+ [% END %]
+ </Seq>
+ </bz:products>
+
+ [% all_visible_flag_types = {} %]
+ <bz:components>
+ <Seq>
+ [% FOREACH product = products %]
+ [% FOREACH component = product.components %]
+ <li>
+ <bz:component rdf:about="[% urlbase FILTER xml %]component.cgi?name=[% component.name FILTER url_quote
+ %]&amp;product=[% product.name FILTER url_quote %]">
+ <bz:name>[% component.name FILTER html %]</bz:name>
+ [% IF show_flags %]
+ <bz:flag_types>
+ <Seq>
+ [% flag_types = component.flag_types.bug.merge(component.flag_types.attachment) %]
+ [% FOREACH flag_type = flag_types %]
+ [% NEXT UNLESS flag_type.is_active %]
+ [% all_visible_flag_types.${flag_type.id} = flag_type %]
+ <li resource="[% urlbase FILTER xml %]flag.cgi?id=[% flag_type.id FILTER url_quote
+ %]&amp;name=[% flag_type.name FILTER url_quote %]" />
+ [% END %]
+ </Seq>
+ </bz:flag_types>
+ [% END %]
+ </bz:component>
+ </li>
+ [% END %]
+ [% END %]
+ </Seq>
+ </bz:components>
+
+ <bz:versions>
+ <Seq>
+ [% FOREACH product = products %]
+ [% FOREACH version = product.versions %]
+ <li>
+ <bz:version rdf:about="[% urlbase FILTER xml %]version.cgi?name=[% version.name FILTER url_quote %]">
+ <bz:name>[% version.name FILTER html %]</bz:name>
+ </bz:version>
+ </li>
+ [% END %]
+ [% END %]
+ </Seq>
+ </bz:versions>
+
+ [% IF Param('usetargetmilestone') %]
+ <bz:target_milestones>
+ <Seq>
+ [% FOREACH product = products %]
+ [% FOREACH milestone = product.milestones %]
+ <li>
+ <bz:target_milestone rdf:about="[% urlbase FILTER xml %]milestone.cgi?name=[% milestone.name FILTER url_quote %]">
+ <bz:name>[% milestone.name FILTER html %]</bz:name>
+ </bz:target_milestone>
+ </li>
+ [% END %]
+ [% END %]
+ </Seq>
+ </bz:target_milestones>
+ [% END %]
+
+ [% IF show_flags %]
+ <bz:flag_types>
+ <Seq>
+ [% FOREACH flag_type = all_visible_flag_types.values.sort('name') %]
+ <li>
+ <bz:flag_type rdf:about="[% urlbase FILTER xml %]flag.cgi?id=[% flag_type.id FILTER url_quote
+ %]&amp;name=[% flag_type.name FILTER url_quote %]">
+ <bz:id>[% flag_type.id FILTER html %]</bz:id>
+ <bz:name>[% flag_type.name FILTER html %]</bz:name>
+ <bz:description>[% flag_type.description FILTER html %]</bz:description>
+ <bz:type>[% flag_type.target_type FILTER html %]</bz:type>
+ <bz:requestable>[% flag_type.is_requestable FILTER html %]</bz:requestable>
+ <bz:specifically_requestable>[% flag_type.is_requesteeble FILTER html %]</bz:specifically_requestable>
+ <bz:multiplicable>[% flag_type.is_multiplicable FILTER html %]</bz:multiplicable>
+ [% IF user.in_group("editcomponents") %]
+ <bz:grant_group>[% flag_type.grant_group.name FILTER html %]</bz:grant_group>
+ <bz:request_group>[% flag_type.request_group.name FILTER html %]</bz:request_group>
+ [% END %]
+ </bz:flag_type>
+ </li>
+ [% END %]
+ </Seq>
+ </bz:flag_types>
+ [% END %]
+
+ <bz:fields>
+ <Seq>
+ [% PROCESS "global/field-descs.none.tmpl" %]
+ [% FOREACH item = field %]
+ <li>
+ <bz:field rdf:about="[% urlbase FILTER xml %]field.cgi?name=[% item.name FILTER url_quote %]">
+ <bz:name>[% item.name FILTER html %]</bz:name>
+ <bz:description>[% (field_descs.${item.name} OR item.description) FILTER html %]</bz:description>
+ [%-# These values are meaningful for custom fields only. %]
+ [% IF item.custom %]
+ <bz:type>[% item.type FILTER html %]</bz:type>
+ <bz:type_desc>[% field_types.${item.type} FILTER html %]</bz:type_desc>
+ <bz:enter_bug>[% item.enter_bug FILTER html %]</bz:enter_bug>
+ [% END %]
+ </bz:field>
+ </li>
+ [% END %]
+ </Seq>
+ </bz:fields>
+</bz:installation>
+
+</RDF>
diff --git a/template/en/default/email/lockout.txt.tmpl b/template/en/default/email/lockout.txt.tmpl
new file mode 100644
index 0000000..ac65257
--- /dev/null
+++ b/template/en/default/email/lockout.txt.tmpl
@@ -0,0 +1,39 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is the Mozilla Corporation.
+ # Portions created by the Initial Developer are Copyright (C) 2008
+ # the Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+From: [% Param('mailfrom') %]
+To: [% Param('maintainer') %]
+Subject: [[% terms.Bugzilla %]] Account Lock-Out: [% locked_user.login %] ([% attempts.0.ip_addr %])
+X-Bugzilla-Type: admin
+
+The IP address [% attempts.0.ip_addr %] failed too many login attempts (
+[%- constants.MAX_LOGIN_ATTEMPTS +%]) for
+the account [% locked_user.login %].
+
+The login attempts occurred at these times:
+
+[% FOREACH login = attempts %]
+ [%+ login.login_time FILTER time %]
+[% END %]
+
+This IP will be able to log in again using this account at
+[%+ unlock_at FILTER time %].
diff --git a/template/en/default/email/newchangedmail.txt.tmpl b/template/en/default/email/newchangedmail.txt.tmpl
new file mode 100644
index 0000000..65e0287
--- /dev/null
+++ b/template/en/default/email/newchangedmail.txt.tmpl
@@ -0,0 +1,88 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): André Batosti <batosti@async.com.br>
+ #%]
+
+[% PROCESS "global/variables.none.tmpl" %]
+From: [% Param('mailfrom') %]
+To: [% to_user.email %]
+Subject: [[% terms.Bug %] [%+ bugid %]] [% 'New: ' IF isnew %][%+ summary %]
+X-Bugzilla-Reason: [% reasonsheader %]
+X-Bugzilla-Type: [% isnew ? 'new' : 'changed' %]
+X-Bugzilla-Watch-Reason: [% reasonswatchheader %]
+[% IF Param('useclassification') %]
+X-Bugzilla-Classification: [% classification %]
+[% END %]
+X-Bugzilla-Product: [% product %]
+X-Bugzilla-Component: [% comp %]
+X-Bugzilla-Keywords: [% keywords %]
+X-Bugzilla-Severity: [% severity %]
+X-Bugzilla-Who: [% changer %]
+X-Bugzilla-Status: [% status %]
+X-Bugzilla-Priority: [% priority %]
+X-Bugzilla-Assigned-To: [% assignedto %]
+X-Bugzilla-Target-Milestone: [% targetmilestone %]
+X-Bugzilla-Changed-Fields: [% changedfields %]
+[%+ threadingmarker %]
+
+[%+ urlbase %]show_bug.cgi?id=[% bugid %]
+[%- IF diffs %]
+
+[%+ diffs %]
+[% END -%]
+[% FOREACH comment = new_comments %]
+
+[%- IF comment.count %]
+--- Comment #[% comment.count %] from [% comment.author.identity %] [%+ comment.creation_ts FILTER time(undef, to_user.timezone) %] ---
+[% END %]
+[%+ comment.body_full({ is_bugmail => 1, wrap => 1 }) %]
+[% END %]
+
+-- [%# Protect the trailing space of the signature marker %]
+Configure [% terms.bug %]mail: [% urlbase %]userprefs.cgi?tab=email
+------- You are receiving this mail because: -------
+[% FOREACH relationship = reasons %]
+ [% SWITCH relationship %]
+ [% CASE constants.REL_ASSIGNEE %]
+You are the assignee for the [% terms.bug %].
+ [% CASE constants.REL_REPORTER %]
+You reported the [% terms.bug %].
+ [% CASE constants.REL_QA %]
+You are the QA contact for the [% terms.bug %].
+ [% CASE constants.REL_CC %]
+You are on the CC list for the [% terms.bug %].
+ [% CASE constants.REL_VOTER %]
+You are a voter for the [% terms.bug %].
+ [% CASE constants.REL_GLOBAL_WATCHER %]
+You are watching all [% terms.bug %] changes.
+ [% END %]
+[% END %]
+[% FOREACH relationship = reasons_watch %]
+ [% SWITCH relationship %]
+ [% CASE constants.REL_ASSIGNEE %]
+You are watching the assignee of the [% terms.bug %].
+ [% CASE constants.REL_REPORTER %]
+You are watching the reporter.
+ [% CASE constants.REL_QA %]
+You are watching the QA contact of the [% terms.bug %].
+ [% CASE constants.REL_CC %]
+You are watching someone on the CC list of the [% terms.bug %].
+ [% CASE constants.REL_VOTER %]
+You are watching a voter for the [% terms.bug %].
+ [% END %]
+[% END %]
diff --git a/template/en/default/email/sanitycheck.txt.tmpl b/template/en/default/email/sanitycheck.txt.tmpl
new file mode 100644
index 0000000..8826d4e
--- /dev/null
+++ b/template/en/default/email/sanitycheck.txt.tmpl
@@ -0,0 +1,36 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS "global/variables.none.tmpl" %]
+From: [% Param('mailfrom') %]
+To: [% addressee %]
+Subject: [[% terms.Bugzilla %]] Sanity Check Results
+X-Bugzilla-Type: sanitycheck
+
+[%+ urlbase %]sanitycheck.cgi
+
+Below can you read the sanity check results.
+[% IF error_found %]
+Some errors have been found.
+[% ELSE %]
+No errors have been found.
+[% END %]
+
+[% output %]
diff --git a/template/en/default/email/sudo.txt.tmpl b/template/en/default/email/sudo.txt.tmpl
new file mode 100644
index 0000000..74fbc49
--- /dev/null
+++ b/template/en/default/email/sudo.txt.tmpl
@@ -0,0 +1,43 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 2005 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): A. Karl Kornel <karl@kornel.name>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+Content-Type: text/plain
+From: [% Param('mailfrom') %]
+To: [% user.email %]
+Subject: [[% terms.Bugzilla %]] Your account [% user.login -%]
+ is being impersonated
+X-Bugzilla-Type: admin
+
+ [%+ sudoer.identity %] has used the 'sudo' feature to access
+[%+ terms.Bugzilla %] using your account.
+
+[% IF reason %]
+ [%+ sudoer.identity %] provided the following reason for doing this:
+
+[% reason FILTER wrap_comment %]
+[% ELSE %]
+ [%+ sudoer.identity %] did not provide a reason for doing this.
+[% END %]
+
+ If you feel that this action was inappropriate, please contact
+[%+ Param("maintainer") %]. For more information on this feature,
+visit <[% urlbase %]page.cgi?id=sudo.html>.
diff --git a/template/en/default/email/votes-removed.txt.tmpl b/template/en/default/email/votes-removed.txt.tmpl
new file mode 100644
index 0000000..bfb37c9
--- /dev/null
+++ b/template/en/default/email/votes-removed.txt.tmpl
@@ -0,0 +1,55 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Emmanuel Seyman <eseyman@linagora.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+From: [% Param('mailfrom') %]
+To: [% to %]
+Subject: [% terms.Bug %] [%+ bugid %] Some or all of your votes have been removed.
+X-Bugzilla-Type: voteremoved
+
+Some or all of your votes have been removed from [% terms.bug %] [%+ bugid %].
+
+You had [% votesold FILTER html %] [%+ IF votesold == 1 %]vote[% ELSE %]votes[% END
+%] on this [% terms.bug %], but [% votesremoved FILTER html %] have been removed.
+
+[% IF votesnew %]
+You still have [% votesnew FILTER html %] [%+ IF votesnew == 1 %]vote[% ELSE %]votes[% END %] on this [% terms.bug %].
+[% ELSE %]
+You have no more votes remaining on this [% terms.bug %].
+[% END %]
+
+Reason:
+[% IF reason == "votes_bug_moved" %]
+ This [% terms.bug %] has been moved to a different product.
+
+[% ELSIF reason == "votes_too_many_per_bug" %]
+ The rules for voting on this product has changed;
+ you had too many votes for a single [% terms.bug %].
+
+[% ELSIF reason == "votes_too_many_per_user" %]
+ The rules for voting on this product has changed; you had
+ too many total votes, so all votes have been removed.
+[% END %]
+
+
+
+[% urlbase %]show_bug.cgi?id=[% bugid %]
+
diff --git a/template/en/default/email/whine.txt.tmpl b/template/en/default/email/whine.txt.tmpl
new file mode 100644
index 0000000..e90480e
--- /dev/null
+++ b/template/en/default/email/whine.txt.tmpl
@@ -0,0 +1,65 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Emmanuel Seyman <eseyman@linagora.com>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+From: [% Param("mailfrom") %]
+To: [% email %][% Param("emailsuffix") %]
+Subject: Your [% terms.Bugzilla %] [%+ terms.bug %] list needs attention.
+X-Bugzilla-Type: whine
+
+[This e-mail has been automatically generated.]
+
+You have one or more [% terms.bugs %] assigned to you in the [% terms.Bugzilla %]
+[% terms.bug %] tracking system ([% urlbase %]) that require
+attention.
+
+All of these [% terms.bugs %] are in the [% display_value("bug_status", "NEW") %] or
+[%= display_value("bug_status", "REOPENED") %] state, and have not been
+touched in [% Param("whinedays") %] days or more.
+You need to take a look at them, and decide on an initial action.
+
+Generally, this means one of three things:
+
+(1) You decide this [% terms.bug %] is really quick to deal with (like, it's [% display_value("resolution", "INVALID") %]),
+ and so you get rid of it immediately.
+(2) You decide the [% terms.bug %] doesn't belong to you, and you reassign it to
+ someone else. (Hint: if you don't know who to reassign it to, make
+ sure that the Component field seems reasonable, and then use the
+ "Reset Assignee to default" option.)
+(3) You decide the [% terms.bug %] belongs to you, but you can't solve it this moment.
+ Accept the [% terms.bug %] by setting the status to [% display_value("bug_status", "ASSIGNED") %].
+
+To get a list of all [% display_value("bug_status", "NEW") %]/[% display_value("bug_status", "REOPENED") %] [%+ terms.bugs %], you can use this URL (bookmark
+it if you like!):
+
+ [% urlbase %]buglist.cgi?bug_status=NEW&bug_status=REOPENED&assigned_to=[% email %]
+
+Or, you can use the general query page, at
+[%+ urlbase %]query.cgi
+
+Appended below are the individual URLs to get to all of your [% display_value("bug_status", "NEW") %] [%+ terms.bugs %]
+that haven't been touched for [% Param("whinedays") %] days or more.
+
+You will get this message once a day until you've dealt with these [% terms.bugs %]!
+
+[% FOREACH bug = bugs %]
+ [%+ bug.summary %]
+ -> [% urlbase %]show_bug.cgi?id=[% bug.id %]
+[% END %]
diff --git a/template/en/default/extensions/config.pm.tmpl b/template/en/default/extensions/config.pm.tmpl
new file mode 100644
index 0000000..6997ec1
--- /dev/null
+++ b/template/en/default/extensions/config.pm.tmpl
@@ -0,0 +1,41 @@
+[%# -*- mode: perl -*- %]
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Everything Solved, Inc.
+ # Portions created by the Initial Developer are Copyright (C) 2009 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # name: string; The name of the extension.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS extensions/license.txt.tmpl %]
+
+package B[% %]ugzilla::Extension::[% name %];
+use strict;
+
+use constant NAME => '[% name %]';
+
+use constant REQUIRED_MODULES => [
+];
+
+use constant OPTIONAL_MODULES => [
+];
+
+__PACKAGE__->NAME;
diff --git a/template/en/default/extensions/extension.pm.tmpl b/template/en/default/extensions/extension.pm.tmpl
new file mode 100644
index 0000000..2492271
--- /dev/null
+++ b/template/en/default/extensions/extension.pm.tmpl
@@ -0,0 +1,46 @@
+[%# -*- mode: perl -*- %]
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Everything Solved, Inc.
+ # Portions created by the Initial Developer are Copyright (C) 2009 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # name: string; The name of the extension.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS extensions/license.txt.tmpl %]
+
+package B[% %]ugzilla::Extension::[% name %];
+use strict;
+use base qw(B[% %]ugzilla::Extension);
+
+# This code for this is in [% path %]/lib/Util.pm
+use B[% %]ugzilla::Extension::[% name %]::Util;
+
+our $VERSION = '0.01';
+
+# See the documentation of B[% %]ugzilla::Hook ("perldoc B[% %]ugzilla::Hook"
+# in the bugzilla directory) for a list of all available hooks.
+sub install_update_db {
+ my ($self, $args) = @_;
+
+}
+
+__PACKAGE__->NAME;
diff --git a/template/en/default/extensions/hook-readme.txt.tmpl b/template/en/default/extensions/hook-readme.txt.tmpl
new file mode 100644
index 0000000..efceec1
--- /dev/null
+++ b/template/en/default/extensions/hook-readme.txt.tmpl
@@ -0,0 +1,27 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Everything Solved, Inc.
+ # Portions created by the Initial Developer are Copyright (C) 2009 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+Template hooks go in this directory. Template hooks are called in normal
+[%+ terms.Bugzilla %] templates like [[% '%' %] Hook.process('some-hook') %].
+More information about them can be found in the documentation of
+B[% %]ugzilla::Extension. (Do "perldoc B[% %]ugzilla::Extension" from the main
+[%+ terms.Bugzilla %] directory to see that documentation.)
diff --git a/template/en/default/extensions/license.txt.tmpl b/template/en/default/extensions/license.txt.tmpl
new file mode 100644
index 0000000..964e075
--- /dev/null
+++ b/template/en/default/extensions/license.txt.tmpl
@@ -0,0 +1,47 @@
+[%# -*- mode: perl -*- %]
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Everything Solved, Inc.
+ # Portions created by the Initial Developer are Copyright (C) 2009 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # name: string; The name of the extension.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the [% name %] [%+ terms.Bugzilla %] Extension.
+#
+# The Initial Developer of the Original Code is YOUR NAME
+# Portions created by the Initial Developer are Copyright (C) [% year %] the
+# Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+# YOUR NAME <YOUR EMAIL ADDRESS>
diff --git a/template/en/default/extensions/name-readme.txt.tmpl b/template/en/default/extensions/name-readme.txt.tmpl
new file mode 100644
index 0000000..6d25c83
--- /dev/null
+++ b/template/en/default/extensions/name-readme.txt.tmpl
@@ -0,0 +1,38 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Everything Solved, Inc.
+ # Portions created by the Initial Developer are Copyright (C) 2009 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+Normal templates go in this directory. You can load them in your
+code like this:
+
+use B[% %]ugzilla::Error;
+my $template = B[% %]ugzilla->template;
+$template->process('[% name FILTER lower %]/some-template.html.tmpl')
+ or ThrowTemplateError($template->error());
+
+That would be how to load a file called some-template.html.tmpl that
+was in this directory.
+
+Note that you have to be careful that the full path of your template
+never conflicts with a template that exists in [% terms.Bugzilla %] or in
+another extension, or your template might override that template. That's why
+we created this directory called '[% name FILTER lower %]' for you, so you
+can put your templates in here to help avoid conflicts.
diff --git a/template/en/default/extensions/util.pm.tmpl b/template/en/default/extensions/util.pm.tmpl
new file mode 100644
index 0000000..32076a6
--- /dev/null
+++ b/template/en/default/extensions/util.pm.tmpl
@@ -0,0 +1,42 @@
+[%# -*- mode: perl -*- %]
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Everything Solved, Inc.
+ # Portions created by the Initial Developer are Copyright (C) 2009 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # name: string; The name of the extension.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS extensions/license.txt.tmpl %]
+
+package B[% %]ugzilla::Extension::[% name %]::Util;
+use strict;
+use base qw(Exporter);
+our @EXPORT = qw(
+
+);
+
+# This file can be loaded by your extension via
+# "use B[% %]ugzilla::Extension::[% name %]::Util". You can put functions
+# used by your extension in here. (Make sure you also list them in
+# @EXPORT.)
+
+1;
diff --git a/template/en/default/filterexceptions.pl b/template/en/default/filterexceptions.pl
new file mode 100644
index 0000000..2c096df
--- /dev/null
+++ b/template/en/default/filterexceptions.pl
@@ -0,0 +1,531 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code are the Bugzilla tests.
+#
+# The Initial Developer of the Original Code is Jacob Steenhagen.
+# Portions created by Jacob Steenhagen are
+# Copyright (C) 2001 Jacob Steenhagen. All
+# Rights Reserved.
+#
+# Contributor(s): Gervase Markham <gerv@gerv.net>
+
+# Important! The following classes of directives are excluded in the test,
+# and so do not need to be added here. Doing so will cause warnings.
+# See 008filter.t for more details.
+#
+# Comments - [%#...
+# Directives - [% IF|ELSE|UNLESS|FOREACH...
+# Assignments - [% foo = ...
+# Simple literals - [% " selected" ...
+# Values always used for numbers - [% (i|j|k|n|count) %]
+# Params - [% Param(...
+# Safe functions - [% (time2str)...
+# Safe vmethods - [% foo.size %] [% foo.length %]
+# [% foo.push() %]
+# TT loop variables - [% loop.count %]
+# Already-filtered stuff - [% wibble FILTER html %]
+# where the filter is one of html|csv|js|url_quote|quoteUrls|time|uri|xml|none
+
+%::safe = (
+
+'whine/schedule.html.tmpl' => [
+ 'event.key',
+ 'query.id',
+ 'query.sort',
+ 'schedule.id',
+ 'option.0',
+ 'option.1',
+],
+
+'whine/mail.html.tmpl' => [
+ 'bug.bug_id',
+],
+
+'flag/list.html.tmpl' => [
+ 'flag.id',
+ 'flag.status',
+ 'type.id',
+],
+
+'search/boolean-charts.html.tmpl' => [
+ '"field${chartnum}-${rownum}-${colnum}"',
+ '"value${chartnum}-${rownum}-${colnum}"',
+ 'field.name',
+ '"${chartnum}-${rownum}-${newor}"',
+ '"${chartnum}-${newand}-0"',
+ 'newchart',
+ 'jsmagic',
+],
+
+'search/form.html.tmpl' => [
+ 'qv.name',
+ 'qv.description',
+ 'field.name',
+ 'field.description',
+ 'field.accesskey',
+ 'sel.name',
+],
+
+'search/search-specific.html.tmpl' => [
+ 'status.name',
+],
+
+'search/tabs.html.tmpl' => [
+ 'content',
+],
+
+'request/queue.html.tmpl' => [
+ 'column_headers.$group_field',
+ 'column_headers.$column',
+ 'request.status',
+ 'request.bug_id',
+ 'request.attach_id',
+],
+
+'reports/keywords.html.tmpl' => [
+ 'keyword.bug_count',
+],
+
+'reports/report-table.csv.tmpl' => [
+ 'data.$tbl.$col.$row',
+ 'colsepchar',
+],
+
+'reports/report-table.html.tmpl' => [
+ '"&amp;$tbl_vals" IF tbl_vals',
+ '"&amp;$col_vals" IF col_vals',
+ '"&amp;$row_vals" IF row_vals',
+ 'classes.$row_idx.$col_idx',
+ 'urlbase',
+ 'data.$tbl.$col.$row',
+ 'row_total',
+ 'col_totals.$col',
+ 'grand_total',
+],
+
+'reports/report.html.tmpl' => [
+ 'width',
+ 'height',
+ 'imageurl',
+ 'formaturl',
+ 'other_format.name',
+ 'sizeurl',
+ 'switchbase',
+ 'format',
+ 'cumulate',
+],
+
+'reports/chart.html.tmpl' => [
+ 'width',
+ 'height',
+ 'imageurl',
+ 'sizeurl',
+ 'height + 100',
+ 'height - 100',
+ 'width + 100',
+ 'width - 100',
+],
+
+'reports/series-common.html.tmpl' => [
+ 'sel.name',
+ '"onchange=\"$sel.onchange\"" IF sel.onchange',
+],
+
+'reports/chart.csv.tmpl' => [
+ 'data.$j.$i',
+ 'colsepchar',
+],
+
+'reports/create-chart.html.tmpl' => [
+ 'series.series_id',
+ 'newidx',
+],
+
+'reports/edit-series.html.tmpl' => [
+ 'default.series_id',
+],
+
+'list/edit-multiple.html.tmpl' => [
+ 'group.id',
+ 'menuname',
+],
+
+'list/list.rdf.tmpl' => [
+ 'template_version',
+ 'bug.bug_id',
+ 'column',
+],
+
+'list/table.html.tmpl' => [
+ 'tableheader',
+ 'bug.bug_id',
+ 'abbrev.$id.title || field_descs.$id || column.title',
+],
+
+'list/list.csv.tmpl' => [
+ 'bug.bug_id',
+ 'colsepchar',
+],
+
+'list/list.js.tmpl' => [
+ 'bug.bug_id',
+],
+
+'global/choose-product.html.tmpl' => [
+ 'target',
+],
+
+# You are not permitted to add any values here. Everything in this file should
+# be filtered unless there's an extremely good reason why not, in which case,
+# use the "none" dummy filter.
+'global/code-error.html.tmpl' => [
+],
+
+'global/header.html.tmpl' => [
+ 'javascript',
+ 'style',
+ 'onload',
+ 'title',
+ '" &ndash; $header" IF header',
+ 'subheader',
+ 'header_addl_info',
+ 'message',
+],
+
+'global/messages.html.tmpl' => [
+ 'message_tag',
+ 'series.frequency * 2',
+],
+
+'global/per-bug-queries.html.tmpl' => [
+ '" value=\"$bugids\"" IF bugids',
+],
+
+'global/select-menu.html.tmpl' => [
+ 'options',
+ 'size',
+],
+
+'global/tabs.html.tmpl' => [
+ 'content',
+],
+
+# You are not permitted to add any values here. Everything in this file should
+# be filtered unless there's an extremely good reason why not, in which case,
+# use the "none" dummy filter.
+'global/user-error.html.tmpl' => [
+],
+
+'global/confirm-user-match.html.tmpl' => [
+ 'script',
+ 'fields.${field_name}.flag_type.name',
+],
+
+'global/site-navigation.html.tmpl' => [
+ 'bug.bug_id',
+ 'bug.votes',
+],
+
+'bug/comments.html.tmpl' => [
+ 'comment.id',
+ 'bug.bug_id',
+],
+
+'bug/dependency-graph.html.tmpl' => [
+ 'image_map', # We need to continue to make sure this is safe in the CGI
+ 'image_url',
+ 'map_url',
+ 'bug_id',
+],
+
+'bug/dependency-tree.html.tmpl' => [
+ 'bugid',
+ 'maxdepth',
+ 'hide_resolved',
+ 'ids.join(",")',
+ 'maxdepth + 1',
+ 'maxdepth > 0 && maxdepth <= realdepth ? maxdepth : ""',
+ 'maxdepth == 1 ? 1
+ : ( maxdepth ? maxdepth - 1 : realdepth - 1 )',
+],
+
+'bug/edit.html.tmpl' => [
+ 'bug.deadline',
+ 'bug.remaining_time',
+ 'bug.delta_ts',
+ 'bug.bug_id',
+ 'bug.votes',
+ 'group.bit',
+ 'dep.title',
+ 'dep.fieldname',
+ 'bug.${dep.fieldname}.join(\', \')',
+ 'selname',
+ '" accesskey=\"$accesskey\"" IF accesskey',
+ 'inputname',
+ '" colspan=\"$colspan\"" IF colspan',
+ '" size=\"$size\"" IF size',
+ '" maxlength=\"$maxlength\"" IF maxlength',
+ '" spellcheck=\"$spellcheck\"" IF spellcheck',
+],
+
+'bug/show-multiple.html.tmpl' => [
+ 'attachment.id',
+ 'flag.status',
+],
+
+'bug/show.html.tmpl' => [
+ 'bug.bug_id',
+],
+
+'bug/show.xml.tmpl' => [
+ 'constants.BUGZILLA_VERSION',
+ 'a.id',
+ 'field',
+],
+
+'bug/summarize-time.html.tmpl' => [
+ 'global.grand_total FILTER format("%.2f")',
+ 'subtotal FILTER format("%.2f")',
+ 'work_time FILTER format("%.2f")',
+ 'global.total FILTER format("%.2f")',
+ 'global.remaining FILTER format("%.2f")',
+ 'global.estimated FILTER format("%.2f")',
+ 'bugs.$id.remaining_time FILTER format("%.2f")',
+ 'bugs.$id.estimated_time FILTER format("%.2f")',
+],
+
+
+'bug/time.html.tmpl' => [
+ 'time_unit FILTER format(\'%.1f\')',
+ 'time_unit FILTER format(\'%.2f\')',
+ '(act / (act + rem)) * 100
+ FILTER format("%d")',
+],
+
+'bug/votes/list-for-bug.html.tmpl' => [
+ 'voter.vote_count',
+ 'total',
+],
+
+'bug/votes/list-for-user.html.tmpl' => [
+ 'product.maxperbug',
+ 'bug.id',
+ 'bug.count',
+ 'product.total',
+ 'product.maxvotes',
+],
+
+'bug/process/results.html.tmpl' => [
+ 'title.$type',
+ '"$terms.Bug $id" FILTER bug_link(id)',
+ '"$terms.bug $id" FILTER bug_link(id)',
+],
+
+'bug/create/create.html.tmpl' => [
+ 'g.bit',
+ 'sel.name',
+ 'sel.description',
+ 'cloned_bug_id',
+],
+
+'bug/create/create-guided.html.tmpl' => [
+ 'tablecolour',
+ 'sel',
+ 'productstring',
+],
+
+'bug/activity/table.html.tmpl' => [
+ 'change.attachid',
+],
+
+'attachment/create.html.tmpl' => [
+ 'bug.bug_id',
+ 'attachment.id',
+],
+
+'attachment/created.html.tmpl' => [
+ 'attachment.id',
+ 'attachment.bug_id',
+],
+
+'attachment/edit.html.tmpl' => [
+ 'attachment.id',
+ 'attachment.bug_id',
+ 'a',
+ 'editable_or_hide',
+],
+
+'attachment/list.html.tmpl' => [
+ 'attachment.id',
+ 'flag.status',
+ 'bugid',
+ 'obsolete_attachments',
+],
+
+'attachment/midair.html.tmpl' => [
+ 'attachment.id',
+],
+
+'attachment/show-multiple.html.tmpl' => [
+ 'a.id',
+ 'flag.status'
+],
+
+'attachment/updated.html.tmpl' => [
+ 'attachment.id',
+],
+
+'attachment/diff-header.html.tmpl' => [
+ 'attachid',
+ 'id',
+ 'bugid',
+ 'oldid',
+ 'newid',
+ 'patch.id',
+],
+
+'attachment/diff-file.html.tmpl' => [
+ 'lxr_prefix',
+ 'file.minus_lines',
+ 'file.plus_lines',
+ 'bonsai_prefix',
+ 'section.old_start',
+ 'section_num',
+ 'current_line_old',
+ 'current_line_new',
+],
+
+'admin/admin.html.tmpl' => [
+ 'class'
+],
+
+'admin/table.html.tmpl' => [
+ 'link_uri'
+],
+
+'admin/custom_fields/cf-js.js.tmpl' => [
+ 'constants.FIELD_TYPE_SINGLE_SELECT',
+ 'constants.FIELD_TYPE_MULTI_SELECT',
+],
+
+'admin/params/common.html.tmpl' => [
+ 'sortlist_separator',
+],
+
+'admin/products/groupcontrol/confirm-edit.html.tmpl' => [
+ 'group.count',
+],
+
+'admin/products/groupcontrol/edit.html.tmpl' => [
+ 'group.id',
+ 'constants.CONTROLMAPNA',
+ 'constants.CONTROLMAPSHOWN',
+ 'constants.CONTROLMAPDEFAULT',
+ 'constants.CONTROLMAPMANDATORY',
+],
+
+'admin/products/list.html.tmpl' => [
+ 'classification_url_part',
+],
+
+'admin/products/footer.html.tmpl' => [
+ 'classification_url_part',
+ 'classification_text',
+],
+
+'admin/flag-type/confirm-delete.html.tmpl' => [
+ 'flag_type.flag_count',
+ 'flag_type.id',
+],
+
+'admin/flag-type/edit.html.tmpl' => [
+ 'action',
+ 'type.id',
+ 'type.target_type',
+ 'type.sortkey || 1',
+ 'typeLabelLowerPlural',
+ 'typeLabelLowerSingular',
+ 'selname',
+],
+
+'admin/flag-type/list.html.tmpl' => [
+ 'type.id',
+],
+
+
+'admin/components/confirm-delete.html.tmpl' => [
+ 'comp.bug_count'
+],
+
+'admin/groups/delete.html.tmpl' => [
+ 'shared_queries'
+],
+
+'admin/users/confirm-delete.html.tmpl' => [
+ 'attachments',
+ 'reporter',
+ 'assignee_or_qa',
+ 'cc',
+ 'component_cc',
+ 'flags.requestee',
+ 'flags.setter',
+ 'longdescs',
+ 'quips',
+ 'votes',
+ 'series',
+ 'watch.watched',
+ 'watch.watcher',
+ 'whine_events',
+ 'whine_schedules',
+ 'otheruser.id'
+],
+
+'admin/users/edit.html.tmpl' => [
+ 'otheruser.id',
+ 'group.id',
+],
+
+'admin/components/edit.html.tmpl' => [
+ 'comp.bug_count'
+],
+
+'admin/workflow/edit.html.tmpl' => [
+ 'status.id',
+ 'new_status.id',
+],
+
+'admin/workflow/comment.html.tmpl' => [
+ 'status.id',
+ 'new_status.id',
+],
+
+'account/auth/login-small.html.tmpl' => [
+ 'qs_suffix',
+],
+
+'account/prefs/email.html.tmpl' => [
+ 'relationship.id',
+ 'event.id',
+ 'prefname',
+],
+
+'account/prefs/prefs.html.tmpl' => [
+ 'current_tab.label',
+ 'current_tab.name',
+],
+
+'account/prefs/saved-searches.html.tmpl' => [
+ 'group.id',
+],
+
+);
diff --git a/template/en/default/flag/list.html.tmpl b/template/en/default/flag/list.html.tmpl
new file mode 100644
index 0000000..1110fb6
--- /dev/null
+++ b/template/en/default/flag/list.html.tmpl
@@ -0,0 +1,213 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[% IF user.id AND !read_only_flags %]
+
+[%# We list flags by looping twice over the flag types relevant for the bug.
+ # In the first loop, we display existing flags and then, for active types,
+ # we display UI for adding new flags. In the second loop, we display UI
+ # for adding additional new flags for those types for which a flag already
+ # exists but which are multiplicable (can have multiple flags of the type
+ # on a single bug/attachment).
+ #%]
+
+[% DEFAULT flag_table_id = "flags" %]
+
+<script type="text/javascript" src="js/flag.js"></script>
+
+<table id="[% flag_table_id FILTER html %]">
+ [% UNLESS flag_no_header %]
+ <tr>
+ <th colspan="3">
+ Flags:
+ </th>
+ [% IF any_flags_requesteeble %]
+ <th>
+ Requestee:
+ </th>
+ [% END %]
+ </tr>
+ [% END %]
+
+ [%# Step 1: Display every flag type (except inactive types with no flags). %]
+ [% FOREACH type = flag_types %]
+
+ [%# Step 1a: Display existing flag(s). %]
+ [% FOREACH flag = type.flags %]
+ <tr>
+ <td>
+ [% flag.setter.nick FILTER html %]:
+ </td>
+ <td>
+ <label title="[% type.description FILTER html %]"
+ for="flag-[% flag.id %]">
+ [%- type.name FILTER html FILTER no_break -%]</label>
+ </td>
+ <td>
+ <select id="flag-[% flag.id %]" name="flag-[% flag.id %]"
+ title="[% type.description FILTER html %]"
+ onchange="toggleRequesteeField(this);"
+ class="flag_select flag_type-[% type.id %]">
+ [%# Only display statuses the user is allowed to set. %]
+ [% IF user.can_request_flag(type) || flag.setter_id == user.id %]
+ <option value="X"></option>
+ [% END %]
+ [% IF type.is_active %]
+ [% IF (type.is_requestable && user.can_request_flag(type)) || flag.status == "?" %]
+ <option value="?" [% "selected" IF flag.status == "?" %]>?</option>
+ [% END %]
+ [% IF user.can_set_flag(type) || flag.status == "+" %]
+ <option value="+" [% "selected" IF flag.status == "+" %]>+</option>
+ [% END %]
+ [% IF user.can_set_flag(type) || flag.status == "-" %]
+ <option value="-" [% "selected" IF flag.status == "-" %]>-</option>
+ [% END %]
+ [% ELSE %]
+ <option value="[% flag.status %]" selected="selected">[% flag.status %]</option>
+ [% END %]
+ </select>
+ </td>
+ [% IF any_flags_requesteeble %]
+ <td>
+ [% IF (type.is_active && type.is_requestable && type.is_requesteeble) || flag.requestee %]
+ <span style="white-space: nowrap;">
+ [% IF Param('usemenuforusers') %]
+ [% flag_custom_list = flag.type.grant_list %]
+ [% IF !(type.is_active && type.is_requestable && type.is_requesteeble) %]
+ [%# We are here only because there was already a requestee. In this case,
+ the only valid action is to remove the requestee or leave it alone;
+ nothing else. %]
+ [% flag_custom_list = [flag.requestee] %]
+ [% END %]
+ [% INCLUDE global/userselect.html.tmpl
+ name => "requestee-$flag.id"
+ id => "requestee-$flag.id"
+ value => flag.requestee.login
+ multiple => 0
+ emptyok => 1
+ custom_userlist => flag_custom_list
+ %]
+ [% ELSE %]
+ (<input type="text" class="requestee" maxlength="255"
+ id="requestee-[% flag.id %]"
+ name="requestee-[% flag.id %]"
+ [% IF flag.status == "?" && flag.requestee %]
+ value="[% flag.requestee.login FILTER html %]"
+ [% END %]>)
+ [% END %]
+ </span>
+ [% END %]
+ </td>
+ [% END %]
+ </tr>
+ [% END %]
+
+ [%# Step 1b: Display UI for setting flag. %]
+ [% IF (!type.flags || type.flags.size == 0) && type.is_active %]
+
+ [% PROCESS flag_row first_cell_empty = 1 addl_text = "" %]
+ [% END %]
+ [% END %]
+
+ [%# Step 2: Display flag type again (if type is multiplicable). %]
+ [% FOREACH type = flag_types %]
+ [% NEXT UNLESS type.flags && type.flags.size > 0 && type.is_multiplicable && type.is_active %]
+ [% IF !separator_displayed %]
+ <tr><td colspan="3"><hr></td></tr>
+ [% separator_displayed = 1 %]
+ [% END %]
+
+ [% PROCESS flag_row first_cell_empty = 0 addl_text = "addl." %]
+ [% END %]
+</table>
+
+[% ELSE %]
+ [%# The user is logged out. Display flags as read-only. %]
+ [% header_displayed = 0 %]
+ [% FOREACH type = flag_types %]
+ [% FOREACH flag = type.flags %]
+ [% IF !flag_no_header AND !header_displayed %]
+ <p><b>Flags:</b></p>
+ [% header_displayed = 1 %]
+ [% END %]
+ [% flag.setter.nick FILTER html %]:
+ [%+ type.name FILTER html FILTER no_break %][% flag.status %]
+ [% IF flag.requestee %]
+ ([% flag.requestee.nick FILTER html %])
+ [% END %]<br>
+ [% END %]
+ [% END %]
+[% END %]
+
+[%# Display a table row for unset flags %]
+
+[% BLOCK flag_row %]
+ <tr>
+ [% IF first_cell_empty %]
+ <td>&nbsp;</td>
+ <td>
+ [% ELSE %]
+ <td colspan="2">
+ [% END %]
+
+ [% addl_text FILTER html %]
+ <label title="[% type.description FILTER html %]" for="flag_type-[% type.id %]">
+ [%- type.name FILTER html FILTER no_break %]</label>
+ </td>
+ <td>
+ <select id="flag_type-[% type.id %]" name="flag_type-[% type.id %]"
+ title="[% type.description FILTER html %]"
+ [% " disabled=\"disabled\"" UNLESS (type.is_requestable && user.can_request_flag(type)) || user.can_set_flag(type) %]
+ onchange="toggleRequesteeField(this);"
+ class="flag_select flag_type-[% type.id %]">
+ <option value="X"></option>
+ [% IF type.is_requestable && user.can_request_flag(type) %]
+ <option value="?">?</option>
+ [% END %]
+ [% IF user.can_set_flag(type) %]
+ <option value="+">+</option>
+ <option value="-">-</option>
+ [% END %]
+ </select>
+ </td>
+ [% IF any_flags_requesteeble %]
+ <td>
+ [% IF type.is_requestable && type.is_requesteeble %]
+ <span style="white-space: nowrap;">
+ [% IF Param('usemenuforusers') %]
+ [% INCLUDE global/userselect.html.tmpl
+ name => "requestee_type-$type.id"
+ id => "requestee_type-$type.id"
+ multiple => type.is_multiplicable * 3
+ emptyok => !type.is_multiplicable
+ value => ""
+ custom_userlist => type.grant_list
+ %]
+ [% ELSE %]
+ (<input type="text" class="requestee" maxlength="255"
+ id="requestee_type-[% type.id %]"
+ name="requestee_type-[% type.id %]">)
+ [% END %]
+ </span>
+ [% END %]
+ </td>
+ [% END %]
+ </tr>
+[% END %]
diff --git a/template/en/default/global/banner.html.tmpl b/template/en/default/global/banner.html.tmpl
new file mode 100644
index 0000000..ab1c2a8
--- /dev/null
+++ b/template/en/default/global/banner.html.tmpl
@@ -0,0 +1,26 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Matthew Tuck <matty@chariot.net.au>
+ # Vitaly Harisov <vitaly@rathedg.com>
+ #%]
+
+[%# Migration note: this file corresponds to the old Param 'bannerhtml' %]
+
+ <div id="banner">
+ </div>
diff --git a/template/en/default/global/choose-classification.html.tmpl b/template/en/default/global/choose-classification.html.tmpl
new file mode 100644
index 0000000..9342d81
--- /dev/null
+++ b/template/en/default/global/choose-classification.html.tmpl
@@ -0,0 +1,63 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Albert Ting
+ #
+ # Contributor(s): Albert Ting <alt@sonic.net>
+ #%]
+
+[%# INTERFACE:
+ # classifications: an array of classification objects containing
+ # at least one product accessible by the user.
+ #%]
+
+[% IF target == "enter_bug.cgi" %]
+ [% title = "Select Classification" %]
+ [% subheader = "Please select the classification." %]
+[% END %]
+
+[% DEFAULT title = "Choose the classification" %]
+[% PROCESS global/header.html.tmpl %]
+
+<table>
+ <tr>
+ <th align="right">
+ <a href="[% target FILTER url_quote %]?classification=__all
+ [% IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER url_quote %][% END -%]
+ [%- IF format %]&amp;format=[% format FILTER url_quote %][% END %]">
+ All</a>:
+ </th>
+
+ <td valign="top">&nbsp;Show all products</td>
+ </tr>
+ <tr>
+ <th colspan="2">&nbsp;</th>
+ </tr>
+
+[% FOREACH class = classifications %]
+ <tr>
+ <th align="right">
+ <a href="[% target FILTER url_quote %]?classification=[% class.name FILTER url_quote -%]
+ [%- IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER url_quote %][% END -%]
+ [%- IF format %]&amp;format=[% format FILTER url_quote %][% END %]">
+ [% class.name FILTER html %]</a>:
+ </th>
+
+ [% IF class.description %]
+ <td valign="top">&nbsp;[% class.description FILTER html_light %]</td>
+ [% END %]
+ </tr>
+[% END %]
+
+</table>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/global/choose-product.html.tmpl b/template/en/default/global/choose-product.html.tmpl
new file mode 100644
index 0000000..5c9ad09
--- /dev/null
+++ b/template/en/default/global/choose-product.html.tmpl
@@ -0,0 +1,75 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # classifications: array of hashes, with an 'object' key representing a
+ # classification object and 'products' the list of
+ # product objects the user can enter bugs into.
+ # target: the script that displays this template.
+ # cloned_bug_id: ID of the bug being cloned.
+ # format: the desired format to display the target.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% IF target == "enter_bug.cgi" %]
+ [% title = "Enter $terms.Bug" %]
+ [% h2 = BLOCK %]First, you must pick a product on which to enter [% terms.abug %]: [% END %]
+[% ELSIF target == "describecomponents.cgi" %]
+ [% title = "Browse" %]
+ [% h2 = "Select a product category to browse:" %]
+[% END %]
+
+[% DEFAULT title = "Choose a Product" %]
+[% PROCESS global/header.html.tmpl %]
+
+<h2>[% h2 FILTER html %]</h2>
+
+<table>
+
+[% FOREACH c = classifications %]
+ [% IF c.object %]
+ <tr>
+ <th colspan="2" align="left">[% c.object.name FILTER html %]:
+ [%+ c.object.description FILTER html_light %]</th>
+ </tr>
+ [% END %]
+
+ [% FOREACH p = c.products %]
+ <tr>
+ <th align="right" valign="top">
+ <a href="[% target %]?product=[% p.name FILTER url_quote -%]
+ [%- IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER url_quote %][% END -%]
+ [%- IF format %]&amp;format=[% format FILTER url_quote %][% END %]">
+ [% p.name FILTER html FILTER no_break %]</a>:&nbsp;
+ </th>
+
+ <td valign="top">[% p.description FILTER html_light %]</td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <th colspan="2">&nbsp;</th>
+ </tr>
+[% END %]
+
+</table>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl
new file mode 100644
index 0000000..753695b
--- /dev/null
+++ b/template/en/default/global/code-error.html.tmpl
@@ -0,0 +1,574 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # header_done: boolean. True if the header has already been printed.
+ # error: string. The tag of the error.
+ # variables: hash. Useful data about the problem. The keys are the variable
+ # names, and the values the variable values.
+ #%]
+
+[%# This is a list of all the possible code errors. Please keep them in
+ # alphabetical order by error tag, and leave a blank line between errors.
+ #
+ # Note that you must explicitly filter every single template variable
+ # in this file; if you do not wish to change it, use the "none" filter.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% DEFAULT title = "Internal Error" %]
+
+[% error_message = BLOCK %]
+ [% IF error == "action_unrecognized" %]
+ [% docslinks = {'query.html' => "Searching for $terms.bugs",
+ 'query.html#list' => "$terms.Bug lists"} %]
+ I don't recognize the value (<em>[% action FILTER html %]</em>)
+ of the <em>action</em> variable.
+
+ [% ELSIF error == "attachment_already_obsolete" %]
+ Attachment #[% attach_id FILTER html %] ([% description FILTER html %])
+ is already obsolete.
+
+ [% ELSIF error == "attachment_local_storage_disabled" %]
+ [% title = "Local Storage Disabled" %]
+ You cannot store attachments locally. This feature is disabled.
+
+ [% ELSIF error == "attachment_url_disabled" %]
+ [% title = "Attachment URL Disabled" %]
+ You cannot attach a URL. This feature is currently disabled.
+
+ [% ELSIF error == "auth_invalid_email" %]
+ [% title = "Invalid Email Address" %]
+ We received an email address (<b>[% addr FILTER html %]</b>)
+ that didn't pass our syntax checking for a legal email address,
+ when trying to create or update your account.
+ [% IF default %]
+ A legal address must contain exactly one '@',
+ and at least one '.' after the @.
+ [% ELSE %]
+ [%+ Param('emailregexpdesc') %]
+ [% END %]
+ It must also not contain any of these special characters:
+ <tt>\ ( ) &amp; &lt; &gt; , ; : &quot; [ ]</tt>, or any whitespace.
+
+ [% ELSIF error == "authres_unhandled" %]
+ The result value of [% value FILTER html %] was not handled by
+ the login code.
+
+ [% ELSIF error == "bad_page_cgi_id" %]
+ [% title = "Invalid Page ID" %]
+ The ID <code>[% page_id FILTER html %]</code> is not a
+ valid page identifier.
+
+ [% ELSIF error == "bad_arg" %]
+ Bad argument <code>[% argument FILTER html %]</code> sent to
+ <code>[% function FILTER html %]</code> function.
+
+ [% ELSIF error == "bug_error" %]
+ Trying to retrieve [% terms.bug %] [%+ bug.bug_id FILTER html %] returned
+ the error [% bug.error FILTER html %].
+
+ [% ELSIF error == "chart_data_not_generated" %]
+ [% admindocslinks = {'extraconfig.html' => 'Setting up Charting'} %]
+ [% IF product %]
+ Charts for the <em>[% product FILTER html %]</em> product are not
+ available yet because no charting data has been collected for it since it
+ was created.
+ [% ELSE %]
+ No charting data has been collected yet.
+ [% END %]
+ Please wait a day and try again.
+ If you're seeing this message after a day, then you should contact
+ <a href="mailto:[% Param('maintainer') %]">[% Param('maintainer') %]</a>
+ and reference this error.
+
+ [% ELSIF error == "chart_datafile_corrupt" %]
+ The chart data file [% file FILTER html %] is corrupt.
+
+ [% ELSIF error == "chart_dir_nonexistent" %]
+ One of the directories <tt>[% dir FILTER html %]</tt> and
+ <tt>[% graph_dir FILTER html %]</tt> does not exist.
+
+ [% ELSIF error == "chart_file_open_fail" %]
+ Unable to open the chart datafile <tt>[% filename FILTER html %]</tt>.
+
+ [% ELSIF error == "column_not_null_without_default" %]
+ Failed adding the column [% name FILTER html %]:
+ You cannot add a NOT NULL column with no default to an existing table
+ unless you specify something for the <code>$init_value</code> argument.
+
+ [% ELSIF error == "column_not_null_no_default_alter" %]
+ You cannot alter the [% name FILTER html %] column to be NOT NULL
+ without specifying a default or something for $set_nulls_to, because
+ there are NULL values currently in it.
+
+ [% ELSIF error == "comment_extra_data_not_allowed" %]
+ You tried to set the <code>extra_data</code> field to
+ '[% extra_data FILTER html %]' but comments of type [% type FILTER html %]
+ do not accept an <code>extra_data</code> argument.
+
+ [% ELSIF error == "comment_extra_data_required" %]
+ Comments of type [% type FILTER html %] require an <code>extra_data</code>
+ argument to be set.
+
+ [% ELSIF error == "comment_extra_data_not_numeric" %]
+ You tried to set the <code>extra_data</code> field to
+ '[% extra_data FILTER html %]' but comments of type [% type FILTER html %]
+ require a numeric <code>extra_data</code> argument.
+
+ [% ELSIF error == "comment_type_invalid" %]
+ '[% type FILTER html %]' is not a valid comment type.
+
+ [% ELSIF error == "db_rename_conflict" %]
+ Name conflict: Cannot rename [% old FILTER html %] to
+ [% new FILTER html %] because [% new FILTER html %] already exists.
+
+ [% ELSIF error == "cookies_need_value" %]
+ Every cookie must have a value.
+
+ [% ELSIF error == "env_no_email" %]
+ [% terms.Bugzilla %] did not receive an email address from the
+ environment.
+ [% IF Param("auth_env_email") %]
+ This means that the '[% Param("auth_env_email") FILTER html %]'
+ environment variable was empty or did not exist.
+ [% ELSE %]
+ You need to set the "auth_env_email" parameter to the name of
+ the environment variable that will contain the user's email
+ address.
+ [% END %]
+
+ [% ELSIF error == "extension_must_be_subclass" %]
+ <code>[% package FILTER html %]</code> from
+ <code>[% filename FILTER html %]</code> is not a subclass of
+ <code>[% class FILTER html %]</code>.
+
+ [% ELSIF error == "extension_must_return_name" %]
+ <code>[% extension FILTER html %]</code> returned
+ <code>[% returned FILTER html %]</code>, which is not a valid name
+ for an extension. Extensions must return their name, not <code>1</code>
+ or a number. See the documentation of
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Extension.html">Bugzilla::Extension</a>
+ for details.
+
+ [% ELSIF error == "extension_no_name" %]
+ We did not find a <code>NAME</code> method in
+ <code>[% package FILTER html %]</code> (loaded from
+ <code>[% filename FILTER html %]</code>). This means that
+ the extension has one or more of the following problems:
+
+ <ul>
+ <li><code>[% filename FILTER html %]</code> did not define a
+ <code>[% package FILTER html %]</code> package.</li>
+ <li><code>[% package FILTER html %]</code> did not define a
+ <code>NAME</code> method (or the <code>NAME</code> method
+ returned an empty string).</li>
+ </ul>
+
+ [% ELSIF error == "extern_id_conflict" %]
+ The external ID '[% extern_id FILTER html %]' already exists
+ in the database for '[% username FILTER html %]', but your
+ account source says that '[% extern_user FILTER html %]' has that ID.
+
+ [% ELSIF error == "field_choice_must_use_type" %]
+ When you call a class method on <code>Bugzilla::Field::Choice</code>,
+ you must call <code>Bugzilla::Field::Choice-&gt;type('some_field')</code>
+ to generate the right class (you can't call class methods directly
+ on Bugzilla::Field::Choice).
+
+ [% ELSIF error == "field_not_custom" %]
+ '[% field.description FILTER html %]' ([% field.name FILTER html %])
+ is not a custom field.
+
+ [% ELSIF error == "field_type_mismatch" %]
+ Cannot seem to handle <code>[% field FILTER html %]</code>
+ and <code>[% type FILTER html %]</code> together.
+
+ [% ELSIF error == "field_type_not_specified" %]
+ [% title = "Field Type Not Specified" %]
+ You must specify a type when creating a custom field.
+
+ [% ELSIF error == "illegal_content_type_method" %]
+ Your form submission got corrupted somehow. The <em>content
+ method</em> field, which specifies how the content type gets determined,
+ should have been either <em>autodetect</em>, <em>list</em>,
+ or <em>manual</em>, but was instead
+ <em>[% contenttypemethod FILTER html %]</em>.
+
+ [% ELSIF error == "illegal_field" %]
+ A legal [% field FILTER html %] was not set.
+
+ [% ELSIF error == "inactive_group" %]
+ Attempted to add [% terms.bug %] to the '[% name FILTER html %]'
+ group, which is not used for [% terms.bugs %].
+
+ [% ELSIF error == "invalid_attach_id_to_obsolete" %]
+ The attachment number of one of the attachments you wanted to obsolete,
+ [% attach_id FILTER html %], is invalid.
+
+ [% ELSIF error == "invalid_customfield_type" %]
+ [% title = "Invalid Field Type" %]
+ The type <em>[% type FILTER html %]</em> is not a valid field type.
+
+ [% ELSIF error == "invalid_dimensions" %]
+ [% title = "Invalid Dimensions" %]
+ The width or height specified is not a positive integer.
+
+ [% ELSIF error == "invalid_feature" %]
+ [% title = "Invalid Feature Name" %]
+ [% feature FILTER html %] is not a valid feature name. See
+ <code>OPTIONAL_MODULES</code> in
+ <code>Bugzilla::Install::Requirements</code> for valid names.
+
+ [% ELSIF error == "invalid_flag_association" %]
+ [% title = "Invalid Flag Association" %]
+ Some flags do not belong to
+ [% IF attach_id %]
+ attachment [% attach_id FILTER html %].
+ [% ELSE %]
+ [%+ terms.bug %] [%+ bug_id FILTER html %].
+ [% END %]
+
+ [% ELSIF error == "invalid_series_id" %]
+ [% title = "Invalid Series" %]
+ The series_id [% series_id FILTER html %] is not valid. It may be that
+ this series has been deleted.
+
+ [% ELSIF error == "invalid_webservergroup" %]
+ There is no such group: [% group FILTER html %]. Check your $webservergroup
+ setting in [% constants.bz_locations.localconfig FILTER html %].
+
+ [% ELSIF error == "mismatched_bug_ids_on_obsolete" %]
+ Attachment [% attach_id FILTER html %] ([% description FILTER html %])
+ is attached to [% terms.bug %] [%+ attach_bug_id FILTER html %],
+ but you tried to flag it as obsolete while creating a new attachment to
+ [% terms.bug %] [%+ my_bug_id FILTER html %].
+
+ [% ELSIF error == "feature_disabled" %]
+ The [% install_string("feature_$feature") FILTER html %] feature is not
+ available in this [% terms.Bugzilla %].
+ [% IF user.in_group('admin') %]
+ If you would like to enable this feature, please run
+ <kbd>checksetup.pl</kbd> to see how to install the necessary
+ requirements for this feature.
+ [% END %]
+
+ [% ELSIF error == "flag_unexpected_object" %]
+ [% title = "Object Not Recognized" %]
+ Flags cannot be set for objects of type [% caller FILTER html %].
+ They can only be set for [% terms.bugs %] and attachments.
+
+ [% ELSIF error == "flag_requestee_disabled" %]
+ [% title = "Flag not Requestable from Specific Person" %]
+ You can't ask a specific person for
+ <em>[% type.name FILTER html %]</em>.
+
+ [% ELSIF error == "flag_status_invalid" %]
+ The flag status <em>[% status FILTER html %]</em>
+ [% IF id %]
+ for flag ID #[% id FILTER html %]
+ [% END %]
+ is invalid.
+
+ [% ELSIF error == "flag_type_inactive" %]
+ [% title = "Inactive Flag Type" %]
+ The flag type [% type FILTER html %] is inactive and cannot be used
+ to create new flags.
+
+ [% ELSIF error == "flag_type_nonexistent" %]
+ There is no flag type with the ID <em>[% id FILTER html %]</em>.
+
+ [% ELSIF error == "flag_type_target_type_invalid" %]
+ The target type was neither <em>[% terms.bug %]</em> nor <em>attachment</em>
+ but rather <em>[% target_type FILTER html %]</em>.
+
+ [% ELSIF error == "invalid_field_name" %]
+ Can't use [% field FILTER html %] as a field name.
+
+ [% ELSIF error == "invalid_keyword_id" %]
+ The keyword ID <em>[% id FILTER html %]</em> couldn't be
+ found.
+
+ [% ELSIF error == "invalid_user" %]
+ [% title = "Invalid User" %]
+ There is no user account
+ [% IF user_id %]
+ with ID <em>[% user_id FILTER html %]</em>.
+ [% ELSIF user_login %]
+ with login name <em>[% user_login FILTER html %]</em>.
+ [% ELSE %]
+ given.
+ [% END %]
+
+ [% ELSIF error == "jobqueue_insert_failed" %]
+ [% title = "Job Queue Failure" %]
+ Inserting a <code>[% job FILTER html %]</code> job into the Job
+ Queue failed with the following error: [% errmsg FILTER html %]
+
+ [% ELSIF error == "jobqueue_no_job_mapping" %]
+ <code>Bugzilla::JobQueue</code> has not been configured to handle
+ the job "[% job FILTER html %]". You need to add this job type
+ to the <code>JOB_MAP</code> constant in <code>Bugzilla::JobQueue</code>.
+
+ [% ELSIF error == "ldap_bind_failed" %]
+ Failed to bind to the LDAP server. The error message was:
+ <code>[% errstr FILTER html %]</code>
+
+ [% ELSIF error == "ldap_cannot_retreive_attr" %]
+ The specified LDAP attribute [% attr FILTER html %] was not found.
+
+ [% ELSIF error == "ldap_connect_failed" %]
+ Could not connect to the LDAP server(s) <code>[% server FILTER html %]</code>.
+
+ [% ELSIF error == "ldap_start_tls_failed" %]
+ Could not start TLS with LDAP server: <code>[% error FILTER html %]</code>.
+
+ [% ELSIF error == "ldap_search_error" %]
+ An error occurred while trying to search LDAP for
+ &quot;[% username FILTER html %]&quot;:
+ [% IF errstr %]
+ <code>[% errstr FILTER html %]</code>
+ [% ELSE %]
+ Unable to find user in LDAP
+ [% END %]
+
+ [% ELSIF error == "ldap_server_not_defined" %]
+ The LDAP server for authentication has not been defined.
+
+ [% ELSIF error == "mail_send_error" %]
+ There was an error sending mail from '[% mail.header('From') FILTER html %]'
+ to '[% mail.header('To') FILTER html %]':
+ [% msg FILTER html %]
+
+ [% ELSIF error == "missing_bug_id" %]
+ No [% terms.bug %] ID was given.
+
+ [% ELSIF error == "missing_series_id" %]
+ Having inserted a series into the database, no series_id was returned for
+ it. Series: [% series.category FILTER html %] /
+ [%+ series.subcategory FILTER html %] /
+ [%+ series.name FILTER html %].
+
+ [% ELSIF error == "need_quipid" %]
+ A valid quipid is needed.
+
+ [% ELSIF error == "no_manual_moved" %]
+ You cannot set the resolution of [% terms.abug %] to [% display_value("resolution", "MOVED") FILTER html %] without
+ moving the [% terms.bug %].
+
+ [% ELSIF error == "no_open_bug_status" %]
+ [% title = "$terms.Bug Cannot Be Confirmed" %]
+ There is no valid transition from
+ [%+ display_value("bug_status", "UNCONFIRMED") FILTER html %] to an open state.
+
+ [% ELSIF error == "param_invalid" %]
+ [% title = "Invalid Parameter" %]
+ <code>[% param FILTER html %]</code> is not a valid parameter
+ for the [% function FILTER html %] function.
+
+ [% ELSIF error == "param_must_be_numeric" %]
+ [% title = "Invalid Parameter" %]
+ Invalid parameter <code>[% param FILTER html %]</code> passed to
+ <code>[% function FILTER html %]</code>: It must be numeric.
+
+ [% ELSIF error == "param_required" %]
+ [% title = "Missing Parameter" %]
+ The function <code>[% function FILTER html %]</code> requires
+ a <code>[% param FILTER html %]</code> argument, and that
+ argument was not set.
+
+ [% ELSIF error == "params_required" %]
+ [% title = "Missing Parameter" %]
+ The function <code>[% function FILTER html %]</code> requires
+ that you set one of the following parameters:
+ <code>[% params.join(', ') FILTER html %]</code>
+
+ [% ELSIF error == "product_empty_group_controls" %]
+ [% title = "Missing Group Controls" %]
+ New settings must be defined to edit group controls for
+ the [% group.name FILTER html %] group.
+
+ [% ELSIF error == "product_illegal_group_control" %]
+ [% title = "Illegal Group Control" %]
+ '[% value FILTER html %]' is not a legal value for
+ the '[% field FILTER html %]' field.
+
+ [% ELSIF error == "protection_violation" %]
+ The function <code>[% function FILTER html %]</code> was called
+
+ [% IF argument %]
+ with the argument <code>[% argument FILTER html %]</code>
+ [% END %]
+
+ from
+
+ [% IF caller %]
+ <code>[%+ caller FILTER html %]</code>, which is
+ [% END %]
+
+ outside the package. This function may only be called from
+ a subclass of <code>[% superclass FILTER html %]</code>.
+
+ [% ELSIF error == "radius_preparation_error" %]
+ An error occurred while preparing for a RADIUS authentication request:
+ <code>[% errstr FILTER html %]</code>.
+
+ [% ELSIF error == "request_queue_group_invalid" %]
+ The group field <em>[% group FILTER html %]</em> is invalid.
+
+ [% ELSIF error == "report_axis_invalid" %]
+ <em>[% val FILTER html %]</em> is not a valid value for
+ [%+ IF fld == "x" %]the horizontal axis
+ [%+ ELSIF fld == "y" %]the vertical axis
+ [%+ ELSIF fld == "z" %]the multiple tables/images
+ [%+ ELSE %]a report axis[% END %] field.
+
+ [% ELSIF error == "setting_info_invalid" %]
+ To create a new setting, you must supply a setting name, a list of
+ value/sortindex pairs, and the devault value.
+
+ [% ELSIF error == "setting_name_invalid" %]
+ The setting name <em>[% name FILTER html %]</em> is not a valid
+ option. Setting names must begin with a letter, and contain only
+ letters, digits, or the symbols '_', '-', '.', or ':'.
+
+ [% ELSIF error == "setting_subclass_invalid" %]
+ There is no such Setting subclass as
+ <code>[% subclass FILTER html %]</code>.
+
+ [% ELSIF error == "setting_value_invalid" %]
+ The value "<code>[% value FILTER html %]</code>" is not in the list of
+ legal values for the <em>[% name FILTER html %]</em> setting.
+
+ [% ELSIF error == "token_generation_error" %]
+ Something is seriously wrong with the token generation system.
+
+ [% ELSIF error == "template_error" %]
+ [% template_error_msg FILTER html %]
+
+ [% ELSIF error == "template_invalid" %]
+ Template with invalid file name found in hook call: [% name FILTER html %].
+
+ [% ELSIF error == "unable_to_retrieve_password" %]
+ I was unable to retrieve your old password from the database.
+
+ [% ELSIF error == "undefined_field" %]
+ Form field [% field FILTER html %] was not defined.
+
+ [% ELSIF error == "unknown_action" %]
+ [% IF action %]
+ Unknown action [% action FILTER html %]!
+ [% ELSE %]
+ I could not figure out what you wanted to do.
+ [% END %]
+
+ [% ELSIF error == "unknown_method" %]
+ The requested method '[% method FILTER html %]' was not found.
+
+ [% ELSIF error == "usage_mode_invalid" %]
+ '[% invalid_usage_mode FILTER html %]' is not a valid usage mode.
+
+ [% ELSIF error == "must_be_patch" %]
+ [% title = "Attachment Must Be Patch" %]
+ Attachment #[% attach_id FILTER html %] must be a patch.
+
+ [% ELSIF error == "not_in_transaction" %]
+ Attempted to end transaction without starting one first.
+
+ [% ELSIF error == "comma_operator_deprecated" %]
+ [% title = "SQL query generator internal error" %]
+ There is an internal error in the SQL query generation code,
+ creating queries with implicit JOIN.
+
+ [% ELSIF error == "invalid_post_bug_submit_action" %]
+ Invalid setting for post_bug_submit_action
+
+ [% ELSE %]
+ [%# Try to find hooked error messages %]
+ [% error_message = Hook.process("errors") %]
+ [% IF NOT error_message %]
+ [% title = "Internal error" %]
+ An internal error has occurred, but [% terms.Bugzilla %] doesn't know
+ what <code>[% error FILTER html %]</code> means.
+
+ If you are a [% terms.Bugzilla %] end-user seeing this message, please save
+ this page and send it to [% Param('maintainer') %].
+ [% ELSE %]
+ [% error_message FILTER none %]
+ [% END %]
+ [% END %]
+[% END %]
+
+[%# We only want HTML error messages for ERROR_MODE_WEBPAGE %]
+[% USE Bugzilla %]
+[% IF Bugzilla.error_mode != constants.ERROR_MODE_WEBPAGE %]
+ [% IF Bugzilla.usage_mode == constants.USAGE_MODE_BROWSER %]
+ [% error_message FILTER none %]
+ [% ELSE %]
+ [% error_message FILTER txt %]
+ [% END %]
+ [% RETURN %]
+[% END %]
+
+[% UNLESS header_done %]
+ [% PROCESS global/header.html.tmpl %]
+[% END %]
+
+[% PROCESS global/docslinks.html.tmpl
+ docslinks = docslinks
+ admindocslinks = admindocslinks
+%]
+
+<tt>
+ <p>
+ [% terms.Bugzilla %] has suffered an internal error. Please save this page and send
+ it to [% Param("maintainer") %] with details of what you were doing at
+ the time this message appeared.
+ </p>
+ <script type="text/javascript"> <!--
+ document.write("<p>URL: " +
+ document.location.href.replace(/&/g,"&amp;")
+ .replace(/</g,"&lt;")
+ .replace(/>/g,"&gt;") + "</p>");
+ // -->
+ </script>
+</tt>
+
+<table cellpadding="20">
+ <tr>
+ <td bgcolor="#ff0000">
+ <font size="+2">
+ [% error_message FILTER none %]
+ </font>
+ </td>
+ </tr>
+</table>
+
+[% IF variables %]
+ <pre>
+Variables:
+ [% FOREACH key = variables.keys %]
+ [%+ key FILTER html %]: [%+ variables.$key FILTER html %]
+ [% END %]
+ </pre>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/global/common-links.html.tmpl b/template/en/default/global/common-links.html.tmpl
new file mode 100644
index 0000000..6ad638f
--- /dev/null
+++ b/template/en/default/global/common-links.html.tmpl
@@ -0,0 +1,116 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Svetlana Harisova <light@rathedg.com>
+ #%]
+
+[% DEFAULT qs_suffix = "" %]
+[% USE Bugzilla %]
+
+<ul class="links">
+ <li><a href="./">Home</a></li>
+ <li><span class="separator">| </span><a href="enter_bug.cgi">New</a></li>
+ <li><span class="separator">| </span><a href="describecomponents.cgi">Browse</a></li>
+ <li><span class="separator">| </span><a href="query.cgi">Search</a></li>
+
+ <li class="form">
+ <span class="separator">| </span>
+ <form action="buglist.cgi" method="get"
+ onsubmit="if (this.quicksearch.value == '')
+ { alert('Please enter one or more search terms first.');
+ return false; } return true;">
+ <input class="txt" type="text" id="quicksearch[% qs_suffix FILTER html %]" name="quicksearch">
+ <input class="btn" type="submit" value="Search"
+ id="find[% qs_suffix FILTER html %]">
+ [%-# Work around FF bug: keep this on one line %]</form>
+ <a href="page.cgi?id=quicksearch.html" title="Quicksearch Help">[?]</a></li>
+
+ <li><span class="separator">| </span><a href="report.cgi">Reports</a></li>
+
+ <li>
+ [% IF Param('shutdownhtml') || Bugzilla.has_flags %]
+ <span class="separator">| </span>
+ [% IF user.id %]
+ <a href="request.cgi?requester=[% user.login FILTER url_quote %]&amp;requestee=
+ [% user.login FILTER url_quote %]&amp;do_union=1&amp;group=type&amp;action=queue">My Requests</a>
+ [% ELSE %]
+ <a href="request.cgi">Requests</a>
+ [% END %]
+ [% END %]
+ [%-# Work around FF bug: keep this on one line %]</li>
+
+ [% IF user.login %]
+ <li><span class="separator">| </span><a href="userprefs.cgi">Preferences</a></li>
+ [% IF user.in_group('tweakparams') || user.in_group('editusers') || user.can_bless
+ || (Param('useclassification') && user.in_group('editclassifications'))
+ || user.in_group('editcomponents') || user.in_group('admin') || user.in_group('creategroups')
+ || user.in_group('editkeywords') || user.in_group('bz_canusewhines')
+ || user.get_products_by_permission("editcomponents").size %]
+ <li><span class="separator">| </span><a href="admin.cgi">Administration</a></li>
+ [% END %]
+
+ [% PROCESS link_to_documentation %]
+
+ <li>
+ <span class="separator">| </span>
+ [% IF user.authorizer.can_logout %]
+ <a href="index.cgi?logout=1">Log&nbsp;out</a>
+ [% ELSE %]
+ Logged&nbsp;in&nbsp;as
+ [% END %]
+ [% IF sudoer %]
+ [%+ sudoer.login FILTER html %] (<b>impersonating
+ [%+ user.login FILTER html %]</b>
+ <a href="relogin.cgi?action=end-sudo">end session</a>)
+ [% ELSE %]
+ [%+ user.login FILTER html %]
+ [% END %]
+ [%-# Work around FF bug: keep this on one line %]</li>
+ [% ELSE %]
+
+ [% PROCESS link_to_documentation %]
+
+ [% IF Param('createemailregexp')
+ && user.authorizer.user_can_create_account %]
+ <li id="new_account_container[% qs_suffix FILTER html %]">
+ <span class="separator">| </span>
+ <a href="createaccount.cgi">New&nbsp;Account</a>
+ </li>
+ [% END %]
+
+ [%# Only display one login form when we're on a LOGIN_REQUIRED page. That
+ # way, we're guaranteed that the user will use the form that has
+ # hidden_fields in it (the center form) instead of this one. Also, it's
+ # less confusing to have one form (as opposed to three) when you're
+ # required to log in.
+ #%]
+ [% IF user.authorizer.can_login && !Bugzilla.page_requires_login %]
+ [% PROCESS "account/auth/login-small.html.tmpl" %]
+ [% END %]
+ [% END %]
+</ul>
+
+[% Hook.process("link-row") %]
+[% BLOCK link_to_documentation %]
+ [% IF doc_section && Param('docs_urlbase') %]
+ <li>
+ <span class="separator">| </span>
+ <a href="[% docs_urlbase _ doc_section FILTER html %]" target="_blank">Help</a>
+ </li>
+ [% END %]
+[% END %]
diff --git a/template/en/default/global/confirm-action.html.tmpl b/template/en/default/global/confirm-action.html.tmpl
new file mode 100644
index 0000000..e57a83c
--- /dev/null
+++ b/template/en/default/global/confirm-action.html.tmpl
@@ -0,0 +1,63 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Frédéric Buclin.
+ # Portions created by Frédéric Buclin are Copyright (C) 2008
+ # Frédéric Buclin. All Rights Reserved.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # script_name: the script generating this warning.
+ # token: a valid token for the current action.
+ # reason: reason of the failure.
+ #%]
+
+[% PROCESS global/header.html.tmpl title = "Suspicious Action"
+ style_urls = ['skins/standard/global.css'] %]
+
+<div class="throw_error">
+ [% IF reason == "expired_token" %]
+ Your changes have been rejected because you exceeded the time limit
+ of [% constants.MAX_TOKEN_AGE FILTER html %] days before submitting your
+ changes to [% script_name FILTER html %]. Your page may have been displayed
+ for too long, or old changes have been resubmitted by accident.
+
+ [% ELSIF reason == "missing_token" %]
+ It looks like you didn't come from the right page.
+ One reason could be that you entered the URL in the address bar of your
+ web browser directly, which should be safe. Another reason could be that
+ you clicked on a URL which redirected you here <b>without your consent</b>.
+
+ [% ELSIF reason == "invalid_token" %]
+ You submitted changes to [% script_name FILTER html %] with an invalid
+ token, which may indicate that someone tried to abuse you, for instance
+ by making you click on a URL which redirected you here <b>without your
+ consent</b>.
+ [% END %]
+ <p>
+ Are you sure you want to commit these changes?
+ </p>
+</div>
+
+<form name="check" id="check" method="post" action="[% script_name FILTER html %]">
+ [% PROCESS "global/hidden-fields.html.tmpl"
+ exclude="^(Bugzilla_login|Bugzilla_password|token)$" %]
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="submit" id="confirm" value="Yes, Confirm Changes">
+</form>
+
+<p><a href="index.cgi">No, throw away these changes</a> (you will be redirected
+to the home page).</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/global/confirm-user-match.html.tmpl b/template/en/default/global/confirm-user-match.html.tmpl
new file mode 100644
index 0000000..67a901f
--- /dev/null
+++ b/template/en/default/global/confirm-user-match.html.tmpl
@@ -0,0 +1,202 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Erik Stambaugh <not_erik@dasbistro.com>
+ #%]
+
+[%# INTERFACE:
+ # fields: hash/record; the fields being matched, each of which has:
+ # type: single|multi: whether or not the user can select multiple matches
+ # flag_type: for flag requestee fields, the type of flag being requested
+ # matches: hash; Hierarchical. The levels go like this:
+ # field_name {
+ # pattern_text {
+ # 'users' = @user_list (user objects)
+ # 'status' = success|fail|trunc (result of search.
+ # 'trunc' (truncated) means max was reached)
+ # }
+ # }
+ # script: string; The name of the calling script, used to create a
+ # self-referential URL
+ #%]
+
+[%# use the global field descs %]
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[%# This lists fields which use the user auto-completion feature and which
+ # are not listed in field_descs. %]
+[% field_labels = { # Used by editcomponents.cgi
+ "initialcc" => "Default CC List",
+ "initialowner" => "Default Assignee",
+ "initialqacontact" => "Default QA Contact",
+ # Used by process_bug.cgi
+ "masscc" => "CC List",
+ # Used by request.cgi
+ "requester" => "Requester",
+ "requestee" => "Requestee",
+ # Used by userprefs.cgi
+ "new_watchedusers" => "Watch List",
+
+ }
+%]
+[% IF matchsuccess == 1 %]
+ [% PROCESS global/header.html.tmpl title="Confirm Match" %]
+
+ [% USE Bugzilla %]
+
+ <form method="post"
+ [% IF script -%]
+ action="[% script %]"
+ [%- END -%]
+ [% IF Bugzilla.cgi.param("data") %]
+ enctype="multipart/form-data"
+ [% END %]
+ >
+
+ <p>
+ [% IF matchmultiple %]
+ [% terms.Bugzilla %] cannot make a conclusive match for one or more
+ of the names and/or email addresses you entered on the previous page.
+ <br>Please examine the lists of potential matches below and select the
+ ones you want,
+ [% ELSE %]
+ [% terms.Bugzilla %] is configured to require verification whenever
+ you enter a name or partial email address.
+ <br>Below are the names/addresses you entered and the matched accounts.
+ Please confirm that they are correct,
+ [% END %]
+ or go back to the previous page to revise the names you entered.
+ </p>
+[% ELSE %]
+ [% PROCESS global/header.html.tmpl title="Match Failed" %]
+ <p>
+ [% terms.Bugzilla %] was unable to make any match at all for one or more of
+ the names and/or email addresses you entered on the previous page.
+ [% IF !user.id %]
+ <b>Note: You are currently logged out. Only exact matches against e-mail
+ addresses will be performed.</b>
+ [% END %]
+ </p>
+ <p>Please go back and try other names or email addresses.</p>
+[% END %]
+
+ <table border="0">
+ <tr>
+ <td colspan="2">
+ <hr width="100%" size="1">
+ </td>
+ </tr>
+
+ [%# this is messy to allow later expansion %]
+
+ [% FOREACH field = matches %]
+ <tr>
+ <td align="left" valign="top">
+ [% PROCESS field_names field_name=field.key %]:
+ </td>
+ <td align="left" valign="top">
+ [% FOREACH query = field.value %]
+ <div class="user_match">
+ <b>[% query.key FILTER html %]</b>
+ [% IF query.value.users.size %]
+ [% IF query.value.users.size > 1 %]
+ [% IF query.value.status == 'fail' %]
+ <font color="#FF0000">
+ matches multiple users.
+ </font>
+ Please go back and try again with a more specific
+ name/address.
+ [% ELSE %]
+ [% IF query.value.status == 'trunc' %]
+ matched
+ more than the maximum
+ of [% query.value.users.size %] users:<br>
+ [% ELSE %]
+ matched:<br>
+ [% END %]
+ <select name="[% field.key FILTER html %]"
+ id="[% field.key FILTER html %]"
+ [% IF fields.${field.key}.type == 'multi' %]
+ multiple="multiple"
+ [% IF query.value.users.size > 5 %]
+ size="5"
+ [% ELSE %]
+ size="[% query.value.users.size %]"
+ [% END %]
+ [% END %]
+ >
+ [% FOREACH match = query.value.users %]
+ <option value="[% match.login FILTER html %]">
+ [%- match.identity FILTER html -%]
+ </option>
+ [% END %]
+ </select>
+ [% END %]
+ [% ELSE %]
+ matched
+ <b>[% query.value.users.0.identity FILTER html %]</b>
+ [% END %]
+ [% ELSE %]
+ [% IF (query.key.length < 3) && !Param('emailsuffix') %]
+ <font color="#FF0000">was too short for substring match
+ (minimum 3 characters)</font>
+ [% ELSE %]
+ <font color="#FF0000">did not match anything</font>
+ [% END %]
+ [% END %]
+ </div>
+ [% END %]
+ </td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ <hr width="100%" size="1">
+ </td>
+ </tr>
+ [% END %]
+
+ </table>
+
+[% IF matchsuccess == 1 %]
+
+ [% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %]
+
+ <p>
+ <input type="submit" id="continue" value="Continue">
+ </p>
+
+ </form>
+
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+
+[% BLOCK field_names %]
+
+ [% IF field_descs.$field_name %]
+ [% field_descs.$field_name FILTER html %]
+ [% ELSIF field_labels.$field_name %]
+ [% field_labels.$field_name FILTER html %]
+ [% ELSIF field_name.match("^requestee") %]
+ [% fields.${field_name}.flag_type.name %] requestee
+ [% ELSE %]
+ [% field_name FILTER html %]
+ [% END %]
+
+[% END %]
diff --git a/template/en/default/global/docslinks.html.tmpl b/template/en/default/global/docslinks.html.tmpl
new file mode 100644
index 0000000..712dfb4
--- /dev/null
+++ b/template/en/default/global/docslinks.html.tmpl
@@ -0,0 +1,52 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # docslinks: hash. Hash keys will be used as text of the documentation links,
+ # hash values will be used as links to the document, relative to
+ # the main Bugzilla documentation directory.
+ # Example: If you want a 'FAQ' link to point to, the "faq-general"
+ # named anchor on faq.html, assign
+ # { 'FAQ' => "faq.html#faq-general" }
+ # to docslinks.
+ # You may only link to sections by their given ID; it is not allowed
+ # to link to a section which is not given an ID (thus getting
+ # assigned an automatically generated ID). Otherwise, the link
+ # would break on a recompilation of the documentation.
+ # admindocslinks: hash. Same as docslinks, but will only be displayed to
+ # members of the admin group.
+ #%]
+
+[% IF Param('docs_urlbase') &&
+ docslinks.keys.size || (admindocslinks.keys.size && user.in_group('admin')) %]
+ <div id="docslinks">
+ <h2>Related documentation</h2>
+ <ul>
+ [% IF user.in_group('admin') %]
+ [% PROCESS docslinkslist docstype = admindocslinks %]
+ [% END %]
+ [% PROCESS docslinkslist docstype = docslinks %]
+ </ul>
+ </div>
+[% END %]
+
+[% BLOCK docslinkslist %]
+ [% FOREACH docslink = docstype.keys %]
+ <li>
+ <a href="[% docs_urlbase FILTER html %]
+ [% docslink FILTER none %]">[% docstype.$docslink FILTER html %]</a>
+ </li>
+ [% END %]
+[% END %]
diff --git a/template/en/default/global/field-descs.none.tmpl b/template/en/default/global/field-descs.none.tmpl
new file mode 100644
index 0000000..0c17e57
--- /dev/null
+++ b/template/en/default/global/field-descs.none.tmpl
@@ -0,0 +1,176 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Elliotte Martin <elliotte_martin@yahoo.com>
+ #%]
+
+[%# Remember to PROCESS rather than INCLUDE this template. %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% SET search_descs = {
+ "noop" => "---",
+ "equals" => "is equal to",
+ "notequals" => "is not equal to",
+ "anyexact" => "is equal to any of the strings",
+ "substring" => "contains the string",
+ "casesubstring" => "contains the string (exact case)",
+ "notsubstring" => "does not contain the string",
+ "anywordssubstr" => "contains any of the strings",
+ "allwordssubstr" => "contains all of the strings",
+ "nowordssubstr" => "contains none of the strings",
+ "regexp" => "matches regular expression",
+ "notregexp" => "does not match regular expression",
+ "lessthan" => "is less than",
+ "lessthaneq" => "is less than or equal to",
+ "greaterthan" => "is greater than",
+ "greaterthaneq" => "is greater than or equal to",
+ "anywords" => "contains any of the words",
+ "allwords" => "contains all of the words",
+ "nowords" => "contains none of the words",
+ "changedbefore" => "changed before",
+ "changedafter" => "changed after",
+ "changedfrom" => "changed from",
+ "changedto" => "changed to",
+ "changedby" => "changed by",
+ "matches" => "matches",
+ "notmatches" => "does not match",
+} %]
+
+[% field_types = { ${constants.FIELD_TYPE_UNKNOWN} => "Unknown Type",
+ ${constants.FIELD_TYPE_FREETEXT} => "Free Text",
+ ${constants.FIELD_TYPE_SINGLE_SELECT} => "Drop Down",
+ ${constants.FIELD_TYPE_MULTI_SELECT} => "Multiple-Selection Box",
+ ${constants.FIELD_TYPE_TEXTAREA} => "Large Text Box",
+ ${constants.FIELD_TYPE_DATETIME} => "Date/Time",
+ ${constants.FIELD_TYPE_BUG_ID} => "$terms.Bug ID",
+ } %]
+
+[%# You can use this hash to localize (translate) the values displayed
+ # for drop-down and multiple-select fields. Lines starting with "#"
+ # are comments.
+ #%]
+[% value_descs = {
+ "bug_status" => {
+ # "UNCONFIRMED" => "UNCO",
+ # "NEW" => "NEWISH",
+ },
+
+ "resolution" => {
+ "" => "---",
+ # "FIXED" => "NO LONGER AN ISSUE",
+ # "MOVED" => "BYE-BYE",
+ },
+} %]
+
+[%# We use "FILTER none" here because only the caller can know how to
+ # filter the result appropriately.
+ #%]
+[% MACRO display_value(field_name, value_name) BLOCK %][% FILTER trim %]
+ [% IF value_descs.${field_name}.${value_name}.defined %]
+ [% value_descs.${field_name}.${value_name} FILTER none %]
+ [% ELSE %]
+ [% value_name FILTER none %]
+ [% END %]
+[% END %][% END %]
+
+[% IF in_template_var %]
+ [% vars.terms = terms %]
+
+ [%# field_descs is loaded as a global template variable and cached
+ # across all templates--see VARIABLES in Bugzilla/Template.pm.
+ #%]
+ [% vars.field_descs = {
+ "[Bug creation]" => "[$terms.Bug creation]",
+ "actual_time" => "Actual Hours",
+ "alias" => "Alias",
+ "assigned_to" => "Assignee",
+ "attach_data.thedata" => "Attachment data",
+ "attachments.description" => "Attachment description",
+ "attachments.filename" => "Attachment filename",
+ "attachments.mimetype" => "Attachment mime type",
+ "attachments.ispatch" => "Attachment is patch",
+ "attachments.isobsolete" => "Attachment is obsolete",
+ "attachments.isprivate" => "Attachment is private",
+ "attachments.isurl" => "Attachment is a URL",
+ "attachments.submitter" => "Attachment creator",
+ "blocked" => "Blocks",
+ "bug_file_loc" => "URL",
+ "bug_group" => "Group",
+ "bug_id" => "$terms.Bug ID",
+ "bug_severity" => "Severity",
+ "bug_status" => "Status",
+ "changeddate" => "Changed",
+ "cc" => "CC",
+ "classification" => "Classification",
+ "cclist_accessible" => "CC list accessible",
+ "commenter" => "Commenter",
+ "component_id" => "Component ID",
+ "component" => "Component",
+ "content" => "Content",
+ "creation_ts" => "Creation date",
+ "deadline" => "Deadline",
+ "delta_ts" => "Changed",
+ "dependson" => "Depends on",
+ "dup_id" => "Duplicate",
+ "estimated_time" => "Orig. Est.",
+ "everconfirmed" => "Ever confirmed",
+ "flagtypes.name" => "Flags",
+ "keywords" => "Keywords",
+ "longdesc" => "Comment",
+ "longdescs.isprivate" => "Comment is private",
+ "newcc" => "CC",
+ "op_sys" => "OS",
+ "opendate" => "Opened",
+ "owner_idle_time" => "Time Since Assignee Touched",
+ "percentage_complete" => "%Complete",
+ "priority" => "Priority",
+ "product_id" => "Product ID",
+ "product" => "Product",
+ "qa_contact" => "QA Contact",
+ "remaining_time" => "Hours Left",
+ "rep_platform" => "Hardware",
+ "reporter" => "Reporter",
+ "reporter_accessible" => "Reporter accessible",
+ "requestees.login_name" => "Flag Requestee",
+ "resolution" => "Resolution",
+ "see_also" => "See Also",
+ "setters.login_name" => "Flag Setter",
+ "setting" => "Setting",
+ "settings" => "Settings",
+ "short_desc" => "Summary",
+ "status_whiteboard" => "Whiteboard",
+ "target_milestone" => "Target Milestone",
+ "version" => "Version",
+ "votes" => "Votes"
+ "work_time" => "Hours Worked",
+ } %]
+
+ [%# Also include any custom fields or fields which don't have a
+ Description here, by copying their Description from the
+ database. If you want to override this for your language
+ or your installation, just use a hook. %]
+ [% UNLESS Param('shutdownhtml') %]
+ [% FOREACH bz_field = bug_fields.values %]
+ [% SET vars.field_descs.${bz_field.name} = bz_field.description
+ IF !vars.field_descs.${bz_field.name}.defined %]
+ [% END %]
+ [% END %]
+[% END %]
+
+[% Hook.process("end") %]
diff --git a/template/en/default/global/footer.html.tmpl b/template/en/default/global/footer.html.tmpl
new file mode 100644
index 0000000..0379f02
--- /dev/null
+++ b/template/en/default/global/footer.html.tmpl
@@ -0,0 +1,49 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Svetlana Harisova <light@rathedg.com>
+ #%]
+
+[%# INTERFACE:
+ # This template has no interface. However, you must fulfill the interface to
+ # global/useful-links.html.tmpl.
+ #%]
+
+[% INCLUDE "global/help.html.tmpl" %]
+
+</div>
+
+[%# Migration note: below this point, this file corresponds to the old Param
+ # 'footerhtml'
+ #%]
+
+<div id="footer">
+ <div class="intro"></div>
+
+[%# Migration note: the old param 'blurbhtml' goes here %]
+
+[%# Migration note: useful-links.html.tmpl corresponds to %commandmenu% %]
+
+ [% PROCESS "global/useful-links.html.tmpl" %]
+
+ <div class="outro"></div>
+</div>
+
+</body>
+</html>
+
diff --git a/template/en/default/global/header.html.tmpl b/template/en/default/global/header.html.tmpl
new file mode 100644
index 0000000..4837df5
--- /dev/null
+++ b/template/en/default/global/header.html.tmpl
@@ -0,0 +1,324 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Vaskin Kissoyan <vkissoyan@yahoo.com>
+ # Vitaly Harisov <vitaly@rathedg.com>
+ # Svetlana Harisova <light@rathedg.com>
+ #%]
+
+[%# INTERFACE:
+ # (All the below interface elements are optional.)
+ # title: string. Page title.
+ # header: string. Main page header.
+ # subheader: string. Page subheader.
+ # header_addl_info: string. Additional header information.
+ # bodyclasses: array of extra CSS classes for the <body>
+ # onload: string. JavaScript code to run when the page finishes loading.
+ # javascript: string. Javascript to go in the header.
+ # javascript_urls: list. List of URLs to Javascript.
+ # style: string. CSS style.
+ # style_urls: list. List of URLs to CSS style sheets.
+ # message: string. A message to display to the user. May contain HTML.
+ # atomlink: Atom link URL, May contain HTML
+ #%]
+
+[% IF message %]
+ [% PROCESS global/messages.html.tmpl %]
+[% END %]
+
+[% DEFAULT
+ subheader = ""
+ header_addl_info = ""
+ onload = ""
+ style_urls = []
+%]
+
+[%# We should be able to set the default value of the header variable
+ # to the value of the title variable using the DEFAULT directive,
+ # but that doesn't work if a caller sets header to the empty string
+ # to avoid header inheriting the value of title, since DEFAULT
+ # mistakenly treats empty strings as undefined and gives header the
+ # value of title anyway. To get around that problem we explicitly
+ # set header's default value here only if it is undefined. %]
+[% IF !header.defined %][% header = title %][% END %]
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ <head>
+ [% Hook.process("start") %]
+ <title>[% title %]</title>
+
+[%# Migration note: contents of the old Param 'headerhtml' would go here %]
+
+ [% PROCESS "global/site-navigation.html.tmpl" %]
+
+ [% PROCESS 'global/setting-descs.none.tmpl' %]
+
+ [%# Set up the skin CSS cascade:
+ # 1. Standard Bugzilla stylesheet set (persistent)
+ # 2. Standard Bugzilla stylesheet set (selectable)
+ # 3. All third-party "skin" stylesheet sets (selectable)
+ # 4. Page-specific styles
+ # 5. Custom Bugzilla stylesheet set (persistent)
+ # "Selectable" skin file sets may be either preferred or alternate.
+ # Exactly one is preferred, determined by the "skin" user preference.
+ #%]
+ [% IF user.settings.skin.value != 'standard' %]
+ [% user_skin = user.settings.skin.value %]
+ [% END %]
+ [% style_urls.unshift('skins/standard/global.css') %]
+
+ [%# CSS cascade, part 1: Standard Bugzilla stylesheet set (persistent).
+ # Always present.
+ #%]
+ [% FOREACH style_url = style_urls %]
+ <link href="[% style_url FILTER html %]"
+ rel="stylesheet"
+ type="text/css">
+ [% END %]
+ <!--[if lte IE 7]>
+ [%# Internet Explorer treats [if IE] HTML comments as uncommented.
+ # Use it to import CSS fixes so that Bugzilla looks decent on IE 7
+ # and below.
+ #%]
+ <link href="skins/standard/IE-fixes.css"
+ rel="stylesheet"
+ type="text/css">
+ <![endif]-->
+
+ [%# CSS cascade, part 2: Standard Bugzilla stylesheet set (selectable)
+ # Present if skin selection is enabled.
+ #%]
+ [% IF user.settings.skin.is_enabled %]
+ [% FOREACH style_url = style_urls %]
+ <link href="[% style_url FILTER html %]"
+ rel="[% 'alternate ' IF user_skin %]stylesheet"
+ title="[% setting_descs.standard FILTER html %]"
+ type="text/css">
+ [% END %]
+ <!--[if lte IE 7]>
+ [%# Internet Explorer treats [if IE] HTML comments as uncommented.
+ # Use it to import CSS fixes so that Bugzilla looks decent on IE 7
+ # and below.
+ #%]
+ <link href="skins/standard/IE-fixes.css"
+ rel="[% 'alternate ' IF user_skin %]stylesheet"
+ title="[% setting_descs.standard FILTER html %]"
+ type="text/css">
+ <![endif]-->
+ [% END %]
+
+ [%# CSS cascade, part 3: Third-party stylesheet set (selectable).
+ # All third-party skins are present if skin selection is enabled.
+ # The admin-selected skin is always present.
+ #%]
+ [% FOREACH contrib_skin = user.settings.skin.legal_values %]
+ [% NEXT IF contrib_skin == 'standard' %]
+ [% NEXT UNLESS contrib_skin == user_skin
+ OR user.settings.skin.is_enabled %]
+ [% contrib_skin = contrib_skin FILTER url_quote %]
+ [% IF contrib_skin.match('\.css$') %]
+ [%# 1st skin variant: single-file stylesheet %]
+ <link href="[% "skins/contrib/$contrib_skin" %]"
+ rel="[% 'alternate ' UNLESS contrib_skin == user_skin %]stylesheet"
+ title="[% contrib_skin FILTER html %]"
+ type="text/css">
+ [% ELSE %]
+ [%# 2nd skin variant: stylesheet set %]
+ [% FOREACH style_url = style_urls %]
+ [% IF style_url.match('^skins/standard/') %]
+ <link href="[% style_url.replace('^skins/standard/',
+ "skins/contrib/$contrib_skin/") %]"
+ rel="[% 'alternate ' UNLESS contrib_skin == user_skin %]stylesheet"
+ title="[% contrib_skin FILTER html %]"
+ type="text/css">
+ [% END %]
+ [% END %]
+ <!--[if lte IE 7]>
+ [%# Internet Explorer treats [if IE] HTML comments as uncommented.
+ # Use it to import CSS fixes so that Bugzilla looks decent on IE 7
+ # and below.
+ #%]
+ <link href="skins/contrib/[% contrib_skin FILTER html %]/IE-fixes.css"
+ rel="[% 'alternate ' UNLESS contrib_skin == user_skin %]stylesheet"
+ title="[% contrib_skin FILTER html %]"
+ type="text/css">
+ <![endif]-->
+ [% END %]
+ [% END %]
+
+ [%# CSS cascade, part 4: page-specific styles.
+ #%]
+ [% IF style %]
+ <style type="text/css">
+ [% style %]
+ </style>
+ [% END %]
+
+ [%# CSS cascade, part 5: Custom Bugzilla stylesheet set (persistent).
+ # Always present. Site administrators may override all other style
+ # definitions, including skins, using custom stylesheets.
+ #%]
+ [% FOREACH style_url = style_urls %]
+ [% IF style_url.match('^skins/standard/') %]
+ <link href="[% style_url.replace('^skins/standard/', "skins/custom/")
+ FILTER html %]" rel="stylesheet" type="text/css">
+ [% END %]
+ [% END %]
+ <!--[if lte IE 7]>
+ [%# Internet Explorer treats [if IE] HTML comments as uncommented.
+ # Use it to import CSS fixes so that Bugzilla looks decent on IE 7
+ # and below.
+ #%]
+ <link href="skins/custom/IE-fixes.css"
+ rel="stylesheet"
+ type="text/css">
+ <![endif]-->
+
+ <script src="js/yui/yahoo-dom-event.js" type="text/javascript"></script>
+ <script src="js/yui/cookie.js" type="text/javascript"></script>
+ <script src="js/global.js" type="text/javascript"></script>
+ <script type="text/javascript">
+ <!--
+ YAHOO.namespace('bugzilla');
+ if (YAHOO.env.ua.gecko) {
+ YAHOO.util.Event._simpleRemove(window, "unload",
+ YAHOO.util.Event._unload);
+ }
+ [%# The language selector needs javascript to set its cookie,
+ # so it is hidden in HTML/CSS by the "bz_default_hidden" class.
+ # If the browser can run javascript, it will then "unhide"
+ # the language selector using the following code.
+ #%]
+ function unhide_language_selector() {
+ YAHOO.util.Dom.removeClass(
+ 'lang_links_container', 'bz_default_hidden'
+ );
+ }
+ YAHOO.util.Event.onDOMReady(unhide_language_selector);
+
+ [%# Make some Bugzilla information available to all scripts.
+ # We don't import every parameter and constant because we
+ # don't want to add a lot of uncached JS to every page.
+ #%]
+ var BUGZILLA = {
+ param: {
+ cookiepath: '[% Param('cookiepath') FILTER js %]'
+ },
+
+ string: {
+ attach_desc_required:
+ 'You must enter a Description for this attachment.'
+ }
+ };
+ [% IF javascript %]
+ [% javascript %]
+ [% END %]
+ // -->
+ </script>
+
+ [% IF javascript_urls %]
+ [% FOREACH javascript_url = javascript_urls %]
+ <script src="[% javascript_url FILTER html %]" type="text/javascript"></script>
+ [% END %]
+ [% END %]
+
+ [%# this puts the live bookmark up on firefox for the Atom feed %]
+ [% IF atomlink %]
+ <link rel="alternate"
+ type="application/atom+xml" title="Atom feed"
+ href="[% atomlink FILTER html %]">
+ [% END %]
+
+ [%# Required for the 'Autodiscovery' feature in Firefox 2 and IE 7. %]
+ <link rel="search" type="application/opensearchdescription+xml"
+ title="[% terms.Bugzilla %]" href="./search_plugin.cgi">
+ <link rel="shortcut icon" href="images/favicon.ico" >
+ [% Hook.process("additional_header") %]
+ </head>
+
+[%# Migration note: contents of the old Param 'bodyhtml' go in the body tag,
+ # but set the onload attribute in the DEFAULT directive above.
+ #%]
+
+ <body onload="[% onload %]"
+ class="[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') %]
+ [% FOREACH class = bodyclasses %]
+ [% ' ' %][% class FILTER css_class_quote %]
+ [% END %]">
+
+[%# Migration note: the following file corresponds to the old Param
+ # 'bannerhtml'
+ #%]
+
+<div id="header">
+
+[% INCLUDE global/banner.html.tmpl %]
+
+<table border="0" cellspacing="0" cellpadding="0" id="titles">
+<tr>
+ <td id="title">
+ <p>[% terms.Bugzilla %]
+ [% " &ndash; $header" IF header %]</p>
+ </td>
+
+ [% IF subheader %]
+ <td id="subtitle">
+ <p class="subheader">[% subheader %]</p>
+ </td>
+ [% END %]
+
+ [% IF header_addl_info %]
+ <td id="information">
+ <p class="header_addl_info">[% header_addl_info %]</p>
+ </td>
+ [% END %]
+</tr>
+</table>
+
+<table id="lang_links_container" cellpadding="0" cellspacing="0"
+ class="bz_default_hidden"><tr><td>
+[% IF Bugzilla.languages.size > 1 %]
+ <ul class="links">
+ [% FOREACH lang = Bugzilla.languages.sort %]
+ <li>[% IF NOT loop.first %]<span class="separator"> | </span>[% END %]
+ [% IF lang == current_language %]
+ <span class="lang_current">[% lang FILTER html FILTER upper %]</span>
+ [% ELSE %]
+ <a href="#" onclick="set_language('[% lang FILTER none %]');">
+ [%- lang FILTER html FILTER upper %]</a>
+ [% END %]
+ </li>
+ [% END %]
+ </ul>
+[% END %]
+</td></tr></table>
+
+[% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %]
+</div> [%# header %]
+
+<div id="bugzilla-body">
+
+[% IF Param('announcehtml') %]
+[% Param('announcehtml') FILTER none %]
+[% END %]
+
+[% IF message %]
+<div id="message">[% message %]</div>
+[% END %]
diff --git a/template/en/default/global/help.html.tmpl b/template/en/default/global/help.html.tmpl
new file mode 100644
index 0000000..36439bc
--- /dev/null
+++ b/template/en/default/global/help.html.tmpl
@@ -0,0 +1,32 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% IF cgi.param("help") %]
+ <script type="text/javascript"> <!--
+ [% FOREACH h = help_html %]
+ g_helpTexts["[% h.id FILTER js %]"] = "[%- h.html FILTER js -%]";
+ [% END %]
+ // -->
+ </script>
+[% END %]
+
diff --git a/template/en/default/global/hidden-fields.html.tmpl b/template/en/default/global/hidden-fields.html.tmpl
new file mode 100644
index 0000000..24f15c4
--- /dev/null
+++ b/template/en/default/global/hidden-fields.html.tmpl
@@ -0,0 +1,58 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # exclude: string; a regular expression matching fields to exclude
+ # from the list of hidden fields generated by this template
+ #%]
+
+[%# The global Bugzilla->cgi object is used to obtain form variable values. %]
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[%# Generate hidden form fields for non-excluded fields. %]
+[% FOREACH field = cgi.param() %]
+ [% NEXT IF exclude && field.search(exclude) %]
+ [%# The '.slice(0)' bit is here to force the 'param(field)' to be evaluated
+ in a list context, so we can avoid extra code checking for single valued or
+ empty fields %]
+ [% IF field == "data" && cgi.param("data") %]
+ <div class="box">
+ <p>
+ We were unable to store the file you uploaded because of incomplete information
+ in the form you just submitted. Because we are unable to retain the file between
+ form submissions, you must re-attach the file in addition to completing the
+ remaining missing information above.
+ </p>
+ <p>
+ Please re-attach the file <b>[% cgi.param(field) FILTER html %]</b> in
+ the field below:
+ </p>
+ <p>
+ <input type="file" id="data" name="data" size="50">
+ </p>
+ </div>
+ [% ELSE %]
+ [% FOREACH mvalue = cgi.param(field).slice(0) %]
+ <input type="hidden" name="[% field FILTER html %]"
+ value="[% mvalue FILTER html FILTER html_linebreak %]">
+ [% END %]
+ [% END %]
+[% END %]
diff --git a/template/en/default/global/initialize.none.tmpl b/template/en/default/global/initialize.none.tmpl
new file mode 100644
index 0000000..a6c4897
--- /dev/null
+++ b/template/en/default/global/initialize.none.tmpl
@@ -0,0 +1,32 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# This template is a place to put directives that should get processed
+ # every time a primary template gets processed. Primary templates are those
+ # called from Perl code rather than from other templates via the PROCESS
+ # and INCLUDE directives.
+ #
+ # This template gets auto-processed at the beginning of primary templates
+ # via the PRE_PROCESS configuration parameter. Note that it gets processed
+ # for non-HTML templates too, so don't put HTML-specific stuff in here;
+ # put that into header.html.tmpl instead.
+ #%]
+
+[% USE Hook %]
diff --git a/template/en/default/global/js-products.html.tmpl b/template/en/default/global/js-products.html.tmpl
new file mode 100644
index 0000000..8ca206f
--- /dev/null
+++ b/template/en/default/global/js-products.html.tmpl
@@ -0,0 +1,34 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# The javascript block gets used in header.html.tmpl. %]
+[% javascript = BLOCK %]
+ var useclassification = false; // No classification level in use
+ var first_load = true; // Is this the first time we load the page?
+ var last_sel = []; // Caches last selection
+ var cpts = new Array();
+ [% n = 1 %]
+ [% FOREACH prod = products %]
+ cpts['[% n %]'] = [
+ [%- FOREACH comp = prod.components %]'[% comp.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ];
+ [% n = n+1 %]
+ [% END %]
+[% END %]
diff --git a/template/en/default/global/message.html.tmpl b/template/en/default/global/message.html.tmpl
new file mode 100644
index 0000000..e578a7f
--- /dev/null
+++ b/template/en/default/global/message.html.tmpl
@@ -0,0 +1,42 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s):
+ #%]
+
+[%# INTERFACE:
+ # url: string. An optional URL to go to.
+ # link: string. The link text for that URL.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% DEFAULT title = "$terms.Bugzilla Message" %]
+
+[% PROCESS global/header.html.tmpl %]
+
+[%# The "header" template automatically displays a message if it finds one.
+ Note that the global messages list is in messages.html.tmpl. %]
+
+[%# Display a URL if the calling script or message block has included one. %]
+[% IF url && link %]
+ <p>
+ <a href="[% url FILTER html %]">[% link FILTER html %]</a>
+ </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/global/message.txt.tmpl b/template/en/default/global/message.txt.tmpl
new file mode 100644
index 0000000..9329cdb
--- /dev/null
+++ b/template/en/default/global/message.txt.tmpl
@@ -0,0 +1,25 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Max Kanat-Alexander.
+ # Portions created by Max Kanat-Alexander are Copyright (C) 2005
+ # Max Kanat-Alexander. All Rights Reserved.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[%# Yes, this may show some HTML. But it's the best we
+ # can do at the moment. %]
+[% PROCESS global/messages.html.tmpl %]
+[% message FILTER txt %]
diff --git a/template/en/default/global/messages.html.tmpl b/template/en/default/global/messages.html.tmpl
new file mode 100644
index 0000000..7351aa0
--- /dev/null
+++ b/template/en/default/global/messages.html.tmpl
@@ -0,0 +1,858 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# This is a list of all the possible messages. Please keep them in
+ # alphabetical order by message tag, and leave a blank line between messages.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% message_tag = message %]
+
+[% message = BLOCK %]
+ [% IF message_tag == "account_created" %]
+ The user account [% otheruser.login FILTER html %] has been created
+ successfully.
+ [% IF groups.size %]
+ You may want to edit the group settings now, using the form below.
+ [% END %]
+
+ [% ELSIF message_tag == "account_creation_canceled" %]
+ [% title = "User Account Creation Canceled" %]
+ The creation of the user account [% account FILTER html %] has been
+ canceled.
+
+ [% ELSIF message_tag == "account_updated" %]
+ [% IF changed_fields.size
+ + groups_added_to.size + groups_removed_from.size
+ + groups_granted_rights_to_bless.size + groups_denied_rights_to_bless.size %]
+ [% title = "User $loginold updated" %]
+ The following changes have been made to the user account
+ [%+ loginold FILTER html %]:
+ <ul>
+ [% FOREACH field = changed_fields %]
+ <li>
+ [% IF field == 'login_name' %]
+ The login is now [% otheruser.login FILTER html %].
+ [% ELSIF field == 'realname' %]
+ The real name has been updated.
+ [% ELSIF field == 'cryptpassword' %]
+ A new password has been set.
+ [% ELSIF field == 'disabledtext' %]
+ The disable text has been modified.
+ [% ELSIF field == 'disable_mail' %]
+ [% IF otheruser.email_disabled %]
+ [% terms.Bug %]mail has been disabled.
+ [% ELSE %]
+ [% terms.Bug %]mail has been enabled.
+ [% END %]
+ [% END %]
+ </li>
+ [% END %]
+ [% IF groups_added_to.size %]
+ <li>
+ The account has been added to the
+ [%+ groups_added_to.join(', ') FILTER html %]
+ group[% 's' IF groups_added_to.size > 1 %].
+ </li>
+ [% END %]
+ [% IF groups_removed_from.size %]
+ <li>
+ The account has been removed from the
+ [%+ groups_removed_from.join(', ') FILTER html %]
+ group[% 's' IF groups_removed_from.size > 1 %].
+ </li>
+ [% END %]
+ [% IF groups_granted_rights_to_bless.size %]
+ <li>
+ The account has been granted rights to bless the
+ [%+ groups_granted_rights_to_bless.join(', ') FILTER html %]
+ group[% 's' IF groups_granted_rights_to_bless.size > 1 %].
+ </li>
+ [% END %]
+ [% IF groups_denied_rights_to_bless.size %]
+ <li>
+ The account has been denied rights to bless the
+ [%+ groups_denied_rights_to_bless.join(', ') FILTER html %]
+ group[% 's' IF groups_denied_rights_to_bless.size > 1 %].
+ </li>
+ [% END %]
+ </ul>
+ [% ELSE %]
+ [% title = "User $otheruser.login not changed" %]
+ You didn't request any changes to the user's account
+ [%+ otheruser.login FILTER html %].
+ [% END %]
+
+ [% ELSIF message_tag == "account_deleted" %]
+ [% title = "User $otheruser.login deleted" %]
+ The user account [% otheruser.login FILTER html %] has been deleted
+ successfully.
+
+ [% ELSIF message_tag == "account_disabled" %]
+ The user account [% account FILTER html %] is disabled, so you
+ cannot change its password.
+
+ [% ELSIF message_tag == "attachment_creation_failed" %]
+ The [% terms.bug %] was created successfully, but attachment creation
+ failed.
+ Please add your attachment by clicking the "Add an Attachment" link
+ below.
+
+ [% ELSIF message_tag == "bug_group_description" %]
+ Access to [% terms.bugs %] in the [% product.name FILTER html %] product
+
+ [% ELSIF message_tag == "buglist_adding_field" %]
+ [% title = "Adding field to search page..." %]
+ [% link = "Click here if the page does not redisplay automatically." %]
+
+ [% ELSIF message_tag == "buglist_updated_named_query" %]
+ [% title = "Search updated" %]
+ Your search named <code><a
+ href="buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% queryname FILTER url_quote %]"
+ >[% queryname FILTER html %]</a></code> has been updated.
+
+ [% ELSIF message_tag == "buglist_new_default_query" %]
+ OK, you now have a new default search. You may
+ also bookmark the result of any individual search.
+
+ [% ELSIF message_tag == "buglist_new_named_query" %]
+ [% title = "Search created" %]
+ OK, you have a new search named <code><a
+ href="buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% queryname FILTER url_quote %]"
+ >[% queryname FILTER html %]</a></code>.
+
+ [% ELSIF message_tag == "buglist_query_gone" %]
+ [% title = "Search is gone" %]
+ [% link = "Go back to the search page." %]
+ OK, the <b>[% namedcmd FILTER html %]</b> search is gone.
+
+ [% ELSIF message_tag == "buglist_sorted_by_relevance" %]
+ [% terms.Bugs %] on this list are sorted by relevance, with the most
+ relevant [% terms.bugs %] at the top.
+
+ [% ELSIF message_tag == "change_columns" %]
+ [% title = "Change columns" %]
+ Resubmitting your search with new columns...
+ Click <a href="[% redirect_url FILTER html %]">here</a>
+ if the page does not automatically refresh.
+
+ [% ELSIF message_tag == "classification_created" %]
+ [% title = "New Classification Created" %]
+ The <em>[% classification.name FILTER html %]</em> classification has been created.
+
+ [% ELSIF message_tag == "classification_deleted" %]
+ [% title = "Classification Deleted" %]
+ The <em>[% classification.name FILTER html %]</em> classification has been deleted.
+
+ [% ELSIF message_tag == "classification_updated" %]
+ [% title = "Classification Updated" %]
+ [% IF changes.keys.size %]
+ Changes to the <em>[% classification.name FILTER html %]</em> classification
+ have been saved:
+ <ul>
+ [% IF changes.name.defined %]
+ <li>Name updated to '[% classification.name FILTER html %]'</li>
+ [% END %]
+ [% IF changes.description.defined %]
+ [% IF classification.description %]
+ <li>Description updated to '[% classification.description FILTER html %]'</li>
+ [% ELSE %]
+ <li>Description removed</li>
+ [% END %]
+ [% END %]
+ [% IF changes.sortkey.defined %]
+ <li>Sortkey updated to '[% classification.sortkey FILTER html %]'</li>
+ [% END %]
+ [% Hook.process('classification_updated_fields') %]
+ </ul>
+ [% ELSE %]
+ No changes made to <em>[% classification.name FILTER html %]</em>.
+ [% END %]
+
+ [% ELSIF message_tag == "component_created" %]
+ [% title = "Component Created" %]
+ The component <em>[% comp.name FILTER html %]</em> has been created.
+
+ [% ELSIF message_tag == "component_deleted" %]
+ [% title = "Component Deleted" %]
+ The component <em>[% comp.name FILTER html %]</em> has been deleted.
+ [% IF comp.bug_count %]
+ All [% terms.bugs %] being in this component and all references
+ to them have also been deleted.
+ [% END %]
+
+ [% ELSIF message_tag == "component_updated" %]
+ [% title = "Component Updated" %]
+ [% IF changes.keys.size %]
+ Changes to the component <em>[% comp.name FILTER html %]</em> have been saved:
+ <ul>
+ [% IF changes.name.defined %]
+ <li>Name updated to '[% comp.name FILTER html %]'</li>
+ [% END %]
+ [% IF changes.description.defined %]
+ <li>Description updated to '[% comp.description FILTER html_light %]'</li>
+ [% END %]
+ [% IF changes.initialowner.defined %]
+ <li>Default assignee updated to '[% comp.default_assignee.login FILTER html %]'</li>
+ [% END %]
+ [% IF changes.initialqacontact.defined %]
+ [% IF comp.default_qa_contact.id %]
+ <li>Default QA contact updated to '[% comp.default_qa_contact.login FILTER html %]'</li>
+ [% ELSE %]
+ <li>Default QA contact deleted</li>
+ [% END %]
+ [% END %]
+ [% IF changes.cc_list.defined %]
+ [% IF comp.initial_cc.size %]
+ [% cc_list = [] %]
+ [% FOREACH cc_user = comp.initial_cc %]
+ [% cc_list.push(cc_user.login) %]
+ [% END %]
+ <li>Default CC list updated to [% cc_list.join(", ") FILTER html %]</li>
+ [% ELSE %]
+ <li>Default CC list deleted</li>
+ [% END %]
+ [% END %]
+ [% Hook.process('component_updated_fields') %]
+ </ul>
+ [% ELSE %]
+ No changes made to <em>[% comp.name FILTER html %]</em>.
+ [% END %]
+
+ [% ELSIF message_tag == "custom_field_created" %]
+ [% title = "Custom Field Created" %]
+ The new custom field '[% field.name FILTER html %]' has been
+ successfully created.
+
+ [% ELSIF message_tag == "custom_field_deleted" %]
+ [% title = "Custom Field Deleted" %]
+ The custom field '[% field.name FILTER html %]' has been
+ successfully deleted.
+
+ [% ELSIF message_tag == "custom_field_updated" %]
+ [% title = "Custom Field Updated" %]
+ Properties of the '[% field.name FILTER html %]' field have been
+ successfully updated.
+
+ [% ELSIF message_tag == "default_settings_updated" %]
+ [% IF changes_saved %]
+ Changes to default preferences have been saved.
+ [% ELSE %]
+ No changes made.
+ [% END %]
+
+ [% ELSIF message_tag == "emailold_change_canceled" %]
+ [% title = "Cancel Request to Change Email Address" %]
+ The request to change the email address for your account to
+ [%+ new_email FILTER html %] has been canceled.
+
+ [% ELSIF message_tag == "email_change_canceled" %]
+ [% title = "Cancel Request to Change Email Address" %]
+ The request to change the email address for the
+ account [%+ old_email FILTER html %] to
+ [%+ new_email FILTER html %] has been canceled.
+
+ [% ELSIF message_tag == "email_change_canceled_reinstated" %]
+ [% title = "Cancel Request to Change Email Address" %]
+ The request to change the email address for the
+ account [%+ old_email FILTER html %] to
+ [%+ new_email FILTER html %] has been canceled.
+ Your old account settings have been reinstated.
+
+ [% ELSIF message_tag == "extension_created" %]
+ An extension named [% name FILTER html %] has been created
+ in [% path FILTER html %]. Make sure you change "YOUR NAME" and
+ "YOUR EMAIL ADDRESS" in the code to your name and your email address.
+
+ [% ELSIF message_tag == "field_value_created" %]
+ [% title = "New Field Value Created" %]
+ The value <em>[% value.name FILTER html %]</em> has been added as a
+ valid choice for the <em>[% field.description FILTER html %]</em>
+ (<em>[% field.name FILTER html %]</em>) field.
+ [% IF field.name == "bug_status" %]
+ You should now visit the <a href="editworkflow.cgi">status workflow
+ page</a> to include your new [% terms.bug %] status.
+ [% END %]
+
+ [% ELSIF message_tag == "field_value_deleted" %]
+ [% title = "Field Value Deleted" %]
+ The value <em>[% value.name FILTER html %]</em> of the
+ <em>[% field.description FILTER html %]</em>
+ (<em>[% field.name FILTER html %]</em>) field has been deleted.
+
+ [% ELSIF message_tag == "field_value_updated" %]
+ [% title = "Field Value Updated" %]
+ [% IF changes.keys.size %]
+ The <em>[% value_old FILTER html %]</em> value of the
+ <em>[% field.description FILTER html %]</em>
+ (<em>[% field.name FILTER html %]</em>) field has been changed:
+ <ul>
+ [% IF changes.value %]
+ <li>Field value updated to
+ <em>[% changes.value.1 FILTER html %]</em>.
+ [% IF value.is_default %]
+ (Note that this value is the default for this field. All
+ references to the default value will now point to this new value.)
+ [% END %]
+ </li>
+ [% END %]
+ [% IF changes.sortkey %]
+ <li>Sortkey updated to
+ <em>[% changes.sortkey.1 FILTER html %]</em>.</li>
+ [% END %]
+ [% IF changes.visibility_value_id %]
+ [% IF value.visibility_value.defined %]
+ <li>It only appears when
+ [%+ value.field.value_field.description FILTER html %] is set to
+ '[%+ value.visibility_value.name FILTER html %]'.</li>
+ [% ELSE %]
+ <li>It now always appears, no matter what
+ [%+ value.field.value_field.description FILTER html %] is set to.
+ </li>
+ [% END %]
+ [% END %]
+ </ul>
+ [% ELSE %]
+ No changes made to the field value <em>[% value_old FILTER html %]</em>.
+ [% END %]
+
+ [% ELSIF message_tag == "flag_cleared" %]
+ Some flags didn't apply in the new product/component
+ and have been cleared.
+
+ [% ELSIF message_tag == "flag_creation_failed" %]
+ [% title = "Flag Creation Failure" %]
+ An error occured while validating flags:
+ [%+ flag_creation_error FILTER none %]
+
+ [% ELSIF message_tag == "get_field_desc" %]
+ [% field_descs.$field_name FILTER html %]
+
+ [% ELSIF message_tag == "get_resolution" %]
+ [% display_value("resolution", resolution) FILTER html %]
+
+ [% ELSIF message_tag == "get_status" %]
+ [% display_value("bug_status", status) FILTER html %]
+
+ [% ELSIF message_tag == "group_created" %]
+ [% title = "New Group Created" %]
+ The group <em>[% group.name FILTER html %]</em> has been created.
+
+ [% ELSIF message_tag == "group_deleted" %]
+ [% title = "Group Deleted" %]
+ The group <em>[% name FILTER html %]</em> has been deleted.
+
+ [% ELSIF message_tag == "group_membership_removed" %]
+ [% title = "Group Membership Removed" %]
+ [% IF users.size %]
+ Explicit membership to the <em>[% group FILTER html %]</em> group removed
+ [% IF regexp %] for users matching '[% regexp FILTER html %]'[% END %]:
+ [% FOREACH user = users %]
+ [%+ user.login FILTER html %]
+ [% END %]
+ [% ELSE %]
+ No users are being affected by your action.
+ [% END %]
+
+ [% ELSIF message_tag == "group_updated" %]
+ [% IF changes.keys.size %]
+ The following changes have been made to the '[% group.name FILTER html %]'
+ group:
+ <ul>
+ [% FOREACH field = changes.keys.sort %]
+ [% SWITCH field %]
+ [% CASE 'name' %]
+ <li>The name was changed to '[% changes.name.1 FILTER html %]'</li>
+ [% CASE 'description' %]
+ <li>The description was updated.</li>
+ [% CASE 'userregexp' %]
+ <li>The regular expression was updated.</li>
+ [% CASE 'isactive' %]
+ [% IF changes.isactive.1 %]
+ <li>The group will now be used for [% terms.bugs %].</li>
+ [% ELSE %]
+ <li>The group will no longer be used for [% terms.bugs %].</li>
+ [% END %]
+ [% CASE 'icon_url' %]
+ <li>The group icon URL has been updated.</li>
+ [% CASE 'members_add' %]
+ <li>The following groups are now members of this group:
+ [%+ changes.members_add.join(', ') FILTER html %]</li>
+ [% CASE 'members_remove' %]
+ <li>The following groups are no longer members of this group:
+ [%+ changes.members_remove.join(', ') FILTER html %]</li>
+ [% CASE 'member_of_add' %]
+ <li>This group is now a member of the following groups:
+ [%+ changes.member_of_add.join(', ') FILTER html %]</li>
+ [% CASE 'member_of_remove' %]
+ <li>This group is no longer a member of the following groups:
+ [%+ changes.member_of_remove.join(', ') FILTER html %]</li>
+ [% CASE 'bless_from_add' %]
+ <li>The following groups may now add users to this group:
+ [%+ changes.bless_from_add.join(', ') FILTER html %]</li>
+ [% CASE 'bless_from_remove' %]
+ <li>The following groups may no longer add users to this group:
+ [%+ changes.bless_from_remove.join(', ') FILTER html %]</li>
+ [% CASE 'bless_to_add' %]
+ <li>This group may now add users to the following groups:
+ [%+ changes.bless_to_add.join(', ') FILTER html %]</li>
+ [% CASE 'bless_to_remove' %]
+ <li>This group may no longer add users to the following groups:
+ [%+ changes.bless_to_remove.join(', ') FILTER html %]</li>
+ [% CASE 'visible_from_add' %]
+ <li>The following groups can now see users in this group:
+ [%+ changes.visible_from_add.join(', ') FILTER html %]</li>
+ [% CASE 'visible_from_remove' %]
+ <li>The following groups may no longer see users in this group:
+ [%+ changes.visible_from_remove.join(', ') FILTER html %]</li>
+ [% CASE 'visible_to_me_add' %]
+ <li>This group may now see users in the following groups:
+ [%+ changes.visible_to_me_add.join(', ') FILTER html %]</li>
+ [% CASE 'visible_to_me_remove' %]
+ <li>This group may no longer see users in the following groups:
+ [%+ changes.visible_to_me_remove.join(', ') FILTER html %]</li>
+ [% END %]
+ [% END %]
+ </ul>
+ [% ELSE %]
+ You didn't request any change for the '[% group.name FILTER html %]'
+ group.
+ [% END %]
+
+ [% ELSIF message_tag == "invalid_column_name" %]
+ The custom sort order specified contains one or more invalid
+ column names: <em>[% invalid_fragments.join(', ') FILTER html %]</em>.
+ They have been removed from the sort list.
+
+ [% ELSIF message_tag == "job_queue_depth" %]
+ [% count FILTER html %] jobs in the queue.
+
+ [% ELSIF message_tag == "keyword_created" %]
+ [% title = "New Keyword Created" %]
+ The keyword <em>[% name FILTER html %]</em> has been created.
+
+ [% ELSIF message_tag == "keyword_deleted" %]
+ [% title = "Keyword Deleted" %]
+ The <em>[% keyword.name FILTER html %]</em> keyword has been deleted.
+ <b>After you have finished editing keywords, you need to
+ <a href="sanitycheck.cgi?rebuildkeywordcache=1">rebuild the keyword
+ cache</a></b> (on a very large installation of [% terms.Bugzilla %],
+ this can take several minutes).
+
+ [% ELSIF message_tag == "keyword_updated" %]
+ [% title = "Keyword Updated" %]
+ [% IF changes.keys.size %]
+ Changes to the <em>[% keyword.name FILTER html %]</em> keyword have
+ been saved:
+ <ul>
+ [% IF changes.name.defined %]
+ <li>
+ Keyword renamed to <em>[% keyword.name FILTER html %]</em>.
+ <b>After you have finished editing keywords, you need to
+ <a href="sanitycheck.cgi?rebuildkeywordcache=1">rebuild
+ the keyword cache</a></b> (on a very large installation
+ of [% terms.Bugzilla %], this can take several minutes).
+ </li>
+ [% END %]
+ [% IF changes.description.defined %]
+ <li>Description updated to <em>[% keyword.description FILTER html %]</em></li>
+ [% END %]
+ </ul>
+ [% ELSE %]
+ No changes made.
+ [% END %]
+
+ [% ELSIF message_tag == "logged_out" %]
+ [% title = "Logged Out" %]
+ [% url = "index.cgi?GoAheadAndLogIn=1" %]
+ [% link = "Log in again." %]
+ <b>Your login has been forgotten</b>.
+ The cookie that was remembering your login is now gone. You will be
+ prompted for a login the next time it is required.
+
+ [% ELSIF message_tag == "login_changed" %]
+ [% title = "$terms.Bugzilla Login Changed" %]
+ Your [% terms.Bugzilla %] login has been changed.
+
+ [% ELSIF message_tag == "migrate_component_created" %]
+ Component created: [% comp.name FILTER html %]
+ (in [% product.name FILTER html %])
+
+ [% ELSIF message_tag == "migrate_creating_bugs" %]
+ Creating [% terms.bugs %]...
+
+ [% ELSIF message_tag == "migrate_field_created" %]
+ New custom field: [% field.description FILTER html %]
+ ([% field.name FILTER html %])
+
+ [% ELSIF message_tag == "migrate_product_created" %]
+ Product created: [% created.name FILTER html %]
+
+ [% ELSIF message_tag == "migrate_reading_bugs" %]
+ Reading [% terms.bugs %]...
+
+ [% ELSIF message_tag == "migrate_reading_products" %]
+ Reading products...
+
+ [% ELSIF message_tag == "migrate_reading_users" %]
+ Reading users...
+
+ [% ELSIF message_tag == "migrate_translating_bugs" %]
+ Converting [% terms.bug %] values to be appropriate for
+ [%+ terms.Bugzilla %]...
+
+ [% ELSIF message_tag == "migrate_user_created" %]
+ User created: [% created.email FILTER html %]
+ [% IF password %] Password: [% password FILTER html %][% END %]
+
+ [% ELSIF message_tag == "migrate_value_created" %]
+ [% IF product.defined %]
+ [% product.name FILTER html %]
+ [% END %]
+ [%+ field_descs.${field.name} FILTER html %] value
+ created: [% value FILTER html %]
+
+ [% ELSIF message_tag == "milestone_created" %]
+ [% title = "Milestone Created" %]
+ The milestone <em>[% milestone.name FILTER html %]</em> has been created.
+
+ [% ELSIF message_tag == "milestone_deleted" %]
+ [% title = "Milestone Deleted" %]
+ The milestone <em>[% milestone.name FILTER html %]</em> has been deleted.
+ [% IF milestone.bug_count %]
+ [%+ terms.Bugs %] targetted to this milestone have been retargetted to
+ the default milestone <em>[% product.default_milestone FILTER html %]</em>.
+ [% END %]
+
+ [% ELSIF message_tag == "milestone_updated" %]
+ [% title = "Milestone Updated" %]
+ [% IF changes.size %]
+ Changes to the milestone <em>[% milestone.name FILTER html %]</em>
+ have been saved:
+ <ul>
+ [% IF changes.value.defined %]
+ <li>Milestone name updated to <em>[% milestone.name FILTER html %]</em></li>
+ [% END %]
+ [% IF changes.sortkey.defined %]
+ <li>Sortkey updated to <em>[% milestone.sortkey FILTER html %]</em>
+ [% END %]
+ </ul>
+ [% ELSE %]
+ No changes made to milestone <em>[% milestone.name FILTER html %]</em>.
+ [% END %]
+
+ [% ELSIF message_tag == "parameters_updated" %]
+ [% title = "Parameters Updated" %]
+ [% IF param_changed.size > 0 %]
+ [% FOREACH param = param_changed %]
+ Changed <em>[% param FILTER html %]</em><br>
+ [% IF param == 'utf8' && Param('utf8') %]
+ <strong>You must now re-run checksetup.pl.</strong><br>
+ [% END %]
+ [% END %]
+ [% ELSE %]
+ No changes made.
+ [% END %]
+
+ [% IF shutdown_is_active == 1 %]
+ <hr>
+ [% terms.Bugzilla %] has now been shut down. To re-enable the system,
+ clear the <em>shutdownhtml</em> field.
+ [% END%]
+
+ [% ELSIF message_tag == "password_change_canceled" %]
+ [% title = "Cancel Request to Change Password" %]
+ Your request has been canceled.
+
+ [% ELSIF message_tag == "password_change_request" %]
+ [% title = "Request to Change Password" %]
+ A token for changing your password has been emailed to you.
+ Follow the instructions in that email to change your password.
+
+ [% ELSIF message_tag == "password_changed" %]
+ [% title = "Password Changed" %]
+ Your password has been changed.
+
+ [% ELSIF message_tag == "flag_type_created" %]
+ [% title = BLOCK %]Flag Type '[% name FILTER html %]' Created[% END %]
+ The flag type <em>[% name FILTER html %]</em> has been created.
+
+ [% ELSIF message_tag == "flag_type_changes_saved" %]
+ [% title = BLOCK %]Flag Type '[% name FILTER html %]' Changes Saved[% END %]
+ Your changes to the flag type <em>[% name FILTER html %]</em>
+ have been saved.
+
+ [% ELSIF message_tag == "flag_type_deleted" %]
+ [% title = BLOCK %]Flag Type '[% name FILTER html %]' Deleted[% END %]
+ The flag type <em>[% name FILTER html %]</em> has been deleted.
+
+ [% ELSIF message_tag == "flag_type_deactivated" %]
+ [% title = BLOCK %]Flag Type '[% flag_type.name FILTER html %]' Deactivated[% END %]
+ The flag type <em>[% flag_type.name FILTER html %]</em> has been deactivated.
+
+ [% ELSIF message_tag == "install_admin_get_email" %]
+ Enter the e-mail address of the administrator:
+
+ [% ELSIF message_tag == "install_admin_get_name" %]
+ Enter the real name of the administrator:
+
+ [% ELSIF message_tag == "install_admin_get_password" %]
+ Enter a password for the administrator account:
+
+ [% ELSIF message_tag == "install_admin_created" %]
+ [% user.login FILTER html %] is now set up as an administrator.
+
+ [% ELSIF message_tag == "install_admin_setup" %]
+ Looks like we don't have an administrator set up yet.
+ Either this is your first time using [% terms.Bugzilla %], or your
+ administrator's privileges might have accidentally been deleted.
+
+ [% ELSIF message_tag == "install_column_add" %]
+ Adding new column '[% column FILTER html %]' to the '[% table FILTER html %]' table...
+
+ [% ELSIF message_tag == "install_column_drop" %]
+ Deleting the '[% column FILTER html %]' column from the '[% table FILTER html %]' table...
+
+ [% ELSIF message_tag == "install_column_rename" %]
+ Renaming column '[% old FILTER html %]' to '[% new FILTER html %]'...
+
+ [% ELSIF message_tag == "install_confirm_password" %]
+ Please retype the password to verify:
+
+ [% ELSIF message_tag == "install_default_classification" %]
+ Creating default classification '[% name FILTER html %]'...
+
+ [% ELSIF message_tag == "install_default_product" %]
+ Creating initial dummy product '[% name FILTER html %]'...
+
+ [% ELSIF message_tag == "install_file_perms_fix" %]
+ Fixing file permissions...
+
+ [% ELSIF message_tag == "install_fk_add" %]
+ Adding foreign key: [% table FILTER html %].[% column FILTER html %] -&gt; [% fk.TABLE FILTER html %].[% fk.COLUMN FILTER html %]...
+
+ [% ELSIF message_tag == "install_fk_drop" %]
+ Dropping foreign key: [% table FILTER html %].[% column FILTER html %] -&gt; [% fk.TABLE FILTER html %].[% fk.COLUMN FILTER html %]...
+
+ [% ELSIF message_tag == "install_fk_invalid" %]
+ ERROR: There are invalid values for the [% column FILTER html %] column in the [% table FILTER html %]
+ table. (These values do not exist in the [% foreign_table FILTER html %] table, in the
+ [% foreign_column FILTER html %] column.)
+
+ Before continuing with checksetup, you will need to fix these values,
+ either by deleting these rows from the database, or changing the values
+ of [% column FILTER html %] in [% table FILTER html %] to point to valid values in [% foreign_table FILTER html %].[% foreign_column FILTER html %].
+
+ The bad values from the [% table FILTER html %].[% column FILTER html %] column are:
+ [%+ values.join(', ') FILTER html %]
+
+ [% ELSIF message_tag == "install_fk_invalid_fixed" %]
+ WARNING: There were invalid values in [% table FILTER html %].[% column FILTER html %]
+ that have been [% IF action == 'delete' %]deleted[% ELSE %]set to NULL[% END %]:
+ [%+ values.join(', ') FILTER html %]
+
+ [% ELSIF message_tag == "install_group_create" %]
+ Creating group [% name FILTER html %]...
+
+ [% ELSIF message_tag == "install_setting_new" %]
+ Adding a new user setting called '[% name FILTER html %]'
+
+ [% ELSIF message_tag == "install_table_drop" %]
+ Dropping the '[% name FILTER html %]' table...
+
+ [% ELSIF message_tag == "install_table_rename" %]
+ Renaming the '[% old FILTER html %]' table to '[% new FILTER html %]'...
+
+ [% ELSIF message_tag == "install_urlbase_default" %]
+ Now that you have installed [% terms.Bugzilla %], you should visit the
+ 'Parameters' page (linked in the footer of the Administrator
+ account) to ensure it is set up as you wish - this includes
+ setting the 'urlbase' option to the correct URL.
+
+ [% ELSIF message_tag == "install_reset_password" %]
+ Enter a new password for [% user.login FILTER html %]:
+
+ [% ELSIF message_tag == "install_reset_password_done" %]
+ New password set.
+
+ [% ELSIF message_tag == "install_webservergroup_empty" %]
+ ****************************************************************************
+ WARNING! You have not entered a value for the "webservergroup" parameter
+ in localconfig. This means that certain files and directories which need
+ to be editable by both you and the web server must be world writable, and
+ other files (including the localconfig file which stores your database
+ password) must be world readable. This means that _anyone_ who can obtain
+ local access to this machine can do whatever they want to your
+ [%+ terms.Bugzilla %] installation, and is probably also able to run
+ arbitrary Perl code as the user that the web server runs as.
+
+ You really, really, really need to change this setting.
+ ****************************************************************************
+
+ [% ELSIF message_tag == "install_webservergroup_not_in" %]
+ Warning: you have entered a value for the "webservergroup" parameter in
+ localconfig, but you are not either a) running this script as [% constants.ROOT_USER FILTER html %];
+ or b) a member of this group. This can cause permissions problems and
+ decreased security. If you experience problems running [% terms.Bugzilla %]
+ scripts, log in as [% constants.ROOT_USER FILTER html %] and re-run this script, become a
+ member of the group, or remove the value of the "webservergroup" parameter.
+
+ [% ELSIF message_tag == "install_webservergroup_windows" %]
+ Warning: You have set webservergroup in [% constants.bz_locations.localconfig FILTER html %]
+ Please understand that this does not bring you any security when
+ running under Windows.
+ Verify that the file permissions in your [% terms.Bugzilla %] directory are
+ suitable for your system. Avoid unnecessary write access.
+
+ [% ELSIF message_tag == "product_created" %]
+ [% title = "Product Created" %]
+ The product <em>[% product.name FILTER html %]</em> has been created. You will need to
+ <a href="editcomponents.cgi?action=add&product=[% product.name FILTER url_quote %]">
+ add at least one component</a> before anyone can enter [% terms.bugs %] against this product.
+
+ [% ELSIF message_tag == "product_deleted" %]
+ [% title = "Product Deleted" %]
+ The product <em>[% product.name FILTER html %]</em> and all its versions,
+ components, milestones and group controls have been deleted.
+ [% IF product.bug_count %]
+ All [% terms.bugs %] being in this product and all references
+ to them have also been deleted.
+ [% END %]
+
+ [% ELSIF message_tag == "product_invalid" %]
+ [% title = "$terms.Bugzilla Component Descriptions" %]
+ The product <em>[% product FILTER html %]</em> does not exist
+ or you don't have access to it. The following is a list of the
+ products you can choose from.
+
+ [% ELSIF message_tag == "remaining_time_zeroed" %]
+ The [% field_descs.remaining_time FILTER html %] field has been
+ set to zero automatically as part of closing this [% terms.bug %]
+ or moving it from one closed state to another.
+
+ [% ELSIF message_tag == "sanitycheck" %]
+ [%# We use this way to call sanitycheck-specific messages so that
+ # we can still use get_text(). %]
+ [% PROCESS "admin/sanitycheck/messages.html.tmpl" %]
+
+ [% ELSIF message_tag == "series_all_open" %]
+ All Open
+
+ [% ELSIF message_tag == "series_all_closed" %]
+ All Closed
+
+ [% ELSIF message_tag == "series_subcategory" %]
+ -All-
+
+ [% ELSIF message_tag == "sudo_started" %]
+ [% title = "Sudo session started" %]
+ The sudo session has been started. For the next 6 hours, or until you
+ end the session, everything you do you do as the user you are
+ impersonating ([% target FILTER html %]).
+
+ [% ELSIF message_tag == "sudo_ended" %]
+ [% title = "Sudo session complete" %]
+ The sudo session has been ended. From this point forward, everything you
+ do you do as yourself.
+
+ [% ELSIF message_tag == "series_created" %]
+ [% title = "Series Created" %]
+ The series <em>[% series.category FILTER html %] /
+ [%+ series.subcategory FILTER html %] /
+ [%+ series.name FILTER html %]</em>
+ has been created. Note that you may need to wait up to
+ [%+ series.frequency * 2 %] days before there will be enough data for a
+ chart of this series to be produced.
+
+ [% ELSIF message_tag == "series_deleted" %]
+ [% title = "Series Deleted" %]
+ The series <em>[% series.category FILTER html %] /
+ [%+ series.subcategory FILTER html %] /
+ [%+ series.name FILTER html %]</em>
+ has been deleted.
+
+ [% ELSIF message_tag == "shutdown" %]
+ [% title = "$terms.Bugzilla is Down" %]
+ [% Param("shutdownhtml") %]
+ [% IF userid %]
+ <p>For security reasons, you have been logged out automatically.
+ The cookie that was remembering your login is now gone.
+ [% END %]
+
+ [% ELSIF message_tag == "term" %]
+ [% terms.$term FILTER html %]
+
+ [% ELSIF message_tag == "unexpected_flag_types" %]
+ Some flags could not be set. Please check your changes.
+
+ [% ELSIF message_tag == "user_match_failed" %]
+ You entered a username that did not match any known
+ [% terms.Bugzilla %] users, so we have instead left
+ the [% match_field FILTER html %] field blank.
+
+ [% ELSIF message_tag == "user_match_multiple" %]
+ You entered a username that matched more than one
+ user, so we have instead left the [% match_field FILTER html %]
+ field blank.
+
+ [% ELSIF message_tag == "version_created" %]
+ [% title = "Version Created" %]
+ The version <em>[% version.name FILTER html %]</em> of product
+ <em>[% product.name FILTER html %]</em> has been created.
+
+ [% ELSIF message_tag == "version_deleted" %]
+ [% title = "Version Deleted" %]
+ The version <em>[% version.name FILTER html %]</em> of product
+ <em>[% product.name FILTER html %]</em> has been deleted.
+
+ [% ELSIF message_tag == "version_updated" %]
+ [% title = "Version Updated" %]
+ [% IF changes.size %]
+ [% IF changes.value.defined %]
+ Version renamed to <em>[% version.name FILTER html %]</em>.
+ [% END %]
+ [% ELSE %]
+ No changes made to version <em>[% version.name FILTER html %]</em>.
+ [% END %]
+
+ [% ELSIF message_tag == "workflow_updated" %]
+ The workflow has been updated.
+ [% END %]
+[% END %]
+
+[% IF !message %]
+ [% message = Hook.process('messages') %]
+[% END %]
+
+[%# Give sensible error if the message function is used incorrectly. #%]
+[% IF !message %]
+ [% message = BLOCK %]
+ You are using [% terms.Bugzilla %]'s messaging functions incorrectly. You
+ passed in the string '[% message_tag %]'. The correct use is to pass
+ in a tag, and define that tag in the file messages.html.tmpl.<br>
+ <br>
+ If you are a [% terms.Bugzilla %] end-user seeing this message, please
+ save this page and send it to [% Param('maintainer') %].
+ [% END %]
+[% END %]
diff --git a/template/en/default/global/per-bug-queries.html.tmpl b/template/en/default/global/per-bug-queries.html.tmpl
new file mode 100644
index 0000000..3c62e35
--- /dev/null
+++ b/template/en/default/global/per-bug-queries.html.tmpl
@@ -0,0 +1,100 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% IF user.id && user.settings.per_bug_queries.value == "on" %]
+ <li id="links-special">
+ <script type="text/javascript">
+ <!--
+ function update_text() {
+ // 'lob' means list_of_bugs.
+ var lob_action = document.getElementById('lob_action');
+ var action = lob_action.options[lob_action.selectedIndex].value;
+ var text = document.getElementById('lob_direction');
+ var new_query_text = document.getElementById('lob_new_query_text');
+
+ if (action == "add") {
+ text.innerHTML = "to";
+ new_query_text.style.display = 'inline';
+ }
+ else {
+ text.innerHTML = "from";
+ new_query_text.style.display = 'none';
+ }
+ }
+
+ function manage_old_lists() {
+ var old_lists = document.getElementById('lob_oldqueryname');
+ // If there is no saved searches available, returns.
+ if (!old_lists) return;
+
+ var new_query = document.getElementById('lob_newqueryname').value;
+
+ if (new_query != "") {
+ old_lists.disabled = true;
+ }
+ else {
+ old_lists.disabled = false;
+ }
+ }
+ //-->
+ </script>
+
+ [%# Get existing lists of bugs for this user %]
+ [% lists_of_bugs = [] %]
+ [% FOREACH q = user.queries %]
+ [% NEXT UNLESS q.type == constants.LIST_OF_BUGS %]
+ [% lists_of_bugs.push(q.name) %]
+ [% END %]
+ <div class="label"></div>
+ <ul class="links"><li class="form">
+ <form id="list_of_bugs" action="buglist.cgi" method="get">
+ <input type="hidden" name="cmdtype" value="doit">
+ <input type="hidden" name="remtype" value="asnamed">
+ <input type="hidden" name="list_of_bugs" value="1">
+ <select id="lob_action" name="action" onchange="update_text();">
+ <option value="add">Add</option>
+ [% IF lists_of_bugs.size %]
+ <option value="remove">Remove</option>
+ [% END %]
+ </select>
+
+ [% IF Param('docs_urlbase') %]
+ <a href="[% docs_urlbase FILTER html %]query.html#individual-buglists">the named tag</a>
+ [% ELSE %]
+ the named tag
+ [% END %]
+
+ [% IF lists_of_bugs.size %]
+ <select id="lob_oldqueryname" name="oldqueryname">
+ [% FOREACH query = lists_of_bugs %]
+ <option value="[% query FILTER html %]">[% query FILTER html %]</option>
+ [% END %]
+ </select>
+ [% END %]
+ <span id="lob_new_query_text">
+ [% " or create and add the tag" IF lists_of_bugs.size %]
+ <input class="txt" type="text" id="lob_newqueryname"
+ size="20" maxlength="64" name="newqueryname"
+ onkeyup="manage_old_lists();">
+ </span>
+ <span id="lob_direction">to</span>
+ [%+ terms.bugs %]
+ <input type="text" name="bug_ids" size="12" maxlength="80"
+ [%- " value=\"$bugids\"" IF bugids %]>
+ <input type="submit" value="Commit" id="commit_list_of_bugs">
+ </form>
+ </li></ul>
+ </li>
+[% END %]
diff --git a/template/en/default/global/select-menu.html.tmpl b/template/en/default/global/select-menu.html.tmpl
new file mode 100644
index 0000000..f8d4d68
--- /dev/null
+++ b/template/en/default/global/select-menu.html.tmpl
@@ -0,0 +1,64 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # name: string; the name of the menu.
+ #
+ # multiple: boolean; whether or not the menu is multi-select
+ #
+ # size: integer; the number of items to display at once
+ #
+ # options: array or hash; the items with which to populate the array.
+ # If a hash is passed, the hash keys become the names displayed
+ # to the user while the hash values become the value of the item.
+ #
+ # default: string; the item selected in the menu by default.
+ #
+ # onchange: code; JavaScript to be run when the user changes the value
+ # selected in the menu.
+ #%]
+
+[%# Get the scalar representation of the options reference,
+ # which looks like "ARRAY(0xA352BA3F)" or "HASH(0xA352BA3F)",
+ # so we can figure out whether it is a reference to an array
+ # or a hash.
+ #%]
+[% options_type = BLOCK %][% options %][% END %]
+
+<select name="[% name FILTER html %]"
+ [% IF onchange %]onchange="[% onchange FILTER html %]"[% END %]
+ [% IF multiple %] multiple [% END %]
+ [% IF size %] size="[% size %]" [% END %]>
+ [% IF options_type.search("ARRAY") %]
+ [% FOREACH value = options %]
+ <option value="[% value FILTER html %]"
+ [% " selected" IF value == default %]>
+ [% value FILTER html %]
+ </option>
+ [% END %]
+ [% ELSIF options_type.search("HASH") %]
+ [% FOREACH option = options %]
+ <option value="[% option.value FILTER html %]"
+ [% " selected" IF option.value == default %]>
+ [% option.key FILTER html %]
+ </option>
+ [% END %]
+ [% END %]
+</select>
diff --git a/template/en/default/global/setting-descs.none.tmpl b/template/en/default/global/setting-descs.none.tmpl
new file mode 100644
index 0000000..661334c
--- /dev/null
+++ b/template/en/default/global/setting-descs.none.tmpl
@@ -0,0 +1,51 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Shane H. W. Travis <travis@sedsystems.ca>
+ #
+ #%]
+
+[%# Remember to PROCESS rather than INCLUDE this template. %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% setting_descs = {
+ "comment_sort_order" => "When viewing $terms.abug, show comments in this order",
+ "csv_colsepchar" => "Field separator character for CSV files",
+ "display_quips" => "Show a quip at the top of each $terms.bug list",
+ "zoom_textareas" => "Zoom textareas large when in use (requires JavaScript)",
+ "newest_to_oldest" => "Newest to Oldest",
+ "newest_to_oldest_desc_first" => "Newest to Oldest, but keep Description at the top",
+ "off" => "Off",
+ "oldest_to_newest" => "Oldest to Newest",
+ "on" => "On",
+ "per_bug_queries" => "Enable tags for $terms.bugs",
+ "post_bug_submit_action" => "After changing $terms.abug",
+ "next_bug" => "Show next $terms.bug in my list",
+ "same_bug" => "Show the updated $terms.bug",
+ "standard" => "Classic",
+ "skin" => "$terms.Bugzilla's general appearance (skin)",
+ "nothing" => "Do Nothing",
+ "state_addselfcc" => "Automatically add me to the CC list of $terms.bugs I change",
+ "always" => "Always",
+ "never" => "Never",
+ "cc_unless_role" => "Only if I have no role on them",
+ "lang" => "Language used in email",
+ "quote_replies" => "Quote the associated comment when you click on its reply link",
+ "quoted_reply" => "Quote the full comment",
+ "simple_reply" => "Reference the comment number only",
+ "timezone" => "Timezone used to display dates and times",
+ "local" => "Same as the server",
+ }
+%]
+
+[% Hook.process('settings') %]
diff --git a/template/en/default/global/site-navigation.html.tmpl b/template/en/default/global/site-navigation.html.tmpl
new file mode 100644
index 0000000..df60b76
--- /dev/null
+++ b/template/en/default/global/site-navigation.html.tmpl
@@ -0,0 +1,101 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Toms Baugis <toms.baugis@tietoenator.com>
+ # Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # bug.bug_id: integer. Number of current bug (for navigation purposes)
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% IF NOT (cgi.user_agent("MSIE [1-6]") OR cgi.user_agent("Mozilla/4")) %]
+ <link rel="Top" href="[% urlbase FILTER html %]">
+
+ [%# *** Attachment *** %]
+ [% IF attachment && attachment.bug_id %]
+ <link rel="Up" href="show_bug.cgi?id=[% attachment.bug_id FILTER none %]">
+ [% END %]
+
+
+ [%# *** Dependencies, Votes, Activity, Print-version *** %]
+ [% IF bug %]
+ <link rel="Show" title="Dependency Tree"
+ href="showdependencytree.cgi?id=[% bug.bug_id %]&amp;hide_resolved=1">
+ [% IF Param('webdotbase') %]
+ <link rel="Show" title="Dependency Graph"
+ href="showdependencygraph.cgi?id=[% bug.bug_id %]">
+ [% END %]
+
+ [% IF bug.use_votes %]
+ <link rel="Show" title="Votes ([% bug.votes %])"
+ href="votes.cgi?action=show_bug&amp;bug_id=[% bug.bug_id %]">
+ [% END %]
+
+ <link rel="Show" title="[% terms.Bug %] Activity"
+ href="show_activity.cgi?id=[% bug.bug_id %]">
+ <link rel="Show" title="Printer-Friendly Version"
+ href="show_bug.cgi?format=multiple&amp;id=[% bug.bug_id %]">
+ [% END %]
+
+
+ [%# *** Saved Searches *** %]
+ [% IF user.showmybugslink %]
+ [% user_login = user.login FILTER url_quote %]
+ <link rel="Saved&nbsp;Searches" title="My [% terms.Bugs %]"
+ href="[% Param('mybugstemplate').replace('%userid%', user_login) %]">
+ [% END %]
+
+ [% FOREACH q = user.queries %]
+ <link rel="Saved&nbsp;Searches"
+ title="[% q.name FILTER html %]"
+ href="buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% q.name FILTER url_quote %]">
+ [% END %]
+
+ [% FOREACH q = user.queries_subscribed %]
+ <link rel="Saved&nbsp;Search"
+ title="[% q.name FILTER html %] ([% q.user.login FILTER html %])"
+ href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=
+ [% q.name FILTER url_quote %]&amp;sharer_id=
+ [% q.user.id FILTER url_quote %]">
+ [% END %]
+
+ [%# *** Bugzilla Administration Tools *** %]
+ [% IF user.login %]
+ [% '<link rel="Administration" title="Parameters"
+ href="editparams.cgi">' IF user.in_group('tweakparams') %]
+ [% '<link rel="Administration" title="Users"
+ href="editusers.cgi">' IF user.in_group('editusers') %]
+ [% '<link rel="Administration" title="Products" href="editproducts.cgi">'
+ IF user.in_group('editcomponents') || user.get_products_by_permission("editcomponents").size %]
+ [% '<link rel="Administration" title="Flag Types"
+ href="editflagtypes.cgi">' IF user.in_group('editcomponents') %]
+ [% '<link rel="Administration" title="Groups"
+ href="editgroups.cgi">' IF user.in_group('creategroups') %]
+ [% '<link rel="Administration" title="Keywords"
+ href="editkeywords.cgi">' IF user.in_group('editkeywords') %]
+ [% '<link rel="Administration" title="Whining"
+ href="editwhines.cgi">' IF user.in_group('bz_canusewhines') %]
+ [% '<link rel="Administration" title="Sanity Check"
+ href="sanitycheck.cgi">' IF user.in_group('editcomponents') %]
+ [% END %]
+[% END %]
diff --git a/template/en/default/global/tabs.html.tmpl b/template/en/default/global/tabs.html.tmpl
new file mode 100644
index 0000000..85556c4
--- /dev/null
+++ b/template/en/default/global/tabs.html.tmpl
@@ -0,0 +1,56 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Myk Melez <myk@mozilla.org>
+ # Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # tabs: List of hashes. Must have at least one item. Each hash has:
+ # name: string. Name of the tab.
+ # link: string. relative URL to the tab's resource on this installation.
+ # label: string. text displayed in the tab.
+ # current_tab_name: string. name of the currently selected tab
+ #%]
+
+<div class="tabbed">
+ <table class="tabs" cellspacing="0" cellpadding="10" border="0" width="100%">
+ <tr>
+ <td class="spacer">&nbsp;</td>
+
+ [% FOREACH tab = tabs %]
+ [% IF tab.name == current_tab_name %]
+ <td id="tab_[% tab.name FILTER html %]" class="selected">
+ [% tab.label FILTER html %]</td>
+ [% ELSE %]
+ <td id="tab_[% tab.name FILTER html %]" class="clickable_area"
+ onClick="document.location='[% tab.link FILTER html %]'">
+ <a href="[% tab.link FILTER html %]">[% tab.label FILTER html %]</a>
+ </td>
+ [% END %]
+ [% END %]
+
+ <td class="spacer">&nbsp;</td>
+ </tr>
+ </table>
+
+ <div class="tabbody">
+ [% content %]
+ </div>
+
+</div>
diff --git a/template/en/default/global/textarea.html.tmpl b/template/en/default/global/textarea.html.tmpl
new file mode 100644
index 0000000..d20422e
--- /dev/null
+++ b/template/en/default/global/textarea.html.tmpl
@@ -0,0 +1,50 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ #
+ # id: (optional) The "id"-attribute of the textarea.
+ # name: (optional) The "name"-attribute of the textarea.
+ # accesskey: (optional) The "accesskey"-attribute of the textarea.
+ # style: (optional) The "style"-attribute of the textarea.
+ # classes: (optional) The "class"-attribute of the textarea.
+ # wrap: (deprecated; optional) The "wrap"-attribute of the textarea.
+ # minrows: (required) Number of rows the textarea shall have initially
+ # and when not having focus.
+ # maxrows: (optional) Number of rows the textarea shall have if
+ # maximized (which happens on getting focus). If not given,
+ # the textarea doesn't maximize when getting focus.
+ # defaultrows: (optional) Number of rows the textarea shall have if
+ # the zoom_textareas user preference if off. If not given,
+ # minrows will be used.
+ # cols: (required) Number of columns the textarea shall have.
+ # defaultcontent: (optional) Default content for the textarea.
+ #%]
+
+<textarea [% IF name %]name="[% name FILTER html %]"[% END %]
+ [% IF id %] id="[% id FILTER html %]"[% END %]
+ [% IF accesskey %] accesskey="[% accesskey FILTER html %]"[% END %]
+ [% IF style %] style="[% style FILTER html %]"[% END %]
+ [% IF classes %] class="[% classes FILTER html %]"[% END %]
+ [% IF wrap %] wrap="[% wrap FILTER html %]"[% END %]
+ [% IF defaultrows && user.settings.zoom_textareas.value == 'off' %]
+ rows="[% defaultrows FILTER html %]"
+ [% ELSE %]
+ rows="[% minrows FILTER html %]"
+ [% END %]
+ cols="[% cols FILTER html %]"
+ [% IF maxrows && user.settings.zoom_textareas.value == 'on' %]
+ onFocus="this.rows=[% maxrows FILTER html %]"
+ [% END %]>[% defaultcontent FILTER html %]</textarea>
diff --git a/template/en/default/global/useful-links.html.tmpl b/template/en/default/global/useful-links.html.tmpl
new file mode 100644
index 0000000..1f12249
--- /dev/null
+++ b/template/en/default/global/useful-links.html.tmpl
@@ -0,0 +1,81 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Svetlana Harisova <light@rathedg.com>
+ # Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# Migration note: this whole file corresponds to the old %commandmenu%
+ substitution param in 'footerhtml' %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+<ul id="useful-links">
+ <li id="links-actions">
+ [% PROCESS "global/common-links.html.tmpl" qs_suffix = "_bottom" %]
+ </li>
+
+ [%# Saved searches %]
+
+ [% IF user.showmybugslink OR user.queries.size
+ OR user.queries_subscribed.size
+ %]
+ [% print_pipe = 0 %]
+ <li id="links-saved">
+ <ul class="links">
+ [% IF user.showmybugslink %]
+ [% filtered_username = user.login FILTER url_quote %]
+ <li><a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">My [% terms.Bugs %]</a></li>
+ [% print_pipe = 1 %]
+ [% END %]
+
+ [% FOREACH q = user.queries %]
+ [% IF q.link_in_footer %]
+ <li>[% '<span class="separator">| </span>' IF print_pipe %]
+ <a href="buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% q.name FILTER url_quote %]">[% q.name FILTER html %]</a></li>
+ [% print_pipe = 1 %]
+ [% END %]
+ [% END %]
+ [% new_line = print_pipe %]
+ [% print_pipe = 0 %]
+ [% FOREACH q = user.queries_subscribed %]
+ [% IF new_line %]
+ <br>
+ [% new_line = 0 %]
+ [% END %]
+ <li>
+ [% '<span class="separator">| </span>' IF print_pipe %]
+ <a href="buglist.cgi?cmdtype=dorem&amp;remaction=run&amp;namedcmd=
+ [% q.name FILTER url_quote %]&amp;sharer_id=
+ [% q.user.id FILTER url_quote %]"
+ class="shared"
+ title="Shared by [% q.user.identity FILTER html %]"
+ >[% q.name FILTER html FILTER no_break %]</a></li>
+ [% print_pipe = 1 %]
+ [% END %]
+ </ul>
+ </li>
+ [% END %]
+
+ [%# Individual bugs addition %]
+
+ [% PROCESS "global/per-bug-queries.html.tmpl" %]
+
+ [%# Sections of links to more things users can do on this installation. %]
+ [% Hook.process("end") %]
+</ul>
diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl
new file mode 100644
index 0000000..4698c94
--- /dev/null
+++ b/template/en/default/global/user-error.html.tmpl
@@ -0,0 +1,1806 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # header_done: boolean. True if the Bugzilla header has already been printed.
+ # error: string. The tag of the error, or the error message to be displayed
+ # (deprecated). May contain HTML if it's an error message.
+ #%]
+
+[%# This is a list of all the possible user errors. Please keep them in
+ # alphabetical order by error tag, and leave a blank line between errors.
+ #
+ # Note that you must explicitly filter every single template variable
+ # in this file; if you do not wish to change it, use the "none" filter.
+ #
+ # Extension- or custom-specific error handling can be easily added
+ # via hooks: just place additional code into
+ # template/en/hook/global/user-error-errors.html.tmpl
+ # Note: be aware of uniqueness of error string parameter value, since
+ # nobody can guarantee the hook files processing order in the future.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% DEFAULT title = "Error" %]
+
+[% error_message = BLOCK %]
+ [% IF error == "account_creation_disabled" %]
+ [% title = "Account Creation Disabled" %]
+ User account creation has been disabled.
+ <hr>
+ New accounts must be created by an administrator. The
+ maintainer is [% Param("maintainer") %].
+
+ [% ELSIF error == "account_creation_restricted" %]
+ [% title = "Account Creation Restricted" %]
+ User account creation has been restricted.
+ <hr>
+ Contact your administrator or the maintainer
+ ([% Param("maintainer") %]) for information about
+ creating an account.
+
+ [% ELSIF error == "account_disabled" %]
+ [% title = "Account Disabled" %]
+ [% disabled_reason FILTER none %]
+ <hr>
+ If you believe your account should be restored, please
+ send email to [% Param("maintainer") %] explaining why.
+
+ [% ELSIF error == "account_exists" %]
+ [% title = "Account Already Exists" %]
+ There is already an account with
+ [% IF email %]
+ the login name [% email FILTER html %].
+ [% ELSE %]
+ that login name.
+ [% END %]
+
+ [% ELSIF error == "account_locked" %]
+ [% title = "Account Locked" %]
+ Your IP ([% ip_addr FILTER html %]) has been locked out of this
+ account until [% unlock_at FILTER time %], as you have
+ exceeded the maximum number of login attempts.
+
+ [% ELSIF error == "alias_has_comma_or_space" %]
+ [% title = "Invalid Characters In Alias" %]
+ The alias you entered, <em>[% alias FILTER html %]</em>,
+ contains one or more commas or spaces. Aliases cannot contain
+ commas or spaces because those characters are used to separate
+ aliases from each other in lists. Please choose an alias
+ that does not contain commas and spaces.
+
+ [% ELSIF error == "alias_in_use" %]
+ [% title = "Alias In Use" %]
+ [% terms.Bug %] [%+ bug_id FILTER bug_link(bug_id) FILTER none %]
+ has already taken the alias <em>[% alias FILTER html %]</em>.
+ Please choose another one.
+
+ [% ELSIF error == "alias_is_numeric" %]
+ [% title = "Alias Is Numeric" %]
+ You tried to give this [% terms.bug %] the alias <em>[% alias FILTER html %]</em>,
+ but aliases cannot be merely numbers, since they could
+ then be confused with [% terms.bug %] IDs. Please choose an
+ alias containing at least one letter.
+
+ [% ELSIF error == "alias_too_long" %]
+ [% title = "Alias Too Long" %]
+ [% terms.Bug %] aliases cannot be longer than 20 characters.
+ Please choose a shorter alias.
+
+ [% ELSIF error == "auth_cant_create_account" %]
+ [% title = "Can't create accounts" %]
+ This site is using an authentication scheme which does not permit
+ account creation. Please contact an administrator to get a new account
+ created.
+
+ [% ELSIF error == "auth_failure" %]
+ [% title = "Authorization Required" %]
+ [% admindocslinks = {'groups.html' => 'Group Security'} %]
+ Sorry,
+ [% IF group %]
+ you aren't a member of the '[% group FILTER html %]' group,
+ [% END %]
+
+ [% IF reason %]
+ [% IF group %] and [% END %]
+ [% IF reason == "cant_bless" %]
+ you don't have permissions to add or remove people from a group,
+ [% ELSIF reason == "not_visible" %]
+ there are visibility restrictions on certain user groups,
+ [% END %]
+ [% END %]
+
+ [% IF group || reason %] and so [% END %] you are not authorized to
+ [% IF action == "access" %]
+ access
+ [% ELSIF action == "add" %]
+ add new
+ [% ELSIF action == "begin" %]
+ begin
+ [% ELSIF action == "modify" %]
+ modify
+ [% ELSIF action == "delete" %]
+ delete
+ [% ELSIF action == "edit" %]
+ add, modify or delete
+ [% ELSIF action == "move" %]
+ move
+ [% ELSIF action == "run" %]
+ run
+ [% ELSIF action == "schedule" %]
+ schedule
+ [% ELSIF action == "use" %]
+ use
+ [% ELSIF action == "approve" %]
+ approve
+ [% END %]
+
+ [% IF object == "administrative_pages" %]
+ administrative pages
+ [% ELSIF object == "attachment" %]
+ [% IF attach_id %]
+ attachment #[% attach_id FILTER html %]
+ [% ELSE %]
+ this attachment
+ [% END %]
+ [% ELSIF object == "bugs" %]
+ [%+ terms.bugs %]
+ [% ELSIF object == "charts" %]
+ the "New Charts" feature
+ [% ELSIF object == "classifications" %]
+ classifications
+ [% ELSIF object == "components" %]
+ components
+ [% ELSIF object == "custom_fields" %]
+ custom fields
+ [% ELSIF object == "field_values" %]
+ field values
+ [% ELSIF object == "flagtypes" %]
+ flag types
+ [% ELSIF object == "group_access" %]
+ group access
+ [% ELSIF object == "groups" %]
+ groups
+ [% ELSIF object == "keywords" %]
+ keywords
+ [% ELSIF object == "milestones" %]
+ milestones
+ [% ELSIF object == "multiple_bugs" %]
+ multiple [% terms.bugs %] at once
+ [% ELSIF object == "parameters" %]
+ parameters
+ [% ELSIF object == "products" %]
+ products
+ [% ELSIF object == "quips" %]
+ quips
+ [% ELSIF object == "reports" %]
+ whine reports
+ [% ELSIF object == "sanity_check" %]
+ a sanity check
+ [% ELSIF object == "settings" %]
+ settings
+ [% ELSIF object == "sudo_session" %]
+ a sudo session
+ [% ELSIF object == "timetracking_summaries" %]
+ time-tracking summary reports
+ [% ELSIF object == "user" %]
+ the user [% IF userid %] with ID '[% userid FILTER html %]'
+ [% ELSE %]you specified [% END %]
+ [% ELSIF object == "users" %]
+ users
+ [% ELSIF object == "versions" %]
+ versions
+ [% ELSIF object == "workflow" %]
+ the workflow
+ [% END %].
+
+ [% Hook.process("auth_failure") %]
+
+ [% ELSIF error == "attachment_deletion_disabled" %]
+ [% title = "Attachment Deletion Disabled" %]
+ Attachment deletion is disabled on this installation.
+
+ [% ELSIF error == "attachment_illegal_url" %]
+ [% title = "Illegal Attachment URL" %]
+ <em>[% url FILTER html %]</em> is not a legal URL for attachments.
+ It must start either with http://, https:// or ftp://.
+
+ [% ELSIF error == "attachment_removed" %]
+ [% title = "Attachment Removed" %]
+ The attachment you are attempting to access has been removed.
+
+ [% ELSIF error == "bug_access_denied" %]
+ [% title = "Access Denied" %]
+ [% admindocslinks = {'groups.html' => 'Group Security'} %]
+ You are not authorized to access [% terms.bug %] #[% bug_id FILTER html %].
+
+ [% ELSIF error == "bug_access_query" %]
+ [% title = "Access Denied" %]
+ [% docslinks = {'myaccount.html' => 'Creating an account'} %]
+ You are not authorized to access [% terms.bug %] #[% bug_id FILTER html %].
+ To see this [% terms.bug %], you must
+ first <a href="show_bug.cgi?id=
+ [% bug_id FILTER url_quote %]&amp;GoAheadAndLogIn=1">log
+ in to an account</a> with the appropriate permissions.
+
+ [% ELSIF error == "bug_url_invalid" %]
+ [% title = "Invalid $terms.Bug URL" %]
+ <code>[% url FILTER html %]</code> is not a valid URL to [% terms.abug %].
+ [% IF reason == 'http' %]
+ URLs must start with "http" or "https".
+ [% ELSIF reason == 'show_bug' %]
+ [%+ terms.Bug %] URLs should point to <code>show_bug.cgi</code>
+ in a [% terms.Bugzilla %] installation.
+ [% ELSIF reason == 'id' %]
+ There is no valid [% terms.bug %] id in that URL.
+ [% END %]
+
+ [% ELSIF error == "bug_url_too_long" %]
+ [% title = "Invalid $terms.Bug URL" %]
+ [% terms.Bug %] URLs can not be longer than
+ [%+ constants.MAX_BUG_URL_LENGTH FILTER none %] characters long.
+ <code>[% url FILTER html %]</code> is too long.
+
+ [% ELSIF error == "buglist_parameters_required" %]
+ [% title = "Parameters Required" %]
+ [% docslinks = {'query.html' => "Searching for $terms.bugs",
+ 'query.html#list' => "$terms.Bug lists"} %]
+ You may not search, or create saved searches, without any search terms.
+
+ [% ELSIF error == "chart_too_large" %]
+ [% title = "Chart Too Large" %]
+ Sorry, but 2000 x 2000 is the maximum size for a chart.
+
+ [% ELSIF error == "comment_id_invalid" %]
+ [% id FILTER html %] is not a valid comment id.
+
+ [% ELSIF error == "comment_invalid_isprivate" %]
+ You tried to modify the privacy of comment id [% id FILTER html %],
+ but that is not a valid comment on this [% terms.bug %].
+
+ [% ELSIF error == "comment_is_private" %]
+ Comment id [% id FILTER html %] is private.
+
+ [% ELSIF error == "comment_required" %]
+ [% title = "Comment Required" %]
+ You have to specify a
+ [% IF old && new %]
+ <b>comment</b> when changing the status of [% terms.abug %] from
+ [%+ old.name FILTER html %] to [% new.name FILTER html %].
+ [% ELSIF new %]
+ description for this [% terms.bug %].
+ [% ELSE %]
+ <b>comment</b> on this change.
+ [% END %]
+
+ [% ELSIF error == "comment_too_long" %]
+ [% title = "Comment Too Long" %]
+ Comments cannot be longer than
+ [%+ constants.MAX_COMMENT_LENGTH FILTER html %] characters.
+
+ [% ELSIF error == "auth_classification_not_enabled" %]
+ [% title = "Classification Not Enabled" %]
+ Sorry, classification is not enabled.
+
+ [% ELSIF error == "classification_name_too_long" %]
+ [% title = "Classification Name Too Long" %]
+ The name of a classification is limited to [% constants.MAX_CLASSIFICATION_SIZE FILTER html %]
+ characters. '[% name FILTER html %]' is too long ([% name.length %] characters).
+
+[% ELSIF error == "classification_not_specified" %]
+ [% title = "You Must Supply A Classification Name" %]
+ You must enter a classification name.
+
+ [% ELSIF error == "classification_already_exists" %]
+ [% title = "Classification Already Exists" %]
+ A classification with the name '[% name FILTER html %]' already exists.
+
+ [% ELSIF error == "classification_invalid_sortkey" %]
+ [% title = "Invalid Sortkey for Classification" %]
+ The sortkey '[% sortkey FILTER html %]' is invalid. It must be an
+ integer between 0 and [% constants.MAX_SMALLINT FILTER html %].
+
+ [% ELSIF error == "classification_not_deletable" %]
+ [% title = "Default Classification Can Not Be Deleted" %]
+ You can not delete the default classification
+
+ [% ELSIF error == "classification_has_products" %]
+ Sorry, there are products for this classification. You
+ must reassign those products to another classification before you
+ can delete this one.
+
+ [% ELSIF error == "component_already_exists" %]
+ [% title = "Component Already Exists" %]
+ The <em>[% product.name FILTER html %]</em> product already has
+ a component named <em>[% name FILTER html %]</em>.
+
+ [% ELSIF error == "component_blank_description" %]
+ [% title = "Blank Component Description Not Allowed" %]
+ You must enter a non-blank description for this component.
+
+ [% ELSIF error == "component_blank_name" %]
+ [% title = "Blank Component Name Not Allowed" %]
+ You must enter a name for this new component.
+
+ [% ELSIF error == "component_has_bugs" %]
+ [% title = BLOCK %]Component has [% terms.Bugs %][% END %]
+ There are [% nb FILTER html %] [%+ terms.bugs %] entered for this component!
+ You must reassign those [% terms.bugs %] to another component before you
+ can delete this one.
+
+ [% ELSIF error == "component_name_too_long" %]
+ [% title = "Component Name Is Too Long" %]
+ The name of a component is limited to [% constants.MAX_COMPONENT_SIZE FILTER html %]
+ characters. '[% name FILTER html %]' is too long ([% name.length %] characters).
+
+ [% ELSIF error == "component_need_initialowner" %]
+ [% title = "Component Requires Default Assignee" %]
+ A default assignee is required for this component.
+
+ [% ELSIF error == "customfield_nonexistent" %]
+ [% title = "Unknown Custom Field" %]
+ There is no custom field with the name '[% name FILTER html %]'.
+
+ [% ELSIF error == "customfield_not_obsolete" %]
+ [% title = "Custom Field Not Obsolete" %]
+ The custom field '[% name FILTER html %]' is not obsolete.
+ Please obsolete a custom field before attempting to delete it.
+
+ [% ELSIF error == "customfield_has_activity" %]
+ [% title = "Custom Field Has Activity" %]
+ The custom field '[% name FILTER html %]' cannot be deleted because
+ it has recorded activity.
+
+ [% ELSIF error == "customfield_has_contents" %]
+ [% title = "Custom Field Has Contents" %]
+ The custom field '[% name FILTER html %]' cannot be deleted because
+ at least one [% terms.bug %] has a non empty value for this field.
+
+ [% ELSIF error == "dependency_loop_multi" %]
+ [% title = "Dependency Loop Detected" %]
+ The following [% terms.bug %](s) would appear on both the "depends on"
+ and "blocks" parts of the dependency tree if these changes
+ are committed:
+ [% FOREACH dep = deps %]
+ [%+ dep FILTER bug_link(dep) FILTER none %]
+ [% END %].
+ This would create a circular dependency, which is not allowed.
+
+ [% ELSIF error == "dependency_loop_single" %]
+ [% title = "Dependency Loop Detected" %]
+ You can't make [% terms.abug %] block itself or depend on itself.
+
+ [% ELSIF error == "dupe_id_required" %]
+ [% title = "Duplicate $terms.Bug Id Required" %]
+ You must specify [% terms.abug %] id to mark this [% terms.bug %]
+ as a duplicate of.
+
+ [% ELSIF error == "dupe_not_allowed" %]
+ [% title = "Cannot mark $terms.bugs as duplicates" %]
+ You cannot mark [% terms.bugs %] as duplicates when
+ changing several [% terms.bugs %] at once.
+
+ [% ELSIF error == "dupe_loop_detected" %]
+ [% title = "Loop detected among duplicates" %]
+ You cannot mark [% terms.bug %] [%+ bug_id FILTER html %] as
+ a duplicate of
+ [% IF dupe_of == bug_id %]
+ itself
+ [% ELSE %]
+ [%+ terms.bug %] [%+ dupe_of FILTER html %], because it
+ would create a duplicate loop
+ [% END %].
+
+ [% ELSIF error == "email_change_in_progress" %]
+ [% title = "Email Change Already In Progress" %]
+ Email change already in progress; please check your email.
+
+ [% ELSIF error == "email_confirmation_failed" %]
+ [% title = "Email Address Confirmation Failed" %]
+ Email address confirmation failed.
+
+ [% ELSIF error == "email_no_text_plain" %]
+ Your message did not contain any text.[% terms.Bugzilla %] does not
+ accept HTML-only email, or HTML email with attachments.
+
+ [% ELSIF error == "empty_group_description" %]
+ [% title = "The group description can not be empty" %]
+ You must enter a description for the group.
+
+ [% ELSIF error == "empty_group_name" %]
+ [% title = "The group name can not be empty" %]
+ You must enter a name for the group.
+
+ [% ELSIF error == "entry_access_denied" %]
+ [% title = "Permission Denied" %]
+ [% admindocslinks = {'groups.html' => 'Group Security'} %]
+ Sorry, either the product <em>[% product FILTER html %]</em>
+ does not exist or you aren't authorized to
+ enter [% terms.abug %] into it.
+
+ [% ELSIF error == "extension_create_no_name" %]
+ You must specify a name for your extension, as an argument to this script.
+
+ [% ELSIF error == "extension_first_letter_caps" %]
+ The first letter of your extension's name must be a capital letter.
+ (You specified '[% name FILTER html %]'.)
+
+ [% ELSIF error == "field_already_exists" %]
+ [% title = "Field Already Exists" %]
+ The field '[% field.name FILTER html %]'
+ ([% field.description FILTER html %]) already exists. Please
+ choose another name.
+
+ [% ELSIF error == "field_cant_control_self" %]
+ [% title = "Field Can't Control Itself" %]
+ The [% field.description FILTER html %] field can't be set to control
+ itself.
+
+ [% ELSIF error == "field_control_must_be_select" %]
+ [% title = "Invalid Field Type Selected" %]
+ Only drop-down and multi-select fields can be used to control
+ the visibility/values of other fields. [% field.description FILTER html %]
+ is not the right type of field.
+
+ [% ELSIF error == "field_invalid_name" %]
+ [% title = "Invalid Field Name" %]
+ '[% name FILTER html %]' is not a valid name for a field.
+ A name may contain only letters, numbers, and the underscore character.
+
+ [% ELSIF error == "field_invalid_sortkey" %]
+ [% title = "Invalid Sortkey for Field" %]
+ The sortkey [% sortkey FILTER html %] that you have provided for
+ this field is not a valid positive integer.
+
+ [% ELSIF error == "field_missing_description" %]
+ [% title = "Missing Description for Field" %]
+ You must enter a description for this field.
+
+ [% ELSIF error == "field_missing_name" %]
+ [% title = "Missing Name for Field" %]
+ You must enter a name for this field.
+
+ [% ELSIF error == "field_value_control_select_only" %]
+ [% title = "Invalid Value Control Field" %]
+ Only Drop-Down or Multi-Select fields can have a field that
+ controls their values.
+
+ [% ELSIF error == "fieldname_invalid" %]
+ [% title = "Specified Field Does Not Exist" %]
+ The field '[% field.name FILTER html %]' does not exist or
+ cannot be edited with this interface.
+
+ [% ELSIF error == "fieldvalue_already_exists" %]
+ [% title = "Field Value Already Exists" %]
+ The value '[% value.name FILTER html %]' already exists for the
+ [%+ field.description FILTER html %] field.
+
+ [% ELSIF error == "fieldvalue_is_controller" %]
+ [% title = "Value Controls Other Fields" %]
+ You cannot delete the [% value.field.description FILTER html %]
+ '[% value.name FILTER html %]' because
+ [% IF fields.size %]
+ it controls the visibility of the following fields:
+ [%+ fields.join(', ') FILTER html %].
+ [% END %]
+ [% ' and ' IF fields.size AND vals.size %]
+ [% IF vals.size %]
+ it controls the visibility of the following field values:
+ <ul>
+ [% FOREACH field_name = vals.keys %]
+ [% FOREACH val = vals.${field_name} %]
+ <li>[% val.field.name FILTER html %]:
+ '[% val.name FILTER html %]'</li>
+ [% END %]
+ [% END %]
+ </ul>
+ [% END %]
+
+ [% ELSIF error == "fieldvalue_is_default" %]
+ [% title = "Specified Field Value Is Default" %]
+ '[% value.name FILTER html %]' is the default value for
+ the '[% field.description FILTER html %]' field and cannot be deleted.
+ [% IF user.in_group('tweakparams') %]
+ You have to <a href="editparams.cgi?section=bugfields#
+ [%- param_name FILTER url_quote %]">change</a> the default value first.
+ [% END %]
+
+ [% ELSIF error == "fieldvalue_name_too_long" %]
+ [% title = "Field Value Is Too Long" %]
+ The value of a field is limited to
+ [%+ constants.FIELD_VALUE_MAX_SIZE FILTER none %] characters.
+ '[% value FILTER html %]' is too long ([% value.length %] characters).
+
+ [% ELSIF error == "fieldvalue_not_editable" %]
+ [% title = "Field Value Not Editable" %]
+ The value '[% old_value.name FILTER html %]' cannot be renamed because
+ it plays some special role for the '[% field.description FILTER html %]'
+ field.
+
+ [% ELSIF error == "fieldvalue_not_deletable" %]
+ [% title = "Field Value Not Deletable" %]
+ The value '[% value.name FILTER html %]' cannot be removed because
+ it plays some special role for the '[% field.description FILTER html %]'
+ field.
+
+ [% ELSIF error == "fieldvalue_reserved_word" %]
+ [% title = "Reserved Word Not Allowed" %]
+ You cannot use the value '[% value FILTER html %]' for the
+ '[% field.description FILTER html %]' field. This value is used internally.
+ Please choose another one.
+
+ [% ELSIF error == "fieldvalue_sortkey_invalid" %]
+ [% title = "Invalid Field Value Sortkey" %]
+ The sortkey '[% sortkey FILTER html %]' for the
+ [%+ field.description FILTER html %] field is not a valid
+ (positive) number.
+
+ [% ELSIF error == "fieldvalue_still_has_bugs" %]
+ [% title = "You Cannot Delete This Field Value" %]
+ You cannot delete the value '[% value.name FILTER html %]' from the
+ [% field.description FILTER html %] field, because there are still
+ [%+ value.bug_count FILTER html %] [%+ terms.bugs %] using it.
+
+ [% ELSIF error == "fieldvalue_undefined" %]
+ [% title = "Undefined Value Not Allowed" %]
+ You must specify a value.
+
+ [% ELSIF error == "file_not_specified" %]
+ [% title = "No File Specified" %]
+ You did not specify a file to attach.
+
+ [% ELSIF error == "file_too_large" %]
+ [% title = "File Too Large" %]
+ The file you are trying to attach is [% filesize FILTER html %]
+ kilobytes (KB) in size. Non-patch attachments cannot be more than
+ [%+ Param('maxattachmentsize') %] KB. <br>
+ We recommend that you store your attachment elsewhere
+ [% IF Param("allow_attach_url") %]
+ and then specify the URL to this file on the attachment
+ creation page in the <b>AttachURL</b> field.
+ [% ELSE %]
+ and then insert the URL to it in a comment, or in the URL field
+ for this [% terms.bug %].
+ [% END %]
+ <br>Alternately, if your attachment is an image, you could convert
+ it to a compressible format like JPG or PNG and try again.
+
+ [% ELSIF error == "flag_requestee_needs_privs" %]
+ [% title = "Flag Requestee Needs Privileges" %]
+ [% requestee.identity FILTER html %] does not have permission to set the
+ <em>[% flagtype.name FILTER html %]</em> flag. Please select a user who is
+ a member of the <em>[% flagtype.grant_group.name FILTER html %]</em> group.
+
+ [% ELSIF error == "flag_requestee_unauthorized" %]
+ [% title = "Flag Requestee Not Authorized" %]
+ [% admindocslinks = {'flags-overview.html#flags-admin' => 'Administering Flags',
+ 'groups.html' => 'Group Security'} %]
+ [% docslinks = {'flags-overview.html' => 'An overview on Flags',
+ 'flags.html' => 'Using Flags'} %]
+
+ You asked [% requestee.identity FILTER html %]
+ for <code>[% flag_type.name FILTER html %]</code> on [% terms.bug %]
+ [%+ bug_id FILTER html -%]
+ [% IF attach_id && attach_id > 0 %], attachment [% attach_id FILTER html %][% END %],
+ but that [% terms.bug %] has been restricted to users in certain groups,
+ and the user you asked isn't in all the groups to which
+ the [% terms.bug %] has been restricted.
+ Please choose someone else to ask, or make the [% terms.bug %] accessible
+ to users on its CC: list and add that user to the list.
+
+ [% ELSIF error == "flag_requestee_unauthorized_attachment" %]
+ [% title = "Flag Requestee Not Authorized" %]
+ [% admindocslinks = {'flags-overview.html#flags-admin' => 'Administering Flags',
+ 'groups.html' => 'Group Security'} %]
+ [% docslinks = {'flags-overview.html' => 'An overview on Flags',
+ 'flags.html' => 'Using Flags'} %]
+
+ You asked [% requestee.identity FILTER html %]
+ for <code>[% flag_type.name FILTER html %]</code> on
+ [%+ terms.bug %] [%+ bug_id FILTER html %],
+ attachment [% attach_id FILTER html %], but that attachment
+ is restricted to users in the [% Param("insidergroup") FILTER html %] group,
+ and the user you asked isn't in that group. Please choose someone else
+ to ask, or ask an administrator to add the user to the group.
+
+ [% ELSIF error == "flag_type_cc_list_invalid" %]
+ [% title = "Flag Type CC List Invalid" %]
+ [% admindocslinks = {'flags-overview.html#flags-admin' => 'Administering Flags'} %]
+ The CC list [% cc_list FILTER html %] must be less than 200 characters long.
+
+ [% ELSIF error == "flag_type_component_without_product" %]
+ [% title = "Product Missing" %]
+ A component was selected without a product being selected.
+
+ [% ELSIF error == "flag_type_description_invalid" %]
+ [% title = "Flag Type Description Invalid" %]
+ [% admindocslinks = {'flags-overview.html#flags-admin' => 'Administering Flags'} %]
+ The description must be less than 32K.
+
+ [% ELSIF error == "flag_type_name_invalid" %]
+ [% title = "Flag Type Name Invalid" %]
+ [% admindocslinks = {'flags-overview.html#flags-admin' => 'Administering Flags'} %]
+ The name <em>[% name FILTER html %]</em> must be 1-50 characters long
+ and must not contain any spaces or commas.
+
+ [% ELSIF error == "flag_type_not_multiplicable" %]
+ [% docslinks = {'flags-overview.html' => 'An overview on Flags',
+ 'flags.html' => 'Using Flags'} %]
+ You cannot have several <em>[% type.name FILTER html %]</em> flags
+ for this [% IF attachment %] attachment [% ELSE %] [%+ terms.bug %] [% END %].
+
+ [% ELSIF error == "flag_update_denied" %]
+ [% title = "Flag Modification Denied" %]
+ [% admindocslinks = {'flags-overview.html#flags-admin' => 'Administering Flags',
+ 'groups.html' => 'Group Security'} %]
+ [% docslinks = {'flags-overview.html' => 'An overview on Flags',
+ 'flags.html' => 'Using Flags'} %]
+ You tried to [% IF status == "+" %] grant [% ELSIF status == "-" %] deny
+ [% ELSIF status == "X" %] clear [% ELSE %] request [% END %]
+ <code>[% name FILTER html %]
+ [% IF status == "X" %][% old_status FILTER html %][% END %]</code>.
+
+ Only a user with the required permissions may make this change.
+
+ [% ELSIF error == "format_not_found" %]
+ [% title = "Format Not Found" %]
+ The requested format <em>[% format FILTER html %]</em> does not exist with
+ a content type of <em>[% ctype FILTER html %]</em>.
+
+ [% ELSIF error == "flag_type_sortkey_invalid" %]
+ [% title = "Flag Type Sort Key Invalid" %]
+ The sort key must be an integer between 0 and 32767 inclusive.
+ It cannot be <em>[% sortkey FILTER html %]</em>.
+
+ [% ELSIF error == "freetext_too_long" %]
+ [% title = "Text Too Long" %]
+ The text you entered is too long ([% text.length FILTER html %] characters,
+ above the maximum length allowed of [% constants.MAX_FREETEXT_LENGTH FILTER none %]
+ characters):
+ <p><em>[% text FILTER html %]</em></p>
+
+ [% ELSIF error == "group_cannot_delete" %]
+ [% title = "Cannot Delete Group" %]
+ The <em>[% group.name FILTER html %]</em> group cannot be deleted because
+ there are
+ <a href="editgroups.cgi?action=del&amp;group=
+ [%- group.id FILTER url_quote %]">records</a>
+ in the database which refer to it. All references to this group must
+ be removed before you can remove it.
+
+ [% ELSIF error == "group_change_denied" %]
+ [% title = "Cannot Add/Remove That Group" %]
+ You tried to add or remove group id [% group_id FILTER html %]
+ from [% terms.bug %] [%+ bug.id FILTER html %], but you do not
+ have permissions to do so.
+
+ [% ELSIF error == "group_exists" %]
+ [% title = "The group already exists" %]
+ The group [% name FILTER html %] already exists.
+
+ [% ELSIF error == "group_has_special_role" %]
+ [% title = "Group not deletable" %]
+ [% IF groups.size == 1 %]
+ [% attr = "it" %]
+ [% param = "parameter" %]
+ [% ELSE %]
+ [% attr = "them" %]
+ [% param = "parameters" %]
+ [% END %]
+ The group '[% name FILTER html %]' is used by the
+ '[% groups.join("' and '") FILTER html %]' [% param FILTER html %].
+ In order to delete this group, you first have to change the
+ [%+ param FILTER html %] to make [% attr FILTER html %] point to another group.
+
+
+ [% ELSIF error == "group_invalid_removal" %]
+ You tried to remove [% terms.bug %] [%+ bug.id FILTER html %]
+ from group id [% group_id FILTER html %], but [% terms.bugs %] in the
+ '[% product FILTER html %]' product can not be removed from that
+ group.
+
+ [% ELSIF error == "group_invalid_restriction" %]
+ You tried to restrict [% terms.bug %] [%+ bug.id FILTER html %] to
+ to group id [% group_id FILTER html %], but [% terms.bugs %] in the
+ '[% product FILTER html %]' product can not be restricted to
+ that group.
+
+ [% ELSIF error == "group_not_specified" %]
+ [% title = "Group not specified" %]
+ No group was specified.
+
+ [% ELSIF error == "system_group_not_deletable" %]
+ [% title = "System Groups not deletable" %]
+ <em>[% name FILTER html %]</em> is a system group.
+ This group cannot be deleted.
+
+ [% ELSIF error == "group_unknown" %]
+ [% title = "Unknown Group" %]
+ The group [% name FILTER html %] does not exist. Please specify
+ a valid group name. Create it first if necessary!
+
+ [% ELSIF error == "illegal_at_least_x_votes" %]
+ [% title = "Your Search Makes No Sense" %]
+ The <em>At least ___ votes</em> field must be a simple number.
+ You entered <tt>[% value FILTER html %]</tt>, which isn't.
+
+ [% ELSIF error == "illegal_attachment_edit" %]
+ [% title = "Unauthorized Action" %]
+ You are not authorized to edit attachment [% attach_id FILTER html %].
+
+ [% ELSIF error == "illegal_attachment_edit_bug" %]
+ [% title = "Unauthorized Action" %]
+ You are not authorized to edit attachments on [% terms.bug %]
+ [%+ bug_id FILTER html %].
+
+ [% ELSIF error == "illegal_attachment_is_patch" %]
+ [% title = "Your Search Makes No Sense" %]
+ The only legal values for the <em>Attachment is patch</em> field are
+ 0 and 1.
+
+ [% ELSIF error == "illegal_bug_status_transition" %]
+ [% title = "Illegal $terms.Bug Status Change" %]
+ [% IF old.defined %]
+ You are not allowed to change the [% terms.bug %] status from
+ [%+ old.name FILTER html %] to [% new.name FILTER html %].
+ [% ELSE %]
+ You are not allowed to file new [% terms.bugs %] with the
+ [%+ new.name FILTER html %] status.
+ [% END %]
+
+ [% ELSIF error == "illegal_change" %]
+ [% title = "Not allowed" %]
+ You tried to change the
+ <strong>[% field_descs.$field FILTER html %]</strong> field
+ [% IF oldvalue.defined %]
+ from <em>[% oldvalue.join(', ') FILTER html %]</em>
+ [% END %]
+ [% IF newvalue.defined %]
+ to <em>[% newvalue.join(', ') FILTER html %]</em>
+ [% END %]
+ , but only
+ [% IF privs < 3 %]
+ the assignee
+ [% IF privs < 2 %] or reporter [% END %]
+ of the [% terms.bug %], or
+ [% END %]
+ a user with the required permissions may change that field.
+
+ [% ELSIF error == "illegal_change_deps" %]
+ [% title = "Not allowed" %]
+ You tried to change the
+ <strong>[% field_descs.$field FILTER html %]</strong> field
+ but only a user allowed to edit
+ both related [% terms.bugs %] may change that field.
+
+ [% ELSIF error == "illegal_changed_in_last_x_days" %]
+ [% title = "Your Search Makes No Sense" %]
+ The <em>Changed in last ___ days</em> field must be a simple number.
+ You entered <tt>[% value FILTER html %]</tt>, which isn't.
+
+ [% ELSIF error == "illegal_date" %]
+ [% title = "Illegal Date" %]
+ '<tt>[% date FILTER html %]</tt>' is not a legal date.
+ [% IF format %]
+ Please use the format '<tt>[% format FILTER html %]</tt>'.
+ [% END %]
+
+ [% ELSIF error == "illegal_email_address" %]
+ [% title = "Invalid Email Address" %]
+ The e-mail address you entered (<b>[% addr FILTER html %]</b>)
+ didn't pass our syntax checking for a legal email address.
+ [% IF default %]
+ A legal address must contain exactly one '@',
+ and at least one '.' after the @.
+ [% ELSE %]
+ [%+ Param('emailregexpdesc') %]
+ [% END %]
+ It must also not contain any of these special characters:
+ <tt>\ ( ) &amp; &lt; &gt; , ; : &quot; [ ]</tt>, or any whitespace.
+
+ [% ELSIF error == "illegal_frequency" %]
+ [% title = "Too Frequent" %]
+ Unless you are an administrator, you may not create series which are
+ run more often than once every [% minimum FILTER html %] days.
+
+ [% ELSIF error == "illegal_group_control_combination" %]
+ [% title = "Your Group Control Combination Is Illegal" %]
+ [% admindocslinks = {'groups.html' => 'Assigning Group Controls to Products'} %]
+ Your group control combination for group &quot;
+ [% groupname FILTER html %]&quot; is illegal.
+
+ [% ELSIF error == "illegal_is_obsolete" %]
+ [% title = "Your Search Makes No Sense" %]
+ The only legal values for the <em>Attachment is obsolete</em> field are
+ 0 and 1.
+
+ [% ELSIF error == "illegal_query_name" %]
+ [% title = "Illegal Search Name" %]
+ The name of your search cannot contain any of the following characters:
+ &lt;, &gt;, &amp;.
+
+ [% ELSIF error == "illegal_series_creation" %]
+ [% admindocslinks = {'groups.html' => 'Group security'} %]
+ [% docslinks = {'reporting.html' => 'Reporting'} %]
+ You are not authorized to create series.
+
+ [% ELSIF error == "illegal_series_edit" %]
+ [% admindocslinks = {'groups.html' => 'Group security'} %]
+ [% docslinks = {'reporting.html' => 'Reporting'} %]
+ You are not authorized to edit this series. To do this, you must either
+ be its creator, or an administrator.
+
+ [% ELSIF error == "illegal_time" %]
+ [% title = "Illegal Time" %]
+ '<tt>[% time FILTER html %]</tt>' is not a legal time.
+ [% IF format %]
+ Please use the format '<tt>[% format FILTER html %]</tt>'.
+ [% END %]
+
+ [% ELSIF error == "illegal_regexp" %]
+ [% title = "Illegal Regular Expression" %]
+ The regular expression you provided [% value FILTER html %] is not valid.
+ The error was: [% dberror FILTER html %].
+
+ [% ELSIF error == "insufficient_data_points" %]
+ [% docslinks = {'reporting.html' => 'Reporting'} %]
+ We don't have enough data points to make a graph (yet).
+
+ [% ELSIF error == "invalid_attach_id" %]
+ [% title = "Invalid Attachment ID" %]
+ The attachment id [% attach_id FILTER html %] is invalid.
+
+ [% ELSIF error == "bug_id_does_not_exist" %]
+ [% title = BLOCK %]Invalid [% terms.Bug %] ID[% END %]
+ [% terms.Bug %] #[% bug_id FILTER html %] does not exist.
+
+ [% ELSIF error == "improper_bug_id_field_value" %]
+ [% title = BLOCK %]
+ [% IF bug_id %]Invalid [% ELSE %]Missing [% END %] [% terms.Bug %] ID
+ [% END %]
+ [% IF bug_id %]
+ '[% bug_id FILTER html %]' is not a valid [% terms.bug %] number
+ [% IF Param("usebugaliases") %]
+ nor an alias to [% terms.abug %]
+ [% END %].
+ [% ELSE %]
+ [% IF field %]
+ The '[% field_descs.$field FILTER html %]' field
+ cannot be empty.
+ [% END %]
+ You must enter a valid [% terms.bug %] number!
+ [% END %]
+
+ [% ELSIF error == "invalid_changedsince" %]
+ [% title = "Invalid 'Changed Since'" %]
+ The 'changed since' value, '[% changedsince FILTER html %]', must be an
+ integer >= 0.
+
+ [% ELSIF error == "invalid_content_type" %]
+ [% title = "Invalid Content-Type" %]
+ The content type <em>[% contenttype FILTER html %]</em> is invalid.
+ Valid types must be of the form <em>foo/bar</em> where <em>foo</em>
+ is one of <em>[% constants.LEGAL_CONTENT_TYPES.join(', ') FILTER html %]</em>.
+
+ [% ELSIF error == "invalid_context" %]
+ [% title = "Invalid Context" %]
+ The context [% context FILTER html %] is invalid (must be a number,
+ "file" or "patch").
+
+ [% ELSIF error == "invalid_datasets" %]
+ [% title = "Invalid Datasets" %]
+ Invalid datasets <em>[% datasets FILTER html %]</em>. Only digits,
+ letters and colons are allowed.
+
+ [% ELSIF error == "invalid_format" %]
+ [% title = "Invalid Format" %]
+ The format "[% format FILTER html %]" is invalid (must be one of
+ [% FOREACH my_format = formats %]
+ "[% my_format FILTER html %]"
+ [% END %]
+ ).
+
+ [% ELSIF error == "invalid_group_ID" %]
+ [% title = "Invalid group ID" %]
+ The group you specified doesn't exist.
+
+ [% ELSIF error == "invalid_group_name" %]
+ [% title = "Invalid group name" %]
+ The group you specified, [% name FILTER html %], is not valid here.
+
+ [% ELSIF error == "invalid_maxrows" %]
+ [% title = "Invalid Max Rows" %]
+ The maximum number of rows, '[% maxrows FILTER html %]', must be
+ a positive integer.
+
+ [% ELSIF error == "invalid_parameter" %]
+ [% title = "Invalid Parameter" %]
+ The new value for [% name FILTER html %] is invalid: [% err FILTER html %].
+
+ [% ELSIF error == "invalid_product_name" %]
+ [% title = "Invalid Product Name" %]
+ The product name '[% product FILTER html %]' is invalid or does not exist.
+
+ [% ELSIF error == "invalid_regexp" %]
+ [% title = "Invalid regular expression" %]
+ The regular expression you entered is invalid.
+
+ [% ELSIF error == "invalid_user_group" %]
+ [% title = "Invalid User Group" %]
+ [% IF users.size > 1 %] Users [% ELSE %] User [% END %]
+ '[% users.join(', ') FILTER html %]'
+ [% IF users.size > 1 %] are [% ELSE %] is [% END %]
+ not able to edit the
+ [% IF product %]
+ '[% product FILTER html %]'
+ [% END %]
+ [%+ field_descs.product FILTER html %]
+ [% IF bug_id %]
+ for [% terms.bug %] '[% bug_id FILTER html %]'.
+ [% ELSIF new %]
+ and may not be included on a new [% terms.bug %].
+ [% ELSE %]
+ for at least one [% terms.bug %] being changed.
+ [% END %]
+
+ [% ELSIF error == "invalid_username" %]
+ [% title = "Invalid Username" %]
+ The name <tt>[% name FILTER html %]</tt> is not a valid username.
+ Either you misspelled it, or the person has not
+ registered for a [% terms.Bugzilla %] account.
+
+ [% ELSIF error == "invalid_username_or_password" %]
+ [% title = "Invalid Username Or Password" %]
+ The username or password you entered is not valid.
+ [%# People get two login attempts before being warned about
+ # being locked out.
+ #%]
+ [% IF remaining <= 2 %]
+ If you do not enter the correct password after
+ [%+ remaining FILTER html %] more attempt(s), you will be
+ locked out of this account for
+ [%+ constants.LOGIN_LOCKOUT_INTERVAL FILTER html %] minutes.
+ [% END %]
+
+ [% ELSIF error == "json_rpc_post_only" %]
+ For security reasons, you may only use JSON-RPC with the POST
+ HTTP method.
+
+ [% ELSIF error == "keyword_already_exists" %]
+ [% title = "Keyword Already Exists" %]
+ A keyword with the name [% name FILTER html %] already exists.
+
+ [% ELSIF error == "keyword_blank_description" %]
+ [% title = "Blank Keyword Description Not Allowed" %]
+ You must enter a non-blank description for the keyword.
+
+ [% ELSIF error == "keyword_blank_name" %]
+ [% title = "Blank Keyword Name Not Allowed" %]
+ You must enter a non-blank name for the keyword.
+
+ [% ELSIF error == "keyword_invalid_name" %]
+ [% title = "Invalid Keyword Name" %]
+ You may not use commas or whitespace in a keyword name.
+
+ [% ELSIF error == "local_file_too_large" %]
+ [% title = "Local File Too Large" %]
+ Local file uploads must not exceed
+ [% Param('maxlocalattachment') %] MB in size.
+
+ [% ELSIF error == "login_needed_for_password_change" %]
+ [% title = "Login Name Required" %]
+ You must enter a login name when requesting to change your password.
+
+ [% ELSIF error == "login_required_for_pronoun" %]
+ [% title = "Login Name Required" %]
+ You can't use %user% without being logged in, because %user% refers
+ to your login name, which we don't know.
+
+ [% ELSIF error == "login_required" %]
+ [%# Used for non-web-based LOGIN_REQUIRED situations. %]
+ You must log in before using this part of [% terms.Bugzilla %].
+
+ [% ELSIF error == "migrate_config_created" %]
+ The file <kbd>[% file FILTER html %]</kbd> contains configuration
+ variables that must be set before continuing with the migration.
+
+ [% ELSIF error == "migrate_from_invalid" %]
+ '[% from FILTER html %]' is not a valid type of [% terms.bug %]-tracker
+ to migrate from. See the contents of the <kbd>B[% %]ugzilla/Migrate/</kbd>
+ directory for a list of valid [% terms.bug %]-trackers.
+
+ [% ELSIF error == "milestone_already_exists" %]
+ [% title = "Milestone Already Exists" %]
+ [% admindocslinks = {'products.html' => 'Administering products',
+ 'milestones.html' => 'About Milestones'} %]
+ The milestone '[% name FILTER html %]' already exists for product '
+ [%- product FILTER html %]'.
+
+ [% ELSIF error == "milestone_blank_name" %]
+ [% title = "Blank Milestone Name Not Allowed" %]
+ You must enter a name for this milestone.
+
+ [% ELSIF error == "milestone_is_default" %]
+ [% title = "Default milestone not deletable" %]
+ [% admindocslinks = {'products.html' => 'Administering products',
+ 'milestones.html' => 'About Milestones'} %]
+ Sorry, but [% milestone.name FILTER html %] is the default milestone
+ for the '[% milestone.product.name FILTER html %]' product, and so
+ it cannot be deleted.
+
+ [% ELSIF error == "milestone_name_too_long" %]
+ [% title = "Milestone Name Is Too Long" %]
+ The name of a milestone is limited to [% constants.MAX_MILESTONE_SIZE FILTER html %]
+ characters. '[% name FILTER html %]' is too long ([% name.length %] characters).
+
+ [% ELSIF error == "milestone_required" %]
+ [% title = "Milestone Required" %]
+ You must select a target milestone for [% terms.bug %]
+ [%+ bug.id FILTER html %]
+ if you are going to accept it. Part of accepting
+ [%+ terms.abug %] is giving an estimate of when it will be fixed.
+
+ [% ELSIF error == "milestone_sortkey_invalid" %]
+ [% title = "Invalid Milestone Sortkey" %]
+ The sortkey '[% sortkey FILTER html %]' is not in the range
+ [%+ constants.MIN_SMALLINT FILTER html %] &le; sortkey &le;
+ [%+ constants.MAX_SMALLINT FILTER html %].
+
+ [% ELSIF error == "misarranged_dates" %]
+ [% title = "Misarranged Dates" %]
+ Your start date ([% datefrom FILTER html %]) is after
+ your end date ([% dateto FILTER html %]).
+
+ [% ELSIF error == "missing_attachment_description" %]
+ [% title = "Missing Attachment Description" %]
+ You must enter a description for the attachment.
+
+ [% ELSIF error == "missing_category" %]
+ [% title = "Missing Category" %]
+ You did not specify a category for this series.
+
+ [% ELSIF error == "missing_component" %]
+ [% title = "Missing Component" %]
+ [% admindocslinks = {'products.html' => 'Administering products',
+ 'components.html' => 'Creating a component'} %]
+ Sorry, the product <em>[% product.name FILTER html %]</em>
+ has to have at least one component in order for you to
+ enter [% terms.abug %] into it.<br>
+ [% IF user.in_group("editcomponents", product.id) %]
+ <a href="editcomponents.cgi?action=add&amp;product=[% product.name FILTER url_quote %]">Create
+ a new component</a>.
+ [% ELSE %]
+ Please contact [% Param("maintainer") %] and ask them
+ to add a component to this product.
+ [% END %]
+
+ [% ELSIF error == "missing_content_type" %]
+ [% title = "Missing Content-Type" %]
+ You asked [% terms.Bugzilla %] to auto-detect the content type, but
+ your browser did not specify a content type when uploading the file,
+ so you must enter a content type manually.
+
+ [% ELSIF error == "missing_content_type_method" %]
+ [% title = "Missing Content-Type Determination Method" %]
+ You must choose a method for determining the content type,
+ either <em>auto-detect</em>, <em>select from list</em>, or <em>enter
+ manually</em>.
+
+ [% ELSIF error == "missing_cookie" %]
+ [% title = "Missing Cookie" %]
+ Sorry, I seem to have lost the cookie that recorded
+ the results of your last search. I'm afraid you will have to start
+ again from the <a href="query.cgi">search page</a>.
+
+ [% ELSIF error == "missing_datasets" %]
+ [% title = "No Datasets Selected" %]
+ [% docslinks = {'reporting.html' => 'Reporting'} %]
+ You must specify one or more datasets to plot.
+
+ [% ELSIF error == "missing_frequency" %]
+ [% title = "Missing Frequency" %]
+ [% docslinks = {'reporting.html' => 'Reporting'} %]
+ You did not specify a valid frequency for this series.
+
+ [% ELSIF error == "missing_name" %]
+ [% title = "Missing Name" %]
+ [% docslinks = {'reporting.html' => 'Reporting'} %]
+ You did not specify a name for this series.
+
+ [% ELSIF error == "missing_query" %]
+ [% title = "Missing Search" %]
+ [% docslinks = {'query.html' => "Searching for $terms.bugs",
+ 'query.html#list' => "$terms.Bug lists"} %]
+ The search named <em>[% queryname FILTER html %]</em>
+ [% IF sharer_id && sharer_id != user.id %]
+ has not been made visible to you.
+ [% ELSE %]
+ does not exist.
+ [% END %]
+
+ [% ELSIF error == "missing_resolution" %]
+ [% title = "Resolution Required" %]
+ A valid resolution is required to mark [% terms.bugs %] as
+ [%+ status FILTER upper FILTER html %].
+
+ [% ELSIF error == "move_bugs_disabled" %]
+ [% title = BLOCK %][% terms.Bug %] Moving Disabled[% END %]
+ Sorry, [% terms.bug %] moving has been disabled. If you need
+ to move [% terms.abug %], please contact [% Param("maintainer") %].
+
+ [% ELSIF error == "missing_subcategory" %]
+ [% title = "Missing Subcategory" %]
+ You did not specify a subcategory for this series.
+
+ [% ELSIF error == "missing_version" %]
+ [% title = "Missing Version" %]
+ [% admindocslinks = {'versions.html' => 'Defining versions'} %]
+ Sorry, the product <em>[% product.name FILTER html %]</em>
+ has to have at least one version in order for you to
+ enter [% terms.abug %] into it.<br>
+ [% IF user.in_group("editcomponents", product.id) %]
+ <a href="editversions.cgi?action=add&amp;product=[% product.name FILTER url_quote %]">Create
+ a new version</a>.
+ [% ELSE %]
+ Please contact [% Param("maintainer") %] and ask them
+ to add a version to this product.
+ [% END %]
+
+ [% ELSIF error == "need_quip" %]
+ [% title = "Quip Required" %]
+ [% docslinks = {'quips.html' => 'About quips'} %]
+ Please enter a quip in the text field.
+
+ [% ELSIF error == "new_password_missing" %]
+ [% title = "New Password Missing" %]
+ You must enter a new password.
+
+ [% ELSIF error == "no_axes_defined" %]
+ [% title = "No Axes Defined" %]
+ [% docslinks = {'reporting.html' => 'Reporting'} %]
+ You didn't define any axes to plot.
+
+ [% ELSIF error == "no_bugs_chosen" %]
+ [% title = BLOCK %]No [% terms.Bugs %] Selected[% END %]
+ You apparently didn't choose any [% terms.bugs %]
+ [% IF action == "modify" %]
+ to modify.
+ [% ELSIF action == "view" %]
+ to view.
+ [% END %]
+
+ [% ELSIF error == "no_bug_ids" %]
+ [% title = BLOCK %]No [% terms.Bugs %] Selected[% END %]
+ You didn't choose any [% terms.bugs %] to
+ [% IF action == "add" %] add to [% ELSE %] remove from [% END %]
+ the [% tag FILTER html %] tag.
+
+ [% ELSIF error == "no_bugs_in_list" %]
+ [% title = "Delete Tag?" %]
+ This will remove all [% terms.bugs %] from the
+ <em>[% name FILTER html %]</em> tag. This will delete the tag completely. Click
+ <a href="buglist.cgi?cmdtype=dorem&amp;remaction=forget&amp;namedcmd=
+ [%- name FILTER url_quote %]&amp;token=
+ [%- issue_hash_token([query_id, name]) FILTER url_quote %]">here</a>
+ if you really want to delete it.
+
+ [% ELSIF error == "no_bugs_to_remove" %]
+ [% title = "No Tag Selected" %]
+ You didn't select a tag from which to remove [% terms.bugs %].
+
+ [% ELSIF error == "no_initial_bug_status" %]
+ [% title = "No Initial $terms.Bug Status" %]
+ No [% terms.bug %] status is available on [% terms.bug %] creation.
+ Please report the problem to [% Param("maintainer") %].
+
+ [% ELSIF error == "no_new_quips" %]
+ [% title = "No New Quips" %]
+ [% admindocslinks = {'quips.html' => 'Controlling quip usage'} %]
+ This site does not permit the addition of new quips.
+
+ [% ELSIF error == "no_page_specified" %]
+ [% title = "No Page Specified" %]
+ You did not specify the id of a page to display.
+
+ [% ELSIF error == "no_products" %]
+ [% title = "No Products" %]
+ [% admindocslinks = {'products.html' => 'Setting up a product',
+ 'components.html' => 'Adding components to products',
+ 'groups.html' => 'Groups security'} %]
+ Either no products have been defined to enter [% terms.bugs %] against or you have not
+ been given access to any.
+
+ [% ELSIF error == "no_valid_action" %]
+ [% title = "No valid action specified" %]
+ Cannot edit [% field_descs.$field FILTER html %]: no valid action was specified.
+
+ [% ELSIF error == "number_not_numeric" %]
+ [% title = "Numeric Value Required" %]
+ The value '[% num FILTER html %]' in the
+ <em>[% field_descs.$field FILTER html %]</em> field
+ is not a numeric value.
+
+ [% ELSIF error == "number_too_large" %]
+ [% title = "Number Too Large" %]
+ The value '[% num FILTER html %]' in the
+ <em>[% field_descs.$field FILTER html %]</em> field
+ is more than the maximum allowable value of '[% max_num FILTER html %]'.
+
+ [% ELSIF error == "number_too_small" %]
+ [% title = "Number Too Small" %]
+ The value '[% num FILTER html %]'
+ in the <em>[% field_descs.$field FILTER html %]</em> field
+ is less than the minimum allowable value of '[% min_num FILTER html %]'.
+
+ [% ELSIF error == "object_not_specified" %]
+ [% type = BLOCK %][% INCLUDE object_name class = class %][% END %]
+ [% title = BLOCK %][% type FILTER ucfirst FILTER html %] Not
+ Specified[% END %]
+ You must select/enter a [% type FILTER html %].
+
+ [% ELSIF error == "object_does_not_exist" %]
+ [% type = BLOCK %][% INCLUDE object_name class = class %][% END %]
+ [% title = BLOCK %]Invalid [% type FILTER ucfirst FILTER html %][% END %]
+ There is no [% type FILTER html %]
+ [% IF id.defined %]
+ with the id '[% id FILTER html %]'
+ [% ELSE %]
+ named '[% name FILTER html %]'
+ [% END %]
+ [% IF product.defined %]
+ in the '[% product.name FILTER html %]' product
+ [% END %].
+ [% IF class == "Bugzilla::User" %]
+ Either you mis-typed the name or that user has not yet registered
+ for a [% terms.Bugzilla %] account.
+ [% END %]
+
+ [% ELSIF error == "old_password_incorrect" %]
+ [% title = "Incorrect Old Password" %]
+ You did not enter your old password correctly.
+
+ [% ELSIF error == "old_password_required" %]
+ [% title = "Old Password Required" %]
+ You must enter your old password to change your email address.
+
+ [% ELSIF error == "password_change_requests_not_allowed" %]
+ [% title = "Password Change Requests Not Allowed" %]
+ Please go to: http://identity.mageia.org/ to change or recover your password.
+
+ [% ELSIF error == "passwords_dont_match" %]
+ [% title = "Passwords Don't Match" %]
+ The two passwords you entered did not match.
+
+ [% ELSIF error == "password_too_short" %]
+ [% title = "Password Too Short" %]
+ The password must be at least
+ [%+ constants.USER_PASSWORD_MIN_LENGTH FILTER html %] characters long.
+
+ [% ELSIF error == "patch_too_large" %]
+ [% title = "File Too Large" %]
+ The file you are trying to attach is [% filesize FILTER html %]
+ kilobytes (KB) in size.
+ Patches cannot be more than [% Param('maxattachmentsize') %] KB in size.
+ Try splitting your patch into several pieces.
+
+ [% ELSIF error == "product_access_denied" %]
+ Either the product
+ [%+ IF id.defined %]
+ with the id [% id FILTER html %]
+ [% ELSE %]
+ '[% name FILTER html %]'
+ [% END %]
+ does not exist or you don't have access to it.
+
+ [% ELSIF error == "product_doesnt_exist" %]
+ [% title = "Specified Product Does Not Exist" %]
+ The product '[% product FILTER html %]' does not exist.
+
+ [% ELSIF error == "product_illegal_group" %]
+ [% title = "Illegal Group" %]
+ [% group.name FILTER html %] is not an active [% terms.bug %] group
+ and so you cannot edit group controls for it.
+
+ [% ELSIF error == "product_illegal_votes" %]
+ [% title = "Votes Must Be Non-negative" %]
+ [% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %]
+ '[% votes FILTER html %]' is an invalid value for the
+ <em>
+ [% IF field == "votesperuser" %]
+ Votes Per User
+ [% ELSIF field == "maxvotesperbug" %]
+ Maximum Votes Per [% terms.Bug %]
+ [% ELSIF field == "votestoconfirm" %]
+ Votes To Confirm
+ [% END %]
+ </em> field, which should contain a non-negative number.
+
+ [% ELSIF error == "product_name_already_in_use" %]
+ [% title = "Product name already exists" %]
+ [% admindocslinks = {'products.html' => 'Administering products'} %]
+ The product name '[% product FILTER html %]' already exists.
+
+ [% ELSIF error == "product_name_diff_in_case" %]
+ [% title = "Product name differs only in case" %]
+ [% admindocslinks = {'products.html' => 'Administering products'} %]
+ The product name '[% product FILTER html %]' differs from existing
+ product '[% existing_product FILTER html %]' only in case.
+
+ [% ELSIF error == "product_name_too_long" %]
+ [% title = "Product name too long" %]
+ The name of a product is limited to [% constants.MAX_PRODUCT_SIZE FILTER html %]
+ characters. '[% name FILTER html %]' is too long ([% name.length %] characters).
+
+ [% ELSIF error == "product_must_define_defaultmilestone" %]
+ [% title = "Must define new default milestone" %]
+ [% admindocslinks = {'products.html' => 'Administering products',
+ 'milestones.html' => 'About Milestones'} %]
+ You must <a href="editmilestones.cgi?action=add&amp;product=[% product FILTER url_quote %]">
+ create the milestone '[% milestone FILTER html %]'</a> before
+ it can be made the default milestone for product '[% product FILTER html %]'.
+
+ [% ELSIF error == "product_admin_denied" %]
+ [% title = "Product Access Denied" %]
+ You are not allowed to edit properties of product '[% product FILTER html %]'.
+
+ [% ELSIF error == "product_blank_name" %]
+ [% title = "Blank Product Name Not Allowed" %]
+ [% admindocslinks = {'products.html' => 'Administering products'} %]
+ You must enter a name for the product.
+
+ [% ELSIF error == "product_disabled" %]
+ [% title = BLOCK %]Product closed for [% terms.Bug %] Entry[% END %]
+ [% admindocslinks = {'products.html' => 'Administering products'} %]
+ Sorry, entering [% terms.abug %] into the
+ product <em>[% product.name FILTER html %]</em> has been disabled.
+
+ [% ELSIF error == "product_edit_denied" %]
+ [% title = "Product Edit Access Denied" %]
+ [% admindocslinks = {'products.html' => 'Administering products',
+ 'groups.html' => 'Group security'} %]
+ You are not permitted to edit [% terms.bugs %] in product
+ [%+ product FILTER html %].
+
+ [% ELSIF error == "product_has_bugs" %]
+ [% title = BLOCK %]Product has [% terms.Bugs %][% END %]
+ [% admindocslinks = {'products.html' => 'Administering products'} %]
+ There are [% nb FILTER html %] [%+ terms.bugs %] entered for this product!
+ You must move those [% terms.bugs %] to another product before you
+ can delete this one.
+
+ [% ELSIF error == "product_must_have_description" %]
+ [% title = "Product needs Description" %]
+ [% admindocslinks = {'products.html' => 'Administering products'} %]
+ You must enter a description for this product.
+
+ [% ELSIF error == "product_must_have_version" %]
+ [% title = "Product needs Version" %]
+ [% admindocslinks = {'products.html' => 'Administering products',
+ 'versions.html' => 'Administering versions'} %]
+ You must enter a valid version to create a new product.
+
+ [% ELSIF error == "product_not_specified" %]
+ [% title = "No Product Specified" %]
+ [% admindocslinks = {'products.html' => 'Administering products',
+ 'components.html' => 'Administering components',
+ 'milestones.html' => 'Administering milestones',
+ 'versions.html' => 'Administering versions'} %]
+ No product specified when trying to edit components, milestones, versions
+ or product.
+
+ [% ELSIF error == "query_name_exists" %]
+ [% title = "Search Name Already In Use" %]
+ The name <em>[% name FILTER html %]</em> is already used by another
+ saved search. You first have to
+ <a href="buglist.cgi?cmdtype=dorem&amp;remaction=forget&amp;namedcmd=
+ [%- name FILTER url_quote %]&amp;token=
+ [% issue_hash_token([query_id, name]) FILTER url_quote %]">delete</a>
+ it if you really want to use this name.
+
+ [% ELSIF error == "query_name_missing" %]
+ [% title = "No Search Name Specified" %]
+ [% docslinks = {'query.html#list' => "$terms.Bug lists"} %]
+ You must enter a name for your search.
+
+ [% ELSIF error == "query_name_too_long" %]
+ [% title = "Query Name Too Long" %]
+ The name of the query must be less than [% constants.MAX_LEN_QUERY_NAME FILTER html %]
+ characters long.
+
+ [% ELSIF error == "quicksearch_unknown_field" %]
+ [% title = "QuickSearch Error" %]
+ There is a problem with your search:
+ [% FOREACH field = unknown %]
+ <p><code>[% field FILTER html %]</code> is not a valid field name.</p>
+ [% END %]
+ [% FOREACH field = ambiguous.keys %]
+ <p><code>[% field FILTER html %]</code> matches more than one field:
+ [%+ ambiguous.${field}.join(', ') FILTER html %]</p>
+ [% END %]
+
+ [% IF unknown.size %]
+ <p>The legal field names are
+ <a href="page.cgi?id=quicksearch.html#fields">listed here</a>.</p>
+ [% END %]
+
+ [% ELSIF error == "reassign_to_empty" %]
+ [% title = "Illegal Reassignment" %]
+ To reassign [% terms.abug %], you must provide an address for
+ the new assignee.
+
+ [% ELSIF error == "require_component" %]
+ [% title = "Component Needed" %]
+ To file this [% terms.bug %], you must first choose a component.
+ If necessary, just guess.
+
+ [% ELSIF error == "require_new_password" %]
+ [% title = "New Password Needed" %]
+ You cannot change your password without choosing a new one.
+
+ [% ELSIF error == "require_summary" %]
+ [% title = "Summary Needed" %]
+ You must enter a summary for this [% terms.bug %].
+
+ [% ELSIF error == "resolution_cant_clear" %]
+ [% terms.Bug %] [%+ bug_id FILTER bug_link(bug_id) FILTER none %] is
+ closed, so you cannot clear its resolution.
+
+ [% ELSIF error == "resolution_not_allowed" %]
+ [% title = "Resolution Not Allowed" %]
+ You cannot set a resolution for open [% terms.bugs %].
+
+ [% ELSIF error == "saved_search_used_by_whines" %]
+ [% title = "Saved Search In Use" %]
+ [% docslinks = {'whining.html' => 'About Whining'} %]
+ The saved search <em>[% search_name FILTER html %]</em> is being used
+ by <a href="editwhines.cgi">Whining events</a> with the following subjects:
+ [%+ subjects FILTER html %]
+
+ [% ELSIF error == "search_content_without_matches" %]
+ [% title = "Illegal Search" %]
+ The "content" field can only be used with "matches" search
+ and the "matches" search can only be used with the "content"
+ field.
+
+ [% ELSIF error == "series_already_exists" %]
+ [% title = "Series Already Exists" %]
+ [% docslinks = {'reporting.html' => 'Reporting'} %]
+ A series named <em>[% series.category FILTER html %] /
+ [%+ series.subcategory FILTER html %] /
+ [%+ series.name FILTER html %]</em>
+ already exists.
+
+ [% ELSIF error == "sidebar_supports_mozilla_only" %]
+ Sorry - sidebar.cgi currently only supports Mozilla based web browsers.
+ <a href="http://www.mozilla.org">Upgrade today</a>. :-)
+
+ [% ELSIF error == "still_unresolved_bugs" %]
+ [% IF dependency_count == 1 %]
+ [% terms.Bug %]# <a href="show_bug.cgi?id=[% dependencies.0.bug_id FILTER none %]">[% dependencies.0.bug_id FILTER none %]</a>
+ still has [% dependencies.0.dependencies FILTER html %] unresolved
+ [% IF dependencies.0.dependencies == 1 %]
+ dependency
+ [% ELSE %]
+ dependencies
+ [% END %]. Show
+ <a href="showdependencytree.cgi?id=[% dependencies.0.bug_id FILTER none %]&amp;hide_resolved=1">Dependency
+ Tree</a>.
+ [% ELSE %]
+ There are [% dependency_count FILTER none %] open [% terms.bugs %] which
+ have unresolved dependencies.
+ <br>
+ [% FOREACH bug = dependencies %]
+ [% terms.Bug %]# <a href="show_bug.cgi?id=[% bug.bug_id FILTER none %]">[% bug.bug_id FILTER none %]</a>
+ has [% bug.dependencies FILTER html %] open
+ [% IF bug.dependencies == 1 %]
+ dependency.
+ [% ELSE %]
+ dependencies.
+ [% END %]
+ (<a href="showdependencytree.cgi?id=[% bug.bug_id FILTER none %]&amp;hide_resolved=1">Dependency
+ Tree</a>)<br>
+ [% END %]
+ [% END %]
+
+ [% ELSIF error == "sudo_invalid_cookie" %]
+ [% title = "Invalid Sudo Cookie" %]
+ Your sudo cookie is invalid. Either it expired or you didn't start
+ a sudo session correctly. Refresh the page or load another page
+ to continue what you are doing as yourself.
+
+ [% ELSIF error == "sudo_illegal_action" %]
+ [% title = "Impersonation Not Authorized" %]
+ [% IF NOT sudoer.in_group("bz_sudoers") %]
+ You are not allowed to impersonate users.
+ [% ELSIF target_user AND target_user.in_group("bz_sudo_protect") %]
+ You are not allowed to impersonate [% target_user.identity FILTER html %].
+ [% ELSE %]
+ The user you tried to impersonate doesn't exist.
+ [% END %]
+
+ [% ELSIF error == "sudo_in_progress" %]
+ [% title = "Session In Progress" %]
+ A sudo session (impersonating [% target FILTER html %]) is in progress.
+ End that session (using the link in the footer) before starting a new one.
+
+ [% ELSIF error == "sudo_password_required" %]
+ [% title = "Password Required" %]
+ Your [% terms.Bugzilla %] password is required to begin a sudo
+ session. Please <a href="relogin.cgi?action=prepare-sudo&target_login=
+ [%- target_login FILTER html %]&reason=
+ [%- reason FILTER html %]">go back</a> and enter your password.
+
+ [% ELSIF error == "sudo_preparation_required" %]
+ [% title = "Preparation Required" %]
+ You may not start a sudo session directly. Please
+ <a href="relogin.cgi?action=prepare-sudo&target_login=
+ [%- target_login FILTER html %]&reason=
+ [%- reason FILTER html %]">start your session normally</a>.
+
+ [% ELSIF error == "sudo_protected" %]
+ [% title = "User Protected" %]
+ The user [% login FILTER html %] may not be impersonated by sudoers.
+
+ [% ELSIF error == "too_many_votes_for_bug" %]
+ [% title = "Illegal Vote" %]
+ [% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %]
+ You may only use at most [% max FILTER html %] votes for a single
+ [%+ terms.bug %] in the
+ <tt>[% product FILTER html %]</tt> product, but you are trying to
+ use [% votes FILTER html %].
+
+ [% ELSIF error == "too_many_votes_for_product" %]
+ [% title = "Illegal Vote" %]
+ [% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %]
+ You tried to use [% votes FILTER html %] votes in the
+ <tt>[% product FILTER html %]</tt> product, which exceeds the maximum of
+ [%+ max FILTER html %] votes for this product.
+
+ [% ELSIF error == "token_does_not_exist" %]
+ [% title = "Token Does Not Exist" %]
+ The token you submitted does not exist, has expired, or has
+ been canceled.
+
+ [% ELSIF error == "too_soon_for_new_token" %]
+ [% title = "Too Soon For New Token" %]
+ You have requested
+ [% IF type == "password" %]
+ a password
+ [% ELSIF type == "account" %]
+ an account
+ [% END %]
+ token too recently to request another. Please wait a while and try again.
+
+ [% ELSIF error == "unknown_keyword" %]
+ [% title = "Unknown Keyword" %]
+ <code>[% keyword FILTER html %]</code> is not a known keyword.
+ The legal keyword names are <a href="describekeywords.cgi">listed here</a>.
+
+ [% ELSIF error == "unknown_tab" %]
+ [% title = "Unknown Tab" %]
+ <code>[% current_tab_name FILTER html %]</code> is not a legal tab name.
+
+ [% ELSIF error == "version_already_exists" %]
+ [% title = "Version Already Exists" %]
+ [% admindocslinks = {'versions.html' => 'Administering versions'} %]
+ The version '[% name FILTER html %]' already exists for product '
+ [%- product FILTER html %]'.
+
+ [% ELSIF error == "version_blank_name" %]
+ [% title = "Blank Version Name Not Allowed" %]
+ You must enter a name for this version.
+
+ [% ELSIF error == "version_has_bugs" %]
+ [% title = BLOCK %]Version has [% terms.Bugs %][% END %]
+ There are [% nb FILTER html %] [%+ terms.bugs %] associated with this
+ version! You must reassign those [% terms.bugs %] to another version
+ before you can delete this one.
+
+ [% ELSIF error == "users_deletion_disabled" %]
+ [% title = "Deletion not activated" %]
+ [% admindocslinks = {'useradmin.html' => 'User administration'} %]
+ Sorry, the deletion of user accounts is not allowed.
+
+ [% ELSIF error == "user_has_responsibility" %]
+ [% title = "Can't Delete User Account" %]
+ [% admindocslinks = {'useradmin.html' => 'User administration'} %]
+ The user you want to delete is set up as the default [% terms.bug %]
+ assignee
+ [% IF Param('useqacontact') %]
+ or QA contact
+ [% END %]
+ for at least one component.
+ For this reason, you cannot delete the account at this time.
+
+ [% ELSIF error == "user_access_by_id_denied" %]
+ [% title = "User Access By Id Denied" %]
+ Logged-out users cannot use the "ids" argument to this function
+ to access any user information.
+
+ [% ELSIF error == "user_access_by_match_denied" %]
+ [% title = "User-Matching Denied" %]
+ Logged-out users cannot use the "match" argument to this function
+ to access any user information.
+
+ [% ELSIF error == "user_login_required" %]
+ [% title = "Login Name Required" %]
+ [% admindocslinks = {'useradmin.html' => 'User administration'} %]
+ You must enter a login name for the new user.
+
+ [% ELSIF error == "user_match_failed" %]
+ [% title = "Match Failed" %]
+ <tt>[% name FILTER html %]</tt> does not exist or you are not allowed
+ to see that user.
+
+ [% ELSIF error == "user_match_too_many" %]
+ [% title = "No Conclusive Match" %]
+ [% terms.Bugzilla %] cannot make a conclusive match for one or more
+ of the names and/or email addresses you entered for
+ the [% fields.join(', ') FILTER html %] field(s).
+
+ [% ELSIF error == "user_not_insider" %]
+ [% title = "User Not In Insidergroup" %]
+ Sorry, but you are not allowed to (un)mark comments or attachments
+ as private.
+
+ [% ELSIF error == "votes_must_be_nonnegative" %]
+ [% title = "Votes Must Be Non-negative" %]
+ [% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %]
+ Only use non-negative numbers for your [% terms.bug %] votes.
+
+ [% ELSIF error == "wrong_token_for_cancelling_email_change" %]
+ [% title = "Wrong Token" %]
+ That token cannot be used to cancel an email address change.
+
+ [% ELSIF error == "wrong_token_for_changing_passwd" %]
+ [% title = "Wrong Token" %]
+ That token cannot be used to change your password.
+
+ [% ELSIF error == "wrong_token_for_confirming_email_change" %]
+ [% title = "Wrong Token" %]
+ That token cannot be used to change your email address.
+
+ [% ELSIF error == "wrong_token_for_creating_account" %]
+ [% title = "Wrong Token" %]
+ That token cannot be used to create a user account.
+
+ [% ELSIF error == "xmlrpc_invalid_value" %]
+ "[% value FILTER html %]" is not a valid value for a
+ &lt;[% type FILTER html %]&gt; field. (See the XML-RPC specification
+ for details.)
+
+ [% ELSIF error == "zero_length_file" %]
+ [% title = "File Is Empty" %]
+ The file you are trying to attach is empty, does not exist, or you don't
+ have permission to read it.
+
+ [% ELSIF error == "illegal_user_id" %]
+ [% title = "Illegal User ID" %]
+ User ID '[% userid FILTER html %]' is not valid integer.
+
+ [% ELSE %]
+
+ [%# Try to find hooked error messages %]
+ [% error_message = Hook.process("errors") %]
+
+ [% IF not error_message %]
+ [% title = "Error string not found" %]
+ The user error string <code>[% error FILTER html %]</code> was not found.
+ Please send email to [% Param("maintainer") %] describing the steps taken
+ to obtain this message.
+ [% ELSE %]
+ [% error_message FILTER none %]
+ [% END %]
+ [% END %]
+[% END %]
+
+[%# We only want HTML error messages for ERROR_MODE_WEBPAGE %]
+[% USE Bugzilla %]
+[% IF Bugzilla.error_mode != constants.ERROR_MODE_WEBPAGE %]
+ [% IF Bugzilla.usage_mode == constants.USAGE_MODE_BROWSER %]
+ [% error_message FILTER none %]
+ [% ELSE %]
+ [% error_message FILTER txt %]
+ [% END %]
+ [% RETURN %]
+[% END %]
+
+[% UNLESS header_done %]
+ [% PROCESS global/header.html.tmpl %]
+[% END %]
+
+[% PROCESS global/docslinks.html.tmpl
+ docslinks = docslinks
+ admindocslinks = admindocslinks
+%]
+
+<table cellpadding="20">
+ <tr>
+ <td id="error_msg" class="throw_error">
+ [% error_message FILTER none %]
+ </td>
+ </tr>
+</table>
+
+<p>
+ Please press <b>Back</b> and try again.
+</p>
+
+[%# If a saved search fails, people want the ability to edit or delete it.
+ # This is the best way of getting information about that possible saved
+ # search from any error call location. %]
+
+[% namedcmd = Bugzilla.cgi.param("namedcmd") %]
+[% sharer_id = Bugzilla.cgi.param("sharer_id") %]
+[% IF namedcmd AND error != "missing_query"
+ AND error != "saved_search_used_by_whines"
+ AND !sharer_id %]
+ <p>
+ Alternatively, you can
+ <a href="buglist.cgi?cmdtype=dorem&amp;remaction=forget&amp;namedcmd=
+ [% namedcmd FILTER url_quote %]">forget</a>
+
+ [% FOREACH q = Bugzilla.user.queries %]
+ [% IF q.name == namedcmd %]
+ or <a href="query.cgi?[% q.url FILTER html %]">edit</a>
+ [% END %]
+ [% END %]
+
+ the saved search '[% namedcmd FILTER html %]'.
+ </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[% BLOCK object_name %]
+ [% IF class == "Bugzilla::Attachment" %]
+ attachment
+ [% ELSIF class == "Bugzilla::User" %]
+ user
+ [% ELSIF class == "Bugzilla::Component" %]
+ component
+ [% ELSIF class == "Bugzilla::Version" %]
+ version
+ [% ELSIF class == "Bugzilla::Milestone" %]
+ milestone
+ [% ELSIF class == "Bugzilla::Status" %]
+ status
+ [% ELSIF class == "Bugzilla::Flag" %]
+ flag
+ [% ELSIF class == "Bugzilla::FlagType" %]
+ flagtype
+ [% ELSIF class == "Bugzilla::Field" %]
+ field
+ [% ELSIF class == "Bugzilla::Group" %]
+ group
+ [% ELSIF class == "Bugzilla::Product" %]
+ product
+ [% ELSIF class == "Bugzilla::Search::Saved" %]
+ saved search
+ [% ELSIF ( matches = class.match('^Bugzilla::Field::Choice::(.+)') ) %]
+ [% SET field_name = matches.0 %]
+ [% field_descs.$field_name FILTER html %]
+ [% END %]
+[% END %]
diff --git a/template/en/default/global/user.html.tmpl b/template/en/default/global/user.html.tmpl
new file mode 100644
index 0000000..df902b4
--- /dev/null
+++ b/template/en/default/global/user.html.tmpl
@@ -0,0 +1,39 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Daniel Brooks.
+ # Portions created by the Initial Developer are Copyright (C) 2007
+ # the Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Daniel Brooks <db48x@db48x.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # who: A Bugzilla::User object that we are going to represent.
+ #%]
+
+<span class="vcard">
+ [% FILTER collapse %]
+ [% IF user.id %]
+ <a class="email" href="mailto:[% who.email FILTER html %]"
+ title="[% who.identity FILTER html %]">
+ [%- END -%]
+ [% IF who.name %]
+ <span class="fn">[% who.name FILTER html %]</span>
+ [% ELSE %]
+ [% who.login FILTER email FILTER html %]
+ [% END %]
+ [% '</a>' IF user.id %]
+ [% END %]
+</span>
diff --git a/template/en/default/global/userselect.html.tmpl b/template/en/default/global/userselect.html.tmpl
new file mode 100644
index 0000000..35075ef
--- /dev/null
+++ b/template/en/default/global/userselect.html.tmpl
@@ -0,0 +1,83 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Byron Jones <bugzilla@glob.com.au>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # name: mandatory; field name
+ # id: optional; field id
+ # value: optional; default field value/selection
+ # onchange: optional; onchange attribute value
+ # disabled: optional; if true, the field is disabled
+ # accesskey: optional, input only; accesskey attribute value
+ # size: optional, input only; size attribute value
+ # emptyok: optional, select only; if true, prepend menu option to start of select
+ # multiple: optional, do multiselect box, value is size (height) of box
+ # custom_userlist: optional, specify a limited list of users to use
+ #%]
+
+[% IF Param("usemenuforusers") %]
+<select name="[% name FILTER html %]"
+ [% IF id %] id="[% id FILTER html %]" [% END %]
+ [% IF onchange %] onchange="[% onchange FILTER html %]" [% END %]
+ [% IF disabled %] disabled="[% disabled FILTER html %]" [% END %]
+ [% IF accesskey %] accesskey="[% accesskey FILTER html %]" [% END %]
+ [% IF multiple %] multiple="multiple" size="[% multiple FILTER html %]" [% END %]
+>
+ [% IF emptyok %]
+ <option value=""></option>
+ [% END %]
+
+ [% UNLESS custom_userlist %]
+ [% custom_userlist = user.get_userlist %]
+ [% END %]
+
+ [% SET selected = {} %]
+ [% IF value.defined %]
+ [% FOREACH selected_value IN value.split(', ') %]
+ [% SET selected.$selected_value = 1 %]
+ [% END %]
+ [% END %]
+
+ [% FOREACH tmpuser = custom_userlist %]
+ [% IF tmpuser.visible OR selected.${tmpuser.login} == 1 %]
+ <option value="[% tmpuser.login FILTER html %]"
+ [% IF selected.${tmpuser.login} == 1 %]
+ selected="selected"
+ [%# A user account appears only once. Remove it from the list, so that
+ # we know if there are some selected accounts which have not been listed. %]
+ [% selected.delete(tmpuser.login) %]
+ [% END %]
+ >[% tmpuser.identity FILTER html %]</option>
+ [% END %]
+ [% END %]
+
+ [%# If the list is not empty, this means some accounts have not been mentioned yet. %]
+ [% FOREACH selected_user = selected.keys %]
+ <option value="[% selected_user FILTER html %]" selected="selected">[% selected_user FILTER html %]</option>
+ [% END %]
+</select>
+[% ELSE %]
+<input
+ name="[% name FILTER html %]"
+ value="[% value FILTER html %]"
+ [% IF onchange %] onchange="[% onchange FILTER html %]" [% END %]
+ [% IF disabled %] disabled="[% disabled FILTER html %]" [% END %]
+ [% IF accesskey %] accesskey="[% accesskey FILTER html %]" [% END %]
+ [% IF size %] size="[% size FILTER html %]" [% END %]
+ [% IF id %] id="[% id FILTER html %]" [% END %]
+>
+[% END %]
+
+
diff --git a/template/en/default/global/variables.none.tmpl b/template/en/default/global/variables.none.tmpl
new file mode 100644
index 0000000..dd7281e
--- /dev/null
+++ b/template/en/default/global/variables.none.tmpl
@@ -0,0 +1,42 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s):
+ #%]
+
+[%# This is a list of terms that may be changed to "brand" the Bugzilla
+ # instance (for example, referring to "bugs" as "issues".) When used, these
+ # strings are used in several different types of content, and are not
+ # protected with Template-Toolkit FILTERs. Consequently, no special
+ # characters are allowed.
+ #
+ # Remember to PROCESS rather than INCLUDE this template.
+ #%]
+
+[% terms = {
+ "bug" => "bug",
+ "Bug" => "Bug",
+ "abug" => "a bug",
+ "Abug" => "A bug",
+ "aBug" => "a Bug",
+ "ABug" => "A Bug",
+ "bugs" => "bugs",
+ "Bugs" => "Bugs",
+ "zeroSearchResults" => "Zarro Boogs found",
+ "Bugzilla" => "Bugzilla"
+ }
+%]
diff --git a/template/en/default/index.html.tmpl b/template/en/default/index.html.tmpl
new file mode 100644
index 0000000..a971b59
--- /dev/null
+++ b/template/en/default/index.html.tmpl
@@ -0,0 +1,178 @@
+[%# -*- mode: html -*- %]
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Terry Weissman <terry@mozilla.org>
+ # Jacob Steenhagen <jake@bugzilla.org>
+ # Vitaly Harisov <vitaly@rathedg.com>
+ # Guy Pyrzak <guy.pyrzak@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # release: a hash containing data about new releases, if any.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+
+[% PROCESS global/header.html.tmpl
+ title = "$terms.Bugzilla Main Page"
+ header = "Main Page"
+ header_addl_info = "version $constants.BUGZILLA_VERSION"
+ style_urls = [ 'skins/standard/index.css' ]
+%]
+
+
+<script type="text/javascript">
+<!--
+function onLoadActions() {
+ quicksearchHelpText('quicksearch_main', 'show');
+ if( window.external.AddSearchProvider ){
+ YAHOO.util.Dom.removeClass('quicksearch_plugin', 'bz_default_hidden');
+ }
+ document.getElementById('quicksearch_top').focus();
+}
+function addSidebar() {
+ var sidebarname=window.location.host;
+ if (!/bug/i.test(sidebarname))
+ sidebarname="[% terms.Bugzilla %] "+sidebarname;
+ window.sidebar.addPanel (sidebarname, "[% urlbase FILTER html %]sidebar.cgi", "");
+}
+var quicksearch_message = "Enter [% terms.abug %] # or some search terms";
+
+function checkQuicksearch( form ) {
+ if (form.quicksearch.value == '' || form.quicksearch.value == quicksearch_message ) {
+ alert('Please enter one or more search terms first.');
+ return false;
+ }
+ return true;
+}
+
+function quicksearchHelpText(el_id, action){
+ var el = document.getElementById(el_id);
+ if ( action == "show") {
+ if( el.value == "" ) {
+ el.value = quicksearch_message
+ YAHOO.util.Dom.addClass(el, "quicksearch_help_text");
+ }
+ } else {
+ if( el.value == quicksearch_message ) {
+ el.value = "";
+ YAHOO.util.Dom.removeClass(el, "quicksearch_help_text");
+ }
+ }
+}
+YAHOO.util.Event.onDOMReady(onLoadActions);
+//-->
+</script>
+
+[% IF release %]
+ <div id="new_release">
+ [% IF release.data %]
+ [% IF release.deprecated %]
+ <p>[% terms.Bugzilla %] [%+ release.deprecated FILTER html %] is no longer
+ supported. You are highly encouraged to upgrade in order to keep your
+ system secure.</p>
+ [% END %]
+
+ <p>A new [% terms.Bugzilla %] version ([% release.data.latest_ver FILTER html %])
+ is available at
+ <a href="[% release.data.url FILTER html %]">[% release.data.url FILTER html %]</a>.<br>
+ Release date: [% release.data.date FILTER html %]</p>
+
+ <p class="notice">This message is only shown to logged in users with admin privs.
+ You can configure this notification from the
+ <a href="editparams.cgi?section=general#upgrade_notification">Parameters</a> page.</p>
+ [% ELSIF release.error == "cannot_download" %]
+ <p>The local XML file '[% release.xml_file FILTER html %]' cannot be created.
+ Please make sure the web server can write in this directory and that you can access
+ the web. If you are behind a proxy, set the
+ <a href="editparams.cgi?section=advanced#proxy_url">proxy_url</a> parameter correctly.</p>
+ [% ELSIF release.error == "no_update" %]
+ <p>The local XML file '[% release.xml_file FILTER html %]' cannot be updated.
+ Please make sure the web server can edit this file.</p>
+ [% ELSIF release.error == "no_access" %]
+ <p>The local XML file '[% release.xml_file FILTER html %]' cannot be read.
+ Please make sure this file has the correct rights set on it.</p>
+ [% ELSIF release.error == "corrupted" %]
+ <p>The local XML file '[% release.xml_file FILTER html %]' has an invalid XML format.
+ Please delete it and try accessing this page again.</p>
+ [% ELSIF release.error == "unknown_parameter" %]
+ <p>'[% Param("upgrade_notification") FILTER html %]' is not a valid notification
+ parameter. Please check this parameter in the
+ <a href="editparams.cgi?section=general#upgrade_notification">Parameters</a> page.</p>
+ [% END %]
+ </div>
+[% END %]
+
+<div id="page-index">
+ <table>
+ <tr>
+ <td>
+ <h1 id="welcome"> Welcome to [% terms.Bugzilla %]</h1>
+ <div class="intro">[% Hook.process('intro') %]</div>
+ <a id="enter_bug" class="bz_common_actions"
+ href="enter_bug.cgi"><span>File [% terms.aBug %]</span></a>
+
+ <a id="query" class="bz_common_actions"
+ href="query.cgi"><span>Search</span></a>
+
+ <a id="account" class="bz_common_actions"
+ [% IF user.id %]
+ href="userprefs.cgi"><span>User Preferences</span></a>
+ [% ELSE %]
+ href="http://identity.mageia.org/register"><span>Open a New Account</span></a>
+ [% END %]
+
+ <form id="quicksearchForm" name="quicksearchForm" action="buglist.cgi"
+ onsubmit="return checkQuicksearch(this);">
+ <div>
+ <input id="quicksearch_main" type="text" name="quicksearch"
+ onfocus="quicksearchHelpText(this.id, 'hide');"
+ onblur="quicksearchHelpText(this.id, 'show');"
+ >
+ <input id="find" type="submit" value="Quick Search">
+ <ul class="additional_links" id="quicksearch_links">
+ <li>
+ <a href="page.cgi?id=quicksearch.html">Quick Search help</a>
+ </li>
+ <li class="bz_default_hidden" id="quicksearch_plugin">
+ |
+ <a href="javascript:window.external.AddSearchProvider('[% urlbase FILTER html %]search_plugin.cgi')">
+ Install the Quick Search plugin
+ </a>
+ </li>
+ </ul>
+ <ul class="additional_links">
+ <li>
+ <a href="[% docs_urlbase FILTER html %]using.html">
+ [%- terms.Bugzilla %] User's Guide</a>
+ </li>
+ <li>
+ |
+ <a href="page.cgi?id=release-notes.html">Release Notes</a>
+ </li>
+ </ul>
+ </div>
+ </form>
+ <div class="outro">[% Hook.process('outro') %]</div>
+ </td>
+ </tr>
+ </table>
+</div>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/index.html.tmpl~ b/template/en/default/index.html.tmpl~
new file mode 100644
index 0000000..41a46f4
--- /dev/null
+++ b/template/en/default/index.html.tmpl~
@@ -0,0 +1,182 @@
+[%# -*- mode: html -*- %]
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Terry Weissman <terry@mozilla.org>
+ # Jacob Steenhagen <jake@bugzilla.org>
+ # Vitaly Harisov <vitaly@rathedg.com>
+ # Guy Pyrzak <guy.pyrzak@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # release: a hash containing data about new releases, if any.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+
+[% PROCESS global/header.html.tmpl
+ title = "$terms.Bugzilla Main Page"
+ header = "Main Page"
+ header_addl_info = "version $constants.BUGZILLA_VERSION"
+ style_urls = [ 'skins/standard/index.css' ]
+%]
+
+
+<script type="text/javascript">
+<!--
+function onLoadActions() {
+ quicksearchHelpText('quicksearch_main', 'show');
+ if( window.external.AddSearchProvider ){
+ YAHOO.util.Dom.removeClass('quicksearch_plugin', 'bz_default_hidden');
+ }
+ document.getElementById('quicksearch_top').focus();
+}
+function addSidebar() {
+ var sidebarname=window.location.host;
+ if (!/bug/i.test(sidebarname))
+ sidebarname="[% terms.Bugzilla %] "+sidebarname;
+ window.sidebar.addPanel (sidebarname, "[% urlbase FILTER html %]sidebar.cgi", "");
+}
+var quicksearch_message = "Enter [% terms.abug %] # or some search terms";
+
+function checkQuicksearch( form ) {
+ if (form.quicksearch.value == '' || form.quicksearch.value == quicksearch_message ) {
+ alert('Please enter one or more search terms first.');
+ return false;
+ }
+ return true;
+}
+
+function quicksearchHelpText(el_id, action){
+ var el = document.getElementById(el_id);
+ if ( action == "show") {
+ if( el.value == "" ) {
+ el.value = quicksearch_message
+ YAHOO.util.Dom.addClass(el, "quicksearch_help_text");
+ }
+ } else {
+ if( el.value == quicksearch_message ) {
+ el.value = "";
+ YAHOO.util.Dom.removeClass(el, "quicksearch_help_text");
+ }
+ }
+}
+YAHOO.util.Event.onDOMReady(onLoadActions);
+//-->
+</script>
+
+[% IF release %]
+ <div id="new_release">
+ [% IF release.data %]
+ [% IF release.deprecated %]
+ <p>[% terms.Bugzilla %] [%+ release.deprecated FILTER html %] is no longer
+ supported. You are highly encouraged to upgrade in order to keep your
+ system secure.</p>
+ [% END %]
+
+ <p>A new [% terms.Bugzilla %] version ([% release.data.latest_ver FILTER html %])
+ is available at
+ <a href="[% release.data.url FILTER html %]">[% release.data.url FILTER html %]</a>.<br>
+ Release date: [% release.data.date FILTER html %]</p>
+
+ <p class="notice">This message is only shown to logged in users with admin privs.
+ You can configure this notification from the
+ <a href="editparams.cgi?section=general#upgrade_notification">Parameters</a> page.</p>
+ [% ELSIF release.error == "cannot_download" %]
+ <p>The local XML file '[% release.xml_file FILTER html %]' cannot be created.
+ Please make sure the web server can write in this directory and that you can access
+ the web. If you are behind a proxy, set the
+ <a href="editparams.cgi?section=advanced#proxy_url">proxy_url</a> parameter correctly.</p>
+ [% ELSIF release.error == "no_update" %]
+ <p>The local XML file '[% release.xml_file FILTER html %]' cannot be updated.
+ Please make sure the web server can edit this file.</p>
+ [% ELSIF release.error == "no_access" %]
+ <p>The local XML file '[% release.xml_file FILTER html %]' cannot be read.
+ Please make sure this file has the correct rights set on it.</p>
+ [% ELSIF release.error == "corrupted" %]
+ <p>The local XML file '[% release.xml_file FILTER html %]' has an invalid XML format.
+ Please delete it and try accessing this page again.</p>
+ [% ELSIF release.error == "unknown_parameter" %]
+ <p>'[% Param("upgrade_notification") FILTER html %]' is not a valid notification
+ parameter. Please check this parameter in the
+ <a href="editparams.cgi?section=general#upgrade_notification">Parameters</a> page.</p>
+ [% END %]
+ </div>
+[% END %]
+
+<div id="page-index">
+ <table>
+ <tr>
+ <td>
+ <h1 id="welcome"> Welcome to [% terms.Bugzilla %]</h1>
+ <div class="intro">[% Hook.process('intro') %]</div>
+ <a id="enter_bug" class="bz_common_actions"
+ href="enter_bug.cgi"><span>File [% terms.aBug %]</span></a>
+
+ <a id="query" class="bz_common_actions"
+ href="query.cgi"><span>Search</span></a>
+
+ <a id="account" class="bz_common_actions"
+ [% IF user.id %]
+ href="userprefs.cgi"><span>User Preferences</span></a>
+ [% ELSIF Param('createemailregexp')
+ && user.authorizer.user_can_create_account
+ %]
+ href="createaccount.cgi"><span>Open a New Account</span></a>
+ [% ELSE %]
+ href="?GoAheadAndLogIn=1"><span>Log In</span></a>
+ [% END %]
+
+ <form id="quicksearchForm" name="quicksearchForm" action="buglist.cgi"
+ onsubmit="return checkQuicksearch(this);">
+ <div>
+ <input id="quicksearch_main" type="text" name="quicksearch"
+ onfocus="quicksearchHelpText(this.id, 'hide');"
+ onblur="quicksearchHelpText(this.id, 'show');"
+ >
+ <input id="find" type="submit" value="Quick Search">
+ <ul class="additional_links" id="quicksearch_links">
+ <li>
+ <a href="page.cgi?id=quicksearch.html">Quick Search help</a>
+ </li>
+ <li class="bz_default_hidden" id="quicksearch_plugin">
+ |
+ <a href="javascript:window.external.AddSearchProvider('[% urlbase FILTER html %]search_plugin.cgi')">
+ Install the Quick Search plugin
+ </a>
+ </li>
+ </ul>
+ <ul class="additional_links">
+ <li>
+ <a href="[% docs_urlbase FILTER html %]using.html">
+ [%- terms.Bugzilla %] User's Guide</a>
+ </li>
+ <li>
+ |
+ <a href="page.cgi?id=release-notes.html">Release Notes</a>
+ </li>
+ </ul>
+ </div>
+ </form>
+ <div class="outro">[% Hook.process('outro') %]</div>
+ </td>
+ </tr>
+ </table>
+</div>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/list/change-columns.html.tmpl b/template/en/default/list/change-columns.html.tmpl
new file mode 100644
index 0000000..36cd5db
--- /dev/null
+++ b/template/en/default/list/change-columns.html.tmpl
@@ -0,0 +1,127 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Dave Lawrence <dkl@redhat.com>
+ # Pascal Held <paheld@gmail.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Change Columns"
+ javascript_urls = "js/change-columns.js"
+ onload = "initChangeColumns()"
+%]
+
+<p>
+ Select the columns you wish to appear in your [% terms.bug %] lists. Note that
+ this feature requires cookies to work.
+</p>
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+[% field_descs.short_short_desc = "Summary (first 60 characters)" %]
+[% field_descs.short_desc = "Full Summary" %]
+[% field_descs.assigned_to_realname = "Assignee Realname" %]
+[% field_descs.reporter_realname = "Reporter Realname" %]
+[% field_descs.qa_contact_realname = "QA Contact Realname" %]
+
+<form name="changecolumns" action="colchange.cgi" onsubmit="change_submit();">
+ <input type="hidden" name="rememberedquery" value="[% buffer FILTER html %]">
+ <table>
+ <tr>
+ <th><div id="avail_header" class="bz_default_hidden">Available Columns</div></th>
+ <th></th>
+ <th>Selected Columns</th>
+ <th></th>
+ </tr>
+ <tr>
+ <td>
+ <select name="available_columns" id="available_columns"
+ size="15" multiple="multiple" onchange="updateView();"
+ class="bz_default_hidden">
+ </select>
+ </td>
+ <td>
+ <input class="image_button bz_default_hidden" type="button"
+ id="select_button" name="select" onclick="move_select()">
+ <br><br>
+ <input class="image_button bz_default_hidden" type="button"
+ id="deselect_button" name="deselect" onclick="move_deselect()">
+ </td>
+ <td>
+ <select name="selected_columns" id="selected_columns"
+ size="15" multiple="multiple" onchange="updateView();">
+ [% FOREACH column = collist %]
+ <option value="[% column FILTER html %]" selected="selected">
+ [% (field_descs.${column} || column) FILTER html %]
+ </option>
+ [% END %]
+ [% FOREACH column = masterlist %]
+ [% IF lsearch(collist, column) == -1 %]
+ <option value="[% column FILTER html %]">
+ [% (field_descs.${column} || column) FILTER html %]
+ </option>
+ [% END %]
+ [% END %]
+ </select>
+ </td>
+ <td>
+ <input class="image_button bz_default_hidden" type="button"
+ id="up_button" name="up" onclick="move_up()">
+ <br><br>
+ <input class="image_button bz_default_hidden" type="button"
+ id="down_button" name="down" onclick="move_down()">
+ </td>
+ </tr>
+ </table>
+
+ <p>
+ <input id="nosplitheader" type="radio" name="splitheader" value="0"
+ [%+ "checked='checked'" IF NOT splitheader %]>
+ <label for="nosplitheader">
+ Normal headers (prettier)
+ </label>
+ <br>
+
+ <input id="splitheader" type="radio" name="splitheader" value="1"
+ [%+ "checked='checked'" IF splitheader %]>
+ <label for="splitheader">
+ Stagger headers (often makes list more compact)
+ </label>
+ </p>
+
+ [% IF saved_search %]
+ <p>
+ <input type="hidden" name="saved_search"
+ value="[% saved_search.id FILTER html%]" >
+ <input type="checkbox" id="save_columns_for_search" checked="checked"
+ name="save_columns_for_search" value="1">
+ <label for="save_columns_for_search">Save this column list only
+ for search '[% saved_search.name FILTER html %]'</label>
+ </p>
+ [% END %]
+
+ <p>
+ <input type="submit" id="change" value="Change Columns">
+ </p>
+
+ <input type="submit" id="resetit" name="resetit"
+ value="Reset to [% terms.Bugzilla %] default">
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
+
diff --git a/template/en/default/list/edit-multiple.html.tmpl b/template/en/default/list/edit-multiple.html.tmpl
new file mode 100644
index 0000000..75f2f83
--- /dev/null
+++ b/template/en/default/list/edit-multiple.html.tmpl
@@ -0,0 +1,424 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ # Guy Pyrzak <guy.pyrzak@gmail.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% dontchange = "--do_not_change--" %]
+<input type="hidden" name="dontchange" value="[% dontchange FILTER html %]">
+<input type="hidden" name="token" value="[% token FILTER html %]">
+
+<script type="text/javascript">
+ function SetCheckboxes(value) {
+ var elements = document.forms.changeform.getElementsByTagName('input'),
+ numelements = elements.length,
+ item, i;
+ for (i = 0; i < numelements; i++) {
+ item = elements[i];
+ if (item.type === 'checkbox' && item.name.match(/^id_/)) {
+ item.checked = value;
+ }
+ }
+ }
+ document.write(' <input type="button" name="uncheck_all" value="Uncheck All" onclick="SetCheckboxes(false);">');
+ document.write(' <input type="button" name="check_all" value="Check All" onclick="SetCheckboxes(true);">');
+</script>
+
+<hr>
+
+<p style="font-size:smaller">
+ To change multiple [% terms.bugs %]:</p>
+<ol style="font-size:smaller">
+ <li>Check the [% terms.bugs %] you want to change above.</li>
+ <li>Make your changes in the form fields below. If the change
+ you are making requires an explanation, include it in
+ the comments box.</li>
+ <li>Click the <em>Commit</em> button.</li>
+</ol>
+
+<table id="form">
+ <tr>
+
+ <th><label for="product">Product:</label></th>
+ <td>
+ [% PROCESS selectmenu menuname = "product"
+ menuitems = products
+ property = "name" %]
+ </td>
+
+ <th><label for="version">Version:</label></th>
+ <td>
+ [% PROCESS selectmenu menuname = "version"
+ menuitems = versions
+ property = "" %]
+ </td>
+
+ </tr>
+ <tr>
+
+ <th><label for="component">Component:</label></th>
+ <td>
+ [% PROCESS selectmenu menuname = "component"
+ menuitems = components %]
+ </td>
+
+ <th>
+ <label for="priority">
+ <a href="page.cgi?id=fields.html#priority">Priority</a>:
+ </label>
+ </th>
+ <td>
+ [% PROCESS selectmenu menuname = "priority"
+ menuitems = priorities %]
+ </td>
+
+ </tr>
+ <tr>
+
+ <th>
+ <label for="rep_platform">
+ <a href="page.cgi?id=fields.html#rep_platform">Platform</a>:
+ </label>
+ </th>
+ <td>
+ [% PROCESS selectmenu menuname = "rep_platform"
+ menuitems = platforms %]
+ </td>
+
+ <th>
+ <label for="bug_severity">
+ <a href="page.cgi?id=fields.html#bug_severity">Severity</a>:
+ </label>
+ </th>
+ <td>
+ [% PROCESS selectmenu menuname = "bug_severity"
+ menuitems = severities %]
+ </td>
+
+ </tr>
+
+ <tr>
+ <th>
+ <label for="op_sys">
+ <a href="page.cgi?id=fields.html#op_sys">OS</a>:
+ </label>
+ </th>
+ <td [% " colspan=\"3\"" IF !Param("usetargetmilestone") %]>
+ [% PROCESS selectmenu menuname = "op_sys"
+ menuitems = op_sys %]
+ </td>
+
+ [% IF Param("usetargetmilestone") %]
+ <th><label for="target_milestone">Target Milestone:</label></th>
+ <td>
+ [% PROCESS selectmenu menuname = "target_milestone"
+ menuitems = targetmilestones %]
+ </td>
+ [% END %]
+ </tr>
+
+ <tr>
+ <th><label for="bug_status">Status:</label></th>
+ <td colspan="3">[% PROCESS status_section %]</td>
+ </tr>
+ [% IF user.is_timetracker %]
+ <tr>
+ <th><label for="estimated_time">Estimated Hours:</label></th>
+ <td>
+ <input id="estimated_time"
+ name="estimated_time"
+ value="[% dontchange FILTER html %]"
+ size="6">
+ </td>
+ <th><label for="deadline">Deadline (YYYY-MM-DD):</label></th>
+ <td>
+ <input id="deadline"
+ name="deadline"
+ value="[% dontchange FILTER html %]"
+ size="10">
+ </td>
+ </tr>
+ <tr>
+ <th><label for="remaining_time">Remaining Hours:</label></th>
+ <td>
+ <input id="remaining_time"
+ name="remaining_time"
+ value="[% dontchange FILTER html %]"
+ size="6">
+ </td>
+ <th>&nbsp;</th>
+ <td>&nbsp;</td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <th><label for="assigned_to">Assignee:</label></th>
+ <td colspan="3">
+ [% INCLUDE global/userselect.html.tmpl
+ id => "assigned_to"
+ name => "assigned_to"
+ value => dontchange
+ size => 32
+ %]
+ <input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1">
+ <label for="set_default_assignee">Reset Assignee to default</label>
+ </td>
+ </tr>
+
+ [% IF Param("useqacontact") %]
+ <tr>
+ <th><label for="qa_contact">QA Contact:</label></th>
+ <td colspan="3">
+ [% INCLUDE global/userselect.html.tmpl
+ id => "qa_contact"
+ name => "qa_contact"
+ value => dontchange
+ size => 32
+ %]
+ <input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1">
+ <label for="set_default_qa_contact">Reset QA Contact to default</label>
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+
+ <th><label for="masscc">CC List:</label></th>
+ <td colspan="3">
+ <input id="masscc" name="masscc" size="32">
+ <select name="ccaction">
+ <option value="add">Add these to the CC List</option>
+ <option value="remove">Remove these from the CC List</option>
+ </select>
+ </td>
+
+ </tr>
+
+ [% IF use_keywords %]
+ <tr>
+
+ <th>
+ <label for="keywords">
+ <a href="describekeywords.cgi">Keywords</a>:
+ </label>
+ </th>
+ <td colspan="3">
+ <input id="keywords" name="keywords" size="32">
+ <select name="keywordaction">
+ <option value="add">Add these keywords</option>
+ <option value="delete">Delete these keywords</option>
+ <option value="makeexact">Make the keywords be exactly this list</option>
+ </select>
+ </td>
+
+ </tr>
+ [% END %]
+
+ <tr>
+ <th>
+ <label for="dependson">
+ Depends On:
+ </label>
+ </th>
+ <td colspan="3">
+ <input id="dependson" name="dependson" size="32">
+ <select name="dependson_action">
+ <option value="add">Add these IDs</option>
+ <option value="remove">Delete these IDs</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <th>
+ <label for="blocked">
+ Blocks:
+ </label>
+ </th>
+ <td colspan="3">
+ <input id="blocked" name="blocked" size="32">
+ <select name="blocked_action">
+ <option value="add">Add these IDs</option>
+ <option value="remove">Delete these IDs</option>
+ </select>
+ </td>
+ </tr>
+
+ [% IF Param('usestatuswhiteboard') %]
+ <tr>
+ <td align="right">
+ <b>Status Whiteboard:</b>
+ </td>
+ <td colspan="7">
+ <input name="status_whiteboard"
+ value="[% dontchange FILTER html %]" size="60">
+ </td>
+ </tr>
+ [% END %]
+
+ [% USE Bugzilla %]
+ [% FOREACH field = Bugzilla.active_custom_fields %]
+ <tr>
+ [% PROCESS bug/field.html.tmpl value = dontchange
+ editable = 1
+ allow_dont_change = 1 %]
+ </tr>
+ [% END %]
+
+ [% Hook.process("after_custom_fields") %]
+
+</table>
+
+<b><label for="comment">Additional Comments:</label></b>
+[% IF user.is_insider %]
+ <input type="checkbox" name="commentprivacy" value="1"
+ id="newcommentprivacy"
+ onClick="updateCommentTagControl(this, form)"/>
+ <label for="newcommentprivacy">
+ Make comment private (visible only to members of the
+ <strong>[% Param('insidergroup') FILTER html %]</strong> group)
+ </label>
+[% END %]
+<br>
+[% INCLUDE global/textarea.html.tmpl
+ name = 'comment'
+ id = 'comment'
+ minrows = 5
+ maxrows = 25
+ cols = constants.COMMENT_COLS
+%]<br>
+
+[% Hook.process('before_groups') %]
+
+[% IF groups.size > 0 %]
+
+ <b>Groups:</b><br>
+ <table border="1">
+ <tr>
+ <th>Don't<br>change<br>this group<br>restriction</th>
+ <th>Remove<br>[% terms.bugs %]<br>from this<br>group</th>
+ <th>Add<br>[% terms.bugs %]<br>to this<br>group</th>
+ <th>Group Name:</th>
+ </tr>
+
+ [% FOREACH group = groups %]
+ <tr>
+ <td align="center">
+ <input type="radio" name="bit-[% group.id %]" value="-1" checked="checked">
+ </td>
+ <td align="center">
+ <input type="radio" name="bit-[% group.id %]" value="0">
+ </td>
+ [% IF group.is_active %]
+ <td align="center">
+ <input type="radio" name="bit-[% group.id %]" value="1">
+ </td>
+ [% ELSE %]
+ <td>&nbsp;</td>
+ [% foundinactive = 1 %]
+ [% END %]
+
+ <td>
+ [% SET inactive = !group.is_active %]
+ [% group.description FILTER html_light FILTER inactive(inactive) %]
+ </td>
+
+ </tr>
+ [% END %]
+
+ </table>
+
+ [% IF foundinactive %]
+ <p style="font-size:smaller">(Note: [% terms.Bugs %] may not be added to [% FILTER inactive %]inactive
+ groups[% END %], only removed.)</p>
+ [% END %]
+
+[% END %]
+<input type="submit" id="commit" value="Commit">
+
+[% IF Param('move-enabled') && user.is_mover %]
+ <input type="submit" name="action" id="action" value="[% Param('move-button-text') %]">
+[% END %]
+
+[%############################################################################%]
+[%# Select Menu Block #%]
+[%############################################################################%]
+
+[% BLOCK selectmenu %]
+ <select id="[% menuname %]" name="[% menuname %]">
+ <option value="[% dontchange FILTER html %]" selected="selected">
+ [% dontchange FILTER html %]
+ </option>
+ [% FOREACH menuitem = menuitems %]
+ [% IF property %][% menuitem = menuitem.$property %][% END %]
+ <option value="[% menuitem FILTER html %]">[% display_value(menuname, menuitem) FILTER html %]</option>
+ [% END %]
+ </select>
+[% END %]
+
+[%############################################################################%]
+[%# Status Block #%]
+[%############################################################################%]
+
+[% BLOCK status_section %]
+ [% all_open_bugs = !current_bug_statuses.containsany(closedstates) %]
+ [% all_closed_bugs = !current_bug_statuses.containsany(openstates) %]
+ [% closed_status_array = [] %]
+
+ <select name="bug_status" id="bug_status">
+ <option value="[% dontchange FILTER html %]" selected="selected">[% dontchange FILTER html %]</option>
+
+ [% FOREACH bug_status = new_bug_statuses %]
+ <option value="[% bug_status.name FILTER html %]">
+ [% display_value("bug_status", bug_status.name) FILTER html %]
+ </option>
+ [% IF !bug_status.is_open %]
+ [% filtered_status = bug_status.name FILTER js %]
+ [% closed_status_array.push( filtered_status ) %]
+ [% END %]
+ [% END %]
+
+ [%# If all the bugs being changed are closed, allow the user to change their resolution. %]
+ [% IF all_closed_bugs %]
+ [% filtered_status = dontchange FILTER js %]
+ [% closed_status_array.push( filtered_status ) %]
+ [% END %]
+ </select>
+
+ <span id="resolution_settings">
+ <select id="resolution" name="resolution">
+ <option value="[% dontchange FILTER html %]" selected >[% dontchange FILTER html %]</option>
+ [% FOREACH r = resolutions %]
+ [% NEXT IF !r %]
+ [% NEXT IF r == "DUPLICATE" || r == "MOVED" %]
+ <option value="[% r FILTER html %]">[% display_value("resolution", r) FILTER html %]</option>
+ [% END %]
+ </select>
+ </span>
+
+ <script type="text/javascript">
+ var close_status_array = new Array("[% closed_status_array.join('", "') FILTER none %]");
+ YAHOO.util.Event.addListener('bug_status', "change", showHideStatusItems, '[% "is_duplicate" IF bug.dup_id %]');
+ YAHOO.util.Event.onDOMReady( showHideStatusItems );
+ </script>
+
+[% END %]
diff --git a/template/en/default/list/list-simple.html.tmpl b/template/en/default/list/list-simple.html.tmpl
new file mode 100644
index 0000000..125a164
--- /dev/null
+++ b/template/en/default/list/list-simple.html.tmpl
@@ -0,0 +1,53 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # title: string. The title for this page. (optional)
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[%############################################################################%]
+[%# Initialization #%]
+[%############################################################################%]
+
+[% DEFAULT title = "$terms.Bug List" %]
+
+[%############################################################################%]
+[%# Bug Table #%]
+[%############################################################################%]
+
+<html>
+
+ <head>
+ <title>[% title FILTER html %]</title>
+ <base href="[% urlbase FILTER html %]">
+ <link href="skins/standard/buglist.css" rel="stylesheet" type="text/css">
+ </head>
+
+ <body>
+ [% IF bugs.size == 0 %]
+ <h3>[% terms.zeroSearchResults %].</h3>
+ [% ELSE %]
+ [% PROCESS list/table.html.tmpl %]
+ [% END %]
+ </body>
+
+</html>
diff --git a/template/en/default/list/list.atom.tmpl b/template/en/default/list/list.atom.tmpl
new file mode 100644
index 0000000..ed0c660
--- /dev/null
+++ b/template/en/default/list/list.atom.tmpl
@@ -0,0 +1,101 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Walter Hoehn <wassa@columbia.edu>
+ # John Belmonte <john@neggie.net>
+ # Jason Remillard <jremillardshop@letterboxes.org>
+ # Phil Ringnalda <bugzilla@philringnalda.com>
+ #
+ # This is a template for generating an Atom representation of a buglist.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% DEFAULT title = "$terms.Bugzilla $terms.Bugs" %]
+
+<?xml version="1.0"[% IF Param('utf8') %] encoding="UTF-8"[% END %]?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <title>[% title FILTER xml %]</title>
+ <link rel="alternate" type="text/html"
+ href="[% urlbase FILTER html %]buglist.cgi?
+ [%- urlquerypart.replace('ctype=atom[&]?','') FILTER xml %]"/>
+ <link rel="self" type="application/atom+xml"
+ href="[% urlbase FILTER html %]buglist.cgi?
+ [%- urlquerypart FILTER xml %]"/>
+ <updated>[% bugs.sort('changedtime').last.changedtime FILTER time("%Y-%m-%dT%H:%M:%SZ", "UTC")
+ FILTER xml %]</updated>
+ <id>[% urlbase FILTER html %]buglist.cgi?[% urlquerypart FILTER xml %]</id>
+
+ [% FOREACH bug = bugs %]
+ <entry>
+ <title>[% "@" IF bug.secure_mode %][[% terms.Bug %] [%+ bug.bug_id FILTER xml %]] [% bug.short_desc FILTER xml %]</title>
+ <link rel="alternate" type="text/html"
+ href="[% urlbase FILTER html %]show_bug.cgi?id=
+ [%- bug.bug_id FILTER xml %]"/>
+ <id>[% urlbase FILTER xml %]show_bug.cgi?id=[% bug.bug_id FILTER xml %]</id>
+ <author>
+ <name>[% bug.reporter_realname ? bug.reporter_realname : bug.reporter FILTER xml %]</name>
+ </author>
+ <updated>[% bug.changedtime FILTER time("%Y-%m-%dT%H:%M:%SZ", "UTC") FILTER xml %]</updated>
+ <summary type="html">
+ [%# Filter out the entire block, so that we don't need to escape the html code out %]
+ [% FILTER xml %]
+ <table>
+ <tr>
+ <th>Field</th><th>Value</th>
+ </tr><tr class="bz_feed_product">
+ <td>[% columns.product.title FILTER html %]</td>
+ <td>[% bug.product FILTER html %]</td>
+ </tr><tr class="bz_feed_component">
+ <td>[% columns.component.title FILTER html %]</td>
+ <td>[% bug.component FILTER html %]</td>
+ </tr><tr class="bz_feed_assignee">
+ <td>[% columns.assigned_to_realname.title FILTER html %]</td>
+ <td>[% bug.assigned_to_realname ? bug.assigned_to_realname : bug.assigned_to FILTER html %]</td>
+ </tr><tr class="bz_feed_reporter">
+ <td>[% columns.reporter_realname.title FILTER html %]</td>
+ <td>[% bug.reporter_realname ? bug.reporter_realname : bug.reporter FILTER html %]</td>
+ </tr><tr class="bz_feed_bug_status">
+ <td>[% columns.bug_status.title FILTER html %]</td>
+ <td>[% display_value("bug_status", bug.bug_status) FILTER html %]</td>
+ </tr><tr class="bz_feed_resolution">
+ <td>[% columns.resolution.title FILTER html %] </td>
+ <td>[% display_value("resolution", bug.resolution) FILTER html %]</td>
+ </tr><tr class="bz_feed_priority">
+ <td>[% columns.priority.title FILTER html %]</td>
+ <td>[% display_value("priority", bug.priority) FILTER html %]</td>
+ </tr><tr class="bz_feed_severity">
+ <td>[% columns.bug_severity.title FILTER html %] </td>
+ <td>[% display_value("bug_severity", bug.bug_severity) FILTER html %]</td>
+ [% IF Param("usetargetmilestone") %]
+ </tr><tr class="bz_feed_target_milestone">
+ <td>[% columns.target_milestone.title FILTER html %]</td>
+ <td>[% bug.target_milestone FILTER html %]</td>
+ [% END %]
+ </tr><tr class="bz_feed_creation_date">
+ <td>[% columns.opendate.title FILTER html %]</td>
+ <td>[% bug.opendate FILTER html %]</td>
+ </tr><tr class="bz_feed_changed_date">
+ <td>[% columns.changeddate.title FILTER html %]</td>
+ <td>[% bug.changeddate FILTER html -%]</td>
+ </tr>
+ </table>
+ [% END %]
+ </summary>
+ </entry>
+ [% END %]
+</feed>
diff --git a/template/en/default/list/list.csv.tmpl b/template/en/default/list/list.csv.tmpl
new file mode 100644
index 0000000..6114d6f
--- /dev/null
+++ b/template/en/default/list/list.csv.tmpl
@@ -0,0 +1,46 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% colsepchar = user.settings.csv_colsepchar.value %]
+
+bug_id
+[% FOREACH column = displaycolumns %]
+ [% colsepchar %][% column FILTER csv %]
+[% END %]
+
+[% FOREACH bug = bugs %]
+ [% bug.bug_id %]
+ [% FOREACH column = displaycolumns %]
+ [% colsepchar %]
+ [% IF column == "opendate" OR column == "changeddate" %]
+ [% rawcolumn = column.replace("date", "time") %]
+ [% bug.$column = bug.$rawcolumn FILTER time("%Y-%m-%d %H:%M:%S") %]
+ [% ELSIF column == 'bug_status' %]
+ [% bug.$column = display_value("bug_status", bug.$column) %]
+ [% ELSIF column == 'resolution' %]
+ [%- bug.$column = display_value("resolution", bug.$column) %]
+ [% END %]
+ [% bug.$column FILTER csv %]
+ [% END %]
+
+[% END %]
diff --git a/template/en/default/list/list.html.tmpl b/template/en/default/list/list.html.tmpl
new file mode 100644
index 0000000..941b34a
--- /dev/null
+++ b/template/en/default/list/list.html.tmpl
@@ -0,0 +1,291 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # searchtype: string. Type of search - either "series", "saved" or undef.
+ # ...
+ # defaultsavename: string. The default name for saving the query.
+ #%]
+
+[%############################################################################%]
+[%# Template Initialization #%]
+[%############################################################################%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% title = "$terms.Bug List" %]
+[% IF searchname || defaultsavename %]
+ [% title = title _ ": " _ (searchname OR defaultsavename) FILTER html %]
+[% END %]
+
+[% qorder = order FILTER url_quote IF order %]
+
+
+[%############################################################################%]
+[%# Page Header #%]
+[%############################################################################%]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ style = style
+ atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom"
+ javascript_urls = [ "js/util.js", "js/field.js", "js/yui/calendar.js" ]
+ style_urls = [ "skins/standard/buglist.css", "skins/standard/yui/calendar.css" ]
+ doc_section = "query.html#list"
+%]
+
+<div class="bz_query_head" align="center">
+ <span class="bz_query_timestamp">
+ <b>[% currenttime FILTER time('%a %b %e %Y %T %Z') FILTER html %]</b><br>
+ </span>
+
+ [% IF debug %]
+ <p class="bz_query">[% query FILTER html %]</p>
+ [% IF query_explain.defined %]
+ <pre class="bz_query_explain">[% query_explain FILTER html %]</pre>
+ [% END %]
+ [% END %]
+
+ [% IF user.settings.display_quips.value == 'on' %]
+ [% DEFAULT quip = "$terms.Bugzilla would like to put a random quip here, but no one has entered any." %]
+ <span class="bz_quip">
+ <a href="quips.cgi"><i>[% quip FILTER html %]</i></a>
+ </span>
+ [% END %]
+
+</div>
+
+[% IF toolong %]
+ <h2 class="bz_smallminded">
+ This list is too long for [% terms.Bugzilla %]'s little mind; the
+ Next/Prev/First/Last buttons won't appear on individual [% terms.bugs %].
+ </h2>
+[% END %]
+
+[% SET shown_types = [
+ 'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq',
+ 'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter',
+ 'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords',
+ 'nowordssubstr', 'notmatches',
+] %]
+<ul class="search_description">
+[% FOREACH desc_item = search_description %]
+ <li>
+ <strong>[% field_descs.${desc_item.field} FILTER html %]:</strong>
+ [% IF shown_types.contains(desc_item.type) || debug %]
+ ([% search_descs.${desc_item.type} FILTER html %])
+ [% END %]
+ [% FOREACH val IN desc_item.value.split(',') %]
+ [%+ display_value(desc_item.field, val) FILTER html %][% ',' UNLESS loop.last %]
+ [% END %]
+ [% IF debug %]
+ (<code>[% desc_item.term FILTER html %]</code>)
+ [% END %]
+ </li>
+[% END %]
+</ul>
+
+<hr>
+
+[%############################################################################%]
+[%# Preceding Status Line #%]
+[%############################################################################%]
+
+[% IF bugs.size > 9 %]
+ <span class="bz_result_count">
+ [% bugs.size %] [%+ terms.bugs %] found.
+ </span>
+[% END %]
+
+[%############################################################################%]
+[%# Start of Change Form #%]
+[%############################################################################%]
+
+[% IF dotweak %]
+ <form name="changeform" method="post" action="process_bug.cgi">
+[% END %]
+
+[%############################################################################%]
+[%# Bug Table #%]
+[%############################################################################%]
+
+[% FLUSH %]
+[% PROCESS list/table.html.tmpl %]
+
+[%############################################################################%]
+[%# Succeeding Status Line #%]
+[%############################################################################%]
+
+<span class="bz_result_count">
+ [% IF bugs.size == 0 %]
+ <span class="zero_results">[% terms.zeroSearchResults %].</span>
+ [% ELSIF bugs.size == 1 %]
+ One [% terms.bug %] found.
+ [% ELSE %]
+ [% bugs.size %] [%+ terms.bugs %] found.
+ [% END %]
+</span>
+
+[% IF bugs.size == 0 %]
+ <ul class="zero_result_links">
+ <li>[% PROCESS enter_bug_link %]</li>
+ [% IF one_product.defined %]
+ <li><a href="enter_bug.cgi">File a new [% terms.bug %] in a
+ different product</a></li>
+ [% END %]
+ <li><a href="[% PROCESS edit_search_url %]">Edit this search</a></li>
+ <li><a href="query.cgi">Start a new search</a></li>
+ </ul>
+[% END %]
+
+<br>
+
+[%############################################################################%]
+[%# Rest of Change Form #%]
+[%############################################################################%]
+
+[% IF dotweak %]
+ [% PROCESS "list/edit-multiple.html.tmpl" %]
+ </form>
+ <hr>
+[% END %]
+
+[%############################################################################%]
+[%# Navigation Bar #%]
+[%############################################################################%]
+
+<table>
+ <tr>
+ [% IF bugs.size > 0 %]
+ <td valign="middle" class="bz_query_buttons">
+ <form method="post" action="show_bug.cgi">
+ [% FOREACH id = buglist %]
+ <input type="hidden" name="id" value="[% id FILTER html %]">
+ [% END %]
+ <input type="hidden" name="format" value="multiple">
+ <input type="submit" id="long_format" value="Long Format">
+ </form>
+ <form method="post" action="show_bug.cgi">
+ <input type="hidden" name="ctype" value="xml">
+ [% FOREACH id = buglist %]
+ <input type="hidden" name="id" value="[% id FILTER html %]">
+ [% END %]
+ <input type="hidden" name="excludefield" value="attachmentdata">
+ <input type="submit" value="XML" id="xml">
+ </form>
+
+ [% IF user.is_timetracker %]
+ <form method="post" action="summarize_time.cgi">
+ <input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
+ <input type="submit" id="timesummary" value="Time Summary">
+ </form>
+ [% END %]
+ </td>
+
+ <td>&nbsp;</td>
+
+ <td valign="middle" class="bz_query_links">
+ <a href="buglist.cgi?
+ [% urlquerypart FILTER html %]&amp;ctype=csv">CSV</a> |
+ <a href="buglist.cgi?
+ [% urlquerypart FILTER html %]&amp;title=
+ [%- title FILTER html %]&amp;ctype=atom">Feed</a> |
+ <a href="buglist.cgi?
+ [% urlquerypart FILTER html %]&amp;ctype=ics">iCalendar</a> |
+ <a href="colchange.cgi?
+ [% urlquerypart FILTER html %]&amp;query_based_on=
+ [% defaultsavename OR searchname FILTER url_quote %]">Change&nbsp;Columns</a> |
+
+ [% IF bugs.size > 1 && caneditbugs && !dotweak %]
+ <a href="buglist.cgi?[% urlquerypart FILTER html %]
+ [%- "&order=$qorder" FILTER html IF order %]&amp;tweak=1"
+ >Change&nbsp;Several&nbsp;[% terms.Bugs %]&nbsp;at&nbsp;Once</a>
+ |
+ [% END %]
+
+ [% IF bugowners && user.id %]
+ <a href="mailto:
+ [% bugowners FILTER html %]">Send&nbsp;Mail&nbsp;to&nbsp;[% terms.Bug %]&nbsp;Assignees</a> |
+ [% END %]
+
+ [%# Links to more things users can do with this bug list. %]
+ [% Hook.process("links") %]
+ </td>
+ [% END %]
+
+ <td valign="middle" class="bz_query_edit">
+ <a href="[% PROCESS edit_search_url %]">Edit&nbsp;Search</a>
+ </td>
+
+ [% IF searchtype == "saved" %]
+ <td valign="middle" nowrap="nowrap" class="bz_query_forget">
+ |
+ <a href="buglist.cgi?cmdtype=dorem&amp;remaction=forget&amp;namedcmd=
+ [% searchname FILTER url_quote %]&amp;token=
+ [% issue_hash_token([search_id, searchname]) FILTER url_quote %]">
+ Forget&nbsp;Search&nbsp;'[% searchname FILTER html %]'</a>
+ </td>
+ [% ELSE %]
+ <td>&nbsp;</td>
+
+ <td valign="middle" class="bz_query_remember">
+ <form method="get" action="buglist.cgi">
+ <input type="submit" id="remember" value="Remember search"> as
+ <input type="hidden" name="newquery"
+ value="[% urlquerypart FILTER html %][% "&order=$qorder" FILTER html IF order %]">
+ <input type="hidden" name="cmdtype" value="doit">
+ <input type="hidden" name="remtype" value="asnamed">
+ <input type="text" id="save_newqueryname" name="newqueryname" size="20"
+ value="[% defaultsavename FILTER html %]">
+ </form>
+ </td>
+ [% END %]
+ </tr>
+</table>
+
+[% IF one_product.defined && bugs.size %]
+ <p class="bz_query_single_product">
+ [% PROCESS enter_bug_link %]
+ </p>
+[% END %]
+
+[%############################################################################%]
+[%# Page Footer #%]
+[%############################################################################%]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[% BLOCK edit_search_url %]
+ [% editqueryname = searchname OR defaultsavename OR '' %]
+ query.cgi?[% urlquerypart FILTER html %]
+ [%- IF editqueryname != '' %]&amp;known_name=
+ [%- editqueryname FILTER url_quote %]
+ [% END %]
+[% END %]
+
+[% BLOCK enter_bug_link %]
+ <a href="enter_bug.cgi
+ [%- IF one_product.defined %]?product=
+ [%- one_product.name FILTER url_quote %][% END %]">File
+ a new [% terms.bug %]
+ [% IF one_product.defined %]
+ in the "[% one_product.name FILTER html %]" product
+ [% END %]</a>
+[% END %]
diff --git a/template/en/default/list/list.ics.tmpl b/template/en/default/list/list.ics.tmpl
new file mode 100644
index 0000000..3f9e2b8
--- /dev/null
+++ b/template/en/default/list/list.ics.tmpl
@@ -0,0 +1,103 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): William Jon McCann <mccann@jhu.edu>
+ #%]
+[% PROCESS global/variables.none.tmpl %]
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+[%+ PROCESS ics_prodid +%]
+VERSION:2.0
+[% FOREACH bug = bugs %]
+BEGIN:VTODO
+[%+ PROCESS ics_dtstart +%]
+[%+ PROCESS ics_summary +%]
+[%+ PROCESS ics_uid base_url=urlbase bug_id=bug.bug_id +%]
+[%+ PROCESS ics_url base_url=urlbase bug_id=bug.bug_id +%]
+[%+ PROCESS ics_status bug_status = bug.bug_status +%]
+[%+ PROCESS ics_dtstamp +%]
+[%+ ics_priorities.${bug.priority} FILTER ics('PRIORITY') +%]
+[% IF bug.changeddate %]
+[%+ bug.changedtime FILTER time("%Y%m%dT%H%M%SZ", "UTC") FILTER ics('LAST-MODIFIED') +%]
+[% END %]
+[% IF bug.percentage_complete %]
+[%+ bug.percentage_complete FILTER format('%d') FILTER ics('PERCENT-COMPLETE') +%]
+[% END %]
+[% IF bug.product %]
+[%+ bug.product FILTER ics('X-BUGZILLA-PRODUCT') +%]
+[% END %]
+[% IF bug.component %]
+[%+ bug.component FILTER ics('X-BUGZILLA-COMPONENT') +%]
+[% END %]
+[% IF bug.version %]
+[%+ bug.version FILTER ics('X-BUGZILLA-VERSION') +%]
+[% END %]
+[% IF bug.keywords %]
+[%+ bug.keywords FILTER ics('X-BUGZILLA-KEYWORDS') +%]
+[% END %]
+END:VTODO
+[% END %]
+END:VCALENDAR
+
+[% BLOCK ics_prodid %]
+ [% "-//Mozilla/Bugzilla $constants.BUGZILLA_VERSION//EN" FILTER ics('PRODID') %]
+[% END %]
+
+[% BLOCK ics_uid %]
+ [% "${bug_id}@${base_url}" FILTER url_quote FILTER ics('UID') %]
+[% END %]
+
+[% BLOCK ics_url %]
+ [% "${base_url}show_bug.cgi?id=${bug_id}" FILTER url_quote FILTER ics('URL;VALUE=URI') %]
+[% END %]
+
+[% BLOCK ics_dtstart %]
+ [% bug.opentime FILTER time("%Y%m%dT%H%M%SZ", "UTC") FILTER ics('DTSTART') %]
+[% END %]
+
+[% BLOCK ics_dtstamp %]
+ [% currenttime FILTER time("%Y%m%dT%H%M%SZ", "UTC") FILTER ics('DTSTAMP') %]
+[% END %]
+
+[% BLOCK ics_status %]
+ [% status = "" %]
+ [% FOREACH state = closedstates %]
+ [% IF bug_status == state %]
+ [% status = 'COMPLETED' %]
+ [% LAST %]
+ [% END %]
+ [% END %]
+ [% IF NOT status %]
+ [% IF bug_status == 'ASSIGNED' %]
+ [% status = 'IN-PROGRESS' %]
+ [% ELSE %]
+ [% status = 'NEEDS-ACTION' %]
+ [% END %]
+ [% END %]
+ [% status FILTER ics('STATUS') %]
+[% END %]
+
+[% BLOCK ics_summary %]
+ [% IF bug.short_desc %]
+ [% summary = bug.short_desc %]
+ [% ELSIF bug.short_short_desc %]
+ [% summary = bug.short_short_desc %]
+ [% ELSE %]
+ [% summary = "$terms.Bug $bug.bug_id" %]
+ [% END %]
+ [% summary FILTER ics('SUMMARY') %]
+[% END %]
diff --git a/template/en/default/list/list.js.tmpl b/template/en/default/list/list.js.tmpl
new file mode 100644
index 0000000..7e9664c
--- /dev/null
+++ b/template/en/default/list/list.js.tmpl
@@ -0,0 +1,37 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+// Note: only publicly-accessible bugs (those not in any group) will be
+// listed when using this JavaScript format. This is to prevent malicious
+// sites stealing information about secure bugs.
+
+bugs = new Array;
+
+[% FOREACH bug = bugs %]
+ bugs[[% bug.bug_id %]] = [
+ [% FOREACH column = displaycolumns %]
+ "[%- bug.$column FILTER js -%]"[% "," UNLESS loop.last %]
+ [% END %]
+ ];
+[% END %]
+
+if (window.buglistCallback) {
+ buglistCallback(bugs);
+}
diff --git a/template/en/default/list/list.rdf.tmpl b/template/en/default/list/list.rdf.tmpl
new file mode 100644
index 0000000..99c06c1
--- /dev/null
+++ b/template/en/default/list/list.rdf.tmpl
@@ -0,0 +1,56 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+<?xml version="1.0"[% IF Param('utf8') %] encoding="UTF-8"[% END %]?>
+<!-- [% template_version %] -->
+<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:bz="http://www.bugzilla.org/rdf#"
+ xmlns:nc="http://home.netscape.com/NC-rdf#">
+
+<bz:result rdf:about="[% urlbase FILTER xml %]buglist.cgi?[% urlquerypart FILTER html %]">
+ <bz:installation rdf:resource="[% urlbase FILTER xml %]" />
+ <bz:query_timestamp>[% currenttime FILTER time('%Y-%m-%d %T %Z') FILTER html %]</bz:query_timestamp>
+ <bz:bugs>
+ <Seq>
+ [% FOREACH bug = bugs %]
+ <li>
+
+ <bz:bug rdf:about="[% urlbase FILTER xml %]show_bug.cgi?id=[% bug.bug_id %]">
+
+ <bz:id nc:parseType="Integer">[% bug.bug_id %]</bz:id>
+
+ [% FOREACH column = displaycolumns %]
+ <bz:[% column %][% ' nc:parseType="Integer"' IF column == "votes" %]>[% bug.$column FILTER html %]</bz:[% column %]>
+ [% END %]
+
+ </bz:bug>
+
+ </li>
+
+ [% END %]
+
+ </Seq>
+
+ </bz:bugs>
+
+</bz:result>
+
+</RDF>
diff --git a/template/en/default/list/quips.html.tmpl b/template/en/default/list/quips.html.tmpl
new file mode 100644
index 0000000..1404b2e
--- /dev/null
+++ b/template/en/default/list/quips.html.tmpl
@@ -0,0 +1,168 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # added_quip: string. Defined if the CGI added a quip data before
+ # displaying anything; if defined, its value is that quip.
+ # show_quips: boolean. True if we are showing the entire quip list.
+ # quips: list of strings. Defined if and only if show_quips is true.
+ # List of all quips.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "$terms.Bugzilla Quip System"
+ header = "Add your own clever headline"
+ %]
+
+[% IF added_quip %]
+ <p>
+ <font color="red">
+ Your quip '<tt>[% added_quip FILTER html %]</tt>' has been added.
+ [% IF Param("quip_list_entry_control") == "moderated" AND !user.in_group('admin') %]
+ It will be used as soon as it gets approved.
+ [% END %]
+ </font>
+ </p>
+[% END %]
+
+[% IF deleted_quip %]
+ <p>
+ <font color="red">
+ The quip '<tt>[% deleted_quip FILTER html %]</tt>' has been deleted.
+ </font>
+ </p>
+[% END %]
+
+[% IF approved or unapproved %]
+ <p>[% approved.size %] quips approved and [% unapproved.size %] quips unapproved</p>
+[% END %]
+
+
+<p>
+ [% terms.Bugzilla %] will pick a random quip for the headline on each
+ [% terms.bug %] list.
+</p>
+
+[% IF Param("quip_list_entry_control") != "closed" %]
+ <p>
+ You can extend the quip list. Type in something clever or funny or boring
+ (but not obscene or offensive, please) and bonk on the button.
+ [% IF Param("quip_list_entry_control") == "moderated" AND !user.in_group('admin') %]
+ Note that your quip has to be approved before it is used.
+ [% END %]
+ </p>
+
+ <form method="post" action="quips.cgi">
+ <input type="hidden" name="action" value="add">
+ <input size="80" name="quip">
+ <p>
+ <input type="submit" id="add" value="Add This Quip">
+ </p>
+ </form>
+[% ELSE %]
+ <p>No new entries may be submitted at this time.
+ </p>
+[% END %]
+
+[% IF show_quips %]
+ [% IF !user.in_group('admin') %]
+ <h2>
+ Existing quips:
+ </h2>
+ <ul>
+ [% FOREACH quipid = quipids %]
+ [% NEXT IF NOT quips.$quipid.approved %]
+ <li>[% quips.$quipid.quip FILTER html %]</li>
+ [% END %]
+ </ul>
+ [% ELSE %]
+ <h2>Edit existing quips:</h2>
+ <p>
+ <strong>Note:</strong> Only approved quips will be shown.
+ If the parameter 'quip_list_entry_control' is set to <q>open</q>,
+ entered quips are automatically approved.
+ </p>
+ <form name="editform" method="post" action="quips.cgi">
+ <input type="hidden" name="action" value="approve">
+ <table border="1">
+ <thead><tr>
+ <th>Quip</th>
+ <th>Author</th>
+ <th>Action</th>
+ <th>Approved</th>
+ </tr></thead><tbody>
+ [% FOREACH quipid = quipids %]
+ <tr>
+ <td>[% quips.$quipid.quip FILTER html %]</td>
+ <td>
+ [% userid = quips.$quipid.userid %]
+ [% users.$userid FILTER html %]
+ [% "Unknown" IF NOT users.$userid %]
+ </td>
+ <td>
+ <a href="quips.cgi?action=delete&amp;quipid=[% quipid FILTER url_quote %]">
+ Delete
+ </a>
+ </td>
+ <td>
+ <input type="hidden" name="defined_quipid_[% quipid FILTER html %]"
+ id="defined_quipid_[% quipid FILTER html %]"
+ value="1">
+ <input type="checkbox" name="quipid_[% quipid FILTER html %]"
+ id="quipid_[% quipid FILTER html %]"
+ [%- ' checked="checked"' IF quips.$quipid.approved %]>
+ </td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ <script type="text/javascript"><!--
+ var numelements = document.forms.editform.elements.length;
+ function SetCheckboxes(value) {
+ var item;
+ for (var i=0 ; i<numelements ; i++) {
+ item = document.forms.editform.elements[i];
+ item.checked = value;
+ }
+ }
+ document.write(' <input type="button" name="uncheck_all" '
+ +'value="Uncheck All" onclick="SetCheckboxes(false);">');
+ document.write(' <input type="button" name="check_all" '
+ +'value="Check All" onclick="SetCheckboxes(true);">');
+ //--></script>
+
+ <input type="submit" id="update" value="Save Changes">
+ </form>
+ <br>
+ [% END %]
+[% ELSE %]
+ <p>
+ Those who like their wisdom in large doses can
+ <a href="quips.cgi?action=show">view
+ [% IF user.in_group('admin') %]
+ and edit
+ [% END %]
+ the whole quip list</a>.
+ </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/list/server-push.html.tmpl b/template/en/default/list/server-push.html.tmpl
new file mode 100644
index 0000000..d1c157f
--- /dev/null
+++ b/template/en/default/list/server-push.html.tmpl
@@ -0,0 +1,47 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # debug: boolean. True if we want the search displayed while we wait.
+ # query: string. The SQL query which makes the buglist.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+<html>
+ <head>
+ <title>[% terms.Bugzilla %] is pondering your search</title>
+ </head>
+ <body>
+ <h1 style="margin-top: 20%; text-align: center;">Please stand by ...</h1>
+
+ [% IF debug %]
+ <p>
+ [% FOREACH debugline = debugdata %]
+ <code>[% debugline FILTER html %]</code><br>
+ [% END %]
+ </p>
+ <p>
+ <code>[% query FILTER html %]</code>
+ </p>
+ [% END %]
+
+ </body>
+</html>
diff --git a/template/en/default/list/table.html.tmpl b/template/en/default/list/table.html.tmpl
new file mode 100644
index 0000000..282ea51
--- /dev/null
+++ b/template/en/default/list/table.html.tmpl
@@ -0,0 +1,260 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Jesse Clark <jjclark1982@gmail.com>
+ #%]
+
+[%############################################################################%]
+[%# Initialization #%]
+[%############################################################################%]
+
+[%# Don't display the table or do any processing if there are no bugs
+ # to display %]
+[% RETURN IF !bugs.size %]
+
+[%# Columns whose titles or values should be abbreviated to make the list
+ # more compact. For columns whose titles should be abbreviated,
+ # the shortened title is included. For columns whose values should be
+ # abbreviated, a maximum length is provided along with the ellipsis that
+ # should be added to an abbreviated value, if any.
+ # wrap is set if a column's contents should be allowed to be word-wrapped
+ # by the browser.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+[% field_descs.short_short_desc = field_descs.short_desc %]
+[% field_descs.assigned_to_realname = field_descs.assigned_to %]
+[% field_descs.reporter_realname = field_descs.reporter %]
+[% field_descs.qa_contact_realname = field_descs.qa_contact %]
+
+[% abbrev =
+ {
+ "bug_severity" => { maxlength => 3 , title => "Sev" } ,
+ "priority" => { maxlength => 3 , title => "Pri" } ,
+ "rep_platform" => { maxlength => 3 , title => "Plt" } ,
+ "bug_status" => { maxlength => 4 } ,
+ "assigned_to" => { maxlength => 30 , ellipsis => "..." } ,
+ "assigned_to_realname" => { maxlength => 20 , ellipsis => "..." } ,
+ "reporter" => { maxlength => 30 , ellipsis => "..." } ,
+ "reporter_realname" => { maxlength => 20 , ellipsis => "..." } ,
+ "qa_contact" => { maxlength => 30 , ellipsis => "..." , title => "QAContact" } ,
+ "qa_contact_realname" => { maxlength => 20 , ellipsis => "..." , title => "QAContact" } ,
+ "resolution" => { maxlength => 4 } ,
+ "short_desc" => { wrap => 1 } ,
+ "short_short_desc" => { maxlength => 60 , ellipsis => "..." , wrap => 1 } ,
+ "status_whiteboard" => { title => "Whiteboard" , wrap => 1 } ,
+ "keywords" => { wrap => 1 } ,
+ "flagtypes.name" => { wrap => 1 } ,
+ "component" => { maxlength => 8 , title => "Comp" } ,
+ "product" => { maxlength => 8 } ,
+ "version" => { maxlength => 5 , title => "Vers" } ,
+ "op_sys" => { maxlength => 4 } ,
+ "target_milestone" => { title => "TargetM" } ,
+ "percentage_complete" => { format_value => "%d %%" } ,
+ }
+%]
+
+[% PROCESS bug/time.html.tmpl %]
+
+[%############################################################################%]
+[%# Table Header #%]
+[%############################################################################%]
+
+[% tableheader = BLOCK %]
+ <table class="bz_buglist" cellspacing="0" cellpadding="4" width="100%">
+ <tr class="bz_buglist_header bz_first_buglist_header">
+ [% IF dotweak %]
+ <th>&nbsp;</th>
+ [% END %]
+ <th colspan="[% splitheader ? 2 : 1 %]" class="first-child">
+ <a href="buglist.cgi?
+ [% urlquerypart FILTER html %]&amp;order=
+ [% PROCESS new_order id='bug_id' %]
+ [%-#%]&amp;query_based_on=
+ [% defaultsavename OR searchname FILTER url_quote %]">ID
+ [% PROCESS order_arrow id='bug_id' ~%]
+ </a>
+ </th>
+
+ [% IF splitheader %]
+
+ [% FOREACH id = displaycolumns %]
+ [% NEXT UNLESS loop.count() % 2 == 0 %]
+ [% column = columns.$id %]
+ [% PROCESS columnheader %]
+ [% END %]
+
+ </tr><tr class="bz_buglist_header">
+ [% IF dotweak %]
+ <th>&nbsp;</th>
+ [% END %]
+ <th>&nbsp;</th>
+
+ [% FOREACH id = displaycolumns %]
+ [% NEXT IF loop.count() % 2 == 0 %]
+ [% column = columns.$id %]
+ [% PROCESS columnheader %]
+ [% END %]
+
+ [% ELSE %]
+
+ [% FOREACH id = displaycolumns %]
+ [% column = columns.$id %]
+ [% PROCESS columnheader %]
+ [% END %]
+
+ [% END %]
+
+ </tr>
+[% END %]
+
+[% BLOCK columnheader %]
+ <th colspan="[% splitheader ? 2 : 1 %]">
+ <a href="buglist.cgi?[% urlquerypart FILTER html %]&amp;order=
+ [% PROCESS new_order %]
+ [%-#%]&amp;query_based_on=
+ [% defaultsavename OR searchname FILTER url_quote %]">
+ [%- abbrev.$id.title || field_descs.$id || column.title -%]
+ [% PROCESS order_arrow ~%]
+ </a>
+ </th>
+[% END %]
+
+[% BLOCK new_order %]
+ [% desc = '' %]
+ [% IF (om = order.match("\\b$id( DESC)?")) %]
+ [% desc = ' DESC' IF NOT om.0 %]
+ [% END %]
+ [% id _ desc FILTER url_quote %]
+ [% IF id != 'bug_id' AND order %]
+ [% ',' _ order.remove("\\b$id( DESC)?(,\\s*|\$)") FILTER url_quote %]
+ [% END %]
+[% END %]
+
+[% BLOCK order_arrow %]
+ [% IF order.match("^$id DESC") %]
+ <span class="bz_sort_order_primary">&#x25BC;</span>
+ [% ELSIF order.match("^$id(,\\s*|\$)") %]
+ <span class="bz_sort_order_primary">&#x25B2;</span>
+ [% ELSIF order.match("\\b$id DESC") %]
+ <span class="bz_sort_order_secondary">&#x25BC;</span>
+ [% ELSIF order.match("\\b$id(,\\s*|\$)") %]
+ <span class="bz_sort_order_secondary">&#x25B2;</span>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Bug Table #%]
+[%############################################################################%]
+
+[% Hook.process("before_table") %]
+
+[% tableheader %]
+
+[% FOREACH bug = bugs %]
+ [% count = loop.count() %]
+
+ <tr class="bz_bugitem
+ bz_[% bug.bug_severity FILTER css_class_quote -%]
+ bz_[% bug.priority FILTER css_class_quote -%]
+ bz_[% bug.bug_status FILTER css_class_quote -%]
+ [%+ "bz_$bug.resolution" FILTER css_class_quote IF bug.resolution -%]
+ [%+ "bz_secure" IF bug.secure_mode -%]
+ [%+ "bz_secure_mode_$bug.secure_mode" FILTER css_class_quote IF bug.secure_mode -%]
+ [%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%]
+ ">
+
+ [% IF dotweak %]
+ <td class="bz_checkbox_column">
+ <input type="checkbox" name="id_[% bug.bug_id %]">
+ </td>
+ [% END %]
+ <td class="first-child bz_id_column">
+ <a name="b[% bug.bug_id %]"
+ href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>
+ <span style="display: none">[%+ '[SEC]' IF bug.secure_mode %]</span>
+ </td>
+
+ [% FOREACH column = displaycolumns %]
+ <td [% 'style="white-space: nowrap"' IF NOT abbrev.$column.wrap %]
+ class="bz_[% column FILTER css_class_quote %]_column">
+ [% IF abbrev.$column.maxlength %]
+ <span title="[%- display_value(column, bug.$column) FILTER html %]">
+ [% END %]
+ [% IF abbrev.$column.format_value %]
+ [%- bug.$column FILTER format(abbrev.$column.format_value) FILTER html -%]
+ [% ELSIF column == 'actual_time' ||
+ column == 'remaining_time' ||
+ column == 'estimated_time' %]
+ [% PROCESS formattimeunit time_unit=bug.$column %]
+ [%# Display the login name of the user if their real name is empty. %]
+ [% ELSIF column.match('_realname$') && bug.$column == '' %]
+ [% SET login_column = column.remove('_realname$') %]
+ [% bug.${login_column}.truncate(abbrev.$column.maxlength,
+ abbrev.$column.ellipsis) FILTER html %]
+
+ [% ELSE %]
+ [%- display_value(column, bug.$column).truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html -%]
+ [% END %]
+ [% IF abbrev.$column.maxlength %]
+ </span>
+ [% END %]
+ </td>
+ [% END %]
+
+ </tr>
+
+ [% IF loop.last() && time_info.time_present == 1 %]
+ [% PROCESS time_summary_line %]
+ [% END %]
+
+[% END %]
+
+</table>
+
+[% BLOCK time_summary_line %]
+ <tr class="bz_time_summary_line">
+ [% columns_to_span = 1 %] [%# bugID %]
+ [% IF dotweak %]
+ [% columns_to_span = columns_to_span + 1 %]
+ [% END %]
+ [% FOREACH column = displaycolumns %]
+ [% IF column == 'actual_time' ||
+ column == 'remaining_time' ||
+ column == 'estimated_time' ||
+ column == 'percentage_complete' %]
+ [% IF columns_to_span > 0 %]
+ <td class="bz_total bz_total_label" colspan="
+ [%- columns_to_span FILTER html %]"><b>Totals</b></td>
+ [% columns_to_span = 0 %]
+ [% END %]
+ [% IF column == 'percentage_complete' %]
+ <td class="bz_total">[% time_info.percentage_complete
+ FILTER format(abbrev.$column.format_value) FILTER html %]</td>
+ [% ELSE %]
+ <td class="bz_total">
+ [%- PROCESS formattimeunit time_unit=time_info.$column %]</td>
+ [% END %]
+ [% ELSIF columns_to_span == 0 %] [%# A column following the first total %]
+ <td class="bz_total">&nbsp;</td>
+ [% ELSE %] [%# We haven't gotten to a time column yet, keep computing span %]
+ [% columns_to_span = columns_to_span + 1 %]
+ [% END %]
+ [% END %]
+ </tr>
+[% END %]
diff --git a/template/en/default/pages/bug-writing.html.tmpl b/template/en/default/pages/bug-writing.html.tmpl
new file mode 100644
index 0000000..ec997be
--- /dev/null
+++ b/template/en/default/pages/bug-writing.html.tmpl
@@ -0,0 +1,181 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Eli Goldberg <eli@prometheus-music.com>
+ # Gervase Markham <gerv@gerv.net>
+ # Vera Horiuchi
+ # Claudius Gayle
+ # Peter Mock
+ # Chris Pratt
+ # Tom Schutter
+ # Chris Yeh
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% INCLUDE global/header.html.tmpl title = "$terms.Bug Writing Guidelines" %]
+
+ <p>Effective [% terms.bug %] reports are the most likely to be fixed.
+ These guidelines explain how to write such reports.
+
+<h3>Principles</h3>
+
+ <ul>
+ <li>Be precise</li>
+ <li>Be clear - explain it so others can reproduce the [% terms.bug %]</li>
+ <li>One [% terms.bug %] per report</li>
+ <li>No [% terms.bug %] is too trivial to report -
+ small [% terms.bugs %] may hide big [% terms.bugs %]</li>
+ <li>Clearly separate fact from speculation</li>
+ </ul>
+
+<h3>Preliminaries</h3>
+
+<ol>
+ <li>Reproduce your [% terms.bug %] using a recent build of the
+ software, to see whether it has already been fixed.
+ </li>
+
+ <li><a href="query.cgi?format=specific">Search</a>
+ [% terms.Bugzilla %], to see whether your [% terms.bug %] has
+ already been reported.</li>
+</ol>
+
+<h3>Reporting a New [% terms.Bug %]</h3>
+
+<p>If you have reproduced the [% terms.bug %] in a recent build and
+no-one else appears to have reported it, then:</p>
+
+<ol>
+ <li>Choose
+ "<a href="enter_bug.cgi">Enter a new [% terms.bug %]</a>"</li>
+ <li>Select the product in which you've found the [% terms.bug %]</li>
+ <li>Fill out the form. Here is some help understanding it:</li>
+</ol>
+
+ <blockquote>
+ <p><b>Component:</b> In which sub-part of the software does it
+ exist?<br>
+ This field is required.
+ Click the word "Component" to see a description of each
+ component. If none seems appropriate, look for a "General" component.</p>
+
+ <p><b>OS:</b> On which operating system (OS) did you find
+ it?
+ (e.g. Linux, Windows XP, Mac OS X.)<br>
+ If you know the [% terms.bug %] happens on more than one type of
+ operating system, choose <em>[% display_value("op_sys", "All") FILTER html %]</em>.
+ If your OS isn't listed, choose <em>[% display_value("op_sys", "Other") FILTER html %]</em>.</p>
+
+ <p><b>Summary:</b> How would you describe the [% terms.bug %], in
+ approximately 60 or fewer characters?<br>
+ A good summary should <b>quickly and uniquely identify [% terms.abug %]
+ report</b>. It should explain the problem, not your suggested solution.<br>
+ <ul>
+ <li>Good: "<tt>Cancelling a File Copy dialog crashes
+ File Manager</tt>"</li>
+ <li>Bad: "<tt>Software crashes</tt>"</li>
+ <li>Bad: "<tt>Browser should work with my web site</tt>"</li>
+ </ul>
+
+ <b>Description:</b>
+ The details of your problem report, including:</p>
+
+ <blockquote>
+ <p><b>Overview:</b> More detailed restatement of
+ summary.</p>
+
+ <blockquote>
+<pre>
+Drag-selecting any page crashes Mac builds in the NSGetFactory function.
+</pre>
+ </blockquote>
+
+ <p><b>Steps to Reproduce:</b> Minimized, easy-to-follow steps that
+ will trigger the [% terms.bug %]. Include any special setup steps.</p>
+
+ <blockquote>
+<pre>
+1) View any web page. (I used the default sample page,
+resource:/res/samples/test0.html)
+
+2) Drag-select the page. (Specifically, while holding down
+the mouse button, drag the mouse pointer downwards from any
+point in the browser's content region to the bottom of the
+browser's content region.)
+</pre>
+ </blockquote>
+
+ <p><b>Actual Results:</b> What the application did after performing
+ the above steps.</p>
+
+ <blockquote>
+<pre>
+The application crashed.
+</pre>
+ </blockquote>
+
+ <p><b>Expected Results:</b> What the application should have done,
+ were the [% terms.bug %] not present.</p>
+
+ <blockquote>
+<pre>
+The window should scroll downwards. Scrolled content should be selected.
+(Or, at least, the application should not crash.)
+</pre>
+ </blockquote>
+
+ <p><b>Build Date &amp; Platform:</b> Date and platform of the build
+ in which you first encountered the [% terms.bug %].</p>
+
+ <blockquote>
+<pre>
+Build 2006-08-10 on Mac OS 10.4.3
+</pre>
+ </blockquote>
+
+ <p><b>Additional Builds and Platforms:</b> Whether or not
+ the [% terms.bug %] takes place on other platforms (or browsers,
+ if applicable).</p>
+
+ <blockquote>
+<pre>
+Doesn't Occur On Build 2006-08-10 on Windows XP Home (Service Pack 2)
+</pre>
+ </blockquote>
+
+ <p><b>Additional Information:</b> Any other useful information.
+ <br><br>For crashing [% terms.bugs %]:</p>
+
+ <ul>
+ <li><b>Windows:</b> Note the type of the crash, and the module that the
+ application crashed in (e.g. access violation in apprunner.exe).</li>
+
+ <li><b>Mac OS X:</b> Attach the "Crash Reporter" log that appears
+ upon crash.
+ Only include the section directly below the crashing thread, usually
+ titled "Thread 0 Crashed". Please do not paste the entire log!</li>
+ </ul>
+ </blockquote>
+
+ <p>Double-check your report for errors and omissions, then press "Commit".
+ Your [% terms.bug %] report will now be in
+ the [% terms.Bugzilla %] database.<br>
+ </p>
+</blockquote>
+
+[% INCLUDE global/footer.html.tmpl %]
diff --git a/template/en/default/pages/fields.html.tmpl b/template/en/default/pages/fields.html.tmpl
new file mode 100644
index 0000000..282b7b6
--- /dev/null
+++ b/template/en/default/pages/fields.html.tmpl
@@ -0,0 +1,331 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Terry Weissman <terry@mozilla.org>
+ # Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+[% INCLUDE global/header.html.tmpl title = "A $terms.Bug's Life Cycle" %]
+
+<p>
+The <b>status</b> and <b>resolution</b> fields define and track the life
+cycle of [% terms.abug %].
+</p>
+
+<a name="status"></a>
+<a name="resolution"></a>
+
+<table border="1" cellpadding="4">
+ <tr align="center" valign="top">
+ <td width="50%">
+ <h1>STATUS</h1>
+ </td>
+
+ <td>
+ <h1>RESOLUTION</h1>
+ </td>
+ </tr>
+
+ <tr valign="top">
+ <td>The <b>status</b> field indicates the general health of a
+ [% terms.bug %]. Only certain status transitions are allowed.</td>
+
+ <td>The <b>resolution</b> field indicates what happened to this
+ [%+ terms.bug %].</td>
+ </tr>
+
+ <tr valign="top">
+ <td>
+ <dl>
+ <dt>
+ <b>[% display_value("bug_status", "UNCONFIRMED") FILTER html %]</b>
+ </dt>
+ <dd>
+ This [% terms.bug %] has recently been added to the database.
+ Nobody has validated that this [% terms.bug %] is true. Users
+ who have the "canconfirm" permission set may confirm
+ this [% terms.bug %], changing its state to [% display_value("bug_status", "NEW") FILTER html %]. Or, it may be
+ directly resolved and marked [% display_value("bug_status", "RESOLVED") FILTER html %].
+ </dd>
+
+ <dt>
+ <b>[% display_value("bug_status", "NEW") FILTER html %]</b>
+ </dt>
+ <dd>
+ This [% terms.bug %] has recently been added to the assignee's
+ list of [% terms.bugs %] and must be processed. [% terms.Bugs %] in
+ this state may be accepted, and become <b>[% display_value("bug_status", "ASSIGNED") FILTER html %]</b>, passed
+ on to someone else, and remain <b>[% display_value("bug_status", "NEW") FILTER html %]</b>, or resolved and marked
+ <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>.
+ </dd>
+
+ <dt>
+ <b>[% display_value("bug_status", "ASSIGNED") FILTER html %]</b>
+ </dt>
+ <dd>
+ This [% terms.bug %] is not yet resolved, but is assigned to the
+ proper person. From here [% terms.bugs %] can be given to another
+ person and become <b>[% display_value("bug_status", "NEW") FILTER html %]</b>, or
+ resolved and become <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>.
+ </dd>
+
+ <dt>
+ <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b>
+ </dt>
+ <dd>
+ This [% terms.bug %] was once resolved, but the resolution was
+ deemed incorrect. For example, a <b>[% display_value("resolution", "WORKSFORME") FILTER html %]</b> [% terms.bug %] is
+ <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b> when more information shows up and
+ the [% terms.bug %] is now reproducible. From here [% terms.bugs %] are
+ either marked <b>[% display_value("bug_status", "ASSIGNED") FILTER html %]</b> or
+ <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>.
+ </dd>
+ </dl>
+ </td>
+
+ <td>
+ <dl>
+ <dd>
+ No resolution yet. All [% terms.bugs %] which are in one of
+ these "open" states have the resolution set to blank. All
+ other [% terms.bugs %] will be marked with one of the following
+ resolutions.
+ </dd>
+ </dl>
+ </td>
+ </tr>
+
+ <tr valign="top">
+ <td>
+ <dl>
+ <dt>
+ <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>
+ </dt>
+ <dd>
+ A resolution has been taken, and it is awaiting verification by
+ QA. From here [% terms.bugs %] are either re-opened and become
+ <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b>, are marked
+ <b>[% display_value("bug_status", "VERIFIED") FILTER html %]</b>, or are closed for
+ good and marked <b>[% display_value("bug_status", "CLOSED") FILTER html %]</b>.
+ </dd>
+
+ <dt>
+ <b>[% display_value("bug_status", "VERIFIED") FILTER html %]</b>
+ </dt>
+ <dd>
+ QA has looked at the [% terms.bug %] and the resolution and
+ agrees that the appropriate resolution has been taken. [% terms.Bugs %] remain
+ in this state until the product they were reported
+ against actually ships, at which point they become
+ <b>[% display_value("bug_status", "CLOSED") FILTER html %]</b>.
+ </dd>
+
+ <dt>
+ <b>[% display_value("bug_status", "CLOSED") FILTER html %]</b>
+ </dt>
+ <dd>
+ The [% terms.bug %] is considered dead, the resolution is correct.
+ Any zombie [% terms.bugs %] who choose to walk the earth again must
+ do so by becoming <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b>.
+ </dd>
+ </dl>
+ </td>
+
+ <td>
+ <dl>
+ <dt>
+ <b>[% display_value("resolution", "FIXED") FILTER html %]</b>
+ </dt>
+ <dd>
+ A fix for this [% terms.bug %] is checked into the tree and
+ tested.
+ </dd>
+
+ <dt>
+ <b>[% display_value("resolution", "INVALID") FILTER html %]</b>
+ </dt>
+ <dd>
+ The problem described is not [% terms.abug %].
+ </dd>
+
+ <dt>
+ <b>[% display_value("resolution", "WONTFIX") FILTER html %]</b>
+ </dt>
+ <dd>
+ The problem described is [% terms.abug %] which will never be
+ fixed.
+ </dd>
+
+ <dt>
+ <b>[% display_value("resolution", "DUPLICATE") FILTER html %]</b>
+ </dt>
+ <dd>
+ The problem is a duplicate of an existing [% terms.bug %].
+ Marking [% terms.abug %] duplicate requires the [% terms.bug %]#
+ of the duplicating [% terms.bug %] and will at least put
+ that [% terms.bug %] number in the description field.
+ </dd>
+
+ <dt>
+ <b>[% display_value("resolution", "WORKSFORME") FILTER html %]</b>
+ </dt>
+ <dd>
+ All attempts at reproducing this [% terms.bug %] were futile,
+ and reading the code produces no clues as to why the described
+ behavior would occur. If more information appears later,
+ the [% terms.bug %] can be reopened.
+ </dd>
+
+ <dt>
+ <b>[% display_value("resolution", "MOVED") FILTER html %]</b>
+ </dt>
+ <dd>
+ The problem was specific to a related product
+ whose [% terms.bugs %] are tracked in
+ another [% terms.bug %] database.
+ The [% terms.bug %] has been moved to that database.
+ </dd>
+ </dl>
+ </td>
+ </tr>
+</table>
+
+<h2><a name="importance">Importance</a></h2>
+The importance of [% terms.abug %] is described as the combination of
+its <a href="#priority">priority</a> and <a href="#bug_severity">severity</a>,
+as described below.
+
+<h2><a name="priority">Priority</a></h2>
+This field describes the importance and order in which [% terms.abug %]
+should be fixed compared to other [% terms.bugs %]. This field is utilized
+by the programmers/engineers to prioritize their work to be done.
+
+<h2><a name="bug_severity">Severity</a></h2>
+This field describes the impact of [% terms.abug %].
+
+<table>
+ <tr>
+ <th>[% display_value("bug_severity", "blocker") FILTER html %]</th>
+
+ <td>Blocks development and/or testing work</td>
+ </tr>
+
+ <tr>
+ <th>[% display_value("bug_severity", "critical") FILTER html %]</th>
+
+ <td>crashes, loss of data, severe memory leak</td>
+ </tr>
+
+ <tr>
+ <th>[% display_value("bug_severity", "major") FILTER html %]</th>
+
+ <td>major loss of function</td>
+ </tr>
+
+ <tr>
+ <th>[% display_value("bug_severity", "normal") FILTER html %]</th>
+
+ <td>regular issue, some loss of functionality under specific circumstances</td>
+ </tr>
+
+
+ <tr>
+ <th>[% display_value("bug_severity", "minor") FILTER html %]</th>
+
+ <td>minor loss of function, or other problem where easy
+ workaround is present</td>
+ </tr>
+
+ <tr>
+ <th>[% display_value("bug_severity", "trivial") FILTER html %]</th>
+
+ <td>cosmetic problem like misspelled words or misaligned
+ text</td>
+ </tr>
+
+ <tr>
+ <th>[% display_value("bug_severity", "enhancement") FILTER html %]</th>
+
+ <td>Request for enhancement</td>
+</table>
+
+<h2><a name="rep_platform">Platform</a></h2>
+This is the hardware platform against which the [% terms.bug %] was
+reported. Legal platforms include:
+
+<ul>
+ <li>[% display_value("rep_platform", "All") FILTER html %] (happens on all platforms; cross-platform [% terms.bug %])</li>
+
+ <li>[% display_value("rep_platform", "Macintosh") FILTER html %]</li>
+
+ <li>[% display_value("rep_platform", "PC") FILTER html %]</li>
+</ul>
+<b>Note:</b> When searching, selecting the option
+<em>[% display_value("rep_platform", "All") FILTER html %]</em> does not
+select [% terms.bugs %]
+assigned against any platform. It merely selects [% terms.bugs %] that are
+marked as occurring on all platforms, i.e. are designated
+<em>[% display_value("rep_platform", "All") FILTER html %]</em>.
+
+<h2><a name="op_sys">Operating System</a></h2>
+This is the operating system against which the [% terms.bug %] was
+reported. Legal operating systems include:
+
+<ul>
+ <li>[% display_value("op_sys", "All") FILTER html %] (happens on all operating systems; cross-platform
+ [% terms.bug %])</li>
+
+ <li>Windows</li>
+
+ <li>Mac OS</li>
+
+ <li>Linux</li>
+</ul>
+Sometimes the operating system implies the platform, but not
+always. For example, Linux can run on PC and Macintosh and
+others.
+
+<h2><a name="assigned_to">Assigned To</a></h2>
+
+<p>
+This is the person in charge of resolving the [% terms.bug %]. Every time
+this field changes, the status changes to <b>[% display_value("bug_status", "NEW") FILTER html %]</b> to make it
+easy to see which new [% terms.bugs %] have appeared on a person's list.</p>
+
+<p>
+The default status for queries is set to [% display_value("bug_status", "NEW") FILTER html %],
+[%+ display_value("bug_status", "ASSIGNED") FILTER html %] and [% display_value("bug_status", "REOPENED") FILTER html %].
+When searching for [% terms.bugs %] that have been resolved or
+verified, remember to set the status field appropriately.
+</p>
+
+[% IF Param("use_see_also") %]
+ <h2><a name="see_also"></a>See Also</h2>
+
+ <p>This allows you to refer to [% terms.bugs %] in other installations.
+ You can enter a URL to a [%+ terms.bug %] in the "Add [% terms.Bug %] URLs"
+ field to note that that [% terms.bug %] is related to this one. You can
+ enter multiple URLs at once by separating them with a comma.</p>
+
+ <p>You should normally use this field to refer to [% terms.bugs %] in
+ <em>other</em> installations. For [% terms.bugs %] in this
+ installation, it is better to use the "Depends On" and "Blocks"
+ fields.</p>
+[% END %]
+
+[% INCLUDE global/footer.html.tmpl %]
diff --git a/template/en/default/pages/linked.html.tmpl b/template/en/default/pages/linked.html.tmpl
new file mode 100644
index 0000000..52b1735
--- /dev/null
+++ b/template/en/default/pages/linked.html.tmpl
@@ -0,0 +1,55 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Stefan Seifert <nine@detonation.org>
+ # Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% INCLUDE global/header.html.tmpl title = "Your Linkified Text" %]
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+<p>
+ Copy and paste the text below:
+</p>
+
+<hr>
+
+<p>
+<pre class="bz_comment_text">
+[%- cgi.param("text") FILTER wrap_comment FILTER quoteUrls FILTER html -%]
+</pre>
+</p>
+
+<hr>
+
+<p>
+ If you place it in <tt>&lt;pre&gt;</tt> tags,
+ the text will end up looking like this:
+</p>
+
+<hr>
+
+<p>
+<pre class="bz_comment_text">
+[%- cgi.param("text") FILTER wrap_comment FILTER quoteUrls -%]
+</pre>
+</p>
+
+<hr>
+
+[% INCLUDE global/footer.html.tmpl %]
diff --git a/template/en/default/pages/linkify.html.tmpl b/template/en/default/pages/linkify.html.tmpl
new file mode 100644
index 0000000..b936e86
--- /dev/null
+++ b/template/en/default/pages/linkify.html.tmpl
@@ -0,0 +1,42 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Stefan Seifert <nine@detonation.org>
+ # Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% INCLUDE global/header.html.tmpl title = "Linkify Text" %]
+
+<p>
+ If you enter some text, this form will return it marked up like a
+ standard [% terms.Bugzilla %] comment. That is, valid [% terms.bug %] numbers,
+ URLs, email addresses and so on will be replaced with appropriate HTML links.
+</p>
+
+<form action="page.cgi" method="post">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'text'
+ minrows = 20
+ cols = constants.COMMENT_COLS
+ %]
+ <br>
+ <input type="hidden" name="id" value="linked.html">
+ <input type="submit" id="linkify" value="Linkify">
+</form>
+
+[% INCLUDE global/footer.html.tmpl %]
diff --git a/template/en/default/pages/quicksearch.html.tmpl b/template/en/default/pages/quicksearch.html.tmpl
new file mode 100644
index 0000000..1f2d21b
--- /dev/null
+++ b/template/en/default/pages/quicksearch.html.tmpl
@@ -0,0 +1,274 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Everything Solved, Inc.
+ # Portions created by the Initial Developer are Copyright (C) 2009
+ # the Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% INCLUDE global/header.html.tmpl
+ title = "$terms.Bugzilla QuickSearch",
+ style_urls = ['skins/standard/page.css']
+ onload = 'document.forms[\'f\'].quicksearch.focus()'
+ %]
+
+[% USE Bugzilla %]
+
+<p>Type in one or more words (or pieces of words) to search for:</p>
+
+<form name="f" action="buglist.cgi" method="get"
+ onsubmit="if (this.quicksearch.value == '')
+ { alert('Please enter one or more search terms first.');
+ return false; } return true;">
+ <input type="text" size="40" name="quicksearch">
+ <input type="submit" value="Search" id="find">
+</form>
+
+<h2>The Basics</h2>
+
+<ul class="qs_help">
+ <li>If you just put a word or series of words in the search box,
+ [%+ terms.Bugzilla %] will search the
+ [%+ field_descs.product FILTER html %],
+ [%+ field_descs.component FILTER html %],
+ [%+ IF use_keywords %][%+ field_descs.keywords FILTER html %],[% END %]
+ [%+ IF Param('usebugaliases') %][% field_descs.alias FILTER html %],[% END %]
+ [%+ field_descs.short_desc FILTER html %],
+ [%+ IF Param('usestatuswhiteboard') %][% field_descs.status_whiteboard FILTER html %],[% END %]
+ and [% field_descs.longdesc FILTER html %] fields for your word or words.</li>
+
+ <li>Typing just a <strong>number</strong> in the search box will take
+ you directly to the [% terms.bug %] with that ID.
+ [% IF Param('usebugaliases') %]
+ Also, just typing the <strong>alias</strong> of [% terms.abug %]
+ will take you to that [% terms.bug %].
+ [% END %]
+ </li>
+
+ <li>Adding more terms <strong>narrows down</strong> the search, it does not
+ expand it. (In other words, [% terms.Bugzilla %] searches for
+ [%+ terms.bugs %] that match <em>all</em> your criteria, not
+ [%+ terms.bugs %] that match <em>any</em> of your criteria.)</li>
+
+ <li>Searching is <strong>case-insensitive</strong>. So <kbd>table</kbd>,
+ <kbd>Table</kbd>, and <kbd>TABLE</kbd> are all the same.</li>
+
+ <li>[% terms.Bugzilla %] does not just search for the exact word you put in,
+ but also for any word that <strong>contains</strong> that word.
+ So, for example, searching for "cat" would also find [% terms.bugs %]
+ that contain it as part of other words&mdash;for example, [% terms.abug %]
+ mentioning "<strong>cat</strong>ch" or "certifi<strong>cat</strong>e". It
+ will not find partial words in the [% field_descs.longdesc FILTER html %]
+ or [% field_descs.keywords FILTER html %] fields,
+ though&mdash;only full words are matched, there.</li>
+
+ <li>By default, only <strong>open</strong> [% terms.bugs %] are
+ searched. If you want to know how to also search closed [% terms.bugs %],
+ see the <a href="#shortcuts">Advanced Shortcuts</a> section.</li>
+
+ <li>If you want to search <strong>specific fields</strong>, you do it like
+ <kbd>field:value</kbd>, where <kbd>field</kbd> is one of the
+ <a href="#fields">field names</a> lower down in this
+ document and <kbd>value</kbd> is the value you want to search for
+ in that field. If you put commas in the <kbd>value</kbd>, then it is
+ interpreted as a list of values, and [% terms.bugs %] that match
+ <em>any</em> of those values will be searched for.</li>
+</ul>
+
+<p>You may also want to read up on the <a href="#advanced">Advanced
+ Features</a>.</p>
+
+<h2><a name="fields"></a>Fields You Can Search On</h2>
+
+<p>You can specify any of these fields like <kbd>field:value</kbd>
+ in the search box, to search on them. You can also abbreviate
+ the field name, as long as your abbreviation matches only one field name.
+ So, for example, searching on <kbd>stat:NEW</kbd> will find all
+ [%+ terms.bugs %] in the <kbd>NEW</kbd> status. Some fields have
+ multiple names, and you can use any of those names to search for them.</p>
+
+[% IF Bugzilla.active_custom_fields.size %]
+ [% SET first_field = Bugzilla.active_custom_fields.0 %]
+ <p>For custom fields, they can be used and abbreviated
+ based on the part of their name <em>after</em> the <kbd>cf_</kbd>
+ if you'd like, in addition to their standard name starting with
+ <kbd>cf_</kbd>. So for example,
+ <kbd>[% first_field.name FILTER html %]</kbd> can be
+ referred to as
+ <kbd>[% first_field.name.replace('^cf_') FILTER html %]</kbd>,
+ also. However, if this causes a conflict between the standard
+ [%+ terms.Bugzilla %] field names and the custom field names, the
+ standard field names always take precedence.</p>
+[% END %]
+
+[% SET field_table = {} %]
+[% FOREACH field = quicksearch_field_names.keys %]
+ [% description = field_descs.$field %]
+ [% field_table.$description = quicksearch_field_names.${field} %]
+[% END %]
+
+
+<table cellspacing="0" cellpadding="0" border="0" class="qs_fields">
+ <thead>
+ <tr>
+ <th class="field_name">Field</th>
+ <th class="field_nickname">Field Name(s) For Search</th>
+ </tr>
+ </thead>
+ <tbody>
+ [% FOREACH desc = field_table.keys.sort %]
+ <tr>
+ <td class="field_name">[% desc FILTER html %]</td>
+ <td class="field_nickname">
+ [% FOREACH nickname = field_table.$desc %]
+ <kbd>[% nickname FILTER html %]</kbd>
+ [% ",&nbsp; " UNLESS loop.last %]
+ [% END %]
+ </tr>
+ [% END %]
+ </tbody>
+</table>
+
+<h2><a name="advanced"></a>Advanced Features</h2>
+
+<ul class="qs_help">
+ <li>If you want to search for a <strong>phrase</strong> or something that
+ contains spaces, you can put it in quotes, like:
+ <kbd>"this is a phrase"</kbd>. You can also use quotes to search for
+ characters that would otherwise be interpreted specially by quicksearch.
+ For example, <kbd>"this|thing"</kbd> would search for the literal phrase
+ <em>this|thing</em>.</li>
+
+ <li>You can use <strong>AND</strong>, <strong>NOT</strong>,
+ and <strong>OR</strong> in searches.
+
+ You can also use <kbd>-</kbd> to mean "NOT", and <kbd>|</kbd> to mean "OR".
+ There is no special character for "AND", because by default any search
+ terms that are separated by a space are joined by an "AND".
+ Examples:
+ <ul>
+ <li>
+ <strong>NOT</strong>:<br>
+ Use <kbd><strong>-</strong><em>summary:foo</em></kbd> to exclude
+ [%+ terms.bugs %] with <kbd>foo</kbd> in the summary.<br>
+ <kbd><em>NOT summary:foo</em></kbd> would have the same effect.
+ </li>
+ <li>
+ <strong>AND</strong>:<br>
+ <kbd><em>foo bar</em></kbd> searches for [% terms.bugs %] that contains
+ both <kbd>foo</kbd> and <kbd>bar</kbd>.<br>
+ <kbd><em>foo AND bar</em></kbd> would have the same effect.
+ </li>
+ <li>
+ <strong>OR</strong>:<br>
+ <kbd><em>foo<strong>|</strong>bar</em></kbd> would search
+ for [% terms.bugs %] that contain <kbd>foo</kbd> OR <kbd>bar</kbd>.<br>
+ <kbd><em>foo OR bar</em></kbd> would have the same effect.<br>
+ </li>
+ </ul>
+
+ <p>OR has higher precedence than AND; AND is the top level operation.
+ For example:</p>
+ <p>Searching for <em><kbd>url|location bar|field -focus</kbd></em> means
+ (<kbd>url</kbd> OR <kbd>location</kbd>) AND (<kbd>bar</kbd> OR
+ <kbd>field</kbd>) AND (NOT <kbd>focus</kbd>)</p>
+ </li>
+</ul>
+
+<h2><a name="shortcuts"></a>Advanced Shortcuts</h2>
+
+<p>In addition to using <a href="#fields">field names</a> to search
+ specific fields, there are certain characters or words that you can
+ use as a "shortcut" for searching certain fields:</p>
+
+<table cellspacing="0" cellpadding="0" border="0" class="qs_fields">
+ <thead>
+ <tr>
+ <th class="field_name">Field</th>
+ <th class="field_nickname">Shortcut(s)</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td class="field_name">[% field_descs.bug_status FILTER html %]</td>
+ <td class="field_nickname">
+ Make the <strong>first word</strong> of your search the name of any
+ status, or even an abbreviation of any status, and [% terms.bugs %]
+ in that status will be searched. <strong><kbd>ALL</kbd></strong>
+ is a special shortcut that means "all statuses".
+ <strong><kbd>OPEN</kbd></strong> is a special shortcut that means
+ "all open statuses".
+ </td>
+ </tr>
+ <tr>
+ <td class="field_name">[% field_descs.resolution FILTER html %]</td>
+ <td class="field_nickname">
+ Make the <strong>first word</strong> of your search the name of any
+ resolution, or even an abbreviation of any resolution, and
+ [%+ terms.bugs %] with that resolution will be searched. For example,
+ making <kbd>FIX</kbd> the first word of your search will find all
+ [%+ terms.bugs %] with a resolution of <kbd>FIXED</kbd> .
+ </tr>
+ <tr>
+ <td class="field_name">[% field_descs.priority FILTER html %]</td>
+ <td class="field_nickname">"<strong>P1</strong>" (as a word anywhere in
+ the search) means "find [% terms.bugs %] with the highest priority.
+ "P2" means the second-highest priority, and so on.
+ <p>Searching for "<strong>P1-P3</strong>" will find [% terms.bugs %] in
+ any of the three highest priorities, and so on.</p>
+ </td>
+ </tr>
+ <tr>
+ <td class="field_name">[% field_descs.assigned_to FILTER html %]</td>
+ <td class="field_nickname"><strong>@</strong><em>value</em></td>
+ </tr>
+ <tr>
+ <td class="field_name">[% field_descs.product FILTER html %] or
+ [%+ field_descs.component FILTER html %]</td>
+ <td class="field_nickname"><strong>:</strong><em>value</em></td>
+ </tr>
+ [% IF use_keywords %]
+ <tr>
+ <td class="field_name">[% field_descs.keywords FILTER html %]</td>
+ <td class="field_nickname"><strong>!</strong><em>value</em></td>
+ </tr>
+ [% END %]
+ <tr>
+ [% SET key = "flagtypes.name" %]
+ <td class="field_name">[% field_descs.$key FILTER html %]</td>
+ <td class="field_nickname">
+ <em>flag</em><strong>?</strong><em>requestee</em>
+ </td>
+ </tr>
+ <tr>
+ <td class="field_name">[% field_descs.longdesc FILTER html %]
+ or [% field_descs.short_desc FILTER html %]</td>
+ <td class="field_nickname">
+ <strong>#</strong><em>value</em>
+ </td>
+ </tr>
+ [% IF Param('usestatuswhiteboard') %]
+ <tr>
+ <td class="field_name">[% field_descs.short_desc FILTER html %]
+ or [% field_descs.status_whiteboard FILTER html %]</td>
+ <td class="field_nickname"><strong>[</strong><em>value</em></td>
+ </tr>
+ [% END %]
+ </tbody>
+</table>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/pages/release-notes.html.tmpl b/template/en/default/pages/release-notes.html.tmpl
new file mode 100644
index 0000000..92357df
--- /dev/null
+++ b/template/en/default/pages/release-notes.html.tmpl
@@ -0,0 +1,3240 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Everything Solved.
+ # Portions created by Everything Solved are Copyright (C) 2006
+ # Everything Solved. All Rights Reserved.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% INCLUDE global/header.html.tmpl
+ title = "$terms.Bugzilla 3.6 Release Notes"
+ style_urls = ['skins/standard/page.css']
+%]
+
+<h2>Table of Contents</h2>
+
+<ul class="bz_toc">
+ <li><a href="#v36_introduction">Introduction</a></li>
+ <li><a href="#v36_point">Updates in this 3.6.x Release</a></li>
+ <li><a href="#v36_req">Minimum Requirements</a></li>
+ <li><a href="#v36_feat">New Features and Improvements</a></li>
+ <li><a href="#v36_issues">Outstanding Issues</a></li>
+ <li><a href="#v36_upgrading">Notes On Upgrading From a Previous Version</a></li>
+ <li><a href="#v36_code_changes">Code Changes Which May Affect
+ Customizations</a></li>
+ <li><a href="#v36_previous">Release Notes for Previous Versions</a></li>
+</ul>
+
+<h2 id="v36_introduction">Introduction</h2>
+
+<p>Welcome to [% terms.Bugzilla %] 3.6! The focus of the 3.6 release is
+ on improving usability and "polishing up" all our features (by adding
+ some pieces that were "missing" or always wanted), although we
+ also have a few great new features for you, as well!</p>
+
+<p>If you're upgrading, make sure to read <a href="#v36_upgrading">Notes
+ On Upgrading From a Previous Version</a>. If you are upgrading from a release
+ before 3.4, make sure to read the release notes for all the
+ <a href="#v36_previous">previous versions</a> in between your version
+ and this one, <strong>particularly the Upgrading section of each
+ version's release notes</strong>.</p>
+
+<p>We would like to thank <a href="http://www.canonical.com/">Canonical
+ Ltd.</a>, <a href="http://www.itasoftware.com/">ITA Software</a>,
+ the <a href="http://www.ibm.com/linux/ltc/">IBM Linux Technology Center</a>,
+ <a href="http://www.redhat.com/">Red Hat</a>, and
+ <a href="http://www.novell.com/">Novell</a> for funding the development
+ of various features and improvements in this release of
+ [%+ terms.Bugzilla %].</p>
+
+<h2 id="v36_point">Updates in this 3.6.x Release</h2>
+
+<h3>3.6.2</h3>
+
+<p>This release fixes various security issues. See the
+ <a href="http://www.bugzilla.org/security/3.2.7/">Security Advisory</a>
+ for details.</p>
+
+<p>In addition, the following important fixes/changes have been made in
+ this release:</p>
+
+<ul>
+ <li>[% terms.Bugzilla %] installations running on older versions of IIS
+ will no longer experience the "Undef to trick_taint" errors that would
+ sometimes occur.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=521416">[% terms.Bug %] 521416</a>)
+ </li>
+ <li>Email notifications where missing the dates that comments were made.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=578003">[% terms.Bug %] 578003</a>)
+ </li>
+ <li>Putting a phrase in quotes in the Quicksearch box now works properly,
+ again.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=578494">[% terms.Bug %] 578494</a>
+ and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=553884">[% terms.Bug %] 553884</a>)
+ </li>
+ <li>Quicksearch was usually (incorrectly) being limited to 200 results.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=581622">[% terms.Bug %] 581622</a>)
+ </li>
+ <li>On Windows, <kbd>install-module.pl</kbd> can now properly install
+ DateTime and certain other Perl modules that didn't install properly
+ before.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=576105">[% terms.Bug %] 576105</a>)
+ </li>
+ <li>Searching "keywords" for "contains none of the words" or "does not
+ match regular expression" now works properly.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=562014">[% terms.Bug %] 562014</a>)
+ </li>
+ <li>Doing <kbd>collectstats.pl --regenerate</kbd> now works on installations
+ using PostgreSQL.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=577058">[% terms.Bug %] 577058</a>)
+ </li>
+ <li>The "Field Values" administrative control panel was sometimes denying
+ admins the ability to delete field values when there was no reason
+ to deny the deletion.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=577054">[% terms.Bug %] 577054</a>)
+ </li>
+ <li>Eliminate the "uninitialized value" warnings that would happen when
+ editing a product's components.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=576911">[% terms.Bug %] 576911</a>)
+ </li>
+ <li>The updating of bugs_fulltext that happens during
+ <kbd>checksetup.pl</kbd> for upgrades to 3.6 should now be MUCH faster.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=577754">[% terms.Bug %] 577754</a>)
+ </li>
+ <li><kbd>email_in.pl</kbd> was not allowing the setting of time-tracking
+ fields via inbound emails.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=583622">[% terms.Bug %] 583622</a>)
+ </li>
+</ul>
+
+<h3>3.6.1</h3>
+
+<p>This release fixes two security issues. See the
+ <a href="http://www.bugzilla.org/security/3.2.6/">Security Advisory</a>
+ for details.</p>
+
+<p>In addition, the following important fixes/changes have been made in
+ this release:</p>
+
+<ul>
+ <li>Using the "Change Columns" page would sometimes result in a
+ plain-text page instead of HTML.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=376044">[% terms.Bug %] 376044</a>)
+ </li>
+ <li>Extensions that have only templates and no code are now working.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=562551">[% terms.Bug %] 562551</a>)
+ </li>
+ <li><kbd>install-module.pl</kbd> has been fixed so that it installs
+ modules properly on both new and old versions of Perl.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=560318">[% terms.Bug %] 560318</a>
+ and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=560330">[% terms.Bug %] 560330</a>)
+ </li>
+ <li>It is now possible to upgrade from 3.4 to 3.6 when using Oracle.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=561379">[% terms.Bug %] 561379</a>)
+ </li>
+ <li>Editing a field value's name (using the Field Values admin control
+ panel) wasn't working if the value was set as the default for that
+ field.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=561296">[% terms.Bug %] 561296</a>)
+ </li>
+ <li>If you had the <kbd>noresolveonopenblockers</kbd> parameter set,
+ [%+ terms.bugs %] couldn't be edited at all if they were marked FIXED
+ and had any open blockers. (The parameter is only supposed to prevent
+ <em>changing</em> [% terms.bugs %] to FIXED, not modifying already-FIXED
+ [%+ terms.bugs %].)
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=565314">[% terms.Bug %] 565314</a>)
+ </li>
+ <li>Some minor issues with Perl 5.12 were fixed (mostly warnings that Perl
+ 5.12 was throwing). [% terms.Bugzilla %] now supports Perl 5.12.</li>
+</ul>
+
+<h2 id="v36_req">Minimum Requirements</h2>
+
+<p>Any requirements that are new since 3.4.5 will look like
+ <span class="req_new">this</span>.</p>
+
+<ul>
+ <li><a href="#v36_req_perl">Perl</a></li>
+ <li><a href="#v36_req_mysql">For MySQL Users</a></li>
+ <li><a href="#v36_req_pg">For PostgreSQL Users</a></li>
+ <li><a href="#v36_req_oracle">For Oracle Users</a></li>
+ <li><a href="#v36_req_modules">Required Perl Modules</a></li>
+ <li><a href="#v36_req_optional_mod">Optional Perl Modules</a></li>
+</ul>
+
+
+<h3 id="v36_req_perl">Perl</h3>
+
+<p>Perl v5.8.1</p>
+
+[% INCLUDE db_req db='mysql' %]
+
+[% INCLUDE db_req db='pg' %]
+
+[% INCLUDE db_req db='oracle' %]
+
+<h3 id="v36_req_modules">Required Perl Modules</h3>
+
+[% INCLUDE req_table reqs = REQUIRED_MODULES
+ new = [] updated = [] %]
+
+<h3 id="v36_req_optional_mod">Optional Perl Modules</h3>
+
+<p>The following perl modules, if installed, enable various
+ features of [% terms.Bugzilla %]:</p>
+
+[% INCLUDE req_table reqs = OPTIONAL_MODULES
+ new = ['JSON-RPC', 'Test-Taint']
+ updated = ['Chart']
+ include_feature = 1 %]
+
+<h2 id="v36_feat">New Features and Improvements</h2>
+
+<ul>
+ <li><a href="#v36_feat_usability">General Usability Improvements</a></li>
+ <li><a href="#v36_feat_extensions">New Extensions System</a></li>
+ <li><a href="#v36_feat_qs">Improved Quicksearch</a></li>
+ <li><a href="#v36_feat_browse">Simple "Browse" Interface</a></li>
+ <li><a href="#v36_feat_suexec">SUExec Support</a></li>
+ <li><a href="#v36_feat_mpwindows">Experimental mod_perl Support on Windows</a></li>
+ <li><a href="#v36_email_attachments">Send Attachments by Email</a></li>
+ <li><a href="#v36_feat_jsonrpc">JSON-RPC Interface</a></li>
+ <li><a href="#v36_feat_migrate">Migration From Other [% terms.Bug %]-Trackers</a></li>
+ <li><a href="#v36_feat_other">Other Enhancements and Changes</a></li>
+</ul>
+
+<h3 id="v36_feat_usability">General Usability Improvements</h3>
+
+<p>A <a href="https://wiki.mozilla.org/Bugzilla:CMU_HCI_Research_2008">scientific
+ usability study</a> was done on [% terms.Bugzilla %] by researchers
+ from Carnegie-Mellon University. As a result of this study,
+ <a href="https://bugzilla.mozilla.org/showdependencytree.cgi?id=490786&amp;hide_resolved=0">several
+ usability issues</a> were prioritized to be fixed, based on specific data
+ from the study.</p>
+
+<p>As a result, you will see many small improvements in [% terms.Bugzilla %]'s
+ usability, such as using Javascript to validate certain forms before
+ they are submitted, standardizing the words that we use in the user interface,
+ being clearer about what [% terms.Bugzilla %] needs from the user,
+ and other changes, all of which are also listed individually in this New
+ Features section.</p>
+
+<p>Work continues on improving usability for the next release of
+ [%+ terms.Bugzilla %], but the results of the research have already
+ had an impact on this 3.6 release.</p>
+
+<h3 id="v36_feat_extensions">New Extensions System</h3>
+
+<p>[% terms.Bugzilla %] has a brand-new Extensions system. The system is
+ consistent, fast, and
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Extension.html">fully
+ documented</a>. It makes it possible to easily extend [% terms.Bugzilla %]'s
+ code and user interface to add new features or change existing features.
+ There's even
+ <a href="[% docs_urlbase FILTER html %]api/extensions/create.html">a
+ script</a> that will create the basic layout of an extension for you, to
+ help you get started. For more information about the new system, see the
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Extension.html">Extensions
+ documentation</a>.</p>
+
+<p>If you had written any extensions using [% terms.Bugzilla %]'s previous
+ extensions system, there is
+ <a href="[% docs_urlbase FILTER html %]api/contrib/extension-convert.html">a
+ script to help convert old extensions into the new format</a>.</p>
+
+<h3 id="v36_feat_qs">Improved Quicksearch</h3>
+
+<p>The "quicksearch" box that appears on the front page of
+ [%+ terms.Bugzilla %] and in the header/footer of every page
+ is now simplified and made more powerful. There is a
+ <kbd>[?]</kbd> link next to the box that will take you to
+ the simplified <a href="page.cgi?id=quicksearch.html">Quicksearch Help</a>,
+ which describes every single feature of the system in a simple layout,
+ including new features such as the ability to use partial field names
+ when searching.</p>
+
+<p>Quicksearch should also be much faster than it was before, particularly
+ on large installations.</p>
+
+<p>Note that in order to implement the new quicksearch, certain old
+ and rarely-used features had to be removed:
+
+<ul>
+ <li><b>+</b> as a prefix to mean "search additional resolutions", and
+ <b>+</b> as a prefix to mean "search just the summary". You can
+ instead use <kbd>summary:</kbd> to explicitly search summaries.</li>
+ <li>Searching the Severity field if you type something that matches
+ the first few characters of a severity. You can explicitly search
+ the Severity field if you want to find [% terms.bugs %] by severity.</li>
+ <li>Searching the Priority field if you typed something that exactly
+ matched the name of a priority. You can explicitly search the
+ Priority field if you want to find [% terms.bugs %] by priority.</li>
+ <li>Searching the Platform and OS fields if you typed in one of a
+ certain hard-coded list of strings (like "pc", "windows", etc.).
+ You can explicitly search these fields, instead, if you want to
+ find [% terms.bugs %] with a specific Platform or OS set.</li>
+</ul>
+
+<h3 id="v36_feat_browse">Simple "Browse" Interface</h3>
+
+<p>There is now a "Browse" link in the header of each [% terms.Bugzilla %]
+ page that presents a very basic interface that allows users to simply
+ browse through all open [% terms.bugs %] in particular components.</p>
+
+<h3 id="v36_feat_suexec">SUExec Support</h3>
+
+<p>[% terms.Bugzilla %] can now be run in Apache's "SUExec" mode,
+ which is what control panel software like cPanel and Plesk use
+ (so [% terms.Bugzilla %] should now be much easier to install
+ on shared hosting). SUExec support shows up as an option
+ in the <kbd>localconfig</kbd> file during installation.</p>
+
+<h3 id="v36_feat_mpwindows">Experimental mod_perl Support on Windows</h3>
+
+<p>There is now experimental support for running [% terms.Bugzilla %]
+ under mod_perl on Windows, for a significant performance enhancement
+ (in exchange for using more memory).</p>
+
+<h3 id="v36_email_attachments">Send Attachments by Email</h3>
+
+<p>The <a href="[% docs_urlbase FILTER html %]api/email_in.html">email_in</a>
+ script now supports attaching multiple attachments to [% terms.abug %]
+ by email, both when filing and when updating [% terms.abug %].</p>
+
+<h3 id="v36_feat_jsonrpc">JSON-RPC Interface</h3>
+
+<p>[% terms.Bugzilla %] now has support for the
+ <a href="http://json-rpc.org/">JSON-RPC</a> WebServices protocol via
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Server/JSONRPC.html">jsonrpc.cgi</a>.
+ The JSON-RPC interface is experimental in this release--if you want any
+ fundamental changes in how it works,
+ <a href="http://www.bugzilla.org/developers/reporting_bugs.html">let us
+ know</a>, for the next release of [% terms.Bugzilla %].</p>
+
+<h3 id="v36_feat_migrate">Migration From Other [% terms.Bug %]-Trackers</h3>
+
+<p>[% terms.Bugzilla %] 3.6 comes with a new script,
+ <a href="[% docs_urlbase FILTER html %]api/migrate.html">migrate.pl</a>,
+ which allows migration from other [% terms.bug %]-tracking systems.
+ Among the various features of the migration system are:</p>
+
+<ul>
+ <li>It is non-destructive--you can migrate into an existing
+ [%+ terms.Bugzilla %] installation without destroying any data
+ in the installation.</li>
+ <li>It has a "dry-run" mode so you can test your migration
+ before actually running it.</li>
+ <li>It is relatively easy to write new migrators for new systems,
+ if you know Perl. The basic migration framework does most of the work
+ for you, you just have to provide it with the data from your
+ [%+ terms.bug %]-tracker. See the
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Migrate.html">Bugzilla::Migrate</a>
+ documentation and see our current migrator,
+ <kbd>Bugzilla/Migrate/GNATS.pm</kbd> for information on how to make your
+ own migrator.</li>
+</ul>
+
+<p>The first migrator that has been implemented is for the GNATS
+ [%+ terms.bug %]-tracking system. We'd love to see migrators for
+ other systems! If you want to contribute a new migrator, see our
+ <a href="http://wiki.mozilla.org/Bugzilla:Developers">development
+ process</a> for details on how to get code into [% terms.Bugzilla %].</p>
+
+<p>Thanks to <a href="http://lambdares.com/">Lambda Research</a> for
+ funding the initial development of this feature.</p>
+
+<h3 id="v36_feat_other">Other Enhancements and Changes</h3>
+
+<h4>Enhancements for Users</h4>
+
+<ul>
+ <li><b>[% terms.Bug %] Filing:</b> When filing [% terms.abug %],
+ [%+ terms.Bugzilla %] now visually indicates which fields are
+ mandatory.</li>
+ <li><b>[% terms.Bug %] Filing:</b> "Bookmarkable templates" now
+ support the "alias" and "estimated hours" fields.</li>
+
+ <li><b>[% terms.Bug %] Editing:</b> In previous versions of
+ [%+ terms.Bugzilla %], if you added a private comment to [% terms.abug %],
+ then <em>none</em> of the changes that you made at that time were
+ sent to users who couldn't see the private comment. Now, for users
+ who can't see private comments, public changes are sent, but the private
+ comment is excluded from their email notification.</li>
+ <li><b>[% terms.Bug %] Editing:</b> The controls for groups now
+ appear to the right of the attachment and time-tracking tables,
+ when editing [% terms.abug %].</li>
+ <li><b>[% terms.Bug %] Editing:</b> The "Collapse All Comments"
+ and "Expand All Comments" links now appear to the right of the
+ comment list instead of above it.</li>
+ <li><b>[% terms.Bug %] Editing:</b> The See Also field now supports
+ URLs for Google Code Issues and the Debian B[% %]ug-Tracking System.</li>
+ <li><b>[% terms.Bug %] Editing:</b> There have been significant performance
+ improvements in <kbd>show_bug.cgi</kbd> (the script that displays the
+ [% terms.bug %]-editing form), particularly for [% terms.bugs %] that
+ have lots of comments or attachments.</li>
+
+ <li><b>Attachments:</b> The "Details" page of an attachment
+ now displays itself as uneditable if you can't edit the fields
+ there.</li>
+ <li><b>Attachments:</b> We now make sure that there is
+ a Description specified for an attachment, using JavaScript, before
+ the form is submitted.</li>
+ <li><b>Attachments:</b> There is now a link back to the [% terms.bug %]
+ at the bottom of the "Details" page for an attachment.</li>
+ <li><b>Attachments:</b> When you click on an "attachment 12345" link
+ in a comment, if the attachment is a patch, you will now see the
+ formatted "Diff" view instead of the raw patch.</li>
+ <li><b>Attachments</b>: For text attachments, we now let the browser
+ auto-detect the character encoding, instead of forcing the browser to
+ always assume the attachment is in UTF-8.</li>
+
+ <li><b>Search:</b> You can now display [% terms.bug %] flags as a column
+ in search results.</li>
+ <li><b>Search:</b> When viewing search results, you can see which columns are
+ being sorted on, and which direction the sort is on, as indicated
+ by arrows next to the column headers.</li>
+ <li><b>Search:</b> You can now search the Deadline field using relative
+ dates (like "1d", "2w", etc.).</li>
+ <li><b>Search:</b> The iCalendar format of search results now includes
+ a PRIORITY field.</li>
+ <li><b>Search:</b> It is no longer an error to enter an invalid search
+ order in a search URL--[% terms.Bugzilla %] will simply warn you that
+ some of your order options are invalid.</li>
+ <li><b>Search:</b> When there are no search results, some helpful
+ links are displayed, offering actions you might want to take.</li>
+ <li><b>Search:</b> For those who like to make their own
+ <kbd>buglist.cgi</kbd> URLs (and for people working on customizations),
+ <kbd>buglist.cgi</kbd> now accepts nearly every valid field in
+ [%+ terms.Bugzilla %] as a direct URL parameter, like
+ <kbd>&amp;field=value</kbd>.</li>
+
+ <li><b>Requests:</b> When viewing the "My Requests" page, you can now
+ see the lists as a normal search result by clicking a link at the
+ bottom of each table.</li>
+ <li><b>Requests:</b> When viewing the "My Requests" page, if you are
+ using Classifications, the Product drop-down will be grouped by
+ Classification.</li>
+
+ <li><b>Inbound Email:</b> When filing [% terms.abug %] by email, if the
+ product that you are filing the [% terms.bug %] into has some groups
+ set as Default for you, the [% terms.bug %] will now be placed into those
+ groups automatically.</li>
+ <li><b>Inbound Email:</b> The field names that can be used when creating
+ [%+ terms.bugs %] by email now exactly matches the set of valid parameters
+ to the
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#create">B[% %]ug.create
+ WebService function</a>. You can still use most of the old field names
+ that 3.4 and earlier used for inbound emails, though, for
+ backwards-compatibility.</li>
+
+ <li>If there are multiple languages available for your
+ [%+ terms.Bugzilla %], you can now select what language you want
+ [%+ terms.Bugzilla %] displayed in using links at the top of every
+ page.</li>
+ <li>When creating a new account, you will be automatically logged in
+ after setting your password.</li>
+ <li>There is no longer a maximum password length for accounts.</li>
+ <li>In the Dusk skin, it's now easier to see links.</li>
+ <li>In the Whining system, you can now choose to receive emails even
+ if there are no [% terms.bugs %] that match your searches.</li>
+ <li>The arrows in dependency graphs now point the other way, so that
+ [%+ terms.bugs %] point at their dependencies.</li>
+
+ <li><b>New Charts:</b> You can now convert an existing Saved Search
+ into a data series for New Charts.</li>
+ <li><b>New Charts:</b> There is now an interface that allows you to
+ delete data series.</li>
+ <li><b>New Charts:</b> When deleting a product, you now have the option
+ to delete the data series that are associated with that product.</li>
+</ul>
+
+<h4>Enhancements for Administrators and Developers</h4>
+
+<ul>
+ <li>Depending on how your workflow is set up, it is now possible to
+ have both UNCONFIRMED and REOPENED show up as status choices for
+ a closed [% terms.bug %]. If you only want one or the other to
+ show up, you should edit your status workflow appropriately
+ (possibly by removing or disabling the REOPENED status).</li>
+ <li>You can now "disable" field values so that they don't show
+ up as choices on [% terms.abug %] unless they are already set as
+ the value for that [% terms.bug %]. This doesn't work for the
+ per-product field values (component, target_milestone, and version)
+ yet, though.</li>
+ <li>Users are now locked out of their accounts for 30 minutes after
+ trying five bad passwords in a row during login. Every time a
+ user is locked out like this, the user in the "maintainer" parameter
+ will get an email.</li>
+ <li>The minimum length allowed for a password is now 6 characters.</li>
+ <li>The <kbd>UNCONFIRMED</kbd> status being enabled in a product
+ is now unrelated to the voting parameters. Instead, there is a checkbox
+ to enable the <kbd>UNCONFIRMED</kbd> status in a product.</li>
+ <li>Information about duplicates is now stored in the database instead
+ of being stored in the <kbd>data/</kbd> directory. On large installations
+ this could save several hundred megabytes of disk space.</li>
+
+ <li><b>Installation:</b> When installing [% terms.Bugzilla %], the
+ "maintainer" parameter will be automatically set to the administrator
+ that was created by <kbd>checksetup.pl</kbd>.</li>
+ <li><b>Installation:</b> <kbd>checksetup.pl</kbd> now prints out
+ certain errors in a special color so that you know that something
+ needs to be done.</li>
+ <li><b>Installation:</b> <kbd>checksetup.pl</kbd> is now <em>much</em>
+ faster at upgrading installations, particularly older installations.
+ Also, it's been made faster to run for the case where it's not
+ doing an upgrade.</li>
+ <li><b>Installation:</b> If you install [% terms.Bugzilla %] using the
+ tarball, the <kbd>CGI.pm</kbd> module from CPAN is now included in
+ the <kbd>lib/</kbd> dir. If you would rather use the CGI.pm from your
+ global Perl installation, you can delete <kbd>CGI.pm</kbd> and the
+ <kbd>CGI</kbd> directory from the <kbd>lib/</kbd> directory.</li>
+
+ <li>When editing a group, you can now specify that members of a group
+ are allowed to grant others membership in that group itself.</li>
+ <li>The ability to compress BMP attachments to PNGs is now an Extension.
+ To enable the feature, remove the file
+ <kbd>extensions/BmpConvert/disabled</kbd> and then run checksetup.pl.</li>
+ <li>The default list of values for the Priority field are now clear English
+ words instead of P1, P2, etc.</li>
+ <li>There is now a system in place so that all field values can be
+ localized. See the <kbd>value_descs</kbd> variable in
+ <kbd>template/en/default/global/field-descs.none.tmpl</kbd>.</li>
+ <li><kbd>config.cgi</kbd> now returns an ETag header and understands
+ the If-None-Match header in HTTP requests.</li>
+ <li>The XML format of <kbd>show_bug.cgi</kbd> now returns more information:
+ the numeric id of each comment, whether an attachment is a URL,
+ the modification time of an attachment, the numeric id of a flag,
+ and the numeric id of a flag's type.</li>
+
+ <li><b>Parameters:</b> Parameters that aren't actually required are no longer
+ in the "Required" section of the Parameters page. Instead, some are in the
+ new "General" section, and some are in the new "Advanced" section.</li>
+ <li><b>Parameters:</b> The old <kbd>ssl</kbd> parameter has been
+ changed to <kbd>ssl_redirect</kbd>, and can only be turned "on" or "off".
+ If "on", then all users will be forcibly redirected to SSL whenever
+ they access [% terms.Bugzilla %]. When the parameter is off,
+ no SSL-related redirects will occur (even if the user directly
+ accesses [% terms.Bugzilla %] via SSL, they will <em>not</em> be
+ redirected to a non-SSL page).</li>
+ <li><b>Parameters:</b> In the Advanced parameters, there is a new parameter,
+ <kbd>inbound_proxies</kbd>. If your [% terms.Bugzilla %] is behind a
+ proxy, you should set this parameter to the IP address of that proxy.
+ Then, [% terms.Bugzilla %] will "believe" any "X-Forwarded-For"
+ header sent from that proxy, and correctly use the X-Forwarded-For
+ as the end user's IP, instead of believing that all traffic is coming
+ from the proxy.</li>
+
+ <li><b>Removed Parameter:</b> The <kbd>loginnetmask</kbd> parameter has
+ been removed. Since [% terms.Bugzilla %] sends secure cookies, it's no
+ longer necessary to always restrict logins to a specific IP or block
+ of addresses.</li>
+ <li><b>Removed Parameter:</b> The <kbd>quicksearch_comment_cutoff</kbd>
+ parameter is gone. Quicksearch now always searches comments; however, it
+ uses a much faster algorithm to do it.</li>
+ <li><b>Removed Parameter:</b> The <kbd>usermatchmode</kbd> parameter has
+ been removed. User-matching is now <em>always</em> done.</li>
+ <li><b>Removed Parameter:</b> The <kbd>useentrygroupdefault</kbd> parameter
+ has been removed. [% terms.Bugzilla %] now always behaves as though
+ that parameter were off.</li>
+ <li>The <kbd>t/001compile.t</kbd> test should now always pass, no matter
+ what configuration of optional modules you do or don't have installed.</li>
+ <li>New script: <kbd>contrib/console.pl</kbd>, which allows you to have
+ a "command line" into [% terms.Bugzilla %] by inputting Perl code
+ or using a few custom commands.</li>
+</ul>
+
+<h4>WebService Changes</h4>
+
+<ul>
+ <li>The WebService now returns all dates and times in the UTC timezone.
+ <kbd>B[% %]ugzilla.time</kbd> now acts as though the [% terms.Bugzilla %]
+ server were in the UTC timezone, always. If you want to write clients
+ that are compatible across all [% terms.Bugzilla %] versions,
+ check the timezone from <kbd>B[% %]ugzilla.timezone</kbd> or
+ <kbd>B[% %]ugzilla.time</kbd>, and always input times in that timezone
+ and expect times to be returned in that format.</li>
+ <li>You can now log in by passing <kbd>Bugzilla_login</kbd> and
+ <kbd>Bugzilla_password</kbd> as arguments to any WebService function.
+ See the
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService.html#LOGGING_IN">Bugzilla::WebService</a>
+ documentation for details.</li>
+ <li>New Method:
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#attachments">B[% %]ug.attachments</a>
+ which allows getting information about attachments.</li>
+ <li>New Method:
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#fields">B[% %]ug.fields</a>,
+ which gets information about all the fields that [% terms.abug %] can have
+ in [% terms.Bugzilla %], include custom fields and legal values for
+ all fields. The <kbd>B[% %]ug.legal_values</kbd> method is now deprecated.</li>
+ <li>In the <kbd>B[% %]ug.add_comment</kbd> method, the "private" parameter
+ has been renamed to "is_private" (for consistency with other methods).
+ You can still use "private", though, for backwards-compatibility.</li>
+ <li>The WebService now has Perl's "taint mode" turned on. This means that
+ it validates all data passed in before sending it to the database.
+ Also, all parameter names are validated, and if you pass in a parameter
+ whose name contains anything other than letters, numbers, or underscores,
+ that parameter will be ignored. Mostly this just affects
+ customizers--[% terms.Bugzilla %]'s WebService is not functionally
+ affected by these changes.</li>
+ <li>In previous versions of [% terms.Bugzilla %], error messages were
+ sent word-wrapped to the client, from the WebService. Error messages
+ are now sent as one unbroken line.</li>
+</ul>
+
+<h2 id="v36_issues">Outstanding Issues</h2>
+
+<ul>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=423439">
+ [%- terms.Bug %] 423439</a>: Tabs in comments will be converted
+ to four spaces, due to a b<!-- -->ug in Perl as of Perl 5.8.8.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=69621">
+ [%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is
+ in use on [% terms.bugs %], you will need to rebuild the "keyword cache"
+ by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
+ the option to rebuild the cache when it asks. Otherwise keywords may
+ not show up properly in search results.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=89822">
+ [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
+ the same time, there is no "mid-air collision" protection.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=276230">
+ [%- terms.Bug %] 276230</a>: The support for restricting access to
+ particular Categories of New Charts is not complete. You should treat
+ the 'chartgroup' Param as the only access mechanism available.<br>
+ However, charts migrated from Old Charts will be restricted to
+ the groups that are marked MANDATORY for the corresponding Product.
+ There is currently no way to change this restriction, and the
+ groupings will not be updated if the group configuration
+ for the Product changes.</li>
+</ul>
+
+<h2 id="v36_upgrading">Notes On Upgrading From a Previous Version</h2>
+
+<p>When upgrading to 3.6, <kbd>checksetup.pl</kbd> will create foreign keys
+ for many columns in the database. Before doing this, it will check the
+ database for consistency. If there are an unresolvable consistency
+ problems, it will tell you what table and column in the database contain
+ the bad values, and which values are bad. If you don't know what else to do,
+ you can always delete the database records which contain the bad values by
+ logging in to your database and running the following command:</p>
+
+<p><code>DELETE FROM <var>table</var> WHERE <var>column</var> IN
+ (<var>1, 2, 3, 4</var>)</code></p>
+
+<p>Just replace "table" and "column" with the name of the table
+ and column that <kbd>checksetup.pl</kbd> mentions, and "1, 2, 3, 4"
+ with the invalid values that <kbd>checksetup.pl</kbd> prints out.</p>
+
+<p>Remember that you should always back up your database before doing
+ an upgrade.</p>
+
+<h2 id="v36_code_changes">Code Changes Which May Affect Customizations</h2>
+
+<ul>
+ <li>There is no longer a SendBugMail method in the templates, and bugmail
+ is no longer sent by processing a template. Instead, it is sent
+ by using <kbd>Bugzilla::BugMail::Send</kbd>.</li>
+ <li>Comments are now represented as a
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Comment.html">Bugzilla::Comment</a>
+ object instead of just being hashes.</li>
+ <li>In previous versions of [% terms.Bugzilla %], the template for displaying
+ [%+ terms.abug %] required a lot of extra variables that are now global
+ template variables instead.</li>
+ <li>You can now check if optional modules are installed by using
+ <kbd>Bugzilla-&gt;feature</kbd> in Perl code or
+ <kbd>feature_enabled</kbd> in template code.</li>
+ <li>All of the various template header information required to display
+ the [% terms.bug %] form is now in one template,
+ <kbd>template/en/default/bug/show-header.html.tmpl</kbd>.</li>
+ <li>You should now use <kbd>display_value</kbd> instead of
+ <kbd>get_status</kbd> or <kbd>get_resolution</kbd> in templates.
+ <kbd>display_value</kbd> should be used anywhere that a
+ &lt;select&gt;-type field has its values displayed.</li>
+</ul>
+
+
+<h1 id="v36_previous">[% terms.Bugzilla %] 3.4 Release Notes</h1>
+
+<ul class="bz_toc">
+ <li><a href="#v34_introduction">Introduction</a></li>
+ <li><a href="#v34_point">Updates in this 3.4.x Release</a></li>
+ <li><a href="#v34_req">Minimum Requirements</a></li>
+ <li><a href="#v34_feat">New Features and Improvements</a></li>
+ <li><a href="#v34_issues">Outstanding Issues</a></li>
+ <li><a href="#v34_upgrading">Notes On Upgrading From a Previous Version</a></li>
+ <li><a href="#v34_code_changes">Code Changes Which May Affect
+ Customizations</a></li>
+ <li><a href="#v34_previous">Release Notes for Previous Versions</a></li>
+</ul>
+
+<h2 id="v34_introduction">Introduction</h2>
+
+<p>This is [% terms.Bugzilla %] 3.4! [% terms.Bugzilla %] 3.4 brings a lot
+ of great enhancements for [% terms.Bugzilla %] over previous versions,
+ with various improvements to the user interface, lots of interesting new
+ features, and many long-standing requests finally being addressed.</p>
+
+<p>If you're upgrading, make sure to read <a href="#v34_upgrading">Notes
+ On Upgrading From a Previous Version</a>. If you are upgrading from a release
+ before 3.2, make sure to read the release notes for all the
+ <a href="#v34_previous">previous versions</a> in between your version
+ and this one, <strong>particularly the Upgrading section of each
+ version's release notes</strong>.</p>
+
+<p>We would like to thank <a href="http://www.canonical.com/">Canonical
+ Ltd.</a> for funding development of one new feature, and NASA for funding
+ development of several new features through the
+ <a href="http://www.sjsufoundation.org/">San Jose State University
+ Foundation</a>.</p>
+
+<h2 id="v34_point">Updates In This 3.4.x Release</h2>
+
+<h3>3.4.6</h3>
+
+<ul>
+ <li>When doing a search that involves "not equals" or "does not contain the
+ string" or similar "negative" search types, the search description that
+ appears at the top of the resulting [% terms.bug %] list will indicate
+ that the search was of that type.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=474738">[% terms.Bug %] 474738</a>)
+ </li>
+ <li>In Internet Explorer, users couldn't easily mark a RESOLVED DUPLICATE
+ [%+ terms.bug %] as REOPENED, due to a JavaScript error.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=546719">[% terms.Bug %] 546719</a>)
+ </li>
+ <li>If you use a "bookmarkable template" to pre-fill forms on
+ the [% terms.bug %]-filing page, and you have custom fields
+ that are only supposed to appear (or only supposed to have certain
+ values) based on the values of other fields, those custom fields will
+ now work properly.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=538211">[% terms.Bug %] 538211</a>)
+ </li>
+ <li>If you have a custom field that's only supposed to appear when
+ a [% terms.bug %]'s resolution is FIXED, it will now behave properly
+ on the [% terms.bug %]-editing form when a user sets the [% terms.bug %]'s
+ status to RESOLVED.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=520993">[% terms.Bug %] 520993</a>)
+ </li>
+ <li>If you are logged-out and using <kbd>request.cgi</kbd>, the Requester
+ and Requestee fields no longer respect the <kbd>usermatching</kbd>
+ parameter--they always require full usernames.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=533018">[% terms.Bug %] 533018</a>)
+ </li>
+ <li>If you tried to do a search with too many terms (resulting in a URL
+ that was longer than about 7000 characters), Apache would return a
+ 500 error instead of your search results.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=513989">[% terms.Bug %] 513989</a>)
+ </li>
+ <li>[% terms.Bugzilla %] would sometimes lose fields from your sort order
+ when you added new fields to your sort order.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=470214">[% terms.Bug %] 470214</a>)
+ </li>
+ <li>The Atom format of search results would sometimes be missing the
+ Reporter or Assignee field for some [% terms.bugs %].
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=537834">[% terms.Bug %] 537834</a>)
+ </li>
+</ul>
+
+<h3>3.4.5</h3>
+
+<p>This release contains fixes for multiple security issues. See the
+ <a href="http://www.bugzilla.org/security/3.0.10/">Security Advisory</a>
+ for details.</p>
+
+<p>In addition, the following important fixes/changes have been made in
+ this release:</p>
+
+<ul>
+ <li>Whining was failing if jobqueue.pl was enabled.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=530270">[% terms.Bug %] 530270</a>)
+ </li>
+ <li>The Assignee field was empty in Whine mails.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=511216">[% terms.Bug %] 511216</a>)
+ </li>
+ <li>Administrators can now successfully create user accounts using
+ editusers.cgi when using the "Env" authentication method.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=483987">[% terms.Bug %] 483987</a>)
+ </li>
+ <li>[% terms.Bug %]mail now uses the timezone of the recipient of the email,
+ when displaying the time a comment was made, instead of the timezone of the
+ person who made the change.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=534587">[% terms.Bug %] 534587</a>)
+ </li>
+ <li>"[% terms.bug %] 1234" in comments sometimes would not become a link if
+ word-wrapping happened between "[% terms.bug %]" and the number.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=514703">[% terms.Bug %] 514703</a>)
+ </li>
+ <li>Running checksetup.pl on Windows will no longer pop up an error box
+ about OCI.dll.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=480968">[% terms.Bug %] 480968</a>)
+ </li>
+</ul>
+
+<h3>3.4.4</h3>
+
+<p>This release contains a fix for a security issue. See the
+ <a href="http://www.bugzilla.org/security/3.4.3/">Security Advisory</a>
+ for details.</p>
+
+<p>Additionally, this release fixes a few minor [% terms.bugs %].</p>
+
+<h3>3.4.3</h3>
+
+<ul>
+ <li>[% terms.Bugzilla %] installations running under mod_perl were leaking
+ about 512K of RAM per page load.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=517793">[% terms.Bug %] 517793</a>)
+ </li>
+ <li>Attachments with Unicode characters in their names were being downloaded
+ with mangled names.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=328628">[% terms.Bug %] 328628</a>)
+ </li>
+ <li>Creating custom fields with Unicode in their database column name
+ is now no longer allowed, as it would break [% terms.Bugzilla %]. If you
+ created such a custom field, you should delete it by first marking it
+ obsolete and then clicking "Delete" in the custom field list, using
+ <a href="editfields.cgi">editfields.cgi</a>.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=525025">[% terms.Bug %] 525025</a>)
+ </li>
+ <li>Clicking "submit only my comment" on the "mid-air collisions" page
+ was leading to a "Suspicious Action" warning.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=514378">[% terms.Bug %] 514378</a>)
+ </li>
+ <li>The XML format of [% terms.abug %] accidentally contained the
+ word-wrapped content of comments instead of the unwrapped content.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=509152">[% terms.Bug %] 509152</a>)
+ </li>
+ <li>You can now do <kbd>./install-module.pl --shell</kbd> to get a CPAN
+ shell using the configuration of
+ <a href="[% docs_urlbase FILTER html %]api/install-module.html">install-module.pl</a>,
+ which allows you to do more advanced Perl module installation tasks.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=445875">[% terms.Bug %] 445875</a>)
+ </li>
+</ul>
+
+<h3>3.4.2</h3>
+
+<p>This release contains fixes for multiple security issues, one of which
+ is highly critical. See the
+ <a href="http://www.bugzilla.org/security/3.0.8/">Security Advisory</a>
+ for details.</p>
+
+<p>In addition, the following important fixes/changes have been made in
+ this release:</p>
+
+<ul>
+ <li>Upgrades from older releases were sometimes failing during UTF-8
+ conversion with a foreign key error.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=508181">[% terms.Bug %] 508181</a>)
+ </li>
+ <li>Sorting [% terms.bug %] lists on certain fields would result in an error.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=510944">[% terms.Bug %] 510944</a>)
+ </li>
+ <li>[% terms.Bug %] update emails had two or three blank lines at the top
+ and between the various sections of the email. There is now only one
+ blank line in each of those places, making these emails more compact.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=73330">[% terms.Bug %] 73330</a>)
+ </li>
+ <li>[% terms.Bug %] email notifications for new [% terms.bugs %] incorrectly
+ had a line saying that the description was "Comment 0".
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=510798">[% terms.Bug %] 510798</a>)
+ </li>
+ <li>Running <kbd>./collectstats.pl --regenerate</kbd> is now much faster,
+ on the order of 20x or 100x faster.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=286625">[% terms.Bug %] 286625</a>)
+ </li>
+ <li>For users of RHEL, CentOS, Fedora, etc. jobqueue.pl can now automatically
+ be installed as a daemon by running <kbd>./jobqueue.pl install</kbd>
+ as root.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=475403">[% terms.Bug %] 475403</a>)
+ </li>
+ <li>XML-RPC interface responses had an incorrect Content-Length header
+ and would sometimes be truncated, if they contained certain UTF-8
+ characters.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=486306">[% terms.Bug %] 486306</a>)
+ </li>
+ <li>Users who didn't have access to the time-tracking fields would get an
+ empty [% terms.bug %] update email when the time-tracking fields were
+ changed.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=509035">[% terms.Bug %] 509035</a>)
+ </li>
+ <li>In the New Charts, non-public series now no longer show up as selectable
+ if you cannot access them.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=389396">[% terms.Bug %] 389396</a>)
+ </li>
+</ul>
+
+<h3>3.4.1</h3>
+
+<p>This release contains an important security fix. See the
+ <a href="http://www.bugzilla.org/security/3.4/">Security Advisory</a>
+ for details.</p>
+
+<h2 id="v34_req">Minimum Requirements</h2>
+
+<p>Any requirements that are new since 3.2.3 will look like
+ <span class="req_new">this</span>.</p>
+
+<ul>
+ <li><a href="#v34_req_perl">Perl</a></li>
+ <li><a href="#v34_req_mysql">For MySQL Users</a></li>
+ <li><a href="#v34_req_pg">For PostgreSQL Users</a></li>
+ <li><a href="#v34_req_oracle">For Oracle Users</a></li>
+ <li><a href="#v34_req_modules">Required Perl Modules</a></li>
+ <li><a href="#v34_req_optional_mod">Optional Perl Modules</a></li>
+</ul>
+
+<h3 id="v34_req_perl">Perl</h3>
+
+<p>Perl v5.8.1</p>
+
+<h3 id="v34_req_mysql">For MySQL Users</h3>
+
+<ul>
+ <li>MySQL v4.1.2</li>
+ <li><strong>perl module:</strong> DBD::mysql v4.00</li>
+</ul>
+
+<h3 id="v34_req_pg">For PostgreSQL Users</h3>
+
+<ul>
+ <li>PostgreSQL v8.00.0000</li>
+ <li><strong>perl module:</strong> DBD::Pg v1.45</li>
+</ul>
+
+<h3 id="v34_req_oracle">For Oracle Users</h3>
+
+<ul>
+ <li>Oracle v10.02.0</li>
+ <li><strong>perl module:</strong> DBD::Oracle v1.19</li>
+</ul>
+
+<h3 id="v34_req_modules">Required Perl Modules</h3>
+
+<table class="req_table" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <th>Module</th> <th>Version</th>
+ </tr>
+ <tr>
+ <td>CGI</td>
+ <td>3.21</td>
+ </tr>
+ <tr>
+ <td class="req_new">Digest::SHA</td>
+ <td class="req_new"> (Any)</td>
+ </tr>
+ <tr>
+ <td>Date::Format</td>
+ <td>2.21</td>
+ </tr>
+ <tr>
+ <td class="req_new">DateTime</td>
+ <td class="req_new">0.28</td>
+ </tr>
+ <tr>
+ <td class="req_new">DateTime::TimeZone</td>
+ <td class="req_new">0.71</td>
+ </tr>
+ <tr>
+ <td>DBI</td>
+ <td>1.41</td>
+ </tr>
+ <tr>
+ <td>Template</td>
+ <td class="req_new">2.22</td>
+ </tr>
+ <tr>
+ <td>Email::Send</td>
+ <td>2.00</td>
+ </tr>
+ <tr>
+ <td>Email::MIME</td>
+ <td>1.861</td>
+ </tr>
+ <tr>
+ <td>Email::MIME::Encodings</td>
+ <td>1.313</td>
+ </tr>
+ <tr>
+ <td>Email::MIME::Modifier</td>
+ <td>1.442</td>
+ </tr>
+ <tr>
+ <td class="req_new">URI</td>
+ <td class="req_new">(Any)</td>
+ </tr>
+</table>
+
+<h3 id="v34_req_optional_mod">Optional Perl Modules</h3>
+
+<p>The following perl modules, if installed, enable various
+ features of [% terms.Bugzilla %]:</p>
+
+<table class="req_table" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <th>Module</th>
+ <th>Version</th>
+ <th>Enables Feature</th>
+ </tr>
+ <tr>
+ <td>LWP::UserAgent</td>
+ <td>(Any)</td>
+ <td>Automatic Update Notifications</td>
+ </tr>
+ <tr>
+ <td>Template::Plugin::GD::Image</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td>GD::Text</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td>GD::Graph</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td>GD</td>
+ <td>1.20</td>
+ <td>Graphical Reports, New Charts, Old Charts</td>
+ </tr>
+ <tr>
+ <td>Email::MIME::Attachment::Stripper</td>
+ <td>(Any)</td>
+ <td>Inbound Email</td>
+ </tr>
+ <tr>
+ <td>Email::Reply</td>
+ <td>(Any)</td>
+ <td>Inbound Email</td>
+ </tr>
+ <tr>
+ <td>Net::LDAP</td>
+ <td>(Any)</td>
+ <td>LDAP Authentication</td>
+ </tr>
+ <tr>
+ <td class="req_new">TheSchwartz</td>
+ <td class="req_new">(Any)</td>
+ <td>Mail Queueing</td>
+ </tr>
+ <tr>
+ <td class="req_new">Daemon::Generic</td>
+ <td class="req_new">(Any)</td>
+ <td>Mail Queueing</td>
+ </tr>
+ <tr>
+ <td>HTML::Parser</td>
+ <td>3.40</td>
+ <td>More HTML in Product/Group Descriptions</td>
+ </tr>
+ <tr>
+ <td>HTML::Scrubber</td>
+ <td>(Any)</td>
+ <td>More HTML in Product/Group Descriptions</td>
+ </tr>
+ <tr>
+ <td>XML::Twig</td>
+ <td>(Any)</td>
+ <td>Move [% terms.Bugs %] Between Installations</td>
+ </tr>
+ <tr>
+ <td>MIME::Parser</td>
+ <td>5.406</td>
+ <td>Move [% terms.Bugs %] Between Installations</td>
+ </tr>
+ <tr>
+ <td>Chart::Base</td>
+ <td>1.0</td>
+ <td>New Charts, Old Charts</td>
+ </tr>
+ <tr>
+ <td>Image::Magick</td>
+ <td>(Any)</td>
+ <td>Optionally Convert BMP Attachments to PNGs</td>
+ </tr>
+ <tr>
+ <td>PatchReader</td>
+ <td>0.9.4</td>
+ <td>Patch Viewer</td>
+ </tr>
+ <tr>
+ <td>Authen::Radius</td>
+ <td>(Any)</td>
+ <td>RADIUS Authentication</td>
+ </tr>
+ <tr>
+ <td>Authen::SASL</td>
+ <td>(Any)</td>
+ <td>SMTP Authentication</td>
+ </tr>
+ <tr>
+ <td>SOAP::Lite</td>
+ <td>0.710.06</td>
+ <td>XML-RPC Interface</td>
+ </tr>
+ <tr>
+ <td>mod_perl2</td>
+ <td>1.999022</td>
+ <td>mod_perl</td>
+ </tr>
+</table>
+
+<h2 id="v34_feat">New Features and Improvements</h2>
+
+<ul>
+ <li><a href="#v34_feat_enter">Simple [% terms.Bug %] Filing</a></li>
+ <li><a href="#v34_feat_index">New Home Page</a></li>
+ <li><a href="#v34_feat_spam">Email Addresses Hidden From Logged-Out
+ Users</a></li>
+ <li><a href="#v34_feat_urls">Shorter Search URLs</a></li>
+ <li><a href="#v34_feat_async">Asynchronous Email Sending</a></li>
+ <li><a href="#v34_feat_tz">Dates and Times Displayed In User's Time
+ Zone</a></li>
+ <li><a href="#v34_feat_vis">Custom Fields That Only Appear When
+ Another Field Has a Particular Value</a></li>
+ <li><a href="#v34_feat_vals">Custom Fields Whose List of Values
+ Change Depending on the Value of Another Field</a></li>
+ <li><a href="#v34_feat_bugid">New Custom Field Type:
+ [%+ terms.Bug %] ID</a></li>
+ <li><a href="#v34_feat_see">"See Also" Field</a></li>
+ <li><a href="#v34_feat_cols">Re-order Columns in Search Results</a></li>
+ <li><a href="#v34_feat_desc">Search Descriptions</a></li>
+ <li><a href="#v34_feat_other">Other Enhancements and Changes</a></li>
+</ul>
+
+<h3 id="v34_feat_enter">Simple [% terms.Bug %] Filing</h3>
+
+<p>When entering a new [% terms.bug %], the vast majority of fields are
+ now hidden by default, which enormously simplifies the bug-filing form.
+ You can click "Show Advanced Fields" to show all the fields, if you want
+ them. [%+ terms.Bugzilla %] remembers whether you last used the "Advanced"
+ or "Simple" version of the [% terms.bug %]-entry form, and will display the
+ same version to you again next time you file [% terms.abug %].</p>
+
+<h3 id="v34_feat_index">New Home Page</h3>
+
+<p>[% terms.Bugzilla %]'s front page has been redesigned to be better at
+ guiding new users into the activities that they most commonly want to
+ do. Further enhancements to the home page are coming in future versions
+ of [% terms.Bugzilla %].</p>
+
+<h3 id="v34_feat_spam">Email Addresses Hidden From Logged-Out Users</h3>
+
+<p>To help prevent spam to [% terms.Bugzilla %] users, all email addresses
+ stored in [% terms.Bugzilla %] are now displayed only if you are logged in.
+ If you are logged out, only the part before the "@" of the email address is
+ displayed. This includes [% terms.bug %] lists, viewing [% terms.bugs %], the
+ XML format of [% terms.abug %], and any other place in the web interface that
+ an email address could appear.</p>
+
+<p>Email addresses are not filtered out of [% terms.bug %] comments.
+ The WebService still returns full email addresses, even if you are logged
+ out.</p>
+
+<h3 id="v34_feat_urls">Shorter Search URLs</h3>
+
+<p>When submitting a search, all the unused fields are now stripped from
+ the URL, so search URLs are much more meaningful, and much shorter.</p>
+
+<h3 id="v34_feat_async">Asynchronous Email Sending</h3>
+
+<p>The largest performance problem in former versions of [% terms.Bugzilla %]
+ was that when updating [% terms.bugs %], email would be sent immediately
+ to every user who needed to be notified, and <kbd>process_bug.cgi</kbd>
+ would wait for the emails to be sent before continuing.</p>
+
+<p>Now [% terms.Bugzilla %] is capable of queueing emails to be sent
+ while [% terms.abug %] is being updated, and sending them in the
+ background. This requires the administrator to run a daemon
+ that comes with [% terms.Bugzilla %], named
+ <a href="[% docs_urlbase FILTER html %]api/jobqueue.html">jobqueue.pl</a>,
+ and to enable the <a href="editparams.cgi?section=mta#use_mailer_queue">
+ use_mailer_queue</a> parameter.</p>
+
+<p>Using the background email-sending daemon instead of sending mail directly
+ should result in a very large speed-up for updating [% terms.bugs %],
+ particularly on larger installations.</p>
+
+<h3 id="v34_feat_tz">Dates and Times Displayed In User's Time Zone</h3>
+
+<p>Users can now select what time zone they are in and [% terms.Bugzilla %]
+ will adjust displayed times to be correct for their time zone. However,
+ times the user inputs are unfortunately still in [% terms.Bugzilla %]'s
+ time zone.</p>
+
+<h3 id="v34_feat_vis">Custom Fields That Only Appear When Another Field
+ Has a Particular Value</h3>
+
+<p>When creating a new custom field (or updating the definition of
+ an existing custom field), you can now say that "this field only
+ appears when field X has value Y". (In the future, you will be able
+ to select multiple values for "Y", so a field will appear when any
+ one of those values is selected.)</p>
+
+<p>This feature only hides fields--it doesn't make their values go away.
+ So [% terms.bugs %] will still show up in searches for that field's
+ value, but the field won't appear in the user interface.</p>
+
+<p>This is a good way of making Product-specific fields.</p>
+
+<h3 id="v34_feat_vals">Custom Fields Whose List of Values Change
+ Depending on the Value of Another Field</h3>
+
+<p>When creating a drop-down or multiple-selection custom field, you can
+ now specify that another field "controls the values" of this field.
+ Then, when adding values to this field, you can say that a particular
+ value only appears when the other field is set to a particular
+ value.</p>
+
+<p>Here's an example: Let's say that we create a field called "Colors",
+ and we make the Product field "control the values" for Colors. Then we
+ add Blue, Red, Black, and Yellow as legal values for the "Colors" field.
+ Now we can say that "Blue" and "Red" only appear as valid choices in
+ Product A, "Yellow" only appears in Product B, but "Black" <em>always</em>
+ appears.</p>
+
+<p>One thing to note is that this feature only controls what values appear in
+ the <em>user interface</em>. [% terms.Bugzilla %] itself will still accept
+ any combination of values as valid, in the backend.</p>
+
+<h3 id="v34_feat_bugid">New Custom Field Type: [% terms.Bug %] ID</h3>
+
+<p>You can now create a custom field that holds a reference to a single
+ valid [% terms.bug %] ID. In the future this will be enhanced to allow
+ [%+ terms.bugs %] to refer to each other via this field.</p>
+
+<h3 id="v34_feat_see">"See Also" Field</h3>
+
+<p>We have added a new standard field called "See Also" to
+ [%+ terms.Bugzilla %]. In this field, you can put URLs to multiple
+ [%+ terms.bugs %] in any [% terms.Bugzilla %] installation, to indicate
+ that those [% terms.bugs %] are related to this one. It also supports
+ adding URLs to [% terms.bugs %] in
+ <a href="http://launchpad.net/">Launchpad</a>.</p>
+
+<p>Right now, the field just validates the URLs and then displays them, but
+ in the future, it will grab information from the other installation about
+ the [% terms.bug %] and display it here, and possibly even update the
+ other installation.</p>
+
+<p>If your installation does not need this field, you can hide it by disabling
+ the <a href="editparams.cgi?section=bugfields#use_see_also">use_see_also
+ parameter</a>.</p>
+
+<h3 id="v34_feat_cols">Re-order Columns in Search Results</h3>
+
+<p>There is a new interface for choosing what columns appear in search
+ results, which allows you to change the order in which columns appear
+ from left to right when viewing the [% terms.bug %] list.</p>
+
+<h3 id="v34_feat_desc">Search Descriptions</h3>
+
+<p>When displaying search results, [% terms.Bugzilla %] will now show
+ a brief description of what you searched for, at the top of the
+ [%+ terms.bug %] list.</p>
+
+<h3 id="v34_feat_other">Other Enhancements and Changes</h3>
+
+<h4>Enhancements for Users</h4>
+
+<ul>
+ <li>You can now log in from every page, using the login form that appears
+ in the header or footer when you click "Log In".</li>
+ <li>When viewing [% terms.abug %], obsolete attachments are now
+ hidden from the attachment list by default. You can show them
+ by clicking "Show Obsolete" at the bottom of the attachment list.</li>
+ <li>In the Email Preferences, you can now choose to get email when
+ a new [% terms.bug %] report is filed and you have a particular
+ role on it.</li>
+ <li>When resolving a mid-air collision, you can now choose to submit
+ only your comment.</li>
+ <li>You can now set the Blocks and Depends On field on the "Change
+ Several [% terms.Bugs %] At Once" page.</li>
+ <li>If your installation uses the "insidergroup" feature, you can now add
+ private comments on the "Change Several [% terms.Bugs %] At Once"
+ page.</li>
+ <li>When viewing a search result, you can now hover over any abbreviated
+ field to see its full value.</li>
+ <li>When logging out, users are now redirected to the main page of
+ [%+ terms.Bugzilla %] instead of an empty page.</li>
+ <li>When editing [% terms.abug %], text fields (except the comment box) now
+ grow longer when you widen your browser window.</li>
+ <li>When viewing [% terms.abug %], the Depends On and Blocks list will
+ display [% terms.abug %]'s alias if it has one, instead of its id.
+ Also, closed [% terms.bugs %] will be sorted to the end of the list.</li>
+
+ <li>If you use the time-tracking features of [% terms.Bugzilla %], and
+ you enable the time-tracking related columns in a search result,
+ then you will see a summary of the time-tracking data at the
+ bottom of the search result.</li>
+ <li>For users of time-tracking, the <kbd>summarize_time.cgi</kbd> page
+ now contains more data.</li>
+
+ <li>When viewing an attachment's details page while you are logged-out,
+ flags are no longer shown as editable.</li>
+ <li>Cloning [% terms.abug %] will now retain the "Blocks" and "Depends On"
+ fields from the [% terms.bug %] being cloned.</li>
+ <li>[% terms.Bug %]mail for new [% terms.bugs %] will now indicate
+ what security groups the [% terms.bug %] has been restricted to.</li>
+ <li>You can now use any custom drop-down field as an axis for a tabular
+ or graphical report.</li>
+ <li>The <kbd>X-Bugzilla-Type</kbd> header in emails sent by
+ [%+ terms.Bugzilla %] is now "new" for [% terms.bug %]mail sent for
+ newly-filed [% terms.bugs %], and "changed" for emails having to do
+ with updated [% terms.bugs %].</li>
+ <li>Mails sent by the "Whining" system now contain the header
+ <kbd>X-Bugzilla-Type: whine</kbd>.</li>
+ <li>[% terms.bug %]mail now contains a X-Bugzilla-URL header to uniquely
+ identify which [% terms.Bugzilla %] installation the email came from.</li>
+ <li>If you input an invalid regular expression anywhere in
+ [%+ terms.Bugzilla %], it will now tell you explicitly instead of failing
+ cryptically.</li>
+ <li>The <kbd>duplicates.xul</kbd> page (which wasn't used by very many
+ people) is now gone.</li>
+</ul>
+
+<h4>Enhancements for Administrators and Developers</h4>
+
+<ul>
+ <li>[% terms.Bugzilla %] now uses the SHA-256 algorithm (a variant of
+ SHA-2) to encrypt passwords in the database, instead of using Unix's
+ "crypt" function. This allows passwords longer than eight characters
+ to actually be effective. Each user's password will be converted to
+ SHA-256 the first time they log in after you upgrade to
+ [%+ terms.Bugzilla %] 3.4 or later.</li>
+ <li>If you are using database replication with [% terms.Bugzilla %],
+ many more scripts now take advantage of the read-only slave (the
+ "shadowdb"). It may be safe to open up <kbd>show_bug.cgi</kbd>
+ to search-engine indexing by editing your <kbd>robots.txt</kbd> file,
+ now, if your [% terms.Bugzilla %] is on fast-enough hardware.</li>
+ <li>The database now uses foreign keys to enforce the validity of
+ relationships between tables. Not every single table has all its
+ foreign keys yet, but most do.</li>
+ <li>Various parameters have been removed, in an effort to de-clutter
+ the parameter interface and simplify [% terms.Bugzilla %]'s code.
+ The parameters that were removed were: timezone, supportwatchers,
+ maxpatchsize, commentonclearresolution, commentonreassignbycomponent,
+ showallproducts. They have all been replaced with sensible default
+ behaviors. (For example, user watching is now always enabled.)</li>
+ <li>When adding <code>&amp;debug=1</code> to the end of a
+ <kbd>buglist.cgi</kbd> URL, [% terms.Bugzilla %] will now also do an
+ EXPLAIN on the query, to help debug performance issues.</li>
+ <li>When editing flag types in the administrative interface, you can now
+ see how many flags of each type have been set.</li>
+</ul>
+
+<h4>WebService Changes</h4>
+
+<ul>
+ <li>Various functions have been added to the WebService:
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#history">B[% %]ug.history</a>,
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#search">B[% %]ug.search</a>,
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#comments">B[% %]ug.comments</a>,
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#update_see_also">B[% %]ug.update_see_also</a>,
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/User.html#get">User.get</a>,
+ and <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bugzilla.html#time">B[% %]ugzilla.time</a>
+ (<kbd>B[% %]ugzilla.timezone</kbd> is now deprecated).
+ </li>
+ <li>For network efficiency, you can now limit which fields are returned
+ from certain WebService functions, like <kbd>User.get</kbd>.</li>
+ <li>There is now a "permissive" argument for the <kbd>B[% %]ug.get</kbd>
+ WebService function, which causes it not to throw an error when you
+ ask for [% terms.bugs %] you can't see.</li>
+
+ <li>The <kbd>B[% %]ug.get</kbd> method now returns many more fields.</li>
+ <li>The <kbd>B[% %]ug.add_comment</kbd> method now returns the ID of the comment
+ that was just added.</li>
+ <li>The <kbd>B[% %]ug.add_comment</kbd> method will now throw an error if you
+ try to add a private comment but do not have the correct permissions.
+ (In previous versions, it would just silently ignore the <kbd>private</kbd>
+ argument if you didn't have the correct permissions.)</li>
+ <li>Many WebService function parameters now take individual values in
+ addition to arrays.</li>
+ <li>The WebService now validates input types--it makes sure that dates
+ are in the right format, that ints are actually ints, etc. It will throw
+ an error if you send it invalid data. It also accepts empty ints, doubles,
+ and dateTimes, and translates them to <kbd>undef</kbd>.</li>
+</ul>
+
+<h2 id="v34_issues">Outstanding Issues</h2>
+
+<ul>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=423439">
+ [%- terms.Bug %] 423439</a>: Tabs in comments will be converted
+ to four spaces, due to a b<!-- -->ug in Perl as of Perl 5.8.8.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=69621">
+ [%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is
+ in use on [% terms.bugs %], you will need to rebuild the "keyword cache"
+ by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
+ the option to rebuild the cache when it asks. Otherwise keywords may
+ not show up properly in search results.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=89822">
+ [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
+ the same time, there is no "mid-air collision" protection.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=276230">
+ [%- terms.Bug %] 276230</a>: The support for restricting access to
+ particular Categories of New Charts is not complete. You should treat
+ the 'chartgroup' Param as the only access mechanism available.<br>
+ However, charts migrated from Old Charts will be restricted to
+ the groups that are marked MANDATORY for the corresponding Product.
+ There is currently no way to change this restriction, and the
+ groupings will not be updated if the group configuration
+ for the Product changes.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370370">
+ [%- terms.Bug %] 370370</a>: mod_perl support is currently not
+ working on Windows machines.</li>
+</ul>
+
+<h2 id="v34_upgrading">Notes On Upgrading From a Previous Version</h2>
+
+<p>When upgrading to 3.4, <kbd>checksetup.pl</kbd> will create foreign keys
+ for many columns in the database. Before doing this, it will check the
+ database for consistency. If there are an unresolvable consistency
+ problems, it will tell you what table and column in the database contain
+ the bad values, and which values are bad. If you don't know what else to do,
+ you can always delete the database records which contain the bad values by
+ logging in to your database and running the following command:</p>
+
+<p><code>DELETE FROM <var>table</var> WHERE <var>column</var> IN
+ (<var>1, 2, 3, 4</var>)</code></p>
+
+<p>Just replace "table" and "column" with the name of the table
+ and column that <kbd>checksetup.pl</kbd> mentions, and "1, 2, 3, 4"
+ with the invalid values that <kbd>checksetup.pl</kbd> prints out.</p>
+
+<p>Remember that you should always back up your database before doing
+ an upgrade.</p>
+
+<h2 id="v34_code_changes">Code Changes Which May Affect Customizations</h2>
+
+<ul>
+ <li><kbd>checksetup.pl</kbd> now re-writes the <kbd>localconfig</kbd>
+ file every time it runs, keeping the current values set (if there
+ are any), but moving any unexpected variables into a file called
+ <kbd>localconfig.old</kbd>. If you want to continue having custom
+ varibles in <kbd>localconfig</kbd>, you will have to add them to
+ the <code>LOCALCONFIG_VARS</code> constant in
+ <kbd>Bugzilla::Install::Localconfig</kbd>.</li>
+ <li><kbd>Bugzilla::Object-&gt;update()</kbd> now returns something different
+ in list context than it does in scalar context.</li>
+ <li><kbd>Bugzilla::Object-&gt;check()</kbd> now can take object
+ ids in addition to names. Just pass in <code>{ id =&gt; $some_value
+ }</code>.</li>
+ <li>Instead of being defined in <kbd>buglist.cgi</kbd>, columns for
+ search results are now defined in a subroutine called <code>COLUMNS</code>
+ in <kbd>Bugzilla::Search</kbd>. The data now mostly comes from the
+ <kbd>fielddefs</kbd> table in the database. Search.pm now takes a list
+ of column names from fielddefs for its <kbd>fields</kbd> argument instead
+ of literal SQL columns.</li>
+ <li><kbd>Bugzilla::Field-&gt;legal_values</kbd> now returns an array of
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Field/Choice.html">Bugzilla::Field::Choice</a>
+ objects instead of an array of strings. Bugzilla::Field::Choice will be used
+ in more places, in the future.</li>
+ <li>We now use <kbd>Bugzilla::Bug-&gt;check()</kbd> instead of
+ <kbd>ValidateBugId</kbd>.</li>
+ <li>The <kbd>groups</kbd> and <kbd>bless_groups</kbd> methods in
+ <kbd>Bugzilla::User</kbd> now return an arrayref of
+ <kbd>Bugzilla::Group</kbd> objects instead of a hashref with
+ group ids and group names.</li>
+ <li>Standard [% terms.Bugzilla %] drop-down fields now have their type
+ set to <kbd>FIELD_TYPE_SINGLE_SELECT</kbd> in the fielddefs table.</li>
+ <li><kbd>Bugzilla-&gt;usage_mode</kbd> now defaults to
+ <kbd>USAGE_MODE_CMDLINE</kbd> if we are not running inside a web
+ server.</li>
+ <li>We no longer delete environment variables like <kbd>$ENV{PATH}</kbd>
+ automatically unless we're actually running in taint mode.</li>
+ <li>We are now using YUI 2.6.0.</li>
+ <li>In <a href="config.cgi?ctype=rdf">the RDF format of config.cgi</a>,
+ the "resource" attribute for flags now contains "flag.cgi" instead
+ of "flags.cgi".</li>
+</ul>
+
+
+
+
+
+
+
+<h1 id="v34_previous">[% terms.Bugzilla %] 3.2 Release Notes</h1>
+
+<h2>Table of Contents</h2>
+
+<ul class="bz_toc">
+ <li><a href="#v32_introduction">Introduction</a></li>
+ <li><a href="#v32_point">Updates In This 3.2.x Release</a></li>
+ <li><a href="#v32_security">Security Fixes In This 3.2.x Release</a></li>
+ <li><a href="#v32_req">Minimum Requirements</a></li>
+ <li><a href="#v32_feat">New Features and Improvements</a></li>
+ <li><a href="#v32_issues">Outstanding Issues</a></li>
+ <li><a href="#v32_upgrading">How to Upgrade From An Older Version</a></li>
+ <li><a href="#v32_code_changes">Code Changes Which May Affect
+ Customizations</a></li>
+ <li><a href="#v32_previous">Release Notes for Previous Versions</a></li>
+</ul>
+
+<h2 id="v32_introduction">Introduction</h2>
+
+<p>Welcome to [% terms.Bugzilla %] 3.2! This is our first major feature
+ release since [% terms.Bugzilla %] 3.0, and it brings a lot of great
+ improvements and polish to the [% terms.Bugzilla %] experience.</p>
+
+<p>If you're upgrading, make sure to read <a href="#v32_upgrading">How to
+ Upgrade From An Older Version</a>. If you are upgrading from a release
+ before 3.0, make sure to read the release notes for all the
+ <a href="#v32_previous">previous versions</a> in between your version
+ and this one, <strong>particularly the "Notes For Upgraders" section of each
+ version's release notes</strong>.</p>
+
+<h2 id="v32_point">Updates in this 3.2.x Release</h2>
+
+<p>This section describes what's changed in the most recent b<!-- -->ug-fix
+ releases of [% terms.Bugzilla %] after 3.2. We only list the
+ most important fixes in each release. If you want a detailed list of
+ <em>everything</em> that's changed in each version, you should use our
+ <a href="http://www.bugzilla.org/status/changes.html">Change Log
+ Page</a>.</p>
+
+<h3>3.2.3</h3>
+
+<ul>
+ <li>[% terms.Bugzilla %] is now compatible with MySQL 5.1.x versions 5.1.31
+ and greater.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=480001">[% terms.Bug %] 480001</a>)</li>
+ <li>On Windows, [% terms.Bugzilla %] sometimes would send mangled emails
+ (that would often fail to send).
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=467920">[% terms.Bug %] 467920</a>)</li>
+ <li><code>recode.pl</code> would sometimes crash when trying to convert
+ databases from older versions of [% terms.Bugzilla %].
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=431201">[% terms.Bug %] 431201</a>)</li>
+ <li>Running a saved search with Unicode characters in its name would
+ cause [% terms.Bugzilla %] to crash.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=477513">[% terms.Bug %] 477513</a>)</li>
+ <li>[% terms.Bugzilla %] clients like Mylyn can now update [% terms.bugs %]
+ again (the [% terms.bug %] XML format now contains a "token" element that
+ can be used when updating [% terms.abug %]).
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=476678">[% terms.Bug %] 476678</a>)</li>
+ <li>For installations using the <code>shadowdb</code> parameter,
+ [%+ terms.Bugzilla %] was accidentally writing to the "tokens" table
+ in the shadow database (instead of the master database) when using the
+ "Change Several [% terms.Bugs %] at Once" page.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=476943">[% terms.Bug %] 476943</a>)</li>
+</ul>
+
+<p>This release also contains a security fix. See the
+ <a href="#v32_security">Security Fixes Section</a> for details.</p>
+
+<h3>3.2.2</h3>
+
+<p>This release fixes one security issue that is critical for installations
+ running 3.2.1 under mod_perl. See the
+ <a href="http://www.bugzilla.org/security/3.0.7/">Security Advisory</a>
+ for details.</p>
+
+<h3>3.2.1</h3>
+
+<ul>
+ <li>Attachments, charts, and graphs would sometimes be garbled on Windows.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=464992">[% terms.Bug %] 464992</a>)</li>
+
+ <li>Saving changes to parameters would sometimes fail silently (particularly
+ on Windows when the web server didn't have the right permissions to
+ update the <code>params</code> file). [% terms.Bugzilla %] will now
+ throw an error in this case, telling you what is wrong.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=347707">[% terms.Bug %] 347707</a>)</li>
+
+ <li>If you were using the <code>usemenuforusers</code> parameter,
+ and [% terms.abug %] was assigned to (or had a QA Contact of) a disabled
+ user, that field would be reset to the first user in the list when
+ updating [% terms.abug %].
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=465589">[% terms.Bug %] 465589</a>)</li>
+
+ <li>If you were using the <code>PROJECT</code> environment variable
+ to have multiple [% terms.Bugzilla %] installations using one codebase,
+ project-specific templates were being ignored.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=467324">[% terms.Bug %] 467324</a>)</li>
+
+ <li>Some versions of the SOAP::Lite Perl module had a b[% %]ug that caused
+ [%+ terms.Bugzilla %]'s XML-RPC service to break.
+ <code>checksetup.pl</code> now checks for these bad versions and
+ will reject them.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=468009">[% terms.Bug %] 468009</a>)</li>
+
+ <li>The font sizes in various places were too small, when using the
+ Classic skin.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=469136">[% terms.Bug %] 469136</a>)</li>
+</ul>
+
+<h2 id="v32_security">Security Fixes In This 3.2.x Release</h2>
+
+<h3>3.2.3</h3>
+
+<p>This release fixes one security issue related to attachments. See the
+ <a href="http://www.bugzilla.org/security/3.2.2/">Security Advisory</a>
+ for details.</p>
+
+<h3>3.2.2</h3>
+
+<p>This release fixes one security issue that is critical for installations
+ running 3.2.1 under mod_perl. See the
+ <a href="http://www.bugzilla.org/security/3.0.7/">Security Advisory</a>
+ for details.</p>
+
+<h3>3.2.1</h3>
+
+<p>This release contains several security fixes. One fix may break any
+ automated scripts you have that are loading <kbd>process_bug.cgi</kbd>
+ directly. We recommend that you read the entire
+ <a href="http://www.bugzilla.org/security/2.22.6/">Security Advisory</a>
+ for this release.</p>
+
+<h2 id="v32_req">Minimum Requirements</h2>
+
+<p>Any requirements that are new since 3.0.5 will look like
+ <span class="req_new">this</span>.</p>
+
+<ul>
+ <li><a href="#v32_req_perl">Perl</a></li>
+ <li><a href="#v32_req_mysql">For MySQL Users</a></li>
+ <li><a href="#v32_req_pg">For PostgreSQL Users</a></li>
+ <li><a href="#v32_req_oracle">For Oracle Users</a></li>
+ <li><a href="#v32_req_modules">Required Perl Modules</a></li>
+ <li><a href="#v32_req_optional_mod">Optional Perl
+ Modules</a></li>
+</ul>
+
+<h3 id="v32_req_perl">Perl</h3>
+
+<p>Perl <span class="req_new">v<strong>5.8.1</strong></span></p>
+
+<h3 id="v32_req_mysql">For MySQL Users</h3>
+
+<ul>
+ <li>MySQL v4.1.2</li>
+ <li><strong>perl module:</strong>
+ DBD::mysql <span class="req_new">v4.00</span></li>
+</ul>
+
+<h3 id="v32_req_pg">For PostgreSQL Users</h3>
+
+<ul>
+ <li>PostgreSQL v8.00.0000</li>
+ <li><strong>perl module:</strong> DBD::Pg v1.45</li>
+</ul>
+
+<h3 id="v32_req_oracle">Email Addresses Hidden From Logged-Out Users
+ For Oracle Users</h3>
+
+<ul>
+ <li>Oracle v10.02.0</li>
+ <li><strong>perl module:</strong> DBD::Oracle v1.19</li>
+</ul>
+
+<h3 id="v32_req_modules">Required Perl Modules</h3>
+
+<table class="req_table" border="0" cellpadding="0" cellspacing="0">
+<tr> <th>Module</th> <th>Version</th> </tr>
+<tr> <td>CGI</td> <td class="req_new">3.21 (on Perl 5.8.x)
+ or 3.33 (on Perl 5.10.x)</td> </tr>
+<tr> <td>Date::Format</td> <td>2.21</td> </tr>
+<tr> <td>File::Spec</td> <td>0.84</td> </tr>
+<tr> <td>DBI</td> <td>1.41</td> </tr>
+<tr> <td>Template</td> <td class="req_new">2.15</td> </tr>
+<tr> <td>Email::Send</td> <td>2.00</td> </tr>
+<tr> <td>Email::MIME</td> <td class="req_new">1.861</td> </tr>
+<tr>
+ <td class="req_new">Email::MIME::Encodings</td>
+ <td class="req_new">1.313</td>
+</tr>
+<tr>
+ <td>Email::MIME::Modifier</td>
+ <td class="req_new">1.442</td>
+</tr>
+</table>
+
+<h3 id="v32_req_optional_mod">Optional Perl Modules</h3>
+
+<p>The following perl modules, if installed, enable various
+ features of [% terms.Bugzilla %]:</p>
+
+<table class="req_table" border="0" cellpadding="0" cellspacing="0">
+<tr>
+ <th>Module</th>
+ <th>Version</th>
+ <th>Enables Feature</th>
+</tr>
+<tr>
+ <td>LWP::UserAgent</td>
+ <td>(Any)</td>
+ <td>Automatic Update Notifications</td>
+</tr>
+<tr>
+ <td>Template::Plugin::GD::Image</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+</tr>
+<tr>
+ <td>GD::Text</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+</tr>
+<tr>
+ <td>GD::Graph</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+</tr>
+<tr>
+ <td>GD</td>
+ <td>1.20</td>
+ <td>Graphical Reports, New Charts, Old Charts</td>
+</tr>
+<tr>
+ <td>Email::MIME::Attachment::Stripper</td>
+ <td>(Any)</td>
+ <td>Inbound Email</td>
+</tr>
+<tr>
+ <td>Email::Reply</td>
+ <td>(Any)</td>
+ <td>Inbound Email</td>
+</tr>
+<tr>
+ <td>Net::LDAP</td>
+ <td>(Any)</td>
+ <td>LDAP Authentication</td>
+</tr>
+<tr>
+ <td>HTML::Parser</td>
+ <td>3.40</td>
+ <td>More HTML in Product/Group Descriptions</td>
+</tr>
+<tr>
+ <td>HTML::Scrubber</td>
+ <td>(Any)</td>
+ <td>More HTML in Product/Group Descriptions</td>
+</tr>
+<tr>
+ <td>XML::Twig</td>
+ <td>(Any)</td>
+ <td>Move [% terms.Bugs %] Between Installations</td>
+</tr>
+<tr>
+ <td>MIME::Parser</td>
+ <td>5.406</td>
+ <td>Move [% terms.Bugs %] Between Installations</td>
+</tr>
+<tr>
+ <td>Chart::Base</td>
+ <td>1.0</td>
+ <td>New Charts, Old Charts</td>
+</tr>
+<tr>
+ <td>Image::Magick</td>
+ <td>(Any)</td>
+ <td>Optionally Convert BMP Attachments to PNGs</td>
+</tr>
+<tr>
+ <td>PatchReader</td>
+ <td>0.9.4</td>
+ <td>Patch Viewer</td>
+</tr>
+<tr>
+ <td class="req_new">Authen::Radius</td>
+ <td class="req_new">(Any)</td>
+ <td>RADIUS Authentication</td>
+</tr>
+<tr>
+ <td class="req_new">Authen::SASL</td>
+ <td class="req_new">(Any)</td>
+ <td>SMTP Authentication</td>
+</tr>
+<tr>
+ <td>SOAP::Lite</td>
+ <td>(Any)</td>
+ <td>XML-RPC Interface</td>
+</tr>
+<tr>
+ <td>mod_perl2</td>
+ <td>1.999022</td>
+ <td>mod_perl</td>
+</tr>
+</table>
+
+<h2 id="v32_feat">New Features and Improvements</h2>
+
+<ul>
+ <li><a href="#v32_feat_ui">Major UI Improvements</a></li>
+ <li><a href="#v32_feat_skin">New Default Skin: Dusk</a></li>
+ <li><a href="#v32_feat_status">Custom Status Workflow</a></li>
+ <li><a href="#v32_feat_fields">New Custom Field Types</a></li>
+ <li><a href="#v32_feat_install">Easier Installation</a></li>
+ <li><a href="#v32_feat_oracle">Experimental Oracle Support</a></li>
+ <li><a href="#v32_feat_utf8">Improved UTF-8 Support</a></li>
+ <li><a href="#v32_feat_grcons">Group Icons</a></li>
+ <li><a href="#v32_feat_other">Other Enhancements and Changes</a></li>
+</ul>
+
+<h3 id="v32_feat_ui">Major UI Improvements</h3>
+
+<p>[% terms.Bugzilla %] 3.2 has had some UI assistance from the NASA
+ Human-Computer Interaction department and the new
+ <a href="http://wiki.mozilla.org/Bugzilla:UE">[% terms.Bugzilla %]
+ User Interface Team</a>.</p>
+
+<p>In particular, you will notice a massively redesigned [% terms.bug %]
+ editing form, in addition to our <a href="#v32_feat_skin">new skin</a>.</p>
+
+<h3 id="v32_feat_skin">New Default Skin: Dusk</h3>
+
+<p>[% terms.Bugzilla %] 3.2 now ships with a skin called "Dusk" that is
+ a bit more colorful than old default "Classic" skin.</p>
+
+<p>Upgrading installations will still default to the "Classic"
+ skin--administrators can change the default in the Default Preferences
+ control panel. Users can also choose to use the old skin in their
+ Preferences (or using the View :: Page Style menu in Firefox).</p>
+
+<p>The changes that [% terms.Bugzilla %] required for Dusk made
+ [%+ terms.Bugzilla %] much easier to skin. See the
+ <a href="http://wiki.mozilla.org/Bugzilla:Addons#Skins">Addons page</a>
+ for additional skins, or try making your own!</p>
+
+<h3 id="v32_feat_status">Custom Status Workflow</h3>
+
+<p>You can now customize the list of statuses in [% terms.Bugzilla %],
+ and transitions between them.</p>
+
+<p>You can also specify that a comment must be made on certain transitions.</p>
+
+<h3 id="v32_feat_fields">New Custom Field Types</h3>
+
+<p>[% terms.Bugzilla %] 3.2 has support for three new types of
+ custom fields:</p>
+
+<ul>
+ <li>Large Text: Adds a multi-line textbox to your [% terms.bugs %].</li>
+ <li>Multiple Selection Box: Adds a box that allows you to choose
+ multiple items from a list.</li>
+ <li>Date/Time: Displays a date and time, along with a JavaScript
+ calendar popup to make picking a date easier.</li>
+</ul>
+
+<h3 id="v32_feat_install">Easier Installation</h3>
+
+<p>[% terms.Bugzilla %] now comes with a script called
+ <kbd>install-module.pl</kbd> that can automatically download
+ and install all of the required Perl modules for [% terms.Bugzilla %].
+ It stores them in a directory inside your [% terms.Bugzilla %]
+ installation, so you can use it even if you don't have administrator-level
+ access to your machine, and without modifying your main Perl install.</p>
+
+<p><kbd>checksetup.pl</kbd> will print out instructions for using
+ <kbd>install-module.pl</kbd>, or you can read its
+ <a href="[% docs_urlbase FILTER html %]api/install-module.html">documentation</a>.</p>
+
+<h3 id="v32_feat_oracle">Experimental Oracle Support</h3>
+
+<p>[% terms.Bugzilla %] 3.2 contains experimental support for using
+ Oracle as its database. Some features of [% terms.Bugzilla %] are known
+ to be broken on Oracle, but hopefully will be working by our next major
+ release.</p>
+
+<p>The [% terms.Bugzilla %] Project, as an open-source project, of course
+ does not recommend the use of proprietary database solutions. However,
+ if your organization requires that you use Oracle, this will allow
+ you to use [% terms.Bugzilla %]!</p>
+
+<p>The [% terms.Bugzilla %] Project thanks Oracle Corp. for their extensive
+ development contributions to [% terms.Bugzilla %] which allowed this to
+ happen!</p>
+
+<h3 id="v32_feat_utf8">Improved UTF-8 Support</h3>
+
+<p>[% terms.Bugzilla %] 3.2 now has advanced UTF-8 support in its code,
+ including correct handling for truncating and wrapping multi-byte
+ languages. Major issues with multi-byte or unusual languages
+ are now resolved, and [% terms.Bugzilla %] should now be usable
+ by users in every country with little (or at least much less)
+ customization.</p>
+
+<h3 id="v32_feat_grcons">Group Icons</h3>
+
+<p>Administrators can now specify that users who are in certain groups
+ should have an icon appear next to their name whenever they comment.
+ This is particularly useful for distinguishing developers from
+ [%+ terms.bug %] reporters.</p>
+
+<h3 id="v32_feat_other">Other Enhancements and Changes</h3>
+
+<p>These are either minor enhancements, or enhancements that have
+ very short descriptions. Some of these are very useful, though!</p>
+
+<h4>Enhancements For Users</h4>
+
+<ul>
+ <li><strong>[% terms.Bugs %]</strong>: You can now reassign
+ [%+ terms.abug %] at the same time as you are changing its status.</li>
+ <li><strong>[% terms.Bugs %]</strong>: When entering [% terms.abug %],
+ you will now see the description of a component when you select it.</li>
+ <li><strong>[% terms.Bugs %]</strong>: The [% terms.bug %] view now
+ contains some <a href="http://microformats.org/about/">Microformats</a>,
+ most notably for users' names and email addresses.</li>
+ <li><strong>[% terms.Bugs %]</strong>: You can now remove a QA Contact
+ from [% terms.abug %] simply by clearing the QA Contact field.</li>
+ <li><strong>[% terms.Bugs %]</strong>: There is now a user preference
+ that will allow you to exclude the quoted text when replying
+ to comments.</li>
+ <li><strong>[% terms.Bugs %]</strong>: You can now expand or collapse
+ individual comments in the [% terms.bug %] view.</li>
+
+ <li><strong>Attachments</strong>: There is now "mid-air collision"
+ protection when editing attachments.</li>
+ <li><strong>Attachments</strong>: Patches in the Diff Viewer now show
+ line numbers (<a href="https://bugzilla.mozilla.org/attachment.cgi?id=327546">Example</a>).</li>
+ <li><strong>Attachments</strong>: After creating or updating an attachment,
+ you will be immediately shown the [% terms.bug %] that the attachment
+ is on.</li>
+
+ <li><strong>Search</strong>: You can now reverse the sort of
+ [%+ terms.abug %] list by clicking on a column header again.</li>
+ <li><strong>Search</strong>: Atom feeds of [% terms.bug %] lists now
+ contain more fields.</li>
+ <li><strong>Search</strong>: QuickSearch now supports searching flags
+ and groups. It also now includes the OS field in the list of fields
+ it searches by default.</li>
+ <li><strong>Search</strong>: "Help" text can now appear on query.cgi
+ for Internet Explorer and other non-Firefox browsers. (It always
+ could appear for Firefox.)</li>
+
+ <li>[% terms.Bugzilla %] now ships with an icon that will show
+ up next to the URL in most browsers. If you want to replace it,
+ it's in <kbd>images/favicon.ico</kbd>.</li>
+
+ <li>You can now set the Deadline when using "Change Several
+ [%+ terms.Bugs %] At Once"</li>
+ <li><strong>Saved Searches</strong> now save their column list, so if
+ you customize the list of columns and save your search, it will
+ always contain those columns.</li>
+ <li><strong>Saved Searches</strong>: When you share a search, you can
+ now see how many users have subscribed to it, on
+ <kbd>userprefs.cgi</kbd>.</li>
+ <li><strong>Saved Searches</strong>: You can now see what group a
+ shared search was shared to, on the list of available shared searches
+ in <kbd>userprefs.cgi</kbd>.</li>
+ <li><strong>Flags</strong>: If your installation uses drop-down user
+ lists, the flag requestee box will now contain only users who are
+ actually allowed to take requests.</li>
+ <li><strong>Flags</strong>: If somebody makes a request to you, and you
+ change the requestee to somebody else, the requester is no longer set
+ to you. In other words, you can "redirect" requests and maintain the
+ original requester.</li>
+ <li><strong>Flags</strong>: Emails about flags now will thread properly
+ in email clients to be a part of [% terms.abug %]'s thread.</li>
+ <li>When using <kbd>email_in.pl</kbd>, you can now add users to the CC
+ list by just using <kbd>@cc</kbd> as the field name.</li>
+ <li>Many pages (particularly administrative pages) now contain links to
+ the relevant section of the [% terms.Bugzilla %] Guide, so you can read
+ the documentation for that page.</li>
+ <li>Dependency Graphs should render more quickly, as they now (by default)
+ only include the same [% terms.bugs %] that you'd see in the dependency
+ tree.</li>
+</ul>
+
+<h4>Enhancements For Administrators</h4>
+
+<ul>
+ <li><strong>Admin UI</strong>: Instead of having the Administration
+ Control Panel links in the footer, there is now just one link called
+ "Administration" that takes you to a page that links to all the
+ administrative controls for [% terms.Bugzilla %].</li>
+ <li><strong>Admin UI</strong>: Administrative pages no longer display
+ confirmation pages, instead they redirect you to some useful page
+ and display a message about what changed.</li>
+ <li><strong>Admin UI</strong>: The interface for editing group
+ inheritance in <kbd>editgroups.cgi</kbd> is much clearer now.</li>
+ <li><strong>Admin UI</strong>: When editing a user, you can now see
+ all the components where that user is the Default Assignee or Default
+ QA Contact.</li>
+
+ <li><strong>Email</strong>: For installations that use SMTP to send
+ mail (as opposed to Sendmail), [%+ terms.Bugzilla %] now supports
+ SMTP Authentication, so that it can log in to your mail server
+ before sending messages.</li>
+ <li><strong>Email</strong>: Using the "Test" mail delivery method now
+ creates a valid mbox file to make testing easier.</li>
+
+ <li><strong>Authentication</strong>: [% terms.Bugzilla %] now correctly
+ handles LDAP records which contain multiple email addresses. (The first
+ email address in the list that is a valid [% terms.Bugzilla %] account
+ will be used, or if this is a new user, the first email address in
+ the list will be used.)</li>
+ <li><strong>Authentication</strong>: [% terms.Bugzilla %] can now take
+ a list of LDAP servers to try in order until it gets a successful
+ connection.</li>
+ <li><strong>Authentication</strong>: [% terms.Bugzilla %] now supports
+ RADIUS authentication.</li>
+
+ <li><strong>Security</strong>: The login cookie is now created as
+ "HTTPOnly" so that it can't be read by possibly malicious scripts.
+ Also, if SSL is enabled on your installation, the login cookie is
+ now only sent over SSL connections.</li>
+ <li><strong>Security</strong>: The <code>ssl</code> parameter now protects
+ every page a logged-in user accesses, when set to "authenticated sessions."
+ Also, SSL is now enforced appropriately in the WebServices interface when
+ the parameter is set.</li>
+
+ <li><strong>Database</strong>: [% terms.Bugzilla %] now uses transactions in
+ the database instead of table locks. This should generally improve
+ performance with many concurrent users. It also means if there is
+ an unexpected error in the middle of a page, all database changes made
+ during that page will be rolled back.</li>
+ <li><strong>Database</strong>: You no longer have to set
+ <code>max_packet_size</code> in MySQL to add large attachments. However,
+ you may need to set it manually if you restore a mysqldump into your
+ database.</li>
+
+ <li>New WebService functions:
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html">B<!-- -->ug.add_comment</a>
+ and <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bugzilla.html">Bugzilla.extensions</a>.</li>
+
+ <li>You can now delete custom fields, but only if they have never been
+ set on any [% terms.bug %].</li>
+ <li>There is now a <kbd>--reset-password</kbd> argument to
+ <kbd>checksetup.pl</kbd> that allows you to reset a user's password
+ from the command line.</li>
+ <li>There is now a script called <kbd>sanitycheck.pl</kbd> that you can
+ run from the command line. It works just like <kbd>sanitycheck.cgi</kbd>.
+ By default, it only outputs anything if there's an error, so it's
+ ideal for administrators who want to run it nightly in a cron job.</li>
+ <li>The <kbd>strict_isolation</kbd> parameter now prevents you from setting
+ users who cannot see [% terms.abug %] as a CC, Assignee, or QA
+ Contact. Previously it only prevented you from adding users who
+ could not <em>edit</em> the [% terms.bug %].</li>
+ <li>Extensions can now add their own headers to the HTML &lt;head&gt;
+ for things like custom CSS and so on.</li>
+ <li><kbd>sanitycheck.cgi</kbd> has been templatized, meaning that the
+ entire [% terms.Bugzilla %] UI is now contained in templates.</li>
+ <li>When setting the <kbd>sslbase</kbd> parameter, you can now specify
+ a port number in the URL.</li>
+ <li>When importing [% terms.bugs %] using <kbd>importxml.pl</kbd>,
+ attachments will have their actual creator set as their creator,
+ instead of the person who exported the [% terms.bug %] from the other
+ system.</li>
+ <li>The voting system is off by default in new installs. This is to
+ prepare for the fact that it will be moved into an extension at
+ some point in the future.</li>
+ <li>The <code>shutdownhtml</code> parameter now works even when
+ [%+ terms.Bugzilla %]'s database server is down.</li>
+</ul>
+
+<h3>Enhancements for Localizers (or Localized Installations)</h3>
+
+<ul>
+ <li>The documentation can now be localized--in other words, you can have
+ documentation installed for multiple languages at once and
+ [%+ terms.Bugzilla %] will link to the correct language in its internal
+ documentation links.</li>
+ <li>[% terms.Bugzilla %] no longer uses the <kbd>languages</kbd> parameter.
+ Instead it reads the <kbd>template/</kbd> directory to see which
+ languages are available.</li>
+ <li>Some of the messages printed by <kbd>checksetup.pl</kbd> can now
+ be localized. See <kbd>template/en/default/setup/strings.txt.pl</kbd>.
+</ul>
+
+<h2 id="v32_issues">Outstanding Issues</h2>
+
+<ul>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=423439">
+ [%- terms.Bug %] 423439</a>: Tabs in comments will be converted
+ to four spaces, due to a b<!-- -->ug in Perl as of Perl 5.8.8.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=69621">
+ [%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is
+ in use on [% terms.bugs %], you will need to rebuild the "keyword cache"
+ by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
+ the option to rebuild the cache when it asks. Otherwise keywords may
+ not show up properly in search results.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=89822">
+ [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
+ the same time, there is no "mid-air collision" protection.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=276230">
+ [%- terms.Bug %] 276230</a>: The support for restricting access to
+ particular Categories of New Charts is not complete. You should treat
+ the 'chartgroup' Param as the only access mechanism available.<br>
+ However, charts migrated from Old Charts will be restricted to
+ the groups that are marked MANDATORY for the corresponding Product.
+ There is currently no way to change this restriction, and the
+ groupings will not be updated if the group configuration
+ for the Product changes.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370370">
+ [%- terms.Bug %] 370370</a>: mod_perl support is currently not
+ working on Windows machines.</li>
+</ul>
+
+<h2 id="v32_upgrading">How to Upgrade From An Older Version</h2>
+
+<h3 id="v32_upgrading_notes">Notes For Upgraders</h3>
+
+<ul>
+ <li>If you upgrade by CVS, the <kbd>extensions</kbd> and
+ <kbd>skins/contrib</kbd> directories are now in CVS instead of
+ being created by <kbd>checksetup.pl</kbd> If you do a <kbd>cvs update</kbd>
+ from 3.0, you will be told that your directories are "in the way" and
+ you should delete (or move) them and then do <kbd>cvs update</kbd>
+ again. Also, the <kbd>docs</kbd> directory has been restructured
+ and after you <kbd>cvs update</kbd> you can delete the <kbd>docs/html</kbd>,
+ <kbd>docs/pdf</kbd>, <kbd>docs/txt</kbd>, and <kbd>docs/xml</kbd>
+ directories.</li>
+ <li>If you are using MySQL, you should know that [% terms.Bugzilla %]
+ now uses InnoDB for all tables. <kbd>checksetup.pl</kbd> will convert
+ your tables automatically, but if you have InnoDB disabled,
+ the upgrade will not be able to complete (and <kbd>checksetup.pl</kbd>
+ will tell you so).</li>
+
+ <li><strong>You should also read the
+ <a href="#v30_upgrading_notes">[% terms.Bugzilla %] 3.0 Notes For Upgraders
+ section</a> of the
+ <a href="#v32_previous">previous release notes</a> if you are upgrading
+ from a version before 3.0.</strong></li>
+</ul>
+
+<h3>Steps For Upgrading</h3>
+
+<p>Once you have read the notes above, see the
+ <a href="[% docs_urlbase FILTER html %]upgrade.html">Upgrading
+ documentation</a> for instructions on how to upgrade.</p>
+
+<h2 id="v32_code_changes">Code Changes Which May Affect Customizations</h2>
+
+<ul>
+ <li><a href="#v32_code_hooks">More Hooks!</a></li>
+ <li><a href="#v32_code_search">Search.pm Rearchitecture</a></li>
+ <li><a href="#v32_code_lib">lib Directory</a></li>
+ <li><a href="#v32_code_other">Other Changes</a></li>
+</ul>
+
+<h3 id="v32_code_hooks">More Hooks!</h3>
+
+<p>There are more code hooks in 3.2 than there were in 3.0. See the
+ documentation of <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Hook.html">Bugzilla::Hook</a>
+ for more details.</p>
+
+<h3 id="v32_code_search">Search.pm Rearchitecture</h3>
+
+<p><kbd>Bugzilla/Search.pm</kbd> has been heavily modified, to be much
+ easier to read and use. It contains mostly the same code as it did in
+ 3.0, but it has been moved around and reorganized significantly.</p>
+
+<h3 id="v32_code_lib">lib Directory</h3>
+
+<p>As part of implementing <a href="#v32_feat_install">install-module.pl</a>,
+ [%+ terms.Bugzilla %] was given a local <kbd>lib</kbd> directory which
+ it searches for modules, in addition to the standard system path.</p>
+
+<p>This means that all [% terms.Bugzilla %] scripts now start with
+ <code>use lib qw(. lib);</code> as one of the first lines.</p>
+
+<h3 id="v32_code_other">Other Changes</h3>
+
+<ul>
+ <li>You should now be using <code>get_status('NEW')</code> instead of
+ <code>status_descs.NEW</code> in templates.</li>
+ <li>The <code>[&#37;# version = 1.0 &#37;]</code> comment at the top of every
+ template file has been removed.</li>
+</ul>
+
+<h1 id="v32_previous">[% terms.Bugzilla %] 3.0.x Release Notes</h1>
+
+<h2>Table of Contents</h2>
+
+<ul class="bz_toc">
+ <li><a href="#v30_introduction">Introduction</a></li>
+ <li><a href="#v30_point">Updates In This 3.0.x Release</a></li>
+ <li><a href="#v30_req">Minimum Requirements</a></li>
+ <li><a href="#v30_feat">New Features and Improvements</a></li>
+ <li><a href="#v30_issues">Outstanding Issues</a></li>
+ <li><a href="#v30_security">Security Fixes In This Release</a></li>
+ <li><a href="#v30_upgrading">How to Upgrade From An Older Version</a></li>
+ <li><a href="#v30_code_changes">Code Changes Which May Affect
+ Customizations</a></li>
+ <li><a href="#v30_previous">Release Notes for Previous Versions</a></li>
+</ul>
+
+<h2 id="v30_introduction">Introduction</h2>
+
+<p>Welcome to [% terms.Bugzilla %] 3.0! It's been over eight years since
+ we released [% terms.Bugzilla %] 2.0, and everything has changed since
+ then. Even just since our previous release, [% terms.Bugzilla %] 2.22,
+ we've added a <em>lot</em> of new features. So enjoy the release, we're
+ happy to bring it to you.</p>
+
+<p>If you're upgrading, make sure to read <a href="#v30_upgrading">How to
+ Upgrade From An Older Version</a>. If you are upgrading from a release
+ before 2.22, make sure to read the release notes for all the
+ <a href="#v30_previous">previous versions</a> in between your version
+ and this one.</p>
+
+<h2 id="v30_point">Updates in this 3.0.x Release</h2>
+
+<p>This section describes what's changed in the most recent b<!-- -->ug-fix
+ releases of [% terms.Bugzilla %] after 3.0. We only list the
+ most important fixes in each release. If you want a detailed list of
+ <em>everything</em> that's changed in each version, you should use our
+ <a href="http://www.bugzilla.org/status/changes.html">Change Log Page</a>.</p>
+
+<h3>3.0.6</h3>
+
+<ul>
+ <li>Before 3.0.6, unexpected fatal WebService errors would result in
+ a <code>faultCode</code> that was a string instead of a number.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=446327">[% terms.Bug %] 446327</a>)</li>
+ <li>If you created a product or component with the same name as one you
+ previously deleted, it would fail with an error about the series table.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=247936">[% terms.Bug %] 247936</a>)</li>
+</ul>
+
+<p>See also the <a href="#v30_security">Security Advisory</a> section for
+ information about a security issue fixed in this release.</p>
+
+<h3>3.0.5</h3>
+
+<ul>
+ <li>If you don't have permission to set a flag, it will now appear
+ unchangeable in the UI.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=433851">[% terms.Bug %] 433851</a>)</li>
+ <li>If you were running mod_perl, [% terms.Bugzilla %] was not correctly
+ closing its connections to the database since 3.0.3, and so sometimes
+ the DB would run out of connections.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=441592">[% terms.Bug %] 441592</a>)</li>
+ <li>The installation script is now clear about exactly which
+ <code>Email::</code> modules are required in Perl, thus avoiding the
+ problem where emails show up with a body like
+ <samp>SCALAR(0xBF126795)</samp>.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=441541">[% terms.Bug %] 441541</a>)</li>
+ <li><a href="[% docs_urlbase FILTER html %]api/email_in.html">email_in.pl</a>
+ is no longer case-sensitive for values of <kbd>@product</kbd>.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=365697">[% terms.Bug %] 365697</a>)</li>
+</ul>
+
+<p>See also the <a href="#v30_security">Security Advisory</a> section for
+ information about security issues fixed in this release.</p>
+
+<h3>3.0.4</h3>
+
+<ul>
+ <li>[% terms.Bugzilla %] administrators were not being correctly notified
+ about new releases.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=414726">[% terms.Bug %] 414726</a>)</li>
+
+ <li>There could be extra whitespace in email subject lines.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=411544">[% terms.Bug %] 411544</a>)</li>
+
+ <li>The priority, severity, OS, and platform fields were always required by
+ the <kbd>B<!-- -->ug.create</kbd> WebService function, even if they had
+ defaults specified.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=384009">[% terms.Bug %] 384009</a>)</li>
+
+ <li>Better threading of [% terms.bug %]mail in some email clients.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=376453">[% terms.Bug %] 376453</a>)</li>
+
+ <li>There were many fixes to the Inbound Email Interface
+ (<kbd>email_in.pl</kbd>).
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=92274">[% terms.Bug %] 92274</a>,
+ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=377025">[% terms.Bug %] 377025</a>,
+ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=412943">[% terms.Bug %] 412943</a>,
+ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=413672">[% terms.Bug %] 413672</a>, and
+ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=431721">[% terms.Bug %] 431721</a>)</li>
+
+ <li>checksetup.pl now handles UTF-8 conversion more reliably during upgrades.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=374951">[% terms.Bug %] 374951</a>)</li>
+
+ <li>Comments written in CJK languages are now correctly word-wrapped.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=388723">[% terms.Bug %] 388723</a>)</li>
+
+ <li>All emails will now be sent in the correct language, when the user
+ has chosen a language for emails.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=405946">[% terms.Bug %] 405946</a>)
+
+ <li>On Windows, temporary files created when uploading attachments are now
+ correctly deleted when the upload is complete.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=414002">[% terms.Bug %] 414002</a>)</li>
+
+ <li><kbd>checksetup.pl</kbd> now prints correct installation instructions
+ for Windows users using Perl 5.10.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=414430">[% terms.Bug %] 414430</a>)
+</ul>
+
+<p>See also the <a href="#v30_security">Security Advisory</a> section for
+ information about security issues fixed in this release.</p>
+
+<h3>3.0.3</h3>
+
+<ul>
+ <li>mod_perl no longer compiles [% terms.Bugzilla %]'s code for each Apache
+ process individually. It now compiles code only once and shares it among
+ each Apache process. This greatly improves performance and highly
+ decreases the memory footprint.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=398241">[% terms.Bug %] 398241</a>)</li>
+
+ <li>You can now search for '---' (without quotes) in versions and milestones.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=362436">[% terms.Bug %] 362436</a>)</li>
+
+ <li>[% terms.Bugzilla %] should no longer break lines unnecessarily in
+ email subjects. This was causing trouble with some email clients.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=374424">[% terms.Bug %] 374424</a>)</li>
+
+ <li>If you had selected "I'm added to or removed from this capacity" option
+ for the "CC" role in your email preferences, you wouldn't get mail when
+ more than one person was added to the CC list at once.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=394796">[% terms.Bug %] 394796</a>)</li>
+
+ <li>Deleting a user account no longer deletes whines from another user who
+ has the deleted account as addressee. The schedule is simply removed,
+ but the whine itself is left intact.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=395924">[% terms.Bug %] 395924</a>)</li>
+
+ <li><kbd>contrib/merge-users.pl</kbd> now correctly merges all required
+ fields when merging two user accounts.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=400160">[% terms.Bug %] 400160</a>)</li>
+
+ <li>[% terms.Bugzilla %] no longer requires Apache::DBI to run under
+ mod_perl. It caused troubles such as lost connections with the DB and
+ didn't give any important performance gain.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=408766">[% terms.Bug %] 408766</a>)</li>
+</ul>
+
+<h3>3.0.2</h3>
+
+<ul>
+ <li>[% terms.Bugzilla %] should now work on Perl 5.9.5 (and thus the
+ upcoming Perl 5.10.0).
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=390442">[% terms.Bug %] 390442</a>)</li>
+</ul>
+
+<p>See also the <a href="#v30_security">Security Advisory</a> section for
+ information about an important security issue fixed in this release.</p>
+
+<h3>3.0.1</h3>
+
+<ul>
+ <li>For users of Firefox 2, the <code>show_bug.cgi</code> user interface
+ should no longer "collapse" after you modify [% terms.abug %].
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370739">[% terms.Bug %] 370739</a>)</li>
+ <li>If you can bless a group, and you share a saved search with that
+ group, it will no longer automatically appear in all of that group's
+ footers unless you specifically request that it automatically appear
+ in their footers.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=365890">[% terms.Bug %] 365890</a>)</li>
+ <li>There is now a parameter to allow users to perform searches without
+ any search terms. (In other words, to search for just a Product
+ and Status on the Simple Search page.) The parameter is called
+ <code>specific_search_allow_empty_words</code>.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=385910">[% terms.Bug %] 385910</a>)</li>
+ <li>If you attach a file that has a MIME-type of <code>text/x-patch</code>
+ or <code>text/x-diff</code>, it will automatically be treated as a
+ patch by [% terms.Bugzilla %].
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=365756">[% terms.Bug %] 365756</a>)</li>
+ <li>Dependency Graphs now work correctly on all mod_perl installations.
+ There should now be no remaining signficant problems with running
+ [%+ terms.Bugzilla %] under mod_perl.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370398">[% terms.Bug %] 370398</a>)</li>
+ <li>If moving [% terms.abug %] between products would remove groups
+ from the [% terms.bug %], you are now warned.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=303183">[% terms.Bug %] 303183</a>)</li>
+ <li>On IIS, whenever [% terms.Bugzilla %] threw a warning, it would
+ actually appear on the web page. Now warnings are suppressed,
+ unless you have a file in the <code>data</code> directory called
+ <code>errorlog</code>, in which case warnings will be printed there.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=390148">[% terms.Bug %] 390148</a>)</li>
+ <li>If you used <kbd>email_in.pl</kbd> to edit [% terms.abug %] that was
+ protected by groups, all of the groups would be cleared.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=385453">[% terms.Bug %] 385453</a>)</li>
+ <li>PostgreSQL users: New Charts were failing to collect data over time.
+ They will now start collecting data correctly.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=257351">[% terms.Bug %] 257351</a>)</li>
+ <li>Some flag mails didn't specify who the requestee was.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=379787">[% terms.Bug %] 379787</a>)</li>
+ <li>Instead of throwing real errors, <kbd>collectstats.pl</kbd> would
+ just say that it couldn't find <code>ThrowUserError</code>.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=380709">[% terms.Bug %] 380709</a>)</li>
+ <li>Logging into [% terms.Bugzilla %] from the home page works again
+ with IIS5.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=364008">[% terms.Bug %] 364008</a>)</li>
+ <li>If you were using SMTP for sending email, sometimes emails would
+ be missing the <code>Date</code> header.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=304999">[% terms.Bug %] 304999</a>).</li>
+ <li>In the XML-RPC WebService, <code>B<!-- -->ug.legal_values</code> now
+ correctly returns values for custom fields if you request values
+ for custom fields.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=381737">[% terms.Bug %] 381737</a>)</li>
+ <li>The "[% terms.Bug %]-Writing Guidelines" page has been shortened
+ and re-written.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=378590">[% terms.Bug %] 378590</a>)</li>
+ <li>If your <code>urlbase</code> parameter included a port number,
+ like <code>www.domain.com:8080</code>, SMTP might have failed.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=384501">[% terms.Bug %] 384501</a>)</li>
+ <li>For SMTP users, there is a new parameter, <code>smtp_debug</code>.
+ Turning on this parameter will log the full information about
+ every SMTP session to your web server's error log, to help with
+ debugging issues with SMTP.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=384497">[% terms.Bug %] 384497</a>)</li>
+ <li>If you are a "global watcher" (you get all mails from every
+ [%+ terms.bug %]), you can now see that in your Email Preferences.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=365302">[% terms.Bug %] 365302</a>)</li>
+ <li>The Status and Resolution of [% terms.bugs %] are now correctly
+ localized in CSV search results.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=389517">[% terms.Bug %] 389517</a>)</li>
+ <li>The "Subject" line of an email was being mangled if it contained
+ non-Latin characters.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=387860">[% terms.Bug %] 387860</a>)</li>
+ <li>Editing the "languages" parameter using <kbd>editparams.cgi</kbd> would
+ sometimes fail, causing [% terms.Bugzilla %] to throw an error.
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=335354">[% terms.Bug %] 335354</a>)</li>
+</ul>
+
+<h2 id="v30_req">Minimum Requirements</h2>
+
+<p>Any requirements that are new since 2.22 will look like
+ <span class="req_new">this</span>.</p>
+
+<ul>
+ <li><a href="#v30_req_perl">Perl</a></li>
+ <li><a href="#v30_req_mysql">For MySQL Users</a></li>
+ <li><a href="#v30_req_pg">For PostgreSQL Users</a></li>
+ <li><a href="#v30_req_modules">Required Perl Modules</a></li>
+ <li><a href="#v30_req_optional_mod">Optional Perl
+ Modules</a></li>
+</ul>
+
+
+<h3 id="v30_req_perl">Perl</h3>
+
+<ul>
+ <li>Perl <span class="req_new">v<strong>5.8.0</strong></span> (non-Windows
+ platforms)</li>
+ <li>Perl v<strong>5.8.1</strong> (Windows platforms)</li>
+</ul>
+
+<h3 id="v30_req_mysql">For MySQL Users</h3>
+
+<ul>
+ <li>MySQL <span class="req_new">v4.1.2</span></li>
+ <li><strong>perl module:</strong> DBD::mysql v2.9003</li>
+</ul>
+
+<h3 id="v30_req_pg">For PostgreSQL Users</h3>
+
+<ul>
+ <li>PostgreSQL v8.00.0000</li>
+ <li><strong>perl module:</strong> DBD::Pg v1.45</li>
+</ul>
+
+<h3 id="v30_req_modules">Required Perl Modules</h3>
+
+<table class="req_table" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <th>Module</th> <th>Version</th>
+ </tr>
+ <tr><td>CGI</td> <td>2.93</td>
+ </tr>
+ <tr>
+ <td>Date::Format</td> <td>2.21</td>
+ </tr>
+ <tr>
+ <td>DBI</td>
+ <td class="req_new">1.41</td>
+ </tr>
+ <tr>
+ <td>File::Spec</td> <td>0.84</td>
+ </tr>
+ <tr>
+ <td>Template</td> <td>2.12</td>
+ </tr>
+ <tr>
+ <td class="req_new">Email::Send</td>
+ <td class="req_new">2.00</td>
+ </tr>
+ <tr>
+ <td>Email::MIME</td>
+ <td>1.861</td>
+ </tr>
+ <tr>
+ <td class="req_new">Email::MIME::Modifier</td>
+ <td class="req_new">1.442</td>
+ </tr>
+</table>
+
+<h3 id="v30_req_optional_mod">Optional Perl Modules</h3>
+
+<p>The following perl modules, if installed, enable various
+ features of [% terms.Bugzilla %]:</p>
+
+<table class="req_table" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <th>Module</th> <th>Version</th>
+ <th>Enables Feature</th>
+ </tr>
+ <tr>
+ <td class="req_new">LWP::UserAgent</td>
+ <td class="req_new">(Any)</td>
+ <td>Automatic Update Notifications</td>
+ </tr>
+ <tr>
+ <td>Template::Plugin::GD::Image</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td>GD::Graph</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td>GD::Text</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td>GD</td>
+ <td>1.20</td>
+ <td>Graphical Reports, New Charts, Old Charts</td>
+ </tr>
+ <tr>
+ <td class="req_new">Email::MIME::Attachment::Stripper</td>
+ <td class="req_new">(Any)</td>
+ <td>Inbound Email</td>
+ </tr>
+ <tr>
+ <td class="req_new">Email::Reply</td>
+ <td class="req_new">(Any)</td>
+ <td>Inbound Email</td>
+ </tr>
+ <tr>
+ <td>Net::LDAP</td>
+ <td>(Any)</td>
+ <td>LDAP Authentication</td>
+ </tr>
+ <tr>
+ <td>HTML::Parser</td>
+ <td>3.40</td>
+ <td>More HTML in Product/Group Descriptions</td>
+ </tr>
+ <tr>
+ <td>HTML::Scrubber</td>
+ <td>(Any)</td>
+ <td>More HTML in Product/Group Descriptions</td>
+ </tr>
+ <tr>
+ <td>XML::Twig</td>
+ <td>(Any)</td>
+ <td>Move [% terms.Bugs %] Between Installations</td>
+ </tr>
+ <tr>
+ <td>MIME::Parser</td>
+ <td>5.406</td>
+ <td>Move [% terms.Bugs %] Between Installations</td>
+ </tr>
+ <tr>
+ <td>Chart::Base</td>
+ <td>1.0</td>
+ <td>New Charts, Old Charts</td>
+ </tr>
+ <tr>
+ <td>Image::Magick</td>
+ <td>(Any)</td>
+ <td>Optionally Convert BMP Attachments to PNGs</td>
+ </tr>
+ <tr>
+ <td>PatchReader</td>
+ <td>0.9.4</td>
+ <td>Patch Viewer</td>
+ </tr>
+ <tr>
+ <td class="req_new">SOAP::Lite</td>
+ <td class="req_new">(Any)</td>
+ <td>XML-RPC Interface</td>
+ </tr>
+ <tr>
+ <td class="req_new">mod_perl2</td>
+ <td class="req_new">1.999022</td>
+ <td>mod_perl</td>
+ </tr>
+ <tr>
+ <td> CGI</td>
+ <td>3.11</td>
+ <td>mod_perl</td>
+ </tr>
+</table>
+
+<h2 id="v30_feat">New Features and Improvements</h2>
+
+<ul>
+ <li><a href="#v30_feat_cf">Custom Fields</a></li>
+ <li><a href="#v30_feat_mp">mod_perl Support</a></li>
+ <li><a href="#v30_feat_sq">Shared Saved Searches</a></li>
+ <li>
+ <a href="#v30_feat_afn">Attachments and Flags on New [% terms.Bugs %]</a>
+ </li>
+ <li><a href="#v30_feat_cr">Custom Resolutions</a></li>
+ <li><a href="#v30_feat_ppp">Per-Product Permissions</a></li>
+ <li><a href="#v30_feat_ui">User Interface Improvements</a></li>
+ <li><a href="#v30_feat_xml">XML-RPC Interface</a></li>
+ <li><a href="#v30_feat_skin">Skins</a></li>
+ <li><a href="#v30_feat_sbu">Unchangeable Fields Appear
+ Unchangeable</a></li>
+ <li><a href="#v30_feat_et">All Emails in Templates</a></li>
+ <li><a href="#v30_feat_df">No More Double-Filed [% terms.Bugs %]</a></li>
+ <li><a href="#v30_feat_cc">Default CC List for Components</a></li>
+ <li><a href="#v30_feat_emi">File/Modify [% terms.Bugs %] By Email</a></li>
+ <li><a href="#v30_feat_gw">Users Who Get All [% terms.Bug %]
+ Notifications</a></li>
+ <li><a href="#v30_feat_utf8">Improved UTF-8 Support</a></li>
+ <li><a href="#v30_feat_upda">Automatic Update Notification</a></li>
+ <li><a href="#v30_feat_welc">Welcome Page for New Installs</a></li>
+ <li><a href="#v30_feat_other">Other Enhancements and Changes</a></li>
+</ul>
+
+<h3 id="v30_feat_cf">Custom Fields</h3>
+
+<p>[% terms.Bugzilla %] now includes very basic support for custom fields.</p>
+
+<p>Users in the <kbd>admin</kbd> group can add plain-text or drop-down
+ custom fields. You can edit the values available for drop-down fields
+ using the &quot;Field Values&quot; control panel.</p>
+
+<p>Don't add too many custom fields! It can make [% terms.Bugzilla %]
+ very difficult to use. Try your best to get along with the default
+ fields, and then if you find that you can't live without custom fields
+ after a few weeks of using [% terms.Bugzilla %], only then should you
+ start your custom fields.</p>
+
+<h3 id="v30_feat_mp">mod_perl Support</h3>
+
+<p>[% terms.Bugzilla %] 3.0 supports mod_perl, which allows for extremely
+ enhanced page-load performance. mod_perl trades memory usage for performance,
+ allowing near-instantaneous page loads, but using much more memory.</p>
+
+<p>If you want to enable mod_perl for your [% terms.Bugzilla %], we recommend
+ a minimum of 1.5GB of RAM, and for a site with heavy traffic, 4GB to 8GB.</p>
+
+<p>If performance isn't that critical on your installation, you don't
+ have the memory, or you are running some other web server than
+ Apache, [% terms.Bugzilla %] still runs perfectly as a normal CGI
+ application, as well.</p>
+
+<h3 id="v30_feat_sq">Shared Saved Searches</h3>
+
+<p>Users can now choose to &quot;share&quot; their saved searches
+ with a certain group. That group will then be able to
+ &quot;subscribe&quot; to those searches, and have them appear
+ in their footer.</p>
+
+<p>If the sharer can &quot;bless&quot; the group he's sharing to,
+ (that is, if he can add users to that group), it's considered
+ that he's a manager of that group, and his queries show up
+ automatically in that group's footer (although they can
+ unsubscribe from any particular search, if they want.)</p>
+
+<p>In order to allow a user to share their queries, they also
+ have to be a member of the group specified in the
+ <code>querysharegroup</code> parameter.</p>
+
+<p>Users can control their shared and subscribed queries from
+ the &quot;Preferences&quot; screen.</p>
+
+<h3 id="v30_feat_afn">Attachments and Flags on New [% terms.Bugs %]</h3>
+
+<p>You can now add an attachment while you are filing a new
+ [%+ terms.bug %].</p>
+
+<p>You can also set flags on the [% terms.bug %] and on attachments, while
+ filing a new [% terms.bug %].</p>
+
+<h3 id="v30_feat_cr">Custom Resolutions</h3>
+
+<p>You can now customize the list of resolutions available
+ in [% terms.Bugzilla %], including renaming the default resolutions.</p>
+
+<p>The resolutions <code>FIXED</code>, <code>DUPLICATE</code>
+ and <code>MOVED</code> have a special meaning to [% terms.Bugzilla %],
+ though, and cannot be renamed or deleted.</p>
+
+<h3 id="v30_feat_ppp">Per-Product Permissions</h3>
+
+<p>You can now grant users <kbd>editbugs</kbd> and <kbd>canconfirm</kbd>
+ for only certain products. You can also grant users <kbd>editcomponents</kbd>
+ on a product, which means they will be able to edit that product
+ including adding/removing components and other product-specific
+ controls.</p>
+
+<h3 id="v30_feat_ui">User Interface Improvements</h3>
+
+<p>There has been some work on the user interface for [% terms.Bugzilla %] 3.0,
+ including:</p>
+
+<ul>
+ <li>There is now navigation and a search box a the <em>top</em> of
+ each page, in addition to the bar at the bottom of the page.</li>
+ <li>A re-designed &quot;Format for Printing&quot; page for
+ [%+ terms.bugs %].</li>
+ <li>The layout of <kbd>show_bug.cgi</kbd> (the [% terms.bug %] editing
+ page) has been changed, and the attachment table has been redesigned.</li>
+</ul>
+
+<h3 id="v30_feat_xml">XML-RPC Interface</h3>
+
+<p>[% terms.Bugzilla %] now has a Web Services interface using the XML-RPC
+ protocol. It can be accessed by external applications by going
+ to the <kbd>xmlrpc.cgi</kbd> on your installation.</p>
+
+<p>Documentation can be found in the
+ <a href="[% docs_urlbase FILTER html %]api/">[% terms.Bugzilla %]
+ API Docs</a>, in the various <kbd>Bugzilla::WebService</kbd> modules.</p>
+
+<h3 id="v30_feat_skin">Skins</h3>
+
+<p>[% terms.Bugzilla %] can have multiple &quot;skins&quot; installed,
+ and users can pick between them. To write a skin, you just have to
+ write several CSS files. See the <a href="[% docs_urlbase FILTER html %]cust-skins.html">Custom
+ Skins Documentation</a> for more details.</p>
+
+<p>We currently don't have any alternate skins shipping with
+ [%+ terms.Bugzilla %]. If you write an alternate skin, please
+ let us know!</p>
+
+<h3 id="v30_feat_sbu">Unchangeable Fields Appear Unchangeable</h3>
+
+<p>As long as you are logged in, when viewing [% terms.abug %], if you
+ cannot change a field, it will not look like you can change it. That
+ is, the value will just appear as plain text.</p>
+
+<h3 id="v30_feat_et">All Emails in Templates</h3>
+
+<p>All outbound emails are now controlled by the templating system.
+ What used to be the <code>passwordmail</code>, <code>whinemail</code>,
+ <code>newchangedmail</code> and <code>voteremovedmail</code>
+ parameters are now all templates in the <kbd>template/</kbd> directory.</p>
+
+<p>This means that it's now much easier to customize your outbound
+ emails, and it's also possible for localizers to have more
+ localized emails as part of their language packs, if they want.</p>
+
+<p>We also added a <code>mailfrom</code> parameter to let you set
+ who shows up in the <code>From</code> field on all emails that
+ [%+ terms.Bugzilla %] sends.</p>
+
+<h3 id="v30_feat_df">No More Double-Filed [% terms.Bugs %]</h3>
+
+<p>Users of [% terms.Bugzilla %] will sometimes accidentally submit
+ [%+ terms.abug %] twice, either by going back in their web browser,
+ or just by refreshing a page. In the past, this could file the same
+ [%+ terms.bug %] twice (or even three times) in a row, irritating
+ developers and confusing users.</p>
+
+<p>Now, if you try to submit [% terms.abug %] twice from the same screen
+ (by going back or by refreshing the page), [% terms.Bugzilla %] will warn
+ you about what you're doing, before it actually submits the duplicate
+ [%+ terms.bug %].</p>
+
+<h3 id="v30_feat_cc">Default CC List for Components</h3>
+
+<p>You can specify a list of users who will <em>always</em> be added to
+ the CC list of new [% terms.bugs %] in a component.</p>
+
+<h3 id="v30_feat_emi">File/Modify [% terms.Bugs %] By Email</h3>
+
+<p>You can now file or modify [% terms.bugs %] via email. Previous versions
+ of [% terms.Bugzilla %] included this feature only as an
+ unsupported add-on, but it is now an official interface to
+ [%+ terms.Bugzilla %].</p>
+
+<p>For more details see the <a href="[% docs_urlbase FILTER html %]api/email_in.html">documentation
+ for email_in.pl</a>.</p>
+
+<h3 id="v30_feat_gw">Users Who Get All [% terms.Bug %] Notifications</h3>
+
+<p>There is now a parameter called <kbd>globalwatchers</kbd>. This
+ is a comma-separated list of [% terms.Bugzilla %] users who will
+ get all [% terms.bug %] notifications generated by [% terms.Bugzilla %].</p>
+
+<p>Group controls still apply, though, so users who can't see [% terms.abug %]
+ still won't get notifications about that [% terms.bug %].</p>
+
+<h3 id="v30_feat_utf8">Improved UTF-8 Support</h3>
+
+<p>[% terms.Bugzilla %] users running MySQL should now have excellent
+ UTF-8 support if they turn on the <kbd>utf8</kbd> parameter. (New
+ installs have this parameter on by default.) [% terms.Bugzilla %]
+ now correctly supports searching and sorting in non-English languages,
+ including multi-bytes languages such as Chinese.</p>
+
+<h3 id="v30_feat_upda">Automatic Update Notification</h3>
+
+<p>If you belong to the <kbd>admin</kbd> group, you will be notified
+ when you log in if there is a new release of [% terms.Bugzilla %]
+ available to download.</p>
+
+<p>You can control these notifications by changing the
+ <kbd>upgrade_notification</kbd> parameter.</p>
+
+<p>If your [% terms.Bugzilla %] installation is on a machine that needs to go
+ through a proxy to access the web, you may also have to set the
+ <kbd>proxy_url</kbd> parameter.</p>
+
+<h3 id="v30_feat_welc">Welcome Page for New Installs</h3>
+
+<p>When you log in for the first time on a brand-new [% terms.Bugzilla %]
+ installation, you will be presented with a page that describes
+ where you should go from here, and what parameters you should set.</p>
+
+<h3 id="v30_feat_qs">QuickSearch Plugin for IE7 and Firefox 2</h3>
+
+<p>Firefox 2 users and Internet Explorer 7 users will be presented
+ with the option to add [% terms.Bugzilla %] to their search bar.
+ This uses the
+ <a href="page.cgi?id=quicksearch.html">QuickSearch syntax</a>.</p>
+
+<h3 id="v30_feat_other">Other Enhancements and Changes</h3>
+
+<p>These are either minor enhancements, or enhancements that have
+ very short descriptions. Some of these are very useful, though!</p>
+
+<h4>Enhancements That Affect [% terms.Bugzilla %] Users</h4>
+
+<ul>
+ <li>In comments, quoted text (lines that start with <kbd>&gt;</kbd>)
+ will be a different color from normal text.</li>
+ <li>There is now a user preference that will add you to the CC list
+ of any [% terms.bug %] you modify. Note that it's <strong>on</strong>
+ by default.</li>
+ <li>[% terms.Bugs %] can now be filed with an initial state of
+ <kbd>ASSIGNED</kbd>, if you are in the <kbd>editbugs</kbd> group.</li>
+ <li>By default, comment fields will zoom large when you are typing in them,
+ and become small when you move out of them. You can disable this
+ in your user preferences.</li>
+ <li>You can hide obsolete attachments on [% terms.abug %] by clicking
+ &quot;Hide Obsolete&quot; at the bottom of the attachment table.</li>
+ <li>If [% terms.abug %] has flags set, and you move it to a different
+ product that has flags with the same name, the flags will be
+ preserved.</li>
+ <li>You now can't request a flag to be set by somebody who can't set it
+ ([% terms.Bugzilla %] will throw an error if you try).</li>
+ <li>Many new headers have been added to outbound [% terms.Bugzilla %]
+ [%+ terms.bug %] emails: <code>X-Bugzilla-Status</code>,
+ <code>X-Bugzilla-Priority</code>, <code>X-Bugzilla-Assigned-To</code>,
+ <code>X-Bugzilla-Target-Milestone</code>, and
+ <code>X-Bugzilla-Changed-Fields</code>, <code>X-Bugzilla-Who</code>.
+ You can look at an email to get an idea of what they contain.</li>
+ <li>In addition to the old <code>X-Bugzilla-Reason</code> email header
+ which tells you why you got an email, if you got an email because
+ you were watching somebody, there is now an
+ <code>X-Bugzilla-Watch-Reason</code> header that tells you who you
+ were watching and what role they had.</li>
+ <li>If you hover your mouse over a full URL (like
+ <code>http://bugs.mycompany.com/show_bug.cgi?id=1212</code>) that
+ links to [% terms.abug %], you will see the title of the
+ [%+ terms.bug %]. Of course, this only works for [% terms.bugs %] in your
+ [%+ terms.Bugzilla %] installation.</li>
+ <li>If your installation has user watching enabled, you will now see
+ the users that you can remove from your watch-list as a multi-select
+ box, much like the current CC list. (Previously it was just a text
+ box.)</li>
+ <li>When a user creates their own account in [% terms.Bugzilla %], the
+ account is now not actually created until they verify their email
+ address by clicking on a link that is emailed to them.</li>
+ <li>You can change [% terms.abug %]'s resolution without reopening it.</li>
+ <li>When you view the dependency tree on [% terms.abug %], resolved
+ [%+ terms.bugs %] will be hidden by default. (In previous versions,
+ resolved [% terms.bugs %] were shown by default.)</li>
+ <li>When viewing [% terms.bug %] activity, fields that hold [% terms.bug %]
+ numbers (such as &quot;Blocks&quot;) will have the [% terms.bug %] numbers
+ displayed as links to those [% terms.bugs %].</li>
+ <li>When viewing the &quot;Keywords&quot; field in [% terms.abug %] list,
+ it will be sorted alphabetically, so you can sanely sort a list on
+ that field.</li>
+ <li>In most places, the Version field is now sorted using a version-sort
+ (so 1.10 is greater than 1.2) instead of an alphabetical sort.</li>
+ <li>Options for flags will only appear if you can set them. So, for
+ example, if you can't grant <kbd>+</kbd> on a flag, that option
+ won't appear for you.</li>
+ <li>You can limit the product-related output of <kbd>config.cgi</kbd>
+ by specifying a <kbd>product=</kbd> URL argument, containing the name
+ of a product. You can specify the argument more than once for multiple
+ products.</li>
+ <li>You can now search the boolean charts on whether or not a comment
+ is private.</li>
+</ul>
+
+<h4>Enhancements For Administrators</h4>
+
+<ul>
+ <li>Administrators can now delete attachments, making them disappear
+ entirely from [% terms.Bugzilla %].</li>
+ <li><kbd>sanitycheck.cgi</kbd> can now only be accessed by users
+ in the <kbd>editcomponents</kbd> group.</li>
+ <li>The &quot;Field Values&quot; control panel can now only be accessed
+ by users in the <kbd>admin</kbd> group. (Previously it was accessible
+ to anybody in the <kbd>editcomponents</kbd> group.)</li>
+ <li>There is a new parameter <kbd>announcehtml</kbd>, that will allow
+ you to enter some HTML that will be displayed at the top of every
+ page, as an announcement.</li>
+ <li>The <kbd>loginnetmask</kbd> parameter now defaults to 0 for new
+ installations, meaning that as long as somebody has the right
+ login cookie, they can log in from any IP address. This makes
+ life a lot easier for dial-up users or other users whose IP
+ changes a lot. This could be done because the login cookie is now
+ very random, and thus secure.</li>
+ <li>Classifications now have sortkeys, so they can be sorted in an
+ order that isn't alphabetical.</li>
+ <li>Authentication now supports LDAP over SSL (LDAPS) or TLS (using
+ the STARTLS command) in addition to plain LDAP.</li>
+ <li>LDAP users can have their LDAP username be their email address,
+ instead of having the LDAP <kbd>mail</kbd> attribute be their
+ email address. You may wish to set the <kbd>emailsuffix</kbd>
+ parameter if you do this.</li>
+ <li>Administrators can now see what has changed in a user account,
+ when using the &quot;Users&quot; control panel.</li>
+ <li><code>REMIND</code> and <code>LATER</code> are no longer part
+ of the default list of resolutions. Upgrading installations will
+ not be affected--they will still have these resolutions.</li>
+ <li><kbd>editbugs</kbd> is now the default for the <kbd>timetrackinggroup</kbd>
+ parameter, meaning that time-tracking will be on by default in a new
+ installation.</li>
+</ul>
+
+<h2 id="v30_issues">Outstanding Issues</h2>
+
+<ul>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=69621">
+ [%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is
+ in use on [% terms.bugs %], you will need to rebuild the "keyword cache"
+ by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
+ the option to rebuild the cache when it asks. Otherwise keywords may
+ not show up properly in search results.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=99215">
+ [%- terms.Bug %] 99215</a>: Flags are not protected by "mid-air
+ collision" detection. Nor are any attachment changes.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=89822">
+ [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
+ the same time, there is no "mid-air collision" protection.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=276230">
+ [%- terms.Bug %] 276230</a>: The support for restricting access to
+ particular Categories of New Charts is not complete. You should treat
+ the 'chartgroup' Param as the only access mechanism available.<br>
+ However, charts migrated from Old Charts will be restricted to
+ the groups that are marked MANDATORY for the corresponding Product.
+ There is currently no way to change this restriction, and the
+ groupings will not be updated if the group configuration
+ for the Product changes.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370370">
+ [%- terms.Bug %] 370370</a>: mod_perl support is currently not
+ working on Windows machines.</li>
+ <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=361149">
+ [%- terms.Bug %] 361149</a>: If you are using Perl 5.8.0, you may
+ get a lot of warnings in your Apache error_log about "deprecated
+ pseudo-hashes." These are harmless--they are a b[%# fool test %]ug in
+ Perl 5.8.0. Perl 5.8.1 and later do not have this problem.</li>
+ <li>[% terms.Bugzilla %] 3.0rc1 allowed custom field column names in
+ the database to be mixed-case. [% terms.Bugzilla %] 3.0 only allows
+ lowercase column names. It will fix any column names that you have
+ made mixed-case, but if you have custom fields that previously were
+ mixed-case in any Saved Search, you will have to re-create that Saved
+ Search yourself.</li>
+</ul>
+
+<h2 id="v30_security">Security Updates in This Release</h2>
+
+<h3>3.0.6</h3>
+
+<p>[% terms.Bugzilla %] contains a minor security fix. For details, see the
+ <a href="http://www.bugzilla.org/security/2.20.6/">Security Advisory</a>.</p>
+
+<h3>3.0.5</h3>
+
+<p>[% terms.Bugzilla %] contains one security fix for
+ <a href="[% docs_urlbase FILTER html %]api/importxml.html">importxml.pl</a>.
+ For details, see the
+ <a href="http://www.bugzilla.org/security/2.22.4/">Security Advisory</a>.</p>
+
+<h3>3.0.4</h3>
+
+<p>[% terms.Bugzilla %] 3.0.4 contains three security fixes.
+ For details, see the
+ <a href="http://www.bugzilla.org/security/2.20.5/">Security Advisory</a>.</p>
+
+<h3>3.0.3</h3>
+
+<p>No security fixes in this release.</p>
+
+<h3>3.0.2</h3>
+
+<p>[% terms.Bugzilla %] 3.0.1 had an important security fix that is
+ critical for public installations with "requirelogin" turned on.
+ For details, see the
+ <a href="http://www.bugzilla.org/security/3.0.1/">Security Advisory</a></p>
+
+<h3>3.0.1</h3>
+
+<p>[% terms.Bugzilla %] 3.0 had three security issues that have been
+ fixed in this release: one minor information leak, one hole only
+ exploitable by an admin or using <code>email_in.pl</code>, and one in an
+ uncommonly-used template. For details, see the
+ <a href="http://www.bugzilla.org/security/2.20.4/">Security Advisory</a>.</p>
+
+<h2 id="v30_upgrading">How to Upgrade From An Older Version</h2>
+
+<h3 id="v30_upgrading_notes">Notes For Upgraders</h3>
+
+<ul>
+ <li>If you upgrade by CVS, there are several .cvsignore files
+ that are now in CVS instead of being locally created by
+ <kbd>checksetup.pl</kbd>. This means that you will have to
+ delete those files when CVS tells you there's a conflict, and
+ then run <kbd>cvs update</kbd> again.</li>
+ <li>In this version of [% terms.Bugzilla %], the Summary field
+ is now limited to 255 characters. When you upgrade, any Summary
+ longer than that will be truncated, and the old summary will be
+ preserved in a comment.</li>
+ <li>If you have the <kbd>utf8</kbd> parameter turned on, at some
+ point you will have to convert your database. <kbd>checksetup.pl</kbd>
+ will tell you when this is, and it will give you certain instructions
+ at that time, that you have to follow before you can complete
+ the upgrade. Don't do the conversion yourself manually--follow
+ the instructions of checksetup.pl.</li>
+ <li>If you ever ran 2.23.3, 2.23.4, or 3.0rc1, you will have to run
+ <kbd>./collectstats.pl --regenerate</kbd> at the command line, because
+ the data for your Old Charts is corrupted. This can take several days,
+ so you may only want to run it if you use Old Charts.</li>
+ <li>You should also read the Outstanding Issues sections of
+ <a href="#v30_previous">older release notes</a> if you are upgrading
+ from a version lower than 2.22.</li>
+</ul>
+
+<h3>Steps For Upgrading</h3>
+
+<p>Once you have read the notes above, see the
+ <a href="[% docs_urlbase FILTER html %]upgrade.html">Upgrading
+ documentation</a> for instructions on how to upgrade.</p>
+
+<h2 id="v30_code_changes">Code Changes Which May Affect Customizations</h2>
+
+<ul>
+ <li><a href="#v30_code_loc"><strong>Packagers:</strong> Location
+ Variables Have Moved</a></li>
+ <li><a href="#v30_code_hooks">Hooks!</a></li>
+ <li><a href="#v30_code_api">API Documentation</a></li>
+ <li><a href="#v30_code_globals">Elimination of globals.pl</a></li>
+ <li><a href="#v30_code_scope">Cleaned Up Variable Scoping Issues</a></li>
+ <li><a href="#v30_code_sql">No More SendSQL</a></li>
+ <li><a href="#v30_code_auth">Auth Re-write</a></li>
+ <li><a href="#v30_code_obj">Bugzilla::Object</a></li>
+ <li><a href="#v30_code_req">Bugzilla-&gt;request_cache</a></li>
+ <li><a href="#v30_code_other">Other Changes</a></li>
+</ul>
+
+<h3 id="v30_code_loc"><strong>Packagers:</strong> Location Variables
+ Have Moved</h3>
+
+<p>In previous versions of [% terms.Bugzilla %], <kbd>Bugzilla::Config</kbd>
+ held all the paths for different things, such as the path to localconfig
+ and the path to the <kbd>data/</kbd> directory.</p>
+
+<p>Now, all of this data is stored in a subroutine,
+ <kbd>Bugzilla::Constants::bz_locations</kbd>.</p>
+
+<p>Also, note that for mod_perl, <kbd>bz_locations</kbd> must return
+ <em>absolute</em> (not relative) paths. There is already code in that
+ subroutine to help you with this.</p>
+
+<h3 id="v30_code_hooks">Hooks!</h3>
+
+<p>[% terms.Bugzilla %] now supports a code hook mechanism. See the
+ documentation for
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Hook.html">Bugzilla::Hook</a>
+ for more details.</p>
+
+<p>This gives [% terms.Bugzilla %] very advanced plugin support. You can
+ hook templates, hook code, add new parameters, and use the XML-RPC
+ interface. So we'd like to see some [% terms.Bugzilla %] plugins
+ written! Let us know on the <a href="http://bugzilla.org/cgi-bin/mj_wwwusr?func=lists-long-full&amp;extra=developers">developers&#64;bugzilla.org</a>
+ mailing list if you write a plugin.</p>
+
+<p>If you need more hooks, please
+ <a href="http://www.bugzilla.org/developers/reporting_bugs.html">File a b<!-- -->ug</a>!</p>
+
+<h3 id="v30_code_api">API Documentation</h3>
+
+<p>[% terms.Bugzilla %] now ships with all of its perldoc built
+ as HTML. Go ahead and read the
+ <a href="[% docs_urlbase FILTER html %]api/">API Documentation</a>
+ for all of the [% terms.Bugzilla %] modules now! Even scripts like
+ <kbd>checksetup.pl</kbd> have HTML documentation.</p>
+
+<h3 id="v30_code_globals">Elimination of globals.pl</h3>
+
+<p>The old file <kbd>globals.pl</kbd> has been eliminated.
+ Its code is now in various modules. Each function went to the module
+ that was appropriate for it.</p>
+
+<p>Usually we filed [% terms.abug %] in
+ <a href="https://bugzilla.mozilla.org">bugzilla.mozilla.org</a> for
+ each function we moved. You can search there for the old name of
+ the function, and that should get you the information about what
+ it's called now and where it lives.</p>
+
+<h3 id="v30_code_scope">Cleaned Up Variable Scoping Issues</h3>
+
+<p>In normal perl, you can have code like this:</p>
+<pre>my $var = 0;
+sub y { $var++ }</pre>
+
+<p>However, under mod_perl that doesn't work. So variables are no
+ longer &quot;shared&quot; with subroutines--instead all variables
+ that a subroutine needs must be declared inside the subroutine itself.</p>
+
+<h3 id="v30_code_sql">No More SendSQL</h3>
+
+<p>The old <kbd>SendSQL</kbd> function and all of its companions are
+ <strong>gone</strong>. Instead, we now use DBI for all database
+ interaction.</p>
+
+<p>For more information about how to use
+ <a href="http://search.cpan.org/perldoc?DBI">DBI</a> with
+ [%+ terms.Bugzilla %], see the
+ <a href="http://www.bugzilla.org/docs/developer.html#sql-sendreceive">Developer's
+ Guide Section About DBI</a></p>
+
+<h3 id="v30_code_auth">Auth Re-write</h3>
+
+<p>The <kbd>Bugzilla::Auth</kbd> family of modules have been completely
+ re-written. For details on how the new structure of authentication,
+ read the
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Auth.html">Bugzilla::Auth
+ API docs</a>.</p>
+
+<p>It should be very easy to write new authentication plugins, now.</p>
+
+<h3 id="v30_code_obj">Bugzilla::Object</h3>
+
+<p>There is a new base class for most of our objects,
+ <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Object.html">Bugzilla::Object</a>.
+ It makes it really easy to create new objects based on things that are
+ in the database.</p>
+
+<h3 id="v30_code_req">Bugzilla-&gt;request-cache</h3>
+
+<p><kbd>Bugzilla.pm</kbd> used to cache things like the database
+ connection in package-global variables (like <kbd>$_dbh</kbd>).
+ That doesn't work in mod_perl, so instead now there's a hash
+ that can be accessed through <code>Bugzilla-&gt;request_cache</code>
+ to store things for the rest of the current page request.</p>
+
+<p>You shouldn't access <code>Bugzilla-&gt;request_cache</code> directly,
+ but you should use it inside of <kbd>Bugzilla.pm</kbd> if you modify
+ that. The only time you should be accessing it directly is if you need
+ to reset one of the caches. Hash keys are always named after the function
+ that they cache, so to reset the template object, you'd do:
+ <code>delete Bugzilla-&gt;request_cache-&gt;{template};</code>.</p>
+
+<h3 id="v30_code_other">Other Changes</h3>
+
+<ul>
+ <li><code>checksetup.pl</code> has been completely re-written, and most
+ of its code moved into modules in the <kbd>Bugzilla::Install</kbd>
+ namespace. See the
+ <a href="[% docs_urlbase FILTER html %]api/checksetup.html">checksetup
+ documentation</a> and <a href="https://bugzilla.mozilla.org/showdependencytree.cgi?id=277502&amp;hide_resolved=0">[% terms.Bugzilla %]
+ [%+ terms.bug %] 277502</a> for details.</li>
+ <li>Instead of <kbd>UserInGroup()</kbd>, all of [% terms.Bugzilla %] now
+ uses <kbd>Bugzilla-&gt;user-&gt;in_group</kbd></li>
+ <li>mod_perl doesn't like dependency loops in modules, so we now have
+ a test for that detects dependency loops in modules when you run
+ <kbd>runtests.pl</kbd>.</li>
+ <li><kbd>globals.pl</kbd> used to modify the environment variables,
+ like <kbd>PATH</kbd>. That now happens in <kbd>Bugzilla.pm</kbd>.</li>
+ <li>Templates can now link to the documentation more easily.
+ See the <kbd>global/code-error.html.tmpl</kbd> and
+ <kbd>global/user-error.html.tmpl</kbd> templates for examples.
+ (Search for &quot;docslinks.&quot;)</li>
+ <li>Parameters are accessed through <kbd>Bugzilla-&gt;params</kbd>
+ instead of using the <kbd>Param()</kbd> function, now.</li>
+ <li>The variables from the <kbd>localconfig</kbd> file are accessed
+ through the <code>Bugzilla-&gt;localconfig</code> hash instead of through
+ <kbd>Bugzilla::Config</kbd>.</li>
+ <li><kbd>Bugzilla::BugMail::MessageToMTA()</kbd> has moved into its
+ own module, along with other mail-handling code, called
+ <kbd>Bugzilla::Mailer</kbd></li>
+ <li>The <kbd>CheckCanChangeField()</kbd> subroutine in
+ <kbd>process_bug.cgi</kbd> has been moved to <kbd>Bugzilla::Bug</kbd>,
+ and is now a method of [% terms.abug %] object.</li>
+ <li>The code that used to be in the <kbd>global/banner.html.tmpl</kbd>
+ template is now in <kbd>global/header.html.tmpl</kbd>. The banner
+ still exists, but the file is empty.</li>
+</ul>
+
+<h2 id="v30_previous">Release Notes For Previous Versions</h2>
+
+<p>Release notes for versions of [% terms.Bugzilla %] for versions
+ prior to 3.0 are only available in text format:
+ <a href="[% docs_urlbase FILTER remove('html/$') FILTER html %]rel_notes.txt">Release Notes for [% terms.Bugzilla %] 2.22
+ and Earlier</a>.</p>
+
+[% INCLUDE global/footer.html.tmpl %]
+
+[% BLOCK db_req %]
+ [% SET m = DB_MODULE.$db %]
+ <h3 id="v36_req_[% db FILTER html %]">For [% m.name FILTER html %] Users</h3>
+
+ <ul>
+ <li>[% m.name FILTER html %]
+ [%+ '<span class="req_new">' IF db_new %]v[% m.db_version FILTER html %]
+ [% '</span>' IF db_new %]
+ </li>
+ <li><strong>perl module:</strong>
+ [%+ m.dbd.module FILTER html %]
+ [% '<span class="req_new">' IF dbd_new %]v[% m.dbd.version FILTER html %]
+ [% '</span>' IF dbd_new %]</li>
+ </ul>
+[% END %]
+
+
+[% BLOCK req_table %]
+ <table class="req_table" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <th>Module</th> <th>Version</th>
+ [% IF include_feature %]
+ <th>Enables Feature</th>
+ [% END %]
+ </tr>
+ [% FOREACH req = reqs %]
+ <tr>
+ <td [% ' class="req_new"' IF new.contains(req.package) %]>
+ [%- req.module FILTER html %]</td>
+ <td [% ' class="req_new"' IF updated.contains(req.package)
+ OR new.contains(req.package) %]>
+ [%- IF req.version == 0 %]
+ (Any)
+ [% ELSE %]
+ [%- req.version FILTER html %]
+ [% END %]
+ </td>
+ [% IF include_feature %]
+ <td>[% req.feature.join(', ') FILTER html %]</td>
+ [% END %]
+ </tr>
+ [% END %]
+</table>
+[% END %]
diff --git a/template/en/default/pages/sudo.html.tmpl b/template/en/default/pages/sudo.html.tmpl
new file mode 100644
index 0000000..c790ff1
--- /dev/null
+++ b/template/en/default/pages/sudo.html.tmpl
@@ -0,0 +1,68 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 2005 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): A. Karl Kornel <karl@kornel.name>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% INCLUDE global/header.html.tmpl title = "sudo: User Impersonation" %]
+
+<p>
+ [%+ terms.Bugzilla %] includes the ability to have one user impersonate
+another, in something called a <i>sudo session</i>, so long as the person
+doing the impersonating has the appropriate privileges.
+</p>
+
+<p>
+ While a session is in progress, [% terms.Bugzilla %] will act as if the
+ impersonated user is doing everything. This is especially useful for testing,
+ and for doing critical work when the impersonated user is unavailable. The
+ impersonated user will receive an email from [% terms.Bugzilla %] when the
+ session begins; they will not be told anything else.
+</p>
+
+<p>
+ To use this feature, you must be a member of the appropriate group. The group
+ includes all administrators by default. Other users, and members of other
+ groups, can be given access to this feature on a case-by-case basis. To
+ request access, contact the maintainer of this installation:
+ <a href="mailto:[% Param("maintainer") %]">
+ [%- Param("maintainer") %]</a>.
+</p>
+
+<p>
+ If you would like to be protected from impersonation, you should contact the
+ maintainer of this installation to see if that is possible. People with
+ access to this feature are protected automatically.
+</p>
+
+<p id="message">
+ [% IF user.in_group('bz_sudoers') %]
+ You are a member of the <b>bz_sudoers</b> group. You may use this
+ feature to impersonate others.
+ [% ELSE %]
+ You are not a member of an appropriate group. You may not use this
+ feature.
+ [% END %]
+ [% IF user.in_group('bz_sudo_protect') %]
+ <br>
+ You are a member of the <b>bz_sudo_protect</b> group. Other people will
+ not be able to use this feature to impersonate you.
+ [% END %]
+</p>
+
+[% INCLUDE global/footer.html.tmpl %]
diff --git a/template/en/default/pages/voting.html.tmpl b/template/en/default/pages/voting.html.tmpl
new file mode 100644
index 0000000..4e6fb47
--- /dev/null
+++ b/template/en/default/pages/voting.html.tmpl
@@ -0,0 +1,69 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Terry Weissman <terry@mozilla.org>
+ # Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% INCLUDE global/header.html.tmpl title = "Voting" %]
+
+<p>[% terms.Bugzilla %] has a "voting" feature. Each product allows users to
+have a certain number of votes. (Some products may not allow any, which means
+you can't vote on things in those products at all.) With your vote, you
+indicate which [% terms.bugs %] you think are the most important and
+would like to see fixed. Note that voting is nowhere near as effective
+as providing a fix yourself.</p>
+
+<p>Depending on how the administrator has configured the relevant product,
+you may be able to vote for the same [% terms.bug %] more than once.
+Remember that you have a limited number of votes. When weighted voting
+is allowed and a limited number of votes are available to you, you will
+have to decide whether you want to distribute your votes among a large
+number of [% terms.bugs %] indicating your minimal interest or focus on
+a few [% terms.bugs %] indicating your strong support for them.
+</p>
+
+<p>To look at votes:</p>
+
+<ul>
+ <li>Go to the query page. Do a normal query, but enter 1 in the "At least
+ ___ votes" field. This will show you items that match your query that
+ have at least one vote.</li>
+</ul>
+
+<p>To vote for [% terms.abug %]:</p>
+
+<ul>
+ <li>Bring up the [% terms.bug %] in question.</li>
+
+ <li>Click on the "(vote)" link that appears on the right of the "Importance"
+ fields. (If no such link appears, then voting may not be allowed in
+ this [% terms.bug %]'s product.)</li>
+
+ <li>Indicate how many votes you want to give this [% terms.bug %]. This page
+ also displays how many votes you've given to other [% terms.bugs %], so you
+ may rebalance your votes as necessary.</li>
+</ul>
+
+<p>You will automatically get email notifying you of any changes that occur
+on [% terms.bugs %] you vote for.</p>
+
+<p>You may review your votes at any time by clicking on the "<a href=
+"votes.cgi?action=show_user">My Votes</a>" link in the page footer.</p>
+
+[% INCLUDE global/footer.html.tmpl %]
diff --git a/template/en/default/reports/chart.csv.tmpl b/template/en/default/reports/chart.csv.tmpl
new file mode 100644
index 0000000..f9e2f2b
--- /dev/null
+++ b/template/en/default/reports/chart.csv.tmpl
@@ -0,0 +1,44 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% colsepchar = user.settings.csv_colsepchar.value %]
+
+[% data = chart.data %]
+Date\Series
+[% FOREACH label = chart.labels %]
+ [% colsepchar %][% label FILTER csv %]
+[% END %]
+[%# The data, which is in the correct format for GD, is conceptually the wrong
+ # way round for CSV output. So, we need to invert it here, which is why
+ # these loops aren't just plain FOREACH.
+ #%]
+[% i = 0 %]
+[% WHILE i < data.0.size %]
+ [% j = 0 %]
+ [% WHILE j < data.size %]
+ [% IF j > 0 %]
+ [% colsepchar %]
+ [% END %]
+ [% data.$j.$i %]
+ [% j = j + 1 %]
+ [% END %]
+ [% i = i + 1 %]
+
+[% END %]
diff --git a/template/en/default/reports/chart.html.tmpl b/template/en/default/reports/chart.html.tmpl
new file mode 100644
index 0000000..e14744d
--- /dev/null
+++ b/template/en/default/reports/chart.html.tmpl
@@ -0,0 +1,67 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ #%]
+
+[% DEFAULT width = 600
+ height = 350
+%]
+
+[% time = time FILTER time('%Y-%m-%d %H:%M:%S') FILTER html %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Chart"
+ header_addl_info = time
+%]
+
+<div align="center">
+
+ [% imageurl = BLOCK %]chart.cgi?
+ [% imagebase FILTER html %]&amp;ctype=png&amp;action=plot&amp;width=
+ [% width %]&amp;height=[% height -%]
+ [% END %]
+
+ <img alt="Graphical report results" src="[% imageurl %]"
+ width="[% width %]" height="[% height %]">
+ <p>
+ [% sizeurl = BLOCK %]chart.cgi?
+ [% imagebase FILTER html %]&amp;action=wrap
+ [% END %]
+ <a href="[% sizeurl %]&amp;width=[% width %]&amp;height=
+ [% height + 100 %]">Taller</a><br>
+ <a href="[% sizeurl %]&amp;width=[% width - 100 %]&amp;height=
+ [% height %]">Thinner</a> *
+ <a href="[% sizeurl %]&amp;width=[% width + 100 %]&amp;height=
+ [% height %]">Fatter</a>&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ <a href="[% sizeurl %]&amp;width=[% width %]&amp;height=
+ [% height - 100 %]">Shorter</a><br>
+ </p>
+
+ <p>
+ <a href="chart.cgi?
+ [% imagebase FILTER html %]&amp;ctype=csv&amp;action=plot">CSV</a> |
+ <a href="chart.cgi?[% imagebase FILTER html %]&amp;action=assemble">Edit
+ this chart</a>
+ </p>
+
+</div>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/chart.png.tmpl b/template/en/default/reports/chart.png.tmpl
new file mode 100644
index 0000000..c4fa04f
--- /dev/null
+++ b/template/en/default/reports/chart.png.tmpl
@@ -0,0 +1,60 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% y_label = "$terms.Bugs" %]
+[% x_label = "Time" %]
+
+[% IF chart.cumulate %]
+ [% USE graph = GD.Graph.area(width, height) %]
+ [% graph.set(cumulate => "true") %]
+[% ELSE %]
+ [% USE graph = GD.Graph.lines(width, height) %]
+[% END %]
+
+[% FILTER null;
+ x_label_skip = (30 * chart.data.0.size / width);
+
+ graph.set(x_label => x_label,
+ y_label => y_label,
+ y_tick_number => 8,
+ y_max_value => chart.y_max_value,
+ x_label_position => 0.5,
+ x_labels_vertical => 1,
+ x_label_skip => x_label_skip,
+ legend_placement => "RT",
+ line_width => 2,
+ dclrs => ["lred", "lgreen", "lblue", "lyellow",
+ "lpurple", "lorange", "black", "green",
+ "blue", "dpink", "lbrown", "gray",
+ "red", "dpurple", "gold", "marine"]);
+
+ # Workaround for the fact that set_legend won't take chart.labels directly,
+ # because chart.labels is an array reference rather than an array.
+ graph.set_legend(chart.labels.0, chart.labels.1, chart.labels.2,
+ chart.labels.3, chart.labels.4, chart.labels.5,
+ chart.labels.6, chart.labels.7, chart.labels.8,
+ chart.labels.9, chart.labels.10, chart.labels.11,
+ chart.labels.12, chart.labels.13, chart.labels.14,
+ chart.labels.15);
+
+ graph.plot(chart.data).png | stdout(1);
+ END;
+-%]
+
diff --git a/template/en/default/reports/components.html.tmpl b/template/en/default/reports/components.html.tmpl
new file mode 100644
index 0000000..35f656a
--- /dev/null
+++ b/template/en/default/reports/components.html.tmpl
@@ -0,0 +1,105 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Bradley Baetz <bbaetz@student.usyd.edu.au>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # product: object. The product for which we want to display component
+ # descriptions.
+ #%]
+
+[% title = BLOCK %]
+ Components for [% product.name FILTER html %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ style_urls = [ "skins/standard/reports.css" ]
+ title = title
+%]
+
+[% IF Param("useqacontact") %]
+ [% numcols = 3 %]
+[% ELSE %]
+ [% numcols = 2 %]
+[% END %]
+
+<table cellpadding="0" cellspacing="0" id="components_header_table">
+ <tr>
+ <td class="instructions">
+ Select a component to see open [% terms.bugs %] in that component:
+ </td>
+ <td class="product_container">
+ <h2 class="product_name">[% product.name FILTER html %]</h2>
+ <div class="product_desc">
+ [% product.description FILTER html_light %]
+ </div>
+ </td>
+ </tr>
+</table>
+
+<h3 class="components_header">Components</h3>
+
+<table class="component_table" cellspacing="0" cellpadding="0">
+ <thead>
+ <tr>
+ <th>&nbsp;</th>
+ <th>Default Assignee</th>
+ [% IF Param("useqacontact") %]
+ <th>Default QA Contact</th>
+ [% END %]
+ </tr>
+ </thead>
+
+ <tbody>
+ [% FOREACH comp = product.components %]
+ [% INCLUDE describe_comp %]
+ [% END %]
+ </tbody>
+</table>
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%############################################################################%]
+[%# BLOCK for components %]
+[%############################################################################%]
+
+[% BLOCK describe_comp %]
+ <tr>
+ <td rowspan="2" class="component_name">
+ <a name="[% comp.name FILTER html %]"
+ href="buglist.cgi?product=
+ [%- product.name FILTER url_quote %]&amp;component=
+ [%- comp.name FILTER url_quote %]&amp;resolution=---">
+ [% comp.name FILTER html %]</a>
+ </td>
+ <td class="component_assignee">
+ [% INCLUDE global/user.html.tmpl who = comp.default_assignee %]
+ </td>
+ [% IF Param("useqacontact") %]
+ <td class="component_qa_contact">
+ [% INCLUDE global/user.html.tmpl who = comp.default_qa_contact %]
+ </td>
+ [% END %]
+ </tr>
+ <tr>
+ <td colspan="[% numcols - 1 %]" class="component_description">
+ [% comp.description FILTER html_light %]
+ </td>
+ </tr>
+[% END %]
diff --git a/template/en/default/reports/create-chart.html.tmpl b/template/en/default/reports/create-chart.html.tmpl
new file mode 100644
index 0000000..e2b6090
--- /dev/null
+++ b/template/en/default/reports/create-chart.html.tmpl
@@ -0,0 +1,271 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # chart: Chart object representing the currently assembled chart.
+ # category: hash (keyed by category) of hashes (keyed by subcategory) of
+ # hashes (keyed by name), with value being the series_id of the
+ # series. Contains details of all series the user can see.
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Create Chart"
+%]
+
+[% PROCESS "reports/series-common.html.tmpl"
+ donames = 1
+%]
+
+<script type="text/javascript">
+[%# This function takes necessary action on selection of a subcategory %]
+function subcatSelected() {
+ var cat = document.chartform.category.value;
+ var subcat = document.chartform.subcategory.value;
+ var names = series[cat][subcat];
+
+ var namewidget = document.chartform.name;
+
+ namewidget.options.length = 0;
+ var i = 0;
+
+ for (x in names) {
+ namewidget.options[i] = new Option(x, names[x]);
+ i++;
+ }
+
+ namewidget.disabled = false;
+ namewidget.options[0].selected = true;
+
+ checkNewState();
+}
+</script>
+
+[% gttext = "Grand Total" %]
+
+<form method="get" action="chart.cgi" name="chartform">
+
+ <table cellpadding="2" cellspacing="2" border="0">
+ [% IF NOT category OR category.size == 0 %]
+ <tr>
+ <td>
+ <i>No data sets exist, or none are visible to you.</i>
+ </td>
+ </tr>
+ [% ELSE %]
+ <tr>
+ <th><label for="category">Category</label>:</th>
+ <th></th>
+ <th><label for="subcategory">Sub-category</label>:</th>
+ <th></th>
+ <th><label for="name" accesskey="N">Name</label>:</th>
+ <th><br>
+ </th>
+ </tr>
+ <tr>
+
+ [% PROCESS series_select sel = { name => 'category',
+ size => 5,
+ onchange = "catSelected();
+ subcatSelected();" } %]
+
+ <td>
+ <noscript>
+ <input type="submit" name="action-assemble" value="Update --&gt;"
+ id="action-assemble">
+ </noscript>
+ </td>
+
+ [% PROCESS series_select sel = { name => 'subcategory',
+ size => 5,
+ onchange = "subcatSelected()" } %]
+
+ <td>
+ <noscript>
+ <input type="submit" name="action-assemble" value="Update --&gt;"
+ id="action-assemble2">
+ </noscript>
+ </td>
+
+ [% PROCESS series_select sel = { name => 'name',
+ size => 5,
+ multiple => 1,
+ # We want to use the series ID as value,
+ # not its name.
+ value_in_hash => 1 } %]
+
+ <td align="center" valign="middle">
+ <input type="submit" name="action-add" value="Add To List"
+ id="action-add"><br>
+ </td>
+ </tr>
+ [% END %]
+ </table>
+
+ <h3>List Of Data Sets To Plot</h3>
+
+ [% IF chart.lines.size %]
+ <table cellspacing="2" cellpadding="2">
+ <tr>
+ <th style="width: 5em;">Select</th>
+ <th>Label</th>
+ <th></th>
+ <th>Data Set</th>
+ <th></th>
+ </tr>
+
+ [%# The external loop has two counters; one which keeps track of where we
+ # are in the old labels array, and one which keeps track of the new
+ # indexes for the form elements. They are different if chart.lines has
+ # empty slots in it.
+ #%]
+ [% labelidx = 0 %]
+ [% newidx = 0 %]
+
+ [% FOREACH line = chart.lines %]
+ [% IF NOT line %]
+ [%# chart.lines has an empty slot, so chart.labels will too. We
+ # increment labelidx only to keep the labels in sync with the data.
+ #%]
+ [% labelidx = labelidx + 1 %]
+ [% NEXT %]
+ [% END %]
+
+ [% FOREACH series = line %]
+ <tr>
+ [% IF loop.first %]
+ <td align="center" rowspan="[% line.size %]">
+ <input type="checkbox" value="1" name="select[% newidx %]">
+ </td>
+ <td rowspan="[% line.size %]">
+ <input type="text" size="20" name="label[% newidx %]"
+ value="[% (chart.labels.$labelidx OR series.name)
+ FILTER html %]">
+ </td>
+ [% END %]
+
+ <td>
+ [% "{" IF line.size > 1 %]
+ </td>
+
+ <td>
+ [% series.category FILTER html %] /
+ [%+ series.subcategory FILTER html %] /
+ [%+ series.name FILTER html %]
+ <input type="hidden" name="line[% newidx %]"
+ value="[% series.series_id %]">
+ </td>
+
+ <td align="center">
+ [% IF user.id == series.creator_id OR user.in_group("admin") %]
+ <a href="chart.cgi?action=edit&amp;series_id=
+ [% series.series_id %]">Edit</a> |
+ <a href="chart.cgi?action=confirm-delete&amp;series_id=
+ [%- series.series_id %]">Delete</a> |
+ [% END %]
+ <a href="buglist.cgi?cmdtype=dorem&amp;namedcmd=
+ [% series.category FILTER url_quote %]%20/%20
+ [% series.subcategory FILTER url_quote %]%20/%20
+ [% series.name FILTER url_quote -%]&amp;series_id=
+ [% series.series_id %]&amp;remaction=runseries">Run Search</a>
+ </td>
+ </tr>
+ [% END %]
+ [% labelidx = labelidx + 1 %]
+ [% newidx = newidx + 1 %]
+ [% END %]
+
+ [% IF chart.gt %]
+ <tr>
+ <td align="center">
+ <input type="checkbox" value="1" name="select65536">
+ <input type="hidden" value="1" name="gt">
+ </td>
+ <td>
+ <input type="text" size="20" name="labelgt"
+ value="[% (chart.labelgt OR gttext) FILTER html %]">
+ </td>
+ <td></td>
+ <td>
+ <i>[% gttext FILTER html %]</i>
+ </td>
+ <td></td>
+ </tr>
+ [% END %]
+ <tr>
+ <td colspan="6">&nbsp;</td>
+ </tr>
+
+ <tr>
+ <td valign="bottom" style="text-align: center;">
+ <input type="submit" name="action-sum" value="Sum"
+ style="width: 5em;" id="action-sum"><br>
+ <input type="submit" name="action-remove" value="Remove"
+ style="width: 5em;" id="action-remove">
+ </td>
+
+ <td style="text-align: right; vertical-align: bottom;">
+ <label for="cumulate"><b>Cumulate</b></label>:
+ <input type="checkbox" name="cumulate" id="cumulate" value="1"
+ [% " checked" IF chart.cumulate %]>
+ </td>
+
+ <td></td>
+ <td valign="bottom">
+ <label for="datefrom"><b>Date Range</b></label>:
+ <input type="text" size="12" name="datefrom" id="datefrom"
+ value="[% time2str("%Y-%m-%d", chart.datefrom) IF chart.datefrom%]">
+ <label for="dateto"><b>to</b></label>
+ <input type="text" size="12" name="dateto" id="dateto"
+ value="[% time2str("%Y-%m-%d", chart.dateto) IF chart.dateto %]">
+ </td>
+
+ <td style="text-align: right" valign="bottom">
+ <input type="submit" name="action-wrap" value="Chart This List"
+ id="action-wrap">
+ </td>
+ </tr>
+ </table>
+ [% ELSE %]
+ <p><i>None</i></p>
+ [% END %]
+</form>
+
+[% IF user.in_group('editbugs') %]
+ <h3>Create New Data Set</h3>
+ <p>
+ You can either create a new data set based on one of your saved searches
+ or start with a clean slate.
+ </p>
+
+ <form action="chart.cgi" id="create_series" name="create_series" method="GET">
+ <input type="hidden" name="action" value="convert_search">
+ <label for="series_from_search">Based on:</label>
+ <select id="series_from_search" name="series_from_search">
+ <option value="">(Clean slate)</option>
+ [% FOREACH q = user.queries %]
+ <option value="[% q.name FILTER html %]">[% q.name FILTER html %]</option>
+ [% END %]
+ </select>
+ <input id="submit_create" type="submit" value="Create a new data set">
+ </form>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
+
diff --git a/template/en/default/reports/delete-series.html.tmpl b/template/en/default/reports/delete-series.html.tmpl
new file mode 100644
index 0000000..5003551
--- /dev/null
+++ b/template/en/default/reports/delete-series.html.tmpl
@@ -0,0 +1,59 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Frédéric Buclin.
+ # Portions created by the Initial Developer are Copyright (C) 2009
+ # the Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% series_name = BLOCK %]
+ [% series.category FILTER html %] /
+ [%+ series.subcategory FILTER html %] /
+ [%+ series.name FILTER html %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl title = "Delete Series"
+ style_urls = ['skins/standard/admin.css'] %]
+
+<p>
+ You are going to completely remove the <b>[% series_name FILTER none %]</b> series
+ from the database. All data related to this series will be permanently deleted.
+</p>
+<p>
+ [% IF series.creator %]
+ This series has been created by <a href="mailto:[% series.creator.email FILTER html %]">
+ [% series.creator.email FILTER html %]</a>
+ [% ELSE %]
+ This series has been automatically created by [% terms.Bugzilla %]
+ [% END %]
+
+ [% IF series.public %]
+ and is public.
+ [% ELSIF series.creator %]
+ and is only visible by this user.
+ [% ELSE %]
+ and cannot be displayed by anybody.
+ [% END %]
+</p>
+
+<p class="areyoureallyreallysure">Are you sure you want to delete this series?</p>
+
+<p>
+ <a href="chart.cgi?action=delete&amp;series_id=[% series.series_id FILTER html %]&amp;token=
+ [%- issue_hash_token([series.id, series.name]) FILTER url_quote %]">Yes, delete</a> |
+ <a href="chart.cgi">No, go back to the charts page</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/duplicates-simple.html.tmpl b/template/en/default/reports/duplicates-simple.html.tmpl
new file mode 100644
index 0000000..62795af
--- /dev/null
+++ b/template/en/default/reports/duplicates-simple.html.tmpl
@@ -0,0 +1,47 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s):
+ # Gervase Markham <gerv@gerv.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # You need to fulfill the interface to duplicates-table.html.tmpl.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+ "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+ [% IF product.size %]
+ [% title = BLOCK %]
+ Most Frequently Reported [% terms.Bugs %] for [% product.join(', ') FILTER html %]
+ [% END %]
+ [% ELSE %]
+ [% title = "Most Frequently Reported $terms.Bugs" %]
+ [% END%]
+
+ <head>
+ <title>[% title FILTER html %]</title>
+ </head>
+
+ <body>
+ [% PROCESS "reports/duplicates-table.html.tmpl" %]
+ </body>
+</html>
diff --git a/template/en/default/reports/duplicates-table.html.tmpl b/template/en/default/reports/duplicates-table.html.tmpl
new file mode 100644
index 0000000..38ab2d5
--- /dev/null
+++ b/template/en/default/reports/duplicates-table.html.tmpl
@@ -0,0 +1,125 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s):
+ # Gervase Markham <gerv@gerv.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # bugs: list of hashes. May be empty. Each hash has three members:
+ # bug: A Bugzilla::Bug object
+ # count: integer. The number of dupes
+ # delta: integer. The change in count in the last $changedsince days
+ #
+ # bug_ids: list of integers. May be empty. The IDs of the bugs in $bugs.
+ #
+ # sortby: string. the column on which we are sorting the buglist.
+ # reverse: boolean. True if we are reversing the current sort.
+ # maxrows: integer. Max number of rows to display.
+ # changedsince: integer. The number of days ago for the changedsince column.
+ # openonly: boolean. True if we are only showing open bugs.
+ # product: array of strings. Restrict to these products only.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[%# *** Column Headers *** %]
+
+[% SET columns = [
+ { name => "id", description => "$terms.Bug #" },
+ { name => "count", description => "Dupe<br>Count" },
+ { name => "delta",
+ description => "Change in last<br>$changedsince day(s)" },
+ { name => "component", description => field_descs.component },
+ { name => "bug_severity", description => field_descs.bug_severity },
+ { name => "op_sys", description => field_descs.op_sys },
+ { name => "target_milestone", description => field_descs.target_milestone },
+ { name => "short_desc", description => field_descs.short_desc },
+] %]
+
+[% SET base_args = [] %]
+[% FOREACH param = ['maxrows', 'openonly', 'format', 'sortvisible',
+ 'changedsince', 'product']
+%]
+ [% NEXT IF NOT ${param}.defined %]
+ [% FOREACH value = ${param} %]
+ [% filtered_value = value FILTER url_quote %]
+ [% base_args.push("$param=$filtered_value") %]
+ [% END %]
+[% END %]
+[% IF sortvisible %]
+ [% bug_ids_string = bug_ids.nsort.join(',') FILTER url_quote %]
+ [% base_args.push("bug_id=$bug_ids_string") %]
+[% END %]
+[% base_args_string = base_args.join('&amp;') %]
+
+[% IF bugs.size %]
+ <table id="duplicates_table" cellpadding="0" cellspacing="0">
+ <thead>
+ <tr>
+ [% FOREACH column = columns %]
+ [% IF column.name == sortby %]
+ [%# We add this to the column object so it doesn't affect future
+ # iterations of the loop.
+ #%]
+ [% column.reverse_sort = reverse ? 0 : 1 %]
+ [% END %]
+ <th class="[% column.name FILTER html %]">
+ <a href="duplicates.cgi?sortby=[% column.name FILTER url_quote %]
+ [% IF column.reverse_sort.defined %]
+ [%- %]&amp;reverse=[% column.reverse_sort FILTER url_quote %]
+ [% END %]
+ [% IF base_args_string %]
+ [% "&amp;$base_args_string" FILTER none %]
+ [% END %]"
+ >[% column.description FILTER none %]</a>
+ </th>
+ [% END %]
+ </tr>
+ </thead>
+
+ [%# *** Buglist *** %]
+
+ <tbody>
+ [% FOREACH item = bugs %]
+ [% SET bug = item.bug %]
+ <tr [% " class='resolved'" IF NOT bug.isopened %]>
+ <td class="id">
+ [% bug.id FILTER bug_link(bug) FILTER none %]
+ </td>
+ <td class="count">[% item.count FILTER html %]</td>
+ <td class="delta">[% item.delta FILTER html %]</td>
+ <td class="component">[% bug.component FILTER html %]</td>
+ <td class="bug_severity">
+ [%- display_value('bug_severity', bug.bug_severity) FILTER html %]
+ </td>
+ <td class="op_sys">
+ [%- display_value('op_sys', bug.op_sys) FILTER html %]
+ </td>
+ <td class="target_milestone">
+ [% display_value('target_milestone',
+ bug.target_milestone) FILTER html %]
+ </td>
+ <td class="short_desc">[% bug.short_desc FILTER html %]</td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+[% ELSE %]
+ <h3>No duplicate [% terms.bugs %] found.</h3>
+[% END %]
diff --git a/template/en/default/reports/duplicates.html.tmpl b/template/en/default/reports/duplicates.html.tmpl
new file mode 100644
index 0000000..6b49a23
--- /dev/null
+++ b/template/en/default/reports/duplicates.html.tmpl
@@ -0,0 +1,179 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # sortby: string. the column on which we are sorting the buglist.
+ # reverse: boolean. True if we are reversing the current sort.
+ # maxrows: integer. Max number of rows to display.
+ # changedsince: integer. The number of days ago for the changedsince column.
+ # openonly: boolean. True if we are only showing open bugs.
+ # product: array of strings. The set of products we check for dups.
+ #
+ # Additionally, you need to fulfill the interface to
+ # duplicates-table.html.tmpl.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% IF product.size %]
+ [% title = BLOCK %]
+ Most Frequently Reported [% terms.Bugs %] for
+ [%+ product.join(', ') FILTER html %]
+ [% END %]
+[% ELSE %]
+ [% title = "Most Frequently Reported $terms.Bugs" %]
+[% END%]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ style_urls = ['skins/standard/duplicates.css']
+%]
+
+<p>
+ <a href="#explanation">What is this data?</a>
+ <br>
+ <a href="#params">Change parameters</a>
+</p>
+
+[% PROCESS "reports/duplicates-table.html.tmpl" %]
+
+[%# *** Parameters *** %]
+
+[% bug_ids_string = bug_ids.join(',') %]
+
+<h3><a name="params">Change Parameters</a></h3>
+
+<form method="get" action="duplicates.cgi">
+ <input type="hidden" name="sortby" value="[% sortby FILTER html %]">
+ <input type="hidden" name="reverse" value="[% reverse FILTER html %]">
+ <input type="hidden" name="bug_id" value="[% bug_ids_string FILTER html %]">
+ <table>
+ <tr>
+ <td>When sorting or restricting, work with:</td>
+ <td>
+ <input type="radio" name="sortvisible" id="entirelist" value="0"
+ [% ' checked="checked"' IF NOT sortvisible %]>
+ <label for="entirelist">
+ entire list
+ </label>
+ <br>
+ <input type="radio" name="sortvisible" id="visiblelist" value="1"
+ [% ' checked="checked"' IF sortvisible %]>
+ <label for="visiblelist">
+ currently visible list
+ </label>
+ </td>
+ <td rowspan="4" valign="top">Restrict to products:</td>
+ <td rowspan="4" valign="top">
+ <select name="product" size="5" multiple="multiple">
+ [% FOREACH p = user.get_selectable_products %]
+ <option name="[% p.name FILTER html %]"
+ [% ' selected="selected"' IF product.contains(p.name) %]
+ >[% p.name FILTER html %]</option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td><label for="maxrows">Max rows:</label></td>
+ <td>
+ <input size="4" name="maxrows" id="maxrows"
+ value="[% maxrows FILTER html %]">
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="changedsince">Change column is change in the last:</label>
+ </td>
+ <td>
+ <input size="4" name="changedsince" id="changedsince"
+ value="[% changedsince FILTER html %]"> days
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <label for="openonly">
+ Open [% terms.bugs %] only:
+ </label>
+ </td>
+ <td>
+ <input type="checkbox" name="openonly" id="openonly" value="1"
+ [% ' checked="checked"' IF openonly %]>
+ </td>
+ </tr>
+
+ </table>
+
+ <input type="submit" id="change" value="Change">
+</form>
+
+<form method="post" action="buglist.cgi">
+ <input type="hidden" name="bug_id" value="[% bug_ids_string FILTER html %]">
+ Or just give this to me as a <input type="submit" id="list"
+ value="[% terms.bug %] list">.
+ (Note: the order may not be the same.)
+</form>
+
+<hr>
+
+<b>
+ <a name="explanation">What are "Most Frequently Reported [% terms.Bugs %]"?</a>
+</b>
+
+<p>
+ The Most Frequent [% terms.Bugs %] page lists the known open
+ [%+ terms.bugs %] which are reported most frequently,
+ counting the number of direct and indirect duplicates of [% terms.bugs %].
+ This information is provided in order to assist in minimizing
+ the amount of duplicate [% terms.bugs %] entered into [% terms.Bugzilla %],
+ which saves time for Quality Assurance engineers who have to triage
+ the [% terms.bugs %].
+</p>
+
+<b>How do I use this list?</b>
+
+<ul>
+ <li>Review the most frequent [% terms.bugs %] list.</li>
+ <li>If your problem is listed:</li>
+
+ <ul>
+ <li>Click on the [% terms.bug %] number to confirm that you have found the
+ same [% terms.bug %], and comment if you have additional information
+ or move on with your testing of the product.
+ </li>
+ </ul>
+
+ <li>If your problem not listed:</li>
+
+ <ul>
+ <li><a href="query.cgi">Try and locate a similar [% terms.bug %]</a>
+ that has already been filed.</li>
+ <li>If you find your [% terms.bug %] in [% terms.Bugzilla %],
+ feel free to comment with any new or additional data you may have.</li>
+ <li>If you cannot find your problem already documented in
+ [%+ terms.Bugzilla %],
+ <a href="enter_bug.cgi">file a new [% terms.bug %]</a>.</li>
+ </ul>
+</ul>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/edit-series.html.tmpl b/template/en/default/reports/edit-series.html.tmpl
new file mode 100644
index 0000000..214bbcd
--- /dev/null
+++ b/template/en/default/reports/edit-series.html.tmpl
@@ -0,0 +1,73 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% title = "Edit Series" %]
+[% subheader = BLOCK %]
+ [% default.category FILTER html %] /
+ [%+ default.subcategory FILTER html %] /
+ [%+ default.name FILTER html %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl %]
+
+[% IF changes_saved %]
+ <p>
+ <font color="red">
+ Series updated.
+ </font>
+ </p>
+[% END %]
+
+<form method="get" action="chart.cgi" name="chartform">
+
+ [% PROCESS reports/series.html.tmpl
+ button_name = "Change Data Set" %]
+ <input type="hidden" name="action" value="alter">
+
+ [% IF default.series_id %]
+ <input type="hidden" name="series_id" value="[% default.series_id %]">
+ [% END %]
+</form>
+
+<p>
+ <b>Creator</b>:
+ [% IF default.creator %]
+ <a href="mailto:[% default.creator.email FILTER html %]">
+ [% default.creator.email FILTER html %]</a>
+ [% ELSE %]
+ (automatically created by [% terms.Bugzilla %])
+ [% END %]
+</p>
+
+<p>Note: it is not yet possible to edit the search associated with this data
+set.
+</p>
+
+<p>
+ <a href="query.cgi?[% default.query FILTER html %]">View
+ series search parameters</a> |
+ <a href="buglist.cgi?cmdtype=dorem&amp;namedcmd=
+ [% default.category FILTER url_quote %]-
+ [% default.subcategory FILTER url_quote %]-
+ [% default.name FILTER url_quote %]&amp;remaction=runseries&amp;series_id=
+ [% default.series_id %]">Run series search</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/keywords.html.tmpl b/template/en/default/reports/keywords.html.tmpl
new file mode 100644
index 0000000..10e6573
--- /dev/null
+++ b/template/en/default/reports/keywords.html.tmpl
@@ -0,0 +1,87 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Contributor(s): David D. Kilzer <ddkilzer@kilzer.net>
+ #%]
+
+[%# INTERFACE:
+ # keywords: array keyword objects. May be empty. Each has has four members:
+ # id: id of the keyword
+ # name: the name of the keyword
+ # description: keyword description. Can contain some limited HTML code.
+ # bug_count: number of bugs with that keyword
+ # caneditkeywords: boolean. True if this user can edit keywords
+ %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "$terms.Bugzilla Keyword Descriptions"
+%]
+
+[% FOREACH keyword = keywords %]
+ [% IF loop.index % 50 == 0 %]
+ [% IF loop.index != 0 %]
+ </table>
+ [% END %]
+
+ <table border="1" cellpadding="4" cellspacing="0">
+ <tr bgcolor="#6666FF">
+ <th align="left">Name</th>
+ <th align="left">Description</th>
+ <th align="left">Open [% terms.Bugs %]</th>
+ <th align="left">Total [% terms.Bugs %]</th>
+ </tr>
+ [% END %]
+
+ <tr>
+ <th>
+ <a name="[% keyword.name FILTER html %]">
+ [% keyword.name FILTER html %]</a>
+ </th>
+ <td>[% keyword.description FILTER html_light %]</td>
+ <td align="center">
+ [% IF keyword.bug_count > 0 %]
+ <a href="buglist.cgi?keywords=[% keyword.name FILTER url_quote %]&amp;resolution=---">
+ Search</a>
+ [% ELSE %]
+ none
+ [% END %]
+ </td>
+ <td align="right">
+ [% IF keyword.bug_count > 0 %]
+ <a href="buglist.cgi?keywords=[% keyword.name FILTER url_quote %]">
+ [% keyword.bug_count %]</a>
+ [% ELSE %]
+ none
+ [% END %]
+ </td>
+ </tr>
+[% END %]
+
+[% IF keywords.size > 0 %]
+ </table>
+[% END %]
+
+[% IF caneditkeywords %]
+ <p>
+ <a href="editkeywords.cgi">Edit keywords</a>.
+ </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/menu.html.tmpl b/template/en/default/reports/menu.html.tmpl
new file mode 100644
index 0000000..5f26ac3
--- /dev/null
+++ b/template/en/default/reports/menu.html.tmpl
@@ -0,0 +1,85 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # This template has no interface. It's a list of the available report
+ # types in Bugzilla.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Reporting and Charting Kitchen"
+ doc_section = "reporting.html"
+ style_urls = ['skins/standard/reports.css']
+%]
+
+<p>
+ [% terms.Bugzilla %] allows you to view and track the state of the [% terms.bug %] database in
+ all manner of exciting ways.
+</p>
+
+<h2>Current State</h2>
+
+<ul>
+ <li id="report_search">
+ <strong><a href="query.cgi">Search</a></strong> -
+ list sets of [% terms.bugs %].
+ </li>
+ <li id="report_tabular">
+ <strong>
+ <a href="query.cgi?format=report-table">Tabular reports</a>
+ </strong> -
+ tables of [% terms.bug %] counts in 1, 2 or 3 dimensions, as HTML or CSV.
+ </li>
+ [% IF feature_enabled('graphical_reports') %]
+ <li id="report_graphical">
+ <strong>
+ <a href="query.cgi?format=report-graph">Graphical reports</a>
+ </strong> -
+ line graphs, bar and pie charts.
+ </li>
+ [% END %]
+ [% Hook.process('current_state') %]
+</ul>
+
+[% IF feature_enabled('new_charts') OR feature_enabled('old_charts') %]
+ <h2>Change Over Time</h2>
+
+ <ul>
+ [% IF feature_enabled('old_charts') %]
+ <li id="old_charts">
+ <strong><a href="reports.cgi">Old Charts</a></strong> -
+ plot the status and/or resolution of [% terms.bugs %] against
+ time, for each product in your database.
+ </li>
+ [% END %]
+ [% IF feature_enabled('new_charts') AND user.in_group(Param("chartgroup")) %]
+ <li id="new_charts">
+ <strong><a href="chart.cgi">New Charts</a></strong> -
+ plot any arbitrary search against time. Far more powerful.
+ </li>
+ [% END %]
+ </ul>
+[% END %]
+
+[% Hook.process('end') %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/old-charts.html.tmpl b/template/en/default/reports/old-charts.html.tmpl
new file mode 100644
index 0000000..ca3ba6c
--- /dev/null
+++ b/template/en/default/reports/old-charts.html.tmpl
@@ -0,0 +1,71 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # products: an array of product names the user is allowed to view.
+ # datasets: an array of hashes with available statuses and resolutions.
+ # url_image: URL of the generated graph.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS global/header.html.tmpl
+ title = "$terms.Bug Charts"
+ h1 = "Welcome to the $terms.Bugzilla Charting Kitchen"
+ doc_section = "reporting.html#charts"
+%]
+
+<div align="center">
+ [% IF url_image %]
+ <img src="[% url_image FILTER html %]">
+ <br clear="both">
+ [% ELSE %]
+ <form id="choose_product" method="get" action="reports.cgi">
+ <table border="1" cellpadding="5" cellspacing="2">
+ <tr>
+ <th>Product:</th>
+ <td align="center">
+ <select id="product" name="product">
+ [% FOREACH product = products %]
+ <option value="[% product FILTER html %]">[% product FILTER html %]</option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <th>Chart datasets:</th>
+ <td align="center">
+ <select id="datasets" name="datasets" multiple="multiple" size="5">
+ [%# We cannot use translated statuses and resolutions from field-descs.none.html
+ # because old charts do not distinguish statuses from resolutions. %]
+ [% FOREACH dataset = datasets %]
+ <option value="[% dataset.value FILTER html %]:"
+ [% " selected=\"selected\"" IF dataset.selected %]>
+ [% dataset.value FILTER html %]</option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <th colspan="2">
+ <input type="submit" id="submit" value="Continue">
+ </th>
+ </tr>
+ </table>
+ </form>
+ [% END %]
+</div>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/report-bar.png.tmpl b/template/en/default/reports/report-bar.png.tmpl
new file mode 100644
index 0000000..649fba4
--- /dev/null
+++ b/template/en/default/reports/report-bar.png.tmpl
@@ -0,0 +1,64 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% y_label = "$terms.Bugs" %]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% col_field_disp = field_descs.$col_field || col_field %]
+
+[% FOR i IN [ 0 .. data.0.0.max ] %]
+ [% data.0.0.$i = display_value(col_field, data.0.0.$i) %]
+[% END %]
+
+[% FOR i IN [ 0 .. row_names.max ] %]
+ [% row_names.$i = display_value(row_field, row_names.$i) %]
+[% END %]
+
+[% FILTER null;
+ USE graph = GD.Graph.bars(width, height);
+
+ graph.set(x_label => col_field_disp,
+ y_label => y_label,
+ y_tick_number => 8,
+ y_number_format => "%d",
+ x_label_position => 0.5,
+ x_labels_vertical => x_labels_vertical,
+ bar_spacing => 8,
+ shadow_depth => 4,
+ shadowclr => 'dred',
+ show_values => 1,
+ legend_placement => "RT");
+
+ graph.set(cumulate => "true",
+ show_values => 0) IF cumulate;
+
+ # Workaround for the fact that set_legend won't take row_names directly,
+ # because row_names is an array reference rather than an array.
+ graph.set_legend(row_names.0, row_names.1, row_names.2, row_names.3,
+ row_names.4, row_names.5, row_names.6, row_names.7,
+ row_names.8, row_names.9, row_names.10, row_names.11,
+ row_names.12, row_names.13, row_names.14, row_names.15);
+
+ graph.plot(data.0).png | stdout(1);
+ END;
+-%]
diff --git a/template/en/default/reports/report-line.png.tmpl b/template/en/default/reports/report-line.png.tmpl
new file mode 100644
index 0000000..0edc0fe
--- /dev/null
+++ b/template/en/default/reports/report-line.png.tmpl
@@ -0,0 +1,67 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% y_label = "$terms.Bugs" %]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% col_field_disp = field_descs.$col_field || col_field %]
+
+[% FOR i IN [ 0 .. data.0.0.max ] %]
+ [% data.0.0.$i = display_value(col_field, data.0.0.$i) %]
+[% END %]
+
+[% FOR i IN [ 0 .. row_names.max ] %]
+ [% row_names.$i = display_value(row_field, row_names.$i) %]
+[% END %]
+
+[% IF cumulate %]
+ [% USE graph = GD.Graph.area(width, height) %]
+ [% graph.set(cumulate => "true") %]
+[% ELSE %]
+ [% USE graph = GD.Graph.lines(width, height) %]
+[% END %]
+
+[% FILTER null;
+ graph.set(x_label => col_field_disp,
+ y_label => y_label,
+ y_tick_number => 8,
+ x_label_position => 0.5,
+ x_labels_vertical => x_labels_vertical,
+ legend_placement => "RT",
+ line_width => 2,
+ dclrs => ["lred", "lgreen", "lblue", "lyellow",
+ "lpurple", "lorange", "black", "green",
+ "blue", "dpink", "lbrown", "gray",
+ "red", "dpurple", "gold", "marine"]);
+
+ # Workaround for the fact that set_legend won't take row_names directly,
+ # because row_names is an array reference rather than an array.
+ graph.set_legend(row_names.0, row_names.1, row_names.2, row_names.3,
+ row_names.4, row_names.5, row_names.6, row_names.7,
+ row_names.8, row_names.9, row_names.10, row_names.11,
+ row_names.12, row_names.13, row_names.14, row_names.15);
+
+ graph.plot(data.0).png | stdout(1);
+ END;
+-%]
+
diff --git a/template/en/default/reports/report-pie.png.tmpl b/template/en/default/reports/report-pie.png.tmpl
new file mode 100644
index 0000000..27f5525
--- /dev/null
+++ b/template/en/default/reports/report-pie.png.tmpl
@@ -0,0 +1,39 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% col_field_disp = field_descs.$col_field || col_field %]
+
+[% FOR i IN [ 0 .. data.0.0.max ] %]
+ [% data.0.0.$i = display_value(col_field, data.0.0.$i) %]
+[% END %]
+
+[% FILTER null;
+ USE graph = GD.Graph.pie(width, height);
+
+ graph.set(title => col_field_disp,
+ pie_height => 20,
+ suppress_angle => 2,
+ start_angle => 180);
+
+ graph.plot(data.0).png | stdout(1);
+ END;
+-%]
diff --git a/template/en/default/reports/report-simple.html.tmpl b/template/en/default/reports/report-simple.html.tmpl
new file mode 100644
index 0000000..d358109
--- /dev/null
+++ b/template/en/default/reports/report-simple.html.tmpl
@@ -0,0 +1,35 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Alan Starr (alanjstr)
+ #%]
+
+[%# INTERFACE:
+ # You need to fulfill the interface to report-table.html.tmpl.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+<html>
+
+ [% title = "$terms.Bug List" %]
+
+ <head>
+ <title>[% title FILTER html %]</title>
+ </head>
+
+ <body>
+ [% PROCESS "reports/report-table.html.tmpl" %]
+ </body>
+
+</html>
+
diff --git a/template/en/default/reports/report-table.csv.tmpl b/template/en/default/reports/report-table.csv.tmpl
new file mode 100644
index 0000000..4d8b50a
--- /dev/null
+++ b/template/en/default/reports/report-table.csv.tmpl
@@ -0,0 +1,77 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+[%# INTERFACE:
+ # See report-table.html.tmpl.
+ #%]
+[% PROCESS global/variables.none.tmpl %]
+
+[% colsepchar = user.settings.csv_colsepchar.value %]
+
+[% num_bugs = BLOCK %]Number of [% terms.bugs %][% END %]
+[% tbl_field_disp = field_descs.$tbl_field || tbl_field %]
+[% col_field_disp = field_descs.$col_field || col_field %]
+[% row_field_disp = field_descs.$row_field || row_field %]
+
+[% IF tbl_field %]
+ [% IF tbl_field == 'assigned_to' OR tbl_field == 'reporter'
+ OR tbl_field == 'qa_contact'
+ %]
+ [% tbl_disp = tbl FILTER email %]
+ [% ELSE %]
+ [% tbl_disp = tbl %]
+ [% END %]
+ [% tbl_field_disp FILTER csv %]: [% tbl_disp FILTER csv %]
+[% END %]
+[% IF row_field %]
+ [% row_field_disp FILTER csv %]
+[% END %]
+[% " / " IF col_field AND row_field %]
+[% col_field_disp FILTER csv %]
+[% IF col_field -%]
+ [% FOREACH col = col_names -%]
+ [% colsepchar %]
+ [% PROCESS value_display value = col field = col_field %]
+ [% END -%]
+[% ELSE -%]
+ [% colsepchar %][% num_bugs FILTER csv %]
+[% END %]
+
+[% FOREACH row = row_names %]
+ [% PROCESS value_display value = row field = row_field %]
+ [% FOREACH col = col_names %]
+ [% colsepchar %]
+ [% IF data.$tbl AND data.$tbl.$col AND data.$tbl.$col.$row %]
+ [% data.$tbl.$col.$row -%]
+ [% ELSE %]
+ [% -%]0
+ [% END %]
+ [% END %]
+
+[% END %]
+
+[% BLOCK value_display %]
+ [% SET disp_value = display_value(field, value) %]
+ [% IF field == 'assigned_to' OR field == 'reporter'
+ OR field == 'qa_contact'
+ %]
+ [% disp_value = value FILTER email %]
+ [% END %]
+ [% disp_value FILTER csv %]
+[% END %]
diff --git a/template/en/default/reports/report-table.html.tmpl b/template/en/default/reports/report-table.html.tmpl
new file mode 100644
index 0000000..76b80f8
--- /dev/null
+++ b/template/en/default/reports/report-table.html.tmpl
@@ -0,0 +1,164 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # <rdean@cambianetworks.com>
+ #%]
+
+[%# INTERFACE:
+ # buglistbase: The base query for this table, in URL form
+ # col_field: string. Name of the field being plotted as columns.
+ # row_field: string. Name of the field being plotted as rows.
+ # tbl_field: string. Name of the field being plotted as tables.
+ # col_names: array. List of values for the field being plotted as columns.
+ # row_names: array. List of values for the field being plotted as rows.
+ # data: <depends on format>. Data to plot. Only data.$tbl is accessed.
+ # tbl: Name of a hash in data which is the table to be plotted.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% col_field_disp = field_descs.$col_field || col_field %]
+[% row_field_disp = field_descs.$row_field || row_field %]
+
+[% IF tbl == "-total-" %]
+ [% urlbase = BLOCK %]buglist.cgi?[% buglistbase FILTER html %]
+ [% "&amp;$tbl_vals" IF tbl_vals %][% END %]
+[% ELSE %]
+ [% urlbase = BLOCK %]buglist.cgi?[% buglistbase FILTER html %]&amp;
+ [% tbl_field FILTER url_quote %]=[% tbl FILTER url_quote %][% END %]
+[% END %]
+
+[% IF tbl_field %]
+ <h2>[% tbl_disp FILTER email FILTER html %]</h2>
+[% END %]
+
+<table>
+ <tr>
+ <td>
+ </td>
+ <td align="center">
+ <strong>[% col_field_disp FILTER html %]</strong>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign="middle">
+ <strong>[% row_field_disp FILTER html %]</strong>
+ </td>
+ <td>
+
+
+[% classes = [ [ "t1", "t2" ] , [ "t3", "t4" ] ] %]
+[% col_idx = 0 %]
+[% row_idx = 0 %]
+[% grand_total = 0 %]
+
+<table border="1">
+ [% IF col_field %]
+ <tr>
+ <td class="[% classes.$row_idx.$col_idx %]">
+ </td>
+ [% FOREACH col = col_names %]
+ [% col_totals.$col = 0 %]
+ [% NEXT IF col == "" %]
+
+ [% col_idx = 1 - col_idx %]
+ <td class="[% classes.$row_idx.$col_idx %]">
+ [% PROCESS value_display value = col field = col_field %]
+ </td>
+ [% END %]
+ <td class="ttotal">
+ Total
+ </td>
+ </tr>
+ [% END %]
+
+ [% FOREACH row = row_names %]
+ [% row_total = 0 %]
+
+ [% row_idx = 1 - row_idx %]
+ <tr>
+ <td class="[% classes.$row_idx.$col_idx %]" align="right">
+ [% PROCESS value_display value = row field = row_field %]
+ </td>
+ [% FOREACH col = col_names %]
+ [% row_total = row_total + data.$tbl.$col.$row %]
+ [% NEXT IF col == "" %]
+ [% col_totals.$col = col_totals.$col + data.$tbl.$col.$row %]
+
+ [% col_idx = 1 - col_idx %]
+ <td class="[% classes.$row_idx.$col_idx %]" align="center">
+ [% IF data.$tbl.$col.$row AND data.$tbl.$col.$row > 0 %]
+ <a href="[% urlbase %]&amp;
+ [% row_field FILTER url_quote %]=[% row FILTER url_quote %]&amp;
+ [% col_field FILTER url_quote %]=[% col FILTER url_quote %]">
+ [% data.$tbl.$col.$row %]</a>
+ [% ELSE %]
+ .
+ [% END %]
+ </td>
+ [% END %]
+ <td class="ttotal" align="right">
+ <a href="[% urlbase %]&amp;
+ [% row_field FILTER url_quote %]=[% row FILTER url_quote %]
+ [% "&amp;$col_vals" IF col_vals %]">
+ [% row_total %]</a>
+ [% grand_total = grand_total + row_total %]
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ [% row_idx = 1 - row_idx %]
+ <td class="ttotal">
+ Total
+ </td>
+ [% FOREACH col = col_names %]
+ [% NEXT IF col == "" %]
+
+ <td class="ttotal" align="center">
+ <a href="[% urlbase %]&amp;
+ [% col_field FILTER url_quote %]=[% col FILTER url_quote %]
+ [% "&amp;$row_vals" IF row_vals %]">
+ [% col_totals.$col %]</a>
+ </td>
+ [% END %]
+ <td class="ttotal" align="right">
+ <strong>
+ <a href="[% urlbase %]
+ [% "&amp;$row_vals" IF row_vals %]
+ [% "&amp;$col_vals" IF col_vals %]">[% grand_total %]</a>
+ </strong>
+ </td>
+ </tr>
+</table>
+
+
+ </td>
+ </tr>
+</table>
+
+[% BLOCK value_display %]
+ [% SET disp_value = display_value(field, value) %]
+ [% IF field == 'assigned_to' OR field == 'reporter'
+ OR field == 'qa_contact'
+ %]
+ [% disp_value = value FILTER email %]
+ [% END %]
+ [% disp_value FILTER html FILTER replace('^ $','&nbsp;') %]
+[% END %]
diff --git a/template/en/default/reports/report.csv.tmpl b/template/en/default/reports/report.csv.tmpl
new file mode 100644
index 0000000..f26bc1f
--- /dev/null
+++ b/template/en/default/reports/report.csv.tmpl
@@ -0,0 +1,25 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+[% PROCESS "global/field-descs.none.tmpl" %]
+[% FOREACH tbl = tbl_names %]
+ [% PROCESS "reports/report-table.csv.tmpl" %]
+
+
+[% END %]
diff --git a/template/en/default/reports/report.html.tmpl b/template/en/default/reports/report.html.tmpl
new file mode 100644
index 0000000..4f7ee49
--- /dev/null
+++ b/template/en/default/reports/report.html.tmpl
@@ -0,0 +1,180 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # col_field: string. Name of the field being plotted as columns.
+ # row_field: string. Name of the field being plotted as rows.
+ # tbl_field: string. Name of the field being plotted as tables.
+ # tbl_names: array. List of values for the field being plotted as tables.
+ # time: integer. Seconds since the epoch.
+ # data: <depends on format>. Data to plot.
+ # format: string. Format of the individual reports.
+ # width: integer. For image charts, height of the image.
+ # height: integer. For image charts, width of the image.
+ # imagebase: string. Base URL for chart image.
+ # switchbase: string. Base URL for format switching.
+ # cumulate: boolean. For bar/line charts, whether to cumulate data sets.
+ #%]
+
+[% DEFAULT width = 600
+ height = 350
+%]
+
+[% IF min_width AND width < min_width %]
+ [% width = min_width %]
+[% END %]
+
+[%# We ignore row_field for pie charts %]
+[% IF format == "pie" %]
+ [% row_field = "" %]
+[% END %]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% tbl_field_disp = field_descs.$tbl_field || tbl_field %]
+[% col_field_disp = field_descs.$col_field || col_field %]
+[% row_field_disp = field_descs.$row_field || row_field %]
+[% switchbase = switchbase FILTER html %]
+
+[% title = BLOCK %]
+ Report:
+ [% IF tbl_field %]
+ [% tbl_field_disp FILTER html %]
+ [% END %]
+ [% " / " IF tbl_field AND (col_field OR row_field) %]
+ [% IF row_field %]
+ [% row_field_disp FILTER html %]
+ [% END %]
+ [% " / " IF col_field AND row_field %]
+ [% col_field_disp FILTER html %]
+[% END %]
+
+[% time = time FILTER time('%Y-%m-%d %H:%M:%S') FILTER html %]
+
+[% PROCESS global/header.html.tmpl
+ style = "
+ .t1 { background-color: #ffffff } /* white */
+ .t2 { background-color: #dfefff } /* light blue */
+ .t3 { background-color: #dddddd } /* grey */
+ .t4 { background-color: #c3d3ed } /* darker blue */
+ .ttotal { background-color: #cfffdf } /* light green */
+ "
+ header_addl_info = time
+%]
+
+[% IF debug %]
+ <p>[% query FILTER html %]</p>
+[% END %]
+
+<div align="center">
+
+ [% FOREACH tbl = tbl_names %]
+ [% IF tbl == "-total-" %]
+ [% tbl_disp = "Total" %]
+ [% ELSE %]
+ [% tbl_disp = tbl %]
+ [% END %]
+
+ [% IF format == "table" %]
+ [% PROCESS "reports/report-table.html.tmpl" %]
+ [% ELSE %]
+ [% IF tbl %]
+ <h2>[% tbl_disp FILTER email FILTER html %]</h2>
+ [% END %]
+
+ [% imageurl = BLOCK %]report.cgi?[% imagebase FILTER html %]&amp;format=
+ [% format FILTER url_quote %]&amp;ctype=png&amp;action=plot&amp;
+ [% IF tbl_field %]
+ [% IF tbl != "-total-" %]
+ [% tbl_field FILTER url_quote %]=[% tbl FILTER url_quote %]&amp;
+ [% ELSE %]
+ [% FOREACH tblname = tbl_names %]
+ [% IF tblname != "-total-" %]
+ [% tbl_field FILTER url_quote %]=[% tblname FILTER url_quote %]&amp;
+ [% END %]
+ [% END %]
+ [% END %]
+ [% END %]width=[% width %]&amp;height=[% height %]
+ [% END %]
+
+ <img alt="Graphical report results" src="[% imageurl %]"
+ width="[% width %]" height="[% height %]">
+ [% END %]
+ <br>
+ [% END %]
+
+ <table>
+ <tr>
+ <td>
+ [% formats = [ { name => "pie", description => "Pie" },
+ { name => "bar", description => "Bar" },
+ { name => "line", description => "Line" },
+ { name => "table", description => "Table" } ] %]
+
+ [% formaturl = "report.cgi?$switchbase&amp;width=$width" _
+ "&amp;height=$height&amp;action=wrap" %]
+ [% FOREACH other_format = formats %]
+ [% NEXT IF other_format.name == "pie" AND row_field AND col_field %]
+ [% UNLESS other_format.name == format %]
+ <a href="[% formaturl %]&amp;format=[% other_format.name %]">
+ [% END %]
+ [% other_format.description FILTER html %]
+ [% "</a>" UNLESS other_format.name == format %] |
+ [% END %]
+ <a href="[% formaturl %]&amp;ctype=csv&amp;format=table">CSV</a>
+ </td>
+
+ [% IF format != "table" %]
+ <td>
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </td>
+
+ [% sizeurl = BLOCK %]report.cgi?
+ [% switchbase %]&amp;action=wrap&amp;format=
+ [% format FILTER html %][% END %]
+ <td align="center">
+ <a href="[% sizeurl %]&amp;width=[% width %]&amp;height=
+ [% height + 100 %]">Taller</a><br>
+ <a href="[% sizeurl %]&amp;width=[% width - 100 %]&amp;height=
+ [% height %]">Thinner</a> *
+ <a href="[% sizeurl %]&amp;width=[% width + 100 %]&amp;height=
+ [% height %]">Fatter</a>&nbsp;&nbsp;&nbsp;&nbsp;<br>
+ <a href="[% sizeurl %]&amp;width=[% width %]&amp;height=
+ [% height - 100 %]">Shorter</a><br>
+ </td>
+ [% END %]
+ </tr>
+ </table>
+
+ <p>
+ [% IF format == "table" %]
+ <a href="query.cgi?[% switchbase %]&amp;format=report-table">Edit
+ this report</a>
+ [% ELSE %]
+ <a href="query.cgi?[% switchbase %]&amp;chart_format=
+ [% format %]&amp;format=report-graph&amp;cumulate=[% cumulate %]">
+ Edit this report
+ </a>
+ [% END %]
+ </p>
+
+</div>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/series-common.html.tmpl b/template/en/default/reports/series-common.html.tmpl
new file mode 100644
index 0000000..cecf288
--- /dev/null
+++ b/template/en/default/reports/series-common.html.tmpl
@@ -0,0 +1,119 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # donames: boolean. True if we have a multi-select for names as well as
+ # categories and subcategories.
+ # category: hash (keyed by category) of hashes (keyed by subcategory) of
+ # hashes (keyed by name), with value being the series_id of the
+ # series. Contains details of all series the user can see.
+ #%]
+
+[% subcategory = category.${default.category} %]
+[% name = subcategory.${default.subcategory} %]
+
+<script type="text/javascript">
+[%# This structure holds details of the series the user can select from. %]
+var series = {
+[% FOREACH c = category.keys.sort %]
+ "[%+ c FILTER js %]" : {
+ [% FOREACH s = category.$c.keys.sort %]
+ "[%+ s FILTER js %]" : {
+ [% IF donames %]
+ [% FOREACH n = category.$c.$s.keys.sort %]
+ "[% n FILTER js %]":
+ [% category.$c.$s.$n FILTER js %][% ", " UNLESS loop.last %]
+ [% END %]
+ [% END %]
+ }[% ", " UNLESS loop.last %]
+ [% END %]
+ }[% ", " UNLESS loop.last %]
+[% END %]
+};
+
+[%# This function takes necessary action on selection of a category %]
+function catSelected() {
+ var cat = document.chartform.category.value;
+ var subcats = series[cat];
+
+ var subcatwidget = document.chartform.subcategory;
+
+ subcatwidget.options.length = 0;
+ var i = 0;
+
+ for (x in subcats) {
+ subcatwidget.options[i] = new Option(x, x);
+ i++;
+ }
+
+ [% IF newtext %]
+ subcatwidget.options[i] = new Option("[% newtext FILTER js %]", "");
+ [% END %]
+
+ subcatwidget.disabled = false;
+ subcatwidget.options[0].selected = true;
+
+ if (document.chartform.action[1]) {
+ [%# On the query form, select the right radio button. %]
+ document.chartform.action[1].checked = true;
+ }
+
+ checkNewState();
+}
+
+[%# This function updates the disabled state of the two "new" textboxes %]
+function checkNewState() {
+ var fm = document.chartform;
+ if (fm.newcategory) {
+ fm.newcategory.disabled =
+ (fm.category.value != "" ||
+ fm.action[1] && fm.action[1].checked == false);
+ fm.newsubcategory.disabled =
+ (fm.subcategory.value != "" ||
+ fm.action[1] && fm.action[1].checked == false);
+ }
+}
+</script>
+
+[%###########################################################################%]
+[%# Block for SELECT fields - pinched from search/form.html.tmpl #%]
+[%###########################################################################%]
+
+[% BLOCK series_select %]
+ <td align="left">
+ <select name="[% sel.name %]" id="[% sel.name %]"
+ size="[% sel.size %]" style="width: 15em"
+ [%+ 'multiple="multiple"' IF sel.multiple %]
+ [%+ "disabled=\"disabled\"" UNLESS ${sel.name}.keys.size || newtext %]
+ [%+ "onchange=\"$sel.onchange\"" IF sel.onchange %]>
+ [% FOREACH x = ${sel.name}.keys.sort %]
+ [% value = sel.value_in_hash ? ${sel.name}.$x : x %]
+ <option value="[% value FILTER html %]"
+ [% " selected" IF default.${sel.name} == value %]>
+ [% x FILTER html %]</option>
+ [% END %]
+ [% IF newtext %]
+ <option value="">[% newtext FILTER html %]</option>
+ [% ELSIF NOT ${sel.name}.keys.size %]
+ <option value="" disabled="disabled"></option>
+ [% END %]
+ </select>
+ </td>
+[% END %]
diff --git a/template/en/default/reports/series.html.tmpl b/template/en/default/reports/series.html.tmpl
new file mode 100644
index 0000000..3cf9390
--- /dev/null
+++ b/template/en/default/reports/series.html.tmpl
@@ -0,0 +1,97 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # default: hash. Defaults for category, subcategory, name etc.
+ # button_name: string. What the button will say.
+ # category: hash (keyed by category) of hashes (keyed by subcategory) of
+ # hashes (keyed by name), with value being the series_id of the
+ # series. Contains details of all series the user can see.
+ #%]
+
+[% PROCESS "reports/series-common.html.tmpl"
+ newtext = "New (name below)"
+ %]
+
+<table cellpadding="2" cellspacing="2" border="0"
+ style="text-align: left; margin-left: 20px">
+ <tbody>
+ <tr>
+ <th>Category:</th>
+ <th></th>
+ <th>Sub-category:</th>
+ <th>Name:</th>
+ <td></td>
+ </tr>
+ <tr>
+ [% PROCESS series_select sel = { name => 'category',
+ size => 5,
+ onchange => "catSelected()" } %]
+ <td>
+ <noscript>
+ <input type="submit" name="action-edit" value="Update --&gt;"
+ id="action-edit">
+ </noscript>
+ </td>
+
+ [% PROCESS series_select sel = { name => 'subcategory',
+ size => 5,
+ onchange => "checkNewState()" } %]
+
+ <td valign="top" name="name">
+ <input type="text" name="name" maxlength="64"
+ value="[% default.name.0 FILTER html %]" size="25">
+ </td>
+
+ <td valign="top">
+ <span style="font-weight: bold;">Run every</span> &nbsp;
+ <input type="text" size="2" name="frequency"
+ value="[% (default.frequency.0 OR 7) FILTER html %]">
+ <span style="font-weight: bold;">&nbsp;day(s)</span><br>
+ [%# Change 'admin' here and in Series.pm, or remove the check
+ completely, if you want to change who can make series public. %]
+ [% IF user.in_group('admin') %]
+ <input type="checkbox" name="public"
+ [%+ "checked='checked'" IF default.public.0 %]>
+ <span style="font-weight: bold;">Visible to all<br>
+ (within group restrictions)</span>
+ [% END %]
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ <input type="text" style="width: 100%" name="newcategory"
+ maxlength="64" value="[% default.newcategory.0 FILTER html %]">
+ </td>
+ <td></td>
+ <td>
+ <input type="text" style="width: 100%" name="newsubcategory"
+ maxlength="64"
+ value="[% default.newsubcategory.0 FILTER html %]">
+ </td>
+ <td></td>
+ <td>
+ <input type="submit" name="submit-button" id="submit-button"
+ value="[% button_name FILTER html %]">
+ </td>
+ </tr>
+ </tbody>
+</table>
diff --git a/template/en/default/request/email.txt.tmpl b/template/en/default/request/email.txt.tmpl
new file mode 100644
index 0000000..e48b2fc
--- /dev/null
+++ b/template/en/default/request/email.txt.tmpl
@@ -0,0 +1,86 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Jeff Hedlund <jeff.hedlund@matrixsi.com>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% bugidsummary = bug.bug_id _ ': ' _ bug.short_desc %]
+[% attidsummary = attachment.id _ ': ' _ attachment.description %]
+[% flagtype_name = flag ? flag.type.name : old_flag.type.name %]
+[% statuses = { '+' => "granted" , '-' => 'denied' , 'X' => "canceled" ,
+ '?' => "asked" } %]
+
+[% to_identity = "" %]
+[% on_behalf_of = 0 %]
+[% action = flag.status || 'X' %]
+
+[% IF flag && flag.status == '?' %]
+ [% subject_status = "requested" %]
+ [% IF flag.setter_id == user.id %]
+ [% to_identity = flag.requestee.identity _ " for" %]
+ [% ELSE %]
+ [% on_behalf_of = 1 %]
+ [% IF flag.requestee %][% to_identity = " to " _ flag.requestee.identity %][% END %]
+ [% END %]
+[% ELSE %]
+ [% IF old_flag && old_flag.status == '?' %]
+ [% to_identity = old_flag.setter.identity _ "'s request for" %]
+ [% END %]
+ [% subject_status = statuses.$action %]
+[% END %]
+From: [% Param('mailfrom') %]
+To: [% to %]
+Subject: [% flagtype_name %] [%+ subject_status %]: [[% terms.Bug %] [%+ bug.bug_id %]] [% bug.short_desc %]
+[%- IF attachment %] :
+ [Attachment [% attachment.id %]] [% attachment.description %][% END %]
+X-Bugzilla-Type: request
+[%+ threadingmarker %]
+
+[%+ USE wrap -%]
+[%- FILTER bullet = wrap(80) -%]
+
+[% IF on_behalf_of %]
+[% user.identity %] has reassigned [% flag.setter.identity %]'s request for [% flagtype_name %]
+[% to_identity %]:
+[% ELSE %]
+[% user.identity %] has [% statuses.$action %] [%+ to_identity %] [%+ flagtype_name %]:
+[% END %]
+
+[% terms.Bug %] [%+ bugidsummary %]
+[% END %]
+[%+ urlbase %]show_bug.cgi?id=[% bug.bug_id %]
+[% IF attachment %]
+
+[% FILTER bullet = wrap(80) %]
+Attachment [% attidsummary %]
+[%- END %]
+[%+ urlbase %]attachment.cgi?id=[% attachment.id %]&action=edit
+[%- END %]
+[%- FILTER bullet = wrap(80) %]
+
+[% USE Bugzilla %]
+[%-# .defined is necessary to avoid a taint issue in Perl < 5.10.1, see bug 509794. %]
+[% IF Bugzilla.cgi.param("comment").defined && Bugzilla.cgi.param("comment").length > 0 %]
+------- Additional Comments from [% user.identity %]
+[%+ Bugzilla.cgi.param("comment") %]
+[% END %]
+
+[%- END %]
diff --git a/template/en/default/request/queue.html.tmpl b/template/en/default/request/queue.html.tmpl
new file mode 100644
index 0000000..471f9b9
--- /dev/null
+++ b/template/en/default/request/queue.html.tmpl
@@ -0,0 +1,248 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% PROCESS global/header.html.tmpl
+ title="Request Queue"
+ style = "
+ table.requests th { text-align: left; }
+ table#filtering th { text-align: right; }
+ "
+ onload="var f = document.request_form; selectProduct(f.product, f.component, null, null, 'Any');"
+ javascript_urls=["js/productform.js"]
+%]
+
+<script type="text/javascript">
+ var useclassification = false; // No classification level in use
+ var first_load = true; // Is this the first time we load the page?
+ var last_sel = []; // Caches last selection
+ var cpts = new Array();
+ [% n = 1 %]
+ [% IF Param('useclassification') %]
+ [% FOREACH clas = user.get_selectable_classifications %]
+ [% FOREACH prod = user.get_selectable_products(clas.id) %]
+ [%+ PROCESS js_comp %]
+ [% END %]
+ [% END %]
+ [% ELSE %]
+ [% FOREACH prod = user.get_selectable_products %]
+ [%+ PROCESS js_comp %]
+ [% END %]
+ [% END %]
+</script>
+
+[% BLOCK js_comp %]
+ cpts['[% n %]'] = [
+ [%- FOREACH comp = prod.components %]'[% comp.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%]];
+ [% n = n+1 %]
+[% END %]
+
+<p>
+When you are logged in, only requests made by you or addressed to you
+are shown by default. You can change the criteria using the form below.
+When you are logged out, all pending requests that are not restricted
+to some group are shown by default.
+</p>
+
+<form id="request_form" name="request_form" action="request.cgi" method="get">
+ <input type="hidden" name="action" value="queue">
+
+ <table id="filtering">
+ <tr>
+ <th>Requester:</th>
+ <td><input type="text" name="requester" value="[% cgi.param('requester') FILTER html %]" size="20"
+ title="Requester's email address"></td>
+ <th>Product:</th>
+ <td>
+ <select name="product" onchange="selectProduct(this, this.form.component, null, null, 'Any');">
+ <option value="">Any</option>
+ [% IF Param('useclassification') %]
+ [% FOREACH c = user.get_selectable_classifications %]
+ <optgroup label="[% c.name FILTER html %]">
+ [% FOREACH p = user.get_selectable_products(c.id) %]
+ <option value="[% p.name FILTER html %]"
+ [% " selected" IF cgi.param('product') == p.name %]>
+ [% p.name FILTER html %]
+ </option>
+ [% END %]
+ </optgroup>
+ [% END %]
+ [% ELSE %]
+ [% FOREACH p = user.get_selectable_products %]
+ <option value="[% p.name FILTER html %]"
+ [% " selected" IF cgi.param('product') == p.name %]>
+ [% p.name FILTER html %]
+ </option>
+ [% END %]
+ [% END %]
+ </select>
+ </td>
+ <th>Flag:</th>
+ <td>
+ [% PROCESS "global/select-menu.html.tmpl"
+ name="type"
+ options=types
+ default=cgi.param('type') %]
+ </td>
+
+ [%# We could let people see a "queue" of non-pending requests. %]
+ <!--
+ <th>Status:</th>
+ <td>
+ [%# PROCESS "global/select-menu.html.tmpl"
+ name="status"
+ options=["all", "?", "+-", "+", "-"]
+ default=cgi.param('status') %]
+ </td>
+ -->
+
+ </tr>
+ <tr>
+ <th>Requestee:</th>
+ <td><input type="text" name="requestee" value="[% cgi.param('requestee') FILTER html %]" size="20"
+ title="Requestee's email address or &quot;-&quot; (hyphen) for requests with no requestee"></td>
+ <th>Component:</th>
+ <td>
+ <select name="component">
+ <option value="">Any</option>
+ [% FOREACH comp = components %]
+ <option value="[% comp FILTER html %]" [% "selected" IF cgi.param('component') == comp %]>
+ [% comp FILTER html %]</option>
+ [% END %]
+ </select>
+ </td>
+ <th>Group By:</th>
+ <td>
+ [% groups = {
+ "Requester" => 'requester' ,
+ "Requestee" => 'requestee',
+ "Flag" => 'type' ,
+ "Product/Component" => 'category'
+ } %]
+ [% PROCESS "global/select-menu.html.tmpl" name="group" options=groups default=cgi.param('group') %]
+ </td>
+ <td><input type="submit" id="filter" value="Filter"></td>
+ </tr>
+ </table>
+
+</form>
+
+[% column_headers = {
+ "type" => "Flag" ,
+ "status" => "Status" ,
+ "bug" => "$terms.Bug" ,
+ "attachment" => "Attachment" ,
+ "requester" => "Requester" ,
+ "requestee" => "Requestee" ,
+ "created" => "Created" ,
+ "category" => "Product/Component" } %]
+
+[% DEFAULT display_columns = ["requester", "requestee", "type", "bug", "attachment", "created"]
+ group_field = "Requestee"
+ group_value = ""
+%]
+
+[% IF debug %]
+ <p>[% query FILTER html %]</p>
+[% END %]
+
+[% IF requests.size == 0 %]
+ <p>
+ No requests.
+ </p>
+[% ELSE %]
+ [% FOREACH request = requests %]
+ [% IF request.$group_field != group_value || loop.first %]
+ [% group_value = request.$group_field %]
+ [% PROCESS display_buglist UNLESS loop.first %]
+ [% PROCESS start_new_table %]
+ [% END %]
+ [% buglist.${request.bug_id} = 1 %]
+ <tr>
+ [% FOREACH column = display_columns %]
+ [% NEXT IF column == group_field || excluded_columns.contains(column) %]
+ <td>[% PROCESS "display_$column" %]</td>
+ [% END %]
+ </tr>
+ [% END %]
+ [% PROCESS display_buglist %]
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[% BLOCK start_new_table %]
+ [% buglist = {} %]
+
+ <h3>[% column_headers.$group_field %]:
+ [%+ (request.$group_field || "None") FILTER email FILTER html %]</h3>
+ <table class="requests" cellspacing="0" cellpadding="4" border="1">
+ <tr>
+ [% FOREACH column = display_columns %]
+ [% NEXT IF column == group_field || excluded_columns.contains(column) %]
+ <th>[% column_headers.$column %]</th>
+ [% END %]
+ </tr>
+[% END %]
+
+[% BLOCK display_type %]
+ [% request.type FILTER html %]
+[% END %]
+
+[% BLOCK display_status %]
+ [% request.status %]
+[% END %]
+
+[% BLOCK display_bug %]
+ <a href="show_bug.cgi?id=[% request.bug_id %]">
+ [% request.bug_id %]: [%+ request.bug_summary FILTER html %]</a>
+[% END %]
+
+[% BLOCK display_attachment %]
+ [% IF request.attach_id %]
+ <a href="attachment.cgi?id=[% request.attach_id %]&amp;action=edit">
+ [% request.attach_id %]: [%+ request.attach_summary FILTER html %]</a>
+ [% ELSE %]
+ N/A
+ [% END %]
+[% END %]
+
+[% BLOCK display_requestee %]
+ [% request.requestee FILTER email FILTER html %]
+[% END %]
+
+[% BLOCK display_requester %]
+ [% request.requester FILTER email FILTER html %]
+[% END %]
+
+[% BLOCK display_created %]
+ [% request.created FILTER time %]
+[% END %]
+
+[% BLOCK display_buglist %]
+ </table>
+ [% NEXT UNLESS buglist.keys.size %]
+ <a href="buglist.cgi?bug_id=
+ [%- buglist.keys.nsort.join(",") FILTER html %]">(view as
+ [%+ terms.bug %] list)</a>
+[% END %]
diff --git a/template/en/default/search/boolean-charts.html.tmpl b/template/en/default/search/boolean-charts.html.tmpl
new file mode 100644
index 0000000..1b79a45
--- /dev/null
+++ b/template/en/default/search/boolean-charts.html.tmpl
@@ -0,0 +1,136 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% types = [
+ "noop",
+ "equals",
+ "notequals",
+ "anyexact",
+ "substring",
+ "casesubstring",
+ "notsubstring",
+ "anywordssubstr",
+ "allwordssubstr",
+ "nowordssubstr",
+ "regexp",
+ "notregexp",
+ "lessthan",
+ "greaterthan",
+ "anywords",
+ "allwords",
+ "nowords",
+ "changedbefore",
+ "changedafter",
+ "changedfrom",
+ "changedto",
+ "changedby",
+ "matches",
+ "notmatches",
+] %]
+
+ <p>
+ <strong>
+ <a name="chart">Advanced Searching Using Boolean Charts</a>:
+ </strong>
+ </p>
+
+[%# Whoever wrote the original version of boolean charts had a seriously twisted mind %]
+
+[% jsmagic = "onclick=\"this.form.action='query.cgi#chart'; this.form.method='POST'; return 1;\"" %]
+
+[% FOREACH chart = default.charts %]
+ [% chartnum = loop.count - 1 %]
+ <table>
+ <tr>
+ <td>
+ <input type="checkbox" id="negate[% chartnum FILTER html %]"
+ name="negate[% chartnum FILTER html %]" value="1"
+ [%+ "checked" IF chart.negate %]>
+ <label for="negate[% chartnum FILTER html %]">
+ Not (negate this whole chart)
+ </label>
+ </td>
+ </tr>
+ [% FOREACH row = chart.rows %]
+ [% rownum = loop.count - 1 %]
+ <tr>
+ [% FOREACH col = row %]
+ [% colnum = loop.count - 1 %]
+ <td>
+ <select name="[% "field${chartnum}-${rownum}-${colnum}" %]">
+ [% FOREACH field = fields %]
+ <option value="[% field.name %]" [% "selected" IF field.name == col.field %]>
+ [% field_descs.${field.name} || field.description FILTER html %]
+ </option>
+ [% END %]
+ </select>
+
+ [% INCLUDE "search/type-select.html.tmpl"
+ name = "type${chartnum}-${rownum}-${colnum}",
+ types = types, selected = col.type %]
+
+ <input name="[% "value${chartnum}-${rownum}-${colnum}" %]"
+ value="[% col.value FILTER html %]">
+ </td>
+
+ [% UNLESS loop.last %]
+ <td align="center">
+ Or
+ </td>
+ </tr>
+ <tr>
+ [% ELSE %]
+ <td>
+ [% newor = colnum + 1 %]
+ <input type="submit" value="Or" [% jsmagic %]
+ name="cmd-add[% "${chartnum}-${rownum}-${newor}" %]"
+ id="cmd-add[% "${chartnum}-${rownum}-${newor}" %]">
+ </td>
+ [% END %]
+
+ [% END %]
+ </tr>
+
+ [% UNLESS loop.last %]
+ <tr>
+ <td>And</td>
+ </tr>
+ [% ELSE %]
+ <tr>
+ <td>
+ [% newand = rownum + 1; newchart = chartnum + 1 %]
+ <input type="submit" value="And" [% jsmagic %]
+ name="cmd-add[% "${chartnum}-${newand}-0" %]"
+ id="cmd-add[% "${chartnum}-${newand}-0" %]">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ <input type="submit" value="Add another boolean chart" [% jsmagic %]
+ name="cmd-add[% newchart %]-0-0"
+ id="cmd-add[% newchart %]-0-0">
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ </td>
+ </tr>
+ [% END %]
+
+ [% END %]
+ </table>
+ <hr>
+[% END %]
diff --git a/template/en/default/search/form.html.tmpl b/template/en/default/search/form.html.tmpl
new file mode 100644
index 0000000..2e2ae73
--- /dev/null
+++ b/template/en/default/search/form.html.tmpl
@@ -0,0 +1,643 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Chris Lahey <clahey@ximian.com> [javascript fixes]
+ # Christian Reis <kiko@async.com.br> [javascript rewrite]
+ # Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+<script type="text/javascript">
+
+var first_load = true; [%# is this the first time we load the page? %]
+var last_sel = new Array(); [%# caches last selection %]
+
+[% IF Param('useclassification') %]
+var useclassification = true;
+var prods = new Array();
+[% ELSE %]
+var useclassification = false;
+[% END %]
+var cpts = new Array();
+var vers = new Array();
+[% IF Param('usetargetmilestone') %]
+var tms = new Array();
+[% END %]
+
+[%# Create an array of products, indexed by the classification #%]
+
+[% nclass = 0 %]
+[% FOREACH c = classification %]
+ prods[[% nclass FILTER js %]] = [
+ [% sep = '' %]
+ [%- FOREACH item = user.get_selectable_products(c.id) -%]
+ [%- IF item.components.size -%]
+ [%- sep FILTER js %]'[% item.name FILTER js %]'
+ [%- sep = ',' -%]
+ [%- END -%]
+ [%- END -%] ];
+ [% nclass = nclass+1 %]
+[% END %]
+
+[%# Create three arrays of components, versions and target milestones, indexed
+ # numerically according to the product they refer to. #%]
+
+[% n = 0 %]
+[% FOREACH p = product %]
+ [% NEXT IF NOT p.components.size %]
+ [% IF Param('useclassification') %]
+ prods['[% p.name FILTER js %]'] = [% n %]
+ [% END %]
+ cpts[[% n %]] = [
+ [%- FOREACH item = p.components %]'[% item.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ];
+ vers[[% n %]] = [
+ [%- FOREACH item = p.versions -%]'[% item.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ];
+ [% IF Param('usetargetmilestone') %]
+ tms[[% n %]] = [
+ [%- FOREACH item = p.milestones %]'[% item.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ];
+ [% END %]
+ [% n = n+1 %]
+[% END %]
+
+/*
+ * doOnSelectProduct determines which selection should get updated
+ *
+ * - selectmode = 0 - init
+ * selectmode = 1 - classification selected
+ * selectmode = 2 - product selected
+ *
+ * globals:
+ * queryform - string holding the name of the selection form
+ */
+function doOnSelectProduct(selectmode) {
+ var f = document.forms[queryform];
+ var milestone = (typeof(f.target_milestone) == "undefined" ?
+ null : f.target_milestone);
+ if (selectmode == 0) {
+ // If there is no classification selected, give us a chance to fill
+ // the select fields with values from the possibly selected product.
+ if (useclassification && f.classification.selectedIndex > -1) {
+ selectClassification(f.classification, f.product, f.component, f.version, milestone);
+ } else {
+ selectProduct(f.product, f.component, f.version, milestone, null);
+ }
+ } else if (selectmode == 1) {
+ selectClassification(f.classification, f.product, f.component, f.version, milestone);
+ } else {
+ selectProduct(f.product, f.component, f.version, milestone, null);
+ }
+}
+
+</script>
+
+[% query_types = [
+ "allwordssubstr",
+ "anywordssubstr",
+ "substring",
+ "casesubstring",
+ "allwords",
+ "anywords",
+ "regexp",
+ "notregexp",
+] %]
+
+[%# If we resubmit to ourselves, we need to know if we are using a format. %]
+[% thisformat = query_format != '' ? query_format : format %]
+<input type="hidden" name="query_format" value="[% thisformat FILTER html %]">
+
+[%# *** Summary *** %]
+
+<table>
+ <tr>
+ <th align="right">
+ <label for="short_desc" accesskey="s"><u>S</u>ummary</label>:
+ </th>
+ <td>
+ [% INCLUDE "search/type-select.html.tmpl"
+ name = "short_desc_type",
+ types = query_types, selected = default.short_desc_type.0 %]
+ </td>
+ <td>
+ <input name="short_desc" id="short_desc" size="40"
+ value="[% default.short_desc.0 FILTER html %]">
+ <script type="text/javascript"> <!--
+ document.forms[queryform].short_desc.focus();
+ // -->
+ </script>
+ </td>
+ <td>
+ [% IF button_name %]
+ <input type="submit" id="[% button_name FILTER css_class_quote %]_top"
+ value="[% button_name FILTER html %]">
+ [% END %]
+ </td>
+ </tr>
+
+[%# *** Classification Product Component Version Target *** %]
+ <tr>
+ <td colspan="4">
+ <table>
+ <tr>
+ [% Hook.process('before_selects_top') %]
+ [% IF Param('useclassification') %]
+ <td valign="top">
+ <table>
+ <tr valign="bottom">
+ <th align="left">
+ <label for="classification">Classification</label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ <td align="left">
+ <select name="classification" multiple="multiple" size="5" id="classification"
+ onchange="doOnSelectProduct(1);">
+ [% FOREACH cat = classification %]
+ <option value="[% cat.name FILTER html %]"
+ [% " selected" IF lsearch(default.classification, cat.name) != -1 %]>
+ [% cat.name FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ </table>
+ </td>
+ [% END %]
+ <td valign="top">
+ <table>
+ <tr valign="bottom">
+ <th align="left">
+ <label for="product" accesskey="p"><u>P</u>roduct</label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ [%# Can't use the select block here because of the onChange %]
+ <td align="left">
+ <select name="product" multiple="multiple" size="5" id="product"
+ onchange="doOnSelectProduct(2);">
+ [% FOREACH p = product %]
+ [% IF p.components.size %]
+ <option value="[% p.name FILTER html %]"
+ [% " selected" IF lsearch(default.product, p.name) != -1 %]>
+ [% p.name FILTER html %]</option>
+ [% END %]
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td valign="top">
+ <table>
+ <tr valign="bottom">
+ <th align="left">
+ <label for="component" accesskey="m"><a href="describecomponents.cgi">Co<u>m</u>ponent</a></label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ [%# Can't use the select block here because 'component' is a toolkit
+ reserved word - we use 'component_' instead. %]
+ <td align="left">
+ <select name="component" id="component"
+ multiple="multiple" size="5">
+ [% FOREACH c = component_ %]
+ <option value="[% c FILTER html %]"
+ [% " selected" IF lsearch(default.component, c) != -1 %]>
+ [% c FILTER html %]</option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td valign="top">
+ <table>
+ <tr valign="bottom">
+ <th align="left">
+ <label for="version">Version</label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ [% PROCESS select sel = { name => 'version',
+ size => 5 } %]
+ </tr>
+ </table>
+ </td>
+ [% IF Param('usetargetmilestone') %]
+ <td valign="top">
+ <table>
+ <tr valign="bottom">
+ <th align="left">
+ <label for="target_milestone">Target</label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ [% PROCESS select sel = { name => 'target_milestone',
+ size => 5 } %]
+ </tr>
+ </table>
+ </td>
+ [% END %]
+ [% Hook.process('after_selects_top') %]
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+[%# *** Comment URL Whiteboard Keywords *** %]
+
+ [% SET freetext_fields = [
+ { name => "longdesc", description => "A&nbsp;<u>C</u>omment",
+ accesskey => 'c' },
+ { name => "bug_file_loc", description => "The&nbsp;<u>U</u>RL",
+ accesskey => 'u' },
+ { name => "status_whiteboard", description => "<u>W</u>hiteboard",
+ accesskey => 'w' }
+ ] %]
+
+ [% Hook.process('before_freetext_fields') %]
+ [% FOREACH field = freetext_fields %]
+ [% NEXT IF field.name == 'status_whiteboard'
+ AND NOT Param('usestatuswhiteboard')
+ %]
+ <tr>
+ <th align="right">
+ <label for="[% field.name %]"
+ accesskey="[% field.accesskey %]">[% field.description %]</label>:
+ </th>
+ <td>
+ [% type = field.name _ "_type" %]
+ [% INCLUDE "search/type-select.html.tmpl"
+ name = type,
+ types = query_types, selected = default.$type.0 %]
+ </td>
+ <td><input name="[% field.name %]" id="[% field.name %]" size="40"
+ value="[% default.${field.name}.0 FILTER html %]">
+ </td>
+ <td></td>
+ </tr>
+ [% END %]
+
+ [% IF use_keywords %]
+ <tr>
+ <th align="right">
+ <label for="keywords" accesskey="k"><a href="describekeywords.cgi"><u>K</u>eywords</a></label>:
+ </th>
+ <td>
+ [% INCLUDE "search/type-select.html.tmpl"
+ name = "keywords_type",
+ types = ['allwords', 'anywords', 'nowords', 'regexp', 'notregexp'],
+ selected = default.keywords_type.0 %]
+ </td>
+ <td>
+ <input name="keywords" id="keywords" size="40"
+ value="[% default.keywords.0 FILTER html %]">
+ </td>
+ </tr>
+ [% END %]
+
+ [%# Deadline %]
+ [% IF user.is_timetracker %]
+ <tr>
+ <th align="right">
+ <label for="deadlinefrom" accesskey="l">Dead<u>l</u>ine</label>:
+ </th>
+ <td>
+ from <input name="deadlinefrom" id="deadlinefrom" size="10" maxlength="10"
+ value="[% default.deadlinefrom.0 FILTER html %]">
+ to <input name="deadlineto" size="10" maxlength="10"
+ value="[% default.deadlineto.0 FILTER html %]">
+ </td>
+ <td>
+ <small>(YYYY-MM-DD or relative dates)</small>
+ </td>
+ </tr>
+ [% END %]
+
+ [% Hook.process('after_freetext_fields') %]
+
+</table>
+
+<hr>
+
+[%# *** Status Resolution Severity Priority Hardware OS *** %]
+
+<table>
+ <tr>
+ [% Hook.process('before_selects_bottom') %]
+ <td>
+ <table>
+ <tr>
+ <th align="left">
+ <label for="bug_status" accesskey="a">St<u>a</u>tus</label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ [% PROCESS select sel = { name => 'bug_status',
+ size => 7 } %]
+ </tr>
+ </table>
+ </td>
+ <td>
+ <table>
+ <tr>
+ <th align="left">
+ <label for="resolution" accesskey="r"><u>R</u>esolution</label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ [% PROCESS select sel = { name => 'resolution',
+ size => 7 } %]
+ </tr>
+ </table>
+ </td>
+ <td>
+ <table>
+ <tr>
+ <th align="left">
+ <label for="bug_severity">Severity</label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ [% PROCESS select sel = { name => 'bug_severity',
+ size => 7 }%]
+ </tr>
+ </table>
+ </td>
+ <td>
+ <table>
+ <tr>
+ <th align="left">
+ <label for="priority" accesskey="i">Pr<u>i</u>ority</label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ [% PROCESS select sel = { name => 'priority',
+ size => 7 } %]
+ </tr>
+ </table>
+ </td>
+ <td>
+ <table>
+ <tr>
+ <th align="left">
+ <label for="rep_platform" accesskey="h"><u>H</u>ardware</label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ [% PROCESS select sel = { name => 'rep_platform',
+ size => 7 } %]
+ </tr>
+ </table>
+ </td>
+ <td>
+ <table>
+ <tr>
+ <th align="left">
+ <label for="op_sys" accesskey="o"><u>O</u>S</label>:
+ </th>
+ </tr>
+ <tr valign="top">
+ [% PROCESS select sel = { name => 'op_sys',
+ size => 7 } %]
+ </tr>
+ </table>
+ </td>
+ [% Hook.process('after_selects_bottom') %]
+ </tr>
+</table>
+
+[%# *** Email Numbering Votes *** %]
+
+<table>
+ <tr>
+ <td>
+ <fieldset>
+ <legend>
+ <strong>
+ [% IF Param('usevotes') %]
+ Email Addresses, [% terms.Bug %] Numbers, and Votes
+ [% ELSE %]
+ Email Addresses and [% terms.Bug %] Numbers
+ [% END %]
+ </strong>
+ </legend>
+
+
+<table>
+ <tr>
+ [% FOREACH n = [1, 2] %]
+ <td>
+
+
+<table cellspacing="0" cellpadding="0">
+ <tr>
+ <td>
+ Any of:
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input type="checkbox" name="emailassigned_to[% n %]"
+ id="emailassigned_to[% n %]" value="1"
+ [% " checked" IF default.emailassigned_to.$n %]>
+ <label for="emailassigned_to[% n %]">
+ the [% terms.bug %] assignee
+ </label>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input type="checkbox" name="emailreporter[% n %]"
+ id="emailreporter[% n %]" value="1"
+ [% " checked" IF default.emailreporter.$n %]>
+ <label for="emailreporter[% n %]">
+ the reporter
+ </label>
+ </td>
+ </tr>
+ [% IF Param('useqacontact') %]
+ <tr>
+ <td>
+ <input type="checkbox" name="emailqa_contact[% n %]"
+ id="emailqa_contact[% n %]" value="1"
+ [% " checked" IF default.emailqa_contact.$n %]>
+ <label for="emailqa_contact[% n %]">
+ the QA contact
+ </label>
+ </td>
+ </tr>
+ [% END %]
+ <tr>
+ <td>
+ <input type="checkbox" name="emailcc[% n %]"
+ id="emailcc[% n %]" value="1"
+ [% " checked" IF default.emailcc.$n %]>
+ <label for="emailcc[% n %]">
+ a CC list member
+ </label>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input type="checkbox" name="emaillongdesc[% n %]"
+ id="emaillongdesc[% n %]" value="1"
+ [% " checked" IF default.emaillongdesc.$n %]>
+ <label for="emaillongdesc[% n %]">
+ a commenter
+ </label>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <select name="emailtype[% n %]">
+ [% FOREACH qv = [
+ { name => "substring", description => "contains" },
+ { name => "exact", description => "is" },
+ { name => "notequals", description => "is not" },
+ { name => "regexp", description => "matches regexp" },
+ { name => "notregexp", description => "doesn't match regexp" } ] %]
+
+ <option value="[% qv.name %]"
+ [% " selected" IF default.emailtype.$n == qv.name %]>[% qv.description %]</option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <input name="email[% n %]" size="25" value="[% default.email.$n FILTER html %]">
+ </td>
+ </tr>
+</table>
+
+
+ </td>
+ [% END %]
+ </tr>
+</table>
+<hr>
+<table>
+ <tr>
+ <td>
+ <select name="bug_id_type">
+ <option value="anyexact"[% " selected" IF default.bug_id_type.0 == "anyexact" %]>Only include</option>
+ <option value="nowords"[% " selected" IF default.bug_id_type.0 == "nowords" %]>Exclude</option>
+ </select>
+ <label for="bug_id">[% terms.bugs %] numbered</label>:
+ </td>
+ <td>
+ <input type="text" name="bug_id" id="bug_id"
+ value="[% default.bug_id.0 FILTER html %]" size="20">
+ </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>(comma-separated list)</td>
+ </tr>
+ [% IF Param('usevotes') %]
+ <tr>
+ <td align="right">
+ <label for="votes">Only [% terms.bugs %] with at least</label>:
+ </td>
+ <td>
+ <input name="votes" id="votes" size="3"
+ value="[% default.votes.0 FILTER html %]">
+ votes
+ </td>
+ </tr>
+ [% END %]
+</table>
+
+
+ </fieldset>
+ </td>
+
+[%# *** Bug Changes *** %]
+
+ <td valign="top">
+ <fieldset>
+ <legend><strong>[% terms.Bug %] Changes</strong></legend>
+
+
+<dl class="bug_changes">
+ <dt>
+ <label for="chfieldfrom">Only [% terms.bugs %] changed between</label>:
+ </dt>
+ <dd>
+ <input name="chfieldfrom" id="chfieldfrom"
+ size="10" value="[% default.chfieldfrom.0 FILTER html %]">
+ and <input name="chfieldto" size="10" value="[% default.chfieldto.0 FILTER html %]">
+ <br>(YYYY-MM-DD or relative dates)
+ </dd>
+ <dt>
+ <label for="chfield">where one or more of the following changed</label>:
+ </dt>
+ <dd>
+ [%# Create array, so we can sort it by description #%]
+ [% chfields = [] %]
+ [% FOREACH field = chfield %]
+ [% chfields.push({value => field, desc => (field_descs.$field || field) }) %]
+ [% END %]
+
+ <select name="chfield" id="chfield" multiple="multiple" size="4">
+ [% FOREACH field = chfields.sort('desc') %]
+ <option value="[% field.value FILTER html %]"
+ [% " selected" IF lsearch(default.chfield, field.value) != -1 %]>
+ [% field.desc FILTER html %]</option>
+ [% END %]
+ </select>
+ </dd>
+ <dt>and <label for="chfieldvalue">the new value was</label>:</dt>
+ <dd>
+ <input name="chfieldvalue" id="chfieldvalue"
+ size="20" value="[% default.chfieldvalue.0 FILTER html %]">
+ </dd>
+</dl>
+
+ </fieldset>
+ </td>
+ </tr>
+</table>
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+ <td align="left">
+ <select name="[% sel.name %]" id="[% sel.name %]"
+ multiple="multiple" size="[% sel.size %]">
+ [% FOREACH value = ${sel.name} %]
+ [% IF value.id %]
+ [%# This only applies for Resolution really %]
+ [% v = value.name OR '---' -%]
+ <option value="[% v FILTER html %]"
+ [% " selected" IF lsearch(default.${sel.name}, v) != -1 %]>
+ [% display_value(sel.name, value.name) FILTER html %]
+ </option>
+ [% ELSE %]
+ <option value="[% value OR '---' FILTER html %]"
+ [% " selected" IF lsearch(default.${sel.name}, value) != -1 %]>
+ [% display_value(sel.name, value) FILTER html %]
+ </option>
+ [% END %]
+ [% END %]
+ </select>
+ </td>
+[% END %]
diff --git a/template/en/default/search/knob.html.tmpl b/template/en/default/search/knob.html.tmpl
new file mode 100644
index 0000000..17ff63a
--- /dev/null
+++ b/template/en/default/search/knob.html.tmpl
@@ -0,0 +1,85 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Tobias Burnus <burnus@net-b.de>
+ # Jouni Heikniemi <jouni@heikniemi.net>
+ #%]
+
+[%# INTERFACE:
+ # (incomplete!)
+ # ...
+ # known_name: string. Possibly known stored name for the query being
+ # edited. This value is just passed through in a
+ # hidden field.
+ #%]
+
+
+[% PROCESS global/variables.none.tmpl %]
+
+[%# This is not necessary for English templates, but useful for localizers. %]
+[% ordersdesc = {
+ "Reuse same sort as last time" => "Reuse same sort as last time",
+ "Bug Number" => "$terms.Bug Number",
+ "Importance" => "Importance",
+ "Assignee" => "Assignee",
+ "Last Changed" => "Last Changed" } %]
+
+<input type="hidden" name="cmdtype" value="doit">
+
+<p>
+ <label for="order">Sort results by</label>:
+ <select name="order" id="order">
+ [% FOREACH order = orders %]
+ <option value="[% order FILTER html %]"
+ [% " selected" IF default.order.0 == order %]>
+ [% ordersdesc.$order FILTER html %]</option>
+ [% END %]
+ </select>
+</p>
+
+<p>
+ <input type="submit" id="[% button_name FILTER html %]"
+ value="[% button_name FILTER html %]">
+ [% IF known_name %]
+ [%# We store known_name in case the user add a boolean chart. %]
+ <input type="hidden" name="known_name" value="[% known_name FILTER html %]">
+
+ [%# The name of the existing query will be passed to buglist.cgi. %]
+ <input type="hidden" name="query_based_on" value="[% known_name FILTER html %]">
+ [% END %]
+ [%# Preserve any custom column list that might be set. %]
+ [% IF columnlist %]
+ <input type="hidden" name="columnlist" value="[% columnlist FILTER html %]">
+ [% END %]
+</p>
+
+<p>
+ &nbsp;&nbsp;&nbsp;
+ <input type="checkbox" id="remasdefault"
+ name="remtype" value="asdefault">
+ <label for="remasdefault">
+ and remember these as my default search options
+ </label>
+</p>
+
+[% IF userdefaultquery %]
+ <p>
+ <a href="query.cgi?nukedefaultquery=1">
+ Set my default search back to the system default</a>.
+ </p>
+[% END %]
diff --git a/template/en/default/search/search-advanced.html.tmpl b/template/en/default/search/search-advanced.html.tmpl
new file mode 100644
index 0000000..cb0519a
--- /dev/null
+++ b/template/en/default/search/search-advanced.html.tmpl
@@ -0,0 +1,82 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # This template has no interface. However, to use it, you need to fulfill
+ # the interfaces of search/form.html.tmpl, search/knob.html.tmpl and
+ # search/boolean-charts.html.tmpl.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+
+[% js_data = BLOCK %]
+var queryform = "queryform"
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Search for $terms.bugs"
+ onload = "doOnSelectProduct(0); enableHelp();"
+ javascript = js_data
+ javascript_urls = [ "js/productform.js" "js/util.js" "js/help.js" ]
+ style_urls = [ "skins/standard/help.css" ]
+ doc_section = "query.html"
+ style = "dl.bug_changes dt {
+ margin-top: 15px;
+ }"
+%]
+
+[% WRAPPER search/tabs.html.tmpl %]
+
+[% button_name = "Search" %]
+
+[%# The decent help requires Javascript %]
+<script type="text/javascript"> <!--
+[% IF NOT cgi.param("help") %]
+ document.write("<p><a href='query.cgi?help=1&amp;format=advanced'>Give me some help<\/a> (reloads page).<\/p>");
+[% ELSE %]
+ [% PROCESS "search/search-help.html.tmpl" %]
+ if (generateHelp())
+ document.write("<p>For help, mouse over the page elements.<\/p>");
+ else
+ document.write("<p>Help initialization failed, no help available.<\/p>");
+[% END %]
+// -->
+</script>
+
+<form method="post" action="buglist.cgi" name="queryform">
+
+[% PROCESS search/form.html.tmpl %]
+
+[% PROCESS search/knob.html.tmpl %]
+
+<hr>
+
+[% PROCESS "search/boolean-charts.html.tmpl" %]
+
+</form>
+
+
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/search/search-create-series.html.tmpl b/template/en/default/search/search-create-series.html.tmpl
new file mode 100644
index 0000000..da1011e
--- /dev/null
+++ b/template/en/default/search/search-create-series.html.tmpl
@@ -0,0 +1,68 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # This template has no interface. However, to use it, you need to fulfill
+ # the interfaces of search/form.html.tmpl, reports/series.html.tmpl and
+ # search/boolean-charts.html.tmpl.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% js_data = BLOCK %]
+ var queryform = "chartform";
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Create New Data Set"
+ onload = "doOnSelectProduct(0);"
+ javascript = js_data
+ javascript_urls = [ "js/productform.js" ]
+ doc_section = "reporting.html#charts-new-series"
+%]
+
+<form method="get" action="chart.cgi" name="chartform">
+
+[% PROCESS search/form.html.tmpl %]
+
+<p>
+ <input type="submit" name="action-search" value="Run Search">
+ to see which [% terms.bugs %] would be included in this data set.
+</p>
+
+<h3>Data Set Parameters</h3>
+
+[% PROCESS reports/series.html.tmpl
+ button_name = "Create Data Set" %]
+ <input type="hidden" name="action" value="create">
+
+<script type="text/javascript">
+ document.chartform.category[0].selected = true;
+ catSelected();
+ checkNewState();
+</script>
+
+<hr>
+
+[% PROCESS "search/boolean-charts.html.tmpl" %]
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/search/search-help.html.tmpl b/template/en/default/search/search-help.html.tmpl
new file mode 100644
index 0000000..12e82ba
--- /dev/null
+++ b/template/en/default/search/search-help.html.tmpl
@@ -0,0 +1,107 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% help_html = [
+{ id => "short_desc_type",
+ html => "The type of summary search you would like" },
+{ id => "short_desc",
+ html => "The $terms.bug summary is a short sentence which succinctly
+ describes <br> what the $terms.bug is about." },
+{ id => "classification",
+ html => "$terms.Bugs are categorised into Classifications, Products and Components. classifications is the<br>
+ top-level categorisation." },
+{ id => "product",
+ html => Param('useclassification') ?
+ "$terms.Bugs are categorised into Products and Components. Select a Classification to narrow down this list" :
+ "$terms.Bugs are categorised into Products and Components. Product is
+ the<br>top-level categorisation." },
+{ id => "component",
+ html => "Components are second-level categories; each belongs to a<br>
+ particular Product. Select a Product to narrow down this list." },
+{ id => "version",
+ html => "The version field defines the version of the software the
+ $terms.bug<br>was found in." },
+{ id => "target_milestone",
+ html => "The target_milestone field is used to define when the engineer<br>
+ the $terms.bug is assigned to expects to fix it." },
+{ id => "longdesc",
+ html => "$terms.Bugs have comments added to them by $terms.Bugzilla users.
+ You can<br>search for some text in those comments." },
+{ id => "longdesc_type",
+ html => "The type of comment search you would like" },
+{ id => "bug_file_loc",
+ html => "$terms.Bugs can have a URL associated with them - for example, a
+ pointer<br>to a web site where the problem is seen." },
+{ id => "bug_file_loc_type",
+ html => "The type of URL search you would like" },
+{ id => "status_whiteboard",
+ html => "Each $terms.bug has a free-form single line text entry box for
+ adding<br>tags and status information." },
+{ id => "status_whiteboard_type",
+ html => "The type of whiteboard search you would like" },
+{ id => "keywords",
+ html => "You can add keywords from a defined list to $terms.bugs, in order
+ to<br>tag and group them." },
+{ id => "keywords_type",
+ html => "The type of keyword search you would like" },
+{ id => "bug_status",
+ html => "$terms.Abug may be in any of a number of states." },
+{ id => "resolution",
+ html => "If $terms.abug is in a resolved state, then one of these reasons
+ will<br>be given for its resolution." },
+{ id => "bug_severity",
+ html => "How severe the $terms.bug is, or whether it's an enhancement." },
+{ id => "priority",
+ html => "Engineers prioritize their $terms.bugs using this field." },
+{ id => "rep_platform",
+ html => "The hardware platform the $terms.bug was observed on." },
+{ id => "op_sys",
+ html => "The operating system the $terms.bug was observed on." },
+{ id => "email1",
+ html => "Every $terms.bug has people associated with it in different
+ roles.<br>Here, you can search on what people are in what role." },
+{ id => "email2",
+ html => "Every $terms.bug has people associated with it in different
+ roles.<br>Here, you can search on what people are in what role." },
+{ id => "bug_id",
+ html => "You can limit your search to a specific set of $terms.bugs ." },
+{ id => "votes",
+ html => "Some $terms.bugs can be voted for, and you can limit your search to
+ $terms.bugs<br>with more than a certain number of votes." },
+{ id => "chfield",
+ html => "You can search for specific types of change - this field define <br>
+ which field you are interested in changes for." },
+{ id => "chfieldfrom",
+ html => "Specify the start and end dates either in YYYY-MM-DD format<br>
+ (optionally followed by HH:mm, in 24 hour clock), or in relative<br>
+ dates such as 1h, 2d, 3w, 4m, 5y, which respectively mean one hour,<br>
+ two days, three weeks, four months, or five years ago. 0d is last<br>
+ midnight, and 0h, 0w, 0m, 0y is the beginning of this hour, week,<br>
+ month, or year." },
+{ id => "chfieldto",
+ html => "Specify the start and end dates either in YYYY-MM-DD format<br>
+ (optionally followed by HH:mm, in 24 hour clock), or in relative<br>
+ dates such as 1h, 2d, 3w, 4m, 5y, which respectively mean one hour,<br>
+ two days, three weeks, four months, or five years ago. 0d is last<br>
+ midnight, and 0h, 0w, 0m, 0y is the beginning of this hour, week,<br>
+ month, or year." },
+{ id => "chfieldvalue",
+ html => "The value the field defined above changed to during that time." },
+] %]
diff --git a/template/en/default/search/search-plugin.xml.tmpl b/template/en/default/search/search-plugin.xml.tmpl
new file mode 100644
index 0000000..8564dca
--- /dev/null
+++ b/template/en/default/search/search-plugin.xml.tmpl
@@ -0,0 +1,28 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #
+ #%]
+[% PROCESS global/variables.none.tmpl %]
+<?xml version="1.0" encoding="UTF-8"?>
+<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
+<ShortName>[% terms.Bugzilla %]</ShortName>
+<Description>[% terms.Bugzilla %] Quick Search</Description>
+<InputEncoding>UTF-8</InputEncoding>
+[% IF favicon %]
+ <Image width="16" height="16">data:image/x-icon;base64,[% favicon FILTER base64 %]</Image>
+[% ELSE %]
+ <Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALBSURBVHjaYnxckcEAA3%2F%2B%2FT%2F17LUcH%2Fevf%2F8U%2BHmYGBkZMABAALEgc%2B68%2F3T227cf2tJKKhJLt59n%2FfmbnYnZV1KEhYkJrgYggBghNrz78fPIi3d8uvKBIdb%2FOaWPnzitLc97%2Bc5rFXnhnVO3%2BslLwjUABBDIhnsfPl%2Fj53VO91FX4Gfgkjxw%2Fd%2F6Q49%2FWStqyAj%2B%2B88gZqn%2B9u5rYU52iAaAAGL69%2F%2F%2F2d9%2FYiMclGT4fv76%2BZ9DbO%2FeA39%2BfJHVcvj5l%2Bnh03e%2FWThOvnwLtwEgAAAxAM7%2FBPj8%2FRYkHQYHAf3%2F%2Fv%2F%2B%2Fv8BAVNTUPX18yorLNHE2S8mB%2FT2%2Bq7a4dvu8iUSDgAAAAKICRgUv3%2F8ZGKGeIvpz6eXBvq61lZWLMwMv%2F5zMP7%2FqSAjVFyZ%2FNvZftuT10DnAAQAMQDO%2FwQIBAPz5Or6%2Ff0CBQEAAgT99ubq38z2%2BwT18%2FAM%2F%2BkNDAv6%2FQMCAA1GVVrhMze5h4kCCORpkd9%2F3n74KiHO%2B%2BffX8b%2Ff7m%2BXWP985%2Bf5R%2BPLNdfoK%2F%2F%2Ffv39%2BePj2%2FkZYR0fe0BAgikQZGX%2B9b9FzLS%2FH%2F%2B%2FGVgYGRlZWNlA7nv7z9QuDP8%2B8nw%2FRXjn68Mv4Gu%2FAwQQCCni3FxPLn7nIGZGegfNhYmNjYWZnBMASOakZER6Eumf9%2FYGT4y%2FHx%2F%2BfBFgAAC2cDGzPT99WeGvwzvv%2Fx89vrr%2F39%2FJER4pcT5Gf4z%2FP37D2jtj9%2B%2FL918fmzrKSsWNoAAgiaN%2Fz9%2Fff%2F6S4CP8%2BWbz9vWHfv54aukpAAz0Og%2Ff%2F7%2F%2Bs36668cO3ugED9QJUAAQTUArf7%2F8x87D9vRjcejhPiZhAUYcACAAGI5%2FOHH9ddvXzAxmjz%2B8P8lw4fXn5l4eRlwA4AAYmaTkBFg%2FKvJwfbkwZuXN57y%2Fv%2F34stXGR4uRmxpGwgAAgwA4%2FkfrfCWvLQAAAAASUVORK5CYII%3D</Image>
+[% END %]
+<Url type="text/html" method="GET" template="[% urlbase FILTER xml %]buglist.cgi?quicksearch={searchTerms}"/>
+</OpenSearchDescription>
diff --git a/template/en/default/search/search-report-graph.html.tmpl b/template/en/default/search/search-report-graph.html.tmpl
new file mode 100644
index 0000000..61dd3b5
--- /dev/null
+++ b/template/en/default/search/search-report-graph.html.tmpl
@@ -0,0 +1,141 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # This template has no interface. However, to use it, you need to fulfill
+ # the interfaces of the templates it contains.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% js_data = BLOCK %]
+var queryform = "reportform"
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Generate Graphical Report"
+ onload = "doOnSelectProduct(0); chartTypeChanged()"
+ javascript = js_data
+ javascript_urls = [ "js/productform.js" ]
+ doc_section = "reporting.html#reports"
+%]
+
+[% PROCESS "search/search-report-select.html.tmpl" %]
+
+<p>
+ Choose one or more fields as your axes, and then refine your set of
+ [% terms.bugs %] using the rest of the form.
+</p>
+
+<script type="text/javascript"><!--
+ [%# The Y-axis fields are not used for pie charts %]
+ function chartTypeChanged() {
+ // format[2] is the pie chart radio button
+ if (document.reportform.format[2].checked == true) {
+ document.reportform.y_axis_field.disabled = true;
+ document.reportform.cumulate[0].disabled = true;
+ document.reportform.cumulate[1].disabled = true;
+ } else {
+ document.reportform.y_axis_field.disabled = false;
+ document.reportform.cumulate[0].disabled = false;
+ document.reportform.cumulate[1].disabled = false;
+ }
+ }
+// -->
+</script>
+
+[% button_name = "Generate Report" %]
+
+<form method="get" action="report.cgi" name="reportform">
+
+<table align="center">
+ <tr>
+ <td valign="middle">
+ <b>Vertical Axis:</b><br>
+ <noscript><small>(not for pie charts)</small><br></noscript>
+ [% PROCESS select name = 'y_axis_field' %]<br>
+ <br>
+ <b>Plot Data Sets:</b><br>
+ <input type="radio" name="cumulate" value="0"
+ [% " checked" IF default.cumulate.0 != "1" %]>
+ Individually<br>
+ <input type="radio" name="cumulate" value="1"
+ [% " checked" IF default.cumulate.0 == "1" %]>
+ Stacked
+ </td>
+ <td width="150" height="150">
+ <table border="1" width="100%" height="100%">
+ <tr>
+ <td align="center" valign="middle">
+ <b>Multiple Images:</b><br>
+ [% PROCESS select name = 'z_axis_field' %]
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td rowspan="2">
+ <b>Format:</b><br>
+ [% chart_formats = [
+ { name => "line", description => "Line Graph" },
+ { name => "bar", description => "Bar Chart" },
+ { name => "pie", description => "Pie Chart" } ] %]
+ [% default.chart_format.0 = default.chart_format.0 || "bar" %]
+
+ [% FOREACH chart_format = chart_formats %]
+ <input type="radio" name="format"
+ value="[% chart_format.name FILTER html %]"
+ onchange="chartTypeChanged()"
+ [% " checked" IF default.chart_format.0 == chart_format.name %]>
+ [% chart_format.description FILTER html %]<br>
+ [% END %]
+ </td>
+ </tr>
+
+ <tr>
+ <td>
+ </td>
+ <td align="left">
+ <b>Horizontal Axis:</b>
+ [% PROCESS select name = 'x_axis_field' %]<br>
+ <label for="x_labels_vertical"><b>Vertical labels:</b></label>
+ <input type="checkbox" name="x_labels_vertical" id="x_labels_vertical"
+ value="1"
+ [% " checked" IF default.x_labels_vertical.0 == "1" %]>
+ </td>
+ <td>
+ </td>
+ </tr>
+</table>
+
+<hr>
+
+[% PROCESS search/form.html.tmpl %]
+
+<br>
+<input type="submit" id="[% button_name FILTER css_class_quote %]"
+ value="[% button_name FILTER html %]">
+<input type="hidden" name="action" value="wrap">
+<hr>
+
+[% PROCESS "search/boolean-charts.html.tmpl" %]
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/search/search-report-select.html.tmpl b/template/en/default/search/search-report-select.html.tmpl
new file mode 100644
index 0000000..de64787
--- /dev/null
+++ b/template/en/default/search/search-report-select.html.tmpl
@@ -0,0 +1,54 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # name: string. The name of the select block to output.
+ # default.$name.0: string. The default value for the block, if any.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% BLOCK select %]
+ [% rep_fields = ["classification", "product", "component", "version", "rep_platform",
+ "op_sys", "bug_status", "resolution", "bug_severity",
+ "priority", "target_milestone", "assigned_to",
+ "reporter", "qa_contact", "votes" ] %]
+
+ <select name="[% name FILTER html %]">
+ <option value="">&lt;none&gt;</option>
+
+ [% FOREACH field = rep_fields %]
+ [% NEXT IF field == "classification" AND !Param('useclassification') %]
+ [% NEXT IF field == "target_milestone" AND !Param('usetargetmilestone') %]
+ [% NEXT IF field == "qa_contact" AND !Param('useqacontact') %]
+ [% NEXT IF field == "votes" AND !Param('usevotes') %]
+ <option value="[% field FILTER html %]"
+ [% " selected" IF default.$name.0 == field %]>
+ [% field_descs.$field || field FILTER html %]</option>
+ [% END %]
+
+ [%# Single-select fields are also valid column names. %]
+ [% FOREACH field = custom_fields %]
+ <option value="[% field.name FILTER html %]"
+ [% " selected" IF default.$name.0 == field.name %]>
+ [% field.description FILTER html %]</option>
+ [% END %]
+ </select>
+[% END %]
diff --git a/template/en/default/search/search-report-table.html.tmpl b/template/en/default/search/search-report-table.html.tmpl
new file mode 100644
index 0000000..55d62a1
--- /dev/null
+++ b/template/en/default/search/search-report-table.html.tmpl
@@ -0,0 +1,94 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # This template has no interface. However, to use it, you need to fulfill
+ # the interfaces of the templates it contains.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% js_data = BLOCK %]
+var queryform = "reportform"
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Generate Tabular Report"
+ onload = "doOnSelectProduct(0)"
+ javascript = js_data
+ javascript_urls = [ "js/productform.js" ]
+ doc_section = "reporting.html#reports"
+%]
+
+[% PROCESS "search/search-report-select.html.tmpl" %]
+
+<p>
+ Choose one or more fields as your axes, and then refine your set of
+ [% terms.bugs %] using the rest of the form.
+</p>
+
+[% button_name = "Generate Report" %]
+
+<form method="get" action="report.cgi" name="reportform">
+
+<table align="center">
+ <tr>
+ <td>
+ </td>
+ <td align="center">
+ <b>Horizontal Axis:</b>
+ [% PROCESS select name = 'x_axis_field' %]
+ </td>
+ </tr>
+
+ <tr>
+ <td valign="middle" align="center">
+ <b>Vertical Axis:</b><br>
+ [% PROCESS select name = 'y_axis_field' %]
+ </td>
+ <td width="150" height="150">
+ <table border="1" width="100%">
+ <tr>
+ <td align="center" valign="middle" height="150">
+ <b>Multiple Tables:</b><br>
+ [% PROCESS select name = 'z_axis_field' %]
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+
+<hr>
+
+[% PROCESS search/form.html.tmpl %]
+
+<br>
+<input type="submit" id="[% button_name FILTER css_class_quote %]"
+ value="[% button_name FILTER html %]">
+<input type="hidden" name="format" value="table">
+<input type="hidden" name="action" value="wrap">
+<hr>
+
+[% PROCESS "search/boolean-charts.html.tmpl" %]
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/search/search-specific.html.tmpl b/template/en/default/search/search-specific.html.tmpl
new file mode 100644
index 0000000..78e5506
--- /dev/null
+++ b/template/en/default/search/search-specific.html.tmpl
@@ -0,0 +1,129 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Simple Search"
+%]
+
+[% WRAPPER search/tabs.html.tmpl %]
+
+<p>
+Find a specific [% terms.bug %] by entering words that describe it.
+[% terms.Bugzilla %] will search [% terms.bug %] descriptions and comments
+for those words and return a list of matching [% terms.bugs %] sorted
+by relevance.
+</p>
+
+<p>
+For example, if the [% terms.bug %] you are looking for is a browser crash when you go to a secure web site with an embedded Flash animation, you might search
+for "crash secure SSL flash".
+</p>
+
+<form name="queryform" method="get" action="buglist.cgi">
+<input type="hidden" name="query_format" value="specific">
+<input type="hidden" name="order" value="relevance desc">
+
+<table>
+ <tr>
+ <td align="right" valign="baseline">
+ <b><label for="bug_status">Status:</label></b>
+ </td>
+ <td>
+ <select name="bug_status" id="bug_status">
+ [% statuses = [ { name = 'open', label = "Open" },
+ { name = 'closed', label = "Closed" },
+ { name = 'all', label = "All" } ] %]
+ [% FOREACH status = statuses %]
+ <option value="__[% status.name %]__"
+ [% " selected" IF default.bug_status.0 == "__${status.name}__" %]>
+ [% status.label FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td align="right" valign="baseline">
+ <b><label for="product">Product:</label></b>
+ </td>
+ <td>
+ <select name="product" id="product">
+ <option value="">All</option>
+ [% IF Param('useclassification') %]
+ [% FOREACH c = classification %]
+ <optgroup label="[% c.name FILTER html %]">
+ [% FOREACH p = user.get_selectable_products(c.id) %]
+ [% IF p.components.size %]
+ <option value="[% p.name FILTER html %]"
+ [% " selected" IF lsearch(default.product, p.name) != -1 %]>
+ [% p.name FILTER html %]
+ </option>
+ [% END %]
+ [% END %]
+ </optgroup>
+ [% END %]
+ [% ELSE %]
+ [% FOREACH p = product %]
+ <option value="[% p.name FILTER html %]"
+ [% " selected" IF lsearch(default.product, p.name) != -1 %]>
+ [% p.name FILTER html %]
+ </option>
+ [% END %]
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td align="right" valign="baseline">
+ <b><label for="content">Words:</label></b>
+ </td>
+ <td>
+ <input name="content" size="40" id="content"
+ value="[% default.content.0 FILTER html %]">
+ <script type="text/javascript"> <!--
+ document.forms['queryform'].content.focus();
+ // -->
+ </script>
+ </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>
+
+ [% IF Param('specific_search_allow_empty_words') %]
+ <input type="submit" id="search" value="Search">
+ [% ELSE %]
+ <input type="submit" id="search" value="Search"
+ onclick="if (this.form.content.value == '')
+ {alert('The Words field cannot be empty. You have to ' +
+ 'enter at least one word in your search criteria.');
+ return false;} return true;">
+ [% END %]
+ </td>
+ </tr>
+</table>
+</form>
+
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
+
diff --git a/template/en/default/search/tabs.html.tmpl b/template/en/default/search/tabs.html.tmpl
new file mode 100644
index 0000000..119b30f
--- /dev/null
+++ b/template/en/default/search/tabs.html.tmpl
@@ -0,0 +1,36 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # This template has no interface.
+ #%]
+
+[% WRAPPER global/tabs.html.tmpl
+ tabs = [ { name => 'specific', label => "Simple Search",
+ link => "query.cgi?format=specific" },
+ { name => 'advanced', label => "Advanced Search",
+ link => "query.cgi?format=advanced" } ]
+ current_tab_name = query_format || format || "advanced"
+%]
+
+[% content %]
+
+[% END %]
diff --git a/template/en/default/search/type-select.html.tmpl b/template/en/default/search/type-select.html.tmpl
new file mode 100644
index 0000000..043c419
--- /dev/null
+++ b/template/en/default/search/type-select.html.tmpl
@@ -0,0 +1,29 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is the San Jose State
+ # University Foundation. Portions created by the Initial Developer are
+ # Copyright (C) 2008 the Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+<select name="[% name FILTER html %]">
+ [% FOREACH type = types %]
+ <option value="[% type FILTER html %]"
+ [%- ' selected="selected"' IF type == selected %]>
+ [%- search_descs.$type FILTER html %]</option>
+ [% END %]
+</select>
diff --git a/template/en/default/setup/strings.txt.pl b/template/en/default/setup/strings.txt.pl
new file mode 100644
index 0000000..eec0bd9
--- /dev/null
+++ b/template/en/default/setup/strings.txt.pl
@@ -0,0 +1,160 @@
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Initial Developer of the Original Code is Everything Solved.
+# Portions created by Everything Solved are Copyright (C) 2007
+# Everything Solved. All Rights Reserved.
+#
+# The Original Code is the Bugzilla Bug Tracking System.
+#
+# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+
+# This file contains a single hash named %strings, which is used by the
+# installation code to display strings before Template-Toolkit can safely
+# be loaded.
+#
+# Each string supports a very simple substitution system, where you can
+# have variables named like ##this## and they'll be replaced by the string
+# variable with that name.
+#
+# Please keep the strings in alphabetical order by their name.
+
+%strings = (
+ any => 'any',
+ blacklisted => '(blacklisted)',
+ checking_for => 'Checking for',
+ checking_dbd => 'Checking available perl DBD modules...',
+ checking_optional => 'The following Perl modules are optional:',
+ checking_modules => 'Checking perl modules...',
+ chmod_failed => '##path##: Failed to change permissions: ##error##',
+ chown_failed => '##path##: Failed to change ownership: ##error##',
+ commands_dbd => <<EOT,
+YOU MUST RUN ONE OF THE FOLLOWING COMMANDS (depending on which database
+you use):
+EOT
+ commands_optional => 'COMMANDS TO INSTALL OPTIONAL MODULES:',
+ commands_required => <<EOT,
+COMMANDS TO INSTALL REQUIRED MODULES (You *must* run all these commands
+and then re-run this script):
+EOT
+ done => 'done.',
+ extension_must_return_name => <<END,
+##file## returned ##returned##, which is not a valid name for an extension.
+Extensions must return their name, not <code>1</code> or a number. See
+the documentation of Bugzilla::Extension for details.
+END
+ feature_auth_ldap => 'LDAP Authentication',
+ feature_auth_radius => 'RADIUS Authentication',
+ feature_graphical_reports => 'Graphical Reports',
+ feature_html_desc => 'More HTML in Product/Group Descriptions',
+ feature_inbound_email => 'Inbound Email',
+ feature_jobqueue => 'Mail Queueing',
+ feature_jsonrpc => 'JSON-RPC Interface',
+ feature_new_charts => 'New Charts',
+ feature_old_charts => 'Old Charts',
+ feature_mod_perl => 'mod_perl',
+ feature_moving => 'Move Bugs Between Installations',
+ feature_patch_viewer => 'Patch Viewer',
+ feature_smtp_auth => 'SMTP Authentication',
+ feature_updates => 'Automatic Update Notifications',
+ feature_xmlrpc => 'XML-RPC Interface',
+
+ header => "* This is Bugzilla ##bz_ver## on perl ##perl_ver##\n"
+ . "* Running on ##os_name## ##os_ver##",
+ install_all => <<EOT,
+
+To attempt an automatic install of every required and optional module
+with one command, do:
+
+ ##perl## install-module.pl --all
+
+EOT
+ install_data_too_long => <<EOT,
+WARNING: Some of the data in the ##table##.##column## column is longer than
+its new length limit of ##max_length## characters. The data that needs to be
+fixed is printed below with the value of the ##id_column## column first and
+then the value of the ##column## column that needs to be fixed:
+
+EOT
+ install_module => 'Installing ##module## version ##version##...',
+ installation_failed => '*** Installation aborted. Read the messages above. ***',
+ max_allowed_packet => <<EOT,
+WARNING: You need to set the max_allowed_packet parameter in your MySQL
+configuration to at least ##needed##. Currently it is set to ##current##.
+You can set this parameter in the [mysqld] section of your MySQL
+configuration file.
+EOT
+ min_version_required => "Minimum version required: ",
+
+# Note: When translating these "modules" messages, don't change the formatting
+# if possible, because there is hardcoded formatting in
+# Bugzilla::Install::Requirements to match the box formatting.
+ modules_message_db => <<EOT,
+***********************************************************************
+* DATABASE ACCESS *
+***********************************************************************
+* In order to access your database, Bugzilla requires that the *
+* correct "DBD" module be installed for the database that you are *
+* running. See below for the correct command to run to install the *
+* appropriate module for your database. *
+EOT
+ modules_message_optional => <<EOT,
+***********************************************************************
+* OPTIONAL MODULES *
+***********************************************************************
+* Certain Perl modules are not required by Bugzilla, but by *
+* installing the latest version you gain access to additional *
+* features. *
+* *
+* The optional modules you do not have installed are listed below, *
+* with the name of the feature they enable. Below that table are the *
+* commands to install each module. *
+EOT
+ modules_message_required => <<EOT,
+***********************************************************************
+* REQUIRED MODULES *
+***********************************************************************
+* Bugzilla requires you to install some Perl modules which are either *
+* missing from your system, or the version on your system is too old. *
+* See below for commands to install these modules. *
+EOT
+
+ module_found => "found v##ver##",
+ module_not_found => "not found",
+ module_ok => 'ok',
+ module_unknown_version => "found unknown version",
+ ppm_repo_add => <<EOT,
+***********************************************************************
+* Note For Windows Users *
+***********************************************************************
+* In order to install the modules listed below, you first have to run *
+* the following command as an Administrator: *
+* *
+* ppm repo add theory58S ##theory_url##
+EOT
+ ppm_repo_up => <<EOT,
+* *
+* Then you have to do (also as an Administrator): *
+* *
+* ppm repo up theory58S *
+* *
+* Do that last command over and over until you see "theory58S" at the *
+* top of the displayed list. *
+EOT
+ template_precompile => "Precompiling templates...",
+ template_removal_failed => <<END,
+WARNING: The directory '##datadir##/template' could not be removed.
+ It has been moved into '##datadir##/deleteme', which should be
+ deleted manually to conserve disk space.
+END
+ template_removing_dir => "Removing existing compiled templates...",
+);
+
+1;
diff --git a/template/en/default/sidebar.xul.tmpl b/template/en/default/sidebar.xul.tmpl
new file mode 100644
index 0000000..3df943e
--- /dev/null
+++ b/template/en/default/sidebar.xul.tmpl
@@ -0,0 +1,131 @@
+[%# -*- mode: sgml -*- %]
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Jacob Steenhagen <jake@bugzilla.org>
+ # Scott Collins <scc@mozilla.org>
+ # Christopher A. Aillon <christopher@aillon.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+<?xml version="1.0"?>
+<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?>
+<?xml-stylesheet href="[% urlbase FILTER xml %]skins/standard/panel.css" type="text/css"?>
+<window
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ orient="vertical"
+ onload="document.getElementById('query-field').addEventListener('keypress', initial_keypress_handler, true)">
+
+<script type="application/x-javascript"><![CDATA[
+
+function load_absolute_url( aAbsoluteURL ) {
+ content.location = aAbsoluteURL;
+}
+
+function load_relative_url( aRelativeURL ) {
+ aRelativeURL = '[% urlbase FILTER xml %]' + aRelativeURL;
+ _content.location = aRelativeURL;
+}
+
+function initial_keypress_handler( aEvent ) {
+ this.removeAttribute("class");
+ this.addEventListener("keypress", normal_keypress_handler, true);
+ this.removeEventListener("keypress", initial_keypress_handler, true);
+}
+
+function normal_keypress_handler( aEvent ) {
+ if ( aEvent.keyCode == 13 )
+ load_relative_url('buglist.cgi?quicksearch=' + this.value);
+}
+
+]]></script>
+
+ <textbox id="query-field" class="descriptive-content" value="enter search" onfocus="this.setSelectionRange(0,this.value.length)"/>
+
+ <separator class="groove"/>
+
+ <box autostretch="never" valign="top">
+ <box orient="vertical" flex="1">
+ <text class="text-link" onclick="load_relative_url('query.cgi')" value="new search"/>
+ <text class="text-link" onclick="load_relative_url('report.cgi')" value="reports"/>
+ <text class="text-link" onclick="load_relative_url('enter_bug.cgi')" value="new [% terms.bug %]"/>
+ <separator class="thin"/>
+
+[% IF user.id %]
+ <text class="text-link" onclick="load_relative_url('userprefs.cgi')" value="edit prefs"/>
+ [%- IF user.in_group('tweakparams') %]
+ <text class="text-link" onclick="load_relative_url('editparams.cgi')" value="edit params"/>
+ <text class="text-link" onclick="load_relative_url('editsettings.cgi')" value="edit default preferences"/>
+ [%- END %]
+ [%- IF user.in_group('editusers') || user.can_bless %]
+ <text class="text-link" onclick="load_relative_url('editusers.cgi')" value="edit users"/>
+ [%- END %]
+ [%- IF Param('useclassification') && user.in_group('editclassifications') %]
+ <text class="text-link" onclick="load_relative_url('editclassifications.cgi')" value="edit classifications"/>
+ [%- END %]
+ [%- IF user.in_group('editcomponents') %]
+ <text class="text-link" onclick="load_relative_url('editcomponents.cgi')" value="edit components"/>
+ <text class="text-link" onclick="load_relative_url('editflagtypes.cgi')" value="edit flags"/>
+ <text class="text-link" onclick="load_relative_url('editvalues.cgi')" value="edit field values"/>
+ [%- END %]
+ [%- IF user.in_group('creategroups') %]
+ <text class="text-link" onclick="load_relative_url('editgroups.cgi')" value="edit groups"/>
+ [%- END %]
+ [%- IF user.in_group('editkeywords') %]
+ <text class="text-link" onclick="load_relative_url('editkeywords.cgi')" value="edit keywords"/>
+ [%- END %]
+ [%- IF user.in_group('bz_canusewhines') %]
+ <text class="text-link" onclick="load_relative_url('editwhines.cgi')" value="edit whining"/>
+ [%- END %]
+ [%- IF user.in_group('editcomponents') %]
+ <text class="text-link" onclick="load_relative_url('sanitycheck.cgi')" value="sanity check"/>
+ [%- END %]
+ [%- IF user.authorizer.can_logout %]
+ <text class="text-link" onclick="load_relative_url('index.cgi?logout=1')"
+ value="log out [% user.login FILTER html %]"/>
+ [%- END %]
+ <separator class="thin"/>
+ [%- IF user.showmybugslink %]
+ [% filtered_username = user.login FILTER url_quote %]
+ <text class="text-link" onclick="load_relative_url('[% Param('mybugstemplate').replace('%userid%', filtered_username) FILTER js FILTER html %]')" value="my [% terms.bugs %]"/>
+ [%- END %]
+ [%- IF Param('usevotes') %]
+ <text class="text-link" onclick="load_relative_url('votes.cgi?action=show_user')" value="my votes"/>
+ [%- END %]
+
+ [%- FOREACH q = user.queries %]
+ <text class="text-link" onclick="load_relative_url('buglist.cgi?cmdtype=runnamed&amp;namedcmd=[% q.name FILTER url_quote %]')" value="[% q.name FILTER html %]"/>
+ [% END %]
+
+[% ELSE %]
+ <text class="text-link" onclick="load_relative_url('createaccount.cgi')" value="new user"/>
+ <text class="text-link" onclick="load_relative_url('index.cgi?GoAheadAndLogIn=1')" value="log in"/>
+[% END %]
+
+ </box>
+ </box>
+
+ <spring flex="1"/>
+ <box orient="horizontal">
+ <spring flex="1"/>
+ <html align="right">
+ <html:a class="text-link" href="[% urlbase FILTER xml %]sidebar.cgi">reload</html:a>
+ </html>
+ </box>
+</window>
diff --git a/template/en/default/welcome-admin.html.tmpl b/template/en/default/welcome-admin.html.tmpl
new file mode 100644
index 0000000..3c03fb2
--- /dev/null
+++ b/template/en/default/welcome-admin.html.tmpl
@@ -0,0 +1,86 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # none
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = BLOCK %]Welcome to [% terms.Bugzilla %][% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ header_addl_info = "version $constants.BUGZILLA_VERSION"
+ style_urls = [ 'skins/standard/index.css' ]
+%]
+
+<div id="welcome-admin">
+ <p>Welcome, [% user.identity FILTER html %].</p>
+
+ <p>You are seeing this page because some of the core parameters have not been set up yet.
+ The goal of this page is to inform you about the last steps required to set up
+ your installation correctly.</p>
+
+ <p>As an administrator, you have access to all administrative pages, accessible from
+ the <a href="admin.cgi">Administration</a> link visible at the bottom of this page.
+ This link will always be visible, on all pages. From there, you must visit at least
+ the <a href="editparams.cgi">Parameters</a> page, from where you can set all important
+ parameters for this installation; among others:</p>
+
+ <ul>
+ <li><a href="editparams.cgi?section=core#urlbase">urlbase</a>, which is the URL
+ pointing to this installation and which will be used in emails (which is also the
+ reason you see this page: as long as this parameter is not set, you will see this
+ page again and again).</li>
+
+ <li><a href="editparams.cgi?section=core#cookiepath">cookiepath</a> is important
+ for your browser to manage your cookies correctly.</li>
+
+ <li><a href="editparams.cgi?section=general#maintainer">maintainer</a>,
+ the person responsible for this installation if something is
+ running wrongly.</li>
+ </ul>
+
+ <p>Also important are the following parameters:</p>
+
+ <ul>
+ <li><a href="editparams.cgi?section=auth#requirelogin">requirelogin</a>, if turned
+ on, will protect your installation from users having no account on this installation.
+ In other words, users who are not explicitly authenticated with a valid account
+ cannot see any data. This is what you want if you want to keep your data private.</li>
+
+ <li><a href="editparams.cgi?section=auth#createemailregexp">createemailregexp</a>
+ defines which users are allowed to create an account on this installation. If set
+ to ".*" (the default), everybody is free to create his own account. If set to
+ "@mycompany.com$", only users having an account @mycompany.com will be allowed to
+ create an account. If left blank, users will not be able to create accounts themselves;
+ only an administrator will be able to create one for them. If you want a private
+ installation, you must absolutely set this parameter to something different from
+ the default.</li>
+
+ <li><a href="editparams.cgi?section=mta#mail_delivery_method">mail_delivery_method</a>
+ defines the method used to send emails, such as sendmail or SMTP. You have to set
+ it correctly to send emails.</li>
+ </ul>
+
+ <p>
+ After having set up all this, we recommend looking at [% terms.Bugzilla %]'s other
+ parameters as well at some time so that you understand what they do and whether you
+ want to modify their settings for your installation.
+ </p>
+</div>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/whine/mail.html.tmpl b/template/en/default/whine/mail.html.tmpl
new file mode 100644
index 0000000..a4f0ede
--- /dev/null
+++ b/template/en/default/whine/mail.html.tmpl
@@ -0,0 +1,92 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Erik Stambaugh <erik@dasbistro.com>
+ #%]
+
+[%# INTERFACE:
+ # subject: subject line of message
+ # body: message body, shown before the query tables
+ # queries: array of hashes containing:
+ # bugs: array containing hashes of fieldnames->values for each bug
+ # title: the title given in the whine scheduling mechanism
+ # author: user object for the person who scheduled this whine
+ # recipient: user object for the intended recipient of the message
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% PROCESS 'global/field-descs.none.tmpl' %]
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+ <head>
+ <title>
+ [[% terms.Bugzilla %]] [% subject FILTER html %]
+ </title>
+ </head>
+ <body bgcolor="#FFFFFF">
+
+ <p align="left">
+ [% body FILTER html %]
+ </p>
+
+ <p align="left">
+ [% IF author.login == recipient.login %]
+ <a href="[%+ urlbase FILTER html %]editwhines.cgi">Click
+ here to edit your whine schedule</a>
+ [% ELSE %]
+ This search was scheduled by [% author.login FILTER html %].
+ [% END %]
+ </p>
+
+
+[% FOREACH query=queries %]
+
+ <h2>[%+ query.title FILTER html %]</h2>
+
+ <table width="100%">
+ <tr>
+ <th align="left">ID</th>
+ <th align="left">Sev</th>
+ <th align="left">Pri</th>
+ <th align="left">Plt</th>
+ <th align="left">Assignee</th>
+ <th align="left">Status</th>
+ <th align="left">Resolution</th>
+ <th align="left">Summary</th>
+ </tr>
+
+ [% FOREACH bug=query.bugs %]
+ <tr>
+ <td align="left"><a href="[%+ urlbase FILTER html %]show_bug.cgi?id=
+ [%- bug.bug_id %]">[% bug.bug_id %]</a></td>
+ <td align="left">[% display_value("bug_severity", bug.bug_severity) FILTER html %]</td>
+ <td align="left">[% display_value("priority", bug.priority) FILTER html %]</td>
+ <td align="left">[% display_value("rep_platform", bug.rep_platform) FILTER html %]</td>
+ <td align="left">[% bug.assigned_to FILTER html %]</td>
+ <td align="left">[% display_value("bug_status", bug.bug_status) FILTER html %]</td>
+ <td align="left">[% display_value("resolution", bug.resolution) FILTER html %]</td>
+ <td align="left">[% bug.short_desc FILTER html %]</td>
+ </tr>
+ [% END %]
+ </table>
+[% END %]
+
+ </body>
+</html>
+
+
diff --git a/template/en/default/whine/mail.txt.tmpl b/template/en/default/whine/mail.txt.tmpl
new file mode 100644
index 0000000..862ae26
--- /dev/null
+++ b/template/en/default/whine/mail.txt.tmpl
@@ -0,0 +1,65 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Erik Stambaugh <erik@dasbistro.com>
+ #%]
+
+[%# INTERFACE:
+ # subject: subject line of message
+ # body: message body, shown before the query tables
+ # queries: array of hashes containing:
+ # bugs: array containing hashes of fieldnames->values for each bug
+ # title: the title given in the whine scheduling mechanism
+ # author: user object for the person who scheduled this whine
+ # recipient: user object for the intended recipient of the message
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% PROCESS 'global/field-descs.none.tmpl' %]
+
+[% body %]
+
+[% IF author.login == recipient.login %]
+ To edit your whine schedule, visit the following URL:
+ [%+ urlbase %]editwhines.cgi
+[% ELSE %]
+ This search was scheduled by [% author.login %].
+[% END %]
+
+
+[% FOREACH query=queries %]
+
+[%+ query.title +%]
+[%+ "-" FILTER repeat(query.title.length) %]
+
+ [% FOREACH bug=query.bugs %]
+ [% terms.Bug +%] [%+ bug.bug_id %]:
+ [%+ urlbase %]show_bug.cgi?id=[% bug.bug_id +%]
+ Priority: [%+ display_value("priority", bug.priority) -%]
+ Severity: [%+ display_value("bug_severity", bug.bug_severity) -%]
+ Platform: [%+ display_value("rep_platform", bug.rep_platform) %]
+ Assignee: [%+ bug.assigned_to %]
+ Status: [%+ display_value("bug_status", bug.bug_status) %]
+ [%- IF bug.resolution -%] Resolution: [% display_value("resolution", bug.resolution) -%]
+ [%- END %]
+ Summary: [% bug.short_desc %]
+
+ [% END %]
+
+[% END %]
+
+
diff --git a/template/en/default/whine/multipart-mime.txt.tmpl b/template/en/default/whine/multipart-mime.txt.tmpl
new file mode 100644
index 0000000..7fdfdb0
--- /dev/null
+++ b/template/en/default/whine/multipart-mime.txt.tmpl
@@ -0,0 +1,53 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Erik Stambaugh <erik@dasbistro.com>
+ #%]
+
+[%# INTERFACE:
+ # subject: subject line of message
+ # alternatives: array of hashes containing:
+ # type: MIME type
+ # content: verbatim content
+ # boundary: a string that has been generated to be a unique boundary
+ # recipient: user object for the intended recipient of the message
+ # from: Bugzilla system email address
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+From: [% from %]
+To: [% recipient.email %]
+Subject: [[% terms.Bugzilla %]] [% subject %]
+MIME-Version: 1.0
+Content-Type: multipart/alternative; boundary="[% boundary %]"
+X-Bugzilla-Type: whine
+
+
+This is a MIME multipart message. It is possible that your mail program
+doesn't quite handle these properly. Some or all of the information in this
+message may be unreadable.
+
+
+[% FOREACH part=alternatives %]
+
+--[% boundary %]
+Content-type: [% part.type +%]
+
+[%+ part.content %]
+[%+ END %]
+--[% boundary %]--
diff --git a/template/en/default/whine/schedule.html.tmpl b/template/en/default/whine/schedule.html.tmpl
new file mode 100644
index 0000000..245a3e4
--- /dev/null
+++ b/template/en/default/whine/schedule.html.tmpl
@@ -0,0 +1,448 @@
+[%# -*- mode: html -*- %]
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Erik Stambaugh <erik@dasbistro.com>
+ #%]
+
+[%# INTERFACE:
+ # events: hash, keyed by event_id number. Values are anonymous hashes of:
+ # schedule: array of hashes containing schedule info:
+ # day: value in day column
+ # time: value selected in time column
+ # mailto_type: 0=user 1=group
+ # mailto: recipient's id (profile or group)
+ # queries: as with schedule, an anonymous array containing hashes of:
+ # name: the named query's name
+ # title: title to be displayed on the results
+ # sort: integer that sets execution order on named queries
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = "Set up whining" %]
+[% PROCESS global/header.html.tmpl
+ title = title
+ style_urls = ['skins/standard/admin.css']
+ doc_section = "whining.html"
+%]
+
+<p>
+ "Whining" is when [% terms.Bugzilla %] executes a saved query at a regular interval
+ and sends the resulting list of [% terms.bugs %] via email.
+</p>
+
+<p>
+ To set up a new whine event, click "Add a new event." Enter a subject line
+ for the message that will be sent, along with a block of text that will
+ accompany the [% terms.bug %] list in the body of the message.
+</p>
+
+<p>
+ Schedules are added to an event by clicking on "Add a new schedule." A schedule
+ consists of a day, a time of day or interval of times
+ (e.g., every 15 minutes), and a target email address that may or may not be
+ alterable, depending on your privileges. Events may have more than one schedule
+ in order to run at multiple times or for different users.
+</p>
+
+<p>
+ Searches come from saved searches, which are created by executing a <a
+ href="query.cgi">search</a>, then telling [% terms.Bugzilla %] to remember
+ the search under a particular name. Add a query by clicking "Add a new
+ query", and select the desired saved search name under "Search" and add a
+ title for the [% terms.bug %] table. The optional number entered under
+ "Sort" will determine the execution order (lowest to highest) if multiple
+ queries are listed. If you check "One message per [% terms.bug %]," each [%
+ terms.bug %] that matches the search will be sent in its own email message.
+</p>
+
+<p>
+ All times are server local time ([% local_timezone FILTER html %]).
+</p>
+
+<form method="post" action="editwhines.cgi">
+[%# This hidden submit button must be here to set default behavior when
+ the user presses return on a form input field #%]
+<input type="submit" value="Update / Commit" name="commit"
+ style="display: none;" id="commit">
+<input type="hidden" name="update" value="1">
+<input type="hidden" name="token" value="[% token FILTER html %]">
+
+[% FOREACH event = events %]
+
+<table cellspacing="2" cellpadding="2" style="border: 1px solid;">
+ <tr>
+ <th align="left">
+ Event:
+ </th>
+ <td align="right" colspan="2">
+ <input type="submit" value="Remove Event"
+ name="remove_event_[% event.key %]"
+ id="remove_event_[% event.key %]">
+ </td>
+ </tr>
+
+ <tr>
+ <td valign="top" align="right">
+ Email subject line:
+ </td>
+ <td colspan="2">
+ <input type="text" name="event_[% event.key %]_subject"
+ size="60" maxlength="128" value="
+ [%- event.value.subject FILTER html %]">
+ </td>
+ </tr>
+
+ <tr>
+ <td valign="top" align="right">
+ Descriptive text sent within whine message:
+ </td>
+ <td colspan="2">
+ [% INCLUDE global/textarea.html.tmpl
+ name = "event_${event.key}_body"
+ minrows = 3
+ maxrows = 10
+ defaultrows = 5
+ cols = 80
+ defaultcontent = event.value.body
+ %]
+ </td>
+ </tr>
+
+ <tr>
+ <td valign="top" align="right">
+ Send a message even if there are no [% terms.bugs %] in the search result:
+ </td>
+ <td colspan="2">
+ <input type="checkbox" name="event_[% event.key %]_mailifnobugs"
+ [%- IF event.value.mailifnobugs == 1 %] checked [% END %]>
+ </td>
+ </tr>
+
+ [% IF event.value.schedule.size == 0 %]
+
+ <tr>
+ <td valign="top" align="right">
+ Schedule:
+ </td>
+ <td class="unset" colspan="2">
+ Not scheduled to run<br>
+ <input type="submit" value="Add a new schedule"
+ name="add_schedule_[% event.key %]"
+ id="add_schedule_[% event.key %]">
+ </td>
+ </tr>
+
+ [% ELSE %]
+
+ <tr>
+ <td valign="top" align="right">
+ Schedule:
+ </td>
+ <td class="set" colspan="2">
+
+ <table>
+ <tr>
+ <th>
+ Interval
+ </th>
+ <th>
+ [% IF mail_others %]
+ Mail to
+ [% END %]
+ </th>
+ <th>
+ </th>
+ </tr>
+ [% FOREACH schedule = event.value.schedule %]
+ <tr>
+ <td align="left">
+
+ [%# these hidden fields allow us to compare old values instead
+ of reading the database to tell if a field has changed %]
+
+ <input type="hidden" value="[% schedule.day FILTER html %]"
+ name="orig_day_[% schedule.id %]">
+ <input type="hidden" value="[% schedule.time FILTER html %]"
+ name="orig_time_[% schedule.id %]">
+ [% PROCESS day_field val=schedule.day %]
+ [% PROCESS time_field val=schedule.time %]
+ </td>
+ <td align="left">
+ [% IF mail_others %]
+ <input type="hidden" name="orig_mailto_type_[% schedule.id %]"
+ value="[% schedule.mailto_type FILTER html %]">
+ <select name="mailto_type_[% schedule.id %]">
+ <option value="0" [% IF schedule.mailto_type == 0 %]
+ selected
+ [% END %]>User</option>
+ <option value="1" [% IF schedule.mailto_type == 1 %]
+ selected
+ [% END %]>Group</option>
+ </select>
+ <input type="hidden" name="orig_mailto_[% schedule.id %]"
+ value="[% schedule.mailto FILTER html %]">
+ <input type="text" name="mailto_[% schedule.id %]"
+ value="[% schedule.mailto FILTER html %]" size="30">
+ [% END %]
+ </td>
+ <td align="left">
+ <input type="submit" value="Remove"
+ name="remove_schedule_[% schedule.id %]"
+ id="remove_schedule_[% schedule.id %]">
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <td colspan="3">
+ <input type="submit" value="Add a new schedule"
+ name="add_schedule_[% event.key %]"
+ id="add_schedule_[% event.key %]">
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+
+ [% END %]
+
+ [% IF event.value.queries.size == 0 %]
+
+ <tr>
+ <td valign="top" align="right">
+ Searches:
+ </td>
+ <td align="left">
+ No searches <br>
+ <input type="submit" value="Add a new query"
+ name="add_query_[% event.key %]"
+ id="add_query_[% event.key %]">
+ </td>
+ <td align="right" valign="bottom">
+ <input type="submit" value="Update / Commit" name="commit" id="update">
+ </td>
+ </tr>
+
+ [% ELSE %]
+
+ <tr>
+ <td valign="top" align="right">
+ Searches:
+ </td>
+ <td align="left" colspan="2">
+
+ <table>
+ <tr>
+ <th>Sort</th>
+ <th>Search</th>
+ <th>Title</th>
+ <th></th>
+ <th></th>
+ </tr>
+
+ [% FOREACH query = event.value.queries %]
+
+ <tr>
+ <td align="left">
+ <input type="text" name="query_sort_[% query.id %]"
+ size="3" value="[% query.sort %]">
+ <input type="hidden" value="[% query.sort %]"
+ name="orig_query_sort_[% query.id %]">
+ </td>
+ <td align="left">
+ <input type="hidden" value="[% query.name FILTER html %]"
+ name="orig_query_name_[% query.id %]">
+ [% PROCESS query_field thisquery=query.name %]
+ </td>
+ <td align="left">
+ <input type="hidden" value="[% query.title FILTER html %]"
+ name="orig_query_title_[% query.id %]">
+ <input type="text" name="query_title_[% query.id %]"
+ size="50" value="[% query.title FILTER html %]"
+ maxlength="64">
+ </td>
+ <td align="left">
+ <input type="hidden" value="[% query.onemailperbug FILTER html %]"
+ name="orig_query_onemailperbug_[% query.id %]">
+ <input type="checkbox" [% IF query.onemailperbug == 1 %] checked [% END %]
+ id="query_onemailperbug_[% query.id %]"
+ name="query_onemailperbug_[% query.id %]">
+ <label for="query_onemailperbug_[% query.id %]">One message per [% terms.bug %]</label>
+ </td>
+ <td align="right">
+ <input type="submit" value="Remove"
+ name="remove_query_[% query.id %]"
+ id="remove_query_[% query.id %]">
+ </td>
+ </tr>
+
+ [% END %]
+
+ <tr>
+ <td colspan="3">
+ <input type="submit" value="Add a new query"
+ name="add_query_[% event.key %]"
+ id="add_query_[% event.key %]">
+ </td>
+ <td align="right" colspan="2">
+ <input type="submit" value="Update / Commit" name="commit" id="update">
+ </td>
+ </tr>
+ </table>
+
+ </td>
+ </tr>
+
+ [% END %]
+
+</table>
+
+[% END %]
+
+<p align="left">
+ <input type="submit" value="Add a new event" name="add_event" id="add_event">
+</p>
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
+
+[% BLOCK query_field +%]
+
+ [% IF available_queries.size > 0 %]
+
+ <select name="query_name_[% query.id %]">
+ [% FOREACH q = available_queries %]
+ <option [% "selected" IF q == thisquery %] value="[% q FILTER html %]">
+ [% q FILTER html %]
+ </option>
+ [% END %]
+ </select>
+
+ [% ELSE %]
+ Please visit the <a href="query.cgi">Search</a> page and save a query
+ [% END %]
+
+[%+ END %]
+
+[% BLOCK day_field +%]
+ <select name="day_[% schedule.id %]">
+ [%
+ options = [
+ ['All', 'Each day', ],
+ ['MF', 'Monday through Friday', ],
+ ['Sun', 'Sunday', ],
+ ['Mon', 'Monday', ],
+ ['Tue', 'Tuesday', ],
+ ['Wed', 'Wednesday', ],
+ ['Thu', 'Thursday', ],
+ ['Fri', 'Friday', ],
+ ['Sat', 'Saturday', ],
+ ['1', 'On the 1st of the month', ],
+ ['2', 'On the 2nd of the month', ],
+ ['3', 'On the 3rd of the month', ],
+ ['4', 'On the 4th of the month', ],
+ ['5', 'On the 5th of the month', ],
+ ['6', 'On the 6th of the month', ],
+ ['7', 'On the 7th of the month', ],
+ ['8', 'On the 8th of the month', ],
+ ['9', 'On the 9th of the month', ],
+ ['10', 'On the 10th of the month', ],
+ ['11', 'On the 11th of the month', ],
+ ['12', 'On the 12th of the month', ],
+ ['13', 'On the 13th of the month', ],
+ ['14', 'On the 14th of the month', ],
+ ['15', 'On the 15th of the month', ],
+ ['16', 'On the 16th of the month', ],
+ ['17', 'On the 17th of the month', ],
+ ['18', 'On the 18th of the month', ],
+ ['19', 'On the 19th of the month', ],
+ ['20', 'On the 20th of the month', ],
+ ['21', 'On the 21st of the month', ],
+ ['22', 'On the 22nd of the month', ],
+ ['23', 'On the 23rd of the month', ],
+ ['24', 'On the 24th of the month', ],
+ ['25', 'On the 25th of the month', ],
+ ['26', 'On the 26th of the month', ],
+ ['27', 'On the 27th of the month', ],
+ ['28', 'On the 28th of the month', ],
+ ['29', 'On the 29th of the month', ],
+ ['30', 'On the 30th of the month', ],
+ ['31', 'On the 31st of the month', ],
+ ['last', 'Last day of the month', ],
+ ]
+ %]
+
+ [% FOREACH option = options %]
+ <option value="[% option.0 %]"
+ [%- IF val == option.0 +%] selected[% END %]>
+ [%- option.1 -%]
+ </option>
+ [% END %]
+
+ </select>
+[%+ END %]
+
+[% BLOCK time_field +%]
+<select name="time_[% schedule.id %]">
+
+ [%
+ options = [
+ [ '0', 'at midnight', ],
+ [ '1', 'at 01:00', ],
+ [ '2', 'at 02:00', ],
+ [ '3', 'at 03:00', ],
+ [ '4', 'at 04:00', ],
+ [ '5', 'at 05:00', ],
+ [ '6', 'at 06:00', ],
+ [ '7', 'at 07:00', ],
+ [ '8', 'at 08:00', ],
+ [ '9', 'at 09:00', ],
+ [ '10', 'at 10:00', ],
+ [ '11', 'at 11:00', ],
+ [ '12', 'at 12:00', ],
+ [ '13', 'at 13:00', ],
+ [ '14', 'at 14:00', ],
+ [ '15', 'at 15:00', ],
+ [ '16', 'at 16:00', ],
+ [ '17', 'at 17:00', ],
+ [ '18', 'at 18:00', ],
+ [ '19', 'at 19:00', ],
+ [ '20', 'at 20:00', ],
+ [ '21', 'at 21:00', ],
+ [ '22', 'at 22:00', ],
+ [ '23', 'at 23:00', ],
+ [ '60min', 'every hour', ],
+ [ '30min', 'every 30 minutes', ],
+ [ '15min', 'every 15 minutes', ],
+ ]
+ %]
+
+ [% FOREACH option = options %]
+ <option value="[% option.0 %]"
+ [%- IF val == option.0 +%] selected[% END %]>
+ [%- option.1 -%]
+ </option>
+ [% END %]
+
+</select>
+
+[%+ END %]
+