diff options
author | myk%mozilla.org <> | 2002-09-29 03:42:23 +0200 |
---|---|---|
committer | myk%mozilla.org <> | 2002-09-29 03:42:23 +0200 |
commit | 91b171e7584920d03abb9c45e779c84f3dee975c (patch) | |
tree | fc59becfe02d1a4dc84e5f3501f0139effcf1c7a /template | |
parent | 90975fe914d066726d06f53abe8696399b13a61a (diff) | |
download | bugzilla-91b171e7584920d03abb9c45e779c84f3dee975c.tar.gz bugzilla-91b171e7584920d03abb9c45e779c84f3dee975c.tar.xz |
Fix for bug 98801: Implementation of the request tracker, a set of enhancements to attachment statuses.
r=gerv,bbaetz
Diffstat (limited to 'template')
17 files changed, 1013 insertions, 40 deletions
diff --git a/template/en/default/account/prefs/email.html.tmpl b/template/en/default/account/prefs/email.html.tmpl index e14ea9910..5d73a357b 100644 --- a/template/en/default/account/prefs/email.html.tmpl +++ b/template/en/default/account/prefs/email.html.tmpl @@ -83,9 +83,27 @@ <tr> <td width="150"></td> <td> - <label for="ExcludeSelf">Only email me reports of changes made by other people</label> <input type="checkbox" name="ExcludeSelf" id="ExcludeSelf" value="on" [% " checked" IF excludeself %]> + <label for="ExcludeSelf">Only email me reports of changes made by other people</label> + <br> + </td> + </tr> + <tr> + <td width="150"></td> + <td> + <input type="checkbox" name="FlagRequestee" id="FlagRequestee" value="on" + [% " checked" IF FlagRequestee %]> + <label for="FlagRequestee">Email me when someone asks me to set a flag</label> + <br> + </td> + </tr> + <tr> + <td width="150"></td> + <td> + <input type="checkbox" name="FlagRequester" id="FlagRequester" value="on" + [% " checked" IF FlagRequester %]> + <label for="FlagRequester">Email me when someone sets a flag I asked for</label> <br> </td> </tr> 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 000000000..b022e621e --- /dev/null +++ b/template/en/default/admin/flag-type/confirm-delete.html.tmpl @@ -0,0 +1,58 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] + +[%# Filter off the name here to be used multiple times below %] +[% name = BLOCK %][% flag_type.name FILTER html %][% END %] + +[% PROCESS global/header.html.tmpl + title = "Confirm Deletion of Flag Type '$name'" +%] + +<p> + There are [% flag_count %] flags of type [% name %]. + If you delete this type, those flags will also be deleted. Note that + instead of deleting the type you can + <a href="editflagtypes.cgi?action=deactivate&id=[% flag_type.id %]">deactivate it</a>, + in which case the type and its flags will remain in the database + but will not appear in the 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&id=[% flag_type.id %]"> + 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 000000000..ca01f6365 --- /dev/null +++ b/template/en/default/admin/flag-type/edit.html.tmpl @@ -0,0 +1,189 @@ +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] + +[%# The javascript and header_html blocks get used in header.html.tmpl. %] +[% javascript = BLOCK %] + var usetms = 0; // do we have target milestone? + var first_load = 1; // is this the first time we load the page? + var last_sel = []; // caches last selection + var cpts = new Array(); + [% FOREACH p = products %] + cpts['[% p FILTER js %]'] = [ + [%- FOREACH item = components_by_product.$p %]'[% item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ]; + [% END %] +[% END %] + +[% header_html = BLOCK %] + <script language="JavaScript" type="text/javascript" src="productmenu.js"></script> +[% END %] + +[% IF type.target_type == "bug" %] + [% title = "Create Flag Type for Bugs" %] +[% ELSE %] + [% title = "Create Flag Type for Attachments" %] +[% END %] + +[% IF last_action == "copy" %] + [% title = "Create Flag Type Based on $type.name" %] +[% ELSIF last_action == "edit" %] + [% title = "Edit Flag Type $type.name" %] +[% 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="selectProduct(forms[0], 'product', 'component', '__Any__');" +%] + +<form method="post" action="editflagtypes.cgi"> + <input type="hidden" name="action" value="[% action %]"> + <input type="hidden" name="id" value="[% type.id %]"> + <input type="hidden" name="target_type" value="[% type.target_type %]"> + [% FOREACH category = type.inclusions %] + <input type="hidden" name="inclusions" value="[% category %]"> + [% END %] + [% FOREACH category = type.exclusions %] + <input type="hidden" name="exclusions" value="[% category %]"> + [% END %] + + <table id="form" cellspacing="0" cellpadding="4" border="0"> + <tr> + <th>Name:</th> + <td> + a short name identifying this type<br> + <input type="text" name="name" value="[% type.name FILTER html %]" + size="50" maxlength="50"> + </td> + </tr> + + <tr> + <th>Description:</th> + <td> + a comprehensive description of this type<br> + <textarea name="description" rows="4" cols="80">[% type.description FILTER html %]</textarea> + </td> + </tr> + + <tr> + <th>Category:</th> + <td> + the products/components to which [% type.target_type %]s must + (inclusions) or must not (exclusions) belong in order for users + to be able to set flags of this type for them + <table> + <tr> + <td style="vertical-align: top;"> + <b>Product/Component:</b><br> + <select name="product" onChange="selectProduct(this.form, 'product', 'component', '__Any__');"> + <option value="">__Any__</option> + [% FOREACH item = products %] + <option value="[% item %]" [% "selected" IF type.product.name == item %]>[% item %]</option> + [% END %] + </select><br> + <select name="component"> + <option value="">__Any__</option> + [% FOREACH item = components %] + <option value="[% item %]" [% "selected" IF type.component.name == item %]>[% item %]</option> + [% END %] + </select><br> + <input type="submit" name="categoryAction" value="Include"> + <input type="submit" name="categoryAction" value="Exclude"> + </td> + <td style="vertical-align: top;"> + <b>Inclusions:</b><br> + [% PROCESS "global/select-menu.html.tmpl" name="inclusion_to_remove" multiple=1 size=4 options=type.inclusions %]<br> + <input type="submit" name="categoryAction" value="Remove Inclusion"> + </td> + <td style="vertical-align: top;"> + <b>Exclusions:</b><br> + [% PROCESS "global/select-menu.html.tmpl" name="exclusion_to_remove" multiple=1 size=4 options=type.exclusions %]<br> + <input type="submit" name="categoryAction" value="Remove Exclusion"> + </td> + </tr> + </table> + </td> + </tr> + + <tr> + <th>Sort Key:</th> + <td> + a number between 1 and 32767 by which this type will be sorted + when displayed to users in a list; ignore if you don't care + what order the types appear in or if you want them to appear + in alphabetical order<br> + <input type="text" name="sortkey" value="[% type.sortkey || 1 %]" size="5" maxlength="5"> + </td> + </tr> + + <tr> + <th> </th> + <td> + <input type="checkbox" name="is_active" [% "checked" IF type.is_active || !type.is_active.defined %]> + active (flags of this type appear in the UI and can be set) + </td> + </tr> + + <tr> + <th> </th> + <td> + <input type="checkbox" name="is_requestable" [% "checked" IF type.is_requestable || !type.is_requestable.defined %]> + requestable (users can ask for flags of this type to be set) + </td> + </tr> + + <tr> + <th>CC List:</th> + <td> + if requestable, who should get carbon copied on email notification of requests<br> + <input type="text" name="cc_list" value="[% type.cc_list FILTER html %]" size="80" maxlength="200"> + </td> + </tr> + + <tr> + <th> </th> + <td> + <input type="checkbox" name="is_requesteeble" [% "checked" IF type.is_requesteeble || !type.is_requesteeble.defined %]> + specifically requestable (users can ask specific other users to set flags of this type as opposed to just asking the wind) + </td> + </tr> + + <tr> + <th> </th> + <td> + <input type="checkbox" name="is_multiplicable" [% "checked" IF type.is_multiplicable || !type.is_multiplicable.defined %]> + multiplicable (multiple flags of this type can be set on the same [% type.target_type %]) + </td> + </tr> + + <tr> + <th></th> + <td> + <input type="submit" value="[% (last_action == "enter" || last_action == "copy") ? "Create" : "Save Changes" %]"> + </td> + </tr> + + </table> + +</form> + +[% PROCESS global/footer.html.tmpl %] 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 000000000..76a835639 --- /dev/null +++ b/template/en/default/admin/flag-type/list.html.tmpl @@ -0,0 +1,107 @@ +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] + +[% PROCESS global/header.html.tmpl + title = 'Administer Flag Types' + style = " + table#flag_types tr th { text-align: left; } + .inactive { color: #787878; } + " +%] + +<p> + Flags are markers that identify whether a bug 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> + +<h3>Flag Types for Bugs</h3> + +[% PROCESS display_flag_types types=bug_types %] + +<p> + <a href="editflagtypes.cgi?action=enter&target_type=bug">Create Flag Type for Bugs</a> +</p> + +<h3>Flag Types for Attachments</h3> + +[% PROCESS display_flag_types types=attachment_types %] + +<p> + <a href="editflagtypes.cgi?action=enter&target_type=attachment">Create Flag Type For Attachments</a> +</p> + +<script language="JavaScript"> + <!-- + function confirmDelete(id, name, count) + { + if (count > 0) { + var msg = 'There are ' + count + ' flags of type ' + name + '. ' + + 'If you delete this type, those flags will also be ' + + 'deleted.\n\nNote: to deactivate the type instead ' + + 'of deleting it, edit it and uncheck its "is active" ' + + 'flag.\n\nDo you really want to delete this flag type?'; + if (!confirm(msg)) return false; + } + location.href = "editflagtypes.cgi?action=delete&id=" + id; + return false; // prevent strict JavaScript warning that this function + // does not always return a value + } + //--> +</script> + +[% PROCESS global/footer.html.tmpl %] + + +[% BLOCK display_flag_types %] + <table id="flag_types" cellspacing="0" cellpadding="4" border="1"> + + <tr> + <th>Name</th> + <th>Description</th> + <th>Actions</th> + </tr> + + [% FOREACH type = types %] + + <tr class="[% type.is_active ? "active" : "inactive" %]"> + <td>[% type.name FILTER html %]</td> + <td>[% type.description FILTER html %]</td> + <td> + <a href="editflagtypes.cgi?action=edit&id=[% type.id %]">Edit</a> + | <a href="editflagtypes.cgi?action=copy&id=[% type.id %]">Copy</a> + | <a href="editflagtypes.cgi?action=confirmdelete&id=[% type.id %]" + onclick="return confirmDelete([% type.id %], '[% type.name FILTER js %]', + [% type.flag_count %]);">Delete</a> + </td> + </tr> + + [% END %] + + </table> +[% END %] diff --git a/template/en/default/attachment/edit.html.tmpl b/template/en/default/attachment/edit.html.tmpl index ec2616bf9..32449f041 100644 --- a/template/en/default/attachment/edit.html.tmpl +++ b/template/en/default/attachment/edit.html.tmpl @@ -32,6 +32,8 @@ table.attachment_info th { text-align: right; vertical-align: top; } table.attachment_info td { text-align: left; vertical-align: top; } #noview { text-align: left; vertical-align: center; } + + table#flags th, table#flags td { font-size: small; vertical-align: baseline; } " %] @@ -158,8 +160,7 @@ <b>MIME Type:</b><br> <input type="text" size="20" name="contenttypeentry" value="[% contenttype FILTER html %]"><br> - - <b>Flags:</b><br> + <input type="checkbox" id="ispatch" name="ispatch" value="1" [% 'checked="checked"' IF ispatch %]> <label for="ispatch">patch</label> @@ -168,20 +169,14 @@ <label for="isobsolete">obsolete</label><br> [% IF (Param("insidergroup") && UserInGroup(Param("insidergroup"))) %] <input type="checkbox" name="isprivate" value="1"[% " checked" IF isprivate %]> private<br><br> + [% ELSE %]<br> [% END %] - [% IF statusdefs.size %] - <b>Status:</b><br> - [% FOREACH def = statusdefs %] - <input type="checkbox" id="status-[% def.id %]" name="status" - value="[% def.id %]" - [% 'checked="checked"' IF statuses.${def.id} %]> - <label for="status-[% def.id %]"> - [% def.name FILTER html %] - </label><br> - [% END %] + [% IF flag_types.size > 0 %] + <b>Flags:</b><br> + [% PROCESS "flag/list.html.tmpl" bug_id=bugid attach_id=attachid %]<br> [% END %] - + <div id="smallCommentFrame"> <b>Comment (on the bug):</b><br> <textarea name="comment" rows="5" cols="25" wrap="soft"></textarea><br> diff --git a/template/en/default/attachment/list.html.tmpl b/template/en/default/attachment/list.html.tmpl index e7aa8b0ef..59f749695 100644 --- a/template/en/default/attachment/list.html.tmpl +++ b/template/en/default/attachment/list.html.tmpl @@ -19,13 +19,18 @@ # Contributor(s): Myk Melez <myk@mozilla.org> #%] +[%# Whether or not to include flags. %] +[% display_flags = num_attachment_flag_types > 0 %] + <br> <table cellspacing="0" cellpadding="4" border="1"> <tr> <th bgcolor="#cccccc" align="left">Attachment</th> <th bgcolor="#cccccc" align="left">Type</th> <th bgcolor="#cccccc" align="left">Created</th> - <th bgcolor="#cccccc" align="left">Status</th> + [% IF display_flags %] + <th bgcolor="#cccccc" align="left">Flags</th> + [% END %] <th bgcolor="#cccccc" align="left">Actions</th> </tr> [% canseeprivate = !Param("insidergroup") || UserInGroup(Param("insidergroup")) %] @@ -50,16 +55,24 @@ <td valign="top">[% attachment.date %]</td> - <td valign="top"> - [% IF attachment.statuses.size == 0 %] - <i>none</i> - [% ELSE %] - [% FOREACH s = attachment.statuses %] - [% s FILTER html FILTER replace('\s', ' ') %]<br> + [% IF display_flags %] + <td valign="top"> + [% IF attachment.flags.size == 0 %] + <i>none</i> + [% ELSE %] + [% FOR flag = attachment.flags %] + [% IF flag.setter %] + [% flag.setter.nick FILTER html %]: + [% END %] + [%+ flag.type.name %][% flag.status %] + [%+ IF flag.status == "?" && flag.requestee %] + ([% flag.requestee.nick %]) + [% END %]<br> + [% END %] [% END %] - [% END %] - </td> - + </td> + [% END %] + <td valign="top"> [% IF attachment.canedit %] <a href="attachment.cgi?id=[% attachment.attachid %]&action=edit">Edit</a> @@ -72,7 +85,7 @@ [% END %] <tr> - <td colspan="4"> + <td colspan="[% display_flags ? 4 : 3 %]"> <a href="attachment.cgi?bugid=[% bugid %]&action=enter">Create a New Attachment</a> (proposed patch, testcase, etc.) </td> <td colspan="1"> diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl index 9cf33b8b5..ef9ec2d7f 100644 --- a/template/en/default/bug/edit.html.tmpl +++ b/template/en/default/bug/edit.html.tmpl @@ -194,7 +194,7 @@ [% END %] </tr> -[%# *** QAContact URL Summary Whiteboard Keywords *** %] +[%# *** QAContact URL Requests Summary Whiteboard Keywords *** %] [% IF Param('useqacontact') %] <tr> @@ -218,17 +218,23 @@ [% END %] </b> </td> - <td colspan="7"> + <td colspan="5"> <input name="bug_file_loc" accesskey="u" value="[% bug.bug_file_loc FILTER html %]" size="60"> </td> + <td rowspan="4" colspan="2" valign="top"> + [% IF flag_types.size > 0 %] + <b>Flags:</b><br> + [% PROCESS "flag/list.html.tmpl" %] + [% END %] + </td> </tr> <tr> <td align="right"> <b><u>S</u>ummary:</b> </td> - <td colspan="7"> + <td colspan="5"> <input name="short_desc" accesskey="s" value="[% bug.short_desc FILTER html %]" size="60"> </td> @@ -239,7 +245,7 @@ <td align="right"> <b>Status <u>W</u>hiteboard:</b> </td> - <td colspan="7"> + <td colspan="5"> <input name="status_whiteboard" accesskey="w" value="[% bug.status_whiteboard FILTER html %]" size="60"> </td> @@ -252,7 +258,7 @@ <b> <a href="describekeywords.cgi"><u>K</u>eywords</a>: </b> - <td colspan="7"> + <td colspan="5"> <input name="keywords" accesskey="k" value="[% bug.keywords.join(', ') FILTER html %]" size="60"> </td> @@ -263,8 +269,8 @@ [%# *** Attachments *** %] [% PROCESS attachment/list.html.tmpl - attachments = bug.attachments - bugid = bug.bug_id %] + attachments = bug.attachments + bugid = bug.bug_id %] [%# *** Dependencies Votes *** %] diff --git a/template/en/default/flag/list.html.tmpl b/template/en/default/flag/list.html.tmpl new file mode 100644 index 000000000..951f248db --- /dev/null +++ b/template/en/default/flag/list.html.tmpl @@ -0,0 +1,94 @@ +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] + +<table id="flags"> + + [% FOREACH type = flag_types %] + [% FOREACH flag = type.flags %] + <tr> + <td> + [% flag.setter.nick FILTER html %]: + </td> + <td> + [% type.name FILTER html %] + </td> + <td> + <select name="flag-[% flag.id %]"> + <option value="X"></option> + <option value="+" [% "selected" IF flag.status == "+" %]>+</option> + <option value="-" [% "selected" IF flag.status == "-" %]>-</option> + <option value="?" [% "selected" IF flag.status == "?" %]>?</option> + </select> + </td> + <td> + [% IF flag.status == "?" && flag.requestee %]([% flag.requestee.nick FILTER html %])[% END %] + </td> + </tr> + [% END %] + [% IF !type.flags || type.flags.size == 0 %] + <tr> + <td> </td> + <td>[% type.name %]</td> + <td> + <select name="flag_type-[% type.id %]"> + <option value="X"></option> + <option value="+">+</option> + <option value="-">-</option> + [% IF type.is_requestable %] + <option value="?">?</option> + [% END %] + </select> + </td> + <td> + [% IF type.is_requestable && type.is_requesteeble %] + (<input type="text" name="requestee-[% type.id %]" size="8" maxlength="255">) + [% END %] + </td> + </tr> + [% END %] + [% END %] + + [% FOREACH type = flag_types %] + [% NEXT UNLESS type.flags.size > 0 && type.is_multiplicable %] + [% IF !separator_displayed %] + <tr><td colspan="3"><hr></td></tr> + [% separator_displayed = 1 %] + [% END %] + <tr> + <td colspan="2">addl. [% type.name %]</td> + <td> + <select name="flag_type-[% type.id %]"> + <option value="X"></option> + <option value="+">+</option> + <option value="-">-</option> + [% IF type.is_requestable %] + <option value="?">?</option> + [% END %] + </select> + </td> + <td> + [% IF type.is_requestable && type.is_requesteeble %] + (<input type="text" name="requestee-[% type.id %]" size="8" maxlength="255">) + [% END %] + </td> + </tr> + [% END %] + +</table> diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl index bf93977ad..1981364f1 100644 --- a/template/en/default/global/code-error.html.tmpl +++ b/template/en/default/global/code-error.html.tmpl @@ -40,6 +40,10 @@ to any [% parameters %] which you may have set before calling ThrowCodeError. + [% ELSIF error == "action_unrecognized" %] + I don't recognize the value (<em>[% variables.action FILTER html %]</em>) + of the <em>action</em> variable. + [% ELSIF error == "attachment_already_obsolete" %] Attachment #[% attachid FILTER html %] ([% description FILTER html %]) is already obsolete. @@ -78,10 +82,40 @@ [% ELSIF error == "no_bug_data" %] No data when fetching bug [% bug_id %]. + [% ELSIF error == "flag_nonexistent" %] + There is no flag with ID #[% variables.id %]. + + [% ELSIF error == "flag_status_invalid" %] + The flag status <em>[% variables.status FILTER html %]</em> is invalid. + + [% ELSIF error == "flag_type_component_nonexistent" %] + The component <em>[% variables.component FILTER html %] does not exist + in the product <em>[% variables.product FILTER html %]</em>. + + [% ELSIF error == "flag_type_component_without_product" %] + A component was selected without a product being selected. + + [% ELSIF error == "flag_type_id_invalid" %] + The flag type ID <em>[% variables.id FILTER html %]</em> is not + a positive integer. + + [% ELSIF error == "flag_type_nonexistent" %] + There is no flag type with the ID <em>[% variables.id %]</em>. + + [% ELSIF error == "flag_type_product_nonexistent" %] + The product <em>[% variables.product FILTER html %]</em> does not exist. + + [% ELSIF error == "flag_type_target_type_invalid" %] + The target type was neither <em>bug</em> nor <em>attachment</em> + but rather <em>[% variables.target_type FILTER html %]</em>. + [% ELSIF error == "no_y_axis_defined" %] No Y axis was defined when creating report. The X axis is optional, but the Y axis is compulsory. + [% ELSIF error == "request_queue_group_invalid" %] + The group field <em>[% group FILTER html %]</em> is invalid. + [% ELSIF error == "template_error" %] [% template_error_msg %] @@ -91,6 +125,14 @@ [% ELSIF error == "unknown_action" %] Unknown action [% action FILTER html %]! + [% ELSIF error == "unknown_component" %] + [% title = "Unknown Component" %] + There is no component named <em>[% variables.component FILTER html %]</em>. + + [% ELSIF error == "unknown_product" %] + [% title = "Unknown Product" %] + There is no product named <em>[% variables.product FILTER html %]</em>. + [% ELSE %] [%# Give sensible error if error functions are used incorrectly. #%] diff --git a/template/en/default/global/messages.html.tmpl b/template/en/default/global/messages.html.tmpl index 584c4a93e..85c678fdc 100644 --- a/template/en/default/global/messages.html.tmpl +++ b/template/en/default/global/messages.html.tmpl @@ -81,6 +81,34 @@ [% title = "Password Changed" %] Your password has been changed. + [% ELSIF message_tag == "flag_type_created" %] + [% title = "Flag Type Created" %] + The flag type <em>[% name FILTER html %]</em> has been created. + <a href="editflagtypes.cgi">Back to flag types.</a> + + [% ELSIF message_tag == "flag_type_changes_saved" %] + [% title = "Flag Type Changes Saved" %] + <p> + Your changes to the flag type <em>[% name FILTER html %]</em> + have been saved. + <a href="editflagtypes.cgi">Back to flag types.</a> + </p> + + [% ELSIF message_tag == "flag_type_deleted" %] + [% title = "Flag Type Deleted" %] + <p> + The flag type <em>[% name FILTER html %]</em> has been deleted. + <a href="editflagtypes.cgi">Back to flag types.</a> + </p> + + [% ELSIF message_tag == "flag_type_deactivated" %] + [% title = "Flag Type Deactivated" %] + <p> + The flag type <em>[% flag_type.name FILTER html %]</em> + has been deactivated. + <a href="editflagtypes.cgi">Back to flag types.</a> + </p> + [% ELSIF message_tag == "shutdown" %] [% title = "Bugzilla is Down" %] [% Param("shutdownhtml") %] diff --git a/template/en/default/global/select-menu.html.tmpl b/template/en/default/global/select-menu.html.tmpl index c27f60e8b..7b7fddb29 100644 --- a/template/en/default/global/select-menu.html.tmpl +++ b/template/en/default/global/select-menu.html.tmpl @@ -22,12 +22,18 @@ [%# INTERFACE: # name: string; the name of the menu. # + # multiple: boolean; whether or not the menu is multi-select + # + # size: integer; if multi-select, the number of items to display at once + # # options: array or hash; the items with which to populate the array. # If a hash is passed, the hash keys become the names displayed # to the user while the hash values become the value of the item. # # default: string; the item selected in the menu by default. # + # onchange: code; JavaScript to be run when the user changes the value + # selected in the menu. #%] [%# Get the scalar representation of the options reference, @@ -37,7 +43,9 @@ #%] [% options_type = BLOCK %][% options %][% END %] -<select name="[% name FILTER html %]"> +<select name="[% name FILTER html %]" + [% IF onchange %]onchange="[% onchange %]"[% END %] + [% IF multiple %] multiple [% IF size %] size="[% size %]" [% END %] [% END %]> [% IF options_type.search("ARRAY") %] [% FOREACH value = options %] <option value="[% value FILTER html %]" @@ -45,7 +53,7 @@ [% value FILTER html %] </option> [% END %] - [% ELSIF values_type.search("HASH") %] + [% ELSIF options_type.search("HASH") %] [% FOREACH option = options %] <option value="[% option.value FILTER html %]" [% " selected" IF option.value == default %]> diff --git a/template/en/default/global/useful-links.html.tmpl b/template/en/default/global/useful-links.html.tmpl index 1e5b09df1..785a9d75e 100644 --- a/template/en/default/global/useful-links.html.tmpl +++ b/template/en/default/global/useful-links.html.tmpl @@ -50,6 +50,8 @@ <input name="id" size="6"> | <a href="reports.cgi">Reports</a> + + | <a href="request.cgi">Requests</a> [% IF user.login && Param('usevotes') %] | <a href="votes.cgi?action=show_user">My Votes</a> @@ -68,7 +70,7 @@ || user.canblessany %] [% ', <a href="editproducts.cgi">products</a>' IF user.groups.editcomponents %] - [% ', <a href="editattachstatuses.cgi"> attachment statuses</a>' + [% ', <a href="editflagtypes.cgi">flags</a>' IF user.groups.editcomponents %] [% ', <a href="editgroups.cgi">groups</a>' IF user.groups.creategroups %] diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl index c6f970df3..c9dca30d4 100644 --- a/template/en/default/global/user-error.html.tmpl +++ b/template/en/default/global/user-error.html.tmpl @@ -30,7 +30,7 @@ #%] [% DEFAULT title = "Error" %] - + [% error_message = BLOCK %] [% IF error == "aaa_example_error_tag" %] [% title = "Example Error" %] @@ -75,6 +75,10 @@ Bug aliases cannot be longer than 20 characters. Please choose a shorter alias. + [% ELSIF error == "authorization_failure" %] + [% title = "Authorization Failed" %] + You are not allowed to [% action %]. + [% ELSIF error == "attachment_access_denied" %] [% title = "Access Denied" %] You are not permitted access to this attachment. @@ -129,6 +133,23 @@ format like JPG or PNG, or put it elsewhere on the web and link to it from the bug's URL field or in a comment on the bug. + [% ELSIF error == "flag_type_cc_list_invalid" %] + [% title = "Flag Type CC List Invalid" %] + The CC list [% cc_list FILTER html %] must be less than 200 characters long. + + [% ELSIF error == "flag_type_description_invalid" %] + [% title = "Flag Type Description Invalid" %] + The description must be less than 32K. + + [% ELSIF error == "flag_type_name_invalid" %] + [% title = "Flag Type Name Invalid" %] + The name <em>[% name FILTER html %]</em> must be 1-50 characters long. + + [% ELSIF error == "flag_type_sortkey_invalid" %] + [% title = "Flag Type Sort Key Invalid" %] + The sort key must be an integer between 0 and 32767 inclusive. + It cannot be <em>[% variables.sortkey %]</em>. + [% ELSIF error == "illegal_at_least_x_votes" %] [% title = "Your Query Makes No Sense" %] The <em>At least ___ votes</em> field must be a simple number. @@ -176,10 +197,6 @@ [% title = "Invalid Attachment ID" %] The attachment id [% attach_id FILTER html %] is invalid. - [% ELSIF error == "invalid_attach_status" %] - [% title = "Invalid Attachment Status" %] - One of the statuses you entered is not a valid status for this attachment. - [% ELSIF error == "invalid_content_type" %] [% title = "Invalid Content-Type" %] The content type <em>[% contenttype FILTER html %]</em> is invalid. @@ -281,6 +298,18 @@ intentionally cleared out the "Reassign bug to" field, [% Param("browserbugmessage") %] + [% ELSIF error == "requestee_too_short" %] + [% title = "Requestee Name Too Short" %] + One or two characters match too many users, so please enter at least + three characters of the name/email address of the user you want to set + the flag. + + [% ELSIF error == "requestee_too_many_matches" %] + [% title = "Requestee String Matched Too Many Times" %] + The string <em>[% requestee FILTER html %]</em> matched more than + 100 users. Enter more of the name to bring the number of matches + down to a reasonable amount. + [% ELSIF error == "unknown_keyword" %] [% title = "Unknown Keyword" %] <code>[% keyword FILTER html %]</code> is not a known keyword. diff --git a/template/en/default/request/created-email.txt.tmpl b/template/en/default/request/created-email.txt.tmpl new file mode 100644 index 000000000..3edf10786 --- /dev/null +++ b/template/en/default/request/created-email.txt.tmpl @@ -0,0 +1,41 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] +From: bugzilla-request-daemon +To: [% flag.requestee.email IF flag.requestee.email_prefs.FlagRequestee %] +CC: [% flag.type.cc_list %] +Subject: [% flag.type.name %]: [Bug [% flag.target.bug.id %]] [% flag.target.bug.summary %] +[%- IF flag.target.attachment.exists %] : + [Attachment [% flag.target.attachment.id %]] [% flag.target.attachment.summary %][% END %] + +[%+ USE wrap -%] +[%- FILTER bullet = wrap(80) -%] +[% flag.setter.identity %] has asked you for [% flag.type.name %] on bug # + [%- flag.target.bug.id %] ([% flag.target.bug.summary %]) +[%- IF flag.target.attachment.exists %], attachment # + [%- flag.target.attachment.id %] ([% flag.target.attachment.summary %])[% END %]. + +[%+ IF flag.target.type == 'bug' -%] + [% Param('urlbase') %]show_bug.cgi?id=[% flag.target.bug.id %] +[%- ELSIF flag.target.type == 'attachment' -%] + [% Param('urlbase') %]attachment.cgi?id=[% flag.target.attachment.id %]&action=edit +[%- END %] + +[%- END %] diff --git a/template/en/default/request/fulfilled-email.txt.tmpl b/template/en/default/request/fulfilled-email.txt.tmpl new file mode 100644 index 000000000..84608c546 --- /dev/null +++ b/template/en/default/request/fulfilled-email.txt.tmpl @@ -0,0 +1,42 @@ +[%# 1.0@bugzilla.org %] +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] +[% statuses = { '+' => "approved" , '-' => 'denied' , 'X' => "cancelled" } %] +From: bugzilla-request-daemon +To: [% flag.setter.email IF flag.setter.email_prefs.FlagRequester %] +CC: [% flag.type.cc_list %] +Subject: [% flag.type.name %]: [Bug [% flag.target.bug.id %]] [% flag.target.bug.summary %] +[%- IF flag.target.attachment.exists %] : + [Attachment [% flag.target.attachment.id %]] [% flag.target.attachment.summary %][% END %] + +[%+ USE wrap -%] +[%- FILTER bullet = wrap(80) -%] +[% user.realname %] <[% user.login %]> has [% statuses.${flag.status} %] your request for [% flag.type.name %] on bug # + [%- flag.target.bug.id %] ([% flag.target.bug.summary %]) +[%- IF flag.target.attachment.exists %], attachment # + [%- flag.target.attachment.id %] ([% flag.target.attachment.summary %])[% END %]. + +[%+ IF flag.target.type == 'bug' -%] + [% Param('urlbase') %]show_bug.cgi?id=[% flag.target.bug.id %] +[%- ELSIF flag.target.type == 'attachment' -%] + [% Param('urlbase') %]attachment.cgi?id=[% flag.target.attachment.id %]&action=edit +[%- END %] + +[%- END %] diff --git a/template/en/default/request/queue.html.tmpl b/template/en/default/request/queue.html.tmpl new file mode 100644 index 000000000..14f244ab3 --- /dev/null +++ b/template/en/default/request/queue.html.tmpl @@ -0,0 +1,193 @@ +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] + +[%# The javascript and header_html blocks get used in header.html.tmpl. %] +[% javascript = BLOCK %] + var usetms = 0; // do we have target milestone? + var first_load = 1; // is this the first time we load the page? + var last_sel = []; // caches last selection + var cpts = new Array(); + [% FOREACH p = products %] + cpts['[% p FILTER js %]'] = [ + [%- FOREACH item = components_by_product.$p %]'[% item FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ]; + [% END %] +[% END %] + +[% header_html = BLOCK %] + <script language="JavaScript" type="text/javascript" src="productmenu.js"></script> +[% END %] + +[% PROCESS global/header.html.tmpl + title="Request Queue" + style = " + table.requests th { text-align: left; } + table#filter th { text-align: right; } + " +%] + +[% column_headers = { + "type" => "Flag" , + "status" => "Status" , + "bug" => "Bug" , + "attachment" => "Attachment" , + "requester" => "Requester" , + "requestee" => "Requestee" , + "created" => "Created" , + "category" => "Product/Component" } %] + +[% DEFAULT display_columns = ["requester", "requestee", "type", "bug", "attachment", "created"] + group_field = "Requestee" + group_value = "" +%] + +[% IF requests.size == 0 %] + <p> + No requests. + </p> +[% ELSE %] + [% FOREACH request = requests %] + [% PROCESS start_new_table IF request.$group_field != group_value %] + <tr> + [% FOREACH column = display_columns %] + [% NEXT IF column == group_field || excluded_columns.contains(column) %] + <td>[% PROCESS "display_$column" %]</td> + [% END %] + </tr> + [% END %] + </table> +[% END %] + +<h3>Filter the Queue</h3> + +<form action="request.cgi" method="get"> + <input type="hidden" name="action" value="queue"> + + <table id="filter"> + <tr> + <th>Requester:</th> + <td><input type="text" name="requester" value="[% form.requester FILTER html %]" size="20"></td> + <th>Product:</th> + <td> + <select name="product" onChange="selectProduct(this.form, 'product', 'component', 'Any');"> + <option value="">Any</option> + [% FOREACH item = products %] + <option value="[% item FILTER html %]" + [% "selected" IF form.product == item %]>[% item FILTER html %]</option> + [% END %] + </select> + </td> + <th>Flag:</th> + <td> + [% PROCESS "global/select-menu.html.tmpl" + name="type" + options=types + default=form.type %] + </td> + + [%# We could let people see a "queue" of non-pending requests. %] + <!-- + <th>Status:</th> + <td> + [%# PROCESS "global/select-menu.html.tmpl" + name="status" + options=["all", "?", "+-", "+", "-"] + default=form.status %] + </td> + --> + + </tr> + <tr> + <th>Requestee:</th> + <td><input type="text" name="requestee" value="[% form.requestee FILTER html %]" size="20"></td> + <th>Component:</th> + <td> + <select name="component"> + <option value="">Any</option> + [% FOREACH item = components %] + <option value="[% item FILTER html %]" [% "selected" IF form.component == item %]> + [% item FILTER html %]</option> + [% END %] + </select> + </td> + <th>Group By:</th> + <td> + [% groups = { + "Requester" => 'requester' , + "Requestee" => 'requestee', + "Flag" => 'type' , + "Product/Component" => 'category' + } %] + [% PROCESS "global/select-menu.html.tmpl" name="group" options=groups default=form.group %] + </td> + <td><input type="submit" value="Filter"></td> + </tr> + </table> + +</form> + +[% PROCESS global/footer.html.tmpl %] + +[% BLOCK start_new_table %] + [% "</table>" UNLESS group_value == "" %] + <h3>[% column_headers.$group_field %]: [% request.$group_field FILTER html %]</h3> + <table class="requests" cellspacing="0" cellpadding="4" border="1"> + <tr> + [% FOREACH column = display_columns %] + [% NEXT IF column == group_field || excluded_columns.contains(column) %] + <th>[% column_headers.$column %]</th> + [% END %] + </tr> + [% group_value = request.$group_field %] +[% END %] + +[% BLOCK display_type %] + [% request.type FILTER html %] +[% END %] + +[% BLOCK display_status %] + [% request.status %] +[% END %] + +[% BLOCK display_bug %] + <a href="show_bug.cgi?id=[% request.bug_id %]"> + [% request.bug_id %]: [%+ request.bug_summary FILTER html %]</a> +[% END %] + +[% BLOCK display_attachment %] + [% IF request.attach_id %] + <a href="attachment.cgi?id=[% request.attach_id %]&action=edit"> + [% request.attach_id %]: [%+ request.attach_summary FILTER html %]</a> + [% ELSE %] + N/A + [% END %] +[% END %] + +[% BLOCK display_requestee %] + [% request.requestee FILTER html %] +[% END %] + +[% BLOCK display_requester %] + [% request.requester FILTER html %] +[% END %] + +[% BLOCK display_created %] + [% request.created FILTER html %] +[% END %] + diff --git a/template/en/default/request/verify.html.tmpl b/template/en/default/request/verify.html.tmpl new file mode 100644 index 000000000..ad4c07d2c --- /dev/null +++ b/template/en/default/request/verify.html.tmpl @@ -0,0 +1,108 @@ +<!-- 1.0@bugzilla.org --> +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Myk Melez <myk@mozilla.org> + #%] + +[%# INTERFACE: + # form, mform: hashes; the form values submitted to the script, used by + # hidden-fields to generate hidden form fields replicating + # the original form + # flags: array; the flags the user made, including information about + # potential requestees for those flags (based on + # the string the user typed into the requestee fields) + # target: record; the bug/attachment for which the flags are being made + #%] + +[% UNLESS header_done %] + [% title = BLOCK %] + Verify Requests for Bug #[% target.bug.id %] + [% IF target.attachment %], Attachment #[% target.attachment.id %][% END %] + [% END %] + + [% h1 = BLOCK %] + Verify Requests for <a href="show_bug.cgi?id=[% target.bug.id %]">Bug #[% target.bug.id %]</a> + [% IF target.attachment.exists %], + <a href="attachment.cgi?id=[% target.attachment.id %]&action=edit">Attachment #[% target.attachment.id %]</a> + [% END %] + [% END %] + + [% h2 = BLOCK %] + [% target.bug.summary FILTER html %] + [% IF target.attachment.exists %] + : [% target.attachment.summary FILTER html %] + [% END %] + [% END %] + + [% PROCESS global/header.html.tmpl %] +[% END %] + +<form method="post"> + +[% PROCESS "global/hidden-fields.html.tmpl" + exclude=("^(flag_type|requestee)-") %] + +[% FOREACH flag = flags %] + [% IF flag.requestees.size == 0 %] + <p> + Sorry, I can't find a user whose name or email address contains + the string <em>[% flag.requestee_str FILTER html %]</em>. + Double-check that the user's name or email address contains that + string, or try entering a shorter string. + </p> + <p> + Ask <input type="text" size="20" maxlength="255" + name="requestee-[% flag.type.id %]" + value="[% flag.requestee_str FILTER html %]"> + for [% flag.type.name FILTER html %] + <input type="hidden" name="flag_type-[% flag.type.id %]" value="?"> + </p> + + [% ELSIF flag.requestees.size == 1 %] + <input type="hidden" + name="requestee-[% flag.type.id %]" + value="[% flag.requestee.email FILTER html %]"> + <input type="hidden" name="flag_type-[% flag.type.id %]" value="?"> + + [% ELSE %] + <p> + More than one user's name or email address contains the string + <em>[% flag.requestee_str FILTER html %]</em>. Choose the user + you meant from the following menu or click the back button and try + again with a more specific string. + </p> + <p> + Ask <select name="requestee-[% flag.type.id %]"> + [% FOREACH requestee = flag.requestees %] + <option value="[% requestee.email FILTER html %]"> + [% requestee.identity FILTER html%]</option> + [% END %] + </select> + for [% flag.type.name %] + <input type="hidden" name="flag_type-[% flag.type.id %]" value="?"> + </p> + + [% END %] +[% END %] + +<input type="submit" value="Commit"> + +</form> + +[% PROCESS global/footer.html.tmpl %] + |