aboutsummaryrefslogtreecommitdiff
path: root/template/en/default/admin
diff options
context:
space:
mode:
authorFathi Boudra <fathi.boudra@linaro.org>2014-06-02 17:14:02 +0300
committerFathi Boudra <fathi.boudra@linaro.org>2014-06-02 17:14:02 +0300
commit46f29f243b1e7642e860b40214d5f893aad678e1 (patch)
tree7ac82cee0957299e51c36f22ce1b172670513348 /template/en/default/admin
Initial commit - Bugzilla 4.4.4
Signed-off-by: Fathi Boudra <fathi.boudra@linaro.org>
Diffstat (limited to 'template/en/default/admin')
-rw-r--r--template/en/default/admin/admin.html.tmpl127
-rw-r--r--template/en/default/admin/classifications/add.html.tmpl27
-rw-r--r--template/en/default/admin/classifications/del.html.tmpl51
-rw-r--r--template/en/default/admin/classifications/edit-common.html.tmpl35
-rw-r--r--template/en/default/admin/classifications/edit.html.tmpl55
-rw-r--r--template/en/default/admin/classifications/footer.html.tmpl10
-rw-r--r--template/en/default/admin/classifications/reclassify.html.tmpl77
-rw-r--r--template/en/default/admin/classifications/select.html.tmpl54
-rw-r--r--template/en/default/admin/components/confirm-delete.html.tmpl149
-rw-r--r--template/en/default/admin/components/create.html.tmpl36
-rw-r--r--template/en/default/admin/components/edit-common.html.tmpl77
-rw-r--r--template/en/default/admin/components/edit.html.tmpl66
-rw-r--r--template/en/default/admin/components/footer.html.tmpl42
-rw-r--r--template/en/default/admin/components/list.html.tmpl133
-rw-r--r--template/en/default/admin/components/select-product.html.tmpl54
-rw-r--r--template/en/default/admin/confirm-action.html.tmpl87
-rw-r--r--template/en/default/admin/custom_fields/cf-js.js.tmpl66
-rw-r--r--template/en/default/admin/custom_fields/confirm-delete.html.tmpl60
-rw-r--r--template/en/default/admin/custom_fields/create.html.tmpl179
-rw-r--r--template/en/default/admin/custom_fields/edit.html.tmpl195
-rw-r--r--template/en/default/admin/custom_fields/list.html.tmpl99
-rw-r--r--template/en/default/admin/fieldvalues/confirm-delete.html.tmpl154
-rw-r--r--template/en/default/admin/fieldvalues/create.html.tmpl92
-rw-r--r--template/en/default/admin/fieldvalues/edit.html.tmpl105
-rw-r--r--template/en/default/admin/fieldvalues/footer.html.tmpl48
-rw-r--r--template/en/default/admin/fieldvalues/list.html.tmpl90
-rw-r--r--template/en/default/admin/fieldvalues/select-field.html.tmpl37
-rw-r--r--template/en/default/admin/flag-type/confirm-delete.html.tmpl49
-rw-r--r--template/en/default/admin/flag-type/edit.html.tmpl265
-rw-r--r--template/en/default/admin/flag-type/list.html.tmpl159
-rw-r--r--template/en/default/admin/groups/confirm-remove.html.tmpl50
-rw-r--r--template/en/default/admin/groups/create.html.tmpl94
-rw-r--r--template/en/default/admin/groups/delete.html.tmpl172
-rw-r--r--template/en/default/admin/groups/edit.html.tmpl233
-rw-r--r--template/en/default/admin/groups/list.html.tmpl153
-rw-r--r--template/en/default/admin/keywords/confirm-delete.html.tmpl39
-rw-r--r--template/en/default/admin/keywords/create.html.tmpl45
-rw-r--r--template/en/default/admin/keywords/edit.html.tmpl57
-rw-r--r--template/en/default/admin/keywords/list.html.tmpl54
-rw-r--r--template/en/default/admin/milestones/confirm-delete.html.tmpl83
-rw-r--r--template/en/default/admin/milestones/create.html.tmpl46
-rw-r--r--template/en/default/admin/milestones/edit.html.tmpl53
-rw-r--r--template/en/default/admin/milestones/footer.html.tmpl55
-rw-r--r--template/en/default/admin/milestones/list.html.tmpl98
-rw-r--r--template/en/default/admin/milestones/select-product.html.tmpl54
-rw-r--r--template/en/default/admin/params/admin.html.tmpl28
-rw-r--r--template/en/default/admin/params/advanced.html.tmpl68
-rw-r--r--template/en/default/admin/params/attachment.html.tmpl62
-rw-r--r--template/en/default/admin/params/auth.html.tmpl130
-rw-r--r--template/en/default/admin/params/bugchange.html.tmpl42
-rw-r--r--template/en/default/admin/params/bugfields.html.tmpl45
-rw-r--r--template/en/default/admin/params/common.html.tmpl125
-rw-r--r--template/en/default/admin/params/core.html.tmpl35
-rw-r--r--template/en/default/admin/params/dependencygraph.html.tmpl36
-rw-r--r--template/en/default/admin/params/editparams.html.tmpl103
-rw-r--r--template/en/default/admin/params/general.html.tmpl73
-rw-r--r--template/en/default/admin/params/groupsecurity.html.tmpl46
-rw-r--r--template/en/default/admin/params/index.html.tmpl38
-rw-r--r--template/en/default/admin/params/ldap.html.tmpl45
-rw-r--r--template/en/default/admin/params/mta.html.tmpl67
-rw-r--r--template/en/default/admin/params/patchviewer.html.tmpl51
-rw-r--r--template/en/default/admin/params/query.html.tmpl64
-rw-r--r--template/en/default/admin/params/radius.html.tmpl43
-rw-r--r--template/en/default/admin/params/shadowdb.html.tmpl36
-rw-r--r--template/en/default/admin/params/usermatch.html.tmpl29
-rw-r--r--template/en/default/admin/products/confirm-delete.html.tmpl259
-rw-r--r--template/en/default/admin/products/create.html.tmpl74
-rw-r--r--template/en/default/admin/products/edit-common.html.tmpl72
-rw-r--r--template/en/default/admin/products/edit.html.tmpl142
-rw-r--r--template/en/default/admin/products/footer.html.tmpl79
-rw-r--r--template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl42
-rw-r--r--template/en/default/admin/products/groupcontrol/edit.html.tmpl303
-rw-r--r--template/en/default/admin/products/groupcontrol/updated.html.tmpl42
-rw-r--r--template/en/default/admin/products/list-classifications.html.tmpl58
-rw-r--r--template/en/default/admin/products/list.html.tmpl86
-rw-r--r--template/en/default/admin/products/updated.html.tmpl90
-rw-r--r--template/en/default/admin/sanitycheck/list.html.tmpl26
-rw-r--r--template/en/default/admin/sanitycheck/messages.html.tmpl312
-rw-r--r--template/en/default/admin/settings/edit.html.tmpl93
-rw-r--r--template/en/default/admin/sudo.html.tmpl91
-rw-r--r--template/en/default/admin/table.html.tmpl164
-rw-r--r--template/en/default/admin/users/confirm-delete.html.tmpl471
-rw-r--r--template/en/default/admin/users/create.html.tmpl51
-rw-r--r--template/en/default/admin/users/edit.html.tmpl173
-rw-r--r--template/en/default/admin/users/list.html.tmpl111
-rw-r--r--template/en/default/admin/users/listselectvars.html.tmpl26
-rw-r--r--template/en/default/admin/users/responsibilities.html.tmpl57
-rw-r--r--template/en/default/admin/users/search.html.tmpl79
-rw-r--r--template/en/default/admin/users/userdata.html.tmpl109
-rw-r--r--template/en/default/admin/versions/confirm-delete.html.tmpl89
-rw-r--r--template/en/default/admin/versions/create.html.tmpl40
-rw-r--r--template/en/default/admin/versions/edit.html.tmpl47
-rw-r--r--template/en/default/admin/versions/footer.html.tmpl53
-rw-r--r--template/en/default/admin/versions/list.html.tmpl79
-rw-r--r--template/en/default/admin/versions/select-product.html.tmpl54
-rw-r--r--template/en/default/admin/workflow/comment.html.tmpl82
-rw-r--r--template/en/default/admin/workflow/edit.html.tmpl100
97 files changed, 8684 insertions, 0 deletions
diff --git a/template/en/default/admin/admin.html.tmpl b/template/en/default/admin/admin.html.tmpl
new file mode 100644
index 0000000..38194e9
--- /dev/null
+++ b/template/en/default/admin/admin.html.tmpl
@@ -0,0 +1,127 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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')
+ || user.get_products_by_permission('editcomponents').size) ? "" : "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..d818d31
--- /dev/null
+++ b/template/en/default/admin/classifications/add.html.tmpl
@@ -0,0 +1,27 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Add new classification"
+%]
+
+<form method=post action="editclassifications.cgi">
+ <table border=0 cellpadding=4 cellspacing=0>
+
+ [% PROCESS "admin/classifications/edit-common.html.tmpl" %]
+
+ </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..215db84
--- /dev/null
+++ b/template/en/default/admin/classifications/del.html.tmpl
@@ -0,0 +1,51 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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-common.html.tmpl b/template/en/default/admin/classifications/edit-common.html.tmpl
new file mode 100644
index 0000000..6f038fc
--- /dev/null
+++ b/template/en/default/admin/classifications/edit-common.html.tmpl
@@ -0,0 +1,35 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ # classification: Bugzilla::Classifiation object.
+ #%]
+
+<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>
+
+[% Hook.process('rows') %]
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..429eefc
--- /dev/null
+++ b/template/en/default/admin/classifications/edit.html.tmpl
@@ -0,0 +1,55 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Edit classification"
+%]
+
+<form method=post action="editclassifications.cgi">
+ <table border=0 cellpadding=4 cellspacing=0>
+
+ [% PROCESS "admin/classifications/edit-common.html.tmpl" %]
+
+ <tr valign=top>
+ <th align="right">
+ <a href="editproducts.cgi?classification=[% classification.name FILTER uri %]">
+ 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..39adb5c
--- /dev/null
+++ b/template/en/default/admin/classifications/footer.html.tmpl
@@ -0,0 +1,10 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+<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..13fb3a3
--- /dev/null
+++ b/template/en/default/admin/classifications/reclassify.html.tmpl
@@ -0,0 +1,77 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% PROCESS global/header.html.tmpl
+ title = "Reclassify products"
+%]
+
+<form method=post action="editclassifications.cgi">
+ <table border=0 cellpadding=4 cellspacing=0>
+ <tr>
+ <th align="right">Classification:</th>
+ <td valign="top" colspan=3>[% classification.name FILTER html %]</td>
+
+ </tr><tr>
+ <th align="right">Description:</th>
+ <td valign="top" colspan=3>
+ [% IF classification.description %]
+ [% classification.description FILTER html_light %]
+ [% ELSE %]
+ <font color="red">description missing</font>
+ [% END %]
+ </td>
+
+ </tr><tr>
+ <th align="right">Sortkey:</th>
+ <td valign="top" colspan=3>[% classification.sortkey FILTER html %]</td>
+
+ </tr><tr>
+ <th align="right">Products:</th>
+ <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..541ded9
--- /dev/null
+++ b/template/en/default/admin/classifications/select.html.tmpl
@@ -0,0 +1,54 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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 uri %]"><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 uri %]">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 uri %]">delete</a></td>
+ [% END %]
+ </tr>
+ [% END %]
+
+</table>
+
+<p>
+ <a href="editclassifications.cgi?action=add">Add a new classification</a>.
+</p>
+
+[% 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..82bf018
--- /dev/null
+++ b/template/en/default/admin/components/confirm-delete.html.tmpl
@@ -0,0 +1,149 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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
+ 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">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 && comp.isactive %]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 uri %]&amp;product=
+ [%- product.name FILTER uri %]">[% comp.bug_count %]</a>
+[% ELSE %]
+ None
+[% END %]
+ </td>
+</tr>
+</table>
+
+<h2>Confirmation</h2>
+
+[% IF comp.bug_count %]
+
+ [% IF !Param("allowbugdeletion") %]
+ <p class="confirmation">
+ 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>ALL</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..f281160
--- /dev/null
+++ b/template/en/default/admin/components/create.html.tmpl
@@ -0,0 +1,36 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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
+ yui = [ 'autocomplete' ]
+ javascript_urls = [ "js/field.js" ]
+ title = title
+%]
+
+<form method="post" action="editcomponents.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+
+ [% PROCESS "admin/components/edit-common.html.tmpl" %]
+
+ </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-common.html.tmpl b/template/en/default/admin/components/edit-common.html.tmpl
new file mode 100644
index 0000000..6ff4e07
--- /dev/null
+++ b/template/en/default/admin/components/edit-common.html.tmpl
@@ -0,0 +1,77 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ # comp: object; Bugzilla::Component object.
+ #%]
+
+[%# When called from the "New Product" page, the component description field
+ # must have a name different from the product description field. %]
+[% DEFAULT desc_name = "description" %]
+
+<tr>
+ <th class="field_label"><label for="component">Component:</label></th>
+ <td><input size="64" maxlength="64" name="component" id="component"
+ value="[%- comp.name FILTER html %]"></td>
+</tr>
+<tr>
+ <th class="field_label"><label for="[% desc_name FILTER html %]">Component Description:</label></th>
+ <td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = desc_name
+ id = desc_name
+ minrows = 4
+ cols = 64
+ wrap = 'virtual'
+ defaultcontent = comp.description
+ %]
+ </td>
+</tr>
+<tr>
+ <th class="field_label"><label for="initialowner">Default Assignee:</label></th>
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ name => "initialowner"
+ id => "initialowner"
+ value => comp.default_assignee.login
+ size => 64
+ %]
+ </td>
+</tr>
+[% IF Param('useqacontact') %]
+ <tr>
+ <th class="field_label"><label for="initialqacontact">Default QA contact:</label></th>
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ name => "initialqacontact"
+ id => "initialqacontact"
+ value => comp.default_qa_contact.login
+ size => 64
+ emptyok => 1
+ %]
+ </td>
+ </tr>
+[% END %]
+<tr>
+ <th class="field_label"><label for="initialcc">Default CC List:</label></th>
+ <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>
+
+[% Hook.process('rows') %]
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..748175b
--- /dev/null
+++ b/template/en/default/admin/components/edit.html.tmpl
@@ -0,0 +1,66 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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.
+ #%]
+
+[% title = BLOCK %]
+ Edit component '[% comp.name FILTER html %]' of product '[% product.name FILTER html %]'
+[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+ yui = [ 'autocomplete' ]
+ javascript_urls = [ "js/field.js" ]
+%]
+
+<form method="post" action="editcomponents.cgi">
+ <table border="0" cellpadding="4" cellspacing="0">
+
+ [% PROCESS "admin/components/edit-common.html.tmpl" %]
+
+ <tr>
+ <th class="field_label"><label for="isactive">Enabled For [% terms.Bugs %]:</label></th>
+ <td><input id="isactive" name="isactive" type="checkbox" value="1"
+ [% 'checked="checked"' IF comp.isactive %]></td>
+ </tr>
+ <tr>
+ <th class="field_label">[% terms.Bugs %]:</th>
+ <td>
+[% IF comp.bug_count > 0 %]
+ <a title="[% terms.Bugs %] in component '[% comp.name FILTER html %]'"
+ href="buglist.cgi?component=
+ [%- comp.name FILTER uri %]&amp;product=
+ [%- product.name FILTER uri %]">[% 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 uri %]&amp;component=
+ [%- comp.name FILTER uri %]">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..86d0afb
--- /dev/null
+++ b/template/en/default/admin/components/footer.html.tmpl
@@ -0,0 +1,42 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 uri %]&amp;component=[% comp.name FILTER uri %]">
+ '[% 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 uri %]">'[% 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 uri %]">'[% 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..fc36bcd
--- /dev/null
+++ b/template/en/default/admin/components/list.html.tmpl
@@ -0,0 +1,133 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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.
+ #%]
+
+[% 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 uri %]&amp;component=%%name%%[% END %]
+[% delete_contentlink = BLOCK %]editcomponents.cgi?action=del&amp;product=
+ [%- product.name FILTER uri %]&amp;component=%%name%%[% END %]
+[% bug_count_contentlink = BLOCK %]buglist.cgi?component=%%name%%&amp;product=
+ [%- product.name FILTER uri %][% 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 => 'Default QA Contact'
+ }) %]
+
+[% END %]
+
+[% columns.push({
+ name => "initial_cc_names"
+ heading => "Default CC list"
+ },
+ {
+ name => "isactive"
+ heading => "Active"
+ yesno_field => 1
+ }) %]
+
+[% 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, the initialqacontact, and the initial_cc_names with right values %]
+[% overrides.initialowner = {} %]
+[% overrides.initialqacontact = {} %]
+[% overrides.initial_cc_names = {} %]
+
+[%# "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
+ }
+ %]
+ [% SET initial_cc_list = [] %]
+ [% FOREACH cc_user = my_component.initial_cc %]
+ [% initial_cc_list.push(cc_user.login) %]
+ [% END %]
+ [% overrides.initial_cc_names.name.${my_component.name} = {
+ override_content => 1
+ content => initial_cc_list.join(', ')
+ }
+ %]
+[% 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 uri %]">Add</a>
+ a new component to product '[% product.name FILTER html %]'</p>
+
+[% IF ! showbugcounts %]
+
+ <p><a href="editcomponents.cgi?product=[% product.name FILTER uri %]&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..55600d9
--- /dev/null
+++ b/template/en/default/admin/components/select-product.html.tmpl
@@ -0,0 +1,54 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ # products: array of product objects
+ # showbugcounts: if defined, then bug counts should be included in the table
+ #%]
+
+[% 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..e3b9ef5
--- /dev/null
+++ b/template/en/default/admin/confirm-action.html.tmpl
@@ -0,0 +1,87 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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/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..bfdacb8
--- /dev/null
+++ b/template/en/default/admin/custom_fields/cf-js.js.tmpl
@@ -0,0 +1,66 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+// 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.fields({ is_select => 1 }) %]
+ select_values[[% sel_field.id FILTER js %]] = [
+ [% FOREACH legal_value = sel_field.legal_values %]
+ [%# Prefix components with the name of their product so that admins
+ know which component we're talking about. #%]
+ [% IF sel_field.name == 'component' %]
+ [% SET value_name = display_value('product', legal_value.product.name) _ ': '
+ _ display_value(sel_field.name, legal_value.name) %]
+ [% ELSE %]
+ [% SET value_name = display_value(sel_field.name, legal_value.name) %]
+ [% END %]
+ [[% legal_value.id FILTER js %], '[% 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;
+ }
+
+ var reverse_desc = document.getElementById('reverse_desc');
+ if (type_field.value == [% constants.FIELD_TYPE_BUG_ID %])
+ {
+ reverse_desc.disabled = false;
+ }
+ else {
+ reverse_desc.disabled = true;
+ reverse_desc.value = '';
+ }
+}
+
+function onChangeVisibilityField() {
+ var vis_field = document.getElementById('visibility_field_id');
+ var vis_value = document.getElementById('visibility_values');
+
+ 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..85338c0
--- /dev/null
+++ b/template/en/default/admin/custom_fields/confirm-delete.html.tmpl
@@ -0,0 +1,60 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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
+ style_urls = ['skins/standard/admin.css']
+ 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 class="confirmation">
+ 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..fb7f06f
--- /dev/null
+++ b/template/en/default/admin/custom_fields/create.html.tmpl
@@ -0,0 +1,179 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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"
+ style_urls = ['skins/standard/admin.css']
+%]
+
+[%# set initial editability of fields such as Reverse Relationship Description %]
+<script type="text/javascript">
+YAHOO.util.Event.onDOMReady(function() {onChangeType(document.getElementById('type'))});
+</script>
+
+<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" id="edit_custom_field">
+ <tr>
+ <th class="narrow_label"><label for="name">Name:</label></th>
+ <td>
+ <input type="text" id="name" name="name" value="cf_" size="40" maxlength="64">
+ </td>
+
+ <th>
+ <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 class="narrow_label"><label for="desc">Description:</label></th>
+ <td><input type="text" id="desc" name="desc" value="" size="40"></td>
+
+ <th>
+ <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 class="narrow_label"><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><label for="obsolete">Is obsolete:</label></th>
+ <td><input type="checkbox" id="obsolete" name="obsolete" value="1"></td>
+ </tr>
+ <tr>
+ <th class="narrow_label"><label for="sortkey">Sortkey:</label></th>
+ <td>
+ <input type="text" id="sortkey" name="sortkey" size="6" maxlength="6">
+ </td>
+
+ <th align="right"><label for="is_mandatory">Is mandatory:</label></th>
+ <td><input type="checkbox" id="is_mandatory" name="is_mandatory" value="1"></td>
+ </tr>
+
+ <tr>
+ <th class="narrow_label">Long Description:</th>
+ <td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'long_desc'
+ id = 'long_desc'
+ minrows = 3
+ maxrows = 5
+ cols = 46
+ defaultcontent = defaultcontent
+ %]
+ </td>
+ <th>
+ <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.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_values">
+ <strong>is set to any of:</strong>
+ </label>
+ <select multiple="multiple" size="5" name="visibility_values"
+ id="visibility_values" class="field_value">
+ <option value=""></option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <th class="narrow_label">
+ <label for="reverse_desc">Reverse Relationship Description:</label>
+ </th>
+ <td>
+ <input type="text" id="reverse_desc" name="reverse_desc" value="" size="40" disabled="disabled">
+ <br/>
+ Use this label for the list of [% terms.bugs %] that link to
+ [%+ terms.abug %] with this
+ [%+ field_types.${constants.FIELD_TYPE_BUG_ID} FILTER html %]
+ field. For example, if the description is "Is a duplicate of",
+ the reverse description would be "Duplicates of this [% terms.bug %]".
+ Leave blank to disable the list for this field.
+ </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.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..a1d7393
--- /dev/null
+++ b/template/en/default/admin/custom_fields/edit.html.tmpl
@@ -0,0 +1,195 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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"
+ style_urls = ['skins/standard/admin.css']
+%]
+
+<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" id="edit_custom_field">
+ <tr>
+ <th class="narrow_label">Name:</th>
+ <td>[% field.name FILTER html %]</td>
+
+ <th>
+ <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 class="narrow_label"><label for="desc">Description:</label></th>
+ <td><input type="text" id="desc" name="desc" size="40"
+ value="[% field.description FILTER html %]"></td>
+
+ <th>
+ <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 class="narrow_label">Type:</th>
+ <td>[% field_types.${field.type} FILTER html %]</td>
+
+ <th><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 class="narrow_label"><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="is_mandatory">Is mandatory:</label></th>
+ <td><input type="checkbox" id="is_mandatory" name="is_mandatory" value="1"
+ [%- ' checked="checked"' IF field.is_mandatory %]></td>
+ </tr>
+ <tr>
+ <th class="narrow_label">Long Description:</th>
+ <td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'long_desc'
+ id = 'long_desc'
+ minrows = 3
+ maxrows = 5
+ cols = 46
+ defaultcontent = field.long_desc
+ %]
+ </td>
+ <th>
+ <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.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_values">
+ <strong>is set to any of:</strong>
+ </label>
+ <select multiple="multiple" size="5" name="visibility_values"
+ id="visibility_values" class="field_value">
+ [% FOREACH value = field.visibility_field.legal_values %]
+ <option value="[% value.id FILTER html %]"
+ [% " selected" IF field.visibility_values.contains(value) %]>
+ [% IF field.visibility_field.name == 'component' %]
+ [% display_value('product', value.product.name) FILTER html %]:
+ [% END %]
+ [%+ display_value(field.visibility_field.name, value.name) FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ </td>
+ </tr>
+ [% IF field.type == constants.FIELD_TYPE_BUG_ID %]
+ <tr>
+ <th class="narrow_label">
+ <label for="reverse_desc">Reverse Relationship Description:</label>
+ </th>
+ <td>
+ <input type="text" id="reverse_desc" name="reverse_desc" size="40"
+ value="[% field.reverse_desc FILTER html %]">
+ <br/>
+ Use this label for the list of [% terms.bugs %] that link to
+ [%+ terms.abug %] with this
+ [%+ field_types.${constants.FIELD_TYPE_BUG_ID} FILTER html %] field.
+ For example, if the description is "Is a duplicate of",
+ the reverse description would be "Duplicates of this [% terms.bug %]".
+ Leave blank to disable the list for this field.
+ </td>
+ <td colspan="2">&nbsp;</td>
+ </tr>
+ [% END %]
+ [% IF field.is_select %]
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <a href="editvalues.cgi?field=[% field.name FILTER uri %]">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.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..e6ec0c2
--- /dev/null
+++ b/template/en/default/admin/custom_fields/list.html.tmpl
@@ -0,0 +1,99 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 => "is_mandatory"
+ heading => "Is Mandatory"
+ },
+ {
+ name => "action"
+ heading => "Action"
+ content => ""
+ }
+ ]
+%]
+
+[% USE Bugzilla %]
+[% custom_fields = Bugzilla.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..122df36
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl
@@ -0,0 +1,154 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 uri %]=
+ [%- value.name FILTER uri %]">
+ [%- 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 uri %]=
+ [%- value.name FILTER uri %]">
+ [% 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 cannot 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 uri %]">
+ [%- 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 uri %]&value=
+ [%- controlled.name FILTER uri %]">
+ [% 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..f9f0f7e
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/create.html.tmpl
@@ -0,0 +1,92 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 %]">
+ [% IF field.value_field.name == 'component' %]
+ [% field_value.product.name FILTER html %]:
+ [% END %]
+ [%- 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..ab64185
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/edit.html.tmpl
@@ -0,0 +1,105 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ # value: Bugzilla::Field::Choice; The field value we are editing.
+ # field: Bugzilla::Field; The field this value belongs to.
+ #%]
+
+[% 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 %]>
+ [% IF field.value_field.name == 'component' %]
+ [% field_value.product.name FILTER html %]:
+ [% END %]
+ [% 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 %]
+ [% IF !(value.is_default OR value.is_static) %]
+ <input id="defined_is_active" name="defined_is_active"
+ type="hidden" value="1">
+ [% 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..672e11b
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/footer.html.tmpl
@@ -0,0 +1,48 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 uri %]">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 uri %]&amp;value=
+ [%- value.name FILTER uri %]">
+ '[% value.name FILTER html %]'</a>.
+[% END %]
+
+[% UNLESS no_edit_other_link %]
+ Edit other values for the <a
+ href="editvalues.cgi?field=
+ [%- field.name FILTER uri %]">'[% 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..01c5717
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/list.html.tmpl
@@ -0,0 +1,90 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 %]
+
+[% 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 uri %]&amp;value=%%name%%[% END %]
+[% delete_contentlink = BLOCK %]editvalues.cgi?action=del&amp;field=
+ [%- field.name FILTER uri %]&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..099eeba
--- /dev/null
+++ b/template/en/default/admin/fieldvalues/select-field.html.tmpl
@@ -0,0 +1,37 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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/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..70f5efb
--- /dev/null
+++ b/template/en/default/admin/flag-type/confirm-delete.html.tmpl
@@ -0,0 +1,49 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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..ab70e23
--- /dev/null
+++ b/template/en/default/admin/flag-type/edit.html.tmpl
@@ -0,0 +1,265 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% PROCESS "global/js-products.html.tmpl" %]
+
+[% IF action == "insert" %]
+ [% title = BLOCK %]
+ Create Flag Type for [% type.target_type == "bug" ? terms.Bugs : "Attachments" %]
+ [% IF type.id %]
+ Based on [% type.name FILTER html %]
+ [% END %]
+ [% END %]
+ [% doc_section = "flags-overview.html#flags-create" %]
+[% ELSE %]
+ [% 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['flagtype_properties'];
+ selectProduct(f.product, f.component, null, null, '__Any__');"
+ javascript_urls=["js/productform.js"]
+ doc_section = doc_section
+%]
+
+<form id="flagtype_properties" method="post" action="editflagtypes.cgi">
+ <input type="hidden" name="action" value="[% action FILTER html %]">
+ <input type="hidden" name="can_fully_edit" value="[% can_fully_edit FILTER html %]">
+ <input type="hidden" name="id" value="[% type.id FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+ <input type="hidden" name="target_type" value="[% type.target_type FILTER html %]">
+ <input type="hidden" name="check_clusions" value="[% check_clusions FILTER none %]">
+ [% FOREACH category = inclusions.values %]
+ <input type="hidden" name="inclusions" value="[% category FILTER html %]">
+ [% END %]
+ [% FOREACH category = exclusions.values %]
+ <input type="hidden" name="exclusions" value="[% category 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" [%- ' disabled="disabled"' UNLESS can_fully_edit %]>
+ </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
+ disabled = !can_fully_edit
+ %]
+ </td>
+ </tr>
+
+ <tr>
+ <th>Category:</th>
+
+ <td>
+ the products/components to which [% type.target_type == "bug" ? terms.bugs : "attachments" %]
+ must (inclusions) or must not (exclusions) belong in order for users
+ to be able to set flags of this type for them.
+ [% UNLESS can_fully_edit %]
+ <p class="warning">This flagtype also applies to some products you are not allowed
+ to edit (and so which are not displayed in the lists below). Your limited privileges
+ means you are only allowed to add and remove this flagtype to/from products you can
+ edit, but not to edit other properties of the flagtype.</p>
+ [% END %]
+ <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 %]">[% prod.name FILTER html %]</option>
+ [% END %]
+ </select><br>
+ <select name="component">
+ <option value="">__Any__</option>
+ [% FOREACH comp = components %]
+ <option value="[% comp FILTER html %]">[% comp FILTER html %]</option>
+ [% END %]
+ </select><br>
+ <input type="submit" id="categoryAction-include"
+ name="categoryAction-include" value="Include">
+ <input type="submit" id="categoryAction-exclude"
+ name="categoryAction-exclude" value="Exclude">
+ </td>
+ <td style="vertical-align: top;">
+ <b>Inclusions:</b><br>
+ [% PROCESS category_select name="inclusion_to_remove" categories = inclusions %]<br>
+ <input type="submit" id="categoryAction-removeInclusion"
+ name="categoryAction-removeInclusion" value="Remove Inclusion">
+ </td>
+ <td style="vertical-align: top;">
+ <b>Exclusions:</b><br>
+ [% PROCESS category_select name="exclusion_to_remove" categories = exclusions %]<br>
+ <input type="submit" id="categoryAction-removeExclusion"
+ name="categoryAction-removeExclusion" value="Remove Exclusion">
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <th>Sort Key:</th>
+ <td>
+ a number between 1 and [% constants.MAX_SMALLINT FILTER none %] 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 FILTER html %]" size="5"
+ maxlength="5" [% ' disabled="disabled"' UNLESS can_fully_edit %]>
+ </td>
+ </tr>
+
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <input type="checkbox" id="is_active" name="is_active"
+ [%- ' disabled="disabled"' UNLESS can_fully_edit %]
+ [% " 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"
+ [%- ' disabled="disabled"' UNLESS can_fully_edit %]
+ [% " 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" [%- ' disabled="disabled"' UNLESS can_fully_edit %]>
+ </td>
+ </tr>
+
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <input type="checkbox" id="is_requesteeble" name="is_requesteeble"
+ [%- ' disabled="disabled"' UNLESS can_fully_edit %]
+ [% " 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"
+ [%- ' disabled="disabled"' UNLESS can_fully_edit %]
+ [% " 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 [% type.target_type == "bug" ? terms.bug : "attachment" %])</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 group_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 group_select selname = "request_group" %]
+ </td>
+ </tr>
+
+ <tr>
+ <th>&nbsp;</th>
+ <td>
+ <input type="submit" id="save" value="[% action == "insert" ? "Create" : "Save Changes" %]">
+ </td>
+ </tr>
+
+ </table>
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
+
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK group_select %]
+ <select name="[% selname %]" id="[% selname %]" [%- ' disabled="disabled"' UNLESS can_fully_edit %]>
+ <option value="">(no group)</option>
+ [% group_found = 0 %]
+ [% FOREACH group = groups %]
+ <option value="[% group.name FILTER html %]"
+ [% IF type.${selname} && type.${selname}.name == group.name %]
+ [% ' selected="selected"' %]
+ [% group_found = 1 %]
+ [% END %]>
+ [%- group.name FILTER html ~%]
+ </option>
+ [% END %]
+ [% IF !group_found && type.${selname}.name %]
+ <option value="[% type.${selname}.name FILTER html %]" selected="selected">
+ [%- type.${selname}.name FILTER html ~%]
+ </option>
+ [% END %]
+ </select>
+[% END %]
+
+[% BLOCK category_select %]
+ <select name="[% name FILTER html %]" multiple="multiple" size="7">
+ [% FOREACH option = categories.keys.sort %]
+ <option value="[% categories.$option FILTER html %]">
+ [% option 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..7a02938
--- /dev/null
+++ b/template/en/default/admin/flag-type/list.html.tmpl
@@ -0,0 +1,159 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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..a9aa7e1
--- /dev/null
+++ b/template/en/default/admin/groups/confirm-remove.html.tmpl
@@ -0,0 +1,50 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 id="confirm" 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..db65629
--- /dev/null
+++ b/template/en/default/admin/groups/create.html.tmpl
@@ -0,0 +1,94 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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>
+
+[% IF Param("makeproductgroups") %]
+ <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>
+[% ELSE %]
+ <p>Checking the "Insert new group into all existing products" option will
+ make the new group be associated with existing products. Leaving it unchecked
+ will make the group become visible only when its controls have been added to
+ a product.</p>
+[% END %]
+
+<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..5ae0ce9
--- /dev/null
+++ b/template/en/default/admin/groups/delete.html.tmpl
@@ -0,0 +1,172 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 uri %]&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 uri %]">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 uri %]">
+ [%- data.product.name FILTER html %]</a>
+ ([% active.join(', ') FILTER html %])
+ [% IF hidden %]
+ <strong>WARNING: This product is currently hidden.
+ Deleting this group could make this product publicly visible
+ if no other group applies.
+ </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 uri %]">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..2f4101a
--- /dev/null
+++ b/template/en/default/admin/groups/edit.html.tmpl
@@ -0,0 +1,233 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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" id="update-group" 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" id="remove-membership" 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..af7da33
--- /dev/null
+++ b/template/en/default/admin/groups/list.html.tmpl
@@ -0,0 +1,153 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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..718a32e
--- /dev/null
+++ b/template/en/default/admin/keywords/confirm-delete.html.tmpl
@@ -0,0 +1,39 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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..e29db40
--- /dev/null
+++ b/template/en/default/admin/keywords/create.html.tmpl
@@ -0,0 +1,45 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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..07603e1
--- /dev/null
+++ b/template/en/default/admin/keywords/edit.html.tmpl
@@ -0,0 +1,57 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ # keyword: A Bugzilla::Keyword object.
+ #%]
+
+[% 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 uri %]">
+ [% 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..ea98ca7
--- /dev/null
+++ b/template/en/default/admin/keywords/list.html.tmpl
@@ -0,0 +1,54 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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/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..cc30f16
--- /dev/null
+++ b/template/en/default/admin/milestones/confirm-delete.html.tmpl
@@ -0,0 +1,83 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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
+ 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">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 uri %]&amp;product=
+ [%- product.name FILTER uri %]">
+ [% milestone.bug_count FILTER none %]</a>
+[% ELSE %]
+ None
+[% END %]
+ </td>
+</tr>
+</table>
+
+<h2>Confirmation</h2>
+
+[% IF milestone.bug_count %]
+
+ <p class="confirmation">
+ 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>ALL</b> of these [% terms.bugs %] will be retargeted
+ to [% product.default_milestone FILTER html %], the default milestone for
+ the [% product.name FILTER html %] product.
+ </p>
+[% 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..8006c0c
--- /dev/null
+++ b/template/en/default/admin/milestones/create.html.tmpl
@@ -0,0 +1,46 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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="64" maxlength="64" 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..759bd70
--- /dev/null
+++ b/template/en/default/admin/milestones/edit.html.tmpl
@@ -0,0 +1,53 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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.
+ #%]
+
+[% 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 class="field_label"><label for="milestone">Milestone:</label></th>
+ <td><input id="milestone" size="64" maxlength="64" name="milestone" value="
+ [%- milestone.name FILTER html %]"></td>
+ </tr>
+ <tr>
+ <th class="field_label"><label for="sortkey">Sortkey:</label></th>
+ <td><input id="sortkey" size="20" maxlength="20" name="sortkey" value="
+ [%- milestone.sortkey FILTER html %]"></td>
+ </tr>
+ <tr>
+ <th class="field_label"><label for="isactive">Enabled For [% terms.Bugs %]:</label></th>
+ <td><input id="isactive" name="isactive" type="checkbox" value="1"
+ [% 'checked="checked"' IF milestone.isactive %]></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..10c6f90
--- /dev/null
+++ b/template/en/default/admin/milestones/footer.html.tmpl
@@ -0,0 +1,55 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 uri %]">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 uri %]&amp;milestone=
+ [%- milestone.name FILTER uri %]">
+ '[% 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 uri %]">'[% product.name FILTER html %]'</a>.
+
+[% END %]
+
+ Edit product <a
+ href="editproducts.cgi?action=edit&amp;product=
+ [%- product.name FILTER uri %]">'[% 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..1638279
--- /dev/null
+++ b/template/en/default/admin/milestones/list.html.tmpl
@@ -0,0 +1,98 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 %]
+
+[% 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 uri %]&amp;milestone=%%name%%[% END %]
+[% delete_contentlink = BLOCK %]editmilestones.cgi?action=del&amp;product=
+ [%- product.name FILTER uri %]&amp;milestone=%%name%%[% END %]
+[% bug_count_contentlink = BLOCK %]buglist.cgi?target_milestone=%%name%%&amp;product=
+ [%- product.name FILTER uri %][% END %]
+
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit milestone..."
+ contentlink => edit_contentlink
+ },
+ {
+ name => "sortkey"
+ heading => "Sortkey"
+ },
+ {
+ name => "isactive"
+ heading => "Active"
+ yesno_field => 1
+ }
+ ]
+%]
+
+[% 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 uri %]&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..18bb88c
--- /dev/null
+++ b/template/en/default/admin/milestones/select-product.html.tmpl
@@ -0,0 +1,54 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ # products: array of product objects
+ # showbugcounts: if defined, then bug counts should be included in the table
+ #%]
+
+[% 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..c63329c
--- /dev/null
+++ b/template/en/default/admin/params/admin.html.tmpl
@@ -0,0 +1,28 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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." }
+%]
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..076d2dc
--- /dev/null
+++ b/template/en/default/admin/params/advanced.html.tmpl
@@ -0,0 +1,68 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%
+ title = "Advanced"
+ desc = "Settings for advanced configurations."
+%]
+
+[% sts_desc = BLOCK %]
+ Enables the sending of the
+ <a href="http://en.wikipedia.org/wiki/Strict_Transport_Security">Strict-Transport-Security</a>
+ header along with HTTP responses on SSL connections. This adds greater
+ security to your SSL connections by forcing the browser to always
+ access your domain over SSL and never accept an invalid certificate.
+ However, it should only be used if you have the <code>ssl_redirect</code>
+ parameter turned on, [% terms.Bugzilla %] is the only thing running
+ on its domain (i.e., your <code>urlbase</code> is something like
+ <code>http://bugzilla.example.com/</code>), and you never plan to disable
+ the <code>ssl_redirect</code> parameter.
+ <ul>
+ <li>
+ off - Don't send the Strict-Transport-Security header with requests.
+ </li>
+ <li>
+ this_domain_only - Send the Strict-Transport-Security header with all
+ requests, but only support it for the current domain.
+ </li>
+ <li>
+ include_subdomains - Send the Strict-Transport-Security header along
+ with the <code>includeSubDomains</code> flag, which will apply the
+ security change to all subdomains. This is especially useful when
+ combined with an <code>attachment_base</code> that exists as (a)
+ subdomain(s) under the main [% terms.Bugzilla %] domain.
+ </li>
+ </ul>
+[% END %]
+
+[% 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.",
+
+ strict_transport_security => sts_desc,
+} %]
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..c0c32a4
--- /dev/null
+++ b/template/en/default/admin/params/attachment.html.tmpl
@@ -0,0 +1,62 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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_desc\"><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.",
+
+ maxattachmentsize => "The maximum size (in kilobytes) of attachments to be stored " _
+ "in the database. If a file larger than this size is attached " _
+ "to ${terms.abug}, $terms.Bugzilla will look at the " _
+ "<a href=\"#maxlocalattachment\"><tt>maxlocalattachment</tt> parameter</a> " _
+ "to determine if the file can be stored locally on the web server. " _
+ "If the file size exceeds both limits, then the attachment is rejected. " _
+ "Settings both parameters to 0 will prevent attaching files to ${terms.bugs}.",
+
+ maxlocalattachment => "The maximum size (in megabytes) of attachments to be stored " _
+ "locally on the web server. If set to a value lower than the " _
+ "<a href=\"#maxattachmentsize\"><tt>maxattachmentsize</tt> parameter</a>, " _
+ "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..0a72938
--- /dev/null
+++ b/template/en/default/admin/params/auth.html.tmpl
@@ -0,0 +1,130 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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.
+ 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 regular expression to use for legal email addresses. " _
+ "The default tries to match fully qualified email addresses. " _
+ "Use <tt>.*</tt> to accept any email address following the " _
+ "<a href=\"http://tools.ietf.org/html/rfc2822#section-3.4.1\">RFC 2822</a> " _
+ "specification. 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 (case-insensitive) 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.",
+
+ password_complexity =>
+ "Set the complexity required for passwords. In all cases must the passwords " _
+ "be at least ${constants.USER_PASSWORD_MIN_LENGTH} characters long." _
+ "<ul><li>no_constraints - No complexity required.</li>" _
+ "<li>mixed_letters - Passwords must contain at least one UPPER and one lower " _
+ "case letter.</li>" _
+ "<li>letters_numbers - Passwords must contain at least one UPPER and one " _
+ "lower case letter and a number.</li>" _
+ "<li>letters_numbers_specialchars - Passwords must contain at least one " _
+ "letter, a number and a special character.</li></ul>"
+ }
+%]
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..f442c59
--- /dev/null
+++ b/template/en/default/admin/params/bugchange.html.tmpl
@@ -0,0 +1,42 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ title = "$terms.Bug Change Policies"
+ desc = "Set up $terms.bug change policies"
+%]
+
+[% accept_status = display_value('bug_status', 'IN_PROGRESS') FILTER html %]
+
+[% 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 ${field_descs.target_milestone}, do you want to require"
+ _ " that the milestone be set in order for a user to set"
+ _ " ${terms.abug}'s status to ${accept_status}?",
+
+ 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..07b2008
--- /dev/null
+++ b/template/en/default/admin/params/bugfields.html.tmpl
@@ -0,0 +1,45 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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?",
+
+ 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/common.html.tmpl b/template/en/default/admin/params/common.html.tmpl
new file mode 100644
index 0000000..bf2675b
--- /dev/null
+++ b/template/en/default/admin/params/common.html.tmpl
@@ -0,0 +1,125 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% sortlist_separator = '---' %]
+
+<dl>
+ [% FOREACH param = panel.param_list %]
+ <dt id="[% param.name FILTER html %]_desc">[% param.name FILTER html %]</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" %]
+ <input id="input_[% param.name FILTER html %]" size="80"
+ name="[% param.name FILTER html %]"
+ value="[% Param(param.name) FILTER html %]"><br>
+ [% boxSize = 7 %]
+ [% boxSize = 3 + param.choices.size IF param.choices.size < 7 %]
+ [% plist = Param(param.name).split(',') %]
+
+ <table id="table_[% param.name FILTER html %]" class="bz_default_hidden">
+ <tr>
+ <td rowspan="2">
+ <select id="select_[% param.name FILTER html %]"
+ name="select_[% param.name FILTER html %]"
+ size="[% boxSize 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 type="text/javascript">
+ bz_toggleClass("input_[% param.name FILTER html %]", "bz_default_hidden");
+ bz_toggleClass("table_[% param.name FILTER html %]", "bz_default_hidden");
+ </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">
+ Unknown param type [% param.type FILTER html %]!!!
+ </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..fd839ed
--- /dev/null
+++ b/template/en/default/admin/params/core.html.tmpl
@@ -0,0 +1,35 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%
+ 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..e8baf45
--- /dev/null
+++ b/template/en/default/admin/params/dependencygraph.html.tmpl
@@ -0,0 +1,36 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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 <kbd>checksetup.pl</kbd>
+ to recreate the .htaccess file if it has been lost."}
+%]
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..3febbab
--- /dev/null
+++ b/template/en/default/admin/params/editparams.html.tmpl
@@ -0,0 +1,103 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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', 'js/util.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 %]
+ [% Hook.process("current_panel") %]
+ <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 uri %]"
+ 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>
+ B[% %]ugzilla is developed entirely by volunteers.
+ The best way to give back to the B[% %]ugzilla 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" id="save-params" 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..daa1f35
--- /dev/null
+++ b/template/en/default/admin/params/general.html.tmpl
@@ -0,0 +1,73 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%
+ 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 <kbd>checksetup.pl</kbd> 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..7e30f07
--- /dev/null
+++ b/template/en/default/admin/params/groupsecurity.html.tmpl
@@ -0,0 +1,46 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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.",
+
+ debug_group => "The name of the group of users who can view the actual " _
+ "SQL query generated when viewing $terms.bug lists and reports.",
+
+ 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..65aa398
--- /dev/null
+++ b/template/en/default/admin/params/index.html.tmpl
@@ -0,0 +1,38 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+<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 uri %]#[% param.name FILTER uri %]_desc">
+ [% 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..64b3dbd
--- /dev/null
+++ b/template/en/default/admin/params/ldap.html.tmpl
@@ -0,0 +1,45 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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..f491a30
--- /dev/null
+++ b/template/en/default/admin/params/mta.html.tmpl
@@ -0,0 +1,67 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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"
+ _ " <kbd>checksetup.pl</kbd> 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.",
+
+ 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_ssl => "Enable SSL support for SMTP.",
+
+ 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 CONFIRMED " _
+ "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..61d32a0
--- /dev/null
+++ b/template/en/default/admin/params/patchviewer.html.tmpl
@@ -0,0 +1,51 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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..52a960b
--- /dev/null
+++ b/template/en/default/admin/params/query.html.tmpl
@@ -0,0 +1,64 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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 a moderator 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!",
+
+ search_allow_no_criteria =>
+ "Unless the code explicitly allows all $terms.bugs to be returned, this " _
+ "parameter permits to block the execution of queries with no criteria. " _
+ "When turned off, a query must have some criteria specified to limit " _
+ "the number of $terms.bugs returned to the user. When turned on, a user " _
+ "is allowed to run a query with no criteria and get all $terms.bugs he can " _
+ "see in his list. Turning this parameter on is not recommended on large " _
+ "installations.",
+
+ default_search_limit =>
+ "By default, $terms.Bugzilla limits searches done in the web"
+ _ " interface to returning only this many results, for performance"
+ _ " reasons. (This only affects the HTML format of search results--CSV,"
+ _ " XML, and other formats are exempted.) Users can click a link on the"
+ _ " search result page to see all the results."
+ _ "<p>Usually you should not have to change this--the default value"
+ _ " should be acceptable for most installations.</p>",
+
+ max_search_results =>
+ "The maximum number of $terms.bugs that a search can"
+ _ " <strong>ever</strong> return. Tabular and graphical reports"
+ _ " are exempted from this limit, however.",
+
+} %]
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..5ac291a
--- /dev/null
+++ b/template/en/default/admin/params/radius.html.tmpl
@@ -0,0 +1,43 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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_desc\">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_desc\">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_desc\">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_desc\">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..9f9f314
--- /dev/null
+++ b/template/en/default/admin/params/shadowdb.html.tmpl
@@ -0,0 +1,36 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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..ebbc363
--- /dev/null
+++ b/template/en/default/admin/params/usermatch.html.tmpl
@@ -0,0 +1,29 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ 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.",
+
+ ajax_user_autocompletion => "If this option is set, typing characters in a certain user " _
+ "fields will display a list of matches that can be selected from.",
+
+ 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..eb1094f
--- /dev/null
+++ b/template/en/default/admin/products/confirm-delete.html.tmpl
@@ -0,0 +1,259 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 uri %]">
+ [% 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 uri %]"
+ 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 uri %]">
+ 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 uri %]">
+ 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 uri %]"
+ 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 class="confirmation">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>ALL</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..6d40095
--- /dev/null
+++ b/template/en/default/admin/products/create.html.tmpl
@@ -0,0 +1,74 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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', 'js/field.js']
+ yui = [ 'autocomplete' ]
+%]
+
+[% DEFAULT
+ product.is_active = 1,
+ version = "unspecified",
+ product.defaultmilestone = constants.DEFAULT_MILESTONE
+ product.allows_unconfirmed = 1
+%]
+
+<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="20" maxlength="64" 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" checked="checked">
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2">&nbsp;</td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ This product must have at least one component.
+ You will be able to create additional components later:
+ </td>
+ </tr>
+
+ [% PROCESS "admin/components/edit-common.html.tmpl" desc_name = "comp_desc" %]
+ </table>
+
+ <input type="submit" id="add-product" 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..2b76c44
--- /dev/null
+++ b/template/en/default/admin/products/edit-common.html.tmpl
@@ -0,0 +1,72 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ # product: Bugzilla::Product object; The product
+ #
+ # classification: Bugzilla::Classifiation object; classification product is in.
+ #%]
+
+[% IF Param('useclassification') %]
+ <tr>
+ <th align="right">Classification:</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>
+
+<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 %]>
+ </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="64" maxlength="64" name="defaultmilestone"
+ value="[% product.defaultmilestone FILTER html %]">
+ [% END %]
+ </td>
+ </tr>
+[% END %]
+
+[% Hook.process('rows') %]
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..c385301
--- /dev/null
+++ b/template/en/default/admin/products/edit.html.tmpl
@@ -0,0 +1,142 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 uri %]">
+ Edit components:
+ </a>
+ </th>
+ <td>
+ [% IF product.components.size -%]
+ [% FOREACH component = product.components %]
+ <a href="editcomponents.cgi?action=edit&product=
+ [%- product.name FILTER uri %]&component=
+ [%- component.name FILTER uri %]">[% component.name FILTER html %]</a>:&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 uri %]">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 uri %]">
+ 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 uri %]">
+ 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 uri %]">
+ [% 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" id="update-product" 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..689c5c9
--- /dev/null
+++ b/template/en/default/admin/products/footer.html.tmpl
@@ -0,0 +1,79 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 uri %]
+ [% END %]
+ [% classification_url_part_start = BLOCK %]classification=
+ [%- classification.name FILTER uri %]
+ [% 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 uri %]">
+ '[% 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..fc3ad9b
--- /dev/null
+++ b/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl
@@ -0,0 +1,42 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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..889647e
--- /dev/null
+++ b/template/en/default/admin/products/groupcontrol/edit.html.tmpl
@@ -0,0 +1,303 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% title = BLOCK %]
+ Edit Group Controls for [% product.name FILTER html %]
+[% END %]
+[% PROCESS global/header.html.tmpl
+ title = title
+%]
+
+[% display_headers = 1 %]
+[% FOREACH group = product.group_controls(1).values.sort("name") %]
+ [% NEXT UNLESS group.group.isactive OR group.bug_count %]
+ [% IF display_headers %]
+ [% display_headers = 0 %]
+ <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>
+ [% END %]
+ [% IF !group.group.isactive %]
+ <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>
+ [% ELSE %]
+ <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 %]
+
+[% IF display_headers %]
+ <p>No groups are available for products.
+ [% IF user.in_group('creategroups') %]
+ <a href="editgroups.cgi?action=add">Create a new group</a>
+ [% END %]
+ </p>
+[% ELSE %]
+ </table>
+ <br>
+ <input type=submit name="submit" value="submit">
+ </form>
+[% END %]
+
+<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..5ee066c
--- /dev/null
+++ b/template/en/default/admin/products/groupcontrol/updated.html.tmpl
@@ -0,0 +1,42 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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..ea32a00
--- /dev/null
+++ b/template/en/default/admin/products/list-classifications.html.tmpl
@@ -0,0 +1,58 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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/header.html.tmpl
+ title = "Select Classification"
+%]
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit products of..."
+ contentlink => 'editproducts.cgi?classification=%%name%%'
+ },
+ {
+ 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 => 'editproducts.cgi?action=add&amp;classification=%%name%%' })
+ %]
+[% END %]
+
+[% Hook.process('before_table') %]
+
+[% 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..a5126af
--- /dev/null
+++ b/template/en/default/admin/products/list.html.tmpl
@@ -0,0 +1,86 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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
+ #%]
+
+[% IF classification %]
+ [% classification_url_part = BLOCK %]&amp;classification=
+ [%- classification.name FILTER uri %]
+ [%- END %]
+ [% classification_title = BLOCK %]
+ in classification '[% classification.name FILTER html %]'
+ [% END %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Select product $classification_title"
+%]
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit product..."
+ contentlink => 'editproducts.cgi?action=edit&amp;product=%%name%%'
+ },
+ {
+ name => "description"
+ heading => "Description"
+ allow_html_content => 1
+ },
+ {
+ name => "is_active"
+ heading => "Open For New $terms.Bugs"
+ yesno_field => 1
+ },
+] %]
+
+[% IF showbugcounts %]
+
+ [% columns.push({
+ name => "bug_count"
+ heading => "$terms.Bug Count"
+ align => 'right'
+ contentlink => 'buglist.cgi?product=%%name%%'
+ })
+ %]
+
+[% END %]
+
+[% columns.push({
+ heading => "Action"
+ content => "Delete"
+ contentlink => 'editproducts.cgi?action=del&amp;product=%%name%%'
+ })
+%]
+
+[% 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..4d22801
--- /dev/null
+++ b/template/en/default/admin/products/updated.html.tmpl
@@ -0,0 +1,90 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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']
+%]
+
+[% 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 uri %]">[% 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.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 uri %]&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 %]
+
+[% Hook.process('changes') %]
+
+[% IF !changes.keys.size %]
+ <p>Nothing changed for product '[% product.name FILTER html %]'.</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..6814662
--- /dev/null
+++ b/template/en/default/admin/sanitycheck/list.html.tmpl
@@ -0,0 +1,26 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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..bb5ca06
--- /dev/null
+++ b/template/en/default/admin/sanitycheck/messages.html.tmpl
@@ -0,0 +1,312 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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 uri %]=1&amp;token=
+ [%- issue_hash_token(['sanitycheck']) FILTER uri %]">[% 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_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&amp;token=
+ [%- issue_hash_token(['sanitycheck']) FILTER uri %]">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&amp;token=
+ [%- issue_hash_token(['sanitycheck']) FILTER uri %]">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&amp;token=
+ [%- issue_hash_token(['sanitycheck']) FILTER uri %]">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 == "profile_login_start" %]
+ Checking profile logins.
+
+ [% ELSIF san_tag == "product_alert" %]
+ Product <a href="editproducts.cgi?product=[% name FILTER html%]">
+ [%- name FILTER html %]</a> has no components or no versions.
+
+ [% ELSIF san_tag == "product_check_start" %]
+ Checking products with no components or versions.
+
+ [% 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&amp;token=
+ [%- issue_hash_token(['sanitycheck']) FILTER uri %]">Send these mails</a>.
+
+ [% 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&amp;token=
+ [%- issue_hash_token(['sanitycheck']) FILTER uri %]">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 uri %]">[% bug_id FILTER html %]</a>
+ [% ", " IF !loop.last %]
+ [% END %]
+ (<a href="buglist.cgi?bug_id=[% badbugs.join(",") FILTER uri %]">as [% terms.bug %] list</a>).
+[% END %]
+
+[% BLOCK bug_link %]
+ <a href="show_bug.cgi?id=[% bug_id FILTER uri %]">[% 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..411c527
--- /dev/null
+++ b/template/en/default/admin/settings/edit.html.tmpl
@@ -0,0 +1,93 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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..4d072f1
--- /dev/null
+++ b/template/en/default/admin/sudo.html.tmpl
@@ -0,0 +1,91 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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" size="20">
+ <input type="hidden" name="Bugzilla_login_token"
+ value="[% login_request_token FILTER html %]">
+ <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" id="begin_sudo" 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..80f6417
--- /dev/null
+++ b/template/en/default/admin/table.html.tmpl
@@ -0,0 +1,164 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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
+ #
+ #%]
+
+[%################### 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 %]
+ [% FOREACH m = contentlink.match('%%(.+?)%%', 1) %]
+ [% replacement_value = FILTER uri; row.$m; END %]
+ [% contentlink = contentlink.replace("%%$m%%", replacement_value) %]
+ [% END %]
+ <a href="[% contentlink %]">
+ [% END %]
+
+ [% IF content_use_field %]
+ [% colname = row.${c.name} %]
+ [% field_descs.${colname} FILTER html %]
+ [% ELSIF content %]
+ [% content FILTER html_light %]
+ [% ELSIF yesno_field %]
+ [% row.${c.name} ? "Yes" : "No" %]
+ [% ELSIF allow_html_content %]
+ [% row.${c.name} FILTER html_light %]
+ [% ELSE %]
+ [% row.${c.name} FILTER html %]
+ [% 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..73a72d0
--- /dev/null
+++ b/template/en/default/admin/users/confirm-delete.html.tmpl
@@ -0,0 +1,471 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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
+ # 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 uri %]">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 uri %]">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 uri %]">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 uri %]">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 || watch.watched ||
+ watch.watcher || whine_events || whine_schedules || otheruser.has_audit_entries ||
+ other_safe %]
+ <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 uri %]">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 uri %]">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 uri %]">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 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 %]
+ [% IF otheruser.has_audit_entries %]
+ <li>
+ The user has performed audited administrative tasks
+ that are logged in the database.
+ If you delete this user account, the audit log entries
+ will no longer be indentifiable.
+ </li>
+ [% END %]
+ [% Hook.process('warn_safe') %]
+ </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..354ba5f
--- /dev/null
+++ b/template/en/default/admin/users/create.html.tmpl
@@ -0,0 +1,51 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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..b75f840
--- /dev/null
+++ b/template/en/default/admin/users/edit.html.tmpl
@@ -0,0 +1,173 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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"
+ javascript_urls = [ 'js/field.js' ]
+%]
+
+[% 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>
+
+ <tr>
+ <th>Last Login:</th>
+ <td>
+ [% IF otheruser.last_seen_date %]
+ [% otheruser.last_seen_date FILTER html %]
+ [% ELSE %]
+ <em>never</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..ff23b77
--- /dev/null
+++ b/template/en/default/admin/users/list.html.tmpl
@@ -0,0 +1,111 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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'
+ }
+ {name => 'last_seen_date'
+ heading => 'Last Login'
+ }
+ {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.is_enabled ? "missing" : "bz_inactive missing") %]
+ [% overrides.realname.login_name.${thisuser.login_name} = {
+ content => "missing"
+ override_content => 1
+ class => "$classes"
+ override_class => 1
+ }
+ %]
+ [% ELSIF !thisuser.is_enabled %]
+ [% overrides.realname.login_name.${thisuser.login_name} = {
+ class => "bz_inactive"
+ override_class => 1
+ }
+ %]
+ [% END %]
+
+ [% IF !thisuser.is_enabled %]
+ [% 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..bd03113
--- /dev/null
+++ b/template/en/default/admin/users/listselectvars.html.tmpl
@@ -0,0 +1,26 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ #
+ # listselectionvalues: selection values to recreate the current user list.
+ #%]
+
+[% BLOCK listselectionurlparams %]
+ [% FOREACH field = listselectionvalues.keys %]&amp;
+ [% field FILTER uri %]=
+ [% listselectionvalues.$field FILTER uri %]
+ [% 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..9e6e48c
--- /dev/null
+++ b/template/en/default/admin/users/responsibilities.html.tmpl
@@ -0,0 +1,57 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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>
+ <th>Default CC</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 uri %]&amp;component=
+ [% component.name FILTER uri %]">
+ [% 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 %]
+ <td class="center">
+ [% component.initial_cc.contains(otheruser) ? "X" : "&nbsp;" %]
+ </td>
+ </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..c66af4c
--- /dev/null
+++ b/template/en/default/admin/users/search.html.tmpl
@@ -0,0 +1,79 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 %]
+
+<p>
+ <input type="checkbox" name="enabled_only" value="1" id="enabled_only"
+ checked="checked">
+ <label for="enabled_only">Enabled user accounts only</label>
+</p>
+
+[% Hook.process('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..ae952d1
--- /dev/null
+++ b/template/en/default/admin/users/userdata.html.tmpl
@@ -0,0 +1,109 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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
+ #%]
+
+<script type="text/javascript">
+ var disable_mail_manually_set = [% (otheruser.email_disabled ? 1 : 0) FILTER js %];
+</script>
+
+<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 uri %]">Impersonate this user</a>
+ [% END %]
+ [% END %]
+ [% ELSE %]
+ [% otheruser.login FILTER html %]
+ [% END %]
+ </td>
+</tr>
+[% IF default_authorizer.extern_id_used %]
+ <tr>
+ <th><label for="extern_id">External Login ID:</label></th>
+ <td>
+ [% IF editusers %]
+ <input size="64" maxlength="64" name="extern_id"
+ id="extern_id" value="[% otheruser.extern_id FILTER html %]">
+ [% ELSE %]
+ [% otheruser.extern_id FILTER html %]
+ [% END %]
+ </td>
+ </tr>
+[% END %]
+<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" name="password" id="password"
+ value="" autocomplete="off" />
+ [% 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 %]
+ onchange="disable_mail_manually_set=1;">
+ (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
+ onchange = "userDisabledTextOnChange(this);"
+ %]<br>
+ (If non-empty, then it will not be possible to log in using this account,
+ 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..e6f3922
--- /dev/null
+++ b/template/en/default/admin/versions/confirm-delete.html.tmpl
@@ -0,0 +1,89 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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
+ 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">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 uri %]&amp;product=
+ [%- product.name FILTER uri %]">
+ [%- version.bug_count FILTER none %]</a>
+[% ELSE %]
+ None
+[% END %]
+ </td>
+</tr>
+</table>
+
+<h2>Confirmation</h2>
+
+[% IF version.bug_count %]
+ <p class="confirmation">
+ Sorry, there
+ [% IF version.bug_count > 1 %]
+ are [% version.bug_count FILTER none %] outstanding [% terms.bugs %]
+ [% ELSE %]
+ is [% version.bug_count FILTER none %] outstanding [% terms.bug %]
+ [% END %]
+
+ for this version. You must move
+
+ [% IF version.bug_count > 1 %]
+ those [% terms.bugs %]
+ [% ELSE %]
+ that [% terms.bug %]
+ [% END %]
+ to another version before this version can be deleted.
+ </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..af72582
--- /dev/null
+++ b/template/en/default/admin/versions/create.html.tmpl
@@ -0,0 +1,40 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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..195a94c
--- /dev/null
+++ b/template/en/default/admin/versions/edit.html.tmpl
@@ -0,0 +1,47 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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.
+ #%]
+
+[% 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 class="field_label"><label for="version">Version:</label></th>
+ <td><input id="version" size="64" maxlength="64" name="version" value="
+ [%- version.name FILTER html %]"></td>
+ </tr>
+ <tr>
+ <th class="field_label"><label for="isactive">Enabled For [% terms.Bugs %]:</label></th>
+ <td><input id="isactive" name="isactive" type="checkbox" value="1"
+ [% 'checked="checked"' IF version.isactive %]></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..0af63a8
--- /dev/null
+++ b/template/en/default/admin/versions/footer.html.tmpl
@@ -0,0 +1,53 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# 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 uri %]">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 uri %]&amp;version=
+ [%- version.name FILTER uri %]">
+ '[% 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 uri %]">'[% product.name FILTER html %]'</a>.
+
+[% END %]
+
+ Edit product <a
+ href="editproducts.cgi?action=edit&amp;product=
+ [%- product.name FILTER uri %]">'[% 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..1cf3e86
--- /dev/null
+++ b/template/en/default/admin/versions/list.html.tmpl
@@ -0,0 +1,79 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ # product: object; Bugzilla::Product object representing the product to
+ # which the versions belongs.
+ #%]
+
+[% 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 uri %]&amp;version=%%name%%[% END %]
+[% delete_contentlink = BLOCK %]editversions.cgi?action=del&amp;product=
+ [%- product.name FILTER uri %]&amp;version=%%name%%[% END %]
+[% bug_count_contentlink = BLOCK %]buglist.cgi?version=%%name%%&amp;product=
+ [%- product.name FILTER uri %][% END %]
+
+
+[% columns = [
+ {
+ name => "name"
+ heading => "Edit version..."
+ contentlink => edit_contentlink
+ },
+ {
+ name => "isactive"
+ heading => "Active"
+ yesno_field => 1
+ }
+ ]
+%]
+
+[% 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 uri %]&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..e40e408
--- /dev/null
+++ b/template/en/default/admin/versions/select-product.html.tmpl
@@ -0,0 +1,54 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[%# INTERFACE:
+ # products: array of product objects
+ # showbugcounts: if defined, then bug counts should be included in the table
+ #%]
+
+[% 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..b5907d1
--- /dev/null
+++ b/template/en/default/admin/workflow/comment.html.tmpl
@@ -0,0 +1,82 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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" id="update_comment" 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..403405b
--- /dev/null
+++ b/template/en/default/admin/workflow/edit.html.tmpl
@@ -0,0 +1,100 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% 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 %]
+ [% 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" id="update_workflow" 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 %]